From 52b2dbb625019ffe1d51b342cdf395dd265d50de Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Sat, 22 May 2021 10:56:50 -0700 Subject: [PATCH 01/38] ImageManager integration from tech 5(BFG). Switched to glew from qgl. --- q4base/glprogs/cgfp_interaction.cg | 135 + q4base/glprogs/cgvp_interaction.cg | 67 + q4base/glprogs/compile_debug.bat | 6 + q4base/glprogs/compile_interaction.bat | 5 + q4base/glprogs/interaction.vfp | 2 +- src/doomdll.vcxproj | 30 +- src/doomdll.vcxproj.filters | 81 +- src/external/glew/glew.c | 28581 +++++++++++++++++++++++ src/external/glew/glew.h | 23688 +++++++++++++++++++ src/external/glew/wglew.h | 1447 ++ src/framework/Common.cpp | 2 + src/framework/Common.h | 2 + src/framework/DeclManager.cpp | 2 +- src/framework/File.h | 26 + src/framework/FileSystem.cpp | 1 + src/framework/FileSystem.h | 37 + src/idlib.vcxproj | 2 + src/idlib.vcxproj.filters | 6 + src/idlib/Heap.h | 71 + src/idlib/Lib.cpp | 86 +- src/idlib/Lib.h | 20 +- src/idlib/Swap.h | 223 + src/idlib/containers/Sort.h | 338 + src/idlib/geometry/DrawVert.h | 16 + src/idlib/math/Math.h | 4 + src/idlib/precompiled.h | 2 + src/renderer/BinaryImage.cpp | 449 + src/renderer/BinaryImage.h | 100 + src/renderer/BinaryImageData.h | 68 + src/renderer/Color/ColorSpace.cpp | 597 + src/renderer/Color/ColorSpace.h | 64 + src/renderer/DXT/DXTCodec.h | 624 + src/renderer/DXT/DXTDecoder.cpp | 745 + src/renderer/DXT/DXTEncoder.cpp | 4748 ++++ src/renderer/GuiModel.cpp | 2 +- src/renderer/Image.h | 503 +- src/renderer/ImageManager.cpp | 860 + src/renderer/ImageOpts.h | 157 + src/renderer/Image_files.cpp | 489 +- src/renderer/Image_init.cpp | 2219 -- src/renderer/Image_intrinsic.cpp | 655 + src/renderer/Image_load.cpp | 2531 +- src/renderer/Image_process.cpp | 273 +- src/renderer/Image_program.cpp | 409 +- src/renderer/Material.cpp | 56 +- src/renderer/Material.h | 3 - src/renderer/MegaTexture.cpp | 913 - src/renderer/MegaTexture.h | 99 - src/renderer/RenderSystem.cpp | 104 +- src/renderer/RenderSystem_init.cpp | 364 +- src/renderer/RenderWorld_portals.cpp | 10 +- src/renderer/VertexCache.cpp | 30 +- src/renderer/draw_arb.cpp | 529 - src/renderer/draw_arb2.cpp | 138 +- src/renderer/draw_common.cpp | 558 +- src/renderer/draw_exp.cpp | 2618 --- src/renderer/draw_nv10.cpp | 647 - src/renderer/draw_nv20.cpp | 885 - src/renderer/draw_r200.cpp | 516 - src/renderer/qgl.h | 575 +- src/renderer/qgl_linked.h | 684 +- src/renderer/tr_backend.cpp | 190 +- src/renderer/tr_light.cpp | 2 +- src/renderer/tr_local.h | 20 +- src/renderer/tr_render.cpp | 140 +- src/renderer/tr_rendertools.cpp | 674 +- src/renderer/tr_subview.cpp | 6 +- src/renderer/tr_trace.cpp | 26 +- src/sys/win32/win_glimp.cpp | 10 +- src/sys/win32/win_qgl.cpp | 2631 +-- src/tools/compilers/dmap/optimize.cpp | 198 +- 71 files changed, 66359 insertions(+), 16640 deletions(-) create mode 100644 q4base/glprogs/cgfp_interaction.cg create mode 100644 q4base/glprogs/cgvp_interaction.cg create mode 100644 q4base/glprogs/compile_debug.bat create mode 100644 q4base/glprogs/compile_interaction.bat create mode 100644 src/external/glew/glew.c create mode 100644 src/external/glew/glew.h create mode 100644 src/external/glew/wglew.h create mode 100644 src/idlib/Swap.h create mode 100644 src/idlib/containers/Sort.h create mode 100644 src/renderer/BinaryImage.cpp create mode 100644 src/renderer/BinaryImage.h create mode 100644 src/renderer/BinaryImageData.h create mode 100644 src/renderer/Color/ColorSpace.cpp create mode 100644 src/renderer/Color/ColorSpace.h create mode 100644 src/renderer/DXT/DXTCodec.h create mode 100644 src/renderer/DXT/DXTDecoder.cpp create mode 100644 src/renderer/DXT/DXTEncoder.cpp create mode 100644 src/renderer/ImageManager.cpp create mode 100644 src/renderer/ImageOpts.h delete mode 100644 src/renderer/Image_init.cpp create mode 100644 src/renderer/Image_intrinsic.cpp delete mode 100644 src/renderer/MegaTexture.cpp delete mode 100644 src/renderer/MegaTexture.h delete mode 100644 src/renderer/draw_arb.cpp delete mode 100644 src/renderer/draw_exp.cpp delete mode 100644 src/renderer/draw_nv10.cpp delete mode 100644 src/renderer/draw_nv20.cpp delete mode 100644 src/renderer/draw_r200.cpp diff --git a/q4base/glprogs/cgfp_interaction.cg b/q4base/glprogs/cgfp_interaction.cg new file mode 100644 index 00000000..90cae54a --- /dev/null +++ b/q4base/glprogs/cgfp_interaction.cg @@ -0,0 +1,135 @@ + +// Doom3 interaction fragment shader +// Cass Everitt + +float2 CenterScale( float2 inTC, float2 centerScale ) { + float scaleX = centerScale.x; + float scaleY = centerScale.y; + float4 tc0 = float4( scaleX, 0, 0, 0.5 - ( 0.5f * scaleX ) ); + float4 tc1 = float4( 0, scaleY, 0, 0.5 - ( 0.5f * scaleY ) ); + + float2 finalTC; + finalTC.x = dot4( inTC, tc0 ); + finalTC.y = dot4( inTC, tc1 ); + return finalTC; +} + +float2 Rotate2D( float2 inTC, float2 cs ) { + float sinValue = cs.y; + float cosValue = cs.x; + + float4 tc0 = float4( cosValue, -sinValue, 0, ( -0.5f * cosValue ) + ( 0.5f * sinValue ) + 0.5f ); + float4 tc1 = float4( sinValue, cosValue, 0, ( -0.5f * sinValue ) + ( -0.5f * cosValue ) + 0.5f ); + + float2 finalTC; + finalTC.x = dot4( inTC, tc0 ); + finalTC.y = dot4( inTC, tc1 ); + return finalTC; +} + +// better noise function available at https://github.com/ashima/webgl-noise +float rand( float2 co ) { + return fract( sin( dot( co.xy, float2( 12.9898, 78.233 ) ) ) * 43758.5453 ); +} + +float DistributionGGX(float3 N, float3 H, float roughness) +{ + float a = roughness*roughness; + float a2 = a*a; + float NdotH = max(dot(N, H), 0.0); + float NdotH2 = NdotH*NdotH; + float PI = 3.14159265359; + + + float num = a2; + float denom = (NdotH2 * (a2 - 1.0) + 1.0); + denom = PI * denom * denom; + + return num / denom; +} + +float GeometrySchlickGGX(float NdotV, float roughness) +{ + float r = (roughness + 1.0); + float k = (r*r) / 8.0; + + float num = NdotV; + float denom = NdotV * (1.0 - k) + k; + + return num / denom; +} +float GeometrySmith(float3 N, float3 V, float3 L, float roughness) +{ + float NdotV = max(dot(N, V), 0.0); + float NdotL = max(dot(N, L), 0.0); + float ggx2 = GeometrySchlickGGX(NdotV, roughness); + float ggx1 = GeometrySchlickGGX(NdotL, roughness); + + return ggx1 * ggx2; +} + +float3 fresnelSchlick(float cosTheta, float3 F0) +{ + return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0); +} + +void main( + float4 primaryColor : COLOR0, + float3 lightVector : TEXCOORD0, + float2 bumpST : TEXCOORD1, + float2 lightFalloff : TEXCOORD2, + float3 lightProjection : TEXCOORD3, + float2 diffuseST : TEXCOORD4, + float2 specularST : TEXCOORD5, + float3 halfAngleVector : TEXCOORD6, + float3 cameraVector : TEXCOORD7, + uniform float4 diffuse : ENV0, + uniform float4 specular : ENV1, + uniform sampler2D bumpImage : TEXUNIT1, + uniform sampler2D lightFalloffImage : TEXUNIT2, + uniform sampler2D lightImage : TEXUNIT3, + uniform sampler2D diffuseImage : TEXUNIT4, + uniform sampler2D specularImage : TEXUNIT5, + uniform samplerCUBE normalCubeMapImage : TEXUNIT0, + uniform sampler2D specularTableImage : TEXUNIT6, + out float4 color : COLOR) +{ + float3 L = normalize( lightVector ).xyz * 2 - 1; + float4 bumpMap = tex2D( bumpImage, bumpST ); + float3 N = normalize(float3(bumpMap.x, bumpMap.y, bumpMap.z) * 2 - 1); + float NdotL = clamp( dot( N, L ), 0, 1 ); + + float4 Cd = diffuse * tex2D( diffuseImage, diffuseST ); + + float3 H = normalize( halfAngleVector ).xyz * 2 - 1; + float3 NdotH = clamp( dot( N, H ), 0, 1 ); + + + float4 specTex = tex2D( specularImage, specularST ); + float4 roughness = float4(specTex.r, specTex.r, specTex.r, specTex.r); + float4 metallic = float4(specTex.g, specTex.g, specTex.g, specTex.g); + + float4 Cl = tex2Dproj( lightImage, lightProjection ) * + tex2D( lightFalloffImage, lightFalloff); + + float3 V = normalize(cameraVector); + + float3 F0 = float3(0.04); + F0 = mix(F0, Cd.xyz, metallic.xyz); + + // cook-torrance brdf + float NDF = DistributionGGX(N, H, roughness); + float G = GeometrySmith(N, V, L, roughness); + float3 F = fresnelSchlick(max(dot(H, V), 0.0), F0); + + float3 kS = F; + float3 kD = float3(1.0) - kS; + kD *= 1.0 - metallic; + + float3 numerator = NDF * G * F; + float denominator = 4.0 * max(dot(N, V), 0.0) * max(dot(N, L), 0.0); + float3 pbr = numerator / max(denominator, 0.001); + + color = primaryColor * Cl * NdotL * Cd + (float4(pbr.x, pbr.y, pbr.z, 0.0) * (specular * Cl)); +} + diff --git a/q4base/glprogs/cgvp_interaction.cg b/q4base/glprogs/cgvp_interaction.cg new file mode 100644 index 00000000..f3a8cdc1 --- /dev/null +++ b/q4base/glprogs/cgvp_interaction.cg @@ -0,0 +1,67 @@ + +void main( + float4 position : POSITION , + float4 texCoord : ATTR8, + float3 normal : ATTR9, + float3 tangent0 : ATTR10, + float3 tangent1 : ATTR11, + float4 color : ATTR5, + uniform float4 lightOrigin : ENV4, + uniform float4 viewOrigin : ENV5, + uniform float4 lightProjectS : ENV6, + uniform float4 lightProjectT : ENV7, + uniform float4 lightProjectQ : ENV8, + uniform float4 lightFalloffS : ENV9, + uniform float4 bumpMatrixS : ENV10, + uniform float4 bumpMatrixT : ENV11, + uniform float4 diffuseMatrixS : ENV12, + uniform float4 diffuseMatrixT : ENV13, + uniform float4 specularMatrixS : ENV14, + uniform float4 specularMatrixT : ENV15, + uniform float4 colorModulate : ENV16, + uniform float4 colorAdd : ENV17, + out float3 lightVector : TEXCOORD0, + out float2 bumpST : TEXCOORD1, + out float2 lightFalloff : TEXCOORD2, + out float3 lightProjection : TEXCOORD3, + out float2 diffuseST : TEXCOORD4, + out float2 specularST : TEXCOORD5, + out float3 halfAngleVector : TEXCOORD6, + out float3 cameraVector : TEXCOORD7, + out float4 primaryColor : COL0, + out float4 hpos : POSITION ) +{ + // normal map texgen + bumpST = mul( float2x4( bumpMatrixS, bumpMatrixT ), texCoord ); + + // light falloff texgen + lightFalloff.x = dot( lightFalloffS, position ); + lightFalloff.y = 0.5; + + // light projection texgen + lightProjection = mul( float3x4( lightProjectS, lightProjectT, lightProjectQ ), position ); + + // diffuse map texgen + diffuseST = mul( float2x4( diffuseMatrixS, diffuseMatrixT ), texCoord ); + + // specular map texgen + specularST = mul( float2x4( specularMatrixS, specularMatrixT ), texCoord ); + + // light and halfangle vectors + float3x3 TBN = float3x3( tangent0, tangent1, normal ); + + float3 L = lightOrigin.xyz - position.xyz; + float3 V = viewOrigin.xyz - position.xyz; + float3 H = normalize(L) + normalize(V); + + lightVector = mul( TBN, L ); + halfAngleVector = mul( TBN, H ); + cameraVector = mul(TBN, V); + + + // primary color + primaryColor = color * colorModulate + colorAdd; + + // position + hpos = mul(glstate.matrix.mvp, position); +} diff --git a/q4base/glprogs/compile_debug.bat b/q4base/glprogs/compile_debug.bat new file mode 100644 index 00000000..9972ef95 --- /dev/null +++ b/q4base/glprogs/compile_debug.bat @@ -0,0 +1,6 @@ +@echo off +del interaction.vfp +cgc -profile arbvp1 cgvp_interaction.cg +echo #====================================================================== >> interaction.vfp +cgc -profile arbfp1 cgfp_interaction.cg +pause \ No newline at end of file diff --git a/q4base/glprogs/compile_interaction.bat b/q4base/glprogs/compile_interaction.bat new file mode 100644 index 00000000..1a0c1268 --- /dev/null +++ b/q4base/glprogs/compile_interaction.bat @@ -0,0 +1,5 @@ +@echo off +del interaction.vfp +cgc -quiet -profile arbvp1 cgvp_interaction.cg >> interaction.vfp +echo #====================================================================== >> interaction.vfp +cgc -quiet -profile arbfp1 cgfp_interaction.cg >> interaction.vfp diff --git a/q4base/glprogs/interaction.vfp b/q4base/glprogs/interaction.vfp index c1cdb46a..e1bf9f19 100644 --- a/q4base/glprogs/interaction.vfp +++ b/q4base/glprogs/interaction.vfp @@ -159,7 +159,7 @@ MAD light, light, scaleTwo, subOne; #----------------- TEX localNormal, fragment.texcoord[1], texture[1], 2D; -MOV localNormal.x, localNormal.a; +# MOV localNormal.x, localNormal.a; MAD localNormal, localNormal, scaleTwo, subOne; DP3 light, light, localNormal; diff --git a/src/doomdll.vcxproj b/src/doomdll.vcxproj index f18ddcc5..0064bfaa 100644 --- a/src/doomdll.vcxproj +++ b/src/doomdll.vcxproj @@ -281,6 +281,8 @@ + + @@ -316,13 +318,17 @@ + + + + + - @@ -460,6 +466,15 @@ + + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + @@ -499,22 +514,22 @@ Create Create + - + - - - + + + - + - @@ -528,6 +543,7 @@ + diff --git a/src/doomdll.vcxproj.filters b/src/doomdll.vcxproj.filters index c2116263..451c839a 100644 --- a/src/doomdll.vcxproj.filters +++ b/src/doomdll.vcxproj.filters @@ -67,6 +67,21 @@ {790d16ec-9240-40b6-9c61-2ab9bbe6812c} + + {e6f14e65-2c82-43b6-bf0d-b05bf16571ad} + + + {794f7048-ed8a-4b35-82d7-abb86479edd5} + + + {8f3197ee-2aa2-465f-a95c-b382d2b32ad0} + + + {19514e55-e909-4b50-b87b-4cb71294ab64} + + + {cfb669df-6063-4d72-9cdc-2bbcff2e0b57} + @@ -183,9 +198,6 @@ Renderer - - Renderer - Renderer @@ -585,6 +597,27 @@ tools\compilers\runaas + + Renderer\DXT + + + Renderer\Color + + + Renderer + + + Renderer + + + Renderer + + + External\glew + + + External\glew + @@ -692,33 +725,18 @@ Renderer - - Renderer - Renderer Renderer - - Renderer - - - Renderer - - - Renderer - Renderer Renderer - - Renderer - Renderer @@ -734,9 +752,6 @@ Renderer - - Renderer - Renderer @@ -1286,6 +1301,30 @@ tools\compilers\runaas + + Renderer\DXT + + + Renderer\DXT + + + Renderer\Color + + + Renderer + + + Renderer + + + Renderer + + + Renderer\OpenGL + + + External\glew + diff --git a/src/external/glew/glew.c b/src/external/glew/glew.c new file mode 100644 index 00000000..9a095ed2 --- /dev/null +++ b/src/external/glew/glew.c @@ -0,0 +1,28581 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2008-2017, Nigel Stewart +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef GLEW_INCLUDE +#include "glew.h" +#else +#include GLEW_INCLUDE +#endif + +#if defined(GLEW_OSMESA) +# define GLAPI extern +# include +#elif defined(GLEW_EGL) +# include +#elif defined(_WIN32) +/* + * If NOGDI is defined, wingdi.h won't be included by windows.h, and thus + * wglGetProcAddress won't be declared. It will instead be implicitly declared, + * potentially incorrectly, which we don't want. + */ +# if defined(NOGDI) +# undef NOGDI +# endif +# include "wglew.h" +#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) +# include +#endif + +#include /* For size_t */ + +#if defined(GLEW_EGL) +#elif defined(GLEW_REGAL) + +/* In GLEW_REGAL mode we call direcly into the linked + libRegal.so glGetProcAddressREGAL for looking up + the GL function pointers. */ + +# undef glGetProcAddressREGAL +# ifdef WIN32 +extern void * __stdcall glGetProcAddressREGAL(const GLchar *name); +static void * (__stdcall * regalGetProcAddress) (const GLchar *) = glGetProcAddressREGAL; +# else +extern void * glGetProcAddressREGAL(const GLchar *name); +static void * (*regalGetProcAddress) (const GLchar *) = glGetProcAddressREGAL; +# endif +# define glGetProcAddressREGAL GLEW_GET_FUN(__glewGetProcAddressREGAL) + +#elif defined(__sgi) || defined (__sun) || defined(__HAIKU__) || defined(GLEW_APPLE_GLX) +#include +#include +#include + +void* dlGetProcAddress (const GLubyte* name) +{ + static void* h = NULL; + static void* gpa; + + if (h == NULL) + { + if ((h = dlopen(NULL, RTLD_LAZY | RTLD_LOCAL)) == NULL) return NULL; + gpa = dlsym(h, "glXGetProcAddress"); + } + + if (gpa != NULL) + return ((void*(*)(const GLubyte*))gpa)(name); + else + return dlsym(h, (const char*)name); +} +#endif /* __sgi || __sun || GLEW_APPLE_GLX */ + +#if defined(__APPLE__) +#include +#include +#include + +#ifdef MAC_OS_X_VERSION_10_3 + +#include + +void* NSGLGetProcAddress (const GLubyte *name) +{ + static void* image = NULL; + void* addr; + if (NULL == image) + { + image = dlopen("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", RTLD_LAZY); + } + if( !image ) return NULL; + addr = dlsym(image, (const char*)name); + if( addr ) return addr; +#ifdef GLEW_APPLE_GLX + return dlGetProcAddress( name ); // try next for glx symbols +#else + return NULL; +#endif +} +#else + +#include + +void* NSGLGetProcAddress (const GLubyte *name) +{ + static const struct mach_header* image = NULL; + NSSymbol symbol; + char* symbolName; + if (NULL == image) + { + image = NSAddImage("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", NSADDIMAGE_OPTION_RETURN_ON_ERROR); + } + /* prepend a '_' for the Unix C symbol mangling convention */ + symbolName = malloc(strlen((const char*)name) + 2); + strcpy(symbolName+1, (const char*)name); + symbolName[0] = '_'; + symbol = NULL; + /* if (NSIsSymbolNameDefined(symbolName)) + symbol = NSLookupAndBindSymbol(symbolName); */ + symbol = image ? NSLookupSymbolInImage(image, symbolName, NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR) : NULL; + free(symbolName); + if( symbol ) return NSAddressOfSymbol(symbol); +#ifdef GLEW_APPLE_GLX + return dlGetProcAddress( name ); // try next for glx symbols +#else + return NULL; +#endif +} +#endif /* MAC_OS_X_VERSION_10_3 */ +#endif /* __APPLE__ */ + +/* + * Define glewGetProcAddress. + */ +#if defined(GLEW_REGAL) +# define glewGetProcAddress(name) regalGetProcAddress((const GLchar *)name) +#elif defined(GLEW_OSMESA) +# define glewGetProcAddress(name) OSMesaGetProcAddress((const char *)name) +#elif defined(GLEW_EGL) +# define glewGetProcAddress(name) eglGetProcAddress((const char *)name) +#elif defined(_WIN32) +# define glewGetProcAddress(name) wglGetProcAddress((LPCSTR)name) +#elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX) +# define glewGetProcAddress(name) NSGLGetProcAddress(name) +#elif defined(__sgi) || defined(__sun) || defined(__HAIKU__) +# define glewGetProcAddress(name) dlGetProcAddress(name) +#elif defined(__ANDROID__) +# define glewGetProcAddress(name) NULL /* TODO */ +#elif defined(__native_client__) +# define glewGetProcAddress(name) NULL /* TODO */ +#else /* __linux */ +# define glewGetProcAddress(name) (*glXGetProcAddressARB)(name) +#endif + +/* + * Redefine GLEW_GET_VAR etc without const cast + */ + +#undef GLEW_GET_VAR +# define GLEW_GET_VAR(x) (x) + +#ifdef WGLEW_GET_VAR +# undef WGLEW_GET_VAR +# define WGLEW_GET_VAR(x) (x) +#endif /* WGLEW_GET_VAR */ + +#ifdef GLXEW_GET_VAR +# undef GLXEW_GET_VAR +# define GLXEW_GET_VAR(x) (x) +#endif /* GLXEW_GET_VAR */ + +#ifdef EGLEW_GET_VAR +# undef EGLEW_GET_VAR +# define EGLEW_GET_VAR(x) (x) +#endif /* EGLEW_GET_VAR */ + +/* + * GLEW, just like OpenGL or GLU, does not rely on the standard C library. + * These functions implement the functionality required in this file. + */ + +static GLuint _glewStrLen (const GLubyte* s) +{ + GLuint i=0; + if (s == NULL) return 0; + while (s[i] != '\0') i++; + return i; +} + +static GLuint _glewStrCLen (const GLubyte* s, GLubyte c) +{ + GLuint i=0; + if (s == NULL) return 0; + while (s[i] != '\0' && s[i] != c) i++; + return i; +} + +static GLuint _glewStrCopy(char *d, const char *s, char c) +{ + GLuint i=0; + if (s == NULL) return 0; + while (s[i] != '\0' && s[i] != c) { d[i] = s[i]; i++; } + d[i] = '\0'; + return i; +} + +#if !defined(GLEW_OSMESA) +#if !defined(__APPLE__) || defined(GLEW_APPLE_GLX) +static GLboolean _glewStrSame (const GLubyte* a, const GLubyte* b, GLuint n) +{ + GLuint i=0; + if(a == NULL || b == NULL) + return (a == NULL && b == NULL && n == 0) ? GL_TRUE : GL_FALSE; + while (i < n && a[i] != '\0' && b[i] != '\0' && a[i] == b[i]) i++; + return i == n ? GL_TRUE : GL_FALSE; +} +#endif +#endif + +static GLboolean _glewStrSame1 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) +{ + while (*na > 0 && (**a == ' ' || **a == '\n' || **a == '\r' || **a == '\t')) + { + (*a)++; + (*na)--; + } + if(*na >= nb) + { + GLuint i=0; + while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; + if(i == nb) + { + *a = *a + nb; + *na = *na - nb; + return GL_TRUE; + } + } + return GL_FALSE; +} + +static GLboolean _glewStrSame2 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) +{ + if(*na >= nb) + { + GLuint i=0; + while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; + if(i == nb) + { + *a = *a + nb; + *na = *na - nb; + return GL_TRUE; + } + } + return GL_FALSE; +} + +static GLboolean _glewStrSame3 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) +{ + if(*na >= nb) + { + GLuint i=0; + while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; + if (i == nb && (*na == nb || (*a)[i] == ' ' || (*a)[i] == '\n' || (*a)[i] == '\r' || (*a)[i] == '\t')) + { + *a = *a + nb; + *na = *na - nb; + return GL_TRUE; + } + } + return GL_FALSE; +} + +/* + * Search for name in the extensions string. Use of strstr() + * is not sufficient because extension names can be prefixes of + * other extension names. Could use strtok() but the constant + * string returned by glGetString might be in read-only memory. + */ +#if !defined(GLEW_OSMESA) +#if !defined(__APPLE__) || defined(GLEW_APPLE_GLX) +static GLboolean _glewSearchExtension (const char* name, const GLubyte *start, const GLubyte *end) +{ + const GLubyte* p; + GLuint len = _glewStrLen((const GLubyte*)name); + p = start; + while (p < end) + { + GLuint n = _glewStrCLen(p, ' '); + if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE; + p += n+1; + } + return GL_FALSE; +} +#endif +#endif + +PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D = NULL; +PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements = NULL; +PFNGLTEXIMAGE3DPROC __glewTexImage3D = NULL; +PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D = NULL; + +PFNGLACTIVETEXTUREPROC __glewActiveTexture = NULL; +PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture = NULL; +PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D = NULL; +PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D = NULL; +PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D = NULL; +PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage = NULL; +PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd = NULL; +PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf = NULL; +PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd = NULL; +PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf = NULL; +PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d = NULL; +PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv = NULL; +PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f = NULL; +PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv = NULL; +PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i = NULL; +PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv = NULL; +PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s = NULL; +PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv = NULL; +PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d = NULL; +PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv = NULL; +PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f = NULL; +PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv = NULL; +PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i = NULL; +PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv = NULL; +PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s = NULL; +PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv = NULL; +PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d = NULL; +PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv = NULL; +PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f = NULL; +PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv = NULL; +PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i = NULL; +PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv = NULL; +PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s = NULL; +PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv = NULL; +PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d = NULL; +PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv = NULL; +PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f = NULL; +PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv = NULL; +PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i = NULL; +PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv = NULL; +PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s = NULL; +PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv = NULL; +PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage = NULL; + +PFNGLBLENDCOLORPROC __glewBlendColor = NULL; +PFNGLBLENDEQUATIONPROC __glewBlendEquation = NULL; +PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate = NULL; +PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer = NULL; +PFNGLFOGCOORDDPROC __glewFogCoordd = NULL; +PFNGLFOGCOORDDVPROC __glewFogCoorddv = NULL; +PFNGLFOGCOORDFPROC __glewFogCoordf = NULL; +PFNGLFOGCOORDFVPROC __glewFogCoordfv = NULL; +PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays = NULL; +PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements = NULL; +PFNGLPOINTPARAMETERFPROC __glewPointParameterf = NULL; +PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv = NULL; +PFNGLPOINTPARAMETERIPROC __glewPointParameteri = NULL; +PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv = NULL; +PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b = NULL; +PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv = NULL; +PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d = NULL; +PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv = NULL; +PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f = NULL; +PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv = NULL; +PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i = NULL; +PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv = NULL; +PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s = NULL; +PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv = NULL; +PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub = NULL; +PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv = NULL; +PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui = NULL; +PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv = NULL; +PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us = NULL; +PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv = NULL; +PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer = NULL; +PFNGLWINDOWPOS2DPROC __glewWindowPos2d = NULL; +PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv = NULL; +PFNGLWINDOWPOS2FPROC __glewWindowPos2f = NULL; +PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv = NULL; +PFNGLWINDOWPOS2IPROC __glewWindowPos2i = NULL; +PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv = NULL; +PFNGLWINDOWPOS2SPROC __glewWindowPos2s = NULL; +PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv = NULL; +PFNGLWINDOWPOS3DPROC __glewWindowPos3d = NULL; +PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv = NULL; +PFNGLWINDOWPOS3FPROC __glewWindowPos3f = NULL; +PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv = NULL; +PFNGLWINDOWPOS3IPROC __glewWindowPos3i = NULL; +PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv = NULL; +PFNGLWINDOWPOS3SPROC __glewWindowPos3s = NULL; +PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv = NULL; + +PFNGLBEGINQUERYPROC __glewBeginQuery = NULL; +PFNGLBINDBUFFERPROC __glewBindBuffer = NULL; +PFNGLBUFFERDATAPROC __glewBufferData = NULL; +PFNGLBUFFERSUBDATAPROC __glewBufferSubData = NULL; +PFNGLDELETEBUFFERSPROC __glewDeleteBuffers = NULL; +PFNGLDELETEQUERIESPROC __glewDeleteQueries = NULL; +PFNGLENDQUERYPROC __glewEndQuery = NULL; +PFNGLGENBUFFERSPROC __glewGenBuffers = NULL; +PFNGLGENQUERIESPROC __glewGenQueries = NULL; +PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv = NULL; +PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv = NULL; +PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData = NULL; +PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv = NULL; +PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv = NULL; +PFNGLGETQUERYIVPROC __glewGetQueryiv = NULL; +PFNGLISBUFFERPROC __glewIsBuffer = NULL; +PFNGLISQUERYPROC __glewIsQuery = NULL; +PFNGLMAPBUFFERPROC __glewMapBuffer = NULL; +PFNGLUNMAPBUFFERPROC __glewUnmapBuffer = NULL; + +PFNGLATTACHSHADERPROC __glewAttachShader = NULL; +PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation = NULL; +PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate = NULL; +PFNGLCOMPILESHADERPROC __glewCompileShader = NULL; +PFNGLCREATEPROGRAMPROC __glewCreateProgram = NULL; +PFNGLCREATESHADERPROC __glewCreateShader = NULL; +PFNGLDELETEPROGRAMPROC __glewDeleteProgram = NULL; +PFNGLDELETESHADERPROC __glewDeleteShader = NULL; +PFNGLDETACHSHADERPROC __glewDetachShader = NULL; +PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray = NULL; +PFNGLDRAWBUFFERSPROC __glewDrawBuffers = NULL; +PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray = NULL; +PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib = NULL; +PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform = NULL; +PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders = NULL; +PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation = NULL; +PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog = NULL; +PFNGLGETPROGRAMIVPROC __glewGetProgramiv = NULL; +PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog = NULL; +PFNGLGETSHADERSOURCEPROC __glewGetShaderSource = NULL; +PFNGLGETSHADERIVPROC __glewGetShaderiv = NULL; +PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation = NULL; +PFNGLGETUNIFORMFVPROC __glewGetUniformfv = NULL; +PFNGLGETUNIFORMIVPROC __glewGetUniformiv = NULL; +PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv = NULL; +PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv = NULL; +PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv = NULL; +PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv = NULL; +PFNGLISPROGRAMPROC __glewIsProgram = NULL; +PFNGLISSHADERPROC __glewIsShader = NULL; +PFNGLLINKPROGRAMPROC __glewLinkProgram = NULL; +PFNGLSHADERSOURCEPROC __glewShaderSource = NULL; +PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate = NULL; +PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate = NULL; +PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate = NULL; +PFNGLUNIFORM1FPROC __glewUniform1f = NULL; +PFNGLUNIFORM1FVPROC __glewUniform1fv = NULL; +PFNGLUNIFORM1IPROC __glewUniform1i = NULL; +PFNGLUNIFORM1IVPROC __glewUniform1iv = NULL; +PFNGLUNIFORM2FPROC __glewUniform2f = NULL; +PFNGLUNIFORM2FVPROC __glewUniform2fv = NULL; +PFNGLUNIFORM2IPROC __glewUniform2i = NULL; +PFNGLUNIFORM2IVPROC __glewUniform2iv = NULL; +PFNGLUNIFORM3FPROC __glewUniform3f = NULL; +PFNGLUNIFORM3FVPROC __glewUniform3fv = NULL; +PFNGLUNIFORM3IPROC __glewUniform3i = NULL; +PFNGLUNIFORM3IVPROC __glewUniform3iv = NULL; +PFNGLUNIFORM4FPROC __glewUniform4f = NULL; +PFNGLUNIFORM4FVPROC __glewUniform4fv = NULL; +PFNGLUNIFORM4IPROC __glewUniform4i = NULL; +PFNGLUNIFORM4IVPROC __glewUniform4iv = NULL; +PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv = NULL; +PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv = NULL; +PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv = NULL; +PFNGLUSEPROGRAMPROC __glewUseProgram = NULL; +PFNGLVALIDATEPROGRAMPROC __glewValidateProgram = NULL; +PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d = NULL; +PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv = NULL; +PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f = NULL; +PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv = NULL; +PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s = NULL; +PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv = NULL; +PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d = NULL; +PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv = NULL; +PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f = NULL; +PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv = NULL; +PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s = NULL; +PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv = NULL; +PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d = NULL; +PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv = NULL; +PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f = NULL; +PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv = NULL; +PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s = NULL; +PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv = NULL; +PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv = NULL; +PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv = NULL; +PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv = NULL; +PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub = NULL; +PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv = NULL; +PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv = NULL; +PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv = NULL; +PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv = NULL; +PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d = NULL; +PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv = NULL; +PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f = NULL; +PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv = NULL; +PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv = NULL; +PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s = NULL; +PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv = NULL; +PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv = NULL; +PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv = NULL; +PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv = NULL; +PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer = NULL; + +PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv = NULL; +PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv = NULL; +PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv = NULL; +PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv = NULL; +PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv = NULL; +PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv = NULL; + +PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender = NULL; +PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback = NULL; +PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation = NULL; +PFNGLCLAMPCOLORPROC __glewClampColor = NULL; +PFNGLCLEARBUFFERFIPROC __glewClearBufferfi = NULL; +PFNGLCLEARBUFFERFVPROC __glewClearBufferfv = NULL; +PFNGLCLEARBUFFERIVPROC __glewClearBufferiv = NULL; +PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv = NULL; +PFNGLCOLORMASKIPROC __glewColorMaski = NULL; +PFNGLDISABLEIPROC __glewDisablei = NULL; +PFNGLENABLEIPROC __glewEnablei = NULL; +PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender = NULL; +PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback = NULL; +PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v = NULL; +PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation = NULL; +PFNGLGETSTRINGIPROC __glewGetStringi = NULL; +PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv = NULL; +PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv = NULL; +PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying = NULL; +PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv = NULL; +PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv = NULL; +PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv = NULL; +PFNGLISENABLEDIPROC __glewIsEnabledi = NULL; +PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv = NULL; +PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv = NULL; +PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings = NULL; +PFNGLUNIFORM1UIPROC __glewUniform1ui = NULL; +PFNGLUNIFORM1UIVPROC __glewUniform1uiv = NULL; +PFNGLUNIFORM2UIPROC __glewUniform2ui = NULL; +PFNGLUNIFORM2UIVPROC __glewUniform2uiv = NULL; +PFNGLUNIFORM3UIPROC __glewUniform3ui = NULL; +PFNGLUNIFORM3UIVPROC __glewUniform3uiv = NULL; +PFNGLUNIFORM4UIPROC __glewUniform4ui = NULL; +PFNGLUNIFORM4UIVPROC __glewUniform4uiv = NULL; +PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i = NULL; +PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv = NULL; +PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui = NULL; +PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv = NULL; +PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i = NULL; +PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv = NULL; +PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui = NULL; +PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv = NULL; +PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i = NULL; +PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv = NULL; +PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui = NULL; +PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv = NULL; +PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv = NULL; +PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i = NULL; +PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv = NULL; +PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv = NULL; +PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv = NULL; +PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui = NULL; +PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv = NULL; +PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv = NULL; +PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer = NULL; + +PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced = NULL; +PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced = NULL; +PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex = NULL; +PFNGLTEXBUFFERPROC __glewTexBuffer = NULL; + +PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture = NULL; +PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v = NULL; +PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v = NULL; + +PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor = NULL; + +PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei = NULL; +PFNGLBLENDEQUATIONIPROC __glewBlendEquationi = NULL; +PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei = NULL; +PFNGLBLENDFUNCIPROC __glewBlendFunci = NULL; +PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading = NULL; + +PFNGLGETGRAPHICSRESETSTATUSPROC __glewGetGraphicsResetStatus = NULL; +PFNGLGETNCOMPRESSEDTEXIMAGEPROC __glewGetnCompressedTexImage = NULL; +PFNGLGETNTEXIMAGEPROC __glewGetnTexImage = NULL; +PFNGLGETNUNIFORMDVPROC __glewGetnUniformdv = NULL; + +PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC __glewMultiDrawArraysIndirectCount = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC __glewMultiDrawElementsIndirectCount = NULL; +PFNGLSPECIALIZESHADERPROC __glewSpecializeShader = NULL; + +PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX = NULL; + +PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD = NULL; +PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD = NULL; +PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD = NULL; +PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD = NULL; + +PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD = NULL; +PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD = NULL; +PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD = NULL; +PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD = NULL; + +PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewFramebufferSamplePositionsfvAMD = NULL; +PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC __glewGetFramebufferParameterfvAMD = NULL; +PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC __glewGetNamedFramebufferParameterfvAMD = NULL; +PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewNamedFramebufferSamplePositionsfvAMD = NULL; + +PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD = NULL; + +PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD = NULL; + +PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD = NULL; +PFNGLGENNAMESAMDPROC __glewGenNamesAMD = NULL; +PFNGLISNAMEAMDPROC __glewIsNameAMD = NULL; + +PFNGLQUERYOBJECTPARAMETERUIAMDPROC __glewQueryObjectParameteruiAMD = NULL; + +PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD = NULL; +PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD = NULL; +PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD = NULL; +PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD = NULL; +PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD = NULL; +PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD = NULL; +PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD = NULL; +PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD = NULL; +PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD = NULL; +PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD = NULL; +PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD = NULL; + +PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD = NULL; + +PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD = NULL; +PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD = NULL; + +PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD = NULL; + +PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD = NULL; +PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD = NULL; + +PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE = NULL; + +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE = NULL; + +PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE = NULL; +PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE = NULL; +PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE = NULL; + +PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE = NULL; +PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE = NULL; +PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE = NULL; +PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE = NULL; +PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE = NULL; +PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE = NULL; +PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE = NULL; +PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE = NULL; +PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE = NULL; +PFNGLISQUERYANGLEPROC __glewIsQueryANGLE = NULL; +PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE = NULL; + +PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE = NULL; + +PFNGLCOPYTEXTURELEVELSAPPLEPROC __glewCopyTextureLevelsAPPLE = NULL; + +PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE = NULL; +PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE = NULL; +PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE = NULL; +PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE = NULL; +PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE = NULL; + +PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE = NULL; +PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE = NULL; +PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE = NULL; +PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE = NULL; +PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE = NULL; +PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE = NULL; +PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE = NULL; +PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE = NULL; + +PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE = NULL; +PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE = NULL; + +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC __glewRenderbufferStorageMultisampleAPPLE = NULL; +PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC __glewResolveMultisampleFramebufferAPPLE = NULL; + +PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE = NULL; +PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE = NULL; +PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE = NULL; + +PFNGLCLIENTWAITSYNCAPPLEPROC __glewClientWaitSyncAPPLE = NULL; +PFNGLDELETESYNCAPPLEPROC __glewDeleteSyncAPPLE = NULL; +PFNGLFENCESYNCAPPLEPROC __glewFenceSyncAPPLE = NULL; +PFNGLGETINTEGER64VAPPLEPROC __glewGetInteger64vAPPLE = NULL; +PFNGLGETSYNCIVAPPLEPROC __glewGetSyncivAPPLE = NULL; +PFNGLISSYNCAPPLEPROC __glewIsSyncAPPLE = NULL; +PFNGLWAITSYNCAPPLEPROC __glewWaitSyncAPPLE = NULL; + +PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE = NULL; +PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE = NULL; + +PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE = NULL; +PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE = NULL; +PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE = NULL; +PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE = NULL; + +PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE = NULL; +PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE = NULL; +PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE = NULL; + +PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE = NULL; +PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE = NULL; +PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE = NULL; +PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE = NULL; +PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE = NULL; +PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE = NULL; +PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE = NULL; + +PFNGLCLEARDEPTHFPROC __glewClearDepthf = NULL; +PFNGLDEPTHRANGEFPROC __glewDepthRangef = NULL; +PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat = NULL; +PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler = NULL; +PFNGLSHADERBINARYPROC __glewShaderBinary = NULL; + +PFNGLMEMORYBARRIERBYREGIONPROC __glewMemoryBarrierByRegion = NULL; + +PFNGLPRIMITIVEBOUNDINGBOXARBPROC __glewPrimitiveBoundingBoxARB = NULL; + +PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance = NULL; + +PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB = NULL; +PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB = NULL; +PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB = NULL; +PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB = NULL; +PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB = NULL; +PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB = NULL; +PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB = NULL; +PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB = NULL; +PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB = NULL; +PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB = NULL; +PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB = NULL; +PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB = NULL; +PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB = NULL; +PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB = NULL; +PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB = NULL; +PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB = NULL; + +PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed = NULL; +PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex = NULL; + +PFNGLBUFFERSTORAGEPROC __glewBufferStorage = NULL; + +PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB = NULL; + +PFNGLCLEARBUFFERDATAPROC __glewClearBufferData = NULL; +PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData = NULL; +PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT = NULL; +PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT = NULL; + +PFNGLCLEARTEXIMAGEPROC __glewClearTexImage = NULL; +PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage = NULL; + +PFNGLCLIPCONTROLPROC __glewClipControl = NULL; + +PFNGLCLAMPCOLORARBPROC __glewClampColorARB = NULL; + +PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute = NULL; +PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect = NULL; + +PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB = NULL; + +PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData = NULL; + +PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData = NULL; + +PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB = NULL; +PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB = NULL; +PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB = NULL; +PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB = NULL; + +PFNGLBINDTEXTUREUNITPROC __glewBindTextureUnit = NULL; +PFNGLBLITNAMEDFRAMEBUFFERPROC __glewBlitNamedFramebuffer = NULL; +PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __glewCheckNamedFramebufferStatus = NULL; +PFNGLCLEARNAMEDBUFFERDATAPROC __glewClearNamedBufferData = NULL; +PFNGLCLEARNAMEDBUFFERSUBDATAPROC __glewClearNamedBufferSubData = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERFIPROC __glewClearNamedFramebufferfi = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERFVPROC __glewClearNamedFramebufferfv = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERIVPROC __glewClearNamedFramebufferiv = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC __glewClearNamedFramebufferuiv = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __glewCompressedTextureSubImage1D = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __glewCompressedTextureSubImage2D = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __glewCompressedTextureSubImage3D = NULL; +PFNGLCOPYNAMEDBUFFERSUBDATAPROC __glewCopyNamedBufferSubData = NULL; +PFNGLCOPYTEXTURESUBIMAGE1DPROC __glewCopyTextureSubImage1D = NULL; +PFNGLCOPYTEXTURESUBIMAGE2DPROC __glewCopyTextureSubImage2D = NULL; +PFNGLCOPYTEXTURESUBIMAGE3DPROC __glewCopyTextureSubImage3D = NULL; +PFNGLCREATEBUFFERSPROC __glewCreateBuffers = NULL; +PFNGLCREATEFRAMEBUFFERSPROC __glewCreateFramebuffers = NULL; +PFNGLCREATEPROGRAMPIPELINESPROC __glewCreateProgramPipelines = NULL; +PFNGLCREATEQUERIESPROC __glewCreateQueries = NULL; +PFNGLCREATERENDERBUFFERSPROC __glewCreateRenderbuffers = NULL; +PFNGLCREATESAMPLERSPROC __glewCreateSamplers = NULL; +PFNGLCREATETEXTURESPROC __glewCreateTextures = NULL; +PFNGLCREATETRANSFORMFEEDBACKSPROC __glewCreateTransformFeedbacks = NULL; +PFNGLCREATEVERTEXARRAYSPROC __glewCreateVertexArrays = NULL; +PFNGLDISABLEVERTEXARRAYATTRIBPROC __glewDisableVertexArrayAttrib = NULL; +PFNGLENABLEVERTEXARRAYATTRIBPROC __glewEnableVertexArrayAttrib = NULL; +PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __glewFlushMappedNamedBufferRange = NULL; +PFNGLGENERATETEXTUREMIPMAPPROC __glewGenerateTextureMipmap = NULL; +PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC __glewGetCompressedTextureImage = NULL; +PFNGLGETNAMEDBUFFERPARAMETERI64VPROC __glewGetNamedBufferParameteri64v = NULL; +PFNGLGETNAMEDBUFFERPARAMETERIVPROC __glewGetNamedBufferParameteriv = NULL; +PFNGLGETNAMEDBUFFERPOINTERVPROC __glewGetNamedBufferPointerv = NULL; +PFNGLGETNAMEDBUFFERSUBDATAPROC __glewGetNamedBufferSubData = NULL; +PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetNamedFramebufferAttachmentParameteriv = NULL; +PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __glewGetNamedFramebufferParameteriv = NULL; +PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __glewGetNamedRenderbufferParameteriv = NULL; +PFNGLGETQUERYBUFFEROBJECTI64VPROC __glewGetQueryBufferObjecti64v = NULL; +PFNGLGETQUERYBUFFEROBJECTIVPROC __glewGetQueryBufferObjectiv = NULL; +PFNGLGETQUERYBUFFEROBJECTUI64VPROC __glewGetQueryBufferObjectui64v = NULL; +PFNGLGETQUERYBUFFEROBJECTUIVPROC __glewGetQueryBufferObjectuiv = NULL; +PFNGLGETTEXTUREIMAGEPROC __glewGetTextureImage = NULL; +PFNGLGETTEXTURELEVELPARAMETERFVPROC __glewGetTextureLevelParameterfv = NULL; +PFNGLGETTEXTURELEVELPARAMETERIVPROC __glewGetTextureLevelParameteriv = NULL; +PFNGLGETTEXTUREPARAMETERIIVPROC __glewGetTextureParameterIiv = NULL; +PFNGLGETTEXTUREPARAMETERIUIVPROC __glewGetTextureParameterIuiv = NULL; +PFNGLGETTEXTUREPARAMETERFVPROC __glewGetTextureParameterfv = NULL; +PFNGLGETTEXTUREPARAMETERIVPROC __glewGetTextureParameteriv = NULL; +PFNGLGETTRANSFORMFEEDBACKI64_VPROC __glewGetTransformFeedbacki64_v = NULL; +PFNGLGETTRANSFORMFEEDBACKI_VPROC __glewGetTransformFeedbacki_v = NULL; +PFNGLGETTRANSFORMFEEDBACKIVPROC __glewGetTransformFeedbackiv = NULL; +PFNGLGETVERTEXARRAYINDEXED64IVPROC __glewGetVertexArrayIndexed64iv = NULL; +PFNGLGETVERTEXARRAYINDEXEDIVPROC __glewGetVertexArrayIndexediv = NULL; +PFNGLGETVERTEXARRAYIVPROC __glewGetVertexArrayiv = NULL; +PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __glewInvalidateNamedFramebufferData = NULL; +PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __glewInvalidateNamedFramebufferSubData = NULL; +PFNGLMAPNAMEDBUFFERPROC __glewMapNamedBuffer = NULL; +PFNGLMAPNAMEDBUFFERRANGEPROC __glewMapNamedBufferRange = NULL; +PFNGLNAMEDBUFFERDATAPROC __glewNamedBufferData = NULL; +PFNGLNAMEDBUFFERSTORAGEPROC __glewNamedBufferStorage = NULL; +PFNGLNAMEDBUFFERSUBDATAPROC __glewNamedBufferSubData = NULL; +PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __glewNamedFramebufferDrawBuffer = NULL; +PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __glewNamedFramebufferDrawBuffers = NULL; +PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC __glewNamedFramebufferParameteri = NULL; +PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC __glewNamedFramebufferReadBuffer = NULL; +PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __glewNamedFramebufferRenderbuffer = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTUREPROC __glewNamedFramebufferTexture = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __glewNamedFramebufferTextureLayer = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEPROC __glewNamedRenderbufferStorage = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewNamedRenderbufferStorageMultisample = NULL; +PFNGLTEXTUREBUFFERPROC __glewTextureBuffer = NULL; +PFNGLTEXTUREBUFFERRANGEPROC __glewTextureBufferRange = NULL; +PFNGLTEXTUREPARAMETERIIVPROC __glewTextureParameterIiv = NULL; +PFNGLTEXTUREPARAMETERIUIVPROC __glewTextureParameterIuiv = NULL; +PFNGLTEXTUREPARAMETERFPROC __glewTextureParameterf = NULL; +PFNGLTEXTUREPARAMETERFVPROC __glewTextureParameterfv = NULL; +PFNGLTEXTUREPARAMETERIPROC __glewTextureParameteri = NULL; +PFNGLTEXTUREPARAMETERIVPROC __glewTextureParameteriv = NULL; +PFNGLTEXTURESTORAGE1DPROC __glewTextureStorage1D = NULL; +PFNGLTEXTURESTORAGE2DPROC __glewTextureStorage2D = NULL; +PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC __glewTextureStorage2DMultisample = NULL; +PFNGLTEXTURESTORAGE3DPROC __glewTextureStorage3D = NULL; +PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC __glewTextureStorage3DMultisample = NULL; +PFNGLTEXTURESUBIMAGE1DPROC __glewTextureSubImage1D = NULL; +PFNGLTEXTURESUBIMAGE2DPROC __glewTextureSubImage2D = NULL; +PFNGLTEXTURESUBIMAGE3DPROC __glewTextureSubImage3D = NULL; +PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC __glewTransformFeedbackBufferBase = NULL; +PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC __glewTransformFeedbackBufferRange = NULL; +PFNGLUNMAPNAMEDBUFFERPROC __glewUnmapNamedBuffer = NULL; +PFNGLVERTEXARRAYATTRIBBINDINGPROC __glewVertexArrayAttribBinding = NULL; +PFNGLVERTEXARRAYATTRIBFORMATPROC __glewVertexArrayAttribFormat = NULL; +PFNGLVERTEXARRAYATTRIBIFORMATPROC __glewVertexArrayAttribIFormat = NULL; +PFNGLVERTEXARRAYATTRIBLFORMATPROC __glewVertexArrayAttribLFormat = NULL; +PFNGLVERTEXARRAYBINDINGDIVISORPROC __glewVertexArrayBindingDivisor = NULL; +PFNGLVERTEXARRAYELEMENTBUFFERPROC __glewVertexArrayElementBuffer = NULL; +PFNGLVERTEXARRAYVERTEXBUFFERPROC __glewVertexArrayVertexBuffer = NULL; +PFNGLVERTEXARRAYVERTEXBUFFERSPROC __glewVertexArrayVertexBuffers = NULL; + +PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB = NULL; + +PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB = NULL; +PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB = NULL; +PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB = NULL; +PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB = NULL; + +PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex = NULL; +PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex = NULL; +PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex = NULL; + +PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect = NULL; +PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect = NULL; + +PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri = NULL; +PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv = NULL; +PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT = NULL; +PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT = NULL; + +PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer = NULL; +PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer = NULL; +PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer = NULL; +PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus = NULL; +PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers = NULL; +PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers = NULL; +PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer = NULL; +PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D = NULL; +PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D = NULL; +PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D = NULL; +PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer = NULL; +PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers = NULL; +PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers = NULL; +PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap = NULL; +PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv = NULL; +PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv = NULL; +PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer = NULL; +PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer = NULL; +PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage = NULL; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample = NULL; + +PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB = NULL; +PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB = NULL; +PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB = NULL; +PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB = NULL; + +PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary = NULL; +PFNGLPROGRAMBINARYPROC __glewProgramBinary = NULL; +PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri = NULL; + +PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __glewGetCompressedTextureSubImage = NULL; +PFNGLGETTEXTURESUBIMAGEPROC __glewGetTextureSubImage = NULL; + +PFNGLSPECIALIZESHADERARBPROC __glewSpecializeShaderARB = NULL; + +PFNGLGETUNIFORMDVPROC __glewGetUniformdv = NULL; +PFNGLUNIFORM1DPROC __glewUniform1d = NULL; +PFNGLUNIFORM1DVPROC __glewUniform1dv = NULL; +PFNGLUNIFORM2DPROC __glewUniform2d = NULL; +PFNGLUNIFORM2DVPROC __glewUniform2dv = NULL; +PFNGLUNIFORM3DPROC __glewUniform3d = NULL; +PFNGLUNIFORM3DVPROC __glewUniform3dv = NULL; +PFNGLUNIFORM4DPROC __glewUniform4d = NULL; +PFNGLUNIFORM4DVPROC __glewUniform4dv = NULL; +PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv = NULL; +PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv = NULL; +PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv = NULL; +PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv = NULL; +PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv = NULL; +PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv = NULL; +PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv = NULL; +PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv = NULL; +PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv = NULL; + +PFNGLGETUNIFORMI64VARBPROC __glewGetUniformi64vARB = NULL; +PFNGLGETUNIFORMUI64VARBPROC __glewGetUniformui64vARB = NULL; +PFNGLGETNUNIFORMI64VARBPROC __glewGetnUniformi64vARB = NULL; +PFNGLGETNUNIFORMUI64VARBPROC __glewGetnUniformui64vARB = NULL; +PFNGLPROGRAMUNIFORM1I64ARBPROC __glewProgramUniform1i64ARB = NULL; +PFNGLPROGRAMUNIFORM1I64VARBPROC __glewProgramUniform1i64vARB = NULL; +PFNGLPROGRAMUNIFORM1UI64ARBPROC __glewProgramUniform1ui64ARB = NULL; +PFNGLPROGRAMUNIFORM1UI64VARBPROC __glewProgramUniform1ui64vARB = NULL; +PFNGLPROGRAMUNIFORM2I64ARBPROC __glewProgramUniform2i64ARB = NULL; +PFNGLPROGRAMUNIFORM2I64VARBPROC __glewProgramUniform2i64vARB = NULL; +PFNGLPROGRAMUNIFORM2UI64ARBPROC __glewProgramUniform2ui64ARB = NULL; +PFNGLPROGRAMUNIFORM2UI64VARBPROC __glewProgramUniform2ui64vARB = NULL; +PFNGLPROGRAMUNIFORM3I64ARBPROC __glewProgramUniform3i64ARB = NULL; +PFNGLPROGRAMUNIFORM3I64VARBPROC __glewProgramUniform3i64vARB = NULL; +PFNGLPROGRAMUNIFORM3UI64ARBPROC __glewProgramUniform3ui64ARB = NULL; +PFNGLPROGRAMUNIFORM3UI64VARBPROC __glewProgramUniform3ui64vARB = NULL; +PFNGLPROGRAMUNIFORM4I64ARBPROC __glewProgramUniform4i64ARB = NULL; +PFNGLPROGRAMUNIFORM4I64VARBPROC __glewProgramUniform4i64vARB = NULL; +PFNGLPROGRAMUNIFORM4UI64ARBPROC __glewProgramUniform4ui64ARB = NULL; +PFNGLPROGRAMUNIFORM4UI64VARBPROC __glewProgramUniform4ui64vARB = NULL; +PFNGLUNIFORM1I64ARBPROC __glewUniform1i64ARB = NULL; +PFNGLUNIFORM1I64VARBPROC __glewUniform1i64vARB = NULL; +PFNGLUNIFORM1UI64ARBPROC __glewUniform1ui64ARB = NULL; +PFNGLUNIFORM1UI64VARBPROC __glewUniform1ui64vARB = NULL; +PFNGLUNIFORM2I64ARBPROC __glewUniform2i64ARB = NULL; +PFNGLUNIFORM2I64VARBPROC __glewUniform2i64vARB = NULL; +PFNGLUNIFORM2UI64ARBPROC __glewUniform2ui64ARB = NULL; +PFNGLUNIFORM2UI64VARBPROC __glewUniform2ui64vARB = NULL; +PFNGLUNIFORM3I64ARBPROC __glewUniform3i64ARB = NULL; +PFNGLUNIFORM3I64VARBPROC __glewUniform3i64vARB = NULL; +PFNGLUNIFORM3UI64ARBPROC __glewUniform3ui64ARB = NULL; +PFNGLUNIFORM3UI64VARBPROC __glewUniform3ui64vARB = NULL; +PFNGLUNIFORM4I64ARBPROC __glewUniform4i64ARB = NULL; +PFNGLUNIFORM4I64VARBPROC __glewUniform4i64vARB = NULL; +PFNGLUNIFORM4UI64ARBPROC __glewUniform4ui64ARB = NULL; +PFNGLUNIFORM4UI64VARBPROC __glewUniform4ui64vARB = NULL; + +PFNGLCOLORSUBTABLEPROC __glewColorSubTable = NULL; +PFNGLCOLORTABLEPROC __glewColorTable = NULL; +PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv = NULL; +PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv = NULL; +PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D = NULL; +PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D = NULL; +PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf = NULL; +PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv = NULL; +PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri = NULL; +PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv = NULL; +PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable = NULL; +PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable = NULL; +PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D = NULL; +PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D = NULL; +PFNGLGETCOLORTABLEPROC __glewGetColorTable = NULL; +PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv = NULL; +PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv = NULL; +PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter = NULL; +PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv = NULL; +PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv = NULL; +PFNGLGETHISTOGRAMPROC __glewGetHistogram = NULL; +PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv = NULL; +PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv = NULL; +PFNGLGETMINMAXPROC __glewGetMinmax = NULL; +PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv = NULL; +PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv = NULL; +PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter = NULL; +PFNGLHISTOGRAMPROC __glewHistogram = NULL; +PFNGLMINMAXPROC __glewMinmax = NULL; +PFNGLRESETHISTOGRAMPROC __glewResetHistogram = NULL; +PFNGLRESETMINMAXPROC __glewResetMinmax = NULL; +PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D = NULL; + +PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB = NULL; + +PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB = NULL; +PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB = NULL; +PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB = NULL; + +PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ = NULL; + +PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v = NULL; + +PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData = NULL; +PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData = NULL; +PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer = NULL; +PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer = NULL; +PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage = NULL; +PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage = NULL; + +PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange = NULL; +PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange = NULL; + +PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB = NULL; +PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB = NULL; +PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB = NULL; +PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB = NULL; +PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB = NULL; + +PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase = NULL; +PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange = NULL; +PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures = NULL; +PFNGLBINDSAMPLERSPROC __glewBindSamplers = NULL; +PFNGLBINDTEXTURESPROC __glewBindTextures = NULL; +PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers = NULL; + +PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect = NULL; + +PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB = NULL; + +PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB = NULL; +PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB = NULL; +PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB = NULL; +PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB = NULL; +PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB = NULL; +PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB = NULL; +PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB = NULL; +PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB = NULL; +PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB = NULL; +PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB = NULL; +PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB = NULL; +PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB = NULL; +PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB = NULL; +PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB = NULL; +PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB = NULL; +PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB = NULL; +PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB = NULL; +PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB = NULL; +PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB = NULL; +PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB = NULL; +PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB = NULL; +PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB = NULL; +PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB = NULL; +PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB = NULL; +PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB = NULL; +PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB = NULL; +PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB = NULL; +PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB = NULL; +PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB = NULL; +PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB = NULL; +PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB = NULL; +PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB = NULL; +PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB = NULL; +PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB = NULL; + +PFNGLBEGINQUERYARBPROC __glewBeginQueryARB = NULL; +PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB = NULL; +PFNGLENDQUERYARBPROC __glewEndQueryARB = NULL; +PFNGLGENQUERIESARBPROC __glewGenQueriesARB = NULL; +PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB = NULL; +PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB = NULL; +PFNGLGETQUERYIVARBPROC __glewGetQueryivARB = NULL; +PFNGLISQUERYARBPROC __glewIsQueryARB = NULL; + +PFNGLMAXSHADERCOMPILERTHREADSARBPROC __glewMaxShaderCompilerThreadsARB = NULL; + +PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB = NULL; +PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB = NULL; + +PFNGLPOLYGONOFFSETCLAMPPROC __glewPolygonOffsetClamp = NULL; + +PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv = NULL; +PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex = NULL; +PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation = NULL; +PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex = NULL; +PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName = NULL; +PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv = NULL; + +PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex = NULL; + +PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB = NULL; +PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB = NULL; +PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB = NULL; +PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB = NULL; +PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB = NULL; +PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB = NULL; +PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB = NULL; +PFNGLGETNMAPIVARBPROC __glewGetnMapivARB = NULL; +PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB = NULL; +PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB = NULL; +PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB = NULL; +PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB = NULL; +PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB = NULL; +PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB = NULL; +PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB = NULL; +PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB = NULL; +PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB = NULL; +PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB = NULL; +PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB = NULL; +PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB = NULL; + +PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewFramebufferSampleLocationsfvARB = NULL; +PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewNamedFramebufferSampleLocationsfvARB = NULL; + +PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB = NULL; + +PFNGLBINDSAMPLERPROC __glewBindSampler = NULL; +PFNGLDELETESAMPLERSPROC __glewDeleteSamplers = NULL; +PFNGLGENSAMPLERSPROC __glewGenSamplers = NULL; +PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv = NULL; +PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv = NULL; +PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv = NULL; +PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv = NULL; +PFNGLISSAMPLERPROC __glewIsSampler = NULL; +PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv = NULL; +PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv = NULL; +PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf = NULL; +PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv = NULL; +PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri = NULL; +PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv = NULL; + +PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram = NULL; +PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline = NULL; +PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv = NULL; +PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines = NULL; +PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines = NULL; +PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog = NULL; +PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv = NULL; +PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline = NULL; +PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d = NULL; +PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv = NULL; +PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f = NULL; +PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv = NULL; +PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i = NULL; +PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv = NULL; +PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui = NULL; +PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv = NULL; +PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d = NULL; +PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv = NULL; +PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f = NULL; +PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv = NULL; +PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i = NULL; +PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv = NULL; +PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui = NULL; +PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv = NULL; +PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d = NULL; +PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv = NULL; +PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f = NULL; +PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv = NULL; +PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i = NULL; +PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv = NULL; +PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui = NULL; +PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv = NULL; +PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d = NULL; +PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv = NULL; +PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f = NULL; +PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv = NULL; +PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i = NULL; +PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv = NULL; +PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui = NULL; +PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv = NULL; +PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages = NULL; +PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline = NULL; + +PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv = NULL; + +PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture = NULL; +PFNGLMEMORYBARRIERPROC __glewMemoryBarrier = NULL; + +PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB = NULL; +PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB = NULL; +PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB = NULL; +PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB = NULL; +PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB = NULL; +PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB = NULL; +PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB = NULL; +PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB = NULL; +PFNGLGETHANDLEARBPROC __glewGetHandleARB = NULL; +PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB = NULL; +PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB = NULL; +PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB = NULL; +PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB = NULL; +PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB = NULL; +PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB = NULL; +PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB = NULL; +PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB = NULL; +PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB = NULL; +PFNGLUNIFORM1FARBPROC __glewUniform1fARB = NULL; +PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB = NULL; +PFNGLUNIFORM1IARBPROC __glewUniform1iARB = NULL; +PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB = NULL; +PFNGLUNIFORM2FARBPROC __glewUniform2fARB = NULL; +PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB = NULL; +PFNGLUNIFORM2IARBPROC __glewUniform2iARB = NULL; +PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB = NULL; +PFNGLUNIFORM3FARBPROC __glewUniform3fARB = NULL; +PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB = NULL; +PFNGLUNIFORM3IARBPROC __glewUniform3iARB = NULL; +PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB = NULL; +PFNGLUNIFORM4FARBPROC __glewUniform4fARB = NULL; +PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB = NULL; +PFNGLUNIFORM4IARBPROC __glewUniform4iARB = NULL; +PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB = NULL; +PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB = NULL; +PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB = NULL; +PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB = NULL; +PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB = NULL; +PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB = NULL; + +PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding = NULL; + +PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName = NULL; +PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName = NULL; +PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv = NULL; +PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv = NULL; +PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex = NULL; +PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation = NULL; +PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv = NULL; +PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv = NULL; + +PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB = NULL; +PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB = NULL; +PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB = NULL; +PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB = NULL; +PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB = NULL; +PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB = NULL; + +PFNGLBUFFERPAGECOMMITMENTARBPROC __glewBufferPageCommitmentARB = NULL; + +PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB = NULL; + +PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync = NULL; +PFNGLDELETESYNCPROC __glewDeleteSync = NULL; +PFNGLFENCESYNCPROC __glewFenceSync = NULL; +PFNGLGETINTEGER64VPROC __glewGetInteger64v = NULL; +PFNGLGETSYNCIVPROC __glewGetSynciv = NULL; +PFNGLISSYNCPROC __glewIsSync = NULL; +PFNGLWAITSYNCPROC __glewWaitSync = NULL; + +PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv = NULL; +PFNGLPATCHPARAMETERIPROC __glewPatchParameteri = NULL; + +PFNGLTEXTUREBARRIERPROC __glewTextureBarrier = NULL; + +PFNGLTEXBUFFERARBPROC __glewTexBufferARB = NULL; + +PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange = NULL; +PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT = NULL; + +PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB = NULL; +PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB = NULL; +PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB = NULL; +PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB = NULL; + +PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv = NULL; +PFNGLSAMPLEMASKIPROC __glewSampleMaski = NULL; +PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample = NULL; +PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample = NULL; + +PFNGLTEXSTORAGE1DPROC __glewTexStorage1D = NULL; +PFNGLTEXSTORAGE2DPROC __glewTexStorage2D = NULL; +PFNGLTEXSTORAGE3DPROC __glewTexStorage3D = NULL; + +PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample = NULL; +PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample = NULL; +PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT = NULL; +PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT = NULL; + +PFNGLTEXTUREVIEWPROC __glewTextureView = NULL; + +PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v = NULL; +PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v = NULL; +PFNGLQUERYCOUNTERPROC __glewQueryCounter = NULL; + +PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback = NULL; +PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks = NULL; +PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback = NULL; +PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks = NULL; +PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback = NULL; +PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback = NULL; +PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback = NULL; + +PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed = NULL; +PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream = NULL; +PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed = NULL; +PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv = NULL; + +PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced = NULL; +PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced = NULL; + +PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB = NULL; +PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB = NULL; +PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB = NULL; +PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB = NULL; + +PFNGLBINDBUFFERBASEPROC __glewBindBufferBase = NULL; +PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange = NULL; +PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName = NULL; +PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv = NULL; +PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName = NULL; +PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv = NULL; +PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v = NULL; +PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex = NULL; +PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices = NULL; +PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding = NULL; + +PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray = NULL; +PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays = NULL; +PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays = NULL; +PFNGLISVERTEXARRAYPROC __glewIsVertexArray = NULL; + +PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv = NULL; +PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d = NULL; +PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv = NULL; +PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d = NULL; +PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv = NULL; +PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d = NULL; +PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv = NULL; +PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d = NULL; +PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv = NULL; +PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer = NULL; + +PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer = NULL; +PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __glewVertexArrayBindVertexBufferEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __glewVertexArrayVertexAttribBindingEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __glewVertexArrayVertexAttribFormatEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __glewVertexArrayVertexAttribIFormatEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __glewVertexArrayVertexAttribLFormatEXT = NULL; +PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __glewVertexArrayVertexBindingDivisorEXT = NULL; +PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding = NULL; +PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat = NULL; +PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat = NULL; +PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat = NULL; +PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor = NULL; + +PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB = NULL; +PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB = NULL; +PFNGLWEIGHTBVARBPROC __glewWeightbvARB = NULL; +PFNGLWEIGHTDVARBPROC __glewWeightdvARB = NULL; +PFNGLWEIGHTFVARBPROC __glewWeightfvARB = NULL; +PFNGLWEIGHTIVARBPROC __glewWeightivARB = NULL; +PFNGLWEIGHTSVARBPROC __glewWeightsvARB = NULL; +PFNGLWEIGHTUBVARBPROC __glewWeightubvARB = NULL; +PFNGLWEIGHTUIVARBPROC __glewWeightuivARB = NULL; +PFNGLWEIGHTUSVARBPROC __glewWeightusvARB = NULL; + +PFNGLBINDBUFFERARBPROC __glewBindBufferARB = NULL; +PFNGLBUFFERDATAARBPROC __glewBufferDataARB = NULL; +PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB = NULL; +PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB = NULL; +PFNGLGENBUFFERSARBPROC __glewGenBuffersARB = NULL; +PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB = NULL; +PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB = NULL; +PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB = NULL; +PFNGLISBUFFERARBPROC __glewIsBufferARB = NULL; +PFNGLMAPBUFFERARBPROC __glewMapBufferARB = NULL; +PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB = NULL; + +PFNGLBINDPROGRAMARBPROC __glewBindProgramARB = NULL; +PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB = NULL; +PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB = NULL; +PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB = NULL; +PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB = NULL; +PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB = NULL; +PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB = NULL; +PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB = NULL; +PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB = NULL; +PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB = NULL; +PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB = NULL; +PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB = NULL; +PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB = NULL; +PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB = NULL; +PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB = NULL; +PFNGLISPROGRAMARBPROC __glewIsProgramARB = NULL; +PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB = NULL; +PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB = NULL; +PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB = NULL; +PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB = NULL; +PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB = NULL; +PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB = NULL; +PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB = NULL; +PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB = NULL; +PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB = NULL; +PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB = NULL; +PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB = NULL; +PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB = NULL; +PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB = NULL; +PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB = NULL; +PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB = NULL; +PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB = NULL; +PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB = NULL; +PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB = NULL; +PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB = NULL; +PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB = NULL; +PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB = NULL; +PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB = NULL; +PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB = NULL; +PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB = NULL; +PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB = NULL; +PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB = NULL; +PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB = NULL; +PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB = NULL; +PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB = NULL; +PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB = NULL; +PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB = NULL; +PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB = NULL; +PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB = NULL; +PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB = NULL; +PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB = NULL; +PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB = NULL; +PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB = NULL; +PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB = NULL; +PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB = NULL; +PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB = NULL; +PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB = NULL; +PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB = NULL; +PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB = NULL; +PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB = NULL; +PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB = NULL; +PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB = NULL; + +PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB = NULL; +PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB = NULL; +PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB = NULL; + +PFNGLCOLORP3UIPROC __glewColorP3ui = NULL; +PFNGLCOLORP3UIVPROC __glewColorP3uiv = NULL; +PFNGLCOLORP4UIPROC __glewColorP4ui = NULL; +PFNGLCOLORP4UIVPROC __glewColorP4uiv = NULL; +PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui = NULL; +PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv = NULL; +PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui = NULL; +PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv = NULL; +PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui = NULL; +PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv = NULL; +PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui = NULL; +PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv = NULL; +PFNGLNORMALP3UIPROC __glewNormalP3ui = NULL; +PFNGLNORMALP3UIVPROC __glewNormalP3uiv = NULL; +PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui = NULL; +PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv = NULL; +PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui = NULL; +PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv = NULL; +PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui = NULL; +PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv = NULL; +PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui = NULL; +PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv = NULL; +PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui = NULL; +PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv = NULL; +PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui = NULL; +PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv = NULL; +PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui = NULL; +PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv = NULL; +PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui = NULL; +PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv = NULL; +PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui = NULL; +PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv = NULL; +PFNGLVERTEXP2UIPROC __glewVertexP2ui = NULL; +PFNGLVERTEXP2UIVPROC __glewVertexP2uiv = NULL; +PFNGLVERTEXP3UIPROC __glewVertexP3ui = NULL; +PFNGLVERTEXP3UIVPROC __glewVertexP3uiv = NULL; +PFNGLVERTEXP4UIPROC __glewVertexP4ui = NULL; +PFNGLVERTEXP4UIVPROC __glewVertexP4uiv = NULL; + +PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv = NULL; +PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed = NULL; +PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v = NULL; +PFNGLGETFLOATI_VPROC __glewGetFloati_v = NULL; +PFNGLSCISSORARRAYVPROC __glewScissorArrayv = NULL; +PFNGLSCISSORINDEXEDPROC __glewScissorIndexed = NULL; +PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv = NULL; +PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv = NULL; +PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf = NULL; +PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv = NULL; + +PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB = NULL; +PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB = NULL; +PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB = NULL; +PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB = NULL; +PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB = NULL; +PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB = NULL; +PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB = NULL; +PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB = NULL; +PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB = NULL; +PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB = NULL; +PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB = NULL; +PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB = NULL; +PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB = NULL; +PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB = NULL; +PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB = NULL; +PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB = NULL; + +PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI = NULL; + +PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI = NULL; +PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI = NULL; +PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI = NULL; + +PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI = NULL; +PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI = NULL; +PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI = NULL; +PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI = NULL; + +PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI = NULL; +PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI = NULL; +PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI = NULL; +PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI = NULL; +PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI = NULL; +PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI = NULL; +PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI = NULL; +PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI = NULL; +PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI = NULL; +PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI = NULL; +PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI = NULL; +PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI = NULL; +PFNGLSAMPLEMAPATIPROC __glewSampleMapATI = NULL; +PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI = NULL; + +PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI = NULL; +PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI = NULL; + +PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI = NULL; +PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI = NULL; + +PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI = NULL; +PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI = NULL; + +PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI = NULL; +PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI = NULL; +PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI = NULL; +PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI = NULL; +PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI = NULL; +PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI = NULL; +PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI = NULL; +PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI = NULL; +PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI = NULL; +PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI = NULL; +PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI = NULL; +PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI = NULL; + +PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI = NULL; +PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI = NULL; +PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI = NULL; + +PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI = NULL; +PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI = NULL; +PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI = NULL; +PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI = NULL; +PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI = NULL; +PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI = NULL; +PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI = NULL; +PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI = NULL; +PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI = NULL; +PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI = NULL; +PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI = NULL; +PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI = NULL; +PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI = NULL; +PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI = NULL; +PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI = NULL; +PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI = NULL; +PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI = NULL; +PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI = NULL; +PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI = NULL; +PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI = NULL; +PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI = NULL; +PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI = NULL; +PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI = NULL; +PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI = NULL; +PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI = NULL; +PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI = NULL; +PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI = NULL; +PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI = NULL; +PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI = NULL; +PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI = NULL; +PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI = NULL; +PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI = NULL; +PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI = NULL; +PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI = NULL; +PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI = NULL; +PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI = NULL; +PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI = NULL; +PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI = NULL; +PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI = NULL; +PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI = NULL; +PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI = NULL; +PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI = NULL; +PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI = NULL; +PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI = NULL; +PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI = NULL; + +PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC __glewDrawArraysInstancedBaseInstanceEXT = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseInstanceEXT = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseVertexBaseInstanceEXT = NULL; + +PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT = NULL; +PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT = NULL; +PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT = NULL; + +PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT = NULL; + +PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT = NULL; + +PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC __glewBindFragDataLocationIndexedEXT = NULL; +PFNGLGETFRAGDATAINDEXEXTPROC __glewGetFragDataIndexEXT = NULL; +PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC __glewGetProgramResourceLocationIndexEXT = NULL; + +PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT = NULL; + +PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT = NULL; + +PFNGLBUFFERSTORAGEEXTPROC __glewBufferStorageEXT = NULL; +PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT = NULL; + +PFNGLCLEARTEXIMAGEEXTPROC __glewClearTexImageEXT = NULL; +PFNGLCLEARTEXSUBIMAGEEXTPROC __glewClearTexSubImageEXT = NULL; + +PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT = NULL; +PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT = NULL; + +PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT = NULL; +PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT = NULL; + +PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT = NULL; +PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT = NULL; +PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT = NULL; +PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT = NULL; +PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT = NULL; +PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT = NULL; +PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT = NULL; +PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT = NULL; +PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT = NULL; +PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT = NULL; +PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT = NULL; +PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT = NULL; +PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT = NULL; + +PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT = NULL; +PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT = NULL; + +PFNGLCOPYIMAGESUBDATAEXTPROC __glewCopyImageSubDataEXT = NULL; + +PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT = NULL; +PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT = NULL; +PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT = NULL; +PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT = NULL; +PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT = NULL; + +PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT = NULL; +PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT = NULL; + +PFNGLGETOBJECTLABELEXTPROC __glewGetObjectLabelEXT = NULL; +PFNGLLABELOBJECTEXTPROC __glewLabelObjectEXT = NULL; + +PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT = NULL; +PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT = NULL; +PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT = NULL; + +PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT = NULL; + +PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT = NULL; +PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT = NULL; +PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT = NULL; +PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT = NULL; +PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT = NULL; +PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT = NULL; +PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT = NULL; +PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT = NULL; +PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT = NULL; +PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT = NULL; +PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT = NULL; +PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT = NULL; +PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT = NULL; +PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT = NULL; +PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT = NULL; +PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT = NULL; +PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT = NULL; +PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT = NULL; +PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT = NULL; +PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT = NULL; +PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT = NULL; +PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT = NULL; +PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT = NULL; +PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT = NULL; +PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT = NULL; +PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT = NULL; +PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT = NULL; +PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT = NULL; +PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT = NULL; +PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT = NULL; +PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT = NULL; +PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT = NULL; +PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT = NULL; +PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT = NULL; +PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT = NULL; +PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT = NULL; +PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT = NULL; +PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT = NULL; +PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT = NULL; +PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT = NULL; +PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT = NULL; +PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT = NULL; +PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT = NULL; +PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT = NULL; +PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT = NULL; +PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT = NULL; +PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT = NULL; +PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT = NULL; +PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT = NULL; +PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT = NULL; +PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT = NULL; +PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT = NULL; +PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT = NULL; +PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT = NULL; +PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT = NULL; +PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT = NULL; +PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT = NULL; +PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT = NULL; +PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT = NULL; +PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT = NULL; +PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT = NULL; +PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT = NULL; +PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT = NULL; +PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT = NULL; +PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT = NULL; +PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT = NULL; +PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT = NULL; +PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT = NULL; +PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT = NULL; +PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT = NULL; +PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT = NULL; +PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT = NULL; +PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT = NULL; +PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT = NULL; +PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT = NULL; +PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT = NULL; +PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT = NULL; +PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT = NULL; +PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT = NULL; +PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT = NULL; +PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT = NULL; +PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT = NULL; +PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT = NULL; +PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT = NULL; +PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT = NULL; +PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT = NULL; +PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT = NULL; +PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT = NULL; +PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT = NULL; +PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT = NULL; +PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT = NULL; +PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT = NULL; +PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT = NULL; +PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT = NULL; +PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT = NULL; +PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT = NULL; +PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT = NULL; +PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT = NULL; +PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT = NULL; +PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT = NULL; +PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT = NULL; +PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT = NULL; +PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT = NULL; +PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT = NULL; +PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT = NULL; +PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT = NULL; +PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT = NULL; +PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT = NULL; +PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT = NULL; +PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT = NULL; +PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT = NULL; +PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT = NULL; +PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT = NULL; +PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT = NULL; +PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT = NULL; +PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT = NULL; +PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT = NULL; +PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT = NULL; +PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT = NULL; +PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT = NULL; +PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT = NULL; +PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT = NULL; +PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT = NULL; +PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT = NULL; +PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT = NULL; +PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT = NULL; +PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT = NULL; +PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT = NULL; +PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT = NULL; +PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT = NULL; +PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT = NULL; +PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT = NULL; +PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT = NULL; +PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT = NULL; +PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT = NULL; +PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT = NULL; +PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT = NULL; +PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT = NULL; +PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT = NULL; +PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT = NULL; +PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT = NULL; +PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT = NULL; +PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT = NULL; +PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT = NULL; +PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT = NULL; +PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT = NULL; +PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT = NULL; +PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT = NULL; +PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT = NULL; +PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT = NULL; +PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT = NULL; +PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT = NULL; +PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT = NULL; +PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT = NULL; +PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT = NULL; +PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT = NULL; +PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT = NULL; +PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT = NULL; +PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT = NULL; +PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT = NULL; +PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT = NULL; +PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT = NULL; +PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT = NULL; +PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT = NULL; +PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT = NULL; +PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT = NULL; +PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT = NULL; +PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT = NULL; +PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT = NULL; +PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT = NULL; +PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT = NULL; +PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT = NULL; +PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __glewVertexArrayVertexAttribDivisorEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT = NULL; +PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT = NULL; + +PFNGLDISCARDFRAMEBUFFEREXTPROC __glewDiscardFramebufferEXT = NULL; + +PFNGLDRAWBUFFERSEXTPROC __glewDrawBuffersEXT = NULL; + +PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT = NULL; +PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT = NULL; +PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT = NULL; +PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT = NULL; +PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT = NULL; +PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT = NULL; + +PFNGLBLENDEQUATIONSEPARATEIEXTPROC __glewBlendEquationSeparateiEXT = NULL; +PFNGLBLENDEQUATIONIEXTPROC __glewBlendEquationiEXT = NULL; +PFNGLBLENDFUNCSEPARATEIEXTPROC __glewBlendFuncSeparateiEXT = NULL; +PFNGLBLENDFUNCIEXTPROC __glewBlendFunciEXT = NULL; +PFNGLCOLORMASKIEXTPROC __glewColorMaskiEXT = NULL; +PFNGLDISABLEIEXTPROC __glewDisableiEXT = NULL; +PFNGLENABLEIEXTPROC __glewEnableiEXT = NULL; +PFNGLISENABLEDIEXTPROC __glewIsEnablediEXT = NULL; + +PFNGLDRAWELEMENTSBASEVERTEXEXTPROC __glewDrawElementsBaseVertexEXT = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC __glewDrawElementsInstancedBaseVertexEXT = NULL; +PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC __glewDrawRangeElementsBaseVertexEXT = NULL; +PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC __glewMultiDrawElementsBaseVertexEXT = NULL; + +PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT = NULL; +PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT = NULL; + +PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT = NULL; + +PFNGLBUFFERSTORAGEEXTERNALEXTPROC __glewBufferStorageExternalEXT = NULL; +PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC __glewNamedBufferStorageExternalEXT = NULL; + +PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT = NULL; +PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT = NULL; +PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT = NULL; +PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT = NULL; +PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT = NULL; + +PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT = NULL; +PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT = NULL; +PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT = NULL; +PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT = NULL; +PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT = NULL; +PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT = NULL; +PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT = NULL; +PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT = NULL; +PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT = NULL; +PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT = NULL; +PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT = NULL; +PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT = NULL; +PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT = NULL; +PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT = NULL; +PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT = NULL; +PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT = NULL; +PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT = NULL; +PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT = NULL; + +PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT = NULL; + +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT = NULL; + +PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT = NULL; +PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT = NULL; +PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT = NULL; +PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT = NULL; +PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT = NULL; +PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT = NULL; +PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT = NULL; +PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT = NULL; +PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT = NULL; +PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT = NULL; +PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT = NULL; +PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT = NULL; +PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT = NULL; +PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT = NULL; +PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT = NULL; +PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT = NULL; +PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT = NULL; + +PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT = NULL; +PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT = NULL; +PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT = NULL; + +PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT = NULL; +PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT = NULL; + +PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT = NULL; +PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT = NULL; +PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT = NULL; +PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT = NULL; +PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT = NULL; +PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT = NULL; +PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT = NULL; +PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT = NULL; +PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT = NULL; +PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT = NULL; +PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT = NULL; +PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT = NULL; +PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT = NULL; +PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT = NULL; +PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT = NULL; +PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT = NULL; +PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT = NULL; +PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT = NULL; +PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT = NULL; +PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT = NULL; +PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT = NULL; +PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT = NULL; +PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT = NULL; +PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT = NULL; +PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT = NULL; +PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT = NULL; +PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT = NULL; +PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT = NULL; +PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT = NULL; +PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT = NULL; +PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT = NULL; +PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT = NULL; +PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT = NULL; +PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT = NULL; + +PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT = NULL; +PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT = NULL; +PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT = NULL; +PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT = NULL; +PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT = NULL; +PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT = NULL; +PFNGLHISTOGRAMEXTPROC __glewHistogramEXT = NULL; +PFNGLMINMAXEXTPROC __glewMinmaxEXT = NULL; +PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT = NULL; +PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT = NULL; + +PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT = NULL; + +PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT = NULL; + +PFNGLVERTEXATTRIBDIVISOREXTPROC __glewVertexAttribDivisorEXT = NULL; + +PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT = NULL; +PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT = NULL; +PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT = NULL; + +PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC __glewFlushMappedBufferRangeEXT = NULL; +PFNGLMAPBUFFERRANGEEXTPROC __glewMapBufferRangeEXT = NULL; + +PFNGLBUFFERSTORAGEMEMEXTPROC __glewBufferStorageMemEXT = NULL; +PFNGLCREATEMEMORYOBJECTSEXTPROC __glewCreateMemoryObjectsEXT = NULL; +PFNGLDELETEMEMORYOBJECTSEXTPROC __glewDeleteMemoryObjectsEXT = NULL; +PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC __glewGetMemoryObjectParameterivEXT = NULL; +PFNGLGETUNSIGNEDBYTEI_VEXTPROC __glewGetUnsignedBytei_vEXT = NULL; +PFNGLGETUNSIGNEDBYTEVEXTPROC __glewGetUnsignedBytevEXT = NULL; +PFNGLISMEMORYOBJECTEXTPROC __glewIsMemoryObjectEXT = NULL; +PFNGLMEMORYOBJECTPARAMETERIVEXTPROC __glewMemoryObjectParameterivEXT = NULL; +PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC __glewNamedBufferStorageMemEXT = NULL; +PFNGLTEXSTORAGEMEM1DEXTPROC __glewTexStorageMem1DEXT = NULL; +PFNGLTEXSTORAGEMEM2DEXTPROC __glewTexStorageMem2DEXT = NULL; +PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC __glewTexStorageMem2DMultisampleEXT = NULL; +PFNGLTEXSTORAGEMEM3DEXTPROC __glewTexStorageMem3DEXT = NULL; +PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC __glewTexStorageMem3DMultisampleEXT = NULL; +PFNGLTEXTURESTORAGEMEM1DEXTPROC __glewTextureStorageMem1DEXT = NULL; +PFNGLTEXTURESTORAGEMEM2DEXTPROC __glewTextureStorageMem2DEXT = NULL; +PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC __glewTextureStorageMem2DMultisampleEXT = NULL; +PFNGLTEXTURESTORAGEMEM3DEXTPROC __glewTextureStorageMem3DEXT = NULL; +PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC __glewTextureStorageMem3DMultisampleEXT = NULL; + +PFNGLIMPORTMEMORYFDEXTPROC __glewImportMemoryFdEXT = NULL; + +PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC __glewImportMemoryWin32HandleEXT = NULL; +PFNGLIMPORTMEMORYWIN32NAMEEXTPROC __glewImportMemoryWin32NameEXT = NULL; + +PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT = NULL; +PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT = NULL; + +PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC __glewMultiDrawArraysIndirectEXT = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC __glewMultiDrawElementsIndirectEXT = NULL; + +PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT = NULL; +PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT = NULL; + +PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC __glewFramebufferTexture2DMultisampleEXT = NULL; + +PFNGLDRAWBUFFERSINDEXEDEXTPROC __glewDrawBuffersIndexedEXT = NULL; +PFNGLGETINTEGERI_VEXTPROC __glewGetIntegeri_vEXT = NULL; +PFNGLREADBUFFERINDEXEDEXTPROC __glewReadBufferIndexedEXT = NULL; + +PFNGLCOLORTABLEEXTPROC __glewColorTableEXT = NULL; +PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT = NULL; +PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT = NULL; +PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT = NULL; + +PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT = NULL; +PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT = NULL; +PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT = NULL; +PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT = NULL; +PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT = NULL; +PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT = NULL; + +PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT = NULL; +PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT = NULL; + +PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT = NULL; + +PFNGLPOLYGONOFFSETCLAMPEXTPROC __glewPolygonOffsetClampEXT = NULL; + +PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT = NULL; + +PFNGLCOVERAGEMODULATIONNVPROC __glewCoverageModulationNV = NULL; +PFNGLCOVERAGEMODULATIONTABLENVPROC __glewCoverageModulationTableNV = NULL; +PFNGLGETCOVERAGEMODULATIONTABLENVPROC __glewGetCoverageModulationTableNV = NULL; +PFNGLRASTERSAMPLESEXTPROC __glewRasterSamplesEXT = NULL; + +PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT = NULL; +PFNGLENDSCENEEXTPROC __glewEndSceneEXT = NULL; + +PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT = NULL; +PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT = NULL; +PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT = NULL; +PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT = NULL; +PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT = NULL; +PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT = NULL; +PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT = NULL; +PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT = NULL; +PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT = NULL; +PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT = NULL; +PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT = NULL; +PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT = NULL; +PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT = NULL; +PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT = NULL; +PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT = NULL; +PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT = NULL; +PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT = NULL; + +PFNGLDELETESEMAPHORESEXTPROC __glewDeleteSemaphoresEXT = NULL; +PFNGLGENSEMAPHORESEXTPROC __glewGenSemaphoresEXT = NULL; +PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC __glewGetSemaphoreParameterui64vEXT = NULL; +PFNGLISSEMAPHOREEXTPROC __glewIsSemaphoreEXT = NULL; +PFNGLSEMAPHOREPARAMETERUI64VEXTPROC __glewSemaphoreParameterui64vEXT = NULL; +PFNGLSIGNALSEMAPHOREEXTPROC __glewSignalSemaphoreEXT = NULL; +PFNGLWAITSEMAPHOREEXTPROC __glewWaitSemaphoreEXT = NULL; + +PFNGLIMPORTSEMAPHOREFDEXTPROC __glewImportSemaphoreFdEXT = NULL; + +PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC __glewImportSemaphoreWin32HandleEXT = NULL; +PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC __glewImportSemaphoreWin32NameEXT = NULL; + +PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT = NULL; +PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT = NULL; +PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT = NULL; + +PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT = NULL; +PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT = NULL; + +PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC __glewClearPixelLocalStorageuiEXT = NULL; +PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewFramebufferPixelLocalStorageSizeEXT = NULL; +PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewGetFramebufferPixelLocalStorageSizeEXT = NULL; + +PFNGLTEXPAGECOMMITMENTEXTPROC __glewTexPageCommitmentEXT = NULL; +PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT = NULL; + +PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT = NULL; + +PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT = NULL; +PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT = NULL; +PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT = NULL; + +PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT = NULL; + +PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT = NULL; + +PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT = NULL; + +PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT = NULL; +PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT = NULL; +PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT = NULL; +PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT = NULL; +PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT = NULL; +PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT = NULL; + +PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT = NULL; +PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT = NULL; +PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT = NULL; +PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT = NULL; +PFNGLISTEXTUREEXTPROC __glewIsTextureEXT = NULL; +PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT = NULL; + +PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT = NULL; + +PFNGLTEXSTORAGE1DEXTPROC __glewTexStorage1DEXT = NULL; +PFNGLTEXSTORAGE2DEXTPROC __glewTexStorage2DEXT = NULL; +PFNGLTEXSTORAGE3DEXTPROC __glewTexStorage3DEXT = NULL; +PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT = NULL; +PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT = NULL; +PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT = NULL; + +PFNGLTEXTUREVIEWEXTPROC __glewTextureViewEXT = NULL; + +PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT = NULL; +PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT = NULL; + +PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT = NULL; +PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT = NULL; +PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT = NULL; +PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT = NULL; +PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT = NULL; +PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT = NULL; +PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT = NULL; + +PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT = NULL; +PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT = NULL; +PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT = NULL; +PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT = NULL; +PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT = NULL; +PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT = NULL; +PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT = NULL; +PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT = NULL; + +PFNGLBINDARRAYSETEXTPROC __glewBindArraySetEXT = NULL; +PFNGLCREATEARRAYSETEXTPROC __glewCreateArraySetExt = NULL; +PFNGLDELETEARRAYSETSEXTPROC __glewDeleteArraySetsEXT = NULL; + +PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT = NULL; +PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT = NULL; +PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT = NULL; +PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT = NULL; +PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT = NULL; +PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT = NULL; +PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT = NULL; +PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT = NULL; +PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT = NULL; +PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT = NULL; + +PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT = NULL; +PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT = NULL; +PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT = NULL; +PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT = NULL; +PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT = NULL; +PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT = NULL; +PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT = NULL; +PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT = NULL; +PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT = NULL; +PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT = NULL; +PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT = NULL; +PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT = NULL; +PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT = NULL; +PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT = NULL; +PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT = NULL; +PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT = NULL; +PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT = NULL; +PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT = NULL; +PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT = NULL; +PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT = NULL; +PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT = NULL; +PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT = NULL; +PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT = NULL; +PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT = NULL; +PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT = NULL; +PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT = NULL; +PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT = NULL; +PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT = NULL; +PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT = NULL; +PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT = NULL; +PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT = NULL; +PFNGLSWIZZLEEXTPROC __glewSwizzleEXT = NULL; +PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT = NULL; +PFNGLVARIANTBVEXTPROC __glewVariantbvEXT = NULL; +PFNGLVARIANTDVEXTPROC __glewVariantdvEXT = NULL; +PFNGLVARIANTFVEXTPROC __glewVariantfvEXT = NULL; +PFNGLVARIANTIVEXTPROC __glewVariantivEXT = NULL; +PFNGLVARIANTSVEXTPROC __glewVariantsvEXT = NULL; +PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT = NULL; +PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT = NULL; +PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT = NULL; +PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT = NULL; + +PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT = NULL; +PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT = NULL; +PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT = NULL; + +PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC __glewAcquireKeyedMutexWin32EXT = NULL; +PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC __glewReleaseKeyedMutexWin32EXT = NULL; + +PFNGLWINDOWRECTANGLESEXTPROC __glewWindowRectanglesEXT = NULL; + +PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT = NULL; + +PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY = NULL; + +PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY = NULL; + +PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP = NULL; +PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP = NULL; +PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP = NULL; +PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP = NULL; +PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP = NULL; +PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP = NULL; + +PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM = NULL; +PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM = NULL; + +PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM = NULL; +PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM = NULL; +PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM = NULL; +PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM = NULL; +PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM = NULL; +PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM = NULL; +PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM = NULL; +PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM = NULL; + +PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL = NULL; +PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL = NULL; +PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL = NULL; + +PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL = NULL; +PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL = NULL; +PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL = NULL; +PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL = NULL; + +PFNGLBEGINPERFQUERYINTELPROC __glewBeginPerfQueryINTEL = NULL; +PFNGLCREATEPERFQUERYINTELPROC __glewCreatePerfQueryINTEL = NULL; +PFNGLDELETEPERFQUERYINTELPROC __glewDeletePerfQueryINTEL = NULL; +PFNGLENDPERFQUERYINTELPROC __glewEndPerfQueryINTEL = NULL; +PFNGLGETFIRSTPERFQUERYIDINTELPROC __glewGetFirstPerfQueryIdINTEL = NULL; +PFNGLGETNEXTPERFQUERYIDINTELPROC __glewGetNextPerfQueryIdINTEL = NULL; +PFNGLGETPERFCOUNTERINFOINTELPROC __glewGetPerfCounterInfoINTEL = NULL; +PFNGLGETPERFQUERYDATAINTELPROC __glewGetPerfQueryDataINTEL = NULL; +PFNGLGETPERFQUERYIDBYNAMEINTELPROC __glewGetPerfQueryIdByNameINTEL = NULL; +PFNGLGETPERFQUERYINFOINTELPROC __glewGetPerfQueryInfoINTEL = NULL; + +PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL = NULL; +PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL = NULL; + +PFNGLBLENDBARRIERKHRPROC __glewBlendBarrierKHR = NULL; + +PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback = NULL; +PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl = NULL; +PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert = NULL; +PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog = NULL; +PFNGLGETOBJECTLABELPROC __glewGetObjectLabel = NULL; +PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel = NULL; +PFNGLOBJECTLABELPROC __glewObjectLabel = NULL; +PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel = NULL; +PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup = NULL; +PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup = NULL; + +PFNGLMAXSHADERCOMPILERTHREADSKHRPROC __glewMaxShaderCompilerThreadsKHR = NULL; + +PFNGLGETNUNIFORMFVPROC __glewGetnUniformfv = NULL; +PFNGLGETNUNIFORMIVPROC __glewGetnUniformiv = NULL; +PFNGLGETNUNIFORMUIVPROC __glewGetnUniformuiv = NULL; +PFNGLREADNPIXELSPROC __glewReadnPixels = NULL; + +PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled = NULL; +PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion = NULL; +PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion = NULL; +PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion = NULL; +PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion = NULL; + +PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA = NULL; + +PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA = NULL; +PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA = NULL; +PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA = NULL; +PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA = NULL; +PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA = NULL; +PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA = NULL; +PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA = NULL; +PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA = NULL; +PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA = NULL; +PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA = NULL; +PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA = NULL; +PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA = NULL; +PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA = NULL; +PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA = NULL; +PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA = NULL; +PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA = NULL; +PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA = NULL; +PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA = NULL; +PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA = NULL; +PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA = NULL; +PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA = NULL; +PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA = NULL; +PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA = NULL; +PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA = NULL; + +PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX = NULL; +PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX = NULL; + +PFNGLLGPUCOPYIMAGESUBDATANVXPROC __glewLGPUCopyImageSubDataNVX = NULL; +PFNGLLGPUINTERLOCKNVXPROC __glewLGPUInterlockNVX = NULL; +PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC __glewLGPUNamedBufferSubDataNVX = NULL; + +PFNGLSTEREOPARAMETERFNVPROC __glewStereoParameterfNV = NULL; +PFNGLSTEREOPARAMETERINVPROC __glewStereoParameteriNV = NULL; + +PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV = NULL; + +PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawArraysIndirectBindlessCountNV = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawElementsIndirectBindlessCountNV = NULL; + +PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV = NULL; +PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV = NULL; +PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV = NULL; +PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV = NULL; +PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV = NULL; +PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV = NULL; +PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV = NULL; +PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV = NULL; +PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV = NULL; +PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV = NULL; +PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV = NULL; +PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV = NULL; +PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV = NULL; + +PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV = NULL; +PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV = NULL; + +PFNGLVIEWPORTPOSITIONWSCALENVPROC __glewViewportPositionWScaleNV = NULL; + +PFNGLCALLCOMMANDLISTNVPROC __glewCallCommandListNV = NULL; +PFNGLCOMMANDLISTSEGMENTSNVPROC __glewCommandListSegmentsNV = NULL; +PFNGLCOMPILECOMMANDLISTNVPROC __glewCompileCommandListNV = NULL; +PFNGLCREATECOMMANDLISTSNVPROC __glewCreateCommandListsNV = NULL; +PFNGLCREATESTATESNVPROC __glewCreateStatesNV = NULL; +PFNGLDELETECOMMANDLISTSNVPROC __glewDeleteCommandListsNV = NULL; +PFNGLDELETESTATESNVPROC __glewDeleteStatesNV = NULL; +PFNGLDRAWCOMMANDSADDRESSNVPROC __glewDrawCommandsAddressNV = NULL; +PFNGLDRAWCOMMANDSNVPROC __glewDrawCommandsNV = NULL; +PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC __glewDrawCommandsStatesAddressNV = NULL; +PFNGLDRAWCOMMANDSSTATESNVPROC __glewDrawCommandsStatesNV = NULL; +PFNGLGETCOMMANDHEADERNVPROC __glewGetCommandHeaderNV = NULL; +PFNGLGETSTAGEINDEXNVPROC __glewGetStageIndexNV = NULL; +PFNGLISCOMMANDLISTNVPROC __glewIsCommandListNV = NULL; +PFNGLISSTATENVPROC __glewIsStateNV = NULL; +PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC __glewListDrawCommandsStatesClientNV = NULL; +PFNGLSTATECAPTURENVPROC __glewStateCaptureNV = NULL; + +PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV = NULL; +PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV = NULL; + +PFNGLSUBPIXELPRECISIONBIASNVPROC __glewSubpixelPrecisionBiasNV = NULL; + +PFNGLCONSERVATIVERASTERPARAMETERFNVPROC __glewConservativeRasterParameterfNV = NULL; + +PFNGLCONSERVATIVERASTERPARAMETERINVPROC __glewConservativeRasterParameteriNV = NULL; + +PFNGLCOPYBUFFERSUBDATANVPROC __glewCopyBufferSubDataNV = NULL; + +PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV = NULL; + +PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV = NULL; +PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV = NULL; +PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV = NULL; + +PFNGLDRAWBUFFERSNVPROC __glewDrawBuffersNV = NULL; + +PFNGLDRAWARRAYSINSTANCEDNVPROC __glewDrawArraysInstancedNV = NULL; +PFNGLDRAWELEMENTSINSTANCEDNVPROC __glewDrawElementsInstancedNV = NULL; + +PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV = NULL; + +PFNGLDRAWVKIMAGENVPROC __glewDrawVkImageNV = NULL; +PFNGLGETVKPROCADDRNVPROC __glewGetVkProcAddrNV = NULL; +PFNGLSIGNALVKFENCENVPROC __glewSignalVkFenceNV = NULL; +PFNGLSIGNALVKSEMAPHORENVPROC __glewSignalVkSemaphoreNV = NULL; +PFNGLWAITVKSEMAPHORENVPROC __glewWaitVkSemaphoreNV = NULL; + +PFNGLEVALMAPSNVPROC __glewEvalMapsNV = NULL; +PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV = NULL; +PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV = NULL; +PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV = NULL; +PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV = NULL; +PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV = NULL; +PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV = NULL; +PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV = NULL; +PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV = NULL; + +PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV = NULL; +PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV = NULL; +PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV = NULL; + +PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV = NULL; +PFNGLFINISHFENCENVPROC __glewFinishFenceNV = NULL; +PFNGLGENFENCESNVPROC __glewGenFencesNV = NULL; +PFNGLGETFENCEIVNVPROC __glewGetFenceivNV = NULL; +PFNGLISFENCENVPROC __glewIsFenceNV = NULL; +PFNGLSETFENCENVPROC __glewSetFenceNV = NULL; +PFNGLTESTFENCENVPROC __glewTestFenceNV = NULL; + +PFNGLFRAGMENTCOVERAGECOLORNVPROC __glewFragmentCoverageColorNV = NULL; + +PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV = NULL; +PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV = NULL; +PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV = NULL; +PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV = NULL; +PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV = NULL; +PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV = NULL; + +PFNGLBLITFRAMEBUFFERNVPROC __glewBlitFramebufferNV = NULL; + +PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC __glewRenderbufferStorageMultisampleNV = NULL; + +PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV = NULL; + +PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV = NULL; + +PFNGLMULTICASTBARRIERNVPROC __glewMulticastBarrierNV = NULL; +PFNGLMULTICASTBLITFRAMEBUFFERNVPROC __glewMulticastBlitFramebufferNV = NULL; +PFNGLMULTICASTBUFFERSUBDATANVPROC __glewMulticastBufferSubDataNV = NULL; +PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC __glewMulticastCopyBufferSubDataNV = NULL; +PFNGLMULTICASTCOPYIMAGESUBDATANVPROC __glewMulticastCopyImageSubDataNV = NULL; +PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewMulticastFramebufferSampleLocationsfvNV = NULL; +PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC __glewMulticastGetQueryObjecti64vNV = NULL; +PFNGLMULTICASTGETQUERYOBJECTIVNVPROC __glewMulticastGetQueryObjectivNV = NULL; +PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC __glewMulticastGetQueryObjectui64vNV = NULL; +PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC __glewMulticastGetQueryObjectuivNV = NULL; +PFNGLMULTICASTWAITSYNCNVPROC __glewMulticastWaitSyncNV = NULL; +PFNGLRENDERGPUMASKNVPROC __glewRenderGpuMaskNV = NULL; + +PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV = NULL; +PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV = NULL; +PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV = NULL; +PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV = NULL; +PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV = NULL; +PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV = NULL; +PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV = NULL; +PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV = NULL; +PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV = NULL; +PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV = NULL; +PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV = NULL; +PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV = NULL; + +PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV = NULL; +PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV = NULL; +PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV = NULL; +PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV = NULL; +PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV = NULL; +PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV = NULL; +PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV = NULL; +PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV = NULL; +PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV = NULL; +PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV = NULL; +PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV = NULL; +PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV = NULL; +PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV = NULL; +PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV = NULL; +PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV = NULL; +PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV = NULL; +PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV = NULL; +PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV = NULL; +PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV = NULL; +PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV = NULL; +PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV = NULL; +PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV = NULL; +PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV = NULL; +PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV = NULL; +PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV = NULL; +PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV = NULL; +PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV = NULL; +PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV = NULL; +PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV = NULL; +PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV = NULL; +PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV = NULL; +PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV = NULL; +PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV = NULL; +PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV = NULL; + +PFNGLCOLOR3HNVPROC __glewColor3hNV = NULL; +PFNGLCOLOR3HVNVPROC __glewColor3hvNV = NULL; +PFNGLCOLOR4HNVPROC __glewColor4hNV = NULL; +PFNGLCOLOR4HVNVPROC __glewColor4hvNV = NULL; +PFNGLFOGCOORDHNVPROC __glewFogCoordhNV = NULL; +PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV = NULL; +PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV = NULL; +PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV = NULL; +PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV = NULL; +PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV = NULL; +PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV = NULL; +PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV = NULL; +PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV = NULL; +PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV = NULL; +PFNGLNORMAL3HNVPROC __glewNormal3hNV = NULL; +PFNGLNORMAL3HVNVPROC __glewNormal3hvNV = NULL; +PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV = NULL; +PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV = NULL; +PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV = NULL; +PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV = NULL; +PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV = NULL; +PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV = NULL; +PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV = NULL; +PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV = NULL; +PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV = NULL; +PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV = NULL; +PFNGLVERTEX2HNVPROC __glewVertex2hNV = NULL; +PFNGLVERTEX2HVNVPROC __glewVertex2hvNV = NULL; +PFNGLVERTEX3HNVPROC __glewVertex3hNV = NULL; +PFNGLVERTEX3HVNVPROC __glewVertex3hvNV = NULL; +PFNGLVERTEX4HNVPROC __glewVertex4hNV = NULL; +PFNGLVERTEX4HVNVPROC __glewVertex4hvNV = NULL; +PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV = NULL; +PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV = NULL; +PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV = NULL; +PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV = NULL; +PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV = NULL; +PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV = NULL; +PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV = NULL; +PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV = NULL; +PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV = NULL; +PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV = NULL; +PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV = NULL; +PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV = NULL; +PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV = NULL; +PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV = NULL; + +PFNGLVERTEXATTRIBDIVISORNVPROC __glewVertexAttribDivisorNV = NULL; + +PFNGLGETINTERNALFORMATSAMPLEIVNVPROC __glewGetInternalformatSampleivNV = NULL; + +PFNGLUNIFORMMATRIX2X3FVNVPROC __glewUniformMatrix2x3fvNV = NULL; +PFNGLUNIFORMMATRIX2X4FVNVPROC __glewUniformMatrix2x4fvNV = NULL; +PFNGLUNIFORMMATRIX3X2FVNVPROC __glewUniformMatrix3x2fvNV = NULL; +PFNGLUNIFORMMATRIX3X4FVNVPROC __glewUniformMatrix3x4fvNV = NULL; +PFNGLUNIFORMMATRIX4X2FVNVPROC __glewUniformMatrix4x2fvNV = NULL; +PFNGLUNIFORMMATRIX4X3FVNVPROC __glewUniformMatrix4x3fvNV = NULL; + +PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV = NULL; +PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV = NULL; +PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV = NULL; +PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV = NULL; +PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV = NULL; +PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV = NULL; +PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV = NULL; + +PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV = NULL; +PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV = NULL; +PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV = NULL; + +PFNGLCOPYPATHNVPROC __glewCopyPathNV = NULL; +PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV = NULL; +PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV = NULL; +PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV = NULL; +PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV = NULL; +PFNGLDELETEPATHSNVPROC __glewDeletePathsNV = NULL; +PFNGLGENPATHSNVPROC __glewGenPathsNV = NULL; +PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV = NULL; +PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV = NULL; +PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV = NULL; +PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV = NULL; +PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV = NULL; +PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV = NULL; +PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV = NULL; +PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV = NULL; +PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV = NULL; +PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV = NULL; +PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV = NULL; +PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV = NULL; +PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV = NULL; +PFNGLGETPROGRAMRESOURCEFVNVPROC __glewGetProgramResourcefvNV = NULL; +PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV = NULL; +PFNGLISPATHNVPROC __glewIsPathNV = NULL; +PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV = NULL; +PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV = NULL; +PFNGLMATRIXLOAD3X2FNVPROC __glewMatrixLoad3x2fNV = NULL; +PFNGLMATRIXLOAD3X3FNVPROC __glewMatrixLoad3x3fNV = NULL; +PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC __glewMatrixLoadTranspose3x3fNV = NULL; +PFNGLMATRIXMULT3X2FNVPROC __glewMatrixMult3x2fNV = NULL; +PFNGLMATRIXMULT3X3FNVPROC __glewMatrixMult3x3fNV = NULL; +PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC __glewMatrixMultTranspose3x3fNV = NULL; +PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV = NULL; +PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV = NULL; +PFNGLPATHCOORDSNVPROC __glewPathCoordsNV = NULL; +PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV = NULL; +PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV = NULL; +PFNGLPATHFOGGENNVPROC __glewPathFogGenNV = NULL; +PFNGLPATHGLYPHINDEXARRAYNVPROC __glewPathGlyphIndexArrayNV = NULL; +PFNGLPATHGLYPHINDEXRANGENVPROC __glewPathGlyphIndexRangeNV = NULL; +PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV = NULL; +PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV = NULL; +PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC __glewPathMemoryGlyphIndexArrayNV = NULL; +PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV = NULL; +PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV = NULL; +PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV = NULL; +PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV = NULL; +PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV = NULL; +PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV = NULL; +PFNGLPATHSTRINGNVPROC __glewPathStringNV = NULL; +PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV = NULL; +PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV = NULL; +PFNGLPATHTEXGENNVPROC __glewPathTexGenNV = NULL; +PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV = NULL; +PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __glewProgramPathFragmentInputGenNV = NULL; +PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV = NULL; +PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV = NULL; +PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV = NULL; +PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV = NULL; +PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __glewStencilThenCoverFillPathInstancedNV = NULL; +PFNGLSTENCILTHENCOVERFILLPATHNVPROC __glewStencilThenCoverFillPathNV = NULL; +PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __glewStencilThenCoverStrokePathInstancedNV = NULL; +PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC __glewStencilThenCoverStrokePathNV = NULL; +PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV = NULL; +PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV = NULL; + +PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV = NULL; +PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV = NULL; + +PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV = NULL; +PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV = NULL; + +PFNGLPOLYGONMODENVPROC __glewPolygonModeNV = NULL; + +PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV = NULL; +PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV = NULL; +PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV = NULL; +PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV = NULL; +PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV = NULL; +PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV = NULL; + +PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV = NULL; +PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV = NULL; + +PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV = NULL; +PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV = NULL; +PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV = NULL; +PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV = NULL; +PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV = NULL; +PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV = NULL; +PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV = NULL; +PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV = NULL; +PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV = NULL; +PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV = NULL; +PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV = NULL; +PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV = NULL; +PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV = NULL; + +PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV = NULL; +PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV = NULL; + +PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewFramebufferSampleLocationsfvNV = NULL; +PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewNamedFramebufferSampleLocationsfvNV = NULL; + +PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV = NULL; +PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV = NULL; +PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV = NULL; +PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV = NULL; +PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV = NULL; +PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV = NULL; +PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV = NULL; +PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV = NULL; +PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV = NULL; +PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV = NULL; +PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV = NULL; +PFNGLUNIFORMUI64NVPROC __glewUniformui64NV = NULL; +PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV = NULL; + +PFNGLCOMPRESSEDTEXIMAGE3DNVPROC __glewCompressedTexImage3DNV = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC __glewCompressedTexSubImage3DNV = NULL; +PFNGLCOPYTEXSUBIMAGE3DNVPROC __glewCopyTexSubImage3DNV = NULL; +PFNGLFRAMEBUFFERTEXTURELAYERNVPROC __glewFramebufferTextureLayerNV = NULL; +PFNGLTEXIMAGE3DNVPROC __glewTexImage3DNV = NULL; +PFNGLTEXSUBIMAGE3DNVPROC __glewTexSubImage3DNV = NULL; + +PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV = NULL; + +PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV = NULL; +PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV = NULL; +PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV = NULL; +PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV = NULL; +PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV = NULL; +PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV = NULL; + +PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV = NULL; +PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV = NULL; +PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV = NULL; +PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV = NULL; +PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV = NULL; +PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV = NULL; +PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV = NULL; +PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV = NULL; +PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV = NULL; +PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV = NULL; +PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV = NULL; + +PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV = NULL; +PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV = NULL; +PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV = NULL; +PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV = NULL; +PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV = NULL; +PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV = NULL; +PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV = NULL; + +PFNGLVDPAUFININVPROC __glewVDPAUFiniNV = NULL; +PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV = NULL; +PFNGLVDPAUINITNVPROC __glewVDPAUInitNV = NULL; +PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV = NULL; +PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV = NULL; +PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV = NULL; +PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV = NULL; +PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV = NULL; +PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV = NULL; +PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV = NULL; + +PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV = NULL; +PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV = NULL; + +PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV = NULL; +PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV = NULL; +PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV = NULL; +PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV = NULL; +PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV = NULL; +PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV = NULL; +PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV = NULL; +PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV = NULL; +PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV = NULL; +PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV = NULL; +PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV = NULL; +PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV = NULL; +PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV = NULL; +PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV = NULL; +PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV = NULL; +PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV = NULL; +PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV = NULL; +PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV = NULL; +PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV = NULL; + +PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV = NULL; +PFNGLCOLORFORMATNVPROC __glewColorFormatNV = NULL; +PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV = NULL; +PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV = NULL; +PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV = NULL; +PFNGLINDEXFORMATNVPROC __glewIndexFormatNV = NULL; +PFNGLNORMALFORMATNVPROC __glewNormalFormatNV = NULL; +PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV = NULL; +PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV = NULL; +PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV = NULL; +PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV = NULL; +PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV = NULL; + +PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV = NULL; +PFNGLBINDPROGRAMNVPROC __glewBindProgramNV = NULL; +PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV = NULL; +PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV = NULL; +PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV = NULL; +PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV = NULL; +PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV = NULL; +PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV = NULL; +PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV = NULL; +PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV = NULL; +PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV = NULL; +PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV = NULL; +PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV = NULL; +PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV = NULL; +PFNGLISPROGRAMNVPROC __glewIsProgramNV = NULL; +PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV = NULL; +PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV = NULL; +PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV = NULL; +PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV = NULL; +PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV = NULL; +PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV = NULL; +PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV = NULL; +PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV = NULL; +PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV = NULL; +PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV = NULL; +PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV = NULL; +PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV = NULL; +PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV = NULL; +PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV = NULL; +PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV = NULL; +PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV = NULL; +PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV = NULL; +PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV = NULL; +PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV = NULL; +PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV = NULL; +PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV = NULL; +PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV = NULL; +PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV = NULL; +PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV = NULL; +PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV = NULL; +PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV = NULL; +PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV = NULL; +PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV = NULL; +PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV = NULL; +PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV = NULL; +PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV = NULL; +PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV = NULL; +PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV = NULL; +PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV = NULL; +PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV = NULL; +PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV = NULL; +PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV = NULL; +PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV = NULL; +PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV = NULL; +PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV = NULL; +PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV = NULL; +PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV = NULL; +PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV = NULL; +PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV = NULL; +PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV = NULL; +PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV = NULL; +PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV = NULL; +PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV = NULL; +PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV = NULL; + +PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV = NULL; +PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV = NULL; +PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV = NULL; +PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV = NULL; +PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV = NULL; +PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV = NULL; +PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV = NULL; +PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV = NULL; +PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV = NULL; +PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV = NULL; +PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV = NULL; +PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV = NULL; + +PFNGLDEPTHRANGEARRAYFVNVPROC __glewDepthRangeArrayfvNV = NULL; +PFNGLDEPTHRANGEINDEXEDFNVPROC __glewDepthRangeIndexedfNV = NULL; +PFNGLDISABLEINVPROC __glewDisableiNV = NULL; +PFNGLENABLEINVPROC __glewEnableiNV = NULL; +PFNGLGETFLOATI_VNVPROC __glewGetFloati_vNV = NULL; +PFNGLISENABLEDINVPROC __glewIsEnablediNV = NULL; +PFNGLSCISSORARRAYVNVPROC __glewScissorArrayvNV = NULL; +PFNGLSCISSORINDEXEDNVPROC __glewScissorIndexedNV = NULL; +PFNGLSCISSORINDEXEDVNVPROC __glewScissorIndexedvNV = NULL; +PFNGLVIEWPORTARRAYVNVPROC __glewViewportArrayvNV = NULL; +PFNGLVIEWPORTINDEXEDFNVPROC __glewViewportIndexedfNV = NULL; +PFNGLVIEWPORTINDEXEDFVNVPROC __glewViewportIndexedfvNV = NULL; + +PFNGLVIEWPORTSWIZZLENVPROC __glewViewportSwizzleNV = NULL; + +PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewFramebufferTextureMultiviewOVR = NULL; + +PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC __glewFramebufferTextureMultisampleMultiviewOVR = NULL; + +PFNGLALPHAFUNCQCOMPROC __glewAlphaFuncQCOM = NULL; + +PFNGLDISABLEDRIVERCONTROLQCOMPROC __glewDisableDriverControlQCOM = NULL; +PFNGLENABLEDRIVERCONTROLQCOMPROC __glewEnableDriverControlQCOM = NULL; +PFNGLGETDRIVERCONTROLSTRINGQCOMPROC __glewGetDriverControlStringQCOM = NULL; +PFNGLGETDRIVERCONTROLSQCOMPROC __glewGetDriverControlsQCOM = NULL; + +PFNGLEXTGETBUFFERPOINTERVQCOMPROC __glewExtGetBufferPointervQCOM = NULL; +PFNGLEXTGETBUFFERSQCOMPROC __glewExtGetBuffersQCOM = NULL; +PFNGLEXTGETFRAMEBUFFERSQCOMPROC __glewExtGetFramebuffersQCOM = NULL; +PFNGLEXTGETRENDERBUFFERSQCOMPROC __glewExtGetRenderbuffersQCOM = NULL; +PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC __glewExtGetTexLevelParameterivQCOM = NULL; +PFNGLEXTGETTEXSUBIMAGEQCOMPROC __glewExtGetTexSubImageQCOM = NULL; +PFNGLEXTGETTEXTURESQCOMPROC __glewExtGetTexturesQCOM = NULL; +PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC __glewExtTexObjectStateOverrideiQCOM = NULL; + +PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC __glewExtGetProgramBinarySourceQCOM = NULL; +PFNGLEXTGETPROGRAMSQCOMPROC __glewExtGetProgramsQCOM = NULL; +PFNGLEXTGETSHADERSQCOMPROC __glewExtGetShadersQCOM = NULL; +PFNGLEXTISPROGRAMBINARYQCOMPROC __glewExtIsProgramBinaryQCOM = NULL; + +PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC __glewFramebufferFoveationConfigQCOM = NULL; +PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC __glewFramebufferFoveationParametersQCOM = NULL; + +PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC __glewFramebufferFetchBarrierQCOM = NULL; + +PFNGLENDTILINGQCOMPROC __glewEndTilingQCOM = NULL; +PFNGLSTARTTILINGQCOMPROC __glewStartTilingQCOM = NULL; + +PFNGLALPHAFUNCXPROC __glewAlphaFuncx = NULL; +PFNGLCLEARCOLORXPROC __glewClearColorx = NULL; +PFNGLCLEARDEPTHXPROC __glewClearDepthx = NULL; +PFNGLCOLOR4XPROC __glewColor4x = NULL; +PFNGLDEPTHRANGEXPROC __glewDepthRangex = NULL; +PFNGLFOGXPROC __glewFogx = NULL; +PFNGLFOGXVPROC __glewFogxv = NULL; +PFNGLFRUSTUMFPROC __glewFrustumf = NULL; +PFNGLFRUSTUMXPROC __glewFrustumx = NULL; +PFNGLLIGHTMODELXPROC __glewLightModelx = NULL; +PFNGLLIGHTMODELXVPROC __glewLightModelxv = NULL; +PFNGLLIGHTXPROC __glewLightx = NULL; +PFNGLLIGHTXVPROC __glewLightxv = NULL; +PFNGLLINEWIDTHXPROC __glewLineWidthx = NULL; +PFNGLLOADMATRIXXPROC __glewLoadMatrixx = NULL; +PFNGLMATERIALXPROC __glewMaterialx = NULL; +PFNGLMATERIALXVPROC __glewMaterialxv = NULL; +PFNGLMULTMATRIXXPROC __glewMultMatrixx = NULL; +PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x = NULL; +PFNGLNORMAL3XPROC __glewNormal3x = NULL; +PFNGLORTHOFPROC __glewOrthof = NULL; +PFNGLORTHOXPROC __glewOrthox = NULL; +PFNGLPOINTSIZEXPROC __glewPointSizex = NULL; +PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx = NULL; +PFNGLROTATEXPROC __glewRotatex = NULL; +PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex = NULL; +PFNGLSCALEXPROC __glewScalex = NULL; +PFNGLTEXENVXPROC __glewTexEnvx = NULL; +PFNGLTEXENVXVPROC __glewTexEnvxv = NULL; +PFNGLTEXPARAMETERXPROC __glewTexParameterx = NULL; +PFNGLTRANSLATEXPROC __glewTranslatex = NULL; + +PFNGLCLIPPLANEFPROC __glewClipPlanef = NULL; +PFNGLCLIPPLANEXPROC __glewClipPlanex = NULL; +PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef = NULL; +PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex = NULL; +PFNGLGETFIXEDVPROC __glewGetFixedv = NULL; +PFNGLGETLIGHTXVPROC __glewGetLightxv = NULL; +PFNGLGETMATERIALXVPROC __glewGetMaterialxv = NULL; +PFNGLGETTEXENVXVPROC __glewGetTexEnvxv = NULL; +PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv = NULL; +PFNGLPOINTPARAMETERXPROC __glewPointParameterx = NULL; +PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv = NULL; +PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES = NULL; +PFNGLTEXPARAMETERXVPROC __glewTexParameterxv = NULL; + +PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL = NULL; + +PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL = NULL; +PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL = NULL; + +PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL = NULL; + +PFNGLGETPROCADDRESSREGALPROC __glewGetProcAddressREGAL = NULL; + +PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS = NULL; +PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS = NULL; + +PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS = NULL; +PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS = NULL; + +PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS = NULL; +PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS = NULL; + +PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC __glewInterleavedTextureCoordSetsSGIS = NULL; +PFNGLSELECTTEXTURECOORDSETSGISPROC __glewSelectTextureCoordSetSGIS = NULL; +PFNGLSELECTTEXTURESGISPROC __glewSelectTextureSGIS = NULL; +PFNGLSELECTTEXTURETRANSFORMSGISPROC __glewSelectTextureTransformSGIS = NULL; + +PFNGLMULTISAMPLESUBRECTPOSSGISPROC __glewMultisampleSubRectPosSGIS = NULL; + +PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS = NULL; +PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS = NULL; + +PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS = NULL; +PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS = NULL; + +PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS = NULL; +PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS = NULL; + +PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX = NULL; +PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX = NULL; +PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX = NULL; +PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX = NULL; +PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX = NULL; +PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX = NULL; + +PFNGLADDRESSSPACEPROC __glewAddressSpace = NULL; +PFNGLDATAPIPEPROC __glewDataPipe = NULL; + +PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX = NULL; + +PFNGLFOGLAYERSSGIXPROC __glewFogLayersSGIX = NULL; +PFNGLGETFOGLAYERSSGIXPROC __glewGetFogLayersSGIX = NULL; + +PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX = NULL; + +PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX = NULL; +PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX = NULL; +PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX = NULL; +PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX = NULL; +PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX = NULL; +PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX = NULL; +PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX = NULL; +PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX = NULL; +PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX = NULL; +PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX = NULL; +PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX = NULL; +PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX = NULL; +PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX = NULL; +PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX = NULL; +PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX = NULL; +PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX = NULL; +PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX = NULL; + +PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX = NULL; + +PFNGLIGLOOINTERFACESGIXPROC __glewIglooInterfaceSGIX = NULL; + +PFNGLALLOCMPEGPREDICTORSSGIXPROC __glewAllocMPEGPredictorsSGIX = NULL; +PFNGLDELETEMPEGPREDICTORSSGIXPROC __glewDeleteMPEGPredictorsSGIX = NULL; +PFNGLGENMPEGPREDICTORSSGIXPROC __glewGenMPEGPredictorsSGIX = NULL; +PFNGLGETMPEGPARAMETERFVSGIXPROC __glewGetMPEGParameterfvSGIX = NULL; +PFNGLGETMPEGPARAMETERIVSGIXPROC __glewGetMPEGParameterivSGIX = NULL; +PFNGLGETMPEGPREDICTORSGIXPROC __glewGetMPEGPredictorSGIX = NULL; +PFNGLGETMPEGQUANTTABLEUBVPROC __glewGetMPEGQuantTableubv = NULL; +PFNGLISMPEGPREDICTORSGIXPROC __glewIsMPEGPredictorSGIX = NULL; +PFNGLMPEGPREDICTORSGIXPROC __glewMPEGPredictorSGIX = NULL; +PFNGLMPEGQUANTTABLEUBVPROC __glewMPEGQuantTableubv = NULL; +PFNGLSWAPMPEGPREDICTORSSGIXPROC __glewSwapMPEGPredictorsSGIX = NULL; + +PFNGLGETNONLINLIGHTFVSGIXPROC __glewGetNonlinLightfvSGIX = NULL; +PFNGLGETNONLINMATERIALFVSGIXPROC __glewGetNonlinMaterialfvSGIX = NULL; +PFNGLNONLINLIGHTFVSGIXPROC __glewNonlinLightfvSGIX = NULL; +PFNGLNONLINMATERIALFVSGIXPROC __glewNonlinMaterialfvSGIX = NULL; + +PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX = NULL; + +PFNGLDEFORMSGIXPROC __glewDeformSGIX = NULL; +PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC __glewLoadIdentityDeformationMapSGIX = NULL; + +PFNGLMESHBREADTHSGIXPROC __glewMeshBreadthSGIX = NULL; +PFNGLMESHSTRIDESGIXPROC __glewMeshStrideSGIX = NULL; + +PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX = NULL; + +PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX = NULL; +PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX = NULL; +PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX = NULL; +PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX = NULL; + +PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX = NULL; + +PFNGLGETVECTOROPERATIONSGIXPROC __glewGetVectorOperationSGIX = NULL; +PFNGLVECTOROPERATIONSGIXPROC __glewVectorOperationSGIX = NULL; + +PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC __glewAreVertexArraysResidentSGIX = NULL; +PFNGLBINDVERTEXARRAYSGIXPROC __glewBindVertexArraySGIX = NULL; +PFNGLDELETEVERTEXARRAYSSGIXPROC __glewDeleteVertexArraysSGIX = NULL; +PFNGLGENVERTEXARRAYSSGIXPROC __glewGenVertexArraysSGIX = NULL; +PFNGLISVERTEXARRAYSGIXPROC __glewIsVertexArraySGIX = NULL; +PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC __glewPrioritizeVertexArraysSGIX = NULL; + +PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI = NULL; +PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI = NULL; +PFNGLCOLORTABLESGIPROC __glewColorTableSGI = NULL; +PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI = NULL; +PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI = NULL; +PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI = NULL; +PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI = NULL; + +PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC __glewGetPixelTransformParameterfvSGI = NULL; +PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC __glewGetPixelTransformParameterivSGI = NULL; +PFNGLPIXELTRANSFORMPARAMETERFSGIPROC __glewPixelTransformParameterfSGI = NULL; +PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC __glewPixelTransformParameterfvSGI = NULL; +PFNGLPIXELTRANSFORMPARAMETERISGIPROC __glewPixelTransformParameteriSGI = NULL; +PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC __glewPixelTransformParameterivSGI = NULL; +PFNGLPIXELTRANSFORMSGIPROC __glewPixelTransformSGI = NULL; + +PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX = NULL; + +PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN = NULL; +PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN = NULL; +PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN = NULL; +PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN = NULL; +PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN = NULL; +PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN = NULL; +PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN = NULL; +PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN = NULL; + +PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN = NULL; + +PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN = NULL; +PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN = NULL; +PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN = NULL; +PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN = NULL; +PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN = NULL; +PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN = NULL; +PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN = NULL; + +PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN = NULL; +PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN = NULL; +PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN = NULL; +PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN = NULL; +PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN = NULL; +PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN = NULL; +PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN = NULL; +PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN = NULL; +PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN = NULL; +PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN = NULL; +PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN = NULL; +PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN = NULL; +PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN = NULL; +PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; +PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN = NULL; +PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN = NULL; +PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN = NULL; +PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN = NULL; +PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN = NULL; +PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN = NULL; +PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN = NULL; +PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN = NULL; +PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN = NULL; +PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN = NULL; + +PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN = NULL; + +GLboolean __GLEW_VERSION_1_1 = GL_FALSE; +GLboolean __GLEW_VERSION_1_2 = GL_FALSE; +GLboolean __GLEW_VERSION_1_2_1 = GL_FALSE; +GLboolean __GLEW_VERSION_1_3 = GL_FALSE; +GLboolean __GLEW_VERSION_1_4 = GL_FALSE; +GLboolean __GLEW_VERSION_1_5 = GL_FALSE; +GLboolean __GLEW_VERSION_2_0 = GL_FALSE; +GLboolean __GLEW_VERSION_2_1 = GL_FALSE; +GLboolean __GLEW_VERSION_3_0 = GL_FALSE; +GLboolean __GLEW_VERSION_3_1 = GL_FALSE; +GLboolean __GLEW_VERSION_3_2 = GL_FALSE; +GLboolean __GLEW_VERSION_3_3 = GL_FALSE; +GLboolean __GLEW_VERSION_4_0 = GL_FALSE; +GLboolean __GLEW_VERSION_4_1 = GL_FALSE; +GLboolean __GLEW_VERSION_4_2 = GL_FALSE; +GLboolean __GLEW_VERSION_4_3 = GL_FALSE; +GLboolean __GLEW_VERSION_4_4 = GL_FALSE; +GLboolean __GLEW_VERSION_4_5 = GL_FALSE; +GLboolean __GLEW_VERSION_4_6 = GL_FALSE; +GLboolean __GLEW_3DFX_multisample = GL_FALSE; +GLboolean __GLEW_3DFX_tbuffer = GL_FALSE; +GLboolean __GLEW_3DFX_texture_compression_FXT1 = GL_FALSE; +GLboolean __GLEW_AMD_blend_minmax_factor = GL_FALSE; +GLboolean __GLEW_AMD_compressed_3DC_texture = GL_FALSE; +GLboolean __GLEW_AMD_compressed_ATC_texture = GL_FALSE; +GLboolean __GLEW_AMD_conservative_depth = GL_FALSE; +GLboolean __GLEW_AMD_debug_output = GL_FALSE; +GLboolean __GLEW_AMD_depth_clamp_separate = GL_FALSE; +GLboolean __GLEW_AMD_draw_buffers_blend = GL_FALSE; +GLboolean __GLEW_AMD_framebuffer_sample_positions = GL_FALSE; +GLboolean __GLEW_AMD_gcn_shader = GL_FALSE; +GLboolean __GLEW_AMD_gpu_shader_half_float = GL_FALSE; +GLboolean __GLEW_AMD_gpu_shader_int16 = GL_FALSE; +GLboolean __GLEW_AMD_gpu_shader_int64 = GL_FALSE; +GLboolean __GLEW_AMD_interleaved_elements = GL_FALSE; +GLboolean __GLEW_AMD_multi_draw_indirect = GL_FALSE; +GLboolean __GLEW_AMD_name_gen_delete = GL_FALSE; +GLboolean __GLEW_AMD_occlusion_query_event = GL_FALSE; +GLboolean __GLEW_AMD_performance_monitor = GL_FALSE; +GLboolean __GLEW_AMD_pinned_memory = GL_FALSE; +GLboolean __GLEW_AMD_program_binary_Z400 = GL_FALSE; +GLboolean __GLEW_AMD_query_buffer_object = GL_FALSE; +GLboolean __GLEW_AMD_sample_positions = GL_FALSE; +GLboolean __GLEW_AMD_seamless_cubemap_per_texture = GL_FALSE; +GLboolean __GLEW_AMD_shader_atomic_counter_ops = GL_FALSE; +GLboolean __GLEW_AMD_shader_ballot = GL_FALSE; +GLboolean __GLEW_AMD_shader_explicit_vertex_parameter = GL_FALSE; +GLboolean __GLEW_AMD_shader_stencil_export = GL_FALSE; +GLboolean __GLEW_AMD_shader_stencil_value_export = GL_FALSE; +GLboolean __GLEW_AMD_shader_trinary_minmax = GL_FALSE; +GLboolean __GLEW_AMD_sparse_texture = GL_FALSE; +GLboolean __GLEW_AMD_stencil_operation_extended = GL_FALSE; +GLboolean __GLEW_AMD_texture_gather_bias_lod = GL_FALSE; +GLboolean __GLEW_AMD_texture_texture4 = GL_FALSE; +GLboolean __GLEW_AMD_transform_feedback3_lines_triangles = GL_FALSE; +GLboolean __GLEW_AMD_transform_feedback4 = GL_FALSE; +GLboolean __GLEW_AMD_vertex_shader_layer = GL_FALSE; +GLboolean __GLEW_AMD_vertex_shader_tessellator = GL_FALSE; +GLboolean __GLEW_AMD_vertex_shader_viewport_index = GL_FALSE; +GLboolean __GLEW_ANDROID_extension_pack_es31a = GL_FALSE; +GLboolean __GLEW_ANGLE_depth_texture = GL_FALSE; +GLboolean __GLEW_ANGLE_framebuffer_blit = GL_FALSE; +GLboolean __GLEW_ANGLE_framebuffer_multisample = GL_FALSE; +GLboolean __GLEW_ANGLE_instanced_arrays = GL_FALSE; +GLboolean __GLEW_ANGLE_pack_reverse_row_order = GL_FALSE; +GLboolean __GLEW_ANGLE_program_binary = GL_FALSE; +GLboolean __GLEW_ANGLE_texture_compression_dxt1 = GL_FALSE; +GLboolean __GLEW_ANGLE_texture_compression_dxt3 = GL_FALSE; +GLboolean __GLEW_ANGLE_texture_compression_dxt5 = GL_FALSE; +GLboolean __GLEW_ANGLE_texture_usage = GL_FALSE; +GLboolean __GLEW_ANGLE_timer_query = GL_FALSE; +GLboolean __GLEW_ANGLE_translated_shader_source = GL_FALSE; +GLboolean __GLEW_APPLE_aux_depth_stencil = GL_FALSE; +GLboolean __GLEW_APPLE_client_storage = GL_FALSE; +GLboolean __GLEW_APPLE_clip_distance = GL_FALSE; +GLboolean __GLEW_APPLE_color_buffer_packed_float = GL_FALSE; +GLboolean __GLEW_APPLE_copy_texture_levels = GL_FALSE; +GLboolean __GLEW_APPLE_element_array = GL_FALSE; +GLboolean __GLEW_APPLE_fence = GL_FALSE; +GLboolean __GLEW_APPLE_float_pixels = GL_FALSE; +GLboolean __GLEW_APPLE_flush_buffer_range = GL_FALSE; +GLboolean __GLEW_APPLE_framebuffer_multisample = GL_FALSE; +GLboolean __GLEW_APPLE_object_purgeable = GL_FALSE; +GLboolean __GLEW_APPLE_pixel_buffer = GL_FALSE; +GLboolean __GLEW_APPLE_rgb_422 = GL_FALSE; +GLboolean __GLEW_APPLE_row_bytes = GL_FALSE; +GLboolean __GLEW_APPLE_specular_vector = GL_FALSE; +GLboolean __GLEW_APPLE_sync = GL_FALSE; +GLboolean __GLEW_APPLE_texture_2D_limited_npot = GL_FALSE; +GLboolean __GLEW_APPLE_texture_format_BGRA8888 = GL_FALSE; +GLboolean __GLEW_APPLE_texture_max_level = GL_FALSE; +GLboolean __GLEW_APPLE_texture_packed_float = GL_FALSE; +GLboolean __GLEW_APPLE_texture_range = GL_FALSE; +GLboolean __GLEW_APPLE_transform_hint = GL_FALSE; +GLboolean __GLEW_APPLE_vertex_array_object = GL_FALSE; +GLboolean __GLEW_APPLE_vertex_array_range = GL_FALSE; +GLboolean __GLEW_APPLE_vertex_program_evaluators = GL_FALSE; +GLboolean __GLEW_APPLE_ycbcr_422 = GL_FALSE; +GLboolean __GLEW_ARB_ES2_compatibility = GL_FALSE; +GLboolean __GLEW_ARB_ES3_1_compatibility = GL_FALSE; +GLboolean __GLEW_ARB_ES3_2_compatibility = GL_FALSE; +GLboolean __GLEW_ARB_ES3_compatibility = GL_FALSE; +GLboolean __GLEW_ARB_arrays_of_arrays = GL_FALSE; +GLboolean __GLEW_ARB_base_instance = GL_FALSE; +GLboolean __GLEW_ARB_bindless_texture = GL_FALSE; +GLboolean __GLEW_ARB_blend_func_extended = GL_FALSE; +GLboolean __GLEW_ARB_buffer_storage = GL_FALSE; +GLboolean __GLEW_ARB_cl_event = GL_FALSE; +GLboolean __GLEW_ARB_clear_buffer_object = GL_FALSE; +GLboolean __GLEW_ARB_clear_texture = GL_FALSE; +GLboolean __GLEW_ARB_clip_control = GL_FALSE; +GLboolean __GLEW_ARB_color_buffer_float = GL_FALSE; +GLboolean __GLEW_ARB_compatibility = GL_FALSE; +GLboolean __GLEW_ARB_compressed_texture_pixel_storage = GL_FALSE; +GLboolean __GLEW_ARB_compute_shader = GL_FALSE; +GLboolean __GLEW_ARB_compute_variable_group_size = GL_FALSE; +GLboolean __GLEW_ARB_conditional_render_inverted = GL_FALSE; +GLboolean __GLEW_ARB_conservative_depth = GL_FALSE; +GLboolean __GLEW_ARB_copy_buffer = GL_FALSE; +GLboolean __GLEW_ARB_copy_image = GL_FALSE; +GLboolean __GLEW_ARB_cull_distance = GL_FALSE; +GLboolean __GLEW_ARB_debug_output = GL_FALSE; +GLboolean __GLEW_ARB_depth_buffer_float = GL_FALSE; +GLboolean __GLEW_ARB_depth_clamp = GL_FALSE; +GLboolean __GLEW_ARB_depth_texture = GL_FALSE; +GLboolean __GLEW_ARB_derivative_control = GL_FALSE; +GLboolean __GLEW_ARB_direct_state_access = GL_FALSE; +GLboolean __GLEW_ARB_draw_buffers = GL_FALSE; +GLboolean __GLEW_ARB_draw_buffers_blend = GL_FALSE; +GLboolean __GLEW_ARB_draw_elements_base_vertex = GL_FALSE; +GLboolean __GLEW_ARB_draw_indirect = GL_FALSE; +GLboolean __GLEW_ARB_draw_instanced = GL_FALSE; +GLboolean __GLEW_ARB_enhanced_layouts = GL_FALSE; +GLboolean __GLEW_ARB_explicit_attrib_location = GL_FALSE; +GLboolean __GLEW_ARB_explicit_uniform_location = GL_FALSE; +GLboolean __GLEW_ARB_fragment_coord_conventions = GL_FALSE; +GLboolean __GLEW_ARB_fragment_layer_viewport = GL_FALSE; +GLboolean __GLEW_ARB_fragment_program = GL_FALSE; +GLboolean __GLEW_ARB_fragment_program_shadow = GL_FALSE; +GLboolean __GLEW_ARB_fragment_shader = GL_FALSE; +GLboolean __GLEW_ARB_fragment_shader_interlock = GL_FALSE; +GLboolean __GLEW_ARB_framebuffer_no_attachments = GL_FALSE; +GLboolean __GLEW_ARB_framebuffer_object = GL_FALSE; +GLboolean __GLEW_ARB_framebuffer_sRGB = GL_FALSE; +GLboolean __GLEW_ARB_geometry_shader4 = GL_FALSE; +GLboolean __GLEW_ARB_get_program_binary = GL_FALSE; +GLboolean __GLEW_ARB_get_texture_sub_image = GL_FALSE; +GLboolean __GLEW_ARB_gl_spirv = GL_FALSE; +GLboolean __GLEW_ARB_gpu_shader5 = GL_FALSE; +GLboolean __GLEW_ARB_gpu_shader_fp64 = GL_FALSE; +GLboolean __GLEW_ARB_gpu_shader_int64 = GL_FALSE; +GLboolean __GLEW_ARB_half_float_pixel = GL_FALSE; +GLboolean __GLEW_ARB_half_float_vertex = GL_FALSE; +GLboolean __GLEW_ARB_imaging = GL_FALSE; +GLboolean __GLEW_ARB_indirect_parameters = GL_FALSE; +GLboolean __GLEW_ARB_instanced_arrays = GL_FALSE; +GLboolean __GLEW_ARB_internalformat_query = GL_FALSE; +GLboolean __GLEW_ARB_internalformat_query2 = GL_FALSE; +GLboolean __GLEW_ARB_invalidate_subdata = GL_FALSE; +GLboolean __GLEW_ARB_map_buffer_alignment = GL_FALSE; +GLboolean __GLEW_ARB_map_buffer_range = GL_FALSE; +GLboolean __GLEW_ARB_matrix_palette = GL_FALSE; +GLboolean __GLEW_ARB_multi_bind = GL_FALSE; +GLboolean __GLEW_ARB_multi_draw_indirect = GL_FALSE; +GLboolean __GLEW_ARB_multisample = GL_FALSE; +GLboolean __GLEW_ARB_multitexture = GL_FALSE; +GLboolean __GLEW_ARB_occlusion_query = GL_FALSE; +GLboolean __GLEW_ARB_occlusion_query2 = GL_FALSE; +GLboolean __GLEW_ARB_parallel_shader_compile = GL_FALSE; +GLboolean __GLEW_ARB_pipeline_statistics_query = GL_FALSE; +GLboolean __GLEW_ARB_pixel_buffer_object = GL_FALSE; +GLboolean __GLEW_ARB_point_parameters = GL_FALSE; +GLboolean __GLEW_ARB_point_sprite = GL_FALSE; +GLboolean __GLEW_ARB_polygon_offset_clamp = GL_FALSE; +GLboolean __GLEW_ARB_post_depth_coverage = GL_FALSE; +GLboolean __GLEW_ARB_program_interface_query = GL_FALSE; +GLboolean __GLEW_ARB_provoking_vertex = GL_FALSE; +GLboolean __GLEW_ARB_query_buffer_object = GL_FALSE; +GLboolean __GLEW_ARB_robust_buffer_access_behavior = GL_FALSE; +GLboolean __GLEW_ARB_robustness = GL_FALSE; +GLboolean __GLEW_ARB_robustness_application_isolation = GL_FALSE; +GLboolean __GLEW_ARB_robustness_share_group_isolation = GL_FALSE; +GLboolean __GLEW_ARB_sample_locations = GL_FALSE; +GLboolean __GLEW_ARB_sample_shading = GL_FALSE; +GLboolean __GLEW_ARB_sampler_objects = GL_FALSE; +GLboolean __GLEW_ARB_seamless_cube_map = GL_FALSE; +GLboolean __GLEW_ARB_seamless_cubemap_per_texture = GL_FALSE; +GLboolean __GLEW_ARB_separate_shader_objects = GL_FALSE; +GLboolean __GLEW_ARB_shader_atomic_counter_ops = GL_FALSE; +GLboolean __GLEW_ARB_shader_atomic_counters = GL_FALSE; +GLboolean __GLEW_ARB_shader_ballot = GL_FALSE; +GLboolean __GLEW_ARB_shader_bit_encoding = GL_FALSE; +GLboolean __GLEW_ARB_shader_clock = GL_FALSE; +GLboolean __GLEW_ARB_shader_draw_parameters = GL_FALSE; +GLboolean __GLEW_ARB_shader_group_vote = GL_FALSE; +GLboolean __GLEW_ARB_shader_image_load_store = GL_FALSE; +GLboolean __GLEW_ARB_shader_image_size = GL_FALSE; +GLboolean __GLEW_ARB_shader_objects = GL_FALSE; +GLboolean __GLEW_ARB_shader_precision = GL_FALSE; +GLboolean __GLEW_ARB_shader_stencil_export = GL_FALSE; +GLboolean __GLEW_ARB_shader_storage_buffer_object = GL_FALSE; +GLboolean __GLEW_ARB_shader_subroutine = GL_FALSE; +GLboolean __GLEW_ARB_shader_texture_image_samples = GL_FALSE; +GLboolean __GLEW_ARB_shader_texture_lod = GL_FALSE; +GLboolean __GLEW_ARB_shader_viewport_layer_array = GL_FALSE; +GLboolean __GLEW_ARB_shading_language_100 = GL_FALSE; +GLboolean __GLEW_ARB_shading_language_420pack = GL_FALSE; +GLboolean __GLEW_ARB_shading_language_include = GL_FALSE; +GLboolean __GLEW_ARB_shading_language_packing = GL_FALSE; +GLboolean __GLEW_ARB_shadow = GL_FALSE; +GLboolean __GLEW_ARB_shadow_ambient = GL_FALSE; +GLboolean __GLEW_ARB_sparse_buffer = GL_FALSE; +GLboolean __GLEW_ARB_sparse_texture = GL_FALSE; +GLboolean __GLEW_ARB_sparse_texture2 = GL_FALSE; +GLboolean __GLEW_ARB_sparse_texture_clamp = GL_FALSE; +GLboolean __GLEW_ARB_spirv_extensions = GL_FALSE; +GLboolean __GLEW_ARB_stencil_texturing = GL_FALSE; +GLboolean __GLEW_ARB_sync = GL_FALSE; +GLboolean __GLEW_ARB_tessellation_shader = GL_FALSE; +GLboolean __GLEW_ARB_texture_barrier = GL_FALSE; +GLboolean __GLEW_ARB_texture_border_clamp = GL_FALSE; +GLboolean __GLEW_ARB_texture_buffer_object = GL_FALSE; +GLboolean __GLEW_ARB_texture_buffer_object_rgb32 = GL_FALSE; +GLboolean __GLEW_ARB_texture_buffer_range = GL_FALSE; +GLboolean __GLEW_ARB_texture_compression = GL_FALSE; +GLboolean __GLEW_ARB_texture_compression_bptc = GL_FALSE; +GLboolean __GLEW_ARB_texture_compression_rgtc = GL_FALSE; +GLboolean __GLEW_ARB_texture_cube_map = GL_FALSE; +GLboolean __GLEW_ARB_texture_cube_map_array = GL_FALSE; +GLboolean __GLEW_ARB_texture_env_add = GL_FALSE; +GLboolean __GLEW_ARB_texture_env_combine = GL_FALSE; +GLboolean __GLEW_ARB_texture_env_crossbar = GL_FALSE; +GLboolean __GLEW_ARB_texture_env_dot3 = GL_FALSE; +GLboolean __GLEW_ARB_texture_filter_anisotropic = GL_FALSE; +GLboolean __GLEW_ARB_texture_filter_minmax = GL_FALSE; +GLboolean __GLEW_ARB_texture_float = GL_FALSE; +GLboolean __GLEW_ARB_texture_gather = GL_FALSE; +GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge = GL_FALSE; +GLboolean __GLEW_ARB_texture_mirrored_repeat = GL_FALSE; +GLboolean __GLEW_ARB_texture_multisample = GL_FALSE; +GLboolean __GLEW_ARB_texture_non_power_of_two = GL_FALSE; +GLboolean __GLEW_ARB_texture_query_levels = GL_FALSE; +GLboolean __GLEW_ARB_texture_query_lod = GL_FALSE; +GLboolean __GLEW_ARB_texture_rectangle = GL_FALSE; +GLboolean __GLEW_ARB_texture_rg = GL_FALSE; +GLboolean __GLEW_ARB_texture_rgb10_a2ui = GL_FALSE; +GLboolean __GLEW_ARB_texture_stencil8 = GL_FALSE; +GLboolean __GLEW_ARB_texture_storage = GL_FALSE; +GLboolean __GLEW_ARB_texture_storage_multisample = GL_FALSE; +GLboolean __GLEW_ARB_texture_swizzle = GL_FALSE; +GLboolean __GLEW_ARB_texture_view = GL_FALSE; +GLboolean __GLEW_ARB_timer_query = GL_FALSE; +GLboolean __GLEW_ARB_transform_feedback2 = GL_FALSE; +GLboolean __GLEW_ARB_transform_feedback3 = GL_FALSE; +GLboolean __GLEW_ARB_transform_feedback_instanced = GL_FALSE; +GLboolean __GLEW_ARB_transform_feedback_overflow_query = GL_FALSE; +GLboolean __GLEW_ARB_transpose_matrix = GL_FALSE; +GLboolean __GLEW_ARB_uniform_buffer_object = GL_FALSE; +GLboolean __GLEW_ARB_vertex_array_bgra = GL_FALSE; +GLboolean __GLEW_ARB_vertex_array_object = GL_FALSE; +GLboolean __GLEW_ARB_vertex_attrib_64bit = GL_FALSE; +GLboolean __GLEW_ARB_vertex_attrib_binding = GL_FALSE; +GLboolean __GLEW_ARB_vertex_blend = GL_FALSE; +GLboolean __GLEW_ARB_vertex_buffer_object = GL_FALSE; +GLboolean __GLEW_ARB_vertex_program = GL_FALSE; +GLboolean __GLEW_ARB_vertex_shader = GL_FALSE; +GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev = GL_FALSE; +GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev = GL_FALSE; +GLboolean __GLEW_ARB_viewport_array = GL_FALSE; +GLboolean __GLEW_ARB_window_pos = GL_FALSE; +GLboolean __GLEW_ARM_mali_program_binary = GL_FALSE; +GLboolean __GLEW_ARM_mali_shader_binary = GL_FALSE; +GLboolean __GLEW_ARM_rgba8 = GL_FALSE; +GLboolean __GLEW_ARM_shader_framebuffer_fetch = GL_FALSE; +GLboolean __GLEW_ARM_shader_framebuffer_fetch_depth_stencil = GL_FALSE; +GLboolean __GLEW_ATIX_point_sprites = GL_FALSE; +GLboolean __GLEW_ATIX_texture_env_combine3 = GL_FALSE; +GLboolean __GLEW_ATIX_texture_env_route = GL_FALSE; +GLboolean __GLEW_ATIX_vertex_shader_output_point_size = GL_FALSE; +GLboolean __GLEW_ATI_draw_buffers = GL_FALSE; +GLboolean __GLEW_ATI_element_array = GL_FALSE; +GLboolean __GLEW_ATI_envmap_bumpmap = GL_FALSE; +GLboolean __GLEW_ATI_fragment_shader = GL_FALSE; +GLboolean __GLEW_ATI_map_object_buffer = GL_FALSE; +GLboolean __GLEW_ATI_meminfo = GL_FALSE; +GLboolean __GLEW_ATI_pn_triangles = GL_FALSE; +GLboolean __GLEW_ATI_separate_stencil = GL_FALSE; +GLboolean __GLEW_ATI_shader_texture_lod = GL_FALSE; +GLboolean __GLEW_ATI_text_fragment_shader = GL_FALSE; +GLboolean __GLEW_ATI_texture_compression_3dc = GL_FALSE; +GLboolean __GLEW_ATI_texture_env_combine3 = GL_FALSE; +GLboolean __GLEW_ATI_texture_float = GL_FALSE; +GLboolean __GLEW_ATI_texture_mirror_once = GL_FALSE; +GLboolean __GLEW_ATI_vertex_array_object = GL_FALSE; +GLboolean __GLEW_ATI_vertex_attrib_array_object = GL_FALSE; +GLboolean __GLEW_ATI_vertex_streams = GL_FALSE; +GLboolean __GLEW_EGL_KHR_context_flush_control = GL_FALSE; +GLboolean __GLEW_EGL_NV_robustness_video_memory_purge = GL_FALSE; +GLboolean __GLEW_EXT_422_pixels = GL_FALSE; +GLboolean __GLEW_EXT_Cg_shader = GL_FALSE; +GLboolean __GLEW_EXT_EGL_image_array = GL_FALSE; +GLboolean __GLEW_EXT_YUV_target = GL_FALSE; +GLboolean __GLEW_EXT_abgr = GL_FALSE; +GLboolean __GLEW_EXT_base_instance = GL_FALSE; +GLboolean __GLEW_EXT_bgra = GL_FALSE; +GLboolean __GLEW_EXT_bindable_uniform = GL_FALSE; +GLboolean __GLEW_EXT_blend_color = GL_FALSE; +GLboolean __GLEW_EXT_blend_equation_separate = GL_FALSE; +GLboolean __GLEW_EXT_blend_func_extended = GL_FALSE; +GLboolean __GLEW_EXT_blend_func_separate = GL_FALSE; +GLboolean __GLEW_EXT_blend_logic_op = GL_FALSE; +GLboolean __GLEW_EXT_blend_minmax = GL_FALSE; +GLboolean __GLEW_EXT_blend_subtract = GL_FALSE; +GLboolean __GLEW_EXT_buffer_storage = GL_FALSE; +GLboolean __GLEW_EXT_clear_texture = GL_FALSE; +GLboolean __GLEW_EXT_clip_cull_distance = GL_FALSE; +GLboolean __GLEW_EXT_clip_volume_hint = GL_FALSE; +GLboolean __GLEW_EXT_cmyka = GL_FALSE; +GLboolean __GLEW_EXT_color_buffer_float = GL_FALSE; +GLboolean __GLEW_EXT_color_buffer_half_float = GL_FALSE; +GLboolean __GLEW_EXT_color_subtable = GL_FALSE; +GLboolean __GLEW_EXT_compiled_vertex_array = GL_FALSE; +GLboolean __GLEW_EXT_compressed_ETC1_RGB8_sub_texture = GL_FALSE; +GLboolean __GLEW_EXT_conservative_depth = GL_FALSE; +GLboolean __GLEW_EXT_convolution = GL_FALSE; +GLboolean __GLEW_EXT_coordinate_frame = GL_FALSE; +GLboolean __GLEW_EXT_copy_image = GL_FALSE; +GLboolean __GLEW_EXT_copy_texture = GL_FALSE; +GLboolean __GLEW_EXT_cull_vertex = GL_FALSE; +GLboolean __GLEW_EXT_debug_label = GL_FALSE; +GLboolean __GLEW_EXT_debug_marker = GL_FALSE; +GLboolean __GLEW_EXT_depth_bounds_test = GL_FALSE; +GLboolean __GLEW_EXT_direct_state_access = GL_FALSE; +GLboolean __GLEW_EXT_discard_framebuffer = GL_FALSE; +GLboolean __GLEW_EXT_draw_buffers = GL_FALSE; +GLboolean __GLEW_EXT_draw_buffers2 = GL_FALSE; +GLboolean __GLEW_EXT_draw_buffers_indexed = GL_FALSE; +GLboolean __GLEW_EXT_draw_elements_base_vertex = GL_FALSE; +GLboolean __GLEW_EXT_draw_instanced = GL_FALSE; +GLboolean __GLEW_EXT_draw_range_elements = GL_FALSE; +GLboolean __GLEW_EXT_external_buffer = GL_FALSE; +GLboolean __GLEW_EXT_float_blend = GL_FALSE; +GLboolean __GLEW_EXT_fog_coord = GL_FALSE; +GLboolean __GLEW_EXT_frag_depth = GL_FALSE; +GLboolean __GLEW_EXT_fragment_lighting = GL_FALSE; +GLboolean __GLEW_EXT_framebuffer_blit = GL_FALSE; +GLboolean __GLEW_EXT_framebuffer_multisample = GL_FALSE; +GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled = GL_FALSE; +GLboolean __GLEW_EXT_framebuffer_object = GL_FALSE; +GLboolean __GLEW_EXT_framebuffer_sRGB = GL_FALSE; +GLboolean __GLEW_EXT_geometry_point_size = GL_FALSE; +GLboolean __GLEW_EXT_geometry_shader = GL_FALSE; +GLboolean __GLEW_EXT_geometry_shader4 = GL_FALSE; +GLboolean __GLEW_EXT_gpu_program_parameters = GL_FALSE; +GLboolean __GLEW_EXT_gpu_shader4 = GL_FALSE; +GLboolean __GLEW_EXT_gpu_shader5 = GL_FALSE; +GLboolean __GLEW_EXT_histogram = GL_FALSE; +GLboolean __GLEW_EXT_index_array_formats = GL_FALSE; +GLboolean __GLEW_EXT_index_func = GL_FALSE; +GLboolean __GLEW_EXT_index_material = GL_FALSE; +GLboolean __GLEW_EXT_index_texture = GL_FALSE; +GLboolean __GLEW_EXT_instanced_arrays = GL_FALSE; +GLboolean __GLEW_EXT_light_texture = GL_FALSE; +GLboolean __GLEW_EXT_map_buffer_range = GL_FALSE; +GLboolean __GLEW_EXT_memory_object = GL_FALSE; +GLboolean __GLEW_EXT_memory_object_fd = GL_FALSE; +GLboolean __GLEW_EXT_memory_object_win32 = GL_FALSE; +GLboolean __GLEW_EXT_misc_attribute = GL_FALSE; +GLboolean __GLEW_EXT_multi_draw_arrays = GL_FALSE; +GLboolean __GLEW_EXT_multi_draw_indirect = GL_FALSE; +GLboolean __GLEW_EXT_multiple_textures = GL_FALSE; +GLboolean __GLEW_EXT_multisample = GL_FALSE; +GLboolean __GLEW_EXT_multisample_compatibility = GL_FALSE; +GLboolean __GLEW_EXT_multisampled_render_to_texture = GL_FALSE; +GLboolean __GLEW_EXT_multisampled_render_to_texture2 = GL_FALSE; +GLboolean __GLEW_EXT_multiview_draw_buffers = GL_FALSE; +GLboolean __GLEW_EXT_packed_depth_stencil = GL_FALSE; +GLboolean __GLEW_EXT_packed_float = GL_FALSE; +GLboolean __GLEW_EXT_packed_pixels = GL_FALSE; +GLboolean __GLEW_EXT_paletted_texture = GL_FALSE; +GLboolean __GLEW_EXT_pixel_buffer_object = GL_FALSE; +GLboolean __GLEW_EXT_pixel_transform = GL_FALSE; +GLboolean __GLEW_EXT_pixel_transform_color_table = GL_FALSE; +GLboolean __GLEW_EXT_point_parameters = GL_FALSE; +GLboolean __GLEW_EXT_polygon_offset = GL_FALSE; +GLboolean __GLEW_EXT_polygon_offset_clamp = GL_FALSE; +GLboolean __GLEW_EXT_post_depth_coverage = GL_FALSE; +GLboolean __GLEW_EXT_provoking_vertex = GL_FALSE; +GLboolean __GLEW_EXT_pvrtc_sRGB = GL_FALSE; +GLboolean __GLEW_EXT_raster_multisample = GL_FALSE; +GLboolean __GLEW_EXT_read_format_bgra = GL_FALSE; +GLboolean __GLEW_EXT_render_snorm = GL_FALSE; +GLboolean __GLEW_EXT_rescale_normal = GL_FALSE; +GLboolean __GLEW_EXT_sRGB = GL_FALSE; +GLboolean __GLEW_EXT_sRGB_write_control = GL_FALSE; +GLboolean __GLEW_EXT_scene_marker = GL_FALSE; +GLboolean __GLEW_EXT_secondary_color = GL_FALSE; +GLboolean __GLEW_EXT_semaphore = GL_FALSE; +GLboolean __GLEW_EXT_semaphore_fd = GL_FALSE; +GLboolean __GLEW_EXT_semaphore_win32 = GL_FALSE; +GLboolean __GLEW_EXT_separate_shader_objects = GL_FALSE; +GLboolean __GLEW_EXT_separate_specular_color = GL_FALSE; +GLboolean __GLEW_EXT_shader_framebuffer_fetch = GL_FALSE; +GLboolean __GLEW_EXT_shader_group_vote = GL_FALSE; +GLboolean __GLEW_EXT_shader_image_load_formatted = GL_FALSE; +GLboolean __GLEW_EXT_shader_image_load_store = GL_FALSE; +GLboolean __GLEW_EXT_shader_implicit_conversions = GL_FALSE; +GLboolean __GLEW_EXT_shader_integer_mix = GL_FALSE; +GLboolean __GLEW_EXT_shader_io_blocks = GL_FALSE; +GLboolean __GLEW_EXT_shader_non_constant_global_initializers = GL_FALSE; +GLboolean __GLEW_EXT_shader_pixel_local_storage = GL_FALSE; +GLboolean __GLEW_EXT_shader_pixel_local_storage2 = GL_FALSE; +GLboolean __GLEW_EXT_shader_texture_lod = GL_FALSE; +GLboolean __GLEW_EXT_shadow_funcs = GL_FALSE; +GLboolean __GLEW_EXT_shadow_samplers = GL_FALSE; +GLboolean __GLEW_EXT_shared_texture_palette = GL_FALSE; +GLboolean __GLEW_EXT_sparse_texture = GL_FALSE; +GLboolean __GLEW_EXT_sparse_texture2 = GL_FALSE; +GLboolean __GLEW_EXT_stencil_clear_tag = GL_FALSE; +GLboolean __GLEW_EXT_stencil_two_side = GL_FALSE; +GLboolean __GLEW_EXT_stencil_wrap = GL_FALSE; +GLboolean __GLEW_EXT_subtexture = GL_FALSE; +GLboolean __GLEW_EXT_texture = GL_FALSE; +GLboolean __GLEW_EXT_texture3D = GL_FALSE; +GLboolean __GLEW_EXT_texture_array = GL_FALSE; +GLboolean __GLEW_EXT_texture_buffer_object = GL_FALSE; +GLboolean __GLEW_EXT_texture_compression_astc_decode_mode = GL_FALSE; +GLboolean __GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5 = GL_FALSE; +GLboolean __GLEW_EXT_texture_compression_bptc = GL_FALSE; +GLboolean __GLEW_EXT_texture_compression_dxt1 = GL_FALSE; +GLboolean __GLEW_EXT_texture_compression_latc = GL_FALSE; +GLboolean __GLEW_EXT_texture_compression_rgtc = GL_FALSE; +GLboolean __GLEW_EXT_texture_compression_s3tc = GL_FALSE; +GLboolean __GLEW_EXT_texture_cube_map = GL_FALSE; +GLboolean __GLEW_EXT_texture_cube_map_array = GL_FALSE; +GLboolean __GLEW_EXT_texture_edge_clamp = GL_FALSE; +GLboolean __GLEW_EXT_texture_env = GL_FALSE; +GLboolean __GLEW_EXT_texture_env_add = GL_FALSE; +GLboolean __GLEW_EXT_texture_env_combine = GL_FALSE; +GLboolean __GLEW_EXT_texture_env_dot3 = GL_FALSE; +GLboolean __GLEW_EXT_texture_filter_anisotropic = GL_FALSE; +GLboolean __GLEW_EXT_texture_filter_minmax = GL_FALSE; +GLboolean __GLEW_EXT_texture_format_BGRA8888 = GL_FALSE; +GLboolean __GLEW_EXT_texture_integer = GL_FALSE; +GLboolean __GLEW_EXT_texture_lod_bias = GL_FALSE; +GLboolean __GLEW_EXT_texture_mirror_clamp = GL_FALSE; +GLboolean __GLEW_EXT_texture_norm16 = GL_FALSE; +GLboolean __GLEW_EXT_texture_object = GL_FALSE; +GLboolean __GLEW_EXT_texture_perturb_normal = GL_FALSE; +GLboolean __GLEW_EXT_texture_rectangle = GL_FALSE; +GLboolean __GLEW_EXT_texture_rg = GL_FALSE; +GLboolean __GLEW_EXT_texture_sRGB = GL_FALSE; +GLboolean __GLEW_EXT_texture_sRGB_R8 = GL_FALSE; +GLboolean __GLEW_EXT_texture_sRGB_RG8 = GL_FALSE; +GLboolean __GLEW_EXT_texture_sRGB_decode = GL_FALSE; +GLboolean __GLEW_EXT_texture_shared_exponent = GL_FALSE; +GLboolean __GLEW_EXT_texture_snorm = GL_FALSE; +GLboolean __GLEW_EXT_texture_storage = GL_FALSE; +GLboolean __GLEW_EXT_texture_swizzle = GL_FALSE; +GLboolean __GLEW_EXT_texture_type_2_10_10_10_REV = GL_FALSE; +GLboolean __GLEW_EXT_texture_view = GL_FALSE; +GLboolean __GLEW_EXT_timer_query = GL_FALSE; +GLboolean __GLEW_EXT_transform_feedback = GL_FALSE; +GLboolean __GLEW_EXT_unpack_subimage = GL_FALSE; +GLboolean __GLEW_EXT_vertex_array = GL_FALSE; +GLboolean __GLEW_EXT_vertex_array_bgra = GL_FALSE; +GLboolean __GLEW_EXT_vertex_array_setXXX = GL_FALSE; +GLboolean __GLEW_EXT_vertex_attrib_64bit = GL_FALSE; +GLboolean __GLEW_EXT_vertex_shader = GL_FALSE; +GLboolean __GLEW_EXT_vertex_weighting = GL_FALSE; +GLboolean __GLEW_EXT_win32_keyed_mutex = GL_FALSE; +GLboolean __GLEW_EXT_window_rectangles = GL_FALSE; +GLboolean __GLEW_EXT_x11_sync_object = GL_FALSE; +GLboolean __GLEW_GREMEDY_frame_terminator = GL_FALSE; +GLboolean __GLEW_GREMEDY_string_marker = GL_FALSE; +GLboolean __GLEW_HP_convolution_border_modes = GL_FALSE; +GLboolean __GLEW_HP_image_transform = GL_FALSE; +GLboolean __GLEW_HP_occlusion_test = GL_FALSE; +GLboolean __GLEW_HP_texture_lighting = GL_FALSE; +GLboolean __GLEW_IBM_cull_vertex = GL_FALSE; +GLboolean __GLEW_IBM_multimode_draw_arrays = GL_FALSE; +GLboolean __GLEW_IBM_rasterpos_clip = GL_FALSE; +GLboolean __GLEW_IBM_static_data = GL_FALSE; +GLboolean __GLEW_IBM_texture_mirrored_repeat = GL_FALSE; +GLboolean __GLEW_IBM_vertex_array_lists = GL_FALSE; +GLboolean __GLEW_INGR_color_clamp = GL_FALSE; +GLboolean __GLEW_INGR_interlace_read = GL_FALSE; +GLboolean __GLEW_INTEL_conservative_rasterization = GL_FALSE; +GLboolean __GLEW_INTEL_fragment_shader_ordering = GL_FALSE; +GLboolean __GLEW_INTEL_framebuffer_CMAA = GL_FALSE; +GLboolean __GLEW_INTEL_map_texture = GL_FALSE; +GLboolean __GLEW_INTEL_parallel_arrays = GL_FALSE; +GLboolean __GLEW_INTEL_performance_query = GL_FALSE; +GLboolean __GLEW_INTEL_texture_scissor = GL_FALSE; +GLboolean __GLEW_KHR_blend_equation_advanced = GL_FALSE; +GLboolean __GLEW_KHR_blend_equation_advanced_coherent = GL_FALSE; +GLboolean __GLEW_KHR_context_flush_control = GL_FALSE; +GLboolean __GLEW_KHR_debug = GL_FALSE; +GLboolean __GLEW_KHR_no_error = GL_FALSE; +GLboolean __GLEW_KHR_parallel_shader_compile = GL_FALSE; +GLboolean __GLEW_KHR_robust_buffer_access_behavior = GL_FALSE; +GLboolean __GLEW_KHR_robustness = GL_FALSE; +GLboolean __GLEW_KHR_texture_compression_astc_hdr = GL_FALSE; +GLboolean __GLEW_KHR_texture_compression_astc_ldr = GL_FALSE; +GLboolean __GLEW_KHR_texture_compression_astc_sliced_3d = GL_FALSE; +GLboolean __GLEW_KTX_buffer_region = GL_FALSE; +GLboolean __GLEW_MESAX_texture_stack = GL_FALSE; +GLboolean __GLEW_MESA_pack_invert = GL_FALSE; +GLboolean __GLEW_MESA_resize_buffers = GL_FALSE; +GLboolean __GLEW_MESA_shader_integer_functions = GL_FALSE; +GLboolean __GLEW_MESA_window_pos = GL_FALSE; +GLboolean __GLEW_MESA_ycbcr_texture = GL_FALSE; +GLboolean __GLEW_NVX_blend_equation_advanced_multi_draw_buffers = GL_FALSE; +GLboolean __GLEW_NVX_conditional_render = GL_FALSE; +GLboolean __GLEW_NVX_gpu_memory_info = GL_FALSE; +GLboolean __GLEW_NVX_linked_gpu_multicast = GL_FALSE; +GLboolean __GLEW_NV_3dvision_settings = GL_FALSE; +GLboolean __GLEW_NV_EGL_stream_consumer_external = GL_FALSE; +GLboolean __GLEW_NV_alpha_to_coverage_dither_control = GL_FALSE; +GLboolean __GLEW_NV_bgr = GL_FALSE; +GLboolean __GLEW_NV_bindless_multi_draw_indirect = GL_FALSE; +GLboolean __GLEW_NV_bindless_multi_draw_indirect_count = GL_FALSE; +GLboolean __GLEW_NV_bindless_texture = GL_FALSE; +GLboolean __GLEW_NV_blend_equation_advanced = GL_FALSE; +GLboolean __GLEW_NV_blend_equation_advanced_coherent = GL_FALSE; +GLboolean __GLEW_NV_blend_minmax_factor = GL_FALSE; +GLboolean __GLEW_NV_blend_square = GL_FALSE; +GLboolean __GLEW_NV_clip_space_w_scaling = GL_FALSE; +GLboolean __GLEW_NV_command_list = GL_FALSE; +GLboolean __GLEW_NV_compute_program5 = GL_FALSE; +GLboolean __GLEW_NV_conditional_render = GL_FALSE; +GLboolean __GLEW_NV_conservative_raster = GL_FALSE; +GLboolean __GLEW_NV_conservative_raster_dilate = GL_FALSE; +GLboolean __GLEW_NV_conservative_raster_pre_snap_triangles = GL_FALSE; +GLboolean __GLEW_NV_copy_buffer = GL_FALSE; +GLboolean __GLEW_NV_copy_depth_to_color = GL_FALSE; +GLboolean __GLEW_NV_copy_image = GL_FALSE; +GLboolean __GLEW_NV_deep_texture3D = GL_FALSE; +GLboolean __GLEW_NV_depth_buffer_float = GL_FALSE; +GLboolean __GLEW_NV_depth_clamp = GL_FALSE; +GLboolean __GLEW_NV_depth_range_unclamped = GL_FALSE; +GLboolean __GLEW_NV_draw_buffers = GL_FALSE; +GLboolean __GLEW_NV_draw_instanced = GL_FALSE; +GLboolean __GLEW_NV_draw_texture = GL_FALSE; +GLboolean __GLEW_NV_draw_vulkan_image = GL_FALSE; +GLboolean __GLEW_NV_evaluators = GL_FALSE; +GLboolean __GLEW_NV_explicit_attrib_location = GL_FALSE; +GLboolean __GLEW_NV_explicit_multisample = GL_FALSE; +GLboolean __GLEW_NV_fbo_color_attachments = GL_FALSE; +GLboolean __GLEW_NV_fence = GL_FALSE; +GLboolean __GLEW_NV_fill_rectangle = GL_FALSE; +GLboolean __GLEW_NV_float_buffer = GL_FALSE; +GLboolean __GLEW_NV_fog_distance = GL_FALSE; +GLboolean __GLEW_NV_fragment_coverage_to_color = GL_FALSE; +GLboolean __GLEW_NV_fragment_program = GL_FALSE; +GLboolean __GLEW_NV_fragment_program2 = GL_FALSE; +GLboolean __GLEW_NV_fragment_program4 = GL_FALSE; +GLboolean __GLEW_NV_fragment_program_option = GL_FALSE; +GLboolean __GLEW_NV_fragment_shader_interlock = GL_FALSE; +GLboolean __GLEW_NV_framebuffer_blit = GL_FALSE; +GLboolean __GLEW_NV_framebuffer_mixed_samples = GL_FALSE; +GLboolean __GLEW_NV_framebuffer_multisample = GL_FALSE; +GLboolean __GLEW_NV_framebuffer_multisample_coverage = GL_FALSE; +GLboolean __GLEW_NV_generate_mipmap_sRGB = GL_FALSE; +GLboolean __GLEW_NV_geometry_program4 = GL_FALSE; +GLboolean __GLEW_NV_geometry_shader4 = GL_FALSE; +GLboolean __GLEW_NV_geometry_shader_passthrough = GL_FALSE; +GLboolean __GLEW_NV_gpu_multicast = GL_FALSE; +GLboolean __GLEW_NV_gpu_program4 = GL_FALSE; +GLboolean __GLEW_NV_gpu_program5 = GL_FALSE; +GLboolean __GLEW_NV_gpu_program5_mem_extended = GL_FALSE; +GLboolean __GLEW_NV_gpu_program_fp64 = GL_FALSE; +GLboolean __GLEW_NV_gpu_shader5 = GL_FALSE; +GLboolean __GLEW_NV_half_float = GL_FALSE; +GLboolean __GLEW_NV_image_formats = GL_FALSE; +GLboolean __GLEW_NV_instanced_arrays = GL_FALSE; +GLboolean __GLEW_NV_internalformat_sample_query = GL_FALSE; +GLboolean __GLEW_NV_light_max_exponent = GL_FALSE; +GLboolean __GLEW_NV_multisample_coverage = GL_FALSE; +GLboolean __GLEW_NV_multisample_filter_hint = GL_FALSE; +GLboolean __GLEW_NV_non_square_matrices = GL_FALSE; +GLboolean __GLEW_NV_occlusion_query = GL_FALSE; +GLboolean __GLEW_NV_pack_subimage = GL_FALSE; +GLboolean __GLEW_NV_packed_depth_stencil = GL_FALSE; +GLboolean __GLEW_NV_packed_float = GL_FALSE; +GLboolean __GLEW_NV_packed_float_linear = GL_FALSE; +GLboolean __GLEW_NV_parameter_buffer_object = GL_FALSE; +GLboolean __GLEW_NV_parameter_buffer_object2 = GL_FALSE; +GLboolean __GLEW_NV_path_rendering = GL_FALSE; +GLboolean __GLEW_NV_path_rendering_shared_edge = GL_FALSE; +GLboolean __GLEW_NV_pixel_buffer_object = GL_FALSE; +GLboolean __GLEW_NV_pixel_data_range = GL_FALSE; +GLboolean __GLEW_NV_platform_binary = GL_FALSE; +GLboolean __GLEW_NV_point_sprite = GL_FALSE; +GLboolean __GLEW_NV_polygon_mode = GL_FALSE; +GLboolean __GLEW_NV_present_video = GL_FALSE; +GLboolean __GLEW_NV_primitive_restart = GL_FALSE; +GLboolean __GLEW_NV_read_depth = GL_FALSE; +GLboolean __GLEW_NV_read_depth_stencil = GL_FALSE; +GLboolean __GLEW_NV_read_stencil = GL_FALSE; +GLboolean __GLEW_NV_register_combiners = GL_FALSE; +GLboolean __GLEW_NV_register_combiners2 = GL_FALSE; +GLboolean __GLEW_NV_robustness_video_memory_purge = GL_FALSE; +GLboolean __GLEW_NV_sRGB_formats = GL_FALSE; +GLboolean __GLEW_NV_sample_locations = GL_FALSE; +GLboolean __GLEW_NV_sample_mask_override_coverage = GL_FALSE; +GLboolean __GLEW_NV_shader_atomic_counters = GL_FALSE; +GLboolean __GLEW_NV_shader_atomic_float = GL_FALSE; +GLboolean __GLEW_NV_shader_atomic_float64 = GL_FALSE; +GLboolean __GLEW_NV_shader_atomic_fp16_vector = GL_FALSE; +GLboolean __GLEW_NV_shader_atomic_int64 = GL_FALSE; +GLboolean __GLEW_NV_shader_buffer_load = GL_FALSE; +GLboolean __GLEW_NV_shader_noperspective_interpolation = GL_FALSE; +GLboolean __GLEW_NV_shader_storage_buffer_object = GL_FALSE; +GLboolean __GLEW_NV_shader_thread_group = GL_FALSE; +GLboolean __GLEW_NV_shader_thread_shuffle = GL_FALSE; +GLboolean __GLEW_NV_shadow_samplers_array = GL_FALSE; +GLboolean __GLEW_NV_shadow_samplers_cube = GL_FALSE; +GLboolean __GLEW_NV_stereo_view_rendering = GL_FALSE; +GLboolean __GLEW_NV_tessellation_program5 = GL_FALSE; +GLboolean __GLEW_NV_texgen_emboss = GL_FALSE; +GLboolean __GLEW_NV_texgen_reflection = GL_FALSE; +GLboolean __GLEW_NV_texture_array = GL_FALSE; +GLboolean __GLEW_NV_texture_barrier = GL_FALSE; +GLboolean __GLEW_NV_texture_border_clamp = GL_FALSE; +GLboolean __GLEW_NV_texture_compression_latc = GL_FALSE; +GLboolean __GLEW_NV_texture_compression_s3tc = GL_FALSE; +GLboolean __GLEW_NV_texture_compression_s3tc_update = GL_FALSE; +GLboolean __GLEW_NV_texture_compression_vtc = GL_FALSE; +GLboolean __GLEW_NV_texture_env_combine4 = GL_FALSE; +GLboolean __GLEW_NV_texture_expand_normal = GL_FALSE; +GLboolean __GLEW_NV_texture_multisample = GL_FALSE; +GLboolean __GLEW_NV_texture_npot_2D_mipmap = GL_FALSE; +GLboolean __GLEW_NV_texture_rectangle = GL_FALSE; +GLboolean __GLEW_NV_texture_rectangle_compressed = GL_FALSE; +GLboolean __GLEW_NV_texture_shader = GL_FALSE; +GLboolean __GLEW_NV_texture_shader2 = GL_FALSE; +GLboolean __GLEW_NV_texture_shader3 = GL_FALSE; +GLboolean __GLEW_NV_transform_feedback = GL_FALSE; +GLboolean __GLEW_NV_transform_feedback2 = GL_FALSE; +GLboolean __GLEW_NV_uniform_buffer_unified_memory = GL_FALSE; +GLboolean __GLEW_NV_vdpau_interop = GL_FALSE; +GLboolean __GLEW_NV_vertex_array_range = GL_FALSE; +GLboolean __GLEW_NV_vertex_array_range2 = GL_FALSE; +GLboolean __GLEW_NV_vertex_attrib_integer_64bit = GL_FALSE; +GLboolean __GLEW_NV_vertex_buffer_unified_memory = GL_FALSE; +GLboolean __GLEW_NV_vertex_program = GL_FALSE; +GLboolean __GLEW_NV_vertex_program1_1 = GL_FALSE; +GLboolean __GLEW_NV_vertex_program2 = GL_FALSE; +GLboolean __GLEW_NV_vertex_program2_option = GL_FALSE; +GLboolean __GLEW_NV_vertex_program3 = GL_FALSE; +GLboolean __GLEW_NV_vertex_program4 = GL_FALSE; +GLboolean __GLEW_NV_video_capture = GL_FALSE; +GLboolean __GLEW_NV_viewport_array = GL_FALSE; +GLboolean __GLEW_NV_viewport_array2 = GL_FALSE; +GLboolean __GLEW_NV_viewport_swizzle = GL_FALSE; +GLboolean __GLEW_OES_byte_coordinates = GL_FALSE; +GLboolean __GLEW_OML_interlace = GL_FALSE; +GLboolean __GLEW_OML_resample = GL_FALSE; +GLboolean __GLEW_OML_subsample = GL_FALSE; +GLboolean __GLEW_OVR_multiview = GL_FALSE; +GLboolean __GLEW_OVR_multiview2 = GL_FALSE; +GLboolean __GLEW_OVR_multiview_multisampled_render_to_texture = GL_FALSE; +GLboolean __GLEW_PGI_misc_hints = GL_FALSE; +GLboolean __GLEW_PGI_vertex_hints = GL_FALSE; +GLboolean __GLEW_QCOM_alpha_test = GL_FALSE; +GLboolean __GLEW_QCOM_binning_control = GL_FALSE; +GLboolean __GLEW_QCOM_driver_control = GL_FALSE; +GLboolean __GLEW_QCOM_extended_get = GL_FALSE; +GLboolean __GLEW_QCOM_extended_get2 = GL_FALSE; +GLboolean __GLEW_QCOM_framebuffer_foveated = GL_FALSE; +GLboolean __GLEW_QCOM_perfmon_global_mode = GL_FALSE; +GLboolean __GLEW_QCOM_shader_framebuffer_fetch_noncoherent = GL_FALSE; +GLboolean __GLEW_QCOM_tiled_rendering = GL_FALSE; +GLboolean __GLEW_QCOM_writeonly_rendering = GL_FALSE; +GLboolean __GLEW_REGAL_ES1_0_compatibility = GL_FALSE; +GLboolean __GLEW_REGAL_ES1_1_compatibility = GL_FALSE; +GLboolean __GLEW_REGAL_enable = GL_FALSE; +GLboolean __GLEW_REGAL_error_string = GL_FALSE; +GLboolean __GLEW_REGAL_extension_query = GL_FALSE; +GLboolean __GLEW_REGAL_log = GL_FALSE; +GLboolean __GLEW_REGAL_proc_address = GL_FALSE; +GLboolean __GLEW_REND_screen_coordinates = GL_FALSE; +GLboolean __GLEW_S3_s3tc = GL_FALSE; +GLboolean __GLEW_SGIS_clip_band_hint = GL_FALSE; +GLboolean __GLEW_SGIS_color_range = GL_FALSE; +GLboolean __GLEW_SGIS_detail_texture = GL_FALSE; +GLboolean __GLEW_SGIS_fog_function = GL_FALSE; +GLboolean __GLEW_SGIS_generate_mipmap = GL_FALSE; +GLboolean __GLEW_SGIS_line_texgen = GL_FALSE; +GLboolean __GLEW_SGIS_multisample = GL_FALSE; +GLboolean __GLEW_SGIS_multitexture = GL_FALSE; +GLboolean __GLEW_SGIS_pixel_texture = GL_FALSE; +GLboolean __GLEW_SGIS_point_line_texgen = GL_FALSE; +GLboolean __GLEW_SGIS_shared_multisample = GL_FALSE; +GLboolean __GLEW_SGIS_sharpen_texture = GL_FALSE; +GLboolean __GLEW_SGIS_texture4D = GL_FALSE; +GLboolean __GLEW_SGIS_texture_border_clamp = GL_FALSE; +GLboolean __GLEW_SGIS_texture_edge_clamp = GL_FALSE; +GLboolean __GLEW_SGIS_texture_filter4 = GL_FALSE; +GLboolean __GLEW_SGIS_texture_lod = GL_FALSE; +GLboolean __GLEW_SGIS_texture_select = GL_FALSE; +GLboolean __GLEW_SGIX_async = GL_FALSE; +GLboolean __GLEW_SGIX_async_histogram = GL_FALSE; +GLboolean __GLEW_SGIX_async_pixel = GL_FALSE; +GLboolean __GLEW_SGIX_bali_g_instruments = GL_FALSE; +GLboolean __GLEW_SGIX_bali_r_instruments = GL_FALSE; +GLboolean __GLEW_SGIX_bali_timer_instruments = GL_FALSE; +GLboolean __GLEW_SGIX_blend_alpha_minmax = GL_FALSE; +GLboolean __GLEW_SGIX_blend_cadd = GL_FALSE; +GLboolean __GLEW_SGIX_blend_cmultiply = GL_FALSE; +GLboolean __GLEW_SGIX_calligraphic_fragment = GL_FALSE; +GLboolean __GLEW_SGIX_clipmap = GL_FALSE; +GLboolean __GLEW_SGIX_color_matrix_accuracy = GL_FALSE; +GLboolean __GLEW_SGIX_color_table_index_mode = GL_FALSE; +GLboolean __GLEW_SGIX_complex_polar = GL_FALSE; +GLboolean __GLEW_SGIX_convolution_accuracy = GL_FALSE; +GLboolean __GLEW_SGIX_cube_map = GL_FALSE; +GLboolean __GLEW_SGIX_cylinder_texgen = GL_FALSE; +GLboolean __GLEW_SGIX_datapipe = GL_FALSE; +GLboolean __GLEW_SGIX_decimation = GL_FALSE; +GLboolean __GLEW_SGIX_depth_pass_instrument = GL_FALSE; +GLboolean __GLEW_SGIX_depth_texture = GL_FALSE; +GLboolean __GLEW_SGIX_dvc = GL_FALSE; +GLboolean __GLEW_SGIX_flush_raster = GL_FALSE; +GLboolean __GLEW_SGIX_fog_blend = GL_FALSE; +GLboolean __GLEW_SGIX_fog_factor_to_alpha = GL_FALSE; +GLboolean __GLEW_SGIX_fog_layers = GL_FALSE; +GLboolean __GLEW_SGIX_fog_offset = GL_FALSE; +GLboolean __GLEW_SGIX_fog_patchy = GL_FALSE; +GLboolean __GLEW_SGIX_fog_scale = GL_FALSE; +GLboolean __GLEW_SGIX_fog_texture = GL_FALSE; +GLboolean __GLEW_SGIX_fragment_lighting_space = GL_FALSE; +GLboolean __GLEW_SGIX_fragment_specular_lighting = GL_FALSE; +GLboolean __GLEW_SGIX_fragments_instrument = GL_FALSE; +GLboolean __GLEW_SGIX_framezoom = GL_FALSE; +GLboolean __GLEW_SGIX_icc_texture = GL_FALSE; +GLboolean __GLEW_SGIX_igloo_interface = GL_FALSE; +GLboolean __GLEW_SGIX_image_compression = GL_FALSE; +GLboolean __GLEW_SGIX_impact_pixel_texture = GL_FALSE; +GLboolean __GLEW_SGIX_instrument_error = GL_FALSE; +GLboolean __GLEW_SGIX_interlace = GL_FALSE; +GLboolean __GLEW_SGIX_ir_instrument1 = GL_FALSE; +GLboolean __GLEW_SGIX_line_quality_hint = GL_FALSE; +GLboolean __GLEW_SGIX_list_priority = GL_FALSE; +GLboolean __GLEW_SGIX_mpeg1 = GL_FALSE; +GLboolean __GLEW_SGIX_mpeg2 = GL_FALSE; +GLboolean __GLEW_SGIX_nonlinear_lighting_pervertex = GL_FALSE; +GLboolean __GLEW_SGIX_nurbs_eval = GL_FALSE; +GLboolean __GLEW_SGIX_occlusion_instrument = GL_FALSE; +GLboolean __GLEW_SGIX_packed_6bytes = GL_FALSE; +GLboolean __GLEW_SGIX_pixel_texture = GL_FALSE; +GLboolean __GLEW_SGIX_pixel_texture_bits = GL_FALSE; +GLboolean __GLEW_SGIX_pixel_texture_lod = GL_FALSE; +GLboolean __GLEW_SGIX_pixel_tiles = GL_FALSE; +GLboolean __GLEW_SGIX_polynomial_ffd = GL_FALSE; +GLboolean __GLEW_SGIX_quad_mesh = GL_FALSE; +GLboolean __GLEW_SGIX_reference_plane = GL_FALSE; +GLboolean __GLEW_SGIX_resample = GL_FALSE; +GLboolean __GLEW_SGIX_scalebias_hint = GL_FALSE; +GLboolean __GLEW_SGIX_shadow = GL_FALSE; +GLboolean __GLEW_SGIX_shadow_ambient = GL_FALSE; +GLboolean __GLEW_SGIX_slim = GL_FALSE; +GLboolean __GLEW_SGIX_spotlight_cutoff = GL_FALSE; +GLboolean __GLEW_SGIX_sprite = GL_FALSE; +GLboolean __GLEW_SGIX_subdiv_patch = GL_FALSE; +GLboolean __GLEW_SGIX_subsample = GL_FALSE; +GLboolean __GLEW_SGIX_tag_sample_buffer = GL_FALSE; +GLboolean __GLEW_SGIX_texture_add_env = GL_FALSE; +GLboolean __GLEW_SGIX_texture_coordinate_clamp = GL_FALSE; +GLboolean __GLEW_SGIX_texture_lod_bias = GL_FALSE; +GLboolean __GLEW_SGIX_texture_mipmap_anisotropic = GL_FALSE; +GLboolean __GLEW_SGIX_texture_multi_buffer = GL_FALSE; +GLboolean __GLEW_SGIX_texture_phase = GL_FALSE; +GLboolean __GLEW_SGIX_texture_range = GL_FALSE; +GLboolean __GLEW_SGIX_texture_scale_bias = GL_FALSE; +GLboolean __GLEW_SGIX_texture_supersample = GL_FALSE; +GLboolean __GLEW_SGIX_vector_ops = GL_FALSE; +GLboolean __GLEW_SGIX_vertex_array_object = GL_FALSE; +GLboolean __GLEW_SGIX_vertex_preclip = GL_FALSE; +GLboolean __GLEW_SGIX_vertex_preclip_hint = GL_FALSE; +GLboolean __GLEW_SGIX_ycrcb = GL_FALSE; +GLboolean __GLEW_SGIX_ycrcb_subsample = GL_FALSE; +GLboolean __GLEW_SGIX_ycrcba = GL_FALSE; +GLboolean __GLEW_SGI_color_matrix = GL_FALSE; +GLboolean __GLEW_SGI_color_table = GL_FALSE; +GLboolean __GLEW_SGI_complex = GL_FALSE; +GLboolean __GLEW_SGI_complex_type = GL_FALSE; +GLboolean __GLEW_SGI_fft = GL_FALSE; +GLboolean __GLEW_SGI_texture_color_table = GL_FALSE; +GLboolean __GLEW_SUNX_constant_data = GL_FALSE; +GLboolean __GLEW_SUN_convolution_border_modes = GL_FALSE; +GLboolean __GLEW_SUN_global_alpha = GL_FALSE; +GLboolean __GLEW_SUN_mesh_array = GL_FALSE; +GLboolean __GLEW_SUN_read_video_pixels = GL_FALSE; +GLboolean __GLEW_SUN_slice_accum = GL_FALSE; +GLboolean __GLEW_SUN_triangle_list = GL_FALSE; +GLboolean __GLEW_SUN_vertex = GL_FALSE; +GLboolean __GLEW_WIN_phong_shading = GL_FALSE; +GLboolean __GLEW_WIN_scene_markerXXX = GL_FALSE; +GLboolean __GLEW_WIN_specular_fog = GL_FALSE; +GLboolean __GLEW_WIN_swap_hint = GL_FALSE; + +static const char * _glewExtensionLookup[] = { +#ifdef GL_VERSION_1_2 + "GL_VERSION_1_2", +#endif +#ifdef GL_VERSION_1_2_1 + "GL_VERSION_1_2_1", +#endif +#ifdef GL_VERSION_1_3 + "GL_VERSION_1_3", +#endif +#ifdef GL_VERSION_1_4 + "GL_VERSION_1_4", +#endif +#ifdef GL_VERSION_1_5 + "GL_VERSION_1_5", +#endif +#ifdef GL_VERSION_2_0 + "GL_VERSION_2_0", +#endif +#ifdef GL_VERSION_2_1 + "GL_VERSION_2_1", +#endif +#ifdef GL_VERSION_3_0 + "GL_VERSION_3_0", +#endif +#ifdef GL_VERSION_3_1 + "GL_VERSION_3_1", +#endif +#ifdef GL_VERSION_3_2 + "GL_VERSION_3_2", +#endif +#ifdef GL_VERSION_3_3 + "GL_VERSION_3_3", +#endif +#ifdef GL_VERSION_4_0 + "GL_VERSION_4_0", +#endif +#ifdef GL_VERSION_4_1 + "GL_VERSION_4_1", +#endif +#ifdef GL_VERSION_4_2 + "GL_VERSION_4_2", +#endif +#ifdef GL_VERSION_4_3 + "GL_VERSION_4_3", +#endif +#ifdef GL_VERSION_4_4 + "GL_VERSION_4_4", +#endif +#ifdef GL_VERSION_4_5 + "GL_VERSION_4_5", +#endif +#ifdef GL_VERSION_4_6 + "GL_VERSION_4_6", +#endif +#ifdef GL_3DFX_multisample + "GL_3DFX_multisample", +#endif +#ifdef GL_3DFX_tbuffer + "GL_3DFX_tbuffer", +#endif +#ifdef GL_3DFX_texture_compression_FXT1 + "GL_3DFX_texture_compression_FXT1", +#endif +#ifdef GL_AMD_blend_minmax_factor + "GL_AMD_blend_minmax_factor", +#endif +#ifdef GL_AMD_compressed_3DC_texture + "GL_AMD_compressed_3DC_texture", +#endif +#ifdef GL_AMD_compressed_ATC_texture + "GL_AMD_compressed_ATC_texture", +#endif +#ifdef GL_AMD_conservative_depth + "GL_AMD_conservative_depth", +#endif +#ifdef GL_AMD_debug_output + "GL_AMD_debug_output", +#endif +#ifdef GL_AMD_depth_clamp_separate + "GL_AMD_depth_clamp_separate", +#endif +#ifdef GL_AMD_draw_buffers_blend + "GL_AMD_draw_buffers_blend", +#endif +#ifdef GL_AMD_framebuffer_sample_positions + "GL_AMD_framebuffer_sample_positions", +#endif +#ifdef GL_AMD_gcn_shader + "GL_AMD_gcn_shader", +#endif +#ifdef GL_AMD_gpu_shader_half_float + "GL_AMD_gpu_shader_half_float", +#endif +#ifdef GL_AMD_gpu_shader_int16 + "GL_AMD_gpu_shader_int16", +#endif +#ifdef GL_AMD_gpu_shader_int64 + "GL_AMD_gpu_shader_int64", +#endif +#ifdef GL_AMD_interleaved_elements + "GL_AMD_interleaved_elements", +#endif +#ifdef GL_AMD_multi_draw_indirect + "GL_AMD_multi_draw_indirect", +#endif +#ifdef GL_AMD_name_gen_delete + "GL_AMD_name_gen_delete", +#endif +#ifdef GL_AMD_occlusion_query_event + "GL_AMD_occlusion_query_event", +#endif +#ifdef GL_AMD_performance_monitor + "GL_AMD_performance_monitor", +#endif +#ifdef GL_AMD_pinned_memory + "GL_AMD_pinned_memory", +#endif +#ifdef GL_AMD_program_binary_Z400 + "GL_AMD_program_binary_Z400", +#endif +#ifdef GL_AMD_query_buffer_object + "GL_AMD_query_buffer_object", +#endif +#ifdef GL_AMD_sample_positions + "GL_AMD_sample_positions", +#endif +#ifdef GL_AMD_seamless_cubemap_per_texture + "GL_AMD_seamless_cubemap_per_texture", +#endif +#ifdef GL_AMD_shader_atomic_counter_ops + "GL_AMD_shader_atomic_counter_ops", +#endif +#ifdef GL_AMD_shader_ballot + "GL_AMD_shader_ballot", +#endif +#ifdef GL_AMD_shader_explicit_vertex_parameter + "GL_AMD_shader_explicit_vertex_parameter", +#endif +#ifdef GL_AMD_shader_stencil_export + "GL_AMD_shader_stencil_export", +#endif +#ifdef GL_AMD_shader_stencil_value_export + "GL_AMD_shader_stencil_value_export", +#endif +#ifdef GL_AMD_shader_trinary_minmax + "GL_AMD_shader_trinary_minmax", +#endif +#ifdef GL_AMD_sparse_texture + "GL_AMD_sparse_texture", +#endif +#ifdef GL_AMD_stencil_operation_extended + "GL_AMD_stencil_operation_extended", +#endif +#ifdef GL_AMD_texture_gather_bias_lod + "GL_AMD_texture_gather_bias_lod", +#endif +#ifdef GL_AMD_texture_texture4 + "GL_AMD_texture_texture4", +#endif +#ifdef GL_AMD_transform_feedback3_lines_triangles + "GL_AMD_transform_feedback3_lines_triangles", +#endif +#ifdef GL_AMD_transform_feedback4 + "GL_AMD_transform_feedback4", +#endif +#ifdef GL_AMD_vertex_shader_layer + "GL_AMD_vertex_shader_layer", +#endif +#ifdef GL_AMD_vertex_shader_tessellator + "GL_AMD_vertex_shader_tessellator", +#endif +#ifdef GL_AMD_vertex_shader_viewport_index + "GL_AMD_vertex_shader_viewport_index", +#endif +#ifdef GL_ANDROID_extension_pack_es31a + "GL_ANDROID_extension_pack_es31a", +#endif +#ifdef GL_ANGLE_depth_texture + "GL_ANGLE_depth_texture", +#endif +#ifdef GL_ANGLE_framebuffer_blit + "GL_ANGLE_framebuffer_blit", +#endif +#ifdef GL_ANGLE_framebuffer_multisample + "GL_ANGLE_framebuffer_multisample", +#endif +#ifdef GL_ANGLE_instanced_arrays + "GL_ANGLE_instanced_arrays", +#endif +#ifdef GL_ANGLE_pack_reverse_row_order + "GL_ANGLE_pack_reverse_row_order", +#endif +#ifdef GL_ANGLE_program_binary + "GL_ANGLE_program_binary", +#endif +#ifdef GL_ANGLE_texture_compression_dxt1 + "GL_ANGLE_texture_compression_dxt1", +#endif +#ifdef GL_ANGLE_texture_compression_dxt3 + "GL_ANGLE_texture_compression_dxt3", +#endif +#ifdef GL_ANGLE_texture_compression_dxt5 + "GL_ANGLE_texture_compression_dxt5", +#endif +#ifdef GL_ANGLE_texture_usage + "GL_ANGLE_texture_usage", +#endif +#ifdef GL_ANGLE_timer_query + "GL_ANGLE_timer_query", +#endif +#ifdef GL_ANGLE_translated_shader_source + "GL_ANGLE_translated_shader_source", +#endif +#ifdef GL_APPLE_aux_depth_stencil + "GL_APPLE_aux_depth_stencil", +#endif +#ifdef GL_APPLE_client_storage + "GL_APPLE_client_storage", +#endif +#ifdef GL_APPLE_clip_distance + "GL_APPLE_clip_distance", +#endif +#ifdef GL_APPLE_color_buffer_packed_float + "GL_APPLE_color_buffer_packed_float", +#endif +#ifdef GL_APPLE_copy_texture_levels + "GL_APPLE_copy_texture_levels", +#endif +#ifdef GL_APPLE_element_array + "GL_APPLE_element_array", +#endif +#ifdef GL_APPLE_fence + "GL_APPLE_fence", +#endif +#ifdef GL_APPLE_float_pixels + "GL_APPLE_float_pixels", +#endif +#ifdef GL_APPLE_flush_buffer_range + "GL_APPLE_flush_buffer_range", +#endif +#ifdef GL_APPLE_framebuffer_multisample + "GL_APPLE_framebuffer_multisample", +#endif +#ifdef GL_APPLE_object_purgeable + "GL_APPLE_object_purgeable", +#endif +#ifdef GL_APPLE_pixel_buffer + "GL_APPLE_pixel_buffer", +#endif +#ifdef GL_APPLE_rgb_422 + "GL_APPLE_rgb_422", +#endif +#ifdef GL_APPLE_row_bytes + "GL_APPLE_row_bytes", +#endif +#ifdef GL_APPLE_specular_vector + "GL_APPLE_specular_vector", +#endif +#ifdef GL_APPLE_sync + "GL_APPLE_sync", +#endif +#ifdef GL_APPLE_texture_2D_limited_npot + "GL_APPLE_texture_2D_limited_npot", +#endif +#ifdef GL_APPLE_texture_format_BGRA8888 + "GL_APPLE_texture_format_BGRA8888", +#endif +#ifdef GL_APPLE_texture_max_level + "GL_APPLE_texture_max_level", +#endif +#ifdef GL_APPLE_texture_packed_float + "GL_APPLE_texture_packed_float", +#endif +#ifdef GL_APPLE_texture_range + "GL_APPLE_texture_range", +#endif +#ifdef GL_APPLE_transform_hint + "GL_APPLE_transform_hint", +#endif +#ifdef GL_APPLE_vertex_array_object + "GL_APPLE_vertex_array_object", +#endif +#ifdef GL_APPLE_vertex_array_range + "GL_APPLE_vertex_array_range", +#endif +#ifdef GL_APPLE_vertex_program_evaluators + "GL_APPLE_vertex_program_evaluators", +#endif +#ifdef GL_APPLE_ycbcr_422 + "GL_APPLE_ycbcr_422", +#endif +#ifdef GL_ARB_ES2_compatibility + "GL_ARB_ES2_compatibility", +#endif +#ifdef GL_ARB_ES3_1_compatibility + "GL_ARB_ES3_1_compatibility", +#endif +#ifdef GL_ARB_ES3_2_compatibility + "GL_ARB_ES3_2_compatibility", +#endif +#ifdef GL_ARB_ES3_compatibility + "GL_ARB_ES3_compatibility", +#endif +#ifdef GL_ARB_arrays_of_arrays + "GL_ARB_arrays_of_arrays", +#endif +#ifdef GL_ARB_base_instance + "GL_ARB_base_instance", +#endif +#ifdef GL_ARB_bindless_texture + "GL_ARB_bindless_texture", +#endif +#ifdef GL_ARB_blend_func_extended + "GL_ARB_blend_func_extended", +#endif +#ifdef GL_ARB_buffer_storage + "GL_ARB_buffer_storage", +#endif +#ifdef GL_ARB_cl_event + "GL_ARB_cl_event", +#endif +#ifdef GL_ARB_clear_buffer_object + "GL_ARB_clear_buffer_object", +#endif +#ifdef GL_ARB_clear_texture + "GL_ARB_clear_texture", +#endif +#ifdef GL_ARB_clip_control + "GL_ARB_clip_control", +#endif +#ifdef GL_ARB_color_buffer_float + "GL_ARB_color_buffer_float", +#endif +#ifdef GL_ARB_compatibility + "GL_ARB_compatibility", +#endif +#ifdef GL_ARB_compressed_texture_pixel_storage + "GL_ARB_compressed_texture_pixel_storage", +#endif +#ifdef GL_ARB_compute_shader + "GL_ARB_compute_shader", +#endif +#ifdef GL_ARB_compute_variable_group_size + "GL_ARB_compute_variable_group_size", +#endif +#ifdef GL_ARB_conditional_render_inverted + "GL_ARB_conditional_render_inverted", +#endif +#ifdef GL_ARB_conservative_depth + "GL_ARB_conservative_depth", +#endif +#ifdef GL_ARB_copy_buffer + "GL_ARB_copy_buffer", +#endif +#ifdef GL_ARB_copy_image + "GL_ARB_copy_image", +#endif +#ifdef GL_ARB_cull_distance + "GL_ARB_cull_distance", +#endif +#ifdef GL_ARB_debug_output + "GL_ARB_debug_output", +#endif +#ifdef GL_ARB_depth_buffer_float + "GL_ARB_depth_buffer_float", +#endif +#ifdef GL_ARB_depth_clamp + "GL_ARB_depth_clamp", +#endif +#ifdef GL_ARB_depth_texture + "GL_ARB_depth_texture", +#endif +#ifdef GL_ARB_derivative_control + "GL_ARB_derivative_control", +#endif +#ifdef GL_ARB_direct_state_access + "GL_ARB_direct_state_access", +#endif +#ifdef GL_ARB_draw_buffers + "GL_ARB_draw_buffers", +#endif +#ifdef GL_ARB_draw_buffers_blend + "GL_ARB_draw_buffers_blend", +#endif +#ifdef GL_ARB_draw_elements_base_vertex + "GL_ARB_draw_elements_base_vertex", +#endif +#ifdef GL_ARB_draw_indirect + "GL_ARB_draw_indirect", +#endif +#ifdef GL_ARB_draw_instanced + "GL_ARB_draw_instanced", +#endif +#ifdef GL_ARB_enhanced_layouts + "GL_ARB_enhanced_layouts", +#endif +#ifdef GL_ARB_explicit_attrib_location + "GL_ARB_explicit_attrib_location", +#endif +#ifdef GL_ARB_explicit_uniform_location + "GL_ARB_explicit_uniform_location", +#endif +#ifdef GL_ARB_fragment_coord_conventions + "GL_ARB_fragment_coord_conventions", +#endif +#ifdef GL_ARB_fragment_layer_viewport + "GL_ARB_fragment_layer_viewport", +#endif +#ifdef GL_ARB_fragment_program + "GL_ARB_fragment_program", +#endif +#ifdef GL_ARB_fragment_program_shadow + "GL_ARB_fragment_program_shadow", +#endif +#ifdef GL_ARB_fragment_shader + "GL_ARB_fragment_shader", +#endif +#ifdef GL_ARB_fragment_shader_interlock + "GL_ARB_fragment_shader_interlock", +#endif +#ifdef GL_ARB_framebuffer_no_attachments + "GL_ARB_framebuffer_no_attachments", +#endif +#ifdef GL_ARB_framebuffer_object + "GL_ARB_framebuffer_object", +#endif +#ifdef GL_ARB_framebuffer_sRGB + "GL_ARB_framebuffer_sRGB", +#endif +#ifdef GL_ARB_geometry_shader4 + "GL_ARB_geometry_shader4", +#endif +#ifdef GL_ARB_get_program_binary + "GL_ARB_get_program_binary", +#endif +#ifdef GL_ARB_get_texture_sub_image + "GL_ARB_get_texture_sub_image", +#endif +#ifdef GL_ARB_gl_spirv + "GL_ARB_gl_spirv", +#endif +#ifdef GL_ARB_gpu_shader5 + "GL_ARB_gpu_shader5", +#endif +#ifdef GL_ARB_gpu_shader_fp64 + "GL_ARB_gpu_shader_fp64", +#endif +#ifdef GL_ARB_gpu_shader_int64 + "GL_ARB_gpu_shader_int64", +#endif +#ifdef GL_ARB_half_float_pixel + "GL_ARB_half_float_pixel", +#endif +#ifdef GL_ARB_half_float_vertex + "GL_ARB_half_float_vertex", +#endif +#ifdef GL_ARB_imaging + "GL_ARB_imaging", +#endif +#ifdef GL_ARB_indirect_parameters + "GL_ARB_indirect_parameters", +#endif +#ifdef GL_ARB_instanced_arrays + "GL_ARB_instanced_arrays", +#endif +#ifdef GL_ARB_internalformat_query + "GL_ARB_internalformat_query", +#endif +#ifdef GL_ARB_internalformat_query2 + "GL_ARB_internalformat_query2", +#endif +#ifdef GL_ARB_invalidate_subdata + "GL_ARB_invalidate_subdata", +#endif +#ifdef GL_ARB_map_buffer_alignment + "GL_ARB_map_buffer_alignment", +#endif +#ifdef GL_ARB_map_buffer_range + "GL_ARB_map_buffer_range", +#endif +#ifdef GL_ARB_matrix_palette + "GL_ARB_matrix_palette", +#endif +#ifdef GL_ARB_multi_bind + "GL_ARB_multi_bind", +#endif +#ifdef GL_ARB_multi_draw_indirect + "GL_ARB_multi_draw_indirect", +#endif +#ifdef GL_ARB_multisample + "GL_ARB_multisample", +#endif +#ifdef GL_ARB_multitexture + "GL_ARB_multitexture", +#endif +#ifdef GL_ARB_occlusion_query + "GL_ARB_occlusion_query", +#endif +#ifdef GL_ARB_occlusion_query2 + "GL_ARB_occlusion_query2", +#endif +#ifdef GL_ARB_parallel_shader_compile + "GL_ARB_parallel_shader_compile", +#endif +#ifdef GL_ARB_pipeline_statistics_query + "GL_ARB_pipeline_statistics_query", +#endif +#ifdef GL_ARB_pixel_buffer_object + "GL_ARB_pixel_buffer_object", +#endif +#ifdef GL_ARB_point_parameters + "GL_ARB_point_parameters", +#endif +#ifdef GL_ARB_point_sprite + "GL_ARB_point_sprite", +#endif +#ifdef GL_ARB_polygon_offset_clamp + "GL_ARB_polygon_offset_clamp", +#endif +#ifdef GL_ARB_post_depth_coverage + "GL_ARB_post_depth_coverage", +#endif +#ifdef GL_ARB_program_interface_query + "GL_ARB_program_interface_query", +#endif +#ifdef GL_ARB_provoking_vertex + "GL_ARB_provoking_vertex", +#endif +#ifdef GL_ARB_query_buffer_object + "GL_ARB_query_buffer_object", +#endif +#ifdef GL_ARB_robust_buffer_access_behavior + "GL_ARB_robust_buffer_access_behavior", +#endif +#ifdef GL_ARB_robustness + "GL_ARB_robustness", +#endif +#ifdef GL_ARB_robustness_application_isolation + "GL_ARB_robustness_application_isolation", +#endif +#ifdef GL_ARB_robustness_share_group_isolation + "GL_ARB_robustness_share_group_isolation", +#endif +#ifdef GL_ARB_sample_locations + "GL_ARB_sample_locations", +#endif +#ifdef GL_ARB_sample_shading + "GL_ARB_sample_shading", +#endif +#ifdef GL_ARB_sampler_objects + "GL_ARB_sampler_objects", +#endif +#ifdef GL_ARB_seamless_cube_map + "GL_ARB_seamless_cube_map", +#endif +#ifdef GL_ARB_seamless_cubemap_per_texture + "GL_ARB_seamless_cubemap_per_texture", +#endif +#ifdef GL_ARB_separate_shader_objects + "GL_ARB_separate_shader_objects", +#endif +#ifdef GL_ARB_shader_atomic_counter_ops + "GL_ARB_shader_atomic_counter_ops", +#endif +#ifdef GL_ARB_shader_atomic_counters + "GL_ARB_shader_atomic_counters", +#endif +#ifdef GL_ARB_shader_ballot + "GL_ARB_shader_ballot", +#endif +#ifdef GL_ARB_shader_bit_encoding + "GL_ARB_shader_bit_encoding", +#endif +#ifdef GL_ARB_shader_clock + "GL_ARB_shader_clock", +#endif +#ifdef GL_ARB_shader_draw_parameters + "GL_ARB_shader_draw_parameters", +#endif +#ifdef GL_ARB_shader_group_vote + "GL_ARB_shader_group_vote", +#endif +#ifdef GL_ARB_shader_image_load_store + "GL_ARB_shader_image_load_store", +#endif +#ifdef GL_ARB_shader_image_size + "GL_ARB_shader_image_size", +#endif +#ifdef GL_ARB_shader_objects + "GL_ARB_shader_objects", +#endif +#ifdef GL_ARB_shader_precision + "GL_ARB_shader_precision", +#endif +#ifdef GL_ARB_shader_stencil_export + "GL_ARB_shader_stencil_export", +#endif +#ifdef GL_ARB_shader_storage_buffer_object + "GL_ARB_shader_storage_buffer_object", +#endif +#ifdef GL_ARB_shader_subroutine + "GL_ARB_shader_subroutine", +#endif +#ifdef GL_ARB_shader_texture_image_samples + "GL_ARB_shader_texture_image_samples", +#endif +#ifdef GL_ARB_shader_texture_lod + "GL_ARB_shader_texture_lod", +#endif +#ifdef GL_ARB_shader_viewport_layer_array + "GL_ARB_shader_viewport_layer_array", +#endif +#ifdef GL_ARB_shading_language_100 + "GL_ARB_shading_language_100", +#endif +#ifdef GL_ARB_shading_language_420pack + "GL_ARB_shading_language_420pack", +#endif +#ifdef GL_ARB_shading_language_include + "GL_ARB_shading_language_include", +#endif +#ifdef GL_ARB_shading_language_packing + "GL_ARB_shading_language_packing", +#endif +#ifdef GL_ARB_shadow + "GL_ARB_shadow", +#endif +#ifdef GL_ARB_shadow_ambient + "GL_ARB_shadow_ambient", +#endif +#ifdef GL_ARB_sparse_buffer + "GL_ARB_sparse_buffer", +#endif +#ifdef GL_ARB_sparse_texture + "GL_ARB_sparse_texture", +#endif +#ifdef GL_ARB_sparse_texture2 + "GL_ARB_sparse_texture2", +#endif +#ifdef GL_ARB_sparse_texture_clamp + "GL_ARB_sparse_texture_clamp", +#endif +#ifdef GL_ARB_spirv_extensions + "GL_ARB_spirv_extensions", +#endif +#ifdef GL_ARB_stencil_texturing + "GL_ARB_stencil_texturing", +#endif +#ifdef GL_ARB_sync + "GL_ARB_sync", +#endif +#ifdef GL_ARB_tessellation_shader + "GL_ARB_tessellation_shader", +#endif +#ifdef GL_ARB_texture_barrier + "GL_ARB_texture_barrier", +#endif +#ifdef GL_ARB_texture_border_clamp + "GL_ARB_texture_border_clamp", +#endif +#ifdef GL_ARB_texture_buffer_object + "GL_ARB_texture_buffer_object", +#endif +#ifdef GL_ARB_texture_buffer_object_rgb32 + "GL_ARB_texture_buffer_object_rgb32", +#endif +#ifdef GL_ARB_texture_buffer_range + "GL_ARB_texture_buffer_range", +#endif +#ifdef GL_ARB_texture_compression + "GL_ARB_texture_compression", +#endif +#ifdef GL_ARB_texture_compression_bptc + "GL_ARB_texture_compression_bptc", +#endif +#ifdef GL_ARB_texture_compression_rgtc + "GL_ARB_texture_compression_rgtc", +#endif +#ifdef GL_ARB_texture_cube_map + "GL_ARB_texture_cube_map", +#endif +#ifdef GL_ARB_texture_cube_map_array + "GL_ARB_texture_cube_map_array", +#endif +#ifdef GL_ARB_texture_env_add + "GL_ARB_texture_env_add", +#endif +#ifdef GL_ARB_texture_env_combine + "GL_ARB_texture_env_combine", +#endif +#ifdef GL_ARB_texture_env_crossbar + "GL_ARB_texture_env_crossbar", +#endif +#ifdef GL_ARB_texture_env_dot3 + "GL_ARB_texture_env_dot3", +#endif +#ifdef GL_ARB_texture_filter_anisotropic + "GL_ARB_texture_filter_anisotropic", +#endif +#ifdef GL_ARB_texture_filter_minmax + "GL_ARB_texture_filter_minmax", +#endif +#ifdef GL_ARB_texture_float + "GL_ARB_texture_float", +#endif +#ifdef GL_ARB_texture_gather + "GL_ARB_texture_gather", +#endif +#ifdef GL_ARB_texture_mirror_clamp_to_edge + "GL_ARB_texture_mirror_clamp_to_edge", +#endif +#ifdef GL_ARB_texture_mirrored_repeat + "GL_ARB_texture_mirrored_repeat", +#endif +#ifdef GL_ARB_texture_multisample + "GL_ARB_texture_multisample", +#endif +#ifdef GL_ARB_texture_non_power_of_two + "GL_ARB_texture_non_power_of_two", +#endif +#ifdef GL_ARB_texture_query_levels + "GL_ARB_texture_query_levels", +#endif +#ifdef GL_ARB_texture_query_lod + "GL_ARB_texture_query_lod", +#endif +#ifdef GL_ARB_texture_rectangle + "GL_ARB_texture_rectangle", +#endif +#ifdef GL_ARB_texture_rg + "GL_ARB_texture_rg", +#endif +#ifdef GL_ARB_texture_rgb10_a2ui + "GL_ARB_texture_rgb10_a2ui", +#endif +#ifdef GL_ARB_texture_stencil8 + "GL_ARB_texture_stencil8", +#endif +#ifdef GL_ARB_texture_storage + "GL_ARB_texture_storage", +#endif +#ifdef GL_ARB_texture_storage_multisample + "GL_ARB_texture_storage_multisample", +#endif +#ifdef GL_ARB_texture_swizzle + "GL_ARB_texture_swizzle", +#endif +#ifdef GL_ARB_texture_view + "GL_ARB_texture_view", +#endif +#ifdef GL_ARB_timer_query + "GL_ARB_timer_query", +#endif +#ifdef GL_ARB_transform_feedback2 + "GL_ARB_transform_feedback2", +#endif +#ifdef GL_ARB_transform_feedback3 + "GL_ARB_transform_feedback3", +#endif +#ifdef GL_ARB_transform_feedback_instanced + "GL_ARB_transform_feedback_instanced", +#endif +#ifdef GL_ARB_transform_feedback_overflow_query + "GL_ARB_transform_feedback_overflow_query", +#endif +#ifdef GL_ARB_transpose_matrix + "GL_ARB_transpose_matrix", +#endif +#ifdef GL_ARB_uniform_buffer_object + "GL_ARB_uniform_buffer_object", +#endif +#ifdef GL_ARB_vertex_array_bgra + "GL_ARB_vertex_array_bgra", +#endif +#ifdef GL_ARB_vertex_array_object + "GL_ARB_vertex_array_object", +#endif +#ifdef GL_ARB_vertex_attrib_64bit + "GL_ARB_vertex_attrib_64bit", +#endif +#ifdef GL_ARB_vertex_attrib_binding + "GL_ARB_vertex_attrib_binding", +#endif +#ifdef GL_ARB_vertex_blend + "GL_ARB_vertex_blend", +#endif +#ifdef GL_ARB_vertex_buffer_object + "GL_ARB_vertex_buffer_object", +#endif +#ifdef GL_ARB_vertex_program + "GL_ARB_vertex_program", +#endif +#ifdef GL_ARB_vertex_shader + "GL_ARB_vertex_shader", +#endif +#ifdef GL_ARB_vertex_type_10f_11f_11f_rev + "GL_ARB_vertex_type_10f_11f_11f_rev", +#endif +#ifdef GL_ARB_vertex_type_2_10_10_10_rev + "GL_ARB_vertex_type_2_10_10_10_rev", +#endif +#ifdef GL_ARB_viewport_array + "GL_ARB_viewport_array", +#endif +#ifdef GL_ARB_window_pos + "GL_ARB_window_pos", +#endif +#ifdef GL_ARM_mali_program_binary + "GL_ARM_mali_program_binary", +#endif +#ifdef GL_ARM_mali_shader_binary + "GL_ARM_mali_shader_binary", +#endif +#ifdef GL_ARM_rgba8 + "GL_ARM_rgba8", +#endif +#ifdef GL_ARM_shader_framebuffer_fetch + "GL_ARM_shader_framebuffer_fetch", +#endif +#ifdef GL_ARM_shader_framebuffer_fetch_depth_stencil + "GL_ARM_shader_framebuffer_fetch_depth_stencil", +#endif +#ifdef GL_ATIX_point_sprites + "GL_ATIX_point_sprites", +#endif +#ifdef GL_ATIX_texture_env_combine3 + "GL_ATIX_texture_env_combine3", +#endif +#ifdef GL_ATIX_texture_env_route + "GL_ATIX_texture_env_route", +#endif +#ifdef GL_ATIX_vertex_shader_output_point_size + "GL_ATIX_vertex_shader_output_point_size", +#endif +#ifdef GL_ATI_draw_buffers + "GL_ATI_draw_buffers", +#endif +#ifdef GL_ATI_element_array + "GL_ATI_element_array", +#endif +#ifdef GL_ATI_envmap_bumpmap + "GL_ATI_envmap_bumpmap", +#endif +#ifdef GL_ATI_fragment_shader + "GL_ATI_fragment_shader", +#endif +#ifdef GL_ATI_map_object_buffer + "GL_ATI_map_object_buffer", +#endif +#ifdef GL_ATI_meminfo + "GL_ATI_meminfo", +#endif +#ifdef GL_ATI_pn_triangles + "GL_ATI_pn_triangles", +#endif +#ifdef GL_ATI_separate_stencil + "GL_ATI_separate_stencil", +#endif +#ifdef GL_ATI_shader_texture_lod + "GL_ATI_shader_texture_lod", +#endif +#ifdef GL_ATI_text_fragment_shader + "GL_ATI_text_fragment_shader", +#endif +#ifdef GL_ATI_texture_compression_3dc + "GL_ATI_texture_compression_3dc", +#endif +#ifdef GL_ATI_texture_env_combine3 + "GL_ATI_texture_env_combine3", +#endif +#ifdef GL_ATI_texture_float + "GL_ATI_texture_float", +#endif +#ifdef GL_ATI_texture_mirror_once + "GL_ATI_texture_mirror_once", +#endif +#ifdef GL_ATI_vertex_array_object + "GL_ATI_vertex_array_object", +#endif +#ifdef GL_ATI_vertex_attrib_array_object + "GL_ATI_vertex_attrib_array_object", +#endif +#ifdef GL_ATI_vertex_streams + "GL_ATI_vertex_streams", +#endif +#ifdef GL_EGL_KHR_context_flush_control + "GL_EGL_KHR_context_flush_control", +#endif +#ifdef GL_EGL_NV_robustness_video_memory_purge + "GL_EGL_NV_robustness_video_memory_purge", +#endif +#ifdef GL_EXT_422_pixels + "GL_EXT_422_pixels", +#endif +#ifdef GL_EXT_Cg_shader + "GL_EXT_Cg_shader", +#endif +#ifdef GL_EXT_EGL_image_array + "GL_EXT_EGL_image_array", +#endif +#ifdef GL_EXT_YUV_target + "GL_EXT_YUV_target", +#endif +#ifdef GL_EXT_abgr + "GL_EXT_abgr", +#endif +#ifdef GL_EXT_base_instance + "GL_EXT_base_instance", +#endif +#ifdef GL_EXT_bgra + "GL_EXT_bgra", +#endif +#ifdef GL_EXT_bindable_uniform + "GL_EXT_bindable_uniform", +#endif +#ifdef GL_EXT_blend_color + "GL_EXT_blend_color", +#endif +#ifdef GL_EXT_blend_equation_separate + "GL_EXT_blend_equation_separate", +#endif +#ifdef GL_EXT_blend_func_extended + "GL_EXT_blend_func_extended", +#endif +#ifdef GL_EXT_blend_func_separate + "GL_EXT_blend_func_separate", +#endif +#ifdef GL_EXT_blend_logic_op + "GL_EXT_blend_logic_op", +#endif +#ifdef GL_EXT_blend_minmax + "GL_EXT_blend_minmax", +#endif +#ifdef GL_EXT_blend_subtract + "GL_EXT_blend_subtract", +#endif +#ifdef GL_EXT_buffer_storage + "GL_EXT_buffer_storage", +#endif +#ifdef GL_EXT_clear_texture + "GL_EXT_clear_texture", +#endif +#ifdef GL_EXT_clip_cull_distance + "GL_EXT_clip_cull_distance", +#endif +#ifdef GL_EXT_clip_volume_hint + "GL_EXT_clip_volume_hint", +#endif +#ifdef GL_EXT_cmyka + "GL_EXT_cmyka", +#endif +#ifdef GL_EXT_color_buffer_float + "GL_EXT_color_buffer_float", +#endif +#ifdef GL_EXT_color_buffer_half_float + "GL_EXT_color_buffer_half_float", +#endif +#ifdef GL_EXT_color_subtable + "GL_EXT_color_subtable", +#endif +#ifdef GL_EXT_compiled_vertex_array + "GL_EXT_compiled_vertex_array", +#endif +#ifdef GL_EXT_compressed_ETC1_RGB8_sub_texture + "GL_EXT_compressed_ETC1_RGB8_sub_texture", +#endif +#ifdef GL_EXT_conservative_depth + "GL_EXT_conservative_depth", +#endif +#ifdef GL_EXT_convolution + "GL_EXT_convolution", +#endif +#ifdef GL_EXT_coordinate_frame + "GL_EXT_coordinate_frame", +#endif +#ifdef GL_EXT_copy_image + "GL_EXT_copy_image", +#endif +#ifdef GL_EXT_copy_texture + "GL_EXT_copy_texture", +#endif +#ifdef GL_EXT_cull_vertex + "GL_EXT_cull_vertex", +#endif +#ifdef GL_EXT_debug_label + "GL_EXT_debug_label", +#endif +#ifdef GL_EXT_debug_marker + "GL_EXT_debug_marker", +#endif +#ifdef GL_EXT_depth_bounds_test + "GL_EXT_depth_bounds_test", +#endif +#ifdef GL_EXT_direct_state_access + "GL_EXT_direct_state_access", +#endif +#ifdef GL_EXT_discard_framebuffer + "GL_EXT_discard_framebuffer", +#endif +#ifdef GL_EXT_draw_buffers + "GL_EXT_draw_buffers", +#endif +#ifdef GL_EXT_draw_buffers2 + "GL_EXT_draw_buffers2", +#endif +#ifdef GL_EXT_draw_buffers_indexed + "GL_EXT_draw_buffers_indexed", +#endif +#ifdef GL_EXT_draw_elements_base_vertex + "GL_EXT_draw_elements_base_vertex", +#endif +#ifdef GL_EXT_draw_instanced + "GL_EXT_draw_instanced", +#endif +#ifdef GL_EXT_draw_range_elements + "GL_EXT_draw_range_elements", +#endif +#ifdef GL_EXT_external_buffer + "GL_EXT_external_buffer", +#endif +#ifdef GL_EXT_float_blend + "GL_EXT_float_blend", +#endif +#ifdef GL_EXT_fog_coord + "GL_EXT_fog_coord", +#endif +#ifdef GL_EXT_frag_depth + "GL_EXT_frag_depth", +#endif +#ifdef GL_EXT_fragment_lighting + "GL_EXT_fragment_lighting", +#endif +#ifdef GL_EXT_framebuffer_blit + "GL_EXT_framebuffer_blit", +#endif +#ifdef GL_EXT_framebuffer_multisample + "GL_EXT_framebuffer_multisample", +#endif +#ifdef GL_EXT_framebuffer_multisample_blit_scaled + "GL_EXT_framebuffer_multisample_blit_scaled", +#endif +#ifdef GL_EXT_framebuffer_object + "GL_EXT_framebuffer_object", +#endif +#ifdef GL_EXT_framebuffer_sRGB + "GL_EXT_framebuffer_sRGB", +#endif +#ifdef GL_EXT_geometry_point_size + "GL_EXT_geometry_point_size", +#endif +#ifdef GL_EXT_geometry_shader + "GL_EXT_geometry_shader", +#endif +#ifdef GL_EXT_geometry_shader4 + "GL_EXT_geometry_shader4", +#endif +#ifdef GL_EXT_gpu_program_parameters + "GL_EXT_gpu_program_parameters", +#endif +#ifdef GL_EXT_gpu_shader4 + "GL_EXT_gpu_shader4", +#endif +#ifdef GL_EXT_gpu_shader5 + "GL_EXT_gpu_shader5", +#endif +#ifdef GL_EXT_histogram + "GL_EXT_histogram", +#endif +#ifdef GL_EXT_index_array_formats + "GL_EXT_index_array_formats", +#endif +#ifdef GL_EXT_index_func + "GL_EXT_index_func", +#endif +#ifdef GL_EXT_index_material + "GL_EXT_index_material", +#endif +#ifdef GL_EXT_index_texture + "GL_EXT_index_texture", +#endif +#ifdef GL_EXT_instanced_arrays + "GL_EXT_instanced_arrays", +#endif +#ifdef GL_EXT_light_texture + "GL_EXT_light_texture", +#endif +#ifdef GL_EXT_map_buffer_range + "GL_EXT_map_buffer_range", +#endif +#ifdef GL_EXT_memory_object + "GL_EXT_memory_object", +#endif +#ifdef GL_EXT_memory_object_fd + "GL_EXT_memory_object_fd", +#endif +#ifdef GL_EXT_memory_object_win32 + "GL_EXT_memory_object_win32", +#endif +#ifdef GL_EXT_misc_attribute + "GL_EXT_misc_attribute", +#endif +#ifdef GL_EXT_multi_draw_arrays + "GL_EXT_multi_draw_arrays", +#endif +#ifdef GL_EXT_multi_draw_indirect + "GL_EXT_multi_draw_indirect", +#endif +#ifdef GL_EXT_multiple_textures + "GL_EXT_multiple_textures", +#endif +#ifdef GL_EXT_multisample + "GL_EXT_multisample", +#endif +#ifdef GL_EXT_multisample_compatibility + "GL_EXT_multisample_compatibility", +#endif +#ifdef GL_EXT_multisampled_render_to_texture + "GL_EXT_multisampled_render_to_texture", +#endif +#ifdef GL_EXT_multisampled_render_to_texture2 + "GL_EXT_multisampled_render_to_texture2", +#endif +#ifdef GL_EXT_multiview_draw_buffers + "GL_EXT_multiview_draw_buffers", +#endif +#ifdef GL_EXT_packed_depth_stencil + "GL_EXT_packed_depth_stencil", +#endif +#ifdef GL_EXT_packed_float + "GL_EXT_packed_float", +#endif +#ifdef GL_EXT_packed_pixels + "GL_EXT_packed_pixels", +#endif +#ifdef GL_EXT_paletted_texture + "GL_EXT_paletted_texture", +#endif +#ifdef GL_EXT_pixel_buffer_object + "GL_EXT_pixel_buffer_object", +#endif +#ifdef GL_EXT_pixel_transform + "GL_EXT_pixel_transform", +#endif +#ifdef GL_EXT_pixel_transform_color_table + "GL_EXT_pixel_transform_color_table", +#endif +#ifdef GL_EXT_point_parameters + "GL_EXT_point_parameters", +#endif +#ifdef GL_EXT_polygon_offset + "GL_EXT_polygon_offset", +#endif +#ifdef GL_EXT_polygon_offset_clamp + "GL_EXT_polygon_offset_clamp", +#endif +#ifdef GL_EXT_post_depth_coverage + "GL_EXT_post_depth_coverage", +#endif +#ifdef GL_EXT_provoking_vertex + "GL_EXT_provoking_vertex", +#endif +#ifdef GL_EXT_pvrtc_sRGB + "GL_EXT_pvrtc_sRGB", +#endif +#ifdef GL_EXT_raster_multisample + "GL_EXT_raster_multisample", +#endif +#ifdef GL_EXT_read_format_bgra + "GL_EXT_read_format_bgra", +#endif +#ifdef GL_EXT_render_snorm + "GL_EXT_render_snorm", +#endif +#ifdef GL_EXT_rescale_normal + "GL_EXT_rescale_normal", +#endif +#ifdef GL_EXT_sRGB + "GL_EXT_sRGB", +#endif +#ifdef GL_EXT_sRGB_write_control + "GL_EXT_sRGB_write_control", +#endif +#ifdef GL_EXT_scene_marker + "GL_EXT_scene_marker", +#endif +#ifdef GL_EXT_secondary_color + "GL_EXT_secondary_color", +#endif +#ifdef GL_EXT_semaphore + "GL_EXT_semaphore", +#endif +#ifdef GL_EXT_semaphore_fd + "GL_EXT_semaphore_fd", +#endif +#ifdef GL_EXT_semaphore_win32 + "GL_EXT_semaphore_win32", +#endif +#ifdef GL_EXT_separate_shader_objects + "GL_EXT_separate_shader_objects", +#endif +#ifdef GL_EXT_separate_specular_color + "GL_EXT_separate_specular_color", +#endif +#ifdef GL_EXT_shader_framebuffer_fetch + "GL_EXT_shader_framebuffer_fetch", +#endif +#ifdef GL_EXT_shader_group_vote + "GL_EXT_shader_group_vote", +#endif +#ifdef GL_EXT_shader_image_load_formatted + "GL_EXT_shader_image_load_formatted", +#endif +#ifdef GL_EXT_shader_image_load_store + "GL_EXT_shader_image_load_store", +#endif +#ifdef GL_EXT_shader_implicit_conversions + "GL_EXT_shader_implicit_conversions", +#endif +#ifdef GL_EXT_shader_integer_mix + "GL_EXT_shader_integer_mix", +#endif +#ifdef GL_EXT_shader_io_blocks + "GL_EXT_shader_io_blocks", +#endif +#ifdef GL_EXT_shader_non_constant_global_initializers + "GL_EXT_shader_non_constant_global_initializers", +#endif +#ifdef GL_EXT_shader_pixel_local_storage + "GL_EXT_shader_pixel_local_storage", +#endif +#ifdef GL_EXT_shader_pixel_local_storage2 + "GL_EXT_shader_pixel_local_storage2", +#endif +#ifdef GL_EXT_shader_texture_lod + "GL_EXT_shader_texture_lod", +#endif +#ifdef GL_EXT_shadow_funcs + "GL_EXT_shadow_funcs", +#endif +#ifdef GL_EXT_shadow_samplers + "GL_EXT_shadow_samplers", +#endif +#ifdef GL_EXT_shared_texture_palette + "GL_EXT_shared_texture_palette", +#endif +#ifdef GL_EXT_sparse_texture + "GL_EXT_sparse_texture", +#endif +#ifdef GL_EXT_sparse_texture2 + "GL_EXT_sparse_texture2", +#endif +#ifdef GL_EXT_stencil_clear_tag + "GL_EXT_stencil_clear_tag", +#endif +#ifdef GL_EXT_stencil_two_side + "GL_EXT_stencil_two_side", +#endif +#ifdef GL_EXT_stencil_wrap + "GL_EXT_stencil_wrap", +#endif +#ifdef GL_EXT_subtexture + "GL_EXT_subtexture", +#endif +#ifdef GL_EXT_texture + "GL_EXT_texture", +#endif +#ifdef GL_EXT_texture3D + "GL_EXT_texture3D", +#endif +#ifdef GL_EXT_texture_array + "GL_EXT_texture_array", +#endif +#ifdef GL_EXT_texture_buffer_object + "GL_EXT_texture_buffer_object", +#endif +#ifdef GL_EXT_texture_compression_astc_decode_mode + "GL_EXT_texture_compression_astc_decode_mode", +#endif +#ifdef GL_EXT_texture_compression_astc_decode_mode_rgb9e5 + "GL_EXT_texture_compression_astc_decode_mode_rgb9e5", +#endif +#ifdef GL_EXT_texture_compression_bptc + "GL_EXT_texture_compression_bptc", +#endif +#ifdef GL_EXT_texture_compression_dxt1 + "GL_EXT_texture_compression_dxt1", +#endif +#ifdef GL_EXT_texture_compression_latc + "GL_EXT_texture_compression_latc", +#endif +#ifdef GL_EXT_texture_compression_rgtc + "GL_EXT_texture_compression_rgtc", +#endif +#ifdef GL_EXT_texture_compression_s3tc + "GL_EXT_texture_compression_s3tc", +#endif +#ifdef GL_EXT_texture_cube_map + "GL_EXT_texture_cube_map", +#endif +#ifdef GL_EXT_texture_cube_map_array + "GL_EXT_texture_cube_map_array", +#endif +#ifdef GL_EXT_texture_edge_clamp + "GL_EXT_texture_edge_clamp", +#endif +#ifdef GL_EXT_texture_env + "GL_EXT_texture_env", +#endif +#ifdef GL_EXT_texture_env_add + "GL_EXT_texture_env_add", +#endif +#ifdef GL_EXT_texture_env_combine + "GL_EXT_texture_env_combine", +#endif +#ifdef GL_EXT_texture_env_dot3 + "GL_EXT_texture_env_dot3", +#endif +#ifdef GL_EXT_texture_filter_anisotropic + "GL_EXT_texture_filter_anisotropic", +#endif +#ifdef GL_EXT_texture_filter_minmax + "GL_EXT_texture_filter_minmax", +#endif +#ifdef GL_EXT_texture_format_BGRA8888 + "GL_EXT_texture_format_BGRA8888", +#endif +#ifdef GL_EXT_texture_integer + "GL_EXT_texture_integer", +#endif +#ifdef GL_EXT_texture_lod_bias + "GL_EXT_texture_lod_bias", +#endif +#ifdef GL_EXT_texture_mirror_clamp + "GL_EXT_texture_mirror_clamp", +#endif +#ifdef GL_EXT_texture_norm16 + "GL_EXT_texture_norm16", +#endif +#ifdef GL_EXT_texture_object + "GL_EXT_texture_object", +#endif +#ifdef GL_EXT_texture_perturb_normal + "GL_EXT_texture_perturb_normal", +#endif +#ifdef GL_EXT_texture_rectangle + "GL_EXT_texture_rectangle", +#endif +#ifdef GL_EXT_texture_rg + "GL_EXT_texture_rg", +#endif +#ifdef GL_EXT_texture_sRGB + "GL_EXT_texture_sRGB", +#endif +#ifdef GL_EXT_texture_sRGB_R8 + "GL_EXT_texture_sRGB_R8", +#endif +#ifdef GL_EXT_texture_sRGB_RG8 + "GL_EXT_texture_sRGB_RG8", +#endif +#ifdef GL_EXT_texture_sRGB_decode + "GL_EXT_texture_sRGB_decode", +#endif +#ifdef GL_EXT_texture_shared_exponent + "GL_EXT_texture_shared_exponent", +#endif +#ifdef GL_EXT_texture_snorm + "GL_EXT_texture_snorm", +#endif +#ifdef GL_EXT_texture_storage + "GL_EXT_texture_storage", +#endif +#ifdef GL_EXT_texture_swizzle + "GL_EXT_texture_swizzle", +#endif +#ifdef GL_EXT_texture_type_2_10_10_10_REV + "GL_EXT_texture_type_2_10_10_10_REV", +#endif +#ifdef GL_EXT_texture_view + "GL_EXT_texture_view", +#endif +#ifdef GL_EXT_timer_query + "GL_EXT_timer_query", +#endif +#ifdef GL_EXT_transform_feedback + "GL_EXT_transform_feedback", +#endif +#ifdef GL_EXT_unpack_subimage + "GL_EXT_unpack_subimage", +#endif +#ifdef GL_EXT_vertex_array + "GL_EXT_vertex_array", +#endif +#ifdef GL_EXT_vertex_array_bgra + "GL_EXT_vertex_array_bgra", +#endif +#ifdef GL_EXT_vertex_array_setXXX + "GL_EXT_vertex_array_setXXX", +#endif +#ifdef GL_EXT_vertex_attrib_64bit + "GL_EXT_vertex_attrib_64bit", +#endif +#ifdef GL_EXT_vertex_shader + "GL_EXT_vertex_shader", +#endif +#ifdef GL_EXT_vertex_weighting + "GL_EXT_vertex_weighting", +#endif +#ifdef GL_EXT_win32_keyed_mutex + "GL_EXT_win32_keyed_mutex", +#endif +#ifdef GL_EXT_window_rectangles + "GL_EXT_window_rectangles", +#endif +#ifdef GL_EXT_x11_sync_object + "GL_EXT_x11_sync_object", +#endif +#ifdef GL_GREMEDY_frame_terminator + "GL_GREMEDY_frame_terminator", +#endif +#ifdef GL_GREMEDY_string_marker + "GL_GREMEDY_string_marker", +#endif +#ifdef GL_HP_convolution_border_modes + "GL_HP_convolution_border_modes", +#endif +#ifdef GL_HP_image_transform + "GL_HP_image_transform", +#endif +#ifdef GL_HP_occlusion_test + "GL_HP_occlusion_test", +#endif +#ifdef GL_HP_texture_lighting + "GL_HP_texture_lighting", +#endif +#ifdef GL_IBM_cull_vertex + "GL_IBM_cull_vertex", +#endif +#ifdef GL_IBM_multimode_draw_arrays + "GL_IBM_multimode_draw_arrays", +#endif +#ifdef GL_IBM_rasterpos_clip + "GL_IBM_rasterpos_clip", +#endif +#ifdef GL_IBM_static_data + "GL_IBM_static_data", +#endif +#ifdef GL_IBM_texture_mirrored_repeat + "GL_IBM_texture_mirrored_repeat", +#endif +#ifdef GL_IBM_vertex_array_lists + "GL_IBM_vertex_array_lists", +#endif +#ifdef GL_INGR_color_clamp + "GL_INGR_color_clamp", +#endif +#ifdef GL_INGR_interlace_read + "GL_INGR_interlace_read", +#endif +#ifdef GL_INTEL_conservative_rasterization + "GL_INTEL_conservative_rasterization", +#endif +#ifdef GL_INTEL_fragment_shader_ordering + "GL_INTEL_fragment_shader_ordering", +#endif +#ifdef GL_INTEL_framebuffer_CMAA + "GL_INTEL_framebuffer_CMAA", +#endif +#ifdef GL_INTEL_map_texture + "GL_INTEL_map_texture", +#endif +#ifdef GL_INTEL_parallel_arrays + "GL_INTEL_parallel_arrays", +#endif +#ifdef GL_INTEL_performance_query + "GL_INTEL_performance_query", +#endif +#ifdef GL_INTEL_texture_scissor + "GL_INTEL_texture_scissor", +#endif +#ifdef GL_KHR_blend_equation_advanced + "GL_KHR_blend_equation_advanced", +#endif +#ifdef GL_KHR_blend_equation_advanced_coherent + "GL_KHR_blend_equation_advanced_coherent", +#endif +#ifdef GL_KHR_context_flush_control + "GL_KHR_context_flush_control", +#endif +#ifdef GL_KHR_debug + "GL_KHR_debug", +#endif +#ifdef GL_KHR_no_error + "GL_KHR_no_error", +#endif +#ifdef GL_KHR_parallel_shader_compile + "GL_KHR_parallel_shader_compile", +#endif +#ifdef GL_KHR_robust_buffer_access_behavior + "GL_KHR_robust_buffer_access_behavior", +#endif +#ifdef GL_KHR_robustness + "GL_KHR_robustness", +#endif +#ifdef GL_KHR_texture_compression_astc_hdr + "GL_KHR_texture_compression_astc_hdr", +#endif +#ifdef GL_KHR_texture_compression_astc_ldr + "GL_KHR_texture_compression_astc_ldr", +#endif +#ifdef GL_KHR_texture_compression_astc_sliced_3d + "GL_KHR_texture_compression_astc_sliced_3d", +#endif +#ifdef GL_KTX_buffer_region + "GL_KTX_buffer_region", +#endif +#ifdef GL_MESAX_texture_stack + "GL_MESAX_texture_stack", +#endif +#ifdef GL_MESA_pack_invert + "GL_MESA_pack_invert", +#endif +#ifdef GL_MESA_resize_buffers + "GL_MESA_resize_buffers", +#endif +#ifdef GL_MESA_shader_integer_functions + "GL_MESA_shader_integer_functions", +#endif +#ifdef GL_MESA_window_pos + "GL_MESA_window_pos", +#endif +#ifdef GL_MESA_ycbcr_texture + "GL_MESA_ycbcr_texture", +#endif +#ifdef GL_NVX_blend_equation_advanced_multi_draw_buffers + "GL_NVX_blend_equation_advanced_multi_draw_buffers", +#endif +#ifdef GL_NVX_conditional_render + "GL_NVX_conditional_render", +#endif +#ifdef GL_NVX_gpu_memory_info + "GL_NVX_gpu_memory_info", +#endif +#ifdef GL_NVX_linked_gpu_multicast + "GL_NVX_linked_gpu_multicast", +#endif +#ifdef GL_NV_3dvision_settings + "GL_NV_3dvision_settings", +#endif +#ifdef GL_NV_EGL_stream_consumer_external + "GL_NV_EGL_stream_consumer_external", +#endif +#ifdef GL_NV_alpha_to_coverage_dither_control + "GL_NV_alpha_to_coverage_dither_control", +#endif +#ifdef GL_NV_bgr + "GL_NV_bgr", +#endif +#ifdef GL_NV_bindless_multi_draw_indirect + "GL_NV_bindless_multi_draw_indirect", +#endif +#ifdef GL_NV_bindless_multi_draw_indirect_count + "GL_NV_bindless_multi_draw_indirect_count", +#endif +#ifdef GL_NV_bindless_texture + "GL_NV_bindless_texture", +#endif +#ifdef GL_NV_blend_equation_advanced + "GL_NV_blend_equation_advanced", +#endif +#ifdef GL_NV_blend_equation_advanced_coherent + "GL_NV_blend_equation_advanced_coherent", +#endif +#ifdef GL_NV_blend_minmax_factor + "GL_NV_blend_minmax_factor", +#endif +#ifdef GL_NV_blend_square + "GL_NV_blend_square", +#endif +#ifdef GL_NV_clip_space_w_scaling + "GL_NV_clip_space_w_scaling", +#endif +#ifdef GL_NV_command_list + "GL_NV_command_list", +#endif +#ifdef GL_NV_compute_program5 + "GL_NV_compute_program5", +#endif +#ifdef GL_NV_conditional_render + "GL_NV_conditional_render", +#endif +#ifdef GL_NV_conservative_raster + "GL_NV_conservative_raster", +#endif +#ifdef GL_NV_conservative_raster_dilate + "GL_NV_conservative_raster_dilate", +#endif +#ifdef GL_NV_conservative_raster_pre_snap_triangles + "GL_NV_conservative_raster_pre_snap_triangles", +#endif +#ifdef GL_NV_copy_buffer + "GL_NV_copy_buffer", +#endif +#ifdef GL_NV_copy_depth_to_color + "GL_NV_copy_depth_to_color", +#endif +#ifdef GL_NV_copy_image + "GL_NV_copy_image", +#endif +#ifdef GL_NV_deep_texture3D + "GL_NV_deep_texture3D", +#endif +#ifdef GL_NV_depth_buffer_float + "GL_NV_depth_buffer_float", +#endif +#ifdef GL_NV_depth_clamp + "GL_NV_depth_clamp", +#endif +#ifdef GL_NV_depth_range_unclamped + "GL_NV_depth_range_unclamped", +#endif +#ifdef GL_NV_draw_buffers + "GL_NV_draw_buffers", +#endif +#ifdef GL_NV_draw_instanced + "GL_NV_draw_instanced", +#endif +#ifdef GL_NV_draw_texture + "GL_NV_draw_texture", +#endif +#ifdef GL_NV_draw_vulkan_image + "GL_NV_draw_vulkan_image", +#endif +#ifdef GL_NV_evaluators + "GL_NV_evaluators", +#endif +#ifdef GL_NV_explicit_attrib_location + "GL_NV_explicit_attrib_location", +#endif +#ifdef GL_NV_explicit_multisample + "GL_NV_explicit_multisample", +#endif +#ifdef GL_NV_fbo_color_attachments + "GL_NV_fbo_color_attachments", +#endif +#ifdef GL_NV_fence + "GL_NV_fence", +#endif +#ifdef GL_NV_fill_rectangle + "GL_NV_fill_rectangle", +#endif +#ifdef GL_NV_float_buffer + "GL_NV_float_buffer", +#endif +#ifdef GL_NV_fog_distance + "GL_NV_fog_distance", +#endif +#ifdef GL_NV_fragment_coverage_to_color + "GL_NV_fragment_coverage_to_color", +#endif +#ifdef GL_NV_fragment_program + "GL_NV_fragment_program", +#endif +#ifdef GL_NV_fragment_program2 + "GL_NV_fragment_program2", +#endif +#ifdef GL_NV_fragment_program4 + "GL_NV_fragment_program4", +#endif +#ifdef GL_NV_fragment_program_option + "GL_NV_fragment_program_option", +#endif +#ifdef GL_NV_fragment_shader_interlock + "GL_NV_fragment_shader_interlock", +#endif +#ifdef GL_NV_framebuffer_blit + "GL_NV_framebuffer_blit", +#endif +#ifdef GL_NV_framebuffer_mixed_samples + "GL_NV_framebuffer_mixed_samples", +#endif +#ifdef GL_NV_framebuffer_multisample + "GL_NV_framebuffer_multisample", +#endif +#ifdef GL_NV_framebuffer_multisample_coverage + "GL_NV_framebuffer_multisample_coverage", +#endif +#ifdef GL_NV_generate_mipmap_sRGB + "GL_NV_generate_mipmap_sRGB", +#endif +#ifdef GL_NV_geometry_program4 + "GL_NV_geometry_program4", +#endif +#ifdef GL_NV_geometry_shader4 + "GL_NV_geometry_shader4", +#endif +#ifdef GL_NV_geometry_shader_passthrough + "GL_NV_geometry_shader_passthrough", +#endif +#ifdef GL_NV_gpu_multicast + "GL_NV_gpu_multicast", +#endif +#ifdef GL_NV_gpu_program4 + "GL_NV_gpu_program4", +#endif +#ifdef GL_NV_gpu_program5 + "GL_NV_gpu_program5", +#endif +#ifdef GL_NV_gpu_program5_mem_extended + "GL_NV_gpu_program5_mem_extended", +#endif +#ifdef GL_NV_gpu_program_fp64 + "GL_NV_gpu_program_fp64", +#endif +#ifdef GL_NV_gpu_shader5 + "GL_NV_gpu_shader5", +#endif +#ifdef GL_NV_half_float + "GL_NV_half_float", +#endif +#ifdef GL_NV_image_formats + "GL_NV_image_formats", +#endif +#ifdef GL_NV_instanced_arrays + "GL_NV_instanced_arrays", +#endif +#ifdef GL_NV_internalformat_sample_query + "GL_NV_internalformat_sample_query", +#endif +#ifdef GL_NV_light_max_exponent + "GL_NV_light_max_exponent", +#endif +#ifdef GL_NV_multisample_coverage + "GL_NV_multisample_coverage", +#endif +#ifdef GL_NV_multisample_filter_hint + "GL_NV_multisample_filter_hint", +#endif +#ifdef GL_NV_non_square_matrices + "GL_NV_non_square_matrices", +#endif +#ifdef GL_NV_occlusion_query + "GL_NV_occlusion_query", +#endif +#ifdef GL_NV_pack_subimage + "GL_NV_pack_subimage", +#endif +#ifdef GL_NV_packed_depth_stencil + "GL_NV_packed_depth_stencil", +#endif +#ifdef GL_NV_packed_float + "GL_NV_packed_float", +#endif +#ifdef GL_NV_packed_float_linear + "GL_NV_packed_float_linear", +#endif +#ifdef GL_NV_parameter_buffer_object + "GL_NV_parameter_buffer_object", +#endif +#ifdef GL_NV_parameter_buffer_object2 + "GL_NV_parameter_buffer_object2", +#endif +#ifdef GL_NV_path_rendering + "GL_NV_path_rendering", +#endif +#ifdef GL_NV_path_rendering_shared_edge + "GL_NV_path_rendering_shared_edge", +#endif +#ifdef GL_NV_pixel_buffer_object + "GL_NV_pixel_buffer_object", +#endif +#ifdef GL_NV_pixel_data_range + "GL_NV_pixel_data_range", +#endif +#ifdef GL_NV_platform_binary + "GL_NV_platform_binary", +#endif +#ifdef GL_NV_point_sprite + "GL_NV_point_sprite", +#endif +#ifdef GL_NV_polygon_mode + "GL_NV_polygon_mode", +#endif +#ifdef GL_NV_present_video + "GL_NV_present_video", +#endif +#ifdef GL_NV_primitive_restart + "GL_NV_primitive_restart", +#endif +#ifdef GL_NV_read_depth + "GL_NV_read_depth", +#endif +#ifdef GL_NV_read_depth_stencil + "GL_NV_read_depth_stencil", +#endif +#ifdef GL_NV_read_stencil + "GL_NV_read_stencil", +#endif +#ifdef GL_NV_register_combiners + "GL_NV_register_combiners", +#endif +#ifdef GL_NV_register_combiners2 + "GL_NV_register_combiners2", +#endif +#ifdef GL_NV_robustness_video_memory_purge + "GL_NV_robustness_video_memory_purge", +#endif +#ifdef GL_NV_sRGB_formats + "GL_NV_sRGB_formats", +#endif +#ifdef GL_NV_sample_locations + "GL_NV_sample_locations", +#endif +#ifdef GL_NV_sample_mask_override_coverage + "GL_NV_sample_mask_override_coverage", +#endif +#ifdef GL_NV_shader_atomic_counters + "GL_NV_shader_atomic_counters", +#endif +#ifdef GL_NV_shader_atomic_float + "GL_NV_shader_atomic_float", +#endif +#ifdef GL_NV_shader_atomic_float64 + "GL_NV_shader_atomic_float64", +#endif +#ifdef GL_NV_shader_atomic_fp16_vector + "GL_NV_shader_atomic_fp16_vector", +#endif +#ifdef GL_NV_shader_atomic_int64 + "GL_NV_shader_atomic_int64", +#endif +#ifdef GL_NV_shader_buffer_load + "GL_NV_shader_buffer_load", +#endif +#ifdef GL_NV_shader_noperspective_interpolation + "GL_NV_shader_noperspective_interpolation", +#endif +#ifdef GL_NV_shader_storage_buffer_object + "GL_NV_shader_storage_buffer_object", +#endif +#ifdef GL_NV_shader_thread_group + "GL_NV_shader_thread_group", +#endif +#ifdef GL_NV_shader_thread_shuffle + "GL_NV_shader_thread_shuffle", +#endif +#ifdef GL_NV_shadow_samplers_array + "GL_NV_shadow_samplers_array", +#endif +#ifdef GL_NV_shadow_samplers_cube + "GL_NV_shadow_samplers_cube", +#endif +#ifdef GL_NV_stereo_view_rendering + "GL_NV_stereo_view_rendering", +#endif +#ifdef GL_NV_tessellation_program5 + "GL_NV_tessellation_program5", +#endif +#ifdef GL_NV_texgen_emboss + "GL_NV_texgen_emboss", +#endif +#ifdef GL_NV_texgen_reflection + "GL_NV_texgen_reflection", +#endif +#ifdef GL_NV_texture_array + "GL_NV_texture_array", +#endif +#ifdef GL_NV_texture_barrier + "GL_NV_texture_barrier", +#endif +#ifdef GL_NV_texture_border_clamp + "GL_NV_texture_border_clamp", +#endif +#ifdef GL_NV_texture_compression_latc + "GL_NV_texture_compression_latc", +#endif +#ifdef GL_NV_texture_compression_s3tc + "GL_NV_texture_compression_s3tc", +#endif +#ifdef GL_NV_texture_compression_s3tc_update + "GL_NV_texture_compression_s3tc_update", +#endif +#ifdef GL_NV_texture_compression_vtc + "GL_NV_texture_compression_vtc", +#endif +#ifdef GL_NV_texture_env_combine4 + "GL_NV_texture_env_combine4", +#endif +#ifdef GL_NV_texture_expand_normal + "GL_NV_texture_expand_normal", +#endif +#ifdef GL_NV_texture_multisample + "GL_NV_texture_multisample", +#endif +#ifdef GL_NV_texture_npot_2D_mipmap + "GL_NV_texture_npot_2D_mipmap", +#endif +#ifdef GL_NV_texture_rectangle + "GL_NV_texture_rectangle", +#endif +#ifdef GL_NV_texture_rectangle_compressed + "GL_NV_texture_rectangle_compressed", +#endif +#ifdef GL_NV_texture_shader + "GL_NV_texture_shader", +#endif +#ifdef GL_NV_texture_shader2 + "GL_NV_texture_shader2", +#endif +#ifdef GL_NV_texture_shader3 + "GL_NV_texture_shader3", +#endif +#ifdef GL_NV_transform_feedback + "GL_NV_transform_feedback", +#endif +#ifdef GL_NV_transform_feedback2 + "GL_NV_transform_feedback2", +#endif +#ifdef GL_NV_uniform_buffer_unified_memory + "GL_NV_uniform_buffer_unified_memory", +#endif +#ifdef GL_NV_vdpau_interop + "GL_NV_vdpau_interop", +#endif +#ifdef GL_NV_vertex_array_range + "GL_NV_vertex_array_range", +#endif +#ifdef GL_NV_vertex_array_range2 + "GL_NV_vertex_array_range2", +#endif +#ifdef GL_NV_vertex_attrib_integer_64bit + "GL_NV_vertex_attrib_integer_64bit", +#endif +#ifdef GL_NV_vertex_buffer_unified_memory + "GL_NV_vertex_buffer_unified_memory", +#endif +#ifdef GL_NV_vertex_program + "GL_NV_vertex_program", +#endif +#ifdef GL_NV_vertex_program1_1 + "GL_NV_vertex_program1_1", +#endif +#ifdef GL_NV_vertex_program2 + "GL_NV_vertex_program2", +#endif +#ifdef GL_NV_vertex_program2_option + "GL_NV_vertex_program2_option", +#endif +#ifdef GL_NV_vertex_program3 + "GL_NV_vertex_program3", +#endif +#ifdef GL_NV_vertex_program4 + "GL_NV_vertex_program4", +#endif +#ifdef GL_NV_video_capture + "GL_NV_video_capture", +#endif +#ifdef GL_NV_viewport_array + "GL_NV_viewport_array", +#endif +#ifdef GL_NV_viewport_array2 + "GL_NV_viewport_array2", +#endif +#ifdef GL_NV_viewport_swizzle + "GL_NV_viewport_swizzle", +#endif +#ifdef GL_OES_byte_coordinates + "GL_OES_byte_coordinates", +#endif +#ifdef GL_OML_interlace + "GL_OML_interlace", +#endif +#ifdef GL_OML_resample + "GL_OML_resample", +#endif +#ifdef GL_OML_subsample + "GL_OML_subsample", +#endif +#ifdef GL_OVR_multiview + "GL_OVR_multiview", +#endif +#ifdef GL_OVR_multiview2 + "GL_OVR_multiview2", +#endif +#ifdef GL_OVR_multiview_multisampled_render_to_texture + "GL_OVR_multiview_multisampled_render_to_texture", +#endif +#ifdef GL_PGI_misc_hints + "GL_PGI_misc_hints", +#endif +#ifdef GL_PGI_vertex_hints + "GL_PGI_vertex_hints", +#endif +#ifdef GL_QCOM_alpha_test + "GL_QCOM_alpha_test", +#endif +#ifdef GL_QCOM_binning_control + "GL_QCOM_binning_control", +#endif +#ifdef GL_QCOM_driver_control + "GL_QCOM_driver_control", +#endif +#ifdef GL_QCOM_extended_get + "GL_QCOM_extended_get", +#endif +#ifdef GL_QCOM_extended_get2 + "GL_QCOM_extended_get2", +#endif +#ifdef GL_QCOM_framebuffer_foveated + "GL_QCOM_framebuffer_foveated", +#endif +#ifdef GL_QCOM_perfmon_global_mode + "GL_QCOM_perfmon_global_mode", +#endif +#ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent + "GL_QCOM_shader_framebuffer_fetch_noncoherent", +#endif +#ifdef GL_QCOM_tiled_rendering + "GL_QCOM_tiled_rendering", +#endif +#ifdef GL_QCOM_writeonly_rendering + "GL_QCOM_writeonly_rendering", +#endif +#ifdef GL_REGAL_ES1_0_compatibility + "GL_REGAL_ES1_0_compatibility", +#endif +#ifdef GL_REGAL_ES1_1_compatibility + "GL_REGAL_ES1_1_compatibility", +#endif +#ifdef GL_REGAL_enable + "GL_REGAL_enable", +#endif +#ifdef GL_REGAL_error_string + "GL_REGAL_error_string", +#endif +#ifdef GL_REGAL_extension_query + "GL_REGAL_extension_query", +#endif +#ifdef GL_REGAL_log + "GL_REGAL_log", +#endif +#ifdef GL_REGAL_proc_address + "GL_REGAL_proc_address", +#endif +#ifdef GL_REND_screen_coordinates + "GL_REND_screen_coordinates", +#endif +#ifdef GL_S3_s3tc + "GL_S3_s3tc", +#endif +#ifdef GL_SGIS_clip_band_hint + "GL_SGIS_clip_band_hint", +#endif +#ifdef GL_SGIS_color_range + "GL_SGIS_color_range", +#endif +#ifdef GL_SGIS_detail_texture + "GL_SGIS_detail_texture", +#endif +#ifdef GL_SGIS_fog_function + "GL_SGIS_fog_function", +#endif +#ifdef GL_SGIS_generate_mipmap + "GL_SGIS_generate_mipmap", +#endif +#ifdef GL_SGIS_line_texgen + "GL_SGIS_line_texgen", +#endif +#ifdef GL_SGIS_multisample + "GL_SGIS_multisample", +#endif +#ifdef GL_SGIS_multitexture + "GL_SGIS_multitexture", +#endif +#ifdef GL_SGIS_pixel_texture + "GL_SGIS_pixel_texture", +#endif +#ifdef GL_SGIS_point_line_texgen + "GL_SGIS_point_line_texgen", +#endif +#ifdef GL_SGIS_shared_multisample + "GL_SGIS_shared_multisample", +#endif +#ifdef GL_SGIS_sharpen_texture + "GL_SGIS_sharpen_texture", +#endif +#ifdef GL_SGIS_texture4D + "GL_SGIS_texture4D", +#endif +#ifdef GL_SGIS_texture_border_clamp + "GL_SGIS_texture_border_clamp", +#endif +#ifdef GL_SGIS_texture_edge_clamp + "GL_SGIS_texture_edge_clamp", +#endif +#ifdef GL_SGIS_texture_filter4 + "GL_SGIS_texture_filter4", +#endif +#ifdef GL_SGIS_texture_lod + "GL_SGIS_texture_lod", +#endif +#ifdef GL_SGIS_texture_select + "GL_SGIS_texture_select", +#endif +#ifdef GL_SGIX_async + "GL_SGIX_async", +#endif +#ifdef GL_SGIX_async_histogram + "GL_SGIX_async_histogram", +#endif +#ifdef GL_SGIX_async_pixel + "GL_SGIX_async_pixel", +#endif +#ifdef GL_SGIX_bali_g_instruments + "GL_SGIX_bali_g_instruments", +#endif +#ifdef GL_SGIX_bali_r_instruments + "GL_SGIX_bali_r_instruments", +#endif +#ifdef GL_SGIX_bali_timer_instruments + "GL_SGIX_bali_timer_instruments", +#endif +#ifdef GL_SGIX_blend_alpha_minmax + "GL_SGIX_blend_alpha_minmax", +#endif +#ifdef GL_SGIX_blend_cadd + "GL_SGIX_blend_cadd", +#endif +#ifdef GL_SGIX_blend_cmultiply + "GL_SGIX_blend_cmultiply", +#endif +#ifdef GL_SGIX_calligraphic_fragment + "GL_SGIX_calligraphic_fragment", +#endif +#ifdef GL_SGIX_clipmap + "GL_SGIX_clipmap", +#endif +#ifdef GL_SGIX_color_matrix_accuracy + "GL_SGIX_color_matrix_accuracy", +#endif +#ifdef GL_SGIX_color_table_index_mode + "GL_SGIX_color_table_index_mode", +#endif +#ifdef GL_SGIX_complex_polar + "GL_SGIX_complex_polar", +#endif +#ifdef GL_SGIX_convolution_accuracy + "GL_SGIX_convolution_accuracy", +#endif +#ifdef GL_SGIX_cube_map + "GL_SGIX_cube_map", +#endif +#ifdef GL_SGIX_cylinder_texgen + "GL_SGIX_cylinder_texgen", +#endif +#ifdef GL_SGIX_datapipe + "GL_SGIX_datapipe", +#endif +#ifdef GL_SGIX_decimation + "GL_SGIX_decimation", +#endif +#ifdef GL_SGIX_depth_pass_instrument + "GL_SGIX_depth_pass_instrument", +#endif +#ifdef GL_SGIX_depth_texture + "GL_SGIX_depth_texture", +#endif +#ifdef GL_SGIX_dvc + "GL_SGIX_dvc", +#endif +#ifdef GL_SGIX_flush_raster + "GL_SGIX_flush_raster", +#endif +#ifdef GL_SGIX_fog_blend + "GL_SGIX_fog_blend", +#endif +#ifdef GL_SGIX_fog_factor_to_alpha + "GL_SGIX_fog_factor_to_alpha", +#endif +#ifdef GL_SGIX_fog_layers + "GL_SGIX_fog_layers", +#endif +#ifdef GL_SGIX_fog_offset + "GL_SGIX_fog_offset", +#endif +#ifdef GL_SGIX_fog_patchy + "GL_SGIX_fog_patchy", +#endif +#ifdef GL_SGIX_fog_scale + "GL_SGIX_fog_scale", +#endif +#ifdef GL_SGIX_fog_texture + "GL_SGIX_fog_texture", +#endif +#ifdef GL_SGIX_fragment_lighting_space + "GL_SGIX_fragment_lighting_space", +#endif +#ifdef GL_SGIX_fragment_specular_lighting + "GL_SGIX_fragment_specular_lighting", +#endif +#ifdef GL_SGIX_fragments_instrument + "GL_SGIX_fragments_instrument", +#endif +#ifdef GL_SGIX_framezoom + "GL_SGIX_framezoom", +#endif +#ifdef GL_SGIX_icc_texture + "GL_SGIX_icc_texture", +#endif +#ifdef GL_SGIX_igloo_interface + "GL_SGIX_igloo_interface", +#endif +#ifdef GL_SGIX_image_compression + "GL_SGIX_image_compression", +#endif +#ifdef GL_SGIX_impact_pixel_texture + "GL_SGIX_impact_pixel_texture", +#endif +#ifdef GL_SGIX_instrument_error + "GL_SGIX_instrument_error", +#endif +#ifdef GL_SGIX_interlace + "GL_SGIX_interlace", +#endif +#ifdef GL_SGIX_ir_instrument1 + "GL_SGIX_ir_instrument1", +#endif +#ifdef GL_SGIX_line_quality_hint + "GL_SGIX_line_quality_hint", +#endif +#ifdef GL_SGIX_list_priority + "GL_SGIX_list_priority", +#endif +#ifdef GL_SGIX_mpeg1 + "GL_SGIX_mpeg1", +#endif +#ifdef GL_SGIX_mpeg2 + "GL_SGIX_mpeg2", +#endif +#ifdef GL_SGIX_nonlinear_lighting_pervertex + "GL_SGIX_nonlinear_lighting_pervertex", +#endif +#ifdef GL_SGIX_nurbs_eval + "GL_SGIX_nurbs_eval", +#endif +#ifdef GL_SGIX_occlusion_instrument + "GL_SGIX_occlusion_instrument", +#endif +#ifdef GL_SGIX_packed_6bytes + "GL_SGIX_packed_6bytes", +#endif +#ifdef GL_SGIX_pixel_texture + "GL_SGIX_pixel_texture", +#endif +#ifdef GL_SGIX_pixel_texture_bits + "GL_SGIX_pixel_texture_bits", +#endif +#ifdef GL_SGIX_pixel_texture_lod + "GL_SGIX_pixel_texture_lod", +#endif +#ifdef GL_SGIX_pixel_tiles + "GL_SGIX_pixel_tiles", +#endif +#ifdef GL_SGIX_polynomial_ffd + "GL_SGIX_polynomial_ffd", +#endif +#ifdef GL_SGIX_quad_mesh + "GL_SGIX_quad_mesh", +#endif +#ifdef GL_SGIX_reference_plane + "GL_SGIX_reference_plane", +#endif +#ifdef GL_SGIX_resample + "GL_SGIX_resample", +#endif +#ifdef GL_SGIX_scalebias_hint + "GL_SGIX_scalebias_hint", +#endif +#ifdef GL_SGIX_shadow + "GL_SGIX_shadow", +#endif +#ifdef GL_SGIX_shadow_ambient + "GL_SGIX_shadow_ambient", +#endif +#ifdef GL_SGIX_slim + "GL_SGIX_slim", +#endif +#ifdef GL_SGIX_spotlight_cutoff + "GL_SGIX_spotlight_cutoff", +#endif +#ifdef GL_SGIX_sprite + "GL_SGIX_sprite", +#endif +#ifdef GL_SGIX_subdiv_patch + "GL_SGIX_subdiv_patch", +#endif +#ifdef GL_SGIX_subsample + "GL_SGIX_subsample", +#endif +#ifdef GL_SGIX_tag_sample_buffer + "GL_SGIX_tag_sample_buffer", +#endif +#ifdef GL_SGIX_texture_add_env + "GL_SGIX_texture_add_env", +#endif +#ifdef GL_SGIX_texture_coordinate_clamp + "GL_SGIX_texture_coordinate_clamp", +#endif +#ifdef GL_SGIX_texture_lod_bias + "GL_SGIX_texture_lod_bias", +#endif +#ifdef GL_SGIX_texture_mipmap_anisotropic + "GL_SGIX_texture_mipmap_anisotropic", +#endif +#ifdef GL_SGIX_texture_multi_buffer + "GL_SGIX_texture_multi_buffer", +#endif +#ifdef GL_SGIX_texture_phase + "GL_SGIX_texture_phase", +#endif +#ifdef GL_SGIX_texture_range + "GL_SGIX_texture_range", +#endif +#ifdef GL_SGIX_texture_scale_bias + "GL_SGIX_texture_scale_bias", +#endif +#ifdef GL_SGIX_texture_supersample + "GL_SGIX_texture_supersample", +#endif +#ifdef GL_SGIX_vector_ops + "GL_SGIX_vector_ops", +#endif +#ifdef GL_SGIX_vertex_array_object + "GL_SGIX_vertex_array_object", +#endif +#ifdef GL_SGIX_vertex_preclip + "GL_SGIX_vertex_preclip", +#endif +#ifdef GL_SGIX_vertex_preclip_hint + "GL_SGIX_vertex_preclip_hint", +#endif +#ifdef GL_SGIX_ycrcb + "GL_SGIX_ycrcb", +#endif +#ifdef GL_SGIX_ycrcb_subsample + "GL_SGIX_ycrcb_subsample", +#endif +#ifdef GL_SGIX_ycrcba + "GL_SGIX_ycrcba", +#endif +#ifdef GL_SGI_color_matrix + "GL_SGI_color_matrix", +#endif +#ifdef GL_SGI_color_table + "GL_SGI_color_table", +#endif +#ifdef GL_SGI_complex + "GL_SGI_complex", +#endif +#ifdef GL_SGI_complex_type + "GL_SGI_complex_type", +#endif +#ifdef GL_SGI_fft + "GL_SGI_fft", +#endif +#ifdef GL_SGI_texture_color_table + "GL_SGI_texture_color_table", +#endif +#ifdef GL_SUNX_constant_data + "GL_SUNX_constant_data", +#endif +#ifdef GL_SUN_convolution_border_modes + "GL_SUN_convolution_border_modes", +#endif +#ifdef GL_SUN_global_alpha + "GL_SUN_global_alpha", +#endif +#ifdef GL_SUN_mesh_array + "GL_SUN_mesh_array", +#endif +#ifdef GL_SUN_read_video_pixels + "GL_SUN_read_video_pixels", +#endif +#ifdef GL_SUN_slice_accum + "GL_SUN_slice_accum", +#endif +#ifdef GL_SUN_triangle_list + "GL_SUN_triangle_list", +#endif +#ifdef GL_SUN_vertex + "GL_SUN_vertex", +#endif +#ifdef GL_WIN_phong_shading + "GL_WIN_phong_shading", +#endif +#ifdef GL_WIN_scene_markerXXX + "GL_WIN_scene_markerXXX", +#endif +#ifdef GL_WIN_specular_fog + "GL_WIN_specular_fog", +#endif +#ifdef GL_WIN_swap_hint + "GL_WIN_swap_hint", +#endif + NULL +}; + +/* Detected in the extension string or strings */ +static GLboolean _glewExtensionString[801]; +/* Detected via extension string or experimental mode */ +static GLboolean* _glewExtensionEnabled[] = { +#ifdef GL_VERSION_1_2 + &__GLEW_VERSION_1_2, +#endif +#ifdef GL_VERSION_1_2_1 + &__GLEW_VERSION_1_2_1, +#endif +#ifdef GL_VERSION_1_3 + &__GLEW_VERSION_1_3, +#endif +#ifdef GL_VERSION_1_4 + &__GLEW_VERSION_1_4, +#endif +#ifdef GL_VERSION_1_5 + &__GLEW_VERSION_1_5, +#endif +#ifdef GL_VERSION_2_0 + &__GLEW_VERSION_2_0, +#endif +#ifdef GL_VERSION_2_1 + &__GLEW_VERSION_2_1, +#endif +#ifdef GL_VERSION_3_0 + &__GLEW_VERSION_3_0, +#endif +#ifdef GL_VERSION_3_1 + &__GLEW_VERSION_3_1, +#endif +#ifdef GL_VERSION_3_2 + &__GLEW_VERSION_3_2, +#endif +#ifdef GL_VERSION_3_3 + &__GLEW_VERSION_3_3, +#endif +#ifdef GL_VERSION_4_0 + &__GLEW_VERSION_4_0, +#endif +#ifdef GL_VERSION_4_1 + &__GLEW_VERSION_4_1, +#endif +#ifdef GL_VERSION_4_2 + &__GLEW_VERSION_4_2, +#endif +#ifdef GL_VERSION_4_3 + &__GLEW_VERSION_4_3, +#endif +#ifdef GL_VERSION_4_4 + &__GLEW_VERSION_4_4, +#endif +#ifdef GL_VERSION_4_5 + &__GLEW_VERSION_4_5, +#endif +#ifdef GL_VERSION_4_6 + &__GLEW_VERSION_4_6, +#endif +#ifdef GL_3DFX_multisample + &__GLEW_3DFX_multisample, +#endif +#ifdef GL_3DFX_tbuffer + &__GLEW_3DFX_tbuffer, +#endif +#ifdef GL_3DFX_texture_compression_FXT1 + &__GLEW_3DFX_texture_compression_FXT1, +#endif +#ifdef GL_AMD_blend_minmax_factor + &__GLEW_AMD_blend_minmax_factor, +#endif +#ifdef GL_AMD_compressed_3DC_texture + &__GLEW_AMD_compressed_3DC_texture, +#endif +#ifdef GL_AMD_compressed_ATC_texture + &__GLEW_AMD_compressed_ATC_texture, +#endif +#ifdef GL_AMD_conservative_depth + &__GLEW_AMD_conservative_depth, +#endif +#ifdef GL_AMD_debug_output + &__GLEW_AMD_debug_output, +#endif +#ifdef GL_AMD_depth_clamp_separate + &__GLEW_AMD_depth_clamp_separate, +#endif +#ifdef GL_AMD_draw_buffers_blend + &__GLEW_AMD_draw_buffers_blend, +#endif +#ifdef GL_AMD_framebuffer_sample_positions + &__GLEW_AMD_framebuffer_sample_positions, +#endif +#ifdef GL_AMD_gcn_shader + &__GLEW_AMD_gcn_shader, +#endif +#ifdef GL_AMD_gpu_shader_half_float + &__GLEW_AMD_gpu_shader_half_float, +#endif +#ifdef GL_AMD_gpu_shader_int16 + &__GLEW_AMD_gpu_shader_int16, +#endif +#ifdef GL_AMD_gpu_shader_int64 + &__GLEW_AMD_gpu_shader_int64, +#endif +#ifdef GL_AMD_interleaved_elements + &__GLEW_AMD_interleaved_elements, +#endif +#ifdef GL_AMD_multi_draw_indirect + &__GLEW_AMD_multi_draw_indirect, +#endif +#ifdef GL_AMD_name_gen_delete + &__GLEW_AMD_name_gen_delete, +#endif +#ifdef GL_AMD_occlusion_query_event + &__GLEW_AMD_occlusion_query_event, +#endif +#ifdef GL_AMD_performance_monitor + &__GLEW_AMD_performance_monitor, +#endif +#ifdef GL_AMD_pinned_memory + &__GLEW_AMD_pinned_memory, +#endif +#ifdef GL_AMD_program_binary_Z400 + &__GLEW_AMD_program_binary_Z400, +#endif +#ifdef GL_AMD_query_buffer_object + &__GLEW_AMD_query_buffer_object, +#endif +#ifdef GL_AMD_sample_positions + &__GLEW_AMD_sample_positions, +#endif +#ifdef GL_AMD_seamless_cubemap_per_texture + &__GLEW_AMD_seamless_cubemap_per_texture, +#endif +#ifdef GL_AMD_shader_atomic_counter_ops + &__GLEW_AMD_shader_atomic_counter_ops, +#endif +#ifdef GL_AMD_shader_ballot + &__GLEW_AMD_shader_ballot, +#endif +#ifdef GL_AMD_shader_explicit_vertex_parameter + &__GLEW_AMD_shader_explicit_vertex_parameter, +#endif +#ifdef GL_AMD_shader_stencil_export + &__GLEW_AMD_shader_stencil_export, +#endif +#ifdef GL_AMD_shader_stencil_value_export + &__GLEW_AMD_shader_stencil_value_export, +#endif +#ifdef GL_AMD_shader_trinary_minmax + &__GLEW_AMD_shader_trinary_minmax, +#endif +#ifdef GL_AMD_sparse_texture + &__GLEW_AMD_sparse_texture, +#endif +#ifdef GL_AMD_stencil_operation_extended + &__GLEW_AMD_stencil_operation_extended, +#endif +#ifdef GL_AMD_texture_gather_bias_lod + &__GLEW_AMD_texture_gather_bias_lod, +#endif +#ifdef GL_AMD_texture_texture4 + &__GLEW_AMD_texture_texture4, +#endif +#ifdef GL_AMD_transform_feedback3_lines_triangles + &__GLEW_AMD_transform_feedback3_lines_triangles, +#endif +#ifdef GL_AMD_transform_feedback4 + &__GLEW_AMD_transform_feedback4, +#endif +#ifdef GL_AMD_vertex_shader_layer + &__GLEW_AMD_vertex_shader_layer, +#endif +#ifdef GL_AMD_vertex_shader_tessellator + &__GLEW_AMD_vertex_shader_tessellator, +#endif +#ifdef GL_AMD_vertex_shader_viewport_index + &__GLEW_AMD_vertex_shader_viewport_index, +#endif +#ifdef GL_ANDROID_extension_pack_es31a + &__GLEW_ANDROID_extension_pack_es31a, +#endif +#ifdef GL_ANGLE_depth_texture + &__GLEW_ANGLE_depth_texture, +#endif +#ifdef GL_ANGLE_framebuffer_blit + &__GLEW_ANGLE_framebuffer_blit, +#endif +#ifdef GL_ANGLE_framebuffer_multisample + &__GLEW_ANGLE_framebuffer_multisample, +#endif +#ifdef GL_ANGLE_instanced_arrays + &__GLEW_ANGLE_instanced_arrays, +#endif +#ifdef GL_ANGLE_pack_reverse_row_order + &__GLEW_ANGLE_pack_reverse_row_order, +#endif +#ifdef GL_ANGLE_program_binary + &__GLEW_ANGLE_program_binary, +#endif +#ifdef GL_ANGLE_texture_compression_dxt1 + &__GLEW_ANGLE_texture_compression_dxt1, +#endif +#ifdef GL_ANGLE_texture_compression_dxt3 + &__GLEW_ANGLE_texture_compression_dxt3, +#endif +#ifdef GL_ANGLE_texture_compression_dxt5 + &__GLEW_ANGLE_texture_compression_dxt5, +#endif +#ifdef GL_ANGLE_texture_usage + &__GLEW_ANGLE_texture_usage, +#endif +#ifdef GL_ANGLE_timer_query + &__GLEW_ANGLE_timer_query, +#endif +#ifdef GL_ANGLE_translated_shader_source + &__GLEW_ANGLE_translated_shader_source, +#endif +#ifdef GL_APPLE_aux_depth_stencil + &__GLEW_APPLE_aux_depth_stencil, +#endif +#ifdef GL_APPLE_client_storage + &__GLEW_APPLE_client_storage, +#endif +#ifdef GL_APPLE_clip_distance + &__GLEW_APPLE_clip_distance, +#endif +#ifdef GL_APPLE_color_buffer_packed_float + &__GLEW_APPLE_color_buffer_packed_float, +#endif +#ifdef GL_APPLE_copy_texture_levels + &__GLEW_APPLE_copy_texture_levels, +#endif +#ifdef GL_APPLE_element_array + &__GLEW_APPLE_element_array, +#endif +#ifdef GL_APPLE_fence + &__GLEW_APPLE_fence, +#endif +#ifdef GL_APPLE_float_pixels + &__GLEW_APPLE_float_pixels, +#endif +#ifdef GL_APPLE_flush_buffer_range + &__GLEW_APPLE_flush_buffer_range, +#endif +#ifdef GL_APPLE_framebuffer_multisample + &__GLEW_APPLE_framebuffer_multisample, +#endif +#ifdef GL_APPLE_object_purgeable + &__GLEW_APPLE_object_purgeable, +#endif +#ifdef GL_APPLE_pixel_buffer + &__GLEW_APPLE_pixel_buffer, +#endif +#ifdef GL_APPLE_rgb_422 + &__GLEW_APPLE_rgb_422, +#endif +#ifdef GL_APPLE_row_bytes + &__GLEW_APPLE_row_bytes, +#endif +#ifdef GL_APPLE_specular_vector + &__GLEW_APPLE_specular_vector, +#endif +#ifdef GL_APPLE_sync + &__GLEW_APPLE_sync, +#endif +#ifdef GL_APPLE_texture_2D_limited_npot + &__GLEW_APPLE_texture_2D_limited_npot, +#endif +#ifdef GL_APPLE_texture_format_BGRA8888 + &__GLEW_APPLE_texture_format_BGRA8888, +#endif +#ifdef GL_APPLE_texture_max_level + &__GLEW_APPLE_texture_max_level, +#endif +#ifdef GL_APPLE_texture_packed_float + &__GLEW_APPLE_texture_packed_float, +#endif +#ifdef GL_APPLE_texture_range + &__GLEW_APPLE_texture_range, +#endif +#ifdef GL_APPLE_transform_hint + &__GLEW_APPLE_transform_hint, +#endif +#ifdef GL_APPLE_vertex_array_object + &__GLEW_APPLE_vertex_array_object, +#endif +#ifdef GL_APPLE_vertex_array_range + &__GLEW_APPLE_vertex_array_range, +#endif +#ifdef GL_APPLE_vertex_program_evaluators + &__GLEW_APPLE_vertex_program_evaluators, +#endif +#ifdef GL_APPLE_ycbcr_422 + &__GLEW_APPLE_ycbcr_422, +#endif +#ifdef GL_ARB_ES2_compatibility + &__GLEW_ARB_ES2_compatibility, +#endif +#ifdef GL_ARB_ES3_1_compatibility + &__GLEW_ARB_ES3_1_compatibility, +#endif +#ifdef GL_ARB_ES3_2_compatibility + &__GLEW_ARB_ES3_2_compatibility, +#endif +#ifdef GL_ARB_ES3_compatibility + &__GLEW_ARB_ES3_compatibility, +#endif +#ifdef GL_ARB_arrays_of_arrays + &__GLEW_ARB_arrays_of_arrays, +#endif +#ifdef GL_ARB_base_instance + &__GLEW_ARB_base_instance, +#endif +#ifdef GL_ARB_bindless_texture + &__GLEW_ARB_bindless_texture, +#endif +#ifdef GL_ARB_blend_func_extended + &__GLEW_ARB_blend_func_extended, +#endif +#ifdef GL_ARB_buffer_storage + &__GLEW_ARB_buffer_storage, +#endif +#ifdef GL_ARB_cl_event + &__GLEW_ARB_cl_event, +#endif +#ifdef GL_ARB_clear_buffer_object + &__GLEW_ARB_clear_buffer_object, +#endif +#ifdef GL_ARB_clear_texture + &__GLEW_ARB_clear_texture, +#endif +#ifdef GL_ARB_clip_control + &__GLEW_ARB_clip_control, +#endif +#ifdef GL_ARB_color_buffer_float + &__GLEW_ARB_color_buffer_float, +#endif +#ifdef GL_ARB_compatibility + &__GLEW_ARB_compatibility, +#endif +#ifdef GL_ARB_compressed_texture_pixel_storage + &__GLEW_ARB_compressed_texture_pixel_storage, +#endif +#ifdef GL_ARB_compute_shader + &__GLEW_ARB_compute_shader, +#endif +#ifdef GL_ARB_compute_variable_group_size + &__GLEW_ARB_compute_variable_group_size, +#endif +#ifdef GL_ARB_conditional_render_inverted + &__GLEW_ARB_conditional_render_inverted, +#endif +#ifdef GL_ARB_conservative_depth + &__GLEW_ARB_conservative_depth, +#endif +#ifdef GL_ARB_copy_buffer + &__GLEW_ARB_copy_buffer, +#endif +#ifdef GL_ARB_copy_image + &__GLEW_ARB_copy_image, +#endif +#ifdef GL_ARB_cull_distance + &__GLEW_ARB_cull_distance, +#endif +#ifdef GL_ARB_debug_output + &__GLEW_ARB_debug_output, +#endif +#ifdef GL_ARB_depth_buffer_float + &__GLEW_ARB_depth_buffer_float, +#endif +#ifdef GL_ARB_depth_clamp + &__GLEW_ARB_depth_clamp, +#endif +#ifdef GL_ARB_depth_texture + &__GLEW_ARB_depth_texture, +#endif +#ifdef GL_ARB_derivative_control + &__GLEW_ARB_derivative_control, +#endif +#ifdef GL_ARB_direct_state_access + &__GLEW_ARB_direct_state_access, +#endif +#ifdef GL_ARB_draw_buffers + &__GLEW_ARB_draw_buffers, +#endif +#ifdef GL_ARB_draw_buffers_blend + &__GLEW_ARB_draw_buffers_blend, +#endif +#ifdef GL_ARB_draw_elements_base_vertex + &__GLEW_ARB_draw_elements_base_vertex, +#endif +#ifdef GL_ARB_draw_indirect + &__GLEW_ARB_draw_indirect, +#endif +#ifdef GL_ARB_draw_instanced + &__GLEW_ARB_draw_instanced, +#endif +#ifdef GL_ARB_enhanced_layouts + &__GLEW_ARB_enhanced_layouts, +#endif +#ifdef GL_ARB_explicit_attrib_location + &__GLEW_ARB_explicit_attrib_location, +#endif +#ifdef GL_ARB_explicit_uniform_location + &__GLEW_ARB_explicit_uniform_location, +#endif +#ifdef GL_ARB_fragment_coord_conventions + &__GLEW_ARB_fragment_coord_conventions, +#endif +#ifdef GL_ARB_fragment_layer_viewport + &__GLEW_ARB_fragment_layer_viewport, +#endif +#ifdef GL_ARB_fragment_program + &__GLEW_ARB_fragment_program, +#endif +#ifdef GL_ARB_fragment_program_shadow + &__GLEW_ARB_fragment_program_shadow, +#endif +#ifdef GL_ARB_fragment_shader + &__GLEW_ARB_fragment_shader, +#endif +#ifdef GL_ARB_fragment_shader_interlock + &__GLEW_ARB_fragment_shader_interlock, +#endif +#ifdef GL_ARB_framebuffer_no_attachments + &__GLEW_ARB_framebuffer_no_attachments, +#endif +#ifdef GL_ARB_framebuffer_object + &__GLEW_ARB_framebuffer_object, +#endif +#ifdef GL_ARB_framebuffer_sRGB + &__GLEW_ARB_framebuffer_sRGB, +#endif +#ifdef GL_ARB_geometry_shader4 + &__GLEW_ARB_geometry_shader4, +#endif +#ifdef GL_ARB_get_program_binary + &__GLEW_ARB_get_program_binary, +#endif +#ifdef GL_ARB_get_texture_sub_image + &__GLEW_ARB_get_texture_sub_image, +#endif +#ifdef GL_ARB_gl_spirv + &__GLEW_ARB_gl_spirv, +#endif +#ifdef GL_ARB_gpu_shader5 + &__GLEW_ARB_gpu_shader5, +#endif +#ifdef GL_ARB_gpu_shader_fp64 + &__GLEW_ARB_gpu_shader_fp64, +#endif +#ifdef GL_ARB_gpu_shader_int64 + &__GLEW_ARB_gpu_shader_int64, +#endif +#ifdef GL_ARB_half_float_pixel + &__GLEW_ARB_half_float_pixel, +#endif +#ifdef GL_ARB_half_float_vertex + &__GLEW_ARB_half_float_vertex, +#endif +#ifdef GL_ARB_imaging + &__GLEW_ARB_imaging, +#endif +#ifdef GL_ARB_indirect_parameters + &__GLEW_ARB_indirect_parameters, +#endif +#ifdef GL_ARB_instanced_arrays + &__GLEW_ARB_instanced_arrays, +#endif +#ifdef GL_ARB_internalformat_query + &__GLEW_ARB_internalformat_query, +#endif +#ifdef GL_ARB_internalformat_query2 + &__GLEW_ARB_internalformat_query2, +#endif +#ifdef GL_ARB_invalidate_subdata + &__GLEW_ARB_invalidate_subdata, +#endif +#ifdef GL_ARB_map_buffer_alignment + &__GLEW_ARB_map_buffer_alignment, +#endif +#ifdef GL_ARB_map_buffer_range + &__GLEW_ARB_map_buffer_range, +#endif +#ifdef GL_ARB_matrix_palette + &__GLEW_ARB_matrix_palette, +#endif +#ifdef GL_ARB_multi_bind + &__GLEW_ARB_multi_bind, +#endif +#ifdef GL_ARB_multi_draw_indirect + &__GLEW_ARB_multi_draw_indirect, +#endif +#ifdef GL_ARB_multisample + &__GLEW_ARB_multisample, +#endif +#ifdef GL_ARB_multitexture + &__GLEW_ARB_multitexture, +#endif +#ifdef GL_ARB_occlusion_query + &__GLEW_ARB_occlusion_query, +#endif +#ifdef GL_ARB_occlusion_query2 + &__GLEW_ARB_occlusion_query2, +#endif +#ifdef GL_ARB_parallel_shader_compile + &__GLEW_ARB_parallel_shader_compile, +#endif +#ifdef GL_ARB_pipeline_statistics_query + &__GLEW_ARB_pipeline_statistics_query, +#endif +#ifdef GL_ARB_pixel_buffer_object + &__GLEW_ARB_pixel_buffer_object, +#endif +#ifdef GL_ARB_point_parameters + &__GLEW_ARB_point_parameters, +#endif +#ifdef GL_ARB_point_sprite + &__GLEW_ARB_point_sprite, +#endif +#ifdef GL_ARB_polygon_offset_clamp + &__GLEW_ARB_polygon_offset_clamp, +#endif +#ifdef GL_ARB_post_depth_coverage + &__GLEW_ARB_post_depth_coverage, +#endif +#ifdef GL_ARB_program_interface_query + &__GLEW_ARB_program_interface_query, +#endif +#ifdef GL_ARB_provoking_vertex + &__GLEW_ARB_provoking_vertex, +#endif +#ifdef GL_ARB_query_buffer_object + &__GLEW_ARB_query_buffer_object, +#endif +#ifdef GL_ARB_robust_buffer_access_behavior + &__GLEW_ARB_robust_buffer_access_behavior, +#endif +#ifdef GL_ARB_robustness + &__GLEW_ARB_robustness, +#endif +#ifdef GL_ARB_robustness_application_isolation + &__GLEW_ARB_robustness_application_isolation, +#endif +#ifdef GL_ARB_robustness_share_group_isolation + &__GLEW_ARB_robustness_share_group_isolation, +#endif +#ifdef GL_ARB_sample_locations + &__GLEW_ARB_sample_locations, +#endif +#ifdef GL_ARB_sample_shading + &__GLEW_ARB_sample_shading, +#endif +#ifdef GL_ARB_sampler_objects + &__GLEW_ARB_sampler_objects, +#endif +#ifdef GL_ARB_seamless_cube_map + &__GLEW_ARB_seamless_cube_map, +#endif +#ifdef GL_ARB_seamless_cubemap_per_texture + &__GLEW_ARB_seamless_cubemap_per_texture, +#endif +#ifdef GL_ARB_separate_shader_objects + &__GLEW_ARB_separate_shader_objects, +#endif +#ifdef GL_ARB_shader_atomic_counter_ops + &__GLEW_ARB_shader_atomic_counter_ops, +#endif +#ifdef GL_ARB_shader_atomic_counters + &__GLEW_ARB_shader_atomic_counters, +#endif +#ifdef GL_ARB_shader_ballot + &__GLEW_ARB_shader_ballot, +#endif +#ifdef GL_ARB_shader_bit_encoding + &__GLEW_ARB_shader_bit_encoding, +#endif +#ifdef GL_ARB_shader_clock + &__GLEW_ARB_shader_clock, +#endif +#ifdef GL_ARB_shader_draw_parameters + &__GLEW_ARB_shader_draw_parameters, +#endif +#ifdef GL_ARB_shader_group_vote + &__GLEW_ARB_shader_group_vote, +#endif +#ifdef GL_ARB_shader_image_load_store + &__GLEW_ARB_shader_image_load_store, +#endif +#ifdef GL_ARB_shader_image_size + &__GLEW_ARB_shader_image_size, +#endif +#ifdef GL_ARB_shader_objects + &__GLEW_ARB_shader_objects, +#endif +#ifdef GL_ARB_shader_precision + &__GLEW_ARB_shader_precision, +#endif +#ifdef GL_ARB_shader_stencil_export + &__GLEW_ARB_shader_stencil_export, +#endif +#ifdef GL_ARB_shader_storage_buffer_object + &__GLEW_ARB_shader_storage_buffer_object, +#endif +#ifdef GL_ARB_shader_subroutine + &__GLEW_ARB_shader_subroutine, +#endif +#ifdef GL_ARB_shader_texture_image_samples + &__GLEW_ARB_shader_texture_image_samples, +#endif +#ifdef GL_ARB_shader_texture_lod + &__GLEW_ARB_shader_texture_lod, +#endif +#ifdef GL_ARB_shader_viewport_layer_array + &__GLEW_ARB_shader_viewport_layer_array, +#endif +#ifdef GL_ARB_shading_language_100 + &__GLEW_ARB_shading_language_100, +#endif +#ifdef GL_ARB_shading_language_420pack + &__GLEW_ARB_shading_language_420pack, +#endif +#ifdef GL_ARB_shading_language_include + &__GLEW_ARB_shading_language_include, +#endif +#ifdef GL_ARB_shading_language_packing + &__GLEW_ARB_shading_language_packing, +#endif +#ifdef GL_ARB_shadow + &__GLEW_ARB_shadow, +#endif +#ifdef GL_ARB_shadow_ambient + &__GLEW_ARB_shadow_ambient, +#endif +#ifdef GL_ARB_sparse_buffer + &__GLEW_ARB_sparse_buffer, +#endif +#ifdef GL_ARB_sparse_texture + &__GLEW_ARB_sparse_texture, +#endif +#ifdef GL_ARB_sparse_texture2 + &__GLEW_ARB_sparse_texture2, +#endif +#ifdef GL_ARB_sparse_texture_clamp + &__GLEW_ARB_sparse_texture_clamp, +#endif +#ifdef GL_ARB_spirv_extensions + &__GLEW_ARB_spirv_extensions, +#endif +#ifdef GL_ARB_stencil_texturing + &__GLEW_ARB_stencil_texturing, +#endif +#ifdef GL_ARB_sync + &__GLEW_ARB_sync, +#endif +#ifdef GL_ARB_tessellation_shader + &__GLEW_ARB_tessellation_shader, +#endif +#ifdef GL_ARB_texture_barrier + &__GLEW_ARB_texture_barrier, +#endif +#ifdef GL_ARB_texture_border_clamp + &__GLEW_ARB_texture_border_clamp, +#endif +#ifdef GL_ARB_texture_buffer_object + &__GLEW_ARB_texture_buffer_object, +#endif +#ifdef GL_ARB_texture_buffer_object_rgb32 + &__GLEW_ARB_texture_buffer_object_rgb32, +#endif +#ifdef GL_ARB_texture_buffer_range + &__GLEW_ARB_texture_buffer_range, +#endif +#ifdef GL_ARB_texture_compression + &__GLEW_ARB_texture_compression, +#endif +#ifdef GL_ARB_texture_compression_bptc + &__GLEW_ARB_texture_compression_bptc, +#endif +#ifdef GL_ARB_texture_compression_rgtc + &__GLEW_ARB_texture_compression_rgtc, +#endif +#ifdef GL_ARB_texture_cube_map + &__GLEW_ARB_texture_cube_map, +#endif +#ifdef GL_ARB_texture_cube_map_array + &__GLEW_ARB_texture_cube_map_array, +#endif +#ifdef GL_ARB_texture_env_add + &__GLEW_ARB_texture_env_add, +#endif +#ifdef GL_ARB_texture_env_combine + &__GLEW_ARB_texture_env_combine, +#endif +#ifdef GL_ARB_texture_env_crossbar + &__GLEW_ARB_texture_env_crossbar, +#endif +#ifdef GL_ARB_texture_env_dot3 + &__GLEW_ARB_texture_env_dot3, +#endif +#ifdef GL_ARB_texture_filter_anisotropic + &__GLEW_ARB_texture_filter_anisotropic, +#endif +#ifdef GL_ARB_texture_filter_minmax + &__GLEW_ARB_texture_filter_minmax, +#endif +#ifdef GL_ARB_texture_float + &__GLEW_ARB_texture_float, +#endif +#ifdef GL_ARB_texture_gather + &__GLEW_ARB_texture_gather, +#endif +#ifdef GL_ARB_texture_mirror_clamp_to_edge + &__GLEW_ARB_texture_mirror_clamp_to_edge, +#endif +#ifdef GL_ARB_texture_mirrored_repeat + &__GLEW_ARB_texture_mirrored_repeat, +#endif +#ifdef GL_ARB_texture_multisample + &__GLEW_ARB_texture_multisample, +#endif +#ifdef GL_ARB_texture_non_power_of_two + &__GLEW_ARB_texture_non_power_of_two, +#endif +#ifdef GL_ARB_texture_query_levels + &__GLEW_ARB_texture_query_levels, +#endif +#ifdef GL_ARB_texture_query_lod + &__GLEW_ARB_texture_query_lod, +#endif +#ifdef GL_ARB_texture_rectangle + &__GLEW_ARB_texture_rectangle, +#endif +#ifdef GL_ARB_texture_rg + &__GLEW_ARB_texture_rg, +#endif +#ifdef GL_ARB_texture_rgb10_a2ui + &__GLEW_ARB_texture_rgb10_a2ui, +#endif +#ifdef GL_ARB_texture_stencil8 + &__GLEW_ARB_texture_stencil8, +#endif +#ifdef GL_ARB_texture_storage + &__GLEW_ARB_texture_storage, +#endif +#ifdef GL_ARB_texture_storage_multisample + &__GLEW_ARB_texture_storage_multisample, +#endif +#ifdef GL_ARB_texture_swizzle + &__GLEW_ARB_texture_swizzle, +#endif +#ifdef GL_ARB_texture_view + &__GLEW_ARB_texture_view, +#endif +#ifdef GL_ARB_timer_query + &__GLEW_ARB_timer_query, +#endif +#ifdef GL_ARB_transform_feedback2 + &__GLEW_ARB_transform_feedback2, +#endif +#ifdef GL_ARB_transform_feedback3 + &__GLEW_ARB_transform_feedback3, +#endif +#ifdef GL_ARB_transform_feedback_instanced + &__GLEW_ARB_transform_feedback_instanced, +#endif +#ifdef GL_ARB_transform_feedback_overflow_query + &__GLEW_ARB_transform_feedback_overflow_query, +#endif +#ifdef GL_ARB_transpose_matrix + &__GLEW_ARB_transpose_matrix, +#endif +#ifdef GL_ARB_uniform_buffer_object + &__GLEW_ARB_uniform_buffer_object, +#endif +#ifdef GL_ARB_vertex_array_bgra + &__GLEW_ARB_vertex_array_bgra, +#endif +#ifdef GL_ARB_vertex_array_object + &__GLEW_ARB_vertex_array_object, +#endif +#ifdef GL_ARB_vertex_attrib_64bit + &__GLEW_ARB_vertex_attrib_64bit, +#endif +#ifdef GL_ARB_vertex_attrib_binding + &__GLEW_ARB_vertex_attrib_binding, +#endif +#ifdef GL_ARB_vertex_blend + &__GLEW_ARB_vertex_blend, +#endif +#ifdef GL_ARB_vertex_buffer_object + &__GLEW_ARB_vertex_buffer_object, +#endif +#ifdef GL_ARB_vertex_program + &__GLEW_ARB_vertex_program, +#endif +#ifdef GL_ARB_vertex_shader + &__GLEW_ARB_vertex_shader, +#endif +#ifdef GL_ARB_vertex_type_10f_11f_11f_rev + &__GLEW_ARB_vertex_type_10f_11f_11f_rev, +#endif +#ifdef GL_ARB_vertex_type_2_10_10_10_rev + &__GLEW_ARB_vertex_type_2_10_10_10_rev, +#endif +#ifdef GL_ARB_viewport_array + &__GLEW_ARB_viewport_array, +#endif +#ifdef GL_ARB_window_pos + &__GLEW_ARB_window_pos, +#endif +#ifdef GL_ARM_mali_program_binary + &__GLEW_ARM_mali_program_binary, +#endif +#ifdef GL_ARM_mali_shader_binary + &__GLEW_ARM_mali_shader_binary, +#endif +#ifdef GL_ARM_rgba8 + &__GLEW_ARM_rgba8, +#endif +#ifdef GL_ARM_shader_framebuffer_fetch + &__GLEW_ARM_shader_framebuffer_fetch, +#endif +#ifdef GL_ARM_shader_framebuffer_fetch_depth_stencil + &__GLEW_ARM_shader_framebuffer_fetch_depth_stencil, +#endif +#ifdef GL_ATIX_point_sprites + &__GLEW_ATIX_point_sprites, +#endif +#ifdef GL_ATIX_texture_env_combine3 + &__GLEW_ATIX_texture_env_combine3, +#endif +#ifdef GL_ATIX_texture_env_route + &__GLEW_ATIX_texture_env_route, +#endif +#ifdef GL_ATIX_vertex_shader_output_point_size + &__GLEW_ATIX_vertex_shader_output_point_size, +#endif +#ifdef GL_ATI_draw_buffers + &__GLEW_ATI_draw_buffers, +#endif +#ifdef GL_ATI_element_array + &__GLEW_ATI_element_array, +#endif +#ifdef GL_ATI_envmap_bumpmap + &__GLEW_ATI_envmap_bumpmap, +#endif +#ifdef GL_ATI_fragment_shader + &__GLEW_ATI_fragment_shader, +#endif +#ifdef GL_ATI_map_object_buffer + &__GLEW_ATI_map_object_buffer, +#endif +#ifdef GL_ATI_meminfo + &__GLEW_ATI_meminfo, +#endif +#ifdef GL_ATI_pn_triangles + &__GLEW_ATI_pn_triangles, +#endif +#ifdef GL_ATI_separate_stencil + &__GLEW_ATI_separate_stencil, +#endif +#ifdef GL_ATI_shader_texture_lod + &__GLEW_ATI_shader_texture_lod, +#endif +#ifdef GL_ATI_text_fragment_shader + &__GLEW_ATI_text_fragment_shader, +#endif +#ifdef GL_ATI_texture_compression_3dc + &__GLEW_ATI_texture_compression_3dc, +#endif +#ifdef GL_ATI_texture_env_combine3 + &__GLEW_ATI_texture_env_combine3, +#endif +#ifdef GL_ATI_texture_float + &__GLEW_ATI_texture_float, +#endif +#ifdef GL_ATI_texture_mirror_once + &__GLEW_ATI_texture_mirror_once, +#endif +#ifdef GL_ATI_vertex_array_object + &__GLEW_ATI_vertex_array_object, +#endif +#ifdef GL_ATI_vertex_attrib_array_object + &__GLEW_ATI_vertex_attrib_array_object, +#endif +#ifdef GL_ATI_vertex_streams + &__GLEW_ATI_vertex_streams, +#endif +#ifdef GL_EGL_KHR_context_flush_control + &__GLEW_EGL_KHR_context_flush_control, +#endif +#ifdef GL_EGL_NV_robustness_video_memory_purge + &__GLEW_EGL_NV_robustness_video_memory_purge, +#endif +#ifdef GL_EXT_422_pixels + &__GLEW_EXT_422_pixels, +#endif +#ifdef GL_EXT_Cg_shader + &__GLEW_EXT_Cg_shader, +#endif +#ifdef GL_EXT_EGL_image_array + &__GLEW_EXT_EGL_image_array, +#endif +#ifdef GL_EXT_YUV_target + &__GLEW_EXT_YUV_target, +#endif +#ifdef GL_EXT_abgr + &__GLEW_EXT_abgr, +#endif +#ifdef GL_EXT_base_instance + &__GLEW_EXT_base_instance, +#endif +#ifdef GL_EXT_bgra + &__GLEW_EXT_bgra, +#endif +#ifdef GL_EXT_bindable_uniform + &__GLEW_EXT_bindable_uniform, +#endif +#ifdef GL_EXT_blend_color + &__GLEW_EXT_blend_color, +#endif +#ifdef GL_EXT_blend_equation_separate + &__GLEW_EXT_blend_equation_separate, +#endif +#ifdef GL_EXT_blend_func_extended + &__GLEW_EXT_blend_func_extended, +#endif +#ifdef GL_EXT_blend_func_separate + &__GLEW_EXT_blend_func_separate, +#endif +#ifdef GL_EXT_blend_logic_op + &__GLEW_EXT_blend_logic_op, +#endif +#ifdef GL_EXT_blend_minmax + &__GLEW_EXT_blend_minmax, +#endif +#ifdef GL_EXT_blend_subtract + &__GLEW_EXT_blend_subtract, +#endif +#ifdef GL_EXT_buffer_storage + &__GLEW_EXT_buffer_storage, +#endif +#ifdef GL_EXT_clear_texture + &__GLEW_EXT_clear_texture, +#endif +#ifdef GL_EXT_clip_cull_distance + &__GLEW_EXT_clip_cull_distance, +#endif +#ifdef GL_EXT_clip_volume_hint + &__GLEW_EXT_clip_volume_hint, +#endif +#ifdef GL_EXT_cmyka + &__GLEW_EXT_cmyka, +#endif +#ifdef GL_EXT_color_buffer_float + &__GLEW_EXT_color_buffer_float, +#endif +#ifdef GL_EXT_color_buffer_half_float + &__GLEW_EXT_color_buffer_half_float, +#endif +#ifdef GL_EXT_color_subtable + &__GLEW_EXT_color_subtable, +#endif +#ifdef GL_EXT_compiled_vertex_array + &__GLEW_EXT_compiled_vertex_array, +#endif +#ifdef GL_EXT_compressed_ETC1_RGB8_sub_texture + &__GLEW_EXT_compressed_ETC1_RGB8_sub_texture, +#endif +#ifdef GL_EXT_conservative_depth + &__GLEW_EXT_conservative_depth, +#endif +#ifdef GL_EXT_convolution + &__GLEW_EXT_convolution, +#endif +#ifdef GL_EXT_coordinate_frame + &__GLEW_EXT_coordinate_frame, +#endif +#ifdef GL_EXT_copy_image + &__GLEW_EXT_copy_image, +#endif +#ifdef GL_EXT_copy_texture + &__GLEW_EXT_copy_texture, +#endif +#ifdef GL_EXT_cull_vertex + &__GLEW_EXT_cull_vertex, +#endif +#ifdef GL_EXT_debug_label + &__GLEW_EXT_debug_label, +#endif +#ifdef GL_EXT_debug_marker + &__GLEW_EXT_debug_marker, +#endif +#ifdef GL_EXT_depth_bounds_test + &__GLEW_EXT_depth_bounds_test, +#endif +#ifdef GL_EXT_direct_state_access + &__GLEW_EXT_direct_state_access, +#endif +#ifdef GL_EXT_discard_framebuffer + &__GLEW_EXT_discard_framebuffer, +#endif +#ifdef GL_EXT_draw_buffers + &__GLEW_EXT_draw_buffers, +#endif +#ifdef GL_EXT_draw_buffers2 + &__GLEW_EXT_draw_buffers2, +#endif +#ifdef GL_EXT_draw_buffers_indexed + &__GLEW_EXT_draw_buffers_indexed, +#endif +#ifdef GL_EXT_draw_elements_base_vertex + &__GLEW_EXT_draw_elements_base_vertex, +#endif +#ifdef GL_EXT_draw_instanced + &__GLEW_EXT_draw_instanced, +#endif +#ifdef GL_EXT_draw_range_elements + &__GLEW_EXT_draw_range_elements, +#endif +#ifdef GL_EXT_external_buffer + &__GLEW_EXT_external_buffer, +#endif +#ifdef GL_EXT_float_blend + &__GLEW_EXT_float_blend, +#endif +#ifdef GL_EXT_fog_coord + &__GLEW_EXT_fog_coord, +#endif +#ifdef GL_EXT_frag_depth + &__GLEW_EXT_frag_depth, +#endif +#ifdef GL_EXT_fragment_lighting + &__GLEW_EXT_fragment_lighting, +#endif +#ifdef GL_EXT_framebuffer_blit + &__GLEW_EXT_framebuffer_blit, +#endif +#ifdef GL_EXT_framebuffer_multisample + &__GLEW_EXT_framebuffer_multisample, +#endif +#ifdef GL_EXT_framebuffer_multisample_blit_scaled + &__GLEW_EXT_framebuffer_multisample_blit_scaled, +#endif +#ifdef GL_EXT_framebuffer_object + &__GLEW_EXT_framebuffer_object, +#endif +#ifdef GL_EXT_framebuffer_sRGB + &__GLEW_EXT_framebuffer_sRGB, +#endif +#ifdef GL_EXT_geometry_point_size + &__GLEW_EXT_geometry_point_size, +#endif +#ifdef GL_EXT_geometry_shader + &__GLEW_EXT_geometry_shader, +#endif +#ifdef GL_EXT_geometry_shader4 + &__GLEW_EXT_geometry_shader4, +#endif +#ifdef GL_EXT_gpu_program_parameters + &__GLEW_EXT_gpu_program_parameters, +#endif +#ifdef GL_EXT_gpu_shader4 + &__GLEW_EXT_gpu_shader4, +#endif +#ifdef GL_EXT_gpu_shader5 + &__GLEW_EXT_gpu_shader5, +#endif +#ifdef GL_EXT_histogram + &__GLEW_EXT_histogram, +#endif +#ifdef GL_EXT_index_array_formats + &__GLEW_EXT_index_array_formats, +#endif +#ifdef GL_EXT_index_func + &__GLEW_EXT_index_func, +#endif +#ifdef GL_EXT_index_material + &__GLEW_EXT_index_material, +#endif +#ifdef GL_EXT_index_texture + &__GLEW_EXT_index_texture, +#endif +#ifdef GL_EXT_instanced_arrays + &__GLEW_EXT_instanced_arrays, +#endif +#ifdef GL_EXT_light_texture + &__GLEW_EXT_light_texture, +#endif +#ifdef GL_EXT_map_buffer_range + &__GLEW_EXT_map_buffer_range, +#endif +#ifdef GL_EXT_memory_object + &__GLEW_EXT_memory_object, +#endif +#ifdef GL_EXT_memory_object_fd + &__GLEW_EXT_memory_object_fd, +#endif +#ifdef GL_EXT_memory_object_win32 + &__GLEW_EXT_memory_object_win32, +#endif +#ifdef GL_EXT_misc_attribute + &__GLEW_EXT_misc_attribute, +#endif +#ifdef GL_EXT_multi_draw_arrays + &__GLEW_EXT_multi_draw_arrays, +#endif +#ifdef GL_EXT_multi_draw_indirect + &__GLEW_EXT_multi_draw_indirect, +#endif +#ifdef GL_EXT_multiple_textures + &__GLEW_EXT_multiple_textures, +#endif +#ifdef GL_EXT_multisample + &__GLEW_EXT_multisample, +#endif +#ifdef GL_EXT_multisample_compatibility + &__GLEW_EXT_multisample_compatibility, +#endif +#ifdef GL_EXT_multisampled_render_to_texture + &__GLEW_EXT_multisampled_render_to_texture, +#endif +#ifdef GL_EXT_multisampled_render_to_texture2 + &__GLEW_EXT_multisampled_render_to_texture2, +#endif +#ifdef GL_EXT_multiview_draw_buffers + &__GLEW_EXT_multiview_draw_buffers, +#endif +#ifdef GL_EXT_packed_depth_stencil + &__GLEW_EXT_packed_depth_stencil, +#endif +#ifdef GL_EXT_packed_float + &__GLEW_EXT_packed_float, +#endif +#ifdef GL_EXT_packed_pixels + &__GLEW_EXT_packed_pixels, +#endif +#ifdef GL_EXT_paletted_texture + &__GLEW_EXT_paletted_texture, +#endif +#ifdef GL_EXT_pixel_buffer_object + &__GLEW_EXT_pixel_buffer_object, +#endif +#ifdef GL_EXT_pixel_transform + &__GLEW_EXT_pixel_transform, +#endif +#ifdef GL_EXT_pixel_transform_color_table + &__GLEW_EXT_pixel_transform_color_table, +#endif +#ifdef GL_EXT_point_parameters + &__GLEW_EXT_point_parameters, +#endif +#ifdef GL_EXT_polygon_offset + &__GLEW_EXT_polygon_offset, +#endif +#ifdef GL_EXT_polygon_offset_clamp + &__GLEW_EXT_polygon_offset_clamp, +#endif +#ifdef GL_EXT_post_depth_coverage + &__GLEW_EXT_post_depth_coverage, +#endif +#ifdef GL_EXT_provoking_vertex + &__GLEW_EXT_provoking_vertex, +#endif +#ifdef GL_EXT_pvrtc_sRGB + &__GLEW_EXT_pvrtc_sRGB, +#endif +#ifdef GL_EXT_raster_multisample + &__GLEW_EXT_raster_multisample, +#endif +#ifdef GL_EXT_read_format_bgra + &__GLEW_EXT_read_format_bgra, +#endif +#ifdef GL_EXT_render_snorm + &__GLEW_EXT_render_snorm, +#endif +#ifdef GL_EXT_rescale_normal + &__GLEW_EXT_rescale_normal, +#endif +#ifdef GL_EXT_sRGB + &__GLEW_EXT_sRGB, +#endif +#ifdef GL_EXT_sRGB_write_control + &__GLEW_EXT_sRGB_write_control, +#endif +#ifdef GL_EXT_scene_marker + &__GLEW_EXT_scene_marker, +#endif +#ifdef GL_EXT_secondary_color + &__GLEW_EXT_secondary_color, +#endif +#ifdef GL_EXT_semaphore + &__GLEW_EXT_semaphore, +#endif +#ifdef GL_EXT_semaphore_fd + &__GLEW_EXT_semaphore_fd, +#endif +#ifdef GL_EXT_semaphore_win32 + &__GLEW_EXT_semaphore_win32, +#endif +#ifdef GL_EXT_separate_shader_objects + &__GLEW_EXT_separate_shader_objects, +#endif +#ifdef GL_EXT_separate_specular_color + &__GLEW_EXT_separate_specular_color, +#endif +#ifdef GL_EXT_shader_framebuffer_fetch + &__GLEW_EXT_shader_framebuffer_fetch, +#endif +#ifdef GL_EXT_shader_group_vote + &__GLEW_EXT_shader_group_vote, +#endif +#ifdef GL_EXT_shader_image_load_formatted + &__GLEW_EXT_shader_image_load_formatted, +#endif +#ifdef GL_EXT_shader_image_load_store + &__GLEW_EXT_shader_image_load_store, +#endif +#ifdef GL_EXT_shader_implicit_conversions + &__GLEW_EXT_shader_implicit_conversions, +#endif +#ifdef GL_EXT_shader_integer_mix + &__GLEW_EXT_shader_integer_mix, +#endif +#ifdef GL_EXT_shader_io_blocks + &__GLEW_EXT_shader_io_blocks, +#endif +#ifdef GL_EXT_shader_non_constant_global_initializers + &__GLEW_EXT_shader_non_constant_global_initializers, +#endif +#ifdef GL_EXT_shader_pixel_local_storage + &__GLEW_EXT_shader_pixel_local_storage, +#endif +#ifdef GL_EXT_shader_pixel_local_storage2 + &__GLEW_EXT_shader_pixel_local_storage2, +#endif +#ifdef GL_EXT_shader_texture_lod + &__GLEW_EXT_shader_texture_lod, +#endif +#ifdef GL_EXT_shadow_funcs + &__GLEW_EXT_shadow_funcs, +#endif +#ifdef GL_EXT_shadow_samplers + &__GLEW_EXT_shadow_samplers, +#endif +#ifdef GL_EXT_shared_texture_palette + &__GLEW_EXT_shared_texture_palette, +#endif +#ifdef GL_EXT_sparse_texture + &__GLEW_EXT_sparse_texture, +#endif +#ifdef GL_EXT_sparse_texture2 + &__GLEW_EXT_sparse_texture2, +#endif +#ifdef GL_EXT_stencil_clear_tag + &__GLEW_EXT_stencil_clear_tag, +#endif +#ifdef GL_EXT_stencil_two_side + &__GLEW_EXT_stencil_two_side, +#endif +#ifdef GL_EXT_stencil_wrap + &__GLEW_EXT_stencil_wrap, +#endif +#ifdef GL_EXT_subtexture + &__GLEW_EXT_subtexture, +#endif +#ifdef GL_EXT_texture + &__GLEW_EXT_texture, +#endif +#ifdef GL_EXT_texture3D + &__GLEW_EXT_texture3D, +#endif +#ifdef GL_EXT_texture_array + &__GLEW_EXT_texture_array, +#endif +#ifdef GL_EXT_texture_buffer_object + &__GLEW_EXT_texture_buffer_object, +#endif +#ifdef GL_EXT_texture_compression_astc_decode_mode + &__GLEW_EXT_texture_compression_astc_decode_mode, +#endif +#ifdef GL_EXT_texture_compression_astc_decode_mode_rgb9e5 + &__GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5, +#endif +#ifdef GL_EXT_texture_compression_bptc + &__GLEW_EXT_texture_compression_bptc, +#endif +#ifdef GL_EXT_texture_compression_dxt1 + &__GLEW_EXT_texture_compression_dxt1, +#endif +#ifdef GL_EXT_texture_compression_latc + &__GLEW_EXT_texture_compression_latc, +#endif +#ifdef GL_EXT_texture_compression_rgtc + &__GLEW_EXT_texture_compression_rgtc, +#endif +#ifdef GL_EXT_texture_compression_s3tc + &__GLEW_EXT_texture_compression_s3tc, +#endif +#ifdef GL_EXT_texture_cube_map + &__GLEW_EXT_texture_cube_map, +#endif +#ifdef GL_EXT_texture_cube_map_array + &__GLEW_EXT_texture_cube_map_array, +#endif +#ifdef GL_EXT_texture_edge_clamp + &__GLEW_EXT_texture_edge_clamp, +#endif +#ifdef GL_EXT_texture_env + &__GLEW_EXT_texture_env, +#endif +#ifdef GL_EXT_texture_env_add + &__GLEW_EXT_texture_env_add, +#endif +#ifdef GL_EXT_texture_env_combine + &__GLEW_EXT_texture_env_combine, +#endif +#ifdef GL_EXT_texture_env_dot3 + &__GLEW_EXT_texture_env_dot3, +#endif +#ifdef GL_EXT_texture_filter_anisotropic + &__GLEW_EXT_texture_filter_anisotropic, +#endif +#ifdef GL_EXT_texture_filter_minmax + &__GLEW_EXT_texture_filter_minmax, +#endif +#ifdef GL_EXT_texture_format_BGRA8888 + &__GLEW_EXT_texture_format_BGRA8888, +#endif +#ifdef GL_EXT_texture_integer + &__GLEW_EXT_texture_integer, +#endif +#ifdef GL_EXT_texture_lod_bias + &__GLEW_EXT_texture_lod_bias, +#endif +#ifdef GL_EXT_texture_mirror_clamp + &__GLEW_EXT_texture_mirror_clamp, +#endif +#ifdef GL_EXT_texture_norm16 + &__GLEW_EXT_texture_norm16, +#endif +#ifdef GL_EXT_texture_object + &__GLEW_EXT_texture_object, +#endif +#ifdef GL_EXT_texture_perturb_normal + &__GLEW_EXT_texture_perturb_normal, +#endif +#ifdef GL_EXT_texture_rectangle + &__GLEW_EXT_texture_rectangle, +#endif +#ifdef GL_EXT_texture_rg + &__GLEW_EXT_texture_rg, +#endif +#ifdef GL_EXT_texture_sRGB + &__GLEW_EXT_texture_sRGB, +#endif +#ifdef GL_EXT_texture_sRGB_R8 + &__GLEW_EXT_texture_sRGB_R8, +#endif +#ifdef GL_EXT_texture_sRGB_RG8 + &__GLEW_EXT_texture_sRGB_RG8, +#endif +#ifdef GL_EXT_texture_sRGB_decode + &__GLEW_EXT_texture_sRGB_decode, +#endif +#ifdef GL_EXT_texture_shared_exponent + &__GLEW_EXT_texture_shared_exponent, +#endif +#ifdef GL_EXT_texture_snorm + &__GLEW_EXT_texture_snorm, +#endif +#ifdef GL_EXT_texture_storage + &__GLEW_EXT_texture_storage, +#endif +#ifdef GL_EXT_texture_swizzle + &__GLEW_EXT_texture_swizzle, +#endif +#ifdef GL_EXT_texture_type_2_10_10_10_REV + &__GLEW_EXT_texture_type_2_10_10_10_REV, +#endif +#ifdef GL_EXT_texture_view + &__GLEW_EXT_texture_view, +#endif +#ifdef GL_EXT_timer_query + &__GLEW_EXT_timer_query, +#endif +#ifdef GL_EXT_transform_feedback + &__GLEW_EXT_transform_feedback, +#endif +#ifdef GL_EXT_unpack_subimage + &__GLEW_EXT_unpack_subimage, +#endif +#ifdef GL_EXT_vertex_array + &__GLEW_EXT_vertex_array, +#endif +#ifdef GL_EXT_vertex_array_bgra + &__GLEW_EXT_vertex_array_bgra, +#endif +#ifdef GL_EXT_vertex_array_setXXX + &__GLEW_EXT_vertex_array_setXXX, +#endif +#ifdef GL_EXT_vertex_attrib_64bit + &__GLEW_EXT_vertex_attrib_64bit, +#endif +#ifdef GL_EXT_vertex_shader + &__GLEW_EXT_vertex_shader, +#endif +#ifdef GL_EXT_vertex_weighting + &__GLEW_EXT_vertex_weighting, +#endif +#ifdef GL_EXT_win32_keyed_mutex + &__GLEW_EXT_win32_keyed_mutex, +#endif +#ifdef GL_EXT_window_rectangles + &__GLEW_EXT_window_rectangles, +#endif +#ifdef GL_EXT_x11_sync_object + &__GLEW_EXT_x11_sync_object, +#endif +#ifdef GL_GREMEDY_frame_terminator + &__GLEW_GREMEDY_frame_terminator, +#endif +#ifdef GL_GREMEDY_string_marker + &__GLEW_GREMEDY_string_marker, +#endif +#ifdef GL_HP_convolution_border_modes + &__GLEW_HP_convolution_border_modes, +#endif +#ifdef GL_HP_image_transform + &__GLEW_HP_image_transform, +#endif +#ifdef GL_HP_occlusion_test + &__GLEW_HP_occlusion_test, +#endif +#ifdef GL_HP_texture_lighting + &__GLEW_HP_texture_lighting, +#endif +#ifdef GL_IBM_cull_vertex + &__GLEW_IBM_cull_vertex, +#endif +#ifdef GL_IBM_multimode_draw_arrays + &__GLEW_IBM_multimode_draw_arrays, +#endif +#ifdef GL_IBM_rasterpos_clip + &__GLEW_IBM_rasterpos_clip, +#endif +#ifdef GL_IBM_static_data + &__GLEW_IBM_static_data, +#endif +#ifdef GL_IBM_texture_mirrored_repeat + &__GLEW_IBM_texture_mirrored_repeat, +#endif +#ifdef GL_IBM_vertex_array_lists + &__GLEW_IBM_vertex_array_lists, +#endif +#ifdef GL_INGR_color_clamp + &__GLEW_INGR_color_clamp, +#endif +#ifdef GL_INGR_interlace_read + &__GLEW_INGR_interlace_read, +#endif +#ifdef GL_INTEL_conservative_rasterization + &__GLEW_INTEL_conservative_rasterization, +#endif +#ifdef GL_INTEL_fragment_shader_ordering + &__GLEW_INTEL_fragment_shader_ordering, +#endif +#ifdef GL_INTEL_framebuffer_CMAA + &__GLEW_INTEL_framebuffer_CMAA, +#endif +#ifdef GL_INTEL_map_texture + &__GLEW_INTEL_map_texture, +#endif +#ifdef GL_INTEL_parallel_arrays + &__GLEW_INTEL_parallel_arrays, +#endif +#ifdef GL_INTEL_performance_query + &__GLEW_INTEL_performance_query, +#endif +#ifdef GL_INTEL_texture_scissor + &__GLEW_INTEL_texture_scissor, +#endif +#ifdef GL_KHR_blend_equation_advanced + &__GLEW_KHR_blend_equation_advanced, +#endif +#ifdef GL_KHR_blend_equation_advanced_coherent + &__GLEW_KHR_blend_equation_advanced_coherent, +#endif +#ifdef GL_KHR_context_flush_control + &__GLEW_KHR_context_flush_control, +#endif +#ifdef GL_KHR_debug + &__GLEW_KHR_debug, +#endif +#ifdef GL_KHR_no_error + &__GLEW_KHR_no_error, +#endif +#ifdef GL_KHR_parallel_shader_compile + &__GLEW_KHR_parallel_shader_compile, +#endif +#ifdef GL_KHR_robust_buffer_access_behavior + &__GLEW_KHR_robust_buffer_access_behavior, +#endif +#ifdef GL_KHR_robustness + &__GLEW_KHR_robustness, +#endif +#ifdef GL_KHR_texture_compression_astc_hdr + &__GLEW_KHR_texture_compression_astc_hdr, +#endif +#ifdef GL_KHR_texture_compression_astc_ldr + &__GLEW_KHR_texture_compression_astc_ldr, +#endif +#ifdef GL_KHR_texture_compression_astc_sliced_3d + &__GLEW_KHR_texture_compression_astc_sliced_3d, +#endif +#ifdef GL_KTX_buffer_region + &__GLEW_KTX_buffer_region, +#endif +#ifdef GL_MESAX_texture_stack + &__GLEW_MESAX_texture_stack, +#endif +#ifdef GL_MESA_pack_invert + &__GLEW_MESA_pack_invert, +#endif +#ifdef GL_MESA_resize_buffers + &__GLEW_MESA_resize_buffers, +#endif +#ifdef GL_MESA_shader_integer_functions + &__GLEW_MESA_shader_integer_functions, +#endif +#ifdef GL_MESA_window_pos + &__GLEW_MESA_window_pos, +#endif +#ifdef GL_MESA_ycbcr_texture + &__GLEW_MESA_ycbcr_texture, +#endif +#ifdef GL_NVX_blend_equation_advanced_multi_draw_buffers + &__GLEW_NVX_blend_equation_advanced_multi_draw_buffers, +#endif +#ifdef GL_NVX_conditional_render + &__GLEW_NVX_conditional_render, +#endif +#ifdef GL_NVX_gpu_memory_info + &__GLEW_NVX_gpu_memory_info, +#endif +#ifdef GL_NVX_linked_gpu_multicast + &__GLEW_NVX_linked_gpu_multicast, +#endif +#ifdef GL_NV_3dvision_settings + &__GLEW_NV_3dvision_settings, +#endif +#ifdef GL_NV_EGL_stream_consumer_external + &__GLEW_NV_EGL_stream_consumer_external, +#endif +#ifdef GL_NV_alpha_to_coverage_dither_control + &__GLEW_NV_alpha_to_coverage_dither_control, +#endif +#ifdef GL_NV_bgr + &__GLEW_NV_bgr, +#endif +#ifdef GL_NV_bindless_multi_draw_indirect + &__GLEW_NV_bindless_multi_draw_indirect, +#endif +#ifdef GL_NV_bindless_multi_draw_indirect_count + &__GLEW_NV_bindless_multi_draw_indirect_count, +#endif +#ifdef GL_NV_bindless_texture + &__GLEW_NV_bindless_texture, +#endif +#ifdef GL_NV_blend_equation_advanced + &__GLEW_NV_blend_equation_advanced, +#endif +#ifdef GL_NV_blend_equation_advanced_coherent + &__GLEW_NV_blend_equation_advanced_coherent, +#endif +#ifdef GL_NV_blend_minmax_factor + &__GLEW_NV_blend_minmax_factor, +#endif +#ifdef GL_NV_blend_square + &__GLEW_NV_blend_square, +#endif +#ifdef GL_NV_clip_space_w_scaling + &__GLEW_NV_clip_space_w_scaling, +#endif +#ifdef GL_NV_command_list + &__GLEW_NV_command_list, +#endif +#ifdef GL_NV_compute_program5 + &__GLEW_NV_compute_program5, +#endif +#ifdef GL_NV_conditional_render + &__GLEW_NV_conditional_render, +#endif +#ifdef GL_NV_conservative_raster + &__GLEW_NV_conservative_raster, +#endif +#ifdef GL_NV_conservative_raster_dilate + &__GLEW_NV_conservative_raster_dilate, +#endif +#ifdef GL_NV_conservative_raster_pre_snap_triangles + &__GLEW_NV_conservative_raster_pre_snap_triangles, +#endif +#ifdef GL_NV_copy_buffer + &__GLEW_NV_copy_buffer, +#endif +#ifdef GL_NV_copy_depth_to_color + &__GLEW_NV_copy_depth_to_color, +#endif +#ifdef GL_NV_copy_image + &__GLEW_NV_copy_image, +#endif +#ifdef GL_NV_deep_texture3D + &__GLEW_NV_deep_texture3D, +#endif +#ifdef GL_NV_depth_buffer_float + &__GLEW_NV_depth_buffer_float, +#endif +#ifdef GL_NV_depth_clamp + &__GLEW_NV_depth_clamp, +#endif +#ifdef GL_NV_depth_range_unclamped + &__GLEW_NV_depth_range_unclamped, +#endif +#ifdef GL_NV_draw_buffers + &__GLEW_NV_draw_buffers, +#endif +#ifdef GL_NV_draw_instanced + &__GLEW_NV_draw_instanced, +#endif +#ifdef GL_NV_draw_texture + &__GLEW_NV_draw_texture, +#endif +#ifdef GL_NV_draw_vulkan_image + &__GLEW_NV_draw_vulkan_image, +#endif +#ifdef GL_NV_evaluators + &__GLEW_NV_evaluators, +#endif +#ifdef GL_NV_explicit_attrib_location + &__GLEW_NV_explicit_attrib_location, +#endif +#ifdef GL_NV_explicit_multisample + &__GLEW_NV_explicit_multisample, +#endif +#ifdef GL_NV_fbo_color_attachments + &__GLEW_NV_fbo_color_attachments, +#endif +#ifdef GL_NV_fence + &__GLEW_NV_fence, +#endif +#ifdef GL_NV_fill_rectangle + &__GLEW_NV_fill_rectangle, +#endif +#ifdef GL_NV_float_buffer + &__GLEW_NV_float_buffer, +#endif +#ifdef GL_NV_fog_distance + &__GLEW_NV_fog_distance, +#endif +#ifdef GL_NV_fragment_coverage_to_color + &__GLEW_NV_fragment_coverage_to_color, +#endif +#ifdef GL_NV_fragment_program + &__GLEW_NV_fragment_program, +#endif +#ifdef GL_NV_fragment_program2 + &__GLEW_NV_fragment_program2, +#endif +#ifdef GL_NV_fragment_program4 + &__GLEW_NV_fragment_program4, +#endif +#ifdef GL_NV_fragment_program_option + &__GLEW_NV_fragment_program_option, +#endif +#ifdef GL_NV_fragment_shader_interlock + &__GLEW_NV_fragment_shader_interlock, +#endif +#ifdef GL_NV_framebuffer_blit + &__GLEW_NV_framebuffer_blit, +#endif +#ifdef GL_NV_framebuffer_mixed_samples + &__GLEW_NV_framebuffer_mixed_samples, +#endif +#ifdef GL_NV_framebuffer_multisample + &__GLEW_NV_framebuffer_multisample, +#endif +#ifdef GL_NV_framebuffer_multisample_coverage + &__GLEW_NV_framebuffer_multisample_coverage, +#endif +#ifdef GL_NV_generate_mipmap_sRGB + &__GLEW_NV_generate_mipmap_sRGB, +#endif +#ifdef GL_NV_geometry_program4 + &__GLEW_NV_geometry_program4, +#endif +#ifdef GL_NV_geometry_shader4 + &__GLEW_NV_geometry_shader4, +#endif +#ifdef GL_NV_geometry_shader_passthrough + &__GLEW_NV_geometry_shader_passthrough, +#endif +#ifdef GL_NV_gpu_multicast + &__GLEW_NV_gpu_multicast, +#endif +#ifdef GL_NV_gpu_program4 + &__GLEW_NV_gpu_program4, +#endif +#ifdef GL_NV_gpu_program5 + &__GLEW_NV_gpu_program5, +#endif +#ifdef GL_NV_gpu_program5_mem_extended + &__GLEW_NV_gpu_program5_mem_extended, +#endif +#ifdef GL_NV_gpu_program_fp64 + &__GLEW_NV_gpu_program_fp64, +#endif +#ifdef GL_NV_gpu_shader5 + &__GLEW_NV_gpu_shader5, +#endif +#ifdef GL_NV_half_float + &__GLEW_NV_half_float, +#endif +#ifdef GL_NV_image_formats + &__GLEW_NV_image_formats, +#endif +#ifdef GL_NV_instanced_arrays + &__GLEW_NV_instanced_arrays, +#endif +#ifdef GL_NV_internalformat_sample_query + &__GLEW_NV_internalformat_sample_query, +#endif +#ifdef GL_NV_light_max_exponent + &__GLEW_NV_light_max_exponent, +#endif +#ifdef GL_NV_multisample_coverage + &__GLEW_NV_multisample_coverage, +#endif +#ifdef GL_NV_multisample_filter_hint + &__GLEW_NV_multisample_filter_hint, +#endif +#ifdef GL_NV_non_square_matrices + &__GLEW_NV_non_square_matrices, +#endif +#ifdef GL_NV_occlusion_query + &__GLEW_NV_occlusion_query, +#endif +#ifdef GL_NV_pack_subimage + &__GLEW_NV_pack_subimage, +#endif +#ifdef GL_NV_packed_depth_stencil + &__GLEW_NV_packed_depth_stencil, +#endif +#ifdef GL_NV_packed_float + &__GLEW_NV_packed_float, +#endif +#ifdef GL_NV_packed_float_linear + &__GLEW_NV_packed_float_linear, +#endif +#ifdef GL_NV_parameter_buffer_object + &__GLEW_NV_parameter_buffer_object, +#endif +#ifdef GL_NV_parameter_buffer_object2 + &__GLEW_NV_parameter_buffer_object2, +#endif +#ifdef GL_NV_path_rendering + &__GLEW_NV_path_rendering, +#endif +#ifdef GL_NV_path_rendering_shared_edge + &__GLEW_NV_path_rendering_shared_edge, +#endif +#ifdef GL_NV_pixel_buffer_object + &__GLEW_NV_pixel_buffer_object, +#endif +#ifdef GL_NV_pixel_data_range + &__GLEW_NV_pixel_data_range, +#endif +#ifdef GL_NV_platform_binary + &__GLEW_NV_platform_binary, +#endif +#ifdef GL_NV_point_sprite + &__GLEW_NV_point_sprite, +#endif +#ifdef GL_NV_polygon_mode + &__GLEW_NV_polygon_mode, +#endif +#ifdef GL_NV_present_video + &__GLEW_NV_present_video, +#endif +#ifdef GL_NV_primitive_restart + &__GLEW_NV_primitive_restart, +#endif +#ifdef GL_NV_read_depth + &__GLEW_NV_read_depth, +#endif +#ifdef GL_NV_read_depth_stencil + &__GLEW_NV_read_depth_stencil, +#endif +#ifdef GL_NV_read_stencil + &__GLEW_NV_read_stencil, +#endif +#ifdef GL_NV_register_combiners + &__GLEW_NV_register_combiners, +#endif +#ifdef GL_NV_register_combiners2 + &__GLEW_NV_register_combiners2, +#endif +#ifdef GL_NV_robustness_video_memory_purge + &__GLEW_NV_robustness_video_memory_purge, +#endif +#ifdef GL_NV_sRGB_formats + &__GLEW_NV_sRGB_formats, +#endif +#ifdef GL_NV_sample_locations + &__GLEW_NV_sample_locations, +#endif +#ifdef GL_NV_sample_mask_override_coverage + &__GLEW_NV_sample_mask_override_coverage, +#endif +#ifdef GL_NV_shader_atomic_counters + &__GLEW_NV_shader_atomic_counters, +#endif +#ifdef GL_NV_shader_atomic_float + &__GLEW_NV_shader_atomic_float, +#endif +#ifdef GL_NV_shader_atomic_float64 + &__GLEW_NV_shader_atomic_float64, +#endif +#ifdef GL_NV_shader_atomic_fp16_vector + &__GLEW_NV_shader_atomic_fp16_vector, +#endif +#ifdef GL_NV_shader_atomic_int64 + &__GLEW_NV_shader_atomic_int64, +#endif +#ifdef GL_NV_shader_buffer_load + &__GLEW_NV_shader_buffer_load, +#endif +#ifdef GL_NV_shader_noperspective_interpolation + &__GLEW_NV_shader_noperspective_interpolation, +#endif +#ifdef GL_NV_shader_storage_buffer_object + &__GLEW_NV_shader_storage_buffer_object, +#endif +#ifdef GL_NV_shader_thread_group + &__GLEW_NV_shader_thread_group, +#endif +#ifdef GL_NV_shader_thread_shuffle + &__GLEW_NV_shader_thread_shuffle, +#endif +#ifdef GL_NV_shadow_samplers_array + &__GLEW_NV_shadow_samplers_array, +#endif +#ifdef GL_NV_shadow_samplers_cube + &__GLEW_NV_shadow_samplers_cube, +#endif +#ifdef GL_NV_stereo_view_rendering + &__GLEW_NV_stereo_view_rendering, +#endif +#ifdef GL_NV_tessellation_program5 + &__GLEW_NV_tessellation_program5, +#endif +#ifdef GL_NV_texgen_emboss + &__GLEW_NV_texgen_emboss, +#endif +#ifdef GL_NV_texgen_reflection + &__GLEW_NV_texgen_reflection, +#endif +#ifdef GL_NV_texture_array + &__GLEW_NV_texture_array, +#endif +#ifdef GL_NV_texture_barrier + &__GLEW_NV_texture_barrier, +#endif +#ifdef GL_NV_texture_border_clamp + &__GLEW_NV_texture_border_clamp, +#endif +#ifdef GL_NV_texture_compression_latc + &__GLEW_NV_texture_compression_latc, +#endif +#ifdef GL_NV_texture_compression_s3tc + &__GLEW_NV_texture_compression_s3tc, +#endif +#ifdef GL_NV_texture_compression_s3tc_update + &__GLEW_NV_texture_compression_s3tc_update, +#endif +#ifdef GL_NV_texture_compression_vtc + &__GLEW_NV_texture_compression_vtc, +#endif +#ifdef GL_NV_texture_env_combine4 + &__GLEW_NV_texture_env_combine4, +#endif +#ifdef GL_NV_texture_expand_normal + &__GLEW_NV_texture_expand_normal, +#endif +#ifdef GL_NV_texture_multisample + &__GLEW_NV_texture_multisample, +#endif +#ifdef GL_NV_texture_npot_2D_mipmap + &__GLEW_NV_texture_npot_2D_mipmap, +#endif +#ifdef GL_NV_texture_rectangle + &__GLEW_NV_texture_rectangle, +#endif +#ifdef GL_NV_texture_rectangle_compressed + &__GLEW_NV_texture_rectangle_compressed, +#endif +#ifdef GL_NV_texture_shader + &__GLEW_NV_texture_shader, +#endif +#ifdef GL_NV_texture_shader2 + &__GLEW_NV_texture_shader2, +#endif +#ifdef GL_NV_texture_shader3 + &__GLEW_NV_texture_shader3, +#endif +#ifdef GL_NV_transform_feedback + &__GLEW_NV_transform_feedback, +#endif +#ifdef GL_NV_transform_feedback2 + &__GLEW_NV_transform_feedback2, +#endif +#ifdef GL_NV_uniform_buffer_unified_memory + &__GLEW_NV_uniform_buffer_unified_memory, +#endif +#ifdef GL_NV_vdpau_interop + &__GLEW_NV_vdpau_interop, +#endif +#ifdef GL_NV_vertex_array_range + &__GLEW_NV_vertex_array_range, +#endif +#ifdef GL_NV_vertex_array_range2 + &__GLEW_NV_vertex_array_range2, +#endif +#ifdef GL_NV_vertex_attrib_integer_64bit + &__GLEW_NV_vertex_attrib_integer_64bit, +#endif +#ifdef GL_NV_vertex_buffer_unified_memory + &__GLEW_NV_vertex_buffer_unified_memory, +#endif +#ifdef GL_NV_vertex_program + &__GLEW_NV_vertex_program, +#endif +#ifdef GL_NV_vertex_program1_1 + &__GLEW_NV_vertex_program1_1, +#endif +#ifdef GL_NV_vertex_program2 + &__GLEW_NV_vertex_program2, +#endif +#ifdef GL_NV_vertex_program2_option + &__GLEW_NV_vertex_program2_option, +#endif +#ifdef GL_NV_vertex_program3 + &__GLEW_NV_vertex_program3, +#endif +#ifdef GL_NV_vertex_program4 + &__GLEW_NV_vertex_program4, +#endif +#ifdef GL_NV_video_capture + &__GLEW_NV_video_capture, +#endif +#ifdef GL_NV_viewport_array + &__GLEW_NV_viewport_array, +#endif +#ifdef GL_NV_viewport_array2 + &__GLEW_NV_viewport_array2, +#endif +#ifdef GL_NV_viewport_swizzle + &__GLEW_NV_viewport_swizzle, +#endif +#ifdef GL_OES_byte_coordinates + &__GLEW_OES_byte_coordinates, +#endif +#ifdef GL_OML_interlace + &__GLEW_OML_interlace, +#endif +#ifdef GL_OML_resample + &__GLEW_OML_resample, +#endif +#ifdef GL_OML_subsample + &__GLEW_OML_subsample, +#endif +#ifdef GL_OVR_multiview + &__GLEW_OVR_multiview, +#endif +#ifdef GL_OVR_multiview2 + &__GLEW_OVR_multiview2, +#endif +#ifdef GL_OVR_multiview_multisampled_render_to_texture + &__GLEW_OVR_multiview_multisampled_render_to_texture, +#endif +#ifdef GL_PGI_misc_hints + &__GLEW_PGI_misc_hints, +#endif +#ifdef GL_PGI_vertex_hints + &__GLEW_PGI_vertex_hints, +#endif +#ifdef GL_QCOM_alpha_test + &__GLEW_QCOM_alpha_test, +#endif +#ifdef GL_QCOM_binning_control + &__GLEW_QCOM_binning_control, +#endif +#ifdef GL_QCOM_driver_control + &__GLEW_QCOM_driver_control, +#endif +#ifdef GL_QCOM_extended_get + &__GLEW_QCOM_extended_get, +#endif +#ifdef GL_QCOM_extended_get2 + &__GLEW_QCOM_extended_get2, +#endif +#ifdef GL_QCOM_framebuffer_foveated + &__GLEW_QCOM_framebuffer_foveated, +#endif +#ifdef GL_QCOM_perfmon_global_mode + &__GLEW_QCOM_perfmon_global_mode, +#endif +#ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent + &__GLEW_QCOM_shader_framebuffer_fetch_noncoherent, +#endif +#ifdef GL_QCOM_tiled_rendering + &__GLEW_QCOM_tiled_rendering, +#endif +#ifdef GL_QCOM_writeonly_rendering + &__GLEW_QCOM_writeonly_rendering, +#endif +#ifdef GL_REGAL_ES1_0_compatibility + &__GLEW_REGAL_ES1_0_compatibility, +#endif +#ifdef GL_REGAL_ES1_1_compatibility + &__GLEW_REGAL_ES1_1_compatibility, +#endif +#ifdef GL_REGAL_enable + &__GLEW_REGAL_enable, +#endif +#ifdef GL_REGAL_error_string + &__GLEW_REGAL_error_string, +#endif +#ifdef GL_REGAL_extension_query + &__GLEW_REGAL_extension_query, +#endif +#ifdef GL_REGAL_log + &__GLEW_REGAL_log, +#endif +#ifdef GL_REGAL_proc_address + &__GLEW_REGAL_proc_address, +#endif +#ifdef GL_REND_screen_coordinates + &__GLEW_REND_screen_coordinates, +#endif +#ifdef GL_S3_s3tc + &__GLEW_S3_s3tc, +#endif +#ifdef GL_SGIS_clip_band_hint + &__GLEW_SGIS_clip_band_hint, +#endif +#ifdef GL_SGIS_color_range + &__GLEW_SGIS_color_range, +#endif +#ifdef GL_SGIS_detail_texture + &__GLEW_SGIS_detail_texture, +#endif +#ifdef GL_SGIS_fog_function + &__GLEW_SGIS_fog_function, +#endif +#ifdef GL_SGIS_generate_mipmap + &__GLEW_SGIS_generate_mipmap, +#endif +#ifdef GL_SGIS_line_texgen + &__GLEW_SGIS_line_texgen, +#endif +#ifdef GL_SGIS_multisample + &__GLEW_SGIS_multisample, +#endif +#ifdef GL_SGIS_multitexture + &__GLEW_SGIS_multitexture, +#endif +#ifdef GL_SGIS_pixel_texture + &__GLEW_SGIS_pixel_texture, +#endif +#ifdef GL_SGIS_point_line_texgen + &__GLEW_SGIS_point_line_texgen, +#endif +#ifdef GL_SGIS_shared_multisample + &__GLEW_SGIS_shared_multisample, +#endif +#ifdef GL_SGIS_sharpen_texture + &__GLEW_SGIS_sharpen_texture, +#endif +#ifdef GL_SGIS_texture4D + &__GLEW_SGIS_texture4D, +#endif +#ifdef GL_SGIS_texture_border_clamp + &__GLEW_SGIS_texture_border_clamp, +#endif +#ifdef GL_SGIS_texture_edge_clamp + &__GLEW_SGIS_texture_edge_clamp, +#endif +#ifdef GL_SGIS_texture_filter4 + &__GLEW_SGIS_texture_filter4, +#endif +#ifdef GL_SGIS_texture_lod + &__GLEW_SGIS_texture_lod, +#endif +#ifdef GL_SGIS_texture_select + &__GLEW_SGIS_texture_select, +#endif +#ifdef GL_SGIX_async + &__GLEW_SGIX_async, +#endif +#ifdef GL_SGIX_async_histogram + &__GLEW_SGIX_async_histogram, +#endif +#ifdef GL_SGIX_async_pixel + &__GLEW_SGIX_async_pixel, +#endif +#ifdef GL_SGIX_bali_g_instruments + &__GLEW_SGIX_bali_g_instruments, +#endif +#ifdef GL_SGIX_bali_r_instruments + &__GLEW_SGIX_bali_r_instruments, +#endif +#ifdef GL_SGIX_bali_timer_instruments + &__GLEW_SGIX_bali_timer_instruments, +#endif +#ifdef GL_SGIX_blend_alpha_minmax + &__GLEW_SGIX_blend_alpha_minmax, +#endif +#ifdef GL_SGIX_blend_cadd + &__GLEW_SGIX_blend_cadd, +#endif +#ifdef GL_SGIX_blend_cmultiply + &__GLEW_SGIX_blend_cmultiply, +#endif +#ifdef GL_SGIX_calligraphic_fragment + &__GLEW_SGIX_calligraphic_fragment, +#endif +#ifdef GL_SGIX_clipmap + &__GLEW_SGIX_clipmap, +#endif +#ifdef GL_SGIX_color_matrix_accuracy + &__GLEW_SGIX_color_matrix_accuracy, +#endif +#ifdef GL_SGIX_color_table_index_mode + &__GLEW_SGIX_color_table_index_mode, +#endif +#ifdef GL_SGIX_complex_polar + &__GLEW_SGIX_complex_polar, +#endif +#ifdef GL_SGIX_convolution_accuracy + &__GLEW_SGIX_convolution_accuracy, +#endif +#ifdef GL_SGIX_cube_map + &__GLEW_SGIX_cube_map, +#endif +#ifdef GL_SGIX_cylinder_texgen + &__GLEW_SGIX_cylinder_texgen, +#endif +#ifdef GL_SGIX_datapipe + &__GLEW_SGIX_datapipe, +#endif +#ifdef GL_SGIX_decimation + &__GLEW_SGIX_decimation, +#endif +#ifdef GL_SGIX_depth_pass_instrument + &__GLEW_SGIX_depth_pass_instrument, +#endif +#ifdef GL_SGIX_depth_texture + &__GLEW_SGIX_depth_texture, +#endif +#ifdef GL_SGIX_dvc + &__GLEW_SGIX_dvc, +#endif +#ifdef GL_SGIX_flush_raster + &__GLEW_SGIX_flush_raster, +#endif +#ifdef GL_SGIX_fog_blend + &__GLEW_SGIX_fog_blend, +#endif +#ifdef GL_SGIX_fog_factor_to_alpha + &__GLEW_SGIX_fog_factor_to_alpha, +#endif +#ifdef GL_SGIX_fog_layers + &__GLEW_SGIX_fog_layers, +#endif +#ifdef GL_SGIX_fog_offset + &__GLEW_SGIX_fog_offset, +#endif +#ifdef GL_SGIX_fog_patchy + &__GLEW_SGIX_fog_patchy, +#endif +#ifdef GL_SGIX_fog_scale + &__GLEW_SGIX_fog_scale, +#endif +#ifdef GL_SGIX_fog_texture + &__GLEW_SGIX_fog_texture, +#endif +#ifdef GL_SGIX_fragment_lighting_space + &__GLEW_SGIX_fragment_lighting_space, +#endif +#ifdef GL_SGIX_fragment_specular_lighting + &__GLEW_SGIX_fragment_specular_lighting, +#endif +#ifdef GL_SGIX_fragments_instrument + &__GLEW_SGIX_fragments_instrument, +#endif +#ifdef GL_SGIX_framezoom + &__GLEW_SGIX_framezoom, +#endif +#ifdef GL_SGIX_icc_texture + &__GLEW_SGIX_icc_texture, +#endif +#ifdef GL_SGIX_igloo_interface + &__GLEW_SGIX_igloo_interface, +#endif +#ifdef GL_SGIX_image_compression + &__GLEW_SGIX_image_compression, +#endif +#ifdef GL_SGIX_impact_pixel_texture + &__GLEW_SGIX_impact_pixel_texture, +#endif +#ifdef GL_SGIX_instrument_error + &__GLEW_SGIX_instrument_error, +#endif +#ifdef GL_SGIX_interlace + &__GLEW_SGIX_interlace, +#endif +#ifdef GL_SGIX_ir_instrument1 + &__GLEW_SGIX_ir_instrument1, +#endif +#ifdef GL_SGIX_line_quality_hint + &__GLEW_SGIX_line_quality_hint, +#endif +#ifdef GL_SGIX_list_priority + &__GLEW_SGIX_list_priority, +#endif +#ifdef GL_SGIX_mpeg1 + &__GLEW_SGIX_mpeg1, +#endif +#ifdef GL_SGIX_mpeg2 + &__GLEW_SGIX_mpeg2, +#endif +#ifdef GL_SGIX_nonlinear_lighting_pervertex + &__GLEW_SGIX_nonlinear_lighting_pervertex, +#endif +#ifdef GL_SGIX_nurbs_eval + &__GLEW_SGIX_nurbs_eval, +#endif +#ifdef GL_SGIX_occlusion_instrument + &__GLEW_SGIX_occlusion_instrument, +#endif +#ifdef GL_SGIX_packed_6bytes + &__GLEW_SGIX_packed_6bytes, +#endif +#ifdef GL_SGIX_pixel_texture + &__GLEW_SGIX_pixel_texture, +#endif +#ifdef GL_SGIX_pixel_texture_bits + &__GLEW_SGIX_pixel_texture_bits, +#endif +#ifdef GL_SGIX_pixel_texture_lod + &__GLEW_SGIX_pixel_texture_lod, +#endif +#ifdef GL_SGIX_pixel_tiles + &__GLEW_SGIX_pixel_tiles, +#endif +#ifdef GL_SGIX_polynomial_ffd + &__GLEW_SGIX_polynomial_ffd, +#endif +#ifdef GL_SGIX_quad_mesh + &__GLEW_SGIX_quad_mesh, +#endif +#ifdef GL_SGIX_reference_plane + &__GLEW_SGIX_reference_plane, +#endif +#ifdef GL_SGIX_resample + &__GLEW_SGIX_resample, +#endif +#ifdef GL_SGIX_scalebias_hint + &__GLEW_SGIX_scalebias_hint, +#endif +#ifdef GL_SGIX_shadow + &__GLEW_SGIX_shadow, +#endif +#ifdef GL_SGIX_shadow_ambient + &__GLEW_SGIX_shadow_ambient, +#endif +#ifdef GL_SGIX_slim + &__GLEW_SGIX_slim, +#endif +#ifdef GL_SGIX_spotlight_cutoff + &__GLEW_SGIX_spotlight_cutoff, +#endif +#ifdef GL_SGIX_sprite + &__GLEW_SGIX_sprite, +#endif +#ifdef GL_SGIX_subdiv_patch + &__GLEW_SGIX_subdiv_patch, +#endif +#ifdef GL_SGIX_subsample + &__GLEW_SGIX_subsample, +#endif +#ifdef GL_SGIX_tag_sample_buffer + &__GLEW_SGIX_tag_sample_buffer, +#endif +#ifdef GL_SGIX_texture_add_env + &__GLEW_SGIX_texture_add_env, +#endif +#ifdef GL_SGIX_texture_coordinate_clamp + &__GLEW_SGIX_texture_coordinate_clamp, +#endif +#ifdef GL_SGIX_texture_lod_bias + &__GLEW_SGIX_texture_lod_bias, +#endif +#ifdef GL_SGIX_texture_mipmap_anisotropic + &__GLEW_SGIX_texture_mipmap_anisotropic, +#endif +#ifdef GL_SGIX_texture_multi_buffer + &__GLEW_SGIX_texture_multi_buffer, +#endif +#ifdef GL_SGIX_texture_phase + &__GLEW_SGIX_texture_phase, +#endif +#ifdef GL_SGIX_texture_range + &__GLEW_SGIX_texture_range, +#endif +#ifdef GL_SGIX_texture_scale_bias + &__GLEW_SGIX_texture_scale_bias, +#endif +#ifdef GL_SGIX_texture_supersample + &__GLEW_SGIX_texture_supersample, +#endif +#ifdef GL_SGIX_vector_ops + &__GLEW_SGIX_vector_ops, +#endif +#ifdef GL_SGIX_vertex_array_object + &__GLEW_SGIX_vertex_array_object, +#endif +#ifdef GL_SGIX_vertex_preclip + &__GLEW_SGIX_vertex_preclip, +#endif +#ifdef GL_SGIX_vertex_preclip_hint + &__GLEW_SGIX_vertex_preclip_hint, +#endif +#ifdef GL_SGIX_ycrcb + &__GLEW_SGIX_ycrcb, +#endif +#ifdef GL_SGIX_ycrcb_subsample + &__GLEW_SGIX_ycrcb_subsample, +#endif +#ifdef GL_SGIX_ycrcba + &__GLEW_SGIX_ycrcba, +#endif +#ifdef GL_SGI_color_matrix + &__GLEW_SGI_color_matrix, +#endif +#ifdef GL_SGI_color_table + &__GLEW_SGI_color_table, +#endif +#ifdef GL_SGI_complex + &__GLEW_SGI_complex, +#endif +#ifdef GL_SGI_complex_type + &__GLEW_SGI_complex_type, +#endif +#ifdef GL_SGI_fft + &__GLEW_SGI_fft, +#endif +#ifdef GL_SGI_texture_color_table + &__GLEW_SGI_texture_color_table, +#endif +#ifdef GL_SUNX_constant_data + &__GLEW_SUNX_constant_data, +#endif +#ifdef GL_SUN_convolution_border_modes + &__GLEW_SUN_convolution_border_modes, +#endif +#ifdef GL_SUN_global_alpha + &__GLEW_SUN_global_alpha, +#endif +#ifdef GL_SUN_mesh_array + &__GLEW_SUN_mesh_array, +#endif +#ifdef GL_SUN_read_video_pixels + &__GLEW_SUN_read_video_pixels, +#endif +#ifdef GL_SUN_slice_accum + &__GLEW_SUN_slice_accum, +#endif +#ifdef GL_SUN_triangle_list + &__GLEW_SUN_triangle_list, +#endif +#ifdef GL_SUN_vertex + &__GLEW_SUN_vertex, +#endif +#ifdef GL_WIN_phong_shading + &__GLEW_WIN_phong_shading, +#endif +#ifdef GL_WIN_scene_markerXXX + &__GLEW_WIN_scene_markerXXX, +#endif +#ifdef GL_WIN_specular_fog + &__GLEW_WIN_specular_fog, +#endif +#ifdef GL_WIN_swap_hint + &__GLEW_WIN_swap_hint, +#endif + NULL +}; +static GLboolean _glewInit_GL_VERSION_1_2 (); +static GLboolean _glewInit_GL_VERSION_1_3 (); +static GLboolean _glewInit_GL_VERSION_1_4 (); +static GLboolean _glewInit_GL_VERSION_1_5 (); +static GLboolean _glewInit_GL_VERSION_2_0 (); +static GLboolean _glewInit_GL_VERSION_2_1 (); +static GLboolean _glewInit_GL_VERSION_3_0 (); +static GLboolean _glewInit_GL_VERSION_3_1 (); +static GLboolean _glewInit_GL_VERSION_3_2 (); +static GLboolean _glewInit_GL_VERSION_3_3 (); +static GLboolean _glewInit_GL_VERSION_4_0 (); +static GLboolean _glewInit_GL_VERSION_4_5 (); +static GLboolean _glewInit_GL_VERSION_4_6 (); +static GLboolean _glewInit_GL_3DFX_tbuffer (); +static GLboolean _glewInit_GL_AMD_debug_output (); +static GLboolean _glewInit_GL_AMD_draw_buffers_blend (); +static GLboolean _glewInit_GL_AMD_framebuffer_sample_positions (); +static GLboolean _glewInit_GL_AMD_interleaved_elements (); +static GLboolean _glewInit_GL_AMD_multi_draw_indirect (); +static GLboolean _glewInit_GL_AMD_name_gen_delete (); +static GLboolean _glewInit_GL_AMD_occlusion_query_event (); +static GLboolean _glewInit_GL_AMD_performance_monitor (); +static GLboolean _glewInit_GL_AMD_sample_positions (); +static GLboolean _glewInit_GL_AMD_sparse_texture (); +static GLboolean _glewInit_GL_AMD_stencil_operation_extended (); +static GLboolean _glewInit_GL_AMD_vertex_shader_tessellator (); +static GLboolean _glewInit_GL_ANGLE_framebuffer_blit (); +static GLboolean _glewInit_GL_ANGLE_framebuffer_multisample (); +static GLboolean _glewInit_GL_ANGLE_instanced_arrays (); +static GLboolean _glewInit_GL_ANGLE_timer_query (); +static GLboolean _glewInit_GL_ANGLE_translated_shader_source (); +static GLboolean _glewInit_GL_APPLE_copy_texture_levels (); +static GLboolean _glewInit_GL_APPLE_element_array (); +static GLboolean _glewInit_GL_APPLE_fence (); +static GLboolean _glewInit_GL_APPLE_flush_buffer_range (); +static GLboolean _glewInit_GL_APPLE_framebuffer_multisample (); +static GLboolean _glewInit_GL_APPLE_object_purgeable (); +static GLboolean _glewInit_GL_APPLE_sync (); +static GLboolean _glewInit_GL_APPLE_texture_range (); +static GLboolean _glewInit_GL_APPLE_vertex_array_object (); +static GLboolean _glewInit_GL_APPLE_vertex_array_range (); +static GLboolean _glewInit_GL_APPLE_vertex_program_evaluators (); +static GLboolean _glewInit_GL_ARB_ES2_compatibility (); +static GLboolean _glewInit_GL_ARB_ES3_1_compatibility (); +static GLboolean _glewInit_GL_ARB_ES3_2_compatibility (); +static GLboolean _glewInit_GL_ARB_base_instance (); +static GLboolean _glewInit_GL_ARB_bindless_texture (); +static GLboolean _glewInit_GL_ARB_blend_func_extended (); +static GLboolean _glewInit_GL_ARB_buffer_storage (); +static GLboolean _glewInit_GL_ARB_cl_event (); +static GLboolean _glewInit_GL_ARB_clear_buffer_object (); +static GLboolean _glewInit_GL_ARB_clear_texture (); +static GLboolean _glewInit_GL_ARB_clip_control (); +static GLboolean _glewInit_GL_ARB_color_buffer_float (); +static GLboolean _glewInit_GL_ARB_compute_shader (); +static GLboolean _glewInit_GL_ARB_compute_variable_group_size (); +static GLboolean _glewInit_GL_ARB_copy_buffer (); +static GLboolean _glewInit_GL_ARB_copy_image (); +static GLboolean _glewInit_GL_ARB_debug_output (); +static GLboolean _glewInit_GL_ARB_direct_state_access (); +static GLboolean _glewInit_GL_ARB_draw_buffers (); +static GLboolean _glewInit_GL_ARB_draw_buffers_blend (); +static GLboolean _glewInit_GL_ARB_draw_elements_base_vertex (); +static GLboolean _glewInit_GL_ARB_draw_indirect (); +static GLboolean _glewInit_GL_ARB_framebuffer_no_attachments (); +static GLboolean _glewInit_GL_ARB_framebuffer_object (); +static GLboolean _glewInit_GL_ARB_geometry_shader4 (); +static GLboolean _glewInit_GL_ARB_get_program_binary (); +static GLboolean _glewInit_GL_ARB_get_texture_sub_image (); +static GLboolean _glewInit_GL_ARB_gl_spirv (); +static GLboolean _glewInit_GL_ARB_gpu_shader_fp64 (); +static GLboolean _glewInit_GL_ARB_gpu_shader_int64 (); +static GLboolean _glewInit_GL_ARB_imaging (); +static GLboolean _glewInit_GL_ARB_indirect_parameters (); +static GLboolean _glewInit_GL_ARB_instanced_arrays (); +static GLboolean _glewInit_GL_ARB_internalformat_query (); +static GLboolean _glewInit_GL_ARB_internalformat_query2 (); +static GLboolean _glewInit_GL_ARB_invalidate_subdata (); +static GLboolean _glewInit_GL_ARB_map_buffer_range (); +static GLboolean _glewInit_GL_ARB_matrix_palette (); +static GLboolean _glewInit_GL_ARB_multi_bind (); +static GLboolean _glewInit_GL_ARB_multi_draw_indirect (); +static GLboolean _glewInit_GL_ARB_multisample (); +static GLboolean _glewInit_GL_ARB_multitexture (); +static GLboolean _glewInit_GL_ARB_occlusion_query (); +static GLboolean _glewInit_GL_ARB_parallel_shader_compile (); +static GLboolean _glewInit_GL_ARB_point_parameters (); +static GLboolean _glewInit_GL_ARB_polygon_offset_clamp (); +static GLboolean _glewInit_GL_ARB_program_interface_query (); +static GLboolean _glewInit_GL_ARB_provoking_vertex (); +static GLboolean _glewInit_GL_ARB_robustness (); +static GLboolean _glewInit_GL_ARB_sample_locations (); +static GLboolean _glewInit_GL_ARB_sample_shading (); +static GLboolean _glewInit_GL_ARB_sampler_objects (); +static GLboolean _glewInit_GL_ARB_separate_shader_objects (); +static GLboolean _glewInit_GL_ARB_shader_atomic_counters (); +static GLboolean _glewInit_GL_ARB_shader_image_load_store (); +static GLboolean _glewInit_GL_ARB_shader_objects (); +static GLboolean _glewInit_GL_ARB_shader_storage_buffer_object (); +static GLboolean _glewInit_GL_ARB_shader_subroutine (); +static GLboolean _glewInit_GL_ARB_shading_language_include (); +static GLboolean _glewInit_GL_ARB_sparse_buffer (); +static GLboolean _glewInit_GL_ARB_sparse_texture (); +static GLboolean _glewInit_GL_ARB_sync (); +static GLboolean _glewInit_GL_ARB_tessellation_shader (); +static GLboolean _glewInit_GL_ARB_texture_barrier (); +static GLboolean _glewInit_GL_ARB_texture_buffer_object (); +static GLboolean _glewInit_GL_ARB_texture_buffer_range (); +static GLboolean _glewInit_GL_ARB_texture_compression (); +static GLboolean _glewInit_GL_ARB_texture_multisample (); +static GLboolean _glewInit_GL_ARB_texture_storage (); +static GLboolean _glewInit_GL_ARB_texture_storage_multisample (); +static GLboolean _glewInit_GL_ARB_texture_view (); +static GLboolean _glewInit_GL_ARB_timer_query (); +static GLboolean _glewInit_GL_ARB_transform_feedback2 (); +static GLboolean _glewInit_GL_ARB_transform_feedback3 (); +static GLboolean _glewInit_GL_ARB_transform_feedback_instanced (); +static GLboolean _glewInit_GL_ARB_transpose_matrix (); +static GLboolean _glewInit_GL_ARB_uniform_buffer_object (); +static GLboolean _glewInit_GL_ARB_vertex_array_object (); +static GLboolean _glewInit_GL_ARB_vertex_attrib_64bit (); +static GLboolean _glewInit_GL_ARB_vertex_attrib_binding (); +static GLboolean _glewInit_GL_ARB_vertex_blend (); +static GLboolean _glewInit_GL_ARB_vertex_buffer_object (); +static GLboolean _glewInit_GL_ARB_vertex_program (); +static GLboolean _glewInit_GL_ARB_vertex_shader (); +static GLboolean _glewInit_GL_ARB_vertex_type_2_10_10_10_rev (); +static GLboolean _glewInit_GL_ARB_viewport_array (); +static GLboolean _glewInit_GL_ARB_window_pos (); +static GLboolean _glewInit_GL_ATI_draw_buffers (); +static GLboolean _glewInit_GL_ATI_element_array (); +static GLboolean _glewInit_GL_ATI_envmap_bumpmap (); +static GLboolean _glewInit_GL_ATI_fragment_shader (); +static GLboolean _glewInit_GL_ATI_map_object_buffer (); +static GLboolean _glewInit_GL_ATI_pn_triangles (); +static GLboolean _glewInit_GL_ATI_separate_stencil (); +static GLboolean _glewInit_GL_ATI_vertex_array_object (); +static GLboolean _glewInit_GL_ATI_vertex_attrib_array_object (); +static GLboolean _glewInit_GL_ATI_vertex_streams (); +static GLboolean _glewInit_GL_EXT_base_instance (); +static GLboolean _glewInit_GL_EXT_bindable_uniform (); +static GLboolean _glewInit_GL_EXT_blend_color (); +static GLboolean _glewInit_GL_EXT_blend_equation_separate (); +static GLboolean _glewInit_GL_EXT_blend_func_extended (); +static GLboolean _glewInit_GL_EXT_blend_func_separate (); +static GLboolean _glewInit_GL_EXT_blend_minmax (); +static GLboolean _glewInit_GL_EXT_buffer_storage (); +static GLboolean _glewInit_GL_EXT_clear_texture (); +static GLboolean _glewInit_GL_EXT_color_subtable (); +static GLboolean _glewInit_GL_EXT_compiled_vertex_array (); +static GLboolean _glewInit_GL_EXT_convolution (); +static GLboolean _glewInit_GL_EXT_coordinate_frame (); +static GLboolean _glewInit_GL_EXT_copy_image (); +static GLboolean _glewInit_GL_EXT_copy_texture (); +static GLboolean _glewInit_GL_EXT_cull_vertex (); +static GLboolean _glewInit_GL_EXT_debug_label (); +static GLboolean _glewInit_GL_EXT_debug_marker (); +static GLboolean _glewInit_GL_EXT_depth_bounds_test (); +static GLboolean _glewInit_GL_EXT_direct_state_access (); +static GLboolean _glewInit_GL_EXT_discard_framebuffer (); +static GLboolean _glewInit_GL_EXT_draw_buffers (); +static GLboolean _glewInit_GL_EXT_draw_buffers2 (); +static GLboolean _glewInit_GL_EXT_draw_buffers_indexed (); +static GLboolean _glewInit_GL_EXT_draw_elements_base_vertex (); +static GLboolean _glewInit_GL_EXT_draw_instanced (); +static GLboolean _glewInit_GL_EXT_draw_range_elements (); +static GLboolean _glewInit_GL_EXT_external_buffer (); +static GLboolean _glewInit_GL_EXT_fog_coord (); +static GLboolean _glewInit_GL_EXT_fragment_lighting (); +static GLboolean _glewInit_GL_EXT_framebuffer_blit (); +static GLboolean _glewInit_GL_EXT_framebuffer_multisample (); +static GLboolean _glewInit_GL_EXT_framebuffer_object (); +static GLboolean _glewInit_GL_EXT_geometry_shader4 (); +static GLboolean _glewInit_GL_EXT_gpu_program_parameters (); +static GLboolean _glewInit_GL_EXT_gpu_shader4 (); +static GLboolean _glewInit_GL_EXT_histogram (); +static GLboolean _glewInit_GL_EXT_index_func (); +static GLboolean _glewInit_GL_EXT_index_material (); +static GLboolean _glewInit_GL_EXT_instanced_arrays (); +static GLboolean _glewInit_GL_EXT_light_texture (); +static GLboolean _glewInit_GL_EXT_map_buffer_range (); +static GLboolean _glewInit_GL_EXT_memory_object (); +static GLboolean _glewInit_GL_EXT_memory_object_fd (); +static GLboolean _glewInit_GL_EXT_memory_object_win32 (); +static GLboolean _glewInit_GL_EXT_multi_draw_arrays (); +static GLboolean _glewInit_GL_EXT_multi_draw_indirect (); +static GLboolean _glewInit_GL_EXT_multisample (); +static GLboolean _glewInit_GL_EXT_multisampled_render_to_texture (); +static GLboolean _glewInit_GL_EXT_multiview_draw_buffers (); +static GLboolean _glewInit_GL_EXT_paletted_texture (); +static GLboolean _glewInit_GL_EXT_pixel_transform (); +static GLboolean _glewInit_GL_EXT_point_parameters (); +static GLboolean _glewInit_GL_EXT_polygon_offset (); +static GLboolean _glewInit_GL_EXT_polygon_offset_clamp (); +static GLboolean _glewInit_GL_EXT_provoking_vertex (); +static GLboolean _glewInit_GL_EXT_raster_multisample (); +static GLboolean _glewInit_GL_EXT_scene_marker (); +static GLboolean _glewInit_GL_EXT_secondary_color (); +static GLboolean _glewInit_GL_EXT_semaphore (); +static GLboolean _glewInit_GL_EXT_semaphore_fd (); +static GLboolean _glewInit_GL_EXT_semaphore_win32 (); +static GLboolean _glewInit_GL_EXT_separate_shader_objects (); +static GLboolean _glewInit_GL_EXT_shader_image_load_store (); +static GLboolean _glewInit_GL_EXT_shader_pixel_local_storage2 (); +static GLboolean _glewInit_GL_EXT_sparse_texture (); +static GLboolean _glewInit_GL_EXT_stencil_two_side (); +static GLboolean _glewInit_GL_EXT_subtexture (); +static GLboolean _glewInit_GL_EXT_texture3D (); +static GLboolean _glewInit_GL_EXT_texture_array (); +static GLboolean _glewInit_GL_EXT_texture_buffer_object (); +static GLboolean _glewInit_GL_EXT_texture_integer (); +static GLboolean _glewInit_GL_EXT_texture_object (); +static GLboolean _glewInit_GL_EXT_texture_perturb_normal (); +static GLboolean _glewInit_GL_EXT_texture_storage (); +static GLboolean _glewInit_GL_EXT_texture_view (); +static GLboolean _glewInit_GL_EXT_timer_query (); +static GLboolean _glewInit_GL_EXT_transform_feedback (); +static GLboolean _glewInit_GL_EXT_vertex_array (); +static GLboolean _glewInit_GL_EXT_vertex_array_setXXX (); +static GLboolean _glewInit_GL_EXT_vertex_attrib_64bit (); +static GLboolean _glewInit_GL_EXT_vertex_shader (); +static GLboolean _glewInit_GL_EXT_vertex_weighting (); +static GLboolean _glewInit_GL_EXT_win32_keyed_mutex (); +static GLboolean _glewInit_GL_EXT_window_rectangles (); +static GLboolean _glewInit_GL_EXT_x11_sync_object (); +static GLboolean _glewInit_GL_GREMEDY_frame_terminator (); +static GLboolean _glewInit_GL_GREMEDY_string_marker (); +static GLboolean _glewInit_GL_HP_image_transform (); +static GLboolean _glewInit_GL_IBM_multimode_draw_arrays (); +static GLboolean _glewInit_GL_IBM_vertex_array_lists (); +static GLboolean _glewInit_GL_INTEL_map_texture (); +static GLboolean _glewInit_GL_INTEL_parallel_arrays (); +static GLboolean _glewInit_GL_INTEL_performance_query (); +static GLboolean _glewInit_GL_INTEL_texture_scissor (); +static GLboolean _glewInit_GL_KHR_blend_equation_advanced (); +static GLboolean _glewInit_GL_KHR_debug (); +static GLboolean _glewInit_GL_KHR_parallel_shader_compile (); +static GLboolean _glewInit_GL_KHR_robustness (); +static GLboolean _glewInit_GL_KTX_buffer_region (); +static GLboolean _glewInit_GL_MESA_resize_buffers (); +static GLboolean _glewInit_GL_MESA_window_pos (); +static GLboolean _glewInit_GL_NVX_conditional_render (); +static GLboolean _glewInit_GL_NVX_linked_gpu_multicast (); +static GLboolean _glewInit_GL_NV_3dvision_settings (); +static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect (); +static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect_count (); +static GLboolean _glewInit_GL_NV_bindless_texture (); +static GLboolean _glewInit_GL_NV_blend_equation_advanced (); +static GLboolean _glewInit_GL_NV_clip_space_w_scaling (); +static GLboolean _glewInit_GL_NV_command_list (); +static GLboolean _glewInit_GL_NV_conditional_render (); +static GLboolean _glewInit_GL_NV_conservative_raster (); +static GLboolean _glewInit_GL_NV_conservative_raster_dilate (); +static GLboolean _glewInit_GL_NV_conservative_raster_pre_snap_triangles (); +static GLboolean _glewInit_GL_NV_copy_buffer (); +static GLboolean _glewInit_GL_NV_copy_image (); +static GLboolean _glewInit_GL_NV_depth_buffer_float (); +static GLboolean _glewInit_GL_NV_draw_buffers (); +static GLboolean _glewInit_GL_NV_draw_instanced (); +static GLboolean _glewInit_GL_NV_draw_texture (); +static GLboolean _glewInit_GL_NV_draw_vulkan_image (); +static GLboolean _glewInit_GL_NV_evaluators (); +static GLboolean _glewInit_GL_NV_explicit_multisample (); +static GLboolean _glewInit_GL_NV_fence (); +static GLboolean _glewInit_GL_NV_fragment_coverage_to_color (); +static GLboolean _glewInit_GL_NV_fragment_program (); +static GLboolean _glewInit_GL_NV_framebuffer_blit (); +static GLboolean _glewInit_GL_NV_framebuffer_multisample (); +static GLboolean _glewInit_GL_NV_framebuffer_multisample_coverage (); +static GLboolean _glewInit_GL_NV_geometry_program4 (); +static GLboolean _glewInit_GL_NV_gpu_multicast (); +static GLboolean _glewInit_GL_NV_gpu_program4 (); +static GLboolean _glewInit_GL_NV_gpu_shader5 (); +static GLboolean _glewInit_GL_NV_half_float (); +static GLboolean _glewInit_GL_NV_instanced_arrays (); +static GLboolean _glewInit_GL_NV_internalformat_sample_query (); +static GLboolean _glewInit_GL_NV_non_square_matrices (); +static GLboolean _glewInit_GL_NV_occlusion_query (); +static GLboolean _glewInit_GL_NV_parameter_buffer_object (); +static GLboolean _glewInit_GL_NV_path_rendering (); +static GLboolean _glewInit_GL_NV_pixel_data_range (); +static GLboolean _glewInit_GL_NV_point_sprite (); +static GLboolean _glewInit_GL_NV_polygon_mode (); +static GLboolean _glewInit_GL_NV_present_video (); +static GLboolean _glewInit_GL_NV_primitive_restart (); +static GLboolean _glewInit_GL_NV_register_combiners (); +static GLboolean _glewInit_GL_NV_register_combiners2 (); +static GLboolean _glewInit_GL_NV_sample_locations (); +static GLboolean _glewInit_GL_NV_shader_buffer_load (); +static GLboolean _glewInit_GL_NV_texture_array (); +static GLboolean _glewInit_GL_NV_texture_barrier (); +static GLboolean _glewInit_GL_NV_texture_multisample (); +static GLboolean _glewInit_GL_NV_transform_feedback (); +static GLboolean _glewInit_GL_NV_transform_feedback2 (); +static GLboolean _glewInit_GL_NV_vdpau_interop (); +static GLboolean _glewInit_GL_NV_vertex_array_range (); +static GLboolean _glewInit_GL_NV_vertex_attrib_integer_64bit (); +static GLboolean _glewInit_GL_NV_vertex_buffer_unified_memory (); +static GLboolean _glewInit_GL_NV_vertex_program (); +static GLboolean _glewInit_GL_NV_video_capture (); +static GLboolean _glewInit_GL_NV_viewport_array (); +static GLboolean _glewInit_GL_NV_viewport_swizzle (); +static GLboolean _glewInit_GL_OVR_multiview (); +static GLboolean _glewInit_GL_OVR_multiview_multisampled_render_to_texture (); +static GLboolean _glewInit_GL_QCOM_alpha_test (); +static GLboolean _glewInit_GL_QCOM_driver_control (); +static GLboolean _glewInit_GL_QCOM_extended_get (); +static GLboolean _glewInit_GL_QCOM_extended_get2 (); +static GLboolean _glewInit_GL_QCOM_framebuffer_foveated (); +static GLboolean _glewInit_GL_QCOM_shader_framebuffer_fetch_noncoherent (); +static GLboolean _glewInit_GL_QCOM_tiled_rendering (); +static GLboolean _glewInit_GL_REGAL_ES1_0_compatibility (); +static GLboolean _glewInit_GL_REGAL_ES1_1_compatibility (); +static GLboolean _glewInit_GL_REGAL_error_string (); +static GLboolean _glewInit_GL_REGAL_extension_query (); +static GLboolean _glewInit_GL_REGAL_log (); +static GLboolean _glewInit_GL_REGAL_proc_address (); +static GLboolean _glewInit_GL_SGIS_detail_texture (); +static GLboolean _glewInit_GL_SGIS_fog_function (); +static GLboolean _glewInit_GL_SGIS_multisample (); +static GLboolean _glewInit_GL_SGIS_multitexture (); +static GLboolean _glewInit_GL_SGIS_shared_multisample (); +static GLboolean _glewInit_GL_SGIS_sharpen_texture (); +static GLboolean _glewInit_GL_SGIS_texture4D (); +static GLboolean _glewInit_GL_SGIS_texture_filter4 (); +static GLboolean _glewInit_GL_SGIX_async (); +static GLboolean _glewInit_GL_SGIX_datapipe (); +static GLboolean _glewInit_GL_SGIX_flush_raster (); +static GLboolean _glewInit_GL_SGIX_fog_layers (); +static GLboolean _glewInit_GL_SGIX_fog_texture (); +static GLboolean _glewInit_GL_SGIX_fragment_specular_lighting (); +static GLboolean _glewInit_GL_SGIX_framezoom (); +static GLboolean _glewInit_GL_SGIX_igloo_interface (); +static GLboolean _glewInit_GL_SGIX_mpeg1 (); +static GLboolean _glewInit_GL_SGIX_nonlinear_lighting_pervertex (); +static GLboolean _glewInit_GL_SGIX_pixel_texture (); +static GLboolean _glewInit_GL_SGIX_polynomial_ffd (); +static GLboolean _glewInit_GL_SGIX_quad_mesh (); +static GLboolean _glewInit_GL_SGIX_reference_plane (); +static GLboolean _glewInit_GL_SGIX_sprite (); +static GLboolean _glewInit_GL_SGIX_tag_sample_buffer (); +static GLboolean _glewInit_GL_SGIX_vector_ops (); +static GLboolean _glewInit_GL_SGIX_vertex_array_object (); +static GLboolean _glewInit_GL_SGI_color_table (); +static GLboolean _glewInit_GL_SGI_fft (); +static GLboolean _glewInit_GL_SUNX_constant_data (); +static GLboolean _glewInit_GL_SUN_global_alpha (); +static GLboolean _glewInit_GL_SUN_read_video_pixels (); +static GLboolean _glewInit_GL_SUN_triangle_list (); +static GLboolean _glewInit_GL_SUN_vertex (); +static GLboolean _glewInit_GL_WIN_swap_hint (); + +#ifdef GL_VERSION_1_2 + +static GLboolean _glewInit_GL_VERSION_1_2 () +{ + GLboolean r = GL_FALSE; + + r = ((glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3D")) == NULL) || r; + r = ((glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElements")) == NULL) || r; + r = ((glTexImage3D = (PFNGLTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexImage3D")) == NULL) || r; + r = ((glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3D")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_1_2 */ + +#ifdef GL_VERSION_1_3 + +static GLboolean _glewInit_GL_VERSION_1_3 () +{ + GLboolean r = GL_FALSE; + + r = ((glActiveTexture = (PFNGLACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glActiveTexture")) == NULL) || r; + r = ((glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTexture")) == NULL) || r; + r = ((glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1D")) == NULL) || r; + r = ((glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2D")) == NULL) || r; + r = ((glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3D")) == NULL) || r; + r = ((glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1D")) == NULL) || r; + r = ((glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2D")) == NULL) || r; + r = ((glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3D")) == NULL) || r; + r = ((glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImage")) == NULL) || r; + r = ((glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixd")) == NULL) || r; + r = ((glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixf")) == NULL) || r; + r = ((glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixd")) == NULL) || r; + r = ((glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixf")) == NULL) || r; + r = ((glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1d")) == NULL) || r; + r = ((glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dv")) == NULL) || r; + r = ((glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1f")) == NULL) || r; + r = ((glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fv")) == NULL) || r; + r = ((glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1i")) == NULL) || r; + r = ((glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iv")) == NULL) || r; + r = ((glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1s")) == NULL) || r; + r = ((glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sv")) == NULL) || r; + r = ((glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2d")) == NULL) || r; + r = ((glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dv")) == NULL) || r; + r = ((glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2f")) == NULL) || r; + r = ((glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fv")) == NULL) || r; + r = ((glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2i")) == NULL) || r; + r = ((glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iv")) == NULL) || r; + r = ((glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2s")) == NULL) || r; + r = ((glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sv")) == NULL) || r; + r = ((glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3d")) == NULL) || r; + r = ((glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dv")) == NULL) || r; + r = ((glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3f")) == NULL) || r; + r = ((glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fv")) == NULL) || r; + r = ((glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3i")) == NULL) || r; + r = ((glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iv")) == NULL) || r; + r = ((glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3s")) == NULL) || r; + r = ((glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sv")) == NULL) || r; + r = ((glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4d")) == NULL) || r; + r = ((glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dv")) == NULL) || r; + r = ((glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4f")) == NULL) || r; + r = ((glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fv")) == NULL) || r; + r = ((glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4i")) == NULL) || r; + r = ((glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iv")) == NULL) || r; + r = ((glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4s")) == NULL) || r; + r = ((glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sv")) == NULL) || r; + r = ((glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverage")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_1_3 */ + +#ifdef GL_VERSION_1_4 + +static GLboolean _glewInit_GL_VERSION_1_4 () +{ + GLboolean r = GL_FALSE; + + r = ((glBlendColor = (PFNGLBLENDCOLORPROC)glewGetProcAddress((const GLubyte*)"glBlendColor")) == NULL) || r; + r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; + r = ((glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparate")) == NULL) || r; + r = ((glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointer")) == NULL) || r; + r = ((glFogCoordd = (PFNGLFOGCOORDDPROC)glewGetProcAddress((const GLubyte*)"glFogCoordd")) == NULL) || r; + r = ((glFogCoorddv = (PFNGLFOGCOORDDVPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddv")) == NULL) || r; + r = ((glFogCoordf = (PFNGLFOGCOORDFPROC)glewGetProcAddress((const GLubyte*)"glFogCoordf")) == NULL) || r; + r = ((glFogCoordfv = (PFNGLFOGCOORDFVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfv")) == NULL) || r; + r = ((glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArrays")) == NULL) || r; + r = ((glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElements")) == NULL) || r; + r = ((glPointParameterf = (PFNGLPOINTPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glPointParameterf")) == NULL) || r; + r = ((glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfv")) == NULL) || r; + r = ((glPointParameteri = (PFNGLPOINTPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPointParameteri")) == NULL) || r; + r = ((glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriv")) == NULL) || r; + r = ((glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3b")) == NULL) || r; + r = ((glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bv")) == NULL) || r; + r = ((glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3d")) == NULL) || r; + r = ((glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dv")) == NULL) || r; + r = ((glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3f")) == NULL) || r; + r = ((glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fv")) == NULL) || r; + r = ((glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3i")) == NULL) || r; + r = ((glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iv")) == NULL) || r; + r = ((glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3s")) == NULL) || r; + r = ((glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sv")) == NULL) || r; + r = ((glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ub")) == NULL) || r; + r = ((glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubv")) == NULL) || r; + r = ((glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ui")) == NULL) || r; + r = ((glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiv")) == NULL) || r; + r = ((glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3us")) == NULL) || r; + r = ((glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usv")) == NULL) || r; + r = ((glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointer")) == NULL) || r; + r = ((glWindowPos2d = (PFNGLWINDOWPOS2DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2d")) == NULL) || r; + r = ((glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dv")) == NULL) || r; + r = ((glWindowPos2f = (PFNGLWINDOWPOS2FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2f")) == NULL) || r; + r = ((glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fv")) == NULL) || r; + r = ((glWindowPos2i = (PFNGLWINDOWPOS2IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2i")) == NULL) || r; + r = ((glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iv")) == NULL) || r; + r = ((glWindowPos2s = (PFNGLWINDOWPOS2SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2s")) == NULL) || r; + r = ((glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sv")) == NULL) || r; + r = ((glWindowPos3d = (PFNGLWINDOWPOS3DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3d")) == NULL) || r; + r = ((glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dv")) == NULL) || r; + r = ((glWindowPos3f = (PFNGLWINDOWPOS3FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3f")) == NULL) || r; + r = ((glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fv")) == NULL) || r; + r = ((glWindowPos3i = (PFNGLWINDOWPOS3IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3i")) == NULL) || r; + r = ((glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iv")) == NULL) || r; + r = ((glWindowPos3s = (PFNGLWINDOWPOS3SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3s")) == NULL) || r; + r = ((glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sv")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_1_4 */ + +#ifdef GL_VERSION_1_5 + +static GLboolean _glewInit_GL_VERSION_1_5 () +{ + GLboolean r = GL_FALSE; + + r = ((glBeginQuery = (PFNGLBEGINQUERYPROC)glewGetProcAddress((const GLubyte*)"glBeginQuery")) == NULL) || r; + r = ((glBindBuffer = (PFNGLBINDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindBuffer")) == NULL) || r; + r = ((glBufferData = (PFNGLBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferData")) == NULL) || r; + r = ((glBufferSubData = (PFNGLBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferSubData")) == NULL) || r; + r = ((glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffers")) == NULL) || r; + r = ((glDeleteQueries = (PFNGLDELETEQUERIESPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueries")) == NULL) || r; + r = ((glEndQuery = (PFNGLENDQUERYPROC)glewGetProcAddress((const GLubyte*)"glEndQuery")) == NULL) || r; + r = ((glGenBuffers = (PFNGLGENBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenBuffers")) == NULL) || r; + r = ((glGenQueries = (PFNGLGENQUERIESPROC)glewGetProcAddress((const GLubyte*)"glGenQueries")) == NULL) || r; + r = ((glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteriv")) == NULL) || r; + r = ((glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointerv")) == NULL) || r; + r = ((glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubData")) == NULL) || r; + r = ((glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectiv")) == NULL) || r; + r = ((glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuiv")) == NULL) || r; + r = ((glGetQueryiv = (PFNGLGETQUERYIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryiv")) == NULL) || r; + r = ((glIsBuffer = (PFNGLISBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsBuffer")) == NULL) || r; + r = ((glIsQuery = (PFNGLISQUERYPROC)glewGetProcAddress((const GLubyte*)"glIsQuery")) == NULL) || r; + r = ((glMapBuffer = (PFNGLMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glMapBuffer")) == NULL) || r; + r = ((glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glUnmapBuffer")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_1_5 */ + +#ifdef GL_VERSION_2_0 + +static GLboolean _glewInit_GL_VERSION_2_0 () +{ + GLboolean r = GL_FALSE; + + r = ((glAttachShader = (PFNGLATTACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glAttachShader")) == NULL) || r; + r = ((glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocation")) == NULL) || r; + r = ((glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparate")) == NULL) || r; + r = ((glCompileShader = (PFNGLCOMPILESHADERPROC)glewGetProcAddress((const GLubyte*)"glCompileShader")) == NULL) || r; + r = ((glCreateProgram = (PFNGLCREATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glCreateProgram")) == NULL) || r; + r = ((glCreateShader = (PFNGLCREATESHADERPROC)glewGetProcAddress((const GLubyte*)"glCreateShader")) == NULL) || r; + r = ((glDeleteProgram = (PFNGLDELETEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgram")) == NULL) || r; + r = ((glDeleteShader = (PFNGLDELETESHADERPROC)glewGetProcAddress((const GLubyte*)"glDeleteShader")) == NULL) || r; + r = ((glDetachShader = (PFNGLDETACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glDetachShader")) == NULL) || r; + r = ((glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArray")) == NULL) || r; + r = ((glDrawBuffers = (PFNGLDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffers")) == NULL) || r; + r = ((glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArray")) == NULL) || r; + r = ((glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttrib")) == NULL) || r; + r = ((glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniform")) == NULL) || r; + r = ((glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedShaders")) == NULL) || r; + r = ((glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocation")) == NULL) || r; + r = ((glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInfoLog")) == NULL) || r; + r = ((glGetProgramiv = (PFNGLGETPROGRAMIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramiv")) == NULL) || r; + r = ((glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetShaderInfoLog")) == NULL) || r; + r = ((glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSource")) == NULL) || r; + r = ((glGetShaderiv = (PFNGLGETSHADERIVPROC)glewGetProcAddress((const GLubyte*)"glGetShaderiv")) == NULL) || r; + r = ((glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocation")) == NULL) || r; + r = ((glGetUniformfv = (PFNGLGETUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfv")) == NULL) || r; + r = ((glGetUniformiv = (PFNGLGETUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformiv")) == NULL) || r; + r = ((glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointerv")) == NULL) || r; + r = ((glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdv")) == NULL) || r; + r = ((glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfv")) == NULL) || r; + r = ((glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribiv")) == NULL) || r; + r = ((glIsProgram = (PFNGLISPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glIsProgram")) == NULL) || r; + r = ((glIsShader = (PFNGLISSHADERPROC)glewGetProcAddress((const GLubyte*)"glIsShader")) == NULL) || r; + r = ((glLinkProgram = (PFNGLLINKPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glLinkProgram")) == NULL) || r; + r = ((glShaderSource = (PFNGLSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glShaderSource")) == NULL) || r; + r = ((glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparate")) == NULL) || r; + r = ((glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilMaskSeparate")) == NULL) || r; + r = ((glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparate")) == NULL) || r; + r = ((glUniform1f = (PFNGLUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glUniform1f")) == NULL) || r; + r = ((glUniform1fv = (PFNGLUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glUniform1fv")) == NULL) || r; + r = ((glUniform1i = (PFNGLUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glUniform1i")) == NULL) || r; + r = ((glUniform1iv = (PFNGLUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glUniform1iv")) == NULL) || r; + r = ((glUniform2f = (PFNGLUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glUniform2f")) == NULL) || r; + r = ((glUniform2fv = (PFNGLUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glUniform2fv")) == NULL) || r; + r = ((glUniform2i = (PFNGLUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glUniform2i")) == NULL) || r; + r = ((glUniform2iv = (PFNGLUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glUniform2iv")) == NULL) || r; + r = ((glUniform3f = (PFNGLUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glUniform3f")) == NULL) || r; + r = ((glUniform3fv = (PFNGLUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glUniform3fv")) == NULL) || r; + r = ((glUniform3i = (PFNGLUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glUniform3i")) == NULL) || r; + r = ((glUniform3iv = (PFNGLUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glUniform3iv")) == NULL) || r; + r = ((glUniform4f = (PFNGLUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glUniform4f")) == NULL) || r; + r = ((glUniform4fv = (PFNGLUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glUniform4fv")) == NULL) || r; + r = ((glUniform4i = (PFNGLUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glUniform4i")) == NULL) || r; + r = ((glUniform4iv = (PFNGLUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glUniform4iv")) == NULL) || r; + r = ((glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fv")) == NULL) || r; + r = ((glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fv")) == NULL) || r; + r = ((glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fv")) == NULL) || r; + r = ((glUseProgram = (PFNGLUSEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glUseProgram")) == NULL) || r; + r = ((glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glValidateProgram")) == NULL) || r; + r = ((glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1d")) == NULL) || r; + r = ((glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dv")) == NULL) || r; + r = ((glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1f")) == NULL) || r; + r = ((glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fv")) == NULL) || r; + r = ((glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1s")) == NULL) || r; + r = ((glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sv")) == NULL) || r; + r = ((glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2d")) == NULL) || r; + r = ((glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dv")) == NULL) || r; + r = ((glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2f")) == NULL) || r; + r = ((glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fv")) == NULL) || r; + r = ((glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2s")) == NULL) || r; + r = ((glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sv")) == NULL) || r; + r = ((glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3d")) == NULL) || r; + r = ((glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dv")) == NULL) || r; + r = ((glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3f")) == NULL) || r; + r = ((glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fv")) == NULL) || r; + r = ((glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3s")) == NULL) || r; + r = ((glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sv")) == NULL) || r; + r = ((glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nbv")) == NULL) || r; + r = ((glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Niv")) == NULL) || r; + r = ((glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nsv")) == NULL) || r; + r = ((glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nub")) == NULL) || r; + r = ((glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nubv")) == NULL) || r; + r = ((glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nuiv")) == NULL) || r; + r = ((glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nusv")) == NULL) || r; + r = ((glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bv")) == NULL) || r; + r = ((glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4d")) == NULL) || r; + r = ((glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dv")) == NULL) || r; + r = ((glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4f")) == NULL) || r; + r = ((glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fv")) == NULL) || r; + r = ((glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4iv")) == NULL) || r; + r = ((glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4s")) == NULL) || r; + r = ((glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sv")) == NULL) || r; + r = ((glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubv")) == NULL) || r; + r = ((glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uiv")) == NULL) || r; + r = ((glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usv")) == NULL) || r; + r = ((glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointer")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_2_0 */ + +#ifdef GL_VERSION_2_1 + +static GLboolean _glewInit_GL_VERSION_2_1 () +{ + GLboolean r = GL_FALSE; + + r = ((glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3fv")) == NULL) || r; + r = ((glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4fv")) == NULL) || r; + r = ((glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2fv")) == NULL) || r; + r = ((glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4fv")) == NULL) || r; + r = ((glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2fv")) == NULL) || r; + r = ((glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3fv")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_2_1 */ + +#ifdef GL_VERSION_3_0 + +static GLboolean _glewInit_GL_VERSION_3_0 () +{ + GLboolean r = GL_FALSE; + + r = _glewInit_GL_ARB_framebuffer_object() || r; + r = _glewInit_GL_ARB_map_buffer_range() || r; + r = _glewInit_GL_ARB_uniform_buffer_object() || r; + r = _glewInit_GL_ARB_vertex_array_object() || r; + + r = ((glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRender")) == NULL) || r; + r = ((glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedback")) == NULL) || r; + r = ((glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocation")) == NULL) || r; + r = ((glClampColor = (PFNGLCLAMPCOLORPROC)glewGetProcAddress((const GLubyte*)"glClampColor")) == NULL) || r; + r = ((glClearBufferfi = (PFNGLCLEARBUFFERFIPROC)glewGetProcAddress((const GLubyte*)"glClearBufferfi")) == NULL) || r; + r = ((glClearBufferfv = (PFNGLCLEARBUFFERFVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferfv")) == NULL) || r; + r = ((glClearBufferiv = (PFNGLCLEARBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferiv")) == NULL) || r; + r = ((glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferuiv")) == NULL) || r; + r = ((glColorMaski = (PFNGLCOLORMASKIPROC)glewGetProcAddress((const GLubyte*)"glColorMaski")) == NULL) || r; + r = ((glDisablei = (PFNGLDISABLEIPROC)glewGetProcAddress((const GLubyte*)"glDisablei")) == NULL) || r; + r = ((glEnablei = (PFNGLENABLEIPROC)glewGetProcAddress((const GLubyte*)"glEnablei")) == NULL) || r; + r = ((glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRender")) == NULL) || r; + r = ((glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedback")) == NULL) || r; + r = ((glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC)glewGetProcAddress((const GLubyte*)"glGetBooleani_v")) == NULL) || r; + r = ((glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocation")) == NULL) || r; + r = ((glGetStringi = (PFNGLGETSTRINGIPROC)glewGetProcAddress((const GLubyte*)"glGetStringi")) == NULL) || r; + r = ((glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIiv")) == NULL) || r; + r = ((glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuiv")) == NULL) || r; + r = ((glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVarying")) == NULL) || r; + r = ((glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformuiv")) == NULL) || r; + r = ((glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIiv")) == NULL) || r; + r = ((glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIuiv")) == NULL) || r; + r = ((glIsEnabledi = (PFNGLISENABLEDIPROC)glewGetProcAddress((const GLubyte*)"glIsEnabledi")) == NULL) || r; + r = ((glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIiv")) == NULL) || r; + r = ((glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuiv")) == NULL) || r; + r = ((glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryings")) == NULL) || r; + r = ((glUniform1ui = (PFNGLUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui")) == NULL) || r; + r = ((glUniform1uiv = (PFNGLUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform1uiv")) == NULL) || r; + r = ((glUniform2ui = (PFNGLUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui")) == NULL) || r; + r = ((glUniform2uiv = (PFNGLUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform2uiv")) == NULL) || r; + r = ((glUniform3ui = (PFNGLUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui")) == NULL) || r; + r = ((glUniform3uiv = (PFNGLUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform3uiv")) == NULL) || r; + r = ((glUniform4ui = (PFNGLUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui")) == NULL) || r; + r = ((glUniform4uiv = (PFNGLUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform4uiv")) == NULL) || r; + r = ((glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1i")) == NULL) || r; + r = ((glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1iv")) == NULL) || r; + r = ((glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1ui")) == NULL) || r; + r = ((glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uiv")) == NULL) || r; + r = ((glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2i")) == NULL) || r; + r = ((glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2iv")) == NULL) || r; + r = ((glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2ui")) == NULL) || r; + r = ((glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uiv")) == NULL) || r; + r = ((glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3i")) == NULL) || r; + r = ((glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3iv")) == NULL) || r; + r = ((glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3ui")) == NULL) || r; + r = ((glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uiv")) == NULL) || r; + r = ((glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4bv")) == NULL) || r; + r = ((glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4i")) == NULL) || r; + r = ((glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4iv")) == NULL) || r; + r = ((glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4sv")) == NULL) || r; + r = ((glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ubv")) == NULL) || r; + r = ((glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ui")) == NULL) || r; + r = ((glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uiv")) == NULL) || r; + r = ((glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4usv")) == NULL) || r; + r = ((glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIPointer")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_3_0 */ + +#ifdef GL_VERSION_3_1 + +static GLboolean _glewInit_GL_VERSION_3_1 () +{ + GLboolean r = GL_FALSE; + + r = _glewInit_GL_ARB_copy_buffer() || r; + + r = ((glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstanced")) == NULL) || r; + r = ((glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstanced")) == NULL) || r; + r = ((glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndex")) == NULL) || r; + r = ((glTexBuffer = (PFNGLTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glTexBuffer")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_3_1 */ + +#ifdef GL_VERSION_3_2 + +static GLboolean _glewInit_GL_VERSION_3_2 () +{ + GLboolean r = GL_FALSE; + + r = _glewInit_GL_ARB_draw_elements_base_vertex() || r; + r = _glewInit_GL_ARB_provoking_vertex() || r; + r = _glewInit_GL_ARB_sync() || r; + r = _glewInit_GL_ARB_texture_multisample() || r; + + r = ((glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture")) == NULL) || r; + r = ((glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteri64v")) == NULL) || r; + r = ((glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64i_v")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_3_2 */ + +#ifdef GL_VERSION_3_3 + +static GLboolean _glewInit_GL_VERSION_3_3 () +{ + GLboolean r = GL_FALSE; + + r = ((glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisor")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_3_3 */ + +#ifdef GL_VERSION_4_0 + +static GLboolean _glewInit_GL_VERSION_4_0 () +{ + GLboolean r = GL_FALSE; + + r = ((glBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparatei")) == NULL) || r; + r = ((glBlendEquationi = (PFNGLBLENDEQUATIONIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationi")) == NULL) || r; + r = ((glBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparatei")) == NULL) || r; + r = ((glBlendFunci = (PFNGLBLENDFUNCIPROC)glewGetProcAddress((const GLubyte*)"glBlendFunci")) == NULL) || r; + r = ((glMinSampleShading = (PFNGLMINSAMPLESHADINGPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShading")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_4_0 */ + +#ifdef GL_VERSION_4_5 + +static GLboolean _glewInit_GL_VERSION_4_5 () +{ + GLboolean r = GL_FALSE; + + r = ((glGetGraphicsResetStatus = (PFNGLGETGRAPHICSRESETSTATUSPROC)glewGetProcAddress((const GLubyte*)"glGetGraphicsResetStatus")) == NULL) || r; + r = ((glGetnCompressedTexImage = (PFNGLGETNCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetnCompressedTexImage")) == NULL) || r; + r = ((glGetnTexImage = (PFNGLGETNTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetnTexImage")) == NULL) || r; + r = ((glGetnUniformdv = (PFNGLGETNUNIFORMDVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformdv")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_4_5 */ + +#ifdef GL_VERSION_4_6 + +static GLboolean _glewInit_GL_VERSION_4_6 () +{ + GLboolean r = GL_FALSE; + + r = ((glMultiDrawArraysIndirectCount = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectCount")) == NULL) || r; + r = ((glMultiDrawElementsIndirectCount = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectCount")) == NULL) || r; + r = ((glSpecializeShader = (PFNGLSPECIALIZESHADERPROC)glewGetProcAddress((const GLubyte*)"glSpecializeShader")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_4_6 */ + +#ifdef GL_3DFX_tbuffer + +static GLboolean _glewInit_GL_3DFX_tbuffer () +{ + GLboolean r = GL_FALSE; + + r = ((glTbufferMask3DFX = (PFNGLTBUFFERMASK3DFXPROC)glewGetProcAddress((const GLubyte*)"glTbufferMask3DFX")) == NULL) || r; + + return r; +} + +#endif /* GL_3DFX_tbuffer */ + +#ifdef GL_AMD_debug_output + +static GLboolean _glewInit_GL_AMD_debug_output () +{ + GLboolean r = GL_FALSE; + + r = ((glDebugMessageCallbackAMD = (PFNGLDEBUGMESSAGECALLBACKAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackAMD")) == NULL) || r; + r = ((glDebugMessageEnableAMD = (PFNGLDEBUGMESSAGEENABLEAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageEnableAMD")) == NULL) || r; + r = ((glDebugMessageInsertAMD = (PFNGLDEBUGMESSAGEINSERTAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertAMD")) == NULL) || r; + r = ((glGetDebugMessageLogAMD = (PFNGLGETDEBUGMESSAGELOGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_debug_output */ + +#ifdef GL_AMD_draw_buffers_blend + +static GLboolean _glewInit_GL_AMD_draw_buffers_blend () +{ + GLboolean r = GL_FALSE; + + r = ((glBlendEquationIndexedAMD = (PFNGLBLENDEQUATIONINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationIndexedAMD")) == NULL) || r; + r = ((glBlendEquationSeparateIndexedAMD = (PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateIndexedAMD")) == NULL) || r; + r = ((glBlendFuncIndexedAMD = (PFNGLBLENDFUNCINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncIndexedAMD")) == NULL) || r; + r = ((glBlendFuncSeparateIndexedAMD = (PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateIndexedAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_draw_buffers_blend */ + +#ifdef GL_AMD_framebuffer_sample_positions + +static GLboolean _glewInit_GL_AMD_framebuffer_sample_positions () +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferSamplePositionsfvAMD = (PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSamplePositionsfvAMD")) == NULL) || r; + r = ((glGetFramebufferParameterfvAMD = (PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameterfvAMD")) == NULL) || r; + r = ((glGetNamedFramebufferParameterfvAMD = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameterfvAMD")) == NULL) || r; + r = ((glNamedFramebufferSamplePositionsfvAMD = (PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSamplePositionsfvAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_framebuffer_sample_positions */ + +#ifdef GL_AMD_interleaved_elements + +static GLboolean _glewInit_GL_AMD_interleaved_elements () +{ + GLboolean r = GL_FALSE; + + r = ((glVertexAttribParameteriAMD = (PFNGLVERTEXATTRIBPARAMETERIAMDPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribParameteriAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_interleaved_elements */ + +#ifdef GL_AMD_multi_draw_indirect + +static GLboolean _glewInit_GL_AMD_multi_draw_indirect () +{ + GLboolean r = GL_FALSE; + + r = ((glMultiDrawArraysIndirectAMD = (PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectAMD")) == NULL) || r; + r = ((glMultiDrawElementsIndirectAMD = (PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_multi_draw_indirect */ + +#ifdef GL_AMD_name_gen_delete + +static GLboolean _glewInit_GL_AMD_name_gen_delete () +{ + GLboolean r = GL_FALSE; + + r = ((glDeleteNamesAMD = (PFNGLDELETENAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamesAMD")) == NULL) || r; + r = ((glGenNamesAMD = (PFNGLGENNAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glGenNamesAMD")) == NULL) || r; + r = ((glIsNameAMD = (PFNGLISNAMEAMDPROC)glewGetProcAddress((const GLubyte*)"glIsNameAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_name_gen_delete */ + +#ifdef GL_AMD_occlusion_query_event + +static GLboolean _glewInit_GL_AMD_occlusion_query_event () +{ + GLboolean r = GL_FALSE; + + r = ((glQueryObjectParameteruiAMD = (PFNGLQUERYOBJECTPARAMETERUIAMDPROC)glewGetProcAddress((const GLubyte*)"glQueryObjectParameteruiAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_occlusion_query_event */ + +#ifdef GL_AMD_performance_monitor + +static GLboolean _glewInit_GL_AMD_performance_monitor () +{ + GLboolean r = GL_FALSE; + + r = ((glBeginPerfMonitorAMD = (PFNGLBEGINPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glBeginPerfMonitorAMD")) == NULL) || r; + r = ((glDeletePerfMonitorsAMD = (PFNGLDELETEPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glDeletePerfMonitorsAMD")) == NULL) || r; + r = ((glEndPerfMonitorAMD = (PFNGLENDPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glEndPerfMonitorAMD")) == NULL) || r; + r = ((glGenPerfMonitorsAMD = (PFNGLGENPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glGenPerfMonitorsAMD")) == NULL) || r; + r = ((glGetPerfMonitorCounterDataAMD = (PFNGLGETPERFMONITORCOUNTERDATAAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterDataAMD")) == NULL) || r; + r = ((glGetPerfMonitorCounterInfoAMD = (PFNGLGETPERFMONITORCOUNTERINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterInfoAMD")) == NULL) || r; + r = ((glGetPerfMonitorCounterStringAMD = (PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterStringAMD")) == NULL) || r; + r = ((glGetPerfMonitorCountersAMD = (PFNGLGETPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCountersAMD")) == NULL) || r; + r = ((glGetPerfMonitorGroupStringAMD = (PFNGLGETPERFMONITORGROUPSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupStringAMD")) == NULL) || r; + r = ((glGetPerfMonitorGroupsAMD = (PFNGLGETPERFMONITORGROUPSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupsAMD")) == NULL) || r; + r = ((glSelectPerfMonitorCountersAMD = (PFNGLSELECTPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glSelectPerfMonitorCountersAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_performance_monitor */ + +#ifdef GL_AMD_sample_positions + +static GLboolean _glewInit_GL_AMD_sample_positions () +{ + GLboolean r = GL_FALSE; + + r = ((glSetMultisamplefvAMD = (PFNGLSETMULTISAMPLEFVAMDPROC)glewGetProcAddress((const GLubyte*)"glSetMultisamplefvAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_sample_positions */ + +#ifdef GL_AMD_sparse_texture + +static GLboolean _glewInit_GL_AMD_sparse_texture () +{ + GLboolean r = GL_FALSE; + + r = ((glTexStorageSparseAMD = (PFNGLTEXSTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTexStorageSparseAMD")) == NULL) || r; + r = ((glTextureStorageSparseAMD = (PFNGLTEXTURESTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageSparseAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_sparse_texture */ + +#ifdef GL_AMD_stencil_operation_extended + +static GLboolean _glewInit_GL_AMD_stencil_operation_extended () +{ + GLboolean r = GL_FALSE; + + r = ((glStencilOpValueAMD = (PFNGLSTENCILOPVALUEAMDPROC)glewGetProcAddress((const GLubyte*)"glStencilOpValueAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_stencil_operation_extended */ + +#ifdef GL_AMD_vertex_shader_tessellator + +static GLboolean _glewInit_GL_AMD_vertex_shader_tessellator () +{ + GLboolean r = GL_FALSE; + + r = ((glTessellationFactorAMD = (PFNGLTESSELLATIONFACTORAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationFactorAMD")) == NULL) || r; + r = ((glTessellationModeAMD = (PFNGLTESSELLATIONMODEAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationModeAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_vertex_shader_tessellator */ + +#ifdef GL_ANGLE_framebuffer_blit + +static GLboolean _glewInit_GL_ANGLE_framebuffer_blit () +{ + GLboolean r = GL_FALSE; + + r = ((glBlitFramebufferANGLE = (PFNGLBLITFRAMEBUFFERANGLEPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_framebuffer_blit */ + +#ifdef GL_ANGLE_framebuffer_multisample + +static GLboolean _glewInit_GL_ANGLE_framebuffer_multisample () +{ + GLboolean r = GL_FALSE; + + r = ((glRenderbufferStorageMultisampleANGLE = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_framebuffer_multisample */ + +#ifdef GL_ANGLE_instanced_arrays + +static GLboolean _glewInit_GL_ANGLE_instanced_arrays () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawArraysInstancedANGLE = (PFNGLDRAWARRAYSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedANGLE")) == NULL) || r; + r = ((glDrawElementsInstancedANGLE = (PFNGLDRAWELEMENTSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedANGLE")) == NULL) || r; + r = ((glVertexAttribDivisorANGLE = (PFNGLVERTEXATTRIBDIVISORANGLEPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_instanced_arrays */ + +#ifdef GL_ANGLE_timer_query + +static GLboolean _glewInit_GL_ANGLE_timer_query () +{ + GLboolean r = GL_FALSE; + + r = ((glBeginQueryANGLE = (PFNGLBEGINQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryANGLE")) == NULL) || r; + r = ((glDeleteQueriesANGLE = (PFNGLDELETEQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesANGLE")) == NULL) || r; + r = ((glEndQueryANGLE = (PFNGLENDQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glEndQueryANGLE")) == NULL) || r; + r = ((glGenQueriesANGLE = (PFNGLGENQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesANGLE")) == NULL) || r; + r = ((glGetQueryObjecti64vANGLE = (PFNGLGETQUERYOBJECTI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vANGLE")) == NULL) || r; + r = ((glGetQueryObjectivANGLE = (PFNGLGETQUERYOBJECTIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivANGLE")) == NULL) || r; + r = ((glGetQueryObjectui64vANGLE = (PFNGLGETQUERYOBJECTUI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vANGLE")) == NULL) || r; + r = ((glGetQueryObjectuivANGLE = (PFNGLGETQUERYOBJECTUIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivANGLE")) == NULL) || r; + r = ((glGetQueryivANGLE = (PFNGLGETQUERYIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivANGLE")) == NULL) || r; + r = ((glIsQueryANGLE = (PFNGLISQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glIsQueryANGLE")) == NULL) || r; + r = ((glQueryCounterANGLE = (PFNGLQUERYCOUNTERANGLEPROC)glewGetProcAddress((const GLubyte*)"glQueryCounterANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_timer_query */ + +#ifdef GL_ANGLE_translated_shader_source + +static GLboolean _glewInit_GL_ANGLE_translated_shader_source () +{ + GLboolean r = GL_FALSE; + + r = ((glGetTranslatedShaderSourceANGLE = (PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetTranslatedShaderSourceANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_translated_shader_source */ + +#ifdef GL_APPLE_copy_texture_levels + +static GLboolean _glewInit_GL_APPLE_copy_texture_levels () +{ + GLboolean r = GL_FALSE; + + r = ((glCopyTextureLevelsAPPLE = (PFNGLCOPYTEXTURELEVELSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureLevelsAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_copy_texture_levels */ + +#ifdef GL_APPLE_element_array + +static GLboolean _glewInit_GL_APPLE_element_array () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawElementArrayAPPLE = (PFNGLDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayAPPLE")) == NULL) || r; + r = ((glDrawRangeElementArrayAPPLE = (PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayAPPLE")) == NULL) || r; + r = ((glElementPointerAPPLE = (PFNGLELEMENTPOINTERAPPLEPROC)glewGetProcAddress((const GLubyte*)"glElementPointerAPPLE")) == NULL) || r; + r = ((glMultiDrawElementArrayAPPLE = (PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementArrayAPPLE")) == NULL) || r; + r = ((glMultiDrawRangeElementArrayAPPLE = (PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawRangeElementArrayAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_element_array */ + +#ifdef GL_APPLE_fence + +static GLboolean _glewInit_GL_APPLE_fence () +{ + GLboolean r = GL_FALSE; + + r = ((glDeleteFencesAPPLE = (PFNGLDELETEFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesAPPLE")) == NULL) || r; + r = ((glFinishFenceAPPLE = (PFNGLFINISHFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceAPPLE")) == NULL) || r; + r = ((glFinishObjectAPPLE = (PFNGLFINISHOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishObjectAPPLE")) == NULL) || r; + r = ((glGenFencesAPPLE = (PFNGLGENFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenFencesAPPLE")) == NULL) || r; + r = ((glIsFenceAPPLE = (PFNGLISFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsFenceAPPLE")) == NULL) || r; + r = ((glSetFenceAPPLE = (PFNGLSETFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glSetFenceAPPLE")) == NULL) || r; + r = ((glTestFenceAPPLE = (PFNGLTESTFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestFenceAPPLE")) == NULL) || r; + r = ((glTestObjectAPPLE = (PFNGLTESTOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestObjectAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_fence */ + +#ifdef GL_APPLE_flush_buffer_range + +static GLboolean _glewInit_GL_APPLE_flush_buffer_range () +{ + GLboolean r = GL_FALSE; + + r = ((glBufferParameteriAPPLE = (PFNGLBUFFERPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBufferParameteriAPPLE")) == NULL) || r; + r = ((glFlushMappedBufferRangeAPPLE = (PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRangeAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_flush_buffer_range */ + +#ifdef GL_APPLE_framebuffer_multisample + +static GLboolean _glewInit_GL_APPLE_framebuffer_multisample () +{ + GLboolean r = GL_FALSE; + + r = ((glRenderbufferStorageMultisampleAPPLE = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleAPPLE")) == NULL) || r; + r = ((glResolveMultisampleFramebufferAPPLE = (PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC)glewGetProcAddress((const GLubyte*)"glResolveMultisampleFramebufferAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_framebuffer_multisample */ + +#ifdef GL_APPLE_object_purgeable + +static GLboolean _glewInit_GL_APPLE_object_purgeable () +{ + GLboolean r = GL_FALSE; + + r = ((glGetObjectParameterivAPPLE = (PFNGLGETOBJECTPARAMETERIVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivAPPLE")) == NULL) || r; + r = ((glObjectPurgeableAPPLE = (PFNGLOBJECTPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectPurgeableAPPLE")) == NULL) || r; + r = ((glObjectUnpurgeableAPPLE = (PFNGLOBJECTUNPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectUnpurgeableAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_object_purgeable */ + +#ifdef GL_APPLE_sync + +static GLboolean _glewInit_GL_APPLE_sync () +{ + GLboolean r = GL_FALSE; + + r = ((glClientWaitSyncAPPLE = (PFNGLCLIENTWAITSYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glClientWaitSyncAPPLE")) == NULL) || r; + r = ((glDeleteSyncAPPLE = (PFNGLDELETESYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteSyncAPPLE")) == NULL) || r; + r = ((glFenceSyncAPPLE = (PFNGLFENCESYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFenceSyncAPPLE")) == NULL) || r; + r = ((glGetInteger64vAPPLE = (PFNGLGETINTEGER64VAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64vAPPLE")) == NULL) || r; + r = ((glGetSyncivAPPLE = (PFNGLGETSYNCIVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetSyncivAPPLE")) == NULL) || r; + r = ((glIsSyncAPPLE = (PFNGLISSYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsSyncAPPLE")) == NULL) || r; + r = ((glWaitSyncAPPLE = (PFNGLWAITSYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glWaitSyncAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_sync */ + +#ifdef GL_APPLE_texture_range + +static GLboolean _glewInit_GL_APPLE_texture_range () +{ + GLboolean r = GL_FALSE; + + r = ((glGetTexParameterPointervAPPLE = (PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterPointervAPPLE")) == NULL) || r; + r = ((glTextureRangeAPPLE = (PFNGLTEXTURERANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureRangeAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_texture_range */ + +#ifdef GL_APPLE_vertex_array_object + +static GLboolean _glewInit_GL_APPLE_vertex_array_object () +{ + GLboolean r = GL_FALSE; + + r = ((glBindVertexArrayAPPLE = (PFNGLBINDVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArrayAPPLE")) == NULL) || r; + r = ((glDeleteVertexArraysAPPLE = (PFNGLDELETEVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArraysAPPLE")) == NULL) || r; + r = ((glGenVertexArraysAPPLE = (PFNGLGENVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArraysAPPLE")) == NULL) || r; + r = ((glIsVertexArrayAPPLE = (PFNGLISVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArrayAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_vertex_array_object */ + +#ifdef GL_APPLE_vertex_array_range + +static GLboolean _glewInit_GL_APPLE_vertex_array_range () +{ + GLboolean r = GL_FALSE; + + r = ((glFlushVertexArrayRangeAPPLE = (PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeAPPLE")) == NULL) || r; + r = ((glVertexArrayParameteriAPPLE = (PFNGLVERTEXARRAYPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayParameteriAPPLE")) == NULL) || r; + r = ((glVertexArrayRangeAPPLE = (PFNGLVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_vertex_array_range */ + +#ifdef GL_APPLE_vertex_program_evaluators + +static GLboolean _glewInit_GL_APPLE_vertex_program_evaluators () +{ + GLboolean r = GL_FALSE; + + r = ((glDisableVertexAttribAPPLE = (PFNGLDISABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribAPPLE")) == NULL) || r; + r = ((glEnableVertexAttribAPPLE = (PFNGLENABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribAPPLE")) == NULL) || r; + r = ((glIsVertexAttribEnabledAPPLE = (PFNGLISVERTEXATTRIBENABLEDAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexAttribEnabledAPPLE")) == NULL) || r; + r = ((glMapVertexAttrib1dAPPLE = (PFNGLMAPVERTEXATTRIB1DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1dAPPLE")) == NULL) || r; + r = ((glMapVertexAttrib1fAPPLE = (PFNGLMAPVERTEXATTRIB1FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1fAPPLE")) == NULL) || r; + r = ((glMapVertexAttrib2dAPPLE = (PFNGLMAPVERTEXATTRIB2DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2dAPPLE")) == NULL) || r; + r = ((glMapVertexAttrib2fAPPLE = (PFNGLMAPVERTEXATTRIB2FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2fAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_vertex_program_evaluators */ + +#ifdef GL_ARB_ES2_compatibility + +static GLboolean _glewInit_GL_ARB_ES2_compatibility () +{ + GLboolean r = GL_FALSE; + + r = ((glClearDepthf = (PFNGLCLEARDEPTHFPROC)glewGetProcAddress((const GLubyte*)"glClearDepthf")) == NULL) || r; + r = ((glDepthRangef = (PFNGLDEPTHRANGEFPROC)glewGetProcAddress((const GLubyte*)"glDepthRangef")) == NULL) || r; + r = ((glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC)glewGetProcAddress((const GLubyte*)"glGetShaderPrecisionFormat")) == NULL) || r; + r = ((glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC)glewGetProcAddress((const GLubyte*)"glReleaseShaderCompiler")) == NULL) || r; + r = ((glShaderBinary = (PFNGLSHADERBINARYPROC)glewGetProcAddress((const GLubyte*)"glShaderBinary")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_ES2_compatibility */ + +#ifdef GL_ARB_ES3_1_compatibility + +static GLboolean _glewInit_GL_ARB_ES3_1_compatibility () +{ + GLboolean r = GL_FALSE; + + r = ((glMemoryBarrierByRegion = (PFNGLMEMORYBARRIERBYREGIONPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrierByRegion")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_ES3_1_compatibility */ + +#ifdef GL_ARB_ES3_2_compatibility + +static GLboolean _glewInit_GL_ARB_ES3_2_compatibility () +{ + GLboolean r = GL_FALSE; + + r = ((glPrimitiveBoundingBoxARB = (PFNGLPRIMITIVEBOUNDINGBOXARBPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveBoundingBoxARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_ES3_2_compatibility */ + +#ifdef GL_ARB_base_instance + +static GLboolean _glewInit_GL_ARB_base_instance () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedBaseInstance")) == NULL) || r; + r = ((glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseInstance")) == NULL) || r; + r = ((glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertexBaseInstance")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_base_instance */ + +#ifdef GL_ARB_bindless_texture + +static GLboolean _glewInit_GL_ARB_bindless_texture () +{ + GLboolean r = GL_FALSE; + + r = ((glGetImageHandleARB = (PFNGLGETIMAGEHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetImageHandleARB")) == NULL) || r; + r = ((glGetTextureHandleARB = (PFNGLGETTEXTUREHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleARB")) == NULL) || r; + r = ((glGetTextureSamplerHandleARB = (PFNGLGETTEXTURESAMPLERHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleARB")) == NULL) || r; + r = ((glGetVertexAttribLui64vARB = (PFNGLGETVERTEXATTRIBLUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vARB")) == NULL) || r; + r = ((glIsImageHandleResidentARB = (PFNGLISIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsImageHandleResidentARB")) == NULL) || r; + r = ((glIsTextureHandleResidentARB = (PFNGLISTEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsTextureHandleResidentARB")) == NULL) || r; + r = ((glMakeImageHandleNonResidentARB = (PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleNonResidentARB")) == NULL) || r; + r = ((glMakeImageHandleResidentARB = (PFNGLMAKEIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleResidentARB")) == NULL) || r; + r = ((glMakeTextureHandleNonResidentARB = (PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleNonResidentARB")) == NULL) || r; + r = ((glMakeTextureHandleResidentARB = (PFNGLMAKETEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleResidentARB")) == NULL) || r; + r = ((glProgramUniformHandleui64ARB = (PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64ARB")) == NULL) || r; + r = ((glProgramUniformHandleui64vARB = (PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vARB")) == NULL) || r; + r = ((glUniformHandleui64ARB = (PFNGLUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64ARB")) == NULL) || r; + r = ((glUniformHandleui64vARB = (PFNGLUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vARB")) == NULL) || r; + r = ((glVertexAttribL1ui64ARB = (PFNGLVERTEXATTRIBL1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64ARB")) == NULL) || r; + r = ((glVertexAttribL1ui64vARB = (PFNGLVERTEXATTRIBL1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_bindless_texture */ + +#ifdef GL_ARB_blend_func_extended + +static GLboolean _glewInit_GL_ARB_blend_func_extended () +{ + GLboolean r = GL_FALSE; + + r = ((glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationIndexed")) == NULL) || r; + r = ((glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataIndex")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_blend_func_extended */ + +#ifdef GL_ARB_buffer_storage + +static GLboolean _glewInit_GL_ARB_buffer_storage () +{ + GLboolean r = GL_FALSE; + + r = ((glBufferStorage = (PFNGLBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glBufferStorage")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_buffer_storage */ + +#ifdef GL_ARB_cl_event + +static GLboolean _glewInit_GL_ARB_cl_event () +{ + GLboolean r = GL_FALSE; + + r = ((glCreateSyncFromCLeventARB = (PFNGLCREATESYNCFROMCLEVENTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateSyncFromCLeventARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_cl_event */ + +#ifdef GL_ARB_clear_buffer_object + +static GLboolean _glewInit_GL_ARB_clear_buffer_object () +{ + GLboolean r = GL_FALSE; + + r = ((glClearBufferData = (PFNGLCLEARBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glClearBufferData")) == NULL) || r; + r = ((glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glClearBufferSubData")) == NULL) || r; + r = ((glClearNamedBufferDataEXT = (PFNGLCLEARNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferDataEXT")) == NULL) || r; + r = ((glClearNamedBufferSubDataEXT = (PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferSubDataEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_clear_buffer_object */ + +#ifdef GL_ARB_clear_texture + +static GLboolean _glewInit_GL_ARB_clear_texture () +{ + GLboolean r = GL_FALSE; + + r = ((glClearTexImage = (PFNGLCLEARTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexImage")) == NULL) || r; + r = ((glClearTexSubImage = (PFNGLCLEARTEXSUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexSubImage")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_clear_texture */ + +#ifdef GL_ARB_clip_control + +static GLboolean _glewInit_GL_ARB_clip_control () +{ + GLboolean r = GL_FALSE; + + r = ((glClipControl = (PFNGLCLIPCONTROLPROC)glewGetProcAddress((const GLubyte*)"glClipControl")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_clip_control */ + +#ifdef GL_ARB_color_buffer_float + +static GLboolean _glewInit_GL_ARB_color_buffer_float () +{ + GLboolean r = GL_FALSE; + + r = ((glClampColorARB = (PFNGLCLAMPCOLORARBPROC)glewGetProcAddress((const GLubyte*)"glClampColorARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_color_buffer_float */ + +#ifdef GL_ARB_compute_shader + +static GLboolean _glewInit_GL_ARB_compute_shader () +{ + GLboolean r = GL_FALSE; + + r = ((glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC)glewGetProcAddress((const GLubyte*)"glDispatchCompute")) == NULL) || r; + r = ((glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDispatchComputeIndirect")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_compute_shader */ + +#ifdef GL_ARB_compute_variable_group_size + +static GLboolean _glewInit_GL_ARB_compute_variable_group_size () +{ + GLboolean r = GL_FALSE; + + r = ((glDispatchComputeGroupSizeARB = (PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC)glewGetProcAddress((const GLubyte*)"glDispatchComputeGroupSizeARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_compute_variable_group_size */ + +#ifdef GL_ARB_copy_buffer + +static GLboolean _glewInit_GL_ARB_copy_buffer () +{ + GLboolean r = GL_FALSE; + + r = ((glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyBufferSubData")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_copy_buffer */ + +#ifdef GL_ARB_copy_image + +static GLboolean _glewInit_GL_ARB_copy_image () +{ + GLboolean r = GL_FALSE; + + r = ((glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubData")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_copy_image */ + +#ifdef GL_ARB_debug_output + +static GLboolean _glewInit_GL_ARB_debug_output () +{ + GLboolean r = GL_FALSE; + + r = ((glDebugMessageCallbackARB = (PFNGLDEBUGMESSAGECALLBACKARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackARB")) == NULL) || r; + r = ((glDebugMessageControlARB = (PFNGLDEBUGMESSAGECONTROLARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageControlARB")) == NULL) || r; + r = ((glDebugMessageInsertARB = (PFNGLDEBUGMESSAGEINSERTARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertARB")) == NULL) || r; + r = ((glGetDebugMessageLogARB = (PFNGLGETDEBUGMESSAGELOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_debug_output */ + +#ifdef GL_ARB_direct_state_access + +static GLboolean _glewInit_GL_ARB_direct_state_access () +{ + GLboolean r = GL_FALSE; + + r = ((glBindTextureUnit = (PFNGLBINDTEXTUREUNITPROC)glewGetProcAddress((const GLubyte*)"glBindTextureUnit")) == NULL) || r; + r = ((glBlitNamedFramebuffer = (PFNGLBLITNAMEDFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBlitNamedFramebuffer")) == NULL) || r; + r = ((glCheckNamedFramebufferStatus = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC)glewGetProcAddress((const GLubyte*)"glCheckNamedFramebufferStatus")) == NULL) || r; + r = ((glClearNamedBufferData = (PFNGLCLEARNAMEDBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferData")) == NULL) || r; + r = ((glClearNamedBufferSubData = (PFNGLCLEARNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferSubData")) == NULL) || r; + r = ((glClearNamedFramebufferfi = (PFNGLCLEARNAMEDFRAMEBUFFERFIPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferfi")) == NULL) || r; + r = ((glClearNamedFramebufferfv = (PFNGLCLEARNAMEDFRAMEBUFFERFVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferfv")) == NULL) || r; + r = ((glClearNamedFramebufferiv = (PFNGLCLEARNAMEDFRAMEBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferiv")) == NULL) || r; + r = ((glClearNamedFramebufferuiv = (PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferuiv")) == NULL) || r; + r = ((glCompressedTextureSubImage1D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage1D")) == NULL) || r; + r = ((glCompressedTextureSubImage2D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage2D")) == NULL) || r; + r = ((glCompressedTextureSubImage3D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage3D")) == NULL) || r; + r = ((glCopyNamedBufferSubData = (PFNGLCOPYNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyNamedBufferSubData")) == NULL) || r; + r = ((glCopyTextureSubImage1D = (PFNGLCOPYTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage1D")) == NULL) || r; + r = ((glCopyTextureSubImage2D = (PFNGLCOPYTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage2D")) == NULL) || r; + r = ((glCopyTextureSubImage3D = (PFNGLCOPYTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage3D")) == NULL) || r; + r = ((glCreateBuffers = (PFNGLCREATEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateBuffers")) == NULL) || r; + r = ((glCreateFramebuffers = (PFNGLCREATEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateFramebuffers")) == NULL) || r; + r = ((glCreateProgramPipelines = (PFNGLCREATEPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glCreateProgramPipelines")) == NULL) || r; + r = ((glCreateQueries = (PFNGLCREATEQUERIESPROC)glewGetProcAddress((const GLubyte*)"glCreateQueries")) == NULL) || r; + r = ((glCreateRenderbuffers = (PFNGLCREATERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateRenderbuffers")) == NULL) || r; + r = ((glCreateSamplers = (PFNGLCREATESAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glCreateSamplers")) == NULL) || r; + r = ((glCreateTextures = (PFNGLCREATETEXTURESPROC)glewGetProcAddress((const GLubyte*)"glCreateTextures")) == NULL) || r; + r = ((glCreateTransformFeedbacks = (PFNGLCREATETRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glCreateTransformFeedbacks")) == NULL) || r; + r = ((glCreateVertexArrays = (PFNGLCREATEVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glCreateVertexArrays")) == NULL) || r; + r = ((glDisableVertexArrayAttrib = (PFNGLDISABLEVERTEXARRAYATTRIBPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayAttrib")) == NULL) || r; + r = ((glEnableVertexArrayAttrib = (PFNGLENABLEVERTEXARRAYATTRIBPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayAttrib")) == NULL) || r; + r = ((glFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedNamedBufferRange")) == NULL) || r; + r = ((glGenerateTextureMipmap = (PFNGLGENERATETEXTUREMIPMAPPROC)glewGetProcAddress((const GLubyte*)"glGenerateTextureMipmap")) == NULL) || r; + r = ((glGetCompressedTextureImage = (PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureImage")) == NULL) || r; + r = ((glGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64VPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameteri64v")) == NULL) || r; + r = ((glGetNamedBufferParameteriv = (PFNGLGETNAMEDBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameteriv")) == NULL) || r; + r = ((glGetNamedBufferPointerv = (PFNGLGETNAMEDBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferPointerv")) == NULL) || r; + r = ((glGetNamedBufferSubData = (PFNGLGETNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferSubData")) == NULL) || r; + r = ((glGetNamedFramebufferAttachmentParameteriv = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferAttachmentParameteriv")) == NULL) || r; + r = ((glGetNamedFramebufferParameteriv = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameteriv")) == NULL) || r; + r = ((glGetNamedRenderbufferParameteriv = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedRenderbufferParameteriv")) == NULL) || r; + r = ((glGetQueryBufferObjecti64v = (PFNGLGETQUERYBUFFEROBJECTI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjecti64v")) == NULL) || r; + r = ((glGetQueryBufferObjectiv = (PFNGLGETQUERYBUFFEROBJECTIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectiv")) == NULL) || r; + r = ((glGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECTUI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectui64v")) == NULL) || r; + r = ((glGetQueryBufferObjectuiv = (PFNGLGETQUERYBUFFEROBJECTUIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectuiv")) == NULL) || r; + r = ((glGetTextureImage = (PFNGLGETTEXTUREIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetTextureImage")) == NULL) || r; + r = ((glGetTextureLevelParameterfv = (PFNGLGETTEXTURELEVELPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterfv")) == NULL) || r; + r = ((glGetTextureLevelParameteriv = (PFNGLGETTEXTURELEVELPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameteriv")) == NULL) || r; + r = ((glGetTextureParameterIiv = (PFNGLGETTEXTUREPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIiv")) == NULL) || r; + r = ((glGetTextureParameterIuiv = (PFNGLGETTEXTUREPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIuiv")) == NULL) || r; + r = ((glGetTextureParameterfv = (PFNGLGETTEXTUREPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterfv")) == NULL) || r; + r = ((glGetTextureParameteriv = (PFNGLGETTEXTUREPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameteriv")) == NULL) || r; + r = ((glGetTransformFeedbacki64_v = (PFNGLGETTRANSFORMFEEDBACKI64_VPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbacki64_v")) == NULL) || r; + r = ((glGetTransformFeedbacki_v = (PFNGLGETTRANSFORMFEEDBACKI_VPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbacki_v")) == NULL) || r; + r = ((glGetTransformFeedbackiv = (PFNGLGETTRANSFORMFEEDBACKIVPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackiv")) == NULL) || r; + r = ((glGetVertexArrayIndexed64iv = (PFNGLGETVERTEXARRAYINDEXED64IVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIndexed64iv")) == NULL) || r; + r = ((glGetVertexArrayIndexediv = (PFNGLGETVERTEXARRAYINDEXEDIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIndexediv")) == NULL) || r; + r = ((glGetVertexArrayiv = (PFNGLGETVERTEXARRAYIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayiv")) == NULL) || r; + r = ((glInvalidateNamedFramebufferData = (PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateNamedFramebufferData")) == NULL) || r; + r = ((glInvalidateNamedFramebufferSubData = (PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateNamedFramebufferSubData")) == NULL) || r; + r = ((glMapNamedBuffer = (PFNGLMAPNAMEDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBuffer")) == NULL) || r; + r = ((glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferRange")) == NULL) || r; + r = ((glNamedBufferData = (PFNGLNAMEDBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferData")) == NULL) || r; + r = ((glNamedBufferStorage = (PFNGLNAMEDBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorage")) == NULL) || r; + r = ((glNamedBufferSubData = (PFNGLNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferSubData")) == NULL) || r; + r = ((glNamedFramebufferDrawBuffer = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferDrawBuffer")) == NULL) || r; + r = ((glNamedFramebufferDrawBuffers = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferDrawBuffers")) == NULL) || r; + r = ((glNamedFramebufferParameteri = (PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferParameteri")) == NULL) || r; + r = ((glNamedFramebufferReadBuffer = (PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferReadBuffer")) == NULL) || r; + r = ((glNamedFramebufferRenderbuffer = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferRenderbuffer")) == NULL) || r; + r = ((glNamedFramebufferTexture = (PFNGLNAMEDFRAMEBUFFERTEXTUREPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture")) == NULL) || r; + r = ((glNamedFramebufferTextureLayer = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureLayer")) == NULL) || r; + r = ((glNamedRenderbufferStorage = (PFNGLNAMEDRENDERBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorage")) == NULL) || r; + r = ((glNamedRenderbufferStorageMultisample = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisample")) == NULL) || r; + r = ((glTextureBuffer = (PFNGLTEXTUREBUFFERPROC)glewGetProcAddress((const GLubyte*)"glTextureBuffer")) == NULL) || r; + r = ((glTextureBufferRange = (PFNGLTEXTUREBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferRange")) == NULL) || r; + r = ((glTextureParameterIiv = (PFNGLTEXTUREPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIiv")) == NULL) || r; + r = ((glTextureParameterIuiv = (PFNGLTEXTUREPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIuiv")) == NULL) || r; + r = ((glTextureParameterf = (PFNGLTEXTUREPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterf")) == NULL) || r; + r = ((glTextureParameterfv = (PFNGLTEXTUREPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfv")) == NULL) || r; + r = ((glTextureParameteri = (PFNGLTEXTUREPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteri")) == NULL) || r; + r = ((glTextureParameteriv = (PFNGLTEXTUREPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteriv")) == NULL) || r; + r = ((glTextureStorage1D = (PFNGLTEXTURESTORAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage1D")) == NULL) || r; + r = ((glTextureStorage2D = (PFNGLTEXTURESTORAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2D")) == NULL) || r; + r = ((glTextureStorage2DMultisample = (PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DMultisample")) == NULL) || r; + r = ((glTextureStorage3D = (PFNGLTEXTURESTORAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3D")) == NULL) || r; + r = ((glTextureStorage3DMultisample = (PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DMultisample")) == NULL) || r; + r = ((glTextureSubImage1D = (PFNGLTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage1D")) == NULL) || r; + r = ((glTextureSubImage2D = (PFNGLTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage2D")) == NULL) || r; + r = ((glTextureSubImage3D = (PFNGLTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage3D")) == NULL) || r; + r = ((glTransformFeedbackBufferBase = (PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackBufferBase")) == NULL) || r; + r = ((glTransformFeedbackBufferRange = (PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackBufferRange")) == NULL) || r; + r = ((glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glUnmapNamedBuffer")) == NULL) || r; + r = ((glVertexArrayAttribBinding = (PFNGLVERTEXARRAYATTRIBBINDINGPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribBinding")) == NULL) || r; + r = ((glVertexArrayAttribFormat = (PFNGLVERTEXARRAYATTRIBFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribFormat")) == NULL) || r; + r = ((glVertexArrayAttribIFormat = (PFNGLVERTEXARRAYATTRIBIFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribIFormat")) == NULL) || r; + r = ((glVertexArrayAttribLFormat = (PFNGLVERTEXARRAYATTRIBLFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribLFormat")) == NULL) || r; + r = ((glVertexArrayBindingDivisor = (PFNGLVERTEXARRAYBINDINGDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayBindingDivisor")) == NULL) || r; + r = ((glVertexArrayElementBuffer = (PFNGLVERTEXARRAYELEMENTBUFFERPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayElementBuffer")) == NULL) || r; + r = ((glVertexArrayVertexBuffer = (PFNGLVERTEXARRAYVERTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBuffer")) == NULL) || r; + r = ((glVertexArrayVertexBuffers = (PFNGLVERTEXARRAYVERTEXBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBuffers")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_direct_state_access */ + +#ifdef GL_ARB_draw_buffers + +static GLboolean _glewInit_GL_ARB_draw_buffers () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawBuffersARB = (PFNGLDRAWBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_draw_buffers */ + +#ifdef GL_ARB_draw_buffers_blend + +static GLboolean _glewInit_GL_ARB_draw_buffers_blend () +{ + GLboolean r = GL_FALSE; + + r = ((glBlendEquationSeparateiARB = (PFNGLBLENDEQUATIONSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateiARB")) == NULL) || r; + r = ((glBlendEquationiARB = (PFNGLBLENDEQUATIONIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationiARB")) == NULL) || r; + r = ((glBlendFuncSeparateiARB = (PFNGLBLENDFUNCSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateiARB")) == NULL) || r; + r = ((glBlendFunciARB = (PFNGLBLENDFUNCIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFunciARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_draw_buffers_blend */ + +#ifdef GL_ARB_draw_elements_base_vertex + +static GLboolean _glewInit_GL_ARB_draw_elements_base_vertex () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsBaseVertex")) == NULL) || r; + r = ((glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertex")) == NULL) || r; + r = ((glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsBaseVertex")) == NULL) || r; + r = ((glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsBaseVertex")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_draw_elements_base_vertex */ + +#ifdef GL_ARB_draw_indirect + +static GLboolean _glewInit_GL_ARB_draw_indirect () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysIndirect")) == NULL) || r; + r = ((glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsIndirect")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_draw_indirect */ + +#ifdef GL_ARB_framebuffer_no_attachments + +static GLboolean _glewInit_GL_ARB_framebuffer_no_attachments () +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glFramebufferParameteri")) == NULL) || r; + r = ((glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameteriv")) == NULL) || r; + r = ((glGetNamedFramebufferParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameterivEXT")) == NULL) || r; + r = ((glNamedFramebufferParameteriEXT = (PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferParameteriEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_framebuffer_no_attachments */ + +#ifdef GL_ARB_framebuffer_object + +static GLboolean _glewInit_GL_ARB_framebuffer_object () +{ + GLboolean r = GL_FALSE; + + r = ((glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindFramebuffer")) == NULL) || r; + r = ((glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbuffer")) == NULL) || r; + r = ((glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebuffer")) == NULL) || r; + r = ((glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatus")) == NULL) || r; + r = ((glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffers")) == NULL) || r; + r = ((glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffers")) == NULL) || r; + r = ((glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbuffer")) == NULL) || r; + r = ((glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1D")) == NULL) || r; + r = ((glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2D")) == NULL) || r; + r = ((glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3D")) == NULL) || r; + r = ((glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayer")) == NULL) || r; + r = ((glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffers")) == NULL) || r; + r = ((glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffers")) == NULL) || r; + r = ((glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmap")) == NULL) || r; + r = ((glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameteriv")) == NULL) || r; + r = ((glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameteriv")) == NULL) || r; + r = ((glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsFramebuffer")) == NULL) || r; + r = ((glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbuffer")) == NULL) || r; + r = ((glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorage")) == NULL) || r; + r = ((glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisample")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_framebuffer_object */ + +#ifdef GL_ARB_geometry_shader4 + +static GLboolean _glewInit_GL_ARB_geometry_shader4 () +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureARB")) == NULL) || r; + r = ((glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureFaceARB")) == NULL) || r; + r = ((glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerARB")) == NULL) || r; + r = ((glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteriARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_geometry_shader4 */ + +#ifdef GL_ARB_get_program_binary + +static GLboolean _glewInit_GL_ARB_get_program_binary () +{ + GLboolean r = GL_FALSE; + + r = ((glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glGetProgramBinary")) == NULL) || r; + r = ((glProgramBinary = (PFNGLPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glProgramBinary")) == NULL) || r; + r = ((glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteri")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_get_program_binary */ + +#ifdef GL_ARB_get_texture_sub_image + +static GLboolean _glewInit_GL_ARB_get_texture_sub_image () +{ + GLboolean r = GL_FALSE; + + r = ((glGetCompressedTextureSubImage = (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureSubImage")) == NULL) || r; + r = ((glGetTextureSubImage = (PFNGLGETTEXTURESUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSubImage")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_get_texture_sub_image */ + +#ifdef GL_ARB_gl_spirv + +static GLboolean _glewInit_GL_ARB_gl_spirv () +{ + GLboolean r = GL_FALSE; + + r = ((glSpecializeShaderARB = (PFNGLSPECIALIZESHADERARBPROC)glewGetProcAddress((const GLubyte*)"glSpecializeShaderARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_gl_spirv */ + +#ifdef GL_ARB_gpu_shader_fp64 + +static GLboolean _glewInit_GL_ARB_gpu_shader_fp64 () +{ + GLboolean r = GL_FALSE; + + r = ((glGetUniformdv = (PFNGLGETUNIFORMDVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformdv")) == NULL) || r; + r = ((glUniform1d = (PFNGLUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glUniform1d")) == NULL) || r; + r = ((glUniform1dv = (PFNGLUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glUniform1dv")) == NULL) || r; + r = ((glUniform2d = (PFNGLUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glUniform2d")) == NULL) || r; + r = ((glUniform2dv = (PFNGLUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glUniform2dv")) == NULL) || r; + r = ((glUniform3d = (PFNGLUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glUniform3d")) == NULL) || r; + r = ((glUniform3dv = (PFNGLUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glUniform3dv")) == NULL) || r; + r = ((glUniform4d = (PFNGLUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glUniform4d")) == NULL) || r; + r = ((glUniform4dv = (PFNGLUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glUniform4dv")) == NULL) || r; + r = ((glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2dv")) == NULL) || r; + r = ((glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3dv")) == NULL) || r; + r = ((glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4dv")) == NULL) || r; + r = ((glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3dv")) == NULL) || r; + r = ((glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2dv")) == NULL) || r; + r = ((glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4dv")) == NULL) || r; + r = ((glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4dv")) == NULL) || r; + r = ((glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2dv")) == NULL) || r; + r = ((glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3dv")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_gpu_shader_fp64 */ + +#ifdef GL_ARB_gpu_shader_int64 + +static GLboolean _glewInit_GL_ARB_gpu_shader_int64 () +{ + GLboolean r = GL_FALSE; + + r = ((glGetUniformi64vARB = (PFNGLGETUNIFORMI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformi64vARB")) == NULL) || r; + r = ((glGetUniformui64vARB = (PFNGLGETUNIFORMUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformui64vARB")) == NULL) || r; + r = ((glGetnUniformi64vARB = (PFNGLGETNUNIFORMI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformi64vARB")) == NULL) || r; + r = ((glGetnUniformui64vARB = (PFNGLGETNUNIFORMUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformui64vARB")) == NULL) || r; + r = ((glProgramUniform1i64ARB = (PFNGLPROGRAMUNIFORM1I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64ARB")) == NULL) || r; + r = ((glProgramUniform1i64vARB = (PFNGLPROGRAMUNIFORM1I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64vARB")) == NULL) || r; + r = ((glProgramUniform1ui64ARB = (PFNGLPROGRAMUNIFORM1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64ARB")) == NULL) || r; + r = ((glProgramUniform1ui64vARB = (PFNGLPROGRAMUNIFORM1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64vARB")) == NULL) || r; + r = ((glProgramUniform2i64ARB = (PFNGLPROGRAMUNIFORM2I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64ARB")) == NULL) || r; + r = ((glProgramUniform2i64vARB = (PFNGLPROGRAMUNIFORM2I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64vARB")) == NULL) || r; + r = ((glProgramUniform2ui64ARB = (PFNGLPROGRAMUNIFORM2UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64ARB")) == NULL) || r; + r = ((glProgramUniform2ui64vARB = (PFNGLPROGRAMUNIFORM2UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64vARB")) == NULL) || r; + r = ((glProgramUniform3i64ARB = (PFNGLPROGRAMUNIFORM3I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64ARB")) == NULL) || r; + r = ((glProgramUniform3i64vARB = (PFNGLPROGRAMUNIFORM3I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64vARB")) == NULL) || r; + r = ((glProgramUniform3ui64ARB = (PFNGLPROGRAMUNIFORM3UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64ARB")) == NULL) || r; + r = ((glProgramUniform3ui64vARB = (PFNGLPROGRAMUNIFORM3UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64vARB")) == NULL) || r; + r = ((glProgramUniform4i64ARB = (PFNGLPROGRAMUNIFORM4I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64ARB")) == NULL) || r; + r = ((glProgramUniform4i64vARB = (PFNGLPROGRAMUNIFORM4I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64vARB")) == NULL) || r; + r = ((glProgramUniform4ui64ARB = (PFNGLPROGRAMUNIFORM4UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64ARB")) == NULL) || r; + r = ((glProgramUniform4ui64vARB = (PFNGLPROGRAMUNIFORM4UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64vARB")) == NULL) || r; + r = ((glUniform1i64ARB = (PFNGLUNIFORM1I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64ARB")) == NULL) || r; + r = ((glUniform1i64vARB = (PFNGLUNIFORM1I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64vARB")) == NULL) || r; + r = ((glUniform1ui64ARB = (PFNGLUNIFORM1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64ARB")) == NULL) || r; + r = ((glUniform1ui64vARB = (PFNGLUNIFORM1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64vARB")) == NULL) || r; + r = ((glUniform2i64ARB = (PFNGLUNIFORM2I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64ARB")) == NULL) || r; + r = ((glUniform2i64vARB = (PFNGLUNIFORM2I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64vARB")) == NULL) || r; + r = ((glUniform2ui64ARB = (PFNGLUNIFORM2UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64ARB")) == NULL) || r; + r = ((glUniform2ui64vARB = (PFNGLUNIFORM2UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64vARB")) == NULL) || r; + r = ((glUniform3i64ARB = (PFNGLUNIFORM3I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64ARB")) == NULL) || r; + r = ((glUniform3i64vARB = (PFNGLUNIFORM3I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64vARB")) == NULL) || r; + r = ((glUniform3ui64ARB = (PFNGLUNIFORM3UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64ARB")) == NULL) || r; + r = ((glUniform3ui64vARB = (PFNGLUNIFORM3UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64vARB")) == NULL) || r; + r = ((glUniform4i64ARB = (PFNGLUNIFORM4I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64ARB")) == NULL) || r; + r = ((glUniform4i64vARB = (PFNGLUNIFORM4I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64vARB")) == NULL) || r; + r = ((glUniform4ui64ARB = (PFNGLUNIFORM4UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64ARB")) == NULL) || r; + r = ((glUniform4ui64vARB = (PFNGLUNIFORM4UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64vARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_gpu_shader_int64 */ + +#ifdef GL_ARB_imaging + +static GLboolean _glewInit_GL_ARB_imaging () +{ + GLboolean r = GL_FALSE; + + r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; + r = ((glColorSubTable = (PFNGLCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorSubTable")) == NULL) || r; + r = ((glColorTable = (PFNGLCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorTable")) == NULL) || r; + r = ((glColorTableParameterfv = (PFNGLCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfv")) == NULL) || r; + r = ((glColorTableParameteriv = (PFNGLCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameteriv")) == NULL) || r; + r = ((glConvolutionFilter1D = (PFNGLCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1D")) == NULL) || r; + r = ((glConvolutionFilter2D = (PFNGLCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2D")) == NULL) || r; + r = ((glConvolutionParameterf = (PFNGLCONVOLUTIONPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterf")) == NULL) || r; + r = ((glConvolutionParameterfv = (PFNGLCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfv")) == NULL) || r; + r = ((glConvolutionParameteri = (PFNGLCONVOLUTIONPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteri")) == NULL) || r; + r = ((glConvolutionParameteriv = (PFNGLCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriv")) == NULL) || r; + r = ((glCopyColorSubTable = (PFNGLCOPYCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTable")) == NULL) || r; + r = ((glCopyColorTable = (PFNGLCOPYCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTable")) == NULL) || r; + r = ((glCopyConvolutionFilter1D = (PFNGLCOPYCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1D")) == NULL) || r; + r = ((glCopyConvolutionFilter2D = (PFNGLCOPYCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2D")) == NULL) || r; + r = ((glGetColorTable = (PFNGLGETCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glGetColorTable")) == NULL) || r; + r = ((glGetColorTableParameterfv = (PFNGLGETCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfv")) == NULL) || r; + r = ((glGetColorTableParameteriv = (PFNGLGETCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameteriv")) == NULL) || r; + r = ((glGetConvolutionFilter = (PFNGLGETCONVOLUTIONFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilter")) == NULL) || r; + r = ((glGetConvolutionParameterfv = (PFNGLGETCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfv")) == NULL) || r; + r = ((glGetConvolutionParameteriv = (PFNGLGETCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameteriv")) == NULL) || r; + r = ((glGetHistogram = (PFNGLGETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glGetHistogram")) == NULL) || r; + r = ((glGetHistogramParameterfv = (PFNGLGETHISTOGRAMPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfv")) == NULL) || r; + r = ((glGetHistogramParameteriv = (PFNGLGETHISTOGRAMPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameteriv")) == NULL) || r; + r = ((glGetMinmax = (PFNGLGETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glGetMinmax")) == NULL) || r; + r = ((glGetMinmaxParameterfv = (PFNGLGETMINMAXPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfv")) == NULL) || r; + r = ((glGetMinmaxParameteriv = (PFNGLGETMINMAXPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameteriv")) == NULL) || r; + r = ((glGetSeparableFilter = (PFNGLGETSEPARABLEFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilter")) == NULL) || r; + r = ((glHistogram = (PFNGLHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glHistogram")) == NULL) || r; + r = ((glMinmax = (PFNGLMINMAXPROC)glewGetProcAddress((const GLubyte*)"glMinmax")) == NULL) || r; + r = ((glResetHistogram = (PFNGLRESETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glResetHistogram")) == NULL) || r; + r = ((glResetMinmax = (PFNGLRESETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glResetMinmax")) == NULL) || r; + r = ((glSeparableFilter2D = (PFNGLSEPARABLEFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2D")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_imaging */ + +#ifdef GL_ARB_indirect_parameters + +static GLboolean _glewInit_GL_ARB_indirect_parameters () +{ + GLboolean r = GL_FALSE; + + r = ((glMultiDrawArraysIndirectCountARB = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectCountARB")) == NULL) || r; + r = ((glMultiDrawElementsIndirectCountARB = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectCountARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_indirect_parameters */ + +#ifdef GL_ARB_instanced_arrays + +static GLboolean _glewInit_GL_ARB_instanced_arrays () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawArraysInstancedARB = (PFNGLDRAWARRAYSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedARB")) == NULL) || r; + r = ((glDrawElementsInstancedARB = (PFNGLDRAWELEMENTSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedARB")) == NULL) || r; + r = ((glVertexAttribDivisorARB = (PFNGLVERTEXATTRIBDIVISORARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_instanced_arrays */ + +#ifdef GL_ARB_internalformat_query + +static GLboolean _glewInit_GL_ARB_internalformat_query () +{ + GLboolean r = GL_FALSE; + + r = ((glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformativ")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_internalformat_query */ + +#ifdef GL_ARB_internalformat_query2 + +static GLboolean _glewInit_GL_ARB_internalformat_query2 () +{ + GLboolean r = GL_FALSE; + + r = ((glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformati64v")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_internalformat_query2 */ + +#ifdef GL_ARB_invalidate_subdata + +static GLboolean _glewInit_GL_ARB_invalidate_subdata () +{ + GLboolean r = GL_FALSE; + + r = ((glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateBufferData")) == NULL) || r; + r = ((glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateBufferSubData")) == NULL) || r; + r = ((glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glInvalidateFramebuffer")) == NULL) || r; + r = ((glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glInvalidateSubFramebuffer")) == NULL) || r; + r = ((glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glInvalidateTexImage")) == NULL) || r; + r = ((glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glInvalidateTexSubImage")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_invalidate_subdata */ + +#ifdef GL_ARB_map_buffer_range + +static GLboolean _glewInit_GL_ARB_map_buffer_range () +{ + GLboolean r = GL_FALSE; + + r = ((glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRange")) == NULL) || r; + r = ((glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glMapBufferRange")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_map_buffer_range */ + +#ifdef GL_ARB_matrix_palette + +static GLboolean _glewInit_GL_ARB_matrix_palette () +{ + GLboolean r = GL_FALSE; + + r = ((glCurrentPaletteMatrixARB = (PFNGLCURRENTPALETTEMATRIXARBPROC)glewGetProcAddress((const GLubyte*)"glCurrentPaletteMatrixARB")) == NULL) || r; + r = ((glMatrixIndexPointerARB = (PFNGLMATRIXINDEXPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexPointerARB")) == NULL) || r; + r = ((glMatrixIndexubvARB = (PFNGLMATRIXINDEXUBVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexubvARB")) == NULL) || r; + r = ((glMatrixIndexuivARB = (PFNGLMATRIXINDEXUIVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexuivARB")) == NULL) || r; + r = ((glMatrixIndexusvARB = (PFNGLMATRIXINDEXUSVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexusvARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_matrix_palette */ + +#ifdef GL_ARB_multi_bind + +static GLboolean _glewInit_GL_ARB_multi_bind () +{ + GLboolean r = GL_FALSE; + + r = ((glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersBase")) == NULL) || r; + r = ((glBindBuffersRange = (PFNGLBINDBUFFERSRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersRange")) == NULL) || r; + r = ((glBindImageTextures = (PFNGLBINDIMAGETEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextures")) == NULL) || r; + r = ((glBindSamplers = (PFNGLBINDSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glBindSamplers")) == NULL) || r; + r = ((glBindTextures = (PFNGLBINDTEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindTextures")) == NULL) || r; + r = ((glBindVertexBuffers = (PFNGLBINDVERTEXBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glBindVertexBuffers")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_multi_bind */ + +#ifdef GL_ARB_multi_draw_indirect + +static GLboolean _glewInit_GL_ARB_multi_draw_indirect () +{ + GLboolean r = GL_FALSE; + + r = ((glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirect")) == NULL) || r; + r = ((glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirect")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_multi_draw_indirect */ + +#ifdef GL_ARB_multisample + +static GLboolean _glewInit_GL_ARB_multisample () +{ + GLboolean r = GL_FALSE; + + r = ((glSampleCoverageARB = (PFNGLSAMPLECOVERAGEARBPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverageARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_multisample */ + +#ifdef GL_ARB_multitexture + +static GLboolean _glewInit_GL_ARB_multitexture () +{ + GLboolean r = GL_FALSE; + + r = ((glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glActiveTextureARB")) == NULL) || r; + r = ((glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTextureARB")) == NULL) || r; + r = ((glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dARB")) == NULL) || r; + r = ((glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dvARB")) == NULL) || r; + r = ((glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fARB")) == NULL) || r; + r = ((glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fvARB")) == NULL) || r; + r = ((glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iARB")) == NULL) || r; + r = ((glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1ivARB")) == NULL) || r; + r = ((glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sARB")) == NULL) || r; + r = ((glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1svARB")) == NULL) || r; + r = ((glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dARB")) == NULL) || r; + r = ((glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dvARB")) == NULL) || r; + r = ((glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fARB")) == NULL) || r; + r = ((glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fvARB")) == NULL) || r; + r = ((glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iARB")) == NULL) || r; + r = ((glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2ivARB")) == NULL) || r; + r = ((glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sARB")) == NULL) || r; + r = ((glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2svARB")) == NULL) || r; + r = ((glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dARB")) == NULL) || r; + r = ((glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dvARB")) == NULL) || r; + r = ((glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fARB")) == NULL) || r; + r = ((glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fvARB")) == NULL) || r; + r = ((glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iARB")) == NULL) || r; + r = ((glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3ivARB")) == NULL) || r; + r = ((glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sARB")) == NULL) || r; + r = ((glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3svARB")) == NULL) || r; + r = ((glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dARB")) == NULL) || r; + r = ((glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dvARB")) == NULL) || r; + r = ((glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fARB")) == NULL) || r; + r = ((glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fvARB")) == NULL) || r; + r = ((glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iARB")) == NULL) || r; + r = ((glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4ivARB")) == NULL) || r; + r = ((glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sARB")) == NULL) || r; + r = ((glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4svARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_multitexture */ + +#ifdef GL_ARB_occlusion_query + +static GLboolean _glewInit_GL_ARB_occlusion_query () +{ + GLboolean r = GL_FALSE; + + r = ((glBeginQueryARB = (PFNGLBEGINQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryARB")) == NULL) || r; + r = ((glDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesARB")) == NULL) || r; + r = ((glEndQueryARB = (PFNGLENDQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glEndQueryARB")) == NULL) || r; + r = ((glGenQueriesARB = (PFNGLGENQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesARB")) == NULL) || r; + r = ((glGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivARB")) == NULL) || r; + r = ((glGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivARB")) == NULL) || r; + r = ((glGetQueryivARB = (PFNGLGETQUERYIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivARB")) == NULL) || r; + r = ((glIsQueryARB = (PFNGLISQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glIsQueryARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_occlusion_query */ + +#ifdef GL_ARB_parallel_shader_compile + +static GLboolean _glewInit_GL_ARB_parallel_shader_compile () +{ + GLboolean r = GL_FALSE; + + r = ((glMaxShaderCompilerThreadsARB = (PFNGLMAXSHADERCOMPILERTHREADSARBPROC)glewGetProcAddress((const GLubyte*)"glMaxShaderCompilerThreadsARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_parallel_shader_compile */ + +#ifdef GL_ARB_point_parameters + +static GLboolean _glewInit_GL_ARB_point_parameters () +{ + GLboolean r = GL_FALSE; + + r = ((glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfARB")) == NULL) || r; + r = ((glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_point_parameters */ + +#ifdef GL_ARB_polygon_offset_clamp + +static GLboolean _glewInit_GL_ARB_polygon_offset_clamp () +{ + GLboolean r = GL_FALSE; + + r = ((glPolygonOffsetClamp = (PFNGLPOLYGONOFFSETCLAMPPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetClamp")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_polygon_offset_clamp */ + +#ifdef GL_ARB_program_interface_query + +static GLboolean _glewInit_GL_ARB_program_interface_query () +{ + GLboolean r = GL_FALSE; + + r = ((glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInterfaceiv")) == NULL) || r; + r = ((glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceIndex")) == NULL) || r; + r = ((glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocation")) == NULL) || r; + r = ((glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocationIndex")) == NULL) || r; + r = ((glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceName")) == NULL) || r; + r = ((glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceiv")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_program_interface_query */ + +#ifdef GL_ARB_provoking_vertex + +static GLboolean _glewInit_GL_ARB_provoking_vertex () +{ + GLboolean r = GL_FALSE; + + r = ((glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertex")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_provoking_vertex */ + +#ifdef GL_ARB_robustness + +static GLboolean _glewInit_GL_ARB_robustness () +{ + GLboolean r = GL_FALSE; + + r = ((glGetGraphicsResetStatusARB = (PFNGLGETGRAPHICSRESETSTATUSARBPROC)glewGetProcAddress((const GLubyte*)"glGetGraphicsResetStatusARB")) == NULL) || r; + r = ((glGetnColorTableARB = (PFNGLGETNCOLORTABLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnColorTableARB")) == NULL) || r; + r = ((glGetnCompressedTexImageARB = (PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnCompressedTexImageARB")) == NULL) || r; + r = ((glGetnConvolutionFilterARB = (PFNGLGETNCONVOLUTIONFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnConvolutionFilterARB")) == NULL) || r; + r = ((glGetnHistogramARB = (PFNGLGETNHISTOGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glGetnHistogramARB")) == NULL) || r; + r = ((glGetnMapdvARB = (PFNGLGETNMAPDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapdvARB")) == NULL) || r; + r = ((glGetnMapfvARB = (PFNGLGETNMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapfvARB")) == NULL) || r; + r = ((glGetnMapivARB = (PFNGLGETNMAPIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapivARB")) == NULL) || r; + r = ((glGetnMinmaxARB = (PFNGLGETNMINMAXARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMinmaxARB")) == NULL) || r; + r = ((glGetnPixelMapfvARB = (PFNGLGETNPIXELMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapfvARB")) == NULL) || r; + r = ((glGetnPixelMapuivARB = (PFNGLGETNPIXELMAPUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapuivARB")) == NULL) || r; + r = ((glGetnPixelMapusvARB = (PFNGLGETNPIXELMAPUSVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapusvARB")) == NULL) || r; + r = ((glGetnPolygonStippleARB = (PFNGLGETNPOLYGONSTIPPLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPolygonStippleARB")) == NULL) || r; + r = ((glGetnSeparableFilterARB = (PFNGLGETNSEPARABLEFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnSeparableFilterARB")) == NULL) || r; + r = ((glGetnTexImageARB = (PFNGLGETNTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnTexImageARB")) == NULL) || r; + r = ((glGetnUniformdvARB = (PFNGLGETNUNIFORMDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformdvARB")) == NULL) || r; + r = ((glGetnUniformfvARB = (PFNGLGETNUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformfvARB")) == NULL) || r; + r = ((glGetnUniformivARB = (PFNGLGETNUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformivARB")) == NULL) || r; + r = ((glGetnUniformuivARB = (PFNGLGETNUNIFORMUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformuivARB")) == NULL) || r; + r = ((glReadnPixelsARB = (PFNGLREADNPIXELSARBPROC)glewGetProcAddress((const GLubyte*)"glReadnPixelsARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_robustness */ + +#ifdef GL_ARB_sample_locations + +static GLboolean _glewInit_GL_ARB_sample_locations () +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferSampleLocationsfvARB = (PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSampleLocationsfvARB")) == NULL) || r; + r = ((glNamedFramebufferSampleLocationsfvARB = (PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSampleLocationsfvARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_sample_locations */ + +#ifdef GL_ARB_sample_shading + +static GLboolean _glewInit_GL_ARB_sample_shading () +{ + GLboolean r = GL_FALSE; + + r = ((glMinSampleShadingARB = (PFNGLMINSAMPLESHADINGARBPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShadingARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_sample_shading */ + +#ifdef GL_ARB_sampler_objects + +static GLboolean _glewInit_GL_ARB_sampler_objects () +{ + GLboolean r = GL_FALSE; + + r = ((glBindSampler = (PFNGLBINDSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glBindSampler")) == NULL) || r; + r = ((glDeleteSamplers = (PFNGLDELETESAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteSamplers")) == NULL) || r; + r = ((glGenSamplers = (PFNGLGENSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glGenSamplers")) == NULL) || r; + r = ((glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIiv")) == NULL) || r; + r = ((glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIuiv")) == NULL) || r; + r = ((glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterfv")) == NULL) || r; + r = ((glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameteriv")) == NULL) || r; + r = ((glIsSampler = (PFNGLISSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glIsSampler")) == NULL) || r; + r = ((glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIiv")) == NULL) || r; + r = ((glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIuiv")) == NULL) || r; + r = ((glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterf")) == NULL) || r; + r = ((glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterfv")) == NULL) || r; + r = ((glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteri")) == NULL) || r; + r = ((glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteriv")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_sampler_objects */ + +#ifdef GL_ARB_separate_shader_objects + +static GLboolean _glewInit_GL_ARB_separate_shader_objects () +{ + GLboolean r = GL_FALSE; + + r = ((glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glActiveShaderProgram")) == NULL) || r; + r = ((glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glBindProgramPipeline")) == NULL) || r; + r = ((glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramv")) == NULL) || r; + r = ((glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramPipelines")) == NULL) || r; + r = ((glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glGenProgramPipelines")) == NULL) || r; + r = ((glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineInfoLog")) == NULL) || r; + r = ((glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineiv")) == NULL) || r; + r = ((glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glIsProgramPipeline")) == NULL) || r; + r = ((glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1d")) == NULL) || r; + r = ((glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1dv")) == NULL) || r; + r = ((glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1f")) == NULL) || r; + r = ((glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fv")) == NULL) || r; + r = ((glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i")) == NULL) || r; + r = ((glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iv")) == NULL) || r; + r = ((glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui")) == NULL) || r; + r = ((glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiv")) == NULL) || r; + r = ((glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2d")) == NULL) || r; + r = ((glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2dv")) == NULL) || r; + r = ((glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2f")) == NULL) || r; + r = ((glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fv")) == NULL) || r; + r = ((glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i")) == NULL) || r; + r = ((glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iv")) == NULL) || r; + r = ((glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui")) == NULL) || r; + r = ((glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiv")) == NULL) || r; + r = ((glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3d")) == NULL) || r; + r = ((glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3dv")) == NULL) || r; + r = ((glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3f")) == NULL) || r; + r = ((glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fv")) == NULL) || r; + r = ((glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i")) == NULL) || r; + r = ((glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iv")) == NULL) || r; + r = ((glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui")) == NULL) || r; + r = ((glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiv")) == NULL) || r; + r = ((glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4d")) == NULL) || r; + r = ((glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4dv")) == NULL) || r; + r = ((glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4f")) == NULL) || r; + r = ((glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fv")) == NULL) || r; + r = ((glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i")) == NULL) || r; + r = ((glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iv")) == NULL) || r; + r = ((glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui")) == NULL) || r; + r = ((glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiv")) == NULL) || r; + r = ((glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2dv")) == NULL) || r; + r = ((glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fv")) == NULL) || r; + r = ((glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3dv")) == NULL) || r; + r = ((glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fv")) == NULL) || r; + r = ((glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4dv")) == NULL) || r; + r = ((glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fv")) == NULL) || r; + r = ((glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3dv")) == NULL) || r; + r = ((glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fv")) == NULL) || r; + r = ((glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2dv")) == NULL) || r; + r = ((glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fv")) == NULL) || r; + r = ((glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4dv")) == NULL) || r; + r = ((glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fv")) == NULL) || r; + r = ((glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4dv")) == NULL) || r; + r = ((glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fv")) == NULL) || r; + r = ((glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2dv")) == NULL) || r; + r = ((glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fv")) == NULL) || r; + r = ((glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3dv")) == NULL) || r; + r = ((glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fv")) == NULL) || r; + r = ((glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC)glewGetProcAddress((const GLubyte*)"glUseProgramStages")) == NULL) || r; + r = ((glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramPipeline")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_separate_shader_objects */ + +#ifdef GL_ARB_shader_atomic_counters + +static GLboolean _glewInit_GL_ARB_shader_atomic_counters () +{ + GLboolean r = GL_FALSE; + + r = ((glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAtomicCounterBufferiv")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_shader_atomic_counters */ + +#ifdef GL_ARB_shader_image_load_store + +static GLboolean _glewInit_GL_ARB_shader_image_load_store () +{ + GLboolean r = GL_FALSE; + + r = ((glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glBindImageTexture")) == NULL) || r; + r = ((glMemoryBarrier = (PFNGLMEMORYBARRIERPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrier")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_shader_image_load_store */ + +#ifdef GL_ARB_shader_objects + +static GLboolean _glewInit_GL_ARB_shader_objects () +{ + GLboolean r = GL_FALSE; + + r = ((glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glAttachObjectARB")) == NULL) || r; + r = ((glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderARB")) == NULL) || r; + r = ((glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateProgramObjectARB")) == NULL) || r; + r = ((glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderObjectARB")) == NULL) || r; + r = ((glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteObjectARB")) == NULL) || r; + r = ((glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDetachObjectARB")) == NULL) || r; + r = ((glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformARB")) == NULL) || r; + r = ((glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedObjectsARB")) == NULL) || r; + r = ((glGetHandleARB = (PFNGLGETHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetHandleARB")) == NULL) || r; + r = ((glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetInfoLogARB")) == NULL) || r; + r = ((glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterfvARB")) == NULL) || r; + r = ((glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivARB")) == NULL) || r; + r = ((glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSourceARB")) == NULL) || r; + r = ((glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocationARB")) == NULL) || r; + r = ((glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfvARB")) == NULL) || r; + r = ((glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformivARB")) == NULL) || r; + r = ((glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glLinkProgramARB")) == NULL) || r; + r = ((glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glShaderSourceARB")) == NULL) || r; + r = ((glUniform1fARB = (PFNGLUNIFORM1FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fARB")) == NULL) || r; + r = ((glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fvARB")) == NULL) || r; + r = ((glUniform1iARB = (PFNGLUNIFORM1IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1iARB")) == NULL) || r; + r = ((glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ivARB")) == NULL) || r; + r = ((glUniform2fARB = (PFNGLUNIFORM2FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fARB")) == NULL) || r; + r = ((glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fvARB")) == NULL) || r; + r = ((glUniform2iARB = (PFNGLUNIFORM2IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2iARB")) == NULL) || r; + r = ((glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ivARB")) == NULL) || r; + r = ((glUniform3fARB = (PFNGLUNIFORM3FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fARB")) == NULL) || r; + r = ((glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fvARB")) == NULL) || r; + r = ((glUniform3iARB = (PFNGLUNIFORM3IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3iARB")) == NULL) || r; + r = ((glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ivARB")) == NULL) || r; + r = ((glUniform4fARB = (PFNGLUNIFORM4FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fARB")) == NULL) || r; + r = ((glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fvARB")) == NULL) || r; + r = ((glUniform4iARB = (PFNGLUNIFORM4IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4iARB")) == NULL) || r; + r = ((glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ivARB")) == NULL) || r; + r = ((glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fvARB")) == NULL) || r; + r = ((glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fvARB")) == NULL) || r; + r = ((glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fvARB")) == NULL) || r; + r = ((glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glUseProgramObjectARB")) == NULL) || r; + r = ((glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_shader_objects */ + +#ifdef GL_ARB_shader_storage_buffer_object + +static GLboolean _glewInit_GL_ARB_shader_storage_buffer_object () +{ + GLboolean r = GL_FALSE; + + r = ((glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)"glShaderStorageBlockBinding")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_shader_storage_buffer_object */ + +#ifdef GL_ARB_shader_subroutine + +static GLboolean _glewInit_GL_ARB_shader_subroutine () +{ + GLboolean r = GL_FALSE; + + r = ((glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineName")) == NULL) || r; + r = ((glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformName")) == NULL) || r; + r = ((glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformiv")) == NULL) || r; + r = ((glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStageiv")) == NULL) || r; + r = ((glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineIndex")) == NULL) || r; + r = ((glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineUniformLocation")) == NULL) || r; + r = ((glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformSubroutineuiv")) == NULL) || r; + r = ((glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC)glewGetProcAddress((const GLubyte*)"glUniformSubroutinesuiv")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_shader_subroutine */ + +#ifdef GL_ARB_shading_language_include + +static GLboolean _glewInit_GL_ARB_shading_language_include () +{ + GLboolean r = GL_FALSE; + + r = ((glCompileShaderIncludeARB = (PFNGLCOMPILESHADERINCLUDEARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderIncludeARB")) == NULL) || r; + r = ((glDeleteNamedStringARB = (PFNGLDELETENAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamedStringARB")) == NULL) || r; + r = ((glGetNamedStringARB = (PFNGLGETNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringARB")) == NULL) || r; + r = ((glGetNamedStringivARB = (PFNGLGETNAMEDSTRINGIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringivARB")) == NULL) || r; + r = ((glIsNamedStringARB = (PFNGLISNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glIsNamedStringARB")) == NULL) || r; + r = ((glNamedStringARB = (PFNGLNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glNamedStringARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_shading_language_include */ + +#ifdef GL_ARB_sparse_buffer + +static GLboolean _glewInit_GL_ARB_sparse_buffer () +{ + GLboolean r = GL_FALSE; + + r = ((glBufferPageCommitmentARB = (PFNGLBUFFERPAGECOMMITMENTARBPROC)glewGetProcAddress((const GLubyte*)"glBufferPageCommitmentARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_sparse_buffer */ + +#ifdef GL_ARB_sparse_texture + +static GLboolean _glewInit_GL_ARB_sparse_texture () +{ + GLboolean r = GL_FALSE; + + r = ((glTexPageCommitmentARB = (PFNGLTEXPAGECOMMITMENTARBPROC)glewGetProcAddress((const GLubyte*)"glTexPageCommitmentARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_sparse_texture */ + +#ifdef GL_ARB_sync + +static GLboolean _glewInit_GL_ARB_sync () +{ + GLboolean r = GL_FALSE; + + r = ((glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glClientWaitSync")) == NULL) || r; + r = ((glDeleteSync = (PFNGLDELETESYNCPROC)glewGetProcAddress((const GLubyte*)"glDeleteSync")) == NULL) || r; + r = ((glFenceSync = (PFNGLFENCESYNCPROC)glewGetProcAddress((const GLubyte*)"glFenceSync")) == NULL) || r; + r = ((glGetInteger64v = (PFNGLGETINTEGER64VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64v")) == NULL) || r; + r = ((glGetSynciv = (PFNGLGETSYNCIVPROC)glewGetProcAddress((const GLubyte*)"glGetSynciv")) == NULL) || r; + r = ((glIsSync = (PFNGLISSYNCPROC)glewGetProcAddress((const GLubyte*)"glIsSync")) == NULL) || r; + r = ((glWaitSync = (PFNGLWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glWaitSync")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_sync */ + +#ifdef GL_ARB_tessellation_shader + +static GLboolean _glewInit_GL_ARB_tessellation_shader () +{ + GLboolean r = GL_FALSE; + + r = ((glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPatchParameterfv")) == NULL) || r; + r = ((glPatchParameteri = (PFNGLPATCHPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPatchParameteri")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_tessellation_shader */ + +#ifdef GL_ARB_texture_barrier + +static GLboolean _glewInit_GL_ARB_texture_barrier () +{ + GLboolean r = GL_FALSE; + + r = ((glTextureBarrier = (PFNGLTEXTUREBARRIERPROC)glewGetProcAddress((const GLubyte*)"glTextureBarrier")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_texture_barrier */ + +#ifdef GL_ARB_texture_buffer_object + +static GLboolean _glewInit_GL_ARB_texture_buffer_object () +{ + GLboolean r = GL_FALSE; + + r = ((glTexBufferARB = (PFNGLTEXBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glTexBufferARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_texture_buffer_object */ + +#ifdef GL_ARB_texture_buffer_range + +static GLboolean _glewInit_GL_ARB_texture_buffer_range () +{ + GLboolean r = GL_FALSE; + + r = ((glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTexBufferRange")) == NULL) || r; + r = ((glTextureBufferRangeEXT = (PFNGLTEXTUREBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferRangeEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_texture_buffer_range */ + +#ifdef GL_ARB_texture_compression + +static GLboolean _glewInit_GL_ARB_texture_compression () +{ + GLboolean r = GL_FALSE; + + r = ((glCompressedTexImage1DARB = (PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1DARB")) == NULL) || r; + r = ((glCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2DARB")) == NULL) || r; + r = ((glCompressedTexImage3DARB = (PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3DARB")) == NULL) || r; + r = ((glCompressedTexSubImage1DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1DARB")) == NULL) || r; + r = ((glCompressedTexSubImage2DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2DARB")) == NULL) || r; + r = ((glCompressedTexSubImage3DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3DARB")) == NULL) || r; + r = ((glGetCompressedTexImageARB = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImageARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_texture_compression */ + +#ifdef GL_ARB_texture_multisample + +static GLboolean _glewInit_GL_ARB_texture_multisample () +{ + GLboolean r = GL_FALSE; + + r = ((glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC)glewGetProcAddress((const GLubyte*)"glGetMultisamplefv")) == NULL) || r; + r = ((glSampleMaski = (PFNGLSAMPLEMASKIPROC)glewGetProcAddress((const GLubyte*)"glSampleMaski")) == NULL) || r; + r = ((glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage2DMultisample")) == NULL) || r; + r = ((glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DMultisample")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_texture_multisample */ + +#ifdef GL_ARB_texture_storage + +static GLboolean _glewInit_GL_ARB_texture_storage () +{ + GLboolean r = GL_FALSE; + + r = ((glTexStorage1D = (PFNGLTEXSTORAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage1D")) == NULL) || r; + r = ((glTexStorage2D = (PFNGLTEXSTORAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2D")) == NULL) || r; + r = ((glTexStorage3D = (PFNGLTEXSTORAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3D")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_texture_storage */ + +#ifdef GL_ARB_texture_storage_multisample + +static GLboolean _glewInit_GL_ARB_texture_storage_multisample () +{ + GLboolean r = GL_FALSE; + + r = ((glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2DMultisample")) == NULL) || r; + r = ((glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3DMultisample")) == NULL) || r; + r = ((glTextureStorage2DMultisampleEXT = (PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DMultisampleEXT")) == NULL) || r; + r = ((glTextureStorage3DMultisampleEXT = (PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DMultisampleEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_texture_storage_multisample */ + +#ifdef GL_ARB_texture_view + +static GLboolean _glewInit_GL_ARB_texture_view () +{ + GLboolean r = GL_FALSE; + + r = ((glTextureView = (PFNGLTEXTUREVIEWPROC)glewGetProcAddress((const GLubyte*)"glTextureView")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_texture_view */ + +#ifdef GL_ARB_timer_query + +static GLboolean _glewInit_GL_ARB_timer_query () +{ + GLboolean r = GL_FALSE; + + r = ((glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64v")) == NULL) || r; + r = ((glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64v")) == NULL) || r; + r = ((glQueryCounter = (PFNGLQUERYCOUNTERPROC)glewGetProcAddress((const GLubyte*)"glQueryCounter")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_timer_query */ + +#ifdef GL_ARB_transform_feedback2 + +static GLboolean _glewInit_GL_ARB_transform_feedback2 () +{ + GLboolean r = GL_FALSE; + + r = ((glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedback")) == NULL) || r; + r = ((glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacks")) == NULL) || r; + r = ((glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedback")) == NULL) || r; + r = ((glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacks")) == NULL) || r; + r = ((glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedback")) == NULL) || r; + r = ((glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedback")) == NULL) || r; + r = ((glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedback")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_transform_feedback2 */ + +#ifdef GL_ARB_transform_feedback3 + +static GLboolean _glewInit_GL_ARB_transform_feedback3 () +{ + GLboolean r = GL_FALSE; + + r = ((glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryIndexed")) == NULL) || r; + r = ((glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackStream")) == NULL) || r; + r = ((glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glEndQueryIndexed")) == NULL) || r; + r = ((glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryIndexediv")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_transform_feedback3 */ + +#ifdef GL_ARB_transform_feedback_instanced + +static GLboolean _glewInit_GL_ARB_transform_feedback_instanced () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackInstanced")) == NULL) || r; + r = ((glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackStreamInstanced")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_transform_feedback_instanced */ + +#ifdef GL_ARB_transpose_matrix + +static GLboolean _glewInit_GL_ARB_transpose_matrix () +{ + GLboolean r = GL_FALSE; + + r = ((glLoadTransposeMatrixdARB = (PFNGLLOADTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixdARB")) == NULL) || r; + r = ((glLoadTransposeMatrixfARB = (PFNGLLOADTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixfARB")) == NULL) || r; + r = ((glMultTransposeMatrixdARB = (PFNGLMULTTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixdARB")) == NULL) || r; + r = ((glMultTransposeMatrixfARB = (PFNGLMULTTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixfARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_transpose_matrix */ + +#ifdef GL_ARB_uniform_buffer_object + +static GLboolean _glewInit_GL_ARB_uniform_buffer_object () +{ + GLboolean r = GL_FALSE; + + r = ((glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBase")) == NULL) || r; + r = ((glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRange")) == NULL) || r; + r = ((glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockName")) == NULL) || r; + r = ((glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockiv")) == NULL) || r; + r = ((glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformName")) == NULL) || r; + r = ((glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformsiv")) == NULL) || r; + r = ((glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)glewGetProcAddress((const GLubyte*)"glGetIntegeri_v")) == NULL) || r; + r = ((glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBlockIndex")) == NULL) || r; + r = ((glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)glewGetProcAddress((const GLubyte*)"glGetUniformIndices")) == NULL) || r; + r = ((glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)"glUniformBlockBinding")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_uniform_buffer_object */ + +#ifdef GL_ARB_vertex_array_object + +static GLboolean _glewInit_GL_ARB_vertex_array_object () +{ + GLboolean r = GL_FALSE; + + r = ((glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArray")) == NULL) || r; + r = ((glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArrays")) == NULL) || r; + r = ((glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArrays")) == NULL) || r; + r = ((glIsVertexArray = (PFNGLISVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArray")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_array_object */ + +#ifdef GL_ARB_vertex_attrib_64bit + +static GLboolean _glewInit_GL_ARB_vertex_attrib_64bit () +{ + GLboolean r = GL_FALSE; + + r = ((glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdv")) == NULL) || r; + r = ((glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1d")) == NULL) || r; + r = ((glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dv")) == NULL) || r; + r = ((glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2d")) == NULL) || r; + r = ((glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dv")) == NULL) || r; + r = ((glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3d")) == NULL) || r; + r = ((glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dv")) == NULL) || r; + r = ((glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4d")) == NULL) || r; + r = ((glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dv")) == NULL) || r; + r = ((glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointer")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_attrib_64bit */ + +#ifdef GL_ARB_vertex_attrib_binding + +static GLboolean _glewInit_GL_ARB_vertex_attrib_binding () +{ + GLboolean r = GL_FALSE; + + r = ((glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindVertexBuffer")) == NULL) || r; + r = ((glVertexArrayBindVertexBufferEXT = (PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayBindVertexBufferEXT")) == NULL) || r; + r = ((glVertexArrayVertexAttribBindingEXT = (PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribBindingEXT")) == NULL) || r; + r = ((glVertexArrayVertexAttribFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribFormatEXT")) == NULL) || r; + r = ((glVertexArrayVertexAttribIFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribIFormatEXT")) == NULL) || r; + r = ((glVertexArrayVertexAttribLFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribLFormatEXT")) == NULL) || r; + r = ((glVertexArrayVertexBindingDivisorEXT = (PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBindingDivisorEXT")) == NULL) || r; + r = ((glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribBinding")) == NULL) || r; + r = ((glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribFormat")) == NULL) || r; + r = ((glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIFormat")) == NULL) || r; + r = ((glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLFormat")) == NULL) || r; + r = ((glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexBindingDivisor")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_attrib_binding */ + +#ifdef GL_ARB_vertex_blend + +static GLboolean _glewInit_GL_ARB_vertex_blend () +{ + GLboolean r = GL_FALSE; + + r = ((glVertexBlendARB = (PFNGLVERTEXBLENDARBPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendARB")) == NULL) || r; + r = ((glWeightPointerARB = (PFNGLWEIGHTPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glWeightPointerARB")) == NULL) || r; + r = ((glWeightbvARB = (PFNGLWEIGHTBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightbvARB")) == NULL) || r; + r = ((glWeightdvARB = (PFNGLWEIGHTDVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightdvARB")) == NULL) || r; + r = ((glWeightfvARB = (PFNGLWEIGHTFVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightfvARB")) == NULL) || r; + r = ((glWeightivARB = (PFNGLWEIGHTIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightivARB")) == NULL) || r; + r = ((glWeightsvARB = (PFNGLWEIGHTSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightsvARB")) == NULL) || r; + r = ((glWeightubvARB = (PFNGLWEIGHTUBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightubvARB")) == NULL) || r; + r = ((glWeightuivARB = (PFNGLWEIGHTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightuivARB")) == NULL) || r; + r = ((glWeightusvARB = (PFNGLWEIGHTUSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightusvARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_blend */ + +#ifdef GL_ARB_vertex_buffer_object + +static GLboolean _glewInit_GL_ARB_vertex_buffer_object () +{ + GLboolean r = GL_FALSE; + + r = ((glBindBufferARB = (PFNGLBINDBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glBindBufferARB")) == NULL) || r; + r = ((glBufferDataARB = (PFNGLBUFFERDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferDataARB")) == NULL) || r; + r = ((glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferSubDataARB")) == NULL) || r; + r = ((glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffersARB")) == NULL) || r; + r = ((glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glGenBuffersARB")) == NULL) || r; + r = ((glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterivARB")) == NULL) || r; + r = ((glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointervARB")) == NULL) || r; + r = ((glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubDataARB")) == NULL) || r; + r = ((glIsBufferARB = (PFNGLISBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glIsBufferARB")) == NULL) || r; + r = ((glMapBufferARB = (PFNGLMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glMapBufferARB")) == NULL) || r; + r = ((glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glUnmapBufferARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_buffer_object */ + +#ifdef GL_ARB_vertex_program + +static GLboolean _glewInit_GL_ARB_vertex_program () +{ + GLboolean r = GL_FALSE; + + r = ((glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glBindProgramARB")) == NULL) || r; + r = ((glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsARB")) == NULL) || r; + r = ((glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArrayARB")) == NULL) || r; + r = ((glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArrayARB")) == NULL) || r; + r = ((glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsARB")) == NULL) || r; + r = ((glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterdvARB")) == NULL) || r; + r = ((glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterfvARB")) == NULL) || r; + r = ((glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterdvARB")) == NULL) || r; + r = ((glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterfvARB")) == NULL) || r; + r = ((glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringARB")) == NULL) || r; + r = ((glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivARB")) == NULL) || r; + r = ((glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervARB")) == NULL) || r; + r = ((glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvARB")) == NULL) || r; + r = ((glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvARB")) == NULL) || r; + r = ((glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivARB")) == NULL) || r; + r = ((glIsProgramARB = (PFNGLISPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glIsProgramARB")) == NULL) || r; + r = ((glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dARB")) == NULL) || r; + r = ((glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dvARB")) == NULL) || r; + r = ((glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fARB")) == NULL) || r; + r = ((glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fvARB")) == NULL) || r; + r = ((glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dARB")) == NULL) || r; + r = ((glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dvARB")) == NULL) || r; + r = ((glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fARB")) == NULL) || r; + r = ((glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fvARB")) == NULL) || r; + r = ((glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glProgramStringARB")) == NULL) || r; + r = ((glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dARB")) == NULL) || r; + r = ((glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvARB")) == NULL) || r; + r = ((glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fARB")) == NULL) || r; + r = ((glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvARB")) == NULL) || r; + r = ((glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sARB")) == NULL) || r; + r = ((glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svARB")) == NULL) || r; + r = ((glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dARB")) == NULL) || r; + r = ((glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvARB")) == NULL) || r; + r = ((glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fARB")) == NULL) || r; + r = ((glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvARB")) == NULL) || r; + r = ((glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sARB")) == NULL) || r; + r = ((glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svARB")) == NULL) || r; + r = ((glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dARB")) == NULL) || r; + r = ((glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvARB")) == NULL) || r; + r = ((glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fARB")) == NULL) || r; + r = ((glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvARB")) == NULL) || r; + r = ((glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sARB")) == NULL) || r; + r = ((glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svARB")) == NULL) || r; + r = ((glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NbvARB")) == NULL) || r; + r = ((glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NivARB")) == NULL) || r; + r = ((glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NsvARB")) == NULL) || r; + r = ((glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubARB")) == NULL) || r; + r = ((glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubvARB")) == NULL) || r; + r = ((glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NuivARB")) == NULL) || r; + r = ((glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NusvARB")) == NULL) || r; + r = ((glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bvARB")) == NULL) || r; + r = ((glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dARB")) == NULL) || r; + r = ((glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvARB")) == NULL) || r; + r = ((glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fARB")) == NULL) || r; + r = ((glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvARB")) == NULL) || r; + r = ((glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ivARB")) == NULL) || r; + r = ((glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sARB")) == NULL) || r; + r = ((glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svARB")) == NULL) || r; + r = ((glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvARB")) == NULL) || r; + r = ((glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uivARB")) == NULL) || r; + r = ((glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usvARB")) == NULL) || r; + r = ((glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_program */ + +#ifdef GL_ARB_vertex_shader + +static GLboolean _glewInit_GL_ARB_vertex_shader () +{ + GLboolean r = GL_FALSE; + + r = ((glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocationARB")) == NULL) || r; + r = ((glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttribARB")) == NULL) || r; + r = ((glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocationARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_shader */ + +#ifdef GL_ARB_vertex_type_2_10_10_10_rev + +static GLboolean _glewInit_GL_ARB_vertex_type_2_10_10_10_rev () +{ + GLboolean r = GL_FALSE; + + r = ((glColorP3ui = (PFNGLCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glColorP3ui")) == NULL) || r; + r = ((glColorP3uiv = (PFNGLCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP3uiv")) == NULL) || r; + r = ((glColorP4ui = (PFNGLCOLORP4UIPROC)glewGetProcAddress((const GLubyte*)"glColorP4ui")) == NULL) || r; + r = ((glColorP4uiv = (PFNGLCOLORP4UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP4uiv")) == NULL) || r; + r = ((glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1ui")) == NULL) || r; + r = ((glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1uiv")) == NULL) || r; + r = ((glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2ui")) == NULL) || r; + r = ((glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2uiv")) == NULL) || r; + r = ((glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3ui")) == NULL) || r; + r = ((glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3uiv")) == NULL) || r; + r = ((glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4ui")) == NULL) || r; + r = ((glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4uiv")) == NULL) || r; + r = ((glNormalP3ui = (PFNGLNORMALP3UIPROC)glewGetProcAddress((const GLubyte*)"glNormalP3ui")) == NULL) || r; + r = ((glNormalP3uiv = (PFNGLNORMALP3UIVPROC)glewGetProcAddress((const GLubyte*)"glNormalP3uiv")) == NULL) || r; + r = ((glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3ui")) == NULL) || r; + r = ((glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3uiv")) == NULL) || r; + r = ((glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1ui")) == NULL) || r; + r = ((glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1uiv")) == NULL) || r; + r = ((glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2ui")) == NULL) || r; + r = ((glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2uiv")) == NULL) || r; + r = ((glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3ui")) == NULL) || r; + r = ((glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3uiv")) == NULL) || r; + r = ((glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4ui")) == NULL) || r; + r = ((glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4uiv")) == NULL) || r; + r = ((glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1ui")) == NULL) || r; + r = ((glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1uiv")) == NULL) || r; + r = ((glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2ui")) == NULL) || r; + r = ((glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2uiv")) == NULL) || r; + r = ((glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3ui")) == NULL) || r; + r = ((glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3uiv")) == NULL) || r; + r = ((glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4ui")) == NULL) || r; + r = ((glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4uiv")) == NULL) || r; + r = ((glVertexP2ui = (PFNGLVERTEXP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP2ui")) == NULL) || r; + r = ((glVertexP2uiv = (PFNGLVERTEXP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP2uiv")) == NULL) || r; + r = ((glVertexP3ui = (PFNGLVERTEXP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP3ui")) == NULL) || r; + r = ((glVertexP3uiv = (PFNGLVERTEXP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP3uiv")) == NULL) || r; + r = ((glVertexP4ui = (PFNGLVERTEXP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP4ui")) == NULL) || r; + r = ((glVertexP4uiv = (PFNGLVERTEXP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP4uiv")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ + +#ifdef GL_ARB_viewport_array + +static GLboolean _glewInit_GL_ARB_viewport_array () +{ + GLboolean r = GL_FALSE; + + r = ((glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeArrayv")) == NULL) || r; + r = ((glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeIndexed")) == NULL) || r; + r = ((glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_v")) == NULL) || r; + r = ((glGetFloati_v = (PFNGLGETFLOATI_VPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_v")) == NULL) || r; + r = ((glScissorArrayv = (PFNGLSCISSORARRAYVPROC)glewGetProcAddress((const GLubyte*)"glScissorArrayv")) == NULL) || r; + r = ((glScissorIndexed = (PFNGLSCISSORINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexed")) == NULL) || r; + r = ((glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexedv")) == NULL) || r; + r = ((glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC)glewGetProcAddress((const GLubyte*)"glViewportArrayv")) == NULL) || r; + r = ((glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedf")) == NULL) || r; + r = ((glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedfv")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_viewport_array */ + +#ifdef GL_ARB_window_pos + +static GLboolean _glewInit_GL_ARB_window_pos () +{ + GLboolean r = GL_FALSE; + + r = ((glWindowPos2dARB = (PFNGLWINDOWPOS2DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dARB")) == NULL) || r; + r = ((glWindowPos2dvARB = (PFNGLWINDOWPOS2DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvARB")) == NULL) || r; + r = ((glWindowPos2fARB = (PFNGLWINDOWPOS2FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fARB")) == NULL) || r; + r = ((glWindowPos2fvARB = (PFNGLWINDOWPOS2FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvARB")) == NULL) || r; + r = ((glWindowPos2iARB = (PFNGLWINDOWPOS2IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iARB")) == NULL) || r; + r = ((glWindowPos2ivARB = (PFNGLWINDOWPOS2IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivARB")) == NULL) || r; + r = ((glWindowPos2sARB = (PFNGLWINDOWPOS2SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sARB")) == NULL) || r; + r = ((glWindowPos2svARB = (PFNGLWINDOWPOS2SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svARB")) == NULL) || r; + r = ((glWindowPos3dARB = (PFNGLWINDOWPOS3DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dARB")) == NULL) || r; + r = ((glWindowPos3dvARB = (PFNGLWINDOWPOS3DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvARB")) == NULL) || r; + r = ((glWindowPos3fARB = (PFNGLWINDOWPOS3FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fARB")) == NULL) || r; + r = ((glWindowPos3fvARB = (PFNGLWINDOWPOS3FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvARB")) == NULL) || r; + r = ((glWindowPos3iARB = (PFNGLWINDOWPOS3IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iARB")) == NULL) || r; + r = ((glWindowPos3ivARB = (PFNGLWINDOWPOS3IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivARB")) == NULL) || r; + r = ((glWindowPos3sARB = (PFNGLWINDOWPOS3SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sARB")) == NULL) || r; + r = ((glWindowPos3svARB = (PFNGLWINDOWPOS3SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_window_pos */ + +#ifdef GL_ATI_draw_buffers + +static GLboolean _glewInit_GL_ATI_draw_buffers () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawBuffersATI = (PFNGLDRAWBUFFERSATIPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_draw_buffers */ + +#ifdef GL_ATI_element_array + +static GLboolean _glewInit_GL_ATI_element_array () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawElementArrayATI = (PFNGLDRAWELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayATI")) == NULL) || r; + r = ((glDrawRangeElementArrayATI = (PFNGLDRAWRANGEELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayATI")) == NULL) || r; + r = ((glElementPointerATI = (PFNGLELEMENTPOINTERATIPROC)glewGetProcAddress((const GLubyte*)"glElementPointerATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_element_array */ + +#ifdef GL_ATI_envmap_bumpmap + +static GLboolean _glewInit_GL_ATI_envmap_bumpmap () +{ + GLboolean r = GL_FALSE; + + r = ((glGetTexBumpParameterfvATI = (PFNGLGETTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterfvATI")) == NULL) || r; + r = ((glGetTexBumpParameterivATI = (PFNGLGETTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterivATI")) == NULL) || r; + r = ((glTexBumpParameterfvATI = (PFNGLTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterfvATI")) == NULL) || r; + r = ((glTexBumpParameterivATI = (PFNGLTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterivATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_envmap_bumpmap */ + +#ifdef GL_ATI_fragment_shader + +static GLboolean _glewInit_GL_ATI_fragment_shader () +{ + GLboolean r = GL_FALSE; + + r = ((glAlphaFragmentOp1ATI = (PFNGLALPHAFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp1ATI")) == NULL) || r; + r = ((glAlphaFragmentOp2ATI = (PFNGLALPHAFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp2ATI")) == NULL) || r; + r = ((glAlphaFragmentOp3ATI = (PFNGLALPHAFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp3ATI")) == NULL) || r; + r = ((glBeginFragmentShaderATI = (PFNGLBEGINFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBeginFragmentShaderATI")) == NULL) || r; + r = ((glBindFragmentShaderATI = (PFNGLBINDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBindFragmentShaderATI")) == NULL) || r; + r = ((glColorFragmentOp1ATI = (PFNGLCOLORFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp1ATI")) == NULL) || r; + r = ((glColorFragmentOp2ATI = (PFNGLCOLORFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp2ATI")) == NULL) || r; + r = ((glColorFragmentOp3ATI = (PFNGLCOLORFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp3ATI")) == NULL) || r; + r = ((glDeleteFragmentShaderATI = (PFNGLDELETEFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glDeleteFragmentShaderATI")) == NULL) || r; + r = ((glEndFragmentShaderATI = (PFNGLENDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glEndFragmentShaderATI")) == NULL) || r; + r = ((glGenFragmentShadersATI = (PFNGLGENFRAGMENTSHADERSATIPROC)glewGetProcAddress((const GLubyte*)"glGenFragmentShadersATI")) == NULL) || r; + r = ((glPassTexCoordATI = (PFNGLPASSTEXCOORDATIPROC)glewGetProcAddress((const GLubyte*)"glPassTexCoordATI")) == NULL) || r; + r = ((glSampleMapATI = (PFNGLSAMPLEMAPATIPROC)glewGetProcAddress((const GLubyte*)"glSampleMapATI")) == NULL) || r; + r = ((glSetFragmentShaderConstantATI = (PFNGLSETFRAGMENTSHADERCONSTANTATIPROC)glewGetProcAddress((const GLubyte*)"glSetFragmentShaderConstantATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_fragment_shader */ + +#ifdef GL_ATI_map_object_buffer + +static GLboolean _glewInit_GL_ATI_map_object_buffer () +{ + GLboolean r = GL_FALSE; + + r = ((glMapObjectBufferATI = (PFNGLMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glMapObjectBufferATI")) == NULL) || r; + r = ((glUnmapObjectBufferATI = (PFNGLUNMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUnmapObjectBufferATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_map_object_buffer */ + +#ifdef GL_ATI_pn_triangles + +static GLboolean _glewInit_GL_ATI_pn_triangles () +{ + GLboolean r = GL_FALSE; + + r = ((glPNTrianglesfATI = (PFNGLPNTRIANGLESFATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesfATI")) == NULL) || r; + r = ((glPNTrianglesiATI = (PFNGLPNTRIANGLESIATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesiATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_pn_triangles */ + +#ifdef GL_ATI_separate_stencil + +static GLboolean _glewInit_GL_ATI_separate_stencil () +{ + GLboolean r = GL_FALSE; + + r = ((glStencilFuncSeparateATI = (PFNGLSTENCILFUNCSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparateATI")) == NULL) || r; + r = ((glStencilOpSeparateATI = (PFNGLSTENCILOPSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparateATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_separate_stencil */ + +#ifdef GL_ATI_vertex_array_object + +static GLboolean _glewInit_GL_ATI_vertex_array_object () +{ + GLboolean r = GL_FALSE; + + r = ((glArrayObjectATI = (PFNGLARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glArrayObjectATI")) == NULL) || r; + r = ((glFreeObjectBufferATI = (PFNGLFREEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glFreeObjectBufferATI")) == NULL) || r; + r = ((glGetArrayObjectfvATI = (PFNGLGETARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectfvATI")) == NULL) || r; + r = ((glGetArrayObjectivATI = (PFNGLGETARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectivATI")) == NULL) || r; + r = ((glGetObjectBufferfvATI = (PFNGLGETOBJECTBUFFERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferfvATI")) == NULL) || r; + r = ((glGetObjectBufferivATI = (PFNGLGETOBJECTBUFFERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferivATI")) == NULL) || r; + r = ((glGetVariantArrayObjectfvATI = (PFNGLGETVARIANTARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectfvATI")) == NULL) || r; + r = ((glGetVariantArrayObjectivATI = (PFNGLGETVARIANTARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectivATI")) == NULL) || r; + r = ((glIsObjectBufferATI = (PFNGLISOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glIsObjectBufferATI")) == NULL) || r; + r = ((glNewObjectBufferATI = (PFNGLNEWOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glNewObjectBufferATI")) == NULL) || r; + r = ((glUpdateObjectBufferATI = (PFNGLUPDATEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUpdateObjectBufferATI")) == NULL) || r; + r = ((glVariantArrayObjectATI = (PFNGLVARIANTARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVariantArrayObjectATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_vertex_array_object */ + +#ifdef GL_ATI_vertex_attrib_array_object + +static GLboolean _glewInit_GL_ATI_vertex_attrib_array_object () +{ + GLboolean r = GL_FALSE; + + r = ((glGetVertexAttribArrayObjectfvATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectfvATI")) == NULL) || r; + r = ((glGetVertexAttribArrayObjectivATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectivATI")) == NULL) || r; + r = ((glVertexAttribArrayObjectATI = (PFNGLVERTEXATTRIBARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribArrayObjectATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_vertex_attrib_array_object */ + +#ifdef GL_ATI_vertex_streams + +static GLboolean _glewInit_GL_ATI_vertex_streams () +{ + GLboolean r = GL_FALSE; + + r = ((glClientActiveVertexStreamATI = (PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC)glewGetProcAddress((const GLubyte*)"glClientActiveVertexStreamATI")) == NULL) || r; + r = ((glNormalStream3bATI = (PFNGLNORMALSTREAM3BATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bATI")) == NULL) || r; + r = ((glNormalStream3bvATI = (PFNGLNORMALSTREAM3BVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bvATI")) == NULL) || r; + r = ((glNormalStream3dATI = (PFNGLNORMALSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dATI")) == NULL) || r; + r = ((glNormalStream3dvATI = (PFNGLNORMALSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dvATI")) == NULL) || r; + r = ((glNormalStream3fATI = (PFNGLNORMALSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fATI")) == NULL) || r; + r = ((glNormalStream3fvATI = (PFNGLNORMALSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fvATI")) == NULL) || r; + r = ((glNormalStream3iATI = (PFNGLNORMALSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3iATI")) == NULL) || r; + r = ((glNormalStream3ivATI = (PFNGLNORMALSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3ivATI")) == NULL) || r; + r = ((glNormalStream3sATI = (PFNGLNORMALSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3sATI")) == NULL) || r; + r = ((glNormalStream3svATI = (PFNGLNORMALSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3svATI")) == NULL) || r; + r = ((glVertexBlendEnvfATI = (PFNGLVERTEXBLENDENVFATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnvfATI")) == NULL) || r; + r = ((glVertexBlendEnviATI = (PFNGLVERTEXBLENDENVIATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnviATI")) == NULL) || r; + r = ((glVertexStream1dATI = (PFNGLVERTEXSTREAM1DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1dATI")) == NULL) || r; + r = ((glVertexStream1dvATI = (PFNGLVERTEXSTREAM1DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1dvATI")) == NULL) || r; + r = ((glVertexStream1fATI = (PFNGLVERTEXSTREAM1FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1fATI")) == NULL) || r; + r = ((glVertexStream1fvATI = (PFNGLVERTEXSTREAM1FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1fvATI")) == NULL) || r; + r = ((glVertexStream1iATI = (PFNGLVERTEXSTREAM1IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1iATI")) == NULL) || r; + r = ((glVertexStream1ivATI = (PFNGLVERTEXSTREAM1IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1ivATI")) == NULL) || r; + r = ((glVertexStream1sATI = (PFNGLVERTEXSTREAM1SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1sATI")) == NULL) || r; + r = ((glVertexStream1svATI = (PFNGLVERTEXSTREAM1SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1svATI")) == NULL) || r; + r = ((glVertexStream2dATI = (PFNGLVERTEXSTREAM2DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dATI")) == NULL) || r; + r = ((glVertexStream2dvATI = (PFNGLVERTEXSTREAM2DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dvATI")) == NULL) || r; + r = ((glVertexStream2fATI = (PFNGLVERTEXSTREAM2FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fATI")) == NULL) || r; + r = ((glVertexStream2fvATI = (PFNGLVERTEXSTREAM2FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fvATI")) == NULL) || r; + r = ((glVertexStream2iATI = (PFNGLVERTEXSTREAM2IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2iATI")) == NULL) || r; + r = ((glVertexStream2ivATI = (PFNGLVERTEXSTREAM2IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2ivATI")) == NULL) || r; + r = ((glVertexStream2sATI = (PFNGLVERTEXSTREAM2SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2sATI")) == NULL) || r; + r = ((glVertexStream2svATI = (PFNGLVERTEXSTREAM2SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2svATI")) == NULL) || r; + r = ((glVertexStream3dATI = (PFNGLVERTEXSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dATI")) == NULL) || r; + r = ((glVertexStream3dvATI = (PFNGLVERTEXSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dvATI")) == NULL) || r; + r = ((glVertexStream3fATI = (PFNGLVERTEXSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fATI")) == NULL) || r; + r = ((glVertexStream3fvATI = (PFNGLVERTEXSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fvATI")) == NULL) || r; + r = ((glVertexStream3iATI = (PFNGLVERTEXSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3iATI")) == NULL) || r; + r = ((glVertexStream3ivATI = (PFNGLVERTEXSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3ivATI")) == NULL) || r; + r = ((glVertexStream3sATI = (PFNGLVERTEXSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3sATI")) == NULL) || r; + r = ((glVertexStream3svATI = (PFNGLVERTEXSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3svATI")) == NULL) || r; + r = ((glVertexStream4dATI = (PFNGLVERTEXSTREAM4DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dATI")) == NULL) || r; + r = ((glVertexStream4dvATI = (PFNGLVERTEXSTREAM4DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dvATI")) == NULL) || r; + r = ((glVertexStream4fATI = (PFNGLVERTEXSTREAM4FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fATI")) == NULL) || r; + r = ((glVertexStream4fvATI = (PFNGLVERTEXSTREAM4FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fvATI")) == NULL) || r; + r = ((glVertexStream4iATI = (PFNGLVERTEXSTREAM4IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4iATI")) == NULL) || r; + r = ((glVertexStream4ivATI = (PFNGLVERTEXSTREAM4IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4ivATI")) == NULL) || r; + r = ((glVertexStream4sATI = (PFNGLVERTEXSTREAM4SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4sATI")) == NULL) || r; + r = ((glVertexStream4svATI = (PFNGLVERTEXSTREAM4SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4svATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_vertex_streams */ + +#ifdef GL_EXT_base_instance + +static GLboolean _glewInit_GL_EXT_base_instance () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawArraysInstancedBaseInstanceEXT = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedBaseInstanceEXT")) == NULL) || r; + r = ((glDrawElementsInstancedBaseInstanceEXT = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseInstanceEXT")) == NULL) || r; + r = ((glDrawElementsInstancedBaseVertexBaseInstanceEXT = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertexBaseInstanceEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_base_instance */ + +#ifdef GL_EXT_bindable_uniform + +static GLboolean _glewInit_GL_EXT_bindable_uniform () +{ + GLboolean r = GL_FALSE; + + r = ((glGetUniformBufferSizeEXT = (PFNGLGETUNIFORMBUFFERSIZEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBufferSizeEXT")) == NULL) || r; + r = ((glGetUniformOffsetEXT = (PFNGLGETUNIFORMOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformOffsetEXT")) == NULL) || r; + r = ((glUniformBufferEXT = (PFNGLUNIFORMBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUniformBufferEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_bindable_uniform */ + +#ifdef GL_EXT_blend_color + +static GLboolean _glewInit_GL_EXT_blend_color () +{ + GLboolean r = GL_FALSE; + + r = ((glBlendColorEXT = (PFNGLBLENDCOLOREXTPROC)glewGetProcAddress((const GLubyte*)"glBlendColorEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_blend_color */ + +#ifdef GL_EXT_blend_equation_separate + +static GLboolean _glewInit_GL_EXT_blend_equation_separate () +{ + GLboolean r = GL_FALSE; + + r = ((glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_blend_equation_separate */ + +#ifdef GL_EXT_blend_func_extended + +static GLboolean _glewInit_GL_EXT_blend_func_extended () +{ + GLboolean r = GL_FALSE; + + r = ((glBindFragDataLocationIndexedEXT = (PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationIndexedEXT")) == NULL) || r; + r = ((glGetFragDataIndexEXT = (PFNGLGETFRAGDATAINDEXEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataIndexEXT")) == NULL) || r; + r = ((glGetProgramResourceLocationIndexEXT = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocationIndexEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_blend_func_extended */ + +#ifdef GL_EXT_blend_func_separate + +static GLboolean _glewInit_GL_EXT_blend_func_separate () +{ + GLboolean r = GL_FALSE; + + r = ((glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_blend_func_separate */ + +#ifdef GL_EXT_blend_minmax + +static GLboolean _glewInit_GL_EXT_blend_minmax () +{ + GLboolean r = GL_FALSE; + + r = ((glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_blend_minmax */ + +#ifdef GL_EXT_buffer_storage + +static GLboolean _glewInit_GL_EXT_buffer_storage () +{ + GLboolean r = GL_FALSE; + + r = ((glBufferStorageEXT = (PFNGLBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glBufferStorageEXT")) == NULL) || r; + r = ((glNamedBufferStorageEXT = (PFNGLNAMEDBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorageEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_buffer_storage */ + +#ifdef GL_EXT_clear_texture + +static GLboolean _glewInit_GL_EXT_clear_texture () +{ + GLboolean r = GL_FALSE; + + r = ((glClearTexImageEXT = (PFNGLCLEARTEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glClearTexImageEXT")) == NULL) || r; + r = ((glClearTexSubImageEXT = (PFNGLCLEARTEXSUBIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glClearTexSubImageEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_clear_texture */ + +#ifdef GL_EXT_color_subtable + +static GLboolean _glewInit_GL_EXT_color_subtable () +{ + GLboolean r = GL_FALSE; + + r = ((glColorSubTableEXT = (PFNGLCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorSubTableEXT")) == NULL) || r; + r = ((glCopyColorSubTableEXT = (PFNGLCOPYCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTableEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_color_subtable */ + +#ifdef GL_EXT_compiled_vertex_array + +static GLboolean _glewInit_GL_EXT_compiled_vertex_array () +{ + GLboolean r = GL_FALSE; + + r = ((glLockArraysEXT = (PFNGLLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glLockArraysEXT")) == NULL) || r; + r = ((glUnlockArraysEXT = (PFNGLUNLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glUnlockArraysEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_compiled_vertex_array */ + +#ifdef GL_EXT_convolution + +static GLboolean _glewInit_GL_EXT_convolution () +{ + GLboolean r = GL_FALSE; + + r = ((glConvolutionFilter1DEXT = (PFNGLCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1DEXT")) == NULL) || r; + r = ((glConvolutionFilter2DEXT = (PFNGLCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2DEXT")) == NULL) || r; + r = ((glConvolutionParameterfEXT = (PFNGLCONVOLUTIONPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfEXT")) == NULL) || r; + r = ((glConvolutionParameterfvEXT = (PFNGLCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfvEXT")) == NULL) || r; + r = ((glConvolutionParameteriEXT = (PFNGLCONVOLUTIONPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriEXT")) == NULL) || r; + r = ((glConvolutionParameterivEXT = (PFNGLCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterivEXT")) == NULL) || r; + r = ((glCopyConvolutionFilter1DEXT = (PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1DEXT")) == NULL) || r; + r = ((glCopyConvolutionFilter2DEXT = (PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2DEXT")) == NULL) || r; + r = ((glGetConvolutionFilterEXT = (PFNGLGETCONVOLUTIONFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilterEXT")) == NULL) || r; + r = ((glGetConvolutionParameterfvEXT = (PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfvEXT")) == NULL) || r; + r = ((glGetConvolutionParameterivEXT = (PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterivEXT")) == NULL) || r; + r = ((glGetSeparableFilterEXT = (PFNGLGETSEPARABLEFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilterEXT")) == NULL) || r; + r = ((glSeparableFilter2DEXT = (PFNGLSEPARABLEFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2DEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_convolution */ + +#ifdef GL_EXT_coordinate_frame + +static GLboolean _glewInit_GL_EXT_coordinate_frame () +{ + GLboolean r = GL_FALSE; + + r = ((glBinormalPointerEXT = (PFNGLBINORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glBinormalPointerEXT")) == NULL) || r; + r = ((glTangentPointerEXT = (PFNGLTANGENTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTangentPointerEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_coordinate_frame */ + +#ifdef GL_EXT_copy_image + +static GLboolean _glewInit_GL_EXT_copy_image () +{ + GLboolean r = GL_FALSE; + + r = ((glCopyImageSubDataEXT = (PFNGLCOPYIMAGESUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubDataEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_copy_image */ + +#ifdef GL_EXT_copy_texture + +static GLboolean _glewInit_GL_EXT_copy_texture () +{ + GLboolean r = GL_FALSE; + + r = ((glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage1DEXT")) == NULL) || r; + r = ((glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage2DEXT")) == NULL) || r; + r = ((glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage1DEXT")) == NULL) || r; + r = ((glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage2DEXT")) == NULL) || r; + r = ((glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3DEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_copy_texture */ + +#ifdef GL_EXT_cull_vertex + +static GLboolean _glewInit_GL_EXT_cull_vertex () +{ + GLboolean r = GL_FALSE; + + r = ((glCullParameterdvEXT = (PFNGLCULLPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterdvEXT")) == NULL) || r; + r = ((glCullParameterfvEXT = (PFNGLCULLPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterfvEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_cull_vertex */ + +#ifdef GL_EXT_debug_label + +static GLboolean _glewInit_GL_EXT_debug_label () +{ + GLboolean r = GL_FALSE; + + r = ((glGetObjectLabelEXT = (PFNGLGETOBJECTLABELEXTPROC)glewGetProcAddress((const GLubyte*)"glGetObjectLabelEXT")) == NULL) || r; + r = ((glLabelObjectEXT = (PFNGLLABELOBJECTEXTPROC)glewGetProcAddress((const GLubyte*)"glLabelObjectEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_debug_label */ + +#ifdef GL_EXT_debug_marker + +static GLboolean _glewInit_GL_EXT_debug_marker () +{ + GLboolean r = GL_FALSE; + + r = ((glInsertEventMarkerEXT = (PFNGLINSERTEVENTMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glInsertEventMarkerEXT")) == NULL) || r; + r = ((glPopGroupMarkerEXT = (PFNGLPOPGROUPMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glPopGroupMarkerEXT")) == NULL) || r; + r = ((glPushGroupMarkerEXT = (PFNGLPUSHGROUPMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glPushGroupMarkerEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_debug_marker */ + +#ifdef GL_EXT_depth_bounds_test + +static GLboolean _glewInit_GL_EXT_depth_bounds_test () +{ + GLboolean r = GL_FALSE; + + r = ((glDepthBoundsEXT = (PFNGLDEPTHBOUNDSEXTPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_depth_bounds_test */ + +#ifdef GL_EXT_direct_state_access + +static GLboolean _glewInit_GL_EXT_direct_state_access () +{ + GLboolean r = GL_FALSE; + + r = ((glBindMultiTextureEXT = (PFNGLBINDMULTITEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindMultiTextureEXT")) == NULL) || r; + r = ((glCheckNamedFramebufferStatusEXT = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckNamedFramebufferStatusEXT")) == NULL) || r; + r = ((glClientAttribDefaultEXT = (PFNGLCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glClientAttribDefaultEXT")) == NULL) || r; + r = ((glCompressedMultiTexImage1DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage1DEXT")) == NULL) || r; + r = ((glCompressedMultiTexImage2DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage2DEXT")) == NULL) || r; + r = ((glCompressedMultiTexImage3DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage3DEXT")) == NULL) || r; + r = ((glCompressedMultiTexSubImage1DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage1DEXT")) == NULL) || r; + r = ((glCompressedMultiTexSubImage2DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage2DEXT")) == NULL) || r; + r = ((glCompressedMultiTexSubImage3DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage3DEXT")) == NULL) || r; + r = ((glCompressedTextureImage1DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage1DEXT")) == NULL) || r; + r = ((glCompressedTextureImage2DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage2DEXT")) == NULL) || r; + r = ((glCompressedTextureImage3DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage3DEXT")) == NULL) || r; + r = ((glCompressedTextureSubImage1DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage1DEXT")) == NULL) || r; + r = ((glCompressedTextureSubImage2DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage2DEXT")) == NULL) || r; + r = ((glCompressedTextureSubImage3DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage3DEXT")) == NULL) || r; + r = ((glCopyMultiTexImage1DEXT = (PFNGLCOPYMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexImage1DEXT")) == NULL) || r; + r = ((glCopyMultiTexImage2DEXT = (PFNGLCOPYMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexImage2DEXT")) == NULL) || r; + r = ((glCopyMultiTexSubImage1DEXT = (PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage1DEXT")) == NULL) || r; + r = ((glCopyMultiTexSubImage2DEXT = (PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage2DEXT")) == NULL) || r; + r = ((glCopyMultiTexSubImage3DEXT = (PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage3DEXT")) == NULL) || r; + r = ((glCopyTextureImage1DEXT = (PFNGLCOPYTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureImage1DEXT")) == NULL) || r; + r = ((glCopyTextureImage2DEXT = (PFNGLCOPYTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureImage2DEXT")) == NULL) || r; + r = ((glCopyTextureSubImage1DEXT = (PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage1DEXT")) == NULL) || r; + r = ((glCopyTextureSubImage2DEXT = (PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage2DEXT")) == NULL) || r; + r = ((glCopyTextureSubImage3DEXT = (PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage3DEXT")) == NULL) || r; + r = ((glDisableClientStateIndexedEXT = (PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateIndexedEXT")) == NULL) || r; + r = ((glDisableClientStateiEXT = (PFNGLDISABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateiEXT")) == NULL) || r; + r = ((glDisableVertexArrayAttribEXT = (PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayAttribEXT")) == NULL) || r; + r = ((glDisableVertexArrayEXT = (PFNGLDISABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayEXT")) == NULL) || r; + r = ((glEnableClientStateIndexedEXT = (PFNGLENABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateIndexedEXT")) == NULL) || r; + r = ((glEnableClientStateiEXT = (PFNGLENABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateiEXT")) == NULL) || r; + r = ((glEnableVertexArrayAttribEXT = (PFNGLENABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayAttribEXT")) == NULL) || r; + r = ((glEnableVertexArrayEXT = (PFNGLENABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayEXT")) == NULL) || r; + r = ((glFlushMappedNamedBufferRangeEXT = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedNamedBufferRangeEXT")) == NULL) || r; + r = ((glFramebufferDrawBufferEXT = (PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBufferEXT")) == NULL) || r; + r = ((glFramebufferDrawBuffersEXT = (PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBuffersEXT")) == NULL) || r; + r = ((glFramebufferReadBufferEXT = (PFNGLFRAMEBUFFERREADBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferReadBufferEXT")) == NULL) || r; + r = ((glGenerateMultiTexMipmapEXT = (PFNGLGENERATEMULTITEXMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMultiTexMipmapEXT")) == NULL) || r; + r = ((glGenerateTextureMipmapEXT = (PFNGLGENERATETEXTUREMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateTextureMipmapEXT")) == NULL) || r; + r = ((glGetCompressedMultiTexImageEXT = (PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedMultiTexImageEXT")) == NULL) || r; + r = ((glGetCompressedTextureImageEXT = (PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureImageEXT")) == NULL) || r; + r = ((glGetDoubleIndexedvEXT = (PFNGLGETDOUBLEINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoubleIndexedvEXT")) == NULL) || r; + r = ((glGetDoublei_vEXT = (PFNGLGETDOUBLEI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_vEXT")) == NULL) || r; + r = ((glGetFloatIndexedvEXT = (PFNGLGETFLOATINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloatIndexedvEXT")) == NULL) || r; + r = ((glGetFloati_vEXT = (PFNGLGETFLOATI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_vEXT")) == NULL) || r; + r = ((glGetFramebufferParameterivEXT = (PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameterivEXT")) == NULL) || r; + r = ((glGetMultiTexEnvfvEXT = (PFNGLGETMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvfvEXT")) == NULL) || r; + r = ((glGetMultiTexEnvivEXT = (PFNGLGETMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvivEXT")) == NULL) || r; + r = ((glGetMultiTexGendvEXT = (PFNGLGETMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGendvEXT")) == NULL) || r; + r = ((glGetMultiTexGenfvEXT = (PFNGLGETMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGenfvEXT")) == NULL) || r; + r = ((glGetMultiTexGenivEXT = (PFNGLGETMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGenivEXT")) == NULL) || r; + r = ((glGetMultiTexImageEXT = (PFNGLGETMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexImageEXT")) == NULL) || r; + r = ((glGetMultiTexLevelParameterfvEXT = (PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexLevelParameterfvEXT")) == NULL) || r; + r = ((glGetMultiTexLevelParameterivEXT = (PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexLevelParameterivEXT")) == NULL) || r; + r = ((glGetMultiTexParameterIivEXT = (PFNGLGETMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterIivEXT")) == NULL) || r; + r = ((glGetMultiTexParameterIuivEXT = (PFNGLGETMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterIuivEXT")) == NULL) || r; + r = ((glGetMultiTexParameterfvEXT = (PFNGLGETMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterfvEXT")) == NULL) || r; + r = ((glGetMultiTexParameterivEXT = (PFNGLGETMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterivEXT")) == NULL) || r; + r = ((glGetNamedBufferParameterivEXT = (PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameterivEXT")) == NULL) || r; + r = ((glGetNamedBufferPointervEXT = (PFNGLGETNAMEDBUFFERPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferPointervEXT")) == NULL) || r; + r = ((glGetNamedBufferSubDataEXT = (PFNGLGETNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferSubDataEXT")) == NULL) || r; + r = ((glGetNamedFramebufferAttachmentParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferAttachmentParameterivEXT")) == NULL) || r; + r = ((glGetNamedProgramLocalParameterIivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterIivEXT")) == NULL) || r; + r = ((glGetNamedProgramLocalParameterIuivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterIuivEXT")) == NULL) || r; + r = ((glGetNamedProgramLocalParameterdvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterdvEXT")) == NULL) || r; + r = ((glGetNamedProgramLocalParameterfvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterfvEXT")) == NULL) || r; + r = ((glGetNamedProgramStringEXT = (PFNGLGETNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramStringEXT")) == NULL) || r; + r = ((glGetNamedProgramivEXT = (PFNGLGETNAMEDPROGRAMIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramivEXT")) == NULL) || r; + r = ((glGetNamedRenderbufferParameterivEXT = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedRenderbufferParameterivEXT")) == NULL) || r; + r = ((glGetPointerIndexedvEXT = (PFNGLGETPOINTERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointerIndexedvEXT")) == NULL) || r; + r = ((glGetPointeri_vEXT = (PFNGLGETPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointeri_vEXT")) == NULL) || r; + r = ((glGetTextureImageEXT = (PFNGLGETTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureImageEXT")) == NULL) || r; + r = ((glGetTextureLevelParameterfvEXT = (PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterfvEXT")) == NULL) || r; + r = ((glGetTextureLevelParameterivEXT = (PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterivEXT")) == NULL) || r; + r = ((glGetTextureParameterIivEXT = (PFNGLGETTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIivEXT")) == NULL) || r; + r = ((glGetTextureParameterIuivEXT = (PFNGLGETTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIuivEXT")) == NULL) || r; + r = ((glGetTextureParameterfvEXT = (PFNGLGETTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterfvEXT")) == NULL) || r; + r = ((glGetTextureParameterivEXT = (PFNGLGETTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterivEXT")) == NULL) || r; + r = ((glGetVertexArrayIntegeri_vEXT = (PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegeri_vEXT")) == NULL) || r; + r = ((glGetVertexArrayIntegervEXT = (PFNGLGETVERTEXARRAYINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegervEXT")) == NULL) || r; + r = ((glGetVertexArrayPointeri_vEXT = (PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointeri_vEXT")) == NULL) || r; + r = ((glGetVertexArrayPointervEXT = (PFNGLGETVERTEXARRAYPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointervEXT")) == NULL) || r; + r = ((glMapNamedBufferEXT = (PFNGLMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferEXT")) == NULL) || r; + r = ((glMapNamedBufferRangeEXT = (PFNGLMAPNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferRangeEXT")) == NULL) || r; + r = ((glMatrixFrustumEXT = (PFNGLMATRIXFRUSTUMEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixFrustumEXT")) == NULL) || r; + r = ((glMatrixLoadIdentityEXT = (PFNGLMATRIXLOADIDENTITYEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadIdentityEXT")) == NULL) || r; + r = ((glMatrixLoadTransposedEXT = (PFNGLMATRIXLOADTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTransposedEXT")) == NULL) || r; + r = ((glMatrixLoadTransposefEXT = (PFNGLMATRIXLOADTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTransposefEXT")) == NULL) || r; + r = ((glMatrixLoaddEXT = (PFNGLMATRIXLOADDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoaddEXT")) == NULL) || r; + r = ((glMatrixLoadfEXT = (PFNGLMATRIXLOADFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadfEXT")) == NULL) || r; + r = ((glMatrixMultTransposedEXT = (PFNGLMATRIXMULTTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTransposedEXT")) == NULL) || r; + r = ((glMatrixMultTransposefEXT = (PFNGLMATRIXMULTTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTransposefEXT")) == NULL) || r; + r = ((glMatrixMultdEXT = (PFNGLMATRIXMULTDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultdEXT")) == NULL) || r; + r = ((glMatrixMultfEXT = (PFNGLMATRIXMULTFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultfEXT")) == NULL) || r; + r = ((glMatrixOrthoEXT = (PFNGLMATRIXORTHOEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixOrthoEXT")) == NULL) || r; + r = ((glMatrixPopEXT = (PFNGLMATRIXPOPEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixPopEXT")) == NULL) || r; + r = ((glMatrixPushEXT = (PFNGLMATRIXPUSHEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixPushEXT")) == NULL) || r; + r = ((glMatrixRotatedEXT = (PFNGLMATRIXROTATEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixRotatedEXT")) == NULL) || r; + r = ((glMatrixRotatefEXT = (PFNGLMATRIXROTATEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixRotatefEXT")) == NULL) || r; + r = ((glMatrixScaledEXT = (PFNGLMATRIXSCALEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixScaledEXT")) == NULL) || r; + r = ((glMatrixScalefEXT = (PFNGLMATRIXSCALEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixScalefEXT")) == NULL) || r; + r = ((glMatrixTranslatedEXT = (PFNGLMATRIXTRANSLATEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixTranslatedEXT")) == NULL) || r; + r = ((glMatrixTranslatefEXT = (PFNGLMATRIXTRANSLATEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixTranslatefEXT")) == NULL) || r; + r = ((glMultiTexBufferEXT = (PFNGLMULTITEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexBufferEXT")) == NULL) || r; + r = ((glMultiTexCoordPointerEXT = (PFNGLMULTITEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordPointerEXT")) == NULL) || r; + r = ((glMultiTexEnvfEXT = (PFNGLMULTITEXENVFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvfEXT")) == NULL) || r; + r = ((glMultiTexEnvfvEXT = (PFNGLMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvfvEXT")) == NULL) || r; + r = ((glMultiTexEnviEXT = (PFNGLMULTITEXENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnviEXT")) == NULL) || r; + r = ((glMultiTexEnvivEXT = (PFNGLMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvivEXT")) == NULL) || r; + r = ((glMultiTexGendEXT = (PFNGLMULTITEXGENDEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGendEXT")) == NULL) || r; + r = ((glMultiTexGendvEXT = (PFNGLMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGendvEXT")) == NULL) || r; + r = ((glMultiTexGenfEXT = (PFNGLMULTITEXGENFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenfEXT")) == NULL) || r; + r = ((glMultiTexGenfvEXT = (PFNGLMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenfvEXT")) == NULL) || r; + r = ((glMultiTexGeniEXT = (PFNGLMULTITEXGENIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGeniEXT")) == NULL) || r; + r = ((glMultiTexGenivEXT = (PFNGLMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenivEXT")) == NULL) || r; + r = ((glMultiTexImage1DEXT = (PFNGLMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage1DEXT")) == NULL) || r; + r = ((glMultiTexImage2DEXT = (PFNGLMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage2DEXT")) == NULL) || r; + r = ((glMultiTexImage3DEXT = (PFNGLMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage3DEXT")) == NULL) || r; + r = ((glMultiTexParameterIivEXT = (PFNGLMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterIivEXT")) == NULL) || r; + r = ((glMultiTexParameterIuivEXT = (PFNGLMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterIuivEXT")) == NULL) || r; + r = ((glMultiTexParameterfEXT = (PFNGLMULTITEXPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterfEXT")) == NULL) || r; + r = ((glMultiTexParameterfvEXT = (PFNGLMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterfvEXT")) == NULL) || r; + r = ((glMultiTexParameteriEXT = (PFNGLMULTITEXPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameteriEXT")) == NULL) || r; + r = ((glMultiTexParameterivEXT = (PFNGLMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterivEXT")) == NULL) || r; + r = ((glMultiTexRenderbufferEXT = (PFNGLMULTITEXRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexRenderbufferEXT")) == NULL) || r; + r = ((glMultiTexSubImage1DEXT = (PFNGLMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage1DEXT")) == NULL) || r; + r = ((glMultiTexSubImage2DEXT = (PFNGLMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage2DEXT")) == NULL) || r; + r = ((glMultiTexSubImage3DEXT = (PFNGLMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage3DEXT")) == NULL) || r; + r = ((glNamedBufferDataEXT = (PFNGLNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferDataEXT")) == NULL) || r; + r = ((glNamedBufferSubDataEXT = (PFNGLNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferSubDataEXT")) == NULL) || r; + r = ((glNamedCopyBufferSubDataEXT = (PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedCopyBufferSubDataEXT")) == NULL) || r; + r = ((glNamedFramebufferRenderbufferEXT = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferRenderbufferEXT")) == NULL) || r; + r = ((glNamedFramebufferTexture1DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture1DEXT")) == NULL) || r; + r = ((glNamedFramebufferTexture2DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture2DEXT")) == NULL) || r; + r = ((glNamedFramebufferTexture3DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture3DEXT")) == NULL) || r; + r = ((glNamedFramebufferTextureEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureEXT")) == NULL) || r; + r = ((glNamedFramebufferTextureFaceEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureFaceEXT")) == NULL) || r; + r = ((glNamedFramebufferTextureLayerEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureLayerEXT")) == NULL) || r; + r = ((glNamedProgramLocalParameter4dEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4dEXT")) == NULL) || r; + r = ((glNamedProgramLocalParameter4dvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4dvEXT")) == NULL) || r; + r = ((glNamedProgramLocalParameter4fEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4fEXT")) == NULL) || r; + r = ((glNamedProgramLocalParameter4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4fvEXT")) == NULL) || r; + r = ((glNamedProgramLocalParameterI4iEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4iEXT")) == NULL) || r; + r = ((glNamedProgramLocalParameterI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4ivEXT")) == NULL) || r; + r = ((glNamedProgramLocalParameterI4uiEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4uiEXT")) == NULL) || r; + r = ((glNamedProgramLocalParameterI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4uivEXT")) == NULL) || r; + r = ((glNamedProgramLocalParameters4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameters4fvEXT")) == NULL) || r; + r = ((glNamedProgramLocalParametersI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParametersI4ivEXT")) == NULL) || r; + r = ((glNamedProgramLocalParametersI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParametersI4uivEXT")) == NULL) || r; + r = ((glNamedProgramStringEXT = (PFNGLNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramStringEXT")) == NULL) || r; + r = ((glNamedRenderbufferStorageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageEXT")) == NULL) || r; + r = ((glNamedRenderbufferStorageMultisampleCoverageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleCoverageEXT")) == NULL) || r; + r = ((glNamedRenderbufferStorageMultisampleEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleEXT")) == NULL) || r; + r = ((glProgramUniform1fEXT = (PFNGLPROGRAMUNIFORM1FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fEXT")) == NULL) || r; + r = ((glProgramUniform1fvEXT = (PFNGLPROGRAMUNIFORM1FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fvEXT")) == NULL) || r; + r = ((glProgramUniform1iEXT = (PFNGLPROGRAMUNIFORM1IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iEXT")) == NULL) || r; + r = ((glProgramUniform1ivEXT = (PFNGLPROGRAMUNIFORM1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ivEXT")) == NULL) || r; + r = ((glProgramUniform1uiEXT = (PFNGLPROGRAMUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiEXT")) == NULL) || r; + r = ((glProgramUniform1uivEXT = (PFNGLPROGRAMUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uivEXT")) == NULL) || r; + r = ((glProgramUniform2fEXT = (PFNGLPROGRAMUNIFORM2FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fEXT")) == NULL) || r; + r = ((glProgramUniform2fvEXT = (PFNGLPROGRAMUNIFORM2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fvEXT")) == NULL) || r; + r = ((glProgramUniform2iEXT = (PFNGLPROGRAMUNIFORM2IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iEXT")) == NULL) || r; + r = ((glProgramUniform2ivEXT = (PFNGLPROGRAMUNIFORM2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ivEXT")) == NULL) || r; + r = ((glProgramUniform2uiEXT = (PFNGLPROGRAMUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiEXT")) == NULL) || r; + r = ((glProgramUniform2uivEXT = (PFNGLPROGRAMUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uivEXT")) == NULL) || r; + r = ((glProgramUniform3fEXT = (PFNGLPROGRAMUNIFORM3FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fEXT")) == NULL) || r; + r = ((glProgramUniform3fvEXT = (PFNGLPROGRAMUNIFORM3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fvEXT")) == NULL) || r; + r = ((glProgramUniform3iEXT = (PFNGLPROGRAMUNIFORM3IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iEXT")) == NULL) || r; + r = ((glProgramUniform3ivEXT = (PFNGLPROGRAMUNIFORM3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ivEXT")) == NULL) || r; + r = ((glProgramUniform3uiEXT = (PFNGLPROGRAMUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiEXT")) == NULL) || r; + r = ((glProgramUniform3uivEXT = (PFNGLPROGRAMUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uivEXT")) == NULL) || r; + r = ((glProgramUniform4fEXT = (PFNGLPROGRAMUNIFORM4FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fEXT")) == NULL) || r; + r = ((glProgramUniform4fvEXT = (PFNGLPROGRAMUNIFORM4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fvEXT")) == NULL) || r; + r = ((glProgramUniform4iEXT = (PFNGLPROGRAMUNIFORM4IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iEXT")) == NULL) || r; + r = ((glProgramUniform4ivEXT = (PFNGLPROGRAMUNIFORM4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ivEXT")) == NULL) || r; + r = ((glProgramUniform4uiEXT = (PFNGLPROGRAMUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiEXT")) == NULL) || r; + r = ((glProgramUniform4uivEXT = (PFNGLPROGRAMUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uivEXT")) == NULL) || r; + r = ((glProgramUniformMatrix2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fvEXT")) == NULL) || r; + r = ((glProgramUniformMatrix2x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fvEXT")) == NULL) || r; + r = ((glProgramUniformMatrix2x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fvEXT")) == NULL) || r; + r = ((glProgramUniformMatrix3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fvEXT")) == NULL) || r; + r = ((glProgramUniformMatrix3x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fvEXT")) == NULL) || r; + r = ((glProgramUniformMatrix3x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fvEXT")) == NULL) || r; + r = ((glProgramUniformMatrix4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fvEXT")) == NULL) || r; + r = ((glProgramUniformMatrix4x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fvEXT")) == NULL) || r; + r = ((glProgramUniformMatrix4x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fvEXT")) == NULL) || r; + r = ((glPushClientAttribDefaultEXT = (PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glPushClientAttribDefaultEXT")) == NULL) || r; + r = ((glTextureBufferEXT = (PFNGLTEXTUREBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferEXT")) == NULL) || r; + r = ((glTextureImage1DEXT = (PFNGLTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage1DEXT")) == NULL) || r; + r = ((glTextureImage2DEXT = (PFNGLTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DEXT")) == NULL) || r; + r = ((glTextureImage3DEXT = (PFNGLTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DEXT")) == NULL) || r; + r = ((glTextureParameterIivEXT = (PFNGLTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIivEXT")) == NULL) || r; + r = ((glTextureParameterIuivEXT = (PFNGLTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIuivEXT")) == NULL) || r; + r = ((glTextureParameterfEXT = (PFNGLTEXTUREPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfEXT")) == NULL) || r; + r = ((glTextureParameterfvEXT = (PFNGLTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfvEXT")) == NULL) || r; + r = ((glTextureParameteriEXT = (PFNGLTEXTUREPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteriEXT")) == NULL) || r; + r = ((glTextureParameterivEXT = (PFNGLTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterivEXT")) == NULL) || r; + r = ((glTextureRenderbufferEXT = (PFNGLTEXTURERENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureRenderbufferEXT")) == NULL) || r; + r = ((glTextureSubImage1DEXT = (PFNGLTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage1DEXT")) == NULL) || r; + r = ((glTextureSubImage2DEXT = (PFNGLTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage2DEXT")) == NULL) || r; + r = ((glTextureSubImage3DEXT = (PFNGLTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage3DEXT")) == NULL) || r; + r = ((glUnmapNamedBufferEXT = (PFNGLUNMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUnmapNamedBufferEXT")) == NULL) || r; + r = ((glVertexArrayColorOffsetEXT = (PFNGLVERTEXARRAYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayColorOffsetEXT")) == NULL) || r; + r = ((glVertexArrayEdgeFlagOffsetEXT = (PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayEdgeFlagOffsetEXT")) == NULL) || r; + r = ((glVertexArrayFogCoordOffsetEXT = (PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayFogCoordOffsetEXT")) == NULL) || r; + r = ((glVertexArrayIndexOffsetEXT = (PFNGLVERTEXARRAYINDEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayIndexOffsetEXT")) == NULL) || r; + r = ((glVertexArrayMultiTexCoordOffsetEXT = (PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayMultiTexCoordOffsetEXT")) == NULL) || r; + r = ((glVertexArrayNormalOffsetEXT = (PFNGLVERTEXARRAYNORMALOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayNormalOffsetEXT")) == NULL) || r; + r = ((glVertexArraySecondaryColorOffsetEXT = (PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArraySecondaryColorOffsetEXT")) == NULL) || r; + r = ((glVertexArrayTexCoordOffsetEXT = (PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayTexCoordOffsetEXT")) == NULL) || r; + r = ((glVertexArrayVertexAttribDivisorEXT = (PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribDivisorEXT")) == NULL) || r; + r = ((glVertexArrayVertexAttribIOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribIOffsetEXT")) == NULL) || r; + r = ((glVertexArrayVertexAttribOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribOffsetEXT")) == NULL) || r; + r = ((glVertexArrayVertexOffsetEXT = (PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexOffsetEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_direct_state_access */ + +#ifdef GL_EXT_discard_framebuffer + +static GLboolean _glewInit_GL_EXT_discard_framebuffer () +{ + GLboolean r = GL_FALSE; + + r = ((glDiscardFramebufferEXT = (PFNGLDISCARDFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glDiscardFramebufferEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_discard_framebuffer */ + +#ifdef GL_EXT_draw_buffers + +static GLboolean _glewInit_GL_EXT_draw_buffers () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawBuffersEXT = (PFNGLDRAWBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_draw_buffers */ + +#ifdef GL_EXT_draw_buffers2 + +static GLboolean _glewInit_GL_EXT_draw_buffers2 () +{ + GLboolean r = GL_FALSE; + + r = ((glColorMaskIndexedEXT = (PFNGLCOLORMASKINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glColorMaskIndexedEXT")) == NULL) || r; + r = ((glDisableIndexedEXT = (PFNGLDISABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableIndexedEXT")) == NULL) || r; + r = ((glEnableIndexedEXT = (PFNGLENABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableIndexedEXT")) == NULL) || r; + r = ((glGetBooleanIndexedvEXT = (PFNGLGETBOOLEANINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetBooleanIndexedvEXT")) == NULL) || r; + r = ((glGetIntegerIndexedvEXT = (PFNGLGETINTEGERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerIndexedvEXT")) == NULL) || r; + r = ((glIsEnabledIndexedEXT = (PFNGLISENABLEDINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsEnabledIndexedEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_draw_buffers2 */ + +#ifdef GL_EXT_draw_buffers_indexed + +static GLboolean _glewInit_GL_EXT_draw_buffers_indexed () +{ + GLboolean r = GL_FALSE; + + r = ((glBlendEquationSeparateiEXT = (PFNGLBLENDEQUATIONSEPARATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateiEXT")) == NULL) || r; + r = ((glBlendEquationiEXT = (PFNGLBLENDEQUATIONIEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationiEXT")) == NULL) || r; + r = ((glBlendFuncSeparateiEXT = (PFNGLBLENDFUNCSEPARATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateiEXT")) == NULL) || r; + r = ((glBlendFunciEXT = (PFNGLBLENDFUNCIEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendFunciEXT")) == NULL) || r; + r = ((glColorMaskiEXT = (PFNGLCOLORMASKIEXTPROC)glewGetProcAddress((const GLubyte*)"glColorMaskiEXT")) == NULL) || r; + r = ((glDisableiEXT = (PFNGLDISABLEIEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableiEXT")) == NULL) || r; + r = ((glEnableiEXT = (PFNGLENABLEIEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableiEXT")) == NULL) || r; + r = ((glIsEnablediEXT = (PFNGLISENABLEDIEXTPROC)glewGetProcAddress((const GLubyte*)"glIsEnablediEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_draw_buffers_indexed */ + +#ifdef GL_EXT_draw_elements_base_vertex + +static GLboolean _glewInit_GL_EXT_draw_elements_base_vertex () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawElementsBaseVertexEXT = (PFNGLDRAWELEMENTSBASEVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsBaseVertexEXT")) == NULL) || r; + r = ((glDrawElementsInstancedBaseVertexEXT = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertexEXT")) == NULL) || r; + r = ((glDrawRangeElementsBaseVertexEXT = (PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsBaseVertexEXT")) == NULL) || r; + r = ((glMultiDrawElementsBaseVertexEXT = (PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsBaseVertexEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_draw_elements_base_vertex */ + +#ifdef GL_EXT_draw_instanced + +static GLboolean _glewInit_GL_EXT_draw_instanced () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawArraysInstancedEXT = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedEXT")) == NULL) || r; + r = ((glDrawElementsInstancedEXT = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_draw_instanced */ + +#ifdef GL_EXT_draw_range_elements + +static GLboolean _glewInit_GL_EXT_draw_range_elements () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawRangeElementsEXT = (PFNGLDRAWRANGEELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_draw_range_elements */ + +#ifdef GL_EXT_external_buffer + +static GLboolean _glewInit_GL_EXT_external_buffer () +{ + GLboolean r = GL_FALSE; + + r = ((glBufferStorageExternalEXT = (PFNGLBUFFERSTORAGEEXTERNALEXTPROC)glewGetProcAddress((const GLubyte*)"glBufferStorageExternalEXT")) == NULL) || r; + r = ((glNamedBufferStorageExternalEXT = (PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorageExternalEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_external_buffer */ + +#ifdef GL_EXT_fog_coord + +static GLboolean _glewInit_GL_EXT_fog_coord () +{ + GLboolean r = GL_FALSE; + + r = ((glFogCoordPointerEXT = (PFNGLFOGCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerEXT")) == NULL) || r; + r = ((glFogCoorddEXT = (PFNGLFOGCOORDDEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddEXT")) == NULL) || r; + r = ((glFogCoorddvEXT = (PFNGLFOGCOORDDVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddvEXT")) == NULL) || r; + r = ((glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfEXT")) == NULL) || r; + r = ((glFogCoordfvEXT = (PFNGLFOGCOORDFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfvEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_fog_coord */ + +#ifdef GL_EXT_fragment_lighting + +static GLboolean _glewInit_GL_EXT_fragment_lighting () +{ + GLboolean r = GL_FALSE; + + r = ((glFragmentColorMaterialEXT = (PFNGLFRAGMENTCOLORMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialEXT")) == NULL) || r; + r = ((glFragmentLightModelfEXT = (PFNGLFRAGMENTLIGHTMODELFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfEXT")) == NULL) || r; + r = ((glFragmentLightModelfvEXT = (PFNGLFRAGMENTLIGHTMODELFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvEXT")) == NULL) || r; + r = ((glFragmentLightModeliEXT = (PFNGLFRAGMENTLIGHTMODELIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliEXT")) == NULL) || r; + r = ((glFragmentLightModelivEXT = (PFNGLFRAGMENTLIGHTMODELIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivEXT")) == NULL) || r; + r = ((glFragmentLightfEXT = (PFNGLFRAGMENTLIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfEXT")) == NULL) || r; + r = ((glFragmentLightfvEXT = (PFNGLFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvEXT")) == NULL) || r; + r = ((glFragmentLightiEXT = (PFNGLFRAGMENTLIGHTIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiEXT")) == NULL) || r; + r = ((glFragmentLightivEXT = (PFNGLFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivEXT")) == NULL) || r; + r = ((glFragmentMaterialfEXT = (PFNGLFRAGMENTMATERIALFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfEXT")) == NULL) || r; + r = ((glFragmentMaterialfvEXT = (PFNGLFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvEXT")) == NULL) || r; + r = ((glFragmentMaterialiEXT = (PFNGLFRAGMENTMATERIALIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiEXT")) == NULL) || r; + r = ((glFragmentMaterialivEXT = (PFNGLFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivEXT")) == NULL) || r; + r = ((glGetFragmentLightfvEXT = (PFNGLGETFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvEXT")) == NULL) || r; + r = ((glGetFragmentLightivEXT = (PFNGLGETFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivEXT")) == NULL) || r; + r = ((glGetFragmentMaterialfvEXT = (PFNGLGETFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvEXT")) == NULL) || r; + r = ((glGetFragmentMaterialivEXT = (PFNGLGETFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivEXT")) == NULL) || r; + r = ((glLightEnviEXT = (PFNGLLIGHTENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glLightEnviEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_fragment_lighting */ + +#ifdef GL_EXT_framebuffer_blit + +static GLboolean _glewInit_GL_EXT_framebuffer_blit () +{ + GLboolean r = GL_FALSE; + + r = ((glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_framebuffer_blit */ + +#ifdef GL_EXT_framebuffer_multisample + +static GLboolean _glewInit_GL_EXT_framebuffer_multisample () +{ + GLboolean r = GL_FALSE; + + r = ((glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_framebuffer_multisample */ + +#ifdef GL_EXT_framebuffer_object + +static GLboolean _glewInit_GL_EXT_framebuffer_object () +{ + GLboolean r = GL_FALSE; + + r = ((glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindFramebufferEXT")) == NULL) || r; + r = ((glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbufferEXT")) == NULL) || r; + r = ((glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatusEXT")) == NULL) || r; + r = ((glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffersEXT")) == NULL) || r; + r = ((glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffersEXT")) == NULL) || r; + r = ((glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbufferEXT")) == NULL) || r; + r = ((glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1DEXT")) == NULL) || r; + r = ((glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2DEXT")) == NULL) || r; + r = ((glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3DEXT")) == NULL) || r; + r = ((glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffersEXT")) == NULL) || r; + r = ((glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffersEXT")) == NULL) || r; + r = ((glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmapEXT")) == NULL) || r; + r = ((glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameterivEXT")) == NULL) || r; + r = ((glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameterivEXT")) == NULL) || r; + r = ((glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsFramebufferEXT")) == NULL) || r; + r = ((glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbufferEXT")) == NULL) || r; + r = ((glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_framebuffer_object */ + +#ifdef GL_EXT_geometry_shader4 + +static GLboolean _glewInit_GL_EXT_geometry_shader4 () +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureEXT")) == NULL) || r; + r = ((glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureFaceEXT")) == NULL) || r; + r = ((glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteriEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_geometry_shader4 */ + +#ifdef GL_EXT_gpu_program_parameters + +static GLboolean _glewInit_GL_EXT_gpu_program_parameters () +{ + GLboolean r = GL_FALSE; + + r = ((glProgramEnvParameters4fvEXT = (PFNGLPROGRAMENVPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameters4fvEXT")) == NULL) || r; + r = ((glProgramLocalParameters4fvEXT = (PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameters4fvEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_gpu_program_parameters */ + +#ifdef GL_EXT_gpu_shader4 + +static GLboolean _glewInit_GL_EXT_gpu_shader4 () +{ + GLboolean r = GL_FALSE; + + r = ((glBindFragDataLocationEXT = (PFNGLBINDFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationEXT")) == NULL) || r; + r = ((glGetFragDataLocationEXT = (PFNGLGETFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocationEXT")) == NULL) || r; + r = ((glGetUniformuivEXT = (PFNGLGETUNIFORMUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformuivEXT")) == NULL) || r; + r = ((glGetVertexAttribIivEXT = (PFNGLGETVERTEXATTRIBIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIivEXT")) == NULL) || r; + r = ((glGetVertexAttribIuivEXT = (PFNGLGETVERTEXATTRIBIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIuivEXT")) == NULL) || r; + r = ((glUniform1uiEXT = (PFNGLUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uiEXT")) == NULL) || r; + r = ((glUniform1uivEXT = (PFNGLUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uivEXT")) == NULL) || r; + r = ((glUniform2uiEXT = (PFNGLUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uiEXT")) == NULL) || r; + r = ((glUniform2uivEXT = (PFNGLUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uivEXT")) == NULL) || r; + r = ((glUniform3uiEXT = (PFNGLUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uiEXT")) == NULL) || r; + r = ((glUniform3uivEXT = (PFNGLUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uivEXT")) == NULL) || r; + r = ((glUniform4uiEXT = (PFNGLUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uiEXT")) == NULL) || r; + r = ((glUniform4uivEXT = (PFNGLUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uivEXT")) == NULL) || r; + r = ((glVertexAttribI1iEXT = (PFNGLVERTEXATTRIBI1IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1iEXT")) == NULL) || r; + r = ((glVertexAttribI1ivEXT = (PFNGLVERTEXATTRIBI1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1ivEXT")) == NULL) || r; + r = ((glVertexAttribI1uiEXT = (PFNGLVERTEXATTRIBI1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uiEXT")) == NULL) || r; + r = ((glVertexAttribI1uivEXT = (PFNGLVERTEXATTRIBI1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uivEXT")) == NULL) || r; + r = ((glVertexAttribI2iEXT = (PFNGLVERTEXATTRIBI2IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2iEXT")) == NULL) || r; + r = ((glVertexAttribI2ivEXT = (PFNGLVERTEXATTRIBI2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2ivEXT")) == NULL) || r; + r = ((glVertexAttribI2uiEXT = (PFNGLVERTEXATTRIBI2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uiEXT")) == NULL) || r; + r = ((glVertexAttribI2uivEXT = (PFNGLVERTEXATTRIBI2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uivEXT")) == NULL) || r; + r = ((glVertexAttribI3iEXT = (PFNGLVERTEXATTRIBI3IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3iEXT")) == NULL) || r; + r = ((glVertexAttribI3ivEXT = (PFNGLVERTEXATTRIBI3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3ivEXT")) == NULL) || r; + r = ((glVertexAttribI3uiEXT = (PFNGLVERTEXATTRIBI3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uiEXT")) == NULL) || r; + r = ((glVertexAttribI3uivEXT = (PFNGLVERTEXATTRIBI3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uivEXT")) == NULL) || r; + r = ((glVertexAttribI4bvEXT = (PFNGLVERTEXATTRIBI4BVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4bvEXT")) == NULL) || r; + r = ((glVertexAttribI4iEXT = (PFNGLVERTEXATTRIBI4IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4iEXT")) == NULL) || r; + r = ((glVertexAttribI4ivEXT = (PFNGLVERTEXATTRIBI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ivEXT")) == NULL) || r; + r = ((glVertexAttribI4svEXT = (PFNGLVERTEXATTRIBI4SVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4svEXT")) == NULL) || r; + r = ((glVertexAttribI4ubvEXT = (PFNGLVERTEXATTRIBI4UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ubvEXT")) == NULL) || r; + r = ((glVertexAttribI4uiEXT = (PFNGLVERTEXATTRIBI4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uiEXT")) == NULL) || r; + r = ((glVertexAttribI4uivEXT = (PFNGLVERTEXATTRIBI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uivEXT")) == NULL) || r; + r = ((glVertexAttribI4usvEXT = (PFNGLVERTEXATTRIBI4USVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4usvEXT")) == NULL) || r; + r = ((glVertexAttribIPointerEXT = (PFNGLVERTEXATTRIBIPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIPointerEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_gpu_shader4 */ + +#ifdef GL_EXT_histogram + +static GLboolean _glewInit_GL_EXT_histogram () +{ + GLboolean r = GL_FALSE; + + r = ((glGetHistogramEXT = (PFNGLGETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramEXT")) == NULL) || r; + r = ((glGetHistogramParameterfvEXT = (PFNGLGETHISTOGRAMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfvEXT")) == NULL) || r; + r = ((glGetHistogramParameterivEXT = (PFNGLGETHISTOGRAMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterivEXT")) == NULL) || r; + r = ((glGetMinmaxEXT = (PFNGLGETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxEXT")) == NULL) || r; + r = ((glGetMinmaxParameterfvEXT = (PFNGLGETMINMAXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfvEXT")) == NULL) || r; + r = ((glGetMinmaxParameterivEXT = (PFNGLGETMINMAXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterivEXT")) == NULL) || r; + r = ((glHistogramEXT = (PFNGLHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glHistogramEXT")) == NULL) || r; + r = ((glMinmaxEXT = (PFNGLMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glMinmaxEXT")) == NULL) || r; + r = ((glResetHistogramEXT = (PFNGLRESETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glResetHistogramEXT")) == NULL) || r; + r = ((glResetMinmaxEXT = (PFNGLRESETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glResetMinmaxEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_histogram */ + +#ifdef GL_EXT_index_func + +static GLboolean _glewInit_GL_EXT_index_func () +{ + GLboolean r = GL_FALSE; + + r = ((glIndexFuncEXT = (PFNGLINDEXFUNCEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexFuncEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_index_func */ + +#ifdef GL_EXT_index_material + +static GLboolean _glewInit_GL_EXT_index_material () +{ + GLboolean r = GL_FALSE; + + r = ((glIndexMaterialEXT = (PFNGLINDEXMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexMaterialEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_index_material */ + +#ifdef GL_EXT_instanced_arrays + +static GLboolean _glewInit_GL_EXT_instanced_arrays () +{ + GLboolean r = GL_FALSE; + + r = ((glVertexAttribDivisorEXT = (PFNGLVERTEXATTRIBDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_instanced_arrays */ + +#ifdef GL_EXT_light_texture + +static GLboolean _glewInit_GL_EXT_light_texture () +{ + GLboolean r = GL_FALSE; + + r = ((glApplyTextureEXT = (PFNGLAPPLYTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glApplyTextureEXT")) == NULL) || r; + r = ((glTextureLightEXT = (PFNGLTEXTURELIGHTEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureLightEXT")) == NULL) || r; + r = ((glTextureMaterialEXT = (PFNGLTEXTUREMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureMaterialEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_light_texture */ + +#ifdef GL_EXT_map_buffer_range + +static GLboolean _glewInit_GL_EXT_map_buffer_range () +{ + GLboolean r = GL_FALSE; + + r = ((glFlushMappedBufferRangeEXT = (PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRangeEXT")) == NULL) || r; + r = ((glMapBufferRangeEXT = (PFNGLMAPBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glMapBufferRangeEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_map_buffer_range */ + +#ifdef GL_EXT_memory_object + +static GLboolean _glewInit_GL_EXT_memory_object () +{ + GLboolean r = GL_FALSE; + + r = ((glBufferStorageMemEXT = (PFNGLBUFFERSTORAGEMEMEXTPROC)glewGetProcAddress((const GLubyte*)"glBufferStorageMemEXT")) == NULL) || r; + r = ((glCreateMemoryObjectsEXT = (PFNGLCREATEMEMORYOBJECTSEXTPROC)glewGetProcAddress((const GLubyte*)"glCreateMemoryObjectsEXT")) == NULL) || r; + r = ((glDeleteMemoryObjectsEXT = (PFNGLDELETEMEMORYOBJECTSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteMemoryObjectsEXT")) == NULL) || r; + r = ((glGetMemoryObjectParameterivEXT = (PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMemoryObjectParameterivEXT")) == NULL) || r; + r = ((glGetUnsignedBytei_vEXT = (PFNGLGETUNSIGNEDBYTEI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUnsignedBytei_vEXT")) == NULL) || r; + r = ((glGetUnsignedBytevEXT = (PFNGLGETUNSIGNEDBYTEVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUnsignedBytevEXT")) == NULL) || r; + r = ((glIsMemoryObjectEXT = (PFNGLISMEMORYOBJECTEXTPROC)glewGetProcAddress((const GLubyte*)"glIsMemoryObjectEXT")) == NULL) || r; + r = ((glMemoryObjectParameterivEXT = (PFNGLMEMORYOBJECTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMemoryObjectParameterivEXT")) == NULL) || r; + r = ((glNamedBufferStorageMemEXT = (PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorageMemEXT")) == NULL) || r; + r = ((glTexStorageMem1DEXT = (PFNGLTEXSTORAGEMEM1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem1DEXT")) == NULL) || r; + r = ((glTexStorageMem2DEXT = (PFNGLTEXSTORAGEMEM2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem2DEXT")) == NULL) || r; + r = ((glTexStorageMem2DMultisampleEXT = (PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem2DMultisampleEXT")) == NULL) || r; + r = ((glTexStorageMem3DEXT = (PFNGLTEXSTORAGEMEM3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem3DEXT")) == NULL) || r; + r = ((glTexStorageMem3DMultisampleEXT = (PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem3DMultisampleEXT")) == NULL) || r; + r = ((glTextureStorageMem1DEXT = (PFNGLTEXTURESTORAGEMEM1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem1DEXT")) == NULL) || r; + r = ((glTextureStorageMem2DEXT = (PFNGLTEXTURESTORAGEMEM2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem2DEXT")) == NULL) || r; + r = ((glTextureStorageMem2DMultisampleEXT = (PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem2DMultisampleEXT")) == NULL) || r; + r = ((glTextureStorageMem3DEXT = (PFNGLTEXTURESTORAGEMEM3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem3DEXT")) == NULL) || r; + r = ((glTextureStorageMem3DMultisampleEXT = (PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem3DMultisampleEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_memory_object */ + +#ifdef GL_EXT_memory_object_fd + +static GLboolean _glewInit_GL_EXT_memory_object_fd () +{ + GLboolean r = GL_FALSE; + + r = ((glImportMemoryFdEXT = (PFNGLIMPORTMEMORYFDEXTPROC)glewGetProcAddress((const GLubyte*)"glImportMemoryFdEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_memory_object_fd */ + +#ifdef GL_EXT_memory_object_win32 + +static GLboolean _glewInit_GL_EXT_memory_object_win32 () +{ + GLboolean r = GL_FALSE; + + r = ((glImportMemoryWin32HandleEXT = (PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC)glewGetProcAddress((const GLubyte*)"glImportMemoryWin32HandleEXT")) == NULL) || r; + r = ((glImportMemoryWin32NameEXT = (PFNGLIMPORTMEMORYWIN32NAMEEXTPROC)glewGetProcAddress((const GLubyte*)"glImportMemoryWin32NameEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_memory_object_win32 */ + +#ifdef GL_EXT_multi_draw_arrays + +static GLboolean _glewInit_GL_EXT_multi_draw_arrays () +{ + GLboolean r = GL_FALSE; + + r = ((glMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysEXT")) == NULL) || r; + r = ((glMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_multi_draw_arrays */ + +#ifdef GL_EXT_multi_draw_indirect + +static GLboolean _glewInit_GL_EXT_multi_draw_indirect () +{ + GLboolean r = GL_FALSE; + + r = ((glMultiDrawArraysIndirectEXT = (PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectEXT")) == NULL) || r; + r = ((glMultiDrawElementsIndirectEXT = (PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_multi_draw_indirect */ + +#ifdef GL_EXT_multisample + +static GLboolean _glewInit_GL_EXT_multisample () +{ + GLboolean r = GL_FALSE; + + r = ((glSampleMaskEXT = (PFNGLSAMPLEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskEXT")) == NULL) || r; + r = ((glSamplePatternEXT = (PFNGLSAMPLEPATTERNEXTPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_multisample */ + +#ifdef GL_EXT_multisampled_render_to_texture + +static GLboolean _glewInit_GL_EXT_multisampled_render_to_texture () +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferTexture2DMultisampleEXT = (PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2DMultisampleEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_multisampled_render_to_texture */ + +#ifdef GL_EXT_multiview_draw_buffers + +static GLboolean _glewInit_GL_EXT_multiview_draw_buffers () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawBuffersIndexedEXT = (PFNGLDRAWBUFFERSINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersIndexedEXT")) == NULL) || r; + r = ((glGetIntegeri_vEXT = (PFNGLGETINTEGERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetIntegeri_vEXT")) == NULL) || r; + r = ((glReadBufferIndexedEXT = (PFNGLREADBUFFERINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glReadBufferIndexedEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_multiview_draw_buffers */ + +#ifdef GL_EXT_paletted_texture + +static GLboolean _glewInit_GL_EXT_paletted_texture () +{ + GLboolean r = GL_FALSE; + + r = ((glColorTableEXT = (PFNGLCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorTableEXT")) == NULL) || r; + r = ((glGetColorTableEXT = (PFNGLGETCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableEXT")) == NULL) || r; + r = ((glGetColorTableParameterfvEXT = (PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvEXT")) == NULL) || r; + r = ((glGetColorTableParameterivEXT = (PFNGLGETCOLORTABLEPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_paletted_texture */ + +#ifdef GL_EXT_pixel_transform + +static GLboolean _glewInit_GL_EXT_pixel_transform () +{ + GLboolean r = GL_FALSE; + + r = ((glGetPixelTransformParameterfvEXT = (PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterfvEXT")) == NULL) || r; + r = ((glGetPixelTransformParameterivEXT = (PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterivEXT")) == NULL) || r; + r = ((glPixelTransformParameterfEXT = (PFNGLPIXELTRANSFORMPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfEXT")) == NULL) || r; + r = ((glPixelTransformParameterfvEXT = (PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfvEXT")) == NULL) || r; + r = ((glPixelTransformParameteriEXT = (PFNGLPIXELTRANSFORMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameteriEXT")) == NULL) || r; + r = ((glPixelTransformParameterivEXT = (PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterivEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_pixel_transform */ + +#ifdef GL_EXT_point_parameters + +static GLboolean _glewInit_GL_EXT_point_parameters () +{ + GLboolean r = GL_FALSE; + + r = ((glPointParameterfEXT = (PFNGLPOINTPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfEXT")) == NULL) || r; + r = ((glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_point_parameters */ + +#ifdef GL_EXT_polygon_offset + +static GLboolean _glewInit_GL_EXT_polygon_offset () +{ + GLboolean r = GL_FALSE; + + r = ((glPolygonOffsetEXT = (PFNGLPOLYGONOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_polygon_offset */ + +#ifdef GL_EXT_polygon_offset_clamp + +static GLboolean _glewInit_GL_EXT_polygon_offset_clamp () +{ + GLboolean r = GL_FALSE; + + r = ((glPolygonOffsetClampEXT = (PFNGLPOLYGONOFFSETCLAMPEXTPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetClampEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_polygon_offset_clamp */ + +#ifdef GL_EXT_provoking_vertex + +static GLboolean _glewInit_GL_EXT_provoking_vertex () +{ + GLboolean r = GL_FALSE; + + r = ((glProvokingVertexEXT = (PFNGLPROVOKINGVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertexEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_provoking_vertex */ + +#ifdef GL_EXT_raster_multisample + +static GLboolean _glewInit_GL_EXT_raster_multisample () +{ + GLboolean r = GL_FALSE; + + r = ((glCoverageModulationNV = (PFNGLCOVERAGEMODULATIONNVPROC)glewGetProcAddress((const GLubyte*)"glCoverageModulationNV")) == NULL) || r; + r = ((glCoverageModulationTableNV = (PFNGLCOVERAGEMODULATIONTABLENVPROC)glewGetProcAddress((const GLubyte*)"glCoverageModulationTableNV")) == NULL) || r; + r = ((glGetCoverageModulationTableNV = (PFNGLGETCOVERAGEMODULATIONTABLENVPROC)glewGetProcAddress((const GLubyte*)"glGetCoverageModulationTableNV")) == NULL) || r; + r = ((glRasterSamplesEXT = (PFNGLRASTERSAMPLESEXTPROC)glewGetProcAddress((const GLubyte*)"glRasterSamplesEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_raster_multisample */ + +#ifdef GL_EXT_scene_marker + +static GLboolean _glewInit_GL_EXT_scene_marker () +{ + GLboolean r = GL_FALSE; + + r = ((glBeginSceneEXT = (PFNGLBEGINSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginSceneEXT")) == NULL) || r; + r = ((glEndSceneEXT = (PFNGLENDSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glEndSceneEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_scene_marker */ + +#ifdef GL_EXT_secondary_color + +static GLboolean _glewInit_GL_EXT_secondary_color () +{ + GLboolean r = GL_FALSE; + + r = ((glSecondaryColor3bEXT = (PFNGLSECONDARYCOLOR3BEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bEXT")) == NULL) || r; + r = ((glSecondaryColor3bvEXT = (PFNGLSECONDARYCOLOR3BVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bvEXT")) == NULL) || r; + r = ((glSecondaryColor3dEXT = (PFNGLSECONDARYCOLOR3DEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dEXT")) == NULL) || r; + r = ((glSecondaryColor3dvEXT = (PFNGLSECONDARYCOLOR3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dvEXT")) == NULL) || r; + r = ((glSecondaryColor3fEXT = (PFNGLSECONDARYCOLOR3FEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fEXT")) == NULL) || r; + r = ((glSecondaryColor3fvEXT = (PFNGLSECONDARYCOLOR3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fvEXT")) == NULL) || r; + r = ((glSecondaryColor3iEXT = (PFNGLSECONDARYCOLOR3IEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iEXT")) == NULL) || r; + r = ((glSecondaryColor3ivEXT = (PFNGLSECONDARYCOLOR3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ivEXT")) == NULL) || r; + r = ((glSecondaryColor3sEXT = (PFNGLSECONDARYCOLOR3SEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sEXT")) == NULL) || r; + r = ((glSecondaryColor3svEXT = (PFNGLSECONDARYCOLOR3SVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3svEXT")) == NULL) || r; + r = ((glSecondaryColor3ubEXT = (PFNGLSECONDARYCOLOR3UBEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubEXT")) == NULL) || r; + r = ((glSecondaryColor3ubvEXT = (PFNGLSECONDARYCOLOR3UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubvEXT")) == NULL) || r; + r = ((glSecondaryColor3uiEXT = (PFNGLSECONDARYCOLOR3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiEXT")) == NULL) || r; + r = ((glSecondaryColor3uivEXT = (PFNGLSECONDARYCOLOR3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uivEXT")) == NULL) || r; + r = ((glSecondaryColor3usEXT = (PFNGLSECONDARYCOLOR3USEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usEXT")) == NULL) || r; + r = ((glSecondaryColor3usvEXT = (PFNGLSECONDARYCOLOR3USVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usvEXT")) == NULL) || r; + r = ((glSecondaryColorPointerEXT = (PFNGLSECONDARYCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_secondary_color */ + +#ifdef GL_EXT_semaphore + +static GLboolean _glewInit_GL_EXT_semaphore () +{ + GLboolean r = GL_FALSE; + + r = ((glDeleteSemaphoresEXT = (PFNGLDELETESEMAPHORESEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteSemaphoresEXT")) == NULL) || r; + r = ((glGenSemaphoresEXT = (PFNGLGENSEMAPHORESEXTPROC)glewGetProcAddress((const GLubyte*)"glGenSemaphoresEXT")) == NULL) || r; + r = ((glGetSemaphoreParameterui64vEXT = (PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetSemaphoreParameterui64vEXT")) == NULL) || r; + r = ((glIsSemaphoreEXT = (PFNGLISSEMAPHOREEXTPROC)glewGetProcAddress((const GLubyte*)"glIsSemaphoreEXT")) == NULL) || r; + r = ((glSemaphoreParameterui64vEXT = (PFNGLSEMAPHOREPARAMETERUI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glSemaphoreParameterui64vEXT")) == NULL) || r; + r = ((glSignalSemaphoreEXT = (PFNGLSIGNALSEMAPHOREEXTPROC)glewGetProcAddress((const GLubyte*)"glSignalSemaphoreEXT")) == NULL) || r; + r = ((glWaitSemaphoreEXT = (PFNGLWAITSEMAPHOREEXTPROC)glewGetProcAddress((const GLubyte*)"glWaitSemaphoreEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_semaphore */ + +#ifdef GL_EXT_semaphore_fd + +static GLboolean _glewInit_GL_EXT_semaphore_fd () +{ + GLboolean r = GL_FALSE; + + r = ((glImportSemaphoreFdEXT = (PFNGLIMPORTSEMAPHOREFDEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSemaphoreFdEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_semaphore_fd */ + +#ifdef GL_EXT_semaphore_win32 + +static GLboolean _glewInit_GL_EXT_semaphore_win32 () +{ + GLboolean r = GL_FALSE; + + r = ((glImportSemaphoreWin32HandleEXT = (PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSemaphoreWin32HandleEXT")) == NULL) || r; + r = ((glImportSemaphoreWin32NameEXT = (PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSemaphoreWin32NameEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_semaphore_win32 */ + +#ifdef GL_EXT_separate_shader_objects + +static GLboolean _glewInit_GL_EXT_separate_shader_objects () +{ + GLboolean r = GL_FALSE; + + r = ((glActiveProgramEXT = (PFNGLACTIVEPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveProgramEXT")) == NULL) || r; + r = ((glCreateShaderProgramEXT = (PFNGLCREATESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramEXT")) == NULL) || r; + r = ((glUseShaderProgramEXT = (PFNGLUSESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glUseShaderProgramEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_separate_shader_objects */ + +#ifdef GL_EXT_shader_image_load_store + +static GLboolean _glewInit_GL_EXT_shader_image_load_store () +{ + GLboolean r = GL_FALSE; + + r = ((glBindImageTextureEXT = (PFNGLBINDIMAGETEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextureEXT")) == NULL) || r; + r = ((glMemoryBarrierEXT = (PFNGLMEMORYBARRIEREXTPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrierEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_shader_image_load_store */ + +#ifdef GL_EXT_shader_pixel_local_storage2 + +static GLboolean _glewInit_GL_EXT_shader_pixel_local_storage2 () +{ + GLboolean r = GL_FALSE; + + r = ((glClearPixelLocalStorageuiEXT = (PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearPixelLocalStorageuiEXT")) == NULL) || r; + r = ((glFramebufferPixelLocalStorageSizeEXT = (PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferPixelLocalStorageSizeEXT")) == NULL) || r; + r = ((glGetFramebufferPixelLocalStorageSizeEXT = (PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferPixelLocalStorageSizeEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_shader_pixel_local_storage2 */ + +#ifdef GL_EXT_sparse_texture + +static GLboolean _glewInit_GL_EXT_sparse_texture () +{ + GLboolean r = GL_FALSE; + + r = ((glTexPageCommitmentEXT = (PFNGLTEXPAGECOMMITMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glTexPageCommitmentEXT")) == NULL) || r; + r = ((glTexturePageCommitmentEXT = (PFNGLTEXTUREPAGECOMMITMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glTexturePageCommitmentEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_sparse_texture */ + +#ifdef GL_EXT_stencil_two_side + +static GLboolean _glewInit_GL_EXT_stencil_two_side () +{ + GLboolean r = GL_FALSE; + + r = ((glActiveStencilFaceEXT = (PFNGLACTIVESTENCILFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveStencilFaceEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_stencil_two_side */ + +#ifdef GL_EXT_subtexture + +static GLboolean _glewInit_GL_EXT_subtexture () +{ + GLboolean r = GL_FALSE; + + r = ((glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage1DEXT")) == NULL) || r; + r = ((glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage2DEXT")) == NULL) || r; + r = ((glTexSubImage3DEXT = (PFNGLTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3DEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_subtexture */ + +#ifdef GL_EXT_texture3D + +static GLboolean _glewInit_GL_EXT_texture3D () +{ + GLboolean r = GL_FALSE; + + r = ((glTexImage3DEXT = (PFNGLTEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_texture3D */ + +#ifdef GL_EXT_texture_array + +static GLboolean _glewInit_GL_EXT_texture_array () +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_texture_array */ + +#ifdef GL_EXT_texture_buffer_object + +static GLboolean _glewInit_GL_EXT_texture_buffer_object () +{ + GLboolean r = GL_FALSE; + + r = ((glTexBufferEXT = (PFNGLTEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexBufferEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_texture_buffer_object */ + +#ifdef GL_EXT_texture_integer + +static GLboolean _glewInit_GL_EXT_texture_integer () +{ + GLboolean r = GL_FALSE; + + r = ((glClearColorIiEXT = (PFNGLCLEARCOLORIIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIiEXT")) == NULL) || r; + r = ((glClearColorIuiEXT = (PFNGLCLEARCOLORIUIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIuiEXT")) == NULL) || r; + r = ((glGetTexParameterIivEXT = (PFNGLGETTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIivEXT")) == NULL) || r; + r = ((glGetTexParameterIuivEXT = (PFNGLGETTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuivEXT")) == NULL) || r; + r = ((glTexParameterIivEXT = (PFNGLTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIivEXT")) == NULL) || r; + r = ((glTexParameterIuivEXT = (PFNGLTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuivEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_texture_integer */ + +#ifdef GL_EXT_texture_object + +static GLboolean _glewInit_GL_EXT_texture_object () +{ + GLboolean r = GL_FALSE; + + r = ((glAreTexturesResidentEXT = (PFNGLARETEXTURESRESIDENTEXTPROC)glewGetProcAddress((const GLubyte*)"glAreTexturesResidentEXT")) == NULL) || r; + r = ((glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureEXT")) == NULL) || r; + r = ((glDeleteTexturesEXT = (PFNGLDELETETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteTexturesEXT")) == NULL) || r; + r = ((glGenTexturesEXT = (PFNGLGENTEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glGenTexturesEXT")) == NULL) || r; + r = ((glIsTextureEXT = (PFNGLISTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glIsTextureEXT")) == NULL) || r; + r = ((glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glPrioritizeTexturesEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_texture_object */ + +#ifdef GL_EXT_texture_perturb_normal + +static GLboolean _glewInit_GL_EXT_texture_perturb_normal () +{ + GLboolean r = GL_FALSE; + + r = ((glTextureNormalEXT = (PFNGLTEXTURENORMALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureNormalEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_texture_perturb_normal */ + +#ifdef GL_EXT_texture_storage + +static GLboolean _glewInit_GL_EXT_texture_storage () +{ + GLboolean r = GL_FALSE; + + r = ((glTexStorage1DEXT = (PFNGLTEXSTORAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorage1DEXT")) == NULL) || r; + r = ((glTexStorage2DEXT = (PFNGLTEXSTORAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2DEXT")) == NULL) || r; + r = ((glTexStorage3DEXT = (PFNGLTEXSTORAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3DEXT")) == NULL) || r; + r = ((glTextureStorage1DEXT = (PFNGLTEXTURESTORAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage1DEXT")) == NULL) || r; + r = ((glTextureStorage2DEXT = (PFNGLTEXTURESTORAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DEXT")) == NULL) || r; + r = ((glTextureStorage3DEXT = (PFNGLTEXTURESTORAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_texture_storage */ + +#ifdef GL_EXT_texture_view + +static GLboolean _glewInit_GL_EXT_texture_view () +{ + GLboolean r = GL_FALSE; + + r = ((glTextureViewEXT = (PFNGLTEXTUREVIEWEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureViewEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_texture_view */ + +#ifdef GL_EXT_timer_query + +static GLboolean _glewInit_GL_EXT_timer_query () +{ + GLboolean r = GL_FALSE; + + r = ((glGetQueryObjecti64vEXT = (PFNGLGETQUERYOBJECTI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vEXT")) == NULL) || r; + r = ((glGetQueryObjectui64vEXT = (PFNGLGETQUERYOBJECTUI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_timer_query */ + +#ifdef GL_EXT_transform_feedback + +static GLboolean _glewInit_GL_EXT_transform_feedback () +{ + GLboolean r = GL_FALSE; + + r = ((glBeginTransformFeedbackEXT = (PFNGLBEGINTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedbackEXT")) == NULL) || r; + r = ((glBindBufferBaseEXT = (PFNGLBINDBUFFERBASEEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBaseEXT")) == NULL) || r; + r = ((glBindBufferOffsetEXT = (PFNGLBINDBUFFEROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferOffsetEXT")) == NULL) || r; + r = ((glBindBufferRangeEXT = (PFNGLBINDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRangeEXT")) == NULL) || r; + r = ((glEndTransformFeedbackEXT = (PFNGLENDTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedbackEXT")) == NULL) || r; + r = ((glGetTransformFeedbackVaryingEXT = (PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVaryingEXT")) == NULL) || r; + r = ((glTransformFeedbackVaryingsEXT = (PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryingsEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_transform_feedback */ + +#ifdef GL_EXT_vertex_array + +static GLboolean _glewInit_GL_EXT_vertex_array () +{ + GLboolean r = GL_FALSE; + + r = ((glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glArrayElementEXT")) == NULL) || r; + r = ((glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glColorPointerEXT")) == NULL) || r; + r = ((glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysEXT")) == NULL) || r; + r = ((glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerEXT")) == NULL) || r; + r = ((glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerEXT")) == NULL) || r; + r = ((glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerEXT")) == NULL) || r; + r = ((glTexCoordPointerEXT = (PFNGLTEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerEXT")) == NULL) || r; + r = ((glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_vertex_array */ + +#ifdef GL_EXT_vertex_array_setXXX + +static GLboolean _glewInit_GL_EXT_vertex_array_setXXX () +{ + GLboolean r = GL_FALSE; + + r = ((glBindArraySetEXT = (PFNGLBINDARRAYSETEXTPROC)glewGetProcAddress((const GLubyte*)"glBindArraySetEXT")) == NULL) || r; + r = ((glCreateArraySetExt = (PFNGLCREATEARRAYSETEXTPROC)glewGetProcAddress((const GLubyte*)"glCreateArraySetExt")) == NULL) || r; + r = ((glDeleteArraySetsEXT = (PFNGLDELETEARRAYSETSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteArraySetsEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_vertex_array_setXXX */ + +#ifdef GL_EXT_vertex_attrib_64bit + +static GLboolean _glewInit_GL_EXT_vertex_attrib_64bit () +{ + GLboolean r = GL_FALSE; + + r = ((glGetVertexAttribLdvEXT = (PFNGLGETVERTEXATTRIBLDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdvEXT")) == NULL) || r; + r = ((glVertexArrayVertexAttribLOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribLOffsetEXT")) == NULL) || r; + r = ((glVertexAttribL1dEXT = (PFNGLVERTEXATTRIBL1DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dEXT")) == NULL) || r; + r = ((glVertexAttribL1dvEXT = (PFNGLVERTEXATTRIBL1DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dvEXT")) == NULL) || r; + r = ((glVertexAttribL2dEXT = (PFNGLVERTEXATTRIBL2DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dEXT")) == NULL) || r; + r = ((glVertexAttribL2dvEXT = (PFNGLVERTEXATTRIBL2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dvEXT")) == NULL) || r; + r = ((glVertexAttribL3dEXT = (PFNGLVERTEXATTRIBL3DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dEXT")) == NULL) || r; + r = ((glVertexAttribL3dvEXT = (PFNGLVERTEXATTRIBL3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dvEXT")) == NULL) || r; + r = ((glVertexAttribL4dEXT = (PFNGLVERTEXATTRIBL4DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dEXT")) == NULL) || r; + r = ((glVertexAttribL4dvEXT = (PFNGLVERTEXATTRIBL4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dvEXT")) == NULL) || r; + r = ((glVertexAttribLPointerEXT = (PFNGLVERTEXATTRIBLPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointerEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_vertex_attrib_64bit */ + +#ifdef GL_EXT_vertex_shader + +static GLboolean _glewInit_GL_EXT_vertex_shader () +{ + GLboolean r = GL_FALSE; + + r = ((glBeginVertexShaderEXT = (PFNGLBEGINVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBeginVertexShaderEXT")) == NULL) || r; + r = ((glBindLightParameterEXT = (PFNGLBINDLIGHTPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindLightParameterEXT")) == NULL) || r; + r = ((glBindMaterialParameterEXT = (PFNGLBINDMATERIALPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindMaterialParameterEXT")) == NULL) || r; + r = ((glBindParameterEXT = (PFNGLBINDPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindParameterEXT")) == NULL) || r; + r = ((glBindTexGenParameterEXT = (PFNGLBINDTEXGENPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTexGenParameterEXT")) == NULL) || r; + r = ((glBindTextureUnitParameterEXT = (PFNGLBINDTEXTUREUNITPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureUnitParameterEXT")) == NULL) || r; + r = ((glBindVertexShaderEXT = (PFNGLBINDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindVertexShaderEXT")) == NULL) || r; + r = ((glDeleteVertexShaderEXT = (PFNGLDELETEVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexShaderEXT")) == NULL) || r; + r = ((glDisableVariantClientStateEXT = (PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVariantClientStateEXT")) == NULL) || r; + r = ((glEnableVariantClientStateEXT = (PFNGLENABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVariantClientStateEXT")) == NULL) || r; + r = ((glEndVertexShaderEXT = (PFNGLENDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glEndVertexShaderEXT")) == NULL) || r; + r = ((glExtractComponentEXT = (PFNGLEXTRACTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glExtractComponentEXT")) == NULL) || r; + r = ((glGenSymbolsEXT = (PFNGLGENSYMBOLSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenSymbolsEXT")) == NULL) || r; + r = ((glGenVertexShadersEXT = (PFNGLGENVERTEXSHADERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenVertexShadersEXT")) == NULL) || r; + r = ((glGetInvariantBooleanvEXT = (PFNGLGETINVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantBooleanvEXT")) == NULL) || r; + r = ((glGetInvariantFloatvEXT = (PFNGLGETINVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantFloatvEXT")) == NULL) || r; + r = ((glGetInvariantIntegervEXT = (PFNGLGETINVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantIntegervEXT")) == NULL) || r; + r = ((glGetLocalConstantBooleanvEXT = (PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantBooleanvEXT")) == NULL) || r; + r = ((glGetLocalConstantFloatvEXT = (PFNGLGETLOCALCONSTANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantFloatvEXT")) == NULL) || r; + r = ((glGetLocalConstantIntegervEXT = (PFNGLGETLOCALCONSTANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantIntegervEXT")) == NULL) || r; + r = ((glGetVariantBooleanvEXT = (PFNGLGETVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantBooleanvEXT")) == NULL) || r; + r = ((glGetVariantFloatvEXT = (PFNGLGETVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantFloatvEXT")) == NULL) || r; + r = ((glGetVariantIntegervEXT = (PFNGLGETVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantIntegervEXT")) == NULL) || r; + r = ((glGetVariantPointervEXT = (PFNGLGETVARIANTPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantPointervEXT")) == NULL) || r; + r = ((glInsertComponentEXT = (PFNGLINSERTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glInsertComponentEXT")) == NULL) || r; + r = ((glIsVariantEnabledEXT = (PFNGLISVARIANTENABLEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsVariantEnabledEXT")) == NULL) || r; + r = ((glSetInvariantEXT = (PFNGLSETINVARIANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetInvariantEXT")) == NULL) || r; + r = ((glSetLocalConstantEXT = (PFNGLSETLOCALCONSTANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetLocalConstantEXT")) == NULL) || r; + r = ((glShaderOp1EXT = (PFNGLSHADEROP1EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp1EXT")) == NULL) || r; + r = ((glShaderOp2EXT = (PFNGLSHADEROP2EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp2EXT")) == NULL) || r; + r = ((glShaderOp3EXT = (PFNGLSHADEROP3EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp3EXT")) == NULL) || r; + r = ((glSwizzleEXT = (PFNGLSWIZZLEEXTPROC)glewGetProcAddress((const GLubyte*)"glSwizzleEXT")) == NULL) || r; + r = ((glVariantPointerEXT = (PFNGLVARIANTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVariantPointerEXT")) == NULL) || r; + r = ((glVariantbvEXT = (PFNGLVARIANTBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantbvEXT")) == NULL) || r; + r = ((glVariantdvEXT = (PFNGLVARIANTDVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantdvEXT")) == NULL) || r; + r = ((glVariantfvEXT = (PFNGLVARIANTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantfvEXT")) == NULL) || r; + r = ((glVariantivEXT = (PFNGLVARIANTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantivEXT")) == NULL) || r; + r = ((glVariantsvEXT = (PFNGLVARIANTSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantsvEXT")) == NULL) || r; + r = ((glVariantubvEXT = (PFNGLVARIANTUBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantubvEXT")) == NULL) || r; + r = ((glVariantuivEXT = (PFNGLVARIANTUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantuivEXT")) == NULL) || r; + r = ((glVariantusvEXT = (PFNGLVARIANTUSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantusvEXT")) == NULL) || r; + r = ((glWriteMaskEXT = (PFNGLWRITEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glWriteMaskEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_vertex_shader */ + +#ifdef GL_EXT_vertex_weighting + +static GLboolean _glewInit_GL_EXT_vertex_weighting () +{ + GLboolean r = GL_FALSE; + + r = ((glVertexWeightPointerEXT = (PFNGLVERTEXWEIGHTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightPointerEXT")) == NULL) || r; + r = ((glVertexWeightfEXT = (PFNGLVERTEXWEIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfEXT")) == NULL) || r; + r = ((glVertexWeightfvEXT = (PFNGLVERTEXWEIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfvEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_vertex_weighting */ + +#ifdef GL_EXT_win32_keyed_mutex + +static GLboolean _glewInit_GL_EXT_win32_keyed_mutex () +{ + GLboolean r = GL_FALSE; + + r = ((glAcquireKeyedMutexWin32EXT = (PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC)glewGetProcAddress((const GLubyte*)"glAcquireKeyedMutexWin32EXT")) == NULL) || r; + r = ((glReleaseKeyedMutexWin32EXT = (PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC)glewGetProcAddress((const GLubyte*)"glReleaseKeyedMutexWin32EXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_win32_keyed_mutex */ + +#ifdef GL_EXT_window_rectangles + +static GLboolean _glewInit_GL_EXT_window_rectangles () +{ + GLboolean r = GL_FALSE; + + r = ((glWindowRectanglesEXT = (PFNGLWINDOWRECTANGLESEXTPROC)glewGetProcAddress((const GLubyte*)"glWindowRectanglesEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_window_rectangles */ + +#ifdef GL_EXT_x11_sync_object + +static GLboolean _glewInit_GL_EXT_x11_sync_object () +{ + GLboolean r = GL_FALSE; + + r = ((glImportSyncEXT = (PFNGLIMPORTSYNCEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSyncEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_x11_sync_object */ + +#ifdef GL_GREMEDY_frame_terminator + +static GLboolean _glewInit_GL_GREMEDY_frame_terminator () +{ + GLboolean r = GL_FALSE; + + r = ((glFrameTerminatorGREMEDY = (PFNGLFRAMETERMINATORGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glFrameTerminatorGREMEDY")) == NULL) || r; + + return r; +} + +#endif /* GL_GREMEDY_frame_terminator */ + +#ifdef GL_GREMEDY_string_marker + +static GLboolean _glewInit_GL_GREMEDY_string_marker () +{ + GLboolean r = GL_FALSE; + + r = ((glStringMarkerGREMEDY = (PFNGLSTRINGMARKERGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glStringMarkerGREMEDY")) == NULL) || r; + + return r; +} + +#endif /* GL_GREMEDY_string_marker */ + +#ifdef GL_HP_image_transform + +static GLboolean _glewInit_GL_HP_image_transform () +{ + GLboolean r = GL_FALSE; + + r = ((glGetImageTransformParameterfvHP = (PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterfvHP")) == NULL) || r; + r = ((glGetImageTransformParameterivHP = (PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterivHP")) == NULL) || r; + r = ((glImageTransformParameterfHP = (PFNGLIMAGETRANSFORMPARAMETERFHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfHP")) == NULL) || r; + r = ((glImageTransformParameterfvHP = (PFNGLIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfvHP")) == NULL) || r; + r = ((glImageTransformParameteriHP = (PFNGLIMAGETRANSFORMPARAMETERIHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameteriHP")) == NULL) || r; + r = ((glImageTransformParameterivHP = (PFNGLIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterivHP")) == NULL) || r; + + return r; +} + +#endif /* GL_HP_image_transform */ + +#ifdef GL_IBM_multimode_draw_arrays + +static GLboolean _glewInit_GL_IBM_multimode_draw_arrays () +{ + GLboolean r = GL_FALSE; + + r = ((glMultiModeDrawArraysIBM = (PFNGLMULTIMODEDRAWARRAYSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawArraysIBM")) == NULL) || r; + r = ((glMultiModeDrawElementsIBM = (PFNGLMULTIMODEDRAWELEMENTSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawElementsIBM")) == NULL) || r; + + return r; +} + +#endif /* GL_IBM_multimode_draw_arrays */ + +#ifdef GL_IBM_vertex_array_lists + +static GLboolean _glewInit_GL_IBM_vertex_array_lists () +{ + GLboolean r = GL_FALSE; + + r = ((glColorPointerListIBM = (PFNGLCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glColorPointerListIBM")) == NULL) || r; + r = ((glEdgeFlagPointerListIBM = (PFNGLEDGEFLAGPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerListIBM")) == NULL) || r; + r = ((glFogCoordPointerListIBM = (PFNGLFOGCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerListIBM")) == NULL) || r; + r = ((glIndexPointerListIBM = (PFNGLINDEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerListIBM")) == NULL) || r; + r = ((glNormalPointerListIBM = (PFNGLNORMALPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerListIBM")) == NULL) || r; + r = ((glSecondaryColorPointerListIBM = (PFNGLSECONDARYCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerListIBM")) == NULL) || r; + r = ((glTexCoordPointerListIBM = (PFNGLTEXCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerListIBM")) == NULL) || r; + r = ((glVertexPointerListIBM = (PFNGLVERTEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerListIBM")) == NULL) || r; + + return r; +} + +#endif /* GL_IBM_vertex_array_lists */ + +#ifdef GL_INTEL_map_texture + +static GLboolean _glewInit_GL_INTEL_map_texture () +{ + GLboolean r = GL_FALSE; + + r = ((glMapTexture2DINTEL = (PFNGLMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glMapTexture2DINTEL")) == NULL) || r; + r = ((glSyncTextureINTEL = (PFNGLSYNCTEXTUREINTELPROC)glewGetProcAddress((const GLubyte*)"glSyncTextureINTEL")) == NULL) || r; + r = ((glUnmapTexture2DINTEL = (PFNGLUNMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glUnmapTexture2DINTEL")) == NULL) || r; + + return r; +} + +#endif /* GL_INTEL_map_texture */ + +#ifdef GL_INTEL_parallel_arrays + +static GLboolean _glewInit_GL_INTEL_parallel_arrays () +{ + GLboolean r = GL_FALSE; + + r = ((glColorPointervINTEL = (PFNGLCOLORPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glColorPointervINTEL")) == NULL) || r; + r = ((glNormalPointervINTEL = (PFNGLNORMALPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glNormalPointervINTEL")) == NULL) || r; + r = ((glTexCoordPointervINTEL = (PFNGLTEXCOORDPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointervINTEL")) == NULL) || r; + r = ((glVertexPointervINTEL = (PFNGLVERTEXPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glVertexPointervINTEL")) == NULL) || r; + + return r; +} + +#endif /* GL_INTEL_parallel_arrays */ + +#ifdef GL_INTEL_performance_query + +static GLboolean _glewInit_GL_INTEL_performance_query () +{ + GLboolean r = GL_FALSE; + + r = ((glBeginPerfQueryINTEL = (PFNGLBEGINPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glBeginPerfQueryINTEL")) == NULL) || r; + r = ((glCreatePerfQueryINTEL = (PFNGLCREATEPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glCreatePerfQueryINTEL")) == NULL) || r; + r = ((glDeletePerfQueryINTEL = (PFNGLDELETEPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glDeletePerfQueryINTEL")) == NULL) || r; + r = ((glEndPerfQueryINTEL = (PFNGLENDPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glEndPerfQueryINTEL")) == NULL) || r; + r = ((glGetFirstPerfQueryIdINTEL = (PFNGLGETFIRSTPERFQUERYIDINTELPROC)glewGetProcAddress((const GLubyte*)"glGetFirstPerfQueryIdINTEL")) == NULL) || r; + r = ((glGetNextPerfQueryIdINTEL = (PFNGLGETNEXTPERFQUERYIDINTELPROC)glewGetProcAddress((const GLubyte*)"glGetNextPerfQueryIdINTEL")) == NULL) || r; + r = ((glGetPerfCounterInfoINTEL = (PFNGLGETPERFCOUNTERINFOINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfCounterInfoINTEL")) == NULL) || r; + r = ((glGetPerfQueryDataINTEL = (PFNGLGETPERFQUERYDATAINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryDataINTEL")) == NULL) || r; + r = ((glGetPerfQueryIdByNameINTEL = (PFNGLGETPERFQUERYIDBYNAMEINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryIdByNameINTEL")) == NULL) || r; + r = ((glGetPerfQueryInfoINTEL = (PFNGLGETPERFQUERYINFOINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryInfoINTEL")) == NULL) || r; + + return r; +} + +#endif /* GL_INTEL_performance_query */ + +#ifdef GL_INTEL_texture_scissor + +static GLboolean _glewInit_GL_INTEL_texture_scissor () +{ + GLboolean r = GL_FALSE; + + r = ((glTexScissorFuncINTEL = (PFNGLTEXSCISSORFUNCINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorFuncINTEL")) == NULL) || r; + r = ((glTexScissorINTEL = (PFNGLTEXSCISSORINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorINTEL")) == NULL) || r; + + return r; +} + +#endif /* GL_INTEL_texture_scissor */ + +#ifdef GL_KHR_blend_equation_advanced + +static GLboolean _glewInit_GL_KHR_blend_equation_advanced () +{ + GLboolean r = GL_FALSE; + + r = ((glBlendBarrierKHR = (PFNGLBLENDBARRIERKHRPROC)glewGetProcAddress((const GLubyte*)"glBlendBarrierKHR")) == NULL) || r; + + return r; +} + +#endif /* GL_KHR_blend_equation_advanced */ + +#ifdef GL_KHR_debug + +static GLboolean _glewInit_GL_KHR_debug () +{ + GLboolean r = GL_FALSE; + + r = ((glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallback")) == NULL) || r; + r = ((glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageControl")) == NULL) || r; + r = ((glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsert")) == NULL) || r; + r = ((glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLog")) == NULL) || r; + r = ((glGetObjectLabel = (PFNGLGETOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectLabel")) == NULL) || r; + r = ((glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectPtrLabel")) == NULL) || r; + r = ((glObjectLabel = (PFNGLOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectLabel")) == NULL) || r; + r = ((glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectPtrLabel")) == NULL) || r; + r = ((glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPopDebugGroup")) == NULL) || r; + r = ((glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPushDebugGroup")) == NULL) || r; + + return r; +} + +#endif /* GL_KHR_debug */ + +#ifdef GL_KHR_parallel_shader_compile + +static GLboolean _glewInit_GL_KHR_parallel_shader_compile () +{ + GLboolean r = GL_FALSE; + + r = ((glMaxShaderCompilerThreadsKHR = (PFNGLMAXSHADERCOMPILERTHREADSKHRPROC)glewGetProcAddress((const GLubyte*)"glMaxShaderCompilerThreadsKHR")) == NULL) || r; + + return r; +} + +#endif /* GL_KHR_parallel_shader_compile */ + +#ifdef GL_KHR_robustness + +static GLboolean _glewInit_GL_KHR_robustness () +{ + GLboolean r = GL_FALSE; + + r = ((glGetnUniformfv = (PFNGLGETNUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformfv")) == NULL) || r; + r = ((glGetnUniformiv = (PFNGLGETNUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformiv")) == NULL) || r; + r = ((glGetnUniformuiv = (PFNGLGETNUNIFORMUIVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformuiv")) == NULL) || r; + r = ((glReadnPixels = (PFNGLREADNPIXELSPROC)glewGetProcAddress((const GLubyte*)"glReadnPixels")) == NULL) || r; + + return r; +} + +#endif /* GL_KHR_robustness */ + +#ifdef GL_KTX_buffer_region + +static GLboolean _glewInit_GL_KTX_buffer_region () +{ + GLboolean r = GL_FALSE; + + r = ((glBufferRegionEnabled = (PFNGLBUFFERREGIONENABLEDPROC)glewGetProcAddress((const GLubyte*)"glBufferRegionEnabled")) == NULL) || r; + r = ((glDeleteBufferRegion = (PFNGLDELETEBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glDeleteBufferRegion")) == NULL) || r; + r = ((glDrawBufferRegion = (PFNGLDRAWBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glDrawBufferRegion")) == NULL) || r; + r = ((glNewBufferRegion = (PFNGLNEWBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glNewBufferRegion")) == NULL) || r; + r = ((glReadBufferRegion = (PFNGLREADBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glReadBufferRegion")) == NULL) || r; + + return r; +} + +#endif /* GL_KTX_buffer_region */ + +#ifdef GL_MESA_resize_buffers + +static GLboolean _glewInit_GL_MESA_resize_buffers () +{ + GLboolean r = GL_FALSE; + + r = ((glResizeBuffersMESA = (PFNGLRESIZEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glResizeBuffersMESA")) == NULL) || r; + + return r; +} + +#endif /* GL_MESA_resize_buffers */ + +#ifdef GL_MESA_window_pos + +static GLboolean _glewInit_GL_MESA_window_pos () +{ + GLboolean r = GL_FALSE; + + r = ((glWindowPos2dMESA = (PFNGLWINDOWPOS2DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dMESA")) == NULL) || r; + r = ((glWindowPos2dvMESA = (PFNGLWINDOWPOS2DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvMESA")) == NULL) || r; + r = ((glWindowPos2fMESA = (PFNGLWINDOWPOS2FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fMESA")) == NULL) || r; + r = ((glWindowPos2fvMESA = (PFNGLWINDOWPOS2FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvMESA")) == NULL) || r; + r = ((glWindowPos2iMESA = (PFNGLWINDOWPOS2IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iMESA")) == NULL) || r; + r = ((glWindowPos2ivMESA = (PFNGLWINDOWPOS2IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivMESA")) == NULL) || r; + r = ((glWindowPos2sMESA = (PFNGLWINDOWPOS2SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sMESA")) == NULL) || r; + r = ((glWindowPos2svMESA = (PFNGLWINDOWPOS2SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svMESA")) == NULL) || r; + r = ((glWindowPos3dMESA = (PFNGLWINDOWPOS3DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dMESA")) == NULL) || r; + r = ((glWindowPos3dvMESA = (PFNGLWINDOWPOS3DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvMESA")) == NULL) || r; + r = ((glWindowPos3fMESA = (PFNGLWINDOWPOS3FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fMESA")) == NULL) || r; + r = ((glWindowPos3fvMESA = (PFNGLWINDOWPOS3FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvMESA")) == NULL) || r; + r = ((glWindowPos3iMESA = (PFNGLWINDOWPOS3IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iMESA")) == NULL) || r; + r = ((glWindowPos3ivMESA = (PFNGLWINDOWPOS3IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivMESA")) == NULL) || r; + r = ((glWindowPos3sMESA = (PFNGLWINDOWPOS3SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sMESA")) == NULL) || r; + r = ((glWindowPos3svMESA = (PFNGLWINDOWPOS3SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svMESA")) == NULL) || r; + r = ((glWindowPos4dMESA = (PFNGLWINDOWPOS4DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dMESA")) == NULL) || r; + r = ((glWindowPos4dvMESA = (PFNGLWINDOWPOS4DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dvMESA")) == NULL) || r; + r = ((glWindowPos4fMESA = (PFNGLWINDOWPOS4FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fMESA")) == NULL) || r; + r = ((glWindowPos4fvMESA = (PFNGLWINDOWPOS4FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fvMESA")) == NULL) || r; + r = ((glWindowPos4iMESA = (PFNGLWINDOWPOS4IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4iMESA")) == NULL) || r; + r = ((glWindowPos4ivMESA = (PFNGLWINDOWPOS4IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4ivMESA")) == NULL) || r; + r = ((glWindowPos4sMESA = (PFNGLWINDOWPOS4SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4sMESA")) == NULL) || r; + r = ((glWindowPos4svMESA = (PFNGLWINDOWPOS4SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4svMESA")) == NULL) || r; + + return r; +} + +#endif /* GL_MESA_window_pos */ + +#ifdef GL_NVX_conditional_render + +static GLboolean _glewInit_GL_NVX_conditional_render () +{ + GLboolean r = GL_FALSE; + + r = ((glBeginConditionalRenderNVX = (PFNGLBEGINCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRenderNVX")) == NULL) || r; + r = ((glEndConditionalRenderNVX = (PFNGLENDCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRenderNVX")) == NULL) || r; + + return r; +} + +#endif /* GL_NVX_conditional_render */ + +#ifdef GL_NVX_linked_gpu_multicast + +static GLboolean _glewInit_GL_NVX_linked_gpu_multicast () +{ + GLboolean r = GL_FALSE; + + r = ((glLGPUCopyImageSubDataNVX = (PFNGLLGPUCOPYIMAGESUBDATANVXPROC)glewGetProcAddress((const GLubyte*)"glLGPUCopyImageSubDataNVX")) == NULL) || r; + r = ((glLGPUInterlockNVX = (PFNGLLGPUINTERLOCKNVXPROC)glewGetProcAddress((const GLubyte*)"glLGPUInterlockNVX")) == NULL) || r; + r = ((glLGPUNamedBufferSubDataNVX = (PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC)glewGetProcAddress((const GLubyte*)"glLGPUNamedBufferSubDataNVX")) == NULL) || r; + + return r; +} + +#endif /* GL_NVX_linked_gpu_multicast */ + +#ifdef GL_NV_3dvision_settings + +static GLboolean _glewInit_GL_NV_3dvision_settings () +{ + GLboolean r = GL_FALSE; + + r = ((glStereoParameterfNV = (PFNGLSTEREOPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glStereoParameterfNV")) == NULL) || r; + r = ((glStereoParameteriNV = (PFNGLSTEREOPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glStereoParameteriNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_3dvision_settings */ + +#ifdef GL_NV_bindless_multi_draw_indirect + +static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect () +{ + GLboolean r = GL_FALSE; + + r = ((glMultiDrawArraysIndirectBindlessNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectBindlessNV")) == NULL) || r; + r = ((glMultiDrawElementsIndirectBindlessNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectBindlessNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_bindless_multi_draw_indirect */ + +#ifdef GL_NV_bindless_multi_draw_indirect_count + +static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect_count () +{ + GLboolean r = GL_FALSE; + + r = ((glMultiDrawArraysIndirectBindlessCountNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectBindlessCountNV")) == NULL) || r; + r = ((glMultiDrawElementsIndirectBindlessCountNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectBindlessCountNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_bindless_multi_draw_indirect_count */ + +#ifdef GL_NV_bindless_texture + +static GLboolean _glewInit_GL_NV_bindless_texture () +{ + GLboolean r = GL_FALSE; + + r = ((glGetImageHandleNV = (PFNGLGETIMAGEHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetImageHandleNV")) == NULL) || r; + r = ((glGetTextureHandleNV = (PFNGLGETTEXTUREHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleNV")) == NULL) || r; + r = ((glGetTextureSamplerHandleNV = (PFNGLGETTEXTURESAMPLERHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleNV")) == NULL) || r; + r = ((glIsImageHandleResidentNV = (PFNGLISIMAGEHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsImageHandleResidentNV")) == NULL) || r; + r = ((glIsTextureHandleResidentNV = (PFNGLISTEXTUREHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsTextureHandleResidentNV")) == NULL) || r; + r = ((glMakeImageHandleNonResidentNV = (PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleNonResidentNV")) == NULL) || r; + r = ((glMakeImageHandleResidentNV = (PFNGLMAKEIMAGEHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleResidentNV")) == NULL) || r; + r = ((glMakeTextureHandleNonResidentNV = (PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleNonResidentNV")) == NULL) || r; + r = ((glMakeTextureHandleResidentNV = (PFNGLMAKETEXTUREHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleResidentNV")) == NULL) || r; + r = ((glProgramUniformHandleui64NV = (PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64NV")) == NULL) || r; + r = ((glProgramUniformHandleui64vNV = (PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vNV")) == NULL) || r; + r = ((glUniformHandleui64NV = (PFNGLUNIFORMHANDLEUI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64NV")) == NULL) || r; + r = ((glUniformHandleui64vNV = (PFNGLUNIFORMHANDLEUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_bindless_texture */ + +#ifdef GL_NV_blend_equation_advanced + +static GLboolean _glewInit_GL_NV_blend_equation_advanced () +{ + GLboolean r = GL_FALSE; + + r = ((glBlendBarrierNV = (PFNGLBLENDBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glBlendBarrierNV")) == NULL) || r; + r = ((glBlendParameteriNV = (PFNGLBLENDPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glBlendParameteriNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_blend_equation_advanced */ + +#ifdef GL_NV_clip_space_w_scaling + +static GLboolean _glewInit_GL_NV_clip_space_w_scaling () +{ + GLboolean r = GL_FALSE; + + r = ((glViewportPositionWScaleNV = (PFNGLVIEWPORTPOSITIONWSCALENVPROC)glewGetProcAddress((const GLubyte*)"glViewportPositionWScaleNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_clip_space_w_scaling */ + +#ifdef GL_NV_command_list + +static GLboolean _glewInit_GL_NV_command_list () +{ + GLboolean r = GL_FALSE; + + r = ((glCallCommandListNV = (PFNGLCALLCOMMANDLISTNVPROC)glewGetProcAddress((const GLubyte*)"glCallCommandListNV")) == NULL) || r; + r = ((glCommandListSegmentsNV = (PFNGLCOMMANDLISTSEGMENTSNVPROC)glewGetProcAddress((const GLubyte*)"glCommandListSegmentsNV")) == NULL) || r; + r = ((glCompileCommandListNV = (PFNGLCOMPILECOMMANDLISTNVPROC)glewGetProcAddress((const GLubyte*)"glCompileCommandListNV")) == NULL) || r; + r = ((glCreateCommandListsNV = (PFNGLCREATECOMMANDLISTSNVPROC)glewGetProcAddress((const GLubyte*)"glCreateCommandListsNV")) == NULL) || r; + r = ((glCreateStatesNV = (PFNGLCREATESTATESNVPROC)glewGetProcAddress((const GLubyte*)"glCreateStatesNV")) == NULL) || r; + r = ((glDeleteCommandListsNV = (PFNGLDELETECOMMANDLISTSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteCommandListsNV")) == NULL) || r; + r = ((glDeleteStatesNV = (PFNGLDELETESTATESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteStatesNV")) == NULL) || r; + r = ((glDrawCommandsAddressNV = (PFNGLDRAWCOMMANDSADDRESSNVPROC)glewGetProcAddress((const GLubyte*)"glDrawCommandsAddressNV")) == NULL) || r; + r = ((glDrawCommandsNV = (PFNGLDRAWCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glDrawCommandsNV")) == NULL) || r; + r = ((glDrawCommandsStatesAddressNV = (PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC)glewGetProcAddress((const GLubyte*)"glDrawCommandsStatesAddressNV")) == NULL) || r; + r = ((glDrawCommandsStatesNV = (PFNGLDRAWCOMMANDSSTATESNVPROC)glewGetProcAddress((const GLubyte*)"glDrawCommandsStatesNV")) == NULL) || r; + r = ((glGetCommandHeaderNV = (PFNGLGETCOMMANDHEADERNVPROC)glewGetProcAddress((const GLubyte*)"glGetCommandHeaderNV")) == NULL) || r; + r = ((glGetStageIndexNV = (PFNGLGETSTAGEINDEXNVPROC)glewGetProcAddress((const GLubyte*)"glGetStageIndexNV")) == NULL) || r; + r = ((glIsCommandListNV = (PFNGLISCOMMANDLISTNVPROC)glewGetProcAddress((const GLubyte*)"glIsCommandListNV")) == NULL) || r; + r = ((glIsStateNV = (PFNGLISSTATENVPROC)glewGetProcAddress((const GLubyte*)"glIsStateNV")) == NULL) || r; + r = ((glListDrawCommandsStatesClientNV = (PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC)glewGetProcAddress((const GLubyte*)"glListDrawCommandsStatesClientNV")) == NULL) || r; + r = ((glStateCaptureNV = (PFNGLSTATECAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glStateCaptureNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_command_list */ + +#ifdef GL_NV_conditional_render + +static GLboolean _glewInit_GL_NV_conditional_render () +{ + GLboolean r = GL_FALSE; + + r = ((glBeginConditionalRenderNV = (PFNGLBEGINCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRenderNV")) == NULL) || r; + r = ((glEndConditionalRenderNV = (PFNGLENDCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRenderNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_conditional_render */ + +#ifdef GL_NV_conservative_raster + +static GLboolean _glewInit_GL_NV_conservative_raster () +{ + GLboolean r = GL_FALSE; + + r = ((glSubpixelPrecisionBiasNV = (PFNGLSUBPIXELPRECISIONBIASNVPROC)glewGetProcAddress((const GLubyte*)"glSubpixelPrecisionBiasNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_conservative_raster */ + +#ifdef GL_NV_conservative_raster_dilate + +static GLboolean _glewInit_GL_NV_conservative_raster_dilate () +{ + GLboolean r = GL_FALSE; + + r = ((glConservativeRasterParameterfNV = (PFNGLCONSERVATIVERASTERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glConservativeRasterParameterfNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_conservative_raster_dilate */ + +#ifdef GL_NV_conservative_raster_pre_snap_triangles + +static GLboolean _glewInit_GL_NV_conservative_raster_pre_snap_triangles () +{ + GLboolean r = GL_FALSE; + + r = ((glConservativeRasterParameteriNV = (PFNGLCONSERVATIVERASTERPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glConservativeRasterParameteriNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_conservative_raster_pre_snap_triangles */ + +#ifdef GL_NV_copy_buffer + +static GLboolean _glewInit_GL_NV_copy_buffer () +{ + GLboolean r = GL_FALSE; + + r = ((glCopyBufferSubDataNV = (PFNGLCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glCopyBufferSubDataNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_copy_buffer */ + +#ifdef GL_NV_copy_image + +static GLboolean _glewInit_GL_NV_copy_image () +{ + GLboolean r = GL_FALSE; + + r = ((glCopyImageSubDataNV = (PFNGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubDataNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_copy_image */ + +#ifdef GL_NV_depth_buffer_float + +static GLboolean _glewInit_GL_NV_depth_buffer_float () +{ + GLboolean r = GL_FALSE; + + r = ((glClearDepthdNV = (PFNGLCLEARDEPTHDNVPROC)glewGetProcAddress((const GLubyte*)"glClearDepthdNV")) == NULL) || r; + r = ((glDepthBoundsdNV = (PFNGLDEPTHBOUNDSDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsdNV")) == NULL) || r; + r = ((glDepthRangedNV = (PFNGLDEPTHRANGEDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangedNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_depth_buffer_float */ + +#ifdef GL_NV_draw_buffers + +static GLboolean _glewInit_GL_NV_draw_buffers () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawBuffersNV = (PFNGLDRAWBUFFERSNVPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_draw_buffers */ + +#ifdef GL_NV_draw_instanced + +static GLboolean _glewInit_GL_NV_draw_instanced () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawArraysInstancedNV = (PFNGLDRAWARRAYSINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedNV")) == NULL) || r; + r = ((glDrawElementsInstancedNV = (PFNGLDRAWELEMENTSINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_draw_instanced */ + +#ifdef GL_NV_draw_texture + +static GLboolean _glewInit_GL_NV_draw_texture () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawTextureNV = (PFNGLDRAWTEXTURENVPROC)glewGetProcAddress((const GLubyte*)"glDrawTextureNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_draw_texture */ + +#ifdef GL_NV_draw_vulkan_image + +static GLboolean _glewInit_GL_NV_draw_vulkan_image () +{ + GLboolean r = GL_FALSE; + + r = ((glDrawVkImageNV = (PFNGLDRAWVKIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glDrawVkImageNV")) == NULL) || r; + r = ((glGetVkProcAddrNV = (PFNGLGETVKPROCADDRNVPROC)glewGetProcAddress((const GLubyte*)"glGetVkProcAddrNV")) == NULL) || r; + r = ((glSignalVkFenceNV = (PFNGLSIGNALVKFENCENVPROC)glewGetProcAddress((const GLubyte*)"glSignalVkFenceNV")) == NULL) || r; + r = ((glSignalVkSemaphoreNV = (PFNGLSIGNALVKSEMAPHORENVPROC)glewGetProcAddress((const GLubyte*)"glSignalVkSemaphoreNV")) == NULL) || r; + r = ((glWaitVkSemaphoreNV = (PFNGLWAITVKSEMAPHORENVPROC)glewGetProcAddress((const GLubyte*)"glWaitVkSemaphoreNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_draw_vulkan_image */ + +#ifdef GL_NV_evaluators + +static GLboolean _glewInit_GL_NV_evaluators () +{ + GLboolean r = GL_FALSE; + + r = ((glEvalMapsNV = (PFNGLEVALMAPSNVPROC)glewGetProcAddress((const GLubyte*)"glEvalMapsNV")) == NULL) || r; + r = ((glGetMapAttribParameterfvNV = (PFNGLGETMAPATTRIBPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterfvNV")) == NULL) || r; + r = ((glGetMapAttribParameterivNV = (PFNGLGETMAPATTRIBPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterivNV")) == NULL) || r; + r = ((glGetMapControlPointsNV = (PFNGLGETMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapControlPointsNV")) == NULL) || r; + r = ((glGetMapParameterfvNV = (PFNGLGETMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterfvNV")) == NULL) || r; + r = ((glGetMapParameterivNV = (PFNGLGETMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterivNV")) == NULL) || r; + r = ((glMapControlPointsNV = (PFNGLMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glMapControlPointsNV")) == NULL) || r; + r = ((glMapParameterfvNV = (PFNGLMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterfvNV")) == NULL) || r; + r = ((glMapParameterivNV = (PFNGLMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterivNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_evaluators */ + +#ifdef GL_NV_explicit_multisample + +static GLboolean _glewInit_GL_NV_explicit_multisample () +{ + GLboolean r = GL_FALSE; + + r = ((glGetMultisamplefvNV = (PFNGLGETMULTISAMPLEFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMultisamplefvNV")) == NULL) || r; + r = ((glSampleMaskIndexedNV = (PFNGLSAMPLEMASKINDEXEDNVPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskIndexedNV")) == NULL) || r; + r = ((glTexRenderbufferNV = (PFNGLTEXRENDERBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glTexRenderbufferNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_explicit_multisample */ + +#ifdef GL_NV_fence + +static GLboolean _glewInit_GL_NV_fence () +{ + GLboolean r = GL_FALSE; + + r = ((glDeleteFencesNV = (PFNGLDELETEFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesNV")) == NULL) || r; + r = ((glFinishFenceNV = (PFNGLFINISHFENCENVPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceNV")) == NULL) || r; + r = ((glGenFencesNV = (PFNGLGENFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glGenFencesNV")) == NULL) || r; + r = ((glGetFenceivNV = (PFNGLGETFENCEIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFenceivNV")) == NULL) || r; + r = ((glIsFenceNV = (PFNGLISFENCENVPROC)glewGetProcAddress((const GLubyte*)"glIsFenceNV")) == NULL) || r; + r = ((glSetFenceNV = (PFNGLSETFENCENVPROC)glewGetProcAddress((const GLubyte*)"glSetFenceNV")) == NULL) || r; + r = ((glTestFenceNV = (PFNGLTESTFENCENVPROC)glewGetProcAddress((const GLubyte*)"glTestFenceNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_fence */ + +#ifdef GL_NV_fragment_coverage_to_color + +static GLboolean _glewInit_GL_NV_fragment_coverage_to_color () +{ + GLboolean r = GL_FALSE; + + r = ((glFragmentCoverageColorNV = (PFNGLFRAGMENTCOVERAGECOLORNVPROC)glewGetProcAddress((const GLubyte*)"glFragmentCoverageColorNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_fragment_coverage_to_color */ + +#ifdef GL_NV_fragment_program + +static GLboolean _glewInit_GL_NV_fragment_program () +{ + GLboolean r = GL_FALSE; + + r = ((glGetProgramNamedParameterdvNV = (PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterdvNV")) == NULL) || r; + r = ((glGetProgramNamedParameterfvNV = (PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterfvNV")) == NULL) || r; + r = ((glProgramNamedParameter4dNV = (PFNGLPROGRAMNAMEDPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dNV")) == NULL) || r; + r = ((glProgramNamedParameter4dvNV = (PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dvNV")) == NULL) || r; + r = ((glProgramNamedParameter4fNV = (PFNGLPROGRAMNAMEDPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fNV")) == NULL) || r; + r = ((glProgramNamedParameter4fvNV = (PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fvNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_fragment_program */ + +#ifdef GL_NV_framebuffer_blit + +static GLboolean _glewInit_GL_NV_framebuffer_blit () +{ + GLboolean r = GL_FALSE; + + r = ((glBlitFramebufferNV = (PFNGLBLITFRAMEBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_framebuffer_blit */ + +#ifdef GL_NV_framebuffer_multisample + +static GLboolean _glewInit_GL_NV_framebuffer_multisample () +{ + GLboolean r = GL_FALSE; + + r = ((glRenderbufferStorageMultisampleNV = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_framebuffer_multisample */ + +#ifdef GL_NV_framebuffer_multisample_coverage + +static GLboolean _glewInit_GL_NV_framebuffer_multisample_coverage () +{ + GLboolean r = GL_FALSE; + + r = ((glRenderbufferStorageMultisampleCoverageNV = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleCoverageNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_framebuffer_multisample_coverage */ + +#ifdef GL_NV_geometry_program4 + +static GLboolean _glewInit_GL_NV_geometry_program4 () +{ + GLboolean r = GL_FALSE; + + r = ((glProgramVertexLimitNV = (PFNGLPROGRAMVERTEXLIMITNVPROC)glewGetProcAddress((const GLubyte*)"glProgramVertexLimitNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_geometry_program4 */ + +#ifdef GL_NV_gpu_multicast + +static GLboolean _glewInit_GL_NV_gpu_multicast () +{ + GLboolean r = GL_FALSE; + + r = ((glMulticastBarrierNV = (PFNGLMULTICASTBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastBarrierNV")) == NULL) || r; + r = ((glMulticastBlitFramebufferNV = (PFNGLMULTICASTBLITFRAMEBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastBlitFramebufferNV")) == NULL) || r; + r = ((glMulticastBufferSubDataNV = (PFNGLMULTICASTBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glMulticastBufferSubDataNV")) == NULL) || r; + r = ((glMulticastCopyBufferSubDataNV = (PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glMulticastCopyBufferSubDataNV")) == NULL) || r; + r = ((glMulticastCopyImageSubDataNV = (PFNGLMULTICASTCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glMulticastCopyImageSubDataNV")) == NULL) || r; + r = ((glMulticastFramebufferSampleLocationsfvNV = (PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastFramebufferSampleLocationsfvNV")) == NULL) || r; + r = ((glMulticastGetQueryObjecti64vNV = (PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastGetQueryObjecti64vNV")) == NULL) || r; + r = ((glMulticastGetQueryObjectivNV = (PFNGLMULTICASTGETQUERYOBJECTIVNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastGetQueryObjectivNV")) == NULL) || r; + r = ((glMulticastGetQueryObjectui64vNV = (PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastGetQueryObjectui64vNV")) == NULL) || r; + r = ((glMulticastGetQueryObjectuivNV = (PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastGetQueryObjectuivNV")) == NULL) || r; + r = ((glMulticastWaitSyncNV = (PFNGLMULTICASTWAITSYNCNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastWaitSyncNV")) == NULL) || r; + r = ((glRenderGpuMaskNV = (PFNGLRENDERGPUMASKNVPROC)glewGetProcAddress((const GLubyte*)"glRenderGpuMaskNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_gpu_multicast */ + +#ifdef GL_NV_gpu_program4 + +static GLboolean _glewInit_GL_NV_gpu_program4 () +{ + GLboolean r = GL_FALSE; + + r = ((glProgramEnvParameterI4iNV = (PFNGLPROGRAMENVPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4iNV")) == NULL) || r; + r = ((glProgramEnvParameterI4ivNV = (PFNGLPROGRAMENVPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4ivNV")) == NULL) || r; + r = ((glProgramEnvParameterI4uiNV = (PFNGLPROGRAMENVPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uiNV")) == NULL) || r; + r = ((glProgramEnvParameterI4uivNV = (PFNGLPROGRAMENVPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uivNV")) == NULL) || r; + r = ((glProgramEnvParametersI4ivNV = (PFNGLPROGRAMENVPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4ivNV")) == NULL) || r; + r = ((glProgramEnvParametersI4uivNV = (PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4uivNV")) == NULL) || r; + r = ((glProgramLocalParameterI4iNV = (PFNGLPROGRAMLOCALPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4iNV")) == NULL) || r; + r = ((glProgramLocalParameterI4ivNV = (PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4ivNV")) == NULL) || r; + r = ((glProgramLocalParameterI4uiNV = (PFNGLPROGRAMLOCALPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uiNV")) == NULL) || r; + r = ((glProgramLocalParameterI4uivNV = (PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uivNV")) == NULL) || r; + r = ((glProgramLocalParametersI4ivNV = (PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4ivNV")) == NULL) || r; + r = ((glProgramLocalParametersI4uivNV = (PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4uivNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_gpu_program4 */ + +#ifdef GL_NV_gpu_shader5 + +static GLboolean _glewInit_GL_NV_gpu_shader5 () +{ + GLboolean r = GL_FALSE; + + r = ((glGetUniformi64vNV = (PFNGLGETUNIFORMI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformi64vNV")) == NULL) || r; + r = ((glGetUniformui64vNV = (PFNGLGETUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformui64vNV")) == NULL) || r; + r = ((glProgramUniform1i64NV = (PFNGLPROGRAMUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64NV")) == NULL) || r; + r = ((glProgramUniform1i64vNV = (PFNGLPROGRAMUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64vNV")) == NULL) || r; + r = ((glProgramUniform1ui64NV = (PFNGLPROGRAMUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64NV")) == NULL) || r; + r = ((glProgramUniform1ui64vNV = (PFNGLPROGRAMUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64vNV")) == NULL) || r; + r = ((glProgramUniform2i64NV = (PFNGLPROGRAMUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64NV")) == NULL) || r; + r = ((glProgramUniform2i64vNV = (PFNGLPROGRAMUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64vNV")) == NULL) || r; + r = ((glProgramUniform2ui64NV = (PFNGLPROGRAMUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64NV")) == NULL) || r; + r = ((glProgramUniform2ui64vNV = (PFNGLPROGRAMUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64vNV")) == NULL) || r; + r = ((glProgramUniform3i64NV = (PFNGLPROGRAMUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64NV")) == NULL) || r; + r = ((glProgramUniform3i64vNV = (PFNGLPROGRAMUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64vNV")) == NULL) || r; + r = ((glProgramUniform3ui64NV = (PFNGLPROGRAMUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64NV")) == NULL) || r; + r = ((glProgramUniform3ui64vNV = (PFNGLPROGRAMUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64vNV")) == NULL) || r; + r = ((glProgramUniform4i64NV = (PFNGLPROGRAMUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64NV")) == NULL) || r; + r = ((glProgramUniform4i64vNV = (PFNGLPROGRAMUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64vNV")) == NULL) || r; + r = ((glProgramUniform4ui64NV = (PFNGLPROGRAMUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64NV")) == NULL) || r; + r = ((glProgramUniform4ui64vNV = (PFNGLPROGRAMUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64vNV")) == NULL) || r; + r = ((glUniform1i64NV = (PFNGLUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64NV")) == NULL) || r; + r = ((glUniform1i64vNV = (PFNGLUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64vNV")) == NULL) || r; + r = ((glUniform1ui64NV = (PFNGLUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64NV")) == NULL) || r; + r = ((glUniform1ui64vNV = (PFNGLUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64vNV")) == NULL) || r; + r = ((glUniform2i64NV = (PFNGLUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64NV")) == NULL) || r; + r = ((glUniform2i64vNV = (PFNGLUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64vNV")) == NULL) || r; + r = ((glUniform2ui64NV = (PFNGLUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64NV")) == NULL) || r; + r = ((glUniform2ui64vNV = (PFNGLUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64vNV")) == NULL) || r; + r = ((glUniform3i64NV = (PFNGLUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64NV")) == NULL) || r; + r = ((glUniform3i64vNV = (PFNGLUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64vNV")) == NULL) || r; + r = ((glUniform3ui64NV = (PFNGLUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64NV")) == NULL) || r; + r = ((glUniform3ui64vNV = (PFNGLUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64vNV")) == NULL) || r; + r = ((glUniform4i64NV = (PFNGLUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64NV")) == NULL) || r; + r = ((glUniform4i64vNV = (PFNGLUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64vNV")) == NULL) || r; + r = ((glUniform4ui64NV = (PFNGLUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64NV")) == NULL) || r; + r = ((glUniform4ui64vNV = (PFNGLUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64vNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_gpu_shader5 */ + +#ifdef GL_NV_half_float + +static GLboolean _glewInit_GL_NV_half_float () +{ + GLboolean r = GL_FALSE; + + r = ((glColor3hNV = (PFNGLCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hNV")) == NULL) || r; + r = ((glColor3hvNV = (PFNGLCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hvNV")) == NULL) || r; + r = ((glColor4hNV = (PFNGLCOLOR4HNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hNV")) == NULL) || r; + r = ((glColor4hvNV = (PFNGLCOLOR4HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hvNV")) == NULL) || r; + r = ((glFogCoordhNV = (PFNGLFOGCOORDHNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhNV")) == NULL) || r; + r = ((glFogCoordhvNV = (PFNGLFOGCOORDHVNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhvNV")) == NULL) || r; + r = ((glMultiTexCoord1hNV = (PFNGLMULTITEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hNV")) == NULL) || r; + r = ((glMultiTexCoord1hvNV = (PFNGLMULTITEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hvNV")) == NULL) || r; + r = ((glMultiTexCoord2hNV = (PFNGLMULTITEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hNV")) == NULL) || r; + r = ((glMultiTexCoord2hvNV = (PFNGLMULTITEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hvNV")) == NULL) || r; + r = ((glMultiTexCoord3hNV = (PFNGLMULTITEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hNV")) == NULL) || r; + r = ((glMultiTexCoord3hvNV = (PFNGLMULTITEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hvNV")) == NULL) || r; + r = ((glMultiTexCoord4hNV = (PFNGLMULTITEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hNV")) == NULL) || r; + r = ((glMultiTexCoord4hvNV = (PFNGLMULTITEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hvNV")) == NULL) || r; + r = ((glNormal3hNV = (PFNGLNORMAL3HNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hNV")) == NULL) || r; + r = ((glNormal3hvNV = (PFNGLNORMAL3HVNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hvNV")) == NULL) || r; + r = ((glSecondaryColor3hNV = (PFNGLSECONDARYCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hNV")) == NULL) || r; + r = ((glSecondaryColor3hvNV = (PFNGLSECONDARYCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hvNV")) == NULL) || r; + r = ((glTexCoord1hNV = (PFNGLTEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hNV")) == NULL) || r; + r = ((glTexCoord1hvNV = (PFNGLTEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hvNV")) == NULL) || r; + r = ((glTexCoord2hNV = (PFNGLTEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hNV")) == NULL) || r; + r = ((glTexCoord2hvNV = (PFNGLTEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hvNV")) == NULL) || r; + r = ((glTexCoord3hNV = (PFNGLTEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hNV")) == NULL) || r; + r = ((glTexCoord3hvNV = (PFNGLTEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hvNV")) == NULL) || r; + r = ((glTexCoord4hNV = (PFNGLTEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hNV")) == NULL) || r; + r = ((glTexCoord4hvNV = (PFNGLTEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hvNV")) == NULL) || r; + r = ((glVertex2hNV = (PFNGLVERTEX2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hNV")) == NULL) || r; + r = ((glVertex2hvNV = (PFNGLVERTEX2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hvNV")) == NULL) || r; + r = ((glVertex3hNV = (PFNGLVERTEX3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hNV")) == NULL) || r; + r = ((glVertex3hvNV = (PFNGLVERTEX3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hvNV")) == NULL) || r; + r = ((glVertex4hNV = (PFNGLVERTEX4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hNV")) == NULL) || r; + r = ((glVertex4hvNV = (PFNGLVERTEX4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hvNV")) == NULL) || r; + r = ((glVertexAttrib1hNV = (PFNGLVERTEXATTRIB1HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hNV")) == NULL) || r; + r = ((glVertexAttrib1hvNV = (PFNGLVERTEXATTRIB1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hvNV")) == NULL) || r; + r = ((glVertexAttrib2hNV = (PFNGLVERTEXATTRIB2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hNV")) == NULL) || r; + r = ((glVertexAttrib2hvNV = (PFNGLVERTEXATTRIB2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hvNV")) == NULL) || r; + r = ((glVertexAttrib3hNV = (PFNGLVERTEXATTRIB3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hNV")) == NULL) || r; + r = ((glVertexAttrib3hvNV = (PFNGLVERTEXATTRIB3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hvNV")) == NULL) || r; + r = ((glVertexAttrib4hNV = (PFNGLVERTEXATTRIB4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hNV")) == NULL) || r; + r = ((glVertexAttrib4hvNV = (PFNGLVERTEXATTRIB4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hvNV")) == NULL) || r; + r = ((glVertexAttribs1hvNV = (PFNGLVERTEXATTRIBS1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1hvNV")) == NULL) || r; + r = ((glVertexAttribs2hvNV = (PFNGLVERTEXATTRIBS2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2hvNV")) == NULL) || r; + r = ((glVertexAttribs3hvNV = (PFNGLVERTEXATTRIBS3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3hvNV")) == NULL) || r; + r = ((glVertexAttribs4hvNV = (PFNGLVERTEXATTRIBS4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4hvNV")) == NULL) || r; + r = ((glVertexWeighthNV = (PFNGLVERTEXWEIGHTHNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthNV")) == NULL) || r; + r = ((glVertexWeighthvNV = (PFNGLVERTEXWEIGHTHVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthvNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_half_float */ + +#ifdef GL_NV_instanced_arrays + +static GLboolean _glewInit_GL_NV_instanced_arrays () +{ + GLboolean r = GL_FALSE; + + r = ((glVertexAttribDivisorNV = (PFNGLVERTEXATTRIBDIVISORNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_instanced_arrays */ + +#ifdef GL_NV_internalformat_sample_query + +static GLboolean _glewInit_GL_NV_internalformat_sample_query () +{ + GLboolean r = GL_FALSE; + + r = ((glGetInternalformatSampleivNV = (PFNGLGETINTERNALFORMATSAMPLEIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformatSampleivNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_internalformat_sample_query */ + +#ifdef GL_NV_non_square_matrices + +static GLboolean _glewInit_GL_NV_non_square_matrices () +{ + GLboolean r = GL_FALSE; + + r = ((glUniformMatrix2x3fvNV = (PFNGLUNIFORMMATRIX2X3FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3fvNV")) == NULL) || r; + r = ((glUniformMatrix2x4fvNV = (PFNGLUNIFORMMATRIX2X4FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4fvNV")) == NULL) || r; + r = ((glUniformMatrix3x2fvNV = (PFNGLUNIFORMMATRIX3X2FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2fvNV")) == NULL) || r; + r = ((glUniformMatrix3x4fvNV = (PFNGLUNIFORMMATRIX3X4FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4fvNV")) == NULL) || r; + r = ((glUniformMatrix4x2fvNV = (PFNGLUNIFORMMATRIX4X2FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2fvNV")) == NULL) || r; + r = ((glUniformMatrix4x3fvNV = (PFNGLUNIFORMMATRIX4X3FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3fvNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_non_square_matrices */ + +#ifdef GL_NV_occlusion_query + +static GLboolean _glewInit_GL_NV_occlusion_query () +{ + GLboolean r = GL_FALSE; + + r = ((glBeginOcclusionQueryNV = (PFNGLBEGINOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glBeginOcclusionQueryNV")) == NULL) || r; + r = ((glDeleteOcclusionQueriesNV = (PFNGLDELETEOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteOcclusionQueriesNV")) == NULL) || r; + r = ((glEndOcclusionQueryNV = (PFNGLENDOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glEndOcclusionQueryNV")) == NULL) || r; + r = ((glGenOcclusionQueriesNV = (PFNGLGENOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glGenOcclusionQueriesNV")) == NULL) || r; + r = ((glGetOcclusionQueryivNV = (PFNGLGETOCCLUSIONQUERYIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryivNV")) == NULL) || r; + r = ((glGetOcclusionQueryuivNV = (PFNGLGETOCCLUSIONQUERYUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryuivNV")) == NULL) || r; + r = ((glIsOcclusionQueryNV = (PFNGLISOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glIsOcclusionQueryNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_occlusion_query */ + +#ifdef GL_NV_parameter_buffer_object + +static GLboolean _glewInit_GL_NV_parameter_buffer_object () +{ + GLboolean r = GL_FALSE; + + r = ((glProgramBufferParametersIivNV = (PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIivNV")) == NULL) || r; + r = ((glProgramBufferParametersIuivNV = (PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIuivNV")) == NULL) || r; + r = ((glProgramBufferParametersfvNV = (PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersfvNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_parameter_buffer_object */ + +#ifdef GL_NV_path_rendering + +static GLboolean _glewInit_GL_NV_path_rendering () +{ + GLboolean r = GL_FALSE; + + r = ((glCopyPathNV = (PFNGLCOPYPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCopyPathNV")) == NULL) || r; + r = ((glCoverFillPathInstancedNV = (PFNGLCOVERFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glCoverFillPathInstancedNV")) == NULL) || r; + r = ((glCoverFillPathNV = (PFNGLCOVERFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCoverFillPathNV")) == NULL) || r; + r = ((glCoverStrokePathInstancedNV = (PFNGLCOVERSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glCoverStrokePathInstancedNV")) == NULL) || r; + r = ((glCoverStrokePathNV = (PFNGLCOVERSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCoverStrokePathNV")) == NULL) || r; + r = ((glDeletePathsNV = (PFNGLDELETEPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glDeletePathsNV")) == NULL) || r; + r = ((glGenPathsNV = (PFNGLGENPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glGenPathsNV")) == NULL) || r; + r = ((glGetPathColorGenfvNV = (PFNGLGETPATHCOLORGENFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathColorGenfvNV")) == NULL) || r; + r = ((glGetPathColorGenivNV = (PFNGLGETPATHCOLORGENIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathColorGenivNV")) == NULL) || r; + r = ((glGetPathCommandsNV = (PFNGLGETPATHCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathCommandsNV")) == NULL) || r; + r = ((glGetPathCoordsNV = (PFNGLGETPATHCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathCoordsNV")) == NULL) || r; + r = ((glGetPathDashArrayNV = (PFNGLGETPATHDASHARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathDashArrayNV")) == NULL) || r; + r = ((glGetPathLengthNV = (PFNGLGETPATHLENGTHNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathLengthNV")) == NULL) || r; + r = ((glGetPathMetricRangeNV = (PFNGLGETPATHMETRICRANGENVPROC)glewGetProcAddress((const GLubyte*)"glGetPathMetricRangeNV")) == NULL) || r; + r = ((glGetPathMetricsNV = (PFNGLGETPATHMETRICSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathMetricsNV")) == NULL) || r; + r = ((glGetPathParameterfvNV = (PFNGLGETPATHPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathParameterfvNV")) == NULL) || r; + r = ((glGetPathParameterivNV = (PFNGLGETPATHPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathParameterivNV")) == NULL) || r; + r = ((glGetPathSpacingNV = (PFNGLGETPATHSPACINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathSpacingNV")) == NULL) || r; + r = ((glGetPathTexGenfvNV = (PFNGLGETPATHTEXGENFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathTexGenfvNV")) == NULL) || r; + r = ((glGetPathTexGenivNV = (PFNGLGETPATHTEXGENIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathTexGenivNV")) == NULL) || r; + r = ((glGetProgramResourcefvNV = (PFNGLGETPROGRAMRESOURCEFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourcefvNV")) == NULL) || r; + r = ((glInterpolatePathsNV = (PFNGLINTERPOLATEPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glInterpolatePathsNV")) == NULL) || r; + r = ((glIsPathNV = (PFNGLISPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPathNV")) == NULL) || r; + r = ((glIsPointInFillPathNV = (PFNGLISPOINTINFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPointInFillPathNV")) == NULL) || r; + r = ((glIsPointInStrokePathNV = (PFNGLISPOINTINSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPointInStrokePathNV")) == NULL) || r; + r = ((glMatrixLoad3x2fNV = (PFNGLMATRIXLOAD3X2FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoad3x2fNV")) == NULL) || r; + r = ((glMatrixLoad3x3fNV = (PFNGLMATRIXLOAD3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoad3x3fNV")) == NULL) || r; + r = ((glMatrixLoadTranspose3x3fNV = (PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTranspose3x3fNV")) == NULL) || r; + r = ((glMatrixMult3x2fNV = (PFNGLMATRIXMULT3X2FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMult3x2fNV")) == NULL) || r; + r = ((glMatrixMult3x3fNV = (PFNGLMATRIXMULT3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMult3x3fNV")) == NULL) || r; + r = ((glMatrixMultTranspose3x3fNV = (PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTranspose3x3fNV")) == NULL) || r; + r = ((glPathColorGenNV = (PFNGLPATHCOLORGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathColorGenNV")) == NULL) || r; + r = ((glPathCommandsNV = (PFNGLPATHCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathCommandsNV")) == NULL) || r; + r = ((glPathCoordsNV = (PFNGLPATHCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathCoordsNV")) == NULL) || r; + r = ((glPathCoverDepthFuncNV = (PFNGLPATHCOVERDEPTHFUNCNVPROC)glewGetProcAddress((const GLubyte*)"glPathCoverDepthFuncNV")) == NULL) || r; + r = ((glPathDashArrayNV = (PFNGLPATHDASHARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathDashArrayNV")) == NULL) || r; + r = ((glPathFogGenNV = (PFNGLPATHFOGGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathFogGenNV")) == NULL) || r; + r = ((glPathGlyphIndexArrayNV = (PFNGLPATHGLYPHINDEXARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphIndexArrayNV")) == NULL) || r; + r = ((glPathGlyphIndexRangeNV = (PFNGLPATHGLYPHINDEXRANGENVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphIndexRangeNV")) == NULL) || r; + r = ((glPathGlyphRangeNV = (PFNGLPATHGLYPHRANGENVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphRangeNV")) == NULL) || r; + r = ((glPathGlyphsNV = (PFNGLPATHGLYPHSNVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphsNV")) == NULL) || r; + r = ((glPathMemoryGlyphIndexArrayNV = (PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathMemoryGlyphIndexArrayNV")) == NULL) || r; + r = ((glPathParameterfNV = (PFNGLPATHPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterfNV")) == NULL) || r; + r = ((glPathParameterfvNV = (PFNGLPATHPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterfvNV")) == NULL) || r; + r = ((glPathParameteriNV = (PFNGLPATHPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPathParameteriNV")) == NULL) || r; + r = ((glPathParameterivNV = (PFNGLPATHPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterivNV")) == NULL) || r; + r = ((glPathStencilDepthOffsetNV = (PFNGLPATHSTENCILDEPTHOFFSETNVPROC)glewGetProcAddress((const GLubyte*)"glPathStencilDepthOffsetNV")) == NULL) || r; + r = ((glPathStencilFuncNV = (PFNGLPATHSTENCILFUNCNVPROC)glewGetProcAddress((const GLubyte*)"glPathStencilFuncNV")) == NULL) || r; + r = ((glPathStringNV = (PFNGLPATHSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glPathStringNV")) == NULL) || r; + r = ((glPathSubCommandsNV = (PFNGLPATHSUBCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathSubCommandsNV")) == NULL) || r; + r = ((glPathSubCoordsNV = (PFNGLPATHSUBCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathSubCoordsNV")) == NULL) || r; + r = ((glPathTexGenNV = (PFNGLPATHTEXGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathTexGenNV")) == NULL) || r; + r = ((glPointAlongPathNV = (PFNGLPOINTALONGPATHNVPROC)glewGetProcAddress((const GLubyte*)"glPointAlongPathNV")) == NULL) || r; + r = ((glProgramPathFragmentInputGenNV = (PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC)glewGetProcAddress((const GLubyte*)"glProgramPathFragmentInputGenNV")) == NULL) || r; + r = ((glStencilFillPathInstancedNV = (PFNGLSTENCILFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilFillPathInstancedNV")) == NULL) || r; + r = ((glStencilFillPathNV = (PFNGLSTENCILFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilFillPathNV")) == NULL) || r; + r = ((glStencilStrokePathInstancedNV = (PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilStrokePathInstancedNV")) == NULL) || r; + r = ((glStencilStrokePathNV = (PFNGLSTENCILSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilStrokePathNV")) == NULL) || r; + r = ((glStencilThenCoverFillPathInstancedNV = (PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverFillPathInstancedNV")) == NULL) || r; + r = ((glStencilThenCoverFillPathNV = (PFNGLSTENCILTHENCOVERFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverFillPathNV")) == NULL) || r; + r = ((glStencilThenCoverStrokePathInstancedNV = (PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverStrokePathInstancedNV")) == NULL) || r; + r = ((glStencilThenCoverStrokePathNV = (PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverStrokePathNV")) == NULL) || r; + r = ((glTransformPathNV = (PFNGLTRANSFORMPATHNVPROC)glewGetProcAddress((const GLubyte*)"glTransformPathNV")) == NULL) || r; + r = ((glWeightPathsNV = (PFNGLWEIGHTPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glWeightPathsNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_path_rendering */ + +#ifdef GL_NV_pixel_data_range + +static GLboolean _glewInit_GL_NV_pixel_data_range () +{ + GLboolean r = GL_FALSE; + + r = ((glFlushPixelDataRangeNV = (PFNGLFLUSHPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushPixelDataRangeNV")) == NULL) || r; + r = ((glPixelDataRangeNV = (PFNGLPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glPixelDataRangeNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_pixel_data_range */ + +#ifdef GL_NV_point_sprite + +static GLboolean _glewInit_GL_NV_point_sprite () +{ + GLboolean r = GL_FALSE; + + r = ((glPointParameteriNV = (PFNGLPOINTPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriNV")) == NULL) || r; + r = ((glPointParameterivNV = (PFNGLPOINTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterivNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_point_sprite */ + +#ifdef GL_NV_polygon_mode + +static GLboolean _glewInit_GL_NV_polygon_mode () +{ + GLboolean r = GL_FALSE; + + r = ((glPolygonModeNV = (PFNGLPOLYGONMODENVPROC)glewGetProcAddress((const GLubyte*)"glPolygonModeNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_polygon_mode */ + +#ifdef GL_NV_present_video + +static GLboolean _glewInit_GL_NV_present_video () +{ + GLboolean r = GL_FALSE; + + r = ((glGetVideoi64vNV = (PFNGLGETVIDEOI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoi64vNV")) == NULL) || r; + r = ((glGetVideoivNV = (PFNGLGETVIDEOIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoivNV")) == NULL) || r; + r = ((glGetVideoui64vNV = (PFNGLGETVIDEOUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoui64vNV")) == NULL) || r; + r = ((glGetVideouivNV = (PFNGLGETVIDEOUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideouivNV")) == NULL) || r; + r = ((glPresentFrameDualFillNV = (PFNGLPRESENTFRAMEDUALFILLNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameDualFillNV")) == NULL) || r; + r = ((glPresentFrameKeyedNV = (PFNGLPRESENTFRAMEKEYEDNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameKeyedNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_present_video */ + +#ifdef GL_NV_primitive_restart + +static GLboolean _glewInit_GL_NV_primitive_restart () +{ + GLboolean r = GL_FALSE; + + r = ((glPrimitiveRestartIndexNV = (PFNGLPRIMITIVERESTARTINDEXNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndexNV")) == NULL) || r; + r = ((glPrimitiveRestartNV = (PFNGLPRIMITIVERESTARTNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_primitive_restart */ + +#ifdef GL_NV_register_combiners + +static GLboolean _glewInit_GL_NV_register_combiners () +{ + GLboolean r = GL_FALSE; + + r = ((glCombinerInputNV = (PFNGLCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerInputNV")) == NULL) || r; + r = ((glCombinerOutputNV = (PFNGLCOMBINEROUTPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerOutputNV")) == NULL) || r; + r = ((glCombinerParameterfNV = (PFNGLCOMBINERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfNV")) == NULL) || r; + r = ((glCombinerParameterfvNV = (PFNGLCOMBINERPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfvNV")) == NULL) || r; + r = ((glCombinerParameteriNV = (PFNGLCOMBINERPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameteriNV")) == NULL) || r; + r = ((glCombinerParameterivNV = (PFNGLCOMBINERPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterivNV")) == NULL) || r; + r = ((glFinalCombinerInputNV = (PFNGLFINALCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glFinalCombinerInputNV")) == NULL) || r; + r = ((glGetCombinerInputParameterfvNV = (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterfvNV")) == NULL) || r; + r = ((glGetCombinerInputParameterivNV = (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterivNV")) == NULL) || r; + r = ((glGetCombinerOutputParameterfvNV = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterfvNV")) == NULL) || r; + r = ((glGetCombinerOutputParameterivNV = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterivNV")) == NULL) || r; + r = ((glGetFinalCombinerInputParameterfvNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterfvNV")) == NULL) || r; + r = ((glGetFinalCombinerInputParameterivNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterivNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_register_combiners */ + +#ifdef GL_NV_register_combiners2 + +static GLboolean _glewInit_GL_NV_register_combiners2 () +{ + GLboolean r = GL_FALSE; + + r = ((glCombinerStageParameterfvNV = (PFNGLCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerStageParameterfvNV")) == NULL) || r; + r = ((glGetCombinerStageParameterfvNV = (PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerStageParameterfvNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_register_combiners2 */ + +#ifdef GL_NV_sample_locations + +static GLboolean _glewInit_GL_NV_sample_locations () +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferSampleLocationsfvNV = (PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSampleLocationsfvNV")) == NULL) || r; + r = ((glNamedFramebufferSampleLocationsfvNV = (PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSampleLocationsfvNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_sample_locations */ + +#ifdef GL_NV_shader_buffer_load + +static GLboolean _glewInit_GL_NV_shader_buffer_load () +{ + GLboolean r = GL_FALSE; + + r = ((glGetBufferParameterui64vNV = (PFNGLGETBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterui64vNV")) == NULL) || r; + r = ((glGetIntegerui64vNV = (PFNGLGETINTEGERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64vNV")) == NULL) || r; + r = ((glGetNamedBufferParameterui64vNV = (PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameterui64vNV")) == NULL) || r; + r = ((glIsBufferResidentNV = (PFNGLISBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsBufferResidentNV")) == NULL) || r; + r = ((glIsNamedBufferResidentNV = (PFNGLISNAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsNamedBufferResidentNV")) == NULL) || r; + r = ((glMakeBufferNonResidentNV = (PFNGLMAKEBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferNonResidentNV")) == NULL) || r; + r = ((glMakeBufferResidentNV = (PFNGLMAKEBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferResidentNV")) == NULL) || r; + r = ((glMakeNamedBufferNonResidentNV = (PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferNonResidentNV")) == NULL) || r; + r = ((glMakeNamedBufferResidentNV = (PFNGLMAKENAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferResidentNV")) == NULL) || r; + r = ((glProgramUniformui64NV = (PFNGLPROGRAMUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64NV")) == NULL) || r; + r = ((glProgramUniformui64vNV = (PFNGLPROGRAMUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64vNV")) == NULL) || r; + r = ((glUniformui64NV = (PFNGLUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64NV")) == NULL) || r; + r = ((glUniformui64vNV = (PFNGLUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64vNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_shader_buffer_load */ + +#ifdef GL_NV_texture_array + +static GLboolean _glewInit_GL_NV_texture_array () +{ + GLboolean r = GL_FALSE; + + r = ((glCompressedTexImage3DNV = (PFNGLCOMPRESSEDTEXIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3DNV")) == NULL) || r; + r = ((glCompressedTexSubImage3DNV = (PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3DNV")) == NULL) || r; + r = ((glCopyTexSubImage3DNV = (PFNGLCOPYTEXSUBIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3DNV")) == NULL) || r; + r = ((glFramebufferTextureLayerNV = (PFNGLFRAMEBUFFERTEXTURELAYERNVPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerNV")) == NULL) || r; + r = ((glTexImage3DNV = (PFNGLTEXIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DNV")) == NULL) || r; + r = ((glTexSubImage3DNV = (PFNGLTEXSUBIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3DNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_texture_array */ + +#ifdef GL_NV_texture_barrier + +static GLboolean _glewInit_GL_NV_texture_barrier () +{ + GLboolean r = GL_FALSE; + + r = ((glTextureBarrierNV = (PFNGLTEXTUREBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glTextureBarrierNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_texture_barrier */ + +#ifdef GL_NV_texture_multisample + +static GLboolean _glewInit_GL_NV_texture_multisample () +{ + GLboolean r = GL_FALSE; + + r = ((glTexImage2DMultisampleCoverageNV = (PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTexImage2DMultisampleCoverageNV")) == NULL) || r; + r = ((glTexImage3DMultisampleCoverageNV = (PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DMultisampleCoverageNV")) == NULL) || r; + r = ((glTextureImage2DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DMultisampleCoverageNV")) == NULL) || r; + r = ((glTextureImage2DMultisampleNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DMultisampleNV")) == NULL) || r; + r = ((glTextureImage3DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DMultisampleCoverageNV")) == NULL) || r; + r = ((glTextureImage3DMultisampleNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DMultisampleNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_texture_multisample */ + +#ifdef GL_NV_transform_feedback + +static GLboolean _glewInit_GL_NV_transform_feedback () +{ + GLboolean r = GL_FALSE; + + r = ((glActiveVaryingNV = (PFNGLACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glActiveVaryingNV")) == NULL) || r; + r = ((glBeginTransformFeedbackNV = (PFNGLBEGINTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedbackNV")) == NULL) || r; + r = ((glBindBufferBaseNV = (PFNGLBINDBUFFERBASENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBaseNV")) == NULL) || r; + r = ((glBindBufferOffsetNV = (PFNGLBINDBUFFEROFFSETNVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferOffsetNV")) == NULL) || r; + r = ((glBindBufferRangeNV = (PFNGLBINDBUFFERRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRangeNV")) == NULL) || r; + r = ((glEndTransformFeedbackNV = (PFNGLENDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedbackNV")) == NULL) || r; + r = ((glGetActiveVaryingNV = (PFNGLGETACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveVaryingNV")) == NULL) || r; + r = ((glGetTransformFeedbackVaryingNV = (PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVaryingNV")) == NULL) || r; + r = ((glGetVaryingLocationNV = (PFNGLGETVARYINGLOCATIONNVPROC)glewGetProcAddress((const GLubyte*)"glGetVaryingLocationNV")) == NULL) || r; + r = ((glTransformFeedbackAttribsNV = (PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackAttribsNV")) == NULL) || r; + r = ((glTransformFeedbackVaryingsNV = (PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryingsNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_transform_feedback */ + +#ifdef GL_NV_transform_feedback2 + +static GLboolean _glewInit_GL_NV_transform_feedback2 () +{ + GLboolean r = GL_FALSE; + + r = ((glBindTransformFeedbackNV = (PFNGLBINDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedbackNV")) == NULL) || r; + r = ((glDeleteTransformFeedbacksNV = (PFNGLDELETETRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacksNV")) == NULL) || r; + r = ((glDrawTransformFeedbackNV = (PFNGLDRAWTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackNV")) == NULL) || r; + r = ((glGenTransformFeedbacksNV = (PFNGLGENTRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacksNV")) == NULL) || r; + r = ((glIsTransformFeedbackNV = (PFNGLISTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedbackNV")) == NULL) || r; + r = ((glPauseTransformFeedbackNV = (PFNGLPAUSETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedbackNV")) == NULL) || r; + r = ((glResumeTransformFeedbackNV = (PFNGLRESUMETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedbackNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_transform_feedback2 */ + +#ifdef GL_NV_vdpau_interop + +static GLboolean _glewInit_GL_NV_vdpau_interop () +{ + GLboolean r = GL_FALSE; + + r = ((glVDPAUFiniNV = (PFNGLVDPAUFININVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUFiniNV")) == NULL) || r; + r = ((glVDPAUGetSurfaceivNV = (PFNGLVDPAUGETSURFACEIVNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUGetSurfaceivNV")) == NULL) || r; + r = ((glVDPAUInitNV = (PFNGLVDPAUINITNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUInitNV")) == NULL) || r; + r = ((glVDPAUIsSurfaceNV = (PFNGLVDPAUISSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUIsSurfaceNV")) == NULL) || r; + r = ((glVDPAUMapSurfacesNV = (PFNGLVDPAUMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUMapSurfacesNV")) == NULL) || r; + r = ((glVDPAURegisterOutputSurfaceNV = (PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterOutputSurfaceNV")) == NULL) || r; + r = ((glVDPAURegisterVideoSurfaceNV = (PFNGLVDPAUREGISTERVIDEOSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterVideoSurfaceNV")) == NULL) || r; + r = ((glVDPAUSurfaceAccessNV = (PFNGLVDPAUSURFACEACCESSNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUSurfaceAccessNV")) == NULL) || r; + r = ((glVDPAUUnmapSurfacesNV = (PFNGLVDPAUUNMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnmapSurfacesNV")) == NULL) || r; + r = ((glVDPAUUnregisterSurfaceNV = (PFNGLVDPAUUNREGISTERSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnregisterSurfaceNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_vdpau_interop */ + +#ifdef GL_NV_vertex_array_range + +static GLboolean _glewInit_GL_NV_vertex_array_range () +{ + GLboolean r = GL_FALSE; + + r = ((glFlushVertexArrayRangeNV = (PFNGLFLUSHVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeNV")) == NULL) || r; + r = ((glVertexArrayRangeNV = (PFNGLVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_vertex_array_range */ + +#ifdef GL_NV_vertex_attrib_integer_64bit + +static GLboolean _glewInit_GL_NV_vertex_attrib_integer_64bit () +{ + GLboolean r = GL_FALSE; + + r = ((glGetVertexAttribLi64vNV = (PFNGLGETVERTEXATTRIBLI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLi64vNV")) == NULL) || r; + r = ((glGetVertexAttribLui64vNV = (PFNGLGETVERTEXATTRIBLUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vNV")) == NULL) || r; + r = ((glVertexAttribL1i64NV = (PFNGLVERTEXATTRIBL1I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64NV")) == NULL) || r; + r = ((glVertexAttribL1i64vNV = (PFNGLVERTEXATTRIBL1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64vNV")) == NULL) || r; + r = ((glVertexAttribL1ui64NV = (PFNGLVERTEXATTRIBL1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64NV")) == NULL) || r; + r = ((glVertexAttribL1ui64vNV = (PFNGLVERTEXATTRIBL1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vNV")) == NULL) || r; + r = ((glVertexAttribL2i64NV = (PFNGLVERTEXATTRIBL2I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64NV")) == NULL) || r; + r = ((glVertexAttribL2i64vNV = (PFNGLVERTEXATTRIBL2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64vNV")) == NULL) || r; + r = ((glVertexAttribL2ui64NV = (PFNGLVERTEXATTRIBL2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64NV")) == NULL) || r; + r = ((glVertexAttribL2ui64vNV = (PFNGLVERTEXATTRIBL2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64vNV")) == NULL) || r; + r = ((glVertexAttribL3i64NV = (PFNGLVERTEXATTRIBL3I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64NV")) == NULL) || r; + r = ((glVertexAttribL3i64vNV = (PFNGLVERTEXATTRIBL3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64vNV")) == NULL) || r; + r = ((glVertexAttribL3ui64NV = (PFNGLVERTEXATTRIBL3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64NV")) == NULL) || r; + r = ((glVertexAttribL3ui64vNV = (PFNGLVERTEXATTRIBL3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64vNV")) == NULL) || r; + r = ((glVertexAttribL4i64NV = (PFNGLVERTEXATTRIBL4I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64NV")) == NULL) || r; + r = ((glVertexAttribL4i64vNV = (PFNGLVERTEXATTRIBL4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64vNV")) == NULL) || r; + r = ((glVertexAttribL4ui64NV = (PFNGLVERTEXATTRIBL4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64NV")) == NULL) || r; + r = ((glVertexAttribL4ui64vNV = (PFNGLVERTEXATTRIBL4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64vNV")) == NULL) || r; + r = ((glVertexAttribLFormatNV = (PFNGLVERTEXATTRIBLFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLFormatNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_vertex_attrib_integer_64bit */ + +#ifdef GL_NV_vertex_buffer_unified_memory + +static GLboolean _glewInit_GL_NV_vertex_buffer_unified_memory () +{ + GLboolean r = GL_FALSE; + + r = ((glBufferAddressRangeNV = (PFNGLBUFFERADDRESSRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBufferAddressRangeNV")) == NULL) || r; + r = ((glColorFormatNV = (PFNGLCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glColorFormatNV")) == NULL) || r; + r = ((glEdgeFlagFormatNV = (PFNGLEDGEFLAGFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagFormatNV")) == NULL) || r; + r = ((glFogCoordFormatNV = (PFNGLFOGCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordFormatNV")) == NULL) || r; + r = ((glGetIntegerui64i_vNV = (PFNGLGETINTEGERUI64I_VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64i_vNV")) == NULL) || r; + r = ((glIndexFormatNV = (PFNGLINDEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glIndexFormatNV")) == NULL) || r; + r = ((glNormalFormatNV = (PFNGLNORMALFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glNormalFormatNV")) == NULL) || r; + r = ((glSecondaryColorFormatNV = (PFNGLSECONDARYCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorFormatNV")) == NULL) || r; + r = ((glTexCoordFormatNV = (PFNGLTEXCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordFormatNV")) == NULL) || r; + r = ((glVertexAttribFormatNV = (PFNGLVERTEXATTRIBFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribFormatNV")) == NULL) || r; + r = ((glVertexAttribIFormatNV = (PFNGLVERTEXATTRIBIFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIFormatNV")) == NULL) || r; + r = ((glVertexFormatNV = (PFNGLVERTEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexFormatNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_vertex_buffer_unified_memory */ + +#ifdef GL_NV_vertex_program + +static GLboolean _glewInit_GL_NV_vertex_program () +{ + GLboolean r = GL_FALSE; + + r = ((glAreProgramsResidentNV = (PFNGLAREPROGRAMSRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glAreProgramsResidentNV")) == NULL) || r; + r = ((glBindProgramNV = (PFNGLBINDPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glBindProgramNV")) == NULL) || r; + r = ((glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsNV")) == NULL) || r; + r = ((glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glExecuteProgramNV")) == NULL) || r; + r = ((glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsNV")) == NULL) || r; + r = ((glGetProgramParameterdvNV = (PFNGLGETPROGRAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterdvNV")) == NULL) || r; + r = ((glGetProgramParameterfvNV = (PFNGLGETPROGRAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterfvNV")) == NULL) || r; + r = ((glGetProgramStringNV = (PFNGLGETPROGRAMSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringNV")) == NULL) || r; + r = ((glGetProgramivNV = (PFNGLGETPROGRAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivNV")) == NULL) || r; + r = ((glGetTrackMatrixivNV = (PFNGLGETTRACKMATRIXIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetTrackMatrixivNV")) == NULL) || r; + r = ((glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervNV")) == NULL) || r; + r = ((glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvNV")) == NULL) || r; + r = ((glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvNV")) == NULL) || r; + r = ((glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivNV")) == NULL) || r; + r = ((glIsProgramNV = (PFNGLISPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glIsProgramNV")) == NULL) || r; + r = ((glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glLoadProgramNV")) == NULL) || r; + r = ((glProgramParameter4dNV = (PFNGLPROGRAMPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dNV")) == NULL) || r; + r = ((glProgramParameter4dvNV = (PFNGLPROGRAMPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dvNV")) == NULL) || r; + r = ((glProgramParameter4fNV = (PFNGLPROGRAMPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fNV")) == NULL) || r; + r = ((glProgramParameter4fvNV = (PFNGLPROGRAMPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fvNV")) == NULL) || r; + r = ((glProgramParameters4dvNV = (PFNGLPROGRAMPARAMETERS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4dvNV")) == NULL) || r; + r = ((glProgramParameters4fvNV = (PFNGLPROGRAMPARAMETERS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4fvNV")) == NULL) || r; + r = ((glRequestResidentProgramsNV = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glRequestResidentProgramsNV")) == NULL) || r; + r = ((glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC)glewGetProcAddress((const GLubyte*)"glTrackMatrixNV")) == NULL) || r; + r = ((glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dNV")) == NULL) || r; + r = ((glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvNV")) == NULL) || r; + r = ((glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fNV")) == NULL) || r; + r = ((glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvNV")) == NULL) || r; + r = ((glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sNV")) == NULL) || r; + r = ((glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svNV")) == NULL) || r; + r = ((glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dNV")) == NULL) || r; + r = ((glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvNV")) == NULL) || r; + r = ((glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fNV")) == NULL) || r; + r = ((glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvNV")) == NULL) || r; + r = ((glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sNV")) == NULL) || r; + r = ((glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svNV")) == NULL) || r; + r = ((glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dNV")) == NULL) || r; + r = ((glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvNV")) == NULL) || r; + r = ((glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fNV")) == NULL) || r; + r = ((glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvNV")) == NULL) || r; + r = ((glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sNV")) == NULL) || r; + r = ((glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svNV")) == NULL) || r; + r = ((glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dNV")) == NULL) || r; + r = ((glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvNV")) == NULL) || r; + r = ((glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fNV")) == NULL) || r; + r = ((glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvNV")) == NULL) || r; + r = ((glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sNV")) == NULL) || r; + r = ((glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svNV")) == NULL) || r; + r = ((glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubNV")) == NULL) || r; + r = ((glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvNV")) == NULL) || r; + r = ((glVertexAttribPointerNV = (PFNGLVERTEXATTRIBPOINTERNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerNV")) == NULL) || r; + r = ((glVertexAttribs1dvNV = (PFNGLVERTEXATTRIBS1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1dvNV")) == NULL) || r; + r = ((glVertexAttribs1fvNV = (PFNGLVERTEXATTRIBS1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1fvNV")) == NULL) || r; + r = ((glVertexAttribs1svNV = (PFNGLVERTEXATTRIBS1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1svNV")) == NULL) || r; + r = ((glVertexAttribs2dvNV = (PFNGLVERTEXATTRIBS2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2dvNV")) == NULL) || r; + r = ((glVertexAttribs2fvNV = (PFNGLVERTEXATTRIBS2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2fvNV")) == NULL) || r; + r = ((glVertexAttribs2svNV = (PFNGLVERTEXATTRIBS2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2svNV")) == NULL) || r; + r = ((glVertexAttribs3dvNV = (PFNGLVERTEXATTRIBS3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3dvNV")) == NULL) || r; + r = ((glVertexAttribs3fvNV = (PFNGLVERTEXATTRIBS3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3fvNV")) == NULL) || r; + r = ((glVertexAttribs3svNV = (PFNGLVERTEXATTRIBS3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3svNV")) == NULL) || r; + r = ((glVertexAttribs4dvNV = (PFNGLVERTEXATTRIBS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4dvNV")) == NULL) || r; + r = ((glVertexAttribs4fvNV = (PFNGLVERTEXATTRIBS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4fvNV")) == NULL) || r; + r = ((glVertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4svNV")) == NULL) || r; + r = ((glVertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4ubvNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_vertex_program */ + +#ifdef GL_NV_video_capture + +static GLboolean _glewInit_GL_NV_video_capture () +{ + GLboolean r = GL_FALSE; + + r = ((glBeginVideoCaptureNV = (PFNGLBEGINVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glBeginVideoCaptureNV")) == NULL) || r; + r = ((glBindVideoCaptureStreamBufferNV = (PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glBindVideoCaptureStreamBufferNV")) == NULL) || r; + r = ((glBindVideoCaptureStreamTextureNV = (PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC)glewGetProcAddress((const GLubyte*)"glBindVideoCaptureStreamTextureNV")) == NULL) || r; + r = ((glEndVideoCaptureNV = (PFNGLENDVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glEndVideoCaptureNV")) == NULL) || r; + r = ((glGetVideoCaptureStreamdvNV = (PFNGLGETVIDEOCAPTURESTREAMDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamdvNV")) == NULL) || r; + r = ((glGetVideoCaptureStreamfvNV = (PFNGLGETVIDEOCAPTURESTREAMFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamfvNV")) == NULL) || r; + r = ((glGetVideoCaptureStreamivNV = (PFNGLGETVIDEOCAPTURESTREAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamivNV")) == NULL) || r; + r = ((glGetVideoCaptureivNV = (PFNGLGETVIDEOCAPTUREIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureivNV")) == NULL) || r; + r = ((glVideoCaptureNV = (PFNGLVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureNV")) == NULL) || r; + r = ((glVideoCaptureStreamParameterdvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterdvNV")) == NULL) || r; + r = ((glVideoCaptureStreamParameterfvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterfvNV")) == NULL) || r; + r = ((glVideoCaptureStreamParameterivNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterivNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_video_capture */ + +#ifdef GL_NV_viewport_array + +static GLboolean _glewInit_GL_NV_viewport_array () +{ + GLboolean r = GL_FALSE; + + r = ((glDepthRangeArrayfvNV = (PFNGLDEPTHRANGEARRAYFVNVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeArrayfvNV")) == NULL) || r; + r = ((glDepthRangeIndexedfNV = (PFNGLDEPTHRANGEINDEXEDFNVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeIndexedfNV")) == NULL) || r; + r = ((glDisableiNV = (PFNGLDISABLEINVPROC)glewGetProcAddress((const GLubyte*)"glDisableiNV")) == NULL) || r; + r = ((glEnableiNV = (PFNGLENABLEINVPROC)glewGetProcAddress((const GLubyte*)"glEnableiNV")) == NULL) || r; + r = ((glGetFloati_vNV = (PFNGLGETFLOATI_VNVPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_vNV")) == NULL) || r; + r = ((glIsEnablediNV = (PFNGLISENABLEDINVPROC)glewGetProcAddress((const GLubyte*)"glIsEnablediNV")) == NULL) || r; + r = ((glScissorArrayvNV = (PFNGLSCISSORARRAYVNVPROC)glewGetProcAddress((const GLubyte*)"glScissorArrayvNV")) == NULL) || r; + r = ((glScissorIndexedNV = (PFNGLSCISSORINDEXEDNVPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexedNV")) == NULL) || r; + r = ((glScissorIndexedvNV = (PFNGLSCISSORINDEXEDVNVPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexedvNV")) == NULL) || r; + r = ((glViewportArrayvNV = (PFNGLVIEWPORTARRAYVNVPROC)glewGetProcAddress((const GLubyte*)"glViewportArrayvNV")) == NULL) || r; + r = ((glViewportIndexedfNV = (PFNGLVIEWPORTINDEXEDFNVPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedfNV")) == NULL) || r; + r = ((glViewportIndexedfvNV = (PFNGLVIEWPORTINDEXEDFVNVPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedfvNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_viewport_array */ + +#ifdef GL_NV_viewport_swizzle + +static GLboolean _glewInit_GL_NV_viewport_swizzle () +{ + GLboolean r = GL_FALSE; + + r = ((glViewportSwizzleNV = (PFNGLVIEWPORTSWIZZLENVPROC)glewGetProcAddress((const GLubyte*)"glViewportSwizzleNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_viewport_swizzle */ + +#ifdef GL_OVR_multiview + +static GLboolean _glewInit_GL_OVR_multiview () +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferTextureMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureMultiviewOVR")) == NULL) || r; + + return r; +} + +#endif /* GL_OVR_multiview */ + +#ifdef GL_OVR_multiview_multisampled_render_to_texture + +static GLboolean _glewInit_GL_OVR_multiview_multisampled_render_to_texture () +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferTextureMultisampleMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureMultisampleMultiviewOVR")) == NULL) || r; + + return r; +} + +#endif /* GL_OVR_multiview_multisampled_render_to_texture */ + +#ifdef GL_QCOM_alpha_test + +static GLboolean _glewInit_GL_QCOM_alpha_test () +{ + GLboolean r = GL_FALSE; + + r = ((glAlphaFuncQCOM = (PFNGLALPHAFUNCQCOMPROC)glewGetProcAddress((const GLubyte*)"glAlphaFuncQCOM")) == NULL) || r; + + return r; +} + +#endif /* GL_QCOM_alpha_test */ + +#ifdef GL_QCOM_driver_control + +static GLboolean _glewInit_GL_QCOM_driver_control () +{ + GLboolean r = GL_FALSE; + + r = ((glDisableDriverControlQCOM = (PFNGLDISABLEDRIVERCONTROLQCOMPROC)glewGetProcAddress((const GLubyte*)"glDisableDriverControlQCOM")) == NULL) || r; + r = ((glEnableDriverControlQCOM = (PFNGLENABLEDRIVERCONTROLQCOMPROC)glewGetProcAddress((const GLubyte*)"glEnableDriverControlQCOM")) == NULL) || r; + r = ((glGetDriverControlStringQCOM = (PFNGLGETDRIVERCONTROLSTRINGQCOMPROC)glewGetProcAddress((const GLubyte*)"glGetDriverControlStringQCOM")) == NULL) || r; + r = ((glGetDriverControlsQCOM = (PFNGLGETDRIVERCONTROLSQCOMPROC)glewGetProcAddress((const GLubyte*)"glGetDriverControlsQCOM")) == NULL) || r; + + return r; +} + +#endif /* GL_QCOM_driver_control */ + +#ifdef GL_QCOM_extended_get + +static GLboolean _glewInit_GL_QCOM_extended_get () +{ + GLboolean r = GL_FALSE; + + r = ((glExtGetBufferPointervQCOM = (PFNGLEXTGETBUFFERPOINTERVQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetBufferPointervQCOM")) == NULL) || r; + r = ((glExtGetBuffersQCOM = (PFNGLEXTGETBUFFERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetBuffersQCOM")) == NULL) || r; + r = ((glExtGetFramebuffersQCOM = (PFNGLEXTGETFRAMEBUFFERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetFramebuffersQCOM")) == NULL) || r; + r = ((glExtGetRenderbuffersQCOM = (PFNGLEXTGETRENDERBUFFERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetRenderbuffersQCOM")) == NULL) || r; + r = ((glExtGetTexLevelParameterivQCOM = (PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetTexLevelParameterivQCOM")) == NULL) || r; + r = ((glExtGetTexSubImageQCOM = (PFNGLEXTGETTEXSUBIMAGEQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetTexSubImageQCOM")) == NULL) || r; + r = ((glExtGetTexturesQCOM = (PFNGLEXTGETTEXTURESQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetTexturesQCOM")) == NULL) || r; + r = ((glExtTexObjectStateOverrideiQCOM = (PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtTexObjectStateOverrideiQCOM")) == NULL) || r; + + return r; +} + +#endif /* GL_QCOM_extended_get */ + +#ifdef GL_QCOM_extended_get2 + +static GLboolean _glewInit_GL_QCOM_extended_get2 () +{ + GLboolean r = GL_FALSE; + + r = ((glExtGetProgramBinarySourceQCOM = (PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetProgramBinarySourceQCOM")) == NULL) || r; + r = ((glExtGetProgramsQCOM = (PFNGLEXTGETPROGRAMSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetProgramsQCOM")) == NULL) || r; + r = ((glExtGetShadersQCOM = (PFNGLEXTGETSHADERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetShadersQCOM")) == NULL) || r; + r = ((glExtIsProgramBinaryQCOM = (PFNGLEXTISPROGRAMBINARYQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtIsProgramBinaryQCOM")) == NULL) || r; + + return r; +} + +#endif /* GL_QCOM_extended_get2 */ + +#ifdef GL_QCOM_framebuffer_foveated + +static GLboolean _glewInit_GL_QCOM_framebuffer_foveated () +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferFoveationConfigQCOM = (PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC)glewGetProcAddress((const GLubyte*)"glFramebufferFoveationConfigQCOM")) == NULL) || r; + r = ((glFramebufferFoveationParametersQCOM = (PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glFramebufferFoveationParametersQCOM")) == NULL) || r; + + return r; +} + +#endif /* GL_QCOM_framebuffer_foveated */ + +#ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent + +static GLboolean _glewInit_GL_QCOM_shader_framebuffer_fetch_noncoherent () +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferFetchBarrierQCOM = (PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC)glewGetProcAddress((const GLubyte*)"glFramebufferFetchBarrierQCOM")) == NULL) || r; + + return r; +} + +#endif /* GL_QCOM_shader_framebuffer_fetch_noncoherent */ + +#ifdef GL_QCOM_tiled_rendering + +static GLboolean _glewInit_GL_QCOM_tiled_rendering () +{ + GLboolean r = GL_FALSE; + + r = ((glEndTilingQCOM = (PFNGLENDTILINGQCOMPROC)glewGetProcAddress((const GLubyte*)"glEndTilingQCOM")) == NULL) || r; + r = ((glStartTilingQCOM = (PFNGLSTARTTILINGQCOMPROC)glewGetProcAddress((const GLubyte*)"glStartTilingQCOM")) == NULL) || r; + + return r; +} + +#endif /* GL_QCOM_tiled_rendering */ + +#ifdef GL_REGAL_ES1_0_compatibility + +static GLboolean _glewInit_GL_REGAL_ES1_0_compatibility () +{ + GLboolean r = GL_FALSE; + + r = ((glAlphaFuncx = (PFNGLALPHAFUNCXPROC)glewGetProcAddress((const GLubyte*)"glAlphaFuncx")) == NULL) || r; + r = ((glClearColorx = (PFNGLCLEARCOLORXPROC)glewGetProcAddress((const GLubyte*)"glClearColorx")) == NULL) || r; + r = ((glClearDepthx = (PFNGLCLEARDEPTHXPROC)glewGetProcAddress((const GLubyte*)"glClearDepthx")) == NULL) || r; + r = ((glColor4x = (PFNGLCOLOR4XPROC)glewGetProcAddress((const GLubyte*)"glColor4x")) == NULL) || r; + r = ((glDepthRangex = (PFNGLDEPTHRANGEXPROC)glewGetProcAddress((const GLubyte*)"glDepthRangex")) == NULL) || r; + r = ((glFogx = (PFNGLFOGXPROC)glewGetProcAddress((const GLubyte*)"glFogx")) == NULL) || r; + r = ((glFogxv = (PFNGLFOGXVPROC)glewGetProcAddress((const GLubyte*)"glFogxv")) == NULL) || r; + r = ((glFrustumf = (PFNGLFRUSTUMFPROC)glewGetProcAddress((const GLubyte*)"glFrustumf")) == NULL) || r; + r = ((glFrustumx = (PFNGLFRUSTUMXPROC)glewGetProcAddress((const GLubyte*)"glFrustumx")) == NULL) || r; + r = ((glLightModelx = (PFNGLLIGHTMODELXPROC)glewGetProcAddress((const GLubyte*)"glLightModelx")) == NULL) || r; + r = ((glLightModelxv = (PFNGLLIGHTMODELXVPROC)glewGetProcAddress((const GLubyte*)"glLightModelxv")) == NULL) || r; + r = ((glLightx = (PFNGLLIGHTXPROC)glewGetProcAddress((const GLubyte*)"glLightx")) == NULL) || r; + r = ((glLightxv = (PFNGLLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glLightxv")) == NULL) || r; + r = ((glLineWidthx = (PFNGLLINEWIDTHXPROC)glewGetProcAddress((const GLubyte*)"glLineWidthx")) == NULL) || r; + r = ((glLoadMatrixx = (PFNGLLOADMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glLoadMatrixx")) == NULL) || r; + r = ((glMaterialx = (PFNGLMATERIALXPROC)glewGetProcAddress((const GLubyte*)"glMaterialx")) == NULL) || r; + r = ((glMaterialxv = (PFNGLMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glMaterialxv")) == NULL) || r; + r = ((glMultMatrixx = (PFNGLMULTMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glMultMatrixx")) == NULL) || r; + r = ((glMultiTexCoord4x = (PFNGLMULTITEXCOORD4XPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4x")) == NULL) || r; + r = ((glNormal3x = (PFNGLNORMAL3XPROC)glewGetProcAddress((const GLubyte*)"glNormal3x")) == NULL) || r; + r = ((glOrthof = (PFNGLORTHOFPROC)glewGetProcAddress((const GLubyte*)"glOrthof")) == NULL) || r; + r = ((glOrthox = (PFNGLORTHOXPROC)glewGetProcAddress((const GLubyte*)"glOrthox")) == NULL) || r; + r = ((glPointSizex = (PFNGLPOINTSIZEXPROC)glewGetProcAddress((const GLubyte*)"glPointSizex")) == NULL) || r; + r = ((glPolygonOffsetx = (PFNGLPOLYGONOFFSETXPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetx")) == NULL) || r; + r = ((glRotatex = (PFNGLROTATEXPROC)glewGetProcAddress((const GLubyte*)"glRotatex")) == NULL) || r; + r = ((glSampleCoveragex = (PFNGLSAMPLECOVERAGEXPROC)glewGetProcAddress((const GLubyte*)"glSampleCoveragex")) == NULL) || r; + r = ((glScalex = (PFNGLSCALEXPROC)glewGetProcAddress((const GLubyte*)"glScalex")) == NULL) || r; + r = ((glTexEnvx = (PFNGLTEXENVXPROC)glewGetProcAddress((const GLubyte*)"glTexEnvx")) == NULL) || r; + r = ((glTexEnvxv = (PFNGLTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glTexEnvxv")) == NULL) || r; + r = ((glTexParameterx = (PFNGLTEXPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glTexParameterx")) == NULL) || r; + r = ((glTranslatex = (PFNGLTRANSLATEXPROC)glewGetProcAddress((const GLubyte*)"glTranslatex")) == NULL) || r; + + return r; +} + +#endif /* GL_REGAL_ES1_0_compatibility */ + +#ifdef GL_REGAL_ES1_1_compatibility + +static GLboolean _glewInit_GL_REGAL_ES1_1_compatibility () +{ + GLboolean r = GL_FALSE; + + r = ((glClipPlanef = (PFNGLCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glClipPlanef")) == NULL) || r; + r = ((glClipPlanex = (PFNGLCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glClipPlanex")) == NULL) || r; + r = ((glGetClipPlanef = (PFNGLGETCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanef")) == NULL) || r; + r = ((glGetClipPlanex = (PFNGLGETCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanex")) == NULL) || r; + r = ((glGetFixedv = (PFNGLGETFIXEDVPROC)glewGetProcAddress((const GLubyte*)"glGetFixedv")) == NULL) || r; + r = ((glGetLightxv = (PFNGLGETLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glGetLightxv")) == NULL) || r; + r = ((glGetMaterialxv = (PFNGLGETMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glGetMaterialxv")) == NULL) || r; + r = ((glGetTexEnvxv = (PFNGLGETTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexEnvxv")) == NULL) || r; + r = ((glGetTexParameterxv = (PFNGLGETTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterxv")) == NULL) || r; + r = ((glPointParameterx = (PFNGLPOINTPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glPointParameterx")) == NULL) || r; + r = ((glPointParameterxv = (PFNGLPOINTPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterxv")) == NULL) || r; + r = ((glPointSizePointerOES = (PFNGLPOINTSIZEPOINTEROESPROC)glewGetProcAddress((const GLubyte*)"glPointSizePointerOES")) == NULL) || r; + r = ((glTexParameterxv = (PFNGLTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterxv")) == NULL) || r; + + return r; +} + +#endif /* GL_REGAL_ES1_1_compatibility */ + +#ifdef GL_REGAL_error_string + +static GLboolean _glewInit_GL_REGAL_error_string () +{ + GLboolean r = GL_FALSE; + + r = ((glErrorStringREGAL = (PFNGLERRORSTRINGREGALPROC)glewGetProcAddress((const GLubyte*)"glErrorStringREGAL")) == NULL) || r; + + return r; +} + +#endif /* GL_REGAL_error_string */ + +#ifdef GL_REGAL_extension_query + +static GLboolean _glewInit_GL_REGAL_extension_query () +{ + GLboolean r = GL_FALSE; + + r = ((glGetExtensionREGAL = (PFNGLGETEXTENSIONREGALPROC)glewGetProcAddress((const GLubyte*)"glGetExtensionREGAL")) == NULL) || r; + r = ((glIsSupportedREGAL = (PFNGLISSUPPORTEDREGALPROC)glewGetProcAddress((const GLubyte*)"glIsSupportedREGAL")) == NULL) || r; + + return r; +} + +#endif /* GL_REGAL_extension_query */ + +#ifdef GL_REGAL_log + +static GLboolean _glewInit_GL_REGAL_log () +{ + GLboolean r = GL_FALSE; + + r = ((glLogMessageCallbackREGAL = (PFNGLLOGMESSAGECALLBACKREGALPROC)glewGetProcAddress((const GLubyte*)"glLogMessageCallbackREGAL")) == NULL) || r; + + return r; +} + +#endif /* GL_REGAL_log */ + +#ifdef GL_REGAL_proc_address + +static GLboolean _glewInit_GL_REGAL_proc_address () +{ + GLboolean r = GL_FALSE; + + r = ((glGetProcAddressREGAL = (PFNGLGETPROCADDRESSREGALPROC)glewGetProcAddress((const GLubyte*)"glGetProcAddressREGAL")) == NULL) || r; + + return r; +} + +#endif /* GL_REGAL_proc_address */ + +#ifdef GL_SGIS_detail_texture + +static GLboolean _glewInit_GL_SGIS_detail_texture () +{ + GLboolean r = GL_FALSE; + + r = ((glDetailTexFuncSGIS = (PFNGLDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glDetailTexFuncSGIS")) == NULL) || r; + r = ((glGetDetailTexFuncSGIS = (PFNGLGETDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetDetailTexFuncSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_detail_texture */ + +#ifdef GL_SGIS_fog_function + +static GLboolean _glewInit_GL_SGIS_fog_function () +{ + GLboolean r = GL_FALSE; + + r = ((glFogFuncSGIS = (PFNGLFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glFogFuncSGIS")) == NULL) || r; + r = ((glGetFogFuncSGIS = (PFNGLGETFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetFogFuncSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_fog_function */ + +#ifdef GL_SGIS_multisample + +static GLboolean _glewInit_GL_SGIS_multisample () +{ + GLboolean r = GL_FALSE; + + r = ((glSampleMaskSGIS = (PFNGLSAMPLEMASKSGISPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskSGIS")) == NULL) || r; + r = ((glSamplePatternSGIS = (PFNGLSAMPLEPATTERNSGISPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_multisample */ + +#ifdef GL_SGIS_multitexture + +static GLboolean _glewInit_GL_SGIS_multitexture () +{ + GLboolean r = GL_FALSE; + + r = ((glInterleavedTextureCoordSetsSGIS = (PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC)glewGetProcAddress((const GLubyte*)"glInterleavedTextureCoordSetsSGIS")) == NULL) || r; + r = ((glSelectTextureCoordSetSGIS = (PFNGLSELECTTEXTURECOORDSETSGISPROC)glewGetProcAddress((const GLubyte*)"glSelectTextureCoordSetSGIS")) == NULL) || r; + r = ((glSelectTextureSGIS = (PFNGLSELECTTEXTURESGISPROC)glewGetProcAddress((const GLubyte*)"glSelectTextureSGIS")) == NULL) || r; + r = ((glSelectTextureTransformSGIS = (PFNGLSELECTTEXTURETRANSFORMSGISPROC)glewGetProcAddress((const GLubyte*)"glSelectTextureTransformSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_multitexture */ + +#ifdef GL_SGIS_shared_multisample + +static GLboolean _glewInit_GL_SGIS_shared_multisample () +{ + GLboolean r = GL_FALSE; + + r = ((glMultisampleSubRectPosSGIS = (PFNGLMULTISAMPLESUBRECTPOSSGISPROC)glewGetProcAddress((const GLubyte*)"glMultisampleSubRectPosSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_shared_multisample */ + +#ifdef GL_SGIS_sharpen_texture + +static GLboolean _glewInit_GL_SGIS_sharpen_texture () +{ + GLboolean r = GL_FALSE; + + r = ((glGetSharpenTexFuncSGIS = (PFNGLGETSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetSharpenTexFuncSGIS")) == NULL) || r; + r = ((glSharpenTexFuncSGIS = (PFNGLSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glSharpenTexFuncSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_sharpen_texture */ + +#ifdef GL_SGIS_texture4D + +static GLboolean _glewInit_GL_SGIS_texture4D () +{ + GLboolean r = GL_FALSE; + + r = ((glTexImage4DSGIS = (PFNGLTEXIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexImage4DSGIS")) == NULL) || r; + r = ((glTexSubImage4DSGIS = (PFNGLTEXSUBIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage4DSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_texture4D */ + +#ifdef GL_SGIS_texture_filter4 + +static GLboolean _glewInit_GL_SGIS_texture_filter4 () +{ + GLboolean r = GL_FALSE; + + r = ((glGetTexFilterFuncSGIS = (PFNGLGETTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetTexFilterFuncSGIS")) == NULL) || r; + r = ((glTexFilterFuncSGIS = (PFNGLTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glTexFilterFuncSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_texture_filter4 */ + +#ifdef GL_SGIX_async + +static GLboolean _glewInit_GL_SGIX_async () +{ + GLboolean r = GL_FALSE; + + r = ((glAsyncMarkerSGIX = (PFNGLASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glAsyncMarkerSGIX")) == NULL) || r; + r = ((glDeleteAsyncMarkersSGIX = (PFNGLDELETEASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeleteAsyncMarkersSGIX")) == NULL) || r; + r = ((glFinishAsyncSGIX = (PFNGLFINISHASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glFinishAsyncSGIX")) == NULL) || r; + r = ((glGenAsyncMarkersSGIX = (PFNGLGENASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGenAsyncMarkersSGIX")) == NULL) || r; + r = ((glIsAsyncMarkerSGIX = (PFNGLISASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glIsAsyncMarkerSGIX")) == NULL) || r; + r = ((glPollAsyncSGIX = (PFNGLPOLLASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glPollAsyncSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_async */ + +#ifdef GL_SGIX_datapipe + +static GLboolean _glewInit_GL_SGIX_datapipe () +{ + GLboolean r = GL_FALSE; + + r = ((glAddressSpace = (PFNGLADDRESSSPACEPROC)glewGetProcAddress((const GLubyte*)"glAddressSpace")) == NULL) || r; + r = ((glDataPipe = (PFNGLDATAPIPEPROC)glewGetProcAddress((const GLubyte*)"glDataPipe")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_datapipe */ + +#ifdef GL_SGIX_flush_raster + +static GLboolean _glewInit_GL_SGIX_flush_raster () +{ + GLboolean r = GL_FALSE; + + r = ((glFlushRasterSGIX = (PFNGLFLUSHRASTERSGIXPROC)glewGetProcAddress((const GLubyte*)"glFlushRasterSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_flush_raster */ + +#ifdef GL_SGIX_fog_layers + +static GLboolean _glewInit_GL_SGIX_fog_layers () +{ + GLboolean r = GL_FALSE; + + r = ((glFogLayersSGIX = (PFNGLFOGLAYERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glFogLayersSGIX")) == NULL) || r; + r = ((glGetFogLayersSGIX = (PFNGLGETFOGLAYERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFogLayersSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_fog_layers */ + +#ifdef GL_SGIX_fog_texture + +static GLboolean _glewInit_GL_SGIX_fog_texture () +{ + GLboolean r = GL_FALSE; + + r = ((glTextureFogSGIX = (PFNGLTEXTUREFOGSGIXPROC)glewGetProcAddress((const GLubyte*)"glTextureFogSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_fog_texture */ + +#ifdef GL_SGIX_fragment_specular_lighting + +static GLboolean _glewInit_GL_SGIX_fragment_specular_lighting () +{ + GLboolean r = GL_FALSE; + + r = ((glFragmentColorMaterialSGIX = (PFNGLFRAGMENTCOLORMATERIALSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialSGIX")) == NULL) || r; + r = ((glFragmentLightModelfSGIX = (PFNGLFRAGMENTLIGHTMODELFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfSGIX")) == NULL) || r; + r = ((glFragmentLightModelfvSGIX = (PFNGLFRAGMENTLIGHTMODELFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvSGIX")) == NULL) || r; + r = ((glFragmentLightModeliSGIX = (PFNGLFRAGMENTLIGHTMODELISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliSGIX")) == NULL) || r; + r = ((glFragmentLightModelivSGIX = (PFNGLFRAGMENTLIGHTMODELIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivSGIX")) == NULL) || r; + r = ((glFragmentLightfSGIX = (PFNGLFRAGMENTLIGHTFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfSGIX")) == NULL) || r; + r = ((glFragmentLightfvSGIX = (PFNGLFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvSGIX")) == NULL) || r; + r = ((glFragmentLightiSGIX = (PFNGLFRAGMENTLIGHTISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiSGIX")) == NULL) || r; + r = ((glFragmentLightivSGIX = (PFNGLFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivSGIX")) == NULL) || r; + r = ((glFragmentMaterialfSGIX = (PFNGLFRAGMENTMATERIALFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfSGIX")) == NULL) || r; + r = ((glFragmentMaterialfvSGIX = (PFNGLFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvSGIX")) == NULL) || r; + r = ((glFragmentMaterialiSGIX = (PFNGLFRAGMENTMATERIALISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiSGIX")) == NULL) || r; + r = ((glFragmentMaterialivSGIX = (PFNGLFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivSGIX")) == NULL) || r; + r = ((glGetFragmentLightfvSGIX = (PFNGLGETFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvSGIX")) == NULL) || r; + r = ((glGetFragmentLightivSGIX = (PFNGLGETFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivSGIX")) == NULL) || r; + r = ((glGetFragmentMaterialfvSGIX = (PFNGLGETFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvSGIX")) == NULL) || r; + r = ((glGetFragmentMaterialivSGIX = (PFNGLGETFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_fragment_specular_lighting */ + +#ifdef GL_SGIX_framezoom + +static GLboolean _glewInit_GL_SGIX_framezoom () +{ + GLboolean r = GL_FALSE; + + r = ((glFrameZoomSGIX = (PFNGLFRAMEZOOMSGIXPROC)glewGetProcAddress((const GLubyte*)"glFrameZoomSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_framezoom */ + +#ifdef GL_SGIX_igloo_interface + +static GLboolean _glewInit_GL_SGIX_igloo_interface () +{ + GLboolean r = GL_FALSE; + + r = ((glIglooInterfaceSGIX = (PFNGLIGLOOINTERFACESGIXPROC)glewGetProcAddress((const GLubyte*)"glIglooInterfaceSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_igloo_interface */ + +#ifdef GL_SGIX_mpeg1 + +static GLboolean _glewInit_GL_SGIX_mpeg1 () +{ + GLboolean r = GL_FALSE; + + r = ((glAllocMPEGPredictorsSGIX = (PFNGLALLOCMPEGPREDICTORSSGIXPROC)glewGetProcAddress((const GLubyte*)"glAllocMPEGPredictorsSGIX")) == NULL) || r; + r = ((glDeleteMPEGPredictorsSGIX = (PFNGLDELETEMPEGPREDICTORSSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeleteMPEGPredictorsSGIX")) == NULL) || r; + r = ((glGenMPEGPredictorsSGIX = (PFNGLGENMPEGPREDICTORSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGenMPEGPredictorsSGIX")) == NULL) || r; + r = ((glGetMPEGParameterfvSGIX = (PFNGLGETMPEGPARAMETERFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetMPEGParameterfvSGIX")) == NULL) || r; + r = ((glGetMPEGParameterivSGIX = (PFNGLGETMPEGPARAMETERIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetMPEGParameterivSGIX")) == NULL) || r; + r = ((glGetMPEGPredictorSGIX = (PFNGLGETMPEGPREDICTORSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetMPEGPredictorSGIX")) == NULL) || r; + r = ((glGetMPEGQuantTableubv = (PFNGLGETMPEGQUANTTABLEUBVPROC)glewGetProcAddress((const GLubyte*)"glGetMPEGQuantTableubv")) == NULL) || r; + r = ((glIsMPEGPredictorSGIX = (PFNGLISMPEGPREDICTORSGIXPROC)glewGetProcAddress((const GLubyte*)"glIsMPEGPredictorSGIX")) == NULL) || r; + r = ((glMPEGPredictorSGIX = (PFNGLMPEGPREDICTORSGIXPROC)glewGetProcAddress((const GLubyte*)"glMPEGPredictorSGIX")) == NULL) || r; + r = ((glMPEGQuantTableubv = (PFNGLMPEGQUANTTABLEUBVPROC)glewGetProcAddress((const GLubyte*)"glMPEGQuantTableubv")) == NULL) || r; + r = ((glSwapMPEGPredictorsSGIX = (PFNGLSWAPMPEGPREDICTORSSGIXPROC)glewGetProcAddress((const GLubyte*)"glSwapMPEGPredictorsSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_mpeg1 */ + +#ifdef GL_SGIX_nonlinear_lighting_pervertex + +static GLboolean _glewInit_GL_SGIX_nonlinear_lighting_pervertex () +{ + GLboolean r = GL_FALSE; + + r = ((glGetNonlinLightfvSGIX = (PFNGLGETNONLINLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetNonlinLightfvSGIX")) == NULL) || r; + r = ((glGetNonlinMaterialfvSGIX = (PFNGLGETNONLINMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetNonlinMaterialfvSGIX")) == NULL) || r; + r = ((glNonlinLightfvSGIX = (PFNGLNONLINLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glNonlinLightfvSGIX")) == NULL) || r; + r = ((glNonlinMaterialfvSGIX = (PFNGLNONLINMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glNonlinMaterialfvSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_nonlinear_lighting_pervertex */ + +#ifdef GL_SGIX_pixel_texture + +static GLboolean _glewInit_GL_SGIX_pixel_texture () +{ + GLboolean r = GL_FALSE; + + r = ((glPixelTexGenSGIX = (PFNGLPIXELTEXGENSGIXPROC)glewGetProcAddress((const GLubyte*)"glPixelTexGenSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_pixel_texture */ + +#ifdef GL_SGIX_polynomial_ffd + +static GLboolean _glewInit_GL_SGIX_polynomial_ffd () +{ + GLboolean r = GL_FALSE; + + r = ((glDeformSGIX = (PFNGLDEFORMSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeformSGIX")) == NULL) || r; + r = ((glLoadIdentityDeformationMapSGIX = (PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC)glewGetProcAddress((const GLubyte*)"glLoadIdentityDeformationMapSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_polynomial_ffd */ + +#ifdef GL_SGIX_quad_mesh + +static GLboolean _glewInit_GL_SGIX_quad_mesh () +{ + GLboolean r = GL_FALSE; + + r = ((glMeshBreadthSGIX = (PFNGLMESHBREADTHSGIXPROC)glewGetProcAddress((const GLubyte*)"glMeshBreadthSGIX")) == NULL) || r; + r = ((glMeshStrideSGIX = (PFNGLMESHSTRIDESGIXPROC)glewGetProcAddress((const GLubyte*)"glMeshStrideSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_quad_mesh */ + +#ifdef GL_SGIX_reference_plane + +static GLboolean _glewInit_GL_SGIX_reference_plane () +{ + GLboolean r = GL_FALSE; + + r = ((glReferencePlaneSGIX = (PFNGLREFERENCEPLANESGIXPROC)glewGetProcAddress((const GLubyte*)"glReferencePlaneSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_reference_plane */ + +#ifdef GL_SGIX_sprite + +static GLboolean _glewInit_GL_SGIX_sprite () +{ + GLboolean r = GL_FALSE; + + r = ((glSpriteParameterfSGIX = (PFNGLSPRITEPARAMETERFSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfSGIX")) == NULL) || r; + r = ((glSpriteParameterfvSGIX = (PFNGLSPRITEPARAMETERFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfvSGIX")) == NULL) || r; + r = ((glSpriteParameteriSGIX = (PFNGLSPRITEPARAMETERISGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameteriSGIX")) == NULL) || r; + r = ((glSpriteParameterivSGIX = (PFNGLSPRITEPARAMETERIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterivSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_sprite */ + +#ifdef GL_SGIX_tag_sample_buffer + +static GLboolean _glewInit_GL_SGIX_tag_sample_buffer () +{ + GLboolean r = GL_FALSE; + + r = ((glTagSampleBufferSGIX = (PFNGLTAGSAMPLEBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glTagSampleBufferSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_tag_sample_buffer */ + +#ifdef GL_SGIX_vector_ops + +static GLboolean _glewInit_GL_SGIX_vector_ops () +{ + GLboolean r = GL_FALSE; + + r = ((glGetVectorOperationSGIX = (PFNGLGETVECTOROPERATIONSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetVectorOperationSGIX")) == NULL) || r; + r = ((glVectorOperationSGIX = (PFNGLVECTOROPERATIONSGIXPROC)glewGetProcAddress((const GLubyte*)"glVectorOperationSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_vector_ops */ + +#ifdef GL_SGIX_vertex_array_object + +static GLboolean _glewInit_GL_SGIX_vertex_array_object () +{ + GLboolean r = GL_FALSE; + + r = ((glAreVertexArraysResidentSGIX = (PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glAreVertexArraysResidentSGIX")) == NULL) || r; + r = ((glBindVertexArraySGIX = (PFNGLBINDVERTEXARRAYSGIXPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArraySGIX")) == NULL) || r; + r = ((glDeleteVertexArraysSGIX = (PFNGLDELETEVERTEXARRAYSSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArraysSGIX")) == NULL) || r; + r = ((glGenVertexArraysSGIX = (PFNGLGENVERTEXARRAYSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArraysSGIX")) == NULL) || r; + r = ((glIsVertexArraySGIX = (PFNGLISVERTEXARRAYSGIXPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArraySGIX")) == NULL) || r; + r = ((glPrioritizeVertexArraysSGIX = (PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC)glewGetProcAddress((const GLubyte*)"glPrioritizeVertexArraysSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_vertex_array_object */ + +#ifdef GL_SGI_color_table + +static GLboolean _glewInit_GL_SGI_color_table () +{ + GLboolean r = GL_FALSE; + + r = ((glColorTableParameterfvSGI = (PFNGLCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfvSGI")) == NULL) || r; + r = ((glColorTableParameterivSGI = (PFNGLCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterivSGI")) == NULL) || r; + r = ((glColorTableSGI = (PFNGLCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableSGI")) == NULL) || r; + r = ((glCopyColorTableSGI = (PFNGLCOPYCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTableSGI")) == NULL) || r; + r = ((glGetColorTableParameterfvSGI = (PFNGLGETCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvSGI")) == NULL) || r; + r = ((glGetColorTableParameterivSGI = (PFNGLGETCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivSGI")) == NULL) || r; + r = ((glGetColorTableSGI = (PFNGLGETCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableSGI")) == NULL) || r; + + return r; +} + +#endif /* GL_SGI_color_table */ + +#ifdef GL_SGI_fft + +static GLboolean _glewInit_GL_SGI_fft () +{ + GLboolean r = GL_FALSE; + + r = ((glGetPixelTransformParameterfvSGI = (PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterfvSGI")) == NULL) || r; + r = ((glGetPixelTransformParameterivSGI = (PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterivSGI")) == NULL) || r; + r = ((glPixelTransformParameterfSGI = (PFNGLPIXELTRANSFORMPARAMETERFSGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfSGI")) == NULL) || r; + r = ((glPixelTransformParameterfvSGI = (PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfvSGI")) == NULL) || r; + r = ((glPixelTransformParameteriSGI = (PFNGLPIXELTRANSFORMPARAMETERISGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameteriSGI")) == NULL) || r; + r = ((glPixelTransformParameterivSGI = (PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterivSGI")) == NULL) || r; + r = ((glPixelTransformSGI = (PFNGLPIXELTRANSFORMSGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformSGI")) == NULL) || r; + + return r; +} + +#endif /* GL_SGI_fft */ + +#ifdef GL_SUNX_constant_data + +static GLboolean _glewInit_GL_SUNX_constant_data () +{ + GLboolean r = GL_FALSE; + + r = ((glFinishTextureSUNX = (PFNGLFINISHTEXTURESUNXPROC)glewGetProcAddress((const GLubyte*)"glFinishTextureSUNX")) == NULL) || r; + + return r; +} + +#endif /* GL_SUNX_constant_data */ + +#ifdef GL_SUN_global_alpha + +static GLboolean _glewInit_GL_SUN_global_alpha () +{ + GLboolean r = GL_FALSE; + + r = ((glGlobalAlphaFactorbSUN = (PFNGLGLOBALALPHAFACTORBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorbSUN")) == NULL) || r; + r = ((glGlobalAlphaFactordSUN = (PFNGLGLOBALALPHAFACTORDSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactordSUN")) == NULL) || r; + r = ((glGlobalAlphaFactorfSUN = (PFNGLGLOBALALPHAFACTORFSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorfSUN")) == NULL) || r; + r = ((glGlobalAlphaFactoriSUN = (PFNGLGLOBALALPHAFACTORISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoriSUN")) == NULL) || r; + r = ((glGlobalAlphaFactorsSUN = (PFNGLGLOBALALPHAFACTORSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorsSUN")) == NULL) || r; + r = ((glGlobalAlphaFactorubSUN = (PFNGLGLOBALALPHAFACTORUBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorubSUN")) == NULL) || r; + r = ((glGlobalAlphaFactoruiSUN = (PFNGLGLOBALALPHAFACTORUISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoruiSUN")) == NULL) || r; + r = ((glGlobalAlphaFactorusSUN = (PFNGLGLOBALALPHAFACTORUSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorusSUN")) == NULL) || r; + + return r; +} + +#endif /* GL_SUN_global_alpha */ + +#ifdef GL_SUN_read_video_pixels + +static GLboolean _glewInit_GL_SUN_read_video_pixels () +{ + GLboolean r = GL_FALSE; + + r = ((glReadVideoPixelsSUN = (PFNGLREADVIDEOPIXELSSUNPROC)glewGetProcAddress((const GLubyte*)"glReadVideoPixelsSUN")) == NULL) || r; + + return r; +} + +#endif /* GL_SUN_read_video_pixels */ + +#ifdef GL_SUN_triangle_list + +static GLboolean _glewInit_GL_SUN_triangle_list () +{ + GLboolean r = GL_FALSE; + + r = ((glReplacementCodePointerSUN = (PFNGLREPLACEMENTCODEPOINTERSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodePointerSUN")) == NULL) || r; + r = ((glReplacementCodeubSUN = (PFNGLREPLACEMENTCODEUBSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubSUN")) == NULL) || r; + r = ((glReplacementCodeubvSUN = (PFNGLREPLACEMENTCODEUBVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubvSUN")) == NULL) || r; + r = ((glReplacementCodeuiSUN = (PFNGLREPLACEMENTCODEUISUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiSUN")) == NULL) || r; + r = ((glReplacementCodeuivSUN = (PFNGLREPLACEMENTCODEUIVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuivSUN")) == NULL) || r; + r = ((glReplacementCodeusSUN = (PFNGLREPLACEMENTCODEUSSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusSUN")) == NULL) || r; + r = ((glReplacementCodeusvSUN = (PFNGLREPLACEMENTCODEUSVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusvSUN")) == NULL) || r; + + return r; +} + +#endif /* GL_SUN_triangle_list */ + +#ifdef GL_SUN_vertex + +static GLboolean _glewInit_GL_SUN_vertex () +{ + GLboolean r = GL_FALSE; + + r = ((glColor3fVertex3fSUN = (PFNGLCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fSUN")) == NULL) || r; + r = ((glColor3fVertex3fvSUN = (PFNGLCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fvSUN")) == NULL) || r; + r = ((glColor4fNormal3fVertex3fSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fSUN")) == NULL) || r; + r = ((glColor4fNormal3fVertex3fvSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glColor4ubVertex2fSUN = (PFNGLCOLOR4UBVERTEX2FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fSUN")) == NULL) || r; + r = ((glColor4ubVertex2fvSUN = (PFNGLCOLOR4UBVERTEX2FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fvSUN")) == NULL) || r; + r = ((glColor4ubVertex3fSUN = (PFNGLCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fSUN")) == NULL) || r; + r = ((glColor4ubVertex3fvSUN = (PFNGLCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fvSUN")) == NULL) || r; + r = ((glNormal3fVertex3fSUN = (PFNGLNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fSUN")) == NULL) || r; + r = ((glNormal3fVertex3fvSUN = (PFNGLNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiColor3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiColor3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiColor4ubVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiColor4ubVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiTexCoord2fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiTexCoord2fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiVertex3fSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiVertex3fvSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fvSUN")) == NULL) || r; + r = ((glTexCoord2fColor3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fSUN")) == NULL) || r; + r = ((glTexCoord2fColor3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fvSUN")) == NULL) || r; + r = ((glTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; + r = ((glTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glTexCoord2fColor4ubVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fSUN")) == NULL) || r; + r = ((glTexCoord2fColor4ubVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fvSUN")) == NULL) || r; + r = ((glTexCoord2fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; + r = ((glTexCoord2fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glTexCoord2fVertex3fSUN = (PFNGLTEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fSUN")) == NULL) || r; + r = ((glTexCoord2fVertex3fvSUN = (PFNGLTEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fvSUN")) == NULL) || r; + r = ((glTexCoord4fColor4fNormal3fVertex4fSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fSUN")) == NULL) || r; + r = ((glTexCoord4fColor4fNormal3fVertex4fvSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fvSUN")) == NULL) || r; + r = ((glTexCoord4fVertex4fSUN = (PFNGLTEXCOORD4FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fSUN")) == NULL) || r; + r = ((glTexCoord4fVertex4fvSUN = (PFNGLTEXCOORD4FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fvSUN")) == NULL) || r; + + return r; +} + +#endif /* GL_SUN_vertex */ + +#ifdef GL_WIN_swap_hint + +static GLboolean _glewInit_GL_WIN_swap_hint () +{ + GLboolean r = GL_FALSE; + + r = ((glAddSwapHintRectWIN = (PFNGLADDSWAPHINTRECTWINPROC)glewGetProcAddress((const GLubyte*)"glAddSwapHintRectWIN")) == NULL) || r; + + return r; +} + +#endif /* GL_WIN_swap_hint */ + +/* ------------------------------------------------------------------------- */ + +static int _glewExtensionCompare(const char *s1, const char *s2) +{ + /* http://www.chanduthedev.com/2012/07/strcmp-implementation-in-c.html */ + while (*s1 || *s2) + { + if (*s1 > *s2) + return 1; + if (*s1 < *s2) + return -1; + s1++; + s2++; + } + return 0; +} + +static ptrdiff_t _glewBsearchExtension(const char* name) +{ + ptrdiff_t lo = 0, hi = sizeof(_glewExtensionLookup) / sizeof(char*) - 2; + + while (lo <= hi) + { + ptrdiff_t mid = (lo + hi) / 2; + const int cmp = _glewExtensionCompare(name, _glewExtensionLookup[mid]); + if (cmp < 0) hi = mid - 1; + else if (cmp > 0) lo = mid + 1; + else return mid; + } + return -1; +} + +static GLboolean *_glewGetExtensionString(const char *name) +{ + ptrdiff_t n = _glewBsearchExtension(name); + if (n >= 0) return &_glewExtensionString[n]; + return NULL; +} + +static GLboolean *_glewGetExtensionEnable(const char *name) +{ + ptrdiff_t n = _glewBsearchExtension(name); + if (n >= 0) return _glewExtensionEnabled[n]; + return NULL; +} + +static const char *_glewNextSpace(const char *i) +{ + const char *j = i; + if (j) + while (*j!=' ' && *j) ++j; + return j; +} + +static const char *_glewNextNonSpace(const char *i) +{ + const char *j = i; + if (j) + while (*j==' ') ++j; + return j; +} + +GLboolean GLEWAPIENTRY glewGetExtension (const char* name) +{ + GLboolean *enable = _glewGetExtensionString(name); + if (enable) + return *enable; + return GL_FALSE; +} + +/* ------------------------------------------------------------------------- */ + +typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGPROC) (GLenum name); +typedef void (GLAPIENTRY * PFNGLGETINTEGERVPROC) (GLenum pname, GLint *params); + +static GLenum GLEWAPIENTRY glewContextInit () +{ + PFNGLGETSTRINGPROC getString; + const GLubyte* s; + GLuint dot; + GLint major, minor; + size_t n; + + #ifdef _WIN32 + getString = glGetString; + #else + getString = (PFNGLGETSTRINGPROC) glewGetProcAddress((const GLubyte*)"glGetString"); + if (!getString) + return GLEW_ERROR_NO_GL_VERSION; + #endif + + /* query opengl version */ + s = getString(GL_VERSION); + dot = _glewStrCLen(s, '.'); + if (dot == 0) + return GLEW_ERROR_NO_GL_VERSION; + + major = s[dot-1]-'0'; + minor = s[dot+1]-'0'; + + if (minor < 0 || minor > 9) + minor = 0; + if (major<0 || major>9) + return GLEW_ERROR_NO_GL_VERSION; + + if (major == 1 && minor == 0) + { + return GLEW_ERROR_GL_VERSION_10_ONLY; + } + else + { + GLEW_VERSION_4_6 = ( major > 4 ) || ( major == 4 && minor >= 6 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_4_5 = GLEW_VERSION_4_4 == GL_TRUE || ( major == 4 && minor >= 5 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_4_4 = GLEW_VERSION_4_5 == GL_TRUE || ( major == 4 && minor >= 4 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_4_3 = GLEW_VERSION_4_4 == GL_TRUE || ( major == 4 && minor >= 3 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_4_2 = GLEW_VERSION_4_3 == GL_TRUE || ( major == 4 && minor >= 2 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_4_1 = GLEW_VERSION_4_2 == GL_TRUE || ( major == 4 && minor >= 1 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_4_0 = GLEW_VERSION_4_1 == GL_TRUE || ( major == 4 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_3_3 = GLEW_VERSION_4_0 == GL_TRUE || ( major == 3 && minor >= 3 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_3_2 = GLEW_VERSION_3_3 == GL_TRUE || ( major == 3 && minor >= 2 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_3_1 = GLEW_VERSION_3_2 == GL_TRUE || ( major == 3 && minor >= 1 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_3_0 = GLEW_VERSION_3_1 == GL_TRUE || ( major == 3 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_2_1 = GLEW_VERSION_3_0 == GL_TRUE || ( major == 2 && minor >= 1 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_2_0 = GLEW_VERSION_2_1 == GL_TRUE || ( major == 2 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_1_5 = GLEW_VERSION_2_0 == GL_TRUE || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_1_4 = GLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_1_3 = GLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_1_2_1 = GLEW_VERSION_1_3 == GL_TRUE ? GL_TRUE : GL_FALSE; + GLEW_VERSION_1_2 = GLEW_VERSION_1_2_1 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_1_1 = GLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE; + } + + for (n = 0; n < sizeof(_glewExtensionString) / sizeof(_glewExtensionString[0]); ++n) + _glewExtensionString[n] = GL_FALSE; + + if (GLEW_VERSION_3_0) + { + GLint n = 0; + GLint i; + PFNGLGETINTEGERVPROC getIntegerv; + PFNGLGETSTRINGIPROC getStringi; + const char *ext; + GLboolean *enable; + + #ifdef _WIN32 + getIntegerv = glGetIntegerv; + #else + getIntegerv = (PFNGLGETINTEGERVPROC) glewGetProcAddress((const GLubyte*)"glGetIntegerv"); + #endif + + if (getIntegerv) + getIntegerv(GL_NUM_EXTENSIONS, &n); + + /* glGetStringi is OpenGL 3.0 */ + getStringi = (PFNGLGETSTRINGIPROC) glewGetProcAddress((const GLubyte*)"glGetStringi"); + if (getStringi) + for (i = 0; i= (ptrdiff_t) sizeof(ext)) + continue; + _glewStrCopy(ext, i, ' '); + + /* Based on extension string(s), glewGetExtension purposes */ + enable = _glewGetExtensionString(ext); + if (enable) + *enable = GL_TRUE; + + /* Based on extension string(s), experimental mode, glewIsSupported purposes */ + enable = _glewGetExtensionEnable(ext); + if (enable) + *enable = GL_TRUE; + } + } + } +#ifdef GL_VERSION_1_2 + if (glewExperimental || GLEW_VERSION_1_2) GLEW_VERSION_1_2 = !_glewInit_GL_VERSION_1_2(); +#endif /* GL_VERSION_1_2 */ +#ifdef GL_VERSION_1_3 + if (glewExperimental || GLEW_VERSION_1_3) GLEW_VERSION_1_3 = !_glewInit_GL_VERSION_1_3(); +#endif /* GL_VERSION_1_3 */ +#ifdef GL_VERSION_1_4 + if (glewExperimental || GLEW_VERSION_1_4) GLEW_VERSION_1_4 = !_glewInit_GL_VERSION_1_4(); +#endif /* GL_VERSION_1_4 */ +#ifdef GL_VERSION_1_5 + if (glewExperimental || GLEW_VERSION_1_5) GLEW_VERSION_1_5 = !_glewInit_GL_VERSION_1_5(); +#endif /* GL_VERSION_1_5 */ +#ifdef GL_VERSION_2_0 + if (glewExperimental || GLEW_VERSION_2_0) GLEW_VERSION_2_0 = !_glewInit_GL_VERSION_2_0(); +#endif /* GL_VERSION_2_0 */ +#ifdef GL_VERSION_2_1 + if (glewExperimental || GLEW_VERSION_2_1) GLEW_VERSION_2_1 = !_glewInit_GL_VERSION_2_1(); +#endif /* GL_VERSION_2_1 */ +#ifdef GL_VERSION_3_0 + if (glewExperimental || GLEW_VERSION_3_0) GLEW_VERSION_3_0 = !_glewInit_GL_VERSION_3_0(); +#endif /* GL_VERSION_3_0 */ +#ifdef GL_VERSION_3_1 + if (glewExperimental || GLEW_VERSION_3_1) GLEW_VERSION_3_1 = !_glewInit_GL_VERSION_3_1(); +#endif /* GL_VERSION_3_1 */ +#ifdef GL_VERSION_3_2 + if (glewExperimental || GLEW_VERSION_3_2) GLEW_VERSION_3_2 = !_glewInit_GL_VERSION_3_2(); +#endif /* GL_VERSION_3_2 */ +#ifdef GL_VERSION_3_3 + if (glewExperimental || GLEW_VERSION_3_3) GLEW_VERSION_3_3 = !_glewInit_GL_VERSION_3_3(); +#endif /* GL_VERSION_3_3 */ +#ifdef GL_VERSION_4_0 + if (glewExperimental || GLEW_VERSION_4_0) GLEW_VERSION_4_0 = !_glewInit_GL_VERSION_4_0(); +#endif /* GL_VERSION_4_0 */ +#ifdef GL_VERSION_4_5 + if (glewExperimental || GLEW_VERSION_4_5) GLEW_VERSION_4_5 = !_glewInit_GL_VERSION_4_5(); +#endif /* GL_VERSION_4_5 */ +#ifdef GL_VERSION_4_6 + if (glewExperimental || GLEW_VERSION_4_6) GLEW_VERSION_4_6 = !_glewInit_GL_VERSION_4_6(); +#endif /* GL_VERSION_4_6 */ +#ifdef GL_3DFX_tbuffer + if (glewExperimental || GLEW_3DFX_tbuffer) GLEW_3DFX_tbuffer = !_glewInit_GL_3DFX_tbuffer(); +#endif /* GL_3DFX_tbuffer */ +#ifdef GL_AMD_debug_output + if (glewExperimental || GLEW_AMD_debug_output) GLEW_AMD_debug_output = !_glewInit_GL_AMD_debug_output(); +#endif /* GL_AMD_debug_output */ +#ifdef GL_AMD_draw_buffers_blend + if (glewExperimental || GLEW_AMD_draw_buffers_blend) GLEW_AMD_draw_buffers_blend = !_glewInit_GL_AMD_draw_buffers_blend(); +#endif /* GL_AMD_draw_buffers_blend */ +#ifdef GL_AMD_framebuffer_sample_positions + if (glewExperimental || GLEW_AMD_framebuffer_sample_positions) GLEW_AMD_framebuffer_sample_positions = !_glewInit_GL_AMD_framebuffer_sample_positions(); +#endif /* GL_AMD_framebuffer_sample_positions */ +#ifdef GL_AMD_interleaved_elements + if (glewExperimental || GLEW_AMD_interleaved_elements) GLEW_AMD_interleaved_elements = !_glewInit_GL_AMD_interleaved_elements(); +#endif /* GL_AMD_interleaved_elements */ +#ifdef GL_AMD_multi_draw_indirect + if (glewExperimental || GLEW_AMD_multi_draw_indirect) GLEW_AMD_multi_draw_indirect = !_glewInit_GL_AMD_multi_draw_indirect(); +#endif /* GL_AMD_multi_draw_indirect */ +#ifdef GL_AMD_name_gen_delete + if (glewExperimental || GLEW_AMD_name_gen_delete) GLEW_AMD_name_gen_delete = !_glewInit_GL_AMD_name_gen_delete(); +#endif /* GL_AMD_name_gen_delete */ +#ifdef GL_AMD_occlusion_query_event + if (glewExperimental || GLEW_AMD_occlusion_query_event) GLEW_AMD_occlusion_query_event = !_glewInit_GL_AMD_occlusion_query_event(); +#endif /* GL_AMD_occlusion_query_event */ +#ifdef GL_AMD_performance_monitor + if (glewExperimental || GLEW_AMD_performance_monitor) GLEW_AMD_performance_monitor = !_glewInit_GL_AMD_performance_monitor(); +#endif /* GL_AMD_performance_monitor */ +#ifdef GL_AMD_sample_positions + if (glewExperimental || GLEW_AMD_sample_positions) GLEW_AMD_sample_positions = !_glewInit_GL_AMD_sample_positions(); +#endif /* GL_AMD_sample_positions */ +#ifdef GL_AMD_sparse_texture + if (glewExperimental || GLEW_AMD_sparse_texture) GLEW_AMD_sparse_texture = !_glewInit_GL_AMD_sparse_texture(); +#endif /* GL_AMD_sparse_texture */ +#ifdef GL_AMD_stencil_operation_extended + if (glewExperimental || GLEW_AMD_stencil_operation_extended) GLEW_AMD_stencil_operation_extended = !_glewInit_GL_AMD_stencil_operation_extended(); +#endif /* GL_AMD_stencil_operation_extended */ +#ifdef GL_AMD_vertex_shader_tessellator + if (glewExperimental || GLEW_AMD_vertex_shader_tessellator) GLEW_AMD_vertex_shader_tessellator = !_glewInit_GL_AMD_vertex_shader_tessellator(); +#endif /* GL_AMD_vertex_shader_tessellator */ +#ifdef GL_ANGLE_framebuffer_blit + if (glewExperimental || GLEW_ANGLE_framebuffer_blit) GLEW_ANGLE_framebuffer_blit = !_glewInit_GL_ANGLE_framebuffer_blit(); +#endif /* GL_ANGLE_framebuffer_blit */ +#ifdef GL_ANGLE_framebuffer_multisample + if (glewExperimental || GLEW_ANGLE_framebuffer_multisample) GLEW_ANGLE_framebuffer_multisample = !_glewInit_GL_ANGLE_framebuffer_multisample(); +#endif /* GL_ANGLE_framebuffer_multisample */ +#ifdef GL_ANGLE_instanced_arrays + if (glewExperimental || GLEW_ANGLE_instanced_arrays) GLEW_ANGLE_instanced_arrays = !_glewInit_GL_ANGLE_instanced_arrays(); +#endif /* GL_ANGLE_instanced_arrays */ +#ifdef GL_ANGLE_timer_query + if (glewExperimental || GLEW_ANGLE_timer_query) GLEW_ANGLE_timer_query = !_glewInit_GL_ANGLE_timer_query(); +#endif /* GL_ANGLE_timer_query */ +#ifdef GL_ANGLE_translated_shader_source + if (glewExperimental || GLEW_ANGLE_translated_shader_source) GLEW_ANGLE_translated_shader_source = !_glewInit_GL_ANGLE_translated_shader_source(); +#endif /* GL_ANGLE_translated_shader_source */ +#ifdef GL_APPLE_copy_texture_levels + if (glewExperimental || GLEW_APPLE_copy_texture_levels) GLEW_APPLE_copy_texture_levels = !_glewInit_GL_APPLE_copy_texture_levels(); +#endif /* GL_APPLE_copy_texture_levels */ +#ifdef GL_APPLE_element_array + if (glewExperimental || GLEW_APPLE_element_array) GLEW_APPLE_element_array = !_glewInit_GL_APPLE_element_array(); +#endif /* GL_APPLE_element_array */ +#ifdef GL_APPLE_fence + if (glewExperimental || GLEW_APPLE_fence) GLEW_APPLE_fence = !_glewInit_GL_APPLE_fence(); +#endif /* GL_APPLE_fence */ +#ifdef GL_APPLE_flush_buffer_range + if (glewExperimental || GLEW_APPLE_flush_buffer_range) GLEW_APPLE_flush_buffer_range = !_glewInit_GL_APPLE_flush_buffer_range(); +#endif /* GL_APPLE_flush_buffer_range */ +#ifdef GL_APPLE_framebuffer_multisample + if (glewExperimental || GLEW_APPLE_framebuffer_multisample) GLEW_APPLE_framebuffer_multisample = !_glewInit_GL_APPLE_framebuffer_multisample(); +#endif /* GL_APPLE_framebuffer_multisample */ +#ifdef GL_APPLE_object_purgeable + if (glewExperimental || GLEW_APPLE_object_purgeable) GLEW_APPLE_object_purgeable = !_glewInit_GL_APPLE_object_purgeable(); +#endif /* GL_APPLE_object_purgeable */ +#ifdef GL_APPLE_sync + if (glewExperimental || GLEW_APPLE_sync) GLEW_APPLE_sync = !_glewInit_GL_APPLE_sync(); +#endif /* GL_APPLE_sync */ +#ifdef GL_APPLE_texture_range + if (glewExperimental || GLEW_APPLE_texture_range) GLEW_APPLE_texture_range = !_glewInit_GL_APPLE_texture_range(); +#endif /* GL_APPLE_texture_range */ +#ifdef GL_APPLE_vertex_array_object + if (glewExperimental || GLEW_APPLE_vertex_array_object) GLEW_APPLE_vertex_array_object = !_glewInit_GL_APPLE_vertex_array_object(); +#endif /* GL_APPLE_vertex_array_object */ +#ifdef GL_APPLE_vertex_array_range + if (glewExperimental || GLEW_APPLE_vertex_array_range) GLEW_APPLE_vertex_array_range = !_glewInit_GL_APPLE_vertex_array_range(); +#endif /* GL_APPLE_vertex_array_range */ +#ifdef GL_APPLE_vertex_program_evaluators + if (glewExperimental || GLEW_APPLE_vertex_program_evaluators) GLEW_APPLE_vertex_program_evaluators = !_glewInit_GL_APPLE_vertex_program_evaluators(); +#endif /* GL_APPLE_vertex_program_evaluators */ +#ifdef GL_ARB_ES2_compatibility + if (glewExperimental || GLEW_ARB_ES2_compatibility) GLEW_ARB_ES2_compatibility = !_glewInit_GL_ARB_ES2_compatibility(); +#endif /* GL_ARB_ES2_compatibility */ +#ifdef GL_ARB_ES3_1_compatibility + if (glewExperimental || GLEW_ARB_ES3_1_compatibility) GLEW_ARB_ES3_1_compatibility = !_glewInit_GL_ARB_ES3_1_compatibility(); +#endif /* GL_ARB_ES3_1_compatibility */ +#ifdef GL_ARB_ES3_2_compatibility + if (glewExperimental || GLEW_ARB_ES3_2_compatibility) GLEW_ARB_ES3_2_compatibility = !_glewInit_GL_ARB_ES3_2_compatibility(); +#endif /* GL_ARB_ES3_2_compatibility */ +#ifdef GL_ARB_base_instance + if (glewExperimental || GLEW_ARB_base_instance) GLEW_ARB_base_instance = !_glewInit_GL_ARB_base_instance(); +#endif /* GL_ARB_base_instance */ +#ifdef GL_ARB_bindless_texture + if (glewExperimental || GLEW_ARB_bindless_texture) GLEW_ARB_bindless_texture = !_glewInit_GL_ARB_bindless_texture(); +#endif /* GL_ARB_bindless_texture */ +#ifdef GL_ARB_blend_func_extended + if (glewExperimental || GLEW_ARB_blend_func_extended) GLEW_ARB_blend_func_extended = !_glewInit_GL_ARB_blend_func_extended(); +#endif /* GL_ARB_blend_func_extended */ +#ifdef GL_ARB_buffer_storage + if (glewExperimental || GLEW_ARB_buffer_storage) GLEW_ARB_buffer_storage = !_glewInit_GL_ARB_buffer_storage(); +#endif /* GL_ARB_buffer_storage */ +#ifdef GL_ARB_cl_event + if (glewExperimental || GLEW_ARB_cl_event) GLEW_ARB_cl_event = !_glewInit_GL_ARB_cl_event(); +#endif /* GL_ARB_cl_event */ +#ifdef GL_ARB_clear_buffer_object + if (glewExperimental || GLEW_ARB_clear_buffer_object) GLEW_ARB_clear_buffer_object = !_glewInit_GL_ARB_clear_buffer_object(); +#endif /* GL_ARB_clear_buffer_object */ +#ifdef GL_ARB_clear_texture + if (glewExperimental || GLEW_ARB_clear_texture) GLEW_ARB_clear_texture = !_glewInit_GL_ARB_clear_texture(); +#endif /* GL_ARB_clear_texture */ +#ifdef GL_ARB_clip_control + if (glewExperimental || GLEW_ARB_clip_control) GLEW_ARB_clip_control = !_glewInit_GL_ARB_clip_control(); +#endif /* GL_ARB_clip_control */ +#ifdef GL_ARB_color_buffer_float + if (glewExperimental || GLEW_ARB_color_buffer_float) GLEW_ARB_color_buffer_float = !_glewInit_GL_ARB_color_buffer_float(); +#endif /* GL_ARB_color_buffer_float */ +#ifdef GL_ARB_compute_shader + if (glewExperimental || GLEW_ARB_compute_shader) GLEW_ARB_compute_shader = !_glewInit_GL_ARB_compute_shader(); +#endif /* GL_ARB_compute_shader */ +#ifdef GL_ARB_compute_variable_group_size + if (glewExperimental || GLEW_ARB_compute_variable_group_size) GLEW_ARB_compute_variable_group_size = !_glewInit_GL_ARB_compute_variable_group_size(); +#endif /* GL_ARB_compute_variable_group_size */ +#ifdef GL_ARB_copy_buffer + if (glewExperimental || GLEW_ARB_copy_buffer) GLEW_ARB_copy_buffer = !_glewInit_GL_ARB_copy_buffer(); +#endif /* GL_ARB_copy_buffer */ +#ifdef GL_ARB_copy_image + if (glewExperimental || GLEW_ARB_copy_image) GLEW_ARB_copy_image = !_glewInit_GL_ARB_copy_image(); +#endif /* GL_ARB_copy_image */ +#ifdef GL_ARB_debug_output + if (glewExperimental || GLEW_ARB_debug_output) GLEW_ARB_debug_output = !_glewInit_GL_ARB_debug_output(); +#endif /* GL_ARB_debug_output */ +#ifdef GL_ARB_direct_state_access + if (glewExperimental || GLEW_ARB_direct_state_access) GLEW_ARB_direct_state_access = !_glewInit_GL_ARB_direct_state_access(); +#endif /* GL_ARB_direct_state_access */ +#ifdef GL_ARB_draw_buffers + if (glewExperimental || GLEW_ARB_draw_buffers) GLEW_ARB_draw_buffers = !_glewInit_GL_ARB_draw_buffers(); +#endif /* GL_ARB_draw_buffers */ +#ifdef GL_ARB_draw_buffers_blend + if (glewExperimental || GLEW_ARB_draw_buffers_blend) GLEW_ARB_draw_buffers_blend = !_glewInit_GL_ARB_draw_buffers_blend(); +#endif /* GL_ARB_draw_buffers_blend */ +#ifdef GL_ARB_draw_elements_base_vertex + if (glewExperimental || GLEW_ARB_draw_elements_base_vertex) GLEW_ARB_draw_elements_base_vertex = !_glewInit_GL_ARB_draw_elements_base_vertex(); +#endif /* GL_ARB_draw_elements_base_vertex */ +#ifdef GL_ARB_draw_indirect + if (glewExperimental || GLEW_ARB_draw_indirect) GLEW_ARB_draw_indirect = !_glewInit_GL_ARB_draw_indirect(); +#endif /* GL_ARB_draw_indirect */ +#ifdef GL_ARB_framebuffer_no_attachments + if (glewExperimental || GLEW_ARB_framebuffer_no_attachments) GLEW_ARB_framebuffer_no_attachments = !_glewInit_GL_ARB_framebuffer_no_attachments(); +#endif /* GL_ARB_framebuffer_no_attachments */ +#ifdef GL_ARB_framebuffer_object + if (glewExperimental || GLEW_ARB_framebuffer_object) GLEW_ARB_framebuffer_object = !_glewInit_GL_ARB_framebuffer_object(); +#endif /* GL_ARB_framebuffer_object */ +#ifdef GL_ARB_geometry_shader4 + if (glewExperimental || GLEW_ARB_geometry_shader4) GLEW_ARB_geometry_shader4 = !_glewInit_GL_ARB_geometry_shader4(); +#endif /* GL_ARB_geometry_shader4 */ +#ifdef GL_ARB_get_program_binary + if (glewExperimental || GLEW_ARB_get_program_binary) GLEW_ARB_get_program_binary = !_glewInit_GL_ARB_get_program_binary(); +#endif /* GL_ARB_get_program_binary */ +#ifdef GL_ARB_get_texture_sub_image + if (glewExperimental || GLEW_ARB_get_texture_sub_image) GLEW_ARB_get_texture_sub_image = !_glewInit_GL_ARB_get_texture_sub_image(); +#endif /* GL_ARB_get_texture_sub_image */ +#ifdef GL_ARB_gl_spirv + if (glewExperimental || GLEW_ARB_gl_spirv) GLEW_ARB_gl_spirv = !_glewInit_GL_ARB_gl_spirv(); +#endif /* GL_ARB_gl_spirv */ +#ifdef GL_ARB_gpu_shader_fp64 + if (glewExperimental || GLEW_ARB_gpu_shader_fp64) GLEW_ARB_gpu_shader_fp64 = !_glewInit_GL_ARB_gpu_shader_fp64(); +#endif /* GL_ARB_gpu_shader_fp64 */ +#ifdef GL_ARB_gpu_shader_int64 + if (glewExperimental || GLEW_ARB_gpu_shader_int64) GLEW_ARB_gpu_shader_int64 = !_glewInit_GL_ARB_gpu_shader_int64(); +#endif /* GL_ARB_gpu_shader_int64 */ +#ifdef GL_ARB_imaging + if (glewExperimental || GLEW_ARB_imaging) GLEW_ARB_imaging = !_glewInit_GL_ARB_imaging(); +#endif /* GL_ARB_imaging */ +#ifdef GL_ARB_indirect_parameters + if (glewExperimental || GLEW_ARB_indirect_parameters) GLEW_ARB_indirect_parameters = !_glewInit_GL_ARB_indirect_parameters(); +#endif /* GL_ARB_indirect_parameters */ +#ifdef GL_ARB_instanced_arrays + if (glewExperimental || GLEW_ARB_instanced_arrays) GLEW_ARB_instanced_arrays = !_glewInit_GL_ARB_instanced_arrays(); +#endif /* GL_ARB_instanced_arrays */ +#ifdef GL_ARB_internalformat_query + if (glewExperimental || GLEW_ARB_internalformat_query) GLEW_ARB_internalformat_query = !_glewInit_GL_ARB_internalformat_query(); +#endif /* GL_ARB_internalformat_query */ +#ifdef GL_ARB_internalformat_query2 + if (glewExperimental || GLEW_ARB_internalformat_query2) GLEW_ARB_internalformat_query2 = !_glewInit_GL_ARB_internalformat_query2(); +#endif /* GL_ARB_internalformat_query2 */ +#ifdef GL_ARB_invalidate_subdata + if (glewExperimental || GLEW_ARB_invalidate_subdata) GLEW_ARB_invalidate_subdata = !_glewInit_GL_ARB_invalidate_subdata(); +#endif /* GL_ARB_invalidate_subdata */ +#ifdef GL_ARB_map_buffer_range + if (glewExperimental || GLEW_ARB_map_buffer_range) GLEW_ARB_map_buffer_range = !_glewInit_GL_ARB_map_buffer_range(); +#endif /* GL_ARB_map_buffer_range */ +#ifdef GL_ARB_matrix_palette + if (glewExperimental || GLEW_ARB_matrix_palette) GLEW_ARB_matrix_palette = !_glewInit_GL_ARB_matrix_palette(); +#endif /* GL_ARB_matrix_palette */ +#ifdef GL_ARB_multi_bind + if (glewExperimental || GLEW_ARB_multi_bind) GLEW_ARB_multi_bind = !_glewInit_GL_ARB_multi_bind(); +#endif /* GL_ARB_multi_bind */ +#ifdef GL_ARB_multi_draw_indirect + if (glewExperimental || GLEW_ARB_multi_draw_indirect) GLEW_ARB_multi_draw_indirect = !_glewInit_GL_ARB_multi_draw_indirect(); +#endif /* GL_ARB_multi_draw_indirect */ +#ifdef GL_ARB_multisample + if (glewExperimental || GLEW_ARB_multisample) GLEW_ARB_multisample = !_glewInit_GL_ARB_multisample(); +#endif /* GL_ARB_multisample */ +#ifdef GL_ARB_multitexture + if (glewExperimental || GLEW_ARB_multitexture) GLEW_ARB_multitexture = !_glewInit_GL_ARB_multitexture(); +#endif /* GL_ARB_multitexture */ +#ifdef GL_ARB_occlusion_query + if (glewExperimental || GLEW_ARB_occlusion_query) GLEW_ARB_occlusion_query = !_glewInit_GL_ARB_occlusion_query(); +#endif /* GL_ARB_occlusion_query */ +#ifdef GL_ARB_parallel_shader_compile + if (glewExperimental || GLEW_ARB_parallel_shader_compile) GLEW_ARB_parallel_shader_compile = !_glewInit_GL_ARB_parallel_shader_compile(); +#endif /* GL_ARB_parallel_shader_compile */ +#ifdef GL_ARB_point_parameters + if (glewExperimental || GLEW_ARB_point_parameters) GLEW_ARB_point_parameters = !_glewInit_GL_ARB_point_parameters(); +#endif /* GL_ARB_point_parameters */ +#ifdef GL_ARB_polygon_offset_clamp + if (glewExperimental || GLEW_ARB_polygon_offset_clamp) GLEW_ARB_polygon_offset_clamp = !_glewInit_GL_ARB_polygon_offset_clamp(); +#endif /* GL_ARB_polygon_offset_clamp */ +#ifdef GL_ARB_program_interface_query + if (glewExperimental || GLEW_ARB_program_interface_query) GLEW_ARB_program_interface_query = !_glewInit_GL_ARB_program_interface_query(); +#endif /* GL_ARB_program_interface_query */ +#ifdef GL_ARB_provoking_vertex + if (glewExperimental || GLEW_ARB_provoking_vertex) GLEW_ARB_provoking_vertex = !_glewInit_GL_ARB_provoking_vertex(); +#endif /* GL_ARB_provoking_vertex */ +#ifdef GL_ARB_robustness + if (glewExperimental || GLEW_ARB_robustness) GLEW_ARB_robustness = !_glewInit_GL_ARB_robustness(); +#endif /* GL_ARB_robustness */ +#ifdef GL_ARB_sample_locations + if (glewExperimental || GLEW_ARB_sample_locations) GLEW_ARB_sample_locations = !_glewInit_GL_ARB_sample_locations(); +#endif /* GL_ARB_sample_locations */ +#ifdef GL_ARB_sample_shading + if (glewExperimental || GLEW_ARB_sample_shading) GLEW_ARB_sample_shading = !_glewInit_GL_ARB_sample_shading(); +#endif /* GL_ARB_sample_shading */ +#ifdef GL_ARB_sampler_objects + if (glewExperimental || GLEW_ARB_sampler_objects) GLEW_ARB_sampler_objects = !_glewInit_GL_ARB_sampler_objects(); +#endif /* GL_ARB_sampler_objects */ +#ifdef GL_ARB_separate_shader_objects + if (glewExperimental || GLEW_ARB_separate_shader_objects) GLEW_ARB_separate_shader_objects = !_glewInit_GL_ARB_separate_shader_objects(); +#endif /* GL_ARB_separate_shader_objects */ +#ifdef GL_ARB_shader_atomic_counters + if (glewExperimental || GLEW_ARB_shader_atomic_counters) GLEW_ARB_shader_atomic_counters = !_glewInit_GL_ARB_shader_atomic_counters(); +#endif /* GL_ARB_shader_atomic_counters */ +#ifdef GL_ARB_shader_image_load_store + if (glewExperimental || GLEW_ARB_shader_image_load_store) GLEW_ARB_shader_image_load_store = !_glewInit_GL_ARB_shader_image_load_store(); +#endif /* GL_ARB_shader_image_load_store */ +#ifdef GL_ARB_shader_objects + if (glewExperimental || GLEW_ARB_shader_objects) GLEW_ARB_shader_objects = !_glewInit_GL_ARB_shader_objects(); +#endif /* GL_ARB_shader_objects */ +#ifdef GL_ARB_shader_storage_buffer_object + if (glewExperimental || GLEW_ARB_shader_storage_buffer_object) GLEW_ARB_shader_storage_buffer_object = !_glewInit_GL_ARB_shader_storage_buffer_object(); +#endif /* GL_ARB_shader_storage_buffer_object */ +#ifdef GL_ARB_shader_subroutine + if (glewExperimental || GLEW_ARB_shader_subroutine) GLEW_ARB_shader_subroutine = !_glewInit_GL_ARB_shader_subroutine(); +#endif /* GL_ARB_shader_subroutine */ +#ifdef GL_ARB_shading_language_include + if (glewExperimental || GLEW_ARB_shading_language_include) GLEW_ARB_shading_language_include = !_glewInit_GL_ARB_shading_language_include(); +#endif /* GL_ARB_shading_language_include */ +#ifdef GL_ARB_sparse_buffer + if (glewExperimental || GLEW_ARB_sparse_buffer) GLEW_ARB_sparse_buffer = !_glewInit_GL_ARB_sparse_buffer(); +#endif /* GL_ARB_sparse_buffer */ +#ifdef GL_ARB_sparse_texture + if (glewExperimental || GLEW_ARB_sparse_texture) GLEW_ARB_sparse_texture = !_glewInit_GL_ARB_sparse_texture(); +#endif /* GL_ARB_sparse_texture */ +#ifdef GL_ARB_sync + if (glewExperimental || GLEW_ARB_sync) GLEW_ARB_sync = !_glewInit_GL_ARB_sync(); +#endif /* GL_ARB_sync */ +#ifdef GL_ARB_tessellation_shader + if (glewExperimental || GLEW_ARB_tessellation_shader) GLEW_ARB_tessellation_shader = !_glewInit_GL_ARB_tessellation_shader(); +#endif /* GL_ARB_tessellation_shader */ +#ifdef GL_ARB_texture_barrier + if (glewExperimental || GLEW_ARB_texture_barrier) GLEW_ARB_texture_barrier = !_glewInit_GL_ARB_texture_barrier(); +#endif /* GL_ARB_texture_barrier */ +#ifdef GL_ARB_texture_buffer_object + if (glewExperimental || GLEW_ARB_texture_buffer_object) GLEW_ARB_texture_buffer_object = !_glewInit_GL_ARB_texture_buffer_object(); +#endif /* GL_ARB_texture_buffer_object */ +#ifdef GL_ARB_texture_buffer_range + if (glewExperimental || GLEW_ARB_texture_buffer_range) GLEW_ARB_texture_buffer_range = !_glewInit_GL_ARB_texture_buffer_range(); +#endif /* GL_ARB_texture_buffer_range */ +#ifdef GL_ARB_texture_compression + if (glewExperimental || GLEW_ARB_texture_compression) GLEW_ARB_texture_compression = !_glewInit_GL_ARB_texture_compression(); +#endif /* GL_ARB_texture_compression */ +#ifdef GL_ARB_texture_multisample + if (glewExperimental || GLEW_ARB_texture_multisample) GLEW_ARB_texture_multisample = !_glewInit_GL_ARB_texture_multisample(); +#endif /* GL_ARB_texture_multisample */ +#ifdef GL_ARB_texture_storage + if (glewExperimental || GLEW_ARB_texture_storage) GLEW_ARB_texture_storage = !_glewInit_GL_ARB_texture_storage(); +#endif /* GL_ARB_texture_storage */ +#ifdef GL_ARB_texture_storage_multisample + if (glewExperimental || GLEW_ARB_texture_storage_multisample) GLEW_ARB_texture_storage_multisample = !_glewInit_GL_ARB_texture_storage_multisample(); +#endif /* GL_ARB_texture_storage_multisample */ +#ifdef GL_ARB_texture_view + if (glewExperimental || GLEW_ARB_texture_view) GLEW_ARB_texture_view = !_glewInit_GL_ARB_texture_view(); +#endif /* GL_ARB_texture_view */ +#ifdef GL_ARB_timer_query + if (glewExperimental || GLEW_ARB_timer_query) GLEW_ARB_timer_query = !_glewInit_GL_ARB_timer_query(); +#endif /* GL_ARB_timer_query */ +#ifdef GL_ARB_transform_feedback2 + if (glewExperimental || GLEW_ARB_transform_feedback2) GLEW_ARB_transform_feedback2 = !_glewInit_GL_ARB_transform_feedback2(); +#endif /* GL_ARB_transform_feedback2 */ +#ifdef GL_ARB_transform_feedback3 + if (glewExperimental || GLEW_ARB_transform_feedback3) GLEW_ARB_transform_feedback3 = !_glewInit_GL_ARB_transform_feedback3(); +#endif /* GL_ARB_transform_feedback3 */ +#ifdef GL_ARB_transform_feedback_instanced + if (glewExperimental || GLEW_ARB_transform_feedback_instanced) GLEW_ARB_transform_feedback_instanced = !_glewInit_GL_ARB_transform_feedback_instanced(); +#endif /* GL_ARB_transform_feedback_instanced */ +#ifdef GL_ARB_transpose_matrix + if (glewExperimental || GLEW_ARB_transpose_matrix) GLEW_ARB_transpose_matrix = !_glewInit_GL_ARB_transpose_matrix(); +#endif /* GL_ARB_transpose_matrix */ +#ifdef GL_ARB_uniform_buffer_object + if (glewExperimental || GLEW_ARB_uniform_buffer_object) GLEW_ARB_uniform_buffer_object = !_glewInit_GL_ARB_uniform_buffer_object(); +#endif /* GL_ARB_uniform_buffer_object */ +#ifdef GL_ARB_vertex_array_object + if (glewExperimental || GLEW_ARB_vertex_array_object) GLEW_ARB_vertex_array_object = !_glewInit_GL_ARB_vertex_array_object(); +#endif /* GL_ARB_vertex_array_object */ +#ifdef GL_ARB_vertex_attrib_64bit + if (glewExperimental || GLEW_ARB_vertex_attrib_64bit) GLEW_ARB_vertex_attrib_64bit = !_glewInit_GL_ARB_vertex_attrib_64bit(); +#endif /* GL_ARB_vertex_attrib_64bit */ +#ifdef GL_ARB_vertex_attrib_binding + if (glewExperimental || GLEW_ARB_vertex_attrib_binding) GLEW_ARB_vertex_attrib_binding = !_glewInit_GL_ARB_vertex_attrib_binding(); +#endif /* GL_ARB_vertex_attrib_binding */ +#ifdef GL_ARB_vertex_blend + if (glewExperimental || GLEW_ARB_vertex_blend) GLEW_ARB_vertex_blend = !_glewInit_GL_ARB_vertex_blend(); +#endif /* GL_ARB_vertex_blend */ +#ifdef GL_ARB_vertex_buffer_object + if (glewExperimental || GLEW_ARB_vertex_buffer_object) GLEW_ARB_vertex_buffer_object = !_glewInit_GL_ARB_vertex_buffer_object(); +#endif /* GL_ARB_vertex_buffer_object */ +#ifdef GL_ARB_vertex_program + if (glewExperimental || GLEW_ARB_vertex_program) GLEW_ARB_vertex_program = !_glewInit_GL_ARB_vertex_program(); +#endif /* GL_ARB_vertex_program */ +#ifdef GL_ARB_vertex_shader + if (glewExperimental || GLEW_ARB_vertex_shader) { GLEW_ARB_vertex_shader = !_glewInit_GL_ARB_vertex_shader(); _glewInit_GL_ARB_vertex_program(); } +#endif /* GL_ARB_vertex_shader */ +#ifdef GL_ARB_vertex_type_2_10_10_10_rev + if (glewExperimental || GLEW_ARB_vertex_type_2_10_10_10_rev) GLEW_ARB_vertex_type_2_10_10_10_rev = !_glewInit_GL_ARB_vertex_type_2_10_10_10_rev(); +#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ +#ifdef GL_ARB_viewport_array + if (glewExperimental || GLEW_ARB_viewport_array) GLEW_ARB_viewport_array = !_glewInit_GL_ARB_viewport_array(); +#endif /* GL_ARB_viewport_array */ +#ifdef GL_ARB_window_pos + if (glewExperimental || GLEW_ARB_window_pos) GLEW_ARB_window_pos = !_glewInit_GL_ARB_window_pos(); +#endif /* GL_ARB_window_pos */ +#ifdef GL_ATI_draw_buffers + if (glewExperimental || GLEW_ATI_draw_buffers) GLEW_ATI_draw_buffers = !_glewInit_GL_ATI_draw_buffers(); +#endif /* GL_ATI_draw_buffers */ +#ifdef GL_ATI_element_array + if (glewExperimental || GLEW_ATI_element_array) GLEW_ATI_element_array = !_glewInit_GL_ATI_element_array(); +#endif /* GL_ATI_element_array */ +#ifdef GL_ATI_envmap_bumpmap + if (glewExperimental || GLEW_ATI_envmap_bumpmap) GLEW_ATI_envmap_bumpmap = !_glewInit_GL_ATI_envmap_bumpmap(); +#endif /* GL_ATI_envmap_bumpmap */ +#ifdef GL_ATI_fragment_shader + if (glewExperimental || GLEW_ATI_fragment_shader) GLEW_ATI_fragment_shader = !_glewInit_GL_ATI_fragment_shader(); +#endif /* GL_ATI_fragment_shader */ +#ifdef GL_ATI_map_object_buffer + if (glewExperimental || GLEW_ATI_map_object_buffer) GLEW_ATI_map_object_buffer = !_glewInit_GL_ATI_map_object_buffer(); +#endif /* GL_ATI_map_object_buffer */ +#ifdef GL_ATI_pn_triangles + if (glewExperimental || GLEW_ATI_pn_triangles) GLEW_ATI_pn_triangles = !_glewInit_GL_ATI_pn_triangles(); +#endif /* GL_ATI_pn_triangles */ +#ifdef GL_ATI_separate_stencil + if (glewExperimental || GLEW_ATI_separate_stencil) GLEW_ATI_separate_stencil = !_glewInit_GL_ATI_separate_stencil(); +#endif /* GL_ATI_separate_stencil */ +#ifdef GL_ATI_vertex_array_object + if (glewExperimental || GLEW_ATI_vertex_array_object) GLEW_ATI_vertex_array_object = !_glewInit_GL_ATI_vertex_array_object(); +#endif /* GL_ATI_vertex_array_object */ +#ifdef GL_ATI_vertex_attrib_array_object + if (glewExperimental || GLEW_ATI_vertex_attrib_array_object) GLEW_ATI_vertex_attrib_array_object = !_glewInit_GL_ATI_vertex_attrib_array_object(); +#endif /* GL_ATI_vertex_attrib_array_object */ +#ifdef GL_ATI_vertex_streams + if (glewExperimental || GLEW_ATI_vertex_streams) GLEW_ATI_vertex_streams = !_glewInit_GL_ATI_vertex_streams(); +#endif /* GL_ATI_vertex_streams */ +#ifdef GL_EXT_base_instance + if (glewExperimental || GLEW_EXT_base_instance) GLEW_EXT_base_instance = !_glewInit_GL_EXT_base_instance(); +#endif /* GL_EXT_base_instance */ +#ifdef GL_EXT_bindable_uniform + if (glewExperimental || GLEW_EXT_bindable_uniform) GLEW_EXT_bindable_uniform = !_glewInit_GL_EXT_bindable_uniform(); +#endif /* GL_EXT_bindable_uniform */ +#ifdef GL_EXT_blend_color + if (glewExperimental || GLEW_EXT_blend_color) GLEW_EXT_blend_color = !_glewInit_GL_EXT_blend_color(); +#endif /* GL_EXT_blend_color */ +#ifdef GL_EXT_blend_equation_separate + if (glewExperimental || GLEW_EXT_blend_equation_separate) GLEW_EXT_blend_equation_separate = !_glewInit_GL_EXT_blend_equation_separate(); +#endif /* GL_EXT_blend_equation_separate */ +#ifdef GL_EXT_blend_func_extended + if (glewExperimental || GLEW_EXT_blend_func_extended) GLEW_EXT_blend_func_extended = !_glewInit_GL_EXT_blend_func_extended(); +#endif /* GL_EXT_blend_func_extended */ +#ifdef GL_EXT_blend_func_separate + if (glewExperimental || GLEW_EXT_blend_func_separate) GLEW_EXT_blend_func_separate = !_glewInit_GL_EXT_blend_func_separate(); +#endif /* GL_EXT_blend_func_separate */ +#ifdef GL_EXT_blend_minmax + if (glewExperimental || GLEW_EXT_blend_minmax) GLEW_EXT_blend_minmax = !_glewInit_GL_EXT_blend_minmax(); +#endif /* GL_EXT_blend_minmax */ +#ifdef GL_EXT_buffer_storage + if (glewExperimental || GLEW_EXT_buffer_storage) GLEW_EXT_buffer_storage = !_glewInit_GL_EXT_buffer_storage(); +#endif /* GL_EXT_buffer_storage */ +#ifdef GL_EXT_clear_texture + if (glewExperimental || GLEW_EXT_clear_texture) GLEW_EXT_clear_texture = !_glewInit_GL_EXT_clear_texture(); +#endif /* GL_EXT_clear_texture */ +#ifdef GL_EXT_color_subtable + if (glewExperimental || GLEW_EXT_color_subtable) GLEW_EXT_color_subtable = !_glewInit_GL_EXT_color_subtable(); +#endif /* GL_EXT_color_subtable */ +#ifdef GL_EXT_compiled_vertex_array + if (glewExperimental || GLEW_EXT_compiled_vertex_array) GLEW_EXT_compiled_vertex_array = !_glewInit_GL_EXT_compiled_vertex_array(); +#endif /* GL_EXT_compiled_vertex_array */ +#ifdef GL_EXT_convolution + if (glewExperimental || GLEW_EXT_convolution) GLEW_EXT_convolution = !_glewInit_GL_EXT_convolution(); +#endif /* GL_EXT_convolution */ +#ifdef GL_EXT_coordinate_frame + if (glewExperimental || GLEW_EXT_coordinate_frame) GLEW_EXT_coordinate_frame = !_glewInit_GL_EXT_coordinate_frame(); +#endif /* GL_EXT_coordinate_frame */ +#ifdef GL_EXT_copy_image + if (glewExperimental || GLEW_EXT_copy_image) GLEW_EXT_copy_image = !_glewInit_GL_EXT_copy_image(); +#endif /* GL_EXT_copy_image */ +#ifdef GL_EXT_copy_texture + if (glewExperimental || GLEW_EXT_copy_texture) GLEW_EXT_copy_texture = !_glewInit_GL_EXT_copy_texture(); +#endif /* GL_EXT_copy_texture */ +#ifdef GL_EXT_cull_vertex + if (glewExperimental || GLEW_EXT_cull_vertex) GLEW_EXT_cull_vertex = !_glewInit_GL_EXT_cull_vertex(); +#endif /* GL_EXT_cull_vertex */ +#ifdef GL_EXT_debug_label + if (glewExperimental || GLEW_EXT_debug_label) GLEW_EXT_debug_label = !_glewInit_GL_EXT_debug_label(); +#endif /* GL_EXT_debug_label */ +#ifdef GL_EXT_debug_marker + if (glewExperimental || GLEW_EXT_debug_marker) GLEW_EXT_debug_marker = !_glewInit_GL_EXT_debug_marker(); +#endif /* GL_EXT_debug_marker */ +#ifdef GL_EXT_depth_bounds_test + if (glewExperimental || GLEW_EXT_depth_bounds_test) GLEW_EXT_depth_bounds_test = !_glewInit_GL_EXT_depth_bounds_test(); +#endif /* GL_EXT_depth_bounds_test */ +#ifdef GL_EXT_direct_state_access + if (glewExperimental || GLEW_EXT_direct_state_access) GLEW_EXT_direct_state_access = !_glewInit_GL_EXT_direct_state_access(); +#endif /* GL_EXT_direct_state_access */ +#ifdef GL_EXT_discard_framebuffer + if (glewExperimental || GLEW_EXT_discard_framebuffer) GLEW_EXT_discard_framebuffer = !_glewInit_GL_EXT_discard_framebuffer(); +#endif /* GL_EXT_discard_framebuffer */ +#ifdef GL_EXT_draw_buffers + if (glewExperimental || GLEW_EXT_draw_buffers) GLEW_EXT_draw_buffers = !_glewInit_GL_EXT_draw_buffers(); +#endif /* GL_EXT_draw_buffers */ +#ifdef GL_EXT_draw_buffers2 + if (glewExperimental || GLEW_EXT_draw_buffers2) GLEW_EXT_draw_buffers2 = !_glewInit_GL_EXT_draw_buffers2(); +#endif /* GL_EXT_draw_buffers2 */ +#ifdef GL_EXT_draw_buffers_indexed + if (glewExperimental || GLEW_EXT_draw_buffers_indexed) GLEW_EXT_draw_buffers_indexed = !_glewInit_GL_EXT_draw_buffers_indexed(); +#endif /* GL_EXT_draw_buffers_indexed */ +#ifdef GL_EXT_draw_elements_base_vertex + if (glewExperimental || GLEW_EXT_draw_elements_base_vertex) GLEW_EXT_draw_elements_base_vertex = !_glewInit_GL_EXT_draw_elements_base_vertex(); +#endif /* GL_EXT_draw_elements_base_vertex */ +#ifdef GL_EXT_draw_instanced + if (glewExperimental || GLEW_EXT_draw_instanced) GLEW_EXT_draw_instanced = !_glewInit_GL_EXT_draw_instanced(); +#endif /* GL_EXT_draw_instanced */ +#ifdef GL_EXT_draw_range_elements + if (glewExperimental || GLEW_EXT_draw_range_elements) GLEW_EXT_draw_range_elements = !_glewInit_GL_EXT_draw_range_elements(); +#endif /* GL_EXT_draw_range_elements */ +#ifdef GL_EXT_external_buffer + if (glewExperimental || GLEW_EXT_external_buffer) GLEW_EXT_external_buffer = !_glewInit_GL_EXT_external_buffer(); +#endif /* GL_EXT_external_buffer */ +#ifdef GL_EXT_fog_coord + if (glewExperimental || GLEW_EXT_fog_coord) GLEW_EXT_fog_coord = !_glewInit_GL_EXT_fog_coord(); +#endif /* GL_EXT_fog_coord */ +#ifdef GL_EXT_fragment_lighting + if (glewExperimental || GLEW_EXT_fragment_lighting) GLEW_EXT_fragment_lighting = !_glewInit_GL_EXT_fragment_lighting(); +#endif /* GL_EXT_fragment_lighting */ +#ifdef GL_EXT_framebuffer_blit + if (glewExperimental || GLEW_EXT_framebuffer_blit) GLEW_EXT_framebuffer_blit = !_glewInit_GL_EXT_framebuffer_blit(); +#endif /* GL_EXT_framebuffer_blit */ +#ifdef GL_EXT_framebuffer_multisample + if (glewExperimental || GLEW_EXT_framebuffer_multisample) GLEW_EXT_framebuffer_multisample = !_glewInit_GL_EXT_framebuffer_multisample(); +#endif /* GL_EXT_framebuffer_multisample */ +#ifdef GL_EXT_framebuffer_object + if (glewExperimental || GLEW_EXT_framebuffer_object) GLEW_EXT_framebuffer_object = !_glewInit_GL_EXT_framebuffer_object(); +#endif /* GL_EXT_framebuffer_object */ +#ifdef GL_EXT_geometry_shader4 + if (glewExperimental || GLEW_EXT_geometry_shader4) GLEW_EXT_geometry_shader4 = !_glewInit_GL_EXT_geometry_shader4(); +#endif /* GL_EXT_geometry_shader4 */ +#ifdef GL_EXT_gpu_program_parameters + if (glewExperimental || GLEW_EXT_gpu_program_parameters) GLEW_EXT_gpu_program_parameters = !_glewInit_GL_EXT_gpu_program_parameters(); +#endif /* GL_EXT_gpu_program_parameters */ +#ifdef GL_EXT_gpu_shader4 + if (glewExperimental || GLEW_EXT_gpu_shader4) GLEW_EXT_gpu_shader4 = !_glewInit_GL_EXT_gpu_shader4(); +#endif /* GL_EXT_gpu_shader4 */ +#ifdef GL_EXT_histogram + if (glewExperimental || GLEW_EXT_histogram) GLEW_EXT_histogram = !_glewInit_GL_EXT_histogram(); +#endif /* GL_EXT_histogram */ +#ifdef GL_EXT_index_func + if (glewExperimental || GLEW_EXT_index_func) GLEW_EXT_index_func = !_glewInit_GL_EXT_index_func(); +#endif /* GL_EXT_index_func */ +#ifdef GL_EXT_index_material + if (glewExperimental || GLEW_EXT_index_material) GLEW_EXT_index_material = !_glewInit_GL_EXT_index_material(); +#endif /* GL_EXT_index_material */ +#ifdef GL_EXT_instanced_arrays + if (glewExperimental || GLEW_EXT_instanced_arrays) GLEW_EXT_instanced_arrays = !_glewInit_GL_EXT_instanced_arrays(); +#endif /* GL_EXT_instanced_arrays */ +#ifdef GL_EXT_light_texture + if (glewExperimental || GLEW_EXT_light_texture) GLEW_EXT_light_texture = !_glewInit_GL_EXT_light_texture(); +#endif /* GL_EXT_light_texture */ +#ifdef GL_EXT_map_buffer_range + if (glewExperimental || GLEW_EXT_map_buffer_range) GLEW_EXT_map_buffer_range = !_glewInit_GL_EXT_map_buffer_range(); +#endif /* GL_EXT_map_buffer_range */ +#ifdef GL_EXT_memory_object + if (glewExperimental || GLEW_EXT_memory_object) GLEW_EXT_memory_object = !_glewInit_GL_EXT_memory_object(); +#endif /* GL_EXT_memory_object */ +#ifdef GL_EXT_memory_object_fd + if (glewExperimental || GLEW_EXT_memory_object_fd) GLEW_EXT_memory_object_fd = !_glewInit_GL_EXT_memory_object_fd(); +#endif /* GL_EXT_memory_object_fd */ +#ifdef GL_EXT_memory_object_win32 + if (glewExperimental || GLEW_EXT_memory_object_win32) GLEW_EXT_memory_object_win32 = !_glewInit_GL_EXT_memory_object_win32(); +#endif /* GL_EXT_memory_object_win32 */ +#ifdef GL_EXT_multi_draw_arrays + if (glewExperimental || GLEW_EXT_multi_draw_arrays) GLEW_EXT_multi_draw_arrays = !_glewInit_GL_EXT_multi_draw_arrays(); +#endif /* GL_EXT_multi_draw_arrays */ +#ifdef GL_EXT_multi_draw_indirect + if (glewExperimental || GLEW_EXT_multi_draw_indirect) GLEW_EXT_multi_draw_indirect = !_glewInit_GL_EXT_multi_draw_indirect(); +#endif /* GL_EXT_multi_draw_indirect */ +#ifdef GL_EXT_multisample + if (glewExperimental || GLEW_EXT_multisample) GLEW_EXT_multisample = !_glewInit_GL_EXT_multisample(); +#endif /* GL_EXT_multisample */ +#ifdef GL_EXT_multisampled_render_to_texture + if (glewExperimental || GLEW_EXT_multisampled_render_to_texture) GLEW_EXT_multisampled_render_to_texture = !_glewInit_GL_EXT_multisampled_render_to_texture(); +#endif /* GL_EXT_multisampled_render_to_texture */ +#ifdef GL_EXT_multiview_draw_buffers + if (glewExperimental || GLEW_EXT_multiview_draw_buffers) GLEW_EXT_multiview_draw_buffers = !_glewInit_GL_EXT_multiview_draw_buffers(); +#endif /* GL_EXT_multiview_draw_buffers */ +#ifdef GL_EXT_paletted_texture + if (glewExperimental || GLEW_EXT_paletted_texture) GLEW_EXT_paletted_texture = !_glewInit_GL_EXT_paletted_texture(); +#endif /* GL_EXT_paletted_texture */ +#ifdef GL_EXT_pixel_transform + if (glewExperimental || GLEW_EXT_pixel_transform) GLEW_EXT_pixel_transform = !_glewInit_GL_EXT_pixel_transform(); +#endif /* GL_EXT_pixel_transform */ +#ifdef GL_EXT_point_parameters + if (glewExperimental || GLEW_EXT_point_parameters) GLEW_EXT_point_parameters = !_glewInit_GL_EXT_point_parameters(); +#endif /* GL_EXT_point_parameters */ +#ifdef GL_EXT_polygon_offset + if (glewExperimental || GLEW_EXT_polygon_offset) GLEW_EXT_polygon_offset = !_glewInit_GL_EXT_polygon_offset(); +#endif /* GL_EXT_polygon_offset */ +#ifdef GL_EXT_polygon_offset_clamp + if (glewExperimental || GLEW_EXT_polygon_offset_clamp) GLEW_EXT_polygon_offset_clamp = !_glewInit_GL_EXT_polygon_offset_clamp(); +#endif /* GL_EXT_polygon_offset_clamp */ +#ifdef GL_EXT_provoking_vertex + if (glewExperimental || GLEW_EXT_provoking_vertex) GLEW_EXT_provoking_vertex = !_glewInit_GL_EXT_provoking_vertex(); +#endif /* GL_EXT_provoking_vertex */ +#ifdef GL_EXT_raster_multisample + if (glewExperimental || GLEW_EXT_raster_multisample) GLEW_EXT_raster_multisample = !_glewInit_GL_EXT_raster_multisample(); +#endif /* GL_EXT_raster_multisample */ +#ifdef GL_EXT_scene_marker + if (glewExperimental || GLEW_EXT_scene_marker) GLEW_EXT_scene_marker = !_glewInit_GL_EXT_scene_marker(); +#endif /* GL_EXT_scene_marker */ +#ifdef GL_EXT_secondary_color + if (glewExperimental || GLEW_EXT_secondary_color) GLEW_EXT_secondary_color = !_glewInit_GL_EXT_secondary_color(); +#endif /* GL_EXT_secondary_color */ +#ifdef GL_EXT_semaphore + if (glewExperimental || GLEW_EXT_semaphore) GLEW_EXT_semaphore = !_glewInit_GL_EXT_semaphore(); +#endif /* GL_EXT_semaphore */ +#ifdef GL_EXT_semaphore_fd + if (glewExperimental || GLEW_EXT_semaphore_fd) GLEW_EXT_semaphore_fd = !_glewInit_GL_EXT_semaphore_fd(); +#endif /* GL_EXT_semaphore_fd */ +#ifdef GL_EXT_semaphore_win32 + if (glewExperimental || GLEW_EXT_semaphore_win32) GLEW_EXT_semaphore_win32 = !_glewInit_GL_EXT_semaphore_win32(); +#endif /* GL_EXT_semaphore_win32 */ +#ifdef GL_EXT_separate_shader_objects + if (glewExperimental || GLEW_EXT_separate_shader_objects) GLEW_EXT_separate_shader_objects = !_glewInit_GL_EXT_separate_shader_objects(); +#endif /* GL_EXT_separate_shader_objects */ +#ifdef GL_EXT_shader_image_load_store + if (glewExperimental || GLEW_EXT_shader_image_load_store) GLEW_EXT_shader_image_load_store = !_glewInit_GL_EXT_shader_image_load_store(); +#endif /* GL_EXT_shader_image_load_store */ +#ifdef GL_EXT_shader_pixel_local_storage2 + if (glewExperimental || GLEW_EXT_shader_pixel_local_storage2) GLEW_EXT_shader_pixel_local_storage2 = !_glewInit_GL_EXT_shader_pixel_local_storage2(); +#endif /* GL_EXT_shader_pixel_local_storage2 */ +#ifdef GL_EXT_sparse_texture + if (glewExperimental || GLEW_EXT_sparse_texture) GLEW_EXT_sparse_texture = !_glewInit_GL_EXT_sparse_texture(); +#endif /* GL_EXT_sparse_texture */ +#ifdef GL_EXT_stencil_two_side + if (glewExperimental || GLEW_EXT_stencil_two_side) GLEW_EXT_stencil_two_side = !_glewInit_GL_EXT_stencil_two_side(); +#endif /* GL_EXT_stencil_two_side */ +#ifdef GL_EXT_subtexture + if (glewExperimental || GLEW_EXT_subtexture) GLEW_EXT_subtexture = !_glewInit_GL_EXT_subtexture(); +#endif /* GL_EXT_subtexture */ +#ifdef GL_EXT_texture3D + if (glewExperimental || GLEW_EXT_texture3D) GLEW_EXT_texture3D = !_glewInit_GL_EXT_texture3D(); +#endif /* GL_EXT_texture3D */ +#ifdef GL_EXT_texture_array + if (glewExperimental || GLEW_EXT_texture_array) GLEW_EXT_texture_array = !_glewInit_GL_EXT_texture_array(); +#endif /* GL_EXT_texture_array */ +#ifdef GL_EXT_texture_buffer_object + if (glewExperimental || GLEW_EXT_texture_buffer_object) GLEW_EXT_texture_buffer_object = !_glewInit_GL_EXT_texture_buffer_object(); +#endif /* GL_EXT_texture_buffer_object */ +#ifdef GL_EXT_texture_integer + if (glewExperimental || GLEW_EXT_texture_integer) GLEW_EXT_texture_integer = !_glewInit_GL_EXT_texture_integer(); +#endif /* GL_EXT_texture_integer */ +#ifdef GL_EXT_texture_object + if (glewExperimental || GLEW_EXT_texture_object) GLEW_EXT_texture_object = !_glewInit_GL_EXT_texture_object(); +#endif /* GL_EXT_texture_object */ +#ifdef GL_EXT_texture_perturb_normal + if (glewExperimental || GLEW_EXT_texture_perturb_normal) GLEW_EXT_texture_perturb_normal = !_glewInit_GL_EXT_texture_perturb_normal(); +#endif /* GL_EXT_texture_perturb_normal */ +#ifdef GL_EXT_texture_storage + if (glewExperimental || GLEW_EXT_texture_storage) GLEW_EXT_texture_storage = !_glewInit_GL_EXT_texture_storage(); +#endif /* GL_EXT_texture_storage */ +#ifdef GL_EXT_texture_view + if (glewExperimental || GLEW_EXT_texture_view) GLEW_EXT_texture_view = !_glewInit_GL_EXT_texture_view(); +#endif /* GL_EXT_texture_view */ +#ifdef GL_EXT_timer_query + if (glewExperimental || GLEW_EXT_timer_query) GLEW_EXT_timer_query = !_glewInit_GL_EXT_timer_query(); +#endif /* GL_EXT_timer_query */ +#ifdef GL_EXT_transform_feedback + if (glewExperimental || GLEW_EXT_transform_feedback) GLEW_EXT_transform_feedback = !_glewInit_GL_EXT_transform_feedback(); +#endif /* GL_EXT_transform_feedback */ +#ifdef GL_EXT_vertex_array + if (glewExperimental || GLEW_EXT_vertex_array) GLEW_EXT_vertex_array = !_glewInit_GL_EXT_vertex_array(); +#endif /* GL_EXT_vertex_array */ +#ifdef GL_EXT_vertex_array_setXXX + if (glewExperimental || GLEW_EXT_vertex_array_setXXX) GLEW_EXT_vertex_array_setXXX = !_glewInit_GL_EXT_vertex_array_setXXX(); +#endif /* GL_EXT_vertex_array_setXXX */ +#ifdef GL_EXT_vertex_attrib_64bit + if (glewExperimental || GLEW_EXT_vertex_attrib_64bit) GLEW_EXT_vertex_attrib_64bit = !_glewInit_GL_EXT_vertex_attrib_64bit(); +#endif /* GL_EXT_vertex_attrib_64bit */ +#ifdef GL_EXT_vertex_shader + if (glewExperimental || GLEW_EXT_vertex_shader) GLEW_EXT_vertex_shader = !_glewInit_GL_EXT_vertex_shader(); +#endif /* GL_EXT_vertex_shader */ +#ifdef GL_EXT_vertex_weighting + if (glewExperimental || GLEW_EXT_vertex_weighting) GLEW_EXT_vertex_weighting = !_glewInit_GL_EXT_vertex_weighting(); +#endif /* GL_EXT_vertex_weighting */ +#ifdef GL_EXT_win32_keyed_mutex + if (glewExperimental || GLEW_EXT_win32_keyed_mutex) GLEW_EXT_win32_keyed_mutex = !_glewInit_GL_EXT_win32_keyed_mutex(); +#endif /* GL_EXT_win32_keyed_mutex */ +#ifdef GL_EXT_window_rectangles + if (glewExperimental || GLEW_EXT_window_rectangles) GLEW_EXT_window_rectangles = !_glewInit_GL_EXT_window_rectangles(); +#endif /* GL_EXT_window_rectangles */ +#ifdef GL_EXT_x11_sync_object + if (glewExperimental || GLEW_EXT_x11_sync_object) GLEW_EXT_x11_sync_object = !_glewInit_GL_EXT_x11_sync_object(); +#endif /* GL_EXT_x11_sync_object */ +#ifdef GL_GREMEDY_frame_terminator + if (glewExperimental || GLEW_GREMEDY_frame_terminator) GLEW_GREMEDY_frame_terminator = !_glewInit_GL_GREMEDY_frame_terminator(); +#endif /* GL_GREMEDY_frame_terminator */ +#ifdef GL_GREMEDY_string_marker + if (glewExperimental || GLEW_GREMEDY_string_marker) GLEW_GREMEDY_string_marker = !_glewInit_GL_GREMEDY_string_marker(); +#endif /* GL_GREMEDY_string_marker */ +#ifdef GL_HP_image_transform + if (glewExperimental || GLEW_HP_image_transform) GLEW_HP_image_transform = !_glewInit_GL_HP_image_transform(); +#endif /* GL_HP_image_transform */ +#ifdef GL_IBM_multimode_draw_arrays + if (glewExperimental || GLEW_IBM_multimode_draw_arrays) GLEW_IBM_multimode_draw_arrays = !_glewInit_GL_IBM_multimode_draw_arrays(); +#endif /* GL_IBM_multimode_draw_arrays */ +#ifdef GL_IBM_vertex_array_lists + if (glewExperimental || GLEW_IBM_vertex_array_lists) GLEW_IBM_vertex_array_lists = !_glewInit_GL_IBM_vertex_array_lists(); +#endif /* GL_IBM_vertex_array_lists */ +#ifdef GL_INTEL_map_texture + if (glewExperimental || GLEW_INTEL_map_texture) GLEW_INTEL_map_texture = !_glewInit_GL_INTEL_map_texture(); +#endif /* GL_INTEL_map_texture */ +#ifdef GL_INTEL_parallel_arrays + if (glewExperimental || GLEW_INTEL_parallel_arrays) GLEW_INTEL_parallel_arrays = !_glewInit_GL_INTEL_parallel_arrays(); +#endif /* GL_INTEL_parallel_arrays */ +#ifdef GL_INTEL_performance_query + if (glewExperimental || GLEW_INTEL_performance_query) GLEW_INTEL_performance_query = !_glewInit_GL_INTEL_performance_query(); +#endif /* GL_INTEL_performance_query */ +#ifdef GL_INTEL_texture_scissor + if (glewExperimental || GLEW_INTEL_texture_scissor) GLEW_INTEL_texture_scissor = !_glewInit_GL_INTEL_texture_scissor(); +#endif /* GL_INTEL_texture_scissor */ +#ifdef GL_KHR_blend_equation_advanced + if (glewExperimental || GLEW_KHR_blend_equation_advanced) GLEW_KHR_blend_equation_advanced = !_glewInit_GL_KHR_blend_equation_advanced(); +#endif /* GL_KHR_blend_equation_advanced */ +#ifdef GL_KHR_debug + if (glewExperimental || GLEW_KHR_debug) GLEW_KHR_debug = !_glewInit_GL_KHR_debug(); +#endif /* GL_KHR_debug */ +#ifdef GL_KHR_parallel_shader_compile + if (glewExperimental || GLEW_KHR_parallel_shader_compile) GLEW_KHR_parallel_shader_compile = !_glewInit_GL_KHR_parallel_shader_compile(); +#endif /* GL_KHR_parallel_shader_compile */ +#ifdef GL_KHR_robustness + if (glewExperimental || GLEW_KHR_robustness) GLEW_KHR_robustness = !_glewInit_GL_KHR_robustness(); +#endif /* GL_KHR_robustness */ +#ifdef GL_KTX_buffer_region + if (glewExperimental || GLEW_KTX_buffer_region) GLEW_KTX_buffer_region = !_glewInit_GL_KTX_buffer_region(); +#endif /* GL_KTX_buffer_region */ +#ifdef GL_MESA_resize_buffers + if (glewExperimental || GLEW_MESA_resize_buffers) GLEW_MESA_resize_buffers = !_glewInit_GL_MESA_resize_buffers(); +#endif /* GL_MESA_resize_buffers */ +#ifdef GL_MESA_window_pos + if (glewExperimental || GLEW_MESA_window_pos) GLEW_MESA_window_pos = !_glewInit_GL_MESA_window_pos(); +#endif /* GL_MESA_window_pos */ +#ifdef GL_NVX_conditional_render + if (glewExperimental || GLEW_NVX_conditional_render) GLEW_NVX_conditional_render = !_glewInit_GL_NVX_conditional_render(); +#endif /* GL_NVX_conditional_render */ +#ifdef GL_NVX_linked_gpu_multicast + if (glewExperimental || GLEW_NVX_linked_gpu_multicast) GLEW_NVX_linked_gpu_multicast = !_glewInit_GL_NVX_linked_gpu_multicast(); +#endif /* GL_NVX_linked_gpu_multicast */ +#ifdef GL_NV_3dvision_settings + if (glewExperimental || GLEW_NV_3dvision_settings) GLEW_NV_3dvision_settings = !_glewInit_GL_NV_3dvision_settings(); +#endif /* GL_NV_3dvision_settings */ +#ifdef GL_NV_bindless_multi_draw_indirect + if (glewExperimental || GLEW_NV_bindless_multi_draw_indirect) GLEW_NV_bindless_multi_draw_indirect = !_glewInit_GL_NV_bindless_multi_draw_indirect(); +#endif /* GL_NV_bindless_multi_draw_indirect */ +#ifdef GL_NV_bindless_multi_draw_indirect_count + if (glewExperimental || GLEW_NV_bindless_multi_draw_indirect_count) GLEW_NV_bindless_multi_draw_indirect_count = !_glewInit_GL_NV_bindless_multi_draw_indirect_count(); +#endif /* GL_NV_bindless_multi_draw_indirect_count */ +#ifdef GL_NV_bindless_texture + if (glewExperimental || GLEW_NV_bindless_texture) GLEW_NV_bindless_texture = !_glewInit_GL_NV_bindless_texture(); +#endif /* GL_NV_bindless_texture */ +#ifdef GL_NV_blend_equation_advanced + if (glewExperimental || GLEW_NV_blend_equation_advanced) GLEW_NV_blend_equation_advanced = !_glewInit_GL_NV_blend_equation_advanced(); +#endif /* GL_NV_blend_equation_advanced */ +#ifdef GL_NV_clip_space_w_scaling + if (glewExperimental || GLEW_NV_clip_space_w_scaling) GLEW_NV_clip_space_w_scaling = !_glewInit_GL_NV_clip_space_w_scaling(); +#endif /* GL_NV_clip_space_w_scaling */ +#ifdef GL_NV_command_list + if (glewExperimental || GLEW_NV_command_list) GLEW_NV_command_list = !_glewInit_GL_NV_command_list(); +#endif /* GL_NV_command_list */ +#ifdef GL_NV_conditional_render + if (glewExperimental || GLEW_NV_conditional_render) GLEW_NV_conditional_render = !_glewInit_GL_NV_conditional_render(); +#endif /* GL_NV_conditional_render */ +#ifdef GL_NV_conservative_raster + if (glewExperimental || GLEW_NV_conservative_raster) GLEW_NV_conservative_raster = !_glewInit_GL_NV_conservative_raster(); +#endif /* GL_NV_conservative_raster */ +#ifdef GL_NV_conservative_raster_dilate + if (glewExperimental || GLEW_NV_conservative_raster_dilate) GLEW_NV_conservative_raster_dilate = !_glewInit_GL_NV_conservative_raster_dilate(); +#endif /* GL_NV_conservative_raster_dilate */ +#ifdef GL_NV_conservative_raster_pre_snap_triangles + if (glewExperimental || GLEW_NV_conservative_raster_pre_snap_triangles) GLEW_NV_conservative_raster_pre_snap_triangles = !_glewInit_GL_NV_conservative_raster_pre_snap_triangles(); +#endif /* GL_NV_conservative_raster_pre_snap_triangles */ +#ifdef GL_NV_copy_buffer + if (glewExperimental || GLEW_NV_copy_buffer) GLEW_NV_copy_buffer = !_glewInit_GL_NV_copy_buffer(); +#endif /* GL_NV_copy_buffer */ +#ifdef GL_NV_copy_image + if (glewExperimental || GLEW_NV_copy_image) GLEW_NV_copy_image = !_glewInit_GL_NV_copy_image(); +#endif /* GL_NV_copy_image */ +#ifdef GL_NV_depth_buffer_float + if (glewExperimental || GLEW_NV_depth_buffer_float) GLEW_NV_depth_buffer_float = !_glewInit_GL_NV_depth_buffer_float(); +#endif /* GL_NV_depth_buffer_float */ +#ifdef GL_NV_draw_buffers + if (glewExperimental || GLEW_NV_draw_buffers) GLEW_NV_draw_buffers = !_glewInit_GL_NV_draw_buffers(); +#endif /* GL_NV_draw_buffers */ +#ifdef GL_NV_draw_instanced + if (glewExperimental || GLEW_NV_draw_instanced) GLEW_NV_draw_instanced = !_glewInit_GL_NV_draw_instanced(); +#endif /* GL_NV_draw_instanced */ +#ifdef GL_NV_draw_texture + if (glewExperimental || GLEW_NV_draw_texture) GLEW_NV_draw_texture = !_glewInit_GL_NV_draw_texture(); +#endif /* GL_NV_draw_texture */ +#ifdef GL_NV_draw_vulkan_image + if (glewExperimental || GLEW_NV_draw_vulkan_image) GLEW_NV_draw_vulkan_image = !_glewInit_GL_NV_draw_vulkan_image(); +#endif /* GL_NV_draw_vulkan_image */ +#ifdef GL_NV_evaluators + if (glewExperimental || GLEW_NV_evaluators) GLEW_NV_evaluators = !_glewInit_GL_NV_evaluators(); +#endif /* GL_NV_evaluators */ +#ifdef GL_NV_explicit_multisample + if (glewExperimental || GLEW_NV_explicit_multisample) GLEW_NV_explicit_multisample = !_glewInit_GL_NV_explicit_multisample(); +#endif /* GL_NV_explicit_multisample */ +#ifdef GL_NV_fence + if (glewExperimental || GLEW_NV_fence) GLEW_NV_fence = !_glewInit_GL_NV_fence(); +#endif /* GL_NV_fence */ +#ifdef GL_NV_fragment_coverage_to_color + if (glewExperimental || GLEW_NV_fragment_coverage_to_color) GLEW_NV_fragment_coverage_to_color = !_glewInit_GL_NV_fragment_coverage_to_color(); +#endif /* GL_NV_fragment_coverage_to_color */ +#ifdef GL_NV_fragment_program + if (glewExperimental || GLEW_NV_fragment_program) GLEW_NV_fragment_program = !_glewInit_GL_NV_fragment_program(); +#endif /* GL_NV_fragment_program */ +#ifdef GL_NV_framebuffer_blit + if (glewExperimental || GLEW_NV_framebuffer_blit) GLEW_NV_framebuffer_blit = !_glewInit_GL_NV_framebuffer_blit(); +#endif /* GL_NV_framebuffer_blit */ +#ifdef GL_NV_framebuffer_multisample + if (glewExperimental || GLEW_NV_framebuffer_multisample) GLEW_NV_framebuffer_multisample = !_glewInit_GL_NV_framebuffer_multisample(); +#endif /* GL_NV_framebuffer_multisample */ +#ifdef GL_NV_framebuffer_multisample_coverage + if (glewExperimental || GLEW_NV_framebuffer_multisample_coverage) GLEW_NV_framebuffer_multisample_coverage = !_glewInit_GL_NV_framebuffer_multisample_coverage(); +#endif /* GL_NV_framebuffer_multisample_coverage */ +#ifdef GL_NV_geometry_program4 + if (glewExperimental || GLEW_NV_geometry_program4) GLEW_NV_geometry_program4 = !_glewInit_GL_NV_geometry_program4(); +#endif /* GL_NV_geometry_program4 */ +#ifdef GL_NV_gpu_multicast + if (glewExperimental || GLEW_NV_gpu_multicast) GLEW_NV_gpu_multicast = !_glewInit_GL_NV_gpu_multicast(); +#endif /* GL_NV_gpu_multicast */ +#ifdef GL_NV_gpu_program4 + if (glewExperimental || GLEW_NV_gpu_program4) GLEW_NV_gpu_program4 = !_glewInit_GL_NV_gpu_program4(); +#endif /* GL_NV_gpu_program4 */ +#ifdef GL_NV_gpu_shader5 + if (glewExperimental || GLEW_NV_gpu_shader5) GLEW_NV_gpu_shader5 = !_glewInit_GL_NV_gpu_shader5(); +#endif /* GL_NV_gpu_shader5 */ +#ifdef GL_NV_half_float + if (glewExperimental || GLEW_NV_half_float) GLEW_NV_half_float = !_glewInit_GL_NV_half_float(); +#endif /* GL_NV_half_float */ +#ifdef GL_NV_instanced_arrays + if (glewExperimental || GLEW_NV_instanced_arrays) GLEW_NV_instanced_arrays = !_glewInit_GL_NV_instanced_arrays(); +#endif /* GL_NV_instanced_arrays */ +#ifdef GL_NV_internalformat_sample_query + if (glewExperimental || GLEW_NV_internalformat_sample_query) GLEW_NV_internalformat_sample_query = !_glewInit_GL_NV_internalformat_sample_query(); +#endif /* GL_NV_internalformat_sample_query */ +#ifdef GL_NV_non_square_matrices + if (glewExperimental || GLEW_NV_non_square_matrices) GLEW_NV_non_square_matrices = !_glewInit_GL_NV_non_square_matrices(); +#endif /* GL_NV_non_square_matrices */ +#ifdef GL_NV_occlusion_query + if (glewExperimental || GLEW_NV_occlusion_query) GLEW_NV_occlusion_query = !_glewInit_GL_NV_occlusion_query(); +#endif /* GL_NV_occlusion_query */ +#ifdef GL_NV_parameter_buffer_object + if (glewExperimental || GLEW_NV_parameter_buffer_object) GLEW_NV_parameter_buffer_object = !_glewInit_GL_NV_parameter_buffer_object(); +#endif /* GL_NV_parameter_buffer_object */ +#ifdef GL_NV_path_rendering + if (glewExperimental || GLEW_NV_path_rendering) GLEW_NV_path_rendering = !_glewInit_GL_NV_path_rendering(); +#endif /* GL_NV_path_rendering */ +#ifdef GL_NV_pixel_data_range + if (glewExperimental || GLEW_NV_pixel_data_range) GLEW_NV_pixel_data_range = !_glewInit_GL_NV_pixel_data_range(); +#endif /* GL_NV_pixel_data_range */ +#ifdef GL_NV_point_sprite + if (glewExperimental || GLEW_NV_point_sprite) GLEW_NV_point_sprite = !_glewInit_GL_NV_point_sprite(); +#endif /* GL_NV_point_sprite */ +#ifdef GL_NV_polygon_mode + if (glewExperimental || GLEW_NV_polygon_mode) GLEW_NV_polygon_mode = !_glewInit_GL_NV_polygon_mode(); +#endif /* GL_NV_polygon_mode */ +#ifdef GL_NV_present_video + if (glewExperimental || GLEW_NV_present_video) GLEW_NV_present_video = !_glewInit_GL_NV_present_video(); +#endif /* GL_NV_present_video */ +#ifdef GL_NV_primitive_restart + if (glewExperimental || GLEW_NV_primitive_restart) GLEW_NV_primitive_restart = !_glewInit_GL_NV_primitive_restart(); +#endif /* GL_NV_primitive_restart */ +#ifdef GL_NV_register_combiners + if (glewExperimental || GLEW_NV_register_combiners) GLEW_NV_register_combiners = !_glewInit_GL_NV_register_combiners(); +#endif /* GL_NV_register_combiners */ +#ifdef GL_NV_register_combiners2 + if (glewExperimental || GLEW_NV_register_combiners2) GLEW_NV_register_combiners2 = !_glewInit_GL_NV_register_combiners2(); +#endif /* GL_NV_register_combiners2 */ +#ifdef GL_NV_sample_locations + if (glewExperimental || GLEW_NV_sample_locations) GLEW_NV_sample_locations = !_glewInit_GL_NV_sample_locations(); +#endif /* GL_NV_sample_locations */ +#ifdef GL_NV_shader_buffer_load + if (glewExperimental || GLEW_NV_shader_buffer_load) GLEW_NV_shader_buffer_load = !_glewInit_GL_NV_shader_buffer_load(); +#endif /* GL_NV_shader_buffer_load */ +#ifdef GL_NV_texture_array + if (glewExperimental || GLEW_NV_texture_array) GLEW_NV_texture_array = !_glewInit_GL_NV_texture_array(); +#endif /* GL_NV_texture_array */ +#ifdef GL_NV_texture_barrier + if (glewExperimental || GLEW_NV_texture_barrier) GLEW_NV_texture_barrier = !_glewInit_GL_NV_texture_barrier(); +#endif /* GL_NV_texture_barrier */ +#ifdef GL_NV_texture_multisample + if (glewExperimental || GLEW_NV_texture_multisample) GLEW_NV_texture_multisample = !_glewInit_GL_NV_texture_multisample(); +#endif /* GL_NV_texture_multisample */ +#ifdef GL_NV_transform_feedback + if (glewExperimental || GLEW_NV_transform_feedback) GLEW_NV_transform_feedback = !_glewInit_GL_NV_transform_feedback(); +#endif /* GL_NV_transform_feedback */ +#ifdef GL_NV_transform_feedback2 + if (glewExperimental || GLEW_NV_transform_feedback2) GLEW_NV_transform_feedback2 = !_glewInit_GL_NV_transform_feedback2(); +#endif /* GL_NV_transform_feedback2 */ +#ifdef GL_NV_vdpau_interop + if (glewExperimental || GLEW_NV_vdpau_interop) GLEW_NV_vdpau_interop = !_glewInit_GL_NV_vdpau_interop(); +#endif /* GL_NV_vdpau_interop */ +#ifdef GL_NV_vertex_array_range + if (glewExperimental || GLEW_NV_vertex_array_range) GLEW_NV_vertex_array_range = !_glewInit_GL_NV_vertex_array_range(); +#endif /* GL_NV_vertex_array_range */ +#ifdef GL_NV_vertex_attrib_integer_64bit + if (glewExperimental || GLEW_NV_vertex_attrib_integer_64bit) GLEW_NV_vertex_attrib_integer_64bit = !_glewInit_GL_NV_vertex_attrib_integer_64bit(); +#endif /* GL_NV_vertex_attrib_integer_64bit */ +#ifdef GL_NV_vertex_buffer_unified_memory + if (glewExperimental || GLEW_NV_vertex_buffer_unified_memory) GLEW_NV_vertex_buffer_unified_memory = !_glewInit_GL_NV_vertex_buffer_unified_memory(); +#endif /* GL_NV_vertex_buffer_unified_memory */ +#ifdef GL_NV_vertex_program + if (glewExperimental || GLEW_NV_vertex_program) GLEW_NV_vertex_program = !_glewInit_GL_NV_vertex_program(); +#endif /* GL_NV_vertex_program */ +#ifdef GL_NV_video_capture + if (glewExperimental || GLEW_NV_video_capture) GLEW_NV_video_capture = !_glewInit_GL_NV_video_capture(); +#endif /* GL_NV_video_capture */ +#ifdef GL_NV_viewport_array + if (glewExperimental || GLEW_NV_viewport_array) GLEW_NV_viewport_array = !_glewInit_GL_NV_viewport_array(); +#endif /* GL_NV_viewport_array */ +#ifdef GL_NV_viewport_swizzle + if (glewExperimental || GLEW_NV_viewport_swizzle) GLEW_NV_viewport_swizzle = !_glewInit_GL_NV_viewport_swizzle(); +#endif /* GL_NV_viewport_swizzle */ +#ifdef GL_OVR_multiview + if (glewExperimental || GLEW_OVR_multiview) GLEW_OVR_multiview = !_glewInit_GL_OVR_multiview(); +#endif /* GL_OVR_multiview */ +#ifdef GL_OVR_multiview_multisampled_render_to_texture + if (glewExperimental || GLEW_OVR_multiview_multisampled_render_to_texture) GLEW_OVR_multiview_multisampled_render_to_texture = !_glewInit_GL_OVR_multiview_multisampled_render_to_texture(); +#endif /* GL_OVR_multiview_multisampled_render_to_texture */ +#ifdef GL_QCOM_alpha_test + if (glewExperimental || GLEW_QCOM_alpha_test) GLEW_QCOM_alpha_test = !_glewInit_GL_QCOM_alpha_test(); +#endif /* GL_QCOM_alpha_test */ +#ifdef GL_QCOM_driver_control + if (glewExperimental || GLEW_QCOM_driver_control) GLEW_QCOM_driver_control = !_glewInit_GL_QCOM_driver_control(); +#endif /* GL_QCOM_driver_control */ +#ifdef GL_QCOM_extended_get + if (glewExperimental || GLEW_QCOM_extended_get) GLEW_QCOM_extended_get = !_glewInit_GL_QCOM_extended_get(); +#endif /* GL_QCOM_extended_get */ +#ifdef GL_QCOM_extended_get2 + if (glewExperimental || GLEW_QCOM_extended_get2) GLEW_QCOM_extended_get2 = !_glewInit_GL_QCOM_extended_get2(); +#endif /* GL_QCOM_extended_get2 */ +#ifdef GL_QCOM_framebuffer_foveated + if (glewExperimental || GLEW_QCOM_framebuffer_foveated) GLEW_QCOM_framebuffer_foveated = !_glewInit_GL_QCOM_framebuffer_foveated(); +#endif /* GL_QCOM_framebuffer_foveated */ +#ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent + if (glewExperimental || GLEW_QCOM_shader_framebuffer_fetch_noncoherent) GLEW_QCOM_shader_framebuffer_fetch_noncoherent = !_glewInit_GL_QCOM_shader_framebuffer_fetch_noncoherent(); +#endif /* GL_QCOM_shader_framebuffer_fetch_noncoherent */ +#ifdef GL_QCOM_tiled_rendering + if (glewExperimental || GLEW_QCOM_tiled_rendering) GLEW_QCOM_tiled_rendering = !_glewInit_GL_QCOM_tiled_rendering(); +#endif /* GL_QCOM_tiled_rendering */ +#ifdef GL_REGAL_ES1_0_compatibility + if (glewExperimental || GLEW_REGAL_ES1_0_compatibility) GLEW_REGAL_ES1_0_compatibility = !_glewInit_GL_REGAL_ES1_0_compatibility(); +#endif /* GL_REGAL_ES1_0_compatibility */ +#ifdef GL_REGAL_ES1_1_compatibility + if (glewExperimental || GLEW_REGAL_ES1_1_compatibility) GLEW_REGAL_ES1_1_compatibility = !_glewInit_GL_REGAL_ES1_1_compatibility(); +#endif /* GL_REGAL_ES1_1_compatibility */ +#ifdef GL_REGAL_error_string + if (glewExperimental || GLEW_REGAL_error_string) GLEW_REGAL_error_string = !_glewInit_GL_REGAL_error_string(); +#endif /* GL_REGAL_error_string */ +#ifdef GL_REGAL_extension_query + if (glewExperimental || GLEW_REGAL_extension_query) GLEW_REGAL_extension_query = !_glewInit_GL_REGAL_extension_query(); +#endif /* GL_REGAL_extension_query */ +#ifdef GL_REGAL_log + if (glewExperimental || GLEW_REGAL_log) GLEW_REGAL_log = !_glewInit_GL_REGAL_log(); +#endif /* GL_REGAL_log */ +#ifdef GL_REGAL_proc_address + if (glewExperimental || GLEW_REGAL_proc_address) GLEW_REGAL_proc_address = !_glewInit_GL_REGAL_proc_address(); +#endif /* GL_REGAL_proc_address */ +#ifdef GL_SGIS_detail_texture + if (glewExperimental || GLEW_SGIS_detail_texture) GLEW_SGIS_detail_texture = !_glewInit_GL_SGIS_detail_texture(); +#endif /* GL_SGIS_detail_texture */ +#ifdef GL_SGIS_fog_function + if (glewExperimental || GLEW_SGIS_fog_function) GLEW_SGIS_fog_function = !_glewInit_GL_SGIS_fog_function(); +#endif /* GL_SGIS_fog_function */ +#ifdef GL_SGIS_multisample + if (glewExperimental || GLEW_SGIS_multisample) GLEW_SGIS_multisample = !_glewInit_GL_SGIS_multisample(); +#endif /* GL_SGIS_multisample */ +#ifdef GL_SGIS_multitexture + if (glewExperimental || GLEW_SGIS_multitexture) GLEW_SGIS_multitexture = !_glewInit_GL_SGIS_multitexture(); +#endif /* GL_SGIS_multitexture */ +#ifdef GL_SGIS_shared_multisample + if (glewExperimental || GLEW_SGIS_shared_multisample) GLEW_SGIS_shared_multisample = !_glewInit_GL_SGIS_shared_multisample(); +#endif /* GL_SGIS_shared_multisample */ +#ifdef GL_SGIS_sharpen_texture + if (glewExperimental || GLEW_SGIS_sharpen_texture) GLEW_SGIS_sharpen_texture = !_glewInit_GL_SGIS_sharpen_texture(); +#endif /* GL_SGIS_sharpen_texture */ +#ifdef GL_SGIS_texture4D + if (glewExperimental || GLEW_SGIS_texture4D) GLEW_SGIS_texture4D = !_glewInit_GL_SGIS_texture4D(); +#endif /* GL_SGIS_texture4D */ +#ifdef GL_SGIS_texture_filter4 + if (glewExperimental || GLEW_SGIS_texture_filter4) GLEW_SGIS_texture_filter4 = !_glewInit_GL_SGIS_texture_filter4(); +#endif /* GL_SGIS_texture_filter4 */ +#ifdef GL_SGIX_async + if (glewExperimental || GLEW_SGIX_async) GLEW_SGIX_async = !_glewInit_GL_SGIX_async(); +#endif /* GL_SGIX_async */ +#ifdef GL_SGIX_datapipe + if (glewExperimental || GLEW_SGIX_datapipe) GLEW_SGIX_datapipe = !_glewInit_GL_SGIX_datapipe(); +#endif /* GL_SGIX_datapipe */ +#ifdef GL_SGIX_flush_raster + if (glewExperimental || GLEW_SGIX_flush_raster) GLEW_SGIX_flush_raster = !_glewInit_GL_SGIX_flush_raster(); +#endif /* GL_SGIX_flush_raster */ +#ifdef GL_SGIX_fog_layers + if (glewExperimental || GLEW_SGIX_fog_layers) GLEW_SGIX_fog_layers = !_glewInit_GL_SGIX_fog_layers(); +#endif /* GL_SGIX_fog_layers */ +#ifdef GL_SGIX_fog_texture + if (glewExperimental || GLEW_SGIX_fog_texture) GLEW_SGIX_fog_texture = !_glewInit_GL_SGIX_fog_texture(); +#endif /* GL_SGIX_fog_texture */ +#ifdef GL_SGIX_fragment_specular_lighting + if (glewExperimental || GLEW_SGIX_fragment_specular_lighting) GLEW_SGIX_fragment_specular_lighting = !_glewInit_GL_SGIX_fragment_specular_lighting(); +#endif /* GL_SGIX_fragment_specular_lighting */ +#ifdef GL_SGIX_framezoom + if (glewExperimental || GLEW_SGIX_framezoom) GLEW_SGIX_framezoom = !_glewInit_GL_SGIX_framezoom(); +#endif /* GL_SGIX_framezoom */ +#ifdef GL_SGIX_igloo_interface + if (glewExperimental || GLEW_SGIX_igloo_interface) GLEW_SGIX_igloo_interface = !_glewInit_GL_SGIX_igloo_interface(); +#endif /* GL_SGIX_igloo_interface */ +#ifdef GL_SGIX_mpeg1 + if (glewExperimental || GLEW_SGIX_mpeg1) GLEW_SGIX_mpeg1 = !_glewInit_GL_SGIX_mpeg1(); +#endif /* GL_SGIX_mpeg1 */ +#ifdef GL_SGIX_nonlinear_lighting_pervertex + if (glewExperimental || GLEW_SGIX_nonlinear_lighting_pervertex) GLEW_SGIX_nonlinear_lighting_pervertex = !_glewInit_GL_SGIX_nonlinear_lighting_pervertex(); +#endif /* GL_SGIX_nonlinear_lighting_pervertex */ +#ifdef GL_SGIX_pixel_texture + if (glewExperimental || GLEW_SGIX_pixel_texture) GLEW_SGIX_pixel_texture = !_glewInit_GL_SGIX_pixel_texture(); +#endif /* GL_SGIX_pixel_texture */ +#ifdef GL_SGIX_polynomial_ffd + if (glewExperimental || GLEW_SGIX_polynomial_ffd) GLEW_SGIX_polynomial_ffd = !_glewInit_GL_SGIX_polynomial_ffd(); +#endif /* GL_SGIX_polynomial_ffd */ +#ifdef GL_SGIX_quad_mesh + if (glewExperimental || GLEW_SGIX_quad_mesh) GLEW_SGIX_quad_mesh = !_glewInit_GL_SGIX_quad_mesh(); +#endif /* GL_SGIX_quad_mesh */ +#ifdef GL_SGIX_reference_plane + if (glewExperimental || GLEW_SGIX_reference_plane) GLEW_SGIX_reference_plane = !_glewInit_GL_SGIX_reference_plane(); +#endif /* GL_SGIX_reference_plane */ +#ifdef GL_SGIX_sprite + if (glewExperimental || GLEW_SGIX_sprite) GLEW_SGIX_sprite = !_glewInit_GL_SGIX_sprite(); +#endif /* GL_SGIX_sprite */ +#ifdef GL_SGIX_tag_sample_buffer + if (glewExperimental || GLEW_SGIX_tag_sample_buffer) GLEW_SGIX_tag_sample_buffer = !_glewInit_GL_SGIX_tag_sample_buffer(); +#endif /* GL_SGIX_tag_sample_buffer */ +#ifdef GL_SGIX_vector_ops + if (glewExperimental || GLEW_SGIX_vector_ops) GLEW_SGIX_vector_ops = !_glewInit_GL_SGIX_vector_ops(); +#endif /* GL_SGIX_vector_ops */ +#ifdef GL_SGIX_vertex_array_object + if (glewExperimental || GLEW_SGIX_vertex_array_object) GLEW_SGIX_vertex_array_object = !_glewInit_GL_SGIX_vertex_array_object(); +#endif /* GL_SGIX_vertex_array_object */ +#ifdef GL_SGI_color_table + if (glewExperimental || GLEW_SGI_color_table) GLEW_SGI_color_table = !_glewInit_GL_SGI_color_table(); +#endif /* GL_SGI_color_table */ +#ifdef GL_SGI_fft + if (glewExperimental || GLEW_SGI_fft) GLEW_SGI_fft = !_glewInit_GL_SGI_fft(); +#endif /* GL_SGI_fft */ +#ifdef GL_SUNX_constant_data + if (glewExperimental || GLEW_SUNX_constant_data) GLEW_SUNX_constant_data = !_glewInit_GL_SUNX_constant_data(); +#endif /* GL_SUNX_constant_data */ +#ifdef GL_SUN_global_alpha + if (glewExperimental || GLEW_SUN_global_alpha) GLEW_SUN_global_alpha = !_glewInit_GL_SUN_global_alpha(); +#endif /* GL_SUN_global_alpha */ +#ifdef GL_SUN_read_video_pixels + if (glewExperimental || GLEW_SUN_read_video_pixels) GLEW_SUN_read_video_pixels = !_glewInit_GL_SUN_read_video_pixels(); +#endif /* GL_SUN_read_video_pixels */ +#ifdef GL_SUN_triangle_list + if (glewExperimental || GLEW_SUN_triangle_list) GLEW_SUN_triangle_list = !_glewInit_GL_SUN_triangle_list(); +#endif /* GL_SUN_triangle_list */ +#ifdef GL_SUN_vertex + if (glewExperimental || GLEW_SUN_vertex) GLEW_SUN_vertex = !_glewInit_GL_SUN_vertex(); +#endif /* GL_SUN_vertex */ +#ifdef GL_WIN_swap_hint + if (glewExperimental || GLEW_WIN_swap_hint) GLEW_WIN_swap_hint = !_glewInit_GL_WIN_swap_hint(); +#endif /* GL_WIN_swap_hint */ +#ifdef GL_NV_fragment_program4 + GLEW_NV_fragment_program4 = GLEW_NV_gpu_program4; +#endif /* GL_NV_fragment_program4 */ +#ifdef GL_NV_geometry_program4 + GLEW_NV_geometry_program4 = GLEW_NV_gpu_program4; +#endif /* GL_NV_geometry_program4 */ +#ifdef GL_NV_tessellation_program5 + GLEW_NV_tessellation_program5 = GLEW_NV_gpu_program5; +#endif /* GL_NV_tessellation_program5 */ +#ifdef GL_NV_vertex_program4 + GLEW_NV_vertex_program4 = GLEW_NV_gpu_program4; +#endif /* GL_NV_vertex_program4 */ + + return GLEW_OK; +} + + +#if defined(GLEW_OSMESA) + +#elif defined(GLEW_EGL) + +PFNEGLCHOOSECONFIGPROC __eglewChooseConfig = NULL; +PFNEGLCOPYBUFFERSPROC __eglewCopyBuffers = NULL; +PFNEGLCREATECONTEXTPROC __eglewCreateContext = NULL; +PFNEGLCREATEPBUFFERSURFACEPROC __eglewCreatePbufferSurface = NULL; +PFNEGLCREATEPIXMAPSURFACEPROC __eglewCreatePixmapSurface = NULL; +PFNEGLCREATEWINDOWSURFACEPROC __eglewCreateWindowSurface = NULL; +PFNEGLDESTROYCONTEXTPROC __eglewDestroyContext = NULL; +PFNEGLDESTROYSURFACEPROC __eglewDestroySurface = NULL; +PFNEGLGETCONFIGATTRIBPROC __eglewGetConfigAttrib = NULL; +PFNEGLGETCONFIGSPROC __eglewGetConfigs = NULL; +PFNEGLGETCURRENTDISPLAYPROC __eglewGetCurrentDisplay = NULL; +PFNEGLGETCURRENTSURFACEPROC __eglewGetCurrentSurface = NULL; +PFNEGLGETDISPLAYPROC __eglewGetDisplay = NULL; +PFNEGLGETERRORPROC __eglewGetError = NULL; +PFNEGLINITIALIZEPROC __eglewInitialize = NULL; +PFNEGLMAKECURRENTPROC __eglewMakeCurrent = NULL; +PFNEGLQUERYCONTEXTPROC __eglewQueryContext = NULL; +PFNEGLQUERYSTRINGPROC __eglewQueryString = NULL; +PFNEGLQUERYSURFACEPROC __eglewQuerySurface = NULL; +PFNEGLSWAPBUFFERSPROC __eglewSwapBuffers = NULL; +PFNEGLTERMINATEPROC __eglewTerminate = NULL; +PFNEGLWAITGLPROC __eglewWaitGL = NULL; +PFNEGLWAITNATIVEPROC __eglewWaitNative = NULL; + +PFNEGLBINDTEXIMAGEPROC __eglewBindTexImage = NULL; +PFNEGLRELEASETEXIMAGEPROC __eglewReleaseTexImage = NULL; +PFNEGLSURFACEATTRIBPROC __eglewSurfaceAttrib = NULL; +PFNEGLSWAPINTERVALPROC __eglewSwapInterval = NULL; + +PFNEGLBINDAPIPROC __eglewBindAPI = NULL; +PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC __eglewCreatePbufferFromClientBuffer = NULL; +PFNEGLQUERYAPIPROC __eglewQueryAPI = NULL; +PFNEGLRELEASETHREADPROC __eglewReleaseThread = NULL; +PFNEGLWAITCLIENTPROC __eglewWaitClient = NULL; + +PFNEGLGETCURRENTCONTEXTPROC __eglewGetCurrentContext = NULL; + +PFNEGLCLIENTWAITSYNCPROC __eglewClientWaitSync = NULL; +PFNEGLCREATEIMAGEPROC __eglewCreateImage = NULL; +PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC __eglewCreatePlatformPixmapSurface = NULL; +PFNEGLCREATEPLATFORMWINDOWSURFACEPROC __eglewCreatePlatformWindowSurface = NULL; +PFNEGLCREATESYNCPROC __eglewCreateSync = NULL; +PFNEGLDESTROYIMAGEPROC __eglewDestroyImage = NULL; +PFNEGLDESTROYSYNCPROC __eglewDestroySync = NULL; +PFNEGLGETPLATFORMDISPLAYPROC __eglewGetPlatformDisplay = NULL; +PFNEGLGETSYNCATTRIBPROC __eglewGetSyncAttrib = NULL; +PFNEGLWAITSYNCPROC __eglewWaitSync = NULL; + +PFNEGLSETBLOBCACHEFUNCSANDROIDPROC __eglewSetBlobCacheFuncsANDROID = NULL; + +PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC __eglewCreateNativeClientBufferANDROID = NULL; + +PFNEGLDUPNATIVEFENCEFDANDROIDPROC __eglewDupNativeFenceFDANDROID = NULL; + +PFNEGLPRESENTATIONTIMEANDROIDPROC __eglewPresentationTimeANDROID = NULL; + +PFNEGLQUERYSURFACEPOINTERANGLEPROC __eglewQuerySurfacePointerANGLE = NULL; + +PFNEGLQUERYDEVICESEXTPROC __eglewQueryDevicesEXT = NULL; + +PFNEGLQUERYDEVICEATTRIBEXTPROC __eglewQueryDeviceAttribEXT = NULL; +PFNEGLQUERYDEVICESTRINGEXTPROC __eglewQueryDeviceStringEXT = NULL; +PFNEGLQUERYDISPLAYATTRIBEXTPROC __eglewQueryDisplayAttribEXT = NULL; + +PFNEGLQUERYDMABUFFORMATSEXTPROC __eglewQueryDmaBufFormatsEXT = NULL; +PFNEGLQUERYDMABUFMODIFIERSEXTPROC __eglewQueryDmaBufModifiersEXT = NULL; + +PFNEGLGETOUTPUTLAYERSEXTPROC __eglewGetOutputLayersEXT = NULL; +PFNEGLGETOUTPUTPORTSEXTPROC __eglewGetOutputPortsEXT = NULL; +PFNEGLOUTPUTLAYERATTRIBEXTPROC __eglewOutputLayerAttribEXT = NULL; +PFNEGLOUTPUTPORTATTRIBEXTPROC __eglewOutputPortAttribEXT = NULL; +PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC __eglewQueryOutputLayerAttribEXT = NULL; +PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC __eglewQueryOutputLayerStringEXT = NULL; +PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC __eglewQueryOutputPortAttribEXT = NULL; +PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC __eglewQueryOutputPortStringEXT = NULL; + +PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC __eglewCreatePlatformPixmapSurfaceEXT = NULL; +PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC __eglewCreatePlatformWindowSurfaceEXT = NULL; +PFNEGLGETPLATFORMDISPLAYEXTPROC __eglewGetPlatformDisplayEXT = NULL; + +PFNEGLSTREAMCONSUMEROUTPUTEXTPROC __eglewStreamConsumerOutputEXT = NULL; + +PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC __eglewSwapBuffersWithDamageEXT = NULL; + +PFNEGLCREATEPIXMAPSURFACEHIPROC __eglewCreatePixmapSurfaceHI = NULL; + +PFNEGLCREATESYNC64KHRPROC __eglewCreateSync64KHR = NULL; + +PFNEGLDEBUGMESSAGECONTROLKHRPROC __eglewDebugMessageControlKHR = NULL; +PFNEGLLABELOBJECTKHRPROC __eglewLabelObjectKHR = NULL; +PFNEGLQUERYDEBUGKHRPROC __eglewQueryDebugKHR = NULL; + +PFNEGLCREATEIMAGEKHRPROC __eglewCreateImageKHR = NULL; +PFNEGLDESTROYIMAGEKHRPROC __eglewDestroyImageKHR = NULL; + +PFNEGLLOCKSURFACEKHRPROC __eglewLockSurfaceKHR = NULL; +PFNEGLUNLOCKSURFACEKHRPROC __eglewUnlockSurfaceKHR = NULL; + +PFNEGLQUERYSURFACE64KHRPROC __eglewQuerySurface64KHR = NULL; + +PFNEGLSETDAMAGEREGIONKHRPROC __eglewSetDamageRegionKHR = NULL; + +PFNEGLCLIENTWAITSYNCKHRPROC __eglewClientWaitSyncKHR = NULL; +PFNEGLCREATESYNCKHRPROC __eglewCreateSyncKHR = NULL; +PFNEGLDESTROYSYNCKHRPROC __eglewDestroySyncKHR = NULL; +PFNEGLGETSYNCATTRIBKHRPROC __eglewGetSyncAttribKHR = NULL; +PFNEGLSIGNALSYNCKHRPROC __eglewSignalSyncKHR = NULL; + +PFNEGLCREATESTREAMKHRPROC __eglewCreateStreamKHR = NULL; +PFNEGLDESTROYSTREAMKHRPROC __eglewDestroyStreamKHR = NULL; +PFNEGLQUERYSTREAMKHRPROC __eglewQueryStreamKHR = NULL; +PFNEGLQUERYSTREAMU64KHRPROC __eglewQueryStreamu64KHR = NULL; +PFNEGLSTREAMATTRIBKHRPROC __eglewStreamAttribKHR = NULL; + +PFNEGLCREATESTREAMATTRIBKHRPROC __eglewCreateStreamAttribKHR = NULL; +PFNEGLQUERYSTREAMATTRIBKHRPROC __eglewQueryStreamAttribKHR = NULL; +PFNEGLSETSTREAMATTRIBKHRPROC __eglewSetStreamAttribKHR = NULL; +PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC __eglewStreamConsumerAcquireAttribKHR = NULL; +PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC __eglewStreamConsumerReleaseAttribKHR = NULL; + +PFNEGLSTREAMCONSUMERACQUIREKHRPROC __eglewStreamConsumerAcquireKHR = NULL; +PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC __eglewStreamConsumerGLTextureExternalKHR = NULL; +PFNEGLSTREAMCONSUMERRELEASEKHRPROC __eglewStreamConsumerReleaseKHR = NULL; + +PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC __eglewCreateStreamFromFileDescriptorKHR = NULL; +PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC __eglewGetStreamFileDescriptorKHR = NULL; + +PFNEGLQUERYSTREAMTIMEKHRPROC __eglewQueryStreamTimeKHR = NULL; + +PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC __eglewCreateStreamProducerSurfaceKHR = NULL; + +PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC __eglewSwapBuffersWithDamageKHR = NULL; + +PFNEGLWAITSYNCKHRPROC __eglewWaitSyncKHR = NULL; + +PFNEGLCREATEDRMIMAGEMESAPROC __eglewCreateDRMImageMESA = NULL; +PFNEGLEXPORTDRMIMAGEMESAPROC __eglewExportDRMImageMESA = NULL; + +PFNEGLEXPORTDMABUFIMAGEMESAPROC __eglewExportDMABUFImageMESA = NULL; +PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC __eglewExportDMABUFImageQueryMESA = NULL; + +PFNEGLSWAPBUFFERSREGIONNOKPROC __eglewSwapBuffersRegionNOK = NULL; + +PFNEGLSWAPBUFFERSREGION2NOKPROC __eglewSwapBuffersRegion2NOK = NULL; + +PFNEGLQUERYNATIVEDISPLAYNVPROC __eglewQueryNativeDisplayNV = NULL; +PFNEGLQUERYNATIVEPIXMAPNVPROC __eglewQueryNativePixmapNV = NULL; +PFNEGLQUERYNATIVEWINDOWNVPROC __eglewQueryNativeWindowNV = NULL; + +PFNEGLPOSTSUBBUFFERNVPROC __eglewPostSubBufferNV = NULL; + +PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC __eglewStreamConsumerGLTextureExternalAttribsNV = NULL; + +PFNEGLQUERYDISPLAYATTRIBNVPROC __eglewQueryDisplayAttribNV = NULL; +PFNEGLQUERYSTREAMMETADATANVPROC __eglewQueryStreamMetadataNV = NULL; +PFNEGLSETSTREAMMETADATANVPROC __eglewSetStreamMetadataNV = NULL; + +PFNEGLRESETSTREAMNVPROC __eglewResetStreamNV = NULL; + +PFNEGLCREATESTREAMSYNCNVPROC __eglewCreateStreamSyncNV = NULL; + +PFNEGLCLIENTWAITSYNCNVPROC __eglewClientWaitSyncNV = NULL; +PFNEGLCREATEFENCESYNCNVPROC __eglewCreateFenceSyncNV = NULL; +PFNEGLDESTROYSYNCNVPROC __eglewDestroySyncNV = NULL; +PFNEGLFENCENVPROC __eglewFenceNV = NULL; +PFNEGLGETSYNCATTRIBNVPROC __eglewGetSyncAttribNV = NULL; +PFNEGLSIGNALSYNCNVPROC __eglewSignalSyncNV = NULL; + +PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC __eglewGetSystemTimeFrequencyNV = NULL; +PFNEGLGETSYSTEMTIMENVPROC __eglewGetSystemTimeNV = NULL; +GLboolean __EGLEW_VERSION_1_0 = GL_FALSE; +GLboolean __EGLEW_VERSION_1_1 = GL_FALSE; +GLboolean __EGLEW_VERSION_1_2 = GL_FALSE; +GLboolean __EGLEW_VERSION_1_3 = GL_FALSE; +GLboolean __EGLEW_VERSION_1_4 = GL_FALSE; +GLboolean __EGLEW_VERSION_1_5 = GL_FALSE; +GLboolean __EGLEW_ANDROID_blob_cache = GL_FALSE; +GLboolean __EGLEW_ANDROID_create_native_client_buffer = GL_FALSE; +GLboolean __EGLEW_ANDROID_framebuffer_target = GL_FALSE; +GLboolean __EGLEW_ANDROID_front_buffer_auto_refresh = GL_FALSE; +GLboolean __EGLEW_ANDROID_image_native_buffer = GL_FALSE; +GLboolean __EGLEW_ANDROID_native_fence_sync = GL_FALSE; +GLboolean __EGLEW_ANDROID_presentation_time = GL_FALSE; +GLboolean __EGLEW_ANDROID_recordable = GL_FALSE; +GLboolean __EGLEW_ANGLE_d3d_share_handle_client_buffer = GL_FALSE; +GLboolean __EGLEW_ANGLE_device_d3d = GL_FALSE; +GLboolean __EGLEW_ANGLE_query_surface_pointer = GL_FALSE; +GLboolean __EGLEW_ANGLE_surface_d3d_texture_2d_share_handle = GL_FALSE; +GLboolean __EGLEW_ANGLE_window_fixed_size = GL_FALSE; +GLboolean __EGLEW_ARM_implicit_external_sync = GL_FALSE; +GLboolean __EGLEW_ARM_pixmap_multisample_discard = GL_FALSE; +GLboolean __EGLEW_EXT_buffer_age = GL_FALSE; +GLboolean __EGLEW_EXT_client_extensions = GL_FALSE; +GLboolean __EGLEW_EXT_create_context_robustness = GL_FALSE; +GLboolean __EGLEW_EXT_device_base = GL_FALSE; +GLboolean __EGLEW_EXT_device_drm = GL_FALSE; +GLboolean __EGLEW_EXT_device_enumeration = GL_FALSE; +GLboolean __EGLEW_EXT_device_openwf = GL_FALSE; +GLboolean __EGLEW_EXT_device_query = GL_FALSE; +GLboolean __EGLEW_EXT_gl_colorspace_bt2020_linear = GL_FALSE; +GLboolean __EGLEW_EXT_gl_colorspace_bt2020_pq = GL_FALSE; +GLboolean __EGLEW_EXT_gl_colorspace_scrgb_linear = GL_FALSE; +GLboolean __EGLEW_EXT_image_dma_buf_import = GL_FALSE; +GLboolean __EGLEW_EXT_image_dma_buf_import_modifiers = GL_FALSE; +GLboolean __EGLEW_EXT_multiview_window = GL_FALSE; +GLboolean __EGLEW_EXT_output_base = GL_FALSE; +GLboolean __EGLEW_EXT_output_drm = GL_FALSE; +GLboolean __EGLEW_EXT_output_openwf = GL_FALSE; +GLboolean __EGLEW_EXT_pixel_format_float = GL_FALSE; +GLboolean __EGLEW_EXT_platform_base = GL_FALSE; +GLboolean __EGLEW_EXT_platform_device = GL_FALSE; +GLboolean __EGLEW_EXT_platform_wayland = GL_FALSE; +GLboolean __EGLEW_EXT_platform_x11 = GL_FALSE; +GLboolean __EGLEW_EXT_protected_content = GL_FALSE; +GLboolean __EGLEW_EXT_protected_surface = GL_FALSE; +GLboolean __EGLEW_EXT_stream_consumer_egloutput = GL_FALSE; +GLboolean __EGLEW_EXT_surface_SMPTE2086_metadata = GL_FALSE; +GLboolean __EGLEW_EXT_swap_buffers_with_damage = GL_FALSE; +GLboolean __EGLEW_EXT_yuv_surface = GL_FALSE; +GLboolean __EGLEW_HI_clientpixmap = GL_FALSE; +GLboolean __EGLEW_HI_colorformats = GL_FALSE; +GLboolean __EGLEW_IMG_context_priority = GL_FALSE; +GLboolean __EGLEW_IMG_image_plane_attribs = GL_FALSE; +GLboolean __EGLEW_KHR_cl_event = GL_FALSE; +GLboolean __EGLEW_KHR_cl_event2 = GL_FALSE; +GLboolean __EGLEW_KHR_client_get_all_proc_addresses = GL_FALSE; +GLboolean __EGLEW_KHR_config_attribs = GL_FALSE; +GLboolean __EGLEW_KHR_context_flush_control = GL_FALSE; +GLboolean __EGLEW_KHR_create_context = GL_FALSE; +GLboolean __EGLEW_KHR_create_context_no_error = GL_FALSE; +GLboolean __EGLEW_KHR_debug = GL_FALSE; +GLboolean __EGLEW_KHR_fence_sync = GL_FALSE; +GLboolean __EGLEW_KHR_get_all_proc_addresses = GL_FALSE; +GLboolean __EGLEW_KHR_gl_colorspace = GL_FALSE; +GLboolean __EGLEW_KHR_gl_renderbuffer_image = GL_FALSE; +GLboolean __EGLEW_KHR_gl_texture_2D_image = GL_FALSE; +GLboolean __EGLEW_KHR_gl_texture_3D_image = GL_FALSE; +GLboolean __EGLEW_KHR_gl_texture_cubemap_image = GL_FALSE; +GLboolean __EGLEW_KHR_image = GL_FALSE; +GLboolean __EGLEW_KHR_image_base = GL_FALSE; +GLboolean __EGLEW_KHR_image_pixmap = GL_FALSE; +GLboolean __EGLEW_KHR_lock_surface = GL_FALSE; +GLboolean __EGLEW_KHR_lock_surface2 = GL_FALSE; +GLboolean __EGLEW_KHR_lock_surface3 = GL_FALSE; +GLboolean __EGLEW_KHR_mutable_render_buffer = GL_FALSE; +GLboolean __EGLEW_KHR_no_config_context = GL_FALSE; +GLboolean __EGLEW_KHR_partial_update = GL_FALSE; +GLboolean __EGLEW_KHR_platform_android = GL_FALSE; +GLboolean __EGLEW_KHR_platform_gbm = GL_FALSE; +GLboolean __EGLEW_KHR_platform_wayland = GL_FALSE; +GLboolean __EGLEW_KHR_platform_x11 = GL_FALSE; +GLboolean __EGLEW_KHR_reusable_sync = GL_FALSE; +GLboolean __EGLEW_KHR_stream = GL_FALSE; +GLboolean __EGLEW_KHR_stream_attrib = GL_FALSE; +GLboolean __EGLEW_KHR_stream_consumer_gltexture = GL_FALSE; +GLboolean __EGLEW_KHR_stream_cross_process_fd = GL_FALSE; +GLboolean __EGLEW_KHR_stream_fifo = GL_FALSE; +GLboolean __EGLEW_KHR_stream_producer_aldatalocator = GL_FALSE; +GLboolean __EGLEW_KHR_stream_producer_eglsurface = GL_FALSE; +GLboolean __EGLEW_KHR_surfaceless_context = GL_FALSE; +GLboolean __EGLEW_KHR_swap_buffers_with_damage = GL_FALSE; +GLboolean __EGLEW_KHR_vg_parent_image = GL_FALSE; +GLboolean __EGLEW_KHR_wait_sync = GL_FALSE; +GLboolean __EGLEW_MESA_drm_image = GL_FALSE; +GLboolean __EGLEW_MESA_image_dma_buf_export = GL_FALSE; +GLboolean __EGLEW_MESA_platform_gbm = GL_FALSE; +GLboolean __EGLEW_MESA_platform_surfaceless = GL_FALSE; +GLboolean __EGLEW_NOK_swap_region = GL_FALSE; +GLboolean __EGLEW_NOK_swap_region2 = GL_FALSE; +GLboolean __EGLEW_NOK_texture_from_pixmap = GL_FALSE; +GLboolean __EGLEW_NV_3dvision_surface = GL_FALSE; +GLboolean __EGLEW_NV_coverage_sample = GL_FALSE; +GLboolean __EGLEW_NV_coverage_sample_resolve = GL_FALSE; +GLboolean __EGLEW_NV_cuda_event = GL_FALSE; +GLboolean __EGLEW_NV_depth_nonlinear = GL_FALSE; +GLboolean __EGLEW_NV_device_cuda = GL_FALSE; +GLboolean __EGLEW_NV_native_query = GL_FALSE; +GLboolean __EGLEW_NV_post_convert_rounding = GL_FALSE; +GLboolean __EGLEW_NV_post_sub_buffer = GL_FALSE; +GLboolean __EGLEW_NV_robustness_video_memory_purge = GL_FALSE; +GLboolean __EGLEW_NV_stream_consumer_gltexture_yuv = GL_FALSE; +GLboolean __EGLEW_NV_stream_cross_display = GL_FALSE; +GLboolean __EGLEW_NV_stream_cross_object = GL_FALSE; +GLboolean __EGLEW_NV_stream_cross_partition = GL_FALSE; +GLboolean __EGLEW_NV_stream_cross_process = GL_FALSE; +GLboolean __EGLEW_NV_stream_cross_system = GL_FALSE; +GLboolean __EGLEW_NV_stream_fifo_next = GL_FALSE; +GLboolean __EGLEW_NV_stream_fifo_synchronous = GL_FALSE; +GLboolean __EGLEW_NV_stream_frame_limits = GL_FALSE; +GLboolean __EGLEW_NV_stream_metadata = GL_FALSE; +GLboolean __EGLEW_NV_stream_remote = GL_FALSE; +GLboolean __EGLEW_NV_stream_reset = GL_FALSE; +GLboolean __EGLEW_NV_stream_socket = GL_FALSE; +GLboolean __EGLEW_NV_stream_socket_inet = GL_FALSE; +GLboolean __EGLEW_NV_stream_socket_unix = GL_FALSE; +GLboolean __EGLEW_NV_stream_sync = GL_FALSE; +GLboolean __EGLEW_NV_sync = GL_FALSE; +GLboolean __EGLEW_NV_system_time = GL_FALSE; +GLboolean __EGLEW_TIZEN_image_native_buffer = GL_FALSE; +GLboolean __EGLEW_TIZEN_image_native_surface = GL_FALSE; +#ifdef EGL_VERSION_1_0 + +static GLboolean _glewInit_EGL_VERSION_1_0 () +{ + GLboolean r = GL_FALSE; + + r = ((eglChooseConfig = (PFNEGLCHOOSECONFIGPROC)glewGetProcAddress((const GLubyte*)"eglChooseConfig")) == NULL) || r; + r = ((eglCopyBuffers = (PFNEGLCOPYBUFFERSPROC)glewGetProcAddress((const GLubyte*)"eglCopyBuffers")) == NULL) || r; + r = ((eglCreateContext = (PFNEGLCREATECONTEXTPROC)glewGetProcAddress((const GLubyte*)"eglCreateContext")) == NULL) || r; + r = ((eglCreatePbufferSurface = (PFNEGLCREATEPBUFFERSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreatePbufferSurface")) == NULL) || r; + r = ((eglCreatePixmapSurface = (PFNEGLCREATEPIXMAPSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreatePixmapSurface")) == NULL) || r; + r = ((eglCreateWindowSurface = (PFNEGLCREATEWINDOWSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreateWindowSurface")) == NULL) || r; + r = ((eglDestroyContext = (PFNEGLDESTROYCONTEXTPROC)glewGetProcAddress((const GLubyte*)"eglDestroyContext")) == NULL) || r; + r = ((eglDestroySurface = (PFNEGLDESTROYSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglDestroySurface")) == NULL) || r; + r = ((eglGetConfigAttrib = (PFNEGLGETCONFIGATTRIBPROC)glewGetProcAddress((const GLubyte*)"eglGetConfigAttrib")) == NULL) || r; + r = ((eglGetConfigs = (PFNEGLGETCONFIGSPROC)glewGetProcAddress((const GLubyte*)"eglGetConfigs")) == NULL) || r; + r = ((eglGetCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC)glewGetProcAddress((const GLubyte*)"eglGetCurrentDisplay")) == NULL) || r; + r = ((eglGetCurrentSurface = (PFNEGLGETCURRENTSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglGetCurrentSurface")) == NULL) || r; + r = ((eglGetDisplay = (PFNEGLGETDISPLAYPROC)glewGetProcAddress((const GLubyte*)"eglGetDisplay")) == NULL) || r; + r = ((eglGetError = (PFNEGLGETERRORPROC)glewGetProcAddress((const GLubyte*)"eglGetError")) == NULL) || r; + r = ((eglInitialize = (PFNEGLINITIALIZEPROC)glewGetProcAddress((const GLubyte*)"eglInitialize")) == NULL) || r; + r = ((eglMakeCurrent = (PFNEGLMAKECURRENTPROC)glewGetProcAddress((const GLubyte*)"eglMakeCurrent")) == NULL) || r; + r = ((eglQueryContext = (PFNEGLQUERYCONTEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryContext")) == NULL) || r; + r = ((eglQueryString = (PFNEGLQUERYSTRINGPROC)glewGetProcAddress((const GLubyte*)"eglQueryString")) == NULL) || r; + r = ((eglQuerySurface = (PFNEGLQUERYSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglQuerySurface")) == NULL) || r; + r = ((eglSwapBuffers = (PFNEGLSWAPBUFFERSPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffers")) == NULL) || r; + r = ((eglTerminate = (PFNEGLTERMINATEPROC)glewGetProcAddress((const GLubyte*)"eglTerminate")) == NULL) || r; + r = ((eglWaitGL = (PFNEGLWAITGLPROC)glewGetProcAddress((const GLubyte*)"eglWaitGL")) == NULL) || r; + r = ((eglWaitNative = (PFNEGLWAITNATIVEPROC)glewGetProcAddress((const GLubyte*)"eglWaitNative")) == NULL) || r; + + return r; +} + +#endif /* EGL_VERSION_1_0 */ + +#ifdef EGL_VERSION_1_1 + +static GLboolean _glewInit_EGL_VERSION_1_1 () +{ + GLboolean r = GL_FALSE; + + r = ((eglBindTexImage = (PFNEGLBINDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"eglBindTexImage")) == NULL) || r; + r = ((eglReleaseTexImage = (PFNEGLRELEASETEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"eglReleaseTexImage")) == NULL) || r; + r = ((eglSurfaceAttrib = (PFNEGLSURFACEATTRIBPROC)glewGetProcAddress((const GLubyte*)"eglSurfaceAttrib")) == NULL) || r; + r = ((eglSwapInterval = (PFNEGLSWAPINTERVALPROC)glewGetProcAddress((const GLubyte*)"eglSwapInterval")) == NULL) || r; + + return r; +} + +#endif /* EGL_VERSION_1_1 */ + +#ifdef EGL_VERSION_1_2 + +static GLboolean _glewInit_EGL_VERSION_1_2 () +{ + GLboolean r = GL_FALSE; + + r = ((eglBindAPI = (PFNEGLBINDAPIPROC)glewGetProcAddress((const GLubyte*)"eglBindAPI")) == NULL) || r; + r = ((eglCreatePbufferFromClientBuffer = (PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC)glewGetProcAddress((const GLubyte*)"eglCreatePbufferFromClientBuffer")) == NULL) || r; + r = ((eglQueryAPI = (PFNEGLQUERYAPIPROC)glewGetProcAddress((const GLubyte*)"eglQueryAPI")) == NULL) || r; + r = ((eglReleaseThread = (PFNEGLRELEASETHREADPROC)glewGetProcAddress((const GLubyte*)"eglReleaseThread")) == NULL) || r; + r = ((eglWaitClient = (PFNEGLWAITCLIENTPROC)glewGetProcAddress((const GLubyte*)"eglWaitClient")) == NULL) || r; + + return r; +} + +#endif /* EGL_VERSION_1_2 */ + +#ifdef EGL_VERSION_1_4 + +static GLboolean _glewInit_EGL_VERSION_1_4 () +{ + GLboolean r = GL_FALSE; + + r = ((eglGetCurrentContext = (PFNEGLGETCURRENTCONTEXTPROC)glewGetProcAddress((const GLubyte*)"eglGetCurrentContext")) == NULL) || r; + + return r; +} + +#endif /* EGL_VERSION_1_4 */ + +#ifdef EGL_VERSION_1_5 + +static GLboolean _glewInit_EGL_VERSION_1_5 () +{ + GLboolean r = GL_FALSE; + + r = ((eglClientWaitSync = (PFNEGLCLIENTWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"eglClientWaitSync")) == NULL) || r; + r = ((eglCreateImage = (PFNEGLCREATEIMAGEPROC)glewGetProcAddress((const GLubyte*)"eglCreateImage")) == NULL) || r; + r = ((eglCreatePlatformPixmapSurface = (PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreatePlatformPixmapSurface")) == NULL) || r; + r = ((eglCreatePlatformWindowSurface = (PFNEGLCREATEPLATFORMWINDOWSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreatePlatformWindowSurface")) == NULL) || r; + r = ((eglCreateSync = (PFNEGLCREATESYNCPROC)glewGetProcAddress((const GLubyte*)"eglCreateSync")) == NULL) || r; + r = ((eglDestroyImage = (PFNEGLDESTROYIMAGEPROC)glewGetProcAddress((const GLubyte*)"eglDestroyImage")) == NULL) || r; + r = ((eglDestroySync = (PFNEGLDESTROYSYNCPROC)glewGetProcAddress((const GLubyte*)"eglDestroySync")) == NULL) || r; + r = ((eglGetPlatformDisplay = (PFNEGLGETPLATFORMDISPLAYPROC)glewGetProcAddress((const GLubyte*)"eglGetPlatformDisplay")) == NULL) || r; + r = ((eglGetSyncAttrib = (PFNEGLGETSYNCATTRIBPROC)glewGetProcAddress((const GLubyte*)"eglGetSyncAttrib")) == NULL) || r; + r = ((eglWaitSync = (PFNEGLWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"eglWaitSync")) == NULL) || r; + + return r; +} + +#endif /* EGL_VERSION_1_5 */ + +#ifdef EGL_ANDROID_blob_cache + +static GLboolean _glewInit_EGL_ANDROID_blob_cache () +{ + GLboolean r = GL_FALSE; + + r = ((eglSetBlobCacheFuncsANDROID = (PFNEGLSETBLOBCACHEFUNCSANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglSetBlobCacheFuncsANDROID")) == NULL) || r; + + return r; +} + +#endif /* EGL_ANDROID_blob_cache */ + +#ifdef EGL_ANDROID_create_native_client_buffer + +static GLboolean _glewInit_EGL_ANDROID_create_native_client_buffer () +{ + GLboolean r = GL_FALSE; + + r = ((eglCreateNativeClientBufferANDROID = (PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglCreateNativeClientBufferANDROID")) == NULL) || r; + + return r; +} + +#endif /* EGL_ANDROID_create_native_client_buffer */ + +#ifdef EGL_ANDROID_native_fence_sync + +static GLboolean _glewInit_EGL_ANDROID_native_fence_sync () +{ + GLboolean r = GL_FALSE; + + r = ((eglDupNativeFenceFDANDROID = (PFNEGLDUPNATIVEFENCEFDANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglDupNativeFenceFDANDROID")) == NULL) || r; + + return r; +} + +#endif /* EGL_ANDROID_native_fence_sync */ + +#ifdef EGL_ANDROID_presentation_time + +static GLboolean _glewInit_EGL_ANDROID_presentation_time () +{ + GLboolean r = GL_FALSE; + + r = ((eglPresentationTimeANDROID = (PFNEGLPRESENTATIONTIMEANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglPresentationTimeANDROID")) == NULL) || r; + + return r; +} + +#endif /* EGL_ANDROID_presentation_time */ + +#ifdef EGL_ANGLE_query_surface_pointer + +static GLboolean _glewInit_EGL_ANGLE_query_surface_pointer () +{ + GLboolean r = GL_FALSE; + + r = ((eglQuerySurfacePointerANGLE = (PFNEGLQUERYSURFACEPOINTERANGLEPROC)glewGetProcAddress((const GLubyte*)"eglQuerySurfacePointerANGLE")) == NULL) || r; + + return r; +} + +#endif /* EGL_ANGLE_query_surface_pointer */ + +#ifdef EGL_EXT_device_enumeration + +static GLboolean _glewInit_EGL_EXT_device_enumeration () +{ + GLboolean r = GL_FALSE; + + r = ((eglQueryDevicesEXT = (PFNEGLQUERYDEVICESEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDevicesEXT")) == NULL) || r; + + return r; +} + +#endif /* EGL_EXT_device_enumeration */ + +#ifdef EGL_EXT_device_query + +static GLboolean _glewInit_EGL_EXT_device_query () +{ + GLboolean r = GL_FALSE; + + r = ((eglQueryDeviceAttribEXT = (PFNEGLQUERYDEVICEATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDeviceAttribEXT")) == NULL) || r; + r = ((eglQueryDeviceStringEXT = (PFNEGLQUERYDEVICESTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDeviceStringEXT")) == NULL) || r; + r = ((eglQueryDisplayAttribEXT = (PFNEGLQUERYDISPLAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDisplayAttribEXT")) == NULL) || r; + + return r; +} + +#endif /* EGL_EXT_device_query */ + +#ifdef EGL_EXT_image_dma_buf_import_modifiers + +static GLboolean _glewInit_EGL_EXT_image_dma_buf_import_modifiers () +{ + GLboolean r = GL_FALSE; + + r = ((eglQueryDmaBufFormatsEXT = (PFNEGLQUERYDMABUFFORMATSEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDmaBufFormatsEXT")) == NULL) || r; + r = ((eglQueryDmaBufModifiersEXT = (PFNEGLQUERYDMABUFMODIFIERSEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDmaBufModifiersEXT")) == NULL) || r; + + return r; +} + +#endif /* EGL_EXT_image_dma_buf_import_modifiers */ + +#ifdef EGL_EXT_output_base + +static GLboolean _glewInit_EGL_EXT_output_base () +{ + GLboolean r = GL_FALSE; + + r = ((eglGetOutputLayersEXT = (PFNEGLGETOUTPUTLAYERSEXTPROC)glewGetProcAddress((const GLubyte*)"eglGetOutputLayersEXT")) == NULL) || r; + r = ((eglGetOutputPortsEXT = (PFNEGLGETOUTPUTPORTSEXTPROC)glewGetProcAddress((const GLubyte*)"eglGetOutputPortsEXT")) == NULL) || r; + r = ((eglOutputLayerAttribEXT = (PFNEGLOUTPUTLAYERATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglOutputLayerAttribEXT")) == NULL) || r; + r = ((eglOutputPortAttribEXT = (PFNEGLOUTPUTPORTATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglOutputPortAttribEXT")) == NULL) || r; + r = ((eglQueryOutputLayerAttribEXT = (PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryOutputLayerAttribEXT")) == NULL) || r; + r = ((eglQueryOutputLayerStringEXT = (PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryOutputLayerStringEXT")) == NULL) || r; + r = ((eglQueryOutputPortAttribEXT = (PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryOutputPortAttribEXT")) == NULL) || r; + r = ((eglQueryOutputPortStringEXT = (PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryOutputPortStringEXT")) == NULL) || r; + + return r; +} + +#endif /* EGL_EXT_output_base */ + +#ifdef EGL_EXT_platform_base + +static GLboolean _glewInit_EGL_EXT_platform_base () +{ + GLboolean r = GL_FALSE; + + r = ((eglCreatePlatformPixmapSurfaceEXT = (PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC)glewGetProcAddress((const GLubyte*)"eglCreatePlatformPixmapSurfaceEXT")) == NULL) || r; + r = ((eglCreatePlatformWindowSurfaceEXT = (PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)glewGetProcAddress((const GLubyte*)"eglCreatePlatformWindowSurfaceEXT")) == NULL) || r; + r = ((eglGetPlatformDisplayEXT = (PFNEGLGETPLATFORMDISPLAYEXTPROC)glewGetProcAddress((const GLubyte*)"eglGetPlatformDisplayEXT")) == NULL) || r; + + return r; +} + +#endif /* EGL_EXT_platform_base */ + +#ifdef EGL_EXT_stream_consumer_egloutput + +static GLboolean _glewInit_EGL_EXT_stream_consumer_egloutput () +{ + GLboolean r = GL_FALSE; + + r = ((eglStreamConsumerOutputEXT = (PFNEGLSTREAMCONSUMEROUTPUTEXTPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerOutputEXT")) == NULL) || r; + + return r; +} + +#endif /* EGL_EXT_stream_consumer_egloutput */ + +#ifdef EGL_EXT_swap_buffers_with_damage + +static GLboolean _glewInit_EGL_EXT_swap_buffers_with_damage () +{ + GLboolean r = GL_FALSE; + + r = ((eglSwapBuffersWithDamageEXT = (PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffersWithDamageEXT")) == NULL) || r; + + return r; +} + +#endif /* EGL_EXT_swap_buffers_with_damage */ + +#ifdef EGL_HI_clientpixmap + +static GLboolean _glewInit_EGL_HI_clientpixmap () +{ + GLboolean r = GL_FALSE; + + r = ((eglCreatePixmapSurfaceHI = (PFNEGLCREATEPIXMAPSURFACEHIPROC)glewGetProcAddress((const GLubyte*)"eglCreatePixmapSurfaceHI")) == NULL) || r; + + return r; +} + +#endif /* EGL_HI_clientpixmap */ + +#ifdef EGL_KHR_cl_event2 + +static GLboolean _glewInit_EGL_KHR_cl_event2 () +{ + GLboolean r = GL_FALSE; + + r = ((eglCreateSync64KHR = (PFNEGLCREATESYNC64KHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateSync64KHR")) == NULL) || r; + + return r; +} + +#endif /* EGL_KHR_cl_event2 */ + +#ifdef EGL_KHR_debug + +static GLboolean _glewInit_EGL_KHR_debug () +{ + GLboolean r = GL_FALSE; + + r = ((eglDebugMessageControlKHR = (PFNEGLDEBUGMESSAGECONTROLKHRPROC)glewGetProcAddress((const GLubyte*)"eglDebugMessageControlKHR")) == NULL) || r; + r = ((eglLabelObjectKHR = (PFNEGLLABELOBJECTKHRPROC)glewGetProcAddress((const GLubyte*)"eglLabelObjectKHR")) == NULL) || r; + r = ((eglQueryDebugKHR = (PFNEGLQUERYDEBUGKHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryDebugKHR")) == NULL) || r; + + return r; +} + +#endif /* EGL_KHR_debug */ + +#ifdef EGL_KHR_image + +static GLboolean _glewInit_EGL_KHR_image () +{ + GLboolean r = GL_FALSE; + + r = ((eglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateImageKHR")) == NULL) || r; + r = ((eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC)glewGetProcAddress((const GLubyte*)"eglDestroyImageKHR")) == NULL) || r; + + return r; +} + +#endif /* EGL_KHR_image */ + +#ifdef EGL_KHR_lock_surface + +static GLboolean _glewInit_EGL_KHR_lock_surface () +{ + GLboolean r = GL_FALSE; + + r = ((eglLockSurfaceKHR = (PFNEGLLOCKSURFACEKHRPROC)glewGetProcAddress((const GLubyte*)"eglLockSurfaceKHR")) == NULL) || r; + r = ((eglUnlockSurfaceKHR = (PFNEGLUNLOCKSURFACEKHRPROC)glewGetProcAddress((const GLubyte*)"eglUnlockSurfaceKHR")) == NULL) || r; + + return r; +} + +#endif /* EGL_KHR_lock_surface */ + +#ifdef EGL_KHR_lock_surface3 + +static GLboolean _glewInit_EGL_KHR_lock_surface3 () +{ + GLboolean r = GL_FALSE; + + r = ((eglQuerySurface64KHR = (PFNEGLQUERYSURFACE64KHRPROC)glewGetProcAddress((const GLubyte*)"eglQuerySurface64KHR")) == NULL) || r; + + return r; +} + +#endif /* EGL_KHR_lock_surface3 */ + +#ifdef EGL_KHR_partial_update + +static GLboolean _glewInit_EGL_KHR_partial_update () +{ + GLboolean r = GL_FALSE; + + r = ((eglSetDamageRegionKHR = (PFNEGLSETDAMAGEREGIONKHRPROC)glewGetProcAddress((const GLubyte*)"eglSetDamageRegionKHR")) == NULL) || r; + + return r; +} + +#endif /* EGL_KHR_partial_update */ + +#ifdef EGL_KHR_reusable_sync + +static GLboolean _glewInit_EGL_KHR_reusable_sync () +{ + GLboolean r = GL_FALSE; + + r = ((eglClientWaitSyncKHR = (PFNEGLCLIENTWAITSYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglClientWaitSyncKHR")) == NULL) || r; + r = ((eglCreateSyncKHR = (PFNEGLCREATESYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateSyncKHR")) == NULL) || r; + r = ((eglDestroySyncKHR = (PFNEGLDESTROYSYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglDestroySyncKHR")) == NULL) || r; + r = ((eglGetSyncAttribKHR = (PFNEGLGETSYNCATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglGetSyncAttribKHR")) == NULL) || r; + r = ((eglSignalSyncKHR = (PFNEGLSIGNALSYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglSignalSyncKHR")) == NULL) || r; + + return r; +} + +#endif /* EGL_KHR_reusable_sync */ + +#ifdef EGL_KHR_stream + +static GLboolean _glewInit_EGL_KHR_stream () +{ + GLboolean r = GL_FALSE; + + r = ((eglCreateStreamKHR = (PFNEGLCREATESTREAMKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamKHR")) == NULL) || r; + r = ((eglDestroyStreamKHR = (PFNEGLDESTROYSTREAMKHRPROC)glewGetProcAddress((const GLubyte*)"eglDestroyStreamKHR")) == NULL) || r; + r = ((eglQueryStreamKHR = (PFNEGLQUERYSTREAMKHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamKHR")) == NULL) || r; + r = ((eglQueryStreamu64KHR = (PFNEGLQUERYSTREAMU64KHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamu64KHR")) == NULL) || r; + r = ((eglStreamAttribKHR = (PFNEGLSTREAMATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamAttribKHR")) == NULL) || r; + + return r; +} + +#endif /* EGL_KHR_stream */ + +#ifdef EGL_KHR_stream_attrib + +static GLboolean _glewInit_EGL_KHR_stream_attrib () +{ + GLboolean r = GL_FALSE; + + r = ((eglCreateStreamAttribKHR = (PFNEGLCREATESTREAMATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamAttribKHR")) == NULL) || r; + r = ((eglQueryStreamAttribKHR = (PFNEGLQUERYSTREAMATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamAttribKHR")) == NULL) || r; + r = ((eglSetStreamAttribKHR = (PFNEGLSETSTREAMATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglSetStreamAttribKHR")) == NULL) || r; + r = ((eglStreamConsumerAcquireAttribKHR = (PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerAcquireAttribKHR")) == NULL) || r; + r = ((eglStreamConsumerReleaseAttribKHR = (PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerReleaseAttribKHR")) == NULL) || r; + + return r; +} + +#endif /* EGL_KHR_stream_attrib */ + +#ifdef EGL_KHR_stream_consumer_gltexture + +static GLboolean _glewInit_EGL_KHR_stream_consumer_gltexture () +{ + GLboolean r = GL_FALSE; + + r = ((eglStreamConsumerAcquireKHR = (PFNEGLSTREAMCONSUMERACQUIREKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerAcquireKHR")) == NULL) || r; + r = ((eglStreamConsumerGLTextureExternalKHR = (PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerGLTextureExternalKHR")) == NULL) || r; + r = ((eglStreamConsumerReleaseKHR = (PFNEGLSTREAMCONSUMERRELEASEKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerReleaseKHR")) == NULL) || r; + + return r; +} + +#endif /* EGL_KHR_stream_consumer_gltexture */ + +#ifdef EGL_KHR_stream_cross_process_fd + +static GLboolean _glewInit_EGL_KHR_stream_cross_process_fd () +{ + GLboolean r = GL_FALSE; + + r = ((eglCreateStreamFromFileDescriptorKHR = (PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamFromFileDescriptorKHR")) == NULL) || r; + r = ((eglGetStreamFileDescriptorKHR = (PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC)glewGetProcAddress((const GLubyte*)"eglGetStreamFileDescriptorKHR")) == NULL) || r; + + return r; +} + +#endif /* EGL_KHR_stream_cross_process_fd */ + +#ifdef EGL_KHR_stream_fifo + +static GLboolean _glewInit_EGL_KHR_stream_fifo () +{ + GLboolean r = GL_FALSE; + + r = ((eglQueryStreamTimeKHR = (PFNEGLQUERYSTREAMTIMEKHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamTimeKHR")) == NULL) || r; + + return r; +} + +#endif /* EGL_KHR_stream_fifo */ + +#ifdef EGL_KHR_stream_producer_eglsurface + +static GLboolean _glewInit_EGL_KHR_stream_producer_eglsurface () +{ + GLboolean r = GL_FALSE; + + r = ((eglCreateStreamProducerSurfaceKHR = (PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamProducerSurfaceKHR")) == NULL) || r; + + return r; +} + +#endif /* EGL_KHR_stream_producer_eglsurface */ + +#ifdef EGL_KHR_swap_buffers_with_damage + +static GLboolean _glewInit_EGL_KHR_swap_buffers_with_damage () +{ + GLboolean r = GL_FALSE; + + r = ((eglSwapBuffersWithDamageKHR = (PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffersWithDamageKHR")) == NULL) || r; + + return r; +} + +#endif /* EGL_KHR_swap_buffers_with_damage */ + +#ifdef EGL_KHR_wait_sync + +static GLboolean _glewInit_EGL_KHR_wait_sync () +{ + GLboolean r = GL_FALSE; + + r = ((eglWaitSyncKHR = (PFNEGLWAITSYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglWaitSyncKHR")) == NULL) || r; + + return r; +} + +#endif /* EGL_KHR_wait_sync */ + +#ifdef EGL_MESA_drm_image + +static GLboolean _glewInit_EGL_MESA_drm_image () +{ + GLboolean r = GL_FALSE; + + r = ((eglCreateDRMImageMESA = (PFNEGLCREATEDRMIMAGEMESAPROC)glewGetProcAddress((const GLubyte*)"eglCreateDRMImageMESA")) == NULL) || r; + r = ((eglExportDRMImageMESA = (PFNEGLEXPORTDRMIMAGEMESAPROC)glewGetProcAddress((const GLubyte*)"eglExportDRMImageMESA")) == NULL) || r; + + return r; +} + +#endif /* EGL_MESA_drm_image */ + +#ifdef EGL_MESA_image_dma_buf_export + +static GLboolean _glewInit_EGL_MESA_image_dma_buf_export () +{ + GLboolean r = GL_FALSE; + + r = ((eglExportDMABUFImageMESA = (PFNEGLEXPORTDMABUFIMAGEMESAPROC)glewGetProcAddress((const GLubyte*)"eglExportDMABUFImageMESA")) == NULL) || r; + r = ((eglExportDMABUFImageQueryMESA = (PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC)glewGetProcAddress((const GLubyte*)"eglExportDMABUFImageQueryMESA")) == NULL) || r; + + return r; +} + +#endif /* EGL_MESA_image_dma_buf_export */ + +#ifdef EGL_NOK_swap_region + +static GLboolean _glewInit_EGL_NOK_swap_region () +{ + GLboolean r = GL_FALSE; + + r = ((eglSwapBuffersRegionNOK = (PFNEGLSWAPBUFFERSREGIONNOKPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffersRegionNOK")) == NULL) || r; + + return r; +} + +#endif /* EGL_NOK_swap_region */ + +#ifdef EGL_NOK_swap_region2 + +static GLboolean _glewInit_EGL_NOK_swap_region2 () +{ + GLboolean r = GL_FALSE; + + r = ((eglSwapBuffersRegion2NOK = (PFNEGLSWAPBUFFERSREGION2NOKPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffersRegion2NOK")) == NULL) || r; + + return r; +} + +#endif /* EGL_NOK_swap_region2 */ + +#ifdef EGL_NV_native_query + +static GLboolean _glewInit_EGL_NV_native_query () +{ + GLboolean r = GL_FALSE; + + r = ((eglQueryNativeDisplayNV = (PFNEGLQUERYNATIVEDISPLAYNVPROC)glewGetProcAddress((const GLubyte*)"eglQueryNativeDisplayNV")) == NULL) || r; + r = ((eglQueryNativePixmapNV = (PFNEGLQUERYNATIVEPIXMAPNVPROC)glewGetProcAddress((const GLubyte*)"eglQueryNativePixmapNV")) == NULL) || r; + r = ((eglQueryNativeWindowNV = (PFNEGLQUERYNATIVEWINDOWNVPROC)glewGetProcAddress((const GLubyte*)"eglQueryNativeWindowNV")) == NULL) || r; + + return r; +} + +#endif /* EGL_NV_native_query */ + +#ifdef EGL_NV_post_sub_buffer + +static GLboolean _glewInit_EGL_NV_post_sub_buffer () +{ + GLboolean r = GL_FALSE; + + r = ((eglPostSubBufferNV = (PFNEGLPOSTSUBBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"eglPostSubBufferNV")) == NULL) || r; + + return r; +} + +#endif /* EGL_NV_post_sub_buffer */ + +#ifdef EGL_NV_stream_consumer_gltexture_yuv + +static GLboolean _glewInit_EGL_NV_stream_consumer_gltexture_yuv () +{ + GLboolean r = GL_FALSE; + + r = ((eglStreamConsumerGLTextureExternalAttribsNV = (PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerGLTextureExternalAttribsNV")) == NULL) || r; + + return r; +} + +#endif /* EGL_NV_stream_consumer_gltexture_yuv */ + +#ifdef EGL_NV_stream_metadata + +static GLboolean _glewInit_EGL_NV_stream_metadata () +{ + GLboolean r = GL_FALSE; + + r = ((eglQueryDisplayAttribNV = (PFNEGLQUERYDISPLAYATTRIBNVPROC)glewGetProcAddress((const GLubyte*)"eglQueryDisplayAttribNV")) == NULL) || r; + r = ((eglQueryStreamMetadataNV = (PFNEGLQUERYSTREAMMETADATANVPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamMetadataNV")) == NULL) || r; + r = ((eglSetStreamMetadataNV = (PFNEGLSETSTREAMMETADATANVPROC)glewGetProcAddress((const GLubyte*)"eglSetStreamMetadataNV")) == NULL) || r; + + return r; +} + +#endif /* EGL_NV_stream_metadata */ + +#ifdef EGL_NV_stream_reset + +static GLboolean _glewInit_EGL_NV_stream_reset () +{ + GLboolean r = GL_FALSE; + + r = ((eglResetStreamNV = (PFNEGLRESETSTREAMNVPROC)glewGetProcAddress((const GLubyte*)"eglResetStreamNV")) == NULL) || r; + + return r; +} + +#endif /* EGL_NV_stream_reset */ + +#ifdef EGL_NV_stream_sync + +static GLboolean _glewInit_EGL_NV_stream_sync () +{ + GLboolean r = GL_FALSE; + + r = ((eglCreateStreamSyncNV = (PFNEGLCREATESTREAMSYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamSyncNV")) == NULL) || r; + + return r; +} + +#endif /* EGL_NV_stream_sync */ + +#ifdef EGL_NV_sync + +static GLboolean _glewInit_EGL_NV_sync () +{ + GLboolean r = GL_FALSE; + + r = ((eglClientWaitSyncNV = (PFNEGLCLIENTWAITSYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglClientWaitSyncNV")) == NULL) || r; + r = ((eglCreateFenceSyncNV = (PFNEGLCREATEFENCESYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglCreateFenceSyncNV")) == NULL) || r; + r = ((eglDestroySyncNV = (PFNEGLDESTROYSYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglDestroySyncNV")) == NULL) || r; + r = ((eglFenceNV = (PFNEGLFENCENVPROC)glewGetProcAddress((const GLubyte*)"eglFenceNV")) == NULL) || r; + r = ((eglGetSyncAttribNV = (PFNEGLGETSYNCATTRIBNVPROC)glewGetProcAddress((const GLubyte*)"eglGetSyncAttribNV")) == NULL) || r; + r = ((eglSignalSyncNV = (PFNEGLSIGNALSYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglSignalSyncNV")) == NULL) || r; + + return r; +} + +#endif /* EGL_NV_sync */ + +#ifdef EGL_NV_system_time + +static GLboolean _glewInit_EGL_NV_system_time () +{ + GLboolean r = GL_FALSE; + + r = ((eglGetSystemTimeFrequencyNV = (PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC)glewGetProcAddress((const GLubyte*)"eglGetSystemTimeFrequencyNV")) == NULL) || r; + r = ((eglGetSystemTimeNV = (PFNEGLGETSYSTEMTIMENVPROC)glewGetProcAddress((const GLubyte*)"eglGetSystemTimeNV")) == NULL) || r; + + return r; +} + +#endif /* EGL_NV_system_time */ + + /* ------------------------------------------------------------------------ */ + +GLboolean eglewGetExtension (const char* name) +{ + const GLubyte* start; + const GLubyte* end; + + start = (const GLubyte*) eglQueryString(eglGetCurrentDisplay(), EGL_EXTENSIONS); + if (0 == start) return GL_FALSE; + end = start + _glewStrLen(start); + return _glewSearchExtension(name, start, end); +} + +GLenum eglewInit (EGLDisplay display) +{ + EGLint major, minor; + const GLubyte* extStart; + const GLubyte* extEnd; + PFNEGLINITIALIZEPROC initialize = NULL; + PFNEGLQUERYSTRINGPROC queryString = NULL; + + /* Load necessary entry points */ + initialize = (PFNEGLINITIALIZEPROC) glewGetProcAddress("eglInitialize"); + queryString = (PFNEGLQUERYSTRINGPROC) glewGetProcAddress("eglQueryString"); + if (!initialize || !queryString) + return 1; + + /* query EGK version */ + if (initialize(display, &major, &minor) != EGL_TRUE) + return 1; + + EGLEW_VERSION_1_5 = ( major > 1 ) || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE; + EGLEW_VERSION_1_4 = EGLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE; + EGLEW_VERSION_1_3 = EGLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE; + EGLEW_VERSION_1_2 = EGLEW_VERSION_1_3 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE; + EGLEW_VERSION_1_1 = EGLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE; + EGLEW_VERSION_1_0 = EGLEW_VERSION_1_1 == GL_TRUE || ( major == 1 && minor >= 0 ) ? GL_TRUE : GL_FALSE; + + /* query EGL extension string */ + extStart = (const GLubyte*) queryString(display, EGL_EXTENSIONS); + if (extStart == 0) + extStart = (const GLubyte *)""; + extEnd = extStart + _glewStrLen(extStart); + + /* initialize extensions */ +#ifdef EGL_VERSION_1_0 + if (glewExperimental || EGLEW_VERSION_1_0) EGLEW_VERSION_1_0 = !_glewInit_EGL_VERSION_1_0(); +#endif /* EGL_VERSION_1_0 */ +#ifdef EGL_VERSION_1_1 + if (glewExperimental || EGLEW_VERSION_1_1) EGLEW_VERSION_1_1 = !_glewInit_EGL_VERSION_1_1(); +#endif /* EGL_VERSION_1_1 */ +#ifdef EGL_VERSION_1_2 + if (glewExperimental || EGLEW_VERSION_1_2) EGLEW_VERSION_1_2 = !_glewInit_EGL_VERSION_1_2(); +#endif /* EGL_VERSION_1_2 */ +#ifdef EGL_VERSION_1_4 + if (glewExperimental || EGLEW_VERSION_1_4) EGLEW_VERSION_1_4 = !_glewInit_EGL_VERSION_1_4(); +#endif /* EGL_VERSION_1_4 */ +#ifdef EGL_VERSION_1_5 + if (glewExperimental || EGLEW_VERSION_1_5) EGLEW_VERSION_1_5 = !_glewInit_EGL_VERSION_1_5(); +#endif /* EGL_VERSION_1_5 */ +#ifdef EGL_ANDROID_blob_cache + EGLEW_ANDROID_blob_cache = _glewSearchExtension("EGL_ANDROID_blob_cache", extStart, extEnd); + if (glewExperimental || EGLEW_ANDROID_blob_cache) EGLEW_ANDROID_blob_cache = !_glewInit_EGL_ANDROID_blob_cache(); +#endif /* EGL_ANDROID_blob_cache */ +#ifdef EGL_ANDROID_create_native_client_buffer + EGLEW_ANDROID_create_native_client_buffer = _glewSearchExtension("EGL_ANDROID_create_native_client_buffer", extStart, extEnd); + if (glewExperimental || EGLEW_ANDROID_create_native_client_buffer) EGLEW_ANDROID_create_native_client_buffer = !_glewInit_EGL_ANDROID_create_native_client_buffer(); +#endif /* EGL_ANDROID_create_native_client_buffer */ +#ifdef EGL_ANDROID_framebuffer_target + EGLEW_ANDROID_framebuffer_target = _glewSearchExtension("EGL_ANDROID_framebuffer_target", extStart, extEnd); +#endif /* EGL_ANDROID_framebuffer_target */ +#ifdef EGL_ANDROID_front_buffer_auto_refresh + EGLEW_ANDROID_front_buffer_auto_refresh = _glewSearchExtension("EGL_ANDROID_front_buffer_auto_refresh", extStart, extEnd); +#endif /* EGL_ANDROID_front_buffer_auto_refresh */ +#ifdef EGL_ANDROID_image_native_buffer + EGLEW_ANDROID_image_native_buffer = _glewSearchExtension("EGL_ANDROID_image_native_buffer", extStart, extEnd); +#endif /* EGL_ANDROID_image_native_buffer */ +#ifdef EGL_ANDROID_native_fence_sync + EGLEW_ANDROID_native_fence_sync = _glewSearchExtension("EGL_ANDROID_native_fence_sync", extStart, extEnd); + if (glewExperimental || EGLEW_ANDROID_native_fence_sync) EGLEW_ANDROID_native_fence_sync = !_glewInit_EGL_ANDROID_native_fence_sync(); +#endif /* EGL_ANDROID_native_fence_sync */ +#ifdef EGL_ANDROID_presentation_time + EGLEW_ANDROID_presentation_time = _glewSearchExtension("EGL_ANDROID_presentation_time", extStart, extEnd); + if (glewExperimental || EGLEW_ANDROID_presentation_time) EGLEW_ANDROID_presentation_time = !_glewInit_EGL_ANDROID_presentation_time(); +#endif /* EGL_ANDROID_presentation_time */ +#ifdef EGL_ANDROID_recordable + EGLEW_ANDROID_recordable = _glewSearchExtension("EGL_ANDROID_recordable", extStart, extEnd); +#endif /* EGL_ANDROID_recordable */ +#ifdef EGL_ANGLE_d3d_share_handle_client_buffer + EGLEW_ANGLE_d3d_share_handle_client_buffer = _glewSearchExtension("EGL_ANGLE_d3d_share_handle_client_buffer", extStart, extEnd); +#endif /* EGL_ANGLE_d3d_share_handle_client_buffer */ +#ifdef EGL_ANGLE_device_d3d + EGLEW_ANGLE_device_d3d = _glewSearchExtension("EGL_ANGLE_device_d3d", extStart, extEnd); +#endif /* EGL_ANGLE_device_d3d */ +#ifdef EGL_ANGLE_query_surface_pointer + EGLEW_ANGLE_query_surface_pointer = _glewSearchExtension("EGL_ANGLE_query_surface_pointer", extStart, extEnd); + if (glewExperimental || EGLEW_ANGLE_query_surface_pointer) EGLEW_ANGLE_query_surface_pointer = !_glewInit_EGL_ANGLE_query_surface_pointer(); +#endif /* EGL_ANGLE_query_surface_pointer */ +#ifdef EGL_ANGLE_surface_d3d_texture_2d_share_handle + EGLEW_ANGLE_surface_d3d_texture_2d_share_handle = _glewSearchExtension("EGL_ANGLE_surface_d3d_texture_2d_share_handle", extStart, extEnd); +#endif /* EGL_ANGLE_surface_d3d_texture_2d_share_handle */ +#ifdef EGL_ANGLE_window_fixed_size + EGLEW_ANGLE_window_fixed_size = _glewSearchExtension("EGL_ANGLE_window_fixed_size", extStart, extEnd); +#endif /* EGL_ANGLE_window_fixed_size */ +#ifdef EGL_ARM_implicit_external_sync + EGLEW_ARM_implicit_external_sync = _glewSearchExtension("EGL_ARM_implicit_external_sync", extStart, extEnd); +#endif /* EGL_ARM_implicit_external_sync */ +#ifdef EGL_ARM_pixmap_multisample_discard + EGLEW_ARM_pixmap_multisample_discard = _glewSearchExtension("EGL_ARM_pixmap_multisample_discard", extStart, extEnd); +#endif /* EGL_ARM_pixmap_multisample_discard */ +#ifdef EGL_EXT_buffer_age + EGLEW_EXT_buffer_age = _glewSearchExtension("EGL_EXT_buffer_age", extStart, extEnd); +#endif /* EGL_EXT_buffer_age */ +#ifdef EGL_EXT_client_extensions + EGLEW_EXT_client_extensions = _glewSearchExtension("EGL_EXT_client_extensions", extStart, extEnd); +#endif /* EGL_EXT_client_extensions */ +#ifdef EGL_EXT_create_context_robustness + EGLEW_EXT_create_context_robustness = _glewSearchExtension("EGL_EXT_create_context_robustness", extStart, extEnd); +#endif /* EGL_EXT_create_context_robustness */ +#ifdef EGL_EXT_device_base + EGLEW_EXT_device_base = _glewSearchExtension("EGL_EXT_device_base", extStart, extEnd); +#endif /* EGL_EXT_device_base */ +#ifdef EGL_EXT_device_drm + EGLEW_EXT_device_drm = _glewSearchExtension("EGL_EXT_device_drm", extStart, extEnd); +#endif /* EGL_EXT_device_drm */ +#ifdef EGL_EXT_device_enumeration + EGLEW_EXT_device_enumeration = _glewSearchExtension("EGL_EXT_device_enumeration", extStart, extEnd); + if (glewExperimental || EGLEW_EXT_device_enumeration) EGLEW_EXT_device_enumeration = !_glewInit_EGL_EXT_device_enumeration(); +#endif /* EGL_EXT_device_enumeration */ +#ifdef EGL_EXT_device_openwf + EGLEW_EXT_device_openwf = _glewSearchExtension("EGL_EXT_device_openwf", extStart, extEnd); +#endif /* EGL_EXT_device_openwf */ +#ifdef EGL_EXT_device_query + EGLEW_EXT_device_query = _glewSearchExtension("EGL_EXT_device_query", extStart, extEnd); + if (glewExperimental || EGLEW_EXT_device_query) EGLEW_EXT_device_query = !_glewInit_EGL_EXT_device_query(); +#endif /* EGL_EXT_device_query */ +#ifdef EGL_EXT_gl_colorspace_bt2020_linear + EGLEW_EXT_gl_colorspace_bt2020_linear = _glewSearchExtension("EGL_EXT_gl_colorspace_bt2020_linear", extStart, extEnd); +#endif /* EGL_EXT_gl_colorspace_bt2020_linear */ +#ifdef EGL_EXT_gl_colorspace_bt2020_pq + EGLEW_EXT_gl_colorspace_bt2020_pq = _glewSearchExtension("EGL_EXT_gl_colorspace_bt2020_pq", extStart, extEnd); +#endif /* EGL_EXT_gl_colorspace_bt2020_pq */ +#ifdef EGL_EXT_gl_colorspace_scrgb_linear + EGLEW_EXT_gl_colorspace_scrgb_linear = _glewSearchExtension("EGL_EXT_gl_colorspace_scrgb_linear", extStart, extEnd); +#endif /* EGL_EXT_gl_colorspace_scrgb_linear */ +#ifdef EGL_EXT_image_dma_buf_import + EGLEW_EXT_image_dma_buf_import = _glewSearchExtension("EGL_EXT_image_dma_buf_import", extStart, extEnd); +#endif /* EGL_EXT_image_dma_buf_import */ +#ifdef EGL_EXT_image_dma_buf_import_modifiers + EGLEW_EXT_image_dma_buf_import_modifiers = _glewSearchExtension("EGL_EXT_image_dma_buf_import_modifiers", extStart, extEnd); + if (glewExperimental || EGLEW_EXT_image_dma_buf_import_modifiers) EGLEW_EXT_image_dma_buf_import_modifiers = !_glewInit_EGL_EXT_image_dma_buf_import_modifiers(); +#endif /* EGL_EXT_image_dma_buf_import_modifiers */ +#ifdef EGL_EXT_multiview_window + EGLEW_EXT_multiview_window = _glewSearchExtension("EGL_EXT_multiview_window", extStart, extEnd); +#endif /* EGL_EXT_multiview_window */ +#ifdef EGL_EXT_output_base + EGLEW_EXT_output_base = _glewSearchExtension("EGL_EXT_output_base", extStart, extEnd); + if (glewExperimental || EGLEW_EXT_output_base) EGLEW_EXT_output_base = !_glewInit_EGL_EXT_output_base(); +#endif /* EGL_EXT_output_base */ +#ifdef EGL_EXT_output_drm + EGLEW_EXT_output_drm = _glewSearchExtension("EGL_EXT_output_drm", extStart, extEnd); +#endif /* EGL_EXT_output_drm */ +#ifdef EGL_EXT_output_openwf + EGLEW_EXT_output_openwf = _glewSearchExtension("EGL_EXT_output_openwf", extStart, extEnd); +#endif /* EGL_EXT_output_openwf */ +#ifdef EGL_EXT_pixel_format_float + EGLEW_EXT_pixel_format_float = _glewSearchExtension("EGL_EXT_pixel_format_float", extStart, extEnd); +#endif /* EGL_EXT_pixel_format_float */ +#ifdef EGL_EXT_platform_base + EGLEW_EXT_platform_base = _glewSearchExtension("EGL_EXT_platform_base", extStart, extEnd); + if (glewExperimental || EGLEW_EXT_platform_base) EGLEW_EXT_platform_base = !_glewInit_EGL_EXT_platform_base(); +#endif /* EGL_EXT_platform_base */ +#ifdef EGL_EXT_platform_device + EGLEW_EXT_platform_device = _glewSearchExtension("EGL_EXT_platform_device", extStart, extEnd); +#endif /* EGL_EXT_platform_device */ +#ifdef EGL_EXT_platform_wayland + EGLEW_EXT_platform_wayland = _glewSearchExtension("EGL_EXT_platform_wayland", extStart, extEnd); +#endif /* EGL_EXT_platform_wayland */ +#ifdef EGL_EXT_platform_x11 + EGLEW_EXT_platform_x11 = _glewSearchExtension("EGL_EXT_platform_x11", extStart, extEnd); +#endif /* EGL_EXT_platform_x11 */ +#ifdef EGL_EXT_protected_content + EGLEW_EXT_protected_content = _glewSearchExtension("EGL_EXT_protected_content", extStart, extEnd); +#endif /* EGL_EXT_protected_content */ +#ifdef EGL_EXT_protected_surface + EGLEW_EXT_protected_surface = _glewSearchExtension("EGL_EXT_protected_surface", extStart, extEnd); +#endif /* EGL_EXT_protected_surface */ +#ifdef EGL_EXT_stream_consumer_egloutput + EGLEW_EXT_stream_consumer_egloutput = _glewSearchExtension("EGL_EXT_stream_consumer_egloutput", extStart, extEnd); + if (glewExperimental || EGLEW_EXT_stream_consumer_egloutput) EGLEW_EXT_stream_consumer_egloutput = !_glewInit_EGL_EXT_stream_consumer_egloutput(); +#endif /* EGL_EXT_stream_consumer_egloutput */ +#ifdef EGL_EXT_surface_SMPTE2086_metadata + EGLEW_EXT_surface_SMPTE2086_metadata = _glewSearchExtension("EGL_EXT_surface_SMPTE2086_metadata", extStart, extEnd); +#endif /* EGL_EXT_surface_SMPTE2086_metadata */ +#ifdef EGL_EXT_swap_buffers_with_damage + EGLEW_EXT_swap_buffers_with_damage = _glewSearchExtension("EGL_EXT_swap_buffers_with_damage", extStart, extEnd); + if (glewExperimental || EGLEW_EXT_swap_buffers_with_damage) EGLEW_EXT_swap_buffers_with_damage = !_glewInit_EGL_EXT_swap_buffers_with_damage(); +#endif /* EGL_EXT_swap_buffers_with_damage */ +#ifdef EGL_EXT_yuv_surface + EGLEW_EXT_yuv_surface = _glewSearchExtension("EGL_EXT_yuv_surface", extStart, extEnd); +#endif /* EGL_EXT_yuv_surface */ +#ifdef EGL_HI_clientpixmap + EGLEW_HI_clientpixmap = _glewSearchExtension("EGL_HI_clientpixmap", extStart, extEnd); + if (glewExperimental || EGLEW_HI_clientpixmap) EGLEW_HI_clientpixmap = !_glewInit_EGL_HI_clientpixmap(); +#endif /* EGL_HI_clientpixmap */ +#ifdef EGL_HI_colorformats + EGLEW_HI_colorformats = _glewSearchExtension("EGL_HI_colorformats", extStart, extEnd); +#endif /* EGL_HI_colorformats */ +#ifdef EGL_IMG_context_priority + EGLEW_IMG_context_priority = _glewSearchExtension("EGL_IMG_context_priority", extStart, extEnd); +#endif /* EGL_IMG_context_priority */ +#ifdef EGL_IMG_image_plane_attribs + EGLEW_IMG_image_plane_attribs = _glewSearchExtension("EGL_IMG_image_plane_attribs", extStart, extEnd); +#endif /* EGL_IMG_image_plane_attribs */ +#ifdef EGL_KHR_cl_event + EGLEW_KHR_cl_event = _glewSearchExtension("EGL_KHR_cl_event", extStart, extEnd); +#endif /* EGL_KHR_cl_event */ +#ifdef EGL_KHR_cl_event2 + EGLEW_KHR_cl_event2 = _glewSearchExtension("EGL_KHR_cl_event2", extStart, extEnd); + if (glewExperimental || EGLEW_KHR_cl_event2) EGLEW_KHR_cl_event2 = !_glewInit_EGL_KHR_cl_event2(); +#endif /* EGL_KHR_cl_event2 */ +#ifdef EGL_KHR_client_get_all_proc_addresses + EGLEW_KHR_client_get_all_proc_addresses = _glewSearchExtension("EGL_KHR_client_get_all_proc_addresses", extStart, extEnd); +#endif /* EGL_KHR_client_get_all_proc_addresses */ +#ifdef EGL_KHR_config_attribs + EGLEW_KHR_config_attribs = _glewSearchExtension("EGL_KHR_config_attribs", extStart, extEnd); +#endif /* EGL_KHR_config_attribs */ +#ifdef EGL_KHR_context_flush_control + EGLEW_KHR_context_flush_control = _glewSearchExtension("EGL_KHR_context_flush_control", extStart, extEnd); +#endif /* EGL_KHR_context_flush_control */ +#ifdef EGL_KHR_create_context + EGLEW_KHR_create_context = _glewSearchExtension("EGL_KHR_create_context", extStart, extEnd); +#endif /* EGL_KHR_create_context */ +#ifdef EGL_KHR_create_context_no_error + EGLEW_KHR_create_context_no_error = _glewSearchExtension("EGL_KHR_create_context_no_error", extStart, extEnd); +#endif /* EGL_KHR_create_context_no_error */ +#ifdef EGL_KHR_debug + EGLEW_KHR_debug = _glewSearchExtension("EGL_KHR_debug", extStart, extEnd); + if (glewExperimental || EGLEW_KHR_debug) EGLEW_KHR_debug = !_glewInit_EGL_KHR_debug(); +#endif /* EGL_KHR_debug */ +#ifdef EGL_KHR_fence_sync + EGLEW_KHR_fence_sync = _glewSearchExtension("EGL_KHR_fence_sync", extStart, extEnd); +#endif /* EGL_KHR_fence_sync */ +#ifdef EGL_KHR_get_all_proc_addresses + EGLEW_KHR_get_all_proc_addresses = _glewSearchExtension("EGL_KHR_get_all_proc_addresses", extStart, extEnd); +#endif /* EGL_KHR_get_all_proc_addresses */ +#ifdef EGL_KHR_gl_colorspace + EGLEW_KHR_gl_colorspace = _glewSearchExtension("EGL_KHR_gl_colorspace", extStart, extEnd); +#endif /* EGL_KHR_gl_colorspace */ +#ifdef EGL_KHR_gl_renderbuffer_image + EGLEW_KHR_gl_renderbuffer_image = _glewSearchExtension("EGL_KHR_gl_renderbuffer_image", extStart, extEnd); +#endif /* EGL_KHR_gl_renderbuffer_image */ +#ifdef EGL_KHR_gl_texture_2D_image + EGLEW_KHR_gl_texture_2D_image = _glewSearchExtension("EGL_KHR_gl_texture_2D_image", extStart, extEnd); +#endif /* EGL_KHR_gl_texture_2D_image */ +#ifdef EGL_KHR_gl_texture_3D_image + EGLEW_KHR_gl_texture_3D_image = _glewSearchExtension("EGL_KHR_gl_texture_3D_image", extStart, extEnd); +#endif /* EGL_KHR_gl_texture_3D_image */ +#ifdef EGL_KHR_gl_texture_cubemap_image + EGLEW_KHR_gl_texture_cubemap_image = _glewSearchExtension("EGL_KHR_gl_texture_cubemap_image", extStart, extEnd); +#endif /* EGL_KHR_gl_texture_cubemap_image */ +#ifdef EGL_KHR_image + EGLEW_KHR_image = _glewSearchExtension("EGL_KHR_image", extStart, extEnd); + if (glewExperimental || EGLEW_KHR_image) EGLEW_KHR_image = !_glewInit_EGL_KHR_image(); +#endif /* EGL_KHR_image */ +#ifdef EGL_KHR_image_base + EGLEW_KHR_image_base = _glewSearchExtension("EGL_KHR_image_base", extStart, extEnd); +#endif /* EGL_KHR_image_base */ +#ifdef EGL_KHR_image_pixmap + EGLEW_KHR_image_pixmap = _glewSearchExtension("EGL_KHR_image_pixmap", extStart, extEnd); +#endif /* EGL_KHR_image_pixmap */ +#ifdef EGL_KHR_lock_surface + EGLEW_KHR_lock_surface = _glewSearchExtension("EGL_KHR_lock_surface", extStart, extEnd); + if (glewExperimental || EGLEW_KHR_lock_surface) EGLEW_KHR_lock_surface = !_glewInit_EGL_KHR_lock_surface(); +#endif /* EGL_KHR_lock_surface */ +#ifdef EGL_KHR_lock_surface2 + EGLEW_KHR_lock_surface2 = _glewSearchExtension("EGL_KHR_lock_surface2", extStart, extEnd); +#endif /* EGL_KHR_lock_surface2 */ +#ifdef EGL_KHR_lock_surface3 + EGLEW_KHR_lock_surface3 = _glewSearchExtension("EGL_KHR_lock_surface3", extStart, extEnd); + if (glewExperimental || EGLEW_KHR_lock_surface3) EGLEW_KHR_lock_surface3 = !_glewInit_EGL_KHR_lock_surface3(); +#endif /* EGL_KHR_lock_surface3 */ +#ifdef EGL_KHR_mutable_render_buffer + EGLEW_KHR_mutable_render_buffer = _glewSearchExtension("EGL_KHR_mutable_render_buffer", extStart, extEnd); +#endif /* EGL_KHR_mutable_render_buffer */ +#ifdef EGL_KHR_no_config_context + EGLEW_KHR_no_config_context = _glewSearchExtension("EGL_KHR_no_config_context", extStart, extEnd); +#endif /* EGL_KHR_no_config_context */ +#ifdef EGL_KHR_partial_update + EGLEW_KHR_partial_update = _glewSearchExtension("EGL_KHR_partial_update", extStart, extEnd); + if (glewExperimental || EGLEW_KHR_partial_update) EGLEW_KHR_partial_update = !_glewInit_EGL_KHR_partial_update(); +#endif /* EGL_KHR_partial_update */ +#ifdef EGL_KHR_platform_android + EGLEW_KHR_platform_android = _glewSearchExtension("EGL_KHR_platform_android", extStart, extEnd); +#endif /* EGL_KHR_platform_android */ +#ifdef EGL_KHR_platform_gbm + EGLEW_KHR_platform_gbm = _glewSearchExtension("EGL_KHR_platform_gbm", extStart, extEnd); +#endif /* EGL_KHR_platform_gbm */ +#ifdef EGL_KHR_platform_wayland + EGLEW_KHR_platform_wayland = _glewSearchExtension("EGL_KHR_platform_wayland", extStart, extEnd); +#endif /* EGL_KHR_platform_wayland */ +#ifdef EGL_KHR_platform_x11 + EGLEW_KHR_platform_x11 = _glewSearchExtension("EGL_KHR_platform_x11", extStart, extEnd); +#endif /* EGL_KHR_platform_x11 */ +#ifdef EGL_KHR_reusable_sync + EGLEW_KHR_reusable_sync = _glewSearchExtension("EGL_KHR_reusable_sync", extStart, extEnd); + if (glewExperimental || EGLEW_KHR_reusable_sync) EGLEW_KHR_reusable_sync = !_glewInit_EGL_KHR_reusable_sync(); +#endif /* EGL_KHR_reusable_sync */ +#ifdef EGL_KHR_stream + EGLEW_KHR_stream = _glewSearchExtension("EGL_KHR_stream", extStart, extEnd); + if (glewExperimental || EGLEW_KHR_stream) EGLEW_KHR_stream = !_glewInit_EGL_KHR_stream(); +#endif /* EGL_KHR_stream */ +#ifdef EGL_KHR_stream_attrib + EGLEW_KHR_stream_attrib = _glewSearchExtension("EGL_KHR_stream_attrib", extStart, extEnd); + if (glewExperimental || EGLEW_KHR_stream_attrib) EGLEW_KHR_stream_attrib = !_glewInit_EGL_KHR_stream_attrib(); +#endif /* EGL_KHR_stream_attrib */ +#ifdef EGL_KHR_stream_consumer_gltexture + EGLEW_KHR_stream_consumer_gltexture = _glewSearchExtension("EGL_KHR_stream_consumer_gltexture", extStart, extEnd); + if (glewExperimental || EGLEW_KHR_stream_consumer_gltexture) EGLEW_KHR_stream_consumer_gltexture = !_glewInit_EGL_KHR_stream_consumer_gltexture(); +#endif /* EGL_KHR_stream_consumer_gltexture */ +#ifdef EGL_KHR_stream_cross_process_fd + EGLEW_KHR_stream_cross_process_fd = _glewSearchExtension("EGL_KHR_stream_cross_process_fd", extStart, extEnd); + if (glewExperimental || EGLEW_KHR_stream_cross_process_fd) EGLEW_KHR_stream_cross_process_fd = !_glewInit_EGL_KHR_stream_cross_process_fd(); +#endif /* EGL_KHR_stream_cross_process_fd */ +#ifdef EGL_KHR_stream_fifo + EGLEW_KHR_stream_fifo = _glewSearchExtension("EGL_KHR_stream_fifo", extStart, extEnd); + if (glewExperimental || EGLEW_KHR_stream_fifo) EGLEW_KHR_stream_fifo = !_glewInit_EGL_KHR_stream_fifo(); +#endif /* EGL_KHR_stream_fifo */ +#ifdef EGL_KHR_stream_producer_aldatalocator + EGLEW_KHR_stream_producer_aldatalocator = _glewSearchExtension("EGL_KHR_stream_producer_aldatalocator", extStart, extEnd); +#endif /* EGL_KHR_stream_producer_aldatalocator */ +#ifdef EGL_KHR_stream_producer_eglsurface + EGLEW_KHR_stream_producer_eglsurface = _glewSearchExtension("EGL_KHR_stream_producer_eglsurface", extStart, extEnd); + if (glewExperimental || EGLEW_KHR_stream_producer_eglsurface) EGLEW_KHR_stream_producer_eglsurface = !_glewInit_EGL_KHR_stream_producer_eglsurface(); +#endif /* EGL_KHR_stream_producer_eglsurface */ +#ifdef EGL_KHR_surfaceless_context + EGLEW_KHR_surfaceless_context = _glewSearchExtension("EGL_KHR_surfaceless_context", extStart, extEnd); +#endif /* EGL_KHR_surfaceless_context */ +#ifdef EGL_KHR_swap_buffers_with_damage + EGLEW_KHR_swap_buffers_with_damage = _glewSearchExtension("EGL_KHR_swap_buffers_with_damage", extStart, extEnd); + if (glewExperimental || EGLEW_KHR_swap_buffers_with_damage) EGLEW_KHR_swap_buffers_with_damage = !_glewInit_EGL_KHR_swap_buffers_with_damage(); +#endif /* EGL_KHR_swap_buffers_with_damage */ +#ifdef EGL_KHR_vg_parent_image + EGLEW_KHR_vg_parent_image = _glewSearchExtension("EGL_KHR_vg_parent_image", extStart, extEnd); +#endif /* EGL_KHR_vg_parent_image */ +#ifdef EGL_KHR_wait_sync + EGLEW_KHR_wait_sync = _glewSearchExtension("EGL_KHR_wait_sync", extStart, extEnd); + if (glewExperimental || EGLEW_KHR_wait_sync) EGLEW_KHR_wait_sync = !_glewInit_EGL_KHR_wait_sync(); +#endif /* EGL_KHR_wait_sync */ +#ifdef EGL_MESA_drm_image + EGLEW_MESA_drm_image = _glewSearchExtension("EGL_MESA_drm_image", extStart, extEnd); + if (glewExperimental || EGLEW_MESA_drm_image) EGLEW_MESA_drm_image = !_glewInit_EGL_MESA_drm_image(); +#endif /* EGL_MESA_drm_image */ +#ifdef EGL_MESA_image_dma_buf_export + EGLEW_MESA_image_dma_buf_export = _glewSearchExtension("EGL_MESA_image_dma_buf_export", extStart, extEnd); + if (glewExperimental || EGLEW_MESA_image_dma_buf_export) EGLEW_MESA_image_dma_buf_export = !_glewInit_EGL_MESA_image_dma_buf_export(); +#endif /* EGL_MESA_image_dma_buf_export */ +#ifdef EGL_MESA_platform_gbm + EGLEW_MESA_platform_gbm = _glewSearchExtension("EGL_MESA_platform_gbm", extStart, extEnd); +#endif /* EGL_MESA_platform_gbm */ +#ifdef EGL_MESA_platform_surfaceless + EGLEW_MESA_platform_surfaceless = _glewSearchExtension("EGL_MESA_platform_surfaceless", extStart, extEnd); +#endif /* EGL_MESA_platform_surfaceless */ +#ifdef EGL_NOK_swap_region + EGLEW_NOK_swap_region = _glewSearchExtension("EGL_NOK_swap_region", extStart, extEnd); + if (glewExperimental || EGLEW_NOK_swap_region) EGLEW_NOK_swap_region = !_glewInit_EGL_NOK_swap_region(); +#endif /* EGL_NOK_swap_region */ +#ifdef EGL_NOK_swap_region2 + EGLEW_NOK_swap_region2 = _glewSearchExtension("EGL_NOK_swap_region2", extStart, extEnd); + if (glewExperimental || EGLEW_NOK_swap_region2) EGLEW_NOK_swap_region2 = !_glewInit_EGL_NOK_swap_region2(); +#endif /* EGL_NOK_swap_region2 */ +#ifdef EGL_NOK_texture_from_pixmap + EGLEW_NOK_texture_from_pixmap = _glewSearchExtension("EGL_NOK_texture_from_pixmap", extStart, extEnd); +#endif /* EGL_NOK_texture_from_pixmap */ +#ifdef EGL_NV_3dvision_surface + EGLEW_NV_3dvision_surface = _glewSearchExtension("EGL_NV_3dvision_surface", extStart, extEnd); +#endif /* EGL_NV_3dvision_surface */ +#ifdef EGL_NV_coverage_sample + EGLEW_NV_coverage_sample = _glewSearchExtension("EGL_NV_coverage_sample", extStart, extEnd); +#endif /* EGL_NV_coverage_sample */ +#ifdef EGL_NV_coverage_sample_resolve + EGLEW_NV_coverage_sample_resolve = _glewSearchExtension("EGL_NV_coverage_sample_resolve", extStart, extEnd); +#endif /* EGL_NV_coverage_sample_resolve */ +#ifdef EGL_NV_cuda_event + EGLEW_NV_cuda_event = _glewSearchExtension("EGL_NV_cuda_event", extStart, extEnd); +#endif /* EGL_NV_cuda_event */ +#ifdef EGL_NV_depth_nonlinear + EGLEW_NV_depth_nonlinear = _glewSearchExtension("EGL_NV_depth_nonlinear", extStart, extEnd); +#endif /* EGL_NV_depth_nonlinear */ +#ifdef EGL_NV_device_cuda + EGLEW_NV_device_cuda = _glewSearchExtension("EGL_NV_device_cuda", extStart, extEnd); +#endif /* EGL_NV_device_cuda */ +#ifdef EGL_NV_native_query + EGLEW_NV_native_query = _glewSearchExtension("EGL_NV_native_query", extStart, extEnd); + if (glewExperimental || EGLEW_NV_native_query) EGLEW_NV_native_query = !_glewInit_EGL_NV_native_query(); +#endif /* EGL_NV_native_query */ +#ifdef EGL_NV_post_convert_rounding + EGLEW_NV_post_convert_rounding = _glewSearchExtension("EGL_NV_post_convert_rounding", extStart, extEnd); +#endif /* EGL_NV_post_convert_rounding */ +#ifdef EGL_NV_post_sub_buffer + EGLEW_NV_post_sub_buffer = _glewSearchExtension("EGL_NV_post_sub_buffer", extStart, extEnd); + if (glewExperimental || EGLEW_NV_post_sub_buffer) EGLEW_NV_post_sub_buffer = !_glewInit_EGL_NV_post_sub_buffer(); +#endif /* EGL_NV_post_sub_buffer */ +#ifdef EGL_NV_robustness_video_memory_purge + EGLEW_NV_robustness_video_memory_purge = _glewSearchExtension("EGL_NV_robustness_video_memory_purge", extStart, extEnd); +#endif /* EGL_NV_robustness_video_memory_purge */ +#ifdef EGL_NV_stream_consumer_gltexture_yuv + EGLEW_NV_stream_consumer_gltexture_yuv = _glewSearchExtension("EGL_NV_stream_consumer_gltexture_yuv", extStart, extEnd); + if (glewExperimental || EGLEW_NV_stream_consumer_gltexture_yuv) EGLEW_NV_stream_consumer_gltexture_yuv = !_glewInit_EGL_NV_stream_consumer_gltexture_yuv(); +#endif /* EGL_NV_stream_consumer_gltexture_yuv */ +#ifdef EGL_NV_stream_cross_display + EGLEW_NV_stream_cross_display = _glewSearchExtension("EGL_NV_stream_cross_display", extStart, extEnd); +#endif /* EGL_NV_stream_cross_display */ +#ifdef EGL_NV_stream_cross_object + EGLEW_NV_stream_cross_object = _glewSearchExtension("EGL_NV_stream_cross_object", extStart, extEnd); +#endif /* EGL_NV_stream_cross_object */ +#ifdef EGL_NV_stream_cross_partition + EGLEW_NV_stream_cross_partition = _glewSearchExtension("EGL_NV_stream_cross_partition", extStart, extEnd); +#endif /* EGL_NV_stream_cross_partition */ +#ifdef EGL_NV_stream_cross_process + EGLEW_NV_stream_cross_process = _glewSearchExtension("EGL_NV_stream_cross_process", extStart, extEnd); +#endif /* EGL_NV_stream_cross_process */ +#ifdef EGL_NV_stream_cross_system + EGLEW_NV_stream_cross_system = _glewSearchExtension("EGL_NV_stream_cross_system", extStart, extEnd); +#endif /* EGL_NV_stream_cross_system */ +#ifdef EGL_NV_stream_fifo_next + EGLEW_NV_stream_fifo_next = _glewSearchExtension("EGL_NV_stream_fifo_next", extStart, extEnd); +#endif /* EGL_NV_stream_fifo_next */ +#ifdef EGL_NV_stream_fifo_synchronous + EGLEW_NV_stream_fifo_synchronous = _glewSearchExtension("EGL_NV_stream_fifo_synchronous", extStart, extEnd); +#endif /* EGL_NV_stream_fifo_synchronous */ +#ifdef EGL_NV_stream_frame_limits + EGLEW_NV_stream_frame_limits = _glewSearchExtension("EGL_NV_stream_frame_limits", extStart, extEnd); +#endif /* EGL_NV_stream_frame_limits */ +#ifdef EGL_NV_stream_metadata + EGLEW_NV_stream_metadata = _glewSearchExtension("EGL_NV_stream_metadata", extStart, extEnd); + if (glewExperimental || EGLEW_NV_stream_metadata) EGLEW_NV_stream_metadata = !_glewInit_EGL_NV_stream_metadata(); +#endif /* EGL_NV_stream_metadata */ +#ifdef EGL_NV_stream_remote + EGLEW_NV_stream_remote = _glewSearchExtension("EGL_NV_stream_remote", extStart, extEnd); +#endif /* EGL_NV_stream_remote */ +#ifdef EGL_NV_stream_reset + EGLEW_NV_stream_reset = _glewSearchExtension("EGL_NV_stream_reset", extStart, extEnd); + if (glewExperimental || EGLEW_NV_stream_reset) EGLEW_NV_stream_reset = !_glewInit_EGL_NV_stream_reset(); +#endif /* EGL_NV_stream_reset */ +#ifdef EGL_NV_stream_socket + EGLEW_NV_stream_socket = _glewSearchExtension("EGL_NV_stream_socket", extStart, extEnd); +#endif /* EGL_NV_stream_socket */ +#ifdef EGL_NV_stream_socket_inet + EGLEW_NV_stream_socket_inet = _glewSearchExtension("EGL_NV_stream_socket_inet", extStart, extEnd); +#endif /* EGL_NV_stream_socket_inet */ +#ifdef EGL_NV_stream_socket_unix + EGLEW_NV_stream_socket_unix = _glewSearchExtension("EGL_NV_stream_socket_unix", extStart, extEnd); +#endif /* EGL_NV_stream_socket_unix */ +#ifdef EGL_NV_stream_sync + EGLEW_NV_stream_sync = _glewSearchExtension("EGL_NV_stream_sync", extStart, extEnd); + if (glewExperimental || EGLEW_NV_stream_sync) EGLEW_NV_stream_sync = !_glewInit_EGL_NV_stream_sync(); +#endif /* EGL_NV_stream_sync */ +#ifdef EGL_NV_sync + EGLEW_NV_sync = _glewSearchExtension("EGL_NV_sync", extStart, extEnd); + if (glewExperimental || EGLEW_NV_sync) EGLEW_NV_sync = !_glewInit_EGL_NV_sync(); +#endif /* EGL_NV_sync */ +#ifdef EGL_NV_system_time + EGLEW_NV_system_time = _glewSearchExtension("EGL_NV_system_time", extStart, extEnd); + if (glewExperimental || EGLEW_NV_system_time) EGLEW_NV_system_time = !_glewInit_EGL_NV_system_time(); +#endif /* EGL_NV_system_time */ +#ifdef EGL_TIZEN_image_native_buffer + EGLEW_TIZEN_image_native_buffer = _glewSearchExtension("EGL_TIZEN_image_native_buffer", extStart, extEnd); +#endif /* EGL_TIZEN_image_native_buffer */ +#ifdef EGL_TIZEN_image_native_surface + EGLEW_TIZEN_image_native_surface = _glewSearchExtension("EGL_TIZEN_image_native_surface", extStart, extEnd); +#endif /* EGL_TIZEN_image_native_surface */ + + return GLEW_OK; +} + +#elif defined(_WIN32) + +PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL = NULL; + +PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD = NULL; +PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD = NULL; +PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD = NULL; +PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD = NULL; +PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD = NULL; +PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD = NULL; +PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD = NULL; +PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD = NULL; +PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD = NULL; + +PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB = NULL; +PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB = NULL; +PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB = NULL; +PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB = NULL; + +PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB = NULL; + +PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB = NULL; + +PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB = NULL; +PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB = NULL; + +PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB = NULL; +PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB = NULL; +PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB = NULL; +PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB = NULL; +PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB = NULL; + +PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB = NULL; +PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB = NULL; +PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB = NULL; + +PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB = NULL; +PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB = NULL; +PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB = NULL; + +PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT = NULL; +PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT = NULL; +PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT = NULL; +PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT = NULL; + +PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT = NULL; + +PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT = NULL; +PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT = NULL; + +PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT = NULL; +PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT = NULL; +PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT = NULL; +PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT = NULL; +PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT = NULL; + +PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT = NULL; +PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT = NULL; +PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT = NULL; + +PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT = NULL; +PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT = NULL; + +PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D = NULL; +PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D = NULL; + +PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D = NULL; +PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D = NULL; +PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D = NULL; +PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D = NULL; + +PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D = NULL; +PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D = NULL; +PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D = NULL; +PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D = NULL; +PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D = NULL; +PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D = NULL; +PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D = NULL; +PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D = NULL; +PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D = NULL; +PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D = NULL; +PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D = NULL; +PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D = NULL; + +PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D = NULL; +PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D = NULL; +PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D = NULL; +PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D = NULL; + +PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D = NULL; +PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D = NULL; +PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D = NULL; +PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D = NULL; + +PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D = NULL; +PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D = NULL; +PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D = NULL; +PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D = NULL; + +PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV = NULL; +PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV = NULL; +PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV = NULL; +PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV = NULL; +PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV = NULL; +PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV = NULL; +PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV = NULL; +PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV = NULL; + +PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV = NULL; + +PFNWGLDELAYBEFORESWAPNVPROC __wglewDelayBeforeSwapNV = NULL; + +PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV = NULL; +PFNWGLDELETEDCNVPROC __wglewDeleteDCNV = NULL; +PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV = NULL; +PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV = NULL; +PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV = NULL; + +PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV = NULL; +PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV = NULL; +PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV = NULL; + +PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV = NULL; +PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV = NULL; +PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV = NULL; +PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV = NULL; +PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV = NULL; +PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV = NULL; + +PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV = NULL; +PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV = NULL; + +PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV = NULL; +PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV = NULL; +PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV = NULL; +PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV = NULL; +PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV = NULL; + +PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV = NULL; +PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV = NULL; +PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV = NULL; +PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV = NULL; +PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV = NULL; +PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV = NULL; + +PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML = NULL; +PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML = NULL; +PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML = NULL; +PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML = NULL; +PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML = NULL; +PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML = NULL; +GLboolean __WGLEW_3DFX_multisample = GL_FALSE; +GLboolean __WGLEW_3DL_stereo_control = GL_FALSE; +GLboolean __WGLEW_AMD_gpu_association = GL_FALSE; +GLboolean __WGLEW_ARB_buffer_region = GL_FALSE; +GLboolean __WGLEW_ARB_context_flush_control = GL_FALSE; +GLboolean __WGLEW_ARB_create_context = GL_FALSE; +GLboolean __WGLEW_ARB_create_context_no_error = GL_FALSE; +GLboolean __WGLEW_ARB_create_context_profile = GL_FALSE; +GLboolean __WGLEW_ARB_create_context_robustness = GL_FALSE; +GLboolean __WGLEW_ARB_extensions_string = GL_FALSE; +GLboolean __WGLEW_ARB_framebuffer_sRGB = GL_FALSE; +GLboolean __WGLEW_ARB_make_current_read = GL_FALSE; +GLboolean __WGLEW_ARB_multisample = GL_FALSE; +GLboolean __WGLEW_ARB_pbuffer = GL_FALSE; +GLboolean __WGLEW_ARB_pixel_format = GL_FALSE; +GLboolean __WGLEW_ARB_pixel_format_float = GL_FALSE; +GLboolean __WGLEW_ARB_render_texture = GL_FALSE; +GLboolean __WGLEW_ARB_robustness_application_isolation = GL_FALSE; +GLboolean __WGLEW_ARB_robustness_share_group_isolation = GL_FALSE; +GLboolean __WGLEW_ATI_pixel_format_float = GL_FALSE; +GLboolean __WGLEW_ATI_render_texture_rectangle = GL_FALSE; +GLboolean __WGLEW_EXT_colorspace = GL_FALSE; +GLboolean __WGLEW_EXT_create_context_es2_profile = GL_FALSE; +GLboolean __WGLEW_EXT_create_context_es_profile = GL_FALSE; +GLboolean __WGLEW_EXT_depth_float = GL_FALSE; +GLboolean __WGLEW_EXT_display_color_table = GL_FALSE; +GLboolean __WGLEW_EXT_extensions_string = GL_FALSE; +GLboolean __WGLEW_EXT_framebuffer_sRGB = GL_FALSE; +GLboolean __WGLEW_EXT_make_current_read = GL_FALSE; +GLboolean __WGLEW_EXT_multisample = GL_FALSE; +GLboolean __WGLEW_EXT_pbuffer = GL_FALSE; +GLboolean __WGLEW_EXT_pixel_format = GL_FALSE; +GLboolean __WGLEW_EXT_pixel_format_packed_float = GL_FALSE; +GLboolean __WGLEW_EXT_swap_control = GL_FALSE; +GLboolean __WGLEW_EXT_swap_control_tear = GL_FALSE; +GLboolean __WGLEW_I3D_digital_video_control = GL_FALSE; +GLboolean __WGLEW_I3D_gamma = GL_FALSE; +GLboolean __WGLEW_I3D_genlock = GL_FALSE; +GLboolean __WGLEW_I3D_image_buffer = GL_FALSE; +GLboolean __WGLEW_I3D_swap_frame_lock = GL_FALSE; +GLboolean __WGLEW_I3D_swap_frame_usage = GL_FALSE; +GLboolean __WGLEW_NV_DX_interop = GL_FALSE; +GLboolean __WGLEW_NV_DX_interop2 = GL_FALSE; +GLboolean __WGLEW_NV_copy_image = GL_FALSE; +GLboolean __WGLEW_NV_delay_before_swap = GL_FALSE; +GLboolean __WGLEW_NV_float_buffer = GL_FALSE; +GLboolean __WGLEW_NV_gpu_affinity = GL_FALSE; +GLboolean __WGLEW_NV_multisample_coverage = GL_FALSE; +GLboolean __WGLEW_NV_present_video = GL_FALSE; +GLboolean __WGLEW_NV_render_depth_texture = GL_FALSE; +GLboolean __WGLEW_NV_render_texture_rectangle = GL_FALSE; +GLboolean __WGLEW_NV_swap_group = GL_FALSE; +GLboolean __WGLEW_NV_vertex_array_range = GL_FALSE; +GLboolean __WGLEW_NV_video_capture = GL_FALSE; +GLboolean __WGLEW_NV_video_output = GL_FALSE; +GLboolean __WGLEW_OML_sync_control = GL_FALSE; +#ifdef WGL_3DL_stereo_control + +static GLboolean _glewInit_WGL_3DL_stereo_control () +{ + GLboolean r = GL_FALSE; + + r = ((wglSetStereoEmitterState3DL = (PFNWGLSETSTEREOEMITTERSTATE3DLPROC)glewGetProcAddress((const GLubyte*)"wglSetStereoEmitterState3DL")) == NULL) || r; + + return r; +} + +#endif /* WGL_3DL_stereo_control */ + +#ifdef WGL_AMD_gpu_association + +static GLboolean _glewInit_WGL_AMD_gpu_association () +{ + GLboolean r = GL_FALSE; + + r = ((wglBlitContextFramebufferAMD = (PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"wglBlitContextFramebufferAMD")) == NULL) || r; + r = ((wglCreateAssociatedContextAMD = (PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAMD")) == NULL) || r; + r = ((wglCreateAssociatedContextAttribsAMD = (PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAttribsAMD")) == NULL) || r; + r = ((wglDeleteAssociatedContextAMD = (PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglDeleteAssociatedContextAMD")) == NULL) || r; + r = ((wglGetContextGPUIDAMD = (PFNWGLGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetContextGPUIDAMD")) == NULL) || r; + r = ((wglGetCurrentAssociatedContextAMD = (PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentAssociatedContextAMD")) == NULL) || r; + r = ((wglGetGPUIDsAMD = (PFNWGLGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUIDsAMD")) == NULL) || r; + r = ((wglGetGPUInfoAMD = (PFNWGLGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUInfoAMD")) == NULL) || r; + r = ((wglMakeAssociatedContextCurrentAMD = (PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"wglMakeAssociatedContextCurrentAMD")) == NULL) || r; + + return r; +} + +#endif /* WGL_AMD_gpu_association */ + +#ifdef WGL_ARB_buffer_region + +static GLboolean _glewInit_WGL_ARB_buffer_region () +{ + GLboolean r = GL_FALSE; + + r = ((wglCreateBufferRegionARB = (PFNWGLCREATEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateBufferRegionARB")) == NULL) || r; + r = ((wglDeleteBufferRegionARB = (PFNWGLDELETEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglDeleteBufferRegionARB")) == NULL) || r; + r = ((wglRestoreBufferRegionARB = (PFNWGLRESTOREBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglRestoreBufferRegionARB")) == NULL) || r; + r = ((wglSaveBufferRegionARB = (PFNWGLSAVEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglSaveBufferRegionARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_buffer_region */ + +#ifdef WGL_ARB_create_context + +static GLboolean _glewInit_WGL_ARB_create_context () +{ + GLboolean r = GL_FALSE; + + r = ((wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateContextAttribsARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_create_context */ + +#ifdef WGL_ARB_extensions_string + +static GLboolean _glewInit_WGL_ARB_extensions_string () +{ + GLboolean r = GL_FALSE; + + r = ((wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_extensions_string */ + +#ifdef WGL_ARB_make_current_read + +static GLboolean _glewInit_WGL_ARB_make_current_read () +{ + GLboolean r = GL_FALSE; + + r = ((wglGetCurrentReadDCARB = (PFNWGLGETCURRENTREADDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCARB")) == NULL) || r; + r = ((wglMakeContextCurrentARB = (PFNWGLMAKECONTEXTCURRENTARBPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_make_current_read */ + +#ifdef WGL_ARB_pbuffer + +static GLboolean _glewInit_WGL_ARB_pbuffer () +{ + GLboolean r = GL_FALSE; + + r = ((wglCreatePbufferARB = (PFNWGLCREATEPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferARB")) == NULL) || r; + r = ((wglDestroyPbufferARB = (PFNWGLDESTROYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferARB")) == NULL) || r; + r = ((wglGetPbufferDCARB = (PFNWGLGETPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCARB")) == NULL) || r; + r = ((wglQueryPbufferARB = (PFNWGLQUERYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferARB")) == NULL) || r; + r = ((wglReleasePbufferDCARB = (PFNWGLRELEASEPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_pbuffer */ + +#ifdef WGL_ARB_pixel_format + +static GLboolean _glewInit_WGL_ARB_pixel_format () +{ + GLboolean r = GL_FALSE; + + r = ((wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatARB")) == NULL) || r; + r = ((wglGetPixelFormatAttribfvARB = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvARB")) == NULL) || r; + r = ((wglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_pixel_format */ + +#ifdef WGL_ARB_render_texture + +static GLboolean _glewInit_WGL_ARB_render_texture () +{ + GLboolean r = GL_FALSE; + + r = ((wglBindTexImageARB = (PFNWGLBINDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglBindTexImageARB")) == NULL) || r; + r = ((wglReleaseTexImageARB = (PFNWGLRELEASETEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglReleaseTexImageARB")) == NULL) || r; + r = ((wglSetPbufferAttribARB = (PFNWGLSETPBUFFERATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"wglSetPbufferAttribARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_render_texture */ + +#ifdef WGL_EXT_display_color_table + +static GLboolean _glewInit_WGL_EXT_display_color_table () +{ + GLboolean r = GL_FALSE; + + r = ((wglBindDisplayColorTableEXT = (PFNWGLBINDDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglBindDisplayColorTableEXT")) == NULL) || r; + r = ((wglCreateDisplayColorTableEXT = (PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglCreateDisplayColorTableEXT")) == NULL) || r; + r = ((wglDestroyDisplayColorTableEXT = (PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyDisplayColorTableEXT")) == NULL) || r; + r = ((wglLoadDisplayColorTableEXT = (PFNWGLLOADDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglLoadDisplayColorTableEXT")) == NULL) || r; + + return r; +} + +#endif /* WGL_EXT_display_color_table */ + +#ifdef WGL_EXT_extensions_string + +static GLboolean _glewInit_WGL_EXT_extensions_string () +{ + GLboolean r = GL_FALSE; + + r = ((wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT")) == NULL) || r; + + return r; +} + +#endif /* WGL_EXT_extensions_string */ + +#ifdef WGL_EXT_make_current_read + +static GLboolean _glewInit_WGL_EXT_make_current_read () +{ + GLboolean r = GL_FALSE; + + r = ((wglGetCurrentReadDCEXT = (PFNWGLGETCURRENTREADDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCEXT")) == NULL) || r; + r = ((wglMakeContextCurrentEXT = (PFNWGLMAKECONTEXTCURRENTEXTPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentEXT")) == NULL) || r; + + return r; +} + +#endif /* WGL_EXT_make_current_read */ + +#ifdef WGL_EXT_pbuffer + +static GLboolean _glewInit_WGL_EXT_pbuffer () +{ + GLboolean r = GL_FALSE; + + r = ((wglCreatePbufferEXT = (PFNWGLCREATEPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferEXT")) == NULL) || r; + r = ((wglDestroyPbufferEXT = (PFNWGLDESTROYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferEXT")) == NULL) || r; + r = ((wglGetPbufferDCEXT = (PFNWGLGETPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCEXT")) == NULL) || r; + r = ((wglQueryPbufferEXT = (PFNWGLQUERYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferEXT")) == NULL) || r; + r = ((wglReleasePbufferDCEXT = (PFNWGLRELEASEPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCEXT")) == NULL) || r; + + return r; +} + +#endif /* WGL_EXT_pbuffer */ + +#ifdef WGL_EXT_pixel_format + +static GLboolean _glewInit_WGL_EXT_pixel_format () +{ + GLboolean r = GL_FALSE; + + r = ((wglChoosePixelFormatEXT = (PFNWGLCHOOSEPIXELFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatEXT")) == NULL) || r; + r = ((wglGetPixelFormatAttribfvEXT = (PFNWGLGETPIXELFORMATATTRIBFVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvEXT")) == NULL) || r; + r = ((wglGetPixelFormatAttribivEXT = (PFNWGLGETPIXELFORMATATTRIBIVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivEXT")) == NULL) || r; + + return r; +} + +#endif /* WGL_EXT_pixel_format */ + +#ifdef WGL_EXT_swap_control + +static GLboolean _glewInit_WGL_EXT_swap_control () +{ + GLboolean r = GL_FALSE; + + r = ((wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetSwapIntervalEXT")) == NULL) || r; + r = ((wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglSwapIntervalEXT")) == NULL) || r; + + return r; +} + +#endif /* WGL_EXT_swap_control */ + +#ifdef WGL_I3D_digital_video_control + +static GLboolean _glewInit_WGL_I3D_digital_video_control () +{ + GLboolean r = GL_FALSE; + + r = ((wglGetDigitalVideoParametersI3D = (PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetDigitalVideoParametersI3D")) == NULL) || r; + r = ((wglSetDigitalVideoParametersI3D = (PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetDigitalVideoParametersI3D")) == NULL) || r; + + return r; +} + +#endif /* WGL_I3D_digital_video_control */ + +#ifdef WGL_I3D_gamma + +static GLboolean _glewInit_WGL_I3D_gamma () +{ + GLboolean r = GL_FALSE; + + r = ((wglGetGammaTableI3D = (PFNWGLGETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableI3D")) == NULL) || r; + r = ((wglGetGammaTableParametersI3D = (PFNWGLGETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableParametersI3D")) == NULL) || r; + r = ((wglSetGammaTableI3D = (PFNWGLSETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableI3D")) == NULL) || r; + r = ((wglSetGammaTableParametersI3D = (PFNWGLSETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableParametersI3D")) == NULL) || r; + + return r; +} + +#endif /* WGL_I3D_gamma */ + +#ifdef WGL_I3D_genlock + +static GLboolean _glewInit_WGL_I3D_genlock () +{ + GLboolean r = GL_FALSE; + + r = ((wglDisableGenlockI3D = (PFNWGLDISABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableGenlockI3D")) == NULL) || r; + r = ((wglEnableGenlockI3D = (PFNWGLENABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableGenlockI3D")) == NULL) || r; + r = ((wglGenlockSampleRateI3D = (PFNWGLGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSampleRateI3D")) == NULL) || r; + r = ((wglGenlockSourceDelayI3D = (PFNWGLGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceDelayI3D")) == NULL) || r; + r = ((wglGenlockSourceEdgeI3D = (PFNWGLGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceEdgeI3D")) == NULL) || r; + r = ((wglGenlockSourceI3D = (PFNWGLGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceI3D")) == NULL) || r; + r = ((wglGetGenlockSampleRateI3D = (PFNWGLGETGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSampleRateI3D")) == NULL) || r; + r = ((wglGetGenlockSourceDelayI3D = (PFNWGLGETGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceDelayI3D")) == NULL) || r; + r = ((wglGetGenlockSourceEdgeI3D = (PFNWGLGETGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceEdgeI3D")) == NULL) || r; + r = ((wglGetGenlockSourceI3D = (PFNWGLGETGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceI3D")) == NULL) || r; + r = ((wglIsEnabledGenlockI3D = (PFNWGLISENABLEDGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledGenlockI3D")) == NULL) || r; + r = ((wglQueryGenlockMaxSourceDelayI3D = (PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryGenlockMaxSourceDelayI3D")) == NULL) || r; + + return r; +} + +#endif /* WGL_I3D_genlock */ + +#ifdef WGL_I3D_image_buffer + +static GLboolean _glewInit_WGL_I3D_image_buffer () +{ + GLboolean r = GL_FALSE; + + r = ((wglAssociateImageBufferEventsI3D = (PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglAssociateImageBufferEventsI3D")) == NULL) || r; + r = ((wglCreateImageBufferI3D = (PFNWGLCREATEIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglCreateImageBufferI3D")) == NULL) || r; + r = ((wglDestroyImageBufferI3D = (PFNWGLDESTROYIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglDestroyImageBufferI3D")) == NULL) || r; + r = ((wglReleaseImageBufferEventsI3D = (PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglReleaseImageBufferEventsI3D")) == NULL) || r; + + return r; +} + +#endif /* WGL_I3D_image_buffer */ + +#ifdef WGL_I3D_swap_frame_lock + +static GLboolean _glewInit_WGL_I3D_swap_frame_lock () +{ + GLboolean r = GL_FALSE; + + r = ((wglDisableFrameLockI3D = (PFNWGLDISABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableFrameLockI3D")) == NULL) || r; + r = ((wglEnableFrameLockI3D = (PFNWGLENABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableFrameLockI3D")) == NULL) || r; + r = ((wglIsEnabledFrameLockI3D = (PFNWGLISENABLEDFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledFrameLockI3D")) == NULL) || r; + r = ((wglQueryFrameLockMasterI3D = (PFNWGLQUERYFRAMELOCKMASTERI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameLockMasterI3D")) == NULL) || r; + + return r; +} + +#endif /* WGL_I3D_swap_frame_lock */ + +#ifdef WGL_I3D_swap_frame_usage + +static GLboolean _glewInit_WGL_I3D_swap_frame_usage () +{ + GLboolean r = GL_FALSE; + + r = ((wglBeginFrameTrackingI3D = (PFNWGLBEGINFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglBeginFrameTrackingI3D")) == NULL) || r; + r = ((wglEndFrameTrackingI3D = (PFNWGLENDFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglEndFrameTrackingI3D")) == NULL) || r; + r = ((wglGetFrameUsageI3D = (PFNWGLGETFRAMEUSAGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetFrameUsageI3D")) == NULL) || r; + r = ((wglQueryFrameTrackingI3D = (PFNWGLQUERYFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameTrackingI3D")) == NULL) || r; + + return r; +} + +#endif /* WGL_I3D_swap_frame_usage */ + +#ifdef WGL_NV_DX_interop + +static GLboolean _glewInit_WGL_NV_DX_interop () +{ + GLboolean r = GL_FALSE; + + r = ((wglDXCloseDeviceNV = (PFNWGLDXCLOSEDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglDXCloseDeviceNV")) == NULL) || r; + r = ((wglDXLockObjectsNV = (PFNWGLDXLOCKOBJECTSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXLockObjectsNV")) == NULL) || r; + r = ((wglDXObjectAccessNV = (PFNWGLDXOBJECTACCESSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXObjectAccessNV")) == NULL) || r; + r = ((wglDXOpenDeviceNV = (PFNWGLDXOPENDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglDXOpenDeviceNV")) == NULL) || r; + r = ((wglDXRegisterObjectNV = (PFNWGLDXREGISTEROBJECTNVPROC)glewGetProcAddress((const GLubyte*)"wglDXRegisterObjectNV")) == NULL) || r; + r = ((wglDXSetResourceShareHandleNV = (PFNWGLDXSETRESOURCESHAREHANDLENVPROC)glewGetProcAddress((const GLubyte*)"wglDXSetResourceShareHandleNV")) == NULL) || r; + r = ((wglDXUnlockObjectsNV = (PFNWGLDXUNLOCKOBJECTSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXUnlockObjectsNV")) == NULL) || r; + r = ((wglDXUnregisterObjectNV = (PFNWGLDXUNREGISTEROBJECTNVPROC)glewGetProcAddress((const GLubyte*)"wglDXUnregisterObjectNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_DX_interop */ + +#ifdef WGL_NV_copy_image + +static GLboolean _glewInit_WGL_NV_copy_image () +{ + GLboolean r = GL_FALSE; + + r = ((wglCopyImageSubDataNV = (PFNWGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"wglCopyImageSubDataNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_copy_image */ + +#ifdef WGL_NV_delay_before_swap + +static GLboolean _glewInit_WGL_NV_delay_before_swap () +{ + GLboolean r = GL_FALSE; + + r = ((wglDelayBeforeSwapNV = (PFNWGLDELAYBEFORESWAPNVPROC)glewGetProcAddress((const GLubyte*)"wglDelayBeforeSwapNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_delay_before_swap */ + +#ifdef WGL_NV_gpu_affinity + +static GLboolean _glewInit_WGL_NV_gpu_affinity () +{ + GLboolean r = GL_FALSE; + + r = ((wglCreateAffinityDCNV = (PFNWGLCREATEAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglCreateAffinityDCNV")) == NULL) || r; + r = ((wglDeleteDCNV = (PFNWGLDELETEDCNVPROC)glewGetProcAddress((const GLubyte*)"wglDeleteDCNV")) == NULL) || r; + r = ((wglEnumGpuDevicesNV = (PFNWGLENUMGPUDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpuDevicesNV")) == NULL) || r; + r = ((wglEnumGpusFromAffinityDCNV = (PFNWGLENUMGPUSFROMAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusFromAffinityDCNV")) == NULL) || r; + r = ((wglEnumGpusNV = (PFNWGLENUMGPUSNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_gpu_affinity */ + +#ifdef WGL_NV_present_video + +static GLboolean _glewInit_WGL_NV_present_video () +{ + GLboolean r = GL_FALSE; + + r = ((wglBindVideoDeviceNV = (PFNWGLBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoDeviceNV")) == NULL) || r; + r = ((wglEnumerateVideoDevicesNV = (PFNWGLENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumerateVideoDevicesNV")) == NULL) || r; + r = ((wglQueryCurrentContextNV = (PFNWGLQUERYCURRENTCONTEXTNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryCurrentContextNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_present_video */ + +#ifdef WGL_NV_swap_group + +static GLboolean _glewInit_WGL_NV_swap_group () +{ + GLboolean r = GL_FALSE; + + r = ((wglBindSwapBarrierNV = (PFNWGLBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"wglBindSwapBarrierNV")) == NULL) || r; + r = ((wglJoinSwapGroupNV = (PFNWGLJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"wglJoinSwapGroupNV")) == NULL) || r; + r = ((wglQueryFrameCountNV = (PFNWGLQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameCountNV")) == NULL) || r; + r = ((wglQueryMaxSwapGroupsNV = (PFNWGLQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryMaxSwapGroupsNV")) == NULL) || r; + r = ((wglQuerySwapGroupNV = (PFNWGLQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"wglQuerySwapGroupNV")) == NULL) || r; + r = ((wglResetFrameCountNV = (PFNWGLRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"wglResetFrameCountNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_swap_group */ + +#ifdef WGL_NV_vertex_array_range + +static GLboolean _glewInit_WGL_NV_vertex_array_range () +{ + GLboolean r = GL_FALSE; + + r = ((wglAllocateMemoryNV = (PFNWGLALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglAllocateMemoryNV")) == NULL) || r; + r = ((wglFreeMemoryNV = (PFNWGLFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglFreeMemoryNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_vertex_array_range */ + +#ifdef WGL_NV_video_capture + +static GLboolean _glewInit_WGL_NV_video_capture () +{ + GLboolean r = GL_FALSE; + + r = ((wglBindVideoCaptureDeviceNV = (PFNWGLBINDVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoCaptureDeviceNV")) == NULL) || r; + r = ((wglEnumerateVideoCaptureDevicesNV = (PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumerateVideoCaptureDevicesNV")) == NULL) || r; + r = ((wglLockVideoCaptureDeviceNV = (PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglLockVideoCaptureDeviceNV")) == NULL) || r; + r = ((wglQueryVideoCaptureDeviceNV = (PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglQueryVideoCaptureDeviceNV")) == NULL) || r; + r = ((wglReleaseVideoCaptureDeviceNV = (PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoCaptureDeviceNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_video_capture */ + +#ifdef WGL_NV_video_output + +static GLboolean _glewInit_WGL_NV_video_output () +{ + GLboolean r = GL_FALSE; + + r = ((wglBindVideoImageNV = (PFNWGLBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoImageNV")) == NULL) || r; + r = ((wglGetVideoDeviceNV = (PFNWGLGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglGetVideoDeviceNV")) == NULL) || r; + r = ((wglGetVideoInfoNV = (PFNWGLGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)"wglGetVideoInfoNV")) == NULL) || r; + r = ((wglReleaseVideoDeviceNV = (PFNWGLRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoDeviceNV")) == NULL) || r; + r = ((wglReleaseVideoImageNV = (PFNWGLRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoImageNV")) == NULL) || r; + r = ((wglSendPbufferToVideoNV = (PFNWGLSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)"wglSendPbufferToVideoNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_video_output */ + +#ifdef WGL_OML_sync_control + +static GLboolean _glewInit_WGL_OML_sync_control () +{ + GLboolean r = GL_FALSE; + + r = ((wglGetMscRateOML = (PFNWGLGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetMscRateOML")) == NULL) || r; + r = ((wglGetSyncValuesOML = (PFNWGLGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetSyncValuesOML")) == NULL) || r; + r = ((wglSwapBuffersMscOML = (PFNWGLSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapBuffersMscOML")) == NULL) || r; + r = ((wglSwapLayerBuffersMscOML = (PFNWGLSWAPLAYERBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapLayerBuffersMscOML")) == NULL) || r; + r = ((wglWaitForMscOML = (PFNWGLWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForMscOML")) == NULL) || r; + r = ((wglWaitForSbcOML = (PFNWGLWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForSbcOML")) == NULL) || r; + + return r; +} + +#endif /* WGL_OML_sync_control */ + +/* ------------------------------------------------------------------------- */ + +static PFNWGLGETEXTENSIONSSTRINGARBPROC _wglewGetExtensionsStringARB = NULL; +static PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglewGetExtensionsStringEXT = NULL; + +GLboolean GLEWAPIENTRY wglewGetExtension (const char* name) +{ + const GLubyte* start; + const GLubyte* end; + if (_wglewGetExtensionsStringARB == NULL) + if (_wglewGetExtensionsStringEXT == NULL) + return GL_FALSE; + else + start = (const GLubyte*)_wglewGetExtensionsStringEXT(); + else + start = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC()); + if (start == 0) + return GL_FALSE; + end = start + _glewStrLen(start); + return _glewSearchExtension(name, start, end); +} + +GLenum GLEWAPIENTRY wglewInit () +{ + GLboolean crippled; + const GLubyte* extStart; + const GLubyte* extEnd; + /* find wgl extension string query functions */ + _wglewGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB"); + _wglewGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT"); + /* query wgl extension string */ + if (_wglewGetExtensionsStringARB == NULL) + if (_wglewGetExtensionsStringEXT == NULL) + extStart = (const GLubyte*)""; + else + extStart = (const GLubyte*)_wglewGetExtensionsStringEXT(); + else + extStart = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC()); + extEnd = extStart + _glewStrLen(extStart); + /* initialize extensions */ + crippled = _wglewGetExtensionsStringARB == NULL && _wglewGetExtensionsStringEXT == NULL; +#ifdef WGL_3DFX_multisample + WGLEW_3DFX_multisample = _glewSearchExtension("WGL_3DFX_multisample", extStart, extEnd); +#endif /* WGL_3DFX_multisample */ +#ifdef WGL_3DL_stereo_control + WGLEW_3DL_stereo_control = _glewSearchExtension("WGL_3DL_stereo_control", extStart, extEnd); + if (glewExperimental || WGLEW_3DL_stereo_control|| crippled) WGLEW_3DL_stereo_control= !_glewInit_WGL_3DL_stereo_control(); +#endif /* WGL_3DL_stereo_control */ +#ifdef WGL_AMD_gpu_association + WGLEW_AMD_gpu_association = _glewSearchExtension("WGL_AMD_gpu_association", extStart, extEnd); + if (glewExperimental || WGLEW_AMD_gpu_association|| crippled) WGLEW_AMD_gpu_association= !_glewInit_WGL_AMD_gpu_association(); +#endif /* WGL_AMD_gpu_association */ +#ifdef WGL_ARB_buffer_region + WGLEW_ARB_buffer_region = _glewSearchExtension("WGL_ARB_buffer_region", extStart, extEnd); + if (glewExperimental || WGLEW_ARB_buffer_region|| crippled) WGLEW_ARB_buffer_region= !_glewInit_WGL_ARB_buffer_region(); +#endif /* WGL_ARB_buffer_region */ +#ifdef WGL_ARB_context_flush_control + WGLEW_ARB_context_flush_control = _glewSearchExtension("WGL_ARB_context_flush_control", extStart, extEnd); +#endif /* WGL_ARB_context_flush_control */ +#ifdef WGL_ARB_create_context + WGLEW_ARB_create_context = _glewSearchExtension("WGL_ARB_create_context", extStart, extEnd); + if (glewExperimental || WGLEW_ARB_create_context|| crippled) WGLEW_ARB_create_context= !_glewInit_WGL_ARB_create_context(); +#endif /* WGL_ARB_create_context */ +#ifdef WGL_ARB_create_context_no_error + WGLEW_ARB_create_context_no_error = _glewSearchExtension("WGL_ARB_create_context_no_error", extStart, extEnd); +#endif /* WGL_ARB_create_context_no_error */ +#ifdef WGL_ARB_create_context_profile + WGLEW_ARB_create_context_profile = _glewSearchExtension("WGL_ARB_create_context_profile", extStart, extEnd); +#endif /* WGL_ARB_create_context_profile */ +#ifdef WGL_ARB_create_context_robustness + WGLEW_ARB_create_context_robustness = _glewSearchExtension("WGL_ARB_create_context_robustness", extStart, extEnd); +#endif /* WGL_ARB_create_context_robustness */ +#ifdef WGL_ARB_extensions_string + WGLEW_ARB_extensions_string = _glewSearchExtension("WGL_ARB_extensions_string", extStart, extEnd); + if (glewExperimental || WGLEW_ARB_extensions_string|| crippled) WGLEW_ARB_extensions_string= !_glewInit_WGL_ARB_extensions_string(); +#endif /* WGL_ARB_extensions_string */ +#ifdef WGL_ARB_framebuffer_sRGB + WGLEW_ARB_framebuffer_sRGB = _glewSearchExtension("WGL_ARB_framebuffer_sRGB", extStart, extEnd); +#endif /* WGL_ARB_framebuffer_sRGB */ +#ifdef WGL_ARB_make_current_read + WGLEW_ARB_make_current_read = _glewSearchExtension("WGL_ARB_make_current_read", extStart, extEnd); + if (glewExperimental || WGLEW_ARB_make_current_read|| crippled) WGLEW_ARB_make_current_read= !_glewInit_WGL_ARB_make_current_read(); +#endif /* WGL_ARB_make_current_read */ +#ifdef WGL_ARB_multisample + WGLEW_ARB_multisample = _glewSearchExtension("WGL_ARB_multisample", extStart, extEnd); +#endif /* WGL_ARB_multisample */ +#ifdef WGL_ARB_pbuffer + WGLEW_ARB_pbuffer = _glewSearchExtension("WGL_ARB_pbuffer", extStart, extEnd); + if (glewExperimental || WGLEW_ARB_pbuffer|| crippled) WGLEW_ARB_pbuffer= !_glewInit_WGL_ARB_pbuffer(); +#endif /* WGL_ARB_pbuffer */ +#ifdef WGL_ARB_pixel_format + WGLEW_ARB_pixel_format = _glewSearchExtension("WGL_ARB_pixel_format", extStart, extEnd); + if (glewExperimental || WGLEW_ARB_pixel_format|| crippled) WGLEW_ARB_pixel_format= !_glewInit_WGL_ARB_pixel_format(); +#endif /* WGL_ARB_pixel_format */ +#ifdef WGL_ARB_pixel_format_float + WGLEW_ARB_pixel_format_float = _glewSearchExtension("WGL_ARB_pixel_format_float", extStart, extEnd); +#endif /* WGL_ARB_pixel_format_float */ +#ifdef WGL_ARB_render_texture + WGLEW_ARB_render_texture = _glewSearchExtension("WGL_ARB_render_texture", extStart, extEnd); + if (glewExperimental || WGLEW_ARB_render_texture|| crippled) WGLEW_ARB_render_texture= !_glewInit_WGL_ARB_render_texture(); +#endif /* WGL_ARB_render_texture */ +#ifdef WGL_ARB_robustness_application_isolation + WGLEW_ARB_robustness_application_isolation = _glewSearchExtension("WGL_ARB_robustness_application_isolation", extStart, extEnd); +#endif /* WGL_ARB_robustness_application_isolation */ +#ifdef WGL_ARB_robustness_share_group_isolation + WGLEW_ARB_robustness_share_group_isolation = _glewSearchExtension("WGL_ARB_robustness_share_group_isolation", extStart, extEnd); +#endif /* WGL_ARB_robustness_share_group_isolation */ +#ifdef WGL_ATI_pixel_format_float + WGLEW_ATI_pixel_format_float = _glewSearchExtension("WGL_ATI_pixel_format_float", extStart, extEnd); +#endif /* WGL_ATI_pixel_format_float */ +#ifdef WGL_ATI_render_texture_rectangle + WGLEW_ATI_render_texture_rectangle = _glewSearchExtension("WGL_ATI_render_texture_rectangle", extStart, extEnd); +#endif /* WGL_ATI_render_texture_rectangle */ +#ifdef WGL_EXT_colorspace + WGLEW_EXT_colorspace = _glewSearchExtension("WGL_EXT_colorspace", extStart, extEnd); +#endif /* WGL_EXT_colorspace */ +#ifdef WGL_EXT_create_context_es2_profile + WGLEW_EXT_create_context_es2_profile = _glewSearchExtension("WGL_EXT_create_context_es2_profile", extStart, extEnd); +#endif /* WGL_EXT_create_context_es2_profile */ +#ifdef WGL_EXT_create_context_es_profile + WGLEW_EXT_create_context_es_profile = _glewSearchExtension("WGL_EXT_create_context_es_profile", extStart, extEnd); +#endif /* WGL_EXT_create_context_es_profile */ +#ifdef WGL_EXT_depth_float + WGLEW_EXT_depth_float = _glewSearchExtension("WGL_EXT_depth_float", extStart, extEnd); +#endif /* WGL_EXT_depth_float */ +#ifdef WGL_EXT_display_color_table + WGLEW_EXT_display_color_table = _glewSearchExtension("WGL_EXT_display_color_table", extStart, extEnd); + if (glewExperimental || WGLEW_EXT_display_color_table|| crippled) WGLEW_EXT_display_color_table= !_glewInit_WGL_EXT_display_color_table(); +#endif /* WGL_EXT_display_color_table */ +#ifdef WGL_EXT_extensions_string + WGLEW_EXT_extensions_string = _glewSearchExtension("WGL_EXT_extensions_string", extStart, extEnd); + if (glewExperimental || WGLEW_EXT_extensions_string|| crippled) WGLEW_EXT_extensions_string= !_glewInit_WGL_EXT_extensions_string(); +#endif /* WGL_EXT_extensions_string */ +#ifdef WGL_EXT_framebuffer_sRGB + WGLEW_EXT_framebuffer_sRGB = _glewSearchExtension("WGL_EXT_framebuffer_sRGB", extStart, extEnd); +#endif /* WGL_EXT_framebuffer_sRGB */ +#ifdef WGL_EXT_make_current_read + WGLEW_EXT_make_current_read = _glewSearchExtension("WGL_EXT_make_current_read", extStart, extEnd); + if (glewExperimental || WGLEW_EXT_make_current_read|| crippled) WGLEW_EXT_make_current_read= !_glewInit_WGL_EXT_make_current_read(); +#endif /* WGL_EXT_make_current_read */ +#ifdef WGL_EXT_multisample + WGLEW_EXT_multisample = _glewSearchExtension("WGL_EXT_multisample", extStart, extEnd); +#endif /* WGL_EXT_multisample */ +#ifdef WGL_EXT_pbuffer + WGLEW_EXT_pbuffer = _glewSearchExtension("WGL_EXT_pbuffer", extStart, extEnd); + if (glewExperimental || WGLEW_EXT_pbuffer|| crippled) WGLEW_EXT_pbuffer= !_glewInit_WGL_EXT_pbuffer(); +#endif /* WGL_EXT_pbuffer */ +#ifdef WGL_EXT_pixel_format + WGLEW_EXT_pixel_format = _glewSearchExtension("WGL_EXT_pixel_format", extStart, extEnd); + if (glewExperimental || WGLEW_EXT_pixel_format|| crippled) WGLEW_EXT_pixel_format= !_glewInit_WGL_EXT_pixel_format(); +#endif /* WGL_EXT_pixel_format */ +#ifdef WGL_EXT_pixel_format_packed_float + WGLEW_EXT_pixel_format_packed_float = _glewSearchExtension("WGL_EXT_pixel_format_packed_float", extStart, extEnd); +#endif /* WGL_EXT_pixel_format_packed_float */ +#ifdef WGL_EXT_swap_control + WGLEW_EXT_swap_control = _glewSearchExtension("WGL_EXT_swap_control", extStart, extEnd); + if (glewExperimental || WGLEW_EXT_swap_control|| crippled) WGLEW_EXT_swap_control= !_glewInit_WGL_EXT_swap_control(); +#endif /* WGL_EXT_swap_control */ +#ifdef WGL_EXT_swap_control_tear + WGLEW_EXT_swap_control_tear = _glewSearchExtension("WGL_EXT_swap_control_tear", extStart, extEnd); +#endif /* WGL_EXT_swap_control_tear */ +#ifdef WGL_I3D_digital_video_control + WGLEW_I3D_digital_video_control = _glewSearchExtension("WGL_I3D_digital_video_control", extStart, extEnd); + if (glewExperimental || WGLEW_I3D_digital_video_control|| crippled) WGLEW_I3D_digital_video_control= !_glewInit_WGL_I3D_digital_video_control(); +#endif /* WGL_I3D_digital_video_control */ +#ifdef WGL_I3D_gamma + WGLEW_I3D_gamma = _glewSearchExtension("WGL_I3D_gamma", extStart, extEnd); + if (glewExperimental || WGLEW_I3D_gamma|| crippled) WGLEW_I3D_gamma= !_glewInit_WGL_I3D_gamma(); +#endif /* WGL_I3D_gamma */ +#ifdef WGL_I3D_genlock + WGLEW_I3D_genlock = _glewSearchExtension("WGL_I3D_genlock", extStart, extEnd); + if (glewExperimental || WGLEW_I3D_genlock|| crippled) WGLEW_I3D_genlock= !_glewInit_WGL_I3D_genlock(); +#endif /* WGL_I3D_genlock */ +#ifdef WGL_I3D_image_buffer + WGLEW_I3D_image_buffer = _glewSearchExtension("WGL_I3D_image_buffer", extStart, extEnd); + if (glewExperimental || WGLEW_I3D_image_buffer|| crippled) WGLEW_I3D_image_buffer= !_glewInit_WGL_I3D_image_buffer(); +#endif /* WGL_I3D_image_buffer */ +#ifdef WGL_I3D_swap_frame_lock + WGLEW_I3D_swap_frame_lock = _glewSearchExtension("WGL_I3D_swap_frame_lock", extStart, extEnd); + if (glewExperimental || WGLEW_I3D_swap_frame_lock|| crippled) WGLEW_I3D_swap_frame_lock= !_glewInit_WGL_I3D_swap_frame_lock(); +#endif /* WGL_I3D_swap_frame_lock */ +#ifdef WGL_I3D_swap_frame_usage + WGLEW_I3D_swap_frame_usage = _glewSearchExtension("WGL_I3D_swap_frame_usage", extStart, extEnd); + if (glewExperimental || WGLEW_I3D_swap_frame_usage|| crippled) WGLEW_I3D_swap_frame_usage= !_glewInit_WGL_I3D_swap_frame_usage(); +#endif /* WGL_I3D_swap_frame_usage */ +#ifdef WGL_NV_DX_interop + WGLEW_NV_DX_interop = _glewSearchExtension("WGL_NV_DX_interop", extStart, extEnd); + if (glewExperimental || WGLEW_NV_DX_interop|| crippled) WGLEW_NV_DX_interop= !_glewInit_WGL_NV_DX_interop(); +#endif /* WGL_NV_DX_interop */ +#ifdef WGL_NV_DX_interop2 + WGLEW_NV_DX_interop2 = _glewSearchExtension("WGL_NV_DX_interop2", extStart, extEnd); +#endif /* WGL_NV_DX_interop2 */ +#ifdef WGL_NV_copy_image + WGLEW_NV_copy_image = _glewSearchExtension("WGL_NV_copy_image", extStart, extEnd); + if (glewExperimental || WGLEW_NV_copy_image|| crippled) WGLEW_NV_copy_image= !_glewInit_WGL_NV_copy_image(); +#endif /* WGL_NV_copy_image */ +#ifdef WGL_NV_delay_before_swap + WGLEW_NV_delay_before_swap = _glewSearchExtension("WGL_NV_delay_before_swap", extStart, extEnd); + if (glewExperimental || WGLEW_NV_delay_before_swap|| crippled) WGLEW_NV_delay_before_swap= !_glewInit_WGL_NV_delay_before_swap(); +#endif /* WGL_NV_delay_before_swap */ +#ifdef WGL_NV_float_buffer + WGLEW_NV_float_buffer = _glewSearchExtension("WGL_NV_float_buffer", extStart, extEnd); +#endif /* WGL_NV_float_buffer */ +#ifdef WGL_NV_gpu_affinity + WGLEW_NV_gpu_affinity = _glewSearchExtension("WGL_NV_gpu_affinity", extStart, extEnd); + if (glewExperimental || WGLEW_NV_gpu_affinity|| crippled) WGLEW_NV_gpu_affinity= !_glewInit_WGL_NV_gpu_affinity(); +#endif /* WGL_NV_gpu_affinity */ +#ifdef WGL_NV_multisample_coverage + WGLEW_NV_multisample_coverage = _glewSearchExtension("WGL_NV_multisample_coverage", extStart, extEnd); +#endif /* WGL_NV_multisample_coverage */ +#ifdef WGL_NV_present_video + WGLEW_NV_present_video = _glewSearchExtension("WGL_NV_present_video", extStart, extEnd); + if (glewExperimental || WGLEW_NV_present_video|| crippled) WGLEW_NV_present_video= !_glewInit_WGL_NV_present_video(); +#endif /* WGL_NV_present_video */ +#ifdef WGL_NV_render_depth_texture + WGLEW_NV_render_depth_texture = _glewSearchExtension("WGL_NV_render_depth_texture", extStart, extEnd); +#endif /* WGL_NV_render_depth_texture */ +#ifdef WGL_NV_render_texture_rectangle + WGLEW_NV_render_texture_rectangle = _glewSearchExtension("WGL_NV_render_texture_rectangle", extStart, extEnd); +#endif /* WGL_NV_render_texture_rectangle */ +#ifdef WGL_NV_swap_group + WGLEW_NV_swap_group = _glewSearchExtension("WGL_NV_swap_group", extStart, extEnd); + if (glewExperimental || WGLEW_NV_swap_group|| crippled) WGLEW_NV_swap_group= !_glewInit_WGL_NV_swap_group(); +#endif /* WGL_NV_swap_group */ +#ifdef WGL_NV_vertex_array_range + WGLEW_NV_vertex_array_range = _glewSearchExtension("WGL_NV_vertex_array_range", extStart, extEnd); + if (glewExperimental || WGLEW_NV_vertex_array_range|| crippled) WGLEW_NV_vertex_array_range= !_glewInit_WGL_NV_vertex_array_range(); +#endif /* WGL_NV_vertex_array_range */ +#ifdef WGL_NV_video_capture + WGLEW_NV_video_capture = _glewSearchExtension("WGL_NV_video_capture", extStart, extEnd); + if (glewExperimental || WGLEW_NV_video_capture|| crippled) WGLEW_NV_video_capture= !_glewInit_WGL_NV_video_capture(); +#endif /* WGL_NV_video_capture */ +#ifdef WGL_NV_video_output + WGLEW_NV_video_output = _glewSearchExtension("WGL_NV_video_output", extStart, extEnd); + if (glewExperimental || WGLEW_NV_video_output|| crippled) WGLEW_NV_video_output= !_glewInit_WGL_NV_video_output(); +#endif /* WGL_NV_video_output */ +#ifdef WGL_OML_sync_control + WGLEW_OML_sync_control = _glewSearchExtension("WGL_OML_sync_control", extStart, extEnd); + if (glewExperimental || WGLEW_OML_sync_control|| crippled) WGLEW_OML_sync_control= !_glewInit_WGL_OML_sync_control(); +#endif /* WGL_OML_sync_control */ + + return GLEW_OK; +} + +#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) + +PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay = NULL; + +PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig = NULL; +PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext = NULL; +PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer = NULL; +PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap = NULL; +PFNGLXCREATEWINDOWPROC __glewXCreateWindow = NULL; +PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer = NULL; +PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap = NULL; +PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow = NULL; +PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable = NULL; +PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib = NULL; +PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs = NULL; +PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent = NULL; +PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig = NULL; +PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent = NULL; +PFNGLXQUERYCONTEXTPROC __glewXQueryContext = NULL; +PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable = NULL; +PFNGLXSELECTEVENTPROC __glewXSelectEvent = NULL; + +PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD = NULL; +PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD = NULL; +PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD = NULL; +PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD = NULL; +PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD = NULL; +PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD = NULL; +PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD = NULL; +PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD = NULL; +PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD = NULL; + +PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB = NULL; + +PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI = NULL; +PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI = NULL; +PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI = NULL; + +PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT = NULL; +PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT = NULL; +PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT = NULL; +PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT = NULL; + +PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT = NULL; + +PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT = NULL; +PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT = NULL; + +PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA = NULL; + +PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA = NULL; + +PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA = NULL; + +PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC __glewXQueryCurrentRendererIntegerMESA = NULL; +PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC __glewXQueryCurrentRendererStringMESA = NULL; +PFNGLXQUERYRENDERERINTEGERMESAPROC __glewXQueryRendererIntegerMESA = NULL; +PFNGLXQUERYRENDERERSTRINGMESAPROC __glewXQueryRendererStringMESA = NULL; + +PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA = NULL; + +PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA = NULL; + +PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA = NULL; +PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA = NULL; + +PFNGLXCOPYBUFFERSUBDATANVPROC __glewXCopyBufferSubDataNV = NULL; +PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC __glewXNamedCopyBufferSubDataNV = NULL; + +PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV = NULL; + +PFNGLXDELAYBEFORESWAPNVPROC __glewXDelayBeforeSwapNV = NULL; + +PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV = NULL; +PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV = NULL; + +PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV = NULL; +PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV = NULL; +PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV = NULL; +PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV = NULL; +PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV = NULL; +PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV = NULL; + +PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV = NULL; +PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV = NULL; + +PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV = NULL; +PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV = NULL; +PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV = NULL; +PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV = NULL; +PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV = NULL; + +PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV = NULL; +PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV = NULL; +PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV = NULL; +PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV = NULL; +PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV = NULL; +PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV = NULL; + +PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML = NULL; +PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML = NULL; +PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML = NULL; +PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML = NULL; +PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML = NULL; + +PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX = NULL; +PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX = NULL; +PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX = NULL; +PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX = NULL; +PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX = NULL; +PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX = NULL; + +PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX = NULL; +PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX = NULL; +PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX = NULL; +PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX = NULL; +PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX = NULL; +PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX = NULL; +PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX = NULL; +PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX = NULL; + +PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX = NULL; +PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX = NULL; +PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX = NULL; +PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX = NULL; +PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX = NULL; + +PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX = NULL; +PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX = NULL; + +PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX = NULL; + +PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX = NULL; +PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX = NULL; +PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX = NULL; +PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX = NULL; +PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX = NULL; + +PFNGLXCUSHIONSGIPROC __glewXCushionSGI = NULL; + +PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI = NULL; +PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI = NULL; + +PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI = NULL; + +PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI = NULL; +PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI = NULL; + +PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN = NULL; + +PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN = NULL; +PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN = NULL; + +GLboolean __GLXEW_VERSION_1_0 = GL_FALSE; +GLboolean __GLXEW_VERSION_1_1 = GL_FALSE; +GLboolean __GLXEW_VERSION_1_2 = GL_FALSE; +GLboolean __GLXEW_VERSION_1_3 = GL_FALSE; +GLboolean __GLXEW_VERSION_1_4 = GL_FALSE; +GLboolean __GLXEW_3DFX_multisample = GL_FALSE; +GLboolean __GLXEW_AMD_gpu_association = GL_FALSE; +GLboolean __GLXEW_ARB_context_flush_control = GL_FALSE; +GLboolean __GLXEW_ARB_create_context = GL_FALSE; +GLboolean __GLXEW_ARB_create_context_no_error = GL_FALSE; +GLboolean __GLXEW_ARB_create_context_profile = GL_FALSE; +GLboolean __GLXEW_ARB_create_context_robustness = GL_FALSE; +GLboolean __GLXEW_ARB_fbconfig_float = GL_FALSE; +GLboolean __GLXEW_ARB_framebuffer_sRGB = GL_FALSE; +GLboolean __GLXEW_ARB_get_proc_address = GL_FALSE; +GLboolean __GLXEW_ARB_multisample = GL_FALSE; +GLboolean __GLXEW_ARB_robustness_application_isolation = GL_FALSE; +GLboolean __GLXEW_ARB_robustness_share_group_isolation = GL_FALSE; +GLboolean __GLXEW_ARB_vertex_buffer_object = GL_FALSE; +GLboolean __GLXEW_ATI_pixel_format_float = GL_FALSE; +GLboolean __GLXEW_ATI_render_texture = GL_FALSE; +GLboolean __GLXEW_EXT_buffer_age = GL_FALSE; +GLboolean __GLXEW_EXT_create_context_es2_profile = GL_FALSE; +GLboolean __GLXEW_EXT_create_context_es_profile = GL_FALSE; +GLboolean __GLXEW_EXT_fbconfig_packed_float = GL_FALSE; +GLboolean __GLXEW_EXT_framebuffer_sRGB = GL_FALSE; +GLboolean __GLXEW_EXT_import_context = GL_FALSE; +GLboolean __GLXEW_EXT_libglvnd = GL_FALSE; +GLboolean __GLXEW_EXT_scene_marker = GL_FALSE; +GLboolean __GLXEW_EXT_stereo_tree = GL_FALSE; +GLboolean __GLXEW_EXT_swap_control = GL_FALSE; +GLboolean __GLXEW_EXT_swap_control_tear = GL_FALSE; +GLboolean __GLXEW_EXT_texture_from_pixmap = GL_FALSE; +GLboolean __GLXEW_EXT_visual_info = GL_FALSE; +GLboolean __GLXEW_EXT_visual_rating = GL_FALSE; +GLboolean __GLXEW_INTEL_swap_event = GL_FALSE; +GLboolean __GLXEW_MESA_agp_offset = GL_FALSE; +GLboolean __GLXEW_MESA_copy_sub_buffer = GL_FALSE; +GLboolean __GLXEW_MESA_pixmap_colormap = GL_FALSE; +GLboolean __GLXEW_MESA_query_renderer = GL_FALSE; +GLboolean __GLXEW_MESA_release_buffers = GL_FALSE; +GLboolean __GLXEW_MESA_set_3dfx_mode = GL_FALSE; +GLboolean __GLXEW_MESA_swap_control = GL_FALSE; +GLboolean __GLXEW_NV_copy_buffer = GL_FALSE; +GLboolean __GLXEW_NV_copy_image = GL_FALSE; +GLboolean __GLXEW_NV_delay_before_swap = GL_FALSE; +GLboolean __GLXEW_NV_float_buffer = GL_FALSE; +GLboolean __GLXEW_NV_multisample_coverage = GL_FALSE; +GLboolean __GLXEW_NV_present_video = GL_FALSE; +GLboolean __GLXEW_NV_robustness_video_memory_purge = GL_FALSE; +GLboolean __GLXEW_NV_swap_group = GL_FALSE; +GLboolean __GLXEW_NV_vertex_array_range = GL_FALSE; +GLboolean __GLXEW_NV_video_capture = GL_FALSE; +GLboolean __GLXEW_NV_video_out = GL_FALSE; +GLboolean __GLXEW_OML_swap_method = GL_FALSE; +GLboolean __GLXEW_OML_sync_control = GL_FALSE; +GLboolean __GLXEW_SGIS_blended_overlay = GL_FALSE; +GLboolean __GLXEW_SGIS_color_range = GL_FALSE; +GLboolean __GLXEW_SGIS_multisample = GL_FALSE; +GLboolean __GLXEW_SGIS_shared_multisample = GL_FALSE; +GLboolean __GLXEW_SGIX_fbconfig = GL_FALSE; +GLboolean __GLXEW_SGIX_hyperpipe = GL_FALSE; +GLboolean __GLXEW_SGIX_pbuffer = GL_FALSE; +GLboolean __GLXEW_SGIX_swap_barrier = GL_FALSE; +GLboolean __GLXEW_SGIX_swap_group = GL_FALSE; +GLboolean __GLXEW_SGIX_video_resize = GL_FALSE; +GLboolean __GLXEW_SGIX_visual_select_group = GL_FALSE; +GLboolean __GLXEW_SGI_cushion = GL_FALSE; +GLboolean __GLXEW_SGI_make_current_read = GL_FALSE; +GLboolean __GLXEW_SGI_swap_control = GL_FALSE; +GLboolean __GLXEW_SGI_video_sync = GL_FALSE; +GLboolean __GLXEW_SUN_get_transparent_index = GL_FALSE; +GLboolean __GLXEW_SUN_video_resize = GL_FALSE; +#ifdef GLX_VERSION_1_2 + +static GLboolean _glewInit_GLX_VERSION_1_2 () +{ + GLboolean r = GL_FALSE; + + r = ((glXGetCurrentDisplay = (PFNGLXGETCURRENTDISPLAYPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentDisplay")) == NULL) || r; + + return r; +} + +#endif /* GLX_VERSION_1_2 */ + +#ifdef GLX_VERSION_1_3 + +static GLboolean _glewInit_GLX_VERSION_1_3 () +{ + GLboolean r = GL_FALSE; + + r = ((glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfig")) == NULL) || r; + r = ((glXCreateNewContext = (PFNGLXCREATENEWCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXCreateNewContext")) == NULL) || r; + r = ((glXCreatePbuffer = (PFNGLXCREATEPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXCreatePbuffer")) == NULL) || r; + r = ((glXCreatePixmap = (PFNGLXCREATEPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXCreatePixmap")) == NULL) || r; + r = ((glXCreateWindow = (PFNGLXCREATEWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXCreateWindow")) == NULL) || r; + r = ((glXDestroyPbuffer = (PFNGLXDESTROYPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPbuffer")) == NULL) || r; + r = ((glXDestroyPixmap = (PFNGLXDESTROYPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPixmap")) == NULL) || r; + r = ((glXDestroyWindow = (PFNGLXDESTROYWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXDestroyWindow")) == NULL) || r; + r = ((glXGetCurrentReadDrawable = (PFNGLXGETCURRENTREADDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawable")) == NULL) || r; + r = ((glXGetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttrib")) == NULL) || r; + r = ((glXGetFBConfigs = (PFNGLXGETFBCONFIGSPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigs")) == NULL) || r; + r = ((glXGetSelectedEvent = (PFNGLXGETSELECTEDEVENTPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEvent")) == NULL) || r; + r = ((glXGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfig")) == NULL) || r; + r = ((glXMakeContextCurrent = (PFNGLXMAKECONTEXTCURRENTPROC)glewGetProcAddress((const GLubyte*)"glXMakeContextCurrent")) == NULL) || r; + r = ((glXQueryContext = (PFNGLXQUERYCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContext")) == NULL) || r; + r = ((glXQueryDrawable = (PFNGLXQUERYDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXQueryDrawable")) == NULL) || r; + r = ((glXSelectEvent = (PFNGLXSELECTEVENTPROC)glewGetProcAddress((const GLubyte*)"glXSelectEvent")) == NULL) || r; + + return r; +} + +#endif /* GLX_VERSION_1_3 */ + +#ifdef GLX_AMD_gpu_association + +static GLboolean _glewInit_GLX_AMD_gpu_association () +{ + GLboolean r = GL_FALSE; + + r = ((glXBlitContextFramebufferAMD = (PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"glXBlitContextFramebufferAMD")) == NULL) || r; + r = ((glXCreateAssociatedContextAMD = (PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAMD")) == NULL) || r; + r = ((glXCreateAssociatedContextAttribsAMD = (PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAttribsAMD")) == NULL) || r; + r = ((glXDeleteAssociatedContextAMD = (PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXDeleteAssociatedContextAMD")) == NULL) || r; + r = ((glXGetContextGPUIDAMD = (PFNGLXGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetContextGPUIDAMD")) == NULL) || r; + r = ((glXGetCurrentAssociatedContextAMD = (PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentAssociatedContextAMD")) == NULL) || r; + r = ((glXGetGPUIDsAMD = (PFNGLXGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUIDsAMD")) == NULL) || r; + r = ((glXGetGPUInfoAMD = (PFNGLXGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUInfoAMD")) == NULL) || r; + r = ((glXMakeAssociatedContextCurrentAMD = (PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"glXMakeAssociatedContextCurrentAMD")) == NULL) || r; + + return r; +} + +#endif /* GLX_AMD_gpu_association */ + +#ifdef GLX_ARB_create_context + +static GLboolean _glewInit_GLX_ARB_create_context () +{ + GLboolean r = GL_FALSE; + + r = ((glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextAttribsARB")) == NULL) || r; + + return r; +} + +#endif /* GLX_ARB_create_context */ + +#ifdef GLX_ATI_render_texture + +static GLboolean _glewInit_GLX_ATI_render_texture () +{ + GLboolean r = GL_FALSE; + + r = ((glXBindTexImageATI = (PFNGLXBINDTEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageATI")) == NULL) || r; + r = ((glXDrawableAttribATI = (PFNGLXDRAWABLEATTRIBATIPROC)glewGetProcAddress((const GLubyte*)"glXDrawableAttribATI")) == NULL) || r; + r = ((glXReleaseTexImageATI = (PFNGLXRELEASETEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageATI")) == NULL) || r; + + return r; +} + +#endif /* GLX_ATI_render_texture */ + +#ifdef GLX_EXT_import_context + +static GLboolean _glewInit_GLX_EXT_import_context () +{ + GLboolean r = GL_FALSE; + + r = ((glXFreeContextEXT = (PFNGLXFREECONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXFreeContextEXT")) == NULL) || r; + r = ((glXGetContextIDEXT = (PFNGLXGETCONTEXTIDEXTPROC)glewGetProcAddress((const GLubyte*)"glXGetContextIDEXT")) == NULL) || r; + r = ((glXImportContextEXT = (PFNGLXIMPORTCONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXImportContextEXT")) == NULL) || r; + r = ((glXQueryContextInfoEXT = (PFNGLXQUERYCONTEXTINFOEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContextInfoEXT")) == NULL) || r; + + return r; +} + +#endif /* GLX_EXT_import_context */ + +#ifdef GLX_EXT_swap_control + +static GLboolean _glewInit_GLX_EXT_swap_control () +{ + GLboolean r = GL_FALSE; + + r = ((glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalEXT")) == NULL) || r; + + return r; +} + +#endif /* GLX_EXT_swap_control */ + +#ifdef GLX_EXT_texture_from_pixmap + +static GLboolean _glewInit_GLX_EXT_texture_from_pixmap () +{ + GLboolean r = GL_FALSE; + + r = ((glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageEXT")) == NULL) || r; + r = ((glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageEXT")) == NULL) || r; + + return r; +} + +#endif /* GLX_EXT_texture_from_pixmap */ + +#ifdef GLX_MESA_agp_offset + +static GLboolean _glewInit_GLX_MESA_agp_offset () +{ + GLboolean r = GL_FALSE; + + r = ((glXGetAGPOffsetMESA = (PFNGLXGETAGPOFFSETMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetAGPOffsetMESA")) == NULL) || r; + + return r; +} + +#endif /* GLX_MESA_agp_offset */ + +#ifdef GLX_MESA_copy_sub_buffer + +static GLboolean _glewInit_GLX_MESA_copy_sub_buffer () +{ + GLboolean r = GL_FALSE; + + r = ((glXCopySubBufferMESA = (PFNGLXCOPYSUBBUFFERMESAPROC)glewGetProcAddress((const GLubyte*)"glXCopySubBufferMESA")) == NULL) || r; + + return r; +} + +#endif /* GLX_MESA_copy_sub_buffer */ + +#ifdef GLX_MESA_pixmap_colormap + +static GLboolean _glewInit_GLX_MESA_pixmap_colormap () +{ + GLboolean r = GL_FALSE; + + r = ((glXCreateGLXPixmapMESA = (PFNGLXCREATEGLXPIXMAPMESAPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapMESA")) == NULL) || r; + + return r; +} + +#endif /* GLX_MESA_pixmap_colormap */ + +#ifdef GLX_MESA_query_renderer + +static GLboolean _glewInit_GLX_MESA_query_renderer () +{ + GLboolean r = GL_FALSE; + + r = ((glXQueryCurrentRendererIntegerMESA = (PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryCurrentRendererIntegerMESA")) == NULL) || r; + r = ((glXQueryCurrentRendererStringMESA = (PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryCurrentRendererStringMESA")) == NULL) || r; + r = ((glXQueryRendererIntegerMESA = (PFNGLXQUERYRENDERERINTEGERMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryRendererIntegerMESA")) == NULL) || r; + r = ((glXQueryRendererStringMESA = (PFNGLXQUERYRENDERERSTRINGMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryRendererStringMESA")) == NULL) || r; + + return r; +} + +#endif /* GLX_MESA_query_renderer */ + +#ifdef GLX_MESA_release_buffers + +static GLboolean _glewInit_GLX_MESA_release_buffers () +{ + GLboolean r = GL_FALSE; + + r = ((glXReleaseBuffersMESA = (PFNGLXRELEASEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glXReleaseBuffersMESA")) == NULL) || r; + + return r; +} + +#endif /* GLX_MESA_release_buffers */ + +#ifdef GLX_MESA_set_3dfx_mode + +static GLboolean _glewInit_GLX_MESA_set_3dfx_mode () +{ + GLboolean r = GL_FALSE; + + r = ((glXSet3DfxModeMESA = (PFNGLXSET3DFXMODEMESAPROC)glewGetProcAddress((const GLubyte*)"glXSet3DfxModeMESA")) == NULL) || r; + + return r; +} + +#endif /* GLX_MESA_set_3dfx_mode */ + +#ifdef GLX_MESA_swap_control + +static GLboolean _glewInit_GLX_MESA_swap_control () +{ + GLboolean r = GL_FALSE; + + r = ((glXGetSwapIntervalMESA = (PFNGLXGETSWAPINTERVALMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetSwapIntervalMESA")) == NULL) || r; + r = ((glXSwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalMESA")) == NULL) || r; + + return r; +} + +#endif /* GLX_MESA_swap_control */ + +#ifdef GLX_NV_copy_buffer + +static GLboolean _glewInit_GLX_NV_copy_buffer () +{ + GLboolean r = GL_FALSE; + + r = ((glXCopyBufferSubDataNV = (PFNGLXCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXCopyBufferSubDataNV")) == NULL) || r; + r = ((glXNamedCopyBufferSubDataNV = (PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXNamedCopyBufferSubDataNV")) == NULL) || r; + + return r; +} + +#endif /* GLX_NV_copy_buffer */ + +#ifdef GLX_NV_copy_image + +static GLboolean _glewInit_GLX_NV_copy_image () +{ + GLboolean r = GL_FALSE; + + r = ((glXCopyImageSubDataNV = (PFNGLXCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXCopyImageSubDataNV")) == NULL) || r; + + return r; +} + +#endif /* GLX_NV_copy_image */ + +#ifdef GLX_NV_delay_before_swap + +static GLboolean _glewInit_GLX_NV_delay_before_swap () +{ + GLboolean r = GL_FALSE; + + r = ((glXDelayBeforeSwapNV = (PFNGLXDELAYBEFORESWAPNVPROC)glewGetProcAddress((const GLubyte*)"glXDelayBeforeSwapNV")) == NULL) || r; + + return r; +} + +#endif /* GLX_NV_delay_before_swap */ + +#ifdef GLX_NV_present_video + +static GLboolean _glewInit_GLX_NV_present_video () +{ + GLboolean r = GL_FALSE; + + r = ((glXBindVideoDeviceNV = (PFNGLXBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoDeviceNV")) == NULL) || r; + r = ((glXEnumerateVideoDevicesNV = (PFNGLXENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)"glXEnumerateVideoDevicesNV")) == NULL) || r; + + return r; +} + +#endif /* GLX_NV_present_video */ + +#ifdef GLX_NV_swap_group + +static GLboolean _glewInit_GLX_NV_swap_group () +{ + GLboolean r = GL_FALSE; + + r = ((glXBindSwapBarrierNV = (PFNGLXBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierNV")) == NULL) || r; + r = ((glXJoinSwapGroupNV = (PFNGLXJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupNV")) == NULL) || r; + r = ((glXQueryFrameCountNV = (PFNGLXQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glXQueryFrameCountNV")) == NULL) || r; + r = ((glXQueryMaxSwapGroupsNV = (PFNGLXQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapGroupsNV")) == NULL) || r; + r = ((glXQuerySwapGroupNV = (PFNGLXQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"glXQuerySwapGroupNV")) == NULL) || r; + r = ((glXResetFrameCountNV = (PFNGLXRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glXResetFrameCountNV")) == NULL) || r; + + return r; +} + +#endif /* GLX_NV_swap_group */ + +#ifdef GLX_NV_vertex_array_range + +static GLboolean _glewInit_GLX_NV_vertex_array_range () +{ + GLboolean r = GL_FALSE; + + r = ((glXAllocateMemoryNV = (PFNGLXALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXAllocateMemoryNV")) == NULL) || r; + r = ((glXFreeMemoryNV = (PFNGLXFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXFreeMemoryNV")) == NULL) || r; + + return r; +} + +#endif /* GLX_NV_vertex_array_range */ + +#ifdef GLX_NV_video_capture + +static GLboolean _glewInit_GLX_NV_video_capture () +{ + GLboolean r = GL_FALSE; + + r = ((glXBindVideoCaptureDeviceNV = (PFNGLXBINDVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoCaptureDeviceNV")) == NULL) || r; + r = ((glXEnumerateVideoCaptureDevicesNV = (PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"glXEnumerateVideoCaptureDevicesNV")) == NULL) || r; + r = ((glXLockVideoCaptureDeviceNV = (PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXLockVideoCaptureDeviceNV")) == NULL) || r; + r = ((glXQueryVideoCaptureDeviceNV = (PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXQueryVideoCaptureDeviceNV")) == NULL) || r; + r = ((glXReleaseVideoCaptureDeviceNV = (PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoCaptureDeviceNV")) == NULL) || r; + + return r; +} + +#endif /* GLX_NV_video_capture */ + +#ifdef GLX_NV_video_out + +static GLboolean _glewInit_GLX_NV_video_out () +{ + GLboolean r = GL_FALSE; + + r = ((glXBindVideoImageNV = (PFNGLXBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoImageNV")) == NULL) || r; + r = ((glXGetVideoDeviceNV = (PFNGLXGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoDeviceNV")) == NULL) || r; + r = ((glXGetVideoInfoNV = (PFNGLXGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoInfoNV")) == NULL) || r; + r = ((glXReleaseVideoDeviceNV = (PFNGLXRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoDeviceNV")) == NULL) || r; + r = ((glXReleaseVideoImageNV = (PFNGLXRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoImageNV")) == NULL) || r; + r = ((glXSendPbufferToVideoNV = (PFNGLXSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)"glXSendPbufferToVideoNV")) == NULL) || r; + + return r; +} + +#endif /* GLX_NV_video_out */ + +#ifdef GLX_OML_sync_control + +static GLboolean _glewInit_GLX_OML_sync_control () +{ + GLboolean r = GL_FALSE; + + r = ((glXGetMscRateOML = (PFNGLXGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetMscRateOML")) == NULL) || r; + r = ((glXGetSyncValuesOML = (PFNGLXGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetSyncValuesOML")) == NULL) || r; + r = ((glXSwapBuffersMscOML = (PFNGLXSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXSwapBuffersMscOML")) == NULL) || r; + r = ((glXWaitForMscOML = (PFNGLXWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForMscOML")) == NULL) || r; + r = ((glXWaitForSbcOML = (PFNGLXWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForSbcOML")) == NULL) || r; + + return r; +} + +#endif /* GLX_OML_sync_control */ + +#ifdef GLX_SGIX_fbconfig + +static GLboolean _glewInit_GLX_SGIX_fbconfig () +{ + GLboolean r = GL_FALSE; + + r = ((glXChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfigSGIX")) == NULL) || r; + r = ((glXCreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextWithConfigSGIX")) == NULL) || r; + r = ((glXCreateGLXPixmapWithConfigSGIX = (PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapWithConfigSGIX")) == NULL) || r; + r = ((glXGetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttribSGIX")) == NULL) || r; + r = ((glXGetFBConfigFromVisualSGIX = (PFNGLXGETFBCONFIGFROMVISUALSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigFromVisualSGIX")) == NULL) || r; + r = ((glXGetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfigSGIX")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGIX_fbconfig */ + +#ifdef GLX_SGIX_hyperpipe + +static GLboolean _glewInit_GLX_SGIX_hyperpipe () +{ + GLboolean r = GL_FALSE; + + r = ((glXBindHyperpipeSGIX = (PFNGLXBINDHYPERPIPESGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindHyperpipeSGIX")) == NULL) || r; + r = ((glXDestroyHyperpipeConfigSGIX = (PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyHyperpipeConfigSGIX")) == NULL) || r; + r = ((glXHyperpipeAttribSGIX = (PFNGLXHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeAttribSGIX")) == NULL) || r; + r = ((glXHyperpipeConfigSGIX = (PFNGLXHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeConfigSGIX")) == NULL) || r; + r = ((glXQueryHyperpipeAttribSGIX = (PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeAttribSGIX")) == NULL) || r; + r = ((glXQueryHyperpipeBestAttribSGIX = (PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeBestAttribSGIX")) == NULL) || r; + r = ((glXQueryHyperpipeConfigSGIX = (PFNGLXQUERYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeConfigSGIX")) == NULL) || r; + r = ((glXQueryHyperpipeNetworkSGIX = (PFNGLXQUERYHYPERPIPENETWORKSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeNetworkSGIX")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGIX_hyperpipe */ + +#ifdef GLX_SGIX_pbuffer + +static GLboolean _glewInit_GLX_SGIX_pbuffer () +{ + GLboolean r = GL_FALSE; + + r = ((glXCreateGLXPbufferSGIX = (PFNGLXCREATEGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPbufferSGIX")) == NULL) || r; + r = ((glXDestroyGLXPbufferSGIX = (PFNGLXDESTROYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyGLXPbufferSGIX")) == NULL) || r; + r = ((glXGetSelectedEventSGIX = (PFNGLXGETSELECTEDEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEventSGIX")) == NULL) || r; + r = ((glXQueryGLXPbufferSGIX = (PFNGLXQUERYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryGLXPbufferSGIX")) == NULL) || r; + r = ((glXSelectEventSGIX = (PFNGLXSELECTEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXSelectEventSGIX")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGIX_pbuffer */ + +#ifdef GLX_SGIX_swap_barrier + +static GLboolean _glewInit_GLX_SGIX_swap_barrier () +{ + GLboolean r = GL_FALSE; + + r = ((glXBindSwapBarrierSGIX = (PFNGLXBINDSWAPBARRIERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierSGIX")) == NULL) || r; + r = ((glXQueryMaxSwapBarriersSGIX = (PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapBarriersSGIX")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGIX_swap_barrier */ + +#ifdef GLX_SGIX_swap_group + +static GLboolean _glewInit_GLX_SGIX_swap_group () +{ + GLboolean r = GL_FALSE; + + r = ((glXJoinSwapGroupSGIX = (PFNGLXJOINSWAPGROUPSGIXPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupSGIX")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGIX_swap_group */ + +#ifdef GLX_SGIX_video_resize + +static GLboolean _glewInit_GLX_SGIX_video_resize () +{ + GLboolean r = GL_FALSE; + + r = ((glXBindChannelToWindowSGIX = (PFNGLXBINDCHANNELTOWINDOWSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindChannelToWindowSGIX")) == NULL) || r; + r = ((glXChannelRectSGIX = (PFNGLXCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSGIX")) == NULL) || r; + r = ((glXChannelRectSyncSGIX = (PFNGLXCHANNELRECTSYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSyncSGIX")) == NULL) || r; + r = ((glXQueryChannelDeltasSGIX = (PFNGLXQUERYCHANNELDELTASSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelDeltasSGIX")) == NULL) || r; + r = ((glXQueryChannelRectSGIX = (PFNGLXQUERYCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelRectSGIX")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGIX_video_resize */ + +#ifdef GLX_SGI_cushion + +static GLboolean _glewInit_GLX_SGI_cushion () +{ + GLboolean r = GL_FALSE; + + r = ((glXCushionSGI = (PFNGLXCUSHIONSGIPROC)glewGetProcAddress((const GLubyte*)"glXCushionSGI")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGI_cushion */ + +#ifdef GLX_SGI_make_current_read + +static GLboolean _glewInit_GLX_SGI_make_current_read () +{ + GLboolean r = GL_FALSE; + + r = ((glXGetCurrentReadDrawableSGI = (PFNGLXGETCURRENTREADDRAWABLESGIPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawableSGI")) == NULL) || r; + r = ((glXMakeCurrentReadSGI = (PFNGLXMAKECURRENTREADSGIPROC)glewGetProcAddress((const GLubyte*)"glXMakeCurrentReadSGI")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGI_make_current_read */ + +#ifdef GLX_SGI_swap_control + +static GLboolean _glewInit_GLX_SGI_swap_control () +{ + GLboolean r = GL_FALSE; + + r = ((glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalSGI")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGI_swap_control */ + +#ifdef GLX_SGI_video_sync + +static GLboolean _glewInit_GLX_SGI_video_sync () +{ + GLboolean r = GL_FALSE; + + r = ((glXGetVideoSyncSGI = (PFNGLXGETVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoSyncSGI")) == NULL) || r; + r = ((glXWaitVideoSyncSGI = (PFNGLXWAITVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXWaitVideoSyncSGI")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGI_video_sync */ + +#ifdef GLX_SUN_get_transparent_index + +static GLboolean _glewInit_GLX_SUN_get_transparent_index () +{ + GLboolean r = GL_FALSE; + + r = ((glXGetTransparentIndexSUN = (PFNGLXGETTRANSPARENTINDEXSUNPROC)glewGetProcAddress((const GLubyte*)"glXGetTransparentIndexSUN")) == NULL) || r; + + return r; +} + +#endif /* GLX_SUN_get_transparent_index */ + +#ifdef GLX_SUN_video_resize + +static GLboolean _glewInit_GLX_SUN_video_resize () +{ + GLboolean r = GL_FALSE; + + r = ((glXGetVideoResizeSUN = (PFNGLXGETVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoResizeSUN")) == NULL) || r; + r = ((glXVideoResizeSUN = (PFNGLXVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXVideoResizeSUN")) == NULL) || r; + + return r; +} + +#endif /* GLX_SUN_video_resize */ + +/* ------------------------------------------------------------------------ */ + +GLboolean glxewGetExtension (const char* name) +{ + const GLubyte* start; + const GLubyte* end; + + if (glXGetCurrentDisplay == NULL) return GL_FALSE; + start = (const GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS); + if (0 == start) return GL_FALSE; + end = start + _glewStrLen(start); + return _glewSearchExtension(name, start, end); +} + +GLenum glxewInit () +{ + Display* display; + int major, minor; + const GLubyte* extStart; + const GLubyte* extEnd; + /* initialize core GLX 1.2 */ + if (_glewInit_GLX_VERSION_1_2()) return GLEW_ERROR_GLX_VERSION_11_ONLY; + /* check for a display */ + display = glXGetCurrentDisplay(); + if (display == NULL) return GLEW_ERROR_NO_GLX_DISPLAY; + /* initialize flags */ + GLXEW_VERSION_1_0 = GL_TRUE; + GLXEW_VERSION_1_1 = GL_TRUE; + GLXEW_VERSION_1_2 = GL_TRUE; + GLXEW_VERSION_1_3 = GL_TRUE; + GLXEW_VERSION_1_4 = GL_TRUE; + /* query GLX version */ + glXQueryVersion(display, &major, &minor); + if (major == 1 && minor <= 3) + { + switch (minor) + { + case 3: + GLXEW_VERSION_1_4 = GL_FALSE; + break; + case 2: + GLXEW_VERSION_1_4 = GL_FALSE; + GLXEW_VERSION_1_3 = GL_FALSE; + break; + default: + return GLEW_ERROR_GLX_VERSION_11_ONLY; + break; + } + } + /* query GLX extension string */ + extStart = 0; + if (glXGetCurrentDisplay != NULL) + extStart = (const GLubyte*)glXGetClientString(display, GLX_EXTENSIONS); + if (extStart == 0) + extStart = (const GLubyte *)""; + extEnd = extStart + _glewStrLen(extStart); + /* initialize extensions */ +#ifdef GLX_VERSION_1_3 + if (glewExperimental || GLXEW_VERSION_1_3) GLXEW_VERSION_1_3 = !_glewInit_GLX_VERSION_1_3(); +#endif /* GLX_VERSION_1_3 */ +#ifdef GLX_3DFX_multisample + GLXEW_3DFX_multisample = _glewSearchExtension("GLX_3DFX_multisample", extStart, extEnd); +#endif /* GLX_3DFX_multisample */ +#ifdef GLX_AMD_gpu_association + GLXEW_AMD_gpu_association = _glewSearchExtension("GLX_AMD_gpu_association", extStart, extEnd); + if (glewExperimental || GLXEW_AMD_gpu_association) GLXEW_AMD_gpu_association = !_glewInit_GLX_AMD_gpu_association(); +#endif /* GLX_AMD_gpu_association */ +#ifdef GLX_ARB_context_flush_control + GLXEW_ARB_context_flush_control = _glewSearchExtension("GLX_ARB_context_flush_control", extStart, extEnd); +#endif /* GLX_ARB_context_flush_control */ +#ifdef GLX_ARB_create_context + GLXEW_ARB_create_context = _glewSearchExtension("GLX_ARB_create_context", extStart, extEnd); + if (glewExperimental || GLXEW_ARB_create_context) GLXEW_ARB_create_context = !_glewInit_GLX_ARB_create_context(); +#endif /* GLX_ARB_create_context */ +#ifdef GLX_ARB_create_context_no_error + GLXEW_ARB_create_context_no_error = _glewSearchExtension("GLX_ARB_create_context_no_error", extStart, extEnd); +#endif /* GLX_ARB_create_context_no_error */ +#ifdef GLX_ARB_create_context_profile + GLXEW_ARB_create_context_profile = _glewSearchExtension("GLX_ARB_create_context_profile", extStart, extEnd); +#endif /* GLX_ARB_create_context_profile */ +#ifdef GLX_ARB_create_context_robustness + GLXEW_ARB_create_context_robustness = _glewSearchExtension("GLX_ARB_create_context_robustness", extStart, extEnd); +#endif /* GLX_ARB_create_context_robustness */ +#ifdef GLX_ARB_fbconfig_float + GLXEW_ARB_fbconfig_float = _glewSearchExtension("GLX_ARB_fbconfig_float", extStart, extEnd); +#endif /* GLX_ARB_fbconfig_float */ +#ifdef GLX_ARB_framebuffer_sRGB + GLXEW_ARB_framebuffer_sRGB = _glewSearchExtension("GLX_ARB_framebuffer_sRGB", extStart, extEnd); +#endif /* GLX_ARB_framebuffer_sRGB */ +#ifdef GLX_ARB_get_proc_address + GLXEW_ARB_get_proc_address = _glewSearchExtension("GLX_ARB_get_proc_address", extStart, extEnd); +#endif /* GLX_ARB_get_proc_address */ +#ifdef GLX_ARB_multisample + GLXEW_ARB_multisample = _glewSearchExtension("GLX_ARB_multisample", extStart, extEnd); +#endif /* GLX_ARB_multisample */ +#ifdef GLX_ARB_robustness_application_isolation + GLXEW_ARB_robustness_application_isolation = _glewSearchExtension("GLX_ARB_robustness_application_isolation", extStart, extEnd); +#endif /* GLX_ARB_robustness_application_isolation */ +#ifdef GLX_ARB_robustness_share_group_isolation + GLXEW_ARB_robustness_share_group_isolation = _glewSearchExtension("GLX_ARB_robustness_share_group_isolation", extStart, extEnd); +#endif /* GLX_ARB_robustness_share_group_isolation */ +#ifdef GLX_ARB_vertex_buffer_object + GLXEW_ARB_vertex_buffer_object = _glewSearchExtension("GLX_ARB_vertex_buffer_object", extStart, extEnd); +#endif /* GLX_ARB_vertex_buffer_object */ +#ifdef GLX_ATI_pixel_format_float + GLXEW_ATI_pixel_format_float = _glewSearchExtension("GLX_ATI_pixel_format_float", extStart, extEnd); +#endif /* GLX_ATI_pixel_format_float */ +#ifdef GLX_ATI_render_texture + GLXEW_ATI_render_texture = _glewSearchExtension("GLX_ATI_render_texture", extStart, extEnd); + if (glewExperimental || GLXEW_ATI_render_texture) GLXEW_ATI_render_texture = !_glewInit_GLX_ATI_render_texture(); +#endif /* GLX_ATI_render_texture */ +#ifdef GLX_EXT_buffer_age + GLXEW_EXT_buffer_age = _glewSearchExtension("GLX_EXT_buffer_age", extStart, extEnd); +#endif /* GLX_EXT_buffer_age */ +#ifdef GLX_EXT_create_context_es2_profile + GLXEW_EXT_create_context_es2_profile = _glewSearchExtension("GLX_EXT_create_context_es2_profile", extStart, extEnd); +#endif /* GLX_EXT_create_context_es2_profile */ +#ifdef GLX_EXT_create_context_es_profile + GLXEW_EXT_create_context_es_profile = _glewSearchExtension("GLX_EXT_create_context_es_profile", extStart, extEnd); +#endif /* GLX_EXT_create_context_es_profile */ +#ifdef GLX_EXT_fbconfig_packed_float + GLXEW_EXT_fbconfig_packed_float = _glewSearchExtension("GLX_EXT_fbconfig_packed_float", extStart, extEnd); +#endif /* GLX_EXT_fbconfig_packed_float */ +#ifdef GLX_EXT_framebuffer_sRGB + GLXEW_EXT_framebuffer_sRGB = _glewSearchExtension("GLX_EXT_framebuffer_sRGB", extStart, extEnd); +#endif /* GLX_EXT_framebuffer_sRGB */ +#ifdef GLX_EXT_import_context + GLXEW_EXT_import_context = _glewSearchExtension("GLX_EXT_import_context", extStart, extEnd); + if (glewExperimental || GLXEW_EXT_import_context) GLXEW_EXT_import_context = !_glewInit_GLX_EXT_import_context(); +#endif /* GLX_EXT_import_context */ +#ifdef GLX_EXT_libglvnd + GLXEW_EXT_libglvnd = _glewSearchExtension("GLX_EXT_libglvnd", extStart, extEnd); +#endif /* GLX_EXT_libglvnd */ +#ifdef GLX_EXT_scene_marker + GLXEW_EXT_scene_marker = _glewSearchExtension("GLX_EXT_scene_marker", extStart, extEnd); +#endif /* GLX_EXT_scene_marker */ +#ifdef GLX_EXT_stereo_tree + GLXEW_EXT_stereo_tree = _glewSearchExtension("GLX_EXT_stereo_tree", extStart, extEnd); +#endif /* GLX_EXT_stereo_tree */ +#ifdef GLX_EXT_swap_control + GLXEW_EXT_swap_control = _glewSearchExtension("GLX_EXT_swap_control", extStart, extEnd); + if (glewExperimental || GLXEW_EXT_swap_control) GLXEW_EXT_swap_control = !_glewInit_GLX_EXT_swap_control(); +#endif /* GLX_EXT_swap_control */ +#ifdef GLX_EXT_swap_control_tear + GLXEW_EXT_swap_control_tear = _glewSearchExtension("GLX_EXT_swap_control_tear", extStart, extEnd); +#endif /* GLX_EXT_swap_control_tear */ +#ifdef GLX_EXT_texture_from_pixmap + GLXEW_EXT_texture_from_pixmap = _glewSearchExtension("GLX_EXT_texture_from_pixmap", extStart, extEnd); + if (glewExperimental || GLXEW_EXT_texture_from_pixmap) GLXEW_EXT_texture_from_pixmap = !_glewInit_GLX_EXT_texture_from_pixmap(); +#endif /* GLX_EXT_texture_from_pixmap */ +#ifdef GLX_EXT_visual_info + GLXEW_EXT_visual_info = _glewSearchExtension("GLX_EXT_visual_info", extStart, extEnd); +#endif /* GLX_EXT_visual_info */ +#ifdef GLX_EXT_visual_rating + GLXEW_EXT_visual_rating = _glewSearchExtension("GLX_EXT_visual_rating", extStart, extEnd); +#endif /* GLX_EXT_visual_rating */ +#ifdef GLX_INTEL_swap_event + GLXEW_INTEL_swap_event = _glewSearchExtension("GLX_INTEL_swap_event", extStart, extEnd); +#endif /* GLX_INTEL_swap_event */ +#ifdef GLX_MESA_agp_offset + GLXEW_MESA_agp_offset = _glewSearchExtension("GLX_MESA_agp_offset", extStart, extEnd); + if (glewExperimental || GLXEW_MESA_agp_offset) GLXEW_MESA_agp_offset = !_glewInit_GLX_MESA_agp_offset(); +#endif /* GLX_MESA_agp_offset */ +#ifdef GLX_MESA_copy_sub_buffer + GLXEW_MESA_copy_sub_buffer = _glewSearchExtension("GLX_MESA_copy_sub_buffer", extStart, extEnd); + if (glewExperimental || GLXEW_MESA_copy_sub_buffer) GLXEW_MESA_copy_sub_buffer = !_glewInit_GLX_MESA_copy_sub_buffer(); +#endif /* GLX_MESA_copy_sub_buffer */ +#ifdef GLX_MESA_pixmap_colormap + GLXEW_MESA_pixmap_colormap = _glewSearchExtension("GLX_MESA_pixmap_colormap", extStart, extEnd); + if (glewExperimental || GLXEW_MESA_pixmap_colormap) GLXEW_MESA_pixmap_colormap = !_glewInit_GLX_MESA_pixmap_colormap(); +#endif /* GLX_MESA_pixmap_colormap */ +#ifdef GLX_MESA_query_renderer + GLXEW_MESA_query_renderer = _glewSearchExtension("GLX_MESA_query_renderer", extStart, extEnd); + if (glewExperimental || GLXEW_MESA_query_renderer) GLXEW_MESA_query_renderer = !_glewInit_GLX_MESA_query_renderer(); +#endif /* GLX_MESA_query_renderer */ +#ifdef GLX_MESA_release_buffers + GLXEW_MESA_release_buffers = _glewSearchExtension("GLX_MESA_release_buffers", extStart, extEnd); + if (glewExperimental || GLXEW_MESA_release_buffers) GLXEW_MESA_release_buffers = !_glewInit_GLX_MESA_release_buffers(); +#endif /* GLX_MESA_release_buffers */ +#ifdef GLX_MESA_set_3dfx_mode + GLXEW_MESA_set_3dfx_mode = _glewSearchExtension("GLX_MESA_set_3dfx_mode", extStart, extEnd); + if (glewExperimental || GLXEW_MESA_set_3dfx_mode) GLXEW_MESA_set_3dfx_mode = !_glewInit_GLX_MESA_set_3dfx_mode(); +#endif /* GLX_MESA_set_3dfx_mode */ +#ifdef GLX_MESA_swap_control + GLXEW_MESA_swap_control = _glewSearchExtension("GLX_MESA_swap_control", extStart, extEnd); + if (glewExperimental || GLXEW_MESA_swap_control) GLXEW_MESA_swap_control = !_glewInit_GLX_MESA_swap_control(); +#endif /* GLX_MESA_swap_control */ +#ifdef GLX_NV_copy_buffer + GLXEW_NV_copy_buffer = _glewSearchExtension("GLX_NV_copy_buffer", extStart, extEnd); + if (glewExperimental || GLXEW_NV_copy_buffer) GLXEW_NV_copy_buffer = !_glewInit_GLX_NV_copy_buffer(); +#endif /* GLX_NV_copy_buffer */ +#ifdef GLX_NV_copy_image + GLXEW_NV_copy_image = _glewSearchExtension("GLX_NV_copy_image", extStart, extEnd); + if (glewExperimental || GLXEW_NV_copy_image) GLXEW_NV_copy_image = !_glewInit_GLX_NV_copy_image(); +#endif /* GLX_NV_copy_image */ +#ifdef GLX_NV_delay_before_swap + GLXEW_NV_delay_before_swap = _glewSearchExtension("GLX_NV_delay_before_swap", extStart, extEnd); + if (glewExperimental || GLXEW_NV_delay_before_swap) GLXEW_NV_delay_before_swap = !_glewInit_GLX_NV_delay_before_swap(); +#endif /* GLX_NV_delay_before_swap */ +#ifdef GLX_NV_float_buffer + GLXEW_NV_float_buffer = _glewSearchExtension("GLX_NV_float_buffer", extStart, extEnd); +#endif /* GLX_NV_float_buffer */ +#ifdef GLX_NV_multisample_coverage + GLXEW_NV_multisample_coverage = _glewSearchExtension("GLX_NV_multisample_coverage", extStart, extEnd); +#endif /* GLX_NV_multisample_coverage */ +#ifdef GLX_NV_present_video + GLXEW_NV_present_video = _glewSearchExtension("GLX_NV_present_video", extStart, extEnd); + if (glewExperimental || GLXEW_NV_present_video) GLXEW_NV_present_video = !_glewInit_GLX_NV_present_video(); +#endif /* GLX_NV_present_video */ +#ifdef GLX_NV_robustness_video_memory_purge + GLXEW_NV_robustness_video_memory_purge = _glewSearchExtension("GLX_NV_robustness_video_memory_purge", extStart, extEnd); +#endif /* GLX_NV_robustness_video_memory_purge */ +#ifdef GLX_NV_swap_group + GLXEW_NV_swap_group = _glewSearchExtension("GLX_NV_swap_group", extStart, extEnd); + if (glewExperimental || GLXEW_NV_swap_group) GLXEW_NV_swap_group = !_glewInit_GLX_NV_swap_group(); +#endif /* GLX_NV_swap_group */ +#ifdef GLX_NV_vertex_array_range + GLXEW_NV_vertex_array_range = _glewSearchExtension("GLX_NV_vertex_array_range", extStart, extEnd); + if (glewExperimental || GLXEW_NV_vertex_array_range) GLXEW_NV_vertex_array_range = !_glewInit_GLX_NV_vertex_array_range(); +#endif /* GLX_NV_vertex_array_range */ +#ifdef GLX_NV_video_capture + GLXEW_NV_video_capture = _glewSearchExtension("GLX_NV_video_capture", extStart, extEnd); + if (glewExperimental || GLXEW_NV_video_capture) GLXEW_NV_video_capture = !_glewInit_GLX_NV_video_capture(); +#endif /* GLX_NV_video_capture */ +#ifdef GLX_NV_video_out + GLXEW_NV_video_out = _glewSearchExtension("GLX_NV_video_out", extStart, extEnd); + if (glewExperimental || GLXEW_NV_video_out) GLXEW_NV_video_out = !_glewInit_GLX_NV_video_out(); +#endif /* GLX_NV_video_out */ +#ifdef GLX_OML_swap_method + GLXEW_OML_swap_method = _glewSearchExtension("GLX_OML_swap_method", extStart, extEnd); +#endif /* GLX_OML_swap_method */ +#ifdef GLX_OML_sync_control + GLXEW_OML_sync_control = _glewSearchExtension("GLX_OML_sync_control", extStart, extEnd); + if (glewExperimental || GLXEW_OML_sync_control) GLXEW_OML_sync_control = !_glewInit_GLX_OML_sync_control(); +#endif /* GLX_OML_sync_control */ +#ifdef GLX_SGIS_blended_overlay + GLXEW_SGIS_blended_overlay = _glewSearchExtension("GLX_SGIS_blended_overlay", extStart, extEnd); +#endif /* GLX_SGIS_blended_overlay */ +#ifdef GLX_SGIS_color_range + GLXEW_SGIS_color_range = _glewSearchExtension("GLX_SGIS_color_range", extStart, extEnd); +#endif /* GLX_SGIS_color_range */ +#ifdef GLX_SGIS_multisample + GLXEW_SGIS_multisample = _glewSearchExtension("GLX_SGIS_multisample", extStart, extEnd); +#endif /* GLX_SGIS_multisample */ +#ifdef GLX_SGIS_shared_multisample + GLXEW_SGIS_shared_multisample = _glewSearchExtension("GLX_SGIS_shared_multisample", extStart, extEnd); +#endif /* GLX_SGIS_shared_multisample */ +#ifdef GLX_SGIX_fbconfig + GLXEW_SGIX_fbconfig = _glewSearchExtension("GLX_SGIX_fbconfig", extStart, extEnd); + if (glewExperimental || GLXEW_SGIX_fbconfig) GLXEW_SGIX_fbconfig = !_glewInit_GLX_SGIX_fbconfig(); +#endif /* GLX_SGIX_fbconfig */ +#ifdef GLX_SGIX_hyperpipe + GLXEW_SGIX_hyperpipe = _glewSearchExtension("GLX_SGIX_hyperpipe", extStart, extEnd); + if (glewExperimental || GLXEW_SGIX_hyperpipe) GLXEW_SGIX_hyperpipe = !_glewInit_GLX_SGIX_hyperpipe(); +#endif /* GLX_SGIX_hyperpipe */ +#ifdef GLX_SGIX_pbuffer + GLXEW_SGIX_pbuffer = _glewSearchExtension("GLX_SGIX_pbuffer", extStart, extEnd); + if (glewExperimental || GLXEW_SGIX_pbuffer) GLXEW_SGIX_pbuffer = !_glewInit_GLX_SGIX_pbuffer(); +#endif /* GLX_SGIX_pbuffer */ +#ifdef GLX_SGIX_swap_barrier + GLXEW_SGIX_swap_barrier = _glewSearchExtension("GLX_SGIX_swap_barrier", extStart, extEnd); + if (glewExperimental || GLXEW_SGIX_swap_barrier) GLXEW_SGIX_swap_barrier = !_glewInit_GLX_SGIX_swap_barrier(); +#endif /* GLX_SGIX_swap_barrier */ +#ifdef GLX_SGIX_swap_group + GLXEW_SGIX_swap_group = _glewSearchExtension("GLX_SGIX_swap_group", extStart, extEnd); + if (glewExperimental || GLXEW_SGIX_swap_group) GLXEW_SGIX_swap_group = !_glewInit_GLX_SGIX_swap_group(); +#endif /* GLX_SGIX_swap_group */ +#ifdef GLX_SGIX_video_resize + GLXEW_SGIX_video_resize = _glewSearchExtension("GLX_SGIX_video_resize", extStart, extEnd); + if (glewExperimental || GLXEW_SGIX_video_resize) GLXEW_SGIX_video_resize = !_glewInit_GLX_SGIX_video_resize(); +#endif /* GLX_SGIX_video_resize */ +#ifdef GLX_SGIX_visual_select_group + GLXEW_SGIX_visual_select_group = _glewSearchExtension("GLX_SGIX_visual_select_group", extStart, extEnd); +#endif /* GLX_SGIX_visual_select_group */ +#ifdef GLX_SGI_cushion + GLXEW_SGI_cushion = _glewSearchExtension("GLX_SGI_cushion", extStart, extEnd); + if (glewExperimental || GLXEW_SGI_cushion) GLXEW_SGI_cushion = !_glewInit_GLX_SGI_cushion(); +#endif /* GLX_SGI_cushion */ +#ifdef GLX_SGI_make_current_read + GLXEW_SGI_make_current_read = _glewSearchExtension("GLX_SGI_make_current_read", extStart, extEnd); + if (glewExperimental || GLXEW_SGI_make_current_read) GLXEW_SGI_make_current_read = !_glewInit_GLX_SGI_make_current_read(); +#endif /* GLX_SGI_make_current_read */ +#ifdef GLX_SGI_swap_control + GLXEW_SGI_swap_control = _glewSearchExtension("GLX_SGI_swap_control", extStart, extEnd); + if (glewExperimental || GLXEW_SGI_swap_control) GLXEW_SGI_swap_control = !_glewInit_GLX_SGI_swap_control(); +#endif /* GLX_SGI_swap_control */ +#ifdef GLX_SGI_video_sync + GLXEW_SGI_video_sync = _glewSearchExtension("GLX_SGI_video_sync", extStart, extEnd); + if (glewExperimental || GLXEW_SGI_video_sync) GLXEW_SGI_video_sync = !_glewInit_GLX_SGI_video_sync(); +#endif /* GLX_SGI_video_sync */ +#ifdef GLX_SUN_get_transparent_index + GLXEW_SUN_get_transparent_index = _glewSearchExtension("GLX_SUN_get_transparent_index", extStart, extEnd); + if (glewExperimental || GLXEW_SUN_get_transparent_index) GLXEW_SUN_get_transparent_index = !_glewInit_GLX_SUN_get_transparent_index(); +#endif /* GLX_SUN_get_transparent_index */ +#ifdef GLX_SUN_video_resize + GLXEW_SUN_video_resize = _glewSearchExtension("GLX_SUN_video_resize", extStart, extEnd); + if (glewExperimental || GLXEW_SUN_video_resize) GLXEW_SUN_video_resize = !_glewInit_GLX_SUN_video_resize(); +#endif /* GLX_SUN_video_resize */ + + return GLEW_OK; +} + +#endif /* !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) */ + +/* ------------------------------------------------------------------------ */ + +const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error) +{ + static const GLubyte* _glewErrorString[] = + { + (const GLubyte*)"No error", + (const GLubyte*)"Missing GL version", + (const GLubyte*)"GL 1.1 and up are not supported", + (const GLubyte*)"GLX 1.2 and up are not supported", + (const GLubyte*)"Unknown error" + }; + const size_t max_error = sizeof(_glewErrorString)/sizeof(*_glewErrorString) - 1; + return _glewErrorString[(size_t)error > max_error ? max_error : (size_t)error]; +} + +const GLubyte * GLEWAPIENTRY glewGetString (GLenum name) +{ + static const GLubyte* _glewString[] = + { + (const GLubyte*)NULL, + (const GLubyte*)"2.1.0", + (const GLubyte*)"2", + (const GLubyte*)"1", + (const GLubyte*)"0" + }; + const size_t max_string = sizeof(_glewString)/sizeof(*_glewString) - 1; + return _glewString[(size_t)name > max_string ? 0 : (size_t)name]; +} + +/* ------------------------------------------------------------------------ */ + +GLboolean glewExperimental = GL_FALSE; + +GLenum GLEWAPIENTRY glewInit (void) +{ + GLenum r; +#if defined(GLEW_EGL) + PFNEGLGETCURRENTDISPLAYPROC getCurrentDisplay = NULL; +#endif + r = glewContextInit(); + if ( r != 0 ) return r; +#if defined(GLEW_EGL) + getCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC) glewGetProcAddress("eglGetCurrentDisplay"); + return eglewInit(getCurrentDisplay()); +#elif defined(GLEW_OSMESA) || defined(__ANDROID__) || defined(__native_client__) || defined(__HAIKU__) + return r; +#elif defined(_WIN32) + return wglewInit(); +#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) /* _UNIX */ + return glxewInit(); +#else + return r; +#endif /* _WIN32 */ +} + +#if defined(_WIN32) && defined(GLEW_BUILD) && defined(__GNUC__) +/* GCC requires a DLL entry point even without any standard library included. */ +/* Types extracted from windows.h to avoid polluting the rest of the file. */ +int __stdcall DllMainCRTStartup(void* instance, unsigned reason, void* reserved) +{ + (void) instance; + (void) reason; + (void) reserved; + return 1; +} +#endif +GLboolean GLEWAPIENTRY glewIsSupported (const char* name) +{ + const GLubyte* pos = (const GLubyte*)name; + GLuint len = _glewStrLen(pos); + GLboolean ret = GL_TRUE; + while (ret && len > 0) + { + if (_glewStrSame1(&pos, &len, (const GLubyte*)"GL_", 3)) + { + if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) + { +#ifdef GL_VERSION_1_2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) + { + ret = GLEW_VERSION_1_2; + continue; + } +#endif +#ifdef GL_VERSION_1_2_1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2_1", 5)) + { + ret = GLEW_VERSION_1_2_1; + continue; + } +#endif +#ifdef GL_VERSION_1_3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) + { + ret = GLEW_VERSION_1_3; + continue; + } +#endif +#ifdef GL_VERSION_1_4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) + { + ret = GLEW_VERSION_1_4; + continue; + } +#endif +#ifdef GL_VERSION_1_5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_5", 3)) + { + ret = GLEW_VERSION_1_5; + continue; + } +#endif +#ifdef GL_VERSION_2_0 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_0", 3)) + { + ret = GLEW_VERSION_2_0; + continue; + } +#endif +#ifdef GL_VERSION_2_1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_1", 3)) + { + ret = GLEW_VERSION_2_1; + continue; + } +#endif +#ifdef GL_VERSION_3_0 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_0", 3)) + { + ret = GLEW_VERSION_3_0; + continue; + } +#endif +#ifdef GL_VERSION_3_1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_1", 3)) + { + ret = GLEW_VERSION_3_1; + continue; + } +#endif +#ifdef GL_VERSION_3_2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_2", 3)) + { + ret = GLEW_VERSION_3_2; + continue; + } +#endif +#ifdef GL_VERSION_3_3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_3", 3)) + { + ret = GLEW_VERSION_3_3; + continue; + } +#endif +#ifdef GL_VERSION_4_0 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_0", 3)) + { + ret = GLEW_VERSION_4_0; + continue; + } +#endif +#ifdef GL_VERSION_4_1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_1", 3)) + { + ret = GLEW_VERSION_4_1; + continue; + } +#endif +#ifdef GL_VERSION_4_2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_2", 3)) + { + ret = GLEW_VERSION_4_2; + continue; + } +#endif +#ifdef GL_VERSION_4_3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_3", 3)) + { + ret = GLEW_VERSION_4_3; + continue; + } +#endif +#ifdef GL_VERSION_4_4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_4", 3)) + { + ret = GLEW_VERSION_4_4; + continue; + } +#endif +#ifdef GL_VERSION_4_5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_5", 3)) + { + ret = GLEW_VERSION_4_5; + continue; + } +#endif +#ifdef GL_VERSION_4_6 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_6", 3)) + { + ret = GLEW_VERSION_4_6; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) + { +#ifdef GL_3DFX_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLEW_3DFX_multisample; + continue; + } +#endif +#ifdef GL_3DFX_tbuffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"tbuffer", 7)) + { + ret = GLEW_3DFX_tbuffer; + continue; + } +#endif +#ifdef GL_3DFX_texture_compression_FXT1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_FXT1", 24)) + { + ret = GLEW_3DFX_texture_compression_FXT1; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) + { +#ifdef GL_AMD_blend_minmax_factor + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax_factor", 19)) + { + ret = GLEW_AMD_blend_minmax_factor; + continue; + } +#endif +#ifdef GL_AMD_compressed_3DC_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_3DC_texture", 22)) + { + ret = GLEW_AMD_compressed_3DC_texture; + continue; + } +#endif +#ifdef GL_AMD_compressed_ATC_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_ATC_texture", 22)) + { + ret = GLEW_AMD_compressed_ATC_texture; + continue; + } +#endif +#ifdef GL_AMD_conservative_depth + if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) + { + ret = GLEW_AMD_conservative_depth; + continue; + } +#endif +#ifdef GL_AMD_debug_output + if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12)) + { + ret = GLEW_AMD_debug_output; + continue; + } +#endif +#ifdef GL_AMD_depth_clamp_separate + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp_separate", 20)) + { + ret = GLEW_AMD_depth_clamp_separate; + continue; + } +#endif +#ifdef GL_AMD_draw_buffers_blend + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18)) + { + ret = GLEW_AMD_draw_buffers_blend; + continue; + } +#endif +#ifdef GL_AMD_framebuffer_sample_positions + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sample_positions", 28)) + { + ret = GLEW_AMD_framebuffer_sample_positions; + continue; + } +#endif +#ifdef GL_AMD_gcn_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gcn_shader", 10)) + { + ret = GLEW_AMD_gcn_shader; + continue; + } +#endif +#ifdef GL_AMD_gpu_shader_half_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_half_float", 21)) + { + ret = GLEW_AMD_gpu_shader_half_float; + continue; + } +#endif +#ifdef GL_AMD_gpu_shader_int16 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int16", 16)) + { + ret = GLEW_AMD_gpu_shader_int16; + continue; + } +#endif +#ifdef GL_AMD_gpu_shader_int64 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int64", 16)) + { + ret = GLEW_AMD_gpu_shader_int64; + continue; + } +#endif +#ifdef GL_AMD_interleaved_elements + if (_glewStrSame3(&pos, &len, (const GLubyte*)"interleaved_elements", 20)) + { + ret = GLEW_AMD_interleaved_elements; + continue; + } +#endif +#ifdef GL_AMD_multi_draw_indirect + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) + { + ret = GLEW_AMD_multi_draw_indirect; + continue; + } +#endif +#ifdef GL_AMD_name_gen_delete + if (_glewStrSame3(&pos, &len, (const GLubyte*)"name_gen_delete", 15)) + { + ret = GLEW_AMD_name_gen_delete; + continue; + } +#endif +#ifdef GL_AMD_occlusion_query_event + if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query_event", 21)) + { + ret = GLEW_AMD_occlusion_query_event; + continue; + } +#endif +#ifdef GL_AMD_performance_monitor + if (_glewStrSame3(&pos, &len, (const GLubyte*)"performance_monitor", 19)) + { + ret = GLEW_AMD_performance_monitor; + continue; + } +#endif +#ifdef GL_AMD_pinned_memory + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pinned_memory", 13)) + { + ret = GLEW_AMD_pinned_memory; + continue; + } +#endif +#ifdef GL_AMD_program_binary_Z400 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_binary_Z400", 19)) + { + ret = GLEW_AMD_program_binary_Z400; + continue; + } +#endif +#ifdef GL_AMD_query_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_buffer_object", 19)) + { + ret = GLEW_AMD_query_buffer_object; + continue; + } +#endif +#ifdef GL_AMD_sample_positions + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_positions", 16)) + { + ret = GLEW_AMD_sample_positions; + continue; + } +#endif +#ifdef GL_AMD_seamless_cubemap_per_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28)) + { + ret = GLEW_AMD_seamless_cubemap_per_texture; + continue; + } +#endif +#ifdef GL_AMD_shader_atomic_counter_ops + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counter_ops", 25)) + { + ret = GLEW_AMD_shader_atomic_counter_ops; + continue; + } +#endif +#ifdef GL_AMD_shader_ballot + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_ballot", 13)) + { + ret = GLEW_AMD_shader_ballot; + continue; + } +#endif +#ifdef GL_AMD_shader_explicit_vertex_parameter + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_explicit_vertex_parameter", 32)) + { + ret = GLEW_AMD_shader_explicit_vertex_parameter; + continue; + } +#endif +#ifdef GL_AMD_shader_stencil_export + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21)) + { + ret = GLEW_AMD_shader_stencil_export; + continue; + } +#endif +#ifdef GL_AMD_shader_stencil_value_export + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_value_export", 27)) + { + ret = GLEW_AMD_shader_stencil_value_export; + continue; + } +#endif +#ifdef GL_AMD_shader_trinary_minmax + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_trinary_minmax", 21)) + { + ret = GLEW_AMD_shader_trinary_minmax; + continue; + } +#endif +#ifdef GL_AMD_sparse_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) + { + ret = GLEW_AMD_sparse_texture; + continue; + } +#endif +#ifdef GL_AMD_stencil_operation_extended + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_operation_extended", 26)) + { + ret = GLEW_AMD_stencil_operation_extended; + continue; + } +#endif +#ifdef GL_AMD_texture_gather_bias_lod + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_gather_bias_lod", 23)) + { + ret = GLEW_AMD_texture_gather_bias_lod; + continue; + } +#endif +#ifdef GL_AMD_texture_texture4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_texture4", 16)) + { + ret = GLEW_AMD_texture_texture4; + continue; + } +#endif +#ifdef GL_AMD_transform_feedback3_lines_triangles + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3_lines_triangles", 35)) + { + ret = GLEW_AMD_transform_feedback3_lines_triangles; + continue; + } +#endif +#ifdef GL_AMD_transform_feedback4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback4", 19)) + { + ret = GLEW_AMD_transform_feedback4; + continue; + } +#endif +#ifdef GL_AMD_vertex_shader_layer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_layer", 19)) + { + ret = GLEW_AMD_vertex_shader_layer; + continue; + } +#endif +#ifdef GL_AMD_vertex_shader_tessellator + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_tessellator", 25)) + { + ret = GLEW_AMD_vertex_shader_tessellator; + continue; + } +#endif +#ifdef GL_AMD_vertex_shader_viewport_index + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_viewport_index", 28)) + { + ret = GLEW_AMD_vertex_shader_viewport_index; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANDROID_", 8)) + { +#ifdef GL_ANDROID_extension_pack_es31a + if (_glewStrSame3(&pos, &len, (const GLubyte*)"extension_pack_es31a", 20)) + { + ret = GLEW_ANDROID_extension_pack_es31a; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANGLE_", 6)) + { +#ifdef GL_ANGLE_depth_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) + { + ret = GLEW_ANGLE_depth_texture; + continue; + } +#endif +#ifdef GL_ANGLE_framebuffer_blit + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) + { + ret = GLEW_ANGLE_framebuffer_blit; + continue; + } +#endif +#ifdef GL_ANGLE_framebuffer_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) + { + ret = GLEW_ANGLE_framebuffer_multisample; + continue; + } +#endif +#ifdef GL_ANGLE_instanced_arrays + if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) + { + ret = GLEW_ANGLE_instanced_arrays; + continue; + } +#endif +#ifdef GL_ANGLE_pack_reverse_row_order + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_reverse_row_order", 22)) + { + ret = GLEW_ANGLE_pack_reverse_row_order; + continue; + } +#endif +#ifdef GL_ANGLE_program_binary + if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_binary", 14)) + { + ret = GLEW_ANGLE_program_binary; + continue; + } +#endif +#ifdef GL_ANGLE_texture_compression_dxt1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24)) + { + ret = GLEW_ANGLE_texture_compression_dxt1; + continue; + } +#endif +#ifdef GL_ANGLE_texture_compression_dxt3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt3", 24)) + { + ret = GLEW_ANGLE_texture_compression_dxt3; + continue; + } +#endif +#ifdef GL_ANGLE_texture_compression_dxt5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt5", 24)) + { + ret = GLEW_ANGLE_texture_compression_dxt5; + continue; + } +#endif +#ifdef GL_ANGLE_texture_usage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_usage", 13)) + { + ret = GLEW_ANGLE_texture_usage; + continue; + } +#endif +#ifdef GL_ANGLE_timer_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) + { + ret = GLEW_ANGLE_timer_query; + continue; + } +#endif +#ifdef GL_ANGLE_translated_shader_source + if (_glewStrSame3(&pos, &len, (const GLubyte*)"translated_shader_source", 24)) + { + ret = GLEW_ANGLE_translated_shader_source; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"APPLE_", 6)) + { +#ifdef GL_APPLE_aux_depth_stencil + if (_glewStrSame3(&pos, &len, (const GLubyte*)"aux_depth_stencil", 17)) + { + ret = GLEW_APPLE_aux_depth_stencil; + continue; + } +#endif +#ifdef GL_APPLE_client_storage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_storage", 14)) + { + ret = GLEW_APPLE_client_storage; + continue; + } +#endif +#ifdef GL_APPLE_clip_distance + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_distance", 13)) + { + ret = GLEW_APPLE_clip_distance; + continue; + } +#endif +#ifdef GL_APPLE_color_buffer_packed_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_packed_float", 25)) + { + ret = GLEW_APPLE_color_buffer_packed_float; + continue; + } +#endif +#ifdef GL_APPLE_copy_texture_levels + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_texture_levels", 19)) + { + ret = GLEW_APPLE_copy_texture_levels; + continue; + } +#endif +#ifdef GL_APPLE_element_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) + { + ret = GLEW_APPLE_element_array; + continue; + } +#endif +#ifdef GL_APPLE_fence + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) + { + ret = GLEW_APPLE_fence; + continue; + } +#endif +#ifdef GL_APPLE_float_pixels + if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_pixels", 12)) + { + ret = GLEW_APPLE_float_pixels; + continue; + } +#endif +#ifdef GL_APPLE_flush_buffer_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_buffer_range", 18)) + { + ret = GLEW_APPLE_flush_buffer_range; + continue; + } +#endif +#ifdef GL_APPLE_framebuffer_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) + { + ret = GLEW_APPLE_framebuffer_multisample; + continue; + } +#endif +#ifdef GL_APPLE_object_purgeable + if (_glewStrSame3(&pos, &len, (const GLubyte*)"object_purgeable", 16)) + { + ret = GLEW_APPLE_object_purgeable; + continue; + } +#endif +#ifdef GL_APPLE_pixel_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer", 12)) + { + ret = GLEW_APPLE_pixel_buffer; + continue; + } +#endif +#ifdef GL_APPLE_rgb_422 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"rgb_422", 7)) + { + ret = GLEW_APPLE_rgb_422; + continue; + } +#endif +#ifdef GL_APPLE_row_bytes + if (_glewStrSame3(&pos, &len, (const GLubyte*)"row_bytes", 9)) + { + ret = GLEW_APPLE_row_bytes; + continue; + } +#endif +#ifdef GL_APPLE_specular_vector + if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_vector", 15)) + { + ret = GLEW_APPLE_specular_vector; + continue; + } +#endif +#ifdef GL_APPLE_sync + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync", 4)) + { + ret = GLEW_APPLE_sync; + continue; + } +#endif +#ifdef GL_APPLE_texture_2D_limited_npot + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_2D_limited_npot", 23)) + { + ret = GLEW_APPLE_texture_2D_limited_npot; + continue; + } +#endif +#ifdef GL_APPLE_texture_format_BGRA8888 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_format_BGRA8888", 23)) + { + ret = GLEW_APPLE_texture_format_BGRA8888; + continue; + } +#endif +#ifdef GL_APPLE_texture_max_level + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_max_level", 17)) + { + ret = GLEW_APPLE_texture_max_level; + continue; + } +#endif +#ifdef GL_APPLE_texture_packed_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_packed_float", 20)) + { + ret = GLEW_APPLE_texture_packed_float; + continue; + } +#endif +#ifdef GL_APPLE_texture_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) + { + ret = GLEW_APPLE_texture_range; + continue; + } +#endif +#ifdef GL_APPLE_transform_hint + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_hint", 14)) + { + ret = GLEW_APPLE_transform_hint; + continue; + } +#endif +#ifdef GL_APPLE_vertex_array_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) + { + ret = GLEW_APPLE_vertex_array_object; + continue; + } +#endif +#ifdef GL_APPLE_vertex_array_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) + { + ret = GLEW_APPLE_vertex_array_range; + continue; + } +#endif +#ifdef GL_APPLE_vertex_program_evaluators + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program_evaluators", 25)) + { + ret = GLEW_APPLE_vertex_program_evaluators; + continue; + } +#endif +#ifdef GL_APPLE_ycbcr_422 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_422", 9)) + { + ret = GLEW_APPLE_ycbcr_422; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) + { +#ifdef GL_ARB_ES2_compatibility + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES2_compatibility", 17)) + { + ret = GLEW_ARB_ES2_compatibility; + continue; + } +#endif +#ifdef GL_ARB_ES3_1_compatibility + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_1_compatibility", 19)) + { + ret = GLEW_ARB_ES3_1_compatibility; + continue; + } +#endif +#ifdef GL_ARB_ES3_2_compatibility + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_2_compatibility", 19)) + { + ret = GLEW_ARB_ES3_2_compatibility; + continue; + } +#endif +#ifdef GL_ARB_ES3_compatibility + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_compatibility", 17)) + { + ret = GLEW_ARB_ES3_compatibility; + continue; + } +#endif +#ifdef GL_ARB_arrays_of_arrays + if (_glewStrSame3(&pos, &len, (const GLubyte*)"arrays_of_arrays", 16)) + { + ret = GLEW_ARB_arrays_of_arrays; + continue; + } +#endif +#ifdef GL_ARB_base_instance + if (_glewStrSame3(&pos, &len, (const GLubyte*)"base_instance", 13)) + { + ret = GLEW_ARB_base_instance; + continue; + } +#endif +#ifdef GL_ARB_bindless_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) + { + ret = GLEW_ARB_bindless_texture; + continue; + } +#endif +#ifdef GL_ARB_blend_func_extended + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_extended", 19)) + { + ret = GLEW_ARB_blend_func_extended; + continue; + } +#endif +#ifdef GL_ARB_buffer_storage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_storage", 14)) + { + ret = GLEW_ARB_buffer_storage; + continue; + } +#endif +#ifdef GL_ARB_cl_event + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event", 8)) + { + ret = GLEW_ARB_cl_event; + continue; + } +#endif +#ifdef GL_ARB_clear_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_buffer_object", 19)) + { + ret = GLEW_ARB_clear_buffer_object; + continue; + } +#endif +#ifdef GL_ARB_clear_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_texture", 13)) + { + ret = GLEW_ARB_clear_texture; + continue; + } +#endif +#ifdef GL_ARB_clip_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_control", 12)) + { + ret = GLEW_ARB_clip_control; + continue; + } +#endif +#ifdef GL_ARB_color_buffer_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_float", 18)) + { + ret = GLEW_ARB_color_buffer_float; + continue; + } +#endif +#ifdef GL_ARB_compatibility + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compatibility", 13)) + { + ret = GLEW_ARB_compatibility; + continue; + } +#endif +#ifdef GL_ARB_compressed_texture_pixel_storage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_texture_pixel_storage", 32)) + { + ret = GLEW_ARB_compressed_texture_pixel_storage; + continue; + } +#endif +#ifdef GL_ARB_compute_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_shader", 14)) + { + ret = GLEW_ARB_compute_shader; + continue; + } +#endif +#ifdef GL_ARB_compute_variable_group_size + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_variable_group_size", 27)) + { + ret = GLEW_ARB_compute_variable_group_size; + continue; + } +#endif +#ifdef GL_ARB_conditional_render_inverted + if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render_inverted", 27)) + { + ret = GLEW_ARB_conditional_render_inverted; + continue; + } +#endif +#ifdef GL_ARB_conservative_depth + if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) + { + ret = GLEW_ARB_conservative_depth; + continue; + } +#endif +#ifdef GL_ARB_copy_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11)) + { + ret = GLEW_ARB_copy_buffer; + continue; + } +#endif +#ifdef GL_ARB_copy_image + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) + { + ret = GLEW_ARB_copy_image; + continue; + } +#endif +#ifdef GL_ARB_cull_distance + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_distance", 13)) + { + ret = GLEW_ARB_cull_distance; + continue; + } +#endif +#ifdef GL_ARB_debug_output + if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12)) + { + ret = GLEW_ARB_debug_output; + continue; + } +#endif +#ifdef GL_ARB_depth_buffer_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18)) + { + ret = GLEW_ARB_depth_buffer_float; + continue; + } +#endif +#ifdef GL_ARB_depth_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11)) + { + ret = GLEW_ARB_depth_clamp; + continue; + } +#endif +#ifdef GL_ARB_depth_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) + { + ret = GLEW_ARB_depth_texture; + continue; + } +#endif +#ifdef GL_ARB_derivative_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"derivative_control", 18)) + { + ret = GLEW_ARB_derivative_control; + continue; + } +#endif +#ifdef GL_ARB_direct_state_access + if (_glewStrSame3(&pos, &len, (const GLubyte*)"direct_state_access", 19)) + { + ret = GLEW_ARB_direct_state_access; + continue; + } +#endif +#ifdef GL_ARB_draw_buffers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) + { + ret = GLEW_ARB_draw_buffers; + continue; + } +#endif +#ifdef GL_ARB_draw_buffers_blend + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18)) + { + ret = GLEW_ARB_draw_buffers_blend; + continue; + } +#endif +#ifdef GL_ARB_draw_elements_base_vertex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_elements_base_vertex", 25)) + { + ret = GLEW_ARB_draw_elements_base_vertex; + continue; + } +#endif +#ifdef GL_ARB_draw_indirect + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_indirect", 13)) + { + ret = GLEW_ARB_draw_indirect; + continue; + } +#endif +#ifdef GL_ARB_draw_instanced + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) + { + ret = GLEW_ARB_draw_instanced; + continue; + } +#endif +#ifdef GL_ARB_enhanced_layouts + if (_glewStrSame3(&pos, &len, (const GLubyte*)"enhanced_layouts", 16)) + { + ret = GLEW_ARB_enhanced_layouts; + continue; + } +#endif +#ifdef GL_ARB_explicit_attrib_location + if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_attrib_location", 24)) + { + ret = GLEW_ARB_explicit_attrib_location; + continue; + } +#endif +#ifdef GL_ARB_explicit_uniform_location + if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_uniform_location", 25)) + { + ret = GLEW_ARB_explicit_uniform_location; + continue; + } +#endif +#ifdef GL_ARB_fragment_coord_conventions + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_coord_conventions", 26)) + { + ret = GLEW_ARB_fragment_coord_conventions; + continue; + } +#endif +#ifdef GL_ARB_fragment_layer_viewport + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_layer_viewport", 23)) + { + ret = GLEW_ARB_fragment_layer_viewport; + continue; + } +#endif +#ifdef GL_ARB_fragment_program + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) + { + ret = GLEW_ARB_fragment_program; + continue; + } +#endif +#ifdef GL_ARB_fragment_program_shadow + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_shadow", 23)) + { + ret = GLEW_ARB_fragment_program_shadow; + continue; + } +#endif +#ifdef GL_ARB_fragment_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) + { + ret = GLEW_ARB_fragment_shader; + continue; + } +#endif +#ifdef GL_ARB_fragment_shader_interlock + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_interlock", 25)) + { + ret = GLEW_ARB_fragment_shader_interlock; + continue; + } +#endif +#ifdef GL_ARB_framebuffer_no_attachments + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_no_attachments", 26)) + { + ret = GLEW_ARB_framebuffer_no_attachments; + continue; + } +#endif +#ifdef GL_ARB_framebuffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18)) + { + ret = GLEW_ARB_framebuffer_object; + continue; + } +#endif +#ifdef GL_ARB_framebuffer_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) + { + ret = GLEW_ARB_framebuffer_sRGB; + continue; + } +#endif +#ifdef GL_ARB_geometry_shader4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) + { + ret = GLEW_ARB_geometry_shader4; + continue; + } +#endif +#ifdef GL_ARB_get_program_binary + if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_program_binary", 18)) + { + ret = GLEW_ARB_get_program_binary; + continue; + } +#endif +#ifdef GL_ARB_get_texture_sub_image + if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_texture_sub_image", 21)) + { + ret = GLEW_ARB_get_texture_sub_image; + continue; + } +#endif +#ifdef GL_ARB_gl_spirv + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_spirv", 8)) + { + ret = GLEW_ARB_gl_spirv; + continue; + } +#endif +#ifdef GL_ARB_gpu_shader5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) + { + ret = GLEW_ARB_gpu_shader5; + continue; + } +#endif +#ifdef GL_ARB_gpu_shader_fp64 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_fp64", 15)) + { + ret = GLEW_ARB_gpu_shader_fp64; + continue; + } +#endif +#ifdef GL_ARB_gpu_shader_int64 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int64", 16)) + { + ret = GLEW_ARB_gpu_shader_int64; + continue; + } +#endif +#ifdef GL_ARB_half_float_pixel + if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_pixel", 16)) + { + ret = GLEW_ARB_half_float_pixel; + continue; + } +#endif +#ifdef GL_ARB_half_float_vertex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_vertex", 17)) + { + ret = GLEW_ARB_half_float_vertex; + continue; + } +#endif +#ifdef GL_ARB_imaging + if (_glewStrSame3(&pos, &len, (const GLubyte*)"imaging", 7)) + { + ret = GLEW_ARB_imaging; + continue; + } +#endif +#ifdef GL_ARB_indirect_parameters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"indirect_parameters", 19)) + { + ret = GLEW_ARB_indirect_parameters; + continue; + } +#endif +#ifdef GL_ARB_instanced_arrays + if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) + { + ret = GLEW_ARB_instanced_arrays; + continue; + } +#endif +#ifdef GL_ARB_internalformat_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_query", 20)) + { + ret = GLEW_ARB_internalformat_query; + continue; + } +#endif +#ifdef GL_ARB_internalformat_query2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_query2", 21)) + { + ret = GLEW_ARB_internalformat_query2; + continue; + } +#endif +#ifdef GL_ARB_invalidate_subdata + if (_glewStrSame3(&pos, &len, (const GLubyte*)"invalidate_subdata", 18)) + { + ret = GLEW_ARB_invalidate_subdata; + continue; + } +#endif +#ifdef GL_ARB_map_buffer_alignment + if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_alignment", 20)) + { + ret = GLEW_ARB_map_buffer_alignment; + continue; + } +#endif +#ifdef GL_ARB_map_buffer_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_range", 16)) + { + ret = GLEW_ARB_map_buffer_range; + continue; + } +#endif +#ifdef GL_ARB_matrix_palette + if (_glewStrSame3(&pos, &len, (const GLubyte*)"matrix_palette", 14)) + { + ret = GLEW_ARB_matrix_palette; + continue; + } +#endif +#ifdef GL_ARB_multi_bind + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_bind", 10)) + { + ret = GLEW_ARB_multi_bind; + continue; + } +#endif +#ifdef GL_ARB_multi_draw_indirect + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) + { + ret = GLEW_ARB_multi_draw_indirect; + continue; + } +#endif +#ifdef GL_ARB_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLEW_ARB_multisample; + continue; + } +#endif +#ifdef GL_ARB_multitexture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multitexture", 12)) + { + ret = GLEW_ARB_multitexture; + continue; + } +#endif +#ifdef GL_ARB_occlusion_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) + { + ret = GLEW_ARB_occlusion_query; + continue; + } +#endif +#ifdef GL_ARB_occlusion_query2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query2", 16)) + { + ret = GLEW_ARB_occlusion_query2; + continue; + } +#endif +#ifdef GL_ARB_parallel_shader_compile + if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_shader_compile", 23)) + { + ret = GLEW_ARB_parallel_shader_compile; + continue; + } +#endif +#ifdef GL_ARB_pipeline_statistics_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pipeline_statistics_query", 25)) + { + ret = GLEW_ARB_pipeline_statistics_query; + continue; + } +#endif +#ifdef GL_ARB_pixel_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) + { + ret = GLEW_ARB_pixel_buffer_object; + continue; + } +#endif +#ifdef GL_ARB_point_parameters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) + { + ret = GLEW_ARB_point_parameters; + continue; + } +#endif +#ifdef GL_ARB_point_sprite + if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) + { + ret = GLEW_ARB_point_sprite; + continue; + } +#endif +#ifdef GL_ARB_polygon_offset_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset_clamp", 20)) + { + ret = GLEW_ARB_polygon_offset_clamp; + continue; + } +#endif +#ifdef GL_ARB_post_depth_coverage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_depth_coverage", 19)) + { + ret = GLEW_ARB_post_depth_coverage; + continue; + } +#endif +#ifdef GL_ARB_program_interface_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_interface_query", 23)) + { + ret = GLEW_ARB_program_interface_query; + continue; + } +#endif +#ifdef GL_ARB_provoking_vertex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16)) + { + ret = GLEW_ARB_provoking_vertex; + continue; + } +#endif +#ifdef GL_ARB_query_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_buffer_object", 19)) + { + ret = GLEW_ARB_query_buffer_object; + continue; + } +#endif +#ifdef GL_ARB_robust_buffer_access_behavior + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robust_buffer_access_behavior", 29)) + { + ret = GLEW_ARB_robust_buffer_access_behavior; + continue; + } +#endif +#ifdef GL_ARB_robustness + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness", 10)) + { + ret = GLEW_ARB_robustness; + continue; + } +#endif +#ifdef GL_ARB_robustness_application_isolation + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) + { + ret = GLEW_ARB_robustness_application_isolation; + continue; + } +#endif +#ifdef GL_ARB_robustness_share_group_isolation + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) + { + ret = GLEW_ARB_robustness_share_group_isolation; + continue; + } +#endif +#ifdef GL_ARB_sample_locations + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_locations", 16)) + { + ret = GLEW_ARB_sample_locations; + continue; + } +#endif +#ifdef GL_ARB_sample_shading + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_shading", 14)) + { + ret = GLEW_ARB_sample_shading; + continue; + } +#endif +#ifdef GL_ARB_sampler_objects + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sampler_objects", 15)) + { + ret = GLEW_ARB_sampler_objects; + continue; + } +#endif +#ifdef GL_ARB_seamless_cube_map + if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cube_map", 17)) + { + ret = GLEW_ARB_seamless_cube_map; + continue; + } +#endif +#ifdef GL_ARB_seamless_cubemap_per_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28)) + { + ret = GLEW_ARB_seamless_cubemap_per_texture; + continue; + } +#endif +#ifdef GL_ARB_separate_shader_objects + if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23)) + { + ret = GLEW_ARB_separate_shader_objects; + continue; + } +#endif +#ifdef GL_ARB_shader_atomic_counter_ops + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counter_ops", 25)) + { + ret = GLEW_ARB_shader_atomic_counter_ops; + continue; + } +#endif +#ifdef GL_ARB_shader_atomic_counters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counters", 22)) + { + ret = GLEW_ARB_shader_atomic_counters; + continue; + } +#endif +#ifdef GL_ARB_shader_ballot + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_ballot", 13)) + { + ret = GLEW_ARB_shader_ballot; + continue; + } +#endif +#ifdef GL_ARB_shader_bit_encoding + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_bit_encoding", 19)) + { + ret = GLEW_ARB_shader_bit_encoding; + continue; + } +#endif +#ifdef GL_ARB_shader_clock + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_clock", 12)) + { + ret = GLEW_ARB_shader_clock; + continue; + } +#endif +#ifdef GL_ARB_shader_draw_parameters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_draw_parameters", 22)) + { + ret = GLEW_ARB_shader_draw_parameters; + continue; + } +#endif +#ifdef GL_ARB_shader_group_vote + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_group_vote", 17)) + { + ret = GLEW_ARB_shader_group_vote; + continue; + } +#endif +#ifdef GL_ARB_shader_image_load_store + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23)) + { + ret = GLEW_ARB_shader_image_load_store; + continue; + } +#endif +#ifdef GL_ARB_shader_image_size + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_size", 17)) + { + ret = GLEW_ARB_shader_image_size; + continue; + } +#endif +#ifdef GL_ARB_shader_objects + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_objects", 14)) + { + ret = GLEW_ARB_shader_objects; + continue; + } +#endif +#ifdef GL_ARB_shader_precision + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_precision", 16)) + { + ret = GLEW_ARB_shader_precision; + continue; + } +#endif +#ifdef GL_ARB_shader_stencil_export + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21)) + { + ret = GLEW_ARB_shader_stencil_export; + continue; + } +#endif +#ifdef GL_ARB_shader_storage_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_storage_buffer_object", 28)) + { + ret = GLEW_ARB_shader_storage_buffer_object; + continue; + } +#endif +#ifdef GL_ARB_shader_subroutine + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_subroutine", 17)) + { + ret = GLEW_ARB_shader_subroutine; + continue; + } +#endif +#ifdef GL_ARB_shader_texture_image_samples + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_image_samples", 28)) + { + ret = GLEW_ARB_shader_texture_image_samples; + continue; + } +#endif +#ifdef GL_ARB_shader_texture_lod + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) + { + ret = GLEW_ARB_shader_texture_lod; + continue; + } +#endif +#ifdef GL_ARB_shader_viewport_layer_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_viewport_layer_array", 27)) + { + ret = GLEW_ARB_shader_viewport_layer_array; + continue; + } +#endif +#ifdef GL_ARB_shading_language_100 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_100", 20)) + { + ret = GLEW_ARB_shading_language_100; + continue; + } +#endif +#ifdef GL_ARB_shading_language_420pack + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_420pack", 24)) + { + ret = GLEW_ARB_shading_language_420pack; + continue; + } +#endif +#ifdef GL_ARB_shading_language_include + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_include", 24)) + { + ret = GLEW_ARB_shading_language_include; + continue; + } +#endif +#ifdef GL_ARB_shading_language_packing + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_packing", 24)) + { + ret = GLEW_ARB_shading_language_packing; + continue; + } +#endif +#ifdef GL_ARB_shadow + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) + { + ret = GLEW_ARB_shadow; + continue; + } +#endif +#ifdef GL_ARB_shadow_ambient + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) + { + ret = GLEW_ARB_shadow_ambient; + continue; + } +#endif +#ifdef GL_ARB_sparse_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_buffer", 13)) + { + ret = GLEW_ARB_sparse_buffer; + continue; + } +#endif +#ifdef GL_ARB_sparse_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) + { + ret = GLEW_ARB_sparse_texture; + continue; + } +#endif +#ifdef GL_ARB_sparse_texture2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture2", 15)) + { + ret = GLEW_ARB_sparse_texture2; + continue; + } +#endif +#ifdef GL_ARB_sparse_texture_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture_clamp", 20)) + { + ret = GLEW_ARB_sparse_texture_clamp; + continue; + } +#endif +#ifdef GL_ARB_spirv_extensions + if (_glewStrSame3(&pos, &len, (const GLubyte*)"spirv_extensions", 16)) + { + ret = GLEW_ARB_spirv_extensions; + continue; + } +#endif +#ifdef GL_ARB_stencil_texturing + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_texturing", 17)) + { + ret = GLEW_ARB_stencil_texturing; + continue; + } +#endif +#ifdef GL_ARB_sync + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync", 4)) + { + ret = GLEW_ARB_sync; + continue; + } +#endif +#ifdef GL_ARB_tessellation_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_shader", 19)) + { + ret = GLEW_ARB_tessellation_shader; + continue; + } +#endif +#ifdef GL_ARB_texture_barrier + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_barrier", 15)) + { + ret = GLEW_ARB_texture_barrier; + continue; + } +#endif +#ifdef GL_ARB_texture_border_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) + { + ret = GLEW_ARB_texture_border_clamp; + continue; + } +#endif +#ifdef GL_ARB_texture_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object", 21)) + { + ret = GLEW_ARB_texture_buffer_object; + continue; + } +#endif +#ifdef GL_ARB_texture_buffer_object_rgb32 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object_rgb32", 27)) + { + ret = GLEW_ARB_texture_buffer_object_rgb32; + continue; + } +#endif +#ifdef GL_ARB_texture_buffer_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_range", 20)) + { + ret = GLEW_ARB_texture_buffer_range; + continue; + } +#endif +#ifdef GL_ARB_texture_compression + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression", 19)) + { + ret = GLEW_ARB_texture_compression; + continue; + } +#endif +#ifdef GL_ARB_texture_compression_bptc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_bptc", 24)) + { + ret = GLEW_ARB_texture_compression_bptc; + continue; + } +#endif +#ifdef GL_ARB_texture_compression_rgtc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24)) + { + ret = GLEW_ARB_texture_compression_rgtc; + continue; + } +#endif +#ifdef GL_ARB_texture_cube_map + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) + { + ret = GLEW_ARB_texture_cube_map; + continue; + } +#endif +#ifdef GL_ARB_texture_cube_map_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map_array", 22)) + { + ret = GLEW_ARB_texture_cube_map_array; + continue; + } +#endif +#ifdef GL_ARB_texture_env_add + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) + { + ret = GLEW_ARB_texture_env_add; + continue; + } +#endif +#ifdef GL_ARB_texture_env_combine + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) + { + ret = GLEW_ARB_texture_env_combine; + continue; + } +#endif +#ifdef GL_ARB_texture_env_crossbar + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_crossbar", 20)) + { + ret = GLEW_ARB_texture_env_crossbar; + continue; + } +#endif +#ifdef GL_ARB_texture_env_dot3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) + { + ret = GLEW_ARB_texture_env_dot3; + continue; + } +#endif +#ifdef GL_ARB_texture_filter_anisotropic + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_anisotropic", 26)) + { + ret = GLEW_ARB_texture_filter_anisotropic; + continue; + } +#endif +#ifdef GL_ARB_texture_filter_minmax + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_minmax", 21)) + { + ret = GLEW_ARB_texture_filter_minmax; + continue; + } +#endif +#ifdef GL_ARB_texture_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) + { + ret = GLEW_ARB_texture_float; + continue; + } +#endif +#ifdef GL_ARB_texture_gather + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_gather", 14)) + { + ret = GLEW_ARB_texture_gather; + continue; + } +#endif +#ifdef GL_ARB_texture_mirror_clamp_to_edge + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp_to_edge", 28)) + { + ret = GLEW_ARB_texture_mirror_clamp_to_edge; + continue; + } +#endif +#ifdef GL_ARB_texture_mirrored_repeat + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) + { + ret = GLEW_ARB_texture_mirrored_repeat; + continue; + } +#endif +#ifdef GL_ARB_texture_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multisample", 19)) + { + ret = GLEW_ARB_texture_multisample; + continue; + } +#endif +#ifdef GL_ARB_texture_non_power_of_two + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_non_power_of_two", 24)) + { + ret = GLEW_ARB_texture_non_power_of_two; + continue; + } +#endif +#ifdef GL_ARB_texture_query_levels + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_levels", 20)) + { + ret = GLEW_ARB_texture_query_levels; + continue; + } +#endif +#ifdef GL_ARB_texture_query_lod + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_lod", 17)) + { + ret = GLEW_ARB_texture_query_lod; + continue; + } +#endif +#ifdef GL_ARB_texture_rectangle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) + { + ret = GLEW_ARB_texture_rectangle; + continue; + } +#endif +#ifdef GL_ARB_texture_rg + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rg", 10)) + { + ret = GLEW_ARB_texture_rg; + continue; + } +#endif +#ifdef GL_ARB_texture_rgb10_a2ui + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rgb10_a2ui", 18)) + { + ret = GLEW_ARB_texture_rgb10_a2ui; + continue; + } +#endif +#ifdef GL_ARB_texture_stencil8 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stencil8", 16)) + { + ret = GLEW_ARB_texture_stencil8; + continue; + } +#endif +#ifdef GL_ARB_texture_storage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage", 15)) + { + ret = GLEW_ARB_texture_storage; + continue; + } +#endif +#ifdef GL_ARB_texture_storage_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage_multisample", 27)) + { + ret = GLEW_ARB_texture_storage_multisample; + continue; + } +#endif +#ifdef GL_ARB_texture_swizzle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15)) + { + ret = GLEW_ARB_texture_swizzle; + continue; + } +#endif +#ifdef GL_ARB_texture_view + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_view", 12)) + { + ret = GLEW_ARB_texture_view; + continue; + } +#endif +#ifdef GL_ARB_timer_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) + { + ret = GLEW_ARB_timer_query; + continue; + } +#endif +#ifdef GL_ARB_transform_feedback2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19)) + { + ret = GLEW_ARB_transform_feedback2; + continue; + } +#endif +#ifdef GL_ARB_transform_feedback3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3", 19)) + { + ret = GLEW_ARB_transform_feedback3; + continue; + } +#endif +#ifdef GL_ARB_transform_feedback_instanced + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback_instanced", 28)) + { + ret = GLEW_ARB_transform_feedback_instanced; + continue; + } +#endif +#ifdef GL_ARB_transform_feedback_overflow_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback_overflow_query", 33)) + { + ret = GLEW_ARB_transform_feedback_overflow_query; + continue; + } +#endif +#ifdef GL_ARB_transpose_matrix + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transpose_matrix", 16)) + { + ret = GLEW_ARB_transpose_matrix; + continue; + } +#endif +#ifdef GL_ARB_uniform_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"uniform_buffer_object", 21)) + { + ret = GLEW_ARB_uniform_buffer_object; + continue; + } +#endif +#ifdef GL_ARB_vertex_array_bgra + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_bgra", 17)) + { + ret = GLEW_ARB_vertex_array_bgra; + continue; + } +#endif +#ifdef GL_ARB_vertex_array_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) + { + ret = GLEW_ARB_vertex_array_object; + continue; + } +#endif +#ifdef GL_ARB_vertex_attrib_64bit + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19)) + { + ret = GLEW_ARB_vertex_attrib_64bit; + continue; + } +#endif +#ifdef GL_ARB_vertex_attrib_binding + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_binding", 21)) + { + ret = GLEW_ARB_vertex_attrib_binding; + continue; + } +#endif +#ifdef GL_ARB_vertex_blend + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_blend", 12)) + { + ret = GLEW_ARB_vertex_blend; + continue; + } +#endif +#ifdef GL_ARB_vertex_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20)) + { + ret = GLEW_ARB_vertex_buffer_object; + continue; + } +#endif +#ifdef GL_ARB_vertex_program + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) + { + ret = GLEW_ARB_vertex_program; + continue; + } +#endif +#ifdef GL_ARB_vertex_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) + { + ret = GLEW_ARB_vertex_shader; + continue; + } +#endif +#ifdef GL_ARB_vertex_type_10f_11f_11f_rev + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_10f_11f_11f_rev", 27)) + { + ret = GLEW_ARB_vertex_type_10f_11f_11f_rev; + continue; + } +#endif +#ifdef GL_ARB_vertex_type_2_10_10_10_rev + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_2_10_10_10_rev", 26)) + { + ret = GLEW_ARB_vertex_type_2_10_10_10_rev; + continue; + } +#endif +#ifdef GL_ARB_viewport_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array", 14)) + { + ret = GLEW_ARB_viewport_array; + continue; + } +#endif +#ifdef GL_ARB_window_pos + if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) + { + ret = GLEW_ARB_window_pos; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARM_", 4)) + { +#ifdef GL_ARM_mali_program_binary + if (_glewStrSame3(&pos, &len, (const GLubyte*)"mali_program_binary", 19)) + { + ret = GLEW_ARM_mali_program_binary; + continue; + } +#endif +#ifdef GL_ARM_mali_shader_binary + if (_glewStrSame3(&pos, &len, (const GLubyte*)"mali_shader_binary", 18)) + { + ret = GLEW_ARM_mali_shader_binary; + continue; + } +#endif +#ifdef GL_ARM_rgba8 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"rgba8", 5)) + { + ret = GLEW_ARM_rgba8; + continue; + } +#endif +#ifdef GL_ARM_shader_framebuffer_fetch + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_framebuffer_fetch", 24)) + { + ret = GLEW_ARM_shader_framebuffer_fetch; + continue; + } +#endif +#ifdef GL_ARM_shader_framebuffer_fetch_depth_stencil + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_framebuffer_fetch_depth_stencil", 38)) + { + ret = GLEW_ARM_shader_framebuffer_fetch_depth_stencil; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATIX_", 5)) + { +#ifdef GL_ATIX_point_sprites + if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprites", 13)) + { + ret = GLEW_ATIX_point_sprites; + continue; + } +#endif +#ifdef GL_ATIX_texture_env_combine3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) + { + ret = GLEW_ATIX_texture_env_combine3; + continue; + } +#endif +#ifdef GL_ATIX_texture_env_route + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_route", 17)) + { + ret = GLEW_ATIX_texture_env_route; + continue; + } +#endif +#ifdef GL_ATIX_vertex_shader_output_point_size + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_output_point_size", 31)) + { + ret = GLEW_ATIX_vertex_shader_output_point_size; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) + { +#ifdef GL_ATI_draw_buffers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) + { + ret = GLEW_ATI_draw_buffers; + continue; + } +#endif +#ifdef GL_ATI_element_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) + { + ret = GLEW_ATI_element_array; + continue; + } +#endif +#ifdef GL_ATI_envmap_bumpmap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"envmap_bumpmap", 14)) + { + ret = GLEW_ATI_envmap_bumpmap; + continue; + } +#endif +#ifdef GL_ATI_fragment_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) + { + ret = GLEW_ATI_fragment_shader; + continue; + } +#endif +#ifdef GL_ATI_map_object_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_object_buffer", 17)) + { + ret = GLEW_ATI_map_object_buffer; + continue; + } +#endif +#ifdef GL_ATI_meminfo + if (_glewStrSame3(&pos, &len, (const GLubyte*)"meminfo", 7)) + { + ret = GLEW_ATI_meminfo; + continue; + } +#endif +#ifdef GL_ATI_pn_triangles + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pn_triangles", 12)) + { + ret = GLEW_ATI_pn_triangles; + continue; + } +#endif +#ifdef GL_ATI_separate_stencil + if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_stencil", 16)) + { + ret = GLEW_ATI_separate_stencil; + continue; + } +#endif +#ifdef GL_ATI_shader_texture_lod + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) + { + ret = GLEW_ATI_shader_texture_lod; + continue; + } +#endif +#ifdef GL_ATI_text_fragment_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"text_fragment_shader", 20)) + { + ret = GLEW_ATI_text_fragment_shader; + continue; + } +#endif +#ifdef GL_ATI_texture_compression_3dc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_3dc", 23)) + { + ret = GLEW_ATI_texture_compression_3dc; + continue; + } +#endif +#ifdef GL_ATI_texture_env_combine3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) + { + ret = GLEW_ATI_texture_env_combine3; + continue; + } +#endif +#ifdef GL_ATI_texture_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) + { + ret = GLEW_ATI_texture_float; + continue; + } +#endif +#ifdef GL_ATI_texture_mirror_once + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_once", 19)) + { + ret = GLEW_ATI_texture_mirror_once; + continue; + } +#endif +#ifdef GL_ATI_vertex_array_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) + { + ret = GLEW_ATI_vertex_array_object; + continue; + } +#endif +#ifdef GL_ATI_vertex_attrib_array_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_array_object", 26)) + { + ret = GLEW_ATI_vertex_attrib_array_object; + continue; + } +#endif +#ifdef GL_ATI_vertex_streams + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_streams", 14)) + { + ret = GLEW_ATI_vertex_streams; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"EGL_", 4)) + { +#ifdef GL_EGL_KHR_context_flush_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"KHR_context_flush_control", 25)) + { + ret = GLEW_EGL_KHR_context_flush_control; + continue; + } +#endif +#ifdef GL_EGL_NV_robustness_video_memory_purge + if (_glewStrSame3(&pos, &len, (const GLubyte*)"NV_robustness_video_memory_purge", 32)) + { + ret = GLEW_EGL_NV_robustness_video_memory_purge; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) + { +#ifdef GL_EXT_422_pixels + if (_glewStrSame3(&pos, &len, (const GLubyte*)"422_pixels", 10)) + { + ret = GLEW_EXT_422_pixels; + continue; + } +#endif +#ifdef GL_EXT_Cg_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"Cg_shader", 9)) + { + ret = GLEW_EXT_Cg_shader; + continue; + } +#endif +#ifdef GL_EXT_EGL_image_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"EGL_image_array", 15)) + { + ret = GLEW_EXT_EGL_image_array; + continue; + } +#endif +#ifdef GL_EXT_YUV_target + if (_glewStrSame3(&pos, &len, (const GLubyte*)"YUV_target", 10)) + { + ret = GLEW_EXT_YUV_target; + continue; + } +#endif +#ifdef GL_EXT_abgr + if (_glewStrSame3(&pos, &len, (const GLubyte*)"abgr", 4)) + { + ret = GLEW_EXT_abgr; + continue; + } +#endif +#ifdef GL_EXT_base_instance + if (_glewStrSame3(&pos, &len, (const GLubyte*)"base_instance", 13)) + { + ret = GLEW_EXT_base_instance; + continue; + } +#endif +#ifdef GL_EXT_bgra + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bgra", 4)) + { + ret = GLEW_EXT_bgra; + continue; + } +#endif +#ifdef GL_EXT_bindable_uniform + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindable_uniform", 16)) + { + ret = GLEW_EXT_bindable_uniform; + continue; + } +#endif +#ifdef GL_EXT_blend_color + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_color", 11)) + { + ret = GLEW_EXT_blend_color; + continue; + } +#endif +#ifdef GL_EXT_blend_equation_separate + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_separate", 23)) + { + ret = GLEW_EXT_blend_equation_separate; + continue; + } +#endif +#ifdef GL_EXT_blend_func_extended + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_extended", 19)) + { + ret = GLEW_EXT_blend_func_extended; + continue; + } +#endif +#ifdef GL_EXT_blend_func_separate + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_separate", 19)) + { + ret = GLEW_EXT_blend_func_separate; + continue; + } +#endif +#ifdef GL_EXT_blend_logic_op + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_logic_op", 14)) + { + ret = GLEW_EXT_blend_logic_op; + continue; + } +#endif +#ifdef GL_EXT_blend_minmax + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax", 12)) + { + ret = GLEW_EXT_blend_minmax; + continue; + } +#endif +#ifdef GL_EXT_blend_subtract + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_subtract", 14)) + { + ret = GLEW_EXT_blend_subtract; + continue; + } +#endif +#ifdef GL_EXT_buffer_storage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_storage", 14)) + { + ret = GLEW_EXT_buffer_storage; + continue; + } +#endif +#ifdef GL_EXT_clear_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_texture", 13)) + { + ret = GLEW_EXT_clear_texture; + continue; + } +#endif +#ifdef GL_EXT_clip_cull_distance + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_cull_distance", 18)) + { + ret = GLEW_EXT_clip_cull_distance; + continue; + } +#endif +#ifdef GL_EXT_clip_volume_hint + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_volume_hint", 16)) + { + ret = GLEW_EXT_clip_volume_hint; + continue; + } +#endif +#ifdef GL_EXT_cmyka + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cmyka", 5)) + { + ret = GLEW_EXT_cmyka; + continue; + } +#endif +#ifdef GL_EXT_color_buffer_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_float", 18)) + { + ret = GLEW_EXT_color_buffer_float; + continue; + } +#endif +#ifdef GL_EXT_color_buffer_half_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_half_float", 23)) + { + ret = GLEW_EXT_color_buffer_half_float; + continue; + } +#endif +#ifdef GL_EXT_color_subtable + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_subtable", 14)) + { + ret = GLEW_EXT_color_subtable; + continue; + } +#endif +#ifdef GL_EXT_compiled_vertex_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compiled_vertex_array", 21)) + { + ret = GLEW_EXT_compiled_vertex_array; + continue; + } +#endif +#ifdef GL_EXT_compressed_ETC1_RGB8_sub_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_ETC1_RGB8_sub_texture", 32)) + { + ret = GLEW_EXT_compressed_ETC1_RGB8_sub_texture; + continue; + } +#endif +#ifdef GL_EXT_conservative_depth + if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) + { + ret = GLEW_EXT_conservative_depth; + continue; + } +#endif +#ifdef GL_EXT_convolution + if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution", 11)) + { + ret = GLEW_EXT_convolution; + continue; + } +#endif +#ifdef GL_EXT_coordinate_frame + if (_glewStrSame3(&pos, &len, (const GLubyte*)"coordinate_frame", 16)) + { + ret = GLEW_EXT_coordinate_frame; + continue; + } +#endif +#ifdef GL_EXT_copy_image + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) + { + ret = GLEW_EXT_copy_image; + continue; + } +#endif +#ifdef GL_EXT_copy_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_texture", 12)) + { + ret = GLEW_EXT_copy_texture; + continue; + } +#endif +#ifdef GL_EXT_cull_vertex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) + { + ret = GLEW_EXT_cull_vertex; + continue; + } +#endif +#ifdef GL_EXT_debug_label + if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_label", 11)) + { + ret = GLEW_EXT_debug_label; + continue; + } +#endif +#ifdef GL_EXT_debug_marker + if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_marker", 12)) + { + ret = GLEW_EXT_debug_marker; + continue; + } +#endif +#ifdef GL_EXT_depth_bounds_test + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_bounds_test", 17)) + { + ret = GLEW_EXT_depth_bounds_test; + continue; + } +#endif +#ifdef GL_EXT_direct_state_access + if (_glewStrSame3(&pos, &len, (const GLubyte*)"direct_state_access", 19)) + { + ret = GLEW_EXT_direct_state_access; + continue; + } +#endif +#ifdef GL_EXT_discard_framebuffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"discard_framebuffer", 19)) + { + ret = GLEW_EXT_discard_framebuffer; + continue; + } +#endif +#ifdef GL_EXT_draw_buffers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) + { + ret = GLEW_EXT_draw_buffers; + continue; + } +#endif +#ifdef GL_EXT_draw_buffers2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers2", 13)) + { + ret = GLEW_EXT_draw_buffers2; + continue; + } +#endif +#ifdef GL_EXT_draw_buffers_indexed + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_indexed", 20)) + { + ret = GLEW_EXT_draw_buffers_indexed; + continue; + } +#endif +#ifdef GL_EXT_draw_elements_base_vertex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_elements_base_vertex", 25)) + { + ret = GLEW_EXT_draw_elements_base_vertex; + continue; + } +#endif +#ifdef GL_EXT_draw_instanced + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) + { + ret = GLEW_EXT_draw_instanced; + continue; + } +#endif +#ifdef GL_EXT_draw_range_elements + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_range_elements", 19)) + { + ret = GLEW_EXT_draw_range_elements; + continue; + } +#endif +#ifdef GL_EXT_external_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"external_buffer", 15)) + { + ret = GLEW_EXT_external_buffer; + continue; + } +#endif +#ifdef GL_EXT_float_blend + if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_blend", 11)) + { + ret = GLEW_EXT_float_blend; + continue; + } +#endif +#ifdef GL_EXT_fog_coord + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_coord", 9)) + { + ret = GLEW_EXT_fog_coord; + continue; + } +#endif +#ifdef GL_EXT_frag_depth + if (_glewStrSame3(&pos, &len, (const GLubyte*)"frag_depth", 10)) + { + ret = GLEW_EXT_frag_depth; + continue; + } +#endif +#ifdef GL_EXT_fragment_lighting + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_lighting", 17)) + { + ret = GLEW_EXT_fragment_lighting; + continue; + } +#endif +#ifdef GL_EXT_framebuffer_blit + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) + { + ret = GLEW_EXT_framebuffer_blit; + continue; + } +#endif +#ifdef GL_EXT_framebuffer_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) + { + ret = GLEW_EXT_framebuffer_multisample; + continue; + } +#endif +#ifdef GL_EXT_framebuffer_multisample_blit_scaled + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_blit_scaled", 35)) + { + ret = GLEW_EXT_framebuffer_multisample_blit_scaled; + continue; + } +#endif +#ifdef GL_EXT_framebuffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18)) + { + ret = GLEW_EXT_framebuffer_object; + continue; + } +#endif +#ifdef GL_EXT_framebuffer_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) + { + ret = GLEW_EXT_framebuffer_sRGB; + continue; + } +#endif +#ifdef GL_EXT_geometry_point_size + if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_point_size", 19)) + { + ret = GLEW_EXT_geometry_point_size; + continue; + } +#endif +#ifdef GL_EXT_geometry_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader", 15)) + { + ret = GLEW_EXT_geometry_shader; + continue; + } +#endif +#ifdef GL_EXT_geometry_shader4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) + { + ret = GLEW_EXT_geometry_shader4; + continue; + } +#endif +#ifdef GL_EXT_gpu_program_parameters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_parameters", 22)) + { + ret = GLEW_EXT_gpu_program_parameters; + continue; + } +#endif +#ifdef GL_EXT_gpu_shader4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader4", 11)) + { + ret = GLEW_EXT_gpu_shader4; + continue; + } +#endif +#ifdef GL_EXT_gpu_shader5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) + { + ret = GLEW_EXT_gpu_shader5; + continue; + } +#endif +#ifdef GL_EXT_histogram + if (_glewStrSame3(&pos, &len, (const GLubyte*)"histogram", 9)) + { + ret = GLEW_EXT_histogram; + continue; + } +#endif +#ifdef GL_EXT_index_array_formats + if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_array_formats", 19)) + { + ret = GLEW_EXT_index_array_formats; + continue; + } +#endif +#ifdef GL_EXT_index_func + if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_func", 10)) + { + ret = GLEW_EXT_index_func; + continue; + } +#endif +#ifdef GL_EXT_index_material + if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_material", 14)) + { + ret = GLEW_EXT_index_material; + continue; + } +#endif +#ifdef GL_EXT_index_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_texture", 13)) + { + ret = GLEW_EXT_index_texture; + continue; + } +#endif +#ifdef GL_EXT_instanced_arrays + if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) + { + ret = GLEW_EXT_instanced_arrays; + continue; + } +#endif +#ifdef GL_EXT_light_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_texture", 13)) + { + ret = GLEW_EXT_light_texture; + continue; + } +#endif +#ifdef GL_EXT_map_buffer_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_range", 16)) + { + ret = GLEW_EXT_map_buffer_range; + continue; + } +#endif +#ifdef GL_EXT_memory_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"memory_object", 13)) + { + ret = GLEW_EXT_memory_object; + continue; + } +#endif +#ifdef GL_EXT_memory_object_fd + if (_glewStrSame3(&pos, &len, (const GLubyte*)"memory_object_fd", 16)) + { + ret = GLEW_EXT_memory_object_fd; + continue; + } +#endif +#ifdef GL_EXT_memory_object_win32 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"memory_object_win32", 19)) + { + ret = GLEW_EXT_memory_object_win32; + continue; + } +#endif +#ifdef GL_EXT_misc_attribute + if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_attribute", 14)) + { + ret = GLEW_EXT_misc_attribute; + continue; + } +#endif +#ifdef GL_EXT_multi_draw_arrays + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_arrays", 17)) + { + ret = GLEW_EXT_multi_draw_arrays; + continue; + } +#endif +#ifdef GL_EXT_multi_draw_indirect + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) + { + ret = GLEW_EXT_multi_draw_indirect; + continue; + } +#endif +#ifdef GL_EXT_multiple_textures + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiple_textures", 17)) + { + ret = GLEW_EXT_multiple_textures; + continue; + } +#endif +#ifdef GL_EXT_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLEW_EXT_multisample; + continue; + } +#endif +#ifdef GL_EXT_multisample_compatibility + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_compatibility", 25)) + { + ret = GLEW_EXT_multisample_compatibility; + continue; + } +#endif +#ifdef GL_EXT_multisampled_render_to_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisampled_render_to_texture", 30)) + { + ret = GLEW_EXT_multisampled_render_to_texture; + continue; + } +#endif +#ifdef GL_EXT_multisampled_render_to_texture2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisampled_render_to_texture2", 31)) + { + ret = GLEW_EXT_multisampled_render_to_texture2; + continue; + } +#endif +#ifdef GL_EXT_multiview_draw_buffers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview_draw_buffers", 22)) + { + ret = GLEW_EXT_multiview_draw_buffers; + continue; + } +#endif +#ifdef GL_EXT_packed_depth_stencil + if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) + { + ret = GLEW_EXT_packed_depth_stencil; + continue; + } +#endif +#ifdef GL_EXT_packed_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_float", 12)) + { + ret = GLEW_EXT_packed_float; + continue; + } +#endif +#ifdef GL_EXT_packed_pixels + if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_pixels", 13)) + { + ret = GLEW_EXT_packed_pixels; + continue; + } +#endif +#ifdef GL_EXT_paletted_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"paletted_texture", 16)) + { + ret = GLEW_EXT_paletted_texture; + continue; + } +#endif +#ifdef GL_EXT_pixel_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) + { + ret = GLEW_EXT_pixel_buffer_object; + continue; + } +#endif +#ifdef GL_EXT_pixel_transform + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform", 15)) + { + ret = GLEW_EXT_pixel_transform; + continue; + } +#endif +#ifdef GL_EXT_pixel_transform_color_table + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform_color_table", 27)) + { + ret = GLEW_EXT_pixel_transform_color_table; + continue; + } +#endif +#ifdef GL_EXT_point_parameters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) + { + ret = GLEW_EXT_point_parameters; + continue; + } +#endif +#ifdef GL_EXT_polygon_offset + if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset", 14)) + { + ret = GLEW_EXT_polygon_offset; + continue; + } +#endif +#ifdef GL_EXT_polygon_offset_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset_clamp", 20)) + { + ret = GLEW_EXT_polygon_offset_clamp; + continue; + } +#endif +#ifdef GL_EXT_post_depth_coverage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_depth_coverage", 19)) + { + ret = GLEW_EXT_post_depth_coverage; + continue; + } +#endif +#ifdef GL_EXT_provoking_vertex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16)) + { + ret = GLEW_EXT_provoking_vertex; + continue; + } +#endif +#ifdef GL_EXT_pvrtc_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pvrtc_sRGB", 10)) + { + ret = GLEW_EXT_pvrtc_sRGB; + continue; + } +#endif +#ifdef GL_EXT_raster_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"raster_multisample", 18)) + { + ret = GLEW_EXT_raster_multisample; + continue; + } +#endif +#ifdef GL_EXT_read_format_bgra + if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_format_bgra", 16)) + { + ret = GLEW_EXT_read_format_bgra; + continue; + } +#endif +#ifdef GL_EXT_render_snorm + if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_snorm", 12)) + { + ret = GLEW_EXT_render_snorm; + continue; + } +#endif +#ifdef GL_EXT_rescale_normal + if (_glewStrSame3(&pos, &len, (const GLubyte*)"rescale_normal", 14)) + { + ret = GLEW_EXT_rescale_normal; + continue; + } +#endif +#ifdef GL_EXT_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sRGB", 4)) + { + ret = GLEW_EXT_sRGB; + continue; + } +#endif +#ifdef GL_EXT_sRGB_write_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sRGB_write_control", 18)) + { + ret = GLEW_EXT_sRGB_write_control; + continue; + } +#endif +#ifdef GL_EXT_scene_marker + if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) + { + ret = GLEW_EXT_scene_marker; + continue; + } +#endif +#ifdef GL_EXT_secondary_color + if (_glewStrSame3(&pos, &len, (const GLubyte*)"secondary_color", 15)) + { + ret = GLEW_EXT_secondary_color; + continue; + } +#endif +#ifdef GL_EXT_semaphore + if (_glewStrSame3(&pos, &len, (const GLubyte*)"semaphore", 9)) + { + ret = GLEW_EXT_semaphore; + continue; + } +#endif +#ifdef GL_EXT_semaphore_fd + if (_glewStrSame3(&pos, &len, (const GLubyte*)"semaphore_fd", 12)) + { + ret = GLEW_EXT_semaphore_fd; + continue; + } +#endif +#ifdef GL_EXT_semaphore_win32 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"semaphore_win32", 15)) + { + ret = GLEW_EXT_semaphore_win32; + continue; + } +#endif +#ifdef GL_EXT_separate_shader_objects + if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23)) + { + ret = GLEW_EXT_separate_shader_objects; + continue; + } +#endif +#ifdef GL_EXT_separate_specular_color + if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_specular_color", 23)) + { + ret = GLEW_EXT_separate_specular_color; + continue; + } +#endif +#ifdef GL_EXT_shader_framebuffer_fetch + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_framebuffer_fetch", 24)) + { + ret = GLEW_EXT_shader_framebuffer_fetch; + continue; + } +#endif +#ifdef GL_EXT_shader_group_vote + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_group_vote", 17)) + { + ret = GLEW_EXT_shader_group_vote; + continue; + } +#endif +#ifdef GL_EXT_shader_image_load_formatted + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_formatted", 27)) + { + ret = GLEW_EXT_shader_image_load_formatted; + continue; + } +#endif +#ifdef GL_EXT_shader_image_load_store + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23)) + { + ret = GLEW_EXT_shader_image_load_store; + continue; + } +#endif +#ifdef GL_EXT_shader_implicit_conversions + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_implicit_conversions", 27)) + { + ret = GLEW_EXT_shader_implicit_conversions; + continue; + } +#endif +#ifdef GL_EXT_shader_integer_mix + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_integer_mix", 18)) + { + ret = GLEW_EXT_shader_integer_mix; + continue; + } +#endif +#ifdef GL_EXT_shader_io_blocks + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_io_blocks", 16)) + { + ret = GLEW_EXT_shader_io_blocks; + continue; + } +#endif +#ifdef GL_EXT_shader_non_constant_global_initializers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_non_constant_global_initializers", 39)) + { + ret = GLEW_EXT_shader_non_constant_global_initializers; + continue; + } +#endif +#ifdef GL_EXT_shader_pixel_local_storage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_pixel_local_storage", 26)) + { + ret = GLEW_EXT_shader_pixel_local_storage; + continue; + } +#endif +#ifdef GL_EXT_shader_pixel_local_storage2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_pixel_local_storage2", 27)) + { + ret = GLEW_EXT_shader_pixel_local_storage2; + continue; + } +#endif +#ifdef GL_EXT_shader_texture_lod + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) + { + ret = GLEW_EXT_shader_texture_lod; + continue; + } +#endif +#ifdef GL_EXT_shadow_funcs + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_funcs", 12)) + { + ret = GLEW_EXT_shadow_funcs; + continue; + } +#endif +#ifdef GL_EXT_shadow_samplers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_samplers", 15)) + { + ret = GLEW_EXT_shadow_samplers; + continue; + } +#endif +#ifdef GL_EXT_shared_texture_palette + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_texture_palette", 22)) + { + ret = GLEW_EXT_shared_texture_palette; + continue; + } +#endif +#ifdef GL_EXT_sparse_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) + { + ret = GLEW_EXT_sparse_texture; + continue; + } +#endif +#ifdef GL_EXT_sparse_texture2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture2", 15)) + { + ret = GLEW_EXT_sparse_texture2; + continue; + } +#endif +#ifdef GL_EXT_stencil_clear_tag + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_clear_tag", 17)) + { + ret = GLEW_EXT_stencil_clear_tag; + continue; + } +#endif +#ifdef GL_EXT_stencil_two_side + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_two_side", 16)) + { + ret = GLEW_EXT_stencil_two_side; + continue; + } +#endif +#ifdef GL_EXT_stencil_wrap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_wrap", 12)) + { + ret = GLEW_EXT_stencil_wrap; + continue; + } +#endif +#ifdef GL_EXT_subtexture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"subtexture", 10)) + { + ret = GLEW_EXT_subtexture; + continue; + } +#endif +#ifdef GL_EXT_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture", 7)) + { + ret = GLEW_EXT_texture; + continue; + } +#endif +#ifdef GL_EXT_texture3D + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture3D", 9)) + { + ret = GLEW_EXT_texture3D; + continue; + } +#endif +#ifdef GL_EXT_texture_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_array", 13)) + { + ret = GLEW_EXT_texture_array; + continue; + } +#endif +#ifdef GL_EXT_texture_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object", 21)) + { + ret = GLEW_EXT_texture_buffer_object; + continue; + } +#endif +#ifdef GL_EXT_texture_compression_astc_decode_mode + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_decode_mode", 36)) + { + ret = GLEW_EXT_texture_compression_astc_decode_mode; + continue; + } +#endif +#ifdef GL_EXT_texture_compression_astc_decode_mode_rgb9e5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_decode_mode_rgb9e5", 43)) + { + ret = GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5; + continue; + } +#endif +#ifdef GL_EXT_texture_compression_bptc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_bptc", 24)) + { + ret = GLEW_EXT_texture_compression_bptc; + continue; + } +#endif +#ifdef GL_EXT_texture_compression_dxt1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24)) + { + ret = GLEW_EXT_texture_compression_dxt1; + continue; + } +#endif +#ifdef GL_EXT_texture_compression_latc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_latc", 24)) + { + ret = GLEW_EXT_texture_compression_latc; + continue; + } +#endif +#ifdef GL_EXT_texture_compression_rgtc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24)) + { + ret = GLEW_EXT_texture_compression_rgtc; + continue; + } +#endif +#ifdef GL_EXT_texture_compression_s3tc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc", 24)) + { + ret = GLEW_EXT_texture_compression_s3tc; + continue; + } +#endif +#ifdef GL_EXT_texture_cube_map + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) + { + ret = GLEW_EXT_texture_cube_map; + continue; + } +#endif +#ifdef GL_EXT_texture_cube_map_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map_array", 22)) + { + ret = GLEW_EXT_texture_cube_map_array; + continue; + } +#endif +#ifdef GL_EXT_texture_edge_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) + { + ret = GLEW_EXT_texture_edge_clamp; + continue; + } +#endif +#ifdef GL_EXT_texture_env + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env", 11)) + { + ret = GLEW_EXT_texture_env; + continue; + } +#endif +#ifdef GL_EXT_texture_env_add + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) + { + ret = GLEW_EXT_texture_env_add; + continue; + } +#endif +#ifdef GL_EXT_texture_env_combine + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) + { + ret = GLEW_EXT_texture_env_combine; + continue; + } +#endif +#ifdef GL_EXT_texture_env_dot3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) + { + ret = GLEW_EXT_texture_env_dot3; + continue; + } +#endif +#ifdef GL_EXT_texture_filter_anisotropic + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_anisotropic", 26)) + { + ret = GLEW_EXT_texture_filter_anisotropic; + continue; + } +#endif +#ifdef GL_EXT_texture_filter_minmax + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_minmax", 21)) + { + ret = GLEW_EXT_texture_filter_minmax; + continue; + } +#endif +#ifdef GL_EXT_texture_format_BGRA8888 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_format_BGRA8888", 23)) + { + ret = GLEW_EXT_texture_format_BGRA8888; + continue; + } +#endif +#ifdef GL_EXT_texture_integer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_integer", 15)) + { + ret = GLEW_EXT_texture_integer; + continue; + } +#endif +#ifdef GL_EXT_texture_lod_bias + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) + { + ret = GLEW_EXT_texture_lod_bias; + continue; + } +#endif +#ifdef GL_EXT_texture_mirror_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp", 20)) + { + ret = GLEW_EXT_texture_mirror_clamp; + continue; + } +#endif +#ifdef GL_EXT_texture_norm16 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_norm16", 14)) + { + ret = GLEW_EXT_texture_norm16; + continue; + } +#endif +#ifdef GL_EXT_texture_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_object", 14)) + { + ret = GLEW_EXT_texture_object; + continue; + } +#endif +#ifdef GL_EXT_texture_perturb_normal + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_perturb_normal", 22)) + { + ret = GLEW_EXT_texture_perturb_normal; + continue; + } +#endif +#ifdef GL_EXT_texture_rectangle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) + { + ret = GLEW_EXT_texture_rectangle; + continue; + } +#endif +#ifdef GL_EXT_texture_rg + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rg", 10)) + { + ret = GLEW_EXT_texture_rg; + continue; + } +#endif +#ifdef GL_EXT_texture_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB", 12)) + { + ret = GLEW_EXT_texture_sRGB; + continue; + } +#endif +#ifdef GL_EXT_texture_sRGB_R8 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB_R8", 15)) + { + ret = GLEW_EXT_texture_sRGB_R8; + continue; + } +#endif +#ifdef GL_EXT_texture_sRGB_RG8 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB_RG8", 16)) + { + ret = GLEW_EXT_texture_sRGB_RG8; + continue; + } +#endif +#ifdef GL_EXT_texture_sRGB_decode + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB_decode", 19)) + { + ret = GLEW_EXT_texture_sRGB_decode; + continue; + } +#endif +#ifdef GL_EXT_texture_shared_exponent + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shared_exponent", 23)) + { + ret = GLEW_EXT_texture_shared_exponent; + continue; + } +#endif +#ifdef GL_EXT_texture_snorm + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_snorm", 13)) + { + ret = GLEW_EXT_texture_snorm; + continue; + } +#endif +#ifdef GL_EXT_texture_storage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage", 15)) + { + ret = GLEW_EXT_texture_storage; + continue; + } +#endif +#ifdef GL_EXT_texture_swizzle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15)) + { + ret = GLEW_EXT_texture_swizzle; + continue; + } +#endif +#ifdef GL_EXT_texture_type_2_10_10_10_REV + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_type_2_10_10_10_REV", 27)) + { + ret = GLEW_EXT_texture_type_2_10_10_10_REV; + continue; + } +#endif +#ifdef GL_EXT_texture_view + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_view", 12)) + { + ret = GLEW_EXT_texture_view; + continue; + } +#endif +#ifdef GL_EXT_timer_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) + { + ret = GLEW_EXT_timer_query; + continue; + } +#endif +#ifdef GL_EXT_transform_feedback + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback", 18)) + { + ret = GLEW_EXT_transform_feedback; + continue; + } +#endif +#ifdef GL_EXT_unpack_subimage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"unpack_subimage", 15)) + { + ret = GLEW_EXT_unpack_subimage; + continue; + } +#endif +#ifdef GL_EXT_vertex_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array", 12)) + { + ret = GLEW_EXT_vertex_array; + continue; + } +#endif +#ifdef GL_EXT_vertex_array_bgra + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_bgra", 17)) + { + ret = GLEW_EXT_vertex_array_bgra; + continue; + } +#endif +#ifdef GL_EXT_vertex_array_setXXX + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_setXXX", 19)) + { + ret = GLEW_EXT_vertex_array_setXXX; + continue; + } +#endif +#ifdef GL_EXT_vertex_attrib_64bit + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19)) + { + ret = GLEW_EXT_vertex_attrib_64bit; + continue; + } +#endif +#ifdef GL_EXT_vertex_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) + { + ret = GLEW_EXT_vertex_shader; + continue; + } +#endif +#ifdef GL_EXT_vertex_weighting + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_weighting", 16)) + { + ret = GLEW_EXT_vertex_weighting; + continue; + } +#endif +#ifdef GL_EXT_win32_keyed_mutex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"win32_keyed_mutex", 17)) + { + ret = GLEW_EXT_win32_keyed_mutex; + continue; + } +#endif +#ifdef GL_EXT_window_rectangles + if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_rectangles", 17)) + { + ret = GLEW_EXT_window_rectangles; + continue; + } +#endif +#ifdef GL_EXT_x11_sync_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"x11_sync_object", 15)) + { + ret = GLEW_EXT_x11_sync_object; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"GREMEDY_", 8)) + { +#ifdef GL_GREMEDY_frame_terminator + if (_glewStrSame3(&pos, &len, (const GLubyte*)"frame_terminator", 16)) + { + ret = GLEW_GREMEDY_frame_terminator; + continue; + } +#endif +#ifdef GL_GREMEDY_string_marker + if (_glewStrSame3(&pos, &len, (const GLubyte*)"string_marker", 13)) + { + ret = GLEW_GREMEDY_string_marker; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"HP_", 3)) + { +#ifdef GL_HP_convolution_border_modes + if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) + { + ret = GLEW_HP_convolution_border_modes; + continue; + } +#endif +#ifdef GL_HP_image_transform + if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_transform", 15)) + { + ret = GLEW_HP_image_transform; + continue; + } +#endif +#ifdef GL_HP_occlusion_test + if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_test", 14)) + { + ret = GLEW_HP_occlusion_test; + continue; + } +#endif +#ifdef GL_HP_texture_lighting + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lighting", 16)) + { + ret = GLEW_HP_texture_lighting; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"IBM_", 4)) + { +#ifdef GL_IBM_cull_vertex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) + { + ret = GLEW_IBM_cull_vertex; + continue; + } +#endif +#ifdef GL_IBM_multimode_draw_arrays + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multimode_draw_arrays", 21)) + { + ret = GLEW_IBM_multimode_draw_arrays; + continue; + } +#endif +#ifdef GL_IBM_rasterpos_clip + if (_glewStrSame3(&pos, &len, (const GLubyte*)"rasterpos_clip", 14)) + { + ret = GLEW_IBM_rasterpos_clip; + continue; + } +#endif +#ifdef GL_IBM_static_data + if (_glewStrSame3(&pos, &len, (const GLubyte*)"static_data", 11)) + { + ret = GLEW_IBM_static_data; + continue; + } +#endif +#ifdef GL_IBM_texture_mirrored_repeat + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) + { + ret = GLEW_IBM_texture_mirrored_repeat; + continue; + } +#endif +#ifdef GL_IBM_vertex_array_lists + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_lists", 18)) + { + ret = GLEW_IBM_vertex_array_lists; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"INGR_", 5)) + { +#ifdef GL_INGR_color_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_clamp", 11)) + { + ret = GLEW_INGR_color_clamp; + continue; + } +#endif +#ifdef GL_INGR_interlace_read + if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace_read", 14)) + { + ret = GLEW_INGR_interlace_read; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) + { +#ifdef GL_INTEL_conservative_rasterization + if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_rasterization", 26)) + { + ret = GLEW_INTEL_conservative_rasterization; + continue; + } +#endif +#ifdef GL_INTEL_fragment_shader_ordering + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_ordering", 24)) + { + ret = GLEW_INTEL_fragment_shader_ordering; + continue; + } +#endif +#ifdef GL_INTEL_framebuffer_CMAA + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_CMAA", 16)) + { + ret = GLEW_INTEL_framebuffer_CMAA; + continue; + } +#endif +#ifdef GL_INTEL_map_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_texture", 11)) + { + ret = GLEW_INTEL_map_texture; + continue; + } +#endif +#ifdef GL_INTEL_parallel_arrays + if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_arrays", 15)) + { + ret = GLEW_INTEL_parallel_arrays; + continue; + } +#endif +#ifdef GL_INTEL_performance_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"performance_query", 17)) + { + ret = GLEW_INTEL_performance_query; + continue; + } +#endif +#ifdef GL_INTEL_texture_scissor + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scissor", 15)) + { + ret = GLEW_INTEL_texture_scissor; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"KHR_", 4)) + { +#ifdef GL_KHR_blend_equation_advanced + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced", 23)) + { + ret = GLEW_KHR_blend_equation_advanced; + continue; + } +#endif +#ifdef GL_KHR_blend_equation_advanced_coherent + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_coherent", 32)) + { + ret = GLEW_KHR_blend_equation_advanced_coherent; + continue; + } +#endif +#ifdef GL_KHR_context_flush_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) + { + ret = GLEW_KHR_context_flush_control; + continue; + } +#endif +#ifdef GL_KHR_debug + if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug", 5)) + { + ret = GLEW_KHR_debug; + continue; + } +#endif +#ifdef GL_KHR_no_error + if (_glewStrSame3(&pos, &len, (const GLubyte*)"no_error", 8)) + { + ret = GLEW_KHR_no_error; + continue; + } +#endif +#ifdef GL_KHR_parallel_shader_compile + if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_shader_compile", 23)) + { + ret = GLEW_KHR_parallel_shader_compile; + continue; + } +#endif +#ifdef GL_KHR_robust_buffer_access_behavior + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robust_buffer_access_behavior", 29)) + { + ret = GLEW_KHR_robust_buffer_access_behavior; + continue; + } +#endif +#ifdef GL_KHR_robustness + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness", 10)) + { + ret = GLEW_KHR_robustness; + continue; + } +#endif +#ifdef GL_KHR_texture_compression_astc_hdr + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_hdr", 28)) + { + ret = GLEW_KHR_texture_compression_astc_hdr; + continue; + } +#endif +#ifdef GL_KHR_texture_compression_astc_ldr + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_ldr", 28)) + { + ret = GLEW_KHR_texture_compression_astc_ldr; + continue; + } +#endif +#ifdef GL_KHR_texture_compression_astc_sliced_3d + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_sliced_3d", 34)) + { + ret = GLEW_KHR_texture_compression_astc_sliced_3d; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"KTX_", 4)) + { +#ifdef GL_KTX_buffer_region + if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) + { + ret = GLEW_KTX_buffer_region; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESAX_", 6)) + { +#ifdef GL_MESAX_texture_stack + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stack", 13)) + { + ret = GLEW_MESAX_texture_stack; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) + { +#ifdef GL_MESA_pack_invert + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_invert", 11)) + { + ret = GLEW_MESA_pack_invert; + continue; + } +#endif +#ifdef GL_MESA_resize_buffers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"resize_buffers", 14)) + { + ret = GLEW_MESA_resize_buffers; + continue; + } +#endif +#ifdef GL_MESA_shader_integer_functions + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_integer_functions", 24)) + { + ret = GLEW_MESA_shader_integer_functions; + continue; + } +#endif +#ifdef GL_MESA_window_pos + if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) + { + ret = GLEW_MESA_window_pos; + continue; + } +#endif +#ifdef GL_MESA_ycbcr_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_texture", 13)) + { + ret = GLEW_MESA_ycbcr_texture; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"NVX_", 4)) + { +#ifdef GL_NVX_blend_equation_advanced_multi_draw_buffers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_multi_draw_buffers", 42)) + { + ret = GLEW_NVX_blend_equation_advanced_multi_draw_buffers; + continue; + } +#endif +#ifdef GL_NVX_conditional_render + if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18)) + { + ret = GLEW_NVX_conditional_render; + continue; + } +#endif +#ifdef GL_NVX_gpu_memory_info + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_memory_info", 15)) + { + ret = GLEW_NVX_gpu_memory_info; + continue; + } +#endif +#ifdef GL_NVX_linked_gpu_multicast + if (_glewStrSame3(&pos, &len, (const GLubyte*)"linked_gpu_multicast", 20)) + { + ret = GLEW_NVX_linked_gpu_multicast; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) + { +#ifdef GL_NV_3dvision_settings + if (_glewStrSame3(&pos, &len, (const GLubyte*)"3dvision_settings", 17)) + { + ret = GLEW_NV_3dvision_settings; + continue; + } +#endif +#ifdef GL_NV_EGL_stream_consumer_external + if (_glewStrSame3(&pos, &len, (const GLubyte*)"EGL_stream_consumer_external", 28)) + { + ret = GLEW_NV_EGL_stream_consumer_external; + continue; + } +#endif +#ifdef GL_NV_alpha_to_coverage_dither_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"alpha_to_coverage_dither_control", 32)) + { + ret = GLEW_NV_alpha_to_coverage_dither_control; + continue; + } +#endif +#ifdef GL_NV_bgr + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bgr", 3)) + { + ret = GLEW_NV_bgr; + continue; + } +#endif +#ifdef GL_NV_bindless_multi_draw_indirect + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_multi_draw_indirect", 28)) + { + ret = GLEW_NV_bindless_multi_draw_indirect; + continue; + } +#endif +#ifdef GL_NV_bindless_multi_draw_indirect_count + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_multi_draw_indirect_count", 34)) + { + ret = GLEW_NV_bindless_multi_draw_indirect_count; + continue; + } +#endif +#ifdef GL_NV_bindless_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) + { + ret = GLEW_NV_bindless_texture; + continue; + } +#endif +#ifdef GL_NV_blend_equation_advanced + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced", 23)) + { + ret = GLEW_NV_blend_equation_advanced; + continue; + } +#endif +#ifdef GL_NV_blend_equation_advanced_coherent + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_coherent", 32)) + { + ret = GLEW_NV_blend_equation_advanced_coherent; + continue; + } +#endif +#ifdef GL_NV_blend_minmax_factor + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax_factor", 19)) + { + ret = GLEW_NV_blend_minmax_factor; + continue; + } +#endif +#ifdef GL_NV_blend_square + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_square", 12)) + { + ret = GLEW_NV_blend_square; + continue; + } +#endif +#ifdef GL_NV_clip_space_w_scaling + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_space_w_scaling", 20)) + { + ret = GLEW_NV_clip_space_w_scaling; + continue; + } +#endif +#ifdef GL_NV_command_list + if (_glewStrSame3(&pos, &len, (const GLubyte*)"command_list", 12)) + { + ret = GLEW_NV_command_list; + continue; + } +#endif +#ifdef GL_NV_compute_program5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_program5", 16)) + { + ret = GLEW_NV_compute_program5; + continue; + } +#endif +#ifdef GL_NV_conditional_render + if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18)) + { + ret = GLEW_NV_conditional_render; + continue; + } +#endif +#ifdef GL_NV_conservative_raster + if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster", 19)) + { + ret = GLEW_NV_conservative_raster; + continue; + } +#endif +#ifdef GL_NV_conservative_raster_dilate + if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster_dilate", 26)) + { + ret = GLEW_NV_conservative_raster_dilate; + continue; + } +#endif +#ifdef GL_NV_conservative_raster_pre_snap_triangles + if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster_pre_snap_triangles", 38)) + { + ret = GLEW_NV_conservative_raster_pre_snap_triangles; + continue; + } +#endif +#ifdef GL_NV_copy_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11)) + { + ret = GLEW_NV_copy_buffer; + continue; + } +#endif +#ifdef GL_NV_copy_depth_to_color + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_depth_to_color", 19)) + { + ret = GLEW_NV_copy_depth_to_color; + continue; + } +#endif +#ifdef GL_NV_copy_image + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) + { + ret = GLEW_NV_copy_image; + continue; + } +#endif +#ifdef GL_NV_deep_texture3D + if (_glewStrSame3(&pos, &len, (const GLubyte*)"deep_texture3D", 14)) + { + ret = GLEW_NV_deep_texture3D; + continue; + } +#endif +#ifdef GL_NV_depth_buffer_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18)) + { + ret = GLEW_NV_depth_buffer_float; + continue; + } +#endif +#ifdef GL_NV_depth_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11)) + { + ret = GLEW_NV_depth_clamp; + continue; + } +#endif +#ifdef GL_NV_depth_range_unclamped + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_range_unclamped", 21)) + { + ret = GLEW_NV_depth_range_unclamped; + continue; + } +#endif +#ifdef GL_NV_draw_buffers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) + { + ret = GLEW_NV_draw_buffers; + continue; + } +#endif +#ifdef GL_NV_draw_instanced + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) + { + ret = GLEW_NV_draw_instanced; + continue; + } +#endif +#ifdef GL_NV_draw_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_texture", 12)) + { + ret = GLEW_NV_draw_texture; + continue; + } +#endif +#ifdef GL_NV_draw_vulkan_image + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_vulkan_image", 17)) + { + ret = GLEW_NV_draw_vulkan_image; + continue; + } +#endif +#ifdef GL_NV_evaluators + if (_glewStrSame3(&pos, &len, (const GLubyte*)"evaluators", 10)) + { + ret = GLEW_NV_evaluators; + continue; + } +#endif +#ifdef GL_NV_explicit_attrib_location + if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_attrib_location", 24)) + { + ret = GLEW_NV_explicit_attrib_location; + continue; + } +#endif +#ifdef GL_NV_explicit_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_multisample", 20)) + { + ret = GLEW_NV_explicit_multisample; + continue; + } +#endif +#ifdef GL_NV_fbo_color_attachments + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbo_color_attachments", 21)) + { + ret = GLEW_NV_fbo_color_attachments; + continue; + } +#endif +#ifdef GL_NV_fence + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) + { + ret = GLEW_NV_fence; + continue; + } +#endif +#ifdef GL_NV_fill_rectangle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fill_rectangle", 14)) + { + ret = GLEW_NV_fill_rectangle; + continue; + } +#endif +#ifdef GL_NV_float_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) + { + ret = GLEW_NV_float_buffer; + continue; + } +#endif +#ifdef GL_NV_fog_distance + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_distance", 12)) + { + ret = GLEW_NV_fog_distance; + continue; + } +#endif +#ifdef GL_NV_fragment_coverage_to_color + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_coverage_to_color", 26)) + { + ret = GLEW_NV_fragment_coverage_to_color; + continue; + } +#endif +#ifdef GL_NV_fragment_program + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) + { + ret = GLEW_NV_fragment_program; + continue; + } +#endif +#ifdef GL_NV_fragment_program2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program2", 17)) + { + ret = GLEW_NV_fragment_program2; + continue; + } +#endif +#ifdef GL_NV_fragment_program4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program4", 17)) + { + ret = GLEW_NV_fragment_program4; + continue; + } +#endif +#ifdef GL_NV_fragment_program_option + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_option", 23)) + { + ret = GLEW_NV_fragment_program_option; + continue; + } +#endif +#ifdef GL_NV_fragment_shader_interlock + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_interlock", 25)) + { + ret = GLEW_NV_fragment_shader_interlock; + continue; + } +#endif +#ifdef GL_NV_framebuffer_blit + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) + { + ret = GLEW_NV_framebuffer_blit; + continue; + } +#endif +#ifdef GL_NV_framebuffer_mixed_samples + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_mixed_samples", 25)) + { + ret = GLEW_NV_framebuffer_mixed_samples; + continue; + } +#endif +#ifdef GL_NV_framebuffer_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) + { + ret = GLEW_NV_framebuffer_multisample; + continue; + } +#endif +#ifdef GL_NV_framebuffer_multisample_coverage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_coverage", 32)) + { + ret = GLEW_NV_framebuffer_multisample_coverage; + continue; + } +#endif +#ifdef GL_NV_generate_mipmap_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"generate_mipmap_sRGB", 20)) + { + ret = GLEW_NV_generate_mipmap_sRGB; + continue; + } +#endif +#ifdef GL_NV_geometry_program4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_program4", 17)) + { + ret = GLEW_NV_geometry_program4; + continue; + } +#endif +#ifdef GL_NV_geometry_shader4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) + { + ret = GLEW_NV_geometry_shader4; + continue; + } +#endif +#ifdef GL_NV_geometry_shader_passthrough + if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader_passthrough", 27)) + { + ret = GLEW_NV_geometry_shader_passthrough; + continue; + } +#endif +#ifdef GL_NV_gpu_multicast + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_multicast", 13)) + { + ret = GLEW_NV_gpu_multicast; + continue; + } +#endif +#ifdef GL_NV_gpu_program4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program4", 12)) + { + ret = GLEW_NV_gpu_program4; + continue; + } +#endif +#ifdef GL_NV_gpu_program5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5", 12)) + { + ret = GLEW_NV_gpu_program5; + continue; + } +#endif +#ifdef GL_NV_gpu_program5_mem_extended + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5_mem_extended", 25)) + { + ret = GLEW_NV_gpu_program5_mem_extended; + continue; + } +#endif +#ifdef GL_NV_gpu_program_fp64 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_fp64", 16)) + { + ret = GLEW_NV_gpu_program_fp64; + continue; + } +#endif +#ifdef GL_NV_gpu_shader5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) + { + ret = GLEW_NV_gpu_shader5; + continue; + } +#endif +#ifdef GL_NV_half_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float", 10)) + { + ret = GLEW_NV_half_float; + continue; + } +#endif +#ifdef GL_NV_image_formats + if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_formats", 13)) + { + ret = GLEW_NV_image_formats; + continue; + } +#endif +#ifdef GL_NV_instanced_arrays + if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) + { + ret = GLEW_NV_instanced_arrays; + continue; + } +#endif +#ifdef GL_NV_internalformat_sample_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_sample_query", 27)) + { + ret = GLEW_NV_internalformat_sample_query; + continue; + } +#endif +#ifdef GL_NV_light_max_exponent + if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_max_exponent", 18)) + { + ret = GLEW_NV_light_max_exponent; + continue; + } +#endif +#ifdef GL_NV_multisample_coverage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) + { + ret = GLEW_NV_multisample_coverage; + continue; + } +#endif +#ifdef GL_NV_multisample_filter_hint + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_filter_hint", 23)) + { + ret = GLEW_NV_multisample_filter_hint; + continue; + } +#endif +#ifdef GL_NV_non_square_matrices + if (_glewStrSame3(&pos, &len, (const GLubyte*)"non_square_matrices", 19)) + { + ret = GLEW_NV_non_square_matrices; + continue; + } +#endif +#ifdef GL_NV_occlusion_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) + { + ret = GLEW_NV_occlusion_query; + continue; + } +#endif +#ifdef GL_NV_pack_subimage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_subimage", 13)) + { + ret = GLEW_NV_pack_subimage; + continue; + } +#endif +#ifdef GL_NV_packed_depth_stencil + if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) + { + ret = GLEW_NV_packed_depth_stencil; + continue; + } +#endif +#ifdef GL_NV_packed_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_float", 12)) + { + ret = GLEW_NV_packed_float; + continue; + } +#endif +#ifdef GL_NV_packed_float_linear + if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_float_linear", 19)) + { + ret = GLEW_NV_packed_float_linear; + continue; + } +#endif +#ifdef GL_NV_parameter_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object", 23)) + { + ret = GLEW_NV_parameter_buffer_object; + continue; + } +#endif +#ifdef GL_NV_parameter_buffer_object2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object2", 24)) + { + ret = GLEW_NV_parameter_buffer_object2; + continue; + } +#endif +#ifdef GL_NV_path_rendering + if (_glewStrSame3(&pos, &len, (const GLubyte*)"path_rendering", 14)) + { + ret = GLEW_NV_path_rendering; + continue; + } +#endif +#ifdef GL_NV_path_rendering_shared_edge + if (_glewStrSame3(&pos, &len, (const GLubyte*)"path_rendering_shared_edge", 26)) + { + ret = GLEW_NV_path_rendering_shared_edge; + continue; + } +#endif +#ifdef GL_NV_pixel_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) + { + ret = GLEW_NV_pixel_buffer_object; + continue; + } +#endif +#ifdef GL_NV_pixel_data_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_data_range", 16)) + { + ret = GLEW_NV_pixel_data_range; + continue; + } +#endif +#ifdef GL_NV_platform_binary + if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_binary", 15)) + { + ret = GLEW_NV_platform_binary; + continue; + } +#endif +#ifdef GL_NV_point_sprite + if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) + { + ret = GLEW_NV_point_sprite; + continue; + } +#endif +#ifdef GL_NV_polygon_mode + if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_mode", 12)) + { + ret = GLEW_NV_polygon_mode; + continue; + } +#endif +#ifdef GL_NV_present_video + if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) + { + ret = GLEW_NV_present_video; + continue; + } +#endif +#ifdef GL_NV_primitive_restart + if (_glewStrSame3(&pos, &len, (const GLubyte*)"primitive_restart", 17)) + { + ret = GLEW_NV_primitive_restart; + continue; + } +#endif +#ifdef GL_NV_read_depth + if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_depth", 10)) + { + ret = GLEW_NV_read_depth; + continue; + } +#endif +#ifdef GL_NV_read_depth_stencil + if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_depth_stencil", 18)) + { + ret = GLEW_NV_read_depth_stencil; + continue; + } +#endif +#ifdef GL_NV_read_stencil + if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_stencil", 12)) + { + ret = GLEW_NV_read_stencil; + continue; + } +#endif +#ifdef GL_NV_register_combiners + if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners", 18)) + { + ret = GLEW_NV_register_combiners; + continue; + } +#endif +#ifdef GL_NV_register_combiners2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners2", 19)) + { + ret = GLEW_NV_register_combiners2; + continue; + } +#endif +#ifdef GL_NV_robustness_video_memory_purge + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_video_memory_purge", 29)) + { + ret = GLEW_NV_robustness_video_memory_purge; + continue; + } +#endif +#ifdef GL_NV_sRGB_formats + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sRGB_formats", 12)) + { + ret = GLEW_NV_sRGB_formats; + continue; + } +#endif +#ifdef GL_NV_sample_locations + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_locations", 16)) + { + ret = GLEW_NV_sample_locations; + continue; + } +#endif +#ifdef GL_NV_sample_mask_override_coverage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_mask_override_coverage", 29)) + { + ret = GLEW_NV_sample_mask_override_coverage; + continue; + } +#endif +#ifdef GL_NV_shader_atomic_counters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counters", 22)) + { + ret = GLEW_NV_shader_atomic_counters; + continue; + } +#endif +#ifdef GL_NV_shader_atomic_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_float", 19)) + { + ret = GLEW_NV_shader_atomic_float; + continue; + } +#endif +#ifdef GL_NV_shader_atomic_float64 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_float64", 21)) + { + ret = GLEW_NV_shader_atomic_float64; + continue; + } +#endif +#ifdef GL_NV_shader_atomic_fp16_vector + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_fp16_vector", 25)) + { + ret = GLEW_NV_shader_atomic_fp16_vector; + continue; + } +#endif +#ifdef GL_NV_shader_atomic_int64 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_int64", 19)) + { + ret = GLEW_NV_shader_atomic_int64; + continue; + } +#endif +#ifdef GL_NV_shader_buffer_load + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_buffer_load", 18)) + { + ret = GLEW_NV_shader_buffer_load; + continue; + } +#endif +#ifdef GL_NV_shader_noperspective_interpolation + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_noperspective_interpolation", 34)) + { + ret = GLEW_NV_shader_noperspective_interpolation; + continue; + } +#endif +#ifdef GL_NV_shader_storage_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_storage_buffer_object", 28)) + { + ret = GLEW_NV_shader_storage_buffer_object; + continue; + } +#endif +#ifdef GL_NV_shader_thread_group + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_thread_group", 19)) + { + ret = GLEW_NV_shader_thread_group; + continue; + } +#endif +#ifdef GL_NV_shader_thread_shuffle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_thread_shuffle", 21)) + { + ret = GLEW_NV_shader_thread_shuffle; + continue; + } +#endif +#ifdef GL_NV_shadow_samplers_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_samplers_array", 21)) + { + ret = GLEW_NV_shadow_samplers_array; + continue; + } +#endif +#ifdef GL_NV_shadow_samplers_cube + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_samplers_cube", 20)) + { + ret = GLEW_NV_shadow_samplers_cube; + continue; + } +#endif +#ifdef GL_NV_stereo_view_rendering + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_view_rendering", 21)) + { + ret = GLEW_NV_stereo_view_rendering; + continue; + } +#endif +#ifdef GL_NV_tessellation_program5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_program5", 21)) + { + ret = GLEW_NV_tessellation_program5; + continue; + } +#endif +#ifdef GL_NV_texgen_emboss + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_emboss", 13)) + { + ret = GLEW_NV_texgen_emboss; + continue; + } +#endif +#ifdef GL_NV_texgen_reflection + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_reflection", 17)) + { + ret = GLEW_NV_texgen_reflection; + continue; + } +#endif +#ifdef GL_NV_texture_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_array", 13)) + { + ret = GLEW_NV_texture_array; + continue; + } +#endif +#ifdef GL_NV_texture_barrier + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_barrier", 15)) + { + ret = GLEW_NV_texture_barrier; + continue; + } +#endif +#ifdef GL_NV_texture_border_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) + { + ret = GLEW_NV_texture_border_clamp; + continue; + } +#endif +#ifdef GL_NV_texture_compression_latc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_latc", 24)) + { + ret = GLEW_NV_texture_compression_latc; + continue; + } +#endif +#ifdef GL_NV_texture_compression_s3tc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc", 24)) + { + ret = GLEW_NV_texture_compression_s3tc; + continue; + } +#endif +#ifdef GL_NV_texture_compression_s3tc_update + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc_update", 31)) + { + ret = GLEW_NV_texture_compression_s3tc_update; + continue; + } +#endif +#ifdef GL_NV_texture_compression_vtc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_vtc", 23)) + { + ret = GLEW_NV_texture_compression_vtc; + continue; + } +#endif +#ifdef GL_NV_texture_env_combine4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine4", 20)) + { + ret = GLEW_NV_texture_env_combine4; + continue; + } +#endif +#ifdef GL_NV_texture_expand_normal + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_expand_normal", 21)) + { + ret = GLEW_NV_texture_expand_normal; + continue; + } +#endif +#ifdef GL_NV_texture_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multisample", 19)) + { + ret = GLEW_NV_texture_multisample; + continue; + } +#endif +#ifdef GL_NV_texture_npot_2D_mipmap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_npot_2D_mipmap", 22)) + { + ret = GLEW_NV_texture_npot_2D_mipmap; + continue; + } +#endif +#ifdef GL_NV_texture_rectangle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) + { + ret = GLEW_NV_texture_rectangle; + continue; + } +#endif +#ifdef GL_NV_texture_rectangle_compressed + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle_compressed", 28)) + { + ret = GLEW_NV_texture_rectangle_compressed; + continue; + } +#endif +#ifdef GL_NV_texture_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader", 14)) + { + ret = GLEW_NV_texture_shader; + continue; + } +#endif +#ifdef GL_NV_texture_shader2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader2", 15)) + { + ret = GLEW_NV_texture_shader2; + continue; + } +#endif +#ifdef GL_NV_texture_shader3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader3", 15)) + { + ret = GLEW_NV_texture_shader3; + continue; + } +#endif +#ifdef GL_NV_transform_feedback + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback", 18)) + { + ret = GLEW_NV_transform_feedback; + continue; + } +#endif +#ifdef GL_NV_transform_feedback2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19)) + { + ret = GLEW_NV_transform_feedback2; + continue; + } +#endif +#ifdef GL_NV_uniform_buffer_unified_memory + if (_glewStrSame3(&pos, &len, (const GLubyte*)"uniform_buffer_unified_memory", 29)) + { + ret = GLEW_NV_uniform_buffer_unified_memory; + continue; + } +#endif +#ifdef GL_NV_vdpau_interop + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vdpau_interop", 13)) + { + ret = GLEW_NV_vdpau_interop; + continue; + } +#endif +#ifdef GL_NV_vertex_array_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) + { + ret = GLEW_NV_vertex_array_range; + continue; + } +#endif +#ifdef GL_NV_vertex_array_range2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range2", 19)) + { + ret = GLEW_NV_vertex_array_range2; + continue; + } +#endif +#ifdef GL_NV_vertex_attrib_integer_64bit + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_integer_64bit", 27)) + { + ret = GLEW_NV_vertex_attrib_integer_64bit; + continue; + } +#endif +#ifdef GL_NV_vertex_buffer_unified_memory + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_unified_memory", 28)) + { + ret = GLEW_NV_vertex_buffer_unified_memory; + continue; + } +#endif +#ifdef GL_NV_vertex_program + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) + { + ret = GLEW_NV_vertex_program; + continue; + } +#endif +#ifdef GL_NV_vertex_program1_1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program1_1", 17)) + { + ret = GLEW_NV_vertex_program1_1; + continue; + } +#endif +#ifdef GL_NV_vertex_program2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2", 15)) + { + ret = GLEW_NV_vertex_program2; + continue; + } +#endif +#ifdef GL_NV_vertex_program2_option + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2_option", 22)) + { + ret = GLEW_NV_vertex_program2_option; + continue; + } +#endif +#ifdef GL_NV_vertex_program3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program3", 15)) + { + ret = GLEW_NV_vertex_program3; + continue; + } +#endif +#ifdef GL_NV_vertex_program4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program4", 15)) + { + ret = GLEW_NV_vertex_program4; + continue; + } +#endif +#ifdef GL_NV_video_capture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) + { + ret = GLEW_NV_video_capture; + continue; + } +#endif +#ifdef GL_NV_viewport_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array", 14)) + { + ret = GLEW_NV_viewport_array; + continue; + } +#endif +#ifdef GL_NV_viewport_array2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array2", 15)) + { + ret = GLEW_NV_viewport_array2; + continue; + } +#endif +#ifdef GL_NV_viewport_swizzle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_swizzle", 16)) + { + ret = GLEW_NV_viewport_swizzle; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"OES_", 4)) + { +#ifdef GL_OES_byte_coordinates + if (_glewStrSame3(&pos, &len, (const GLubyte*)"byte_coordinates", 16)) + { + ret = GLEW_OES_byte_coordinates; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) + { +#ifdef GL_OML_interlace + if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) + { + ret = GLEW_OML_interlace; + continue; + } +#endif +#ifdef GL_OML_resample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) + { + ret = GLEW_OML_resample; + continue; + } +#endif +#ifdef GL_OML_subsample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"subsample", 9)) + { + ret = GLEW_OML_subsample; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"OVR_", 4)) + { +#ifdef GL_OVR_multiview + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview", 9)) + { + ret = GLEW_OVR_multiview; + continue; + } +#endif +#ifdef GL_OVR_multiview2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview2", 10)) + { + ret = GLEW_OVR_multiview2; + continue; + } +#endif +#ifdef GL_OVR_multiview_multisampled_render_to_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview_multisampled_render_to_texture", 40)) + { + ret = GLEW_OVR_multiview_multisampled_render_to_texture; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"PGI_", 4)) + { +#ifdef GL_PGI_misc_hints + if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_hints", 10)) + { + ret = GLEW_PGI_misc_hints; + continue; + } +#endif +#ifdef GL_PGI_vertex_hints + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_hints", 12)) + { + ret = GLEW_PGI_vertex_hints; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"QCOM_", 5)) + { +#ifdef GL_QCOM_alpha_test + if (_glewStrSame3(&pos, &len, (const GLubyte*)"alpha_test", 10)) + { + ret = GLEW_QCOM_alpha_test; + continue; + } +#endif +#ifdef GL_QCOM_binning_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"binning_control", 15)) + { + ret = GLEW_QCOM_binning_control; + continue; + } +#endif +#ifdef GL_QCOM_driver_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"driver_control", 14)) + { + ret = GLEW_QCOM_driver_control; + continue; + } +#endif +#ifdef GL_QCOM_extended_get + if (_glewStrSame3(&pos, &len, (const GLubyte*)"extended_get", 12)) + { + ret = GLEW_QCOM_extended_get; + continue; + } +#endif +#ifdef GL_QCOM_extended_get2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"extended_get2", 13)) + { + ret = GLEW_QCOM_extended_get2; + continue; + } +#endif +#ifdef GL_QCOM_framebuffer_foveated + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_foveated", 20)) + { + ret = GLEW_QCOM_framebuffer_foveated; + continue; + } +#endif +#ifdef GL_QCOM_perfmon_global_mode + if (_glewStrSame3(&pos, &len, (const GLubyte*)"perfmon_global_mode", 19)) + { + ret = GLEW_QCOM_perfmon_global_mode; + continue; + } +#endif +#ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_framebuffer_fetch_noncoherent", 36)) + { + ret = GLEW_QCOM_shader_framebuffer_fetch_noncoherent; + continue; + } +#endif +#ifdef GL_QCOM_tiled_rendering + if (_glewStrSame3(&pos, &len, (const GLubyte*)"tiled_rendering", 15)) + { + ret = GLEW_QCOM_tiled_rendering; + continue; + } +#endif +#ifdef GL_QCOM_writeonly_rendering + if (_glewStrSame3(&pos, &len, (const GLubyte*)"writeonly_rendering", 19)) + { + ret = GLEW_QCOM_writeonly_rendering; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"REGAL_", 6)) + { +#ifdef GL_REGAL_ES1_0_compatibility + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_0_compatibility", 19)) + { + ret = GLEW_REGAL_ES1_0_compatibility; + continue; + } +#endif +#ifdef GL_REGAL_ES1_1_compatibility + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_1_compatibility", 19)) + { + ret = GLEW_REGAL_ES1_1_compatibility; + continue; + } +#endif +#ifdef GL_REGAL_enable + if (_glewStrSame3(&pos, &len, (const GLubyte*)"enable", 6)) + { + ret = GLEW_REGAL_enable; + continue; + } +#endif +#ifdef GL_REGAL_error_string + if (_glewStrSame3(&pos, &len, (const GLubyte*)"error_string", 12)) + { + ret = GLEW_REGAL_error_string; + continue; + } +#endif +#ifdef GL_REGAL_extension_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"extension_query", 15)) + { + ret = GLEW_REGAL_extension_query; + continue; + } +#endif +#ifdef GL_REGAL_log + if (_glewStrSame3(&pos, &len, (const GLubyte*)"log", 3)) + { + ret = GLEW_REGAL_log; + continue; + } +#endif +#ifdef GL_REGAL_proc_address + if (_glewStrSame3(&pos, &len, (const GLubyte*)"proc_address", 12)) + { + ret = GLEW_REGAL_proc_address; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"REND_", 5)) + { +#ifdef GL_REND_screen_coordinates + if (_glewStrSame3(&pos, &len, (const GLubyte*)"screen_coordinates", 18)) + { + ret = GLEW_REND_screen_coordinates; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"S3_", 3)) + { +#ifdef GL_S3_s3tc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"s3tc", 4)) + { + ret = GLEW_S3_s3tc; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) + { +#ifdef GL_SGIS_clip_band_hint + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_band_hint", 14)) + { + ret = GLEW_SGIS_clip_band_hint; + continue; + } +#endif +#ifdef GL_SGIS_color_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) + { + ret = GLEW_SGIS_color_range; + continue; + } +#endif +#ifdef GL_SGIS_detail_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"detail_texture", 14)) + { + ret = GLEW_SGIS_detail_texture; + continue; + } +#endif +#ifdef GL_SGIS_fog_function + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_function", 12)) + { + ret = GLEW_SGIS_fog_function; + continue; + } +#endif +#ifdef GL_SGIS_generate_mipmap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"generate_mipmap", 15)) + { + ret = GLEW_SGIS_generate_mipmap; + continue; + } +#endif +#ifdef GL_SGIS_line_texgen + if (_glewStrSame3(&pos, &len, (const GLubyte*)"line_texgen", 11)) + { + ret = GLEW_SGIS_line_texgen; + continue; + } +#endif +#ifdef GL_SGIS_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLEW_SGIS_multisample; + continue; + } +#endif +#ifdef GL_SGIS_multitexture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multitexture", 12)) + { + ret = GLEW_SGIS_multitexture; + continue; + } +#endif +#ifdef GL_SGIS_pixel_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) + { + ret = GLEW_SGIS_pixel_texture; + continue; + } +#endif +#ifdef GL_SGIS_point_line_texgen + if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_line_texgen", 17)) + { + ret = GLEW_SGIS_point_line_texgen; + continue; + } +#endif +#ifdef GL_SGIS_shared_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_multisample", 18)) + { + ret = GLEW_SGIS_shared_multisample; + continue; + } +#endif +#ifdef GL_SGIS_sharpen_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sharpen_texture", 15)) + { + ret = GLEW_SGIS_sharpen_texture; + continue; + } +#endif +#ifdef GL_SGIS_texture4D + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture4D", 9)) + { + ret = GLEW_SGIS_texture4D; + continue; + } +#endif +#ifdef GL_SGIS_texture_border_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) + { + ret = GLEW_SGIS_texture_border_clamp; + continue; + } +#endif +#ifdef GL_SGIS_texture_edge_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) + { + ret = GLEW_SGIS_texture_edge_clamp; + continue; + } +#endif +#ifdef GL_SGIS_texture_filter4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter4", 15)) + { + ret = GLEW_SGIS_texture_filter4; + continue; + } +#endif +#ifdef GL_SGIS_texture_lod + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod", 11)) + { + ret = GLEW_SGIS_texture_lod; + continue; + } +#endif +#ifdef GL_SGIS_texture_select + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_select", 14)) + { + ret = GLEW_SGIS_texture_select; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) + { +#ifdef GL_SGIX_async + if (_glewStrSame3(&pos, &len, (const GLubyte*)"async", 5)) + { + ret = GLEW_SGIX_async; + continue; + } +#endif +#ifdef GL_SGIX_async_histogram + if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_histogram", 15)) + { + ret = GLEW_SGIX_async_histogram; + continue; + } +#endif +#ifdef GL_SGIX_async_pixel + if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_pixel", 11)) + { + ret = GLEW_SGIX_async_pixel; + continue; + } +#endif +#ifdef GL_SGIX_bali_g_instruments + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bali_g_instruments", 18)) + { + ret = GLEW_SGIX_bali_g_instruments; + continue; + } +#endif +#ifdef GL_SGIX_bali_r_instruments + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bali_r_instruments", 18)) + { + ret = GLEW_SGIX_bali_r_instruments; + continue; + } +#endif +#ifdef GL_SGIX_bali_timer_instruments + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bali_timer_instruments", 22)) + { + ret = GLEW_SGIX_bali_timer_instruments; + continue; + } +#endif +#ifdef GL_SGIX_blend_alpha_minmax + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_alpha_minmax", 18)) + { + ret = GLEW_SGIX_blend_alpha_minmax; + continue; + } +#endif +#ifdef GL_SGIX_blend_cadd + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_cadd", 10)) + { + ret = GLEW_SGIX_blend_cadd; + continue; + } +#endif +#ifdef GL_SGIX_blend_cmultiply + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_cmultiply", 15)) + { + ret = GLEW_SGIX_blend_cmultiply; + continue; + } +#endif +#ifdef GL_SGIX_calligraphic_fragment + if (_glewStrSame3(&pos, &len, (const GLubyte*)"calligraphic_fragment", 21)) + { + ret = GLEW_SGIX_calligraphic_fragment; + continue; + } +#endif +#ifdef GL_SGIX_clipmap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clipmap", 7)) + { + ret = GLEW_SGIX_clipmap; + continue; + } +#endif +#ifdef GL_SGIX_color_matrix_accuracy + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_matrix_accuracy", 21)) + { + ret = GLEW_SGIX_color_matrix_accuracy; + continue; + } +#endif +#ifdef GL_SGIX_color_table_index_mode + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_table_index_mode", 22)) + { + ret = GLEW_SGIX_color_table_index_mode; + continue; + } +#endif +#ifdef GL_SGIX_complex_polar + if (_glewStrSame3(&pos, &len, (const GLubyte*)"complex_polar", 13)) + { + ret = GLEW_SGIX_complex_polar; + continue; + } +#endif +#ifdef GL_SGIX_convolution_accuracy + if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_accuracy", 20)) + { + ret = GLEW_SGIX_convolution_accuracy; + continue; + } +#endif +#ifdef GL_SGIX_cube_map + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cube_map", 8)) + { + ret = GLEW_SGIX_cube_map; + continue; + } +#endif +#ifdef GL_SGIX_cylinder_texgen + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cylinder_texgen", 15)) + { + ret = GLEW_SGIX_cylinder_texgen; + continue; + } +#endif +#ifdef GL_SGIX_datapipe + if (_glewStrSame3(&pos, &len, (const GLubyte*)"datapipe", 8)) + { + ret = GLEW_SGIX_datapipe; + continue; + } +#endif +#ifdef GL_SGIX_decimation + if (_glewStrSame3(&pos, &len, (const GLubyte*)"decimation", 10)) + { + ret = GLEW_SGIX_decimation; + continue; + } +#endif +#ifdef GL_SGIX_depth_pass_instrument + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_pass_instrument", 21)) + { + ret = GLEW_SGIX_depth_pass_instrument; + continue; + } +#endif +#ifdef GL_SGIX_depth_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) + { + ret = GLEW_SGIX_depth_texture; + continue; + } +#endif +#ifdef GL_SGIX_dvc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"dvc", 3)) + { + ret = GLEW_SGIX_dvc; + continue; + } +#endif +#ifdef GL_SGIX_flush_raster + if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_raster", 12)) + { + ret = GLEW_SGIX_flush_raster; + continue; + } +#endif +#ifdef GL_SGIX_fog_blend + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_blend", 9)) + { + ret = GLEW_SGIX_fog_blend; + continue; + } +#endif +#ifdef GL_SGIX_fog_factor_to_alpha + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_factor_to_alpha", 19)) + { + ret = GLEW_SGIX_fog_factor_to_alpha; + continue; + } +#endif +#ifdef GL_SGIX_fog_layers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_layers", 10)) + { + ret = GLEW_SGIX_fog_layers; + continue; + } +#endif +#ifdef GL_SGIX_fog_offset + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_offset", 10)) + { + ret = GLEW_SGIX_fog_offset; + continue; + } +#endif +#ifdef GL_SGIX_fog_patchy + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_patchy", 10)) + { + ret = GLEW_SGIX_fog_patchy; + continue; + } +#endif +#ifdef GL_SGIX_fog_scale + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_scale", 9)) + { + ret = GLEW_SGIX_fog_scale; + continue; + } +#endif +#ifdef GL_SGIX_fog_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_texture", 11)) + { + ret = GLEW_SGIX_fog_texture; + continue; + } +#endif +#ifdef GL_SGIX_fragment_lighting_space + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_lighting_space", 23)) + { + ret = GLEW_SGIX_fragment_lighting_space; + continue; + } +#endif +#ifdef GL_SGIX_fragment_specular_lighting + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_specular_lighting", 26)) + { + ret = GLEW_SGIX_fragment_specular_lighting; + continue; + } +#endif +#ifdef GL_SGIX_fragments_instrument + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragments_instrument", 20)) + { + ret = GLEW_SGIX_fragments_instrument; + continue; + } +#endif +#ifdef GL_SGIX_framezoom + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framezoom", 9)) + { + ret = GLEW_SGIX_framezoom; + continue; + } +#endif +#ifdef GL_SGIX_icc_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"icc_texture", 11)) + { + ret = GLEW_SGIX_icc_texture; + continue; + } +#endif +#ifdef GL_SGIX_igloo_interface + if (_glewStrSame3(&pos, &len, (const GLubyte*)"igloo_interface", 15)) + { + ret = GLEW_SGIX_igloo_interface; + continue; + } +#endif +#ifdef GL_SGIX_image_compression + if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_compression", 17)) + { + ret = GLEW_SGIX_image_compression; + continue; + } +#endif +#ifdef GL_SGIX_impact_pixel_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"impact_pixel_texture", 20)) + { + ret = GLEW_SGIX_impact_pixel_texture; + continue; + } +#endif +#ifdef GL_SGIX_instrument_error + if (_glewStrSame3(&pos, &len, (const GLubyte*)"instrument_error", 16)) + { + ret = GLEW_SGIX_instrument_error; + continue; + } +#endif +#ifdef GL_SGIX_interlace + if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) + { + ret = GLEW_SGIX_interlace; + continue; + } +#endif +#ifdef GL_SGIX_ir_instrument1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ir_instrument1", 14)) + { + ret = GLEW_SGIX_ir_instrument1; + continue; + } +#endif +#ifdef GL_SGIX_line_quality_hint + if (_glewStrSame3(&pos, &len, (const GLubyte*)"line_quality_hint", 17)) + { + ret = GLEW_SGIX_line_quality_hint; + continue; + } +#endif +#ifdef GL_SGIX_list_priority + if (_glewStrSame3(&pos, &len, (const GLubyte*)"list_priority", 13)) + { + ret = GLEW_SGIX_list_priority; + continue; + } +#endif +#ifdef GL_SGIX_mpeg1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"mpeg1", 5)) + { + ret = GLEW_SGIX_mpeg1; + continue; + } +#endif +#ifdef GL_SGIX_mpeg2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"mpeg2", 5)) + { + ret = GLEW_SGIX_mpeg2; + continue; + } +#endif +#ifdef GL_SGIX_nonlinear_lighting_pervertex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"nonlinear_lighting_pervertex", 28)) + { + ret = GLEW_SGIX_nonlinear_lighting_pervertex; + continue; + } +#endif +#ifdef GL_SGIX_nurbs_eval + if (_glewStrSame3(&pos, &len, (const GLubyte*)"nurbs_eval", 10)) + { + ret = GLEW_SGIX_nurbs_eval; + continue; + } +#endif +#ifdef GL_SGIX_occlusion_instrument + if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_instrument", 20)) + { + ret = GLEW_SGIX_occlusion_instrument; + continue; + } +#endif +#ifdef GL_SGIX_packed_6bytes + if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_6bytes", 13)) + { + ret = GLEW_SGIX_packed_6bytes; + continue; + } +#endif +#ifdef GL_SGIX_pixel_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) + { + ret = GLEW_SGIX_pixel_texture; + continue; + } +#endif +#ifdef GL_SGIX_pixel_texture_bits + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture_bits", 18)) + { + ret = GLEW_SGIX_pixel_texture_bits; + continue; + } +#endif +#ifdef GL_SGIX_pixel_texture_lod + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture_lod", 17)) + { + ret = GLEW_SGIX_pixel_texture_lod; + continue; + } +#endif +#ifdef GL_SGIX_pixel_tiles + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_tiles", 11)) + { + ret = GLEW_SGIX_pixel_tiles; + continue; + } +#endif +#ifdef GL_SGIX_polynomial_ffd + if (_glewStrSame3(&pos, &len, (const GLubyte*)"polynomial_ffd", 14)) + { + ret = GLEW_SGIX_polynomial_ffd; + continue; + } +#endif +#ifdef GL_SGIX_quad_mesh + if (_glewStrSame3(&pos, &len, (const GLubyte*)"quad_mesh", 9)) + { + ret = GLEW_SGIX_quad_mesh; + continue; + } +#endif +#ifdef GL_SGIX_reference_plane + if (_glewStrSame3(&pos, &len, (const GLubyte*)"reference_plane", 15)) + { + ret = GLEW_SGIX_reference_plane; + continue; + } +#endif +#ifdef GL_SGIX_resample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) + { + ret = GLEW_SGIX_resample; + continue; + } +#endif +#ifdef GL_SGIX_scalebias_hint + if (_glewStrSame3(&pos, &len, (const GLubyte*)"scalebias_hint", 14)) + { + ret = GLEW_SGIX_scalebias_hint; + continue; + } +#endif +#ifdef GL_SGIX_shadow + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) + { + ret = GLEW_SGIX_shadow; + continue; + } +#endif +#ifdef GL_SGIX_shadow_ambient + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) + { + ret = GLEW_SGIX_shadow_ambient; + continue; + } +#endif +#ifdef GL_SGIX_slim + if (_glewStrSame3(&pos, &len, (const GLubyte*)"slim", 4)) + { + ret = GLEW_SGIX_slim; + continue; + } +#endif +#ifdef GL_SGIX_spotlight_cutoff + if (_glewStrSame3(&pos, &len, (const GLubyte*)"spotlight_cutoff", 16)) + { + ret = GLEW_SGIX_spotlight_cutoff; + continue; + } +#endif +#ifdef GL_SGIX_sprite + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sprite", 6)) + { + ret = GLEW_SGIX_sprite; + continue; + } +#endif +#ifdef GL_SGIX_subdiv_patch + if (_glewStrSame3(&pos, &len, (const GLubyte*)"subdiv_patch", 12)) + { + ret = GLEW_SGIX_subdiv_patch; + continue; + } +#endif +#ifdef GL_SGIX_subsample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"subsample", 9)) + { + ret = GLEW_SGIX_subsample; + continue; + } +#endif +#ifdef GL_SGIX_tag_sample_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"tag_sample_buffer", 17)) + { + ret = GLEW_SGIX_tag_sample_buffer; + continue; + } +#endif +#ifdef GL_SGIX_texture_add_env + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_add_env", 15)) + { + ret = GLEW_SGIX_texture_add_env; + continue; + } +#endif +#ifdef GL_SGIX_texture_coordinate_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_coordinate_clamp", 24)) + { + ret = GLEW_SGIX_texture_coordinate_clamp; + continue; + } +#endif +#ifdef GL_SGIX_texture_lod_bias + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) + { + ret = GLEW_SGIX_texture_lod_bias; + continue; + } +#endif +#ifdef GL_SGIX_texture_mipmap_anisotropic + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mipmap_anisotropic", 26)) + { + ret = GLEW_SGIX_texture_mipmap_anisotropic; + continue; + } +#endif +#ifdef GL_SGIX_texture_multi_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multi_buffer", 20)) + { + ret = GLEW_SGIX_texture_multi_buffer; + continue; + } +#endif +#ifdef GL_SGIX_texture_phase + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_phase", 13)) + { + ret = GLEW_SGIX_texture_phase; + continue; + } +#endif +#ifdef GL_SGIX_texture_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) + { + ret = GLEW_SGIX_texture_range; + continue; + } +#endif +#ifdef GL_SGIX_texture_scale_bias + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scale_bias", 18)) + { + ret = GLEW_SGIX_texture_scale_bias; + continue; + } +#endif +#ifdef GL_SGIX_texture_supersample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_supersample", 19)) + { + ret = GLEW_SGIX_texture_supersample; + continue; + } +#endif +#ifdef GL_SGIX_vector_ops + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vector_ops", 10)) + { + ret = GLEW_SGIX_vector_ops; + continue; + } +#endif +#ifdef GL_SGIX_vertex_array_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) + { + ret = GLEW_SGIX_vertex_array_object; + continue; + } +#endif +#ifdef GL_SGIX_vertex_preclip + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip", 14)) + { + ret = GLEW_SGIX_vertex_preclip; + continue; + } +#endif +#ifdef GL_SGIX_vertex_preclip_hint + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip_hint", 19)) + { + ret = GLEW_SGIX_vertex_preclip_hint; + continue; + } +#endif +#ifdef GL_SGIX_ycrcb + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycrcb", 5)) + { + ret = GLEW_SGIX_ycrcb; + continue; + } +#endif +#ifdef GL_SGIX_ycrcb_subsample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycrcb_subsample", 15)) + { + ret = GLEW_SGIX_ycrcb_subsample; + continue; + } +#endif +#ifdef GL_SGIX_ycrcba + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycrcba", 6)) + { + ret = GLEW_SGIX_ycrcba; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) + { +#ifdef GL_SGI_color_matrix + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_matrix", 12)) + { + ret = GLEW_SGI_color_matrix; + continue; + } +#endif +#ifdef GL_SGI_color_table + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_table", 11)) + { + ret = GLEW_SGI_color_table; + continue; + } +#endif +#ifdef GL_SGI_complex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"complex", 7)) + { + ret = GLEW_SGI_complex; + continue; + } +#endif +#ifdef GL_SGI_complex_type + if (_glewStrSame3(&pos, &len, (const GLubyte*)"complex_type", 12)) + { + ret = GLEW_SGI_complex_type; + continue; + } +#endif +#ifdef GL_SGI_fft + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fft", 3)) + { + ret = GLEW_SGI_fft; + continue; + } +#endif +#ifdef GL_SGI_texture_color_table + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_color_table", 19)) + { + ret = GLEW_SGI_texture_color_table; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUNX_", 5)) + { +#ifdef GL_SUNX_constant_data + if (_glewStrSame3(&pos, &len, (const GLubyte*)"constant_data", 13)) + { + ret = GLEW_SUNX_constant_data; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) + { +#ifdef GL_SUN_convolution_border_modes + if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) + { + ret = GLEW_SUN_convolution_border_modes; + continue; + } +#endif +#ifdef GL_SUN_global_alpha + if (_glewStrSame3(&pos, &len, (const GLubyte*)"global_alpha", 12)) + { + ret = GLEW_SUN_global_alpha; + continue; + } +#endif +#ifdef GL_SUN_mesh_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"mesh_array", 10)) + { + ret = GLEW_SUN_mesh_array; + continue; + } +#endif +#ifdef GL_SUN_read_video_pixels + if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_video_pixels", 17)) + { + ret = GLEW_SUN_read_video_pixels; + continue; + } +#endif +#ifdef GL_SUN_slice_accum + if (_glewStrSame3(&pos, &len, (const GLubyte*)"slice_accum", 11)) + { + ret = GLEW_SUN_slice_accum; + continue; + } +#endif +#ifdef GL_SUN_triangle_list + if (_glewStrSame3(&pos, &len, (const GLubyte*)"triangle_list", 13)) + { + ret = GLEW_SUN_triangle_list; + continue; + } +#endif +#ifdef GL_SUN_vertex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex", 6)) + { + ret = GLEW_SUN_vertex; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"WIN_", 4)) + { +#ifdef GL_WIN_phong_shading + if (_glewStrSame3(&pos, &len, (const GLubyte*)"phong_shading", 13)) + { + ret = GLEW_WIN_phong_shading; + continue; + } +#endif +#ifdef GL_WIN_scene_markerXXX + if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_markerXXX", 15)) + { + ret = GLEW_WIN_scene_markerXXX; + continue; + } +#endif +#ifdef GL_WIN_specular_fog + if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_fog", 12)) + { + ret = GLEW_WIN_specular_fog; + continue; + } +#endif +#ifdef GL_WIN_swap_hint + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_hint", 9)) + { + ret = GLEW_WIN_swap_hint; + continue; + } +#endif + } + } + ret = (len == 0); + } + return ret; +} + +#if defined(_WIN32) && !defined(GLEW_EGL) && !defined(GLEW_OSMESA) + +GLboolean GLEWAPIENTRY wglewIsSupported (const char* name) +{ + const GLubyte* pos = (const GLubyte*)name; + GLuint len = _glewStrLen(pos); + GLboolean ret = GL_TRUE; + while (ret && len > 0) + { + if (_glewStrSame1(&pos, &len, (const GLubyte*)"WGL_", 4)) + { + if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) + { +#ifdef WGL_3DFX_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = WGLEW_3DFX_multisample; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DL_", 4)) + { +#ifdef WGL_3DL_stereo_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_control", 14)) + { + ret = WGLEW_3DL_stereo_control; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) + { +#ifdef WGL_AMD_gpu_association + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15)) + { + ret = WGLEW_AMD_gpu_association; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) + { +#ifdef WGL_ARB_buffer_region + if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) + { + ret = WGLEW_ARB_buffer_region; + continue; + } +#endif +#ifdef WGL_ARB_context_flush_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) + { + ret = WGLEW_ARB_context_flush_control; + continue; + } +#endif +#ifdef WGL_ARB_create_context + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) + { + ret = WGLEW_ARB_create_context; + continue; + } +#endif +#ifdef WGL_ARB_create_context_no_error + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_no_error", 23)) + { + ret = WGLEW_ARB_create_context_no_error; + continue; + } +#endif +#ifdef WGL_ARB_create_context_profile + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22)) + { + ret = WGLEW_ARB_create_context_profile; + continue; + } +#endif +#ifdef WGL_ARB_create_context_robustness + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) + { + ret = WGLEW_ARB_create_context_robustness; + continue; + } +#endif +#ifdef WGL_ARB_extensions_string + if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) + { + ret = WGLEW_ARB_extensions_string; + continue; + } +#endif +#ifdef WGL_ARB_framebuffer_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) + { + ret = WGLEW_ARB_framebuffer_sRGB; + continue; + } +#endif +#ifdef WGL_ARB_make_current_read + if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) + { + ret = WGLEW_ARB_make_current_read; + continue; + } +#endif +#ifdef WGL_ARB_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = WGLEW_ARB_multisample; + continue; + } +#endif +#ifdef WGL_ARB_pbuffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) + { + ret = WGLEW_ARB_pbuffer; + continue; + } +#endif +#ifdef WGL_ARB_pixel_format + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) + { + ret = WGLEW_ARB_pixel_format; + continue; + } +#endif +#ifdef WGL_ARB_pixel_format_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) + { + ret = WGLEW_ARB_pixel_format_float; + continue; + } +#endif +#ifdef WGL_ARB_render_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) + { + ret = WGLEW_ARB_render_texture; + continue; + } +#endif +#ifdef WGL_ARB_robustness_application_isolation + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) + { + ret = WGLEW_ARB_robustness_application_isolation; + continue; + } +#endif +#ifdef WGL_ARB_robustness_share_group_isolation + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) + { + ret = WGLEW_ARB_robustness_share_group_isolation; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) + { +#ifdef WGL_ATI_pixel_format_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) + { + ret = WGLEW_ATI_pixel_format_float; + continue; + } +#endif +#ifdef WGL_ATI_render_texture_rectangle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) + { + ret = WGLEW_ATI_render_texture_rectangle; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) + { +#ifdef WGL_EXT_colorspace + if (_glewStrSame3(&pos, &len, (const GLubyte*)"colorspace", 10)) + { + ret = WGLEW_EXT_colorspace; + continue; + } +#endif +#ifdef WGL_EXT_create_context_es2_profile + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26)) + { + ret = WGLEW_EXT_create_context_es2_profile; + continue; + } +#endif +#ifdef WGL_EXT_create_context_es_profile + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es_profile", 25)) + { + ret = WGLEW_EXT_create_context_es_profile; + continue; + } +#endif +#ifdef WGL_EXT_depth_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_float", 11)) + { + ret = WGLEW_EXT_depth_float; + continue; + } +#endif +#ifdef WGL_EXT_display_color_table + if (_glewStrSame3(&pos, &len, (const GLubyte*)"display_color_table", 19)) + { + ret = WGLEW_EXT_display_color_table; + continue; + } +#endif +#ifdef WGL_EXT_extensions_string + if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) + { + ret = WGLEW_EXT_extensions_string; + continue; + } +#endif +#ifdef WGL_EXT_framebuffer_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) + { + ret = WGLEW_EXT_framebuffer_sRGB; + continue; + } +#endif +#ifdef WGL_EXT_make_current_read + if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) + { + ret = WGLEW_EXT_make_current_read; + continue; + } +#endif +#ifdef WGL_EXT_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = WGLEW_EXT_multisample; + continue; + } +#endif +#ifdef WGL_EXT_pbuffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) + { + ret = WGLEW_EXT_pbuffer; + continue; + } +#endif +#ifdef WGL_EXT_pixel_format + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) + { + ret = WGLEW_EXT_pixel_format; + continue; + } +#endif +#ifdef WGL_EXT_pixel_format_packed_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_packed_float", 25)) + { + ret = WGLEW_EXT_pixel_format_packed_float; + continue; + } +#endif +#ifdef WGL_EXT_swap_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) + { + ret = WGLEW_EXT_swap_control; + continue; + } +#endif +#ifdef WGL_EXT_swap_control_tear + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control_tear", 17)) + { + ret = WGLEW_EXT_swap_control_tear; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"I3D_", 4)) + { +#ifdef WGL_I3D_digital_video_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"digital_video_control", 21)) + { + ret = WGLEW_I3D_digital_video_control; + continue; + } +#endif +#ifdef WGL_I3D_gamma + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gamma", 5)) + { + ret = WGLEW_I3D_gamma; + continue; + } +#endif +#ifdef WGL_I3D_genlock + if (_glewStrSame3(&pos, &len, (const GLubyte*)"genlock", 7)) + { + ret = WGLEW_I3D_genlock; + continue; + } +#endif +#ifdef WGL_I3D_image_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_buffer", 12)) + { + ret = WGLEW_I3D_image_buffer; + continue; + } +#endif +#ifdef WGL_I3D_swap_frame_lock + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_lock", 15)) + { + ret = WGLEW_I3D_swap_frame_lock; + continue; + } +#endif +#ifdef WGL_I3D_swap_frame_usage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_usage", 16)) + { + ret = WGLEW_I3D_swap_frame_usage; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) + { +#ifdef WGL_NV_DX_interop + if (_glewStrSame3(&pos, &len, (const GLubyte*)"DX_interop", 10)) + { + ret = WGLEW_NV_DX_interop; + continue; + } +#endif +#ifdef WGL_NV_DX_interop2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"DX_interop2", 11)) + { + ret = WGLEW_NV_DX_interop2; + continue; + } +#endif +#ifdef WGL_NV_copy_image + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) + { + ret = WGLEW_NV_copy_image; + continue; + } +#endif +#ifdef WGL_NV_delay_before_swap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"delay_before_swap", 17)) + { + ret = WGLEW_NV_delay_before_swap; + continue; + } +#endif +#ifdef WGL_NV_float_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) + { + ret = WGLEW_NV_float_buffer; + continue; + } +#endif +#ifdef WGL_NV_gpu_affinity + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_affinity", 12)) + { + ret = WGLEW_NV_gpu_affinity; + continue; + } +#endif +#ifdef WGL_NV_multisample_coverage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) + { + ret = WGLEW_NV_multisample_coverage; + continue; + } +#endif +#ifdef WGL_NV_present_video + if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) + { + ret = WGLEW_NV_present_video; + continue; + } +#endif +#ifdef WGL_NV_render_depth_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_depth_texture", 20)) + { + ret = WGLEW_NV_render_depth_texture; + continue; + } +#endif +#ifdef WGL_NV_render_texture_rectangle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) + { + ret = WGLEW_NV_render_texture_rectangle; + continue; + } +#endif +#ifdef WGL_NV_swap_group + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) + { + ret = WGLEW_NV_swap_group; + continue; + } +#endif +#ifdef WGL_NV_vertex_array_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) + { + ret = WGLEW_NV_vertex_array_range; + continue; + } +#endif +#ifdef WGL_NV_video_capture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) + { + ret = WGLEW_NV_video_capture; + continue; + } +#endif +#ifdef WGL_NV_video_output + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_output", 12)) + { + ret = WGLEW_NV_video_output; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) + { +#ifdef WGL_OML_sync_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) + { + ret = WGLEW_OML_sync_control; + continue; + } +#endif + } + } + ret = (len == 0); + } + return ret; +} + +#elif !defined(GLEW_OSMESA) && !defined(GLEW_EGL) && !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) + +GLboolean glxewIsSupported (const char* name) +{ + const GLubyte* pos = (const GLubyte*)name; + GLuint len = _glewStrLen(pos); + GLboolean ret = GL_TRUE; + while (ret && len > 0) + { + if(_glewStrSame1(&pos, &len, (const GLubyte*)"GLX_", 4)) + { + if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) + { +#ifdef GLX_VERSION_1_2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) + { + ret = GLXEW_VERSION_1_2; + continue; + } +#endif +#ifdef GLX_VERSION_1_3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) + { + ret = GLXEW_VERSION_1_3; + continue; + } +#endif +#ifdef GLX_VERSION_1_4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) + { + ret = GLXEW_VERSION_1_4; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) + { +#ifdef GLX_3DFX_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLXEW_3DFX_multisample; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) + { +#ifdef GLX_AMD_gpu_association + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15)) + { + ret = GLXEW_AMD_gpu_association; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) + { +#ifdef GLX_ARB_context_flush_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) + { + ret = GLXEW_ARB_context_flush_control; + continue; + } +#endif +#ifdef GLX_ARB_create_context + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) + { + ret = GLXEW_ARB_create_context; + continue; + } +#endif +#ifdef GLX_ARB_create_context_no_error + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_no_error", 23)) + { + ret = GLXEW_ARB_create_context_no_error; + continue; + } +#endif +#ifdef GLX_ARB_create_context_profile + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22)) + { + ret = GLXEW_ARB_create_context_profile; + continue; + } +#endif +#ifdef GLX_ARB_create_context_robustness + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) + { + ret = GLXEW_ARB_create_context_robustness; + continue; + } +#endif +#ifdef GLX_ARB_fbconfig_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_float", 14)) + { + ret = GLXEW_ARB_fbconfig_float; + continue; + } +#endif +#ifdef GLX_ARB_framebuffer_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) + { + ret = GLXEW_ARB_framebuffer_sRGB; + continue; + } +#endif +#ifdef GLX_ARB_get_proc_address + if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_proc_address", 16)) + { + ret = GLXEW_ARB_get_proc_address; + continue; + } +#endif +#ifdef GLX_ARB_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLXEW_ARB_multisample; + continue; + } +#endif +#ifdef GLX_ARB_robustness_application_isolation + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) + { + ret = GLXEW_ARB_robustness_application_isolation; + continue; + } +#endif +#ifdef GLX_ARB_robustness_share_group_isolation + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) + { + ret = GLXEW_ARB_robustness_share_group_isolation; + continue; + } +#endif +#ifdef GLX_ARB_vertex_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20)) + { + ret = GLXEW_ARB_vertex_buffer_object; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) + { +#ifdef GLX_ATI_pixel_format_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) + { + ret = GLXEW_ATI_pixel_format_float; + continue; + } +#endif +#ifdef GLX_ATI_render_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) + { + ret = GLXEW_ATI_render_texture; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) + { +#ifdef GLX_EXT_buffer_age + if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_age", 10)) + { + ret = GLXEW_EXT_buffer_age; + continue; + } +#endif +#ifdef GLX_EXT_create_context_es2_profile + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26)) + { + ret = GLXEW_EXT_create_context_es2_profile; + continue; + } +#endif +#ifdef GLX_EXT_create_context_es_profile + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es_profile", 25)) + { + ret = GLXEW_EXT_create_context_es_profile; + continue; + } +#endif +#ifdef GLX_EXT_fbconfig_packed_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_packed_float", 21)) + { + ret = GLXEW_EXT_fbconfig_packed_float; + continue; + } +#endif +#ifdef GLX_EXT_framebuffer_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) + { + ret = GLXEW_EXT_framebuffer_sRGB; + continue; + } +#endif +#ifdef GLX_EXT_import_context + if (_glewStrSame3(&pos, &len, (const GLubyte*)"import_context", 14)) + { + ret = GLXEW_EXT_import_context; + continue; + } +#endif +#ifdef GLX_EXT_libglvnd + if (_glewStrSame3(&pos, &len, (const GLubyte*)"libglvnd", 8)) + { + ret = GLXEW_EXT_libglvnd; + continue; + } +#endif +#ifdef GLX_EXT_scene_marker + if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) + { + ret = GLXEW_EXT_scene_marker; + continue; + } +#endif +#ifdef GLX_EXT_stereo_tree + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_tree", 11)) + { + ret = GLXEW_EXT_stereo_tree; + continue; + } +#endif +#ifdef GLX_EXT_swap_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) + { + ret = GLXEW_EXT_swap_control; + continue; + } +#endif +#ifdef GLX_EXT_swap_control_tear + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control_tear", 17)) + { + ret = GLXEW_EXT_swap_control_tear; + continue; + } +#endif +#ifdef GLX_EXT_texture_from_pixmap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_from_pixmap", 19)) + { + ret = GLXEW_EXT_texture_from_pixmap; + continue; + } +#endif +#ifdef GLX_EXT_visual_info + if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_info", 11)) + { + ret = GLXEW_EXT_visual_info; + continue; + } +#endif +#ifdef GLX_EXT_visual_rating + if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_rating", 13)) + { + ret = GLXEW_EXT_visual_rating; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) + { +#ifdef GLX_INTEL_swap_event + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_event", 10)) + { + ret = GLXEW_INTEL_swap_event; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) + { +#ifdef GLX_MESA_agp_offset + if (_glewStrSame3(&pos, &len, (const GLubyte*)"agp_offset", 10)) + { + ret = GLXEW_MESA_agp_offset; + continue; + } +#endif +#ifdef GLX_MESA_copy_sub_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_sub_buffer", 15)) + { + ret = GLXEW_MESA_copy_sub_buffer; + continue; + } +#endif +#ifdef GLX_MESA_pixmap_colormap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixmap_colormap", 15)) + { + ret = GLXEW_MESA_pixmap_colormap; + continue; + } +#endif +#ifdef GLX_MESA_query_renderer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_renderer", 14)) + { + ret = GLXEW_MESA_query_renderer; + continue; + } +#endif +#ifdef GLX_MESA_release_buffers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"release_buffers", 15)) + { + ret = GLXEW_MESA_release_buffers; + continue; + } +#endif +#ifdef GLX_MESA_set_3dfx_mode + if (_glewStrSame3(&pos, &len, (const GLubyte*)"set_3dfx_mode", 13)) + { + ret = GLXEW_MESA_set_3dfx_mode; + continue; + } +#endif +#ifdef GLX_MESA_swap_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) + { + ret = GLXEW_MESA_swap_control; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) + { +#ifdef GLX_NV_copy_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11)) + { + ret = GLXEW_NV_copy_buffer; + continue; + } +#endif +#ifdef GLX_NV_copy_image + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) + { + ret = GLXEW_NV_copy_image; + continue; + } +#endif +#ifdef GLX_NV_delay_before_swap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"delay_before_swap", 17)) + { + ret = GLXEW_NV_delay_before_swap; + continue; + } +#endif +#ifdef GLX_NV_float_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) + { + ret = GLXEW_NV_float_buffer; + continue; + } +#endif +#ifdef GLX_NV_multisample_coverage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) + { + ret = GLXEW_NV_multisample_coverage; + continue; + } +#endif +#ifdef GLX_NV_present_video + if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) + { + ret = GLXEW_NV_present_video; + continue; + } +#endif +#ifdef GLX_NV_robustness_video_memory_purge + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_video_memory_purge", 29)) + { + ret = GLXEW_NV_robustness_video_memory_purge; + continue; + } +#endif +#ifdef GLX_NV_swap_group + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) + { + ret = GLXEW_NV_swap_group; + continue; + } +#endif +#ifdef GLX_NV_vertex_array_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) + { + ret = GLXEW_NV_vertex_array_range; + continue; + } +#endif +#ifdef GLX_NV_video_capture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) + { + ret = GLXEW_NV_video_capture; + continue; + } +#endif +#ifdef GLX_NV_video_out + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_out", 9)) + { + ret = GLXEW_NV_video_out; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) + { +#ifdef GLX_OML_swap_method + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_method", 11)) + { + ret = GLXEW_OML_swap_method; + continue; + } +#endif +#ifdef GLX_OML_sync_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) + { + ret = GLXEW_OML_sync_control; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) + { +#ifdef GLX_SGIS_blended_overlay + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blended_overlay", 15)) + { + ret = GLXEW_SGIS_blended_overlay; + continue; + } +#endif +#ifdef GLX_SGIS_color_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) + { + ret = GLXEW_SGIS_color_range; + continue; + } +#endif +#ifdef GLX_SGIS_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLXEW_SGIS_multisample; + continue; + } +#endif +#ifdef GLX_SGIS_shared_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_multisample", 18)) + { + ret = GLXEW_SGIS_shared_multisample; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) + { +#ifdef GLX_SGIX_fbconfig + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig", 8)) + { + ret = GLXEW_SGIX_fbconfig; + continue; + } +#endif +#ifdef GLX_SGIX_hyperpipe + if (_glewStrSame3(&pos, &len, (const GLubyte*)"hyperpipe", 9)) + { + ret = GLXEW_SGIX_hyperpipe; + continue; + } +#endif +#ifdef GLX_SGIX_pbuffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) + { + ret = GLXEW_SGIX_pbuffer; + continue; + } +#endif +#ifdef GLX_SGIX_swap_barrier + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_barrier", 12)) + { + ret = GLXEW_SGIX_swap_barrier; + continue; + } +#endif +#ifdef GLX_SGIX_swap_group + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) + { + ret = GLXEW_SGIX_swap_group; + continue; + } +#endif +#ifdef GLX_SGIX_video_resize + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) + { + ret = GLXEW_SGIX_video_resize; + continue; + } +#endif +#ifdef GLX_SGIX_visual_select_group + if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_select_group", 19)) + { + ret = GLXEW_SGIX_visual_select_group; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) + { +#ifdef GLX_SGI_cushion + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cushion", 7)) + { + ret = GLXEW_SGI_cushion; + continue; + } +#endif +#ifdef GLX_SGI_make_current_read + if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) + { + ret = GLXEW_SGI_make_current_read; + continue; + } +#endif +#ifdef GLX_SGI_swap_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) + { + ret = GLXEW_SGI_swap_control; + continue; + } +#endif +#ifdef GLX_SGI_video_sync + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_sync", 10)) + { + ret = GLXEW_SGI_video_sync; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) + { +#ifdef GLX_SUN_get_transparent_index + if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_transparent_index", 21)) + { + ret = GLXEW_SUN_get_transparent_index; + continue; + } +#endif +#ifdef GLX_SUN_video_resize + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) + { + ret = GLXEW_SUN_video_resize; + continue; + } +#endif + } + } + ret = (len == 0); + } + return ret; +} + +#elif defined(GLEW_EGL) + +GLboolean eglewIsSupported (const char* name) +{ + const GLubyte* pos = (const GLubyte*)name; + GLuint len = _glewStrLen(pos); + GLboolean ret = GL_TRUE; + while (ret && len > 0) + { + if(_glewStrSame1(&pos, &len, (const GLubyte*)"EGL_", 4)) + { + if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) + { +#ifdef EGL_VERSION_1_0 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_0", 3)) + { + ret = EGLEW_VERSION_1_0; + continue; + } +#endif +#ifdef EGL_VERSION_1_1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_1", 3)) + { + ret = EGLEW_VERSION_1_1; + continue; + } +#endif +#ifdef EGL_VERSION_1_2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) + { + ret = EGLEW_VERSION_1_2; + continue; + } +#endif +#ifdef EGL_VERSION_1_3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) + { + ret = EGLEW_VERSION_1_3; + continue; + } +#endif +#ifdef EGL_VERSION_1_4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) + { + ret = EGLEW_VERSION_1_4; + continue; + } +#endif +#ifdef EGL_VERSION_1_5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_5", 3)) + { + ret = EGLEW_VERSION_1_5; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANDROID_", 8)) + { +#ifdef EGL_ANDROID_blob_cache + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blob_cache", 10)) + { + ret = EGLEW_ANDROID_blob_cache; + continue; + } +#endif +#ifdef EGL_ANDROID_create_native_client_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_native_client_buffer", 27)) + { + ret = EGLEW_ANDROID_create_native_client_buffer; + continue; + } +#endif +#ifdef EGL_ANDROID_framebuffer_target + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_target", 18)) + { + ret = EGLEW_ANDROID_framebuffer_target; + continue; + } +#endif +#ifdef EGL_ANDROID_front_buffer_auto_refresh + if (_glewStrSame3(&pos, &len, (const GLubyte*)"front_buffer_auto_refresh", 25)) + { + ret = EGLEW_ANDROID_front_buffer_auto_refresh; + continue; + } +#endif +#ifdef EGL_ANDROID_image_native_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_native_buffer", 19)) + { + ret = EGLEW_ANDROID_image_native_buffer; + continue; + } +#endif +#ifdef EGL_ANDROID_native_fence_sync + if (_glewStrSame3(&pos, &len, (const GLubyte*)"native_fence_sync", 17)) + { + ret = EGLEW_ANDROID_native_fence_sync; + continue; + } +#endif +#ifdef EGL_ANDROID_presentation_time + if (_glewStrSame3(&pos, &len, (const GLubyte*)"presentation_time", 17)) + { + ret = EGLEW_ANDROID_presentation_time; + continue; + } +#endif +#ifdef EGL_ANDROID_recordable + if (_glewStrSame3(&pos, &len, (const GLubyte*)"recordable", 10)) + { + ret = EGLEW_ANDROID_recordable; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANGLE_", 6)) + { +#ifdef EGL_ANGLE_d3d_share_handle_client_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"d3d_share_handle_client_buffer", 30)) + { + ret = EGLEW_ANGLE_d3d_share_handle_client_buffer; + continue; + } +#endif +#ifdef EGL_ANGLE_device_d3d + if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_d3d", 10)) + { + ret = EGLEW_ANGLE_device_d3d; + continue; + } +#endif +#ifdef EGL_ANGLE_query_surface_pointer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_surface_pointer", 21)) + { + ret = EGLEW_ANGLE_query_surface_pointer; + continue; + } +#endif +#ifdef EGL_ANGLE_surface_d3d_texture_2d_share_handle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"surface_d3d_texture_2d_share_handle", 35)) + { + ret = EGLEW_ANGLE_surface_d3d_texture_2d_share_handle; + continue; + } +#endif +#ifdef EGL_ANGLE_window_fixed_size + if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_fixed_size", 17)) + { + ret = EGLEW_ANGLE_window_fixed_size; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARM_", 4)) + { +#ifdef EGL_ARM_implicit_external_sync + if (_glewStrSame3(&pos, &len, (const GLubyte*)"implicit_external_sync", 22)) + { + ret = EGLEW_ARM_implicit_external_sync; + continue; + } +#endif +#ifdef EGL_ARM_pixmap_multisample_discard + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixmap_multisample_discard", 26)) + { + ret = EGLEW_ARM_pixmap_multisample_discard; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) + { +#ifdef EGL_EXT_buffer_age + if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_age", 10)) + { + ret = EGLEW_EXT_buffer_age; + continue; + } +#endif +#ifdef EGL_EXT_client_extensions + if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_extensions", 17)) + { + ret = EGLEW_EXT_client_extensions; + continue; + } +#endif +#ifdef EGL_EXT_create_context_robustness + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) + { + ret = EGLEW_EXT_create_context_robustness; + continue; + } +#endif +#ifdef EGL_EXT_device_base + if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_base", 11)) + { + ret = EGLEW_EXT_device_base; + continue; + } +#endif +#ifdef EGL_EXT_device_drm + if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_drm", 10)) + { + ret = EGLEW_EXT_device_drm; + continue; + } +#endif +#ifdef EGL_EXT_device_enumeration + if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_enumeration", 18)) + { + ret = EGLEW_EXT_device_enumeration; + continue; + } +#endif +#ifdef EGL_EXT_device_openwf + if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_openwf", 13)) + { + ret = EGLEW_EXT_device_openwf; + continue; + } +#endif +#ifdef EGL_EXT_device_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_query", 12)) + { + ret = EGLEW_EXT_device_query; + continue; + } +#endif +#ifdef EGL_EXT_gl_colorspace_bt2020_linear + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace_bt2020_linear", 27)) + { + ret = EGLEW_EXT_gl_colorspace_bt2020_linear; + continue; + } +#endif +#ifdef EGL_EXT_gl_colorspace_bt2020_pq + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace_bt2020_pq", 23)) + { + ret = EGLEW_EXT_gl_colorspace_bt2020_pq; + continue; + } +#endif +#ifdef EGL_EXT_gl_colorspace_scrgb_linear + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace_scrgb_linear", 26)) + { + ret = EGLEW_EXT_gl_colorspace_scrgb_linear; + continue; + } +#endif +#ifdef EGL_EXT_image_dma_buf_import + if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_dma_buf_import", 20)) + { + ret = EGLEW_EXT_image_dma_buf_import; + continue; + } +#endif +#ifdef EGL_EXT_image_dma_buf_import_modifiers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_dma_buf_import_modifiers", 30)) + { + ret = EGLEW_EXT_image_dma_buf_import_modifiers; + continue; + } +#endif +#ifdef EGL_EXT_multiview_window + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview_window", 16)) + { + ret = EGLEW_EXT_multiview_window; + continue; + } +#endif +#ifdef EGL_EXT_output_base + if (_glewStrSame3(&pos, &len, (const GLubyte*)"output_base", 11)) + { + ret = EGLEW_EXT_output_base; + continue; + } +#endif +#ifdef EGL_EXT_output_drm + if (_glewStrSame3(&pos, &len, (const GLubyte*)"output_drm", 10)) + { + ret = EGLEW_EXT_output_drm; + continue; + } +#endif +#ifdef EGL_EXT_output_openwf + if (_glewStrSame3(&pos, &len, (const GLubyte*)"output_openwf", 13)) + { + ret = EGLEW_EXT_output_openwf; + continue; + } +#endif +#ifdef EGL_EXT_pixel_format_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) + { + ret = EGLEW_EXT_pixel_format_float; + continue; + } +#endif +#ifdef EGL_EXT_platform_base + if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_base", 13)) + { + ret = EGLEW_EXT_platform_base; + continue; + } +#endif +#ifdef EGL_EXT_platform_device + if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_device", 15)) + { + ret = EGLEW_EXT_platform_device; + continue; + } +#endif +#ifdef EGL_EXT_platform_wayland + if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_wayland", 16)) + { + ret = EGLEW_EXT_platform_wayland; + continue; + } +#endif +#ifdef EGL_EXT_platform_x11 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_x11", 12)) + { + ret = EGLEW_EXT_platform_x11; + continue; + } +#endif +#ifdef EGL_EXT_protected_content + if (_glewStrSame3(&pos, &len, (const GLubyte*)"protected_content", 17)) + { + ret = EGLEW_EXT_protected_content; + continue; + } +#endif +#ifdef EGL_EXT_protected_surface + if (_glewStrSame3(&pos, &len, (const GLubyte*)"protected_surface", 17)) + { + ret = EGLEW_EXT_protected_surface; + continue; + } +#endif +#ifdef EGL_EXT_stream_consumer_egloutput + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_consumer_egloutput", 25)) + { + ret = EGLEW_EXT_stream_consumer_egloutput; + continue; + } +#endif +#ifdef EGL_EXT_surface_SMPTE2086_metadata + if (_glewStrSame3(&pos, &len, (const GLubyte*)"surface_SMPTE2086_metadata", 26)) + { + ret = EGLEW_EXT_surface_SMPTE2086_metadata; + continue; + } +#endif +#ifdef EGL_EXT_swap_buffers_with_damage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_buffers_with_damage", 24)) + { + ret = EGLEW_EXT_swap_buffers_with_damage; + continue; + } +#endif +#ifdef EGL_EXT_yuv_surface + if (_glewStrSame3(&pos, &len, (const GLubyte*)"yuv_surface", 11)) + { + ret = EGLEW_EXT_yuv_surface; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"HI_", 3)) + { +#ifdef EGL_HI_clientpixmap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clientpixmap", 12)) + { + ret = EGLEW_HI_clientpixmap; + continue; + } +#endif +#ifdef EGL_HI_colorformats + if (_glewStrSame3(&pos, &len, (const GLubyte*)"colorformats", 12)) + { + ret = EGLEW_HI_colorformats; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"IMG_", 4)) + { +#ifdef EGL_IMG_context_priority + if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_priority", 16)) + { + ret = EGLEW_IMG_context_priority; + continue; + } +#endif +#ifdef EGL_IMG_image_plane_attribs + if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_plane_attribs", 19)) + { + ret = EGLEW_IMG_image_plane_attribs; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"KHR_", 4)) + { +#ifdef EGL_KHR_cl_event + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event", 8)) + { + ret = EGLEW_KHR_cl_event; + continue; + } +#endif +#ifdef EGL_KHR_cl_event2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event2", 9)) + { + ret = EGLEW_KHR_cl_event2; + continue; + } +#endif +#ifdef EGL_KHR_client_get_all_proc_addresses + if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_get_all_proc_addresses", 29)) + { + ret = EGLEW_KHR_client_get_all_proc_addresses; + continue; + } +#endif +#ifdef EGL_KHR_config_attribs + if (_glewStrSame3(&pos, &len, (const GLubyte*)"config_attribs", 14)) + { + ret = EGLEW_KHR_config_attribs; + continue; + } +#endif +#ifdef EGL_KHR_context_flush_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) + { + ret = EGLEW_KHR_context_flush_control; + continue; + } +#endif +#ifdef EGL_KHR_create_context + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) + { + ret = EGLEW_KHR_create_context; + continue; + } +#endif +#ifdef EGL_KHR_create_context_no_error + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_no_error", 23)) + { + ret = EGLEW_KHR_create_context_no_error; + continue; + } +#endif +#ifdef EGL_KHR_debug + if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug", 5)) + { + ret = EGLEW_KHR_debug; + continue; + } +#endif +#ifdef EGL_KHR_fence_sync + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence_sync", 10)) + { + ret = EGLEW_KHR_fence_sync; + continue; + } +#endif +#ifdef EGL_KHR_get_all_proc_addresses + if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_all_proc_addresses", 22)) + { + ret = EGLEW_KHR_get_all_proc_addresses; + continue; + } +#endif +#ifdef EGL_KHR_gl_colorspace + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace", 13)) + { + ret = EGLEW_KHR_gl_colorspace; + continue; + } +#endif +#ifdef EGL_KHR_gl_renderbuffer_image + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_renderbuffer_image", 21)) + { + ret = EGLEW_KHR_gl_renderbuffer_image; + continue; + } +#endif +#ifdef EGL_KHR_gl_texture_2D_image + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_texture_2D_image", 19)) + { + ret = EGLEW_KHR_gl_texture_2D_image; + continue; + } +#endif +#ifdef EGL_KHR_gl_texture_3D_image + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_texture_3D_image", 19)) + { + ret = EGLEW_KHR_gl_texture_3D_image; + continue; + } +#endif +#ifdef EGL_KHR_gl_texture_cubemap_image + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_texture_cubemap_image", 24)) + { + ret = EGLEW_KHR_gl_texture_cubemap_image; + continue; + } +#endif +#ifdef EGL_KHR_image + if (_glewStrSame3(&pos, &len, (const GLubyte*)"image", 5)) + { + ret = EGLEW_KHR_image; + continue; + } +#endif +#ifdef EGL_KHR_image_base + if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_base", 10)) + { + ret = EGLEW_KHR_image_base; + continue; + } +#endif +#ifdef EGL_KHR_image_pixmap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_pixmap", 12)) + { + ret = EGLEW_KHR_image_pixmap; + continue; + } +#endif +#ifdef EGL_KHR_lock_surface + if (_glewStrSame3(&pos, &len, (const GLubyte*)"lock_surface", 12)) + { + ret = EGLEW_KHR_lock_surface; + continue; + } +#endif +#ifdef EGL_KHR_lock_surface2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"lock_surface2", 13)) + { + ret = EGLEW_KHR_lock_surface2; + continue; + } +#endif +#ifdef EGL_KHR_lock_surface3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"lock_surface3", 13)) + { + ret = EGLEW_KHR_lock_surface3; + continue; + } +#endif +#ifdef EGL_KHR_mutable_render_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"mutable_render_buffer", 21)) + { + ret = EGLEW_KHR_mutable_render_buffer; + continue; + } +#endif +#ifdef EGL_KHR_no_config_context + if (_glewStrSame3(&pos, &len, (const GLubyte*)"no_config_context", 17)) + { + ret = EGLEW_KHR_no_config_context; + continue; + } +#endif +#ifdef EGL_KHR_partial_update + if (_glewStrSame3(&pos, &len, (const GLubyte*)"partial_update", 14)) + { + ret = EGLEW_KHR_partial_update; + continue; + } +#endif +#ifdef EGL_KHR_platform_android + if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_android", 16)) + { + ret = EGLEW_KHR_platform_android; + continue; + } +#endif +#ifdef EGL_KHR_platform_gbm + if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_gbm", 12)) + { + ret = EGLEW_KHR_platform_gbm; + continue; + } +#endif +#ifdef EGL_KHR_platform_wayland + if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_wayland", 16)) + { + ret = EGLEW_KHR_platform_wayland; + continue; + } +#endif +#ifdef EGL_KHR_platform_x11 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_x11", 12)) + { + ret = EGLEW_KHR_platform_x11; + continue; + } +#endif +#ifdef EGL_KHR_reusable_sync + if (_glewStrSame3(&pos, &len, (const GLubyte*)"reusable_sync", 13)) + { + ret = EGLEW_KHR_reusable_sync; + continue; + } +#endif +#ifdef EGL_KHR_stream + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream", 6)) + { + ret = EGLEW_KHR_stream; + continue; + } +#endif +#ifdef EGL_KHR_stream_attrib + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_attrib", 13)) + { + ret = EGLEW_KHR_stream_attrib; + continue; + } +#endif +#ifdef EGL_KHR_stream_consumer_gltexture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_consumer_gltexture", 25)) + { + ret = EGLEW_KHR_stream_consumer_gltexture; + continue; + } +#endif +#ifdef EGL_KHR_stream_cross_process_fd + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_process_fd", 23)) + { + ret = EGLEW_KHR_stream_cross_process_fd; + continue; + } +#endif +#ifdef EGL_KHR_stream_fifo + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_fifo", 11)) + { + ret = EGLEW_KHR_stream_fifo; + continue; + } +#endif +#ifdef EGL_KHR_stream_producer_aldatalocator + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_producer_aldatalocator", 29)) + { + ret = EGLEW_KHR_stream_producer_aldatalocator; + continue; + } +#endif +#ifdef EGL_KHR_stream_producer_eglsurface + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_producer_eglsurface", 26)) + { + ret = EGLEW_KHR_stream_producer_eglsurface; + continue; + } +#endif +#ifdef EGL_KHR_surfaceless_context + if (_glewStrSame3(&pos, &len, (const GLubyte*)"surfaceless_context", 19)) + { + ret = EGLEW_KHR_surfaceless_context; + continue; + } +#endif +#ifdef EGL_KHR_swap_buffers_with_damage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_buffers_with_damage", 24)) + { + ret = EGLEW_KHR_swap_buffers_with_damage; + continue; + } +#endif +#ifdef EGL_KHR_vg_parent_image + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vg_parent_image", 15)) + { + ret = EGLEW_KHR_vg_parent_image; + continue; + } +#endif +#ifdef EGL_KHR_wait_sync + if (_glewStrSame3(&pos, &len, (const GLubyte*)"wait_sync", 9)) + { + ret = EGLEW_KHR_wait_sync; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) + { +#ifdef EGL_MESA_drm_image + if (_glewStrSame3(&pos, &len, (const GLubyte*)"drm_image", 9)) + { + ret = EGLEW_MESA_drm_image; + continue; + } +#endif +#ifdef EGL_MESA_image_dma_buf_export + if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_dma_buf_export", 20)) + { + ret = EGLEW_MESA_image_dma_buf_export; + continue; + } +#endif +#ifdef EGL_MESA_platform_gbm + if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_gbm", 12)) + { + ret = EGLEW_MESA_platform_gbm; + continue; + } +#endif +#ifdef EGL_MESA_platform_surfaceless + if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_surfaceless", 20)) + { + ret = EGLEW_MESA_platform_surfaceless; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"NOK_", 4)) + { +#ifdef EGL_NOK_swap_region + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_region", 11)) + { + ret = EGLEW_NOK_swap_region; + continue; + } +#endif +#ifdef EGL_NOK_swap_region2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_region2", 12)) + { + ret = EGLEW_NOK_swap_region2; + continue; + } +#endif +#ifdef EGL_NOK_texture_from_pixmap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_from_pixmap", 19)) + { + ret = EGLEW_NOK_texture_from_pixmap; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) + { +#ifdef EGL_NV_3dvision_surface + if (_glewStrSame3(&pos, &len, (const GLubyte*)"3dvision_surface", 16)) + { + ret = EGLEW_NV_3dvision_surface; + continue; + } +#endif +#ifdef EGL_NV_coverage_sample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"coverage_sample", 15)) + { + ret = EGLEW_NV_coverage_sample; + continue; + } +#endif +#ifdef EGL_NV_coverage_sample_resolve + if (_glewStrSame3(&pos, &len, (const GLubyte*)"coverage_sample_resolve", 23)) + { + ret = EGLEW_NV_coverage_sample_resolve; + continue; + } +#endif +#ifdef EGL_NV_cuda_event + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cuda_event", 10)) + { + ret = EGLEW_NV_cuda_event; + continue; + } +#endif +#ifdef EGL_NV_depth_nonlinear + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_nonlinear", 15)) + { + ret = EGLEW_NV_depth_nonlinear; + continue; + } +#endif +#ifdef EGL_NV_device_cuda + if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_cuda", 11)) + { + ret = EGLEW_NV_device_cuda; + continue; + } +#endif +#ifdef EGL_NV_native_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"native_query", 12)) + { + ret = EGLEW_NV_native_query; + continue; + } +#endif +#ifdef EGL_NV_post_convert_rounding + if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_convert_rounding", 21)) + { + ret = EGLEW_NV_post_convert_rounding; + continue; + } +#endif +#ifdef EGL_NV_post_sub_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_sub_buffer", 15)) + { + ret = EGLEW_NV_post_sub_buffer; + continue; + } +#endif +#ifdef EGL_NV_robustness_video_memory_purge + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_video_memory_purge", 29)) + { + ret = EGLEW_NV_robustness_video_memory_purge; + continue; + } +#endif +#ifdef EGL_NV_stream_consumer_gltexture_yuv + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_consumer_gltexture_yuv", 29)) + { + ret = EGLEW_NV_stream_consumer_gltexture_yuv; + continue; + } +#endif +#ifdef EGL_NV_stream_cross_display + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_display", 20)) + { + ret = EGLEW_NV_stream_cross_display; + continue; + } +#endif +#ifdef EGL_NV_stream_cross_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_object", 19)) + { + ret = EGLEW_NV_stream_cross_object; + continue; + } +#endif +#ifdef EGL_NV_stream_cross_partition + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_partition", 22)) + { + ret = EGLEW_NV_stream_cross_partition; + continue; + } +#endif +#ifdef EGL_NV_stream_cross_process + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_process", 20)) + { + ret = EGLEW_NV_stream_cross_process; + continue; + } +#endif +#ifdef EGL_NV_stream_cross_system + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_system", 19)) + { + ret = EGLEW_NV_stream_cross_system; + continue; + } +#endif +#ifdef EGL_NV_stream_fifo_next + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_fifo_next", 16)) + { + ret = EGLEW_NV_stream_fifo_next; + continue; + } +#endif +#ifdef EGL_NV_stream_fifo_synchronous + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_fifo_synchronous", 23)) + { + ret = EGLEW_NV_stream_fifo_synchronous; + continue; + } +#endif +#ifdef EGL_NV_stream_frame_limits + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_frame_limits", 19)) + { + ret = EGLEW_NV_stream_frame_limits; + continue; + } +#endif +#ifdef EGL_NV_stream_metadata + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_metadata", 15)) + { + ret = EGLEW_NV_stream_metadata; + continue; + } +#endif +#ifdef EGL_NV_stream_remote + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_remote", 13)) + { + ret = EGLEW_NV_stream_remote; + continue; + } +#endif +#ifdef EGL_NV_stream_reset + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_reset", 12)) + { + ret = EGLEW_NV_stream_reset; + continue; + } +#endif +#ifdef EGL_NV_stream_socket + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_socket", 13)) + { + ret = EGLEW_NV_stream_socket; + continue; + } +#endif +#ifdef EGL_NV_stream_socket_inet + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_socket_inet", 18)) + { + ret = EGLEW_NV_stream_socket_inet; + continue; + } +#endif +#ifdef EGL_NV_stream_socket_unix + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_socket_unix", 18)) + { + ret = EGLEW_NV_stream_socket_unix; + continue; + } +#endif +#ifdef EGL_NV_stream_sync + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_sync", 11)) + { + ret = EGLEW_NV_stream_sync; + continue; + } +#endif +#ifdef EGL_NV_sync + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync", 4)) + { + ret = EGLEW_NV_sync; + continue; + } +#endif +#ifdef EGL_NV_system_time + if (_glewStrSame3(&pos, &len, (const GLubyte*)"system_time", 11)) + { + ret = EGLEW_NV_system_time; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"TIZEN_", 6)) + { +#ifdef EGL_TIZEN_image_native_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_native_buffer", 19)) + { + ret = EGLEW_TIZEN_image_native_buffer; + continue; + } +#endif +#ifdef EGL_TIZEN_image_native_surface + if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_native_surface", 20)) + { + ret = EGLEW_TIZEN_image_native_surface; + continue; + } +#endif + } + } + ret = (len == 0); + } + return ret; +} + +#endif /* _WIN32 */ diff --git a/src/external/glew/glew.h b/src/external/glew/glew.h new file mode 100644 index 00000000..c79e7d5b --- /dev/null +++ b/src/external/glew/glew.h @@ -0,0 +1,23688 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2008-2017, Nigel Stewart +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Mesa 3-D graphics library + * Version: 7.0 + * + * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* +** Copyright (c) 2007 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +#ifndef __glew_h__ +#define __glew_h__ +#define __GLEW_H__ + +#define GLEW_STATIC + +#if defined(__gl_h_) || defined(__GL_H__) || defined(_GL_H) || defined(__X_GL_H) +#error gl.h included before glew.h +#endif +#if defined(__gl2_h_) +#error gl2.h included before glew.h +#endif +#if defined(__gltypes_h_) +#error gltypes.h included before glew.h +#endif +#if defined(__REGAL_H__) +#error Regal.h included before glew.h +#endif +#if defined(__glext_h_) || defined(__GLEXT_H_) +#error glext.h included before glew.h +#endif +#if defined(__gl_ATI_h_) +#error glATI.h included before glew.h +#endif + +#define __gl_h_ +#define __gl2_h_ +#define __GL_H__ +#define _GL_H +#define __gltypes_h_ +#define __REGAL_H__ +#define __X_GL_H +#define __glext_h_ +#define __GLEXT_H_ +#define __gl_ATI_h_ + +#if defined(_WIN32) + +/* + * GLEW does not include to avoid name space pollution. + * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t + * defined properly. + */ +/* and */ +#ifdef APIENTRY +# ifndef GLAPIENTRY +# define GLAPIENTRY APIENTRY +# endif +# ifndef GLEWAPIENTRY +# define GLEWAPIENTRY APIENTRY +# endif +#else +#define GLEW_APIENTRY_DEFINED +# if defined(__MINGW32__) || defined(__CYGWIN__) || (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) +# define APIENTRY __stdcall +# ifndef GLAPIENTRY +# define GLAPIENTRY __stdcall +# endif +# ifndef GLEWAPIENTRY +# define GLEWAPIENTRY __stdcall +# endif +# else +# define APIENTRY +# endif +#endif +#ifndef GLAPI +# if defined(__MINGW32__) || defined(__CYGWIN__) +# define GLAPI extern +# endif +#endif +/* */ +#ifndef CALLBACK +#define GLEW_CALLBACK_DEFINED +# if defined(__MINGW32__) || defined(__CYGWIN__) +# define CALLBACK __attribute__ ((__stdcall__)) +# elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) +# define CALLBACK __stdcall +# else +# define CALLBACK +# endif +#endif +/* and */ +#ifndef WINGDIAPI +#define GLEW_WINGDIAPI_DEFINED +#define WINGDIAPI __declspec(dllimport) +#endif +/* */ +#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(_WCHAR_T_DEFINED) +typedef unsigned short wchar_t; +# define _WCHAR_T_DEFINED +#endif +/* */ +#if !defined(_W64) +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && defined(_MSC_VER) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif +#if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_) && !defined(__MINGW64__) +# ifdef _WIN64 +typedef __int64 ptrdiff_t; +# else +typedef _W64 int ptrdiff_t; +# endif +# define _PTRDIFF_T_DEFINED +# define _PTRDIFF_T_ +#endif + +#ifndef GLAPI +# if defined(__MINGW32__) || defined(__CYGWIN__) +# define GLAPI extern +# else +# define GLAPI WINGDIAPI +# endif +#endif + +/* + * GLEW_STATIC is defined for static library. + * GLEW_BUILD is defined for building the DLL library. + */ + +#ifdef GLEW_STATIC +# define GLEWAPI extern +#else +# ifdef GLEW_BUILD +# define GLEWAPI extern __declspec(dllexport) +# else +# define GLEWAPI extern __declspec(dllimport) +# endif +#endif + +#else /* _UNIX */ + +/* + * Needed for ptrdiff_t in turn needed by VBO. This is defined by ISO + * C. On my system, this amounts to _3 lines_ of included code, all of + * them pretty much harmless. If you know of a way of detecting 32 vs + * 64 _targets_ at compile time you are free to replace this with + * something that's portable. For now, _this_ is the portable solution. + * (mem, 2004-01-04) + */ + +#include + +/* SGI MIPSPro doesn't like stdint.h in C++ mode */ +/* ID: 3376260 Solaris 9 has inttypes.h, but not stdint.h */ + +#if (defined(__sgi) || defined(__sun)) && !defined(__GNUC__) +#include +#else +#include +#endif + +#define GLEW_APIENTRY_DEFINED +#define APIENTRY + +/* + * GLEW_STATIC is defined for static library. + */ + +#ifdef GLEW_STATIC +# define GLEWAPI extern +#else +# if defined(__GNUC__) && __GNUC__>=4 +# define GLEWAPI extern __attribute__ ((visibility("default"))) +# elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) +# define GLEWAPI extern __global +# else +# define GLEWAPI extern +# endif +#endif + +/* */ +#ifndef GLAPI +#define GLAPI extern +#endif + +#endif /* _WIN32 */ + +#ifndef GLAPIENTRY +#define GLAPIENTRY +#endif + +#ifndef GLEWAPIENTRY +#define GLEWAPIENTRY +#endif + +#define GLEW_VAR_EXPORT GLEWAPI +#define GLEW_FUN_EXPORT GLEWAPI + +#ifdef __cplusplus +extern "C" { +#endif + +/* ----------------------------- GL_VERSION_1_1 ---------------------------- */ + +#ifndef GL_VERSION_1_1 +#define GL_VERSION_1_1 1 + +typedef unsigned int GLenum; +typedef unsigned int GLbitfield; +typedef unsigned int GLuint; +typedef int GLint; +typedef int GLsizei; +typedef unsigned char GLboolean; +typedef signed char GLbyte; +typedef short GLshort; +typedef unsigned char GLubyte; +typedef unsigned short GLushort; +typedef unsigned long GLulong; +typedef float GLfloat; +typedef float GLclampf; +typedef double GLdouble; +typedef double GLclampd; +typedef void GLvoid; +#if defined(_MSC_VER) && _MSC_VER < 1400 +typedef __int64 GLint64EXT; +typedef unsigned __int64 GLuint64EXT; +#elif defined(_MSC_VER) || defined(__BORLANDC__) +typedef signed long long GLint64EXT; +typedef unsigned long long GLuint64EXT; +#else +# if defined(__MINGW32__) || defined(__CYGWIN__) +#include +# endif +typedef int64_t GLint64EXT; +typedef uint64_t GLuint64EXT; +#endif +typedef GLint64EXT GLint64; +typedef GLuint64EXT GLuint64; +typedef struct __GLsync *GLsync; + +typedef char GLchar; + +#define GL_ZERO 0 +#define GL_FALSE 0 +#define GL_LOGIC_OP 0x0BF1 +#define GL_NONE 0 +#define GL_TEXTURE_COMPONENTS 0x1003 +#define GL_NO_ERROR 0 +#define GL_POINTS 0x0000 +#define GL_CURRENT_BIT 0x00000001 +#define GL_TRUE 1 +#define GL_ONE 1 +#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_POINT_BIT 0x00000002 +#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 +#define GL_LINE_STRIP 0x0003 +#define GL_LINE_BIT 0x00000004 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_QUADS 0x0007 +#define GL_QUAD_STRIP 0x0008 +#define GL_POLYGON_BIT 0x00000008 +#define GL_POLYGON 0x0009 +#define GL_POLYGON_STIPPLE_BIT 0x00000010 +#define GL_PIXEL_MODE_BIT 0x00000020 +#define GL_LIGHTING_BIT 0x00000040 +#define GL_FOG_BIT 0x00000080 +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_ACCUM 0x0100 +#define GL_LOAD 0x0101 +#define GL_RETURN 0x0102 +#define GL_MULT 0x0103 +#define GL_ADD 0x0104 +#define GL_NEVER 0x0200 +#define GL_ACCUM_BUFFER_BIT 0x00000200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_RIGHT 0x0403 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_LEFT 0x0406 +#define GL_RIGHT 0x0407 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_AUX0 0x0409 +#define GL_AUX1 0x040A +#define GL_AUX2 0x040B +#define GL_AUX3 0x040C +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_2D 0x0600 +#define GL_3D 0x0601 +#define GL_3D_COLOR 0x0602 +#define GL_3D_COLOR_TEXTURE 0x0603 +#define GL_4D_COLOR_TEXTURE 0x0604 +#define GL_PASS_THROUGH_TOKEN 0x0700 +#define GL_POINT_TOKEN 0x0701 +#define GL_LINE_TOKEN 0x0702 +#define GL_POLYGON_TOKEN 0x0703 +#define GL_BITMAP_TOKEN 0x0704 +#define GL_DRAW_PIXEL_TOKEN 0x0705 +#define GL_COPY_PIXEL_TOKEN 0x0706 +#define GL_LINE_RESET_TOKEN 0x0707 +#define GL_EXP 0x0800 +#define GL_VIEWPORT_BIT 0x00000800 +#define GL_EXP2 0x0801 +#define GL_CW 0x0900 +#define GL_CCW 0x0901 +#define GL_COEFF 0x0A00 +#define GL_ORDER 0x0A01 +#define GL_DOMAIN 0x0A02 +#define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_INDEX 0x0B01 +#define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_CURRENT_RASTER_COLOR 0x0B04 +#define GL_CURRENT_RASTER_INDEX 0x0B05 +#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 +#define GL_CURRENT_RASTER_POSITION 0x0B07 +#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 +#define GL_CURRENT_RASTER_DISTANCE 0x0B09 +#define GL_POINT_SMOOTH 0x0B10 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_RANGE 0x0B12 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_RANGE 0x0B22 +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_LINE_STIPPLE 0x0B24 +#define GL_LINE_STIPPLE_PATTERN 0x0B25 +#define GL_LINE_STIPPLE_REPEAT 0x0B26 +#define GL_LIST_MODE 0x0B30 +#define GL_MAX_LIST_NESTING 0x0B31 +#define GL_LIST_BASE 0x0B32 +#define GL_LIST_INDEX 0x0B33 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_POLYGON_STIPPLE 0x0B42 +#define GL_EDGE_FLAG 0x0B43 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_LIGHTING 0x0B50 +#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 +#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 +#define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_SHADE_MODEL 0x0B54 +#define GL_COLOR_MATERIAL_FACE 0x0B55 +#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 +#define GL_COLOR_MATERIAL 0x0B57 +#define GL_FOG 0x0B60 +#define GL_FOG_INDEX 0x0B61 +#define GL_FOG_DENSITY 0x0B62 +#define GL_FOG_START 0x0B63 +#define GL_FOG_END 0x0B64 +#define GL_FOG_MODE 0x0B65 +#define GL_FOG_COLOR 0x0B66 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_ACCUM_CLEAR_VALUE 0x0B80 +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_MATRIX_MODE 0x0BA0 +#define GL_NORMALIZE 0x0BA1 +#define GL_VIEWPORT 0x0BA2 +#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 +#define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_TEXTURE_STACK_DEPTH 0x0BA5 +#define GL_MODELVIEW_MATRIX 0x0BA6 +#define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_ATTRIB_STACK_DEPTH 0x0BB0 +#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 +#define GL_ALPHA_TEST 0x0BC0 +#define GL_ALPHA_TEST_FUNC 0x0BC1 +#define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_DITHER 0x0BD0 +#define GL_BLEND_DST 0x0BE0 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND 0x0BE2 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_INDEX_LOGIC_OP 0x0BF1 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_AUX_BUFFERS 0x0C00 +#define GL_DRAW_BUFFER 0x0C01 +#define GL_READ_BUFFER 0x0C02 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_INDEX_CLEAR_VALUE 0x0C20 +#define GL_INDEX_WRITEMASK 0x0C21 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_INDEX_MODE 0x0C30 +#define GL_RGBA_MODE 0x0C31 +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_STEREO 0x0C33 +#define GL_RENDER_MODE 0x0C40 +#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_FOG_HINT 0x0C54 +#define GL_TEXTURE_GEN_S 0x0C60 +#define GL_TEXTURE_GEN_T 0x0C61 +#define GL_TEXTURE_GEN_R 0x0C62 +#define GL_TEXTURE_GEN_Q 0x0C63 +#define GL_PIXEL_MAP_I_TO_I 0x0C70 +#define GL_PIXEL_MAP_S_TO_S 0x0C71 +#define GL_PIXEL_MAP_I_TO_R 0x0C72 +#define GL_PIXEL_MAP_I_TO_G 0x0C73 +#define GL_PIXEL_MAP_I_TO_B 0x0C74 +#define GL_PIXEL_MAP_I_TO_A 0x0C75 +#define GL_PIXEL_MAP_R_TO_R 0x0C76 +#define GL_PIXEL_MAP_G_TO_G 0x0C77 +#define GL_PIXEL_MAP_B_TO_B 0x0C78 +#define GL_PIXEL_MAP_A_TO_A 0x0C79 +#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 +#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 +#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 +#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 +#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 +#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 +#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 +#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 +#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 +#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_MAP_COLOR 0x0D10 +#define GL_MAP_STENCIL 0x0D11 +#define GL_INDEX_SHIFT 0x0D12 +#define GL_INDEX_OFFSET 0x0D13 +#define GL_RED_SCALE 0x0D14 +#define GL_RED_BIAS 0x0D15 +#define GL_ZOOM_X 0x0D16 +#define GL_ZOOM_Y 0x0D17 +#define GL_GREEN_SCALE 0x0D18 +#define GL_GREEN_BIAS 0x0D19 +#define GL_BLUE_SCALE 0x0D1A +#define GL_BLUE_BIAS 0x0D1B +#define GL_ALPHA_SCALE 0x0D1C +#define GL_ALPHA_BIAS 0x0D1D +#define GL_DEPTH_SCALE 0x0D1E +#define GL_DEPTH_BIAS 0x0D1F +#define GL_MAX_EVAL_ORDER 0x0D30 +#define GL_MAX_LIGHTS 0x0D31 +#define GL_MAX_CLIP_PLANES 0x0D32 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 +#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 +#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_NAME_STACK_DEPTH 0x0D37 +#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_INDEX_BITS 0x0D51 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_ALPHA_BITS 0x0D55 +#define GL_DEPTH_BITS 0x0D56 +#define GL_STENCIL_BITS 0x0D57 +#define GL_ACCUM_RED_BITS 0x0D58 +#define GL_ACCUM_GREEN_BITS 0x0D59 +#define GL_ACCUM_BLUE_BITS 0x0D5A +#define GL_ACCUM_ALPHA_BITS 0x0D5B +#define GL_NAME_STACK_DEPTH 0x0D70 +#define GL_AUTO_NORMAL 0x0D80 +#define GL_MAP1_COLOR_4 0x0D90 +#define GL_MAP1_INDEX 0x0D91 +#define GL_MAP1_NORMAL 0x0D92 +#define GL_MAP1_TEXTURE_COORD_1 0x0D93 +#define GL_MAP1_TEXTURE_COORD_2 0x0D94 +#define GL_MAP1_TEXTURE_COORD_3 0x0D95 +#define GL_MAP1_TEXTURE_COORD_4 0x0D96 +#define GL_MAP1_VERTEX_3 0x0D97 +#define GL_MAP1_VERTEX_4 0x0D98 +#define GL_MAP2_COLOR_4 0x0DB0 +#define GL_MAP2_INDEX 0x0DB1 +#define GL_MAP2_NORMAL 0x0DB2 +#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 +#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 +#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 +#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 +#define GL_MAP2_VERTEX_3 0x0DB7 +#define GL_MAP2_VERTEX_4 0x0DB8 +#define GL_MAP1_GRID_DOMAIN 0x0DD0 +#define GL_MAP1_GRID_SEGMENTS 0x0DD1 +#define GL_MAP2_GRID_DOMAIN 0x0DD2 +#define GL_MAP2_GRID_SEGMENTS 0x0DD3 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 +#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 +#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 +#define GL_SELECTION_BUFFER_POINTER 0x0DF3 +#define GL_SELECTION_BUFFER_SIZE 0x0DF4 +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TRANSFORM_BIT 0x00001000 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_BORDER 0x1005 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 +#define GL_AMBIENT 0x1200 +#define GL_DIFFUSE 0x1201 +#define GL_SPECULAR 0x1202 +#define GL_POSITION 0x1203 +#define GL_SPOT_DIRECTION 0x1204 +#define GL_SPOT_EXPONENT 0x1205 +#define GL_SPOT_CUTOFF 0x1206 +#define GL_CONSTANT_ATTENUATION 0x1207 +#define GL_LINEAR_ATTENUATION 0x1208 +#define GL_QUADRATIC_ATTENUATION 0x1209 +#define GL_COMPILE 0x1300 +#define GL_COMPILE_AND_EXECUTE 0x1301 +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_2_BYTES 0x1407 +#define GL_3_BYTES 0x1408 +#define GL_4_BYTES 0x1409 +#define GL_DOUBLE 0x140A +#define GL_CLEAR 0x1500 +#define GL_AND 0x1501 +#define GL_AND_REVERSE 0x1502 +#define GL_COPY 0x1503 +#define GL_AND_INVERTED 0x1504 +#define GL_NOOP 0x1505 +#define GL_XOR 0x1506 +#define GL_OR 0x1507 +#define GL_NOR 0x1508 +#define GL_EQUIV 0x1509 +#define GL_INVERT 0x150A +#define GL_OR_REVERSE 0x150B +#define GL_COPY_INVERTED 0x150C +#define GL_OR_INVERTED 0x150D +#define GL_NAND 0x150E +#define GL_SET 0x150F +#define GL_EMISSION 0x1600 +#define GL_SHININESS 0x1601 +#define GL_AMBIENT_AND_DIFFUSE 0x1602 +#define GL_COLOR_INDEXES 0x1603 +#define GL_MODELVIEW 0x1700 +#define GL_PROJECTION 0x1701 +#define GL_TEXTURE 0x1702 +#define GL_COLOR 0x1800 +#define GL_DEPTH 0x1801 +#define GL_STENCIL 0x1802 +#define GL_COLOR_INDEX 0x1900 +#define GL_STENCIL_INDEX 0x1901 +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +#define GL_BITMAP 0x1A00 +#define GL_POINT 0x1B00 +#define GL_LINE 0x1B01 +#define GL_FILL 0x1B02 +#define GL_RENDER 0x1C00 +#define GL_FEEDBACK 0x1C01 +#define GL_SELECT 0x1C02 +#define GL_FLAT 0x1D00 +#define GL_SMOOTH 0x1D01 +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 +#define GL_S 0x2000 +#define GL_ENABLE_BIT 0x00002000 +#define GL_T 0x2001 +#define GL_R 0x2002 +#define GL_Q 0x2003 +#define GL_MODULATE 0x2100 +#define GL_DECAL 0x2101 +#define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_ENV_COLOR 0x2201 +#define GL_TEXTURE_ENV 0x2300 +#define GL_EYE_LINEAR 0x2400 +#define GL_OBJECT_LINEAR 0x2401 +#define GL_SPHERE_MAP 0x2402 +#define GL_TEXTURE_GEN_MODE 0x2500 +#define GL_OBJECT_PLANE 0x2501 +#define GL_EYE_PLANE 0x2502 +#define GL_NEAREST 0x2600 +#define GL_LINEAR 0x2601 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_CLAMP 0x2900 +#define GL_REPEAT 0x2901 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_R3_G3_B2 0x2A10 +#define GL_V2F 0x2A20 +#define GL_V3F 0x2A21 +#define GL_C4UB_V2F 0x2A22 +#define GL_C4UB_V3F 0x2A23 +#define GL_C3F_V3F 0x2A24 +#define GL_N3F_V3F 0x2A25 +#define GL_C4F_N3F_V3F 0x2A26 +#define GL_T2F_V3F 0x2A27 +#define GL_T4F_V4F 0x2A28 +#define GL_T2F_C4UB_V3F 0x2A29 +#define GL_T2F_C3F_V3F 0x2A2A +#define GL_T2F_N3F_V3F 0x2A2B +#define GL_T2F_C4F_N3F_V3F 0x2A2C +#define GL_T4F_C4F_N3F_V4F 0x2A2D +#define GL_CLIP_PLANE0 0x3000 +#define GL_CLIP_PLANE1 0x3001 +#define GL_CLIP_PLANE2 0x3002 +#define GL_CLIP_PLANE3 0x3003 +#define GL_CLIP_PLANE4 0x3004 +#define GL_CLIP_PLANE5 0x3005 +#define GL_LIGHT0 0x4000 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_LIGHT1 0x4001 +#define GL_LIGHT2 0x4002 +#define GL_LIGHT3 0x4003 +#define GL_LIGHT4 0x4004 +#define GL_LIGHT5 0x4005 +#define GL_LIGHT6 0x4006 +#define GL_LIGHT7 0x4007 +#define GL_HINT_BIT 0x00008000 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_ALPHA4 0x803B +#define GL_ALPHA8 0x803C +#define GL_ALPHA12 0x803D +#define GL_ALPHA16 0x803E +#define GL_LUMINANCE4 0x803F +#define GL_LUMINANCE8 0x8040 +#define GL_LUMINANCE12 0x8041 +#define GL_LUMINANCE16 0x8042 +#define GL_LUMINANCE4_ALPHA4 0x8043 +#define GL_LUMINANCE6_ALPHA2 0x8044 +#define GL_LUMINANCE8_ALPHA8 0x8045 +#define GL_LUMINANCE12_ALPHA4 0x8046 +#define GL_LUMINANCE12_ALPHA12 0x8047 +#define GL_LUMINANCE16_ALPHA16 0x8048 +#define GL_INTENSITY 0x8049 +#define GL_INTENSITY4 0x804A +#define GL_INTENSITY8 0x804B +#define GL_INTENSITY12 0x804C +#define GL_INTENSITY16 0x804D +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB8 0x8051 +#define GL_RGB10 0x8052 +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGBA2 0x8055 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGBA8 0x8058 +#define GL_RGB10_A2 0x8059 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE 0x8061 +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_TEXTURE_PRIORITY 0x8066 +#define GL_TEXTURE_RESIDENT 0x8067 +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_VERTEX_ARRAY 0x8074 +#define GL_NORMAL_ARRAY 0x8075 +#define GL_COLOR_ARRAY 0x8076 +#define GL_INDEX_ARRAY 0x8077 +#define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_EDGE_FLAG_ARRAY 0x8079 +#define GL_VERTEX_ARRAY_SIZE 0x807A +#define GL_VERTEX_ARRAY_TYPE 0x807B +#define GL_VERTEX_ARRAY_STRIDE 0x807C +#define GL_NORMAL_ARRAY_TYPE 0x807E +#define GL_NORMAL_ARRAY_STRIDE 0x807F +#define GL_COLOR_ARRAY_SIZE 0x8081 +#define GL_COLOR_ARRAY_TYPE 0x8082 +#define GL_COLOR_ARRAY_STRIDE 0x8083 +#define GL_INDEX_ARRAY_TYPE 0x8085 +#define GL_INDEX_ARRAY_STRIDE 0x8086 +#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A +#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C +#define GL_VERTEX_ARRAY_POINTER 0x808E +#define GL_NORMAL_ARRAY_POINTER 0x808F +#define GL_COLOR_ARRAY_POINTER 0x8090 +#define GL_INDEX_ARRAY_POINTER 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_EVAL_BIT 0x00010000 +#define GL_LIST_BIT 0x00020000 +#define GL_TEXTURE_BIT 0x00040000 +#define GL_SCISSOR_BIT 0x00080000 +#define GL_ALL_ATTRIB_BITS 0x000fffff +#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff + +GLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value); +GLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref); +GLAPI GLboolean GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences); +GLAPI void GLAPIENTRY glArrayElement (GLint i); +GLAPI void GLAPIENTRY glBegin (GLenum mode); +GLAPI void GLAPIENTRY glBindTexture (GLenum target, GLuint texture); +GLAPI void GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); +GLAPI void GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); +GLAPI void GLAPIENTRY glCallList (GLuint list); +GLAPI void GLAPIENTRY glCallLists (GLsizei n, GLenum type, const void *lists); +GLAPI void GLAPIENTRY glClear (GLbitfield mask); +GLAPI void GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +GLAPI void GLAPIENTRY glClearDepth (GLclampd depth); +GLAPI void GLAPIENTRY glClearIndex (GLfloat c); +GLAPI void GLAPIENTRY glClearStencil (GLint s); +GLAPI void GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation); +GLAPI void GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void GLAPIENTRY glColor3bv (const GLbyte *v); +GLAPI void GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void GLAPIENTRY glColor3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void GLAPIENTRY glColor3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue); +GLAPI void GLAPIENTRY glColor3iv (const GLint *v); +GLAPI void GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue); +GLAPI void GLAPIENTRY glColor3sv (const GLshort *v); +GLAPI void GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void GLAPIENTRY glColor3ubv (const GLubyte *v); +GLAPI void GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue); +GLAPI void GLAPIENTRY glColor3uiv (const GLuint *v); +GLAPI void GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue); +GLAPI void GLAPIENTRY glColor3usv (const GLushort *v); +GLAPI void GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); +GLAPI void GLAPIENTRY glColor4bv (const GLbyte *v); +GLAPI void GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); +GLAPI void GLAPIENTRY glColor4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void GLAPIENTRY glColor4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha); +GLAPI void GLAPIENTRY glColor4iv (const GLint *v); +GLAPI void GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha); +GLAPI void GLAPIENTRY glColor4sv (const GLshort *v); +GLAPI void GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); +GLAPI void GLAPIENTRY glColor4ubv (const GLubyte *v); +GLAPI void GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha); +GLAPI void GLAPIENTRY glColor4uiv (const GLuint *v); +GLAPI void GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha); +GLAPI void GLAPIENTRY glColor4usv (const GLushort *v); +GLAPI void GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +GLAPI void GLAPIENTRY glColorMaterial (GLenum face, GLenum mode); +GLAPI void GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); +GLAPI void GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void GLAPIENTRY glCullFace (GLenum mode); +GLAPI void GLAPIENTRY glDeleteLists (GLuint list, GLsizei range); +GLAPI void GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); +GLAPI void GLAPIENTRY glDepthFunc (GLenum func); +GLAPI void GLAPIENTRY glDepthMask (GLboolean flag); +GLAPI void GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar); +GLAPI void GLAPIENTRY glDisable (GLenum cap); +GLAPI void GLAPIENTRY glDisableClientState (GLenum array); +GLAPI void GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); +GLAPI void GLAPIENTRY glDrawBuffer (GLenum mode); +GLAPI void GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); +GLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag); +GLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const void *pointer); +GLAPI void GLAPIENTRY glEdgeFlagv (const GLboolean *flag); +GLAPI void GLAPIENTRY glEnable (GLenum cap); +GLAPI void GLAPIENTRY glEnableClientState (GLenum array); +GLAPI void GLAPIENTRY glEnd (void); +GLAPI void GLAPIENTRY glEndList (void); +GLAPI void GLAPIENTRY glEvalCoord1d (GLdouble u); +GLAPI void GLAPIENTRY glEvalCoord1dv (const GLdouble *u); +GLAPI void GLAPIENTRY glEvalCoord1f (GLfloat u); +GLAPI void GLAPIENTRY glEvalCoord1fv (const GLfloat *u); +GLAPI void GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v); +GLAPI void GLAPIENTRY glEvalCoord2dv (const GLdouble *u); +GLAPI void GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v); +GLAPI void GLAPIENTRY glEvalCoord2fv (const GLfloat *u); +GLAPI void GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2); +GLAPI void GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); +GLAPI void GLAPIENTRY glEvalPoint1 (GLint i); +GLAPI void GLAPIENTRY glEvalPoint2 (GLint i, GLint j); +GLAPI void GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer); +GLAPI void GLAPIENTRY glFinish (void); +GLAPI void GLAPIENTRY glFlush (void); +GLAPI void GLAPIENTRY glFogf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glFogi (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glFogiv (GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glFrontFace (GLenum mode); +GLAPI void GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI GLuint GLAPIENTRY glGenLists (GLsizei range); +GLAPI void GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures); +GLAPI void GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params); +GLAPI void GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation); +GLAPI void GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params); +GLAPI GLenum GLAPIENTRY glGetError (void); +GLAPI void GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v); +GLAPI void GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v); +GLAPI void GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v); +GLAPI void GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values); +GLAPI void GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values); +GLAPI void GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values); +GLAPI void GLAPIENTRY glGetPointerv (GLenum pname, void* *params); +GLAPI void GLAPIENTRY glGetPolygonStipple (GLubyte *mask); +GLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name); +GLAPI void GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params); +GLAPI void GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +GLAPI void GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glHint (GLenum target, GLenum mode); +GLAPI void GLAPIENTRY glIndexMask (GLuint mask); +GLAPI void GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const void *pointer); +GLAPI void GLAPIENTRY glIndexd (GLdouble c); +GLAPI void GLAPIENTRY glIndexdv (const GLdouble *c); +GLAPI void GLAPIENTRY glIndexf (GLfloat c); +GLAPI void GLAPIENTRY glIndexfv (const GLfloat *c); +GLAPI void GLAPIENTRY glIndexi (GLint c); +GLAPI void GLAPIENTRY glIndexiv (const GLint *c); +GLAPI void GLAPIENTRY glIndexs (GLshort c); +GLAPI void GLAPIENTRY glIndexsv (const GLshort *c); +GLAPI void GLAPIENTRY glIndexub (GLubyte c); +GLAPI void GLAPIENTRY glIndexubv (const GLubyte *c); +GLAPI void GLAPIENTRY glInitNames (void); +GLAPI void GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const void *pointer); +GLAPI GLboolean GLAPIENTRY glIsEnabled (GLenum cap); +GLAPI GLboolean GLAPIENTRY glIsList (GLuint list); +GLAPI GLboolean GLAPIENTRY glIsTexture (GLuint texture); +GLAPI void GLAPIENTRY glLightModelf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glLightModeli (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glLineStipple (GLint factor, GLushort pattern); +GLAPI void GLAPIENTRY glLineWidth (GLfloat width); +GLAPI void GLAPIENTRY glListBase (GLuint base); +GLAPI void GLAPIENTRY glLoadIdentity (void); +GLAPI void GLAPIENTRY glLoadMatrixd (const GLdouble *m); +GLAPI void GLAPIENTRY glLoadMatrixf (const GLfloat *m); +GLAPI void GLAPIENTRY glLoadName (GLuint name); +GLAPI void GLAPIENTRY glLogicOp (GLenum opcode); +GLAPI void GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +GLAPI void GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +GLAPI void GLAPIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +GLAPI void GLAPIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +GLAPI void GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2); +GLAPI void GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2); +GLAPI void GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); +GLAPI void GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); +GLAPI void GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glMatrixMode (GLenum mode); +GLAPI void GLAPIENTRY glMultMatrixd (const GLdouble *m); +GLAPI void GLAPIENTRY glMultMatrixf (const GLfloat *m); +GLAPI void GLAPIENTRY glNewList (GLuint list, GLenum mode); +GLAPI void GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz); +GLAPI void GLAPIENTRY glNormal3bv (const GLbyte *v); +GLAPI void GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz); +GLAPI void GLAPIENTRY glNormal3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); +GLAPI void GLAPIENTRY glNormal3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz); +GLAPI void GLAPIENTRY glNormal3iv (const GLint *v); +GLAPI void GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz); +GLAPI void GLAPIENTRY glNormal3sv (const GLshort *v); +GLAPI void GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const void *pointer); +GLAPI void GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void GLAPIENTRY glPassThrough (GLfloat token); +GLAPI void GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values); +GLAPI void GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values); +GLAPI void GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values); +GLAPI void GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glPixelStorei (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glPixelTransferi (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor); +GLAPI void GLAPIENTRY glPointSize (GLfloat size); +GLAPI void GLAPIENTRY glPolygonMode (GLenum face, GLenum mode); +GLAPI void GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units); +GLAPI void GLAPIENTRY glPolygonStipple (const GLubyte *mask); +GLAPI void GLAPIENTRY glPopAttrib (void); +GLAPI void GLAPIENTRY glPopClientAttrib (void); +GLAPI void GLAPIENTRY glPopMatrix (void); +GLAPI void GLAPIENTRY glPopName (void); +GLAPI void GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities); +GLAPI void GLAPIENTRY glPushAttrib (GLbitfield mask); +GLAPI void GLAPIENTRY glPushClientAttrib (GLbitfield mask); +GLAPI void GLAPIENTRY glPushMatrix (void); +GLAPI void GLAPIENTRY glPushName (GLuint name); +GLAPI void GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y); +GLAPI void GLAPIENTRY glRasterPos2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y); +GLAPI void GLAPIENTRY glRasterPos2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos2i (GLint x, GLint y); +GLAPI void GLAPIENTRY glRasterPos2iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos2s (GLshort x, GLshort y); +GLAPI void GLAPIENTRY glRasterPos2sv (const GLshort *v); +GLAPI void GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glRasterPos3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glRasterPos3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z); +GLAPI void GLAPIENTRY glRasterPos3iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z); +GLAPI void GLAPIENTRY glRasterPos3sv (const GLshort *v); +GLAPI void GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void GLAPIENTRY glRasterPos4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void GLAPIENTRY glRasterPos4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w); +GLAPI void GLAPIENTRY glRasterPos4iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void GLAPIENTRY glRasterPos4sv (const GLshort *v); +GLAPI void GLAPIENTRY glReadBuffer (GLenum mode); +GLAPI void GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); +GLAPI void GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); +GLAPI void GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2); +GLAPI void GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); +GLAPI void GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2); +GLAPI void GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2); +GLAPI void GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2); +GLAPI void GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2); +GLAPI void GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2); +GLAPI GLint GLAPIENTRY glRenderMode (GLenum mode); +GLAPI void GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer); +GLAPI void GLAPIENTRY glShadeModel (GLenum mode); +GLAPI void GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); +GLAPI void GLAPIENTRY glStencilMask (GLuint mask); +GLAPI void GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); +GLAPI void GLAPIENTRY glTexCoord1d (GLdouble s); +GLAPI void GLAPIENTRY glTexCoord1dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord1f (GLfloat s); +GLAPI void GLAPIENTRY glTexCoord1fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord1i (GLint s); +GLAPI void GLAPIENTRY glTexCoord1iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord1s (GLshort s); +GLAPI void GLAPIENTRY glTexCoord1sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t); +GLAPI void GLAPIENTRY glTexCoord2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t); +GLAPI void GLAPIENTRY glTexCoord2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord2i (GLint s, GLint t); +GLAPI void GLAPIENTRY glTexCoord2iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord2s (GLshort s, GLshort t); +GLAPI void GLAPIENTRY glTexCoord2sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r); +GLAPI void GLAPIENTRY glTexCoord3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r); +GLAPI void GLAPIENTRY glTexCoord3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r); +GLAPI void GLAPIENTRY glTexCoord3iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r); +GLAPI void GLAPIENTRY glTexCoord3sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void GLAPIENTRY glTexCoord4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void GLAPIENTRY glTexCoord4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q); +GLAPI void GLAPIENTRY glTexCoord4iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void GLAPIENTRY glTexCoord4sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param); +GLAPI void GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params); +GLAPI void GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glVertex2d (GLdouble x, GLdouble y); +GLAPI void GLAPIENTRY glVertex2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex2f (GLfloat x, GLfloat y); +GLAPI void GLAPIENTRY glVertex2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex2i (GLint x, GLint y); +GLAPI void GLAPIENTRY glVertex2iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex2s (GLshort x, GLshort y); +GLAPI void GLAPIENTRY glVertex2sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glVertex3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glVertex3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z); +GLAPI void GLAPIENTRY glVertex3iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z); +GLAPI void GLAPIENTRY glVertex3sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void GLAPIENTRY glVertex4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void GLAPIENTRY glVertex4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w); +GLAPI void GLAPIENTRY glVertex4iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void GLAPIENTRY glVertex4sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); + +#define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1) + +#endif /* GL_VERSION_1_1 */ + +/* ---------------------------------- GLU ---------------------------------- */ + +#ifndef GLEW_NO_GLU +# ifdef __APPLE__ +# include +# if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +# define GLEW_NO_GLU +# endif +# endif +#endif + +#ifndef GLEW_NO_GLU +/* this is where we can safely include GLU */ +# if defined(__APPLE__) && defined(__MACH__) +# include +# else +# include +# endif +#endif + +/* ----------------------------- GL_VERSION_1_2 ---------------------------- */ + +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 + +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_RESCALE_NORMAL 0x803A +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E + +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); + +#define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D) +#define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements) +#define glTexImage3D GLEW_GET_FUN(__glewTexImage3D) +#define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D) + +#define GLEW_VERSION_1_2 GLEW_GET_VAR(__GLEW_VERSION_1_2) + +#endif /* GL_VERSION_1_2 */ + +/* ---------------------------- GL_VERSION_1_2_1 --------------------------- */ + +#ifndef GL_VERSION_1_2_1 +#define GL_VERSION_1_2_1 1 + +#define GLEW_VERSION_1_2_1 GLEW_GET_VAR(__GLEW_VERSION_1_2_1) + +#endif /* GL_VERSION_1_2_1 */ + +/* ----------------------------- GL_VERSION_1_3 ---------------------------- */ + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 + +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_SUBTRACT 0x84E7 +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#define GL_MULTISAMPLE_BIT 0x20000000 + +typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, void *img); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); + +#define glActiveTexture GLEW_GET_FUN(__glewActiveTexture) +#define glClientActiveTexture GLEW_GET_FUN(__glewClientActiveTexture) +#define glCompressedTexImage1D GLEW_GET_FUN(__glewCompressedTexImage1D) +#define glCompressedTexImage2D GLEW_GET_FUN(__glewCompressedTexImage2D) +#define glCompressedTexImage3D GLEW_GET_FUN(__glewCompressedTexImage3D) +#define glCompressedTexSubImage1D GLEW_GET_FUN(__glewCompressedTexSubImage1D) +#define glCompressedTexSubImage2D GLEW_GET_FUN(__glewCompressedTexSubImage2D) +#define glCompressedTexSubImage3D GLEW_GET_FUN(__glewCompressedTexSubImage3D) +#define glGetCompressedTexImage GLEW_GET_FUN(__glewGetCompressedTexImage) +#define glLoadTransposeMatrixd GLEW_GET_FUN(__glewLoadTransposeMatrixd) +#define glLoadTransposeMatrixf GLEW_GET_FUN(__glewLoadTransposeMatrixf) +#define glMultTransposeMatrixd GLEW_GET_FUN(__glewMultTransposeMatrixd) +#define glMultTransposeMatrixf GLEW_GET_FUN(__glewMultTransposeMatrixf) +#define glMultiTexCoord1d GLEW_GET_FUN(__glewMultiTexCoord1d) +#define glMultiTexCoord1dv GLEW_GET_FUN(__glewMultiTexCoord1dv) +#define glMultiTexCoord1f GLEW_GET_FUN(__glewMultiTexCoord1f) +#define glMultiTexCoord1fv GLEW_GET_FUN(__glewMultiTexCoord1fv) +#define glMultiTexCoord1i GLEW_GET_FUN(__glewMultiTexCoord1i) +#define glMultiTexCoord1iv GLEW_GET_FUN(__glewMultiTexCoord1iv) +#define glMultiTexCoord1s GLEW_GET_FUN(__glewMultiTexCoord1s) +#define glMultiTexCoord1sv GLEW_GET_FUN(__glewMultiTexCoord1sv) +#define glMultiTexCoord2d GLEW_GET_FUN(__glewMultiTexCoord2d) +#define glMultiTexCoord2dv GLEW_GET_FUN(__glewMultiTexCoord2dv) +#define glMultiTexCoord2f GLEW_GET_FUN(__glewMultiTexCoord2f) +#define glMultiTexCoord2fv GLEW_GET_FUN(__glewMultiTexCoord2fv) +#define glMultiTexCoord2i GLEW_GET_FUN(__glewMultiTexCoord2i) +#define glMultiTexCoord2iv GLEW_GET_FUN(__glewMultiTexCoord2iv) +#define glMultiTexCoord2s GLEW_GET_FUN(__glewMultiTexCoord2s) +#define glMultiTexCoord2sv GLEW_GET_FUN(__glewMultiTexCoord2sv) +#define glMultiTexCoord3d GLEW_GET_FUN(__glewMultiTexCoord3d) +#define glMultiTexCoord3dv GLEW_GET_FUN(__glewMultiTexCoord3dv) +#define glMultiTexCoord3f GLEW_GET_FUN(__glewMultiTexCoord3f) +#define glMultiTexCoord3fv GLEW_GET_FUN(__glewMultiTexCoord3fv) +#define glMultiTexCoord3i GLEW_GET_FUN(__glewMultiTexCoord3i) +#define glMultiTexCoord3iv GLEW_GET_FUN(__glewMultiTexCoord3iv) +#define glMultiTexCoord3s GLEW_GET_FUN(__glewMultiTexCoord3s) +#define glMultiTexCoord3sv GLEW_GET_FUN(__glewMultiTexCoord3sv) +#define glMultiTexCoord4d GLEW_GET_FUN(__glewMultiTexCoord4d) +#define glMultiTexCoord4dv GLEW_GET_FUN(__glewMultiTexCoord4dv) +#define glMultiTexCoord4f GLEW_GET_FUN(__glewMultiTexCoord4f) +#define glMultiTexCoord4fv GLEW_GET_FUN(__glewMultiTexCoord4fv) +#define glMultiTexCoord4i GLEW_GET_FUN(__glewMultiTexCoord4i) +#define glMultiTexCoord4iv GLEW_GET_FUN(__glewMultiTexCoord4iv) +#define glMultiTexCoord4s GLEW_GET_FUN(__glewMultiTexCoord4s) +#define glMultiTexCoord4sv GLEW_GET_FUN(__glewMultiTexCoord4sv) +#define glSampleCoverage GLEW_GET_FUN(__glewSampleCoverage) + +#define GLEW_VERSION_1_3 GLEW_GET_VAR(__GLEW_VERSION_1_3) + +#endif /* GL_VERSION_1_3 */ + +/* ----------------------------- GL_VERSION_1_4 ---------------------------- */ + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 + +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_COMPARE_R_TO_TEXTURE 0x884E + +typedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const* indices, GLsizei drawcount); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p); + +#define glBlendColor GLEW_GET_FUN(__glewBlendColor) +#define glBlendEquation GLEW_GET_FUN(__glewBlendEquation) +#define glBlendFuncSeparate GLEW_GET_FUN(__glewBlendFuncSeparate) +#define glFogCoordPointer GLEW_GET_FUN(__glewFogCoordPointer) +#define glFogCoordd GLEW_GET_FUN(__glewFogCoordd) +#define glFogCoorddv GLEW_GET_FUN(__glewFogCoorddv) +#define glFogCoordf GLEW_GET_FUN(__glewFogCoordf) +#define glFogCoordfv GLEW_GET_FUN(__glewFogCoordfv) +#define glMultiDrawArrays GLEW_GET_FUN(__glewMultiDrawArrays) +#define glMultiDrawElements GLEW_GET_FUN(__glewMultiDrawElements) +#define glPointParameterf GLEW_GET_FUN(__glewPointParameterf) +#define glPointParameterfv GLEW_GET_FUN(__glewPointParameterfv) +#define glPointParameteri GLEW_GET_FUN(__glewPointParameteri) +#define glPointParameteriv GLEW_GET_FUN(__glewPointParameteriv) +#define glSecondaryColor3b GLEW_GET_FUN(__glewSecondaryColor3b) +#define glSecondaryColor3bv GLEW_GET_FUN(__glewSecondaryColor3bv) +#define glSecondaryColor3d GLEW_GET_FUN(__glewSecondaryColor3d) +#define glSecondaryColor3dv GLEW_GET_FUN(__glewSecondaryColor3dv) +#define glSecondaryColor3f GLEW_GET_FUN(__glewSecondaryColor3f) +#define glSecondaryColor3fv GLEW_GET_FUN(__glewSecondaryColor3fv) +#define glSecondaryColor3i GLEW_GET_FUN(__glewSecondaryColor3i) +#define glSecondaryColor3iv GLEW_GET_FUN(__glewSecondaryColor3iv) +#define glSecondaryColor3s GLEW_GET_FUN(__glewSecondaryColor3s) +#define glSecondaryColor3sv GLEW_GET_FUN(__glewSecondaryColor3sv) +#define glSecondaryColor3ub GLEW_GET_FUN(__glewSecondaryColor3ub) +#define glSecondaryColor3ubv GLEW_GET_FUN(__glewSecondaryColor3ubv) +#define glSecondaryColor3ui GLEW_GET_FUN(__glewSecondaryColor3ui) +#define glSecondaryColor3uiv GLEW_GET_FUN(__glewSecondaryColor3uiv) +#define glSecondaryColor3us GLEW_GET_FUN(__glewSecondaryColor3us) +#define glSecondaryColor3usv GLEW_GET_FUN(__glewSecondaryColor3usv) +#define glSecondaryColorPointer GLEW_GET_FUN(__glewSecondaryColorPointer) +#define glWindowPos2d GLEW_GET_FUN(__glewWindowPos2d) +#define glWindowPos2dv GLEW_GET_FUN(__glewWindowPos2dv) +#define glWindowPos2f GLEW_GET_FUN(__glewWindowPos2f) +#define glWindowPos2fv GLEW_GET_FUN(__glewWindowPos2fv) +#define glWindowPos2i GLEW_GET_FUN(__glewWindowPos2i) +#define glWindowPos2iv GLEW_GET_FUN(__glewWindowPos2iv) +#define glWindowPos2s GLEW_GET_FUN(__glewWindowPos2s) +#define glWindowPos2sv GLEW_GET_FUN(__glewWindowPos2sv) +#define glWindowPos3d GLEW_GET_FUN(__glewWindowPos3d) +#define glWindowPos3dv GLEW_GET_FUN(__glewWindowPos3dv) +#define glWindowPos3f GLEW_GET_FUN(__glewWindowPos3f) +#define glWindowPos3fv GLEW_GET_FUN(__glewWindowPos3fv) +#define glWindowPos3i GLEW_GET_FUN(__glewWindowPos3i) +#define glWindowPos3iv GLEW_GET_FUN(__glewWindowPos3iv) +#define glWindowPos3s GLEW_GET_FUN(__glewWindowPos3s) +#define glWindowPos3sv GLEW_GET_FUN(__glewWindowPos3sv) + +#define GLEW_VERSION_1_4 GLEW_GET_VAR(__GLEW_VERSION_1_4) + +#endif /* GL_VERSION_1_4 */ + +/* ----------------------------- GL_VERSION_1_5 ---------------------------- */ + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 + +#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE +#define GL_FOG_COORD GL_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING +#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER +#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE +#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE +#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE +#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA +#define GL_SRC0_RGB GL_SOURCE0_RGB +#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA +#define GL_SRC1_RGB GL_SOURCE1_RGB +#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA +#define GL_SRC2_RGB GL_SOURCE2_RGB +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 + +typedef ptrdiff_t GLintptr; +typedef ptrdiff_t GLsizeiptr; + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void* data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void* data); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void** params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void* data); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id); +typedef void* (GLAPIENTRY * PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target); + +#define glBeginQuery GLEW_GET_FUN(__glewBeginQuery) +#define glBindBuffer GLEW_GET_FUN(__glewBindBuffer) +#define glBufferData GLEW_GET_FUN(__glewBufferData) +#define glBufferSubData GLEW_GET_FUN(__glewBufferSubData) +#define glDeleteBuffers GLEW_GET_FUN(__glewDeleteBuffers) +#define glDeleteQueries GLEW_GET_FUN(__glewDeleteQueries) +#define glEndQuery GLEW_GET_FUN(__glewEndQuery) +#define glGenBuffers GLEW_GET_FUN(__glewGenBuffers) +#define glGenQueries GLEW_GET_FUN(__glewGenQueries) +#define glGetBufferParameteriv GLEW_GET_FUN(__glewGetBufferParameteriv) +#define glGetBufferPointerv GLEW_GET_FUN(__glewGetBufferPointerv) +#define glGetBufferSubData GLEW_GET_FUN(__glewGetBufferSubData) +#define glGetQueryObjectiv GLEW_GET_FUN(__glewGetQueryObjectiv) +#define glGetQueryObjectuiv GLEW_GET_FUN(__glewGetQueryObjectuiv) +#define glGetQueryiv GLEW_GET_FUN(__glewGetQueryiv) +#define glIsBuffer GLEW_GET_FUN(__glewIsBuffer) +#define glIsQuery GLEW_GET_FUN(__glewIsQuery) +#define glMapBuffer GLEW_GET_FUN(__glewMapBuffer) +#define glUnmapBuffer GLEW_GET_FUN(__glewUnmapBuffer) + +#define GLEW_VERSION_1_5 GLEW_GET_VAR(__GLEW_VERSION_1_5) + +#endif /* GL_VERSION_1_5 */ + +/* ----------------------------- GL_VERSION_2_0 ---------------------------- */ + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 + +#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_COORDS 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 + +typedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (GLAPIENTRY * PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROC) (GLenum type); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (GLAPIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders); +typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); +typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLuint obj, GLsizei maxLength, GLsizei* length, GLchar* source); +typedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param); +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void** pointer); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (GLAPIENTRY * PFNGLISSHADERPROC) (GLuint shader); +typedef void (GLAPIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const* string, const GLint* length); +typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer); + +#define glAttachShader GLEW_GET_FUN(__glewAttachShader) +#define glBindAttribLocation GLEW_GET_FUN(__glewBindAttribLocation) +#define glBlendEquationSeparate GLEW_GET_FUN(__glewBlendEquationSeparate) +#define glCompileShader GLEW_GET_FUN(__glewCompileShader) +#define glCreateProgram GLEW_GET_FUN(__glewCreateProgram) +#define glCreateShader GLEW_GET_FUN(__glewCreateShader) +#define glDeleteProgram GLEW_GET_FUN(__glewDeleteProgram) +#define glDeleteShader GLEW_GET_FUN(__glewDeleteShader) +#define glDetachShader GLEW_GET_FUN(__glewDetachShader) +#define glDisableVertexAttribArray GLEW_GET_FUN(__glewDisableVertexAttribArray) +#define glDrawBuffers GLEW_GET_FUN(__glewDrawBuffers) +#define glEnableVertexAttribArray GLEW_GET_FUN(__glewEnableVertexAttribArray) +#define glGetActiveAttrib GLEW_GET_FUN(__glewGetActiveAttrib) +#define glGetActiveUniform GLEW_GET_FUN(__glewGetActiveUniform) +#define glGetAttachedShaders GLEW_GET_FUN(__glewGetAttachedShaders) +#define glGetAttribLocation GLEW_GET_FUN(__glewGetAttribLocation) +#define glGetProgramInfoLog GLEW_GET_FUN(__glewGetProgramInfoLog) +#define glGetProgramiv GLEW_GET_FUN(__glewGetProgramiv) +#define glGetShaderInfoLog GLEW_GET_FUN(__glewGetShaderInfoLog) +#define glGetShaderSource GLEW_GET_FUN(__glewGetShaderSource) +#define glGetShaderiv GLEW_GET_FUN(__glewGetShaderiv) +#define glGetUniformLocation GLEW_GET_FUN(__glewGetUniformLocation) +#define glGetUniformfv GLEW_GET_FUN(__glewGetUniformfv) +#define glGetUniformiv GLEW_GET_FUN(__glewGetUniformiv) +#define glGetVertexAttribPointerv GLEW_GET_FUN(__glewGetVertexAttribPointerv) +#define glGetVertexAttribdv GLEW_GET_FUN(__glewGetVertexAttribdv) +#define glGetVertexAttribfv GLEW_GET_FUN(__glewGetVertexAttribfv) +#define glGetVertexAttribiv GLEW_GET_FUN(__glewGetVertexAttribiv) +#define glIsProgram GLEW_GET_FUN(__glewIsProgram) +#define glIsShader GLEW_GET_FUN(__glewIsShader) +#define glLinkProgram GLEW_GET_FUN(__glewLinkProgram) +#define glShaderSource GLEW_GET_FUN(__glewShaderSource) +#define glStencilFuncSeparate GLEW_GET_FUN(__glewStencilFuncSeparate) +#define glStencilMaskSeparate GLEW_GET_FUN(__glewStencilMaskSeparate) +#define glStencilOpSeparate GLEW_GET_FUN(__glewStencilOpSeparate) +#define glUniform1f GLEW_GET_FUN(__glewUniform1f) +#define glUniform1fv GLEW_GET_FUN(__glewUniform1fv) +#define glUniform1i GLEW_GET_FUN(__glewUniform1i) +#define glUniform1iv GLEW_GET_FUN(__glewUniform1iv) +#define glUniform2f GLEW_GET_FUN(__glewUniform2f) +#define glUniform2fv GLEW_GET_FUN(__glewUniform2fv) +#define glUniform2i GLEW_GET_FUN(__glewUniform2i) +#define glUniform2iv GLEW_GET_FUN(__glewUniform2iv) +#define glUniform3f GLEW_GET_FUN(__glewUniform3f) +#define glUniform3fv GLEW_GET_FUN(__glewUniform3fv) +#define glUniform3i GLEW_GET_FUN(__glewUniform3i) +#define glUniform3iv GLEW_GET_FUN(__glewUniform3iv) +#define glUniform4f GLEW_GET_FUN(__glewUniform4f) +#define glUniform4fv GLEW_GET_FUN(__glewUniform4fv) +#define glUniform4i GLEW_GET_FUN(__glewUniform4i) +#define glUniform4iv GLEW_GET_FUN(__glewUniform4iv) +#define glUniformMatrix2fv GLEW_GET_FUN(__glewUniformMatrix2fv) +#define glUniformMatrix3fv GLEW_GET_FUN(__glewUniformMatrix3fv) +#define glUniformMatrix4fv GLEW_GET_FUN(__glewUniformMatrix4fv) +#define glUseProgram GLEW_GET_FUN(__glewUseProgram) +#define glValidateProgram GLEW_GET_FUN(__glewValidateProgram) +#define glVertexAttrib1d GLEW_GET_FUN(__glewVertexAttrib1d) +#define glVertexAttrib1dv GLEW_GET_FUN(__glewVertexAttrib1dv) +#define glVertexAttrib1f GLEW_GET_FUN(__glewVertexAttrib1f) +#define glVertexAttrib1fv GLEW_GET_FUN(__glewVertexAttrib1fv) +#define glVertexAttrib1s GLEW_GET_FUN(__glewVertexAttrib1s) +#define glVertexAttrib1sv GLEW_GET_FUN(__glewVertexAttrib1sv) +#define glVertexAttrib2d GLEW_GET_FUN(__glewVertexAttrib2d) +#define glVertexAttrib2dv GLEW_GET_FUN(__glewVertexAttrib2dv) +#define glVertexAttrib2f GLEW_GET_FUN(__glewVertexAttrib2f) +#define glVertexAttrib2fv GLEW_GET_FUN(__glewVertexAttrib2fv) +#define glVertexAttrib2s GLEW_GET_FUN(__glewVertexAttrib2s) +#define glVertexAttrib2sv GLEW_GET_FUN(__glewVertexAttrib2sv) +#define glVertexAttrib3d GLEW_GET_FUN(__glewVertexAttrib3d) +#define glVertexAttrib3dv GLEW_GET_FUN(__glewVertexAttrib3dv) +#define glVertexAttrib3f GLEW_GET_FUN(__glewVertexAttrib3f) +#define glVertexAttrib3fv GLEW_GET_FUN(__glewVertexAttrib3fv) +#define glVertexAttrib3s GLEW_GET_FUN(__glewVertexAttrib3s) +#define glVertexAttrib3sv GLEW_GET_FUN(__glewVertexAttrib3sv) +#define glVertexAttrib4Nbv GLEW_GET_FUN(__glewVertexAttrib4Nbv) +#define glVertexAttrib4Niv GLEW_GET_FUN(__glewVertexAttrib4Niv) +#define glVertexAttrib4Nsv GLEW_GET_FUN(__glewVertexAttrib4Nsv) +#define glVertexAttrib4Nub GLEW_GET_FUN(__glewVertexAttrib4Nub) +#define glVertexAttrib4Nubv GLEW_GET_FUN(__glewVertexAttrib4Nubv) +#define glVertexAttrib4Nuiv GLEW_GET_FUN(__glewVertexAttrib4Nuiv) +#define glVertexAttrib4Nusv GLEW_GET_FUN(__glewVertexAttrib4Nusv) +#define glVertexAttrib4bv GLEW_GET_FUN(__glewVertexAttrib4bv) +#define glVertexAttrib4d GLEW_GET_FUN(__glewVertexAttrib4d) +#define glVertexAttrib4dv GLEW_GET_FUN(__glewVertexAttrib4dv) +#define glVertexAttrib4f GLEW_GET_FUN(__glewVertexAttrib4f) +#define glVertexAttrib4fv GLEW_GET_FUN(__glewVertexAttrib4fv) +#define glVertexAttrib4iv GLEW_GET_FUN(__glewVertexAttrib4iv) +#define glVertexAttrib4s GLEW_GET_FUN(__glewVertexAttrib4s) +#define glVertexAttrib4sv GLEW_GET_FUN(__glewVertexAttrib4sv) +#define glVertexAttrib4ubv GLEW_GET_FUN(__glewVertexAttrib4ubv) +#define glVertexAttrib4uiv GLEW_GET_FUN(__glewVertexAttrib4uiv) +#define glVertexAttrib4usv GLEW_GET_FUN(__glewVertexAttrib4usv) +#define glVertexAttribPointer GLEW_GET_FUN(__glewVertexAttribPointer) + +#define GLEW_VERSION_2_0 GLEW_GET_VAR(__GLEW_VERSION_2_0) + +#endif /* GL_VERSION_2_0 */ + +/* ----------------------------- GL_VERSION_2_1 ---------------------------- */ + +#ifndef GL_VERSION_2_1 +#define GL_VERSION_2_1 1 + +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_SLUMINANCE_ALPHA 0x8C44 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B + +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + +#define glUniformMatrix2x3fv GLEW_GET_FUN(__glewUniformMatrix2x3fv) +#define glUniformMatrix2x4fv GLEW_GET_FUN(__glewUniformMatrix2x4fv) +#define glUniformMatrix3x2fv GLEW_GET_FUN(__glewUniformMatrix3x2fv) +#define glUniformMatrix3x4fv GLEW_GET_FUN(__glewUniformMatrix3x4fv) +#define glUniformMatrix4x2fv GLEW_GET_FUN(__glewUniformMatrix4x2fv) +#define glUniformMatrix4x3fv GLEW_GET_FUN(__glewUniformMatrix4x3fv) + +#define GLEW_VERSION_2_1 GLEW_GET_VAR(__GLEW_VERSION_2_1) + +#endif /* GL_VERSION_2_1 */ + +/* ----------------------------- GL_VERSION_3_0 ---------------------------- */ + +#ifndef GL_VERSION_3_0 +#define GL_VERSION_3_0 1 + +#define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0 +#define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1 +#define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2 +#define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3 +#define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4 +#define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5 +#define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB +#define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES +#define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 +#define GL_MAJOR_VERSION 0x821B +#define GL_MINOR_VERSION 0x821C +#define GL_NUM_EXTENSIONS 0x821D +#define GL_CONTEXT_FLAGS 0x821E +#define GL_DEPTH_BUFFER 0x8223 +#define GL_STENCIL_BUFFER 0x8224 +#define GL_RGBA32F 0x8814 +#define GL_RGB32F 0x8815 +#define GL_RGBA16F 0x881A +#define GL_RGB16F 0x881B +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_CLAMP_VERTEX_COLOR 0x891A +#define GL_CLAMP_FRAGMENT_COLOR 0x891B +#define GL_CLAMP_READ_COLOR 0x891C +#define GL_FIXED_ONLY 0x891D +#define GL_TEXTURE_RED_TYPE 0x8C10 +#define GL_TEXTURE_GREEN_TYPE 0x8C11 +#define GL_TEXTURE_BLUE_TYPE 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_TEXTURE_1D_ARRAY 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_RGB9_E5 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_TEXTURE_SHARED_SIZE 0x8C3F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 +#define GL_PRIMITIVES_GENERATED 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_RASTERIZER_DISCARD 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B +#define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_SEPARATE_ATTRIBS 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F +#define GL_RGBA32UI 0x8D70 +#define GL_RGB32UI 0x8D71 +#define GL_RGBA16UI 0x8D76 +#define GL_RGB16UI 0x8D77 +#define GL_RGBA8UI 0x8D7C +#define GL_RGB8UI 0x8D7D +#define GL_RGBA32I 0x8D82 +#define GL_RGB32I 0x8D83 +#define GL_RGBA16I 0x8D88 +#define GL_RGB16I 0x8D89 +#define GL_RGBA8I 0x8D8E +#define GL_RGB8I 0x8D8F +#define GL_RED_INTEGER 0x8D94 +#define GL_GREEN_INTEGER 0x8D95 +#define GL_BLUE_INTEGER 0x8D96 +#define GL_ALPHA_INTEGER 0x8D97 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RGBA_INTEGER 0x8D99 +#define GL_BGR_INTEGER 0x8D9A +#define GL_BGRA_INTEGER 0x8D9B +#define GL_SAMPLER_1D_ARRAY 0x8DC0 +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 +#define GL_INT_SAMPLER_1D 0x8DC9 +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_QUERY_WAIT 0x8E13 +#define GL_QUERY_NO_WAIT 0x8E14 +#define GL_QUERY_BY_REGION_WAIT 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 + +typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); +typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); +typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint colorNumber, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawBuffer, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawBuffer, const GLint* value); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawBuffer, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLCOLORMASKIPROC) (GLuint buf, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +typedef void (GLAPIENTRY * PFNGLDISABLEIPROC) (GLenum cap, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEIPROC) (GLenum cap, GLuint index); +typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERPROC) (void); +typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETBOOLEANI_VPROC) (GLenum pname, GLuint index, GLboolean* data); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar* name); +typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIPROC) (GLenum cap, GLuint index); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint v0, GLuint v1); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void*pointer); + +#define glBeginConditionalRender GLEW_GET_FUN(__glewBeginConditionalRender) +#define glBeginTransformFeedback GLEW_GET_FUN(__glewBeginTransformFeedback) +#define glBindFragDataLocation GLEW_GET_FUN(__glewBindFragDataLocation) +#define glClampColor GLEW_GET_FUN(__glewClampColor) +#define glClearBufferfi GLEW_GET_FUN(__glewClearBufferfi) +#define glClearBufferfv GLEW_GET_FUN(__glewClearBufferfv) +#define glClearBufferiv GLEW_GET_FUN(__glewClearBufferiv) +#define glClearBufferuiv GLEW_GET_FUN(__glewClearBufferuiv) +#define glColorMaski GLEW_GET_FUN(__glewColorMaski) +#define glDisablei GLEW_GET_FUN(__glewDisablei) +#define glEnablei GLEW_GET_FUN(__glewEnablei) +#define glEndConditionalRender GLEW_GET_FUN(__glewEndConditionalRender) +#define glEndTransformFeedback GLEW_GET_FUN(__glewEndTransformFeedback) +#define glGetBooleani_v GLEW_GET_FUN(__glewGetBooleani_v) +#define glGetFragDataLocation GLEW_GET_FUN(__glewGetFragDataLocation) +#define glGetStringi GLEW_GET_FUN(__glewGetStringi) +#define glGetTexParameterIiv GLEW_GET_FUN(__glewGetTexParameterIiv) +#define glGetTexParameterIuiv GLEW_GET_FUN(__glewGetTexParameterIuiv) +#define glGetTransformFeedbackVarying GLEW_GET_FUN(__glewGetTransformFeedbackVarying) +#define glGetUniformuiv GLEW_GET_FUN(__glewGetUniformuiv) +#define glGetVertexAttribIiv GLEW_GET_FUN(__glewGetVertexAttribIiv) +#define glGetVertexAttribIuiv GLEW_GET_FUN(__glewGetVertexAttribIuiv) +#define glIsEnabledi GLEW_GET_FUN(__glewIsEnabledi) +#define glTexParameterIiv GLEW_GET_FUN(__glewTexParameterIiv) +#define glTexParameterIuiv GLEW_GET_FUN(__glewTexParameterIuiv) +#define glTransformFeedbackVaryings GLEW_GET_FUN(__glewTransformFeedbackVaryings) +#define glUniform1ui GLEW_GET_FUN(__glewUniform1ui) +#define glUniform1uiv GLEW_GET_FUN(__glewUniform1uiv) +#define glUniform2ui GLEW_GET_FUN(__glewUniform2ui) +#define glUniform2uiv GLEW_GET_FUN(__glewUniform2uiv) +#define glUniform3ui GLEW_GET_FUN(__glewUniform3ui) +#define glUniform3uiv GLEW_GET_FUN(__glewUniform3uiv) +#define glUniform4ui GLEW_GET_FUN(__glewUniform4ui) +#define glUniform4uiv GLEW_GET_FUN(__glewUniform4uiv) +#define glVertexAttribI1i GLEW_GET_FUN(__glewVertexAttribI1i) +#define glVertexAttribI1iv GLEW_GET_FUN(__glewVertexAttribI1iv) +#define glVertexAttribI1ui GLEW_GET_FUN(__glewVertexAttribI1ui) +#define glVertexAttribI1uiv GLEW_GET_FUN(__glewVertexAttribI1uiv) +#define glVertexAttribI2i GLEW_GET_FUN(__glewVertexAttribI2i) +#define glVertexAttribI2iv GLEW_GET_FUN(__glewVertexAttribI2iv) +#define glVertexAttribI2ui GLEW_GET_FUN(__glewVertexAttribI2ui) +#define glVertexAttribI2uiv GLEW_GET_FUN(__glewVertexAttribI2uiv) +#define glVertexAttribI3i GLEW_GET_FUN(__glewVertexAttribI3i) +#define glVertexAttribI3iv GLEW_GET_FUN(__glewVertexAttribI3iv) +#define glVertexAttribI3ui GLEW_GET_FUN(__glewVertexAttribI3ui) +#define glVertexAttribI3uiv GLEW_GET_FUN(__glewVertexAttribI3uiv) +#define glVertexAttribI4bv GLEW_GET_FUN(__glewVertexAttribI4bv) +#define glVertexAttribI4i GLEW_GET_FUN(__glewVertexAttribI4i) +#define glVertexAttribI4iv GLEW_GET_FUN(__glewVertexAttribI4iv) +#define glVertexAttribI4sv GLEW_GET_FUN(__glewVertexAttribI4sv) +#define glVertexAttribI4ubv GLEW_GET_FUN(__glewVertexAttribI4ubv) +#define glVertexAttribI4ui GLEW_GET_FUN(__glewVertexAttribI4ui) +#define glVertexAttribI4uiv GLEW_GET_FUN(__glewVertexAttribI4uiv) +#define glVertexAttribI4usv GLEW_GET_FUN(__glewVertexAttribI4usv) +#define glVertexAttribIPointer GLEW_GET_FUN(__glewVertexAttribIPointer) + +#define GLEW_VERSION_3_0 GLEW_GET_VAR(__GLEW_VERSION_3_0) + +#endif /* GL_VERSION_3_0 */ + +/* ----------------------------- GL_VERSION_3_1 ---------------------------- */ + +#ifndef GL_VERSION_3_1 +#define GL_VERSION_3_1 1 + +#define GL_TEXTURE_RECTANGLE 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 +#define GL_SAMPLER_2D_RECT 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 +#define GL_TEXTURE_BUFFER 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT 0x8C2E +#define GL_SAMPLER_BUFFER 0x8DC2 +#define GL_INT_SAMPLER_2D_RECT 0x8DCD +#define GL_INT_SAMPLER_BUFFER 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 +#define GL_RED_SNORM 0x8F90 +#define GL_RG_SNORM 0x8F91 +#define GL_RGB_SNORM 0x8F92 +#define GL_RGBA_SNORM 0x8F93 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM 0x8F98 +#define GL_RG16_SNORM 0x8F99 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGBA16_SNORM 0x8F9B +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E +#define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_MAP_LENGTH 0x9120 +#define GL_BUFFER_MAP_OFFSET 0x9121 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalFormat, GLuint buffer); + +#define glDrawArraysInstanced GLEW_GET_FUN(__glewDrawArraysInstanced) +#define glDrawElementsInstanced GLEW_GET_FUN(__glewDrawElementsInstanced) +#define glPrimitiveRestartIndex GLEW_GET_FUN(__glewPrimitiveRestartIndex) +#define glTexBuffer GLEW_GET_FUN(__glewTexBuffer) + +#define GLEW_VERSION_3_1 GLEW_GET_VAR(__GLEW_VERSION_3_1) + +#endif /* GL_VERSION_3_1 */ + +/* ----------------------------- GL_VERSION_3_2 ---------------------------- */ + +#ifndef GL_VERSION_3_2 +#define GL_VERSION_3_2 1 + +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_LINES_ADJACENCY 0x000A +#define GL_LINE_STRIP_ADJACENCY 0x000B +#define GL_TRIANGLES_ADJACENCY 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D +#define GL_PROGRAM_POINT_SIZE 0x8642 +#define GL_GEOMETRY_VERTICES_OUT 0x8916 +#define GL_GEOMETRY_INPUT_TYPE 0x8917 +#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_CONTEXT_PROFILE_MASK 0x9126 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum value, GLint64 * data); +typedef void (GLAPIENTRY * PFNGLGETINTEGER64I_VPROC) (GLenum pname, GLuint index, GLint64 * data); + +#define glFramebufferTexture GLEW_GET_FUN(__glewFramebufferTexture) +#define glGetBufferParameteri64v GLEW_GET_FUN(__glewGetBufferParameteri64v) +#define glGetInteger64i_v GLEW_GET_FUN(__glewGetInteger64i_v) + +#define GLEW_VERSION_3_2 GLEW_GET_VAR(__GLEW_VERSION_3_2) + +#endif /* GL_VERSION_3_2 */ + +/* ----------------------------- GL_VERSION_3_3 ---------------------------- */ + +#ifndef GL_VERSION_3_3 +#define GL_VERSION_3_3 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE +#define GL_RGB10_A2UI 0x906F + +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); + +#define glVertexAttribDivisor GLEW_GET_FUN(__glewVertexAttribDivisor) + +#define GLEW_VERSION_3_3 GLEW_GET_VAR(__GLEW_VERSION_3_3) + +#endif /* GL_VERSION_3_3 */ + +/* ----------------------------- GL_VERSION_4_0 ---------------------------- */ + +#ifndef GL_VERSION_4_0 +#define GL_VERSION_4_0 1 + +#define GL_SAMPLE_SHADING 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F +#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS 0x8F9F +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGPROC) (GLclampf value); + +#define glBlendEquationSeparatei GLEW_GET_FUN(__glewBlendEquationSeparatei) +#define glBlendEquationi GLEW_GET_FUN(__glewBlendEquationi) +#define glBlendFuncSeparatei GLEW_GET_FUN(__glewBlendFuncSeparatei) +#define glBlendFunci GLEW_GET_FUN(__glewBlendFunci) +#define glMinSampleShading GLEW_GET_FUN(__glewMinSampleShading) + +#define GLEW_VERSION_4_0 GLEW_GET_VAR(__GLEW_VERSION_4_0) + +#endif /* GL_VERSION_4_0 */ + +/* ----------------------------- GL_VERSION_4_1 ---------------------------- */ + +#ifndef GL_VERSION_4_1 +#define GL_VERSION_4_1 1 + +#define GLEW_VERSION_4_1 GLEW_GET_VAR(__GLEW_VERSION_4_1) + +#endif /* GL_VERSION_4_1 */ + +/* ----------------------------- GL_VERSION_4_2 ---------------------------- */ + +#ifndef GL_VERSION_4_2 +#define GL_VERSION_4_2 1 + +#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 +#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F +#define GL_COPY_READ_BUFFER_BINDING 0x8F36 +#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 + +#define GLEW_VERSION_4_2 GLEW_GET_VAR(__GLEW_VERSION_4_2) + +#endif /* GL_VERSION_4_2 */ + +/* ----------------------------- GL_VERSION_4_3 ---------------------------- */ + +#ifndef GL_VERSION_4_3 +#define GL_VERSION_4_3 1 + +#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 +#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E + +#define GLEW_VERSION_4_3 GLEW_GET_VAR(__GLEW_VERSION_4_3) + +#endif /* GL_VERSION_4_3 */ + +/* ----------------------------- GL_VERSION_4_4 ---------------------------- */ + +#ifndef GL_VERSION_4_4 +#define GL_VERSION_4_4 1 + +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 +#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 +#define GL_TEXTURE_BUFFER_BINDING 0x8C2A + +#define GLEW_VERSION_4_4 GLEW_GET_VAR(__GLEW_VERSION_4_4) + +#endif /* GL_VERSION_4_4 */ + +/* ----------------------------- GL_VERSION_4_5 ---------------------------- */ + +#ifndef GL_VERSION_4_5 +#define GL_VERSION_4_5 1 + +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 + +typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEPROC) (GLenum tex, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); + +#define glGetGraphicsResetStatus GLEW_GET_FUN(__glewGetGraphicsResetStatus) +#define glGetnCompressedTexImage GLEW_GET_FUN(__glewGetnCompressedTexImage) +#define glGetnTexImage GLEW_GET_FUN(__glewGetnTexImage) +#define glGetnUniformdv GLEW_GET_FUN(__glewGetnUniformdv) + +#define GLEW_VERSION_4_5 GLEW_GET_VAR(__GLEW_VERSION_4_5) + +#endif /* GL_VERSION_4_5 */ + +/* ----------------------------- GL_VERSION_4_6 ---------------------------- */ + +#ifndef GL_VERSION_4_6 +#define GL_VERSION_4_6 1 + +#define GL_CONTEXT_FLAG_NO_ERROR_BIT 0x00000008 +#define GL_PARAMETER_BUFFER 0x80EE +#define GL_PARAMETER_BUFFER_BINDING 0x80EF +#define GL_TRANSFORM_FEEDBACK_OVERFLOW 0x82EC +#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW 0x82ED +#define GL_VERTICES_SUBMITTED 0x82EE +#define GL_PRIMITIVES_SUBMITTED 0x82EF +#define GL_VERTEX_SHADER_INVOCATIONS 0x82F0 +#define GL_TESS_CONTROL_SHADER_PATCHES 0x82F1 +#define GL_TESS_EVALUATION_SHADER_INVOCATIONS 0x82F2 +#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED 0x82F3 +#define GL_FRAGMENT_SHADER_INVOCATIONS 0x82F4 +#define GL_COMPUTE_SHADER_INVOCATIONS 0x82F5 +#define GL_CLIPPING_INPUT_PRIMITIVES 0x82F6 +#define GL_CLIPPING_OUTPUT_PRIMITIVES 0x82F7 +#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF +#define GL_POLYGON_OFFSET_CLAMP 0x8E1B +#define GL_SHADER_BINARY_FORMAT_SPIR_V 0x9551 +#define GL_SPIR_V_BINARY 0x9552 +#define GL_SPIR_V_EXTENSIONS 0x9553 +#define GL_NUM_SPIR_V_EXTENSIONS 0x9554 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC) (GLenum mode, const GLvoid *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC) (GLenum mode, GLenum type, const GLvoid *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLSPECIALIZESHADERPROC) (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); + +#define glMultiDrawArraysIndirectCount GLEW_GET_FUN(__glewMultiDrawArraysIndirectCount) +#define glMultiDrawElementsIndirectCount GLEW_GET_FUN(__glewMultiDrawElementsIndirectCount) +#define glSpecializeShader GLEW_GET_FUN(__glewSpecializeShader) + +#define GLEW_VERSION_4_6 GLEW_GET_VAR(__GLEW_VERSION_4_6) + +#endif /* GL_VERSION_4_6 */ + +/* -------------------------- GL_3DFX_multisample -------------------------- */ + +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 + +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 + +#define GLEW_3DFX_multisample GLEW_GET_VAR(__GLEW_3DFX_multisample) + +#endif /* GL_3DFX_multisample */ + +/* ---------------------------- GL_3DFX_tbuffer ---------------------------- */ + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 + +typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); + +#define glTbufferMask3DFX GLEW_GET_FUN(__glewTbufferMask3DFX) + +#define GLEW_3DFX_tbuffer GLEW_GET_VAR(__GLEW_3DFX_tbuffer) + +#endif /* GL_3DFX_tbuffer */ + +/* -------------------- GL_3DFX_texture_compression_FXT1 ------------------- */ + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 + +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 + +#define GLEW_3DFX_texture_compression_FXT1 GLEW_GET_VAR(__GLEW_3DFX_texture_compression_FXT1) + +#endif /* GL_3DFX_texture_compression_FXT1 */ + +/* ----------------------- GL_AMD_blend_minmax_factor ---------------------- */ + +#ifndef GL_AMD_blend_minmax_factor +#define GL_AMD_blend_minmax_factor 1 + +#define GL_FACTOR_MIN_AMD 0x901C +#define GL_FACTOR_MAX_AMD 0x901D + +#define GLEW_AMD_blend_minmax_factor GLEW_GET_VAR(__GLEW_AMD_blend_minmax_factor) + +#endif /* GL_AMD_blend_minmax_factor */ + +/* --------------------- GL_AMD_compressed_3DC_texture --------------------- */ + +#ifndef GL_AMD_compressed_3DC_texture +#define GL_AMD_compressed_3DC_texture 1 + +#define GL_3DC_X_AMD 0x87F9 +#define GL_3DC_XY_AMD 0x87FA + +#define GLEW_AMD_compressed_3DC_texture GLEW_GET_VAR(__GLEW_AMD_compressed_3DC_texture) + +#endif /* GL_AMD_compressed_3DC_texture */ + +/* --------------------- GL_AMD_compressed_ATC_texture --------------------- */ + +#ifndef GL_AMD_compressed_ATC_texture +#define GL_AMD_compressed_ATC_texture 1 + +#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE +#define GL_ATC_RGB_AMD 0x8C92 +#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 + +#define GLEW_AMD_compressed_ATC_texture GLEW_GET_VAR(__GLEW_AMD_compressed_ATC_texture) + +#endif /* GL_AMD_compressed_ATC_texture */ + +/* ----------------------- GL_AMD_conservative_depth ----------------------- */ + +#ifndef GL_AMD_conservative_depth +#define GL_AMD_conservative_depth 1 + +#define GLEW_AMD_conservative_depth GLEW_GET_VAR(__GLEW_AMD_conservative_depth) + +#endif /* GL_AMD_conservative_depth */ + +/* -------------------------- GL_AMD_debug_output -------------------------- */ + +#ifndef GL_AMD_debug_output +#define GL_AMD_debug_output 1 + +#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 +#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 +#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 +#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A +#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B +#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C +#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D +#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E +#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F +#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 + +typedef void (GLAPIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, void* userParam); + +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar* buf); +typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum* categories, GLuint* severities, GLuint* ids, GLsizei* lengths, GLchar* message); + +#define glDebugMessageCallbackAMD GLEW_GET_FUN(__glewDebugMessageCallbackAMD) +#define glDebugMessageEnableAMD GLEW_GET_FUN(__glewDebugMessageEnableAMD) +#define glDebugMessageInsertAMD GLEW_GET_FUN(__glewDebugMessageInsertAMD) +#define glGetDebugMessageLogAMD GLEW_GET_FUN(__glewGetDebugMessageLogAMD) + +#define GLEW_AMD_debug_output GLEW_GET_VAR(__GLEW_AMD_debug_output) + +#endif /* GL_AMD_debug_output */ + +/* ---------------------- GL_AMD_depth_clamp_separate ---------------------- */ + +#ifndef GL_AMD_depth_clamp_separate +#define GL_AMD_depth_clamp_separate 1 + +#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E +#define GL_DEPTH_CLAMP_FAR_AMD 0x901F + +#define GLEW_AMD_depth_clamp_separate GLEW_GET_VAR(__GLEW_AMD_depth_clamp_separate) + +#endif /* GL_AMD_depth_clamp_separate */ + +/* ----------------------- GL_AMD_draw_buffers_blend ----------------------- */ + +#ifndef GL_AMD_draw_buffers_blend +#define GL_AMD_draw_buffers_blend 1 + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); + +#define glBlendEquationIndexedAMD GLEW_GET_FUN(__glewBlendEquationIndexedAMD) +#define glBlendEquationSeparateIndexedAMD GLEW_GET_FUN(__glewBlendEquationSeparateIndexedAMD) +#define glBlendFuncIndexedAMD GLEW_GET_FUN(__glewBlendFuncIndexedAMD) +#define glBlendFuncSeparateIndexedAMD GLEW_GET_FUN(__glewBlendFuncSeparateIndexedAMD) + +#define GLEW_AMD_draw_buffers_blend GLEW_GET_VAR(__GLEW_AMD_draw_buffers_blend) + +#endif /* GL_AMD_draw_buffers_blend */ + +/* ------------------ GL_AMD_framebuffer_sample_positions ------------------ */ + +#ifndef GL_AMD_framebuffer_sample_positions +#define GL_AMD_framebuffer_sample_positions 1 + +#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F +#define GL_PIXELS_PER_SAMPLE_PATTERN_X_AMD 0x91AE +#define GL_PIXELS_PER_SAMPLE_PATTERN_Y_AMD 0x91AF +#define GL_ALL_PIXELS_AMD 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) (GLenum target, GLuint numsamples, GLuint pixelindex, const GLfloat* values); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC) (GLenum target, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat* values); +typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC) (GLuint framebuffer, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat* values); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) (GLuint framebuffer, GLuint numsamples, GLuint pixelindex, const GLfloat* values); + +#define glFramebufferSamplePositionsfvAMD GLEW_GET_FUN(__glewFramebufferSamplePositionsfvAMD) +#define glGetFramebufferParameterfvAMD GLEW_GET_FUN(__glewGetFramebufferParameterfvAMD) +#define glGetNamedFramebufferParameterfvAMD GLEW_GET_FUN(__glewGetNamedFramebufferParameterfvAMD) +#define glNamedFramebufferSamplePositionsfvAMD GLEW_GET_FUN(__glewNamedFramebufferSamplePositionsfvAMD) + +#define GLEW_AMD_framebuffer_sample_positions GLEW_GET_VAR(__GLEW_AMD_framebuffer_sample_positions) + +#endif /* GL_AMD_framebuffer_sample_positions */ + +/* --------------------------- GL_AMD_gcn_shader --------------------------- */ + +#ifndef GL_AMD_gcn_shader +#define GL_AMD_gcn_shader 1 + +#define GLEW_AMD_gcn_shader GLEW_GET_VAR(__GLEW_AMD_gcn_shader) + +#endif /* GL_AMD_gcn_shader */ + +/* ---------------------- GL_AMD_gpu_shader_half_float --------------------- */ + +#ifndef GL_AMD_gpu_shader_half_float +#define GL_AMD_gpu_shader_half_float 1 + +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB +#define GL_FLOAT16_MAT2_AMD 0x91C5 +#define GL_FLOAT16_MAT3_AMD 0x91C6 +#define GL_FLOAT16_MAT4_AMD 0x91C7 +#define GL_FLOAT16_MAT2x3_AMD 0x91C8 +#define GL_FLOAT16_MAT2x4_AMD 0x91C9 +#define GL_FLOAT16_MAT3x2_AMD 0x91CA +#define GL_FLOAT16_MAT3x4_AMD 0x91CB +#define GL_FLOAT16_MAT4x2_AMD 0x91CC +#define GL_FLOAT16_MAT4x3_AMD 0x91CD + +#define GLEW_AMD_gpu_shader_half_float GLEW_GET_VAR(__GLEW_AMD_gpu_shader_half_float) + +#endif /* GL_AMD_gpu_shader_half_float */ + +/* ------------------------ GL_AMD_gpu_shader_int16 ------------------------ */ + +#ifndef GL_AMD_gpu_shader_int16 +#define GL_AMD_gpu_shader_int16 1 + +#define GLEW_AMD_gpu_shader_int16 GLEW_GET_VAR(__GLEW_AMD_gpu_shader_int16) + +#endif /* GL_AMD_gpu_shader_int16 */ + +/* ------------------------ GL_AMD_gpu_shader_int64 ------------------------ */ + +#ifndef GL_AMD_gpu_shader_int64 +#define GL_AMD_gpu_shader_int64 1 + +#define GLEW_AMD_gpu_shader_int64 GLEW_GET_VAR(__GLEW_AMD_gpu_shader_int64) + +#endif /* GL_AMD_gpu_shader_int64 */ + +/* ---------------------- GL_AMD_interleaved_elements ---------------------- */ + +#ifndef GL_AMD_interleaved_elements +#define GL_AMD_interleaved_elements 1 + +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_RG8UI 0x8238 +#define GL_RG16UI 0x823A +#define GL_RGBA8UI 0x8D7C +#define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 +#define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 + +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param); + +#define glVertexAttribParameteriAMD GLEW_GET_FUN(__glewVertexAttribParameteriAMD) + +#define GLEW_AMD_interleaved_elements GLEW_GET_VAR(__GLEW_AMD_interleaved_elements) + +#endif /* GL_AMD_interleaved_elements */ + +/* ----------------------- GL_AMD_multi_draw_indirect ---------------------- */ + +#ifndef GL_AMD_multi_draw_indirect +#define GL_AMD_multi_draw_indirect 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); + +#define glMultiDrawArraysIndirectAMD GLEW_GET_FUN(__glewMultiDrawArraysIndirectAMD) +#define glMultiDrawElementsIndirectAMD GLEW_GET_FUN(__glewMultiDrawElementsIndirectAMD) + +#define GLEW_AMD_multi_draw_indirect GLEW_GET_VAR(__GLEW_AMD_multi_draw_indirect) + +#endif /* GL_AMD_multi_draw_indirect */ + +/* ------------------------- GL_AMD_name_gen_delete ------------------------ */ + +#ifndef GL_AMD_name_gen_delete +#define GL_AMD_name_gen_delete 1 + +#define GL_DATA_BUFFER_AMD 0x9151 +#define GL_PERFORMANCE_MONITOR_AMD 0x9152 +#define GL_QUERY_OBJECT_AMD 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 +#define GL_SAMPLER_OBJECT_AMD 0x9155 + +typedef void (GLAPIENTRY * PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint* names); +typedef void (GLAPIENTRY * PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint* names); +typedef GLboolean (GLAPIENTRY * PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); + +#define glDeleteNamesAMD GLEW_GET_FUN(__glewDeleteNamesAMD) +#define glGenNamesAMD GLEW_GET_FUN(__glewGenNamesAMD) +#define glIsNameAMD GLEW_GET_FUN(__glewIsNameAMD) + +#define GLEW_AMD_name_gen_delete GLEW_GET_VAR(__GLEW_AMD_name_gen_delete) + +#endif /* GL_AMD_name_gen_delete */ + +/* ---------------------- GL_AMD_occlusion_query_event --------------------- */ + +#ifndef GL_AMD_occlusion_query_event +#define GL_AMD_occlusion_query_event 1 + +#define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001 +#define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002 +#define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004 +#define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008 +#define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F +#define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param); + +#define glQueryObjectParameteruiAMD GLEW_GET_FUN(__glewQueryObjectParameteruiAMD) + +#define GLEW_AMD_occlusion_query_event GLEW_GET_VAR(__GLEW_AMD_occlusion_query_event) + +#endif /* GL_AMD_occlusion_query_event */ + +/* ----------------------- GL_AMD_performance_monitor ---------------------- */ + +#ifndef GL_AMD_performance_monitor +#define GL_AMD_performance_monitor 1 + +#define GL_COUNTER_TYPE_AMD 0x8BC0 +#define GL_COUNTER_RANGE_AMD 0x8BC1 +#define GL_UNSIGNED_INT64_AMD 0x8BC2 +#define GL_PERCENTAGE_AMD 0x8BC3 +#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 +#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 +#define GL_PERFMON_RESULT_AMD 0x8BC6 + +typedef void (GLAPIENTRY * PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); +typedef void (GLAPIENTRY * PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); +typedef void (GLAPIENTRY * PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); +typedef void (GLAPIENTRY * PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint *bytesWritten); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, GLchar *counterString); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint* numCounters, GLint *maxActiveCounters, GLsizei countersSize, GLuint *counters); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei* length, GLchar *groupString); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint* numGroups, GLsizei groupsSize, GLuint *groups); +typedef void (GLAPIENTRY * PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList); + +#define glBeginPerfMonitorAMD GLEW_GET_FUN(__glewBeginPerfMonitorAMD) +#define glDeletePerfMonitorsAMD GLEW_GET_FUN(__glewDeletePerfMonitorsAMD) +#define glEndPerfMonitorAMD GLEW_GET_FUN(__glewEndPerfMonitorAMD) +#define glGenPerfMonitorsAMD GLEW_GET_FUN(__glewGenPerfMonitorsAMD) +#define glGetPerfMonitorCounterDataAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterDataAMD) +#define glGetPerfMonitorCounterInfoAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterInfoAMD) +#define glGetPerfMonitorCounterStringAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterStringAMD) +#define glGetPerfMonitorCountersAMD GLEW_GET_FUN(__glewGetPerfMonitorCountersAMD) +#define glGetPerfMonitorGroupStringAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupStringAMD) +#define glGetPerfMonitorGroupsAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupsAMD) +#define glSelectPerfMonitorCountersAMD GLEW_GET_FUN(__glewSelectPerfMonitorCountersAMD) + +#define GLEW_AMD_performance_monitor GLEW_GET_VAR(__GLEW_AMD_performance_monitor) + +#endif /* GL_AMD_performance_monitor */ + +/* -------------------------- GL_AMD_pinned_memory ------------------------- */ + +#ifndef GL_AMD_pinned_memory +#define GL_AMD_pinned_memory 1 + +#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 + +#define GLEW_AMD_pinned_memory GLEW_GET_VAR(__GLEW_AMD_pinned_memory) + +#endif /* GL_AMD_pinned_memory */ + +/* ----------------------- GL_AMD_program_binary_Z400 ---------------------- */ + +#ifndef GL_AMD_program_binary_Z400 +#define GL_AMD_program_binary_Z400 1 + +#define GL_Z400_BINARY_AMD 0x8740 + +#define GLEW_AMD_program_binary_Z400 GLEW_GET_VAR(__GLEW_AMD_program_binary_Z400) + +#endif /* GL_AMD_program_binary_Z400 */ + +/* ----------------------- GL_AMD_query_buffer_object ---------------------- */ + +#ifndef GL_AMD_query_buffer_object +#define GL_AMD_query_buffer_object 1 + +#define GL_QUERY_BUFFER_AMD 0x9192 +#define GL_QUERY_BUFFER_BINDING_AMD 0x9193 +#define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 + +#define GLEW_AMD_query_buffer_object GLEW_GET_VAR(__GLEW_AMD_query_buffer_object) + +#endif /* GL_AMD_query_buffer_object */ + +/* ------------------------ GL_AMD_sample_positions ------------------------ */ + +#ifndef GL_AMD_sample_positions +#define GL_AMD_sample_positions 1 + +#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F + +typedef void (GLAPIENTRY * PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat* val); + +#define glSetMultisamplefvAMD GLEW_GET_FUN(__glewSetMultisamplefvAMD) + +#define GLEW_AMD_sample_positions GLEW_GET_VAR(__GLEW_AMD_sample_positions) + +#endif /* GL_AMD_sample_positions */ + +/* ------------------ GL_AMD_seamless_cubemap_per_texture ------------------ */ + +#ifndef GL_AMD_seamless_cubemap_per_texture +#define GL_AMD_seamless_cubemap_per_texture 1 + +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F + +#define GLEW_AMD_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_AMD_seamless_cubemap_per_texture) + +#endif /* GL_AMD_seamless_cubemap_per_texture */ + +/* -------------------- GL_AMD_shader_atomic_counter_ops ------------------- */ + +#ifndef GL_AMD_shader_atomic_counter_ops +#define GL_AMD_shader_atomic_counter_ops 1 + +#define GLEW_AMD_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_AMD_shader_atomic_counter_ops) + +#endif /* GL_AMD_shader_atomic_counter_ops */ + +/* -------------------------- GL_AMD_shader_ballot ------------------------- */ + +#ifndef GL_AMD_shader_ballot +#define GL_AMD_shader_ballot 1 + +#define GLEW_AMD_shader_ballot GLEW_GET_VAR(__GLEW_AMD_shader_ballot) + +#endif /* GL_AMD_shader_ballot */ + +/* ---------------- GL_AMD_shader_explicit_vertex_parameter ---------------- */ + +#ifndef GL_AMD_shader_explicit_vertex_parameter +#define GL_AMD_shader_explicit_vertex_parameter 1 + +#define GLEW_AMD_shader_explicit_vertex_parameter GLEW_GET_VAR(__GLEW_AMD_shader_explicit_vertex_parameter) + +#endif /* GL_AMD_shader_explicit_vertex_parameter */ + +/* ---------------------- GL_AMD_shader_stencil_export --------------------- */ + +#ifndef GL_AMD_shader_stencil_export +#define GL_AMD_shader_stencil_export 1 + +#define GLEW_AMD_shader_stencil_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_export) + +#endif /* GL_AMD_shader_stencil_export */ + +/* ------------------- GL_AMD_shader_stencil_value_export ------------------ */ + +#ifndef GL_AMD_shader_stencil_value_export +#define GL_AMD_shader_stencil_value_export 1 + +#define GLEW_AMD_shader_stencil_value_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_value_export) + +#endif /* GL_AMD_shader_stencil_value_export */ + +/* ---------------------- GL_AMD_shader_trinary_minmax --------------------- */ + +#ifndef GL_AMD_shader_trinary_minmax +#define GL_AMD_shader_trinary_minmax 1 + +#define GLEW_AMD_shader_trinary_minmax GLEW_GET_VAR(__GLEW_AMD_shader_trinary_minmax) + +#endif /* GL_AMD_shader_trinary_minmax */ + +/* ------------------------- GL_AMD_sparse_texture ------------------------- */ + +#ifndef GL_AMD_sparse_texture +#define GL_AMD_sparse_texture 1 + +#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 +#define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A +#define GL_MIN_SPARSE_LEVEL_AMD 0x919B +#define GL_MIN_LOD_WARNING_AMD 0x919C + +typedef void (GLAPIENTRY * PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); + +#define glTexStorageSparseAMD GLEW_GET_FUN(__glewTexStorageSparseAMD) +#define glTextureStorageSparseAMD GLEW_GET_FUN(__glewTextureStorageSparseAMD) + +#define GLEW_AMD_sparse_texture GLEW_GET_VAR(__GLEW_AMD_sparse_texture) + +#endif /* GL_AMD_sparse_texture */ + +/* ------------------- GL_AMD_stencil_operation_extended ------------------- */ + +#ifndef GL_AMD_stencil_operation_extended +#define GL_AMD_stencil_operation_extended 1 + +#define GL_SET_AMD 0x874A +#define GL_REPLACE_VALUE_AMD 0x874B +#define GL_STENCIL_OP_VALUE_AMD 0x874C +#define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D + +typedef void (GLAPIENTRY * PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value); + +#define glStencilOpValueAMD GLEW_GET_FUN(__glewStencilOpValueAMD) + +#define GLEW_AMD_stencil_operation_extended GLEW_GET_VAR(__GLEW_AMD_stencil_operation_extended) + +#endif /* GL_AMD_stencil_operation_extended */ + +/* --------------------- GL_AMD_texture_gather_bias_lod -------------------- */ + +#ifndef GL_AMD_texture_gather_bias_lod +#define GL_AMD_texture_gather_bias_lod 1 + +#define GLEW_AMD_texture_gather_bias_lod GLEW_GET_VAR(__GLEW_AMD_texture_gather_bias_lod) + +#endif /* GL_AMD_texture_gather_bias_lod */ + +/* ------------------------ GL_AMD_texture_texture4 ------------------------ */ + +#ifndef GL_AMD_texture_texture4 +#define GL_AMD_texture_texture4 1 + +#define GLEW_AMD_texture_texture4 GLEW_GET_VAR(__GLEW_AMD_texture_texture4) + +#endif /* GL_AMD_texture_texture4 */ + +/* --------------- GL_AMD_transform_feedback3_lines_triangles -------------- */ + +#ifndef GL_AMD_transform_feedback3_lines_triangles +#define GL_AMD_transform_feedback3_lines_triangles 1 + +#define GLEW_AMD_transform_feedback3_lines_triangles GLEW_GET_VAR(__GLEW_AMD_transform_feedback3_lines_triangles) + +#endif /* GL_AMD_transform_feedback3_lines_triangles */ + +/* ----------------------- GL_AMD_transform_feedback4 ---------------------- */ + +#ifndef GL_AMD_transform_feedback4 +#define GL_AMD_transform_feedback4 1 + +#define GL_STREAM_RASTERIZATION_AMD 0x91A0 + +#define GLEW_AMD_transform_feedback4 GLEW_GET_VAR(__GLEW_AMD_transform_feedback4) + +#endif /* GL_AMD_transform_feedback4 */ + +/* ----------------------- GL_AMD_vertex_shader_layer ---------------------- */ + +#ifndef GL_AMD_vertex_shader_layer +#define GL_AMD_vertex_shader_layer 1 + +#define GLEW_AMD_vertex_shader_layer GLEW_GET_VAR(__GLEW_AMD_vertex_shader_layer) + +#endif /* GL_AMD_vertex_shader_layer */ + +/* -------------------- GL_AMD_vertex_shader_tessellator ------------------- */ + +#ifndef GL_AMD_vertex_shader_tessellator +#define GL_AMD_vertex_shader_tessellator 1 + +#define GL_SAMPLER_BUFFER_AMD 0x9001 +#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 +#define GL_TESSELLATION_MODE_AMD 0x9004 +#define GL_TESSELLATION_FACTOR_AMD 0x9005 +#define GL_DISCRETE_AMD 0x9006 +#define GL_CONTINUOUS_AMD 0x9007 + +typedef void (GLAPIENTRY * PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); +typedef void (GLAPIENTRY * PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); + +#define glTessellationFactorAMD GLEW_GET_FUN(__glewTessellationFactorAMD) +#define glTessellationModeAMD GLEW_GET_FUN(__glewTessellationModeAMD) + +#define GLEW_AMD_vertex_shader_tessellator GLEW_GET_VAR(__GLEW_AMD_vertex_shader_tessellator) + +#endif /* GL_AMD_vertex_shader_tessellator */ + +/* ------------------ GL_AMD_vertex_shader_viewport_index ------------------ */ + +#ifndef GL_AMD_vertex_shader_viewport_index +#define GL_AMD_vertex_shader_viewport_index 1 + +#define GLEW_AMD_vertex_shader_viewport_index GLEW_GET_VAR(__GLEW_AMD_vertex_shader_viewport_index) + +#endif /* GL_AMD_vertex_shader_viewport_index */ + +/* -------------------- GL_ANDROID_extension_pack_es31a -------------------- */ + +#ifndef GL_ANDROID_extension_pack_es31a +#define GL_ANDROID_extension_pack_es31a 1 + +#define GLEW_ANDROID_extension_pack_es31a GLEW_GET_VAR(__GLEW_ANDROID_extension_pack_es31a) + +#endif /* GL_ANDROID_extension_pack_es31a */ + +/* ------------------------- GL_ANGLE_depth_texture ------------------------ */ + +#ifndef GL_ANGLE_depth_texture +#define GL_ANGLE_depth_texture 1 + +#define GLEW_ANGLE_depth_texture GLEW_GET_VAR(__GLEW_ANGLE_depth_texture) + +#endif /* GL_ANGLE_depth_texture */ + +/* ----------------------- GL_ANGLE_framebuffer_blit ----------------------- */ + +#ifndef GL_ANGLE_framebuffer_blit +#define GL_ANGLE_framebuffer_blit 1 + +#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA + +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + +#define glBlitFramebufferANGLE GLEW_GET_FUN(__glewBlitFramebufferANGLE) + +#define GLEW_ANGLE_framebuffer_blit GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_blit) + +#endif /* GL_ANGLE_framebuffer_blit */ + +/* -------------------- GL_ANGLE_framebuffer_multisample ------------------- */ + +#ifndef GL_ANGLE_framebuffer_multisample +#define GL_ANGLE_framebuffer_multisample 1 + +#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 +#define GL_MAX_SAMPLES_ANGLE 0x8D57 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleANGLE GLEW_GET_FUN(__glewRenderbufferStorageMultisampleANGLE) + +#define GLEW_ANGLE_framebuffer_multisample GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_multisample) + +#endif /* GL_ANGLE_framebuffer_multisample */ + +/* ----------------------- GL_ANGLE_instanced_arrays ----------------------- */ + +#ifndef GL_ANGLE_instanced_arrays +#define GL_ANGLE_instanced_arrays 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor); + +#define glDrawArraysInstancedANGLE GLEW_GET_FUN(__glewDrawArraysInstancedANGLE) +#define glDrawElementsInstancedANGLE GLEW_GET_FUN(__glewDrawElementsInstancedANGLE) +#define glVertexAttribDivisorANGLE GLEW_GET_FUN(__glewVertexAttribDivisorANGLE) + +#define GLEW_ANGLE_instanced_arrays GLEW_GET_VAR(__GLEW_ANGLE_instanced_arrays) + +#endif /* GL_ANGLE_instanced_arrays */ + +/* -------------------- GL_ANGLE_pack_reverse_row_order -------------------- */ + +#ifndef GL_ANGLE_pack_reverse_row_order +#define GL_ANGLE_pack_reverse_row_order 1 + +#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 + +#define GLEW_ANGLE_pack_reverse_row_order GLEW_GET_VAR(__GLEW_ANGLE_pack_reverse_row_order) + +#endif /* GL_ANGLE_pack_reverse_row_order */ + +/* ------------------------ GL_ANGLE_program_binary ------------------------ */ + +#ifndef GL_ANGLE_program_binary +#define GL_ANGLE_program_binary 1 + +#define GL_PROGRAM_BINARY_ANGLE 0x93A6 + +#define GLEW_ANGLE_program_binary GLEW_GET_VAR(__GLEW_ANGLE_program_binary) + +#endif /* GL_ANGLE_program_binary */ + +/* ------------------- GL_ANGLE_texture_compression_dxt1 ------------------- */ + +#ifndef GL_ANGLE_texture_compression_dxt1 +#define GL_ANGLE_texture_compression_dxt1 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 + +#define GLEW_ANGLE_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt1) + +#endif /* GL_ANGLE_texture_compression_dxt1 */ + +/* ------------------- GL_ANGLE_texture_compression_dxt3 ------------------- */ + +#ifndef GL_ANGLE_texture_compression_dxt3 +#define GL_ANGLE_texture_compression_dxt3 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 + +#define GLEW_ANGLE_texture_compression_dxt3 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt3) + +#endif /* GL_ANGLE_texture_compression_dxt3 */ + +/* ------------------- GL_ANGLE_texture_compression_dxt5 ------------------- */ + +#ifndef GL_ANGLE_texture_compression_dxt5 +#define GL_ANGLE_texture_compression_dxt5 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 + +#define GLEW_ANGLE_texture_compression_dxt5 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt5) + +#endif /* GL_ANGLE_texture_compression_dxt5 */ + +/* ------------------------- GL_ANGLE_texture_usage ------------------------ */ + +#ifndef GL_ANGLE_texture_usage +#define GL_ANGLE_texture_usage 1 + +#define GL_TEXTURE_USAGE_ANGLE 0x93A2 +#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 + +#define GLEW_ANGLE_texture_usage GLEW_GET_VAR(__GLEW_ANGLE_texture_usage) + +#endif /* GL_ANGLE_texture_usage */ + +/* -------------------------- GL_ANGLE_timer_query ------------------------- */ + +#ifndef GL_ANGLE_timer_query +#define GL_ANGLE_timer_query 1 + +#define GL_QUERY_COUNTER_BITS_ANGLE 0x8864 +#define GL_CURRENT_QUERY_ANGLE 0x8865 +#define GL_QUERY_RESULT_ANGLE 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ANGLE 0x8867 +#define GL_TIME_ELAPSED_ANGLE 0x88BF +#define GL_TIMESTAMP_ANGLE 0x8E28 + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYANGLEPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESANGLEPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYANGLEPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENQUERIESANGLEPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VANGLEPROC) (GLuint id, GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVANGLEPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VANGLEPROC) (GLuint id, GLenum pname, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVANGLEPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVANGLEPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYANGLEPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERANGLEPROC) (GLuint id, GLenum target); + +#define glBeginQueryANGLE GLEW_GET_FUN(__glewBeginQueryANGLE) +#define glDeleteQueriesANGLE GLEW_GET_FUN(__glewDeleteQueriesANGLE) +#define glEndQueryANGLE GLEW_GET_FUN(__glewEndQueryANGLE) +#define glGenQueriesANGLE GLEW_GET_FUN(__glewGenQueriesANGLE) +#define glGetQueryObjecti64vANGLE GLEW_GET_FUN(__glewGetQueryObjecti64vANGLE) +#define glGetQueryObjectivANGLE GLEW_GET_FUN(__glewGetQueryObjectivANGLE) +#define glGetQueryObjectui64vANGLE GLEW_GET_FUN(__glewGetQueryObjectui64vANGLE) +#define glGetQueryObjectuivANGLE GLEW_GET_FUN(__glewGetQueryObjectuivANGLE) +#define glGetQueryivANGLE GLEW_GET_FUN(__glewGetQueryivANGLE) +#define glIsQueryANGLE GLEW_GET_FUN(__glewIsQueryANGLE) +#define glQueryCounterANGLE GLEW_GET_FUN(__glewQueryCounterANGLE) + +#define GLEW_ANGLE_timer_query GLEW_GET_VAR(__GLEW_ANGLE_timer_query) + +#endif /* GL_ANGLE_timer_query */ + +/* ------------------- GL_ANGLE_translated_shader_source ------------------- */ + +#ifndef GL_ANGLE_translated_shader_source +#define GL_ANGLE_translated_shader_source 1 + +#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 + +typedef void (GLAPIENTRY * PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source); + +#define glGetTranslatedShaderSourceANGLE GLEW_GET_FUN(__glewGetTranslatedShaderSourceANGLE) + +#define GLEW_ANGLE_translated_shader_source GLEW_GET_VAR(__GLEW_ANGLE_translated_shader_source) + +#endif /* GL_ANGLE_translated_shader_source */ + +/* ----------------------- GL_APPLE_aux_depth_stencil ---------------------- */ + +#ifndef GL_APPLE_aux_depth_stencil +#define GL_APPLE_aux_depth_stencil 1 + +#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 + +#define GLEW_APPLE_aux_depth_stencil GLEW_GET_VAR(__GLEW_APPLE_aux_depth_stencil) + +#endif /* GL_APPLE_aux_depth_stencil */ + +/* ------------------------ GL_APPLE_client_storage ------------------------ */ + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 + +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 + +#define GLEW_APPLE_client_storage GLEW_GET_VAR(__GLEW_APPLE_client_storage) + +#endif /* GL_APPLE_client_storage */ + +/* ------------------------- GL_APPLE_clip_distance ------------------------ */ + +#ifndef GL_APPLE_clip_distance +#define GL_APPLE_clip_distance 1 + +#define GL_MAX_CLIP_DISTANCES_APPLE 0x0D32 +#define GL_CLIP_DISTANCE0_APPLE 0x3000 +#define GL_CLIP_DISTANCE1_APPLE 0x3001 +#define GL_CLIP_DISTANCE2_APPLE 0x3002 +#define GL_CLIP_DISTANCE3_APPLE 0x3003 +#define GL_CLIP_DISTANCE4_APPLE 0x3004 +#define GL_CLIP_DISTANCE5_APPLE 0x3005 +#define GL_CLIP_DISTANCE6_APPLE 0x3006 +#define GL_CLIP_DISTANCE7_APPLE 0x3007 + +#define GLEW_APPLE_clip_distance GLEW_GET_VAR(__GLEW_APPLE_clip_distance) + +#endif /* GL_APPLE_clip_distance */ + +/* ------------------- GL_APPLE_color_buffer_packed_float ------------------ */ + +#ifndef GL_APPLE_color_buffer_packed_float +#define GL_APPLE_color_buffer_packed_float 1 + +#define GLEW_APPLE_color_buffer_packed_float GLEW_GET_VAR(__GLEW_APPLE_color_buffer_packed_float) + +#endif /* GL_APPLE_color_buffer_packed_float */ + +/* ---------------------- GL_APPLE_copy_texture_levels --------------------- */ + +#ifndef GL_APPLE_copy_texture_levels +#define GL_APPLE_copy_texture_levels 1 + +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); + +#define glCopyTextureLevelsAPPLE GLEW_GET_FUN(__glewCopyTextureLevelsAPPLE) + +#define GLEW_APPLE_copy_texture_levels GLEW_GET_VAR(__GLEW_APPLE_copy_texture_levels) + +#endif /* GL_APPLE_copy_texture_levels */ + +/* ------------------------- GL_APPLE_element_array ------------------------ */ + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 + +#define GL_ELEMENT_ARRAY_APPLE 0x8A0C +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount); + +#define glDrawElementArrayAPPLE GLEW_GET_FUN(__glewDrawElementArrayAPPLE) +#define glDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewDrawRangeElementArrayAPPLE) +#define glElementPointerAPPLE GLEW_GET_FUN(__glewElementPointerAPPLE) +#define glMultiDrawElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawElementArrayAPPLE) +#define glMultiDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawRangeElementArrayAPPLE) + +#define GLEW_APPLE_element_array GLEW_GET_VAR(__GLEW_APPLE_element_array) + +#endif /* GL_APPLE_element_array */ + +/* ----------------------------- GL_APPLE_fence ---------------------------- */ + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 + +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B + +typedef void (GLAPIENTRY * PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint* fences); +typedef void (GLAPIENTRY * PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +typedef void (GLAPIENTRY * PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint* fences); +typedef GLboolean (GLAPIENTRY * PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (GLAPIENTRY * PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); + +#define glDeleteFencesAPPLE GLEW_GET_FUN(__glewDeleteFencesAPPLE) +#define glFinishFenceAPPLE GLEW_GET_FUN(__glewFinishFenceAPPLE) +#define glFinishObjectAPPLE GLEW_GET_FUN(__glewFinishObjectAPPLE) +#define glGenFencesAPPLE GLEW_GET_FUN(__glewGenFencesAPPLE) +#define glIsFenceAPPLE GLEW_GET_FUN(__glewIsFenceAPPLE) +#define glSetFenceAPPLE GLEW_GET_FUN(__glewSetFenceAPPLE) +#define glTestFenceAPPLE GLEW_GET_FUN(__glewTestFenceAPPLE) +#define glTestObjectAPPLE GLEW_GET_FUN(__glewTestObjectAPPLE) + +#define GLEW_APPLE_fence GLEW_GET_VAR(__GLEW_APPLE_fence) + +#endif /* GL_APPLE_fence */ + +/* ------------------------- GL_APPLE_float_pixels ------------------------- */ + +#ifndef GL_APPLE_float_pixels +#define GL_APPLE_float_pixels 1 + +#define GL_HALF_APPLE 0x140B +#define GL_RGBA_FLOAT32_APPLE 0x8814 +#define GL_RGB_FLOAT32_APPLE 0x8815 +#define GL_ALPHA_FLOAT32_APPLE 0x8816 +#define GL_INTENSITY_FLOAT32_APPLE 0x8817 +#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 +#define GL_RGBA_FLOAT16_APPLE 0x881A +#define GL_RGB_FLOAT16_APPLE 0x881B +#define GL_ALPHA_FLOAT16_APPLE 0x881C +#define GL_INTENSITY_FLOAT16_APPLE 0x881D +#define GL_LUMINANCE_FLOAT16_APPLE 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F +#define GL_COLOR_FLOAT_APPLE 0x8A0F + +#define GLEW_APPLE_float_pixels GLEW_GET_VAR(__GLEW_APPLE_float_pixels) + +#endif /* GL_APPLE_float_pixels */ + +/* ---------------------- GL_APPLE_flush_buffer_range ---------------------- */ + +#ifndef GL_APPLE_flush_buffer_range +#define GL_APPLE_flush_buffer_range 1 + +#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 +#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 + +typedef void (GLAPIENTRY * PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); + +#define glBufferParameteriAPPLE GLEW_GET_FUN(__glewBufferParameteriAPPLE) +#define glFlushMappedBufferRangeAPPLE GLEW_GET_FUN(__glewFlushMappedBufferRangeAPPLE) + +#define GLEW_APPLE_flush_buffer_range GLEW_GET_VAR(__GLEW_APPLE_flush_buffer_range) + +#endif /* GL_APPLE_flush_buffer_range */ + +/* -------------------- GL_APPLE_framebuffer_multisample ------------------- */ + +#ifndef GL_APPLE_framebuffer_multisample +#define GL_APPLE_framebuffer_multisample 1 + +#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_APPLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_APPLE 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA +#define GL_RENDERBUFFER_SAMPLES_APPLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56 +#define GL_MAX_SAMPLES_APPLE 0x8D57 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void); + +#define glRenderbufferStorageMultisampleAPPLE GLEW_GET_FUN(__glewRenderbufferStorageMultisampleAPPLE) +#define glResolveMultisampleFramebufferAPPLE GLEW_GET_FUN(__glewResolveMultisampleFramebufferAPPLE) + +#define GLEW_APPLE_framebuffer_multisample GLEW_GET_VAR(__GLEW_APPLE_framebuffer_multisample) + +#endif /* GL_APPLE_framebuffer_multisample */ + +/* ----------------------- GL_APPLE_object_purgeable ----------------------- */ + +#ifndef GL_APPLE_object_purgeable +#define GL_APPLE_object_purgeable 1 + +#define GL_BUFFER_OBJECT_APPLE 0x85B3 +#define GL_RELEASED_APPLE 0x8A19 +#define GL_VOLATILE_APPLE 0x8A1A +#define GL_RETAINED_APPLE 0x8A1B +#define GL_UNDEFINED_APPLE 0x8A1C +#define GL_PURGEABLE_APPLE 0x8A1D + +typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint* params); +typedef GLenum (GLAPIENTRY * PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef GLenum (GLAPIENTRY * PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); + +#define glGetObjectParameterivAPPLE GLEW_GET_FUN(__glewGetObjectParameterivAPPLE) +#define glObjectPurgeableAPPLE GLEW_GET_FUN(__glewObjectPurgeableAPPLE) +#define glObjectUnpurgeableAPPLE GLEW_GET_FUN(__glewObjectUnpurgeableAPPLE) + +#define GLEW_APPLE_object_purgeable GLEW_GET_VAR(__GLEW_APPLE_object_purgeable) + +#endif /* GL_APPLE_object_purgeable */ + +/* ------------------------- GL_APPLE_pixel_buffer ------------------------- */ + +#ifndef GL_APPLE_pixel_buffer +#define GL_APPLE_pixel_buffer 1 + +#define GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10 + +#define GLEW_APPLE_pixel_buffer GLEW_GET_VAR(__GLEW_APPLE_pixel_buffer) + +#endif /* GL_APPLE_pixel_buffer */ + +/* ---------------------------- GL_APPLE_rgb_422 --------------------------- */ + +#ifndef GL_APPLE_rgb_422 +#define GL_APPLE_rgb_422 1 + +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#define GL_RGB_422_APPLE 0x8A1F +#define GL_RGB_RAW_422_APPLE 0x8A51 + +#define GLEW_APPLE_rgb_422 GLEW_GET_VAR(__GLEW_APPLE_rgb_422) + +#endif /* GL_APPLE_rgb_422 */ + +/* --------------------------- GL_APPLE_row_bytes -------------------------- */ + +#ifndef GL_APPLE_row_bytes +#define GL_APPLE_row_bytes 1 + +#define GL_PACK_ROW_BYTES_APPLE 0x8A15 +#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 + +#define GLEW_APPLE_row_bytes GLEW_GET_VAR(__GLEW_APPLE_row_bytes) + +#endif /* GL_APPLE_row_bytes */ + +/* ------------------------ GL_APPLE_specular_vector ----------------------- */ + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 + +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 + +#define GLEW_APPLE_specular_vector GLEW_GET_VAR(__GLEW_APPLE_specular_vector) + +#endif /* GL_APPLE_specular_vector */ + +/* ----------------------------- GL_APPLE_sync ----------------------------- */ + +#ifndef GL_APPLE_sync +#define GL_APPLE_sync 1 + +#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE 0x00000001 +#define GL_SYNC_OBJECT_APPLE 0x8A53 +#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE 0x9111 +#define GL_OBJECT_TYPE_APPLE 0x9112 +#define GL_SYNC_CONDITION_APPLE 0x9113 +#define GL_SYNC_STATUS_APPLE 0x9114 +#define GL_SYNC_FLAGS_APPLE 0x9115 +#define GL_SYNC_FENCE_APPLE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE 0x9117 +#define GL_UNSIGNALED_APPLE 0x9118 +#define GL_SIGNALED_APPLE 0x9119 +#define GL_ALREADY_SIGNALED_APPLE 0x911A +#define GL_TIMEOUT_EXPIRED_APPLE 0x911B +#define GL_CONDITION_SATISFIED_APPLE 0x911C +#define GL_WAIT_FAILED_APPLE 0x911D +#define GL_TIMEOUT_IGNORED_APPLE 0xFFFFFFFFFFFFFFFFull + +typedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync GLsync, GLbitfield flags, GLuint64 timeout); +typedef void (GLAPIENTRY * PFNGLDELETESYNCAPPLEPROC) (GLsync GLsync); +typedef GLsync (GLAPIENTRY * PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETSYNCIVAPPLEPROC) (GLsync GLsync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint *values); +typedef GLboolean (GLAPIENTRY * PFNGLISSYNCAPPLEPROC) (GLsync GLsync); +typedef void (GLAPIENTRY * PFNGLWAITSYNCAPPLEPROC) (GLsync GLsync, GLbitfield flags, GLuint64 timeout); + +#define glClientWaitSyncAPPLE GLEW_GET_FUN(__glewClientWaitSyncAPPLE) +#define glDeleteSyncAPPLE GLEW_GET_FUN(__glewDeleteSyncAPPLE) +#define glFenceSyncAPPLE GLEW_GET_FUN(__glewFenceSyncAPPLE) +#define glGetInteger64vAPPLE GLEW_GET_FUN(__glewGetInteger64vAPPLE) +#define glGetSyncivAPPLE GLEW_GET_FUN(__glewGetSyncivAPPLE) +#define glIsSyncAPPLE GLEW_GET_FUN(__glewIsSyncAPPLE) +#define glWaitSyncAPPLE GLEW_GET_FUN(__glewWaitSyncAPPLE) + +#define GLEW_APPLE_sync GLEW_GET_VAR(__GLEW_APPLE_sync) + +#endif /* GL_APPLE_sync */ + +/* -------------------- GL_APPLE_texture_2D_limited_npot ------------------- */ + +#ifndef GL_APPLE_texture_2D_limited_npot +#define GL_APPLE_texture_2D_limited_npot 1 + +#define GLEW_APPLE_texture_2D_limited_npot GLEW_GET_VAR(__GLEW_APPLE_texture_2D_limited_npot) + +#endif /* GL_APPLE_texture_2D_limited_npot */ + +/* -------------------- GL_APPLE_texture_format_BGRA8888 ------------------- */ + +#ifndef GL_APPLE_texture_format_BGRA8888 +#define GL_APPLE_texture_format_BGRA8888 1 + +#define GL_BGRA_EXT 0x80E1 +#define GL_BGRA8_EXT 0x93A1 + +#define GLEW_APPLE_texture_format_BGRA8888 GLEW_GET_VAR(__GLEW_APPLE_texture_format_BGRA8888) + +#endif /* GL_APPLE_texture_format_BGRA8888 */ + +/* ----------------------- GL_APPLE_texture_max_level ---------------------- */ + +#ifndef GL_APPLE_texture_max_level +#define GL_APPLE_texture_max_level 1 + +#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D + +#define GLEW_APPLE_texture_max_level GLEW_GET_VAR(__GLEW_APPLE_texture_max_level) + +#endif /* GL_APPLE_texture_max_level */ + +/* --------------------- GL_APPLE_texture_packed_float --------------------- */ + +#ifndef GL_APPLE_texture_packed_float +#define GL_APPLE_texture_packed_float 1 + +#define GL_R11F_G11F_B10F_APPLE 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_APPLE 0x8C3B +#define GL_RGB9_E5_APPLE 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_APPLE 0x8C3E + +#define GLEW_APPLE_texture_packed_float GLEW_GET_VAR(__GLEW_APPLE_texture_packed_float) + +#endif /* GL_APPLE_texture_packed_float */ + +/* ------------------------- GL_APPLE_texture_range ------------------------ */ + +#ifndef GL_APPLE_texture_range +#define GL_APPLE_texture_range 1 + +#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 +#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 +#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC +#define GL_STORAGE_PRIVATE_APPLE 0x85BD +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF + +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params); +typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, void *pointer); + +#define glGetTexParameterPointervAPPLE GLEW_GET_FUN(__glewGetTexParameterPointervAPPLE) +#define glTextureRangeAPPLE GLEW_GET_FUN(__glewTextureRangeAPPLE) + +#define GLEW_APPLE_texture_range GLEW_GET_VAR(__GLEW_APPLE_texture_range) + +#endif /* GL_APPLE_texture_range */ + +/* ------------------------ GL_APPLE_transform_hint ------------------------ */ + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 + +#define GL_TRANSFORM_HINT_APPLE 0x85B1 + +#define GLEW_APPLE_transform_hint GLEW_GET_VAR(__GLEW_APPLE_transform_hint) + +#endif /* GL_APPLE_transform_hint */ + +/* ---------------------- GL_APPLE_vertex_array_object --------------------- */ + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 + +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 + +typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); +typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); +typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); + +#define glBindVertexArrayAPPLE GLEW_GET_FUN(__glewBindVertexArrayAPPLE) +#define glDeleteVertexArraysAPPLE GLEW_GET_FUN(__glewDeleteVertexArraysAPPLE) +#define glGenVertexArraysAPPLE GLEW_GET_FUN(__glewGenVertexArraysAPPLE) +#define glIsVertexArrayAPPLE GLEW_GET_FUN(__glewIsVertexArrayAPPLE) + +#define GLEW_APPLE_vertex_array_object GLEW_GET_VAR(__GLEW_APPLE_vertex_array_object) + +#endif /* GL_APPLE_vertex_array_object */ + +/* ---------------------- GL_APPLE_vertex_array_range ---------------------- */ + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 + +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CLIENT_APPLE 0x85B4 +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF + +typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); + +#define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE) +#define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE) +#define glVertexArrayRangeAPPLE GLEW_GET_FUN(__glewVertexArrayRangeAPPLE) + +#define GLEW_APPLE_vertex_array_range GLEW_GET_VAR(__GLEW_APPLE_vertex_array_range) + +#endif /* GL_APPLE_vertex_array_range */ + +/* ------------------- GL_APPLE_vertex_program_evaluators ------------------ */ + +#ifndef GL_APPLE_vertex_program_evaluators +#define GL_APPLE_vertex_program_evaluators 1 + +#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 +#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 +#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 +#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 +#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 +#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 +#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 +#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 +#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 +#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 + +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); +typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points); +typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points); +typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points); + +#define glDisableVertexAttribAPPLE GLEW_GET_FUN(__glewDisableVertexAttribAPPLE) +#define glEnableVertexAttribAPPLE GLEW_GET_FUN(__glewEnableVertexAttribAPPLE) +#define glIsVertexAttribEnabledAPPLE GLEW_GET_FUN(__glewIsVertexAttribEnabledAPPLE) +#define glMapVertexAttrib1dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1dAPPLE) +#define glMapVertexAttrib1fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1fAPPLE) +#define glMapVertexAttrib2dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2dAPPLE) +#define glMapVertexAttrib2fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2fAPPLE) + +#define GLEW_APPLE_vertex_program_evaluators GLEW_GET_VAR(__GLEW_APPLE_vertex_program_evaluators) + +#endif /* GL_APPLE_vertex_program_evaluators */ + +/* --------------------------- GL_APPLE_ycbcr_422 -------------------------- */ + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 + +#define GL_YCBCR_422_APPLE 0x85B9 + +#define GLEW_APPLE_ycbcr_422 GLEW_GET_VAR(__GLEW_APPLE_ycbcr_422) + +#endif /* GL_APPLE_ycbcr_422 */ + +/* ------------------------ GL_ARB_ES2_compatibility ----------------------- */ + +#ifndef GL_ARB_ES2_compatibility +#define GL_ARB_ES2_compatibility 1 + +#define GL_FIXED 0x140C +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_RGB565 0x8D62 +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD + +typedef int GLfixed; + +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFPROC) (GLclampf d); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f); +typedef void (GLAPIENTRY * PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint *precision); +typedef void (GLAPIENTRY * PFNGLRELEASESHADERCOMPILERPROC) (void); +typedef void (GLAPIENTRY * PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint* shaders, GLenum binaryformat, const void*binary, GLsizei length); + +#define glClearDepthf GLEW_GET_FUN(__glewClearDepthf) +#define glDepthRangef GLEW_GET_FUN(__glewDepthRangef) +#define glGetShaderPrecisionFormat GLEW_GET_FUN(__glewGetShaderPrecisionFormat) +#define glReleaseShaderCompiler GLEW_GET_FUN(__glewReleaseShaderCompiler) +#define glShaderBinary GLEW_GET_FUN(__glewShaderBinary) + +#define GLEW_ARB_ES2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES2_compatibility) + +#endif /* GL_ARB_ES2_compatibility */ + +/* ----------------------- GL_ARB_ES3_1_compatibility ---------------------- */ + +#ifndef GL_ARB_ES3_1_compatibility +#define GL_ARB_ES3_1_compatibility 1 + +typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); + +#define glMemoryBarrierByRegion GLEW_GET_FUN(__glewMemoryBarrierByRegion) + +#define GLEW_ARB_ES3_1_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_1_compatibility) + +#endif /* GL_ARB_ES3_1_compatibility */ + +/* ----------------------- GL_ARB_ES3_2_compatibility ---------------------- */ + +#ifndef GL_ARB_ES3_2_compatibility +#define GL_ARB_ES3_2_compatibility 1 + +#define GL_PRIMITIVE_BOUNDING_BOX_ARB 0x92BE +#define GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB 0x9381 +#define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB 0x9382 + +typedef void (GLAPIENTRY * PFNGLPRIMITIVEBOUNDINGBOXARBPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); + +#define glPrimitiveBoundingBoxARB GLEW_GET_FUN(__glewPrimitiveBoundingBoxARB) + +#define GLEW_ARB_ES3_2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_2_compatibility) + +#endif /* GL_ARB_ES3_2_compatibility */ + +/* ------------------------ GL_ARB_ES3_compatibility ----------------------- */ + +#ifndef GL_ARB_ES3_compatibility +#define GL_ARB_ES3_compatibility 1 + +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF +#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A +#define GL_MAX_ELEMENT_INDEX 0x8D6B +#define GL_COMPRESSED_R11_EAC 0x9270 +#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 +#define GL_COMPRESSED_RG11_EAC 0x9272 +#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 +#define GL_COMPRESSED_RGB8_ETC2 0x9274 +#define GL_COMPRESSED_SRGB8_ETC2 0x9275 +#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 +#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 +#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 + +#define GLEW_ARB_ES3_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_compatibility) + +#endif /* GL_ARB_ES3_compatibility */ + +/* ------------------------ GL_ARB_arrays_of_arrays ------------------------ */ + +#ifndef GL_ARB_arrays_of_arrays +#define GL_ARB_arrays_of_arrays 1 + +#define GLEW_ARB_arrays_of_arrays GLEW_GET_VAR(__GLEW_ARB_arrays_of_arrays) + +#endif /* GL_ARB_arrays_of_arrays */ + +/* -------------------------- GL_ARB_base_instance ------------------------- */ + +#ifndef GL_ARB_base_instance +#define GL_ARB_base_instance 1 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount, GLuint baseinstance); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLuint baseinstance); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLint basevertex, GLuint baseinstance); + +#define glDrawArraysInstancedBaseInstance GLEW_GET_FUN(__glewDrawArraysInstancedBaseInstance) +#define glDrawElementsInstancedBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseInstance) +#define glDrawElementsInstancedBaseVertexBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexBaseInstance) + +#define GLEW_ARB_base_instance GLEW_GET_VAR(__GLEW_ARB_base_instance) + +#endif /* GL_ARB_base_instance */ + +/* ------------------------ GL_ARB_bindless_texture ------------------------ */ + +#ifndef GL_ARB_bindless_texture +#define GL_ARB_bindless_texture 1 + +#define GL_UNSIGNED_INT64_ARB 0x140F + +typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT* params); +typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT* v); + +#define glGetImageHandleARB GLEW_GET_FUN(__glewGetImageHandleARB) +#define glGetTextureHandleARB GLEW_GET_FUN(__glewGetTextureHandleARB) +#define glGetTextureSamplerHandleARB GLEW_GET_FUN(__glewGetTextureSamplerHandleARB) +#define glGetVertexAttribLui64vARB GLEW_GET_FUN(__glewGetVertexAttribLui64vARB) +#define glIsImageHandleResidentARB GLEW_GET_FUN(__glewIsImageHandleResidentARB) +#define glIsTextureHandleResidentARB GLEW_GET_FUN(__glewIsTextureHandleResidentARB) +#define glMakeImageHandleNonResidentARB GLEW_GET_FUN(__glewMakeImageHandleNonResidentARB) +#define glMakeImageHandleResidentARB GLEW_GET_FUN(__glewMakeImageHandleResidentARB) +#define glMakeTextureHandleNonResidentARB GLEW_GET_FUN(__glewMakeTextureHandleNonResidentARB) +#define glMakeTextureHandleResidentARB GLEW_GET_FUN(__glewMakeTextureHandleResidentARB) +#define glProgramUniformHandleui64ARB GLEW_GET_FUN(__glewProgramUniformHandleui64ARB) +#define glProgramUniformHandleui64vARB GLEW_GET_FUN(__glewProgramUniformHandleui64vARB) +#define glUniformHandleui64ARB GLEW_GET_FUN(__glewUniformHandleui64ARB) +#define glUniformHandleui64vARB GLEW_GET_FUN(__glewUniformHandleui64vARB) +#define glVertexAttribL1ui64ARB GLEW_GET_FUN(__glewVertexAttribL1ui64ARB) +#define glVertexAttribL1ui64vARB GLEW_GET_FUN(__glewVertexAttribL1ui64vARB) + +#define GLEW_ARB_bindless_texture GLEW_GET_VAR(__GLEW_ARB_bindless_texture) + +#endif /* GL_ARB_bindless_texture */ + +/* ----------------------- GL_ARB_blend_func_extended ---------------------- */ + +#ifndef GL_ARB_blend_func_extended +#define GL_ARB_blend_func_extended 1 + +#define GL_SRC1_COLOR 0x88F9 +#define GL_ONE_MINUS_SRC1_COLOR 0x88FA +#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC + +typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar * name); + +#define glBindFragDataLocationIndexed GLEW_GET_FUN(__glewBindFragDataLocationIndexed) +#define glGetFragDataIndex GLEW_GET_FUN(__glewGetFragDataIndex) + +#define GLEW_ARB_blend_func_extended GLEW_GET_VAR(__GLEW_ARB_blend_func_extended) + +#endif /* GL_ARB_blend_func_extended */ + +/* ------------------------- GL_ARB_buffer_storage ------------------------- */ + +#ifndef GL_ARB_buffer_storage +#define GL_ARB_buffer_storage 1 + +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_PERSISTENT_BIT 0x00000040 +#define GL_MAP_COHERENT_BIT 0x00000080 +#define GL_DYNAMIC_STORAGE_BIT 0x0100 +#define GL_CLIENT_STORAGE_BIT 0x0200 +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 +#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F +#define GL_BUFFER_STORAGE_FLAGS 0x8220 + +typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); + +#define glBufferStorage GLEW_GET_FUN(__glewBufferStorage) + +#define GLEW_ARB_buffer_storage GLEW_GET_VAR(__GLEW_ARB_buffer_storage) + +#endif /* GL_ARB_buffer_storage */ + +/* ---------------------------- GL_ARB_cl_event ---------------------------- */ + +#ifndef GL_ARB_cl_event +#define GL_ARB_cl_event 1 + +#define GL_SYNC_CL_EVENT_ARB 0x8240 +#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 + +typedef struct _cl_context *cl_context; +typedef struct _cl_event *cl_event; + +typedef GLsync (GLAPIENTRY * PFNGLCREATESYNCFROMCLEVENTARBPROC) (cl_context context, cl_event event, GLbitfield flags); + +#define glCreateSyncFromCLeventARB GLEW_GET_FUN(__glewCreateSyncFromCLeventARB) + +#define GLEW_ARB_cl_event GLEW_GET_VAR(__GLEW_ARB_cl_event) + +#endif /* GL_ARB_cl_event */ + +/* ----------------------- GL_ARB_clear_buffer_object ---------------------- */ + +#ifndef GL_ARB_clear_buffer_object +#define GL_ARB_clear_buffer_object 1 + +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); + +#define glClearBufferData GLEW_GET_FUN(__glewClearBufferData) +#define glClearBufferSubData GLEW_GET_FUN(__glewClearBufferSubData) +#define glClearNamedBufferDataEXT GLEW_GET_FUN(__glewClearNamedBufferDataEXT) +#define glClearNamedBufferSubDataEXT GLEW_GET_FUN(__glewClearNamedBufferSubDataEXT) + +#define GLEW_ARB_clear_buffer_object GLEW_GET_VAR(__GLEW_ARB_clear_buffer_object) + +#endif /* GL_ARB_clear_buffer_object */ + +/* -------------------------- GL_ARB_clear_texture ------------------------- */ + +#ifndef GL_ARB_clear_texture +#define GL_ARB_clear_texture 1 + +#define GL_CLEAR_TEXTURE 0x9365 + +typedef void (GLAPIENTRY * PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); + +#define glClearTexImage GLEW_GET_FUN(__glewClearTexImage) +#define glClearTexSubImage GLEW_GET_FUN(__glewClearTexSubImage) + +#define GLEW_ARB_clear_texture GLEW_GET_VAR(__GLEW_ARB_clear_texture) + +#endif /* GL_ARB_clear_texture */ + +/* -------------------------- GL_ARB_clip_control -------------------------- */ + +#ifndef GL_ARB_clip_control +#define GL_ARB_clip_control 1 + +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_CLIP_ORIGIN 0x935C +#define GL_CLIP_DEPTH_MODE 0x935D +#define GL_NEGATIVE_ONE_TO_ONE 0x935E +#define GL_ZERO_TO_ONE 0x935F + +typedef void (GLAPIENTRY * PFNGLCLIPCONTROLPROC) (GLenum origin, GLenum depth); + +#define glClipControl GLEW_GET_FUN(__glewClipControl) + +#define GLEW_ARB_clip_control GLEW_GET_VAR(__GLEW_ARB_clip_control) + +#endif /* GL_ARB_clip_control */ + +/* ----------------------- GL_ARB_color_buffer_float ----------------------- */ + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 + +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D + +typedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); + +#define glClampColorARB GLEW_GET_FUN(__glewClampColorARB) + +#define GLEW_ARB_color_buffer_float GLEW_GET_VAR(__GLEW_ARB_color_buffer_float) + +#endif /* GL_ARB_color_buffer_float */ + +/* -------------------------- GL_ARB_compatibility ------------------------- */ + +#ifndef GL_ARB_compatibility +#define GL_ARB_compatibility 1 + +#define GLEW_ARB_compatibility GLEW_GET_VAR(__GLEW_ARB_compatibility) + +#endif /* GL_ARB_compatibility */ + +/* ---------------- GL_ARB_compressed_texture_pixel_storage ---------------- */ + +#ifndef GL_ARB_compressed_texture_pixel_storage +#define GL_ARB_compressed_texture_pixel_storage 1 + +#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 +#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 +#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 +#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A +#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B +#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C +#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D +#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E + +#define GLEW_ARB_compressed_texture_pixel_storage GLEW_GET_VAR(__GLEW_ARB_compressed_texture_pixel_storage) + +#endif /* GL_ARB_compressed_texture_pixel_storage */ + +/* ------------------------- GL_ARB_compute_shader ------------------------- */ + +#ifndef GL_ARB_compute_shader +#define GL_ARB_compute_shader 1 + +#define GL_COMPUTE_SHADER_BIT 0x00000020 +#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 +#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 +#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 +#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 +#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 +#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 +#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB +#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED +#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE +#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF +#define GL_COMPUTE_SHADER 0x91B9 +#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB +#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC +#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD +#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE +#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF + +typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); + +#define glDispatchCompute GLEW_GET_FUN(__glewDispatchCompute) +#define glDispatchComputeIndirect GLEW_GET_FUN(__glewDispatchComputeIndirect) + +#define GLEW_ARB_compute_shader GLEW_GET_VAR(__GLEW_ARB_compute_shader) + +#endif /* GL_ARB_compute_shader */ + +/* ------------------- GL_ARB_compute_variable_group_size ------------------ */ + +#ifndef GL_ARB_compute_variable_group_size +#define GL_ARB_compute_variable_group_size 1 + +#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB +#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF +#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 +#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 + +typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); + +#define glDispatchComputeGroupSizeARB GLEW_GET_FUN(__glewDispatchComputeGroupSizeARB) + +#define GLEW_ARB_compute_variable_group_size GLEW_GET_VAR(__GLEW_ARB_compute_variable_group_size) + +#endif /* GL_ARB_compute_variable_group_size */ + +/* ------------------- GL_ARB_conditional_render_inverted ------------------ */ + +#ifndef GL_ARB_conditional_render_inverted +#define GL_ARB_conditional_render_inverted 1 + +#define GL_QUERY_WAIT_INVERTED 0x8E17 +#define GL_QUERY_NO_WAIT_INVERTED 0x8E18 +#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 +#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A + +#define GLEW_ARB_conditional_render_inverted GLEW_GET_VAR(__GLEW_ARB_conditional_render_inverted) + +#endif /* GL_ARB_conditional_render_inverted */ + +/* ----------------------- GL_ARB_conservative_depth ----------------------- */ + +#ifndef GL_ARB_conservative_depth +#define GL_ARB_conservative_depth 1 + +#define GLEW_ARB_conservative_depth GLEW_GET_VAR(__GLEW_ARB_conservative_depth) + +#endif /* GL_ARB_conservative_depth */ + +/* --------------------------- GL_ARB_copy_buffer -------------------------- */ + +#ifndef GL_ARB_copy_buffer +#define GL_ARB_copy_buffer 1 + +#define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_WRITE_BUFFER 0x8F37 + +typedef void (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); + +#define glCopyBufferSubData GLEW_GET_FUN(__glewCopyBufferSubData) + +#define GLEW_ARB_copy_buffer GLEW_GET_VAR(__GLEW_ARB_copy_buffer) + +#endif /* GL_ARB_copy_buffer */ + +/* --------------------------- GL_ARB_copy_image --------------------------- */ + +#ifndef GL_ARB_copy_image +#define GL_ARB_copy_image 1 + +typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); + +#define glCopyImageSubData GLEW_GET_FUN(__glewCopyImageSubData) + +#define GLEW_ARB_copy_image GLEW_GET_VAR(__GLEW_ARB_copy_image) + +#endif /* GL_ARB_copy_image */ + +/* -------------------------- GL_ARB_cull_distance ------------------------- */ + +#ifndef GL_ARB_cull_distance +#define GL_ARB_cull_distance 1 + +#define GL_MAX_CULL_DISTANCES 0x82F9 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA + +#define GLEW_ARB_cull_distance GLEW_GET_VAR(__GLEW_ARB_cull_distance) + +#endif /* GL_ARB_cull_distance */ + +/* -------------------------- GL_ARB_debug_output -------------------------- */ + +#ifndef GL_ARB_debug_output +#define GL_ARB_debug_output 1 + +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 +#define GL_DEBUG_SOURCE_API_ARB 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A +#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B +#define GL_DEBUG_TYPE_ERROR_ARB 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 +#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 +#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 + +typedef void (GLAPIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); + +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); +typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); + +#define glDebugMessageCallbackARB GLEW_GET_FUN(__glewDebugMessageCallbackARB) +#define glDebugMessageControlARB GLEW_GET_FUN(__glewDebugMessageControlARB) +#define glDebugMessageInsertARB GLEW_GET_FUN(__glewDebugMessageInsertARB) +#define glGetDebugMessageLogARB GLEW_GET_FUN(__glewGetDebugMessageLogARB) + +#define GLEW_ARB_debug_output GLEW_GET_VAR(__GLEW_ARB_debug_output) + +#endif /* GL_ARB_debug_output */ + +/* ----------------------- GL_ARB_depth_buffer_float ----------------------- */ + +#ifndef GL_ARB_depth_buffer_float +#define GL_ARB_depth_buffer_float 1 + +#define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH32F_STENCIL8 0x8CAD +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD + +#define GLEW_ARB_depth_buffer_float GLEW_GET_VAR(__GLEW_ARB_depth_buffer_float) + +#endif /* GL_ARB_depth_buffer_float */ + +/* --------------------------- GL_ARB_depth_clamp -------------------------- */ + +#ifndef GL_ARB_depth_clamp +#define GL_ARB_depth_clamp 1 + +#define GL_DEPTH_CLAMP 0x864F + +#define GLEW_ARB_depth_clamp GLEW_GET_VAR(__GLEW_ARB_depth_clamp) + +#endif /* GL_ARB_depth_clamp */ + +/* -------------------------- GL_ARB_depth_texture ------------------------- */ + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 + +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B + +#define GLEW_ARB_depth_texture GLEW_GET_VAR(__GLEW_ARB_depth_texture) + +#endif /* GL_ARB_depth_texture */ + +/* ----------------------- GL_ARB_derivative_control ----------------------- */ + +#ifndef GL_ARB_derivative_control +#define GL_ARB_derivative_control 1 + +#define GLEW_ARB_derivative_control GLEW_GET_VAR(__GLEW_ARB_derivative_control) + +#endif /* GL_ARB_derivative_control */ + +/* ----------------------- GL_ARB_direct_state_access ---------------------- */ + +#ifndef GL_ARB_direct_state_access +#define GL_ARB_direct_state_access 1 + +#define GL_TEXTURE_TARGET 0x1006 +#define GL_QUERY_TARGET 0x82EA + +typedef void (GLAPIENTRY * PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture); +typedef void (GLAPIENTRY * PFNGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat* value); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint* value); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines); +typedef void (GLAPIENTRY * PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint* samplers); +typedef void (GLAPIENTRY * PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint* textures); +typedef void (GLAPIENTRY * PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void** params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64* param); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments); +typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access); +typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum mode); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum mode); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat* param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint* param); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); + +#define glBindTextureUnit GLEW_GET_FUN(__glewBindTextureUnit) +#define glBlitNamedFramebuffer GLEW_GET_FUN(__glewBlitNamedFramebuffer) +#define glCheckNamedFramebufferStatus GLEW_GET_FUN(__glewCheckNamedFramebufferStatus) +#define glClearNamedBufferData GLEW_GET_FUN(__glewClearNamedBufferData) +#define glClearNamedBufferSubData GLEW_GET_FUN(__glewClearNamedBufferSubData) +#define glClearNamedFramebufferfi GLEW_GET_FUN(__glewClearNamedFramebufferfi) +#define glClearNamedFramebufferfv GLEW_GET_FUN(__glewClearNamedFramebufferfv) +#define glClearNamedFramebufferiv GLEW_GET_FUN(__glewClearNamedFramebufferiv) +#define glClearNamedFramebufferuiv GLEW_GET_FUN(__glewClearNamedFramebufferuiv) +#define glCompressedTextureSubImage1D GLEW_GET_FUN(__glewCompressedTextureSubImage1D) +#define glCompressedTextureSubImage2D GLEW_GET_FUN(__glewCompressedTextureSubImage2D) +#define glCompressedTextureSubImage3D GLEW_GET_FUN(__glewCompressedTextureSubImage3D) +#define glCopyNamedBufferSubData GLEW_GET_FUN(__glewCopyNamedBufferSubData) +#define glCopyTextureSubImage1D GLEW_GET_FUN(__glewCopyTextureSubImage1D) +#define glCopyTextureSubImage2D GLEW_GET_FUN(__glewCopyTextureSubImage2D) +#define glCopyTextureSubImage3D GLEW_GET_FUN(__glewCopyTextureSubImage3D) +#define glCreateBuffers GLEW_GET_FUN(__glewCreateBuffers) +#define glCreateFramebuffers GLEW_GET_FUN(__glewCreateFramebuffers) +#define glCreateProgramPipelines GLEW_GET_FUN(__glewCreateProgramPipelines) +#define glCreateQueries GLEW_GET_FUN(__glewCreateQueries) +#define glCreateRenderbuffers GLEW_GET_FUN(__glewCreateRenderbuffers) +#define glCreateSamplers GLEW_GET_FUN(__glewCreateSamplers) +#define glCreateTextures GLEW_GET_FUN(__glewCreateTextures) +#define glCreateTransformFeedbacks GLEW_GET_FUN(__glewCreateTransformFeedbacks) +#define glCreateVertexArrays GLEW_GET_FUN(__glewCreateVertexArrays) +#define glDisableVertexArrayAttrib GLEW_GET_FUN(__glewDisableVertexArrayAttrib) +#define glEnableVertexArrayAttrib GLEW_GET_FUN(__glewEnableVertexArrayAttrib) +#define glFlushMappedNamedBufferRange GLEW_GET_FUN(__glewFlushMappedNamedBufferRange) +#define glGenerateTextureMipmap GLEW_GET_FUN(__glewGenerateTextureMipmap) +#define glGetCompressedTextureImage GLEW_GET_FUN(__glewGetCompressedTextureImage) +#define glGetNamedBufferParameteri64v GLEW_GET_FUN(__glewGetNamedBufferParameteri64v) +#define glGetNamedBufferParameteriv GLEW_GET_FUN(__glewGetNamedBufferParameteriv) +#define glGetNamedBufferPointerv GLEW_GET_FUN(__glewGetNamedBufferPointerv) +#define glGetNamedBufferSubData GLEW_GET_FUN(__glewGetNamedBufferSubData) +#define glGetNamedFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameteriv) +#define glGetNamedFramebufferParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferParameteriv) +#define glGetNamedRenderbufferParameteriv GLEW_GET_FUN(__glewGetNamedRenderbufferParameteriv) +#define glGetQueryBufferObjecti64v GLEW_GET_FUN(__glewGetQueryBufferObjecti64v) +#define glGetQueryBufferObjectiv GLEW_GET_FUN(__glewGetQueryBufferObjectiv) +#define glGetQueryBufferObjectui64v GLEW_GET_FUN(__glewGetQueryBufferObjectui64v) +#define glGetQueryBufferObjectuiv GLEW_GET_FUN(__glewGetQueryBufferObjectuiv) +#define glGetTextureImage GLEW_GET_FUN(__glewGetTextureImage) +#define glGetTextureLevelParameterfv GLEW_GET_FUN(__glewGetTextureLevelParameterfv) +#define glGetTextureLevelParameteriv GLEW_GET_FUN(__glewGetTextureLevelParameteriv) +#define glGetTextureParameterIiv GLEW_GET_FUN(__glewGetTextureParameterIiv) +#define glGetTextureParameterIuiv GLEW_GET_FUN(__glewGetTextureParameterIuiv) +#define glGetTextureParameterfv GLEW_GET_FUN(__glewGetTextureParameterfv) +#define glGetTextureParameteriv GLEW_GET_FUN(__glewGetTextureParameteriv) +#define glGetTransformFeedbacki64_v GLEW_GET_FUN(__glewGetTransformFeedbacki64_v) +#define glGetTransformFeedbacki_v GLEW_GET_FUN(__glewGetTransformFeedbacki_v) +#define glGetTransformFeedbackiv GLEW_GET_FUN(__glewGetTransformFeedbackiv) +#define glGetVertexArrayIndexed64iv GLEW_GET_FUN(__glewGetVertexArrayIndexed64iv) +#define glGetVertexArrayIndexediv GLEW_GET_FUN(__glewGetVertexArrayIndexediv) +#define glGetVertexArrayiv GLEW_GET_FUN(__glewGetVertexArrayiv) +#define glInvalidateNamedFramebufferData GLEW_GET_FUN(__glewInvalidateNamedFramebufferData) +#define glInvalidateNamedFramebufferSubData GLEW_GET_FUN(__glewInvalidateNamedFramebufferSubData) +#define glMapNamedBuffer GLEW_GET_FUN(__glewMapNamedBuffer) +#define glMapNamedBufferRange GLEW_GET_FUN(__glewMapNamedBufferRange) +#define glNamedBufferData GLEW_GET_FUN(__glewNamedBufferData) +#define glNamedBufferStorage GLEW_GET_FUN(__glewNamedBufferStorage) +#define glNamedBufferSubData GLEW_GET_FUN(__glewNamedBufferSubData) +#define glNamedFramebufferDrawBuffer GLEW_GET_FUN(__glewNamedFramebufferDrawBuffer) +#define glNamedFramebufferDrawBuffers GLEW_GET_FUN(__glewNamedFramebufferDrawBuffers) +#define glNamedFramebufferParameteri GLEW_GET_FUN(__glewNamedFramebufferParameteri) +#define glNamedFramebufferReadBuffer GLEW_GET_FUN(__glewNamedFramebufferReadBuffer) +#define glNamedFramebufferRenderbuffer GLEW_GET_FUN(__glewNamedFramebufferRenderbuffer) +#define glNamedFramebufferTexture GLEW_GET_FUN(__glewNamedFramebufferTexture) +#define glNamedFramebufferTextureLayer GLEW_GET_FUN(__glewNamedFramebufferTextureLayer) +#define glNamedRenderbufferStorage GLEW_GET_FUN(__glewNamedRenderbufferStorage) +#define glNamedRenderbufferStorageMultisample GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisample) +#define glTextureBuffer GLEW_GET_FUN(__glewTextureBuffer) +#define glTextureBufferRange GLEW_GET_FUN(__glewTextureBufferRange) +#define glTextureParameterIiv GLEW_GET_FUN(__glewTextureParameterIiv) +#define glTextureParameterIuiv GLEW_GET_FUN(__glewTextureParameterIuiv) +#define glTextureParameterf GLEW_GET_FUN(__glewTextureParameterf) +#define glTextureParameterfv GLEW_GET_FUN(__glewTextureParameterfv) +#define glTextureParameteri GLEW_GET_FUN(__glewTextureParameteri) +#define glTextureParameteriv GLEW_GET_FUN(__glewTextureParameteriv) +#define glTextureStorage1D GLEW_GET_FUN(__glewTextureStorage1D) +#define glTextureStorage2D GLEW_GET_FUN(__glewTextureStorage2D) +#define glTextureStorage2DMultisample GLEW_GET_FUN(__glewTextureStorage2DMultisample) +#define glTextureStorage3D GLEW_GET_FUN(__glewTextureStorage3D) +#define glTextureStorage3DMultisample GLEW_GET_FUN(__glewTextureStorage3DMultisample) +#define glTextureSubImage1D GLEW_GET_FUN(__glewTextureSubImage1D) +#define glTextureSubImage2D GLEW_GET_FUN(__glewTextureSubImage2D) +#define glTextureSubImage3D GLEW_GET_FUN(__glewTextureSubImage3D) +#define glTransformFeedbackBufferBase GLEW_GET_FUN(__glewTransformFeedbackBufferBase) +#define glTransformFeedbackBufferRange GLEW_GET_FUN(__glewTransformFeedbackBufferRange) +#define glUnmapNamedBuffer GLEW_GET_FUN(__glewUnmapNamedBuffer) +#define glVertexArrayAttribBinding GLEW_GET_FUN(__glewVertexArrayAttribBinding) +#define glVertexArrayAttribFormat GLEW_GET_FUN(__glewVertexArrayAttribFormat) +#define glVertexArrayAttribIFormat GLEW_GET_FUN(__glewVertexArrayAttribIFormat) +#define glVertexArrayAttribLFormat GLEW_GET_FUN(__glewVertexArrayAttribLFormat) +#define glVertexArrayBindingDivisor GLEW_GET_FUN(__glewVertexArrayBindingDivisor) +#define glVertexArrayElementBuffer GLEW_GET_FUN(__glewVertexArrayElementBuffer) +#define glVertexArrayVertexBuffer GLEW_GET_FUN(__glewVertexArrayVertexBuffer) +#define glVertexArrayVertexBuffers GLEW_GET_FUN(__glewVertexArrayVertexBuffers) + +#define GLEW_ARB_direct_state_access GLEW_GET_VAR(__GLEW_ARB_direct_state_access) + +#endif /* GL_ARB_direct_state_access */ + +/* -------------------------- GL_ARB_draw_buffers -------------------------- */ + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 + +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersARB GLEW_GET_FUN(__glewDrawBuffersARB) + +#define GLEW_ARB_draw_buffers GLEW_GET_VAR(__GLEW_ARB_draw_buffers) + +#endif /* GL_ARB_draw_buffers */ + +/* ----------------------- GL_ARB_draw_buffers_blend ----------------------- */ + +#ifndef GL_ARB_draw_buffers_blend +#define GL_ARB_draw_buffers_blend 1 + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); + +#define glBlendEquationSeparateiARB GLEW_GET_FUN(__glewBlendEquationSeparateiARB) +#define glBlendEquationiARB GLEW_GET_FUN(__glewBlendEquationiARB) +#define glBlendFuncSeparateiARB GLEW_GET_FUN(__glewBlendFuncSeparateiARB) +#define glBlendFunciARB GLEW_GET_FUN(__glewBlendFunciARB) + +#define GLEW_ARB_draw_buffers_blend GLEW_GET_VAR(__GLEW_ARB_draw_buffers_blend) + +#endif /* GL_ARB_draw_buffers_blend */ + +/* -------------------- GL_ARB_draw_elements_base_vertex ------------------- */ + +#ifndef GL_ARB_draw_elements_base_vertex +#define GL_ARB_draw_elements_base_vertex 1 + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, void *indices, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, void *indices, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei* count, GLenum type, void**indices, GLsizei primcount, GLint *basevertex); + +#define glDrawElementsBaseVertex GLEW_GET_FUN(__glewDrawElementsBaseVertex) +#define glDrawElementsInstancedBaseVertex GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertex) +#define glDrawRangeElementsBaseVertex GLEW_GET_FUN(__glewDrawRangeElementsBaseVertex) +#define glMultiDrawElementsBaseVertex GLEW_GET_FUN(__glewMultiDrawElementsBaseVertex) + +#define GLEW_ARB_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_ARB_draw_elements_base_vertex) + +#endif /* GL_ARB_draw_elements_base_vertex */ + +/* -------------------------- GL_ARB_draw_indirect ------------------------- */ + +#ifndef GL_ARB_draw_indirect +#define GL_ARB_draw_indirect 1 + +#define GL_DRAW_INDIRECT_BUFFER 0x8F3F +#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); + +#define glDrawArraysIndirect GLEW_GET_FUN(__glewDrawArraysIndirect) +#define glDrawElementsIndirect GLEW_GET_FUN(__glewDrawElementsIndirect) + +#define GLEW_ARB_draw_indirect GLEW_GET_VAR(__GLEW_ARB_draw_indirect) + +#endif /* GL_ARB_draw_indirect */ + +/* ------------------------- GL_ARB_draw_instanced ------------------------- */ + +#ifndef GL_ARB_draw_instanced +#define GL_ARB_draw_instanced 1 + +#define GLEW_ARB_draw_instanced GLEW_GET_VAR(__GLEW_ARB_draw_instanced) + +#endif /* GL_ARB_draw_instanced */ + +/* ------------------------ GL_ARB_enhanced_layouts ------------------------ */ + +#ifndef GL_ARB_enhanced_layouts +#define GL_ARB_enhanced_layouts 1 + +#define GL_LOCATION_COMPONENT 0x934A +#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B +#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C + +#define GLEW_ARB_enhanced_layouts GLEW_GET_VAR(__GLEW_ARB_enhanced_layouts) + +#endif /* GL_ARB_enhanced_layouts */ + +/* -------------------- GL_ARB_explicit_attrib_location -------------------- */ + +#ifndef GL_ARB_explicit_attrib_location +#define GL_ARB_explicit_attrib_location 1 + +#define GLEW_ARB_explicit_attrib_location GLEW_GET_VAR(__GLEW_ARB_explicit_attrib_location) + +#endif /* GL_ARB_explicit_attrib_location */ + +/* -------------------- GL_ARB_explicit_uniform_location ------------------- */ + +#ifndef GL_ARB_explicit_uniform_location +#define GL_ARB_explicit_uniform_location 1 + +#define GL_MAX_UNIFORM_LOCATIONS 0x826E + +#define GLEW_ARB_explicit_uniform_location GLEW_GET_VAR(__GLEW_ARB_explicit_uniform_location) + +#endif /* GL_ARB_explicit_uniform_location */ + +/* ------------------- GL_ARB_fragment_coord_conventions ------------------- */ + +#ifndef GL_ARB_fragment_coord_conventions +#define GL_ARB_fragment_coord_conventions 1 + +#define GLEW_ARB_fragment_coord_conventions GLEW_GET_VAR(__GLEW_ARB_fragment_coord_conventions) + +#endif /* GL_ARB_fragment_coord_conventions */ + +/* --------------------- GL_ARB_fragment_layer_viewport -------------------- */ + +#ifndef GL_ARB_fragment_layer_viewport +#define GL_ARB_fragment_layer_viewport 1 + +#define GLEW_ARB_fragment_layer_viewport GLEW_GET_VAR(__GLEW_ARB_fragment_layer_viewport) + +#endif /* GL_ARB_fragment_layer_viewport */ + +/* ------------------------ GL_ARB_fragment_program ------------------------ */ + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 + +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 + +#define GLEW_ARB_fragment_program GLEW_GET_VAR(__GLEW_ARB_fragment_program) + +#endif /* GL_ARB_fragment_program */ + +/* --------------------- GL_ARB_fragment_program_shadow -------------------- */ + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 + +#define GLEW_ARB_fragment_program_shadow GLEW_GET_VAR(__GLEW_ARB_fragment_program_shadow) + +#endif /* GL_ARB_fragment_program_shadow */ + +/* ------------------------- GL_ARB_fragment_shader ------------------------ */ + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 + +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B + +#define GLEW_ARB_fragment_shader GLEW_GET_VAR(__GLEW_ARB_fragment_shader) + +#endif /* GL_ARB_fragment_shader */ + +/* -------------------- GL_ARB_fragment_shader_interlock ------------------- */ + +#ifndef GL_ARB_fragment_shader_interlock +#define GL_ARB_fragment_shader_interlock 1 + +#define GLEW_ARB_fragment_shader_interlock GLEW_GET_VAR(__GLEW_ARB_fragment_shader_interlock) + +#endif /* GL_ARB_fragment_shader_interlock */ + +/* ------------------- GL_ARB_framebuffer_no_attachments ------------------- */ + +#ifndef GL_ARB_framebuffer_no_attachments +#define GL_ARB_framebuffer_no_attachments 1 + +#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 +#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 +#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 +#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 +#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 +#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 +#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 +#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); + +#define glFramebufferParameteri GLEW_GET_FUN(__glewFramebufferParameteri) +#define glGetFramebufferParameteriv GLEW_GET_FUN(__glewGetFramebufferParameteriv) +#define glGetNamedFramebufferParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferParameterivEXT) +#define glNamedFramebufferParameteriEXT GLEW_GET_FUN(__glewNamedFramebufferParameteriEXT) + +#define GLEW_ARB_framebuffer_no_attachments GLEW_GET_VAR(__GLEW_ARB_framebuffer_no_attachments) + +#endif /* GL_ARB_framebuffer_no_attachments */ + +/* ----------------------- GL_ARB_framebuffer_object ----------------------- */ + +#ifndef GL_ARB_framebuffer_object +#define GL_ARB_framebuffer_object 1 + +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 +#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 +#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 +#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 +#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_INDEX 0x8222 +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_DEPTH_STENCIL 0x84F9 +#define GL_UNSIGNED_INT_24_8 0x84FA +#define GL_DEPTH24_STENCIL8 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE 0x88F1 +#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_SRGB 0x8C40 +#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_DRAW_FRAMEBUFFER 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA +#define GL_RENDERBUFFER_SAMPLES 0x8CAB +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT3 0x8CE3 +#define GL_COLOR_ATTACHMENT4 0x8CE4 +#define GL_COLOR_ATTACHMENT5 0x8CE5 +#define GL_COLOR_ATTACHMENT6 0x8CE6 +#define GL_COLOR_ATTACHMENT7 0x8CE7 +#define GL_COLOR_ATTACHMENT8 0x8CE8 +#define GL_COLOR_ATTACHMENT9 0x8CE9 +#define GL_COLOR_ATTACHMENT10 0x8CEA +#define GL_COLOR_ATTACHMENT11 0x8CEB +#define GL_COLOR_ATTACHMENT12 0x8CEC +#define GL_COLOR_ATTACHMENT13 0x8CED +#define GL_COLOR_ATTACHMENT14 0x8CEE +#define GL_COLOR_ATTACHMENT15 0x8CEF +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_STENCIL_INDEX1 0x8D46 +#define GL_STENCIL_INDEX4 0x8D47 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_STENCIL_INDEX16 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#define GL_MAX_SAMPLES 0x8D57 + +typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); +typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer); +typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); +typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glBindFramebuffer GLEW_GET_FUN(__glewBindFramebuffer) +#define glBindRenderbuffer GLEW_GET_FUN(__glewBindRenderbuffer) +#define glBlitFramebuffer GLEW_GET_FUN(__glewBlitFramebuffer) +#define glCheckFramebufferStatus GLEW_GET_FUN(__glewCheckFramebufferStatus) +#define glDeleteFramebuffers GLEW_GET_FUN(__glewDeleteFramebuffers) +#define glDeleteRenderbuffers GLEW_GET_FUN(__glewDeleteRenderbuffers) +#define glFramebufferRenderbuffer GLEW_GET_FUN(__glewFramebufferRenderbuffer) +#define glFramebufferTexture1D GLEW_GET_FUN(__glewFramebufferTexture1D) +#define glFramebufferTexture2D GLEW_GET_FUN(__glewFramebufferTexture2D) +#define glFramebufferTexture3D GLEW_GET_FUN(__glewFramebufferTexture3D) +#define glFramebufferTextureLayer GLEW_GET_FUN(__glewFramebufferTextureLayer) +#define glGenFramebuffers GLEW_GET_FUN(__glewGenFramebuffers) +#define glGenRenderbuffers GLEW_GET_FUN(__glewGenRenderbuffers) +#define glGenerateMipmap GLEW_GET_FUN(__glewGenerateMipmap) +#define glGetFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetFramebufferAttachmentParameteriv) +#define glGetRenderbufferParameteriv GLEW_GET_FUN(__glewGetRenderbufferParameteriv) +#define glIsFramebuffer GLEW_GET_FUN(__glewIsFramebuffer) +#define glIsRenderbuffer GLEW_GET_FUN(__glewIsRenderbuffer) +#define glRenderbufferStorage GLEW_GET_FUN(__glewRenderbufferStorage) +#define glRenderbufferStorageMultisample GLEW_GET_FUN(__glewRenderbufferStorageMultisample) + +#define GLEW_ARB_framebuffer_object GLEW_GET_VAR(__GLEW_ARB_framebuffer_object) + +#endif /* GL_ARB_framebuffer_object */ + +/* ------------------------ GL_ARB_framebuffer_sRGB ------------------------ */ + +#ifndef GL_ARB_framebuffer_sRGB +#define GL_ARB_framebuffer_sRGB 1 + +#define GL_FRAMEBUFFER_SRGB 0x8DB9 + +#define GLEW_ARB_framebuffer_sRGB GLEW_GET_VAR(__GLEW_ARB_framebuffer_sRGB) + +#endif /* GL_ARB_framebuffer_sRGB */ + +/* ------------------------ GL_ARB_geometry_shader4 ------------------------ */ + +#ifndef GL_ARB_geometry_shader4 +#define GL_ARB_geometry_shader4 1 + +#define GL_LINES_ADJACENCY_ARB 0xA +#define GL_LINE_STRIP_ADJACENCY_ARB 0xB +#define GL_TRIANGLES_ADJACENCY_ARB 0xC +#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0xD +#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 +#define GL_GEOMETRY_SHADER_ARB 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); + +#define glFramebufferTextureARB GLEW_GET_FUN(__glewFramebufferTextureARB) +#define glFramebufferTextureFaceARB GLEW_GET_FUN(__glewFramebufferTextureFaceARB) +#define glFramebufferTextureLayerARB GLEW_GET_FUN(__glewFramebufferTextureLayerARB) +#define glProgramParameteriARB GLEW_GET_FUN(__glewProgramParameteriARB) + +#define GLEW_ARB_geometry_shader4 GLEW_GET_VAR(__GLEW_ARB_geometry_shader4) + +#endif /* GL_ARB_geometry_shader4 */ + +/* ----------------------- GL_ARB_get_program_binary ----------------------- */ + +#ifndef GL_ARB_get_program_binary +#define GL_ARB_get_program_binary 1 + +#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 +#define GL_PROGRAM_BINARY_LENGTH 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_PROGRAM_BINARY_FORMATS 0x87FF + +typedef void (GLAPIENTRY * PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum *binaryFormat, void*binary); +typedef void (GLAPIENTRY * PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); + +#define glGetProgramBinary GLEW_GET_FUN(__glewGetProgramBinary) +#define glProgramBinary GLEW_GET_FUN(__glewProgramBinary) +#define glProgramParameteri GLEW_GET_FUN(__glewProgramParameteri) + +#define GLEW_ARB_get_program_binary GLEW_GET_VAR(__GLEW_ARB_get_program_binary) + +#endif /* GL_ARB_get_program_binary */ + +/* ---------------------- GL_ARB_get_texture_sub_image --------------------- */ + +#ifndef GL_ARB_get_texture_sub_image +#define GL_ARB_get_texture_sub_image 1 + +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); + +#define glGetCompressedTextureSubImage GLEW_GET_FUN(__glewGetCompressedTextureSubImage) +#define glGetTextureSubImage GLEW_GET_FUN(__glewGetTextureSubImage) + +#define GLEW_ARB_get_texture_sub_image GLEW_GET_VAR(__GLEW_ARB_get_texture_sub_image) + +#endif /* GL_ARB_get_texture_sub_image */ + +/* ---------------------------- GL_ARB_gl_spirv ---------------------------- */ + +#ifndef GL_ARB_gl_spirv +#define GL_ARB_gl_spirv 1 + +#define GL_SHADER_BINARY_FORMAT_SPIR_V_ARB 0x9551 +#define GL_SPIR_V_BINARY_ARB 0x9552 + +typedef void (GLAPIENTRY * PFNGLSPECIALIZESHADERARBPROC) (GLuint shader, const GLchar* pEntryPoint, GLuint numSpecializationConstants, const GLuint* pConstantIndex, const GLuint* pConstantValue); + +#define glSpecializeShaderARB GLEW_GET_FUN(__glewSpecializeShaderARB) + +#define GLEW_ARB_gl_spirv GLEW_GET_VAR(__GLEW_ARB_gl_spirv) + +#endif /* GL_ARB_gl_spirv */ + +/* --------------------------- GL_ARB_gpu_shader5 -------------------------- */ + +#ifndef GL_ARB_gpu_shader5 +#define GL_ARB_gpu_shader5 1 + +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D +#define GL_MAX_VERTEX_STREAMS 0x8E71 + +#define GLEW_ARB_gpu_shader5 GLEW_GET_VAR(__GLEW_ARB_gpu_shader5) + +#endif /* GL_ARB_gpu_shader5 */ + +/* ------------------------- GL_ARB_gpu_shader_fp64 ------------------------ */ + +#ifndef GL_ARB_gpu_shader_fp64 +#define GL_ARB_gpu_shader_fp64 1 + +#define GL_DOUBLE_MAT2 0x8F46 +#define GL_DOUBLE_MAT3 0x8F47 +#define GL_DOUBLE_MAT4 0x8F48 +#define GL_DOUBLE_MAT2x3 0x8F49 +#define GL_DOUBLE_MAT2x4 0x8F4A +#define GL_DOUBLE_MAT3x2 0x8F4B +#define GL_DOUBLE_MAT3x4 0x8F4C +#define GL_DOUBLE_MAT4x2 0x8F4D +#define GL_DOUBLE_MAT4x3 0x8F4E +#define GL_DOUBLE_VEC2 0x8FFC +#define GL_DOUBLE_VEC3 0x8FFD +#define GL_DOUBLE_VEC4 0x8FFE + +typedef void (GLAPIENTRY * PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); + +#define glGetUniformdv GLEW_GET_FUN(__glewGetUniformdv) +#define glUniform1d GLEW_GET_FUN(__glewUniform1d) +#define glUniform1dv GLEW_GET_FUN(__glewUniform1dv) +#define glUniform2d GLEW_GET_FUN(__glewUniform2d) +#define glUniform2dv GLEW_GET_FUN(__glewUniform2dv) +#define glUniform3d GLEW_GET_FUN(__glewUniform3d) +#define glUniform3dv GLEW_GET_FUN(__glewUniform3dv) +#define glUniform4d GLEW_GET_FUN(__glewUniform4d) +#define glUniform4dv GLEW_GET_FUN(__glewUniform4dv) +#define glUniformMatrix2dv GLEW_GET_FUN(__glewUniformMatrix2dv) +#define glUniformMatrix2x3dv GLEW_GET_FUN(__glewUniformMatrix2x3dv) +#define glUniformMatrix2x4dv GLEW_GET_FUN(__glewUniformMatrix2x4dv) +#define glUniformMatrix3dv GLEW_GET_FUN(__glewUniformMatrix3dv) +#define glUniformMatrix3x2dv GLEW_GET_FUN(__glewUniformMatrix3x2dv) +#define glUniformMatrix3x4dv GLEW_GET_FUN(__glewUniformMatrix3x4dv) +#define glUniformMatrix4dv GLEW_GET_FUN(__glewUniformMatrix4dv) +#define glUniformMatrix4x2dv GLEW_GET_FUN(__glewUniformMatrix4x2dv) +#define glUniformMatrix4x3dv GLEW_GET_FUN(__glewUniformMatrix4x3dv) + +#define GLEW_ARB_gpu_shader_fp64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_fp64) + +#endif /* GL_ARB_gpu_shader_fp64 */ + +/* ------------------------ GL_ARB_gpu_shader_int64 ------------------------ */ + +#ifndef GL_ARB_gpu_shader_int64 +#define GL_ARB_gpu_shader_int64 1 + +#define GL_INT64_ARB 0x140E +#define GL_UNSIGNED_INT64_ARB 0x140F +#define GL_INT64_VEC2_ARB 0x8FE9 +#define GL_INT64_VEC3_ARB 0x8FEA +#define GL_INT64_VEC4_ARB 0x8FEB +#define GL_UNSIGNED_INT64_VEC2_ARB 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_ARB 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_ARB 0x8FF7 + +typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VARBPROC) (GLuint program, GLint location, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64ARBPROC) (GLuint program, GLint location, GLint64 x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64ARBPROC) (GLuint program, GLint location, GLuint64 x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1I64ARBPROC) (GLint location, GLint64 x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64ARBPROC) (GLint location, GLuint64 x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2I64ARBPROC) (GLint location, GLint64 x, GLint64 y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); + +#define glGetUniformi64vARB GLEW_GET_FUN(__glewGetUniformi64vARB) +#define glGetUniformui64vARB GLEW_GET_FUN(__glewGetUniformui64vARB) +#define glGetnUniformi64vARB GLEW_GET_FUN(__glewGetnUniformi64vARB) +#define glGetnUniformui64vARB GLEW_GET_FUN(__glewGetnUniformui64vARB) +#define glProgramUniform1i64ARB GLEW_GET_FUN(__glewProgramUniform1i64ARB) +#define glProgramUniform1i64vARB GLEW_GET_FUN(__glewProgramUniform1i64vARB) +#define glProgramUniform1ui64ARB GLEW_GET_FUN(__glewProgramUniform1ui64ARB) +#define glProgramUniform1ui64vARB GLEW_GET_FUN(__glewProgramUniform1ui64vARB) +#define glProgramUniform2i64ARB GLEW_GET_FUN(__glewProgramUniform2i64ARB) +#define glProgramUniform2i64vARB GLEW_GET_FUN(__glewProgramUniform2i64vARB) +#define glProgramUniform2ui64ARB GLEW_GET_FUN(__glewProgramUniform2ui64ARB) +#define glProgramUniform2ui64vARB GLEW_GET_FUN(__glewProgramUniform2ui64vARB) +#define glProgramUniform3i64ARB GLEW_GET_FUN(__glewProgramUniform3i64ARB) +#define glProgramUniform3i64vARB GLEW_GET_FUN(__glewProgramUniform3i64vARB) +#define glProgramUniform3ui64ARB GLEW_GET_FUN(__glewProgramUniform3ui64ARB) +#define glProgramUniform3ui64vARB GLEW_GET_FUN(__glewProgramUniform3ui64vARB) +#define glProgramUniform4i64ARB GLEW_GET_FUN(__glewProgramUniform4i64ARB) +#define glProgramUniform4i64vARB GLEW_GET_FUN(__glewProgramUniform4i64vARB) +#define glProgramUniform4ui64ARB GLEW_GET_FUN(__glewProgramUniform4ui64ARB) +#define glProgramUniform4ui64vARB GLEW_GET_FUN(__glewProgramUniform4ui64vARB) +#define glUniform1i64ARB GLEW_GET_FUN(__glewUniform1i64ARB) +#define glUniform1i64vARB GLEW_GET_FUN(__glewUniform1i64vARB) +#define glUniform1ui64ARB GLEW_GET_FUN(__glewUniform1ui64ARB) +#define glUniform1ui64vARB GLEW_GET_FUN(__glewUniform1ui64vARB) +#define glUniform2i64ARB GLEW_GET_FUN(__glewUniform2i64ARB) +#define glUniform2i64vARB GLEW_GET_FUN(__glewUniform2i64vARB) +#define glUniform2ui64ARB GLEW_GET_FUN(__glewUniform2ui64ARB) +#define glUniform2ui64vARB GLEW_GET_FUN(__glewUniform2ui64vARB) +#define glUniform3i64ARB GLEW_GET_FUN(__glewUniform3i64ARB) +#define glUniform3i64vARB GLEW_GET_FUN(__glewUniform3i64vARB) +#define glUniform3ui64ARB GLEW_GET_FUN(__glewUniform3ui64ARB) +#define glUniform3ui64vARB GLEW_GET_FUN(__glewUniform3ui64vARB) +#define glUniform4i64ARB GLEW_GET_FUN(__glewUniform4i64ARB) +#define glUniform4i64vARB GLEW_GET_FUN(__glewUniform4i64vARB) +#define glUniform4ui64ARB GLEW_GET_FUN(__glewUniform4ui64ARB) +#define glUniform4ui64vARB GLEW_GET_FUN(__glewUniform4ui64vARB) + +#define GLEW_ARB_gpu_shader_int64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_int64) + +#endif /* GL_ARB_gpu_shader_int64 */ + +/* ------------------------ GL_ARB_half_float_pixel ------------------------ */ + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 + +#define GL_HALF_FLOAT_ARB 0x140B + +#define GLEW_ARB_half_float_pixel GLEW_GET_VAR(__GLEW_ARB_half_float_pixel) + +#endif /* GL_ARB_half_float_pixel */ + +/* ------------------------ GL_ARB_half_float_vertex ----------------------- */ + +#ifndef GL_ARB_half_float_vertex +#define GL_ARB_half_float_vertex 1 + +#define GL_HALF_FLOAT 0x140B + +#define GLEW_ARB_half_float_vertex GLEW_GET_VAR(__GLEW_ARB_half_float_vertex) + +#endif /* GL_ARB_half_float_vertex */ + +/* ----------------------------- GL_ARB_imaging ---------------------------- */ + +#ifndef GL_ARB_imaging +#define GL_ARB_imaging 1 + +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_FUNC_ADD 0x8006 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BLEND_EQUATION 0x8009 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_IGNORE_BORDER 0x8150 +#define GL_CONSTANT_BORDER 0x8151 +#define GL_WRAP_BORDER 0x8152 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 + +typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, void *values); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +typedef void (GLAPIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLRESETMINMAXPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); + +#define glColorSubTable GLEW_GET_FUN(__glewColorSubTable) +#define glColorTable GLEW_GET_FUN(__glewColorTable) +#define glColorTableParameterfv GLEW_GET_FUN(__glewColorTableParameterfv) +#define glColorTableParameteriv GLEW_GET_FUN(__glewColorTableParameteriv) +#define glConvolutionFilter1D GLEW_GET_FUN(__glewConvolutionFilter1D) +#define glConvolutionFilter2D GLEW_GET_FUN(__glewConvolutionFilter2D) +#define glConvolutionParameterf GLEW_GET_FUN(__glewConvolutionParameterf) +#define glConvolutionParameterfv GLEW_GET_FUN(__glewConvolutionParameterfv) +#define glConvolutionParameteri GLEW_GET_FUN(__glewConvolutionParameteri) +#define glConvolutionParameteriv GLEW_GET_FUN(__glewConvolutionParameteriv) +#define glCopyColorSubTable GLEW_GET_FUN(__glewCopyColorSubTable) +#define glCopyColorTable GLEW_GET_FUN(__glewCopyColorTable) +#define glCopyConvolutionFilter1D GLEW_GET_FUN(__glewCopyConvolutionFilter1D) +#define glCopyConvolutionFilter2D GLEW_GET_FUN(__glewCopyConvolutionFilter2D) +#define glGetColorTable GLEW_GET_FUN(__glewGetColorTable) +#define glGetColorTableParameterfv GLEW_GET_FUN(__glewGetColorTableParameterfv) +#define glGetColorTableParameteriv GLEW_GET_FUN(__glewGetColorTableParameteriv) +#define glGetConvolutionFilter GLEW_GET_FUN(__glewGetConvolutionFilter) +#define glGetConvolutionParameterfv GLEW_GET_FUN(__glewGetConvolutionParameterfv) +#define glGetConvolutionParameteriv GLEW_GET_FUN(__glewGetConvolutionParameteriv) +#define glGetHistogram GLEW_GET_FUN(__glewGetHistogram) +#define glGetHistogramParameterfv GLEW_GET_FUN(__glewGetHistogramParameterfv) +#define glGetHistogramParameteriv GLEW_GET_FUN(__glewGetHistogramParameteriv) +#define glGetMinmax GLEW_GET_FUN(__glewGetMinmax) +#define glGetMinmaxParameterfv GLEW_GET_FUN(__glewGetMinmaxParameterfv) +#define glGetMinmaxParameteriv GLEW_GET_FUN(__glewGetMinmaxParameteriv) +#define glGetSeparableFilter GLEW_GET_FUN(__glewGetSeparableFilter) +#define glHistogram GLEW_GET_FUN(__glewHistogram) +#define glMinmax GLEW_GET_FUN(__glewMinmax) +#define glResetHistogram GLEW_GET_FUN(__glewResetHistogram) +#define glResetMinmax GLEW_GET_FUN(__glewResetMinmax) +#define glSeparableFilter2D GLEW_GET_FUN(__glewSeparableFilter2D) + +#define GLEW_ARB_imaging GLEW_GET_VAR(__GLEW_ARB_imaging) + +#endif /* GL_ARB_imaging */ + +/* ----------------------- GL_ARB_indirect_parameters ---------------------- */ + +#ifndef GL_ARB_indirect_parameters +#define GL_ARB_indirect_parameters 1 + +#define GL_PARAMETER_BUFFER_ARB 0x80EE +#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); + +#define glMultiDrawArraysIndirectCountARB GLEW_GET_FUN(__glewMultiDrawArraysIndirectCountARB) +#define glMultiDrawElementsIndirectCountARB GLEW_GET_FUN(__glewMultiDrawElementsIndirectCountARB) + +#define GLEW_ARB_indirect_parameters GLEW_GET_VAR(__GLEW_ARB_indirect_parameters) + +#endif /* GL_ARB_indirect_parameters */ + +/* ------------------------ GL_ARB_instanced_arrays ------------------------ */ + +#ifndef GL_ARB_instanced_arrays +#define GL_ARB_instanced_arrays 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); + +#define glDrawArraysInstancedARB GLEW_GET_FUN(__glewDrawArraysInstancedARB) +#define glDrawElementsInstancedARB GLEW_GET_FUN(__glewDrawElementsInstancedARB) +#define glVertexAttribDivisorARB GLEW_GET_FUN(__glewVertexAttribDivisorARB) + +#define GLEW_ARB_instanced_arrays GLEW_GET_VAR(__GLEW_ARB_instanced_arrays) + +#endif /* GL_ARB_instanced_arrays */ + +/* ---------------------- GL_ARB_internalformat_query ---------------------- */ + +#ifndef GL_ARB_internalformat_query +#define GL_ARB_internalformat_query 1 + +#define GL_NUM_SAMPLE_COUNTS 0x9380 + +typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params); + +#define glGetInternalformativ GLEW_GET_FUN(__glewGetInternalformativ) + +#define GLEW_ARB_internalformat_query GLEW_GET_VAR(__GLEW_ARB_internalformat_query) + +#endif /* GL_ARB_internalformat_query */ + +/* ---------------------- GL_ARB_internalformat_query2 --------------------- */ + +#ifndef GL_ARB_internalformat_query2 +#define GL_ARB_internalformat_query2 1 + +#define GL_INTERNALFORMAT_SUPPORTED 0x826F +#define GL_INTERNALFORMAT_PREFERRED 0x8270 +#define GL_INTERNALFORMAT_RED_SIZE 0x8271 +#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 +#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 +#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 +#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 +#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 +#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 +#define GL_INTERNALFORMAT_RED_TYPE 0x8278 +#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 +#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A +#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B +#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C +#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D +#define GL_MAX_WIDTH 0x827E +#define GL_MAX_HEIGHT 0x827F +#define GL_MAX_DEPTH 0x8280 +#define GL_MAX_LAYERS 0x8281 +#define GL_MAX_COMBINED_DIMENSIONS 0x8282 +#define GL_COLOR_COMPONENTS 0x8283 +#define GL_DEPTH_COMPONENTS 0x8284 +#define GL_STENCIL_COMPONENTS 0x8285 +#define GL_COLOR_RENDERABLE 0x8286 +#define GL_DEPTH_RENDERABLE 0x8287 +#define GL_STENCIL_RENDERABLE 0x8288 +#define GL_FRAMEBUFFER_RENDERABLE 0x8289 +#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A +#define GL_FRAMEBUFFER_BLEND 0x828B +#define GL_READ_PIXELS 0x828C +#define GL_READ_PIXELS_FORMAT 0x828D +#define GL_READ_PIXELS_TYPE 0x828E +#define GL_TEXTURE_IMAGE_FORMAT 0x828F +#define GL_TEXTURE_IMAGE_TYPE 0x8290 +#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 +#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 +#define GL_MIPMAP 0x8293 +#define GL_MANUAL_GENERATE_MIPMAP 0x8294 +#define GL_AUTO_GENERATE_MIPMAP 0x8295 +#define GL_COLOR_ENCODING 0x8296 +#define GL_SRGB_READ 0x8297 +#define GL_SRGB_WRITE 0x8298 +#define GL_SRGB_DECODE_ARB 0x8299 +#define GL_FILTER 0x829A +#define GL_VERTEX_TEXTURE 0x829B +#define GL_TESS_CONTROL_TEXTURE 0x829C +#define GL_TESS_EVALUATION_TEXTURE 0x829D +#define GL_GEOMETRY_TEXTURE 0x829E +#define GL_FRAGMENT_TEXTURE 0x829F +#define GL_COMPUTE_TEXTURE 0x82A0 +#define GL_TEXTURE_SHADOW 0x82A1 +#define GL_TEXTURE_GATHER 0x82A2 +#define GL_TEXTURE_GATHER_SHADOW 0x82A3 +#define GL_SHADER_IMAGE_LOAD 0x82A4 +#define GL_SHADER_IMAGE_STORE 0x82A5 +#define GL_SHADER_IMAGE_ATOMIC 0x82A6 +#define GL_IMAGE_TEXEL_SIZE 0x82A7 +#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 +#define GL_IMAGE_PIXEL_FORMAT 0x82A9 +#define GL_IMAGE_PIXEL_TYPE 0x82AA +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF +#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 +#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 +#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 +#define GL_CLEAR_BUFFER 0x82B4 +#define GL_TEXTURE_VIEW 0x82B5 +#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 +#define GL_FULL_SUPPORT 0x82B7 +#define GL_CAVEAT_SUPPORT 0x82B8 +#define GL_IMAGE_CLASS_4_X_32 0x82B9 +#define GL_IMAGE_CLASS_2_X_32 0x82BA +#define GL_IMAGE_CLASS_1_X_32 0x82BB +#define GL_IMAGE_CLASS_4_X_16 0x82BC +#define GL_IMAGE_CLASS_2_X_16 0x82BD +#define GL_IMAGE_CLASS_1_X_16 0x82BE +#define GL_IMAGE_CLASS_4_X_8 0x82BF +#define GL_IMAGE_CLASS_2_X_8 0x82C0 +#define GL_IMAGE_CLASS_1_X_8 0x82C1 +#define GL_IMAGE_CLASS_11_11_10 0x82C2 +#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 +#define GL_VIEW_CLASS_128_BITS 0x82C4 +#define GL_VIEW_CLASS_96_BITS 0x82C5 +#define GL_VIEW_CLASS_64_BITS 0x82C6 +#define GL_VIEW_CLASS_48_BITS 0x82C7 +#define GL_VIEW_CLASS_32_BITS 0x82C8 +#define GL_VIEW_CLASS_24_BITS 0x82C9 +#define GL_VIEW_CLASS_16_BITS 0x82CA +#define GL_VIEW_CLASS_8_BITS 0x82CB +#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC +#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD +#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE +#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF +#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 +#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 +#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 +#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 + +typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64* params); + +#define glGetInternalformati64v GLEW_GET_FUN(__glewGetInternalformati64v) + +#define GLEW_ARB_internalformat_query2 GLEW_GET_VAR(__GLEW_ARB_internalformat_query2) + +#endif /* GL_ARB_internalformat_query2 */ + +/* ----------------------- GL_ARB_invalidate_subdata ----------------------- */ + +#ifndef GL_ARB_invalidate_subdata +#define GL_ARB_invalidate_subdata 1 + +typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAPIENTRY * PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments); +typedef void (GLAPIENTRY * PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); + +#define glInvalidateBufferData GLEW_GET_FUN(__glewInvalidateBufferData) +#define glInvalidateBufferSubData GLEW_GET_FUN(__glewInvalidateBufferSubData) +#define glInvalidateFramebuffer GLEW_GET_FUN(__glewInvalidateFramebuffer) +#define glInvalidateSubFramebuffer GLEW_GET_FUN(__glewInvalidateSubFramebuffer) +#define glInvalidateTexImage GLEW_GET_FUN(__glewInvalidateTexImage) +#define glInvalidateTexSubImage GLEW_GET_FUN(__glewInvalidateTexSubImage) + +#define GLEW_ARB_invalidate_subdata GLEW_GET_VAR(__GLEW_ARB_invalidate_subdata) + +#endif /* GL_ARB_invalidate_subdata */ + +/* ---------------------- GL_ARB_map_buffer_alignment ---------------------- */ + +#ifndef GL_ARB_map_buffer_alignment +#define GL_ARB_map_buffer_alignment 1 + +#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC + +#define GLEW_ARB_map_buffer_alignment GLEW_GET_VAR(__GLEW_ARB_map_buffer_alignment) + +#endif /* GL_ARB_map_buffer_alignment */ + +/* ------------------------ GL_ARB_map_buffer_range ------------------------ */ + +#ifndef GL_ARB_map_buffer_range +#define GL_ARB_map_buffer_range 1 + +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 + +typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef void * (GLAPIENTRY * PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); + +#define glFlushMappedBufferRange GLEW_GET_FUN(__glewFlushMappedBufferRange) +#define glMapBufferRange GLEW_GET_FUN(__glewMapBufferRange) + +#define GLEW_ARB_map_buffer_range GLEW_GET_VAR(__GLEW_ARB_map_buffer_range) + +#endif /* GL_ARB_map_buffer_range */ + +/* ------------------------- GL_ARB_matrix_palette ------------------------- */ + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 + +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 + +typedef void (GLAPIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, GLubyte *indices); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, GLuint *indices); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *indices); + +#define glCurrentPaletteMatrixARB GLEW_GET_FUN(__glewCurrentPaletteMatrixARB) +#define glMatrixIndexPointerARB GLEW_GET_FUN(__glewMatrixIndexPointerARB) +#define glMatrixIndexubvARB GLEW_GET_FUN(__glewMatrixIndexubvARB) +#define glMatrixIndexuivARB GLEW_GET_FUN(__glewMatrixIndexuivARB) +#define glMatrixIndexusvARB GLEW_GET_FUN(__glewMatrixIndexusvARB) + +#define GLEW_ARB_matrix_palette GLEW_GET_VAR(__GLEW_ARB_matrix_palette) + +#endif /* GL_ARB_matrix_palette */ + +/* --------------------------- GL_ARB_multi_bind --------------------------- */ + +#ifndef GL_ARB_multi_bind +#define GL_ARB_multi_bind 1 + +typedef void (GLAPIENTRY * PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizeiptr *sizes); +typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); +typedef void (GLAPIENTRY * PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint* samplers); +typedef void (GLAPIENTRY * PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); +typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); + +#define glBindBuffersBase GLEW_GET_FUN(__glewBindBuffersBase) +#define glBindBuffersRange GLEW_GET_FUN(__glewBindBuffersRange) +#define glBindImageTextures GLEW_GET_FUN(__glewBindImageTextures) +#define glBindSamplers GLEW_GET_FUN(__glewBindSamplers) +#define glBindTextures GLEW_GET_FUN(__glewBindTextures) +#define glBindVertexBuffers GLEW_GET_FUN(__glewBindVertexBuffers) + +#define GLEW_ARB_multi_bind GLEW_GET_VAR(__GLEW_ARB_multi_bind) + +#endif /* GL_ARB_multi_bind */ + +/* ----------------------- GL_ARB_multi_draw_indirect ---------------------- */ + +#ifndef GL_ARB_multi_draw_indirect +#define GL_ARB_multi_draw_indirect 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); + +#define glMultiDrawArraysIndirect GLEW_GET_FUN(__glewMultiDrawArraysIndirect) +#define glMultiDrawElementsIndirect GLEW_GET_FUN(__glewMultiDrawElementsIndirect) + +#define GLEW_ARB_multi_draw_indirect GLEW_GET_VAR(__GLEW_ARB_multi_draw_indirect) + +#endif /* GL_ARB_multi_draw_indirect */ + +/* --------------------------- GL_ARB_multisample -------------------------- */ + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 + +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 + +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); + +#define glSampleCoverageARB GLEW_GET_FUN(__glewSampleCoverageARB) + +#define GLEW_ARB_multisample GLEW_GET_VAR(__GLEW_ARB_multisample) + +#endif /* GL_ARB_multisample */ + +/* -------------------------- GL_ARB_multitexture -------------------------- */ + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 + +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 + +typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); + +#define glActiveTextureARB GLEW_GET_FUN(__glewActiveTextureARB) +#define glClientActiveTextureARB GLEW_GET_FUN(__glewClientActiveTextureARB) +#define glMultiTexCoord1dARB GLEW_GET_FUN(__glewMultiTexCoord1dARB) +#define glMultiTexCoord1dvARB GLEW_GET_FUN(__glewMultiTexCoord1dvARB) +#define glMultiTexCoord1fARB GLEW_GET_FUN(__glewMultiTexCoord1fARB) +#define glMultiTexCoord1fvARB GLEW_GET_FUN(__glewMultiTexCoord1fvARB) +#define glMultiTexCoord1iARB GLEW_GET_FUN(__glewMultiTexCoord1iARB) +#define glMultiTexCoord1ivARB GLEW_GET_FUN(__glewMultiTexCoord1ivARB) +#define glMultiTexCoord1sARB GLEW_GET_FUN(__glewMultiTexCoord1sARB) +#define glMultiTexCoord1svARB GLEW_GET_FUN(__glewMultiTexCoord1svARB) +#define glMultiTexCoord2dARB GLEW_GET_FUN(__glewMultiTexCoord2dARB) +#define glMultiTexCoord2dvARB GLEW_GET_FUN(__glewMultiTexCoord2dvARB) +#define glMultiTexCoord2fARB GLEW_GET_FUN(__glewMultiTexCoord2fARB) +#define glMultiTexCoord2fvARB GLEW_GET_FUN(__glewMultiTexCoord2fvARB) +#define glMultiTexCoord2iARB GLEW_GET_FUN(__glewMultiTexCoord2iARB) +#define glMultiTexCoord2ivARB GLEW_GET_FUN(__glewMultiTexCoord2ivARB) +#define glMultiTexCoord2sARB GLEW_GET_FUN(__glewMultiTexCoord2sARB) +#define glMultiTexCoord2svARB GLEW_GET_FUN(__glewMultiTexCoord2svARB) +#define glMultiTexCoord3dARB GLEW_GET_FUN(__glewMultiTexCoord3dARB) +#define glMultiTexCoord3dvARB GLEW_GET_FUN(__glewMultiTexCoord3dvARB) +#define glMultiTexCoord3fARB GLEW_GET_FUN(__glewMultiTexCoord3fARB) +#define glMultiTexCoord3fvARB GLEW_GET_FUN(__glewMultiTexCoord3fvARB) +#define glMultiTexCoord3iARB GLEW_GET_FUN(__glewMultiTexCoord3iARB) +#define glMultiTexCoord3ivARB GLEW_GET_FUN(__glewMultiTexCoord3ivARB) +#define glMultiTexCoord3sARB GLEW_GET_FUN(__glewMultiTexCoord3sARB) +#define glMultiTexCoord3svARB GLEW_GET_FUN(__glewMultiTexCoord3svARB) +#define glMultiTexCoord4dARB GLEW_GET_FUN(__glewMultiTexCoord4dARB) +#define glMultiTexCoord4dvARB GLEW_GET_FUN(__glewMultiTexCoord4dvARB) +#define glMultiTexCoord4fARB GLEW_GET_FUN(__glewMultiTexCoord4fARB) +#define glMultiTexCoord4fvARB GLEW_GET_FUN(__glewMultiTexCoord4fvARB) +#define glMultiTexCoord4iARB GLEW_GET_FUN(__glewMultiTexCoord4iARB) +#define glMultiTexCoord4ivARB GLEW_GET_FUN(__glewMultiTexCoord4ivARB) +#define glMultiTexCoord4sARB GLEW_GET_FUN(__glewMultiTexCoord4sARB) +#define glMultiTexCoord4svARB GLEW_GET_FUN(__glewMultiTexCoord4svARB) + +#define GLEW_ARB_multitexture GLEW_GET_VAR(__GLEW_ARB_multitexture) + +#endif /* GL_ARB_multitexture */ + +/* ------------------------- GL_ARB_occlusion_query ------------------------ */ + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 + +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id); + +#define glBeginQueryARB GLEW_GET_FUN(__glewBeginQueryARB) +#define glDeleteQueriesARB GLEW_GET_FUN(__glewDeleteQueriesARB) +#define glEndQueryARB GLEW_GET_FUN(__glewEndQueryARB) +#define glGenQueriesARB GLEW_GET_FUN(__glewGenQueriesARB) +#define glGetQueryObjectivARB GLEW_GET_FUN(__glewGetQueryObjectivARB) +#define glGetQueryObjectuivARB GLEW_GET_FUN(__glewGetQueryObjectuivARB) +#define glGetQueryivARB GLEW_GET_FUN(__glewGetQueryivARB) +#define glIsQueryARB GLEW_GET_FUN(__glewIsQueryARB) + +#define GLEW_ARB_occlusion_query GLEW_GET_VAR(__GLEW_ARB_occlusion_query) + +#endif /* GL_ARB_occlusion_query */ + +/* ------------------------ GL_ARB_occlusion_query2 ------------------------ */ + +#ifndef GL_ARB_occlusion_query2 +#define GL_ARB_occlusion_query2 1 + +#define GL_ANY_SAMPLES_PASSED 0x8C2F + +#define GLEW_ARB_occlusion_query2 GLEW_GET_VAR(__GLEW_ARB_occlusion_query2) + +#endif /* GL_ARB_occlusion_query2 */ + +/* --------------------- GL_ARB_parallel_shader_compile -------------------- */ + +#ifndef GL_ARB_parallel_shader_compile +#define GL_ARB_parallel_shader_compile 1 + +#define GL_MAX_SHADER_COMPILER_THREADS_ARB 0x91B0 +#define GL_COMPLETION_STATUS_ARB 0x91B1 + +typedef void (GLAPIENTRY * PFNGLMAXSHADERCOMPILERTHREADSARBPROC) (GLuint count); + +#define glMaxShaderCompilerThreadsARB GLEW_GET_FUN(__glewMaxShaderCompilerThreadsARB) + +#define GLEW_ARB_parallel_shader_compile GLEW_GET_VAR(__GLEW_ARB_parallel_shader_compile) + +#endif /* GL_ARB_parallel_shader_compile */ + +/* -------------------- GL_ARB_pipeline_statistics_query ------------------- */ + +#ifndef GL_ARB_pipeline_statistics_query +#define GL_ARB_pipeline_statistics_query 1 + +#define GL_VERTICES_SUBMITTED_ARB 0x82EE +#define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF +#define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0 +#define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1 +#define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2 +#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3 +#define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4 +#define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5 +#define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6 +#define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7 +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F + +#define GLEW_ARB_pipeline_statistics_query GLEW_GET_VAR(__GLEW_ARB_pipeline_statistics_query) + +#endif /* GL_ARB_pipeline_statistics_query */ + +/* ----------------------- GL_ARB_pixel_buffer_object ---------------------- */ + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 + +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF + +#define GLEW_ARB_pixel_buffer_object GLEW_GET_VAR(__GLEW_ARB_pixel_buffer_object) + +#endif /* GL_ARB_pixel_buffer_object */ + +/* ------------------------ GL_ARB_point_parameters ------------------------ */ + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 + +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat* params); + +#define glPointParameterfARB GLEW_GET_FUN(__glewPointParameterfARB) +#define glPointParameterfvARB GLEW_GET_FUN(__glewPointParameterfvARB) + +#define GLEW_ARB_point_parameters GLEW_GET_VAR(__GLEW_ARB_point_parameters) + +#endif /* GL_ARB_point_parameters */ + +/* -------------------------- GL_ARB_point_sprite -------------------------- */ + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 + +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 + +#define GLEW_ARB_point_sprite GLEW_GET_VAR(__GLEW_ARB_point_sprite) + +#endif /* GL_ARB_point_sprite */ + +/* ---------------------- GL_ARB_polygon_offset_clamp ---------------------- */ + +#ifndef GL_ARB_polygon_offset_clamp +#define GL_ARB_polygon_offset_clamp 1 + +#define GL_POLYGON_OFFSET_CLAMP 0x8E1B + +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETCLAMPPROC) (GLfloat factor, GLfloat units, GLfloat clamp); + +#define glPolygonOffsetClamp GLEW_GET_FUN(__glewPolygonOffsetClamp) + +#define GLEW_ARB_polygon_offset_clamp GLEW_GET_VAR(__GLEW_ARB_polygon_offset_clamp) + +#endif /* GL_ARB_polygon_offset_clamp */ + +/* ----------------------- GL_ARB_post_depth_coverage ---------------------- */ + +#ifndef GL_ARB_post_depth_coverage +#define GL_ARB_post_depth_coverage 1 + +#define GLEW_ARB_post_depth_coverage GLEW_GET_VAR(__GLEW_ARB_post_depth_coverage) + +#endif /* GL_ARB_post_depth_coverage */ + +/* --------------------- GL_ARB_program_interface_query -------------------- */ + +#ifndef GL_ARB_program_interface_query +#define GL_ARB_program_interface_query 1 + +#define GL_UNIFORM 0x92E1 +#define GL_UNIFORM_BLOCK 0x92E2 +#define GL_PROGRAM_INPUT 0x92E3 +#define GL_PROGRAM_OUTPUT 0x92E4 +#define GL_BUFFER_VARIABLE 0x92E5 +#define GL_SHADER_STORAGE_BLOCK 0x92E6 +#define GL_IS_PER_PATCH 0x92E7 +#define GL_VERTEX_SUBROUTINE 0x92E8 +#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 +#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA +#define GL_GEOMETRY_SUBROUTINE 0x92EB +#define GL_FRAGMENT_SUBROUTINE 0x92EC +#define GL_COMPUTE_SUBROUTINE 0x92ED +#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE +#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF +#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 +#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 +#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 +#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 +#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 +#define GL_ACTIVE_RESOURCES 0x92F5 +#define GL_MAX_NAME_LENGTH 0x92F6 +#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 +#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 +#define GL_NAME_LENGTH 0x92F9 +#define GL_TYPE 0x92FA +#define GL_ARRAY_SIZE 0x92FB +#define GL_OFFSET 0x92FC +#define GL_BLOCK_INDEX 0x92FD +#define GL_ARRAY_STRIDE 0x92FE +#define GL_MATRIX_STRIDE 0x92FF +#define GL_IS_ROW_MAJOR 0x9300 +#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 +#define GL_BUFFER_BINDING 0x9302 +#define GL_BUFFER_DATA_SIZE 0x9303 +#define GL_NUM_ACTIVE_VARIABLES 0x9304 +#define GL_ACTIVE_VARIABLES 0x9305 +#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 +#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 +#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A +#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B +#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C +#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D +#define GL_LOCATION 0x930E +#define GL_LOCATION_INDEX 0x930F + +typedef void (GLAPIENTRY * PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint* params); +typedef GLuint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); +typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar* name); +typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLint *params); + +#define glGetProgramInterfaceiv GLEW_GET_FUN(__glewGetProgramInterfaceiv) +#define glGetProgramResourceIndex GLEW_GET_FUN(__glewGetProgramResourceIndex) +#define glGetProgramResourceLocation GLEW_GET_FUN(__glewGetProgramResourceLocation) +#define glGetProgramResourceLocationIndex GLEW_GET_FUN(__glewGetProgramResourceLocationIndex) +#define glGetProgramResourceName GLEW_GET_FUN(__glewGetProgramResourceName) +#define glGetProgramResourceiv GLEW_GET_FUN(__glewGetProgramResourceiv) + +#define GLEW_ARB_program_interface_query GLEW_GET_VAR(__GLEW_ARB_program_interface_query) + +#endif /* GL_ARB_program_interface_query */ + +/* ------------------------ GL_ARB_provoking_vertex ------------------------ */ + +#ifndef GL_ARB_provoking_vertex +#define GL_ARB_provoking_vertex 1 + +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_PROVOKING_VERTEX 0x8E4F + +typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXPROC) (GLenum mode); + +#define glProvokingVertex GLEW_GET_FUN(__glewProvokingVertex) + +#define GLEW_ARB_provoking_vertex GLEW_GET_VAR(__GLEW_ARB_provoking_vertex) + +#endif /* GL_ARB_provoking_vertex */ + +/* ----------------------- GL_ARB_query_buffer_object ---------------------- */ + +#ifndef GL_ARB_query_buffer_object +#define GL_ARB_query_buffer_object 1 + +#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 +#define GL_QUERY_BUFFER 0x9192 +#define GL_QUERY_BUFFER_BINDING 0x9193 +#define GL_QUERY_RESULT_NO_WAIT 0x9194 + +#define GLEW_ARB_query_buffer_object GLEW_GET_VAR(__GLEW_ARB_query_buffer_object) + +#endif /* GL_ARB_query_buffer_object */ + +/* ------------------ GL_ARB_robust_buffer_access_behavior ----------------- */ + +#ifndef GL_ARB_robust_buffer_access_behavior +#define GL_ARB_robust_buffer_access_behavior 1 + +#define GLEW_ARB_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_ARB_robust_buffer_access_behavior) + +#endif /* GL_ARB_robust_buffer_access_behavior */ + +/* --------------------------- GL_ARB_robustness --------------------------- */ + +#ifndef GL_ARB_robustness +#define GL_ARB_robustness 1 + +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 + +typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* table); +typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void* img); +typedef void (GLAPIENTRY * PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* image); +typedef void (GLAPIENTRY * PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); +typedef void (GLAPIENTRY * PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble* v); +typedef void (GLAPIENTRY * PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat* v); +typedef void (GLAPIENTRY * PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint* v); +typedef void (GLAPIENTRY * PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); +typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat* values); +typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint* values); +typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort* values); +typedef void (GLAPIENTRY * PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte* pattern); +typedef void (GLAPIENTRY * PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void* row, GLsizei columnBufSize, void*column, void*span); +typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* img); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params); +typedef void (GLAPIENTRY * PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data); + +#define glGetGraphicsResetStatusARB GLEW_GET_FUN(__glewGetGraphicsResetStatusARB) +#define glGetnColorTableARB GLEW_GET_FUN(__glewGetnColorTableARB) +#define glGetnCompressedTexImageARB GLEW_GET_FUN(__glewGetnCompressedTexImageARB) +#define glGetnConvolutionFilterARB GLEW_GET_FUN(__glewGetnConvolutionFilterARB) +#define glGetnHistogramARB GLEW_GET_FUN(__glewGetnHistogramARB) +#define glGetnMapdvARB GLEW_GET_FUN(__glewGetnMapdvARB) +#define glGetnMapfvARB GLEW_GET_FUN(__glewGetnMapfvARB) +#define glGetnMapivARB GLEW_GET_FUN(__glewGetnMapivARB) +#define glGetnMinmaxARB GLEW_GET_FUN(__glewGetnMinmaxARB) +#define glGetnPixelMapfvARB GLEW_GET_FUN(__glewGetnPixelMapfvARB) +#define glGetnPixelMapuivARB GLEW_GET_FUN(__glewGetnPixelMapuivARB) +#define glGetnPixelMapusvARB GLEW_GET_FUN(__glewGetnPixelMapusvARB) +#define glGetnPolygonStippleARB GLEW_GET_FUN(__glewGetnPolygonStippleARB) +#define glGetnSeparableFilterARB GLEW_GET_FUN(__glewGetnSeparableFilterARB) +#define glGetnTexImageARB GLEW_GET_FUN(__glewGetnTexImageARB) +#define glGetnUniformdvARB GLEW_GET_FUN(__glewGetnUniformdvARB) +#define glGetnUniformfvARB GLEW_GET_FUN(__glewGetnUniformfvARB) +#define glGetnUniformivARB GLEW_GET_FUN(__glewGetnUniformivARB) +#define glGetnUniformuivARB GLEW_GET_FUN(__glewGetnUniformuivARB) +#define glReadnPixelsARB GLEW_GET_FUN(__glewReadnPixelsARB) + +#define GLEW_ARB_robustness GLEW_GET_VAR(__GLEW_ARB_robustness) + +#endif /* GL_ARB_robustness */ + +/* ---------------- GL_ARB_robustness_application_isolation ---------------- */ + +#ifndef GL_ARB_robustness_application_isolation +#define GL_ARB_robustness_application_isolation 1 + +#define GLEW_ARB_robustness_application_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_application_isolation) + +#endif /* GL_ARB_robustness_application_isolation */ + +/* ---------------- GL_ARB_robustness_share_group_isolation ---------------- */ + +#ifndef GL_ARB_robustness_share_group_isolation +#define GL_ARB_robustness_share_group_isolation 1 + +#define GLEW_ARB_robustness_share_group_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_share_group_isolation) + +#endif /* GL_ARB_robustness_share_group_isolation */ + +/* ------------------------ GL_ARB_sample_locations ------------------------ */ + +#ifndef GL_ARB_sample_locations +#define GL_ARB_sample_locations 1 + +#define GL_SAMPLE_LOCATION_ARB 0x8E50 +#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB 0x933D +#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB 0x933E +#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB 0x933F +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB 0x9340 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB 0x9341 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB 0x9342 +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB 0x9343 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); + +#define glFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewFramebufferSampleLocationsfvARB) +#define glNamedFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvARB) + +#define GLEW_ARB_sample_locations GLEW_GET_VAR(__GLEW_ARB_sample_locations) + +#endif /* GL_ARB_sample_locations */ + +/* ------------------------- GL_ARB_sample_shading ------------------------- */ + +#ifndef GL_ARB_sample_shading +#define GL_ARB_sample_shading 1 + +#define GL_SAMPLE_SHADING_ARB 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 + +typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGARBPROC) (GLclampf value); + +#define glMinSampleShadingARB GLEW_GET_FUN(__glewMinSampleShadingARB) + +#define GLEW_ARB_sample_shading GLEW_GET_VAR(__GLEW_ARB_sample_shading) + +#endif /* GL_ARB_sample_shading */ + +/* ------------------------- GL_ARB_sampler_objects ------------------------ */ + +#ifndef GL_ARB_sampler_objects +#define GL_ARB_sampler_objects 1 + +#define GL_SAMPLER_BINDING 0x8919 + +typedef void (GLAPIENTRY * PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); +typedef void (GLAPIENTRY * PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint * samplers); +typedef void (GLAPIENTRY * PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint* samplers); +typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISSAMPLERPROC) (GLuint sampler); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint* params); + +#define glBindSampler GLEW_GET_FUN(__glewBindSampler) +#define glDeleteSamplers GLEW_GET_FUN(__glewDeleteSamplers) +#define glGenSamplers GLEW_GET_FUN(__glewGenSamplers) +#define glGetSamplerParameterIiv GLEW_GET_FUN(__glewGetSamplerParameterIiv) +#define glGetSamplerParameterIuiv GLEW_GET_FUN(__glewGetSamplerParameterIuiv) +#define glGetSamplerParameterfv GLEW_GET_FUN(__glewGetSamplerParameterfv) +#define glGetSamplerParameteriv GLEW_GET_FUN(__glewGetSamplerParameteriv) +#define glIsSampler GLEW_GET_FUN(__glewIsSampler) +#define glSamplerParameterIiv GLEW_GET_FUN(__glewSamplerParameterIiv) +#define glSamplerParameterIuiv GLEW_GET_FUN(__glewSamplerParameterIuiv) +#define glSamplerParameterf GLEW_GET_FUN(__glewSamplerParameterf) +#define glSamplerParameterfv GLEW_GET_FUN(__glewSamplerParameterfv) +#define glSamplerParameteri GLEW_GET_FUN(__glewSamplerParameteri) +#define glSamplerParameteriv GLEW_GET_FUN(__glewSamplerParameteriv) + +#define GLEW_ARB_sampler_objects GLEW_GET_VAR(__GLEW_ARB_sampler_objects) + +#endif /* GL_ARB_sampler_objects */ + +/* ------------------------ GL_ARB_seamless_cube_map ----------------------- */ + +#ifndef GL_ARB_seamless_cube_map +#define GL_ARB_seamless_cube_map 1 + +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F + +#define GLEW_ARB_seamless_cube_map GLEW_GET_VAR(__GLEW_ARB_seamless_cube_map) + +#endif /* GL_ARB_seamless_cube_map */ + +/* ------------------ GL_ARB_seamless_cubemap_per_texture ------------------ */ + +#ifndef GL_ARB_seamless_cubemap_per_texture +#define GL_ARB_seamless_cubemap_per_texture 1 + +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F + +#define GLEW_ARB_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_ARB_seamless_cubemap_per_texture) + +#endif /* GL_ARB_seamless_cubemap_per_texture */ + +/* --------------------- GL_ARB_separate_shader_objects -------------------- */ + +#ifndef GL_ARB_separate_shader_objects +#define GL_ARB_separate_shader_objects 1 + +#define GL_VERTEX_SHADER_BIT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT 0x00000002 +#define GL_GEOMETRY_SHADER_BIT 0x00000004 +#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 +#define GL_PROGRAM_SEPARABLE 0x8258 +#define GL_ACTIVE_PROGRAM 0x8259 +#define GL_PROGRAM_PIPELINE_BINDING 0x825A +#define GL_ALL_SHADER_BITS 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); +typedef void (GLAPIENTRY * PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar * const * strings); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint* pipelines); +typedef void (GLAPIENTRY * PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei* length, GLchar *infoLog); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint x, GLuint y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); + +#define glActiveShaderProgram GLEW_GET_FUN(__glewActiveShaderProgram) +#define glBindProgramPipeline GLEW_GET_FUN(__glewBindProgramPipeline) +#define glCreateShaderProgramv GLEW_GET_FUN(__glewCreateShaderProgramv) +#define glDeleteProgramPipelines GLEW_GET_FUN(__glewDeleteProgramPipelines) +#define glGenProgramPipelines GLEW_GET_FUN(__glewGenProgramPipelines) +#define glGetProgramPipelineInfoLog GLEW_GET_FUN(__glewGetProgramPipelineInfoLog) +#define glGetProgramPipelineiv GLEW_GET_FUN(__glewGetProgramPipelineiv) +#define glIsProgramPipeline GLEW_GET_FUN(__glewIsProgramPipeline) +#define glProgramUniform1d GLEW_GET_FUN(__glewProgramUniform1d) +#define glProgramUniform1dv GLEW_GET_FUN(__glewProgramUniform1dv) +#define glProgramUniform1f GLEW_GET_FUN(__glewProgramUniform1f) +#define glProgramUniform1fv GLEW_GET_FUN(__glewProgramUniform1fv) +#define glProgramUniform1i GLEW_GET_FUN(__glewProgramUniform1i) +#define glProgramUniform1iv GLEW_GET_FUN(__glewProgramUniform1iv) +#define glProgramUniform1ui GLEW_GET_FUN(__glewProgramUniform1ui) +#define glProgramUniform1uiv GLEW_GET_FUN(__glewProgramUniform1uiv) +#define glProgramUniform2d GLEW_GET_FUN(__glewProgramUniform2d) +#define glProgramUniform2dv GLEW_GET_FUN(__glewProgramUniform2dv) +#define glProgramUniform2f GLEW_GET_FUN(__glewProgramUniform2f) +#define glProgramUniform2fv GLEW_GET_FUN(__glewProgramUniform2fv) +#define glProgramUniform2i GLEW_GET_FUN(__glewProgramUniform2i) +#define glProgramUniform2iv GLEW_GET_FUN(__glewProgramUniform2iv) +#define glProgramUniform2ui GLEW_GET_FUN(__glewProgramUniform2ui) +#define glProgramUniform2uiv GLEW_GET_FUN(__glewProgramUniform2uiv) +#define glProgramUniform3d GLEW_GET_FUN(__glewProgramUniform3d) +#define glProgramUniform3dv GLEW_GET_FUN(__glewProgramUniform3dv) +#define glProgramUniform3f GLEW_GET_FUN(__glewProgramUniform3f) +#define glProgramUniform3fv GLEW_GET_FUN(__glewProgramUniform3fv) +#define glProgramUniform3i GLEW_GET_FUN(__glewProgramUniform3i) +#define glProgramUniform3iv GLEW_GET_FUN(__glewProgramUniform3iv) +#define glProgramUniform3ui GLEW_GET_FUN(__glewProgramUniform3ui) +#define glProgramUniform3uiv GLEW_GET_FUN(__glewProgramUniform3uiv) +#define glProgramUniform4d GLEW_GET_FUN(__glewProgramUniform4d) +#define glProgramUniform4dv GLEW_GET_FUN(__glewProgramUniform4dv) +#define glProgramUniform4f GLEW_GET_FUN(__glewProgramUniform4f) +#define glProgramUniform4fv GLEW_GET_FUN(__glewProgramUniform4fv) +#define glProgramUniform4i GLEW_GET_FUN(__glewProgramUniform4i) +#define glProgramUniform4iv GLEW_GET_FUN(__glewProgramUniform4iv) +#define glProgramUniform4ui GLEW_GET_FUN(__glewProgramUniform4ui) +#define glProgramUniform4uiv GLEW_GET_FUN(__glewProgramUniform4uiv) +#define glProgramUniformMatrix2dv GLEW_GET_FUN(__glewProgramUniformMatrix2dv) +#define glProgramUniformMatrix2fv GLEW_GET_FUN(__glewProgramUniformMatrix2fv) +#define glProgramUniformMatrix2x3dv GLEW_GET_FUN(__glewProgramUniformMatrix2x3dv) +#define glProgramUniformMatrix2x3fv GLEW_GET_FUN(__glewProgramUniformMatrix2x3fv) +#define glProgramUniformMatrix2x4dv GLEW_GET_FUN(__glewProgramUniformMatrix2x4dv) +#define glProgramUniformMatrix2x4fv GLEW_GET_FUN(__glewProgramUniformMatrix2x4fv) +#define glProgramUniformMatrix3dv GLEW_GET_FUN(__glewProgramUniformMatrix3dv) +#define glProgramUniformMatrix3fv GLEW_GET_FUN(__glewProgramUniformMatrix3fv) +#define glProgramUniformMatrix3x2dv GLEW_GET_FUN(__glewProgramUniformMatrix3x2dv) +#define glProgramUniformMatrix3x2fv GLEW_GET_FUN(__glewProgramUniformMatrix3x2fv) +#define glProgramUniformMatrix3x4dv GLEW_GET_FUN(__glewProgramUniformMatrix3x4dv) +#define glProgramUniformMatrix3x4fv GLEW_GET_FUN(__glewProgramUniformMatrix3x4fv) +#define glProgramUniformMatrix4dv GLEW_GET_FUN(__glewProgramUniformMatrix4dv) +#define glProgramUniformMatrix4fv GLEW_GET_FUN(__glewProgramUniformMatrix4fv) +#define glProgramUniformMatrix4x2dv GLEW_GET_FUN(__glewProgramUniformMatrix4x2dv) +#define glProgramUniformMatrix4x2fv GLEW_GET_FUN(__glewProgramUniformMatrix4x2fv) +#define glProgramUniformMatrix4x3dv GLEW_GET_FUN(__glewProgramUniformMatrix4x3dv) +#define glProgramUniformMatrix4x3fv GLEW_GET_FUN(__glewProgramUniformMatrix4x3fv) +#define glUseProgramStages GLEW_GET_FUN(__glewUseProgramStages) +#define glValidateProgramPipeline GLEW_GET_FUN(__glewValidateProgramPipeline) + +#define GLEW_ARB_separate_shader_objects GLEW_GET_VAR(__GLEW_ARB_separate_shader_objects) + +#endif /* GL_ARB_separate_shader_objects */ + +/* -------------------- GL_ARB_shader_atomic_counter_ops ------------------- */ + +#ifndef GL_ARB_shader_atomic_counter_ops +#define GL_ARB_shader_atomic_counter_ops 1 + +#define GLEW_ARB_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counter_ops) + +#endif /* GL_ARB_shader_atomic_counter_ops */ + +/* --------------------- GL_ARB_shader_atomic_counters --------------------- */ + +#ifndef GL_ARB_shader_atomic_counters +#define GL_ARB_shader_atomic_counters 1 + +#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 +#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 +#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 +#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 +#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB +#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF +#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 +#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 +#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 +#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 +#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 +#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 +#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 +#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA +#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB +#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC + +typedef void (GLAPIENTRY * PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint* params); + +#define glGetActiveAtomicCounterBufferiv GLEW_GET_FUN(__glewGetActiveAtomicCounterBufferiv) + +#define GLEW_ARB_shader_atomic_counters GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counters) + +#endif /* GL_ARB_shader_atomic_counters */ + +/* -------------------------- GL_ARB_shader_ballot ------------------------- */ + +#ifndef GL_ARB_shader_ballot +#define GL_ARB_shader_ballot 1 + +#define GLEW_ARB_shader_ballot GLEW_GET_VAR(__GLEW_ARB_shader_ballot) + +#endif /* GL_ARB_shader_ballot */ + +/* ----------------------- GL_ARB_shader_bit_encoding ---------------------- */ + +#ifndef GL_ARB_shader_bit_encoding +#define GL_ARB_shader_bit_encoding 1 + +#define GLEW_ARB_shader_bit_encoding GLEW_GET_VAR(__GLEW_ARB_shader_bit_encoding) + +#endif /* GL_ARB_shader_bit_encoding */ + +/* -------------------------- GL_ARB_shader_clock -------------------------- */ + +#ifndef GL_ARB_shader_clock +#define GL_ARB_shader_clock 1 + +#define GLEW_ARB_shader_clock GLEW_GET_VAR(__GLEW_ARB_shader_clock) + +#endif /* GL_ARB_shader_clock */ + +/* --------------------- GL_ARB_shader_draw_parameters --------------------- */ + +#ifndef GL_ARB_shader_draw_parameters +#define GL_ARB_shader_draw_parameters 1 + +#define GLEW_ARB_shader_draw_parameters GLEW_GET_VAR(__GLEW_ARB_shader_draw_parameters) + +#endif /* GL_ARB_shader_draw_parameters */ + +/* ------------------------ GL_ARB_shader_group_vote ----------------------- */ + +#ifndef GL_ARB_shader_group_vote +#define GL_ARB_shader_group_vote 1 + +#define GLEW_ARB_shader_group_vote GLEW_GET_VAR(__GLEW_ARB_shader_group_vote) + +#endif /* GL_ARB_shader_group_vote */ + +/* --------------------- GL_ARB_shader_image_load_store -------------------- */ + +#ifndef GL_ARB_shader_image_load_store +#define GL_ARB_shader_image_load_store 1 + +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 +#define GL_COMMAND_BARRIER_BIT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 +#define GL_MAX_IMAGE_UNITS 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 +#define GL_IMAGE_BINDING_NAME 0x8F3A +#define GL_IMAGE_BINDING_LEVEL 0x8F3B +#define GL_IMAGE_BINDING_LAYERED 0x8F3C +#define GL_IMAGE_BINDING_LAYER 0x8F3D +#define GL_IMAGE_BINDING_ACCESS 0x8F3E +#define GL_IMAGE_1D 0x904C +#define GL_IMAGE_2D 0x904D +#define GL_IMAGE_3D 0x904E +#define GL_IMAGE_2D_RECT 0x904F +#define GL_IMAGE_CUBE 0x9050 +#define GL_IMAGE_BUFFER 0x9051 +#define GL_IMAGE_1D_ARRAY 0x9052 +#define GL_IMAGE_2D_ARRAY 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 +#define GL_INT_IMAGE_1D 0x9057 +#define GL_INT_IMAGE_2D 0x9058 +#define GL_INT_IMAGE_3D 0x9059 +#define GL_INT_IMAGE_2D_RECT 0x905A +#define GL_INT_IMAGE_CUBE 0x905B +#define GL_INT_IMAGE_BUFFER 0x905C +#define GL_INT_IMAGE_1D_ARRAY 0x905D +#define GL_INT_IMAGE_2D_ARRAY 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C +#define GL_MAX_IMAGE_SAMPLES 0x906D +#define GL_IMAGE_BINDING_FORMAT 0x906E +#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 +#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD +#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE +#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF +#define GL_ALL_BARRIER_BITS 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); + +#define glBindImageTexture GLEW_GET_FUN(__glewBindImageTexture) +#define glMemoryBarrier GLEW_GET_FUN(__glewMemoryBarrier) + +#define GLEW_ARB_shader_image_load_store GLEW_GET_VAR(__GLEW_ARB_shader_image_load_store) + +#endif /* GL_ARB_shader_image_load_store */ + +/* ------------------------ GL_ARB_shader_image_size ----------------------- */ + +#ifndef GL_ARB_shader_image_size +#define GL_ARB_shader_image_size 1 + +#define GLEW_ARB_shader_image_size GLEW_GET_VAR(__GLEW_ARB_shader_image_size) + +#endif /* GL_ARB_shader_image_size */ + +/* ------------------------- GL_ARB_shader_objects ------------------------- */ + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 + +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 + +typedef char GLcharARB; +typedef unsigned int GLhandleARB; + +typedef void (GLAPIENTRY * PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (GLAPIENTRY * PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef GLhandleARB (GLAPIENTRY * PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (GLAPIENTRY * PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef void (GLAPIENTRY * PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (GLAPIENTRY * PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB *obj); +typedef GLhandleARB (GLAPIENTRY * PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (GLAPIENTRY * PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *infoLog); +typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *source); +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint* params); +typedef void (GLAPIENTRY * PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (GLAPIENTRY * PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint *length); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); + +#define glAttachObjectARB GLEW_GET_FUN(__glewAttachObjectARB) +#define glCompileShaderARB GLEW_GET_FUN(__glewCompileShaderARB) +#define glCreateProgramObjectARB GLEW_GET_FUN(__glewCreateProgramObjectARB) +#define glCreateShaderObjectARB GLEW_GET_FUN(__glewCreateShaderObjectARB) +#define glDeleteObjectARB GLEW_GET_FUN(__glewDeleteObjectARB) +#define glDetachObjectARB GLEW_GET_FUN(__glewDetachObjectARB) +#define glGetActiveUniformARB GLEW_GET_FUN(__glewGetActiveUniformARB) +#define glGetAttachedObjectsARB GLEW_GET_FUN(__glewGetAttachedObjectsARB) +#define glGetHandleARB GLEW_GET_FUN(__glewGetHandleARB) +#define glGetInfoLogARB GLEW_GET_FUN(__glewGetInfoLogARB) +#define glGetObjectParameterfvARB GLEW_GET_FUN(__glewGetObjectParameterfvARB) +#define glGetObjectParameterivARB GLEW_GET_FUN(__glewGetObjectParameterivARB) +#define glGetShaderSourceARB GLEW_GET_FUN(__glewGetShaderSourceARB) +#define glGetUniformLocationARB GLEW_GET_FUN(__glewGetUniformLocationARB) +#define glGetUniformfvARB GLEW_GET_FUN(__glewGetUniformfvARB) +#define glGetUniformivARB GLEW_GET_FUN(__glewGetUniformivARB) +#define glLinkProgramARB GLEW_GET_FUN(__glewLinkProgramARB) +#define glShaderSourceARB GLEW_GET_FUN(__glewShaderSourceARB) +#define glUniform1fARB GLEW_GET_FUN(__glewUniform1fARB) +#define glUniform1fvARB GLEW_GET_FUN(__glewUniform1fvARB) +#define glUniform1iARB GLEW_GET_FUN(__glewUniform1iARB) +#define glUniform1ivARB GLEW_GET_FUN(__glewUniform1ivARB) +#define glUniform2fARB GLEW_GET_FUN(__glewUniform2fARB) +#define glUniform2fvARB GLEW_GET_FUN(__glewUniform2fvARB) +#define glUniform2iARB GLEW_GET_FUN(__glewUniform2iARB) +#define glUniform2ivARB GLEW_GET_FUN(__glewUniform2ivARB) +#define glUniform3fARB GLEW_GET_FUN(__glewUniform3fARB) +#define glUniform3fvARB GLEW_GET_FUN(__glewUniform3fvARB) +#define glUniform3iARB GLEW_GET_FUN(__glewUniform3iARB) +#define glUniform3ivARB GLEW_GET_FUN(__glewUniform3ivARB) +#define glUniform4fARB GLEW_GET_FUN(__glewUniform4fARB) +#define glUniform4fvARB GLEW_GET_FUN(__glewUniform4fvARB) +#define glUniform4iARB GLEW_GET_FUN(__glewUniform4iARB) +#define glUniform4ivARB GLEW_GET_FUN(__glewUniform4ivARB) +#define glUniformMatrix2fvARB GLEW_GET_FUN(__glewUniformMatrix2fvARB) +#define glUniformMatrix3fvARB GLEW_GET_FUN(__glewUniformMatrix3fvARB) +#define glUniformMatrix4fvARB GLEW_GET_FUN(__glewUniformMatrix4fvARB) +#define glUseProgramObjectARB GLEW_GET_FUN(__glewUseProgramObjectARB) +#define glValidateProgramARB GLEW_GET_FUN(__glewValidateProgramARB) + +#define GLEW_ARB_shader_objects GLEW_GET_VAR(__GLEW_ARB_shader_objects) + +#endif /* GL_ARB_shader_objects */ + +/* ------------------------ GL_ARB_shader_precision ------------------------ */ + +#ifndef GL_ARB_shader_precision +#define GL_ARB_shader_precision 1 + +#define GLEW_ARB_shader_precision GLEW_GET_VAR(__GLEW_ARB_shader_precision) + +#endif /* GL_ARB_shader_precision */ + +/* ---------------------- GL_ARB_shader_stencil_export --------------------- */ + +#ifndef GL_ARB_shader_stencil_export +#define GL_ARB_shader_stencil_export 1 + +#define GLEW_ARB_shader_stencil_export GLEW_GET_VAR(__GLEW_ARB_shader_stencil_export) + +#endif /* GL_ARB_shader_stencil_export */ + +/* ------------------ GL_ARB_shader_storage_buffer_object ------------------ */ + +#ifndef GL_ARB_shader_storage_buffer_object +#define GL_ARB_shader_storage_buffer_object 1 + +#define GL_SHADER_STORAGE_BARRIER_BIT 0x2000 +#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 +#define GL_SHADER_STORAGE_BUFFER 0x90D2 +#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 +#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 +#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 +#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 +#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA +#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB +#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC +#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD +#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE +#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF + +typedef void (GLAPIENTRY * PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); + +#define glShaderStorageBlockBinding GLEW_GET_FUN(__glewShaderStorageBlockBinding) + +#define GLEW_ARB_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_ARB_shader_storage_buffer_object) + +#endif /* GL_ARB_shader_storage_buffer_object */ + +/* ------------------------ GL_ARB_shader_subroutine ----------------------- */ + +#ifndef GL_ARB_shader_subroutine +#define GL_ARB_shader_subroutine 1 + +#define GL_ACTIVE_SUBROUTINES 0x8DE5 +#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 +#define GL_MAX_SUBROUTINES 0x8DE7 +#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 +#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 +#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A +#define GL_COMPATIBLE_SUBROUTINES 0x8E4B + +typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint* values); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint* values); +typedef GLuint (GLAPIENTRY * PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar* name); +typedef GLint (GLAPIENTRY * PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint* params); +typedef void (GLAPIENTRY * PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint* indices); + +#define glGetActiveSubroutineName GLEW_GET_FUN(__glewGetActiveSubroutineName) +#define glGetActiveSubroutineUniformName GLEW_GET_FUN(__glewGetActiveSubroutineUniformName) +#define glGetActiveSubroutineUniformiv GLEW_GET_FUN(__glewGetActiveSubroutineUniformiv) +#define glGetProgramStageiv GLEW_GET_FUN(__glewGetProgramStageiv) +#define glGetSubroutineIndex GLEW_GET_FUN(__glewGetSubroutineIndex) +#define glGetSubroutineUniformLocation GLEW_GET_FUN(__glewGetSubroutineUniformLocation) +#define glGetUniformSubroutineuiv GLEW_GET_FUN(__glewGetUniformSubroutineuiv) +#define glUniformSubroutinesuiv GLEW_GET_FUN(__glewUniformSubroutinesuiv) + +#define GLEW_ARB_shader_subroutine GLEW_GET_VAR(__GLEW_ARB_shader_subroutine) + +#endif /* GL_ARB_shader_subroutine */ + +/* ------------------ GL_ARB_shader_texture_image_samples ------------------ */ + +#ifndef GL_ARB_shader_texture_image_samples +#define GL_ARB_shader_texture_image_samples 1 + +#define GLEW_ARB_shader_texture_image_samples GLEW_GET_VAR(__GLEW_ARB_shader_texture_image_samples) + +#endif /* GL_ARB_shader_texture_image_samples */ + +/* ----------------------- GL_ARB_shader_texture_lod ----------------------- */ + +#ifndef GL_ARB_shader_texture_lod +#define GL_ARB_shader_texture_lod 1 + +#define GLEW_ARB_shader_texture_lod GLEW_GET_VAR(__GLEW_ARB_shader_texture_lod) + +#endif /* GL_ARB_shader_texture_lod */ + +/* ------------------- GL_ARB_shader_viewport_layer_array ------------------ */ + +#ifndef GL_ARB_shader_viewport_layer_array +#define GL_ARB_shader_viewport_layer_array 1 + +#define GLEW_ARB_shader_viewport_layer_array GLEW_GET_VAR(__GLEW_ARB_shader_viewport_layer_array) + +#endif /* GL_ARB_shader_viewport_layer_array */ + +/* ---------------------- GL_ARB_shading_language_100 ---------------------- */ + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 + +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C + +#define GLEW_ARB_shading_language_100 GLEW_GET_VAR(__GLEW_ARB_shading_language_100) + +#endif /* GL_ARB_shading_language_100 */ + +/* -------------------- GL_ARB_shading_language_420pack -------------------- */ + +#ifndef GL_ARB_shading_language_420pack +#define GL_ARB_shading_language_420pack 1 + +#define GLEW_ARB_shading_language_420pack GLEW_GET_VAR(__GLEW_ARB_shading_language_420pack) + +#endif /* GL_ARB_shading_language_420pack */ + +/* -------------------- GL_ARB_shading_language_include -------------------- */ + +#ifndef GL_ARB_shading_language_include +#define GL_ARB_shading_language_include 1 + +#define GL_SHADER_INCLUDE_ARB 0x8DAE +#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 +#define GL_NAMED_STRING_TYPE_ARB 0x8DEA + +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar* const *path, const GLint *length); +typedef void (GLAPIENTRY * PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name, GLsizei bufSize, GLint *stringlen, GLchar *string); +typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar* name, GLenum pname, GLint *params); +typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar* name, GLint stringlen, const GLchar *string); + +#define glCompileShaderIncludeARB GLEW_GET_FUN(__glewCompileShaderIncludeARB) +#define glDeleteNamedStringARB GLEW_GET_FUN(__glewDeleteNamedStringARB) +#define glGetNamedStringARB GLEW_GET_FUN(__glewGetNamedStringARB) +#define glGetNamedStringivARB GLEW_GET_FUN(__glewGetNamedStringivARB) +#define glIsNamedStringARB GLEW_GET_FUN(__glewIsNamedStringARB) +#define glNamedStringARB GLEW_GET_FUN(__glewNamedStringARB) + +#define GLEW_ARB_shading_language_include GLEW_GET_VAR(__GLEW_ARB_shading_language_include) + +#endif /* GL_ARB_shading_language_include */ + +/* -------------------- GL_ARB_shading_language_packing -------------------- */ + +#ifndef GL_ARB_shading_language_packing +#define GL_ARB_shading_language_packing 1 + +#define GLEW_ARB_shading_language_packing GLEW_GET_VAR(__GLEW_ARB_shading_language_packing) + +#endif /* GL_ARB_shading_language_packing */ + +/* ----------------------------- GL_ARB_shadow ----------------------------- */ + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 + +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E + +#define GLEW_ARB_shadow GLEW_GET_VAR(__GLEW_ARB_shadow) + +#endif /* GL_ARB_shadow */ + +/* ------------------------- GL_ARB_shadow_ambient ------------------------- */ + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 + +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF + +#define GLEW_ARB_shadow_ambient GLEW_GET_VAR(__GLEW_ARB_shadow_ambient) + +#endif /* GL_ARB_shadow_ambient */ + +/* -------------------------- GL_ARB_sparse_buffer ------------------------- */ + +#ifndef GL_ARB_sparse_buffer +#define GL_ARB_sparse_buffer 1 + +#define GL_SPARSE_STORAGE_BIT_ARB 0x0400 +#define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8 + +typedef void (GLAPIENTRY * PFNGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); + +#define glBufferPageCommitmentARB GLEW_GET_FUN(__glewBufferPageCommitmentARB) + +#define GLEW_ARB_sparse_buffer GLEW_GET_VAR(__GLEW_ARB_sparse_buffer) + +#endif /* GL_ARB_sparse_buffer */ + +/* ------------------------- GL_ARB_sparse_texture ------------------------- */ + +#ifndef GL_ARB_sparse_texture +#define GL_ARB_sparse_texture 1 + +#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A +#define GL_TEXTURE_SPARSE_ARB 0x91A6 +#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 +#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 +#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA + +typedef void (GLAPIENTRY * PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); + +#define glTexPageCommitmentARB GLEW_GET_FUN(__glewTexPageCommitmentARB) + +#define GLEW_ARB_sparse_texture GLEW_GET_VAR(__GLEW_ARB_sparse_texture) + +#endif /* GL_ARB_sparse_texture */ + +/* ------------------------- GL_ARB_sparse_texture2 ------------------------ */ + +#ifndef GL_ARB_sparse_texture2 +#define GL_ARB_sparse_texture2 1 + +#define GLEW_ARB_sparse_texture2 GLEW_GET_VAR(__GLEW_ARB_sparse_texture2) + +#endif /* GL_ARB_sparse_texture2 */ + +/* ---------------------- GL_ARB_sparse_texture_clamp ---------------------- */ + +#ifndef GL_ARB_sparse_texture_clamp +#define GL_ARB_sparse_texture_clamp 1 + +#define GLEW_ARB_sparse_texture_clamp GLEW_GET_VAR(__GLEW_ARB_sparse_texture_clamp) + +#endif /* GL_ARB_sparse_texture_clamp */ + +/* ------------------------ GL_ARB_spirv_extensions ------------------------ */ + +#ifndef GL_ARB_spirv_extensions +#define GL_ARB_spirv_extensions 1 + +#define GL_SPIR_V_EXTENSIONS 0x9553 +#define GL_NUM_SPIR_V_EXTENSIONS 0x9554 + +#define GLEW_ARB_spirv_extensions GLEW_GET_VAR(__GLEW_ARB_spirv_extensions) + +#endif /* GL_ARB_spirv_extensions */ + +/* ------------------------ GL_ARB_stencil_texturing ----------------------- */ + +#ifndef GL_ARB_stencil_texturing +#define GL_ARB_stencil_texturing 1 + +#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA + +#define GLEW_ARB_stencil_texturing GLEW_GET_VAR(__GLEW_ARB_stencil_texturing) + +#endif /* GL_ARB_stencil_texturing */ + +/* ------------------------------ GL_ARB_sync ------------------------------ */ + +#ifndef GL_ARB_sync +#define GL_ARB_sync 1 + +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_OBJECT_TYPE 0x9112 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_STATUS 0x9114 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_UNSIGNALED 0x9118 +#define GL_SIGNALED 0x9119 +#define GL_ALREADY_SIGNALED 0x911A +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_CONDITION_SATISFIED 0x911C +#define GL_WAIT_FAILED 0x911D +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull + +typedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); +typedef void (GLAPIENTRY * PFNGLDELETESYNCPROC) (GLsync GLsync); +typedef GLsync (GLAPIENTRY * PFNGLFENCESYNCPROC) (GLenum condition,GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETSYNCIVPROC) (GLsync GLsync,GLenum pname,GLsizei bufSize,GLsizei* length, GLint *values); +typedef GLboolean (GLAPIENTRY * PFNGLISSYNCPROC) (GLsync GLsync); +typedef void (GLAPIENTRY * PFNGLWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); + +#define glClientWaitSync GLEW_GET_FUN(__glewClientWaitSync) +#define glDeleteSync GLEW_GET_FUN(__glewDeleteSync) +#define glFenceSync GLEW_GET_FUN(__glewFenceSync) +#define glGetInteger64v GLEW_GET_FUN(__glewGetInteger64v) +#define glGetSynciv GLEW_GET_FUN(__glewGetSynciv) +#define glIsSync GLEW_GET_FUN(__glewIsSync) +#define glWaitSync GLEW_GET_FUN(__glewWaitSync) + +#define GLEW_ARB_sync GLEW_GET_VAR(__GLEW_ARB_sync) + +#endif /* GL_ARB_sync */ + +/* ----------------------- GL_ARB_tessellation_shader ---------------------- */ + +#ifndef GL_ARB_tessellation_shader +#define GL_ARB_tessellation_shader 1 + +#define GL_PATCHES 0xE +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F +#define GL_PATCH_VERTICES 0x8E72 +#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 +#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 +#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 +#define GL_TESS_GEN_MODE 0x8E76 +#define GL_TESS_GEN_SPACING 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 +#define GL_TESS_GEN_POINT_MODE 0x8E79 +#define GL_ISOLINES 0x8E7A +#define GL_FRACTIONAL_ODD 0x8E7B +#define GL_FRACTIONAL_EVEN 0x8E7C +#define GL_MAX_PATCH_VERTICES 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 +#define GL_TESS_EVALUATION_SHADER 0x8E87 +#define GL_TESS_CONTROL_SHADER 0x8E88 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A + +typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat* values); +typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); + +#define glPatchParameterfv GLEW_GET_FUN(__glewPatchParameterfv) +#define glPatchParameteri GLEW_GET_FUN(__glewPatchParameteri) + +#define GLEW_ARB_tessellation_shader GLEW_GET_VAR(__GLEW_ARB_tessellation_shader) + +#endif /* GL_ARB_tessellation_shader */ + +/* ------------------------- GL_ARB_texture_barrier ------------------------ */ + +#ifndef GL_ARB_texture_barrier +#define GL_ARB_texture_barrier 1 + +typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERPROC) (void); + +#define glTextureBarrier GLEW_GET_FUN(__glewTextureBarrier) + +#define GLEW_ARB_texture_barrier GLEW_GET_VAR(__GLEW_ARB_texture_barrier) + +#endif /* GL_ARB_texture_barrier */ + +/* ---------------------- GL_ARB_texture_border_clamp ---------------------- */ + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 + +#define GL_CLAMP_TO_BORDER_ARB 0x812D + +#define GLEW_ARB_texture_border_clamp GLEW_GET_VAR(__GLEW_ARB_texture_border_clamp) + +#endif /* GL_ARB_texture_border_clamp */ + +/* ---------------------- GL_ARB_texture_buffer_object --------------------- */ + +#ifndef GL_ARB_texture_buffer_object +#define GL_ARB_texture_buffer_object 1 + +#define GL_TEXTURE_BUFFER_ARB 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E + +typedef void (GLAPIENTRY * PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); + +#define glTexBufferARB GLEW_GET_FUN(__glewTexBufferARB) + +#define GLEW_ARB_texture_buffer_object GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object) + +#endif /* GL_ARB_texture_buffer_object */ + +/* ------------------- GL_ARB_texture_buffer_object_rgb32 ------------------ */ + +#ifndef GL_ARB_texture_buffer_object_rgb32 +#define GL_ARB_texture_buffer_object_rgb32 1 + +#define GLEW_ARB_texture_buffer_object_rgb32 GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object_rgb32) + +#endif /* GL_ARB_texture_buffer_object_rgb32 */ + +/* ---------------------- GL_ARB_texture_buffer_range ---------------------- */ + +#ifndef GL_ARB_texture_buffer_range +#define GL_ARB_texture_buffer_range 1 + +#define GL_TEXTURE_BUFFER_OFFSET 0x919D +#define GL_TEXTURE_BUFFER_SIZE 0x919E +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F + +typedef void (GLAPIENTRY * PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); + +#define glTexBufferRange GLEW_GET_FUN(__glewTexBufferRange) +#define glTextureBufferRangeEXT GLEW_GET_FUN(__glewTextureBufferRangeEXT) + +#define GLEW_ARB_texture_buffer_range GLEW_GET_VAR(__GLEW_ARB_texture_buffer_range) + +#endif /* GL_ARB_texture_buffer_range */ + +/* ----------------------- GL_ARB_texture_compression ---------------------- */ + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 + +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 + +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, void *img); + +#define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB) +#define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB) +#define glCompressedTexImage3DARB GLEW_GET_FUN(__glewCompressedTexImage3DARB) +#define glCompressedTexSubImage1DARB GLEW_GET_FUN(__glewCompressedTexSubImage1DARB) +#define glCompressedTexSubImage2DARB GLEW_GET_FUN(__glewCompressedTexSubImage2DARB) +#define glCompressedTexSubImage3DARB GLEW_GET_FUN(__glewCompressedTexSubImage3DARB) +#define glGetCompressedTexImageARB GLEW_GET_FUN(__glewGetCompressedTexImageARB) + +#define GLEW_ARB_texture_compression GLEW_GET_VAR(__GLEW_ARB_texture_compression) + +#endif /* GL_ARB_texture_compression */ + +/* -------------------- GL_ARB_texture_compression_bptc -------------------- */ + +#ifndef GL_ARB_texture_compression_bptc +#define GL_ARB_texture_compression_bptc 1 + +#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F + +#define GLEW_ARB_texture_compression_bptc GLEW_GET_VAR(__GLEW_ARB_texture_compression_bptc) + +#endif /* GL_ARB_texture_compression_bptc */ + +/* -------------------- GL_ARB_texture_compression_rgtc -------------------- */ + +#ifndef GL_ARB_texture_compression_rgtc +#define GL_ARB_texture_compression_rgtc 1 + +#define GL_COMPRESSED_RED_RGTC1 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define GL_COMPRESSED_RG_RGTC2 0x8DBD +#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE + +#define GLEW_ARB_texture_compression_rgtc GLEW_GET_VAR(__GLEW_ARB_texture_compression_rgtc) + +#endif /* GL_ARB_texture_compression_rgtc */ + +/* ------------------------ GL_ARB_texture_cube_map ------------------------ */ + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 + +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C + +#define GLEW_ARB_texture_cube_map GLEW_GET_VAR(__GLEW_ARB_texture_cube_map) + +#endif /* GL_ARB_texture_cube_map */ + +/* --------------------- GL_ARB_texture_cube_map_array --------------------- */ + +#ifndef GL_ARB_texture_cube_map_array +#define GL_ARB_texture_cube_map_array 1 + +#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F + +#define GLEW_ARB_texture_cube_map_array GLEW_GET_VAR(__GLEW_ARB_texture_cube_map_array) + +#endif /* GL_ARB_texture_cube_map_array */ + +/* ------------------------- GL_ARB_texture_env_add ------------------------ */ + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 + +#define GLEW_ARB_texture_env_add GLEW_GET_VAR(__GLEW_ARB_texture_env_add) + +#endif /* GL_ARB_texture_env_add */ + +/* ----------------------- GL_ARB_texture_env_combine ---------------------- */ + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 + +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A + +#define GLEW_ARB_texture_env_combine GLEW_GET_VAR(__GLEW_ARB_texture_env_combine) + +#endif /* GL_ARB_texture_env_combine */ + +/* ---------------------- GL_ARB_texture_env_crossbar ---------------------- */ + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 + +#define GLEW_ARB_texture_env_crossbar GLEW_GET_VAR(__GLEW_ARB_texture_env_crossbar) + +#endif /* GL_ARB_texture_env_crossbar */ + +/* ------------------------ GL_ARB_texture_env_dot3 ------------------------ */ + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 + +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF + +#define GLEW_ARB_texture_env_dot3 GLEW_GET_VAR(__GLEW_ARB_texture_env_dot3) + +#endif /* GL_ARB_texture_env_dot3 */ + +/* ------------------- GL_ARB_texture_filter_anisotropic ------------------- */ + +#ifndef GL_ARB_texture_filter_anisotropic +#define GL_ARB_texture_filter_anisotropic 1 + +#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF + +#define GLEW_ARB_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_ARB_texture_filter_anisotropic) + +#endif /* GL_ARB_texture_filter_anisotropic */ + +/* ---------------------- GL_ARB_texture_filter_minmax --------------------- */ + +#ifndef GL_ARB_texture_filter_minmax +#define GL_ARB_texture_filter_minmax 1 + +#define GL_TEXTURE_REDUCTION_MODE_ARB 0x9366 +#define GL_WEIGHTED_AVERAGE_ARB 0x9367 + +#define GLEW_ARB_texture_filter_minmax GLEW_GET_VAR(__GLEW_ARB_texture_filter_minmax) + +#endif /* GL_ARB_texture_filter_minmax */ + +/* -------------------------- GL_ARB_texture_float ------------------------- */ + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 + +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 + +#define GLEW_ARB_texture_float GLEW_GET_VAR(__GLEW_ARB_texture_float) + +#endif /* GL_ARB_texture_float */ + +/* ------------------------- GL_ARB_texture_gather ------------------------- */ + +#ifndef GL_ARB_texture_gather +#define GL_ARB_texture_gather 1 + +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F +#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F + +#define GLEW_ARB_texture_gather GLEW_GET_VAR(__GLEW_ARB_texture_gather) + +#endif /* GL_ARB_texture_gather */ + +/* ------------------ GL_ARB_texture_mirror_clamp_to_edge ------------------ */ + +#ifndef GL_ARB_texture_mirror_clamp_to_edge +#define GL_ARB_texture_mirror_clamp_to_edge 1 + +#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 + +#define GLEW_ARB_texture_mirror_clamp_to_edge GLEW_GET_VAR(__GLEW_ARB_texture_mirror_clamp_to_edge) + +#endif /* GL_ARB_texture_mirror_clamp_to_edge */ + +/* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */ + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 + +#define GL_MIRRORED_REPEAT_ARB 0x8370 + +#define GLEW_ARB_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_ARB_texture_mirrored_repeat) + +#endif /* GL_ARB_texture_mirrored_repeat */ + +/* ----------------------- GL_ARB_texture_multisample ---------------------- */ + +#ifndef GL_ARB_texture_multisample +#define GL_ARB_texture_multisample 1 + +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_INTEGER_SAMPLES 0x9110 + +typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat* val); +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); + +#define glGetMultisamplefv GLEW_GET_FUN(__glewGetMultisamplefv) +#define glSampleMaski GLEW_GET_FUN(__glewSampleMaski) +#define glTexImage2DMultisample GLEW_GET_FUN(__glewTexImage2DMultisample) +#define glTexImage3DMultisample GLEW_GET_FUN(__glewTexImage3DMultisample) + +#define GLEW_ARB_texture_multisample GLEW_GET_VAR(__GLEW_ARB_texture_multisample) + +#endif /* GL_ARB_texture_multisample */ + +/* -------------------- GL_ARB_texture_non_power_of_two -------------------- */ + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 + +#define GLEW_ARB_texture_non_power_of_two GLEW_GET_VAR(__GLEW_ARB_texture_non_power_of_two) + +#endif /* GL_ARB_texture_non_power_of_two */ + +/* ---------------------- GL_ARB_texture_query_levels ---------------------- */ + +#ifndef GL_ARB_texture_query_levels +#define GL_ARB_texture_query_levels 1 + +#define GLEW_ARB_texture_query_levels GLEW_GET_VAR(__GLEW_ARB_texture_query_levels) + +#endif /* GL_ARB_texture_query_levels */ + +/* ------------------------ GL_ARB_texture_query_lod ----------------------- */ + +#ifndef GL_ARB_texture_query_lod +#define GL_ARB_texture_query_lod 1 + +#define GLEW_ARB_texture_query_lod GLEW_GET_VAR(__GLEW_ARB_texture_query_lod) + +#endif /* GL_ARB_texture_query_lod */ + +/* ------------------------ GL_ARB_texture_rectangle ----------------------- */ + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 + +#define GLEW_ARB_texture_rectangle GLEW_GET_VAR(__GLEW_ARB_texture_rectangle) + +#endif /* GL_ARB_texture_rectangle */ + +/* --------------------------- GL_ARB_texture_rg --------------------------- */ + +#ifndef GL_ARB_texture_rg +#define GL_ARB_texture_rg 1 + +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RG 0x8226 +#define GL_RG 0x8227 +#define GL_RG_INTEGER 0x8228 +#define GL_R8 0x8229 +#define GL_R16 0x822A +#define GL_RG8 0x822B +#define GL_RG16 0x822C +#define GL_R16F 0x822D +#define GL_R32F 0x822E +#define GL_RG16F 0x822F +#define GL_RG32F 0x8230 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823A +#define GL_RG32I 0x823B +#define GL_RG32UI 0x823C + +#define GLEW_ARB_texture_rg GLEW_GET_VAR(__GLEW_ARB_texture_rg) + +#endif /* GL_ARB_texture_rg */ + +/* ----------------------- GL_ARB_texture_rgb10_a2ui ----------------------- */ + +#ifndef GL_ARB_texture_rgb10_a2ui +#define GL_ARB_texture_rgb10_a2ui 1 + +#define GL_RGB10_A2UI 0x906F + +#define GLEW_ARB_texture_rgb10_a2ui GLEW_GET_VAR(__GLEW_ARB_texture_rgb10_a2ui) + +#endif /* GL_ARB_texture_rgb10_a2ui */ + +/* ------------------------ GL_ARB_texture_stencil8 ------------------------ */ + +#ifndef GL_ARB_texture_stencil8 +#define GL_ARB_texture_stencil8 1 + +#define GL_STENCIL_INDEX 0x1901 +#define GL_STENCIL_INDEX8 0x8D48 + +#define GLEW_ARB_texture_stencil8 GLEW_GET_VAR(__GLEW_ARB_texture_stencil8) + +#endif /* GL_ARB_texture_stencil8 */ + +/* ------------------------- GL_ARB_texture_storage ------------------------ */ + +#ifndef GL_ARB_texture_storage +#define GL_ARB_texture_storage 1 + +#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F + +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); + +#define glTexStorage1D GLEW_GET_FUN(__glewTexStorage1D) +#define glTexStorage2D GLEW_GET_FUN(__glewTexStorage2D) +#define glTexStorage3D GLEW_GET_FUN(__glewTexStorage3D) + +#define GLEW_ARB_texture_storage GLEW_GET_VAR(__GLEW_ARB_texture_storage) + +#endif /* GL_ARB_texture_storage */ + +/* ------------------- GL_ARB_texture_storage_multisample ------------------ */ + +#ifndef GL_ARB_texture_storage_multisample +#define GL_ARB_texture_storage_multisample 1 + +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); + +#define glTexStorage2DMultisample GLEW_GET_FUN(__glewTexStorage2DMultisample) +#define glTexStorage3DMultisample GLEW_GET_FUN(__glewTexStorage3DMultisample) +#define glTextureStorage2DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage2DMultisampleEXT) +#define glTextureStorage3DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage3DMultisampleEXT) + +#define GLEW_ARB_texture_storage_multisample GLEW_GET_VAR(__GLEW_ARB_texture_storage_multisample) + +#endif /* GL_ARB_texture_storage_multisample */ + +/* ------------------------- GL_ARB_texture_swizzle ------------------------ */ + +#ifndef GL_ARB_texture_swizzle +#define GL_ARB_texture_swizzle 1 + +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 + +#define GLEW_ARB_texture_swizzle GLEW_GET_VAR(__GLEW_ARB_texture_swizzle) + +#endif /* GL_ARB_texture_swizzle */ + +/* -------------------------- GL_ARB_texture_view -------------------------- */ + +#ifndef GL_ARB_texture_view +#define GL_ARB_texture_view 1 + +#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB +#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC +#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD +#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF + +typedef void (GLAPIENTRY * PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); + +#define glTextureView GLEW_GET_FUN(__glewTextureView) + +#define GLEW_ARB_texture_view GLEW_GET_VAR(__GLEW_ARB_texture_view) + +#endif /* GL_ARB_texture_view */ + +/* --------------------------- GL_ARB_timer_query -------------------------- */ + +#ifndef GL_ARB_timer_query +#define GL_ARB_timer_query 1 + +#define GL_TIME_ELAPSED 0x88BF +#define GL_TIMESTAMP 0x8E28 + +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); + +#define glGetQueryObjecti64v GLEW_GET_FUN(__glewGetQueryObjecti64v) +#define glGetQueryObjectui64v GLEW_GET_FUN(__glewGetQueryObjectui64v) +#define glQueryCounter GLEW_GET_FUN(__glewQueryCounter) + +#define GLEW_ARB_timer_query GLEW_GET_VAR(__GLEW_ARB_timer_query) + +#endif /* GL_ARB_timer_query */ + +/* ----------------------- GL_ARB_transform_feedback2 ---------------------- */ + +#ifndef GL_ARB_transform_feedback2 +#define GL_ARB_transform_feedback2 1 + +#define GL_TRANSFORM_FEEDBACK 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 + +typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); +typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids); +typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); +typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); + +#define glBindTransformFeedback GLEW_GET_FUN(__glewBindTransformFeedback) +#define glDeleteTransformFeedbacks GLEW_GET_FUN(__glewDeleteTransformFeedbacks) +#define glDrawTransformFeedback GLEW_GET_FUN(__glewDrawTransformFeedback) +#define glGenTransformFeedbacks GLEW_GET_FUN(__glewGenTransformFeedbacks) +#define glIsTransformFeedback GLEW_GET_FUN(__glewIsTransformFeedback) +#define glPauseTransformFeedback GLEW_GET_FUN(__glewPauseTransformFeedback) +#define glResumeTransformFeedback GLEW_GET_FUN(__glewResumeTransformFeedback) + +#define GLEW_ARB_transform_feedback2 GLEW_GET_VAR(__GLEW_ARB_transform_feedback2) + +#endif /* GL_ARB_transform_feedback2 */ + +/* ----------------------- GL_ARB_transform_feedback3 ---------------------- */ + +#ifndef GL_ARB_transform_feedback3 +#define GL_ARB_transform_feedback3 1 + +#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 +#define GL_MAX_VERTEX_STREAMS 0x8E71 + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); +typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); +typedef void (GLAPIENTRY * PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); + +#define glBeginQueryIndexed GLEW_GET_FUN(__glewBeginQueryIndexed) +#define glDrawTransformFeedbackStream GLEW_GET_FUN(__glewDrawTransformFeedbackStream) +#define glEndQueryIndexed GLEW_GET_FUN(__glewEndQueryIndexed) +#define glGetQueryIndexediv GLEW_GET_FUN(__glewGetQueryIndexediv) + +#define GLEW_ARB_transform_feedback3 GLEW_GET_VAR(__GLEW_ARB_transform_feedback3) + +#endif /* GL_ARB_transform_feedback3 */ + +/* ------------------ GL_ARB_transform_feedback_instanced ------------------ */ + +#ifndef GL_ARB_transform_feedback_instanced +#define GL_ARB_transform_feedback_instanced 1 + +typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei primcount); + +#define glDrawTransformFeedbackInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackInstanced) +#define glDrawTransformFeedbackStreamInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackStreamInstanced) + +#define GLEW_ARB_transform_feedback_instanced GLEW_GET_VAR(__GLEW_ARB_transform_feedback_instanced) + +#endif /* GL_ARB_transform_feedback_instanced */ + +/* ---------------- GL_ARB_transform_feedback_overflow_query --------------- */ + +#ifndef GL_ARB_transform_feedback_overflow_query +#define GL_ARB_transform_feedback_overflow_query 1 + +#define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC +#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED + +#define GLEW_ARB_transform_feedback_overflow_query GLEW_GET_VAR(__GLEW_ARB_transform_feedback_overflow_query) + +#endif /* GL_ARB_transform_feedback_overflow_query */ + +/* ------------------------ GL_ARB_transpose_matrix ------------------------ */ + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 + +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 + +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); + +#define glLoadTransposeMatrixdARB GLEW_GET_FUN(__glewLoadTransposeMatrixdARB) +#define glLoadTransposeMatrixfARB GLEW_GET_FUN(__glewLoadTransposeMatrixfARB) +#define glMultTransposeMatrixdARB GLEW_GET_FUN(__glewMultTransposeMatrixdARB) +#define glMultTransposeMatrixfARB GLEW_GET_FUN(__glewMultTransposeMatrixfARB) + +#define GLEW_ARB_transpose_matrix GLEW_GET_VAR(__GLEW_ARB_transpose_matrix) + +#endif /* GL_ARB_transpose_matrix */ + +/* ---------------------- GL_ARB_uniform_buffer_object --------------------- */ + +#ifndef GL_ARB_uniform_buffer_object +#define GL_ARB_uniform_buffer_object 1 + +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C +#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D +#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E +#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 +#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 +#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 +#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 +#define GL_INVALID_INDEX 0xFFFFFFFFu + +typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformName); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint* data); +typedef GLuint (GLAPIENTRY * PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar* uniformBlockName); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar* const * uniformNames, GLuint* uniformIndices); +typedef void (GLAPIENTRY * PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); + +#define glBindBufferBase GLEW_GET_FUN(__glewBindBufferBase) +#define glBindBufferRange GLEW_GET_FUN(__glewBindBufferRange) +#define glGetActiveUniformBlockName GLEW_GET_FUN(__glewGetActiveUniformBlockName) +#define glGetActiveUniformBlockiv GLEW_GET_FUN(__glewGetActiveUniformBlockiv) +#define glGetActiveUniformName GLEW_GET_FUN(__glewGetActiveUniformName) +#define glGetActiveUniformsiv GLEW_GET_FUN(__glewGetActiveUniformsiv) +#define glGetIntegeri_v GLEW_GET_FUN(__glewGetIntegeri_v) +#define glGetUniformBlockIndex GLEW_GET_FUN(__glewGetUniformBlockIndex) +#define glGetUniformIndices GLEW_GET_FUN(__glewGetUniformIndices) +#define glUniformBlockBinding GLEW_GET_FUN(__glewUniformBlockBinding) + +#define GLEW_ARB_uniform_buffer_object GLEW_GET_VAR(__GLEW_ARB_uniform_buffer_object) + +#endif /* GL_ARB_uniform_buffer_object */ + +/* ------------------------ GL_ARB_vertex_array_bgra ----------------------- */ + +#ifndef GL_ARB_vertex_array_bgra +#define GL_ARB_vertex_array_bgra 1 + +#define GL_BGRA 0x80E1 + +#define GLEW_ARB_vertex_array_bgra GLEW_GET_VAR(__GLEW_ARB_vertex_array_bgra) + +#endif /* GL_ARB_vertex_array_bgra */ + +/* ----------------------- GL_ARB_vertex_array_object ---------------------- */ + +#ifndef GL_ARB_vertex_array_object +#define GL_ARB_vertex_array_object 1 + +#define GL_VERTEX_ARRAY_BINDING 0x85B5 + +typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYPROC) (GLuint array); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint* arrays); +typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); +typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYPROC) (GLuint array); + +#define glBindVertexArray GLEW_GET_FUN(__glewBindVertexArray) +#define glDeleteVertexArrays GLEW_GET_FUN(__glewDeleteVertexArrays) +#define glGenVertexArrays GLEW_GET_FUN(__glewGenVertexArrays) +#define glIsVertexArray GLEW_GET_FUN(__glewIsVertexArray) + +#define GLEW_ARB_vertex_array_object GLEW_GET_VAR(__GLEW_ARB_vertex_array_object) + +#endif /* GL_ARB_vertex_array_object */ + +/* ----------------------- GL_ARB_vertex_attrib_64bit ---------------------- */ + +#ifndef GL_ARB_vertex_attrib_64bit +#define GL_ARB_vertex_attrib_64bit 1 + +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); + +#define glGetVertexAttribLdv GLEW_GET_FUN(__glewGetVertexAttribLdv) +#define glVertexAttribL1d GLEW_GET_FUN(__glewVertexAttribL1d) +#define glVertexAttribL1dv GLEW_GET_FUN(__glewVertexAttribL1dv) +#define glVertexAttribL2d GLEW_GET_FUN(__glewVertexAttribL2d) +#define glVertexAttribL2dv GLEW_GET_FUN(__glewVertexAttribL2dv) +#define glVertexAttribL3d GLEW_GET_FUN(__glewVertexAttribL3d) +#define glVertexAttribL3dv GLEW_GET_FUN(__glewVertexAttribL3dv) +#define glVertexAttribL4d GLEW_GET_FUN(__glewVertexAttribL4d) +#define glVertexAttribL4dv GLEW_GET_FUN(__glewVertexAttribL4dv) +#define glVertexAttribLPointer GLEW_GET_FUN(__glewVertexAttribLPointer) + +#define GLEW_ARB_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_64bit) + +#endif /* GL_ARB_vertex_attrib_64bit */ + +/* ---------------------- GL_ARB_vertex_attrib_binding --------------------- */ + +#ifndef GL_ARB_vertex_attrib_binding +#define GL_ARB_vertex_attrib_binding 1 + +#define GL_VERTEX_ATTRIB_BINDING 0x82D4 +#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 +#define GL_VERTEX_BINDING_DIVISOR 0x82D6 +#define GL_VERTEX_BINDING_OFFSET 0x82D7 +#define GL_VERTEX_BINDING_STRIDE 0x82D8 +#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 +#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA +#define GL_VERTEX_BINDING_BUFFER 0x8F4F + +typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); + +#define glBindVertexBuffer GLEW_GET_FUN(__glewBindVertexBuffer) +#define glVertexArrayBindVertexBufferEXT GLEW_GET_FUN(__glewVertexArrayBindVertexBufferEXT) +#define glVertexArrayVertexAttribBindingEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribBindingEXT) +#define glVertexArrayVertexAttribFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribFormatEXT) +#define glVertexArrayVertexAttribIFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIFormatEXT) +#define glVertexArrayVertexAttribLFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLFormatEXT) +#define glVertexArrayVertexBindingDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexBindingDivisorEXT) +#define glVertexAttribBinding GLEW_GET_FUN(__glewVertexAttribBinding) +#define glVertexAttribFormat GLEW_GET_FUN(__glewVertexAttribFormat) +#define glVertexAttribIFormat GLEW_GET_FUN(__glewVertexAttribIFormat) +#define glVertexAttribLFormat GLEW_GET_FUN(__glewVertexAttribLFormat) +#define glVertexBindingDivisor GLEW_GET_FUN(__glewVertexBindingDivisor) + +#define GLEW_ARB_vertex_attrib_binding GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_binding) + +#endif /* GL_ARB_vertex_attrib_binding */ + +/* -------------------------- GL_ARB_vertex_blend -------------------------- */ + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 + +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F + +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDARBPROC) (GLint count); +typedef void (GLAPIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); +typedef void (GLAPIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, GLbyte *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, GLdouble *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, GLfloat *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, GLint *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, GLshort *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, GLubyte *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, GLuint *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, GLushort *weights); + +#define glVertexBlendARB GLEW_GET_FUN(__glewVertexBlendARB) +#define glWeightPointerARB GLEW_GET_FUN(__glewWeightPointerARB) +#define glWeightbvARB GLEW_GET_FUN(__glewWeightbvARB) +#define glWeightdvARB GLEW_GET_FUN(__glewWeightdvARB) +#define glWeightfvARB GLEW_GET_FUN(__glewWeightfvARB) +#define glWeightivARB GLEW_GET_FUN(__glewWeightivARB) +#define glWeightsvARB GLEW_GET_FUN(__glewWeightsvARB) +#define glWeightubvARB GLEW_GET_FUN(__glewWeightubvARB) +#define glWeightuivARB GLEW_GET_FUN(__glewWeightuivARB) +#define glWeightusvARB GLEW_GET_FUN(__glewWeightusvARB) + +#define GLEW_ARB_vertex_blend GLEW_GET_VAR(__GLEW_ARB_vertex_blend) + +#endif /* GL_ARB_vertex_blend */ + +/* ---------------------- GL_ARB_vertex_buffer_object ---------------------- */ + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 + +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA + +typedef ptrdiff_t GLintptrARB; +typedef ptrdiff_t GLsizeiptrARB; + +typedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void** params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); +typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef void * (GLAPIENTRY * PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERARBPROC) (GLenum target); + +#define glBindBufferARB GLEW_GET_FUN(__glewBindBufferARB) +#define glBufferDataARB GLEW_GET_FUN(__glewBufferDataARB) +#define glBufferSubDataARB GLEW_GET_FUN(__glewBufferSubDataARB) +#define glDeleteBuffersARB GLEW_GET_FUN(__glewDeleteBuffersARB) +#define glGenBuffersARB GLEW_GET_FUN(__glewGenBuffersARB) +#define glGetBufferParameterivARB GLEW_GET_FUN(__glewGetBufferParameterivARB) +#define glGetBufferPointervARB GLEW_GET_FUN(__glewGetBufferPointervARB) +#define glGetBufferSubDataARB GLEW_GET_FUN(__glewGetBufferSubDataARB) +#define glIsBufferARB GLEW_GET_FUN(__glewIsBufferARB) +#define glMapBufferARB GLEW_GET_FUN(__glewMapBufferARB) +#define glUnmapBufferARB GLEW_GET_FUN(__glewUnmapBufferARB) + +#define GLEW_ARB_vertex_buffer_object GLEW_GET_VAR(__GLEW_ARB_vertex_buffer_object) + +#endif /* GL_ARB_vertex_buffer_object */ + +/* ------------------------- GL_ARB_vertex_program ------------------------- */ + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 + +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF + +typedef void (GLAPIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint* programs); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint* programs); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void** pointer); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); + +#define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB) +#define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB) +#define glDisableVertexAttribArrayARB GLEW_GET_FUN(__glewDisableVertexAttribArrayARB) +#define glEnableVertexAttribArrayARB GLEW_GET_FUN(__glewEnableVertexAttribArrayARB) +#define glGenProgramsARB GLEW_GET_FUN(__glewGenProgramsARB) +#define glGetProgramEnvParameterdvARB GLEW_GET_FUN(__glewGetProgramEnvParameterdvARB) +#define glGetProgramEnvParameterfvARB GLEW_GET_FUN(__glewGetProgramEnvParameterfvARB) +#define glGetProgramLocalParameterdvARB GLEW_GET_FUN(__glewGetProgramLocalParameterdvARB) +#define glGetProgramLocalParameterfvARB GLEW_GET_FUN(__glewGetProgramLocalParameterfvARB) +#define glGetProgramStringARB GLEW_GET_FUN(__glewGetProgramStringARB) +#define glGetProgramivARB GLEW_GET_FUN(__glewGetProgramivARB) +#define glGetVertexAttribPointervARB GLEW_GET_FUN(__glewGetVertexAttribPointervARB) +#define glGetVertexAttribdvARB GLEW_GET_FUN(__glewGetVertexAttribdvARB) +#define glGetVertexAttribfvARB GLEW_GET_FUN(__glewGetVertexAttribfvARB) +#define glGetVertexAttribivARB GLEW_GET_FUN(__glewGetVertexAttribivARB) +#define glIsProgramARB GLEW_GET_FUN(__glewIsProgramARB) +#define glProgramEnvParameter4dARB GLEW_GET_FUN(__glewProgramEnvParameter4dARB) +#define glProgramEnvParameter4dvARB GLEW_GET_FUN(__glewProgramEnvParameter4dvARB) +#define glProgramEnvParameter4fARB GLEW_GET_FUN(__glewProgramEnvParameter4fARB) +#define glProgramEnvParameter4fvARB GLEW_GET_FUN(__glewProgramEnvParameter4fvARB) +#define glProgramLocalParameter4dARB GLEW_GET_FUN(__glewProgramLocalParameter4dARB) +#define glProgramLocalParameter4dvARB GLEW_GET_FUN(__glewProgramLocalParameter4dvARB) +#define glProgramLocalParameter4fARB GLEW_GET_FUN(__glewProgramLocalParameter4fARB) +#define glProgramLocalParameter4fvARB GLEW_GET_FUN(__glewProgramLocalParameter4fvARB) +#define glProgramStringARB GLEW_GET_FUN(__glewProgramStringARB) +#define glVertexAttrib1dARB GLEW_GET_FUN(__glewVertexAttrib1dARB) +#define glVertexAttrib1dvARB GLEW_GET_FUN(__glewVertexAttrib1dvARB) +#define glVertexAttrib1fARB GLEW_GET_FUN(__glewVertexAttrib1fARB) +#define glVertexAttrib1fvARB GLEW_GET_FUN(__glewVertexAttrib1fvARB) +#define glVertexAttrib1sARB GLEW_GET_FUN(__glewVertexAttrib1sARB) +#define glVertexAttrib1svARB GLEW_GET_FUN(__glewVertexAttrib1svARB) +#define glVertexAttrib2dARB GLEW_GET_FUN(__glewVertexAttrib2dARB) +#define glVertexAttrib2dvARB GLEW_GET_FUN(__glewVertexAttrib2dvARB) +#define glVertexAttrib2fARB GLEW_GET_FUN(__glewVertexAttrib2fARB) +#define glVertexAttrib2fvARB GLEW_GET_FUN(__glewVertexAttrib2fvARB) +#define glVertexAttrib2sARB GLEW_GET_FUN(__glewVertexAttrib2sARB) +#define glVertexAttrib2svARB GLEW_GET_FUN(__glewVertexAttrib2svARB) +#define glVertexAttrib3dARB GLEW_GET_FUN(__glewVertexAttrib3dARB) +#define glVertexAttrib3dvARB GLEW_GET_FUN(__glewVertexAttrib3dvARB) +#define glVertexAttrib3fARB GLEW_GET_FUN(__glewVertexAttrib3fARB) +#define glVertexAttrib3fvARB GLEW_GET_FUN(__glewVertexAttrib3fvARB) +#define glVertexAttrib3sARB GLEW_GET_FUN(__glewVertexAttrib3sARB) +#define glVertexAttrib3svARB GLEW_GET_FUN(__glewVertexAttrib3svARB) +#define glVertexAttrib4NbvARB GLEW_GET_FUN(__glewVertexAttrib4NbvARB) +#define glVertexAttrib4NivARB GLEW_GET_FUN(__glewVertexAttrib4NivARB) +#define glVertexAttrib4NsvARB GLEW_GET_FUN(__glewVertexAttrib4NsvARB) +#define glVertexAttrib4NubARB GLEW_GET_FUN(__glewVertexAttrib4NubARB) +#define glVertexAttrib4NubvARB GLEW_GET_FUN(__glewVertexAttrib4NubvARB) +#define glVertexAttrib4NuivARB GLEW_GET_FUN(__glewVertexAttrib4NuivARB) +#define glVertexAttrib4NusvARB GLEW_GET_FUN(__glewVertexAttrib4NusvARB) +#define glVertexAttrib4bvARB GLEW_GET_FUN(__glewVertexAttrib4bvARB) +#define glVertexAttrib4dARB GLEW_GET_FUN(__glewVertexAttrib4dARB) +#define glVertexAttrib4dvARB GLEW_GET_FUN(__glewVertexAttrib4dvARB) +#define glVertexAttrib4fARB GLEW_GET_FUN(__glewVertexAttrib4fARB) +#define glVertexAttrib4fvARB GLEW_GET_FUN(__glewVertexAttrib4fvARB) +#define glVertexAttrib4ivARB GLEW_GET_FUN(__glewVertexAttrib4ivARB) +#define glVertexAttrib4sARB GLEW_GET_FUN(__glewVertexAttrib4sARB) +#define glVertexAttrib4svARB GLEW_GET_FUN(__glewVertexAttrib4svARB) +#define glVertexAttrib4ubvARB GLEW_GET_FUN(__glewVertexAttrib4ubvARB) +#define glVertexAttrib4uivARB GLEW_GET_FUN(__glewVertexAttrib4uivARB) +#define glVertexAttrib4usvARB GLEW_GET_FUN(__glewVertexAttrib4usvARB) +#define glVertexAttribPointerARB GLEW_GET_FUN(__glewVertexAttribPointerARB) + +#define GLEW_ARB_vertex_program GLEW_GET_VAR(__GLEW_ARB_vertex_program) + +#endif /* GL_ARB_vertex_program */ + +/* -------------------------- GL_ARB_vertex_shader ------------------------- */ + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 + +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A + +typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB* name); +typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); + +#define glBindAttribLocationARB GLEW_GET_FUN(__glewBindAttribLocationARB) +#define glGetActiveAttribARB GLEW_GET_FUN(__glewGetActiveAttribARB) +#define glGetAttribLocationARB GLEW_GET_FUN(__glewGetAttribLocationARB) + +#define GLEW_ARB_vertex_shader GLEW_GET_VAR(__GLEW_ARB_vertex_shader) + +#endif /* GL_ARB_vertex_shader */ + +/* ------------------- GL_ARB_vertex_type_10f_11f_11f_rev ------------------ */ + +#ifndef GL_ARB_vertex_type_10f_11f_11f_rev +#define GL_ARB_vertex_type_10f_11f_11f_rev 1 + +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B + +#define GLEW_ARB_vertex_type_10f_11f_11f_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_10f_11f_11f_rev) + +#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ + +/* ------------------- GL_ARB_vertex_type_2_10_10_10_rev ------------------- */ + +#ifndef GL_ARB_vertex_type_2_10_10_10_rev +#define GL_ARB_vertex_type_2_10_10_10_rev 1 + +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_INT_2_10_10_10_REV 0x8D9F + +typedef void (GLAPIENTRY * PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (GLAPIENTRY * PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint* color); +typedef void (GLAPIENTRY * PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); +typedef void (GLAPIENTRY * PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint* color); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint* color); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint* value); + +#define glColorP3ui GLEW_GET_FUN(__glewColorP3ui) +#define glColorP3uiv GLEW_GET_FUN(__glewColorP3uiv) +#define glColorP4ui GLEW_GET_FUN(__glewColorP4ui) +#define glColorP4uiv GLEW_GET_FUN(__glewColorP4uiv) +#define glMultiTexCoordP1ui GLEW_GET_FUN(__glewMultiTexCoordP1ui) +#define glMultiTexCoordP1uiv GLEW_GET_FUN(__glewMultiTexCoordP1uiv) +#define glMultiTexCoordP2ui GLEW_GET_FUN(__glewMultiTexCoordP2ui) +#define glMultiTexCoordP2uiv GLEW_GET_FUN(__glewMultiTexCoordP2uiv) +#define glMultiTexCoordP3ui GLEW_GET_FUN(__glewMultiTexCoordP3ui) +#define glMultiTexCoordP3uiv GLEW_GET_FUN(__glewMultiTexCoordP3uiv) +#define glMultiTexCoordP4ui GLEW_GET_FUN(__glewMultiTexCoordP4ui) +#define glMultiTexCoordP4uiv GLEW_GET_FUN(__glewMultiTexCoordP4uiv) +#define glNormalP3ui GLEW_GET_FUN(__glewNormalP3ui) +#define glNormalP3uiv GLEW_GET_FUN(__glewNormalP3uiv) +#define glSecondaryColorP3ui GLEW_GET_FUN(__glewSecondaryColorP3ui) +#define glSecondaryColorP3uiv GLEW_GET_FUN(__glewSecondaryColorP3uiv) +#define glTexCoordP1ui GLEW_GET_FUN(__glewTexCoordP1ui) +#define glTexCoordP1uiv GLEW_GET_FUN(__glewTexCoordP1uiv) +#define glTexCoordP2ui GLEW_GET_FUN(__glewTexCoordP2ui) +#define glTexCoordP2uiv GLEW_GET_FUN(__glewTexCoordP2uiv) +#define glTexCoordP3ui GLEW_GET_FUN(__glewTexCoordP3ui) +#define glTexCoordP3uiv GLEW_GET_FUN(__glewTexCoordP3uiv) +#define glTexCoordP4ui GLEW_GET_FUN(__glewTexCoordP4ui) +#define glTexCoordP4uiv GLEW_GET_FUN(__glewTexCoordP4uiv) +#define glVertexAttribP1ui GLEW_GET_FUN(__glewVertexAttribP1ui) +#define glVertexAttribP1uiv GLEW_GET_FUN(__glewVertexAttribP1uiv) +#define glVertexAttribP2ui GLEW_GET_FUN(__glewVertexAttribP2ui) +#define glVertexAttribP2uiv GLEW_GET_FUN(__glewVertexAttribP2uiv) +#define glVertexAttribP3ui GLEW_GET_FUN(__glewVertexAttribP3ui) +#define glVertexAttribP3uiv GLEW_GET_FUN(__glewVertexAttribP3uiv) +#define glVertexAttribP4ui GLEW_GET_FUN(__glewVertexAttribP4ui) +#define glVertexAttribP4uiv GLEW_GET_FUN(__glewVertexAttribP4uiv) +#define glVertexP2ui GLEW_GET_FUN(__glewVertexP2ui) +#define glVertexP2uiv GLEW_GET_FUN(__glewVertexP2uiv) +#define glVertexP3ui GLEW_GET_FUN(__glewVertexP3ui) +#define glVertexP3uiv GLEW_GET_FUN(__glewVertexP3uiv) +#define glVertexP4ui GLEW_GET_FUN(__glewVertexP4ui) +#define glVertexP4uiv GLEW_GET_FUN(__glewVertexP4uiv) + +#define GLEW_ARB_vertex_type_2_10_10_10_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_2_10_10_10_rev) + +#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ + +/* ------------------------- GL_ARB_viewport_array ------------------------- */ + +#ifndef GL_ARB_viewport_array +#define GL_ARB_viewport_array 1 + +#define GL_DEPTH_RANGE 0x0B70 +#define GL_VIEWPORT 0x0BA2 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_MAX_VIEWPORTS 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE 0x825D +#define GL_LAYER_PROVOKING_VERTEX 0x825E +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F +#define GL_UNDEFINED_VERTEX 0x8260 +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_PROVOKING_VERTEX 0x8E4F + +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLclampd * v); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLclampd n, GLclampd f); +typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble* data); +typedef void (GLAPIENTRY * PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat* data); +typedef void (GLAPIENTRY * PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint * v); +typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint * v); +typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat * v); +typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat * v); + +#define glDepthRangeArrayv GLEW_GET_FUN(__glewDepthRangeArrayv) +#define glDepthRangeIndexed GLEW_GET_FUN(__glewDepthRangeIndexed) +#define glGetDoublei_v GLEW_GET_FUN(__glewGetDoublei_v) +#define glGetFloati_v GLEW_GET_FUN(__glewGetFloati_v) +#define glScissorArrayv GLEW_GET_FUN(__glewScissorArrayv) +#define glScissorIndexed GLEW_GET_FUN(__glewScissorIndexed) +#define glScissorIndexedv GLEW_GET_FUN(__glewScissorIndexedv) +#define glViewportArrayv GLEW_GET_FUN(__glewViewportArrayv) +#define glViewportIndexedf GLEW_GET_FUN(__glewViewportIndexedf) +#define glViewportIndexedfv GLEW_GET_FUN(__glewViewportIndexedfv) + +#define GLEW_ARB_viewport_array GLEW_GET_VAR(__GLEW_ARB_viewport_array) + +#endif /* GL_ARB_viewport_array */ + +/* --------------------------- GL_ARB_window_pos --------------------------- */ + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 + +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort* p); + +#define glWindowPos2dARB GLEW_GET_FUN(__glewWindowPos2dARB) +#define glWindowPos2dvARB GLEW_GET_FUN(__glewWindowPos2dvARB) +#define glWindowPos2fARB GLEW_GET_FUN(__glewWindowPos2fARB) +#define glWindowPos2fvARB GLEW_GET_FUN(__glewWindowPos2fvARB) +#define glWindowPos2iARB GLEW_GET_FUN(__glewWindowPos2iARB) +#define glWindowPos2ivARB GLEW_GET_FUN(__glewWindowPos2ivARB) +#define glWindowPos2sARB GLEW_GET_FUN(__glewWindowPos2sARB) +#define glWindowPos2svARB GLEW_GET_FUN(__glewWindowPos2svARB) +#define glWindowPos3dARB GLEW_GET_FUN(__glewWindowPos3dARB) +#define glWindowPos3dvARB GLEW_GET_FUN(__glewWindowPos3dvARB) +#define glWindowPos3fARB GLEW_GET_FUN(__glewWindowPos3fARB) +#define glWindowPos3fvARB GLEW_GET_FUN(__glewWindowPos3fvARB) +#define glWindowPos3iARB GLEW_GET_FUN(__glewWindowPos3iARB) +#define glWindowPos3ivARB GLEW_GET_FUN(__glewWindowPos3ivARB) +#define glWindowPos3sARB GLEW_GET_FUN(__glewWindowPos3sARB) +#define glWindowPos3svARB GLEW_GET_FUN(__glewWindowPos3svARB) + +#define GLEW_ARB_window_pos GLEW_GET_VAR(__GLEW_ARB_window_pos) + +#endif /* GL_ARB_window_pos */ + +/* ----------------------- GL_ARM_mali_program_binary ---------------------- */ + +#ifndef GL_ARM_mali_program_binary +#define GL_ARM_mali_program_binary 1 + +#define GL_MALI_PROGRAM_BINARY_ARM 0x8F61 + +#define GLEW_ARM_mali_program_binary GLEW_GET_VAR(__GLEW_ARM_mali_program_binary) + +#endif /* GL_ARM_mali_program_binary */ + +/* ----------------------- GL_ARM_mali_shader_binary ----------------------- */ + +#ifndef GL_ARM_mali_shader_binary +#define GL_ARM_mali_shader_binary 1 + +#define GL_MALI_SHADER_BINARY_ARM 0x8F60 + +#define GLEW_ARM_mali_shader_binary GLEW_GET_VAR(__GLEW_ARM_mali_shader_binary) + +#endif /* GL_ARM_mali_shader_binary */ + +/* ------------------------------ GL_ARM_rgba8 ----------------------------- */ + +#ifndef GL_ARM_rgba8 +#define GL_ARM_rgba8 1 + +#define GL_RGBA8_OES 0x8058 + +#define GLEW_ARM_rgba8 GLEW_GET_VAR(__GLEW_ARM_rgba8) + +#endif /* GL_ARM_rgba8 */ + +/* -------------------- GL_ARM_shader_framebuffer_fetch -------------------- */ + +#ifndef GL_ARM_shader_framebuffer_fetch +#define GL_ARM_shader_framebuffer_fetch 1 + +#define GL_FETCH_PER_SAMPLE_ARM 0x8F65 +#define GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM 0x8F66 + +#define GLEW_ARM_shader_framebuffer_fetch GLEW_GET_VAR(__GLEW_ARM_shader_framebuffer_fetch) + +#endif /* GL_ARM_shader_framebuffer_fetch */ + +/* ------------- GL_ARM_shader_framebuffer_fetch_depth_stencil ------------- */ + +#ifndef GL_ARM_shader_framebuffer_fetch_depth_stencil +#define GL_ARM_shader_framebuffer_fetch_depth_stencil 1 + +#define GLEW_ARM_shader_framebuffer_fetch_depth_stencil GLEW_GET_VAR(__GLEW_ARM_shader_framebuffer_fetch_depth_stencil) + +#endif /* GL_ARM_shader_framebuffer_fetch_depth_stencil */ + +/* ------------------------- GL_ATIX_point_sprites ------------------------- */ + +#ifndef GL_ATIX_point_sprites +#define GL_ATIX_point_sprites 1 + +#define GL_TEXTURE_POINT_MODE_ATIX 0x60B0 +#define GL_TEXTURE_POINT_ONE_COORD_ATIX 0x60B1 +#define GL_TEXTURE_POINT_SPRITE_ATIX 0x60B2 +#define GL_POINT_SPRITE_CULL_MODE_ATIX 0x60B3 +#define GL_POINT_SPRITE_CULL_CENTER_ATIX 0x60B4 +#define GL_POINT_SPRITE_CULL_CLIP_ATIX 0x60B5 + +#define GLEW_ATIX_point_sprites GLEW_GET_VAR(__GLEW_ATIX_point_sprites) + +#endif /* GL_ATIX_point_sprites */ + +/* ---------------------- GL_ATIX_texture_env_combine3 --------------------- */ + +#ifndef GL_ATIX_texture_env_combine3 +#define GL_ATIX_texture_env_combine3 1 + +#define GL_MODULATE_ADD_ATIX 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATIX 0x8745 +#define GL_MODULATE_SUBTRACT_ATIX 0x8746 + +#define GLEW_ATIX_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATIX_texture_env_combine3) + +#endif /* GL_ATIX_texture_env_combine3 */ + +/* ----------------------- GL_ATIX_texture_env_route ----------------------- */ + +#ifndef GL_ATIX_texture_env_route +#define GL_ATIX_texture_env_route 1 + +#define GL_SECONDARY_COLOR_ATIX 0x8747 +#define GL_TEXTURE_OUTPUT_RGB_ATIX 0x8748 +#define GL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749 + +#define GLEW_ATIX_texture_env_route GLEW_GET_VAR(__GLEW_ATIX_texture_env_route) + +#endif /* GL_ATIX_texture_env_route */ + +/* ---------------- GL_ATIX_vertex_shader_output_point_size ---------------- */ + +#ifndef GL_ATIX_vertex_shader_output_point_size +#define GL_ATIX_vertex_shader_output_point_size 1 + +#define GL_OUTPUT_POINT_SIZE_ATIX 0x610E + +#define GLEW_ATIX_vertex_shader_output_point_size GLEW_GET_VAR(__GLEW_ATIX_vertex_shader_output_point_size) + +#endif /* GL_ATIX_vertex_shader_output_point_size */ + +/* -------------------------- GL_ATI_draw_buffers -------------------------- */ + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 + +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersATI GLEW_GET_FUN(__glewDrawBuffersATI) + +#define GLEW_ATI_draw_buffers GLEW_GET_VAR(__GLEW_ATI_draw_buffers) + +#endif /* GL_ATI_draw_buffers */ + +/* -------------------------- GL_ATI_element_array ------------------------- */ + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 + +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void *pointer); + +#define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI) +#define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI) +#define glElementPointerATI GLEW_GET_FUN(__glewElementPointerATI) + +#define GLEW_ATI_element_array GLEW_GET_VAR(__GLEW_ATI_element_array) + +#endif /* GL_ATI_element_array */ + +/* ------------------------- GL_ATI_envmap_bumpmap ------------------------- */ + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 + +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C + +typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); + +#define glGetTexBumpParameterfvATI GLEW_GET_FUN(__glewGetTexBumpParameterfvATI) +#define glGetTexBumpParameterivATI GLEW_GET_FUN(__glewGetTexBumpParameterivATI) +#define glTexBumpParameterfvATI GLEW_GET_FUN(__glewTexBumpParameterfvATI) +#define glTexBumpParameterivATI GLEW_GET_FUN(__glewTexBumpParameterivATI) + +#define GLEW_ATI_envmap_bumpmap GLEW_GET_VAR(__GLEW_ATI_envmap_bumpmap) + +#endif /* GL_ATI_envmap_bumpmap */ + +/* ------------------------- GL_ATI_fragment_shader ------------------------ */ + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 + +#define GL_2X_BIT_ATI 0x00000001 +#define GL_RED_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B + +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (GLAPIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (GLAPIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (GLAPIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (GLAPIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (GLAPIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (GLAPIENTRY * PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat* value); + +#define glAlphaFragmentOp1ATI GLEW_GET_FUN(__glewAlphaFragmentOp1ATI) +#define glAlphaFragmentOp2ATI GLEW_GET_FUN(__glewAlphaFragmentOp2ATI) +#define glAlphaFragmentOp3ATI GLEW_GET_FUN(__glewAlphaFragmentOp3ATI) +#define glBeginFragmentShaderATI GLEW_GET_FUN(__glewBeginFragmentShaderATI) +#define glBindFragmentShaderATI GLEW_GET_FUN(__glewBindFragmentShaderATI) +#define glColorFragmentOp1ATI GLEW_GET_FUN(__glewColorFragmentOp1ATI) +#define glColorFragmentOp2ATI GLEW_GET_FUN(__glewColorFragmentOp2ATI) +#define glColorFragmentOp3ATI GLEW_GET_FUN(__glewColorFragmentOp3ATI) +#define glDeleteFragmentShaderATI GLEW_GET_FUN(__glewDeleteFragmentShaderATI) +#define glEndFragmentShaderATI GLEW_GET_FUN(__glewEndFragmentShaderATI) +#define glGenFragmentShadersATI GLEW_GET_FUN(__glewGenFragmentShadersATI) +#define glPassTexCoordATI GLEW_GET_FUN(__glewPassTexCoordATI) +#define glSampleMapATI GLEW_GET_FUN(__glewSampleMapATI) +#define glSetFragmentShaderConstantATI GLEW_GET_FUN(__glewSetFragmentShaderConstantATI) + +#define GLEW_ATI_fragment_shader GLEW_GET_VAR(__GLEW_ATI_fragment_shader) + +#endif /* GL_ATI_fragment_shader */ + +/* ------------------------ GL_ATI_map_object_buffer ----------------------- */ + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 + +typedef void * (GLAPIENTRY * PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); + +#define glMapObjectBufferATI GLEW_GET_FUN(__glewMapObjectBufferATI) +#define glUnmapObjectBufferATI GLEW_GET_FUN(__glewUnmapObjectBufferATI) + +#define GLEW_ATI_map_object_buffer GLEW_GET_VAR(__GLEW_ATI_map_object_buffer) + +#endif /* GL_ATI_map_object_buffer */ + +/* ----------------------------- GL_ATI_meminfo ---------------------------- */ + +#ifndef GL_ATI_meminfo +#define GL_ATI_meminfo 1 + +#define GL_VBO_FREE_MEMORY_ATI 0x87FB +#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC +#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD + +#define GLEW_ATI_meminfo GLEW_GET_VAR(__GLEW_ATI_meminfo) + +#endif /* GL_ATI_meminfo */ + +/* -------------------------- GL_ATI_pn_triangles -------------------------- */ + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 + +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 + +typedef void (GLAPIENTRY * PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); + +#define glPNTrianglesfATI GLEW_GET_FUN(__glewPNTrianglesfATI) +#define glPNTrianglesiATI GLEW_GET_FUN(__glewPNTrianglesiATI) + +#define GLEW_ATI_pn_triangles GLEW_GET_VAR(__GLEW_ATI_pn_triangles) + +#endif /* GL_ATI_pn_triangles */ + +/* ------------------------ GL_ATI_separate_stencil ------------------------ */ + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 + +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 + +typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); + +#define glStencilFuncSeparateATI GLEW_GET_FUN(__glewStencilFuncSeparateATI) +#define glStencilOpSeparateATI GLEW_GET_FUN(__glewStencilOpSeparateATI) + +#define GLEW_ATI_separate_stencil GLEW_GET_VAR(__GLEW_ATI_separate_stencil) + +#endif /* GL_ATI_separate_stencil */ + +/* ----------------------- GL_ATI_shader_texture_lod ----------------------- */ + +#ifndef GL_ATI_shader_texture_lod +#define GL_ATI_shader_texture_lod 1 + +#define GLEW_ATI_shader_texture_lod GLEW_GET_VAR(__GLEW_ATI_shader_texture_lod) + +#endif /* GL_ATI_shader_texture_lod */ + +/* ---------------------- GL_ATI_text_fragment_shader ---------------------- */ + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 + +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 + +#define GLEW_ATI_text_fragment_shader GLEW_GET_VAR(__GLEW_ATI_text_fragment_shader) + +#endif /* GL_ATI_text_fragment_shader */ + +/* --------------------- GL_ATI_texture_compression_3dc -------------------- */ + +#ifndef GL_ATI_texture_compression_3dc +#define GL_ATI_texture_compression_3dc 1 + +#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837 + +#define GLEW_ATI_texture_compression_3dc GLEW_GET_VAR(__GLEW_ATI_texture_compression_3dc) + +#endif /* GL_ATI_texture_compression_3dc */ + +/* ---------------------- GL_ATI_texture_env_combine3 ---------------------- */ + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 + +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 + +#define GLEW_ATI_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATI_texture_env_combine3) + +#endif /* GL_ATI_texture_env_combine3 */ + +/* -------------------------- GL_ATI_texture_float ------------------------- */ + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 + +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F + +#define GLEW_ATI_texture_float GLEW_GET_VAR(__GLEW_ATI_texture_float) + +#endif /* GL_ATI_texture_float */ + +/* ----------------------- GL_ATI_texture_mirror_once ---------------------- */ + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 + +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 + +#define GLEW_ATI_texture_mirror_once GLEW_GET_VAR(__GLEW_ATI_texture_mirror_once) + +#endif /* GL_ATI_texture_mirror_once */ + +/* ----------------------- GL_ATI_vertex_array_object ---------------------- */ + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 + +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 + +typedef void (GLAPIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (GLAPIENTRY * PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void *pointer, GLenum usage); +typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); +typedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); + +#define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI) +#define glFreeObjectBufferATI GLEW_GET_FUN(__glewFreeObjectBufferATI) +#define glGetArrayObjectfvATI GLEW_GET_FUN(__glewGetArrayObjectfvATI) +#define glGetArrayObjectivATI GLEW_GET_FUN(__glewGetArrayObjectivATI) +#define glGetObjectBufferfvATI GLEW_GET_FUN(__glewGetObjectBufferfvATI) +#define glGetObjectBufferivATI GLEW_GET_FUN(__glewGetObjectBufferivATI) +#define glGetVariantArrayObjectfvATI GLEW_GET_FUN(__glewGetVariantArrayObjectfvATI) +#define glGetVariantArrayObjectivATI GLEW_GET_FUN(__glewGetVariantArrayObjectivATI) +#define glIsObjectBufferATI GLEW_GET_FUN(__glewIsObjectBufferATI) +#define glNewObjectBufferATI GLEW_GET_FUN(__glewNewObjectBufferATI) +#define glUpdateObjectBufferATI GLEW_GET_FUN(__glewUpdateObjectBufferATI) +#define glVariantArrayObjectATI GLEW_GET_FUN(__glewVariantArrayObjectATI) + +#define GLEW_ATI_vertex_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_array_object) + +#endif /* GL_ATI_vertex_array_object */ + +/* ------------------- GL_ATI_vertex_attrib_array_object ------------------- */ + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 + +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); + +#define glGetVertexAttribArrayObjectfvATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectfvATI) +#define glGetVertexAttribArrayObjectivATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectivATI) +#define glVertexAttribArrayObjectATI GLEW_GET_FUN(__glewVertexAttribArrayObjectATI) + +#define GLEW_ATI_vertex_attrib_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_attrib_array_object) + +#endif /* GL_ATI_vertex_attrib_array_object */ + +/* ------------------------- GL_ATI_vertex_streams ------------------------- */ + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 + +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_SOURCE_ATI 0x876C +#define GL_VERTEX_STREAM0_ATI 0x876D +#define GL_VERTEX_STREAM1_ATI 0x876E +#define GL_VERTEX_STREAM2_ATI 0x876F +#define GL_VERTEX_STREAM3_ATI 0x8770 +#define GL_VERTEX_STREAM4_ATI 0x8771 +#define GL_VERTEX_STREAM5_ATI 0x8772 +#define GL_VERTEX_STREAM6_ATI 0x8773 +#define GL_VERTEX_STREAM7_ATI 0x8774 + +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); + +#define glClientActiveVertexStreamATI GLEW_GET_FUN(__glewClientActiveVertexStreamATI) +#define glNormalStream3bATI GLEW_GET_FUN(__glewNormalStream3bATI) +#define glNormalStream3bvATI GLEW_GET_FUN(__glewNormalStream3bvATI) +#define glNormalStream3dATI GLEW_GET_FUN(__glewNormalStream3dATI) +#define glNormalStream3dvATI GLEW_GET_FUN(__glewNormalStream3dvATI) +#define glNormalStream3fATI GLEW_GET_FUN(__glewNormalStream3fATI) +#define glNormalStream3fvATI GLEW_GET_FUN(__glewNormalStream3fvATI) +#define glNormalStream3iATI GLEW_GET_FUN(__glewNormalStream3iATI) +#define glNormalStream3ivATI GLEW_GET_FUN(__glewNormalStream3ivATI) +#define glNormalStream3sATI GLEW_GET_FUN(__glewNormalStream3sATI) +#define glNormalStream3svATI GLEW_GET_FUN(__glewNormalStream3svATI) +#define glVertexBlendEnvfATI GLEW_GET_FUN(__glewVertexBlendEnvfATI) +#define glVertexBlendEnviATI GLEW_GET_FUN(__glewVertexBlendEnviATI) +#define glVertexStream1dATI GLEW_GET_FUN(__glewVertexStream1dATI) +#define glVertexStream1dvATI GLEW_GET_FUN(__glewVertexStream1dvATI) +#define glVertexStream1fATI GLEW_GET_FUN(__glewVertexStream1fATI) +#define glVertexStream1fvATI GLEW_GET_FUN(__glewVertexStream1fvATI) +#define glVertexStream1iATI GLEW_GET_FUN(__glewVertexStream1iATI) +#define glVertexStream1ivATI GLEW_GET_FUN(__glewVertexStream1ivATI) +#define glVertexStream1sATI GLEW_GET_FUN(__glewVertexStream1sATI) +#define glVertexStream1svATI GLEW_GET_FUN(__glewVertexStream1svATI) +#define glVertexStream2dATI GLEW_GET_FUN(__glewVertexStream2dATI) +#define glVertexStream2dvATI GLEW_GET_FUN(__glewVertexStream2dvATI) +#define glVertexStream2fATI GLEW_GET_FUN(__glewVertexStream2fATI) +#define glVertexStream2fvATI GLEW_GET_FUN(__glewVertexStream2fvATI) +#define glVertexStream2iATI GLEW_GET_FUN(__glewVertexStream2iATI) +#define glVertexStream2ivATI GLEW_GET_FUN(__glewVertexStream2ivATI) +#define glVertexStream2sATI GLEW_GET_FUN(__glewVertexStream2sATI) +#define glVertexStream2svATI GLEW_GET_FUN(__glewVertexStream2svATI) +#define glVertexStream3dATI GLEW_GET_FUN(__glewVertexStream3dATI) +#define glVertexStream3dvATI GLEW_GET_FUN(__glewVertexStream3dvATI) +#define glVertexStream3fATI GLEW_GET_FUN(__glewVertexStream3fATI) +#define glVertexStream3fvATI GLEW_GET_FUN(__glewVertexStream3fvATI) +#define glVertexStream3iATI GLEW_GET_FUN(__glewVertexStream3iATI) +#define glVertexStream3ivATI GLEW_GET_FUN(__glewVertexStream3ivATI) +#define glVertexStream3sATI GLEW_GET_FUN(__glewVertexStream3sATI) +#define glVertexStream3svATI GLEW_GET_FUN(__glewVertexStream3svATI) +#define glVertexStream4dATI GLEW_GET_FUN(__glewVertexStream4dATI) +#define glVertexStream4dvATI GLEW_GET_FUN(__glewVertexStream4dvATI) +#define glVertexStream4fATI GLEW_GET_FUN(__glewVertexStream4fATI) +#define glVertexStream4fvATI GLEW_GET_FUN(__glewVertexStream4fvATI) +#define glVertexStream4iATI GLEW_GET_FUN(__glewVertexStream4iATI) +#define glVertexStream4ivATI GLEW_GET_FUN(__glewVertexStream4ivATI) +#define glVertexStream4sATI GLEW_GET_FUN(__glewVertexStream4sATI) +#define glVertexStream4svATI GLEW_GET_FUN(__glewVertexStream4svATI) + +#define GLEW_ATI_vertex_streams GLEW_GET_VAR(__GLEW_ATI_vertex_streams) + +#endif /* GL_ATI_vertex_streams */ + +/* -------------------- GL_EGL_KHR_context_flush_control ------------------- */ + +#ifndef GL_EGL_KHR_context_flush_control +#define GL_EGL_KHR_context_flush_control 1 + +#define GLEW_EGL_KHR_context_flush_control GLEW_GET_VAR(__GLEW_EGL_KHR_context_flush_control) + +#endif /* GL_EGL_KHR_context_flush_control */ + +/* ---------------- GL_EGL_NV_robustness_video_memory_purge ---------------- */ + +#ifndef GL_EGL_NV_robustness_video_memory_purge +#define GL_EGL_NV_robustness_video_memory_purge 1 + +#define GL_EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x334C +#define GL_PURGED_CONTEXT_RESET_NV 0x92BB + +#define GLEW_EGL_NV_robustness_video_memory_purge GLEW_GET_VAR(__GLEW_EGL_NV_robustness_video_memory_purge) + +#endif /* GL_EGL_NV_robustness_video_memory_purge */ + +/* --------------------------- GL_EXT_422_pixels --------------------------- */ + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 + +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF + +#define GLEW_EXT_422_pixels GLEW_GET_VAR(__GLEW_EXT_422_pixels) + +#endif /* GL_EXT_422_pixels */ + +/* ---------------------------- GL_EXT_Cg_shader --------------------------- */ + +#ifndef GL_EXT_Cg_shader +#define GL_EXT_Cg_shader 1 + +#define GL_CG_VERTEX_SHADER_EXT 0x890E +#define GL_CG_FRAGMENT_SHADER_EXT 0x890F + +#define GLEW_EXT_Cg_shader GLEW_GET_VAR(__GLEW_EXT_Cg_shader) + +#endif /* GL_EXT_Cg_shader */ + +/* ------------------------- GL_EXT_EGL_image_array ------------------------ */ + +#ifndef GL_EXT_EGL_image_array +#define GL_EXT_EGL_image_array 1 + +#define GLEW_EXT_EGL_image_array GLEW_GET_VAR(__GLEW_EXT_EGL_image_array) + +#endif /* GL_EXT_EGL_image_array */ + +/* --------------------------- GL_EXT_YUV_target --------------------------- */ + +#ifndef GL_EXT_YUV_target +#define GL_EXT_YUV_target 1 + +#define GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT 0x8BE7 + +#define GLEW_EXT_YUV_target GLEW_GET_VAR(__GLEW_EXT_YUV_target) + +#endif /* GL_EXT_YUV_target */ + +/* ------------------------------ GL_EXT_abgr ------------------------------ */ + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 + +#define GL_ABGR_EXT 0x8000 + +#define GLEW_EXT_abgr GLEW_GET_VAR(__GLEW_EXT_abgr) + +#endif /* GL_EXT_abgr */ + +/* -------------------------- GL_EXT_base_instance ------------------------- */ + +#ifndef GL_EXT_base_instance +#define GL_EXT_base_instance 1 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); + +#define glDrawArraysInstancedBaseInstanceEXT GLEW_GET_FUN(__glewDrawArraysInstancedBaseInstanceEXT) +#define glDrawElementsInstancedBaseInstanceEXT GLEW_GET_FUN(__glewDrawElementsInstancedBaseInstanceEXT) +#define glDrawElementsInstancedBaseVertexBaseInstanceEXT GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexBaseInstanceEXT) + +#define GLEW_EXT_base_instance GLEW_GET_VAR(__GLEW_EXT_base_instance) + +#endif /* GL_EXT_base_instance */ + +/* ------------------------------ GL_EXT_bgra ------------------------------ */ + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 + +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 + +#define GLEW_EXT_bgra GLEW_GET_VAR(__GLEW_EXT_bgra) + +#endif /* GL_EXT_bgra */ + +/* ------------------------ GL_EXT_bindable_uniform ------------------------ */ + +#ifndef GL_EXT_bindable_uniform +#define GL_EXT_bindable_uniform 1 + +#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 +#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 +#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 +#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED +#define GL_UNIFORM_BUFFER_EXT 0x8DEE +#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF + +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); +typedef GLintptr (GLAPIENTRY * PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); +typedef void (GLAPIENTRY * PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); + +#define glGetUniformBufferSizeEXT GLEW_GET_FUN(__glewGetUniformBufferSizeEXT) +#define glGetUniformOffsetEXT GLEW_GET_FUN(__glewGetUniformOffsetEXT) +#define glUniformBufferEXT GLEW_GET_FUN(__glewUniformBufferEXT) + +#define GLEW_EXT_bindable_uniform GLEW_GET_VAR(__GLEW_EXT_bindable_uniform) + +#endif /* GL_EXT_bindable_uniform */ + +/* --------------------------- GL_EXT_blend_color -------------------------- */ + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 + +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 + +typedef void (GLAPIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); + +#define glBlendColorEXT GLEW_GET_FUN(__glewBlendColorEXT) + +#define GLEW_EXT_blend_color GLEW_GET_VAR(__GLEW_EXT_blend_color) + +#endif /* GL_EXT_blend_color */ + +/* --------------------- GL_EXT_blend_equation_separate -------------------- */ + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 + +#define GL_BLEND_EQUATION_RGB_EXT 0x8009 +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); + +#define glBlendEquationSeparateEXT GLEW_GET_FUN(__glewBlendEquationSeparateEXT) + +#define GLEW_EXT_blend_equation_separate GLEW_GET_VAR(__GLEW_EXT_blend_equation_separate) + +#endif /* GL_EXT_blend_equation_separate */ + +/* ----------------------- GL_EXT_blend_func_extended ---------------------- */ + +#ifndef GL_EXT_blend_func_extended +#define GL_EXT_blend_func_extended 1 + +#define GL_SRC_ALPHA_SATURATE_EXT 0x0308 +#define GL_SRC1_ALPHA_EXT 0x8589 +#define GL_SRC1_COLOR_EXT 0x88F9 +#define GL_ONE_MINUS_SRC1_COLOR_EXT 0x88FA +#define GL_ONE_MINUS_SRC1_ALPHA_EXT 0x88FB +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT 0x88FC +#define GL_LOCATION_INDEX_EXT 0x930F + +typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXEXTPROC) (GLuint program, const GLchar * name); +typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC) (GLuint program, GLenum programInterface, const GLchar* name); + +#define glBindFragDataLocationIndexedEXT GLEW_GET_FUN(__glewBindFragDataLocationIndexedEXT) +#define glGetFragDataIndexEXT GLEW_GET_FUN(__glewGetFragDataIndexEXT) +#define glGetProgramResourceLocationIndexEXT GLEW_GET_FUN(__glewGetProgramResourceLocationIndexEXT) + +#define GLEW_EXT_blend_func_extended GLEW_GET_VAR(__GLEW_EXT_blend_func_extended) + +#endif /* GL_EXT_blend_func_extended */ + +/* ----------------------- GL_EXT_blend_func_separate ---------------------- */ + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 + +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB + +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + +#define glBlendFuncSeparateEXT GLEW_GET_FUN(__glewBlendFuncSeparateEXT) + +#define GLEW_EXT_blend_func_separate GLEW_GET_VAR(__GLEW_EXT_blend_func_separate) + +#endif /* GL_EXT_blend_func_separate */ + +/* ------------------------- GL_EXT_blend_logic_op ------------------------- */ + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 + +#define GLEW_EXT_blend_logic_op GLEW_GET_VAR(__GLEW_EXT_blend_logic_op) + +#endif /* GL_EXT_blend_logic_op */ + +/* -------------------------- GL_EXT_blend_minmax -------------------------- */ + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 + +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_BLEND_EQUATION_EXT 0x8009 + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); + +#define glBlendEquationEXT GLEW_GET_FUN(__glewBlendEquationEXT) + +#define GLEW_EXT_blend_minmax GLEW_GET_VAR(__GLEW_EXT_blend_minmax) + +#endif /* GL_EXT_blend_minmax */ + +/* ------------------------- GL_EXT_blend_subtract ------------------------- */ + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 + +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B + +#define GLEW_EXT_blend_subtract GLEW_GET_VAR(__GLEW_EXT_blend_subtract) + +#endif /* GL_EXT_blend_subtract */ + +/* ------------------------- GL_EXT_buffer_storage ------------------------- */ + +#ifndef GL_EXT_buffer_storage +#define GL_EXT_buffer_storage 1 + +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_PERSISTENT_BIT_EXT 0x0040 +#define GL_MAP_COHERENT_BIT_EXT 0x0080 +#define GL_DYNAMIC_STORAGE_BIT_EXT 0x0100 +#define GL_CLIENT_STORAGE_BIT_EXT 0x0200 +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT 0x00004000 +#define GL_BUFFER_IMMUTABLE_STORAGE_EXT 0x821F +#define GL_BUFFER_STORAGE_FLAGS_EXT 0x8220 + +typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEEXTPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); + +#define glBufferStorageEXT GLEW_GET_FUN(__glewBufferStorageEXT) +#define glNamedBufferStorageEXT GLEW_GET_FUN(__glewNamedBufferStorageEXT) + +#define GLEW_EXT_buffer_storage GLEW_GET_VAR(__GLEW_EXT_buffer_storage) + +#endif /* GL_EXT_buffer_storage */ + +/* -------------------------- GL_EXT_clear_texture ------------------------- */ + +#ifndef GL_EXT_clear_texture +#define GL_EXT_clear_texture 1 + +typedef void (GLAPIENTRY * PFNGLCLEARTEXIMAGEEXTPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARTEXSUBIMAGEEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); + +#define glClearTexImageEXT GLEW_GET_FUN(__glewClearTexImageEXT) +#define glClearTexSubImageEXT GLEW_GET_FUN(__glewClearTexSubImageEXT) + +#define GLEW_EXT_clear_texture GLEW_GET_VAR(__GLEW_EXT_clear_texture) + +#endif /* GL_EXT_clear_texture */ + +/* ----------------------- GL_EXT_clip_cull_distance ----------------------- */ + +#ifndef GL_EXT_clip_cull_distance +#define GL_EXT_clip_cull_distance 1 + +#define GL_MAX_CLIP_DISTANCES_EXT 0x0D32 +#define GL_CLIP_DISTANCE0_EXT 0x3000 +#define GL_CLIP_DISTANCE1_EXT 0x3001 +#define GL_CLIP_DISTANCE2_EXT 0x3002 +#define GL_CLIP_DISTANCE3_EXT 0x3003 +#define GL_CLIP_DISTANCE4_EXT 0x3004 +#define GL_CLIP_DISTANCE5_EXT 0x3005 +#define GL_CLIP_DISTANCE6_EXT 0x3006 +#define GL_CLIP_DISTANCE7_EXT 0x3007 +#define GL_MAX_CULL_DISTANCES_EXT 0x82F9 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT 0x82FA + +#define GLEW_EXT_clip_cull_distance GLEW_GET_VAR(__GLEW_EXT_clip_cull_distance) + +#endif /* GL_EXT_clip_cull_distance */ + +/* ------------------------ GL_EXT_clip_volume_hint ------------------------ */ + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 + +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 + +#define GLEW_EXT_clip_volume_hint GLEW_GET_VAR(__GLEW_EXT_clip_volume_hint) + +#endif /* GL_EXT_clip_volume_hint */ + +/* ------------------------------ GL_EXT_cmyka ----------------------------- */ + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 + +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F + +#define GLEW_EXT_cmyka GLEW_GET_VAR(__GLEW_EXT_cmyka) + +#endif /* GL_EXT_cmyka */ + +/* ----------------------- GL_EXT_color_buffer_float ----------------------- */ + +#ifndef GL_EXT_color_buffer_float +#define GL_EXT_color_buffer_float 1 + +#define GLEW_EXT_color_buffer_float GLEW_GET_VAR(__GLEW_EXT_color_buffer_float) + +#endif /* GL_EXT_color_buffer_float */ + +/* --------------------- GL_EXT_color_buffer_half_float -------------------- */ + +#ifndef GL_EXT_color_buffer_half_float +#define GL_EXT_color_buffer_half_float 1 + +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211 +#define GL_R16F_EXT 0x822D +#define GL_RG16F_EXT 0x822F +#define GL_RGBA16F_EXT 0x881A +#define GL_RGB16F_EXT 0x881B +#define GL_UNSIGNED_NORMALIZED_EXT 0x8C17 + +#define GLEW_EXT_color_buffer_half_float GLEW_GET_VAR(__GLEW_EXT_color_buffer_half_float) + +#endif /* GL_EXT_color_buffer_half_float */ + +/* ------------------------- GL_EXT_color_subtable ------------------------- */ + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 + +typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); + +#define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT) +#define glCopyColorSubTableEXT GLEW_GET_FUN(__glewCopyColorSubTableEXT) + +#define GLEW_EXT_color_subtable GLEW_GET_VAR(__GLEW_EXT_color_subtable) + +#endif /* GL_EXT_color_subtable */ + +/* ---------------------- GL_EXT_compiled_vertex_array --------------------- */ + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 + +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 + +typedef void (GLAPIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); + +#define glLockArraysEXT GLEW_GET_FUN(__glewLockArraysEXT) +#define glUnlockArraysEXT GLEW_GET_FUN(__glewUnlockArraysEXT) + +#define GLEW_EXT_compiled_vertex_array GLEW_GET_VAR(__GLEW_EXT_compiled_vertex_array) + +#endif /* GL_EXT_compiled_vertex_array */ + +/* ---------------- GL_EXT_compressed_ETC1_RGB8_sub_texture ---------------- */ + +#ifndef GL_EXT_compressed_ETC1_RGB8_sub_texture +#define GL_EXT_compressed_ETC1_RGB8_sub_texture 1 + +#define GLEW_EXT_compressed_ETC1_RGB8_sub_texture GLEW_GET_VAR(__GLEW_EXT_compressed_ETC1_RGB8_sub_texture) + +#endif /* GL_EXT_compressed_ETC1_RGB8_sub_texture */ + +/* ----------------------- GL_EXT_conservative_depth ----------------------- */ + +#ifndef GL_EXT_conservative_depth +#define GL_EXT_conservative_depth 1 + +#define GLEW_EXT_conservative_depth GLEW_GET_VAR(__GLEW_EXT_conservative_depth) + +#endif /* GL_EXT_conservative_depth */ + +/* --------------------------- GL_EXT_convolution -------------------------- */ + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 + +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 + +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *image); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); + +#define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT) +#define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT) +#define glConvolutionParameterfEXT GLEW_GET_FUN(__glewConvolutionParameterfEXT) +#define glConvolutionParameterfvEXT GLEW_GET_FUN(__glewConvolutionParameterfvEXT) +#define glConvolutionParameteriEXT GLEW_GET_FUN(__glewConvolutionParameteriEXT) +#define glConvolutionParameterivEXT GLEW_GET_FUN(__glewConvolutionParameterivEXT) +#define glCopyConvolutionFilter1DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter1DEXT) +#define glCopyConvolutionFilter2DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter2DEXT) +#define glGetConvolutionFilterEXT GLEW_GET_FUN(__glewGetConvolutionFilterEXT) +#define glGetConvolutionParameterfvEXT GLEW_GET_FUN(__glewGetConvolutionParameterfvEXT) +#define glGetConvolutionParameterivEXT GLEW_GET_FUN(__glewGetConvolutionParameterivEXT) +#define glGetSeparableFilterEXT GLEW_GET_FUN(__glewGetSeparableFilterEXT) +#define glSeparableFilter2DEXT GLEW_GET_FUN(__glewSeparableFilter2DEXT) + +#define GLEW_EXT_convolution GLEW_GET_VAR(__GLEW_EXT_convolution) + +#endif /* GL_EXT_convolution */ + +/* ------------------------ GL_EXT_coordinate_frame ------------------------ */ + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 + +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 + +typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, void *pointer); +typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, void *pointer); + +#define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT) +#define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT) + +#define GLEW_EXT_coordinate_frame GLEW_GET_VAR(__GLEW_EXT_coordinate_frame) + +#endif /* GL_EXT_coordinate_frame */ + +/* --------------------------- GL_EXT_copy_image --------------------------- */ + +#ifndef GL_EXT_copy_image +#define GL_EXT_copy_image 1 + +typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATAEXTPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); + +#define glCopyImageSubDataEXT GLEW_GET_FUN(__glewCopyImageSubDataEXT) + +#define GLEW_EXT_copy_image GLEW_GET_VAR(__GLEW_EXT_copy_image) + +#endif /* GL_EXT_copy_image */ + +/* -------------------------- GL_EXT_copy_texture -------------------------- */ + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 + +typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + +#define glCopyTexImage1DEXT GLEW_GET_FUN(__glewCopyTexImage1DEXT) +#define glCopyTexImage2DEXT GLEW_GET_FUN(__glewCopyTexImage2DEXT) +#define glCopyTexSubImage1DEXT GLEW_GET_FUN(__glewCopyTexSubImage1DEXT) +#define glCopyTexSubImage2DEXT GLEW_GET_FUN(__glewCopyTexSubImage2DEXT) +#define glCopyTexSubImage3DEXT GLEW_GET_FUN(__glewCopyTexSubImage3DEXT) + +#define GLEW_EXT_copy_texture GLEW_GET_VAR(__GLEW_EXT_copy_texture) + +#endif /* GL_EXT_copy_texture */ + +/* --------------------------- GL_EXT_cull_vertex -------------------------- */ + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 + +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC + +typedef void (GLAPIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params); + +#define glCullParameterdvEXT GLEW_GET_FUN(__glewCullParameterdvEXT) +#define glCullParameterfvEXT GLEW_GET_FUN(__glewCullParameterfvEXT) + +#define GLEW_EXT_cull_vertex GLEW_GET_VAR(__GLEW_EXT_cull_vertex) + +#endif /* GL_EXT_cull_vertex */ + +/* --------------------------- GL_EXT_debug_label -------------------------- */ + +#ifndef GL_EXT_debug_label +#define GL_EXT_debug_label 1 + +#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F +#define GL_PROGRAM_OBJECT_EXT 0x8B40 +#define GL_SHADER_OBJECT_EXT 0x8B48 +#define GL_BUFFER_OBJECT_EXT 0x9151 +#define GL_QUERY_OBJECT_EXT 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 + +typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei* length, GLchar *label); +typedef void (GLAPIENTRY * PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar* label); + +#define glGetObjectLabelEXT GLEW_GET_FUN(__glewGetObjectLabelEXT) +#define glLabelObjectEXT GLEW_GET_FUN(__glewLabelObjectEXT) + +#define GLEW_EXT_debug_label GLEW_GET_VAR(__GLEW_EXT_debug_label) + +#endif /* GL_EXT_debug_label */ + +/* -------------------------- GL_EXT_debug_marker -------------------------- */ + +#ifndef GL_EXT_debug_marker +#define GL_EXT_debug_marker 1 + +typedef void (GLAPIENTRY * PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar* marker); +typedef void (GLAPIENTRY * PFNGLPOPGROUPMARKEREXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar* marker); + +#define glInsertEventMarkerEXT GLEW_GET_FUN(__glewInsertEventMarkerEXT) +#define glPopGroupMarkerEXT GLEW_GET_FUN(__glewPopGroupMarkerEXT) +#define glPushGroupMarkerEXT GLEW_GET_FUN(__glewPushGroupMarkerEXT) + +#define GLEW_EXT_debug_marker GLEW_GET_VAR(__GLEW_EXT_debug_marker) + +#endif /* GL_EXT_debug_marker */ + +/* ------------------------ GL_EXT_depth_bounds_test ----------------------- */ + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 + +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 + +typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); + +#define glDepthBoundsEXT GLEW_GET_FUN(__glewDepthBoundsEXT) + +#define GLEW_EXT_depth_bounds_test GLEW_GET_VAR(__GLEW_EXT_depth_bounds_test) + +#endif /* GL_EXT_depth_bounds_test */ + +/* ----------------------- GL_EXT_direct_state_access ---------------------- */ + +#ifndef GL_EXT_direct_state_access +#define GL_EXT_direct_state_access 1 + +#define GL_PROGRAM_MATRIX_EXT 0x8E2D +#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E +#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F + +typedef void (GLAPIENTRY * PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); +typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); +typedef void (GLAPIENTRY * PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (GLAPIENTRY * PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); +typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, void *img); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, void *img); +typedef void (GLAPIENTRY * PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void** params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void** params); +typedef void (GLAPIENTRY * PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void** params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void** param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void** param); +typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); +typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GLAPIENTRY * PFNGLMATRIXFRUSTUMEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum matrixMode); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADDEXTPROC) (GLenum matrixMode, const GLdouble* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADFEXTPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTDEXTPROC) (GLenum matrixMode, const GLdouble* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTFEXTPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXORTHOEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); +typedef void (GLAPIENTRY * PFNGLMATRIXPOPEXTPROC) (GLenum matrixMode); +typedef void (GLAPIENTRY * PFNGLMATRIXPUSHEXTPROC) (GLenum matrixMode); +typedef void (GLAPIENTRY * PFNGLMATRIXROTATEDEXTPROC) (GLenum matrixMode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLMATRIXROTATEFEXTPROC) (GLenum matrixMode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLMATRIXSCALEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLMATRIXSCALEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* param); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* param); +typedef void (GLAPIENTRY * PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (GLAPIENTRY * PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat* param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* param); +typedef void (GLAPIENTRY * PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); + +#define glBindMultiTextureEXT GLEW_GET_FUN(__glewBindMultiTextureEXT) +#define glCheckNamedFramebufferStatusEXT GLEW_GET_FUN(__glewCheckNamedFramebufferStatusEXT) +#define glClientAttribDefaultEXT GLEW_GET_FUN(__glewClientAttribDefaultEXT) +#define glCompressedMultiTexImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage1DEXT) +#define glCompressedMultiTexImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage2DEXT) +#define glCompressedMultiTexImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage3DEXT) +#define glCompressedMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage1DEXT) +#define glCompressedMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage2DEXT) +#define glCompressedMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage3DEXT) +#define glCompressedTextureImage1DEXT GLEW_GET_FUN(__glewCompressedTextureImage1DEXT) +#define glCompressedTextureImage2DEXT GLEW_GET_FUN(__glewCompressedTextureImage2DEXT) +#define glCompressedTextureImage3DEXT GLEW_GET_FUN(__glewCompressedTextureImage3DEXT) +#define glCompressedTextureSubImage1DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage1DEXT) +#define glCompressedTextureSubImage2DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage2DEXT) +#define glCompressedTextureSubImage3DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage3DEXT) +#define glCopyMultiTexImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexImage1DEXT) +#define glCopyMultiTexImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexImage2DEXT) +#define glCopyMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage1DEXT) +#define glCopyMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage2DEXT) +#define glCopyMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage3DEXT) +#define glCopyTextureImage1DEXT GLEW_GET_FUN(__glewCopyTextureImage1DEXT) +#define glCopyTextureImage2DEXT GLEW_GET_FUN(__glewCopyTextureImage2DEXT) +#define glCopyTextureSubImage1DEXT GLEW_GET_FUN(__glewCopyTextureSubImage1DEXT) +#define glCopyTextureSubImage2DEXT GLEW_GET_FUN(__glewCopyTextureSubImage2DEXT) +#define glCopyTextureSubImage3DEXT GLEW_GET_FUN(__glewCopyTextureSubImage3DEXT) +#define glDisableClientStateIndexedEXT GLEW_GET_FUN(__glewDisableClientStateIndexedEXT) +#define glDisableClientStateiEXT GLEW_GET_FUN(__glewDisableClientStateiEXT) +#define glDisableVertexArrayAttribEXT GLEW_GET_FUN(__glewDisableVertexArrayAttribEXT) +#define glDisableVertexArrayEXT GLEW_GET_FUN(__glewDisableVertexArrayEXT) +#define glEnableClientStateIndexedEXT GLEW_GET_FUN(__glewEnableClientStateIndexedEXT) +#define glEnableClientStateiEXT GLEW_GET_FUN(__glewEnableClientStateiEXT) +#define glEnableVertexArrayAttribEXT GLEW_GET_FUN(__glewEnableVertexArrayAttribEXT) +#define glEnableVertexArrayEXT GLEW_GET_FUN(__glewEnableVertexArrayEXT) +#define glFlushMappedNamedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedNamedBufferRangeEXT) +#define glFramebufferDrawBufferEXT GLEW_GET_FUN(__glewFramebufferDrawBufferEXT) +#define glFramebufferDrawBuffersEXT GLEW_GET_FUN(__glewFramebufferDrawBuffersEXT) +#define glFramebufferReadBufferEXT GLEW_GET_FUN(__glewFramebufferReadBufferEXT) +#define glGenerateMultiTexMipmapEXT GLEW_GET_FUN(__glewGenerateMultiTexMipmapEXT) +#define glGenerateTextureMipmapEXT GLEW_GET_FUN(__glewGenerateTextureMipmapEXT) +#define glGetCompressedMultiTexImageEXT GLEW_GET_FUN(__glewGetCompressedMultiTexImageEXT) +#define glGetCompressedTextureImageEXT GLEW_GET_FUN(__glewGetCompressedTextureImageEXT) +#define glGetDoubleIndexedvEXT GLEW_GET_FUN(__glewGetDoubleIndexedvEXT) +#define glGetDoublei_vEXT GLEW_GET_FUN(__glewGetDoublei_vEXT) +#define glGetFloatIndexedvEXT GLEW_GET_FUN(__glewGetFloatIndexedvEXT) +#define glGetFloati_vEXT GLEW_GET_FUN(__glewGetFloati_vEXT) +#define glGetFramebufferParameterivEXT GLEW_GET_FUN(__glewGetFramebufferParameterivEXT) +#define glGetMultiTexEnvfvEXT GLEW_GET_FUN(__glewGetMultiTexEnvfvEXT) +#define glGetMultiTexEnvivEXT GLEW_GET_FUN(__glewGetMultiTexEnvivEXT) +#define glGetMultiTexGendvEXT GLEW_GET_FUN(__glewGetMultiTexGendvEXT) +#define glGetMultiTexGenfvEXT GLEW_GET_FUN(__glewGetMultiTexGenfvEXT) +#define glGetMultiTexGenivEXT GLEW_GET_FUN(__glewGetMultiTexGenivEXT) +#define glGetMultiTexImageEXT GLEW_GET_FUN(__glewGetMultiTexImageEXT) +#define glGetMultiTexLevelParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterfvEXT) +#define glGetMultiTexLevelParameterivEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterivEXT) +#define glGetMultiTexParameterIivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIivEXT) +#define glGetMultiTexParameterIuivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIuivEXT) +#define glGetMultiTexParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexParameterfvEXT) +#define glGetMultiTexParameterivEXT GLEW_GET_FUN(__glewGetMultiTexParameterivEXT) +#define glGetNamedBufferParameterivEXT GLEW_GET_FUN(__glewGetNamedBufferParameterivEXT) +#define glGetNamedBufferPointervEXT GLEW_GET_FUN(__glewGetNamedBufferPointervEXT) +#define glGetNamedBufferSubDataEXT GLEW_GET_FUN(__glewGetNamedBufferSubDataEXT) +#define glGetNamedFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameterivEXT) +#define glGetNamedProgramLocalParameterIivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIivEXT) +#define glGetNamedProgramLocalParameterIuivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIuivEXT) +#define glGetNamedProgramLocalParameterdvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterdvEXT) +#define glGetNamedProgramLocalParameterfvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterfvEXT) +#define glGetNamedProgramStringEXT GLEW_GET_FUN(__glewGetNamedProgramStringEXT) +#define glGetNamedProgramivEXT GLEW_GET_FUN(__glewGetNamedProgramivEXT) +#define glGetNamedRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetNamedRenderbufferParameterivEXT) +#define glGetPointerIndexedvEXT GLEW_GET_FUN(__glewGetPointerIndexedvEXT) +#define glGetPointeri_vEXT GLEW_GET_FUN(__glewGetPointeri_vEXT) +#define glGetTextureImageEXT GLEW_GET_FUN(__glewGetTextureImageEXT) +#define glGetTextureLevelParameterfvEXT GLEW_GET_FUN(__glewGetTextureLevelParameterfvEXT) +#define glGetTextureLevelParameterivEXT GLEW_GET_FUN(__glewGetTextureLevelParameterivEXT) +#define glGetTextureParameterIivEXT GLEW_GET_FUN(__glewGetTextureParameterIivEXT) +#define glGetTextureParameterIuivEXT GLEW_GET_FUN(__glewGetTextureParameterIuivEXT) +#define glGetTextureParameterfvEXT GLEW_GET_FUN(__glewGetTextureParameterfvEXT) +#define glGetTextureParameterivEXT GLEW_GET_FUN(__glewGetTextureParameterivEXT) +#define glGetVertexArrayIntegeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayIntegeri_vEXT) +#define glGetVertexArrayIntegervEXT GLEW_GET_FUN(__glewGetVertexArrayIntegervEXT) +#define glGetVertexArrayPointeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayPointeri_vEXT) +#define glGetVertexArrayPointervEXT GLEW_GET_FUN(__glewGetVertexArrayPointervEXT) +#define glMapNamedBufferEXT GLEW_GET_FUN(__glewMapNamedBufferEXT) +#define glMapNamedBufferRangeEXT GLEW_GET_FUN(__glewMapNamedBufferRangeEXT) +#define glMatrixFrustumEXT GLEW_GET_FUN(__glewMatrixFrustumEXT) +#define glMatrixLoadIdentityEXT GLEW_GET_FUN(__glewMatrixLoadIdentityEXT) +#define glMatrixLoadTransposedEXT GLEW_GET_FUN(__glewMatrixLoadTransposedEXT) +#define glMatrixLoadTransposefEXT GLEW_GET_FUN(__glewMatrixLoadTransposefEXT) +#define glMatrixLoaddEXT GLEW_GET_FUN(__glewMatrixLoaddEXT) +#define glMatrixLoadfEXT GLEW_GET_FUN(__glewMatrixLoadfEXT) +#define glMatrixMultTransposedEXT GLEW_GET_FUN(__glewMatrixMultTransposedEXT) +#define glMatrixMultTransposefEXT GLEW_GET_FUN(__glewMatrixMultTransposefEXT) +#define glMatrixMultdEXT GLEW_GET_FUN(__glewMatrixMultdEXT) +#define glMatrixMultfEXT GLEW_GET_FUN(__glewMatrixMultfEXT) +#define glMatrixOrthoEXT GLEW_GET_FUN(__glewMatrixOrthoEXT) +#define glMatrixPopEXT GLEW_GET_FUN(__glewMatrixPopEXT) +#define glMatrixPushEXT GLEW_GET_FUN(__glewMatrixPushEXT) +#define glMatrixRotatedEXT GLEW_GET_FUN(__glewMatrixRotatedEXT) +#define glMatrixRotatefEXT GLEW_GET_FUN(__glewMatrixRotatefEXT) +#define glMatrixScaledEXT GLEW_GET_FUN(__glewMatrixScaledEXT) +#define glMatrixScalefEXT GLEW_GET_FUN(__glewMatrixScalefEXT) +#define glMatrixTranslatedEXT GLEW_GET_FUN(__glewMatrixTranslatedEXT) +#define glMatrixTranslatefEXT GLEW_GET_FUN(__glewMatrixTranslatefEXT) +#define glMultiTexBufferEXT GLEW_GET_FUN(__glewMultiTexBufferEXT) +#define glMultiTexCoordPointerEXT GLEW_GET_FUN(__glewMultiTexCoordPointerEXT) +#define glMultiTexEnvfEXT GLEW_GET_FUN(__glewMultiTexEnvfEXT) +#define glMultiTexEnvfvEXT GLEW_GET_FUN(__glewMultiTexEnvfvEXT) +#define glMultiTexEnviEXT GLEW_GET_FUN(__glewMultiTexEnviEXT) +#define glMultiTexEnvivEXT GLEW_GET_FUN(__glewMultiTexEnvivEXT) +#define glMultiTexGendEXT GLEW_GET_FUN(__glewMultiTexGendEXT) +#define glMultiTexGendvEXT GLEW_GET_FUN(__glewMultiTexGendvEXT) +#define glMultiTexGenfEXT GLEW_GET_FUN(__glewMultiTexGenfEXT) +#define glMultiTexGenfvEXT GLEW_GET_FUN(__glewMultiTexGenfvEXT) +#define glMultiTexGeniEXT GLEW_GET_FUN(__glewMultiTexGeniEXT) +#define glMultiTexGenivEXT GLEW_GET_FUN(__glewMultiTexGenivEXT) +#define glMultiTexImage1DEXT GLEW_GET_FUN(__glewMultiTexImage1DEXT) +#define glMultiTexImage2DEXT GLEW_GET_FUN(__glewMultiTexImage2DEXT) +#define glMultiTexImage3DEXT GLEW_GET_FUN(__glewMultiTexImage3DEXT) +#define glMultiTexParameterIivEXT GLEW_GET_FUN(__glewMultiTexParameterIivEXT) +#define glMultiTexParameterIuivEXT GLEW_GET_FUN(__glewMultiTexParameterIuivEXT) +#define glMultiTexParameterfEXT GLEW_GET_FUN(__glewMultiTexParameterfEXT) +#define glMultiTexParameterfvEXT GLEW_GET_FUN(__glewMultiTexParameterfvEXT) +#define glMultiTexParameteriEXT GLEW_GET_FUN(__glewMultiTexParameteriEXT) +#define glMultiTexParameterivEXT GLEW_GET_FUN(__glewMultiTexParameterivEXT) +#define glMultiTexRenderbufferEXT GLEW_GET_FUN(__glewMultiTexRenderbufferEXT) +#define glMultiTexSubImage1DEXT GLEW_GET_FUN(__glewMultiTexSubImage1DEXT) +#define glMultiTexSubImage2DEXT GLEW_GET_FUN(__glewMultiTexSubImage2DEXT) +#define glMultiTexSubImage3DEXT GLEW_GET_FUN(__glewMultiTexSubImage3DEXT) +#define glNamedBufferDataEXT GLEW_GET_FUN(__glewNamedBufferDataEXT) +#define glNamedBufferSubDataEXT GLEW_GET_FUN(__glewNamedBufferSubDataEXT) +#define glNamedCopyBufferSubDataEXT GLEW_GET_FUN(__glewNamedCopyBufferSubDataEXT) +#define glNamedFramebufferRenderbufferEXT GLEW_GET_FUN(__glewNamedFramebufferRenderbufferEXT) +#define glNamedFramebufferTexture1DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture1DEXT) +#define glNamedFramebufferTexture2DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture2DEXT) +#define glNamedFramebufferTexture3DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture3DEXT) +#define glNamedFramebufferTextureEXT GLEW_GET_FUN(__glewNamedFramebufferTextureEXT) +#define glNamedFramebufferTextureFaceEXT GLEW_GET_FUN(__glewNamedFramebufferTextureFaceEXT) +#define glNamedFramebufferTextureLayerEXT GLEW_GET_FUN(__glewNamedFramebufferTextureLayerEXT) +#define glNamedProgramLocalParameter4dEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dEXT) +#define glNamedProgramLocalParameter4dvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dvEXT) +#define glNamedProgramLocalParameter4fEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fEXT) +#define glNamedProgramLocalParameter4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fvEXT) +#define glNamedProgramLocalParameterI4iEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4iEXT) +#define glNamedProgramLocalParameterI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4ivEXT) +#define glNamedProgramLocalParameterI4uiEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uiEXT) +#define glNamedProgramLocalParameterI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uivEXT) +#define glNamedProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameters4fvEXT) +#define glNamedProgramLocalParametersI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4ivEXT) +#define glNamedProgramLocalParametersI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4uivEXT) +#define glNamedProgramStringEXT GLEW_GET_FUN(__glewNamedProgramStringEXT) +#define glNamedRenderbufferStorageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageEXT) +#define glNamedRenderbufferStorageMultisampleCoverageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleCoverageEXT) +#define glNamedRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleEXT) +#define glProgramUniform1fEXT GLEW_GET_FUN(__glewProgramUniform1fEXT) +#define glProgramUniform1fvEXT GLEW_GET_FUN(__glewProgramUniform1fvEXT) +#define glProgramUniform1iEXT GLEW_GET_FUN(__glewProgramUniform1iEXT) +#define glProgramUniform1ivEXT GLEW_GET_FUN(__glewProgramUniform1ivEXT) +#define glProgramUniform1uiEXT GLEW_GET_FUN(__glewProgramUniform1uiEXT) +#define glProgramUniform1uivEXT GLEW_GET_FUN(__glewProgramUniform1uivEXT) +#define glProgramUniform2fEXT GLEW_GET_FUN(__glewProgramUniform2fEXT) +#define glProgramUniform2fvEXT GLEW_GET_FUN(__glewProgramUniform2fvEXT) +#define glProgramUniform2iEXT GLEW_GET_FUN(__glewProgramUniform2iEXT) +#define glProgramUniform2ivEXT GLEW_GET_FUN(__glewProgramUniform2ivEXT) +#define glProgramUniform2uiEXT GLEW_GET_FUN(__glewProgramUniform2uiEXT) +#define glProgramUniform2uivEXT GLEW_GET_FUN(__glewProgramUniform2uivEXT) +#define glProgramUniform3fEXT GLEW_GET_FUN(__glewProgramUniform3fEXT) +#define glProgramUniform3fvEXT GLEW_GET_FUN(__glewProgramUniform3fvEXT) +#define glProgramUniform3iEXT GLEW_GET_FUN(__glewProgramUniform3iEXT) +#define glProgramUniform3ivEXT GLEW_GET_FUN(__glewProgramUniform3ivEXT) +#define glProgramUniform3uiEXT GLEW_GET_FUN(__glewProgramUniform3uiEXT) +#define glProgramUniform3uivEXT GLEW_GET_FUN(__glewProgramUniform3uivEXT) +#define glProgramUniform4fEXT GLEW_GET_FUN(__glewProgramUniform4fEXT) +#define glProgramUniform4fvEXT GLEW_GET_FUN(__glewProgramUniform4fvEXT) +#define glProgramUniform4iEXT GLEW_GET_FUN(__glewProgramUniform4iEXT) +#define glProgramUniform4ivEXT GLEW_GET_FUN(__glewProgramUniform4ivEXT) +#define glProgramUniform4uiEXT GLEW_GET_FUN(__glewProgramUniform4uiEXT) +#define glProgramUniform4uivEXT GLEW_GET_FUN(__glewProgramUniform4uivEXT) +#define glProgramUniformMatrix2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2fvEXT) +#define glProgramUniformMatrix2x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3fvEXT) +#define glProgramUniformMatrix2x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4fvEXT) +#define glProgramUniformMatrix3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3fvEXT) +#define glProgramUniformMatrix3x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2fvEXT) +#define glProgramUniformMatrix3x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4fvEXT) +#define glProgramUniformMatrix4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4fvEXT) +#define glProgramUniformMatrix4x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2fvEXT) +#define glProgramUniformMatrix4x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3fvEXT) +#define glPushClientAttribDefaultEXT GLEW_GET_FUN(__glewPushClientAttribDefaultEXT) +#define glTextureBufferEXT GLEW_GET_FUN(__glewTextureBufferEXT) +#define glTextureImage1DEXT GLEW_GET_FUN(__glewTextureImage1DEXT) +#define glTextureImage2DEXT GLEW_GET_FUN(__glewTextureImage2DEXT) +#define glTextureImage3DEXT GLEW_GET_FUN(__glewTextureImage3DEXT) +#define glTextureParameterIivEXT GLEW_GET_FUN(__glewTextureParameterIivEXT) +#define glTextureParameterIuivEXT GLEW_GET_FUN(__glewTextureParameterIuivEXT) +#define glTextureParameterfEXT GLEW_GET_FUN(__glewTextureParameterfEXT) +#define glTextureParameterfvEXT GLEW_GET_FUN(__glewTextureParameterfvEXT) +#define glTextureParameteriEXT GLEW_GET_FUN(__glewTextureParameteriEXT) +#define glTextureParameterivEXT GLEW_GET_FUN(__glewTextureParameterivEXT) +#define glTextureRenderbufferEXT GLEW_GET_FUN(__glewTextureRenderbufferEXT) +#define glTextureSubImage1DEXT GLEW_GET_FUN(__glewTextureSubImage1DEXT) +#define glTextureSubImage2DEXT GLEW_GET_FUN(__glewTextureSubImage2DEXT) +#define glTextureSubImage3DEXT GLEW_GET_FUN(__glewTextureSubImage3DEXT) +#define glUnmapNamedBufferEXT GLEW_GET_FUN(__glewUnmapNamedBufferEXT) +#define glVertexArrayColorOffsetEXT GLEW_GET_FUN(__glewVertexArrayColorOffsetEXT) +#define glVertexArrayEdgeFlagOffsetEXT GLEW_GET_FUN(__glewVertexArrayEdgeFlagOffsetEXT) +#define glVertexArrayFogCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayFogCoordOffsetEXT) +#define glVertexArrayIndexOffsetEXT GLEW_GET_FUN(__glewVertexArrayIndexOffsetEXT) +#define glVertexArrayMultiTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayMultiTexCoordOffsetEXT) +#define glVertexArrayNormalOffsetEXT GLEW_GET_FUN(__glewVertexArrayNormalOffsetEXT) +#define glVertexArraySecondaryColorOffsetEXT GLEW_GET_FUN(__glewVertexArraySecondaryColorOffsetEXT) +#define glVertexArrayTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayTexCoordOffsetEXT) +#define glVertexArrayVertexAttribDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribDivisorEXT) +#define glVertexArrayVertexAttribIOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIOffsetEXT) +#define glVertexArrayVertexAttribOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribOffsetEXT) +#define glVertexArrayVertexOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexOffsetEXT) + +#define GLEW_EXT_direct_state_access GLEW_GET_VAR(__GLEW_EXT_direct_state_access) + +#endif /* GL_EXT_direct_state_access */ + +/* ----------------------- GL_EXT_discard_framebuffer ---------------------- */ + +#ifndef GL_EXT_discard_framebuffer +#define GL_EXT_discard_framebuffer 1 + +#define GL_COLOR_EXT 0x1800 +#define GL_DEPTH_EXT 0x1801 +#define GL_STENCIL_EXT 0x1802 + +typedef void (GLAPIENTRY * PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments); + +#define glDiscardFramebufferEXT GLEW_GET_FUN(__glewDiscardFramebufferEXT) + +#define GLEW_EXT_discard_framebuffer GLEW_GET_VAR(__GLEW_EXT_discard_framebuffer) + +#endif /* GL_EXT_discard_framebuffer */ + +/* -------------------------- GL_EXT_draw_buffers -------------------------- */ + +#ifndef GL_EXT_draw_buffers +#define GL_EXT_draw_buffers 1 + +#define GL_MAX_DRAW_BUFFERS_EXT 0x8824 +#define GL_DRAW_BUFFER0_EXT 0x8825 +#define GL_DRAW_BUFFER1_EXT 0x8826 +#define GL_DRAW_BUFFER2_EXT 0x8827 +#define GL_DRAW_BUFFER3_EXT 0x8828 +#define GL_DRAW_BUFFER4_EXT 0x8829 +#define GL_DRAW_BUFFER5_EXT 0x882A +#define GL_DRAW_BUFFER6_EXT 0x882B +#define GL_DRAW_BUFFER7_EXT 0x882C +#define GL_DRAW_BUFFER8_EXT 0x882D +#define GL_DRAW_BUFFER9_EXT 0x882E +#define GL_DRAW_BUFFER10_EXT 0x882F +#define GL_DRAW_BUFFER11_EXT 0x8830 +#define GL_DRAW_BUFFER12_EXT 0x8831 +#define GL_DRAW_BUFFER13_EXT 0x8832 +#define GL_DRAW_BUFFER14_EXT 0x8833 +#define GL_DRAW_BUFFER15_EXT 0x8834 +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSEXTPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersEXT GLEW_GET_FUN(__glewDrawBuffersEXT) + +#define GLEW_EXT_draw_buffers GLEW_GET_VAR(__GLEW_EXT_draw_buffers) + +#endif /* GL_EXT_draw_buffers */ + +/* -------------------------- GL_EXT_draw_buffers2 ------------------------- */ + +#ifndef GL_EXT_draw_buffers2 +#define GL_EXT_draw_buffers2 1 + +typedef void (GLAPIENTRY * PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (GLAPIENTRY * PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum value, GLuint index, GLboolean* data); +typedef void (GLAPIENTRY * PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum value, GLuint index, GLint* data); +typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); + +#define glColorMaskIndexedEXT GLEW_GET_FUN(__glewColorMaskIndexedEXT) +#define glDisableIndexedEXT GLEW_GET_FUN(__glewDisableIndexedEXT) +#define glEnableIndexedEXT GLEW_GET_FUN(__glewEnableIndexedEXT) +#define glGetBooleanIndexedvEXT GLEW_GET_FUN(__glewGetBooleanIndexedvEXT) +#define glGetIntegerIndexedvEXT GLEW_GET_FUN(__glewGetIntegerIndexedvEXT) +#define glIsEnabledIndexedEXT GLEW_GET_FUN(__glewIsEnabledIndexedEXT) + +#define GLEW_EXT_draw_buffers2 GLEW_GET_VAR(__GLEW_EXT_draw_buffers2) + +#endif /* GL_EXT_draw_buffers2 */ + +/* ---------------------- GL_EXT_draw_buffers_indexed ---------------------- */ + +#ifndef GL_EXT_draw_buffers_indexed +#define GL_EXT_draw_buffers_indexed 1 + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIEXTPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIEXTPROC) (GLuint buf, GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIEXTPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCIEXTPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GLAPIENTRY * PFNGLCOLORMASKIEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (GLAPIENTRY * PFNGLDISABLEIEXTPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEIEXTPROC) (GLenum target, GLuint index); +typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIEXTPROC) (GLenum target, GLuint index); + +#define glBlendEquationSeparateiEXT GLEW_GET_FUN(__glewBlendEquationSeparateiEXT) +#define glBlendEquationiEXT GLEW_GET_FUN(__glewBlendEquationiEXT) +#define glBlendFuncSeparateiEXT GLEW_GET_FUN(__glewBlendFuncSeparateiEXT) +#define glBlendFunciEXT GLEW_GET_FUN(__glewBlendFunciEXT) +#define glColorMaskiEXT GLEW_GET_FUN(__glewColorMaskiEXT) +#define glDisableiEXT GLEW_GET_FUN(__glewDisableiEXT) +#define glEnableiEXT GLEW_GET_FUN(__glewEnableiEXT) +#define glIsEnablediEXT GLEW_GET_FUN(__glewIsEnablediEXT) + +#define GLEW_EXT_draw_buffers_indexed GLEW_GET_VAR(__GLEW_EXT_draw_buffers_indexed) + +#endif /* GL_EXT_draw_buffers_indexed */ + +/* -------------------- GL_EXT_draw_elements_base_vertex ------------------- */ + +#ifndef GL_EXT_draw_elements_base_vertex +#define GL_EXT_draw_elements_base_vertex 1 + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, const GLsizei* count, GLenum type, const void *const *indices, GLsizei primcount, const GLint *basevertex); + +#define glDrawElementsBaseVertexEXT GLEW_GET_FUN(__glewDrawElementsBaseVertexEXT) +#define glDrawElementsInstancedBaseVertexEXT GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexEXT) +#define glDrawRangeElementsBaseVertexEXT GLEW_GET_FUN(__glewDrawRangeElementsBaseVertexEXT) +#define glMultiDrawElementsBaseVertexEXT GLEW_GET_FUN(__glewMultiDrawElementsBaseVertexEXT) + +#define GLEW_EXT_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_EXT_draw_elements_base_vertex) + +#endif /* GL_EXT_draw_elements_base_vertex */ + +/* ------------------------- GL_EXT_draw_instanced ------------------------- */ + +#ifndef GL_EXT_draw_instanced +#define GL_EXT_draw_instanced 1 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); + +#define glDrawArraysInstancedEXT GLEW_GET_FUN(__glewDrawArraysInstancedEXT) +#define glDrawElementsInstancedEXT GLEW_GET_FUN(__glewDrawElementsInstancedEXT) + +#define GLEW_EXT_draw_instanced GLEW_GET_VAR(__GLEW_EXT_draw_instanced) + +#endif /* GL_EXT_draw_instanced */ + +/* ----------------------- GL_EXT_draw_range_elements ---------------------- */ + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 + +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 + +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); + +#define glDrawRangeElementsEXT GLEW_GET_FUN(__glewDrawRangeElementsEXT) + +#define GLEW_EXT_draw_range_elements GLEW_GET_VAR(__GLEW_EXT_draw_range_elements) + +#endif /* GL_EXT_draw_range_elements */ + +/* ------------------------- GL_EXT_external_buffer ------------------------ */ + +#ifndef GL_EXT_external_buffer +#define GL_EXT_external_buffer 1 + +typedef void* GLeglClientBufferEXT; + +typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEEXTERNALEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); + +#define glBufferStorageExternalEXT GLEW_GET_FUN(__glewBufferStorageExternalEXT) +#define glNamedBufferStorageExternalEXT GLEW_GET_FUN(__glewNamedBufferStorageExternalEXT) + +#define GLEW_EXT_external_buffer GLEW_GET_VAR(__GLEW_EXT_external_buffer) + +#endif /* GL_EXT_external_buffer */ + +/* --------------------------- GL_EXT_float_blend -------------------------- */ + +#ifndef GL_EXT_float_blend +#define GL_EXT_float_blend 1 + +#define GLEW_EXT_float_blend GLEW_GET_VAR(__GLEW_EXT_float_blend) + +#endif /* GL_EXT_float_blend */ + +/* ---------------------------- GL_EXT_fog_coord --------------------------- */ + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 + +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 + +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); + +#define glFogCoordPointerEXT GLEW_GET_FUN(__glewFogCoordPointerEXT) +#define glFogCoorddEXT GLEW_GET_FUN(__glewFogCoorddEXT) +#define glFogCoorddvEXT GLEW_GET_FUN(__glewFogCoorddvEXT) +#define glFogCoordfEXT GLEW_GET_FUN(__glewFogCoordfEXT) +#define glFogCoordfvEXT GLEW_GET_FUN(__glewFogCoordfvEXT) + +#define GLEW_EXT_fog_coord GLEW_GET_VAR(__GLEW_EXT_fog_coord) + +#endif /* GL_EXT_fog_coord */ + +/* --------------------------- GL_EXT_frag_depth --------------------------- */ + +#ifndef GL_EXT_frag_depth +#define GL_EXT_frag_depth 1 + +#define GLEW_EXT_frag_depth GLEW_GET_VAR(__GLEW_EXT_frag_depth) + +#endif /* GL_EXT_frag_depth */ + +/* ------------------------ GL_EXT_fragment_lighting ----------------------- */ + +#ifndef GL_EXT_fragment_lighting +#define GL_EXT_fragment_lighting 1 + +#define GL_FRAGMENT_LIGHTING_EXT 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405 +#define GL_CURRENT_RASTER_NORMAL_EXT 0x8406 +#define GL_LIGHT_ENV_MODE_EXT 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B +#define GL_FRAGMENT_LIGHT0_EXT 0x840C +#define GL_FRAGMENT_LIGHT7_EXT 0x8413 + +typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param); + +#define glFragmentColorMaterialEXT GLEW_GET_FUN(__glewFragmentColorMaterialEXT) +#define glFragmentLightModelfEXT GLEW_GET_FUN(__glewFragmentLightModelfEXT) +#define glFragmentLightModelfvEXT GLEW_GET_FUN(__glewFragmentLightModelfvEXT) +#define glFragmentLightModeliEXT GLEW_GET_FUN(__glewFragmentLightModeliEXT) +#define glFragmentLightModelivEXT GLEW_GET_FUN(__glewFragmentLightModelivEXT) +#define glFragmentLightfEXT GLEW_GET_FUN(__glewFragmentLightfEXT) +#define glFragmentLightfvEXT GLEW_GET_FUN(__glewFragmentLightfvEXT) +#define glFragmentLightiEXT GLEW_GET_FUN(__glewFragmentLightiEXT) +#define glFragmentLightivEXT GLEW_GET_FUN(__glewFragmentLightivEXT) +#define glFragmentMaterialfEXT GLEW_GET_FUN(__glewFragmentMaterialfEXT) +#define glFragmentMaterialfvEXT GLEW_GET_FUN(__glewFragmentMaterialfvEXT) +#define glFragmentMaterialiEXT GLEW_GET_FUN(__glewFragmentMaterialiEXT) +#define glFragmentMaterialivEXT GLEW_GET_FUN(__glewFragmentMaterialivEXT) +#define glGetFragmentLightfvEXT GLEW_GET_FUN(__glewGetFragmentLightfvEXT) +#define glGetFragmentLightivEXT GLEW_GET_FUN(__glewGetFragmentLightivEXT) +#define glGetFragmentMaterialfvEXT GLEW_GET_FUN(__glewGetFragmentMaterialfvEXT) +#define glGetFragmentMaterialivEXT GLEW_GET_FUN(__glewGetFragmentMaterialivEXT) +#define glLightEnviEXT GLEW_GET_FUN(__glewLightEnviEXT) + +#define GLEW_EXT_fragment_lighting GLEW_GET_VAR(__GLEW_EXT_fragment_lighting) + +#endif /* GL_EXT_fragment_lighting */ + +/* ------------------------ GL_EXT_framebuffer_blit ------------------------ */ + +#ifndef GL_EXT_framebuffer_blit +#define GL_EXT_framebuffer_blit 1 + +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA + +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + +#define glBlitFramebufferEXT GLEW_GET_FUN(__glewBlitFramebufferEXT) + +#define GLEW_EXT_framebuffer_blit GLEW_GET_VAR(__GLEW_EXT_framebuffer_blit) + +#endif /* GL_EXT_framebuffer_blit */ + +/* --------------------- GL_EXT_framebuffer_multisample -------------------- */ + +#ifndef GL_EXT_framebuffer_multisample +#define GL_EXT_framebuffer_multisample 1 + +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewRenderbufferStorageMultisampleEXT) + +#define GLEW_EXT_framebuffer_multisample GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample) + +#endif /* GL_EXT_framebuffer_multisample */ + +/* --------------- GL_EXT_framebuffer_multisample_blit_scaled -------------- */ + +#ifndef GL_EXT_framebuffer_multisample_blit_scaled +#define GL_EXT_framebuffer_multisample_blit_scaled 1 + +#define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA +#define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB + +#define GLEW_EXT_framebuffer_multisample_blit_scaled GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample_blit_scaled) + +#endif /* GL_EXT_framebuffer_multisample_blit_scaled */ + +/* ----------------------- GL_EXT_framebuffer_object ----------------------- */ + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 + +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 + +typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); + +#define glBindFramebufferEXT GLEW_GET_FUN(__glewBindFramebufferEXT) +#define glBindRenderbufferEXT GLEW_GET_FUN(__glewBindRenderbufferEXT) +#define glCheckFramebufferStatusEXT GLEW_GET_FUN(__glewCheckFramebufferStatusEXT) +#define glDeleteFramebuffersEXT GLEW_GET_FUN(__glewDeleteFramebuffersEXT) +#define glDeleteRenderbuffersEXT GLEW_GET_FUN(__glewDeleteRenderbuffersEXT) +#define glFramebufferRenderbufferEXT GLEW_GET_FUN(__glewFramebufferRenderbufferEXT) +#define glFramebufferTexture1DEXT GLEW_GET_FUN(__glewFramebufferTexture1DEXT) +#define glFramebufferTexture2DEXT GLEW_GET_FUN(__glewFramebufferTexture2DEXT) +#define glFramebufferTexture3DEXT GLEW_GET_FUN(__glewFramebufferTexture3DEXT) +#define glGenFramebuffersEXT GLEW_GET_FUN(__glewGenFramebuffersEXT) +#define glGenRenderbuffersEXT GLEW_GET_FUN(__glewGenRenderbuffersEXT) +#define glGenerateMipmapEXT GLEW_GET_FUN(__glewGenerateMipmapEXT) +#define glGetFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetFramebufferAttachmentParameterivEXT) +#define glGetRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetRenderbufferParameterivEXT) +#define glIsFramebufferEXT GLEW_GET_FUN(__glewIsFramebufferEXT) +#define glIsRenderbufferEXT GLEW_GET_FUN(__glewIsRenderbufferEXT) +#define glRenderbufferStorageEXT GLEW_GET_FUN(__glewRenderbufferStorageEXT) + +#define GLEW_EXT_framebuffer_object GLEW_GET_VAR(__GLEW_EXT_framebuffer_object) + +#endif /* GL_EXT_framebuffer_object */ + +/* ------------------------ GL_EXT_framebuffer_sRGB ------------------------ */ + +#ifndef GL_EXT_framebuffer_sRGB +#define GL_EXT_framebuffer_sRGB 1 + +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA + +#define GLEW_EXT_framebuffer_sRGB GLEW_GET_VAR(__GLEW_EXT_framebuffer_sRGB) + +#endif /* GL_EXT_framebuffer_sRGB */ + +/* ----------------------- GL_EXT_geometry_point_size ---------------------- */ + +#ifndef GL_EXT_geometry_point_size +#define GL_EXT_geometry_point_size 1 + +#define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004 +#define GL_LINES_ADJACENCY_EXT 0xA +#define GL_LINE_STRIP_ADJACENCY_EXT 0xB +#define GL_TRIANGLES_ADJACENCY_EXT 0xC +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD +#define GL_LAYER_PROVOKING_VERTEX_EXT 0x825E +#define GL_UNDEFINED_VERTEX_EXT 0x8260 +#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F +#define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916 +#define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917 +#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918 +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5 +#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312 +#define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317 + +#define GLEW_EXT_geometry_point_size GLEW_GET_VAR(__GLEW_EXT_geometry_point_size) + +#endif /* GL_EXT_geometry_point_size */ + +/* ------------------------- GL_EXT_geometry_shader ------------------------ */ + +#ifndef GL_EXT_geometry_shader +#define GL_EXT_geometry_shader 1 + +#define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004 +#define GL_LINES_ADJACENCY_EXT 0xA +#define GL_LINE_STRIP_ADJACENCY_EXT 0xB +#define GL_TRIANGLES_ADJACENCY_EXT 0xC +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD +#define GL_LAYER_PROVOKING_VERTEX_EXT 0x825E +#define GL_UNDEFINED_VERTEX_EXT 0x8260 +#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F +#define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916 +#define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917 +#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918 +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5 +#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312 +#define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317 + +#define GLEW_EXT_geometry_shader GLEW_GET_VAR(__GLEW_EXT_geometry_shader) + +#endif /* GL_EXT_geometry_shader */ + +/* ------------------------ GL_EXT_geometry_shader4 ------------------------ */ + +#ifndef GL_EXT_geometry_shader4 +#define GL_EXT_geometry_shader4 1 + +#define GL_LINES_ADJACENCY_EXT 0xA +#define GL_LINE_STRIP_ADJACENCY_EXT 0xB +#define GL_TRIANGLES_ADJACENCY_EXT 0xC +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); + +#define glFramebufferTextureEXT GLEW_GET_FUN(__glewFramebufferTextureEXT) +#define glFramebufferTextureFaceEXT GLEW_GET_FUN(__glewFramebufferTextureFaceEXT) +#define glProgramParameteriEXT GLEW_GET_FUN(__glewProgramParameteriEXT) + +#define GLEW_EXT_geometry_shader4 GLEW_GET_VAR(__GLEW_EXT_geometry_shader4) + +#endif /* GL_EXT_geometry_shader4 */ + +/* --------------------- GL_EXT_gpu_program_parameters --------------------- */ + +#ifndef GL_EXT_gpu_program_parameters +#define GL_EXT_gpu_program_parameters 1 + +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); + +#define glProgramEnvParameters4fvEXT GLEW_GET_FUN(__glewProgramEnvParameters4fvEXT) +#define glProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewProgramLocalParameters4fvEXT) + +#define GLEW_EXT_gpu_program_parameters GLEW_GET_VAR(__GLEW_EXT_gpu_program_parameters) + +#endif /* GL_EXT_gpu_program_parameters */ + +/* --------------------------- GL_EXT_gpu_shader4 -------------------------- */ + +#ifndef GL_EXT_gpu_shader4 +#define GL_EXT_gpu_shader4 1 + +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD +#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 +#define GL_INT_SAMPLER_1D_EXT 0x8DC9 +#define GL_INT_SAMPLER_2D_EXT 0x8DCA +#define GL_INT_SAMPLER_3D_EXT 0x8DCB +#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 + +typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); + +#define glBindFragDataLocationEXT GLEW_GET_FUN(__glewBindFragDataLocationEXT) +#define glGetFragDataLocationEXT GLEW_GET_FUN(__glewGetFragDataLocationEXT) +#define glGetUniformuivEXT GLEW_GET_FUN(__glewGetUniformuivEXT) +#define glGetVertexAttribIivEXT GLEW_GET_FUN(__glewGetVertexAttribIivEXT) +#define glGetVertexAttribIuivEXT GLEW_GET_FUN(__glewGetVertexAttribIuivEXT) +#define glUniform1uiEXT GLEW_GET_FUN(__glewUniform1uiEXT) +#define glUniform1uivEXT GLEW_GET_FUN(__glewUniform1uivEXT) +#define glUniform2uiEXT GLEW_GET_FUN(__glewUniform2uiEXT) +#define glUniform2uivEXT GLEW_GET_FUN(__glewUniform2uivEXT) +#define glUniform3uiEXT GLEW_GET_FUN(__glewUniform3uiEXT) +#define glUniform3uivEXT GLEW_GET_FUN(__glewUniform3uivEXT) +#define glUniform4uiEXT GLEW_GET_FUN(__glewUniform4uiEXT) +#define glUniform4uivEXT GLEW_GET_FUN(__glewUniform4uivEXT) +#define glVertexAttribI1iEXT GLEW_GET_FUN(__glewVertexAttribI1iEXT) +#define glVertexAttribI1ivEXT GLEW_GET_FUN(__glewVertexAttribI1ivEXT) +#define glVertexAttribI1uiEXT GLEW_GET_FUN(__glewVertexAttribI1uiEXT) +#define glVertexAttribI1uivEXT GLEW_GET_FUN(__glewVertexAttribI1uivEXT) +#define glVertexAttribI2iEXT GLEW_GET_FUN(__glewVertexAttribI2iEXT) +#define glVertexAttribI2ivEXT GLEW_GET_FUN(__glewVertexAttribI2ivEXT) +#define glVertexAttribI2uiEXT GLEW_GET_FUN(__glewVertexAttribI2uiEXT) +#define glVertexAttribI2uivEXT GLEW_GET_FUN(__glewVertexAttribI2uivEXT) +#define glVertexAttribI3iEXT GLEW_GET_FUN(__glewVertexAttribI3iEXT) +#define glVertexAttribI3ivEXT GLEW_GET_FUN(__glewVertexAttribI3ivEXT) +#define glVertexAttribI3uiEXT GLEW_GET_FUN(__glewVertexAttribI3uiEXT) +#define glVertexAttribI3uivEXT GLEW_GET_FUN(__glewVertexAttribI3uivEXT) +#define glVertexAttribI4bvEXT GLEW_GET_FUN(__glewVertexAttribI4bvEXT) +#define glVertexAttribI4iEXT GLEW_GET_FUN(__glewVertexAttribI4iEXT) +#define glVertexAttribI4ivEXT GLEW_GET_FUN(__glewVertexAttribI4ivEXT) +#define glVertexAttribI4svEXT GLEW_GET_FUN(__glewVertexAttribI4svEXT) +#define glVertexAttribI4ubvEXT GLEW_GET_FUN(__glewVertexAttribI4ubvEXT) +#define glVertexAttribI4uiEXT GLEW_GET_FUN(__glewVertexAttribI4uiEXT) +#define glVertexAttribI4uivEXT GLEW_GET_FUN(__glewVertexAttribI4uivEXT) +#define glVertexAttribI4usvEXT GLEW_GET_FUN(__glewVertexAttribI4usvEXT) +#define glVertexAttribIPointerEXT GLEW_GET_FUN(__glewVertexAttribIPointerEXT) + +#define GLEW_EXT_gpu_shader4 GLEW_GET_VAR(__GLEW_EXT_gpu_shader4) + +#endif /* GL_EXT_gpu_shader4 */ + +/* --------------------------- GL_EXT_gpu_shader5 -------------------------- */ + +#ifndef GL_EXT_gpu_shader5 +#define GL_EXT_gpu_shader5 1 + +#define GLEW_EXT_gpu_shader5 GLEW_GET_VAR(__GLEW_EXT_gpu_shader5) + +#endif /* GL_EXT_gpu_shader5 */ + +/* ---------------------------- GL_EXT_histogram --------------------------- */ + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 + +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 + +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target); + +#define glGetHistogramEXT GLEW_GET_FUN(__glewGetHistogramEXT) +#define glGetHistogramParameterfvEXT GLEW_GET_FUN(__glewGetHistogramParameterfvEXT) +#define glGetHistogramParameterivEXT GLEW_GET_FUN(__glewGetHistogramParameterivEXT) +#define glGetMinmaxEXT GLEW_GET_FUN(__glewGetMinmaxEXT) +#define glGetMinmaxParameterfvEXT GLEW_GET_FUN(__glewGetMinmaxParameterfvEXT) +#define glGetMinmaxParameterivEXT GLEW_GET_FUN(__glewGetMinmaxParameterivEXT) +#define glHistogramEXT GLEW_GET_FUN(__glewHistogramEXT) +#define glMinmaxEXT GLEW_GET_FUN(__glewMinmaxEXT) +#define glResetHistogramEXT GLEW_GET_FUN(__glewResetHistogramEXT) +#define glResetMinmaxEXT GLEW_GET_FUN(__glewResetMinmaxEXT) + +#define GLEW_EXT_histogram GLEW_GET_VAR(__GLEW_EXT_histogram) + +#endif /* GL_EXT_histogram */ + +/* ----------------------- GL_EXT_index_array_formats ---------------------- */ + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 + +#define GLEW_EXT_index_array_formats GLEW_GET_VAR(__GLEW_EXT_index_array_formats) + +#endif /* GL_EXT_index_array_formats */ + +/* --------------------------- GL_EXT_index_func --------------------------- */ + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 + +typedef void (GLAPIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLfloat ref); + +#define glIndexFuncEXT GLEW_GET_FUN(__glewIndexFuncEXT) + +#define GLEW_EXT_index_func GLEW_GET_VAR(__GLEW_EXT_index_func) + +#endif /* GL_EXT_index_func */ + +/* ------------------------- GL_EXT_index_material ------------------------- */ + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 + +typedef void (GLAPIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); + +#define glIndexMaterialEXT GLEW_GET_FUN(__glewIndexMaterialEXT) + +#define GLEW_EXT_index_material GLEW_GET_VAR(__GLEW_EXT_index_material) + +#endif /* GL_EXT_index_material */ + +/* -------------------------- GL_EXT_index_texture ------------------------- */ + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 + +#define GLEW_EXT_index_texture GLEW_GET_VAR(__GLEW_EXT_index_texture) + +#endif /* GL_EXT_index_texture */ + +/* ------------------------ GL_EXT_instanced_arrays ------------------------ */ + +#ifndef GL_EXT_instanced_arrays +#define GL_EXT_instanced_arrays 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT 0x88FE + +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor); + +#define glVertexAttribDivisorEXT GLEW_GET_FUN(__glewVertexAttribDivisorEXT) + +#define GLEW_EXT_instanced_arrays GLEW_GET_VAR(__GLEW_EXT_instanced_arrays) + +#endif /* GL_EXT_instanced_arrays */ + +/* -------------------------- GL_EXT_light_texture ------------------------- */ + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 + +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 + +typedef void (GLAPIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); + +#define glApplyTextureEXT GLEW_GET_FUN(__glewApplyTextureEXT) +#define glTextureLightEXT GLEW_GET_FUN(__glewTextureLightEXT) +#define glTextureMaterialEXT GLEW_GET_FUN(__glewTextureMaterialEXT) + +#define GLEW_EXT_light_texture GLEW_GET_VAR(__GLEW_EXT_light_texture) + +#endif /* GL_EXT_light_texture */ + +/* ------------------------ GL_EXT_map_buffer_range ------------------------ */ + +#ifndef GL_EXT_map_buffer_range +#define GL_EXT_map_buffer_range 1 + +#define GL_MAP_READ_BIT_EXT 0x0001 +#define GL_MAP_WRITE_BIT_EXT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT_EXT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 + +typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef void * (GLAPIENTRY * PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); + +#define glFlushMappedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedBufferRangeEXT) +#define glMapBufferRangeEXT GLEW_GET_FUN(__glewMapBufferRangeEXT) + +#define GLEW_EXT_map_buffer_range GLEW_GET_VAR(__GLEW_EXT_map_buffer_range) + +#endif /* GL_EXT_map_buffer_range */ + +/* -------------------------- GL_EXT_memory_object ------------------------- */ + +#ifndef GL_EXT_memory_object +#define GL_EXT_memory_object 1 + +#define GL_UUID_SIZE_EXT 16 +#define GL_TEXTURE_TILING_EXT 0x9580 +#define GL_DEDICATED_MEMORY_OBJECT_EXT 0x9581 +#define GL_NUM_TILING_TYPES_EXT 0x9582 +#define GL_TILING_TYPES_EXT 0x9583 +#define GL_OPTIMAL_TILING_EXT 0x9584 +#define GL_LINEAR_TILING_EXT 0x9585 +#define GL_LAYOUT_GENERAL_EXT 0x958D +#define GL_LAYOUT_COLOR_ATTACHMENT_EXT 0x958E +#define GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT 0x958F +#define GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT 0x9590 +#define GL_LAYOUT_SHADER_READ_ONLY_EXT 0x9591 +#define GL_LAYOUT_TRANSFER_SRC_EXT 0x9592 +#define GL_LAYOUT_TRANSFER_DST_EXT 0x9593 +#define GL_NUM_DEVICE_UUIDS_EXT 0x9596 +#define GL_DEVICE_UUID_EXT 0x9597 +#define GL_DRIVER_UUID_EXT 0x9598 +#define GL_PROTECTED_MEMORY_OBJECT_EXT 0x959B + +typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEMEMEXTPROC) (GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLCREATEMEMORYOBJECTSEXTPROC) (GLsizei n, GLuint* memoryObjects); +typedef void (GLAPIENTRY * PFNGLDELETEMEMORYOBJECTSEXTPROC) (GLsizei n, const GLuint* memoryObjects); +typedef void (GLAPIENTRY * PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETUNSIGNEDBYTEI_VEXTPROC) (GLenum target, GLuint index, GLubyte* data); +typedef void (GLAPIENTRY * PFNGLGETUNSIGNEDBYTEVEXTPROC) (GLenum pname, GLubyte* data); +typedef GLboolean (GLAPIENTRY * PFNGLISMEMORYOBJECTEXTPROC) (GLuint memoryObject); +typedef void (GLAPIENTRY * PFNGLMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC) (GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM1DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM2DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM3DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); + +#define glBufferStorageMemEXT GLEW_GET_FUN(__glewBufferStorageMemEXT) +#define glCreateMemoryObjectsEXT GLEW_GET_FUN(__glewCreateMemoryObjectsEXT) +#define glDeleteMemoryObjectsEXT GLEW_GET_FUN(__glewDeleteMemoryObjectsEXT) +#define glGetMemoryObjectParameterivEXT GLEW_GET_FUN(__glewGetMemoryObjectParameterivEXT) +#define glGetUnsignedBytei_vEXT GLEW_GET_FUN(__glewGetUnsignedBytei_vEXT) +#define glGetUnsignedBytevEXT GLEW_GET_FUN(__glewGetUnsignedBytevEXT) +#define glIsMemoryObjectEXT GLEW_GET_FUN(__glewIsMemoryObjectEXT) +#define glMemoryObjectParameterivEXT GLEW_GET_FUN(__glewMemoryObjectParameterivEXT) +#define glNamedBufferStorageMemEXT GLEW_GET_FUN(__glewNamedBufferStorageMemEXT) +#define glTexStorageMem1DEXT GLEW_GET_FUN(__glewTexStorageMem1DEXT) +#define glTexStorageMem2DEXT GLEW_GET_FUN(__glewTexStorageMem2DEXT) +#define glTexStorageMem2DMultisampleEXT GLEW_GET_FUN(__glewTexStorageMem2DMultisampleEXT) +#define glTexStorageMem3DEXT GLEW_GET_FUN(__glewTexStorageMem3DEXT) +#define glTexStorageMem3DMultisampleEXT GLEW_GET_FUN(__glewTexStorageMem3DMultisampleEXT) +#define glTextureStorageMem1DEXT GLEW_GET_FUN(__glewTextureStorageMem1DEXT) +#define glTextureStorageMem2DEXT GLEW_GET_FUN(__glewTextureStorageMem2DEXT) +#define glTextureStorageMem2DMultisampleEXT GLEW_GET_FUN(__glewTextureStorageMem2DMultisampleEXT) +#define glTextureStorageMem3DEXT GLEW_GET_FUN(__glewTextureStorageMem3DEXT) +#define glTextureStorageMem3DMultisampleEXT GLEW_GET_FUN(__glewTextureStorageMem3DMultisampleEXT) + +#define GLEW_EXT_memory_object GLEW_GET_VAR(__GLEW_EXT_memory_object) + +#endif /* GL_EXT_memory_object */ + +/* ------------------------ GL_EXT_memory_object_fd ------------------------ */ + +#ifndef GL_EXT_memory_object_fd +#define GL_EXT_memory_object_fd 1 + +#define GL_HANDLE_TYPE_OPAQUE_FD_EXT 0x9586 + +typedef void (GLAPIENTRY * PFNGLIMPORTMEMORYFDEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, GLint fd); + +#define glImportMemoryFdEXT GLEW_GET_FUN(__glewImportMemoryFdEXT) + +#define GLEW_EXT_memory_object_fd GLEW_GET_VAR(__GLEW_EXT_memory_object_fd) + +#endif /* GL_EXT_memory_object_fd */ + +/* ----------------------- GL_EXT_memory_object_win32 ---------------------- */ + +#ifndef GL_EXT_memory_object_win32 +#define GL_EXT_memory_object_win32 1 + +#define GL_LUID_SIZE_EXT 8 +#define GL_HANDLE_TYPE_OPAQUE_WIN32_EXT 0x9587 +#define GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT 0x9588 +#define GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT 0x9589 +#define GL_HANDLE_TYPE_D3D12_RESOURCE_EXT 0x958A +#define GL_HANDLE_TYPE_D3D11_IMAGE_EXT 0x958B +#define GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT 0x958C +#define GL_HANDLE_TYPE_D3D12_FENCE_EXT 0x9594 +#define GL_D3D12_FENCE_VALUE_EXT 0x9595 +#define GL_DEVICE_LUID_EXT 0x9599 +#define GL_DEVICE_NODE_MASK_EXT 0x959A + +typedef void (GLAPIENTRY * PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, void *handle); +typedef void (GLAPIENTRY * PFNGLIMPORTMEMORYWIN32NAMEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, const void *name); + +#define glImportMemoryWin32HandleEXT GLEW_GET_FUN(__glewImportMemoryWin32HandleEXT) +#define glImportMemoryWin32NameEXT GLEW_GET_FUN(__glewImportMemoryWin32NameEXT) + +#define GLEW_EXT_memory_object_win32 GLEW_GET_VAR(__GLEW_EXT_memory_object_win32) + +#endif /* GL_EXT_memory_object_win32 */ + +/* ------------------------- GL_EXT_misc_attribute ------------------------- */ + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 + +#define GLEW_EXT_misc_attribute GLEW_GET_VAR(__GLEW_EXT_misc_attribute) + +#endif /* GL_EXT_misc_attribute */ + +/* ------------------------ GL_EXT_multi_draw_arrays ----------------------- */ + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const void *const *indices, GLsizei primcount); + +#define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT) +#define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT) + +#define GLEW_EXT_multi_draw_arrays GLEW_GET_VAR(__GLEW_EXT_multi_draw_arrays) + +#endif /* GL_EXT_multi_draw_arrays */ + +/* ----------------------- GL_EXT_multi_draw_indirect ---------------------- */ + +#ifndef GL_EXT_multi_draw_indirect +#define GL_EXT_multi_draw_indirect 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); + +#define glMultiDrawArraysIndirectEXT GLEW_GET_FUN(__glewMultiDrawArraysIndirectEXT) +#define glMultiDrawElementsIndirectEXT GLEW_GET_FUN(__glewMultiDrawElementsIndirectEXT) + +#define GLEW_EXT_multi_draw_indirect GLEW_GET_VAR(__GLEW_EXT_multi_draw_indirect) + +#endif /* GL_EXT_multi_draw_indirect */ + +/* ------------------------ GL_EXT_multiple_textures ----------------------- */ + +#ifndef GL_EXT_multiple_textures +#define GL_EXT_multiple_textures 1 + +#define GLEW_EXT_multiple_textures GLEW_GET_VAR(__GLEW_EXT_multiple_textures) + +#endif /* GL_EXT_multiple_textures */ + +/* --------------------------- GL_EXT_multisample -------------------------- */ + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 + +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 + +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); + +#define glSampleMaskEXT GLEW_GET_FUN(__glewSampleMaskEXT) +#define glSamplePatternEXT GLEW_GET_FUN(__glewSamplePatternEXT) + +#define GLEW_EXT_multisample GLEW_GET_VAR(__GLEW_EXT_multisample) + +#endif /* GL_EXT_multisample */ + +/* -------------------- GL_EXT_multisample_compatibility ------------------- */ + +#ifndef GL_EXT_multisample_compatibility +#define GL_EXT_multisample_compatibility 1 + +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F + +#define GLEW_EXT_multisample_compatibility GLEW_GET_VAR(__GLEW_EXT_multisample_compatibility) + +#endif /* GL_EXT_multisample_compatibility */ + +/* ----------------- GL_EXT_multisampled_render_to_texture ----------------- */ + +#ifndef GL_EXT_multisampled_render_to_texture +#define GL_EXT_multisampled_render_to_texture 1 + +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); + +#define glFramebufferTexture2DMultisampleEXT GLEW_GET_FUN(__glewFramebufferTexture2DMultisampleEXT) + +#define GLEW_EXT_multisampled_render_to_texture GLEW_GET_VAR(__GLEW_EXT_multisampled_render_to_texture) + +#endif /* GL_EXT_multisampled_render_to_texture */ + +/* ----------------- GL_EXT_multisampled_render_to_texture2 ---------------- */ + +#ifndef GL_EXT_multisampled_render_to_texture2 +#define GL_EXT_multisampled_render_to_texture2 1 + +#define GLEW_EXT_multisampled_render_to_texture2 GLEW_GET_VAR(__GLEW_EXT_multisampled_render_to_texture2) + +#endif /* GL_EXT_multisampled_render_to_texture2 */ + +/* --------------------- GL_EXT_multiview_draw_buffers --------------------- */ + +#ifndef GL_EXT_multiview_draw_buffers +#define GL_EXT_multiview_draw_buffers 1 + +#define GL_DRAW_BUFFER_EXT 0x0C01 +#define GL_READ_BUFFER_EXT 0x0C02 +#define GL_COLOR_ATTACHMENT_EXT 0x90F0 +#define GL_MULTIVIEW_EXT 0x90F1 +#define GL_MAX_MULTIVIEW_BUFFERS_EXT 0x90F2 + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum* location, const GLint *indices); +typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint* data); +typedef void (GLAPIENTRY * PFNGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index); + +#define glDrawBuffersIndexedEXT GLEW_GET_FUN(__glewDrawBuffersIndexedEXT) +#define glGetIntegeri_vEXT GLEW_GET_FUN(__glewGetIntegeri_vEXT) +#define glReadBufferIndexedEXT GLEW_GET_FUN(__glewReadBufferIndexedEXT) + +#define GLEW_EXT_multiview_draw_buffers GLEW_GET_VAR(__GLEW_EXT_multiview_draw_buffers) + +#endif /* GL_EXT_multiview_draw_buffers */ + +/* ---------------------- GL_EXT_packed_depth_stencil ---------------------- */ + +#ifndef GL_EXT_packed_depth_stencil +#define GL_EXT_packed_depth_stencil 1 + +#define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 + +#define GLEW_EXT_packed_depth_stencil GLEW_GET_VAR(__GLEW_EXT_packed_depth_stencil) + +#endif /* GL_EXT_packed_depth_stencil */ + +/* -------------------------- GL_EXT_packed_float -------------------------- */ + +#ifndef GL_EXT_packed_float +#define GL_EXT_packed_float 1 + +#define GL_R11F_G11F_B10F_EXT 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B +#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C + +#define GLEW_EXT_packed_float GLEW_GET_VAR(__GLEW_EXT_packed_float) + +#endif /* GL_EXT_packed_float */ + +/* -------------------------- GL_EXT_packed_pixels ------------------------- */ + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 + +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 + +#define GLEW_EXT_packed_pixels GLEW_GET_VAR(__GLEW_EXT_packed_pixels) + +#endif /* GL_EXT_packed_pixels */ + +/* ------------------------ GL_EXT_paletted_texture ------------------------ */ + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 + +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_COLOR_TABLE_FORMAT_EXT 0x80D8 +#define GL_COLOR_TABLE_WIDTH_EXT 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B + +typedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void *data); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); + +#define glColorTableEXT GLEW_GET_FUN(__glewColorTableEXT) +#define glGetColorTableEXT GLEW_GET_FUN(__glewGetColorTableEXT) +#define glGetColorTableParameterfvEXT GLEW_GET_FUN(__glewGetColorTableParameterfvEXT) +#define glGetColorTableParameterivEXT GLEW_GET_FUN(__glewGetColorTableParameterivEXT) + +#define GLEW_EXT_paletted_texture GLEW_GET_VAR(__GLEW_EXT_paletted_texture) + +#endif /* GL_EXT_paletted_texture */ + +/* ----------------------- GL_EXT_pixel_buffer_object ---------------------- */ + +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 + +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF + +#define GLEW_EXT_pixel_buffer_object GLEW_GET_VAR(__GLEW_EXT_pixel_buffer_object) + +#endif /* GL_EXT_pixel_buffer_object */ + +/* ------------------------- GL_EXT_pixel_transform ------------------------ */ + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 + +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 + +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glGetPixelTransformParameterfvEXT GLEW_GET_FUN(__glewGetPixelTransformParameterfvEXT) +#define glGetPixelTransformParameterivEXT GLEW_GET_FUN(__glewGetPixelTransformParameterivEXT) +#define glPixelTransformParameterfEXT GLEW_GET_FUN(__glewPixelTransformParameterfEXT) +#define glPixelTransformParameterfvEXT GLEW_GET_FUN(__glewPixelTransformParameterfvEXT) +#define glPixelTransformParameteriEXT GLEW_GET_FUN(__glewPixelTransformParameteriEXT) +#define glPixelTransformParameterivEXT GLEW_GET_FUN(__glewPixelTransformParameterivEXT) + +#define GLEW_EXT_pixel_transform GLEW_GET_VAR(__GLEW_EXT_pixel_transform) + +#endif /* GL_EXT_pixel_transform */ + +/* ------------------- GL_EXT_pixel_transform_color_table ------------------ */ + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 + +#define GLEW_EXT_pixel_transform_color_table GLEW_GET_VAR(__GLEW_EXT_pixel_transform_color_table) + +#endif /* GL_EXT_pixel_transform_color_table */ + +/* ------------------------ GL_EXT_point_parameters ------------------------ */ + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 + +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat* params); + +#define glPointParameterfEXT GLEW_GET_FUN(__glewPointParameterfEXT) +#define glPointParameterfvEXT GLEW_GET_FUN(__glewPointParameterfvEXT) + +#define GLEW_EXT_point_parameters GLEW_GET_VAR(__GLEW_EXT_point_parameters) + +#endif /* GL_EXT_point_parameters */ + +/* ------------------------- GL_EXT_polygon_offset ------------------------- */ + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 + +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 + +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); + +#define glPolygonOffsetEXT GLEW_GET_FUN(__glewPolygonOffsetEXT) + +#define GLEW_EXT_polygon_offset GLEW_GET_VAR(__GLEW_EXT_polygon_offset) + +#endif /* GL_EXT_polygon_offset */ + +/* ---------------------- GL_EXT_polygon_offset_clamp ---------------------- */ + +#ifndef GL_EXT_polygon_offset_clamp +#define GL_EXT_polygon_offset_clamp 1 + +#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B + +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); + +#define glPolygonOffsetClampEXT GLEW_GET_FUN(__glewPolygonOffsetClampEXT) + +#define GLEW_EXT_polygon_offset_clamp GLEW_GET_VAR(__GLEW_EXT_polygon_offset_clamp) + +#endif /* GL_EXT_polygon_offset_clamp */ + +/* ----------------------- GL_EXT_post_depth_coverage ---------------------- */ + +#ifndef GL_EXT_post_depth_coverage +#define GL_EXT_post_depth_coverage 1 + +#define GLEW_EXT_post_depth_coverage GLEW_GET_VAR(__GLEW_EXT_post_depth_coverage) + +#endif /* GL_EXT_post_depth_coverage */ + +/* ------------------------ GL_EXT_provoking_vertex ------------------------ */ + +#ifndef GL_EXT_provoking_vertex +#define GL_EXT_provoking_vertex 1 + +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_PROVOKING_VERTEX_EXT 0x8E4F + +typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); + +#define glProvokingVertexEXT GLEW_GET_FUN(__glewProvokingVertexEXT) + +#define GLEW_EXT_provoking_vertex GLEW_GET_VAR(__GLEW_EXT_provoking_vertex) + +#endif /* GL_EXT_provoking_vertex */ + +/* --------------------------- GL_EXT_pvrtc_sRGB --------------------------- */ + +#ifndef GL_EXT_pvrtc_sRGB +#define GL_EXT_pvrtc_sRGB 1 + +#define GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54 +#define GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55 +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56 +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57 + +#define GLEW_EXT_pvrtc_sRGB GLEW_GET_VAR(__GLEW_EXT_pvrtc_sRGB) + +#endif /* GL_EXT_pvrtc_sRGB */ + +/* ----------------------- GL_EXT_raster_multisample ----------------------- */ + +#ifndef GL_EXT_raster_multisample +#define GL_EXT_raster_multisample 1 + +#define GL_COLOR_SAMPLES_NV 0x8E20 +#define GL_RASTER_MULTISAMPLE_EXT 0x9327 +#define GL_RASTER_SAMPLES_EXT 0x9328 +#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 +#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A +#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B +#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C +#define GL_DEPTH_SAMPLES_NV 0x932D +#define GL_STENCIL_SAMPLES_NV 0x932E +#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F +#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 +#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 +#define GL_COVERAGE_MODULATION_NV 0x9332 +#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 + +typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); +typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat* v); +typedef void (GLAPIENTRY * PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); + +#define glCoverageModulationNV GLEW_GET_FUN(__glewCoverageModulationNV) +#define glCoverageModulationTableNV GLEW_GET_FUN(__glewCoverageModulationTableNV) +#define glGetCoverageModulationTableNV GLEW_GET_FUN(__glewGetCoverageModulationTableNV) +#define glRasterSamplesEXT GLEW_GET_FUN(__glewRasterSamplesEXT) + +#define GLEW_EXT_raster_multisample GLEW_GET_VAR(__GLEW_EXT_raster_multisample) + +#endif /* GL_EXT_raster_multisample */ + +/* ------------------------ GL_EXT_read_format_bgra ------------------------ */ + +#ifndef GL_EXT_read_format_bgra +#define GL_EXT_read_format_bgra 1 + +#define GL_BGRA_EXT 0x80E1 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 + +#define GLEW_EXT_read_format_bgra GLEW_GET_VAR(__GLEW_EXT_read_format_bgra) + +#endif /* GL_EXT_read_format_bgra */ + +/* -------------------------- GL_EXT_render_snorm -------------------------- */ + +#ifndef GL_EXT_render_snorm +#define GL_EXT_render_snorm 1 + +#define GL_BYTE 0x1400 +#define GL_SHORT 0x1402 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM_EXT 0x8F98 +#define GL_RG16_SNORM_EXT 0x8F99 +#define GL_RGBA16_SNORM_EXT 0x8F9B + +#define GLEW_EXT_render_snorm GLEW_GET_VAR(__GLEW_EXT_render_snorm) + +#endif /* GL_EXT_render_snorm */ + +/* ------------------------- GL_EXT_rescale_normal ------------------------- */ + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 + +#define GL_RESCALE_NORMAL_EXT 0x803A + +#define GLEW_EXT_rescale_normal GLEW_GET_VAR(__GLEW_EXT_rescale_normal) + +#endif /* GL_EXT_rescale_normal */ + +/* ------------------------------ GL_EXT_sRGB ------------------------------ */ + +#ifndef GL_EXT_sRGB +#define GL_EXT_sRGB 1 + +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 + +#define GLEW_EXT_sRGB GLEW_GET_VAR(__GLEW_EXT_sRGB) + +#endif /* GL_EXT_sRGB */ + +/* ----------------------- GL_EXT_sRGB_write_control ----------------------- */ + +#ifndef GL_EXT_sRGB_write_control +#define GL_EXT_sRGB_write_control 1 + +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 + +#define GLEW_EXT_sRGB_write_control GLEW_GET_VAR(__GLEW_EXT_sRGB_write_control) + +#endif /* GL_EXT_sRGB_write_control */ + +/* -------------------------- GL_EXT_scene_marker -------------------------- */ + +#ifndef GL_EXT_scene_marker +#define GL_EXT_scene_marker 1 + +typedef void (GLAPIENTRY * PFNGLBEGINSCENEEXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLENDSCENEEXTPROC) (void); + +#define glBeginSceneEXT GLEW_GET_FUN(__glewBeginSceneEXT) +#define glEndSceneEXT GLEW_GET_FUN(__glewEndSceneEXT) + +#define GLEW_EXT_scene_marker GLEW_GET_VAR(__GLEW_EXT_scene_marker) + +#endif /* GL_EXT_scene_marker */ + +/* ------------------------- GL_EXT_secondary_color ------------------------ */ + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 + +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E + +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); + +#define glSecondaryColor3bEXT GLEW_GET_FUN(__glewSecondaryColor3bEXT) +#define glSecondaryColor3bvEXT GLEW_GET_FUN(__glewSecondaryColor3bvEXT) +#define glSecondaryColor3dEXT GLEW_GET_FUN(__glewSecondaryColor3dEXT) +#define glSecondaryColor3dvEXT GLEW_GET_FUN(__glewSecondaryColor3dvEXT) +#define glSecondaryColor3fEXT GLEW_GET_FUN(__glewSecondaryColor3fEXT) +#define glSecondaryColor3fvEXT GLEW_GET_FUN(__glewSecondaryColor3fvEXT) +#define glSecondaryColor3iEXT GLEW_GET_FUN(__glewSecondaryColor3iEXT) +#define glSecondaryColor3ivEXT GLEW_GET_FUN(__glewSecondaryColor3ivEXT) +#define glSecondaryColor3sEXT GLEW_GET_FUN(__glewSecondaryColor3sEXT) +#define glSecondaryColor3svEXT GLEW_GET_FUN(__glewSecondaryColor3svEXT) +#define glSecondaryColor3ubEXT GLEW_GET_FUN(__glewSecondaryColor3ubEXT) +#define glSecondaryColor3ubvEXT GLEW_GET_FUN(__glewSecondaryColor3ubvEXT) +#define glSecondaryColor3uiEXT GLEW_GET_FUN(__glewSecondaryColor3uiEXT) +#define glSecondaryColor3uivEXT GLEW_GET_FUN(__glewSecondaryColor3uivEXT) +#define glSecondaryColor3usEXT GLEW_GET_FUN(__glewSecondaryColor3usEXT) +#define glSecondaryColor3usvEXT GLEW_GET_FUN(__glewSecondaryColor3usvEXT) +#define glSecondaryColorPointerEXT GLEW_GET_FUN(__glewSecondaryColorPointerEXT) + +#define GLEW_EXT_secondary_color GLEW_GET_VAR(__GLEW_EXT_secondary_color) + +#endif /* GL_EXT_secondary_color */ + +/* ---------------------------- GL_EXT_semaphore --------------------------- */ + +#ifndef GL_EXT_semaphore +#define GL_EXT_semaphore 1 + +typedef void (GLAPIENTRY * PFNGLDELETESEMAPHORESEXTPROC) (GLsizei n, const GLuint* semaphores); +typedef void (GLAPIENTRY * PFNGLGENSEMAPHORESEXTPROC) (GLsizei n, GLuint* semaphores); +typedef void (GLAPIENTRY * PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, GLuint64* params); +typedef GLboolean (GLAPIENTRY * PFNGLISSEMAPHOREEXTPROC) (GLuint semaphore); +typedef void (GLAPIENTRY * PFNGLSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, const GLuint64* params); +typedef void (GLAPIENTRY * PFNGLSIGNALSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint* buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); +typedef void (GLAPIENTRY * PFNGLWAITSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint* buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); + +#define glDeleteSemaphoresEXT GLEW_GET_FUN(__glewDeleteSemaphoresEXT) +#define glGenSemaphoresEXT GLEW_GET_FUN(__glewGenSemaphoresEXT) +#define glGetSemaphoreParameterui64vEXT GLEW_GET_FUN(__glewGetSemaphoreParameterui64vEXT) +#define glIsSemaphoreEXT GLEW_GET_FUN(__glewIsSemaphoreEXT) +#define glSemaphoreParameterui64vEXT GLEW_GET_FUN(__glewSemaphoreParameterui64vEXT) +#define glSignalSemaphoreEXT GLEW_GET_FUN(__glewSignalSemaphoreEXT) +#define glWaitSemaphoreEXT GLEW_GET_FUN(__glewWaitSemaphoreEXT) + +#define GLEW_EXT_semaphore GLEW_GET_VAR(__GLEW_EXT_semaphore) + +#endif /* GL_EXT_semaphore */ + +/* -------------------------- GL_EXT_semaphore_fd -------------------------- */ + +#ifndef GL_EXT_semaphore_fd +#define GL_EXT_semaphore_fd 1 + +typedef void (GLAPIENTRY * PFNGLIMPORTSEMAPHOREFDEXTPROC) (GLuint semaphore, GLenum handleType, GLint fd); + +#define glImportSemaphoreFdEXT GLEW_GET_FUN(__glewImportSemaphoreFdEXT) + +#define GLEW_EXT_semaphore_fd GLEW_GET_VAR(__GLEW_EXT_semaphore_fd) + +#endif /* GL_EXT_semaphore_fd */ + +/* ------------------------- GL_EXT_semaphore_win32 ------------------------ */ + +#ifndef GL_EXT_semaphore_win32 +#define GL_EXT_semaphore_win32 1 + +typedef void (GLAPIENTRY * PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC) (GLuint semaphore, GLenum handleType, void *handle); +typedef void (GLAPIENTRY * PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC) (GLuint semaphore, GLenum handleType, const void *name); + +#define glImportSemaphoreWin32HandleEXT GLEW_GET_FUN(__glewImportSemaphoreWin32HandleEXT) +#define glImportSemaphoreWin32NameEXT GLEW_GET_FUN(__glewImportSemaphoreWin32NameEXT) + +#define GLEW_EXT_semaphore_win32 GLEW_GET_VAR(__GLEW_EXT_semaphore_win32) + +#endif /* GL_EXT_semaphore_win32 */ + +/* --------------------- GL_EXT_separate_shader_objects -------------------- */ + +#ifndef GL_EXT_separate_shader_objects +#define GL_EXT_separate_shader_objects 1 + +#define GL_ACTIVE_PROGRAM_EXT 0x8B8D + +typedef void (GLAPIENTRY * PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); +typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar* string); +typedef void (GLAPIENTRY * PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); + +#define glActiveProgramEXT GLEW_GET_FUN(__glewActiveProgramEXT) +#define glCreateShaderProgramEXT GLEW_GET_FUN(__glewCreateShaderProgramEXT) +#define glUseShaderProgramEXT GLEW_GET_FUN(__glewUseShaderProgramEXT) + +#define GLEW_EXT_separate_shader_objects GLEW_GET_VAR(__GLEW_EXT_separate_shader_objects) + +#endif /* GL_EXT_separate_shader_objects */ + +/* --------------------- GL_EXT_separate_specular_color -------------------- */ + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 + +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA + +#define GLEW_EXT_separate_specular_color GLEW_GET_VAR(__GLEW_EXT_separate_specular_color) + +#endif /* GL_EXT_separate_specular_color */ + +/* -------------------- GL_EXT_shader_framebuffer_fetch -------------------- */ + +#ifndef GL_EXT_shader_framebuffer_fetch +#define GL_EXT_shader_framebuffer_fetch 1 + +#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 + +#define GLEW_EXT_shader_framebuffer_fetch GLEW_GET_VAR(__GLEW_EXT_shader_framebuffer_fetch) + +#endif /* GL_EXT_shader_framebuffer_fetch */ + +/* ------------------------ GL_EXT_shader_group_vote ----------------------- */ + +#ifndef GL_EXT_shader_group_vote +#define GL_EXT_shader_group_vote 1 + +#define GLEW_EXT_shader_group_vote GLEW_GET_VAR(__GLEW_EXT_shader_group_vote) + +#endif /* GL_EXT_shader_group_vote */ + +/* ------------------- GL_EXT_shader_image_load_formatted ------------------ */ + +#ifndef GL_EXT_shader_image_load_formatted +#define GL_EXT_shader_image_load_formatted 1 + +#define GLEW_EXT_shader_image_load_formatted GLEW_GET_VAR(__GLEW_EXT_shader_image_load_formatted) + +#endif /* GL_EXT_shader_image_load_formatted */ + +/* --------------------- GL_EXT_shader_image_load_store -------------------- */ + +#ifndef GL_EXT_shader_image_load_store +#define GL_EXT_shader_image_load_store 1 + +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 +#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 +#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 +#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A +#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B +#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C +#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D +#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E +#define GL_IMAGE_1D_EXT 0x904C +#define GL_IMAGE_2D_EXT 0x904D +#define GL_IMAGE_3D_EXT 0x904E +#define GL_IMAGE_2D_RECT_EXT 0x904F +#define GL_IMAGE_CUBE_EXT 0x9050 +#define GL_IMAGE_BUFFER_EXT 0x9051 +#define GL_IMAGE_1D_ARRAY_EXT 0x9052 +#define GL_IMAGE_2D_ARRAY_EXT 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 +#define GL_INT_IMAGE_1D_EXT 0x9057 +#define GL_INT_IMAGE_2D_EXT 0x9058 +#define GL_INT_IMAGE_3D_EXT 0x9059 +#define GL_INT_IMAGE_2D_RECT_EXT 0x905A +#define GL_INT_IMAGE_CUBE_EXT 0x905B +#define GL_INT_IMAGE_BUFFER_EXT 0x905C +#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D +#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C +#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D +#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E +#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +typedef void (GLAPIENTRY * PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); + +#define glBindImageTextureEXT GLEW_GET_FUN(__glewBindImageTextureEXT) +#define glMemoryBarrierEXT GLEW_GET_FUN(__glewMemoryBarrierEXT) + +#define GLEW_EXT_shader_image_load_store GLEW_GET_VAR(__GLEW_EXT_shader_image_load_store) + +#endif /* GL_EXT_shader_image_load_store */ + +/* ------------------- GL_EXT_shader_implicit_conversions ------------------ */ + +#ifndef GL_EXT_shader_implicit_conversions +#define GL_EXT_shader_implicit_conversions 1 + +#define GLEW_EXT_shader_implicit_conversions GLEW_GET_VAR(__GLEW_EXT_shader_implicit_conversions) + +#endif /* GL_EXT_shader_implicit_conversions */ + +/* ----------------------- GL_EXT_shader_integer_mix ----------------------- */ + +#ifndef GL_EXT_shader_integer_mix +#define GL_EXT_shader_integer_mix 1 + +#define GLEW_EXT_shader_integer_mix GLEW_GET_VAR(__GLEW_EXT_shader_integer_mix) + +#endif /* GL_EXT_shader_integer_mix */ + +/* ------------------------ GL_EXT_shader_io_blocks ------------------------ */ + +#ifndef GL_EXT_shader_io_blocks +#define GL_EXT_shader_io_blocks 1 + +#define GLEW_EXT_shader_io_blocks GLEW_GET_VAR(__GLEW_EXT_shader_io_blocks) + +#endif /* GL_EXT_shader_io_blocks */ + +/* ------------- GL_EXT_shader_non_constant_global_initializers ------------ */ + +#ifndef GL_EXT_shader_non_constant_global_initializers +#define GL_EXT_shader_non_constant_global_initializers 1 + +#define GLEW_EXT_shader_non_constant_global_initializers GLEW_GET_VAR(__GLEW_EXT_shader_non_constant_global_initializers) + +#endif /* GL_EXT_shader_non_constant_global_initializers */ + +/* ------------------- GL_EXT_shader_pixel_local_storage ------------------- */ + +#ifndef GL_EXT_shader_pixel_local_storage +#define GL_EXT_shader_pixel_local_storage 1 + +#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT 0x8F63 +#define GL_SHADER_PIXEL_LOCAL_STORAGE_EXT 0x8F64 +#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT 0x8F67 + +#define GLEW_EXT_shader_pixel_local_storage GLEW_GET_VAR(__GLEW_EXT_shader_pixel_local_storage) + +#endif /* GL_EXT_shader_pixel_local_storage */ + +/* ------------------- GL_EXT_shader_pixel_local_storage2 ------------------ */ + +#ifndef GL_EXT_shader_pixel_local_storage2 +#define GL_EXT_shader_pixel_local_storage2 1 + +#define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_FAST_SIZE_EXT 0x9650 +#define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_SIZE_EXT 0x9651 +#define GL_FRAMEBUFFER_INCOMPLETE_INSUFFICIENT_SHADER_COMBINED_LOCAL_STORAGE_EXT 0x9652 + +typedef void (GLAPIENTRY * PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC) (GLsizei offset, GLsizei n, const GLuint* values); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target, GLsizei size); +typedef GLsizei (GLAPIENTRY * PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target); + +#define glClearPixelLocalStorageuiEXT GLEW_GET_FUN(__glewClearPixelLocalStorageuiEXT) +#define glFramebufferPixelLocalStorageSizeEXT GLEW_GET_FUN(__glewFramebufferPixelLocalStorageSizeEXT) +#define glGetFramebufferPixelLocalStorageSizeEXT GLEW_GET_FUN(__glewGetFramebufferPixelLocalStorageSizeEXT) + +#define GLEW_EXT_shader_pixel_local_storage2 GLEW_GET_VAR(__GLEW_EXT_shader_pixel_local_storage2) + +#endif /* GL_EXT_shader_pixel_local_storage2 */ + +/* ----------------------- GL_EXT_shader_texture_lod ----------------------- */ + +#ifndef GL_EXT_shader_texture_lod +#define GL_EXT_shader_texture_lod 1 + +#define GLEW_EXT_shader_texture_lod GLEW_GET_VAR(__GLEW_EXT_shader_texture_lod) + +#endif /* GL_EXT_shader_texture_lod */ + +/* -------------------------- GL_EXT_shadow_funcs -------------------------- */ + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 + +#define GLEW_EXT_shadow_funcs GLEW_GET_VAR(__GLEW_EXT_shadow_funcs) + +#endif /* GL_EXT_shadow_funcs */ + +/* ------------------------- GL_EXT_shadow_samplers ------------------------ */ + +#ifndef GL_EXT_shadow_samplers +#define GL_EXT_shadow_samplers 1 + +#define GL_TEXTURE_COMPARE_MODE_EXT 0x884C +#define GL_TEXTURE_COMPARE_FUNC_EXT 0x884D +#define GL_COMPARE_REF_TO_TEXTURE_EXT 0x884E +#define GL_SAMPLER_2D_SHADOW_EXT 0x8B62 + +#define GLEW_EXT_shadow_samplers GLEW_GET_VAR(__GLEW_EXT_shadow_samplers) + +#endif /* GL_EXT_shadow_samplers */ + +/* --------------------- GL_EXT_shared_texture_palette --------------------- */ + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 + +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB + +#define GLEW_EXT_shared_texture_palette GLEW_GET_VAR(__GLEW_EXT_shared_texture_palette) + +#endif /* GL_EXT_shared_texture_palette */ + +/* ------------------------- GL_EXT_sparse_texture ------------------------- */ + +#ifndef GL_EXT_sparse_texture +#define GL_EXT_sparse_texture 1 + +#define GL_TEXTURE_2D 0x0DE1 +#define GL_TEXTURE_3D 0x806F +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_TEXTURE_CUBE_MAP_ARRAY_OES 0x9009 +#define GL_VIRTUAL_PAGE_SIZE_X_EXT 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_EXT 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_EXT 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_EXT 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_EXT 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_EXT 0x919A +#define GL_TEXTURE_SPARSE_EXT 0x91A6 +#define GL_VIRTUAL_PAGE_SIZE_INDEX_EXT 0x91A7 +#define GL_NUM_VIRTUAL_PAGE_SIZES_EXT 0x91A8 +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_EXT 0x91A9 +#define GL_NUM_SPARSE_LEVELS_EXT 0x91AA + +typedef void (GLAPIENTRY * PFNGLTEXPAGECOMMITMENTEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +typedef void (GLAPIENTRY * PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); + +#define glTexPageCommitmentEXT GLEW_GET_FUN(__glewTexPageCommitmentEXT) +#define glTexturePageCommitmentEXT GLEW_GET_FUN(__glewTexturePageCommitmentEXT) + +#define GLEW_EXT_sparse_texture GLEW_GET_VAR(__GLEW_EXT_sparse_texture) + +#endif /* GL_EXT_sparse_texture */ + +/* ------------------------- GL_EXT_sparse_texture2 ------------------------ */ + +#ifndef GL_EXT_sparse_texture2 +#define GL_EXT_sparse_texture2 1 + +#define GLEW_EXT_sparse_texture2 GLEW_GET_VAR(__GLEW_EXT_sparse_texture2) + +#endif /* GL_EXT_sparse_texture2 */ + +/* ------------------------ GL_EXT_stencil_clear_tag ----------------------- */ + +#ifndef GL_EXT_stencil_clear_tag +#define GL_EXT_stencil_clear_tag 1 + +#define GL_STENCIL_TAG_BITS_EXT 0x88F2 +#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 + +#define GLEW_EXT_stencil_clear_tag GLEW_GET_VAR(__GLEW_EXT_stencil_clear_tag) + +#endif /* GL_EXT_stencil_clear_tag */ + +/* ------------------------ GL_EXT_stencil_two_side ------------------------ */ + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 + +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 + +typedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); + +#define glActiveStencilFaceEXT GLEW_GET_FUN(__glewActiveStencilFaceEXT) + +#define GLEW_EXT_stencil_two_side GLEW_GET_VAR(__GLEW_EXT_stencil_two_side) + +#endif /* GL_EXT_stencil_two_side */ + +/* -------------------------- GL_EXT_stencil_wrap -------------------------- */ + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 + +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 + +#define GLEW_EXT_stencil_wrap GLEW_GET_VAR(__GLEW_EXT_stencil_wrap) + +#endif /* GL_EXT_stencil_wrap */ + +/* --------------------------- GL_EXT_subtexture --------------------------- */ + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 + +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); + +#define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT) +#define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT) +#define glTexSubImage3DEXT GLEW_GET_FUN(__glewTexSubImage3DEXT) + +#define GLEW_EXT_subtexture GLEW_GET_VAR(__GLEW_EXT_subtexture) + +#endif /* GL_EXT_subtexture */ + +/* ----------------------------- GL_EXT_texture ---------------------------- */ + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 + +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 + +#define GLEW_EXT_texture GLEW_GET_VAR(__GLEW_EXT_texture) + +#endif /* GL_EXT_texture */ + +/* ---------------------------- GL_EXT_texture3D --------------------------- */ + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 + +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 + +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); + +#define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT) + +#define GLEW_EXT_texture3D GLEW_GET_VAR(__GLEW_EXT_texture3D) + +#endif /* GL_EXT_texture3D */ + +/* -------------------------- GL_EXT_texture_array ------------------------- */ + +#ifndef GL_EXT_texture_array +#define GL_EXT_texture_array 1 + +#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 +#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); + +#define glFramebufferTextureLayerEXT GLEW_GET_FUN(__glewFramebufferTextureLayerEXT) + +#define GLEW_EXT_texture_array GLEW_GET_VAR(__GLEW_EXT_texture_array) + +#endif /* GL_EXT_texture_array */ + +/* ---------------------- GL_EXT_texture_buffer_object --------------------- */ + +#ifndef GL_EXT_texture_buffer_object +#define GL_EXT_texture_buffer_object 1 + +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E + +typedef void (GLAPIENTRY * PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); + +#define glTexBufferEXT GLEW_GET_FUN(__glewTexBufferEXT) + +#define GLEW_EXT_texture_buffer_object GLEW_GET_VAR(__GLEW_EXT_texture_buffer_object) + +#endif /* GL_EXT_texture_buffer_object */ + +/* -------------- GL_EXT_texture_compression_astc_decode_mode -------------- */ + +#ifndef GL_EXT_texture_compression_astc_decode_mode +#define GL_EXT_texture_compression_astc_decode_mode 1 + +#define GL_TEXTURE_ASTC_DECODE_PRECISION_EXT 0x8F69 + +#define GLEW_EXT_texture_compression_astc_decode_mode GLEW_GET_VAR(__GLEW_EXT_texture_compression_astc_decode_mode) + +#endif /* GL_EXT_texture_compression_astc_decode_mode */ + +/* ----------- GL_EXT_texture_compression_astc_decode_mode_rgb9e5 ---------- */ + +#ifndef GL_EXT_texture_compression_astc_decode_mode_rgb9e5 +#define GL_EXT_texture_compression_astc_decode_mode_rgb9e5 1 + +#define GL_TEXTURE_ASTC_DECODE_PRECISION_EXT 0x8F69 + +#define GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5 GLEW_GET_VAR(__GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5) + +#endif /* GL_EXT_texture_compression_astc_decode_mode_rgb9e5 */ + +/* -------------------- GL_EXT_texture_compression_bptc -------------------- */ + +#ifndef GL_EXT_texture_compression_bptc +#define GL_EXT_texture_compression_bptc 1 + +#define GL_COMPRESSED_RGBA_BPTC_UNORM_EXT 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT 0x8E8F + +#define GLEW_EXT_texture_compression_bptc GLEW_GET_VAR(__GLEW_EXT_texture_compression_bptc) + +#endif /* GL_EXT_texture_compression_bptc */ + +/* -------------------- GL_EXT_texture_compression_dxt1 -------------------- */ + +#ifndef GL_EXT_texture_compression_dxt1 +#define GL_EXT_texture_compression_dxt1 1 + +#define GLEW_EXT_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_EXT_texture_compression_dxt1) + +#endif /* GL_EXT_texture_compression_dxt1 */ + +/* -------------------- GL_EXT_texture_compression_latc -------------------- */ + +#ifndef GL_EXT_texture_compression_latc +#define GL_EXT_texture_compression_latc 1 + +#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 + +#define GLEW_EXT_texture_compression_latc GLEW_GET_VAR(__GLEW_EXT_texture_compression_latc) + +#endif /* GL_EXT_texture_compression_latc */ + +/* -------------------- GL_EXT_texture_compression_rgtc -------------------- */ + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 + +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE + +#define GLEW_EXT_texture_compression_rgtc GLEW_GET_VAR(__GLEW_EXT_texture_compression_rgtc) + +#endif /* GL_EXT_texture_compression_rgtc */ + +/* -------------------- GL_EXT_texture_compression_s3tc -------------------- */ + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_EXT_texture_compression_s3tc 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 + +#define GLEW_EXT_texture_compression_s3tc GLEW_GET_VAR(__GLEW_EXT_texture_compression_s3tc) + +#endif /* GL_EXT_texture_compression_s3tc */ + +/* ------------------------ GL_EXT_texture_cube_map ------------------------ */ + +#ifndef GL_EXT_texture_cube_map +#define GL_EXT_texture_cube_map 1 + +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C + +#define GLEW_EXT_texture_cube_map GLEW_GET_VAR(__GLEW_EXT_texture_cube_map) + +#endif /* GL_EXT_texture_cube_map */ + +/* --------------------- GL_EXT_texture_cube_map_array --------------------- */ + +#ifndef GL_EXT_texture_cube_map_array +#define GL_EXT_texture_cube_map_array 1 + +#define GL_TEXTURE_CUBE_MAP_ARRAY_EXT 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT 0x900A +#define GL_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900F +#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A + +#define GLEW_EXT_texture_cube_map_array GLEW_GET_VAR(__GLEW_EXT_texture_cube_map_array) + +#endif /* GL_EXT_texture_cube_map_array */ + +/* ----------------------- GL_EXT_texture_edge_clamp ----------------------- */ + +#ifndef GL_EXT_texture_edge_clamp +#define GL_EXT_texture_edge_clamp 1 + +#define GL_CLAMP_TO_EDGE_EXT 0x812F + +#define GLEW_EXT_texture_edge_clamp GLEW_GET_VAR(__GLEW_EXT_texture_edge_clamp) + +#endif /* GL_EXT_texture_edge_clamp */ + +/* --------------------------- GL_EXT_texture_env -------------------------- */ + +#ifndef GL_EXT_texture_env +#define GL_EXT_texture_env 1 + +#define GLEW_EXT_texture_env GLEW_GET_VAR(__GLEW_EXT_texture_env) + +#endif /* GL_EXT_texture_env */ + +/* ------------------------- GL_EXT_texture_env_add ------------------------ */ + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 + +#define GLEW_EXT_texture_env_add GLEW_GET_VAR(__GLEW_EXT_texture_env_add) + +#endif /* GL_EXT_texture_env_add */ + +/* ----------------------- GL_EXT_texture_env_combine ---------------------- */ + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 + +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A + +#define GLEW_EXT_texture_env_combine GLEW_GET_VAR(__GLEW_EXT_texture_env_combine) + +#endif /* GL_EXT_texture_env_combine */ + +/* ------------------------ GL_EXT_texture_env_dot3 ------------------------ */ + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 + +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 + +#define GLEW_EXT_texture_env_dot3 GLEW_GET_VAR(__GLEW_EXT_texture_env_dot3) + +#endif /* GL_EXT_texture_env_dot3 */ + +/* ------------------- GL_EXT_texture_filter_anisotropic ------------------- */ + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 + +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF + +#define GLEW_EXT_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_EXT_texture_filter_anisotropic) + +#endif /* GL_EXT_texture_filter_anisotropic */ + +/* ---------------------- GL_EXT_texture_filter_minmax --------------------- */ + +#ifndef GL_EXT_texture_filter_minmax +#define GL_EXT_texture_filter_minmax 1 + +#define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366 +#define GL_WEIGHTED_AVERAGE_EXT 0x9367 + +#define GLEW_EXT_texture_filter_minmax GLEW_GET_VAR(__GLEW_EXT_texture_filter_minmax) + +#endif /* GL_EXT_texture_filter_minmax */ + +/* --------------------- GL_EXT_texture_format_BGRA8888 -------------------- */ + +#ifndef GL_EXT_texture_format_BGRA8888 +#define GL_EXT_texture_format_BGRA8888 1 + +#define GL_BGRA_EXT 0x80E1 + +#define GLEW_EXT_texture_format_BGRA8888 GLEW_GET_VAR(__GLEW_EXT_texture_format_BGRA8888) + +#endif /* GL_EXT_texture_format_BGRA8888 */ + +/* ------------------------- GL_EXT_texture_integer ------------------------ */ + +#ifndef GL_EXT_texture_integer +#define GL_EXT_texture_integer 1 + +#define GL_RGBA32UI_EXT 0x8D70 +#define GL_RGB32UI_EXT 0x8D71 +#define GL_ALPHA32UI_EXT 0x8D72 +#define GL_INTENSITY32UI_EXT 0x8D73 +#define GL_LUMINANCE32UI_EXT 0x8D74 +#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 +#define GL_RGBA16UI_EXT 0x8D76 +#define GL_RGB16UI_EXT 0x8D77 +#define GL_ALPHA16UI_EXT 0x8D78 +#define GL_INTENSITY16UI_EXT 0x8D79 +#define GL_LUMINANCE16UI_EXT 0x8D7A +#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B +#define GL_RGBA8UI_EXT 0x8D7C +#define GL_RGB8UI_EXT 0x8D7D +#define GL_ALPHA8UI_EXT 0x8D7E +#define GL_INTENSITY8UI_EXT 0x8D7F +#define GL_LUMINANCE8UI_EXT 0x8D80 +#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 +#define GL_RGBA32I_EXT 0x8D82 +#define GL_RGB32I_EXT 0x8D83 +#define GL_ALPHA32I_EXT 0x8D84 +#define GL_INTENSITY32I_EXT 0x8D85 +#define GL_LUMINANCE32I_EXT 0x8D86 +#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 +#define GL_RGBA16I_EXT 0x8D88 +#define GL_RGB16I_EXT 0x8D89 +#define GL_ALPHA16I_EXT 0x8D8A +#define GL_INTENSITY16I_EXT 0x8D8B +#define GL_LUMINANCE16I_EXT 0x8D8C +#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D +#define GL_RGBA8I_EXT 0x8D8E +#define GL_RGB8I_EXT 0x8D8F +#define GL_ALPHA8I_EXT 0x8D90 +#define GL_INTENSITY8I_EXT 0x8D91 +#define GL_LUMINANCE8I_EXT 0x8D92 +#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 +#define GL_RED_INTEGER_EXT 0x8D94 +#define GL_GREEN_INTEGER_EXT 0x8D95 +#define GL_BLUE_INTEGER_EXT 0x8D96 +#define GL_ALPHA_INTEGER_EXT 0x8D97 +#define GL_RGB_INTEGER_EXT 0x8D98 +#define GL_RGBA_INTEGER_EXT 0x8D99 +#define GL_BGR_INTEGER_EXT 0x8D9A +#define GL_BGRA_INTEGER_EXT 0x8D9B +#define GL_LUMINANCE_INTEGER_EXT 0x8D9C +#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D +#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E + +typedef void (GLAPIENTRY * PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); +typedef void (GLAPIENTRY * PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); + +#define glClearColorIiEXT GLEW_GET_FUN(__glewClearColorIiEXT) +#define glClearColorIuiEXT GLEW_GET_FUN(__glewClearColorIuiEXT) +#define glGetTexParameterIivEXT GLEW_GET_FUN(__glewGetTexParameterIivEXT) +#define glGetTexParameterIuivEXT GLEW_GET_FUN(__glewGetTexParameterIuivEXT) +#define glTexParameterIivEXT GLEW_GET_FUN(__glewTexParameterIivEXT) +#define glTexParameterIuivEXT GLEW_GET_FUN(__glewTexParameterIuivEXT) + +#define GLEW_EXT_texture_integer GLEW_GET_VAR(__GLEW_EXT_texture_integer) + +#endif /* GL_EXT_texture_integer */ + +/* ------------------------ GL_EXT_texture_lod_bias ------------------------ */ + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 + +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 + +#define GLEW_EXT_texture_lod_bias GLEW_GET_VAR(__GLEW_EXT_texture_lod_bias) + +#endif /* GL_EXT_texture_lod_bias */ + +/* ---------------------- GL_EXT_texture_mirror_clamp ---------------------- */ + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 + +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 + +#define GLEW_EXT_texture_mirror_clamp GLEW_GET_VAR(__GLEW_EXT_texture_mirror_clamp) + +#endif /* GL_EXT_texture_mirror_clamp */ + +/* ------------------------- GL_EXT_texture_norm16 ------------------------- */ + +#ifndef GL_EXT_texture_norm16 +#define GL_EXT_texture_norm16 1 + +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA16_EXT 0x805B +#define GL_R16_EXT 0x822A +#define GL_RG16_EXT 0x822C +#define GL_R16_SNORM_EXT 0x8F98 +#define GL_RG16_SNORM_EXT 0x8F99 +#define GL_RGB16_SNORM_EXT 0x8F9A +#define GL_RGBA16_SNORM_EXT 0x8F9B + +#define GLEW_EXT_texture_norm16 GLEW_GET_VAR(__GLEW_EXT_texture_norm16) + +#endif /* GL_EXT_texture_norm16 */ + +/* ------------------------- GL_EXT_texture_object ------------------------- */ + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 + +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A + +typedef GLboolean (GLAPIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint* textures, GLboolean* residences); +typedef void (GLAPIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (GLAPIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint* textures); +typedef void (GLAPIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint* textures); +typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (GLAPIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint* textures, const GLclampf* priorities); + +#define glAreTexturesResidentEXT GLEW_GET_FUN(__glewAreTexturesResidentEXT) +#define glBindTextureEXT GLEW_GET_FUN(__glewBindTextureEXT) +#define glDeleteTexturesEXT GLEW_GET_FUN(__glewDeleteTexturesEXT) +#define glGenTexturesEXT GLEW_GET_FUN(__glewGenTexturesEXT) +#define glIsTextureEXT GLEW_GET_FUN(__glewIsTextureEXT) +#define glPrioritizeTexturesEXT GLEW_GET_FUN(__glewPrioritizeTexturesEXT) + +#define GLEW_EXT_texture_object GLEW_GET_VAR(__GLEW_EXT_texture_object) + +#endif /* GL_EXT_texture_object */ + +/* --------------------- GL_EXT_texture_perturb_normal --------------------- */ + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 + +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF + +typedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode); + +#define glTextureNormalEXT GLEW_GET_FUN(__glewTextureNormalEXT) + +#define GLEW_EXT_texture_perturb_normal GLEW_GET_VAR(__GLEW_EXT_texture_perturb_normal) + +#endif /* GL_EXT_texture_perturb_normal */ + +/* ------------------------ GL_EXT_texture_rectangle ----------------------- */ + +#ifndef GL_EXT_texture_rectangle +#define GL_EXT_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_EXT 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8 + +#define GLEW_EXT_texture_rectangle GLEW_GET_VAR(__GLEW_EXT_texture_rectangle) + +#endif /* GL_EXT_texture_rectangle */ + +/* --------------------------- GL_EXT_texture_rg --------------------------- */ + +#ifndef GL_EXT_texture_rg +#define GL_EXT_texture_rg 1 + +#define GL_RED_EXT 0x1903 +#define GL_RG_EXT 0x8227 +#define GL_R8_EXT 0x8229 +#define GL_RG8_EXT 0x822B + +#define GLEW_EXT_texture_rg GLEW_GET_VAR(__GLEW_EXT_texture_rg) + +#endif /* GL_EXT_texture_rg */ + +/* -------------------------- GL_EXT_texture_sRGB -------------------------- */ + +#ifndef GL_EXT_texture_sRGB +#define GL_EXT_texture_sRGB 1 + +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB8_EXT 0x8C41 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 +#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 +#define GL_SLUMINANCE_EXT 0x8C46 +#define GL_SLUMINANCE8_EXT 0x8C47 +#define GL_COMPRESSED_SRGB_EXT 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 +#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F + +#define GLEW_EXT_texture_sRGB GLEW_GET_VAR(__GLEW_EXT_texture_sRGB) + +#endif /* GL_EXT_texture_sRGB */ + +/* ------------------------- GL_EXT_texture_sRGB_R8 ------------------------ */ + +#ifndef GL_EXT_texture_sRGB_R8 +#define GL_EXT_texture_sRGB_R8 1 + +#define GL_SR8_EXT 0x8FBD + +#define GLEW_EXT_texture_sRGB_R8 GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_R8) + +#endif /* GL_EXT_texture_sRGB_R8 */ + +/* ------------------------ GL_EXT_texture_sRGB_RG8 ------------------------ */ + +#ifndef GL_EXT_texture_sRGB_RG8 +#define GL_EXT_texture_sRGB_RG8 1 + +#define GL_SRG8_EXT 0x8FBE + +#define GLEW_EXT_texture_sRGB_RG8 GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_RG8) + +#endif /* GL_EXT_texture_sRGB_RG8 */ + +/* ----------------------- GL_EXT_texture_sRGB_decode ---------------------- */ + +#ifndef GL_EXT_texture_sRGB_decode +#define GL_EXT_texture_sRGB_decode 1 + +#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 +#define GL_DECODE_EXT 0x8A49 +#define GL_SKIP_DECODE_EXT 0x8A4A + +#define GLEW_EXT_texture_sRGB_decode GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_decode) + +#endif /* GL_EXT_texture_sRGB_decode */ + +/* --------------------- GL_EXT_texture_shared_exponent -------------------- */ + +#ifndef GL_EXT_texture_shared_exponent +#define GL_EXT_texture_shared_exponent 1 + +#define GL_RGB9_E5_EXT 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E +#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F + +#define GLEW_EXT_texture_shared_exponent GLEW_GET_VAR(__GLEW_EXT_texture_shared_exponent) + +#endif /* GL_EXT_texture_shared_exponent */ + +/* -------------------------- GL_EXT_texture_snorm ------------------------- */ + +#ifndef GL_EXT_texture_snorm +#define GL_EXT_texture_snorm 1 + +#define GL_RED_SNORM 0x8F90 +#define GL_RG_SNORM 0x8F91 +#define GL_RGB_SNORM 0x8F92 +#define GL_RGBA_SNORM 0x8F93 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM 0x8F98 +#define GL_RG16_SNORM 0x8F99 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGBA16_SNORM 0x8F9B +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_ALPHA_SNORM 0x9010 +#define GL_LUMINANCE_SNORM 0x9011 +#define GL_LUMINANCE_ALPHA_SNORM 0x9012 +#define GL_INTENSITY_SNORM 0x9013 +#define GL_ALPHA8_SNORM 0x9014 +#define GL_LUMINANCE8_SNORM 0x9015 +#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 +#define GL_INTENSITY8_SNORM 0x9017 +#define GL_ALPHA16_SNORM 0x9018 +#define GL_LUMINANCE16_SNORM 0x9019 +#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A +#define GL_INTENSITY16_SNORM 0x901B + +#define GLEW_EXT_texture_snorm GLEW_GET_VAR(__GLEW_EXT_texture_snorm) + +#endif /* GL_EXT_texture_snorm */ + +/* ------------------------- GL_EXT_texture_storage ------------------------ */ + +#ifndef GL_EXT_texture_storage +#define GL_EXT_texture_storage 1 + +#define GL_ALPHA8_EXT 0x803C +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_R8_EXT 0x8229 +#define GL_RG8_EXT 0x822B +#define GL_R16F_EXT 0x822D +#define GL_R32F_EXT 0x822E +#define GL_RG16F_EXT 0x822F +#define GL_RG32F_EXT 0x8230 +#define GL_RGBA32F_EXT 0x8814 +#define GL_RGB32F_EXT 0x8815 +#define GL_ALPHA32F_EXT 0x8816 +#define GL_LUMINANCE32F_EXT 0x8818 +#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 +#define GL_RGBA16F_EXT 0x881A +#define GL_RGB16F_EXT 0x881B +#define GL_ALPHA16F_EXT 0x881C +#define GL_LUMINANCE16F_EXT 0x881E +#define GL_LUMINANCE_ALPHA16F_EXT 0x881F +#define GL_RGB_RAW_422_APPLE 0x8A51 +#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F +#define GL_BGRA8_EXT 0x93A1 + +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); + +#define glTexStorage1DEXT GLEW_GET_FUN(__glewTexStorage1DEXT) +#define glTexStorage2DEXT GLEW_GET_FUN(__glewTexStorage2DEXT) +#define glTexStorage3DEXT GLEW_GET_FUN(__glewTexStorage3DEXT) +#define glTextureStorage1DEXT GLEW_GET_FUN(__glewTextureStorage1DEXT) +#define glTextureStorage2DEXT GLEW_GET_FUN(__glewTextureStorage2DEXT) +#define glTextureStorage3DEXT GLEW_GET_FUN(__glewTextureStorage3DEXT) + +#define GLEW_EXT_texture_storage GLEW_GET_VAR(__GLEW_EXT_texture_storage) + +#endif /* GL_EXT_texture_storage */ + +/* ------------------------- GL_EXT_texture_swizzle ------------------------ */ + +#ifndef GL_EXT_texture_swizzle +#define GL_EXT_texture_swizzle 1 + +#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 +#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 +#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 +#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 + +#define GLEW_EXT_texture_swizzle GLEW_GET_VAR(__GLEW_EXT_texture_swizzle) + +#endif /* GL_EXT_texture_swizzle */ + +/* ------------------- GL_EXT_texture_type_2_10_10_10_REV ------------------ */ + +#ifndef GL_EXT_texture_type_2_10_10_10_REV +#define GL_EXT_texture_type_2_10_10_10_REV 1 + +#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 + +#define GLEW_EXT_texture_type_2_10_10_10_REV GLEW_GET_VAR(__GLEW_EXT_texture_type_2_10_10_10_REV) + +#endif /* GL_EXT_texture_type_2_10_10_10_REV */ + +/* -------------------------- GL_EXT_texture_view -------------------------- */ + +#ifndef GL_EXT_texture_view +#define GL_EXT_texture_view 1 + +#define GL_TEXTURE_VIEW_MIN_LEVEL_EXT 0x82DB +#define GL_TEXTURE_VIEW_NUM_LEVELS_EXT 0x82DC +#define GL_TEXTURE_VIEW_MIN_LAYER_EXT 0x82DD +#define GL_TEXTURE_VIEW_NUM_LAYERS_EXT 0x82DE +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF + +typedef void (GLAPIENTRY * PFNGLTEXTUREVIEWEXTPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); + +#define glTextureViewEXT GLEW_GET_FUN(__glewTextureViewEXT) + +#define GLEW_EXT_texture_view GLEW_GET_VAR(__GLEW_EXT_texture_view) + +#endif /* GL_EXT_texture_view */ + +/* --------------------------- GL_EXT_timer_query -------------------------- */ + +#ifndef GL_EXT_timer_query +#define GL_EXT_timer_query 1 + +#define GL_TIME_ELAPSED_EXT 0x88BF + +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); + +#define glGetQueryObjecti64vEXT GLEW_GET_FUN(__glewGetQueryObjecti64vEXT) +#define glGetQueryObjectui64vEXT GLEW_GET_FUN(__glewGetQueryObjectui64vEXT) + +#define GLEW_EXT_timer_query GLEW_GET_VAR(__GLEW_EXT_timer_query) + +#endif /* GL_EXT_timer_query */ + +/* ----------------------- GL_EXT_transform_feedback ----------------------- */ + +#ifndef GL_EXT_transform_feedback +#define GL_EXT_transform_feedback 1 + +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 +#define GL_RASTERIZER_DISCARD_EXT 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C +#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F + +typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar * const* varyings, GLenum bufferMode); + +#define glBeginTransformFeedbackEXT GLEW_GET_FUN(__glewBeginTransformFeedbackEXT) +#define glBindBufferBaseEXT GLEW_GET_FUN(__glewBindBufferBaseEXT) +#define glBindBufferOffsetEXT GLEW_GET_FUN(__glewBindBufferOffsetEXT) +#define glBindBufferRangeEXT GLEW_GET_FUN(__glewBindBufferRangeEXT) +#define glEndTransformFeedbackEXT GLEW_GET_FUN(__glewEndTransformFeedbackEXT) +#define glGetTransformFeedbackVaryingEXT GLEW_GET_FUN(__glewGetTransformFeedbackVaryingEXT) +#define glTransformFeedbackVaryingsEXT GLEW_GET_FUN(__glewTransformFeedbackVaryingsEXT) + +#define GLEW_EXT_transform_feedback GLEW_GET_VAR(__GLEW_EXT_transform_feedback) + +#endif /* GL_EXT_transform_feedback */ + +/* ------------------------- GL_EXT_unpack_subimage ------------------------ */ + +#ifndef GL_EXT_unpack_subimage +#define GL_EXT_unpack_subimage 1 + +#define GL_UNPACK_ROW_LENGTH_EXT 0x0CF2 +#define GL_UNPACK_SKIP_ROWS_EXT 0x0CF3 +#define GL_UNPACK_SKIP_PIXELS_EXT 0x0CF4 + +#define GLEW_EXT_unpack_subimage GLEW_GET_VAR(__GLEW_EXT_unpack_subimage) + +#endif /* GL_EXT_unpack_subimage */ + +/* -------------------------- GL_EXT_vertex_array -------------------------- */ + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 + +#define GL_DOUBLE_EXT 0x140A +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 + +typedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer); +typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); + +#define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT) +#define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT) +#define glDrawArraysEXT GLEW_GET_FUN(__glewDrawArraysEXT) +#define glEdgeFlagPointerEXT GLEW_GET_FUN(__glewEdgeFlagPointerEXT) +#define glIndexPointerEXT GLEW_GET_FUN(__glewIndexPointerEXT) +#define glNormalPointerEXT GLEW_GET_FUN(__glewNormalPointerEXT) +#define glTexCoordPointerEXT GLEW_GET_FUN(__glewTexCoordPointerEXT) +#define glVertexPointerEXT GLEW_GET_FUN(__glewVertexPointerEXT) + +#define GLEW_EXT_vertex_array GLEW_GET_VAR(__GLEW_EXT_vertex_array) + +#endif /* GL_EXT_vertex_array */ + +/* ------------------------ GL_EXT_vertex_array_bgra ----------------------- */ + +#ifndef GL_EXT_vertex_array_bgra +#define GL_EXT_vertex_array_bgra 1 + +#define GL_BGRA 0x80E1 + +#define GLEW_EXT_vertex_array_bgra GLEW_GET_VAR(__GLEW_EXT_vertex_array_bgra) + +#endif /* GL_EXT_vertex_array_bgra */ + +/* ----------------------- GL_EXT_vertex_array_setXXX ---------------------- */ + +#ifndef GL_EXT_vertex_array_setXXX +#define GL_EXT_vertex_array_setXXX 1 + +typedef void (GLAPIENTRY * PFNGLBINDARRAYSETEXTPROC) (const void *arrayset); +typedef const void * (GLAPIENTRY * PFNGLCREATEARRAYSETEXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLDELETEARRAYSETSEXTPROC) (GLsizei n, const void *arrayset[]); + +#define glBindArraySetEXT GLEW_GET_FUN(__glewBindArraySetEXT) +#define glCreateArraySetExt GLEW_GET_FUN(__glewCreateArraySetExt) +#define glDeleteArraySetsEXT GLEW_GET_FUN(__glewDeleteArraySetsEXT) + +#define GLEW_EXT_vertex_array_setXXX GLEW_GET_VAR(__GLEW_EXT_vertex_array_setXXX) + +#endif /* GL_EXT_vertex_array_setXXX */ + +/* ----------------------- GL_EXT_vertex_attrib_64bit ---------------------- */ + +#ifndef GL_EXT_vertex_attrib_64bit +#define GL_EXT_vertex_attrib_64bit 1 + +#define GL_DOUBLE_MAT2_EXT 0x8F46 +#define GL_DOUBLE_MAT3_EXT 0x8F47 +#define GL_DOUBLE_MAT4_EXT 0x8F48 +#define GL_DOUBLE_MAT2x3_EXT 0x8F49 +#define GL_DOUBLE_MAT2x4_EXT 0x8F4A +#define GL_DOUBLE_MAT3x2_EXT 0x8F4B +#define GL_DOUBLE_MAT3x4_EXT 0x8F4C +#define GL_DOUBLE_MAT4x2_EXT 0x8F4D +#define GL_DOUBLE_MAT4x3_EXT 0x8F4E +#define GL_DOUBLE_VEC2_EXT 0x8FFC +#define GL_DOUBLE_VEC3_EXT 0x8FFD +#define GL_DOUBLE_VEC4_EXT 0x8FFE + +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); + +#define glGetVertexAttribLdvEXT GLEW_GET_FUN(__glewGetVertexAttribLdvEXT) +#define glVertexArrayVertexAttribLOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLOffsetEXT) +#define glVertexAttribL1dEXT GLEW_GET_FUN(__glewVertexAttribL1dEXT) +#define glVertexAttribL1dvEXT GLEW_GET_FUN(__glewVertexAttribL1dvEXT) +#define glVertexAttribL2dEXT GLEW_GET_FUN(__glewVertexAttribL2dEXT) +#define glVertexAttribL2dvEXT GLEW_GET_FUN(__glewVertexAttribL2dvEXT) +#define glVertexAttribL3dEXT GLEW_GET_FUN(__glewVertexAttribL3dEXT) +#define glVertexAttribL3dvEXT GLEW_GET_FUN(__glewVertexAttribL3dvEXT) +#define glVertexAttribL4dEXT GLEW_GET_FUN(__glewVertexAttribL4dEXT) +#define glVertexAttribL4dvEXT GLEW_GET_FUN(__glewVertexAttribL4dvEXT) +#define glVertexAttribLPointerEXT GLEW_GET_FUN(__glewVertexAttribLPointerEXT) + +#define GLEW_EXT_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_EXT_vertex_attrib_64bit) + +#endif /* GL_EXT_vertex_attrib_64bit */ + +/* -------------------------- GL_EXT_vertex_shader ------------------------- */ + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 + +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED + +typedef void (GLAPIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef void (GLAPIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (GLAPIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components); +typedef GLuint (GLAPIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, void **data); +typedef void (GLAPIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLboolean (GLAPIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (GLAPIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, void *addr); +typedef void (GLAPIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, void *addr); +typedef void (GLAPIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (GLAPIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (GLAPIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (GLAPIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (GLAPIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, void *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, GLbyte *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, GLdouble *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, GLfloat *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, GLint *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, GLshort *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, GLubyte *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, GLuint *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, GLushort *addr); +typedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); + +#define glBeginVertexShaderEXT GLEW_GET_FUN(__glewBeginVertexShaderEXT) +#define glBindLightParameterEXT GLEW_GET_FUN(__glewBindLightParameterEXT) +#define glBindMaterialParameterEXT GLEW_GET_FUN(__glewBindMaterialParameterEXT) +#define glBindParameterEXT GLEW_GET_FUN(__glewBindParameterEXT) +#define glBindTexGenParameterEXT GLEW_GET_FUN(__glewBindTexGenParameterEXT) +#define glBindTextureUnitParameterEXT GLEW_GET_FUN(__glewBindTextureUnitParameterEXT) +#define glBindVertexShaderEXT GLEW_GET_FUN(__glewBindVertexShaderEXT) +#define glDeleteVertexShaderEXT GLEW_GET_FUN(__glewDeleteVertexShaderEXT) +#define glDisableVariantClientStateEXT GLEW_GET_FUN(__glewDisableVariantClientStateEXT) +#define glEnableVariantClientStateEXT GLEW_GET_FUN(__glewEnableVariantClientStateEXT) +#define glEndVertexShaderEXT GLEW_GET_FUN(__glewEndVertexShaderEXT) +#define glExtractComponentEXT GLEW_GET_FUN(__glewExtractComponentEXT) +#define glGenSymbolsEXT GLEW_GET_FUN(__glewGenSymbolsEXT) +#define glGenVertexShadersEXT GLEW_GET_FUN(__glewGenVertexShadersEXT) +#define glGetInvariantBooleanvEXT GLEW_GET_FUN(__glewGetInvariantBooleanvEXT) +#define glGetInvariantFloatvEXT GLEW_GET_FUN(__glewGetInvariantFloatvEXT) +#define glGetInvariantIntegervEXT GLEW_GET_FUN(__glewGetInvariantIntegervEXT) +#define glGetLocalConstantBooleanvEXT GLEW_GET_FUN(__glewGetLocalConstantBooleanvEXT) +#define glGetLocalConstantFloatvEXT GLEW_GET_FUN(__glewGetLocalConstantFloatvEXT) +#define glGetLocalConstantIntegervEXT GLEW_GET_FUN(__glewGetLocalConstantIntegervEXT) +#define glGetVariantBooleanvEXT GLEW_GET_FUN(__glewGetVariantBooleanvEXT) +#define glGetVariantFloatvEXT GLEW_GET_FUN(__glewGetVariantFloatvEXT) +#define glGetVariantIntegervEXT GLEW_GET_FUN(__glewGetVariantIntegervEXT) +#define glGetVariantPointervEXT GLEW_GET_FUN(__glewGetVariantPointervEXT) +#define glInsertComponentEXT GLEW_GET_FUN(__glewInsertComponentEXT) +#define glIsVariantEnabledEXT GLEW_GET_FUN(__glewIsVariantEnabledEXT) +#define glSetInvariantEXT GLEW_GET_FUN(__glewSetInvariantEXT) +#define glSetLocalConstantEXT GLEW_GET_FUN(__glewSetLocalConstantEXT) +#define glShaderOp1EXT GLEW_GET_FUN(__glewShaderOp1EXT) +#define glShaderOp2EXT GLEW_GET_FUN(__glewShaderOp2EXT) +#define glShaderOp3EXT GLEW_GET_FUN(__glewShaderOp3EXT) +#define glSwizzleEXT GLEW_GET_FUN(__glewSwizzleEXT) +#define glVariantPointerEXT GLEW_GET_FUN(__glewVariantPointerEXT) +#define glVariantbvEXT GLEW_GET_FUN(__glewVariantbvEXT) +#define glVariantdvEXT GLEW_GET_FUN(__glewVariantdvEXT) +#define glVariantfvEXT GLEW_GET_FUN(__glewVariantfvEXT) +#define glVariantivEXT GLEW_GET_FUN(__glewVariantivEXT) +#define glVariantsvEXT GLEW_GET_FUN(__glewVariantsvEXT) +#define glVariantubvEXT GLEW_GET_FUN(__glewVariantubvEXT) +#define glVariantuivEXT GLEW_GET_FUN(__glewVariantuivEXT) +#define glVariantusvEXT GLEW_GET_FUN(__glewVariantusvEXT) +#define glWriteMaskEXT GLEW_GET_FUN(__glewWriteMaskEXT) + +#define GLEW_EXT_vertex_shader GLEW_GET_VAR(__GLEW_EXT_vertex_shader) + +#endif /* GL_EXT_vertex_shader */ + +/* ------------------------ GL_EXT_vertex_weighting ------------------------ */ + +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 + +#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 +#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 +#define GL_MODELVIEW0_EXT 0x1700 +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 + +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight); + +#define glVertexWeightPointerEXT GLEW_GET_FUN(__glewVertexWeightPointerEXT) +#define glVertexWeightfEXT GLEW_GET_FUN(__glewVertexWeightfEXT) +#define glVertexWeightfvEXT GLEW_GET_FUN(__glewVertexWeightfvEXT) + +#define GLEW_EXT_vertex_weighting GLEW_GET_VAR(__GLEW_EXT_vertex_weighting) + +#endif /* GL_EXT_vertex_weighting */ + +/* ------------------------ GL_EXT_win32_keyed_mutex ----------------------- */ + +#ifndef GL_EXT_win32_keyed_mutex +#define GL_EXT_win32_keyed_mutex 1 + +typedef GLboolean (GLAPIENTRY * PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key, GLuint timeout); +typedef GLboolean (GLAPIENTRY * PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key); + +#define glAcquireKeyedMutexWin32EXT GLEW_GET_FUN(__glewAcquireKeyedMutexWin32EXT) +#define glReleaseKeyedMutexWin32EXT GLEW_GET_FUN(__glewReleaseKeyedMutexWin32EXT) + +#define GLEW_EXT_win32_keyed_mutex GLEW_GET_VAR(__GLEW_EXT_win32_keyed_mutex) + +#endif /* GL_EXT_win32_keyed_mutex */ + +/* ------------------------ GL_EXT_window_rectangles ----------------------- */ + +#ifndef GL_EXT_window_rectangles +#define GL_EXT_window_rectangles 1 + +#define GL_INCLUSIVE_EXT 0x8F10 +#define GL_EXCLUSIVE_EXT 0x8F11 +#define GL_WINDOW_RECTANGLE_EXT 0x8F12 +#define GL_WINDOW_RECTANGLE_MODE_EXT 0x8F13 +#define GL_MAX_WINDOW_RECTANGLES_EXT 0x8F14 +#define GL_NUM_WINDOW_RECTANGLES_EXT 0x8F15 + +typedef void (GLAPIENTRY * PFNGLWINDOWRECTANGLESEXTPROC) (GLenum mode, GLsizei count, const GLint box[]); + +#define glWindowRectanglesEXT GLEW_GET_FUN(__glewWindowRectanglesEXT) + +#define GLEW_EXT_window_rectangles GLEW_GET_VAR(__GLEW_EXT_window_rectangles) + +#endif /* GL_EXT_window_rectangles */ + +/* ------------------------- GL_EXT_x11_sync_object ------------------------ */ + +#ifndef GL_EXT_x11_sync_object +#define GL_EXT_x11_sync_object 1 + +#define GL_SYNC_X11_FENCE_EXT 0x90E1 + +typedef GLsync (GLAPIENTRY * PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); + +#define glImportSyncEXT GLEW_GET_FUN(__glewImportSyncEXT) + +#define GLEW_EXT_x11_sync_object GLEW_GET_VAR(__GLEW_EXT_x11_sync_object) + +#endif /* GL_EXT_x11_sync_object */ + +/* ---------------------- GL_GREMEDY_frame_terminator ---------------------- */ + +#ifndef GL_GREMEDY_frame_terminator +#define GL_GREMEDY_frame_terminator 1 + +typedef void (GLAPIENTRY * PFNGLFRAMETERMINATORGREMEDYPROC) (void); + +#define glFrameTerminatorGREMEDY GLEW_GET_FUN(__glewFrameTerminatorGREMEDY) + +#define GLEW_GREMEDY_frame_terminator GLEW_GET_VAR(__GLEW_GREMEDY_frame_terminator) + +#endif /* GL_GREMEDY_frame_terminator */ + +/* ------------------------ GL_GREMEDY_string_marker ----------------------- */ + +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 + +typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void *string); + +#define glStringMarkerGREMEDY GLEW_GET_FUN(__glewStringMarkerGREMEDY) + +#define GLEW_GREMEDY_string_marker GLEW_GET_VAR(__GLEW_GREMEDY_string_marker) + +#endif /* GL_GREMEDY_string_marker */ + +/* --------------------- GL_HP_convolution_border_modes -------------------- */ + +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 + +#define GLEW_HP_convolution_border_modes GLEW_GET_VAR(__GLEW_HP_convolution_border_modes) + +#endif /* GL_HP_convolution_border_modes */ + +/* ------------------------- GL_HP_image_transform ------------------------- */ + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 + +typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glGetImageTransformParameterfvHP GLEW_GET_FUN(__glewGetImageTransformParameterfvHP) +#define glGetImageTransformParameterivHP GLEW_GET_FUN(__glewGetImageTransformParameterivHP) +#define glImageTransformParameterfHP GLEW_GET_FUN(__glewImageTransformParameterfHP) +#define glImageTransformParameterfvHP GLEW_GET_FUN(__glewImageTransformParameterfvHP) +#define glImageTransformParameteriHP GLEW_GET_FUN(__glewImageTransformParameteriHP) +#define glImageTransformParameterivHP GLEW_GET_FUN(__glewImageTransformParameterivHP) + +#define GLEW_HP_image_transform GLEW_GET_VAR(__GLEW_HP_image_transform) + +#endif /* GL_HP_image_transform */ + +/* -------------------------- GL_HP_occlusion_test ------------------------- */ + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 + +#define GLEW_HP_occlusion_test GLEW_GET_VAR(__GLEW_HP_occlusion_test) + +#endif /* GL_HP_occlusion_test */ + +/* ------------------------- GL_HP_texture_lighting ------------------------ */ + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 + +#define GLEW_HP_texture_lighting GLEW_GET_VAR(__GLEW_HP_texture_lighting) + +#endif /* GL_HP_texture_lighting */ + +/* --------------------------- GL_IBM_cull_vertex -------------------------- */ + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 + +#define GL_CULL_VERTEX_IBM 103050 + +#define GLEW_IBM_cull_vertex GLEW_GET_VAR(__GLEW_IBM_cull_vertex) + +#endif /* GL_IBM_cull_vertex */ + +/* ---------------------- GL_IBM_multimode_draw_arrays --------------------- */ + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 + +typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum* mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum* mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei primcount, GLint modestride); + +#define glMultiModeDrawArraysIBM GLEW_GET_FUN(__glewMultiModeDrawArraysIBM) +#define glMultiModeDrawElementsIBM GLEW_GET_FUN(__glewMultiModeDrawElementsIBM) + +#define GLEW_IBM_multimode_draw_arrays GLEW_GET_VAR(__GLEW_IBM_multimode_draw_arrays) + +#endif /* GL_IBM_multimode_draw_arrays */ + +/* ------------------------- GL_IBM_rasterpos_clip ------------------------- */ + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 + +#define GL_RASTER_POSITION_UNCLIPPED_IBM 103010 + +#define GLEW_IBM_rasterpos_clip GLEW_GET_VAR(__GLEW_IBM_rasterpos_clip) + +#endif /* GL_IBM_rasterpos_clip */ + +/* --------------------------- GL_IBM_static_data -------------------------- */ + +#ifndef GL_IBM_static_data +#define GL_IBM_static_data 1 + +#define GL_ALL_STATIC_DATA_IBM 103060 +#define GL_STATIC_VERTEX_ARRAY_IBM 103061 + +#define GLEW_IBM_static_data GLEW_GET_VAR(__GLEW_IBM_static_data) + +#endif /* GL_IBM_static_data */ + +/* --------------------- GL_IBM_texture_mirrored_repeat -------------------- */ + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_IBM_texture_mirrored_repeat 1 + +#define GL_MIRRORED_REPEAT_IBM 0x8370 + +#define GLEW_IBM_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_IBM_texture_mirrored_repeat) + +#endif /* GL_IBM_texture_mirrored_repeat */ + +/* ----------------------- GL_IBM_vertex_array_lists ----------------------- */ + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 + +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 + +typedef void (GLAPIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); + +#define glColorPointerListIBM GLEW_GET_FUN(__glewColorPointerListIBM) +#define glEdgeFlagPointerListIBM GLEW_GET_FUN(__glewEdgeFlagPointerListIBM) +#define glFogCoordPointerListIBM GLEW_GET_FUN(__glewFogCoordPointerListIBM) +#define glIndexPointerListIBM GLEW_GET_FUN(__glewIndexPointerListIBM) +#define glNormalPointerListIBM GLEW_GET_FUN(__glewNormalPointerListIBM) +#define glSecondaryColorPointerListIBM GLEW_GET_FUN(__glewSecondaryColorPointerListIBM) +#define glTexCoordPointerListIBM GLEW_GET_FUN(__glewTexCoordPointerListIBM) +#define glVertexPointerListIBM GLEW_GET_FUN(__glewVertexPointerListIBM) + +#define GLEW_IBM_vertex_array_lists GLEW_GET_VAR(__GLEW_IBM_vertex_array_lists) + +#endif /* GL_IBM_vertex_array_lists */ + +/* -------------------------- GL_INGR_color_clamp -------------------------- */ + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 + +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 + +#define GLEW_INGR_color_clamp GLEW_GET_VAR(__GLEW_INGR_color_clamp) + +#endif /* GL_INGR_color_clamp */ + +/* ------------------------- GL_INGR_interlace_read ------------------------ */ + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 + +#define GL_INTERLACE_READ_INGR 0x8568 + +#define GLEW_INGR_interlace_read GLEW_GET_VAR(__GLEW_INGR_interlace_read) + +#endif /* GL_INGR_interlace_read */ + +/* ------------------ GL_INTEL_conservative_rasterization ------------------ */ + +#ifndef GL_INTEL_conservative_rasterization +#define GL_INTEL_conservative_rasterization 1 + +#define GL_CONSERVATIVE_RASTERIZATION_INTEL 0x83FE + +#define GLEW_INTEL_conservative_rasterization GLEW_GET_VAR(__GLEW_INTEL_conservative_rasterization) + +#endif /* GL_INTEL_conservative_rasterization */ + +/* ------------------- GL_INTEL_fragment_shader_ordering ------------------- */ + +#ifndef GL_INTEL_fragment_shader_ordering +#define GL_INTEL_fragment_shader_ordering 1 + +#define GLEW_INTEL_fragment_shader_ordering GLEW_GET_VAR(__GLEW_INTEL_fragment_shader_ordering) + +#endif /* GL_INTEL_fragment_shader_ordering */ + +/* ----------------------- GL_INTEL_framebuffer_CMAA ----------------------- */ + +#ifndef GL_INTEL_framebuffer_CMAA +#define GL_INTEL_framebuffer_CMAA 1 + +#define GLEW_INTEL_framebuffer_CMAA GLEW_GET_VAR(__GLEW_INTEL_framebuffer_CMAA) + +#endif /* GL_INTEL_framebuffer_CMAA */ + +/* -------------------------- GL_INTEL_map_texture ------------------------- */ + +#ifndef GL_INTEL_map_texture +#define GL_INTEL_map_texture 1 + +#define GL_LAYOUT_DEFAULT_INTEL 0 +#define GL_LAYOUT_LINEAR_INTEL 1 +#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 +#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF + +typedef void * (GLAPIENTRY * PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint* stride, GLenum *layout); +typedef void (GLAPIENTRY * PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); +typedef void (GLAPIENTRY * PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); + +#define glMapTexture2DINTEL GLEW_GET_FUN(__glewMapTexture2DINTEL) +#define glSyncTextureINTEL GLEW_GET_FUN(__glewSyncTextureINTEL) +#define glUnmapTexture2DINTEL GLEW_GET_FUN(__glewUnmapTexture2DINTEL) + +#define GLEW_INTEL_map_texture GLEW_GET_VAR(__GLEW_INTEL_map_texture) + +#endif /* GL_INTEL_map_texture */ + +/* ------------------------ GL_INTEL_parallel_arrays ----------------------- */ + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 + +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 + +typedef void (GLAPIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); + +#define glColorPointervINTEL GLEW_GET_FUN(__glewColorPointervINTEL) +#define glNormalPointervINTEL GLEW_GET_FUN(__glewNormalPointervINTEL) +#define glTexCoordPointervINTEL GLEW_GET_FUN(__glewTexCoordPointervINTEL) +#define glVertexPointervINTEL GLEW_GET_FUN(__glewVertexPointervINTEL) + +#define GLEW_INTEL_parallel_arrays GLEW_GET_VAR(__GLEW_INTEL_parallel_arrays) + +#endif /* GL_INTEL_parallel_arrays */ + +/* ----------------------- GL_INTEL_performance_query ---------------------- */ + +#ifndef GL_INTEL_performance_query +#define GL_INTEL_performance_query 1 + +#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x0000 +#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x0001 +#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 +#define GL_PERFQUERY_FLUSH_INTEL 0x83FA +#define GL_PERFQUERY_WAIT_INTEL 0x83FB +#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 +#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 +#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 +#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 +#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 +#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 +#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 +#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 +#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA +#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB +#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC +#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD +#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE +#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF +#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 + +typedef void (GLAPIENTRY * PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (GLAPIENTRY * PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint* queryHandle); +typedef void (GLAPIENTRY * PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (GLAPIENTRY * PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (GLAPIENTRY * PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint* queryId); +typedef void (GLAPIENTRY * PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint* nextQueryId); +typedef void (GLAPIENTRY * PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar* counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +typedef void (GLAPIENTRY * PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); +typedef void (GLAPIENTRY * PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar* queryName, GLuint *queryId); +typedef void (GLAPIENTRY * PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar* queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); + +#define glBeginPerfQueryINTEL GLEW_GET_FUN(__glewBeginPerfQueryINTEL) +#define glCreatePerfQueryINTEL GLEW_GET_FUN(__glewCreatePerfQueryINTEL) +#define glDeletePerfQueryINTEL GLEW_GET_FUN(__glewDeletePerfQueryINTEL) +#define glEndPerfQueryINTEL GLEW_GET_FUN(__glewEndPerfQueryINTEL) +#define glGetFirstPerfQueryIdINTEL GLEW_GET_FUN(__glewGetFirstPerfQueryIdINTEL) +#define glGetNextPerfQueryIdINTEL GLEW_GET_FUN(__glewGetNextPerfQueryIdINTEL) +#define glGetPerfCounterInfoINTEL GLEW_GET_FUN(__glewGetPerfCounterInfoINTEL) +#define glGetPerfQueryDataINTEL GLEW_GET_FUN(__glewGetPerfQueryDataINTEL) +#define glGetPerfQueryIdByNameINTEL GLEW_GET_FUN(__glewGetPerfQueryIdByNameINTEL) +#define glGetPerfQueryInfoINTEL GLEW_GET_FUN(__glewGetPerfQueryInfoINTEL) + +#define GLEW_INTEL_performance_query GLEW_GET_VAR(__GLEW_INTEL_performance_query) + +#endif /* GL_INTEL_performance_query */ + +/* ------------------------ GL_INTEL_texture_scissor ----------------------- */ + +#ifndef GL_INTEL_texture_scissor +#define GL_INTEL_texture_scissor 1 + +typedef void (GLAPIENTRY * PFNGLTEXSCISSORFUNCINTELPROC) (GLenum target, GLenum lfunc, GLenum hfunc); +typedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tlow, GLclampf thigh); + +#define glTexScissorFuncINTEL GLEW_GET_FUN(__glewTexScissorFuncINTEL) +#define glTexScissorINTEL GLEW_GET_FUN(__glewTexScissorINTEL) + +#define GLEW_INTEL_texture_scissor GLEW_GET_VAR(__GLEW_INTEL_texture_scissor) + +#endif /* GL_INTEL_texture_scissor */ + +/* --------------------- GL_KHR_blend_equation_advanced -------------------- */ + +#ifndef GL_KHR_blend_equation_advanced +#define GL_KHR_blend_equation_advanced 1 + +#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 +#define GL_MULTIPLY_KHR 0x9294 +#define GL_SCREEN_KHR 0x9295 +#define GL_OVERLAY_KHR 0x9296 +#define GL_DARKEN_KHR 0x9297 +#define GL_LIGHTEN_KHR 0x9298 +#define GL_COLORDODGE_KHR 0x9299 +#define GL_COLORBURN_KHR 0x929A +#define GL_HARDLIGHT_KHR 0x929B +#define GL_SOFTLIGHT_KHR 0x929C +#define GL_DIFFERENCE_KHR 0x929E +#define GL_EXCLUSION_KHR 0x92A0 +#define GL_HSL_HUE_KHR 0x92AD +#define GL_HSL_SATURATION_KHR 0x92AE +#define GL_HSL_COLOR_KHR 0x92AF +#define GL_HSL_LUMINOSITY_KHR 0x92B0 + +typedef void (GLAPIENTRY * PFNGLBLENDBARRIERKHRPROC) (void); + +#define glBlendBarrierKHR GLEW_GET_FUN(__glewBlendBarrierKHR) + +#define GLEW_KHR_blend_equation_advanced GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced) + +#endif /* GL_KHR_blend_equation_advanced */ + +/* ---------------- GL_KHR_blend_equation_advanced_coherent ---------------- */ + +#ifndef GL_KHR_blend_equation_advanced_coherent +#define GL_KHR_blend_equation_advanced_coherent 1 + +#define GLEW_KHR_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced_coherent) + +#endif /* GL_KHR_blend_equation_advanced_coherent */ + +/* ---------------------- GL_KHR_context_flush_control --------------------- */ + +#ifndef GL_KHR_context_flush_control +#define GL_KHR_context_flush_control 1 + +#define GLEW_KHR_context_flush_control GLEW_GET_VAR(__GLEW_KHR_context_flush_control) + +#endif /* GL_KHR_context_flush_control */ + +/* ------------------------------ GL_KHR_debug ----------------------------- */ + +#ifndef GL_KHR_debug +#define GL_KHR_debug 1 + +#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 +#define GL_DEBUG_SOURCE_API 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION 0x824A +#define GL_DEBUG_SOURCE_OTHER 0x824B +#define GL_DEBUG_TYPE_ERROR 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E +#define GL_DEBUG_TYPE_PORTABILITY 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 +#define GL_DEBUG_TYPE_OTHER 0x8251 +#define GL_DEBUG_TYPE_MARKER 0x8268 +#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 +#define GL_DEBUG_TYPE_POP_GROUP 0x826A +#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C +#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D +#define GL_BUFFER 0x82E0 +#define GL_SHADER 0x82E1 +#define GL_PROGRAM 0x82E2 +#define GL_QUERY 0x82E3 +#define GL_PROGRAM_PIPELINE 0x82E4 +#define GL_SAMPLER 0x82E6 +#define GL_DISPLAY_LIST 0x82E7 +#define GL_MAX_LABEL_LENGTH 0x82E8 +#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES 0x9145 +#define GL_DEBUG_SEVERITY_HIGH 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#define GL_DEBUG_SEVERITY_LOW 0x9148 +#define GL_DEBUG_OUTPUT 0x92E0 + +typedef void (GLAPIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); + +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); +typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); +typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar *label); +typedef void (GLAPIENTRY * PFNGLGETOBJECTPTRLABELPROC) (void* ptr, GLsizei bufSize, GLsizei* length, GLchar *label); +typedef void (GLAPIENTRY * PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar* label); +typedef void (GLAPIENTRY * PFNGLOBJECTPTRLABELPROC) (void* ptr, GLsizei length, const GLchar* label); +typedef void (GLAPIENTRY * PFNGLPOPDEBUGGROUPPROC) (void); +typedef void (GLAPIENTRY * PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar * message); + +#define glDebugMessageCallback GLEW_GET_FUN(__glewDebugMessageCallback) +#define glDebugMessageControl GLEW_GET_FUN(__glewDebugMessageControl) +#define glDebugMessageInsert GLEW_GET_FUN(__glewDebugMessageInsert) +#define glGetDebugMessageLog GLEW_GET_FUN(__glewGetDebugMessageLog) +#define glGetObjectLabel GLEW_GET_FUN(__glewGetObjectLabel) +#define glGetObjectPtrLabel GLEW_GET_FUN(__glewGetObjectPtrLabel) +#define glObjectLabel GLEW_GET_FUN(__glewObjectLabel) +#define glObjectPtrLabel GLEW_GET_FUN(__glewObjectPtrLabel) +#define glPopDebugGroup GLEW_GET_FUN(__glewPopDebugGroup) +#define glPushDebugGroup GLEW_GET_FUN(__glewPushDebugGroup) + +#define GLEW_KHR_debug GLEW_GET_VAR(__GLEW_KHR_debug) + +#endif /* GL_KHR_debug */ + +/* ---------------------------- GL_KHR_no_error ---------------------------- */ + +#ifndef GL_KHR_no_error +#define GL_KHR_no_error 1 + +#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 + +#define GLEW_KHR_no_error GLEW_GET_VAR(__GLEW_KHR_no_error) + +#endif /* GL_KHR_no_error */ + +/* --------------------- GL_KHR_parallel_shader_compile -------------------- */ + +#ifndef GL_KHR_parallel_shader_compile +#define GL_KHR_parallel_shader_compile 1 + +#define GL_MAX_SHADER_COMPILER_THREADS_KHR 0x91B0 +#define GL_COMPLETION_STATUS_KHR 0x91B1 + +typedef void (GLAPIENTRY * PFNGLMAXSHADERCOMPILERTHREADSKHRPROC) (GLuint count); + +#define glMaxShaderCompilerThreadsKHR GLEW_GET_FUN(__glewMaxShaderCompilerThreadsKHR) + +#define GLEW_KHR_parallel_shader_compile GLEW_GET_VAR(__GLEW_KHR_parallel_shader_compile) + +#endif /* GL_KHR_parallel_shader_compile */ + +/* ------------------ GL_KHR_robust_buffer_access_behavior ----------------- */ + +#ifndef GL_KHR_robust_buffer_access_behavior +#define GL_KHR_robust_buffer_access_behavior 1 + +#define GLEW_KHR_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_KHR_robust_buffer_access_behavior) + +#endif /* GL_KHR_robust_buffer_access_behavior */ + +/* --------------------------- GL_KHR_robustness --------------------------- */ + +#ifndef GL_KHR_robustness +#define GL_KHR_robustness 1 + +#define GL_CONTEXT_LOST 0x0507 +#define GL_LOSE_CONTEXT_ON_RESET 0x8252 +#define GL_GUILTY_CONTEXT_RESET 0x8253 +#define GL_INNOCENT_CONTEXT_RESET 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY 0x8256 +#define GL_NO_RESET_NOTIFICATION 0x8261 +#define GL_CONTEXT_ROBUST_ACCESS 0x90F3 + +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params); +typedef void (GLAPIENTRY * PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); + +#define glGetnUniformfv GLEW_GET_FUN(__glewGetnUniformfv) +#define glGetnUniformiv GLEW_GET_FUN(__glewGetnUniformiv) +#define glGetnUniformuiv GLEW_GET_FUN(__glewGetnUniformuiv) +#define glReadnPixels GLEW_GET_FUN(__glewReadnPixels) + +#define GLEW_KHR_robustness GLEW_GET_VAR(__GLEW_KHR_robustness) + +#endif /* GL_KHR_robustness */ + +/* ------------------ GL_KHR_texture_compression_astc_hdr ------------------ */ + +#ifndef GL_KHR_texture_compression_astc_hdr +#define GL_KHR_texture_compression_astc_hdr 1 + +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD + +#define GLEW_KHR_texture_compression_astc_hdr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_hdr) + +#endif /* GL_KHR_texture_compression_astc_hdr */ + +/* ------------------ GL_KHR_texture_compression_astc_ldr ------------------ */ + +#ifndef GL_KHR_texture_compression_astc_ldr +#define GL_KHR_texture_compression_astc_ldr 1 + +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD + +#define GLEW_KHR_texture_compression_astc_ldr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_ldr) + +#endif /* GL_KHR_texture_compression_astc_ldr */ + +/* --------------- GL_KHR_texture_compression_astc_sliced_3d --------------- */ + +#ifndef GL_KHR_texture_compression_astc_sliced_3d +#define GL_KHR_texture_compression_astc_sliced_3d 1 + +#define GLEW_KHR_texture_compression_astc_sliced_3d GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_sliced_3d) + +#endif /* GL_KHR_texture_compression_astc_sliced_3d */ + +/* -------------------------- GL_KTX_buffer_region ------------------------- */ + +#ifndef GL_KTX_buffer_region +#define GL_KTX_buffer_region 1 + +#define GL_KTX_FRONT_REGION 0x0 +#define GL_KTX_BACK_REGION 0x1 +#define GL_KTX_Z_REGION 0x2 +#define GL_KTX_STENCIL_REGION 0x3 + +typedef GLuint (GLAPIENTRY * PFNGLBUFFERREGIONENABLEDPROC) (void); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERREGIONPROC) (GLenum region); +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest); +typedef GLuint (GLAPIENTRY * PFNGLNEWBUFFERREGIONPROC) (GLenum region); +typedef void (GLAPIENTRY * PFNGLREADBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height); + +#define glBufferRegionEnabled GLEW_GET_FUN(__glewBufferRegionEnabled) +#define glDeleteBufferRegion GLEW_GET_FUN(__glewDeleteBufferRegion) +#define glDrawBufferRegion GLEW_GET_FUN(__glewDrawBufferRegion) +#define glNewBufferRegion GLEW_GET_FUN(__glewNewBufferRegion) +#define glReadBufferRegion GLEW_GET_FUN(__glewReadBufferRegion) + +#define GLEW_KTX_buffer_region GLEW_GET_VAR(__GLEW_KTX_buffer_region) + +#endif /* GL_KTX_buffer_region */ + +/* ------------------------- GL_MESAX_texture_stack ------------------------ */ + +#ifndef GL_MESAX_texture_stack +#define GL_MESAX_texture_stack 1 + +#define GL_TEXTURE_1D_STACK_MESAX 0x8759 +#define GL_TEXTURE_2D_STACK_MESAX 0x875A +#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B +#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C +#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D +#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E + +#define GLEW_MESAX_texture_stack GLEW_GET_VAR(__GLEW_MESAX_texture_stack) + +#endif /* GL_MESAX_texture_stack */ + +/* -------------------------- GL_MESA_pack_invert -------------------------- */ + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 + +#define GL_PACK_INVERT_MESA 0x8758 + +#define GLEW_MESA_pack_invert GLEW_GET_VAR(__GLEW_MESA_pack_invert) + +#endif /* GL_MESA_pack_invert */ + +/* ------------------------- GL_MESA_resize_buffers ------------------------ */ + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 + +typedef void (GLAPIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void); + +#define glResizeBuffersMESA GLEW_GET_FUN(__glewResizeBuffersMESA) + +#define GLEW_MESA_resize_buffers GLEW_GET_VAR(__GLEW_MESA_resize_buffers) + +#endif /* GL_MESA_resize_buffers */ + +/* -------------------- GL_MESA_shader_integer_functions ------------------- */ + +#ifndef GL_MESA_shader_integer_functions +#define GL_MESA_shader_integer_functions 1 + +#define GLEW_MESA_shader_integer_functions GLEW_GET_VAR(__GLEW_MESA_shader_integer_functions) + +#endif /* GL_MESA_shader_integer_functions */ + +/* --------------------------- GL_MESA_window_pos -------------------------- */ + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 + +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p); + +#define glWindowPos2dMESA GLEW_GET_FUN(__glewWindowPos2dMESA) +#define glWindowPos2dvMESA GLEW_GET_FUN(__glewWindowPos2dvMESA) +#define glWindowPos2fMESA GLEW_GET_FUN(__glewWindowPos2fMESA) +#define glWindowPos2fvMESA GLEW_GET_FUN(__glewWindowPos2fvMESA) +#define glWindowPos2iMESA GLEW_GET_FUN(__glewWindowPos2iMESA) +#define glWindowPos2ivMESA GLEW_GET_FUN(__glewWindowPos2ivMESA) +#define glWindowPos2sMESA GLEW_GET_FUN(__glewWindowPos2sMESA) +#define glWindowPos2svMESA GLEW_GET_FUN(__glewWindowPos2svMESA) +#define glWindowPos3dMESA GLEW_GET_FUN(__glewWindowPos3dMESA) +#define glWindowPos3dvMESA GLEW_GET_FUN(__glewWindowPos3dvMESA) +#define glWindowPos3fMESA GLEW_GET_FUN(__glewWindowPos3fMESA) +#define glWindowPos3fvMESA GLEW_GET_FUN(__glewWindowPos3fvMESA) +#define glWindowPos3iMESA GLEW_GET_FUN(__glewWindowPos3iMESA) +#define glWindowPos3ivMESA GLEW_GET_FUN(__glewWindowPos3ivMESA) +#define glWindowPos3sMESA GLEW_GET_FUN(__glewWindowPos3sMESA) +#define glWindowPos3svMESA GLEW_GET_FUN(__glewWindowPos3svMESA) +#define glWindowPos4dMESA GLEW_GET_FUN(__glewWindowPos4dMESA) +#define glWindowPos4dvMESA GLEW_GET_FUN(__glewWindowPos4dvMESA) +#define glWindowPos4fMESA GLEW_GET_FUN(__glewWindowPos4fMESA) +#define glWindowPos4fvMESA GLEW_GET_FUN(__glewWindowPos4fvMESA) +#define glWindowPos4iMESA GLEW_GET_FUN(__glewWindowPos4iMESA) +#define glWindowPos4ivMESA GLEW_GET_FUN(__glewWindowPos4ivMESA) +#define glWindowPos4sMESA GLEW_GET_FUN(__glewWindowPos4sMESA) +#define glWindowPos4svMESA GLEW_GET_FUN(__glewWindowPos4svMESA) + +#define GLEW_MESA_window_pos GLEW_GET_VAR(__GLEW_MESA_window_pos) + +#endif /* GL_MESA_window_pos */ + +/* ------------------------- GL_MESA_ycbcr_texture ------------------------- */ + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 + +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 + +#define GLEW_MESA_ycbcr_texture GLEW_GET_VAR(__GLEW_MESA_ycbcr_texture) + +#endif /* GL_MESA_ycbcr_texture */ + +/* ----------- GL_NVX_blend_equation_advanced_multi_draw_buffers ----------- */ + +#ifndef GL_NVX_blend_equation_advanced_multi_draw_buffers +#define GL_NVX_blend_equation_advanced_multi_draw_buffers 1 + +#define GLEW_NVX_blend_equation_advanced_multi_draw_buffers GLEW_GET_VAR(__GLEW_NVX_blend_equation_advanced_multi_draw_buffers) + +#endif /* GL_NVX_blend_equation_advanced_multi_draw_buffers */ + +/* ----------------------- GL_NVX_conditional_render ----------------------- */ + +#ifndef GL_NVX_conditional_render +#define GL_NVX_conditional_render 1 + +typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVXPROC) (void); + +#define glBeginConditionalRenderNVX GLEW_GET_FUN(__glewBeginConditionalRenderNVX) +#define glEndConditionalRenderNVX GLEW_GET_FUN(__glewEndConditionalRenderNVX) + +#define GLEW_NVX_conditional_render GLEW_GET_VAR(__GLEW_NVX_conditional_render) + +#endif /* GL_NVX_conditional_render */ + +/* ------------------------- GL_NVX_gpu_memory_info ------------------------ */ + +#ifndef GL_NVX_gpu_memory_info +#define GL_NVX_gpu_memory_info 1 + +#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 +#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 +#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 +#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A +#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B + +#define GLEW_NVX_gpu_memory_info GLEW_GET_VAR(__GLEW_NVX_gpu_memory_info) + +#endif /* GL_NVX_gpu_memory_info */ + +/* ---------------------- GL_NVX_linked_gpu_multicast ---------------------- */ + +#ifndef GL_NVX_linked_gpu_multicast +#define GL_NVX_linked_gpu_multicast 1 + +#define GL_LGPU_SEPARATE_STORAGE_BIT_NVX 0x0800 +#define GL_MAX_LGPU_GPUS_NVX 0x92BA + +typedef void (GLAPIENTRY * PFNGLLGPUCOPYIMAGESUBDATANVXPROC) (GLuint sourceGpu, GLbitfield destinationGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srxY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAPIENTRY * PFNGLLGPUINTERLOCKNVXPROC) (void); +typedef void (GLAPIENTRY * PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC) (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); + +#define glLGPUCopyImageSubDataNVX GLEW_GET_FUN(__glewLGPUCopyImageSubDataNVX) +#define glLGPUInterlockNVX GLEW_GET_FUN(__glewLGPUInterlockNVX) +#define glLGPUNamedBufferSubDataNVX GLEW_GET_FUN(__glewLGPUNamedBufferSubDataNVX) + +#define GLEW_NVX_linked_gpu_multicast GLEW_GET_VAR(__GLEW_NVX_linked_gpu_multicast) + +#endif /* GL_NVX_linked_gpu_multicast */ + +/* ------------------------ GL_NV_3dvision_settings ------------------------ */ + +#ifndef GL_NV_3dvision_settings +#define GL_NV_3dvision_settings 1 + +#define GL_3DVISION_STEREO_NV 0x90F4 +#define GL_STEREO_SEPARATION_NV 0x90F5 +#define GL_STEREO_CONVERGENCE_NV 0x90F6 +#define GL_STEREO_CUTOFF_NV 0x90F7 +#define GL_STEREO_PROJECTION_NV 0x90F8 +#define GL_STEREO_PROJECTION_PERSPECTIVE_NV 0x90F9 +#define GL_STEREO_PROJECTION_ORTHO_NV 0x90FA + +typedef void (GLAPIENTRY * PFNGLSTEREOPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLSTEREOPARAMETERINVPROC) (GLenum pname, GLint param); + +#define glStereoParameterfNV GLEW_GET_FUN(__glewStereoParameterfNV) +#define glStereoParameteriNV GLEW_GET_FUN(__glewStereoParameteriNV) + +#define GLEW_NV_3dvision_settings GLEW_GET_VAR(__GLEW_NV_3dvision_settings) + +#endif /* GL_NV_3dvision_settings */ + +/* ------------------- GL_NV_EGL_stream_consumer_external ------------------ */ + +#ifndef GL_NV_EGL_stream_consumer_external +#define GL_NV_EGL_stream_consumer_external 1 + +#define GL_TEXTURE_EXTERNAL_OES 0x8D65 +#define GL_SAMPLER_EXTERNAL_OES 0x8D66 +#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 +#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 + +#define GLEW_NV_EGL_stream_consumer_external GLEW_GET_VAR(__GLEW_NV_EGL_stream_consumer_external) + +#endif /* GL_NV_EGL_stream_consumer_external */ + +/* ----------------- GL_NV_alpha_to_coverage_dither_control ---------------- */ + +#ifndef GL_NV_alpha_to_coverage_dither_control +#define GL_NV_alpha_to_coverage_dither_control 1 + +#define GL_ALPHA_TO_COVERAGE_DITHER_MODE_NV 0x92BF +#define GL_ALPHA_TO_COVERAGE_DITHER_DEFAULT_NV 0x934D +#define GL_ALPHA_TO_COVERAGE_DITHER_ENABLE_NV 0x934E +#define GL_ALPHA_TO_COVERAGE_DITHER_DISABLE_NV 0x934F + +#define GLEW_NV_alpha_to_coverage_dither_control GLEW_GET_VAR(__GLEW_NV_alpha_to_coverage_dither_control) + +#endif /* GL_NV_alpha_to_coverage_dither_control */ + +/* ------------------------------- GL_NV_bgr ------------------------------- */ + +#ifndef GL_NV_bgr +#define GL_NV_bgr 1 + +#define GL_BGR_NV 0x80E0 + +#define GLEW_NV_bgr GLEW_GET_VAR(__GLEW_NV_bgr) + +#endif /* GL_NV_bgr */ + +/* ------------------- GL_NV_bindless_multi_draw_indirect ------------------ */ + +#ifndef GL_NV_bindless_multi_draw_indirect +#define GL_NV_bindless_multi_draw_indirect 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); + +#define glMultiDrawArraysIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessNV) +#define glMultiDrawElementsIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessNV) + +#define GLEW_NV_bindless_multi_draw_indirect GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect) + +#endif /* GL_NV_bindless_multi_draw_indirect */ + +/* ---------------- GL_NV_bindless_multi_draw_indirect_count --------------- */ + +#ifndef GL_NV_bindless_multi_draw_indirect_count +#define GL_NV_bindless_multi_draw_indirect_count 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); + +#define glMultiDrawArraysIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessCountNV) +#define glMultiDrawElementsIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessCountNV) + +#define GLEW_NV_bindless_multi_draw_indirect_count GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect_count) + +#endif /* GL_NV_bindless_multi_draw_indirect_count */ + +/* ------------------------- GL_NV_bindless_texture ------------------------ */ + +#ifndef GL_NV_bindless_texture +#define GL_NV_bindless_texture 1 + +typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); +typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64* value); + +#define glGetImageHandleNV GLEW_GET_FUN(__glewGetImageHandleNV) +#define glGetTextureHandleNV GLEW_GET_FUN(__glewGetTextureHandleNV) +#define glGetTextureSamplerHandleNV GLEW_GET_FUN(__glewGetTextureSamplerHandleNV) +#define glIsImageHandleResidentNV GLEW_GET_FUN(__glewIsImageHandleResidentNV) +#define glIsTextureHandleResidentNV GLEW_GET_FUN(__glewIsTextureHandleResidentNV) +#define glMakeImageHandleNonResidentNV GLEW_GET_FUN(__glewMakeImageHandleNonResidentNV) +#define glMakeImageHandleResidentNV GLEW_GET_FUN(__glewMakeImageHandleResidentNV) +#define glMakeTextureHandleNonResidentNV GLEW_GET_FUN(__glewMakeTextureHandleNonResidentNV) +#define glMakeTextureHandleResidentNV GLEW_GET_FUN(__glewMakeTextureHandleResidentNV) +#define glProgramUniformHandleui64NV GLEW_GET_FUN(__glewProgramUniformHandleui64NV) +#define glProgramUniformHandleui64vNV GLEW_GET_FUN(__glewProgramUniformHandleui64vNV) +#define glUniformHandleui64NV GLEW_GET_FUN(__glewUniformHandleui64NV) +#define glUniformHandleui64vNV GLEW_GET_FUN(__glewUniformHandleui64vNV) + +#define GLEW_NV_bindless_texture GLEW_GET_VAR(__GLEW_NV_bindless_texture) + +#endif /* GL_NV_bindless_texture */ + +/* --------------------- GL_NV_blend_equation_advanced --------------------- */ + +#ifndef GL_NV_blend_equation_advanced +#define GL_NV_blend_equation_advanced 1 + +#define GL_XOR_NV 0x1506 +#define GL_RED_NV 0x1903 +#define GL_GREEN_NV 0x1904 +#define GL_BLUE_NV 0x1905 +#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 +#define GL_BLEND_OVERLAP_NV 0x9281 +#define GL_UNCORRELATED_NV 0x9282 +#define GL_DISJOINT_NV 0x9283 +#define GL_CONJOINT_NV 0x9284 +#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 +#define GL_SRC_NV 0x9286 +#define GL_DST_NV 0x9287 +#define GL_SRC_OVER_NV 0x9288 +#define GL_DST_OVER_NV 0x9289 +#define GL_SRC_IN_NV 0x928A +#define GL_DST_IN_NV 0x928B +#define GL_SRC_OUT_NV 0x928C +#define GL_DST_OUT_NV 0x928D +#define GL_SRC_ATOP_NV 0x928E +#define GL_DST_ATOP_NV 0x928F +#define GL_PLUS_NV 0x9291 +#define GL_PLUS_DARKER_NV 0x9292 +#define GL_MULTIPLY_NV 0x9294 +#define GL_SCREEN_NV 0x9295 +#define GL_OVERLAY_NV 0x9296 +#define GL_DARKEN_NV 0x9297 +#define GL_LIGHTEN_NV 0x9298 +#define GL_COLORDODGE_NV 0x9299 +#define GL_COLORBURN_NV 0x929A +#define GL_HARDLIGHT_NV 0x929B +#define GL_SOFTLIGHT_NV 0x929C +#define GL_DIFFERENCE_NV 0x929E +#define GL_MINUS_NV 0x929F +#define GL_EXCLUSION_NV 0x92A0 +#define GL_CONTRAST_NV 0x92A1 +#define GL_INVERT_RGB_NV 0x92A3 +#define GL_LINEARDODGE_NV 0x92A4 +#define GL_LINEARBURN_NV 0x92A5 +#define GL_VIVIDLIGHT_NV 0x92A6 +#define GL_LINEARLIGHT_NV 0x92A7 +#define GL_PINLIGHT_NV 0x92A8 +#define GL_HARDMIX_NV 0x92A9 +#define GL_HSL_HUE_NV 0x92AD +#define GL_HSL_SATURATION_NV 0x92AE +#define GL_HSL_COLOR_NV 0x92AF +#define GL_HSL_LUMINOSITY_NV 0x92B0 +#define GL_PLUS_CLAMPED_NV 0x92B1 +#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 +#define GL_MINUS_CLAMPED_NV 0x92B3 +#define GL_INVERT_OVG_NV 0x92B4 + +typedef void (GLAPIENTRY * PFNGLBLENDBARRIERNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); + +#define glBlendBarrierNV GLEW_GET_FUN(__glewBlendBarrierNV) +#define glBlendParameteriNV GLEW_GET_FUN(__glewBlendParameteriNV) + +#define GLEW_NV_blend_equation_advanced GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced) + +#endif /* GL_NV_blend_equation_advanced */ + +/* ----------------- GL_NV_blend_equation_advanced_coherent ---------------- */ + +#ifndef GL_NV_blend_equation_advanced_coherent +#define GL_NV_blend_equation_advanced_coherent 1 + +#define GLEW_NV_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced_coherent) + +#endif /* GL_NV_blend_equation_advanced_coherent */ + +/* ----------------------- GL_NV_blend_minmax_factor ----------------------- */ + +#ifndef GL_NV_blend_minmax_factor +#define GL_NV_blend_minmax_factor 1 + +#define GL_FACTOR_MIN_AMD 0x901C +#define GL_FACTOR_MAX_AMD 0x901D + +#define GLEW_NV_blend_minmax_factor GLEW_GET_VAR(__GLEW_NV_blend_minmax_factor) + +#endif /* GL_NV_blend_minmax_factor */ + +/* --------------------------- GL_NV_blend_square -------------------------- */ + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 + +#define GLEW_NV_blend_square GLEW_GET_VAR(__GLEW_NV_blend_square) + +#endif /* GL_NV_blend_square */ + +/* ----------------------- GL_NV_clip_space_w_scaling ---------------------- */ + +#ifndef GL_NV_clip_space_w_scaling +#define GL_NV_clip_space_w_scaling 1 + +#define GL_VIEWPORT_POSITION_W_SCALE_NV 0x937C +#define GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV 0x937D +#define GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV 0x937E + +typedef void (GLAPIENTRY * PFNGLVIEWPORTPOSITIONWSCALENVPROC) (GLuint index, GLfloat xcoeff, GLfloat ycoeff); + +#define glViewportPositionWScaleNV GLEW_GET_FUN(__glewViewportPositionWScaleNV) + +#define GLEW_NV_clip_space_w_scaling GLEW_GET_VAR(__GLEW_NV_clip_space_w_scaling) + +#endif /* GL_NV_clip_space_w_scaling */ + +/* --------------------------- GL_NV_command_list -------------------------- */ + +#ifndef GL_NV_command_list +#define GL_NV_command_list 1 + +#define GL_TERMINATE_SEQUENCE_COMMAND_NV 0x0000 +#define GL_NOP_COMMAND_NV 0x0001 +#define GL_DRAW_ELEMENTS_COMMAND_NV 0x0002 +#define GL_DRAW_ARRAYS_COMMAND_NV 0x0003 +#define GL_DRAW_ELEMENTS_STRIP_COMMAND_NV 0x0004 +#define GL_DRAW_ARRAYS_STRIP_COMMAND_NV 0x0005 +#define GL_DRAW_ELEMENTS_INSTANCED_COMMAND_NV 0x0006 +#define GL_DRAW_ARRAYS_INSTANCED_COMMAND_NV 0x0007 +#define GL_ELEMENT_ADDRESS_COMMAND_NV 0x0008 +#define GL_ATTRIBUTE_ADDRESS_COMMAND_NV 0x0009 +#define GL_UNIFORM_ADDRESS_COMMAND_NV 0x000a +#define GL_BLEND_COLOR_COMMAND_NV 0x000b +#define GL_STENCIL_REF_COMMAND_NV 0x000c +#define GL_LINE_WIDTH_COMMAND_NV 0x000d +#define GL_POLYGON_OFFSET_COMMAND_NV 0x000e +#define GL_ALPHA_REF_COMMAND_NV 0x000f +#define GL_VIEWPORT_COMMAND_NV 0x0010 +#define GL_SCISSOR_COMMAND_NV 0x0011 +#define GL_FRONT_FACE_COMMAND_NV 0x0012 + +typedef void (GLAPIENTRY * PFNGLCALLCOMMANDLISTNVPROC) (GLuint list); +typedef void (GLAPIENTRY * PFNGLCOMMANDLISTSEGMENTSNVPROC) (GLuint list, GLuint segments); +typedef void (GLAPIENTRY * PFNGLCOMPILECOMMANDLISTNVPROC) (GLuint list); +typedef void (GLAPIENTRY * PFNGLCREATECOMMANDLISTSNVPROC) (GLsizei n, GLuint* lists); +typedef void (GLAPIENTRY * PFNGLCREATESTATESNVPROC) (GLsizei n, GLuint* states); +typedef void (GLAPIENTRY * PFNGLDELETECOMMANDLISTSNVPROC) (GLsizei n, const GLuint* lists); +typedef void (GLAPIENTRY * PFNGLDELETESTATESNVPROC) (GLsizei n, const GLuint* states); +typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSADDRESSNVPROC) (GLenum primitiveMode, const GLuint64* indirects, const GLsizei* sizes, GLuint count); +typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSNVPROC) (GLenum primitiveMode, GLuint buffer, const GLintptr* indirects, const GLsizei* sizes, GLuint count); +typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC) (const GLuint64* indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count); +typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSSTATESNVPROC) (GLuint buffer, const GLintptr* indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count); +typedef GLuint (GLAPIENTRY * PFNGLGETCOMMANDHEADERNVPROC) (GLenum tokenID, GLuint size); +typedef GLushort (GLAPIENTRY * PFNGLGETSTAGEINDEXNVPROC) (GLenum shadertype); +typedef GLboolean (GLAPIENTRY * PFNGLISCOMMANDLISTNVPROC) (GLuint list); +typedef GLboolean (GLAPIENTRY * PFNGLISSTATENVPROC) (GLuint state); +typedef void (GLAPIENTRY * PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC) (GLuint list, GLuint segment, const void** indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count); +typedef void (GLAPIENTRY * PFNGLSTATECAPTURENVPROC) (GLuint state, GLenum mode); + +#define glCallCommandListNV GLEW_GET_FUN(__glewCallCommandListNV) +#define glCommandListSegmentsNV GLEW_GET_FUN(__glewCommandListSegmentsNV) +#define glCompileCommandListNV GLEW_GET_FUN(__glewCompileCommandListNV) +#define glCreateCommandListsNV GLEW_GET_FUN(__glewCreateCommandListsNV) +#define glCreateStatesNV GLEW_GET_FUN(__glewCreateStatesNV) +#define glDeleteCommandListsNV GLEW_GET_FUN(__glewDeleteCommandListsNV) +#define glDeleteStatesNV GLEW_GET_FUN(__glewDeleteStatesNV) +#define glDrawCommandsAddressNV GLEW_GET_FUN(__glewDrawCommandsAddressNV) +#define glDrawCommandsNV GLEW_GET_FUN(__glewDrawCommandsNV) +#define glDrawCommandsStatesAddressNV GLEW_GET_FUN(__glewDrawCommandsStatesAddressNV) +#define glDrawCommandsStatesNV GLEW_GET_FUN(__glewDrawCommandsStatesNV) +#define glGetCommandHeaderNV GLEW_GET_FUN(__glewGetCommandHeaderNV) +#define glGetStageIndexNV GLEW_GET_FUN(__glewGetStageIndexNV) +#define glIsCommandListNV GLEW_GET_FUN(__glewIsCommandListNV) +#define glIsStateNV GLEW_GET_FUN(__glewIsStateNV) +#define glListDrawCommandsStatesClientNV GLEW_GET_FUN(__glewListDrawCommandsStatesClientNV) +#define glStateCaptureNV GLEW_GET_FUN(__glewStateCaptureNV) + +#define GLEW_NV_command_list GLEW_GET_VAR(__GLEW_NV_command_list) + +#endif /* GL_NV_command_list */ + +/* ------------------------- GL_NV_compute_program5 ------------------------ */ + +#ifndef GL_NV_compute_program5 +#define GL_NV_compute_program5 1 + +#define GL_COMPUTE_PROGRAM_NV 0x90FB +#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC + +#define GLEW_NV_compute_program5 GLEW_GET_VAR(__GLEW_NV_compute_program5) + +#endif /* GL_NV_compute_program5 */ + +/* ------------------------ GL_NV_conditional_render ----------------------- */ + +#ifndef GL_NV_conditional_render +#define GL_NV_conditional_render 1 + +#define GL_QUERY_WAIT_NV 0x8E13 +#define GL_QUERY_NO_WAIT_NV 0x8E14 +#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 + +typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); +typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVPROC) (void); + +#define glBeginConditionalRenderNV GLEW_GET_FUN(__glewBeginConditionalRenderNV) +#define glEndConditionalRenderNV GLEW_GET_FUN(__glewEndConditionalRenderNV) + +#define GLEW_NV_conditional_render GLEW_GET_VAR(__GLEW_NV_conditional_render) + +#endif /* GL_NV_conditional_render */ + +/* ----------------------- GL_NV_conservative_raster ----------------------- */ + +#ifndef GL_NV_conservative_raster +#define GL_NV_conservative_raster 1 + +#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 +#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 +#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 +#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 + +typedef void (GLAPIENTRY * PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); + +#define glSubpixelPrecisionBiasNV GLEW_GET_FUN(__glewSubpixelPrecisionBiasNV) + +#define GLEW_NV_conservative_raster GLEW_GET_VAR(__GLEW_NV_conservative_raster) + +#endif /* GL_NV_conservative_raster */ + +/* -------------------- GL_NV_conservative_raster_dilate ------------------- */ + +#ifndef GL_NV_conservative_raster_dilate +#define GL_NV_conservative_raster_dilate 1 + +#define GL_CONSERVATIVE_RASTER_DILATE_NV 0x9379 +#define GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV 0x937A +#define GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV 0x937B + +typedef void (GLAPIENTRY * PFNGLCONSERVATIVERASTERPARAMETERFNVPROC) (GLenum pname, GLfloat value); + +#define glConservativeRasterParameterfNV GLEW_GET_FUN(__glewConservativeRasterParameterfNV) + +#define GLEW_NV_conservative_raster_dilate GLEW_GET_VAR(__GLEW_NV_conservative_raster_dilate) + +#endif /* GL_NV_conservative_raster_dilate */ + +/* -------------- GL_NV_conservative_raster_pre_snap_triangles ------------- */ + +#ifndef GL_NV_conservative_raster_pre_snap_triangles +#define GL_NV_conservative_raster_pre_snap_triangles 1 + +#define GL_CONSERVATIVE_RASTER_MODE_NV 0x954D +#define GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV 0x954E +#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV 0x954F + +typedef void (GLAPIENTRY * PFNGLCONSERVATIVERASTERPARAMETERINVPROC) (GLenum pname, GLint param); + +#define glConservativeRasterParameteriNV GLEW_GET_FUN(__glewConservativeRasterParameteriNV) + +#define GLEW_NV_conservative_raster_pre_snap_triangles GLEW_GET_VAR(__GLEW_NV_conservative_raster_pre_snap_triangles) + +#endif /* GL_NV_conservative_raster_pre_snap_triangles */ + +/* --------------------------- GL_NV_copy_buffer --------------------------- */ + +#ifndef GL_NV_copy_buffer +#define GL_NV_copy_buffer 1 + +#define GL_COPY_READ_BUFFER_NV 0x8F36 +#define GL_COPY_WRITE_BUFFER_NV 0x8F37 + +typedef void (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATANVPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); + +#define glCopyBufferSubDataNV GLEW_GET_FUN(__glewCopyBufferSubDataNV) + +#define GLEW_NV_copy_buffer GLEW_GET_VAR(__GLEW_NV_copy_buffer) + +#endif /* GL_NV_copy_buffer */ + +/* ----------------------- GL_NV_copy_depth_to_color ----------------------- */ + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 + +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F + +#define GLEW_NV_copy_depth_to_color GLEW_GET_VAR(__GLEW_NV_copy_depth_to_color) + +#endif /* GL_NV_copy_depth_to_color */ + +/* ---------------------------- GL_NV_copy_image --------------------------- */ + +#ifndef GL_NV_copy_image +#define GL_NV_copy_image 1 + +typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); + +#define glCopyImageSubDataNV GLEW_GET_FUN(__glewCopyImageSubDataNV) + +#define GLEW_NV_copy_image GLEW_GET_VAR(__GLEW_NV_copy_image) + +#endif /* GL_NV_copy_image */ + +/* -------------------------- GL_NV_deep_texture3D ------------------------- */ + +#ifndef GL_NV_deep_texture3D +#define GL_NV_deep_texture3D 1 + +#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 +#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 + +#define GLEW_NV_deep_texture3D GLEW_GET_VAR(__GLEW_NV_deep_texture3D) + +#endif /* GL_NV_deep_texture3D */ + +/* ------------------------ GL_NV_depth_buffer_float ----------------------- */ + +#ifndef GL_NV_depth_buffer_float +#define GL_NV_depth_buffer_float 1 + +#define GL_DEPTH_COMPONENT32F_NV 0x8DAB +#define GL_DEPTH32F_STENCIL8_NV 0x8DAC +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD +#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF + +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); +typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); + +#define glClearDepthdNV GLEW_GET_FUN(__glewClearDepthdNV) +#define glDepthBoundsdNV GLEW_GET_FUN(__glewDepthBoundsdNV) +#define glDepthRangedNV GLEW_GET_FUN(__glewDepthRangedNV) + +#define GLEW_NV_depth_buffer_float GLEW_GET_VAR(__GLEW_NV_depth_buffer_float) + +#endif /* GL_NV_depth_buffer_float */ + +/* --------------------------- GL_NV_depth_clamp --------------------------- */ + +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 + +#define GL_DEPTH_CLAMP_NV 0x864F + +#define GLEW_NV_depth_clamp GLEW_GET_VAR(__GLEW_NV_depth_clamp) + +#endif /* GL_NV_depth_clamp */ + +/* ---------------------- GL_NV_depth_range_unclamped ---------------------- */ + +#ifndef GL_NV_depth_range_unclamped +#define GL_NV_depth_range_unclamped 1 + +#define GL_SAMPLE_COUNT_BITS_NV 0x8864 +#define GL_CURRENT_SAMPLE_COUNT_QUERY_NV 0x8865 +#define GL_QUERY_RESULT_NV 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_NV 0x8867 +#define GL_SAMPLE_COUNT_NV 0x8914 + +#define GLEW_NV_depth_range_unclamped GLEW_GET_VAR(__GLEW_NV_depth_range_unclamped) + +#endif /* GL_NV_depth_range_unclamped */ + +/* --------------------------- GL_NV_draw_buffers -------------------------- */ + +#ifndef GL_NV_draw_buffers +#define GL_NV_draw_buffers 1 + +#define GL_MAX_DRAW_BUFFERS_NV 0x8824 +#define GL_DRAW_BUFFER0_NV 0x8825 +#define GL_DRAW_BUFFER1_NV 0x8826 +#define GL_DRAW_BUFFER2_NV 0x8827 +#define GL_DRAW_BUFFER3_NV 0x8828 +#define GL_DRAW_BUFFER4_NV 0x8829 +#define GL_DRAW_BUFFER5_NV 0x882A +#define GL_DRAW_BUFFER6_NV 0x882B +#define GL_DRAW_BUFFER7_NV 0x882C +#define GL_DRAW_BUFFER8_NV 0x882D +#define GL_DRAW_BUFFER9_NV 0x882E +#define GL_DRAW_BUFFER10_NV 0x882F +#define GL_DRAW_BUFFER11_NV 0x8830 +#define GL_DRAW_BUFFER12_NV 0x8831 +#define GL_DRAW_BUFFER13_NV 0x8832 +#define GL_DRAW_BUFFER14_NV 0x8833 +#define GL_DRAW_BUFFER15_NV 0x8834 +#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 +#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 +#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 +#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 +#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 +#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 +#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 +#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 +#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 +#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 +#define GL_COLOR_ATTACHMENT10_NV 0x8CEA +#define GL_COLOR_ATTACHMENT11_NV 0x8CEB +#define GL_COLOR_ATTACHMENT12_NV 0x8CEC +#define GL_COLOR_ATTACHMENT13_NV 0x8CED +#define GL_COLOR_ATTACHMENT14_NV 0x8CEE +#define GL_COLOR_ATTACHMENT15_NV 0x8CEF + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSNVPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersNV GLEW_GET_FUN(__glewDrawBuffersNV) + +#define GLEW_NV_draw_buffers GLEW_GET_VAR(__GLEW_NV_draw_buffers) + +#endif /* GL_NV_draw_buffers */ + +/* -------------------------- GL_NV_draw_instanced ------------------------- */ + +#ifndef GL_NV_draw_instanced +#define GL_NV_draw_instanced 1 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDNVPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDNVPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); + +#define glDrawArraysInstancedNV GLEW_GET_FUN(__glewDrawArraysInstancedNV) +#define glDrawElementsInstancedNV GLEW_GET_FUN(__glewDrawElementsInstancedNV) + +#define GLEW_NV_draw_instanced GLEW_GET_VAR(__GLEW_NV_draw_instanced) + +#endif /* GL_NV_draw_instanced */ + +/* --------------------------- GL_NV_draw_texture -------------------------- */ + +#ifndef GL_NV_draw_texture +#define GL_NV_draw_texture 1 + +typedef void (GLAPIENTRY * PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); + +#define glDrawTextureNV GLEW_GET_FUN(__glewDrawTextureNV) + +#define GLEW_NV_draw_texture GLEW_GET_VAR(__GLEW_NV_draw_texture) + +#endif /* GL_NV_draw_texture */ + +/* ------------------------ GL_NV_draw_vulkan_image ------------------------ */ + +#ifndef GL_NV_draw_vulkan_image +#define GL_NV_draw_vulkan_image 1 + +typedef void (APIENTRY *GLVULKANPROCNV)(void); + +typedef void (GLAPIENTRY * PFNGLDRAWVKIMAGENVPROC) (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +typedef GLVULKANPROCNV (GLAPIENTRY * PFNGLGETVKPROCADDRNVPROC) (const GLchar* name); +typedef void (GLAPIENTRY * PFNGLSIGNALVKFENCENVPROC) (GLuint64 vkFence); +typedef void (GLAPIENTRY * PFNGLSIGNALVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); +typedef void (GLAPIENTRY * PFNGLWAITVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); + +#define glDrawVkImageNV GLEW_GET_FUN(__glewDrawVkImageNV) +#define glGetVkProcAddrNV GLEW_GET_FUN(__glewGetVkProcAddrNV) +#define glSignalVkFenceNV GLEW_GET_FUN(__glewSignalVkFenceNV) +#define glSignalVkSemaphoreNV GLEW_GET_FUN(__glewSignalVkSemaphoreNV) +#define glWaitVkSemaphoreNV GLEW_GET_FUN(__glewWaitVkSemaphoreNV) + +#define GLEW_NV_draw_vulkan_image GLEW_GET_VAR(__GLEW_NV_draw_vulkan_image) + +#endif /* GL_NV_draw_vulkan_image */ + +/* ---------------------------- GL_NV_evaluators --------------------------- */ + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 + +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 + +typedef void (GLAPIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); +typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); +typedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glEvalMapsNV GLEW_GET_FUN(__glewEvalMapsNV) +#define glGetMapAttribParameterfvNV GLEW_GET_FUN(__glewGetMapAttribParameterfvNV) +#define glGetMapAttribParameterivNV GLEW_GET_FUN(__glewGetMapAttribParameterivNV) +#define glGetMapControlPointsNV GLEW_GET_FUN(__glewGetMapControlPointsNV) +#define glGetMapParameterfvNV GLEW_GET_FUN(__glewGetMapParameterfvNV) +#define glGetMapParameterivNV GLEW_GET_FUN(__glewGetMapParameterivNV) +#define glMapControlPointsNV GLEW_GET_FUN(__glewMapControlPointsNV) +#define glMapParameterfvNV GLEW_GET_FUN(__glewMapParameterfvNV) +#define glMapParameterivNV GLEW_GET_FUN(__glewMapParameterivNV) + +#define GLEW_NV_evaluators GLEW_GET_VAR(__GLEW_NV_evaluators) + +#endif /* GL_NV_evaluators */ + +/* --------------------- GL_NV_explicit_attrib_location -------------------- */ + +#ifndef GL_NV_explicit_attrib_location +#define GL_NV_explicit_attrib_location 1 + +#define GLEW_NV_explicit_attrib_location GLEW_GET_VAR(__GLEW_NV_explicit_attrib_location) + +#endif /* GL_NV_explicit_attrib_location */ + +/* ----------------------- GL_NV_explicit_multisample ---------------------- */ + +#ifndef GL_NV_explicit_multisample +#define GL_NV_explicit_multisample 1 + +#define GL_SAMPLE_POSITION_NV 0x8E50 +#define GL_SAMPLE_MASK_NV 0x8E51 +#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 +#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 +#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 +#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 +#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 +#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 +#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 +#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 + +typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat* val); +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); + +#define glGetMultisamplefvNV GLEW_GET_FUN(__glewGetMultisamplefvNV) +#define glSampleMaskIndexedNV GLEW_GET_FUN(__glewSampleMaskIndexedNV) +#define glTexRenderbufferNV GLEW_GET_FUN(__glewTexRenderbufferNV) + +#define GLEW_NV_explicit_multisample GLEW_GET_VAR(__GLEW_NV_explicit_multisample) + +#endif /* GL_NV_explicit_multisample */ + +/* ---------------------- GL_NV_fbo_color_attachments ---------------------- */ + +#ifndef GL_NV_fbo_color_attachments +#define GL_NV_fbo_color_attachments 1 + +#define GL_MAX_COLOR_ATTACHMENTS_NV 0x8CDF +#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 +#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 +#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 +#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 +#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 +#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 +#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 +#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 +#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 +#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 +#define GL_COLOR_ATTACHMENT10_NV 0x8CEA +#define GL_COLOR_ATTACHMENT11_NV 0x8CEB +#define GL_COLOR_ATTACHMENT12_NV 0x8CEC +#define GL_COLOR_ATTACHMENT13_NV 0x8CED +#define GL_COLOR_ATTACHMENT14_NV 0x8CEE +#define GL_COLOR_ATTACHMENT15_NV 0x8CEF + +#define GLEW_NV_fbo_color_attachments GLEW_GET_VAR(__GLEW_NV_fbo_color_attachments) + +#endif /* GL_NV_fbo_color_attachments */ + +/* ------------------------------ GL_NV_fence ------------------------------ */ + +#ifndef GL_NV_fence +#define GL_NV_fence 1 + +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 + +typedef void (GLAPIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint* fences); +typedef void (GLAPIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint* fences); +typedef void (GLAPIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISFENCENVPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence); + +#define glDeleteFencesNV GLEW_GET_FUN(__glewDeleteFencesNV) +#define glFinishFenceNV GLEW_GET_FUN(__glewFinishFenceNV) +#define glGenFencesNV GLEW_GET_FUN(__glewGenFencesNV) +#define glGetFenceivNV GLEW_GET_FUN(__glewGetFenceivNV) +#define glIsFenceNV GLEW_GET_FUN(__glewIsFenceNV) +#define glSetFenceNV GLEW_GET_FUN(__glewSetFenceNV) +#define glTestFenceNV GLEW_GET_FUN(__glewTestFenceNV) + +#define GLEW_NV_fence GLEW_GET_VAR(__GLEW_NV_fence) + +#endif /* GL_NV_fence */ + +/* -------------------------- GL_NV_fill_rectangle ------------------------- */ + +#ifndef GL_NV_fill_rectangle +#define GL_NV_fill_rectangle 1 + +#define GL_FILL_RECTANGLE_NV 0x933C + +#define GLEW_NV_fill_rectangle GLEW_GET_VAR(__GLEW_NV_fill_rectangle) + +#endif /* GL_NV_fill_rectangle */ + +/* --------------------------- GL_NV_float_buffer -------------------------- */ + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 + +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E + +#define GLEW_NV_float_buffer GLEW_GET_VAR(__GLEW_NV_float_buffer) + +#endif /* GL_NV_float_buffer */ + +/* --------------------------- GL_NV_fog_distance -------------------------- */ + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 + +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C + +#define GLEW_NV_fog_distance GLEW_GET_VAR(__GLEW_NV_fog_distance) + +#endif /* GL_NV_fog_distance */ + +/* -------------------- GL_NV_fragment_coverage_to_color ------------------- */ + +#ifndef GL_NV_fragment_coverage_to_color +#define GL_NV_fragment_coverage_to_color 1 + +#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD +#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE + +typedef void (GLAPIENTRY * PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); + +#define glFragmentCoverageColorNV GLEW_GET_FUN(__glewFragmentCoverageColorNV) + +#define GLEW_NV_fragment_coverage_to_color GLEW_GET_VAR(__GLEW_NV_fragment_coverage_to_color) + +#endif /* GL_NV_fragment_coverage_to_color */ + +/* ------------------------- GL_NV_fragment_program ------------------------ */ + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 + +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 + +typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble *params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLdouble v[]); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLfloat v[]); + +#define glGetProgramNamedParameterdvNV GLEW_GET_FUN(__glewGetProgramNamedParameterdvNV) +#define glGetProgramNamedParameterfvNV GLEW_GET_FUN(__glewGetProgramNamedParameterfvNV) +#define glProgramNamedParameter4dNV GLEW_GET_FUN(__glewProgramNamedParameter4dNV) +#define glProgramNamedParameter4dvNV GLEW_GET_FUN(__glewProgramNamedParameter4dvNV) +#define glProgramNamedParameter4fNV GLEW_GET_FUN(__glewProgramNamedParameter4fNV) +#define glProgramNamedParameter4fvNV GLEW_GET_FUN(__glewProgramNamedParameter4fvNV) + +#define GLEW_NV_fragment_program GLEW_GET_VAR(__GLEW_NV_fragment_program) + +#endif /* GL_NV_fragment_program */ + +/* ------------------------ GL_NV_fragment_program2 ------------------------ */ + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 + +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 + +#define GLEW_NV_fragment_program2 GLEW_GET_VAR(__GLEW_NV_fragment_program2) + +#endif /* GL_NV_fragment_program2 */ + +/* ------------------------ GL_NV_fragment_program4 ------------------------ */ + +#ifndef GL_NV_fragment_program4 +#define GL_NV_fragment_program4 1 + +#define GLEW_NV_fragment_program4 GLEW_GET_VAR(__GLEW_NV_fragment_program4) + +#endif /* GL_NV_fragment_program4 */ + +/* --------------------- GL_NV_fragment_program_option --------------------- */ + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 + +#define GLEW_NV_fragment_program_option GLEW_GET_VAR(__GLEW_NV_fragment_program_option) + +#endif /* GL_NV_fragment_program_option */ + +/* -------------------- GL_NV_fragment_shader_interlock -------------------- */ + +#ifndef GL_NV_fragment_shader_interlock +#define GL_NV_fragment_shader_interlock 1 + +#define GLEW_NV_fragment_shader_interlock GLEW_GET_VAR(__GLEW_NV_fragment_shader_interlock) + +#endif /* GL_NV_fragment_shader_interlock */ + +/* ------------------------- GL_NV_framebuffer_blit ------------------------ */ + +#ifndef GL_NV_framebuffer_blit +#define GL_NV_framebuffer_blit 1 + +#define GL_DRAW_FRAMEBUFFER_BINDING_NV 0x8CA6 +#define GL_READ_FRAMEBUFFER_NV 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_NV 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING_NV 0x8CAA + +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERNVPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + +#define glBlitFramebufferNV GLEW_GET_FUN(__glewBlitFramebufferNV) + +#define GLEW_NV_framebuffer_blit GLEW_GET_VAR(__GLEW_NV_framebuffer_blit) + +#endif /* GL_NV_framebuffer_blit */ + +/* -------------------- GL_NV_framebuffer_mixed_samples -------------------- */ + +#ifndef GL_NV_framebuffer_mixed_samples +#define GL_NV_framebuffer_mixed_samples 1 + +#define GL_COLOR_SAMPLES_NV 0x8E20 +#define GL_RASTER_MULTISAMPLE_EXT 0x9327 +#define GL_RASTER_SAMPLES_EXT 0x9328 +#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 +#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A +#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B +#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C +#define GL_DEPTH_SAMPLES_NV 0x932D +#define GL_STENCIL_SAMPLES_NV 0x932E +#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F +#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 +#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 +#define GL_COVERAGE_MODULATION_NV 0x9332 +#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 + +#define GLEW_NV_framebuffer_mixed_samples GLEW_GET_VAR(__GLEW_NV_framebuffer_mixed_samples) + +#endif /* GL_NV_framebuffer_mixed_samples */ + +/* --------------------- GL_NV_framebuffer_multisample --------------------- */ + +#ifndef GL_NV_framebuffer_multisample +#define GL_NV_framebuffer_multisample 1 + +#define GL_RENDERBUFFER_SAMPLES_NV 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV 0x8D56 +#define GL_MAX_SAMPLES_NV 0x8D57 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleNV) + +#define GLEW_NV_framebuffer_multisample GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample) + +#endif /* GL_NV_framebuffer_multisample */ + +/* ----------------- GL_NV_framebuffer_multisample_coverage ---------------- */ + +#ifndef GL_NV_framebuffer_multisample_coverage +#define GL_NV_framebuffer_multisample_coverage 1 + +#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB +#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 +#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 +#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleCoverageNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleCoverageNV) + +#define GLEW_NV_framebuffer_multisample_coverage GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample_coverage) + +#endif /* GL_NV_framebuffer_multisample_coverage */ + +/* ----------------------- GL_NV_generate_mipmap_sRGB ---------------------- */ + +#ifndef GL_NV_generate_mipmap_sRGB +#define GL_NV_generate_mipmap_sRGB 1 + +#define GLEW_NV_generate_mipmap_sRGB GLEW_GET_VAR(__GLEW_NV_generate_mipmap_sRGB) + +#endif /* GL_NV_generate_mipmap_sRGB */ + +/* ------------------------ GL_NV_geometry_program4 ------------------------ */ + +#ifndef GL_NV_geometry_program4 +#define GL_NV_geometry_program4 1 + +#define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 +#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 + +typedef void (GLAPIENTRY * PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); + +#define glProgramVertexLimitNV GLEW_GET_FUN(__glewProgramVertexLimitNV) + +#define GLEW_NV_geometry_program4 GLEW_GET_VAR(__GLEW_NV_geometry_program4) + +#endif /* GL_NV_geometry_program4 */ + +/* ------------------------- GL_NV_geometry_shader4 ------------------------ */ + +#ifndef GL_NV_geometry_shader4 +#define GL_NV_geometry_shader4 1 + +#define GLEW_NV_geometry_shader4 GLEW_GET_VAR(__GLEW_NV_geometry_shader4) + +#endif /* GL_NV_geometry_shader4 */ + +/* ------------------- GL_NV_geometry_shader_passthrough ------------------- */ + +#ifndef GL_NV_geometry_shader_passthrough +#define GL_NV_geometry_shader_passthrough 1 + +#define GLEW_NV_geometry_shader_passthrough GLEW_GET_VAR(__GLEW_NV_geometry_shader_passthrough) + +#endif /* GL_NV_geometry_shader_passthrough */ + +/* -------------------------- GL_NV_gpu_multicast -------------------------- */ + +#ifndef GL_NV_gpu_multicast +#define GL_NV_gpu_multicast 1 + +#define GL_PER_GPU_STORAGE_BIT_NV 0x0800 +#define GL_MULTICAST_GPUS_NV 0x92BA +#define GL_PER_GPU_STORAGE_NV 0x9548 +#define GL_MULTICAST_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9549 +#define GL_RENDER_GPU_MASK_NV 0x9558 + +typedef void (GLAPIENTRY * PFNGLMULTICASTBARRIERNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLMULTICASTBLITFRAMEBUFFERNVPROC) (GLuint srcGpu, GLuint dstGpu, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (GLAPIENTRY * PFNGLMULTICASTBUFFERSUBDATANVPROC) (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (GLAPIENTRY * PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC) (GLuint readGpu, GLbitfield writeGpuMask, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLMULTICASTCOPYIMAGESUBDATANVPROC) (GLuint srcGpu, GLbitfield dstGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (GLAPIENTRY * PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint gpu, GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTIVNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLMULTICASTWAITSYNCNVPROC) (GLuint signalGpu, GLbitfield waitGpuMask); +typedef void (GLAPIENTRY * PFNGLRENDERGPUMASKNVPROC) (GLbitfield mask); + +#define glMulticastBarrierNV GLEW_GET_FUN(__glewMulticastBarrierNV) +#define glMulticastBlitFramebufferNV GLEW_GET_FUN(__glewMulticastBlitFramebufferNV) +#define glMulticastBufferSubDataNV GLEW_GET_FUN(__glewMulticastBufferSubDataNV) +#define glMulticastCopyBufferSubDataNV GLEW_GET_FUN(__glewMulticastCopyBufferSubDataNV) +#define glMulticastCopyImageSubDataNV GLEW_GET_FUN(__glewMulticastCopyImageSubDataNV) +#define glMulticastFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewMulticastFramebufferSampleLocationsfvNV) +#define glMulticastGetQueryObjecti64vNV GLEW_GET_FUN(__glewMulticastGetQueryObjecti64vNV) +#define glMulticastGetQueryObjectivNV GLEW_GET_FUN(__glewMulticastGetQueryObjectivNV) +#define glMulticastGetQueryObjectui64vNV GLEW_GET_FUN(__glewMulticastGetQueryObjectui64vNV) +#define glMulticastGetQueryObjectuivNV GLEW_GET_FUN(__glewMulticastGetQueryObjectuivNV) +#define glMulticastWaitSyncNV GLEW_GET_FUN(__glewMulticastWaitSyncNV) +#define glRenderGpuMaskNV GLEW_GET_FUN(__glewRenderGpuMaskNV) + +#define GLEW_NV_gpu_multicast GLEW_GET_VAR(__GLEW_NV_gpu_multicast) + +#endif /* GL_NV_gpu_multicast */ + +/* --------------------------- GL_NV_gpu_program4 -------------------------- */ + +#ifndef GL_NV_gpu_program4 +#define GL_NV_gpu_program4 1 + +#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 +#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 +#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 +#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 +#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 +#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 +#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 + +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); + +#define glProgramEnvParameterI4iNV GLEW_GET_FUN(__glewProgramEnvParameterI4iNV) +#define glProgramEnvParameterI4ivNV GLEW_GET_FUN(__glewProgramEnvParameterI4ivNV) +#define glProgramEnvParameterI4uiNV GLEW_GET_FUN(__glewProgramEnvParameterI4uiNV) +#define glProgramEnvParameterI4uivNV GLEW_GET_FUN(__glewProgramEnvParameterI4uivNV) +#define glProgramEnvParametersI4ivNV GLEW_GET_FUN(__glewProgramEnvParametersI4ivNV) +#define glProgramEnvParametersI4uivNV GLEW_GET_FUN(__glewProgramEnvParametersI4uivNV) +#define glProgramLocalParameterI4iNV GLEW_GET_FUN(__glewProgramLocalParameterI4iNV) +#define glProgramLocalParameterI4ivNV GLEW_GET_FUN(__glewProgramLocalParameterI4ivNV) +#define glProgramLocalParameterI4uiNV GLEW_GET_FUN(__glewProgramLocalParameterI4uiNV) +#define glProgramLocalParameterI4uivNV GLEW_GET_FUN(__glewProgramLocalParameterI4uivNV) +#define glProgramLocalParametersI4ivNV GLEW_GET_FUN(__glewProgramLocalParametersI4ivNV) +#define glProgramLocalParametersI4uivNV GLEW_GET_FUN(__glewProgramLocalParametersI4uivNV) + +#define GLEW_NV_gpu_program4 GLEW_GET_VAR(__GLEW_NV_gpu_program4) + +#endif /* GL_NV_gpu_program4 */ + +/* --------------------------- GL_NV_gpu_program5 -------------------------- */ + +#ifndef GL_NV_gpu_program5 +#define GL_NV_gpu_program5 1 + +#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C +#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F + +#define GLEW_NV_gpu_program5 GLEW_GET_VAR(__GLEW_NV_gpu_program5) + +#endif /* GL_NV_gpu_program5 */ + +/* -------------------- GL_NV_gpu_program5_mem_extended -------------------- */ + +#ifndef GL_NV_gpu_program5_mem_extended +#define GL_NV_gpu_program5_mem_extended 1 + +#define GLEW_NV_gpu_program5_mem_extended GLEW_GET_VAR(__GLEW_NV_gpu_program5_mem_extended) + +#endif /* GL_NV_gpu_program5_mem_extended */ + +/* ------------------------- GL_NV_gpu_program_fp64 ------------------------ */ + +#ifndef GL_NV_gpu_program_fp64 +#define GL_NV_gpu_program_fp64 1 + +#define GLEW_NV_gpu_program_fp64 GLEW_GET_VAR(__GLEW_NV_gpu_program_fp64) + +#endif /* GL_NV_gpu_program_fp64 */ + +/* --------------------------- GL_NV_gpu_shader5 --------------------------- */ + +#ifndef GL_NV_gpu_shader5 +#define GL_NV_gpu_shader5 1 + +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F +#define GL_INT8_NV 0x8FE0 +#define GL_INT8_VEC2_NV 0x8FE1 +#define GL_INT8_VEC3_NV 0x8FE2 +#define GL_INT8_VEC4_NV 0x8FE3 +#define GL_INT16_NV 0x8FE4 +#define GL_INT16_VEC2_NV 0x8FE5 +#define GL_INT16_VEC3_NV 0x8FE6 +#define GL_INT16_VEC4_NV 0x8FE7 +#define GL_INT64_VEC2_NV 0x8FE9 +#define GL_INT64_VEC3_NV 0x8FEA +#define GL_INT64_VEC4_NV 0x8FEB +#define GL_UNSIGNED_INT8_NV 0x8FEC +#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED +#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE +#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF +#define GL_UNSIGNED_INT16_NV 0x8FF0 +#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 +#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 +#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 +#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB + +typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); + +#define glGetUniformi64vNV GLEW_GET_FUN(__glewGetUniformi64vNV) +#define glGetUniformui64vNV GLEW_GET_FUN(__glewGetUniformui64vNV) +#define glProgramUniform1i64NV GLEW_GET_FUN(__glewProgramUniform1i64NV) +#define glProgramUniform1i64vNV GLEW_GET_FUN(__glewProgramUniform1i64vNV) +#define glProgramUniform1ui64NV GLEW_GET_FUN(__glewProgramUniform1ui64NV) +#define glProgramUniform1ui64vNV GLEW_GET_FUN(__glewProgramUniform1ui64vNV) +#define glProgramUniform2i64NV GLEW_GET_FUN(__glewProgramUniform2i64NV) +#define glProgramUniform2i64vNV GLEW_GET_FUN(__glewProgramUniform2i64vNV) +#define glProgramUniform2ui64NV GLEW_GET_FUN(__glewProgramUniform2ui64NV) +#define glProgramUniform2ui64vNV GLEW_GET_FUN(__glewProgramUniform2ui64vNV) +#define glProgramUniform3i64NV GLEW_GET_FUN(__glewProgramUniform3i64NV) +#define glProgramUniform3i64vNV GLEW_GET_FUN(__glewProgramUniform3i64vNV) +#define glProgramUniform3ui64NV GLEW_GET_FUN(__glewProgramUniform3ui64NV) +#define glProgramUniform3ui64vNV GLEW_GET_FUN(__glewProgramUniform3ui64vNV) +#define glProgramUniform4i64NV GLEW_GET_FUN(__glewProgramUniform4i64NV) +#define glProgramUniform4i64vNV GLEW_GET_FUN(__glewProgramUniform4i64vNV) +#define glProgramUniform4ui64NV GLEW_GET_FUN(__glewProgramUniform4ui64NV) +#define glProgramUniform4ui64vNV GLEW_GET_FUN(__glewProgramUniform4ui64vNV) +#define glUniform1i64NV GLEW_GET_FUN(__glewUniform1i64NV) +#define glUniform1i64vNV GLEW_GET_FUN(__glewUniform1i64vNV) +#define glUniform1ui64NV GLEW_GET_FUN(__glewUniform1ui64NV) +#define glUniform1ui64vNV GLEW_GET_FUN(__glewUniform1ui64vNV) +#define glUniform2i64NV GLEW_GET_FUN(__glewUniform2i64NV) +#define glUniform2i64vNV GLEW_GET_FUN(__glewUniform2i64vNV) +#define glUniform2ui64NV GLEW_GET_FUN(__glewUniform2ui64NV) +#define glUniform2ui64vNV GLEW_GET_FUN(__glewUniform2ui64vNV) +#define glUniform3i64NV GLEW_GET_FUN(__glewUniform3i64NV) +#define glUniform3i64vNV GLEW_GET_FUN(__glewUniform3i64vNV) +#define glUniform3ui64NV GLEW_GET_FUN(__glewUniform3ui64NV) +#define glUniform3ui64vNV GLEW_GET_FUN(__glewUniform3ui64vNV) +#define glUniform4i64NV GLEW_GET_FUN(__glewUniform4i64NV) +#define glUniform4i64vNV GLEW_GET_FUN(__glewUniform4i64vNV) +#define glUniform4ui64NV GLEW_GET_FUN(__glewUniform4ui64NV) +#define glUniform4ui64vNV GLEW_GET_FUN(__glewUniform4ui64vNV) + +#define GLEW_NV_gpu_shader5 GLEW_GET_VAR(__GLEW_NV_gpu_shader5) + +#endif /* GL_NV_gpu_shader5 */ + +/* ---------------------------- GL_NV_half_float --------------------------- */ + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 + +#define GL_HALF_FLOAT_NV 0x140B + +typedef unsigned short GLhalf; + +typedef void (GLAPIENTRY * PFNGLCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); +typedef void (GLAPIENTRY * PFNGLCOLOR3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLCOLOR4HNVPROC) (GLhalf red, GLhalf green, GLhalf blue, GLhalf alpha); +typedef void (GLAPIENTRY * PFNGLCOLOR4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLFOGCOORDHNVPROC) (GLhalf fog); +typedef void (GLAPIENTRY * PFNGLFOGCOORDHVNVPROC) (const GLhalf* fog); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalf s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalf s, GLhalf t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r, GLhalf q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLNORMAL3HNVPROC) (GLhalf nx, GLhalf ny, GLhalf nz); +typedef void (GLAPIENTRY * PFNGLNORMAL3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1HNVPROC) (GLhalf s); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2HNVPROC) (GLhalf s, GLhalf t); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3HNVPROC) (GLhalf s, GLhalf t, GLhalf r); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4HNVPROC) (GLhalf s, GLhalf t, GLhalf r, GLhalf q); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX2HNVPROC) (GLhalf x, GLhalf y); +typedef void (GLAPIENTRY * PFNGLVERTEX2HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX3HNVPROC) (GLhalf x, GLhalf y, GLhalf z); +typedef void (GLAPIENTRY * PFNGLVERTEX3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX4HNVPROC) (GLhalf x, GLhalf y, GLhalf z, GLhalf w); +typedef void (GLAPIENTRY * PFNGLVERTEX4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalf x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalf x, GLhalf y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z, GLhalf w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHNVPROC) (GLhalf weight); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight); + +#define glColor3hNV GLEW_GET_FUN(__glewColor3hNV) +#define glColor3hvNV GLEW_GET_FUN(__glewColor3hvNV) +#define glColor4hNV GLEW_GET_FUN(__glewColor4hNV) +#define glColor4hvNV GLEW_GET_FUN(__glewColor4hvNV) +#define glFogCoordhNV GLEW_GET_FUN(__glewFogCoordhNV) +#define glFogCoordhvNV GLEW_GET_FUN(__glewFogCoordhvNV) +#define glMultiTexCoord1hNV GLEW_GET_FUN(__glewMultiTexCoord1hNV) +#define glMultiTexCoord1hvNV GLEW_GET_FUN(__glewMultiTexCoord1hvNV) +#define glMultiTexCoord2hNV GLEW_GET_FUN(__glewMultiTexCoord2hNV) +#define glMultiTexCoord2hvNV GLEW_GET_FUN(__glewMultiTexCoord2hvNV) +#define glMultiTexCoord3hNV GLEW_GET_FUN(__glewMultiTexCoord3hNV) +#define glMultiTexCoord3hvNV GLEW_GET_FUN(__glewMultiTexCoord3hvNV) +#define glMultiTexCoord4hNV GLEW_GET_FUN(__glewMultiTexCoord4hNV) +#define glMultiTexCoord4hvNV GLEW_GET_FUN(__glewMultiTexCoord4hvNV) +#define glNormal3hNV GLEW_GET_FUN(__glewNormal3hNV) +#define glNormal3hvNV GLEW_GET_FUN(__glewNormal3hvNV) +#define glSecondaryColor3hNV GLEW_GET_FUN(__glewSecondaryColor3hNV) +#define glSecondaryColor3hvNV GLEW_GET_FUN(__glewSecondaryColor3hvNV) +#define glTexCoord1hNV GLEW_GET_FUN(__glewTexCoord1hNV) +#define glTexCoord1hvNV GLEW_GET_FUN(__glewTexCoord1hvNV) +#define glTexCoord2hNV GLEW_GET_FUN(__glewTexCoord2hNV) +#define glTexCoord2hvNV GLEW_GET_FUN(__glewTexCoord2hvNV) +#define glTexCoord3hNV GLEW_GET_FUN(__glewTexCoord3hNV) +#define glTexCoord3hvNV GLEW_GET_FUN(__glewTexCoord3hvNV) +#define glTexCoord4hNV GLEW_GET_FUN(__glewTexCoord4hNV) +#define glTexCoord4hvNV GLEW_GET_FUN(__glewTexCoord4hvNV) +#define glVertex2hNV GLEW_GET_FUN(__glewVertex2hNV) +#define glVertex2hvNV GLEW_GET_FUN(__glewVertex2hvNV) +#define glVertex3hNV GLEW_GET_FUN(__glewVertex3hNV) +#define glVertex3hvNV GLEW_GET_FUN(__glewVertex3hvNV) +#define glVertex4hNV GLEW_GET_FUN(__glewVertex4hNV) +#define glVertex4hvNV GLEW_GET_FUN(__glewVertex4hvNV) +#define glVertexAttrib1hNV GLEW_GET_FUN(__glewVertexAttrib1hNV) +#define glVertexAttrib1hvNV GLEW_GET_FUN(__glewVertexAttrib1hvNV) +#define glVertexAttrib2hNV GLEW_GET_FUN(__glewVertexAttrib2hNV) +#define glVertexAttrib2hvNV GLEW_GET_FUN(__glewVertexAttrib2hvNV) +#define glVertexAttrib3hNV GLEW_GET_FUN(__glewVertexAttrib3hNV) +#define glVertexAttrib3hvNV GLEW_GET_FUN(__glewVertexAttrib3hvNV) +#define glVertexAttrib4hNV GLEW_GET_FUN(__glewVertexAttrib4hNV) +#define glVertexAttrib4hvNV GLEW_GET_FUN(__glewVertexAttrib4hvNV) +#define glVertexAttribs1hvNV GLEW_GET_FUN(__glewVertexAttribs1hvNV) +#define glVertexAttribs2hvNV GLEW_GET_FUN(__glewVertexAttribs2hvNV) +#define glVertexAttribs3hvNV GLEW_GET_FUN(__glewVertexAttribs3hvNV) +#define glVertexAttribs4hvNV GLEW_GET_FUN(__glewVertexAttribs4hvNV) +#define glVertexWeighthNV GLEW_GET_FUN(__glewVertexWeighthNV) +#define glVertexWeighthvNV GLEW_GET_FUN(__glewVertexWeighthvNV) + +#define GLEW_NV_half_float GLEW_GET_VAR(__GLEW_NV_half_float) + +#endif /* GL_NV_half_float */ + +/* -------------------------- GL_NV_image_formats -------------------------- */ + +#ifndef GL_NV_image_formats +#define GL_NV_image_formats 1 + +#define GLEW_NV_image_formats GLEW_GET_VAR(__GLEW_NV_image_formats) + +#endif /* GL_NV_image_formats */ + +/* ------------------------- GL_NV_instanced_arrays ------------------------ */ + +#ifndef GL_NV_instanced_arrays +#define GL_NV_instanced_arrays 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV 0x88FE + +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORNVPROC) (GLuint index, GLuint divisor); + +#define glVertexAttribDivisorNV GLEW_GET_FUN(__glewVertexAttribDivisorNV) + +#define GLEW_NV_instanced_arrays GLEW_GET_VAR(__GLEW_NV_instanced_arrays) + +#endif /* GL_NV_instanced_arrays */ + +/* ------------------- GL_NV_internalformat_sample_query ------------------- */ + +#ifndef GL_NV_internalformat_sample_query +#define GL_NV_internalformat_sample_query 1 + +#define GL_MULTISAMPLES_NV 0x9371 +#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 +#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 +#define GL_CONFORMANT_NV 0x9374 + +typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint* params); + +#define glGetInternalformatSampleivNV GLEW_GET_FUN(__glewGetInternalformatSampleivNV) + +#define GLEW_NV_internalformat_sample_query GLEW_GET_VAR(__GLEW_NV_internalformat_sample_query) + +#endif /* GL_NV_internalformat_sample_query */ + +/* ------------------------ GL_NV_light_max_exponent ----------------------- */ + +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 + +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 + +#define GLEW_NV_light_max_exponent GLEW_GET_VAR(__GLEW_NV_light_max_exponent) + +#endif /* GL_NV_light_max_exponent */ + +/* ----------------------- GL_NV_multisample_coverage ---------------------- */ + +#ifndef GL_NV_multisample_coverage +#define GL_NV_multisample_coverage 1 + +#define GL_COLOR_SAMPLES_NV 0x8E20 + +#define GLEW_NV_multisample_coverage GLEW_GET_VAR(__GLEW_NV_multisample_coverage) + +#endif /* GL_NV_multisample_coverage */ + +/* --------------------- GL_NV_multisample_filter_hint --------------------- */ + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 + +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 + +#define GLEW_NV_multisample_filter_hint GLEW_GET_VAR(__GLEW_NV_multisample_filter_hint) + +#endif /* GL_NV_multisample_filter_hint */ + +/* ----------------------- GL_NV_non_square_matrices ----------------------- */ + +#ifndef GL_NV_non_square_matrices +#define GL_NV_non_square_matrices 1 + +#define GL_FLOAT_MAT2x3_NV 0x8B65 +#define GL_FLOAT_MAT2x4_NV 0x8B66 +#define GL_FLOAT_MAT3x2_NV 0x8B67 +#define GL_FLOAT_MAT3x4_NV 0x8B68 +#define GL_FLOAT_MAT4x2_NV 0x8B69 +#define GL_FLOAT_MAT4x3_NV 0x8B6A + +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); + +#define glUniformMatrix2x3fvNV GLEW_GET_FUN(__glewUniformMatrix2x3fvNV) +#define glUniformMatrix2x4fvNV GLEW_GET_FUN(__glewUniformMatrix2x4fvNV) +#define glUniformMatrix3x2fvNV GLEW_GET_FUN(__glewUniformMatrix3x2fvNV) +#define glUniformMatrix3x4fvNV GLEW_GET_FUN(__glewUniformMatrix3x4fvNV) +#define glUniformMatrix4x2fvNV GLEW_GET_FUN(__glewUniformMatrix4x2fvNV) +#define glUniformMatrix4x3fvNV GLEW_GET_FUN(__glewUniformMatrix4x3fvNV) + +#define GLEW_NV_non_square_matrices GLEW_GET_VAR(__GLEW_NV_non_square_matrices) + +#endif /* GL_NV_non_square_matrices */ + +/* ------------------------- GL_NV_occlusion_query ------------------------- */ + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 + +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 + +typedef void (GLAPIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); + +#define glBeginOcclusionQueryNV GLEW_GET_FUN(__glewBeginOcclusionQueryNV) +#define glDeleteOcclusionQueriesNV GLEW_GET_FUN(__glewDeleteOcclusionQueriesNV) +#define glEndOcclusionQueryNV GLEW_GET_FUN(__glewEndOcclusionQueryNV) +#define glGenOcclusionQueriesNV GLEW_GET_FUN(__glewGenOcclusionQueriesNV) +#define glGetOcclusionQueryivNV GLEW_GET_FUN(__glewGetOcclusionQueryivNV) +#define glGetOcclusionQueryuivNV GLEW_GET_FUN(__glewGetOcclusionQueryuivNV) +#define glIsOcclusionQueryNV GLEW_GET_FUN(__glewIsOcclusionQueryNV) + +#define GLEW_NV_occlusion_query GLEW_GET_VAR(__GLEW_NV_occlusion_query) + +#endif /* GL_NV_occlusion_query */ + +/* -------------------------- GL_NV_pack_subimage -------------------------- */ + +#ifndef GL_NV_pack_subimage +#define GL_NV_pack_subimage 1 + +#define GL_PACK_ROW_LENGTH_NV 0x0D02 +#define GL_PACK_SKIP_ROWS_NV 0x0D03 +#define GL_PACK_SKIP_PIXELS_NV 0x0D04 + +#define GLEW_NV_pack_subimage GLEW_GET_VAR(__GLEW_NV_pack_subimage) + +#endif /* GL_NV_pack_subimage */ + +/* ----------------------- GL_NV_packed_depth_stencil ---------------------- */ + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 + +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA + +#define GLEW_NV_packed_depth_stencil GLEW_GET_VAR(__GLEW_NV_packed_depth_stencil) + +#endif /* GL_NV_packed_depth_stencil */ + +/* --------------------------- GL_NV_packed_float -------------------------- */ + +#ifndef GL_NV_packed_float +#define GL_NV_packed_float 1 + +#define GL_R11F_G11F_B10F_NV 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_NV 0x8C3B + +#define GLEW_NV_packed_float GLEW_GET_VAR(__GLEW_NV_packed_float) + +#endif /* GL_NV_packed_float */ + +/* ----------------------- GL_NV_packed_float_linear ----------------------- */ + +#ifndef GL_NV_packed_float_linear +#define GL_NV_packed_float_linear 1 + +#define GL_R11F_G11F_B10F_NV 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_NV 0x8C3B + +#define GLEW_NV_packed_float_linear GLEW_GET_VAR(__GLEW_NV_packed_float_linear) + +#endif /* GL_NV_packed_float_linear */ + +/* --------------------- GL_NV_parameter_buffer_object --------------------- */ + +#ifndef GL_NV_parameter_buffer_object +#define GL_NV_parameter_buffer_object 1 + +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 +#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 +#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 +#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 + +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); + +#define glProgramBufferParametersIivNV GLEW_GET_FUN(__glewProgramBufferParametersIivNV) +#define glProgramBufferParametersIuivNV GLEW_GET_FUN(__glewProgramBufferParametersIuivNV) +#define glProgramBufferParametersfvNV GLEW_GET_FUN(__glewProgramBufferParametersfvNV) + +#define GLEW_NV_parameter_buffer_object GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object) + +#endif /* GL_NV_parameter_buffer_object */ + +/* --------------------- GL_NV_parameter_buffer_object2 -------------------- */ + +#ifndef GL_NV_parameter_buffer_object2 +#define GL_NV_parameter_buffer_object2 1 + +#define GLEW_NV_parameter_buffer_object2 GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object2) + +#endif /* GL_NV_parameter_buffer_object2 */ + +/* -------------------------- GL_NV_path_rendering ------------------------- */ + +#ifndef GL_NV_path_rendering +#define GL_NV_path_rendering 1 + +#define GL_CLOSE_PATH_NV 0x00 +#define GL_BOLD_BIT_NV 0x01 +#define GL_GLYPH_WIDTH_BIT_NV 0x01 +#define GL_GLYPH_HEIGHT_BIT_NV 0x02 +#define GL_ITALIC_BIT_NV 0x02 +#define GL_MOVE_TO_NV 0x02 +#define GL_RELATIVE_MOVE_TO_NV 0x03 +#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 +#define GL_LINE_TO_NV 0x04 +#define GL_RELATIVE_LINE_TO_NV 0x05 +#define GL_HORIZONTAL_LINE_TO_NV 0x06 +#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 +#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 +#define GL_VERTICAL_LINE_TO_NV 0x08 +#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 +#define GL_QUADRATIC_CURVE_TO_NV 0x0A +#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B +#define GL_CUBIC_CURVE_TO_NV 0x0C +#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D +#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E +#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F +#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 +#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 +#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 +#define GL_SMALL_CCW_ARC_TO_NV 0x12 +#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 +#define GL_SMALL_CW_ARC_TO_NV 0x14 +#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 +#define GL_LARGE_CCW_ARC_TO_NV 0x16 +#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 +#define GL_LARGE_CW_ARC_TO_NV 0x18 +#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 +#define GL_CONIC_CURVE_TO_NV 0x1A +#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B +#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 +#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 +#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 +#define GL_ROUNDED_RECT_NV 0xE8 +#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 +#define GL_ROUNDED_RECT2_NV 0xEA +#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB +#define GL_ROUNDED_RECT4_NV 0xEC +#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED +#define GL_ROUNDED_RECT8_NV 0xEE +#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF +#define GL_RESTART_PATH_NV 0xF0 +#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 +#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 +#define GL_RECT_NV 0xF6 +#define GL_RELATIVE_RECT_NV 0xF7 +#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 +#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA +#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC +#define GL_ARC_TO_NV 0xFE +#define GL_RELATIVE_ARC_TO_NV 0xFF +#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PATH_FORMAT_SVG_NV 0x9070 +#define GL_PATH_FORMAT_PS_NV 0x9071 +#define GL_STANDARD_FONT_NAME_NV 0x9072 +#define GL_SYSTEM_FONT_NAME_NV 0x9073 +#define GL_FILE_NAME_NV 0x9074 +#define GL_PATH_STROKE_WIDTH_NV 0x9075 +#define GL_PATH_END_CAPS_NV 0x9076 +#define GL_PATH_INITIAL_END_CAP_NV 0x9077 +#define GL_PATH_TERMINAL_END_CAP_NV 0x9078 +#define GL_PATH_JOIN_STYLE_NV 0x9079 +#define GL_PATH_MITER_LIMIT_NV 0x907A +#define GL_PATH_DASH_CAPS_NV 0x907B +#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C +#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D +#define GL_PATH_DASH_OFFSET_NV 0x907E +#define GL_PATH_CLIENT_LENGTH_NV 0x907F +#define GL_PATH_FILL_MODE_NV 0x9080 +#define GL_PATH_FILL_MASK_NV 0x9081 +#define GL_PATH_FILL_COVER_MODE_NV 0x9082 +#define GL_PATH_STROKE_COVER_MODE_NV 0x9083 +#define GL_PATH_STROKE_MASK_NV 0x9084 +#define GL_PATH_STROKE_BOUND_NV 0x9086 +#define GL_COUNT_UP_NV 0x9088 +#define GL_COUNT_DOWN_NV 0x9089 +#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A +#define GL_CONVEX_HULL_NV 0x908B +#define GL_BOUNDING_BOX_NV 0x908D +#define GL_TRANSLATE_X_NV 0x908E +#define GL_TRANSLATE_Y_NV 0x908F +#define GL_TRANSLATE_2D_NV 0x9090 +#define GL_TRANSLATE_3D_NV 0x9091 +#define GL_AFFINE_2D_NV 0x9092 +#define GL_AFFINE_3D_NV 0x9094 +#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 +#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 +#define GL_UTF8_NV 0x909A +#define GL_UTF16_NV 0x909B +#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C +#define GL_PATH_COMMAND_COUNT_NV 0x909D +#define GL_PATH_COORD_COUNT_NV 0x909E +#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F +#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 +#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 +#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 +#define GL_SQUARE_NV 0x90A3 +#define GL_ROUND_NV 0x90A4 +#define GL_TRIANGULAR_NV 0x90A5 +#define GL_BEVEL_NV 0x90A6 +#define GL_MITER_REVERT_NV 0x90A7 +#define GL_MITER_TRUNCATE_NV 0x90A8 +#define GL_SKIP_MISSING_GLYPH_NV 0x90A9 +#define GL_USE_MISSING_GLYPH_NV 0x90AA +#define GL_PATH_ERROR_POSITION_NV 0x90AB +#define GL_PATH_FOG_GEN_MODE_NV 0x90AC +#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD +#define GL_ADJACENT_PAIRS_NV 0x90AE +#define GL_FIRST_TO_REST_NV 0x90AF +#define GL_PATH_GEN_MODE_NV 0x90B0 +#define GL_PATH_GEN_COEFF_NV 0x90B1 +#define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 +#define GL_PATH_GEN_COMPONENTS_NV 0x90B3 +#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 +#define GL_MOVE_TO_RESETS_NV 0x90B5 +#define GL_MOVE_TO_CONTINUES_NV 0x90B6 +#define GL_PATH_STENCIL_FUNC_NV 0x90B7 +#define GL_PATH_STENCIL_REF_NV 0x90B8 +#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 +#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD +#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE +#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF +#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 +#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 +#define GL_FONT_UNAVAILABLE_NV 0x936A +#define GL_FONT_UNINTELLIGIBLE_NV 0x936B +#define GL_STANDARD_FONT_FORMAT_NV 0x936C +#define GL_FRAGMENT_INPUT_NV 0x936D +#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 +#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 +#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 +#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 +#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 +#define GL_FONT_ASCENDER_BIT_NV 0x00200000 +#define GL_FONT_DESCENDER_BIT_NV 0x00400000 +#define GL_FONT_HEIGHT_BIT_NV 0x00800000 +#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 +#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 +#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 +#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 +#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 +#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 + +typedef void (GLAPIENTRY * PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); +typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (GLAPIENTRY * PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); +typedef GLuint (GLAPIENTRY * PFNGLGENPATHSNVPROC) (GLsizei range); +typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat* value); +typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint* value); +typedef void (GLAPIENTRY * PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte* commands); +typedef void (GLAPIENTRY * PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat* coords); +typedef void (GLAPIENTRY * PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat* dashArray); +typedef GLfloat (GLAPIENTRY * PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); +typedef void (GLAPIENTRY * PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat* metrics); +typedef void (GLAPIENTRY * PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat* value); +typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint* value); +typedef void (GLAPIENTRY * PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat* value); +typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint* value); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +typedef GLboolean (GLAPIENTRY * PFNGLISPATHNVPROC) (GLuint path); +typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); +typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat* coeffs); +typedef void (GLAPIENTRY * PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void*coords); +typedef void (GLAPIENTRY * PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (GLAPIENTRY * PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum zfunc); +typedef void (GLAPIENTRY * PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat* dashArray); +typedef void (GLAPIENTRY * PFNGLPATHFOGGENNVPROC) (GLenum genMode); +typedef GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); +typedef void (GLAPIENTRY * PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (GLAPIENTRY * PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void*charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef GLenum (GLAPIENTRY * PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); +typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); +typedef void (GLAPIENTRY * PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); +typedef void (GLAPIENTRY * PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); +typedef void (GLAPIENTRY * PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); +typedef void (GLAPIENTRY * PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void*coords); +typedef void (GLAPIENTRY * PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (GLAPIENTRY * PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat* coeffs); +typedef GLboolean (GLAPIENTRY * PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat* x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +typedef void (GLAPIENTRY * PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat* coeffs); +typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); +typedef void (GLAPIENTRY * PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat* transformValues); +typedef void (GLAPIENTRY * PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint paths[], const GLfloat weights[]); + +#define glCopyPathNV GLEW_GET_FUN(__glewCopyPathNV) +#define glCoverFillPathInstancedNV GLEW_GET_FUN(__glewCoverFillPathInstancedNV) +#define glCoverFillPathNV GLEW_GET_FUN(__glewCoverFillPathNV) +#define glCoverStrokePathInstancedNV GLEW_GET_FUN(__glewCoverStrokePathInstancedNV) +#define glCoverStrokePathNV GLEW_GET_FUN(__glewCoverStrokePathNV) +#define glDeletePathsNV GLEW_GET_FUN(__glewDeletePathsNV) +#define glGenPathsNV GLEW_GET_FUN(__glewGenPathsNV) +#define glGetPathColorGenfvNV GLEW_GET_FUN(__glewGetPathColorGenfvNV) +#define glGetPathColorGenivNV GLEW_GET_FUN(__glewGetPathColorGenivNV) +#define glGetPathCommandsNV GLEW_GET_FUN(__glewGetPathCommandsNV) +#define glGetPathCoordsNV GLEW_GET_FUN(__glewGetPathCoordsNV) +#define glGetPathDashArrayNV GLEW_GET_FUN(__glewGetPathDashArrayNV) +#define glGetPathLengthNV GLEW_GET_FUN(__glewGetPathLengthNV) +#define glGetPathMetricRangeNV GLEW_GET_FUN(__glewGetPathMetricRangeNV) +#define glGetPathMetricsNV GLEW_GET_FUN(__glewGetPathMetricsNV) +#define glGetPathParameterfvNV GLEW_GET_FUN(__glewGetPathParameterfvNV) +#define glGetPathParameterivNV GLEW_GET_FUN(__glewGetPathParameterivNV) +#define glGetPathSpacingNV GLEW_GET_FUN(__glewGetPathSpacingNV) +#define glGetPathTexGenfvNV GLEW_GET_FUN(__glewGetPathTexGenfvNV) +#define glGetPathTexGenivNV GLEW_GET_FUN(__glewGetPathTexGenivNV) +#define glGetProgramResourcefvNV GLEW_GET_FUN(__glewGetProgramResourcefvNV) +#define glInterpolatePathsNV GLEW_GET_FUN(__glewInterpolatePathsNV) +#define glIsPathNV GLEW_GET_FUN(__glewIsPathNV) +#define glIsPointInFillPathNV GLEW_GET_FUN(__glewIsPointInFillPathNV) +#define glIsPointInStrokePathNV GLEW_GET_FUN(__glewIsPointInStrokePathNV) +#define glMatrixLoad3x2fNV GLEW_GET_FUN(__glewMatrixLoad3x2fNV) +#define glMatrixLoad3x3fNV GLEW_GET_FUN(__glewMatrixLoad3x3fNV) +#define glMatrixLoadTranspose3x3fNV GLEW_GET_FUN(__glewMatrixLoadTranspose3x3fNV) +#define glMatrixMult3x2fNV GLEW_GET_FUN(__glewMatrixMult3x2fNV) +#define glMatrixMult3x3fNV GLEW_GET_FUN(__glewMatrixMult3x3fNV) +#define glMatrixMultTranspose3x3fNV GLEW_GET_FUN(__glewMatrixMultTranspose3x3fNV) +#define glPathColorGenNV GLEW_GET_FUN(__glewPathColorGenNV) +#define glPathCommandsNV GLEW_GET_FUN(__glewPathCommandsNV) +#define glPathCoordsNV GLEW_GET_FUN(__glewPathCoordsNV) +#define glPathCoverDepthFuncNV GLEW_GET_FUN(__glewPathCoverDepthFuncNV) +#define glPathDashArrayNV GLEW_GET_FUN(__glewPathDashArrayNV) +#define glPathFogGenNV GLEW_GET_FUN(__glewPathFogGenNV) +#define glPathGlyphIndexArrayNV GLEW_GET_FUN(__glewPathGlyphIndexArrayNV) +#define glPathGlyphIndexRangeNV GLEW_GET_FUN(__glewPathGlyphIndexRangeNV) +#define glPathGlyphRangeNV GLEW_GET_FUN(__glewPathGlyphRangeNV) +#define glPathGlyphsNV GLEW_GET_FUN(__glewPathGlyphsNV) +#define glPathMemoryGlyphIndexArrayNV GLEW_GET_FUN(__glewPathMemoryGlyphIndexArrayNV) +#define glPathParameterfNV GLEW_GET_FUN(__glewPathParameterfNV) +#define glPathParameterfvNV GLEW_GET_FUN(__glewPathParameterfvNV) +#define glPathParameteriNV GLEW_GET_FUN(__glewPathParameteriNV) +#define glPathParameterivNV GLEW_GET_FUN(__glewPathParameterivNV) +#define glPathStencilDepthOffsetNV GLEW_GET_FUN(__glewPathStencilDepthOffsetNV) +#define glPathStencilFuncNV GLEW_GET_FUN(__glewPathStencilFuncNV) +#define glPathStringNV GLEW_GET_FUN(__glewPathStringNV) +#define glPathSubCommandsNV GLEW_GET_FUN(__glewPathSubCommandsNV) +#define glPathSubCoordsNV GLEW_GET_FUN(__glewPathSubCoordsNV) +#define glPathTexGenNV GLEW_GET_FUN(__glewPathTexGenNV) +#define glPointAlongPathNV GLEW_GET_FUN(__glewPointAlongPathNV) +#define glProgramPathFragmentInputGenNV GLEW_GET_FUN(__glewProgramPathFragmentInputGenNV) +#define glStencilFillPathInstancedNV GLEW_GET_FUN(__glewStencilFillPathInstancedNV) +#define glStencilFillPathNV GLEW_GET_FUN(__glewStencilFillPathNV) +#define glStencilStrokePathInstancedNV GLEW_GET_FUN(__glewStencilStrokePathInstancedNV) +#define glStencilStrokePathNV GLEW_GET_FUN(__glewStencilStrokePathNV) +#define glStencilThenCoverFillPathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverFillPathInstancedNV) +#define glStencilThenCoverFillPathNV GLEW_GET_FUN(__glewStencilThenCoverFillPathNV) +#define glStencilThenCoverStrokePathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathInstancedNV) +#define glStencilThenCoverStrokePathNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathNV) +#define glTransformPathNV GLEW_GET_FUN(__glewTransformPathNV) +#define glWeightPathsNV GLEW_GET_FUN(__glewWeightPathsNV) + +#define GLEW_NV_path_rendering GLEW_GET_VAR(__GLEW_NV_path_rendering) + +#endif /* GL_NV_path_rendering */ + +/* -------------------- GL_NV_path_rendering_shared_edge ------------------- */ + +#ifndef GL_NV_path_rendering_shared_edge +#define GL_NV_path_rendering_shared_edge 1 + +#define GL_SHARED_EDGE_NV 0xC0 + +#define GLEW_NV_path_rendering_shared_edge GLEW_GET_VAR(__GLEW_NV_path_rendering_shared_edge) + +#endif /* GL_NV_path_rendering_shared_edge */ + +/* ----------------------- GL_NV_pixel_buffer_object ----------------------- */ + +#ifndef GL_NV_pixel_buffer_object +#define GL_NV_pixel_buffer_object 1 + +#define GL_PIXEL_PACK_BUFFER_NV 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_NV 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_NV 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_NV 0x88EF + +#define GLEW_NV_pixel_buffer_object GLEW_GET_VAR(__GLEW_NV_pixel_buffer_object) + +#endif /* GL_NV_pixel_buffer_object */ + +/* ------------------------- GL_NV_pixel_data_range ------------------------ */ + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 + +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D + +typedef void (GLAPIENTRY * PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, void *pointer); + +#define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV) +#define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV) + +#define GLEW_NV_pixel_data_range GLEW_GET_VAR(__GLEW_NV_pixel_data_range) + +#endif /* GL_NV_pixel_data_range */ + +/* ------------------------- GL_NV_platform_binary ------------------------- */ + +#ifndef GL_NV_platform_binary +#define GL_NV_platform_binary 1 + +#define GL_NVIDIA_PLATFORM_BINARY_NV 0x890B + +#define GLEW_NV_platform_binary GLEW_GET_VAR(__GLEW_NV_platform_binary) + +#endif /* GL_NV_platform_binary */ + +/* --------------------------- GL_NV_point_sprite -------------------------- */ + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 + +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint* params); + +#define glPointParameteriNV GLEW_GET_FUN(__glewPointParameteriNV) +#define glPointParameterivNV GLEW_GET_FUN(__glewPointParameterivNV) + +#define GLEW_NV_point_sprite GLEW_GET_VAR(__GLEW_NV_point_sprite) + +#endif /* GL_NV_point_sprite */ + +/* --------------------------- GL_NV_polygon_mode -------------------------- */ + +#ifndef GL_NV_polygon_mode +#define GL_NV_polygon_mode 1 + +#define GL_POLYGON_MODE_NV 0x0B40 +#define GL_POINT_NV 0x1B00 +#define GL_LINE_NV 0x1B01 +#define GL_FILL_NV 0x1B02 +#define GL_POLYGON_OFFSET_POINT_NV 0x2A01 +#define GL_POLYGON_OFFSET_LINE_NV 0x2A02 + +typedef void (GLAPIENTRY * PFNGLPOLYGONMODENVPROC) (GLenum face, GLenum mode); + +#define glPolygonModeNV GLEW_GET_FUN(__glewPolygonModeNV) + +#define GLEW_NV_polygon_mode GLEW_GET_VAR(__GLEW_NV_polygon_mode) + +#endif /* GL_NV_polygon_mode */ + +/* -------------------------- GL_NV_present_video -------------------------- */ + +#ifndef GL_NV_present_video +#define GL_NV_present_video 1 + +#define GL_FRAME_NV 0x8E26 +#define GL_FIELDS_NV 0x8E27 +#define GL_CURRENT_TIME_NV 0x8E28 +#define GL_NUM_FILL_STREAMS_NV 0x8E29 +#define GL_PRESENT_TIME_NV 0x8E2A +#define GL_PRESENT_DURATION_NV 0x8E2B + +typedef void (GLAPIENTRY * PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); + +#define glGetVideoi64vNV GLEW_GET_FUN(__glewGetVideoi64vNV) +#define glGetVideoivNV GLEW_GET_FUN(__glewGetVideoivNV) +#define glGetVideoui64vNV GLEW_GET_FUN(__glewGetVideoui64vNV) +#define glGetVideouivNV GLEW_GET_FUN(__glewGetVideouivNV) +#define glPresentFrameDualFillNV GLEW_GET_FUN(__glewPresentFrameDualFillNV) +#define glPresentFrameKeyedNV GLEW_GET_FUN(__glewPresentFrameKeyedNV) + +#define GLEW_NV_present_video GLEW_GET_VAR(__GLEW_NV_present_video) + +#endif /* GL_NV_present_video */ + +/* ------------------------ GL_NV_primitive_restart ------------------------ */ + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 + +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 + +typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTNVPROC) (void); + +#define glPrimitiveRestartIndexNV GLEW_GET_FUN(__glewPrimitiveRestartIndexNV) +#define glPrimitiveRestartNV GLEW_GET_FUN(__glewPrimitiveRestartNV) + +#define GLEW_NV_primitive_restart GLEW_GET_VAR(__GLEW_NV_primitive_restart) + +#endif /* GL_NV_primitive_restart */ + +/* ---------------------------- GL_NV_read_depth --------------------------- */ + +#ifndef GL_NV_read_depth +#define GL_NV_read_depth 1 + +#define GLEW_NV_read_depth GLEW_GET_VAR(__GLEW_NV_read_depth) + +#endif /* GL_NV_read_depth */ + +/* ------------------------ GL_NV_read_depth_stencil ----------------------- */ + +#ifndef GL_NV_read_depth_stencil +#define GL_NV_read_depth_stencil 1 + +#define GLEW_NV_read_depth_stencil GLEW_GET_VAR(__GLEW_NV_read_depth_stencil) + +#endif /* GL_NV_read_depth_stencil */ + +/* --------------------------- GL_NV_read_stencil -------------------------- */ + +#ifndef GL_NV_read_stencil +#define GL_NV_read_stencil 1 + +#define GLEW_NV_read_stencil GLEW_GET_VAR(__GLEW_NV_read_stencil) + +#endif /* GL_NV_read_stencil */ + +/* ------------------------ GL_NV_register_combiners ----------------------- */ + +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 + +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 + +typedef void (GLAPIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (GLAPIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint* params); + +#define glCombinerInputNV GLEW_GET_FUN(__glewCombinerInputNV) +#define glCombinerOutputNV GLEW_GET_FUN(__glewCombinerOutputNV) +#define glCombinerParameterfNV GLEW_GET_FUN(__glewCombinerParameterfNV) +#define glCombinerParameterfvNV GLEW_GET_FUN(__glewCombinerParameterfvNV) +#define glCombinerParameteriNV GLEW_GET_FUN(__glewCombinerParameteriNV) +#define glCombinerParameterivNV GLEW_GET_FUN(__glewCombinerParameterivNV) +#define glFinalCombinerInputNV GLEW_GET_FUN(__glewFinalCombinerInputNV) +#define glGetCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetCombinerInputParameterfvNV) +#define glGetCombinerInputParameterivNV GLEW_GET_FUN(__glewGetCombinerInputParameterivNV) +#define glGetCombinerOutputParameterfvNV GLEW_GET_FUN(__glewGetCombinerOutputParameterfvNV) +#define glGetCombinerOutputParameterivNV GLEW_GET_FUN(__glewGetCombinerOutputParameterivNV) +#define glGetFinalCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterfvNV) +#define glGetFinalCombinerInputParameterivNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterivNV) + +#define GLEW_NV_register_combiners GLEW_GET_VAR(__GLEW_NV_register_combiners) + +#endif /* GL_NV_register_combiners */ + +/* ----------------------- GL_NV_register_combiners2 ----------------------- */ + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 + +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 + +typedef void (GLAPIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat* params); + +#define glCombinerStageParameterfvNV GLEW_GET_FUN(__glewCombinerStageParameterfvNV) +#define glGetCombinerStageParameterfvNV GLEW_GET_FUN(__glewGetCombinerStageParameterfvNV) + +#define GLEW_NV_register_combiners2 GLEW_GET_VAR(__GLEW_NV_register_combiners2) + +#endif /* GL_NV_register_combiners2 */ + +/* ------------------ GL_NV_robustness_video_memory_purge ------------------ */ + +#ifndef GL_NV_robustness_video_memory_purge +#define GL_NV_robustness_video_memory_purge 1 + +#define GL_EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x334C +#define GL_PURGED_CONTEXT_RESET_NV 0x92BB + +#define GLEW_NV_robustness_video_memory_purge GLEW_GET_VAR(__GLEW_NV_robustness_video_memory_purge) + +#endif /* GL_NV_robustness_video_memory_purge */ + +/* --------------------------- GL_NV_sRGB_formats -------------------------- */ + +#ifndef GL_NV_sRGB_formats +#define GL_NV_sRGB_formats 1 + +#define GL_ETC1_SRGB8_NV 0x88EE +#define GL_SRGB8_NV 0x8C41 +#define GL_SLUMINANCE_ALPHA_NV 0x8C44 +#define GL_SLUMINANCE8_ALPHA8_NV 0x8C45 +#define GL_SLUMINANCE_NV 0x8C46 +#define GL_SLUMINANCE8_NV 0x8C47 +#define GL_COMPRESSED_SRGB_S3TC_DXT1_NV 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV 0x8C4F + +#define GLEW_NV_sRGB_formats GLEW_GET_VAR(__GLEW_NV_sRGB_formats) + +#endif /* GL_NV_sRGB_formats */ + +/* ------------------------- GL_NV_sample_locations ------------------------ */ + +#ifndef GL_NV_sample_locations +#define GL_NV_sample_locations 1 + +#define GL_SAMPLE_LOCATION_NV 0x8E50 +#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D +#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E +#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); + +#define glFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewFramebufferSampleLocationsfvNV) +#define glNamedFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvNV) + +#define GLEW_NV_sample_locations GLEW_GET_VAR(__GLEW_NV_sample_locations) + +#endif /* GL_NV_sample_locations */ + +/* ------------------ GL_NV_sample_mask_override_coverage ------------------ */ + +#ifndef GL_NV_sample_mask_override_coverage +#define GL_NV_sample_mask_override_coverage 1 + +#define GLEW_NV_sample_mask_override_coverage GLEW_GET_VAR(__GLEW_NV_sample_mask_override_coverage) + +#endif /* GL_NV_sample_mask_override_coverage */ + +/* ---------------------- GL_NV_shader_atomic_counters --------------------- */ + +#ifndef GL_NV_shader_atomic_counters +#define GL_NV_shader_atomic_counters 1 + +#define GLEW_NV_shader_atomic_counters GLEW_GET_VAR(__GLEW_NV_shader_atomic_counters) + +#endif /* GL_NV_shader_atomic_counters */ + +/* ----------------------- GL_NV_shader_atomic_float ----------------------- */ + +#ifndef GL_NV_shader_atomic_float +#define GL_NV_shader_atomic_float 1 + +#define GLEW_NV_shader_atomic_float GLEW_GET_VAR(__GLEW_NV_shader_atomic_float) + +#endif /* GL_NV_shader_atomic_float */ + +/* ---------------------- GL_NV_shader_atomic_float64 ---------------------- */ + +#ifndef GL_NV_shader_atomic_float64 +#define GL_NV_shader_atomic_float64 1 + +#define GLEW_NV_shader_atomic_float64 GLEW_GET_VAR(__GLEW_NV_shader_atomic_float64) + +#endif /* GL_NV_shader_atomic_float64 */ + +/* -------------------- GL_NV_shader_atomic_fp16_vector -------------------- */ + +#ifndef GL_NV_shader_atomic_fp16_vector +#define GL_NV_shader_atomic_fp16_vector 1 + +#define GLEW_NV_shader_atomic_fp16_vector GLEW_GET_VAR(__GLEW_NV_shader_atomic_fp16_vector) + +#endif /* GL_NV_shader_atomic_fp16_vector */ + +/* ----------------------- GL_NV_shader_atomic_int64 ----------------------- */ + +#ifndef GL_NV_shader_atomic_int64 +#define GL_NV_shader_atomic_int64 1 + +#define GLEW_NV_shader_atomic_int64 GLEW_GET_VAR(__GLEW_NV_shader_atomic_int64) + +#endif /* GL_NV_shader_atomic_int64 */ + +/* ------------------------ GL_NV_shader_buffer_load ----------------------- */ + +#ifndef GL_NV_shader_buffer_load +#define GL_NV_shader_buffer_load 1 + +#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D +#define GL_GPU_ADDRESS_NV 0x8F34 +#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 + +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT* result); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT* params); +typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); +typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); +typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); +typedef void (GLAPIENTRY * PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); + +#define glGetBufferParameterui64vNV GLEW_GET_FUN(__glewGetBufferParameterui64vNV) +#define glGetIntegerui64vNV GLEW_GET_FUN(__glewGetIntegerui64vNV) +#define glGetNamedBufferParameterui64vNV GLEW_GET_FUN(__glewGetNamedBufferParameterui64vNV) +#define glIsBufferResidentNV GLEW_GET_FUN(__glewIsBufferResidentNV) +#define glIsNamedBufferResidentNV GLEW_GET_FUN(__glewIsNamedBufferResidentNV) +#define glMakeBufferNonResidentNV GLEW_GET_FUN(__glewMakeBufferNonResidentNV) +#define glMakeBufferResidentNV GLEW_GET_FUN(__glewMakeBufferResidentNV) +#define glMakeNamedBufferNonResidentNV GLEW_GET_FUN(__glewMakeNamedBufferNonResidentNV) +#define glMakeNamedBufferResidentNV GLEW_GET_FUN(__glewMakeNamedBufferResidentNV) +#define glProgramUniformui64NV GLEW_GET_FUN(__glewProgramUniformui64NV) +#define glProgramUniformui64vNV GLEW_GET_FUN(__glewProgramUniformui64vNV) +#define glUniformui64NV GLEW_GET_FUN(__glewUniformui64NV) +#define glUniformui64vNV GLEW_GET_FUN(__glewUniformui64vNV) + +#define GLEW_NV_shader_buffer_load GLEW_GET_VAR(__GLEW_NV_shader_buffer_load) + +#endif /* GL_NV_shader_buffer_load */ + +/* ---------------- GL_NV_shader_noperspective_interpolation --------------- */ + +#ifndef GL_NV_shader_noperspective_interpolation +#define GL_NV_shader_noperspective_interpolation 1 + +#define GLEW_NV_shader_noperspective_interpolation GLEW_GET_VAR(__GLEW_NV_shader_noperspective_interpolation) + +#endif /* GL_NV_shader_noperspective_interpolation */ + +/* ------------------- GL_NV_shader_storage_buffer_object ------------------ */ + +#ifndef GL_NV_shader_storage_buffer_object +#define GL_NV_shader_storage_buffer_object 1 + +#define GLEW_NV_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_NV_shader_storage_buffer_object) + +#endif /* GL_NV_shader_storage_buffer_object */ + +/* ----------------------- GL_NV_shader_thread_group ----------------------- */ + +#ifndef GL_NV_shader_thread_group +#define GL_NV_shader_thread_group 1 + +#define GL_WARP_SIZE_NV 0x9339 +#define GL_WARPS_PER_SM_NV 0x933A +#define GL_SM_COUNT_NV 0x933B + +#define GLEW_NV_shader_thread_group GLEW_GET_VAR(__GLEW_NV_shader_thread_group) + +#endif /* GL_NV_shader_thread_group */ + +/* ---------------------- GL_NV_shader_thread_shuffle ---------------------- */ + +#ifndef GL_NV_shader_thread_shuffle +#define GL_NV_shader_thread_shuffle 1 + +#define GLEW_NV_shader_thread_shuffle GLEW_GET_VAR(__GLEW_NV_shader_thread_shuffle) + +#endif /* GL_NV_shader_thread_shuffle */ + +/* ---------------------- GL_NV_shadow_samplers_array ---------------------- */ + +#ifndef GL_NV_shadow_samplers_array +#define GL_NV_shadow_samplers_array 1 + +#define GL_SAMPLER_2D_ARRAY_SHADOW_NV 0x8DC4 + +#define GLEW_NV_shadow_samplers_array GLEW_GET_VAR(__GLEW_NV_shadow_samplers_array) + +#endif /* GL_NV_shadow_samplers_array */ + +/* ----------------------- GL_NV_shadow_samplers_cube ---------------------- */ + +#ifndef GL_NV_shadow_samplers_cube +#define GL_NV_shadow_samplers_cube 1 + +#define GL_SAMPLER_CUBE_SHADOW_NV 0x8DC5 + +#define GLEW_NV_shadow_samplers_cube GLEW_GET_VAR(__GLEW_NV_shadow_samplers_cube) + +#endif /* GL_NV_shadow_samplers_cube */ + +/* ---------------------- GL_NV_stereo_view_rendering ---------------------- */ + +#ifndef GL_NV_stereo_view_rendering +#define GL_NV_stereo_view_rendering 1 + +#define GLEW_NV_stereo_view_rendering GLEW_GET_VAR(__GLEW_NV_stereo_view_rendering) + +#endif /* GL_NV_stereo_view_rendering */ + +/* ---------------------- GL_NV_tessellation_program5 ---------------------- */ + +#ifndef GL_NV_tessellation_program5 +#define GL_NV_tessellation_program5 1 + +#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 +#define GL_TESS_CONTROL_PROGRAM_NV 0x891E +#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F +#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 +#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 + +#define GLEW_NV_tessellation_program5 GLEW_GET_VAR(__GLEW_NV_tessellation_program5) + +#endif /* GL_NV_tessellation_program5 */ + +/* -------------------------- GL_NV_texgen_emboss -------------------------- */ + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 + +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F + +#define GLEW_NV_texgen_emboss GLEW_GET_VAR(__GLEW_NV_texgen_emboss) + +#endif /* GL_NV_texgen_emboss */ + +/* ------------------------ GL_NV_texgen_reflection ------------------------ */ + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 + +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 + +#define GLEW_NV_texgen_reflection GLEW_GET_VAR(__GLEW_NV_texgen_reflection) + +#endif /* GL_NV_texgen_reflection */ + +/* -------------------------- GL_NV_texture_array -------------------------- */ + +#ifndef GL_NV_texture_array +#define GL_NV_texture_array 1 + +#define GL_UNPACK_SKIP_IMAGES_NV 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_NV 0x806E +#define GL_MAX_ARRAY_TEXTURE_LAYERS_NV 0x88FF +#define GL_TEXTURE_2D_ARRAY_NV 0x8C1A +#define GL_TEXTURE_BINDING_2D_ARRAY_NV 0x8C1D +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_NV 0x8CD4 +#define GL_SAMPLER_2D_ARRAY_NV 0x8DC1 + +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DNVPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DNVPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERNVPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DNVPROC) (GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DNVPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); + +#define glCompressedTexImage3DNV GLEW_GET_FUN(__glewCompressedTexImage3DNV) +#define glCompressedTexSubImage3DNV GLEW_GET_FUN(__glewCompressedTexSubImage3DNV) +#define glCopyTexSubImage3DNV GLEW_GET_FUN(__glewCopyTexSubImage3DNV) +#define glFramebufferTextureLayerNV GLEW_GET_FUN(__glewFramebufferTextureLayerNV) +#define glTexImage3DNV GLEW_GET_FUN(__glewTexImage3DNV) +#define glTexSubImage3DNV GLEW_GET_FUN(__glewTexSubImage3DNV) + +#define GLEW_NV_texture_array GLEW_GET_VAR(__GLEW_NV_texture_array) + +#endif /* GL_NV_texture_array */ + +/* ------------------------- GL_NV_texture_barrier ------------------------- */ + +#ifndef GL_NV_texture_barrier +#define GL_NV_texture_barrier 1 + +typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERNVPROC) (void); + +#define glTextureBarrierNV GLEW_GET_FUN(__glewTextureBarrierNV) + +#define GLEW_NV_texture_barrier GLEW_GET_VAR(__GLEW_NV_texture_barrier) + +#endif /* GL_NV_texture_barrier */ + +/* ----------------------- GL_NV_texture_border_clamp ---------------------- */ + +#ifndef GL_NV_texture_border_clamp +#define GL_NV_texture_border_clamp 1 + +#define GL_TEXTURE_BORDER_COLOR_NV 0x1004 +#define GL_CLAMP_TO_BORDER_NV 0x812D + +#define GLEW_NV_texture_border_clamp GLEW_GET_VAR(__GLEW_NV_texture_border_clamp) + +#endif /* GL_NV_texture_border_clamp */ + +/* --------------------- GL_NV_texture_compression_latc -------------------- */ + +#ifndef GL_NV_texture_compression_latc +#define GL_NV_texture_compression_latc 1 + +#define GL_COMPRESSED_LUMINANCE_LATC1_NV 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_NV 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_NV 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_NV 0x8C73 + +#define GLEW_NV_texture_compression_latc GLEW_GET_VAR(__GLEW_NV_texture_compression_latc) + +#endif /* GL_NV_texture_compression_latc */ + +/* --------------------- GL_NV_texture_compression_s3tc -------------------- */ + +#ifndef GL_NV_texture_compression_s3tc +#define GL_NV_texture_compression_s3tc 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_NV 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_NV 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_NV 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_NV 0x83F3 + +#define GLEW_NV_texture_compression_s3tc GLEW_GET_VAR(__GLEW_NV_texture_compression_s3tc) + +#endif /* GL_NV_texture_compression_s3tc */ + +/* ----------------- GL_NV_texture_compression_s3tc_update ----------------- */ + +#ifndef GL_NV_texture_compression_s3tc_update +#define GL_NV_texture_compression_s3tc_update 1 + +#define GLEW_NV_texture_compression_s3tc_update GLEW_GET_VAR(__GLEW_NV_texture_compression_s3tc_update) + +#endif /* GL_NV_texture_compression_s3tc_update */ + +/* --------------------- GL_NV_texture_compression_vtc --------------------- */ + +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 + +#define GLEW_NV_texture_compression_vtc GLEW_GET_VAR(__GLEW_NV_texture_compression_vtc) + +#endif /* GL_NV_texture_compression_vtc */ + +/* ----------------------- GL_NV_texture_env_combine4 ---------------------- */ + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 + +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B + +#define GLEW_NV_texture_env_combine4 GLEW_GET_VAR(__GLEW_NV_texture_env_combine4) + +#endif /* GL_NV_texture_env_combine4 */ + +/* ---------------------- GL_NV_texture_expand_normal ---------------------- */ + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 + +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F + +#define GLEW_NV_texture_expand_normal GLEW_GET_VAR(__GLEW_NV_texture_expand_normal) + +#endif /* GL_NV_texture_expand_normal */ + +/* ----------------------- GL_NV_texture_multisample ----------------------- */ + +#ifndef GL_NV_texture_multisample +#define GL_NV_texture_multisample 1 + +#define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 +#define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 + +typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); + +#define glTexImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage2DMultisampleCoverageNV) +#define glTexImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage3DMultisampleCoverageNV) +#define glTextureImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage2DMultisampleCoverageNV) +#define glTextureImage2DMultisampleNV GLEW_GET_FUN(__glewTextureImage2DMultisampleNV) +#define glTextureImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage3DMultisampleCoverageNV) +#define glTextureImage3DMultisampleNV GLEW_GET_FUN(__glewTextureImage3DMultisampleNV) + +#define GLEW_NV_texture_multisample GLEW_GET_VAR(__GLEW_NV_texture_multisample) + +#endif /* GL_NV_texture_multisample */ + +/* ---------------------- GL_NV_texture_npot_2D_mipmap --------------------- */ + +#ifndef GL_NV_texture_npot_2D_mipmap +#define GL_NV_texture_npot_2D_mipmap 1 + +#define GLEW_NV_texture_npot_2D_mipmap GLEW_GET_VAR(__GLEW_NV_texture_npot_2D_mipmap) + +#endif /* GL_NV_texture_npot_2D_mipmap */ + +/* ------------------------ GL_NV_texture_rectangle ------------------------ */ + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 + +#define GLEW_NV_texture_rectangle GLEW_GET_VAR(__GLEW_NV_texture_rectangle) + +#endif /* GL_NV_texture_rectangle */ + +/* ------------------- GL_NV_texture_rectangle_compressed ------------------ */ + +#ifndef GL_NV_texture_rectangle_compressed +#define GL_NV_texture_rectangle_compressed 1 + +#define GLEW_NV_texture_rectangle_compressed GLEW_GET_VAR(__GLEW_NV_texture_rectangle_compressed) + +#endif /* GL_NV_texture_rectangle_compressed */ + +/* -------------------------- GL_NV_texture_shader ------------------------- */ + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 + +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F + +#define GLEW_NV_texture_shader GLEW_GET_VAR(__GLEW_NV_texture_shader) + +#endif /* GL_NV_texture_shader */ + +/* ------------------------- GL_NV_texture_shader2 ------------------------- */ + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 + +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D + +#define GLEW_NV_texture_shader2 GLEW_GET_VAR(__GLEW_NV_texture_shader2) + +#endif /* GL_NV_texture_shader2 */ + +/* ------------------------- GL_NV_texture_shader3 ------------------------- */ + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 + +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 + +#define GLEW_NV_texture_shader3 GLEW_GET_VAR(__GLEW_NV_texture_shader3) + +#endif /* GL_NV_texture_shader3 */ + +/* ------------------------ GL_NV_transform_feedback ----------------------- */ + +#ifndef GL_NV_transform_feedback +#define GL_NV_transform_feedback 1 + +#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 +#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 +#define GL_TEXTURE_COORD_NV 0x8C79 +#define GL_CLIP_DISTANCE_NV 0x8C7A +#define GL_VERTEX_ID_NV 0x8C7B +#define GL_PRIMITIVE_ID_NV 0x8C7C +#define GL_GENERIC_ATTRIB_NV 0x8C7D +#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 +#define GL_ACTIVE_VARYINGS_NV 0x8C81 +#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 +#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 +#define GL_PRIMITIVES_GENERATED_NV 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 +#define GL_RASTERIZER_DISCARD_NV 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C +#define GL_SEPARATE_ATTRIBS_NV 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F + +typedef void (GLAPIENTRY * PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); +typedef GLint (GLAPIENTRY * PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); + +#define glActiveVaryingNV GLEW_GET_FUN(__glewActiveVaryingNV) +#define glBeginTransformFeedbackNV GLEW_GET_FUN(__glewBeginTransformFeedbackNV) +#define glBindBufferBaseNV GLEW_GET_FUN(__glewBindBufferBaseNV) +#define glBindBufferOffsetNV GLEW_GET_FUN(__glewBindBufferOffsetNV) +#define glBindBufferRangeNV GLEW_GET_FUN(__glewBindBufferRangeNV) +#define glEndTransformFeedbackNV GLEW_GET_FUN(__glewEndTransformFeedbackNV) +#define glGetActiveVaryingNV GLEW_GET_FUN(__glewGetActiveVaryingNV) +#define glGetTransformFeedbackVaryingNV GLEW_GET_FUN(__glewGetTransformFeedbackVaryingNV) +#define glGetVaryingLocationNV GLEW_GET_FUN(__glewGetVaryingLocationNV) +#define glTransformFeedbackAttribsNV GLEW_GET_FUN(__glewTransformFeedbackAttribsNV) +#define glTransformFeedbackVaryingsNV GLEW_GET_FUN(__glewTransformFeedbackVaryingsNV) + +#define GLEW_NV_transform_feedback GLEW_GET_VAR(__GLEW_NV_transform_feedback) + +#endif /* GL_NV_transform_feedback */ + +/* ----------------------- GL_NV_transform_feedback2 ----------------------- */ + +#ifndef GL_NV_transform_feedback2 +#define GL_NV_transform_feedback2 1 + +#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 + +typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); +typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint* ids); +typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); + +#define glBindTransformFeedbackNV GLEW_GET_FUN(__glewBindTransformFeedbackNV) +#define glDeleteTransformFeedbacksNV GLEW_GET_FUN(__glewDeleteTransformFeedbacksNV) +#define glDrawTransformFeedbackNV GLEW_GET_FUN(__glewDrawTransformFeedbackNV) +#define glGenTransformFeedbacksNV GLEW_GET_FUN(__glewGenTransformFeedbacksNV) +#define glIsTransformFeedbackNV GLEW_GET_FUN(__glewIsTransformFeedbackNV) +#define glPauseTransformFeedbackNV GLEW_GET_FUN(__glewPauseTransformFeedbackNV) +#define glResumeTransformFeedbackNV GLEW_GET_FUN(__glewResumeTransformFeedbackNV) + +#define GLEW_NV_transform_feedback2 GLEW_GET_VAR(__GLEW_NV_transform_feedback2) + +#endif /* GL_NV_transform_feedback2 */ + +/* ------------------ GL_NV_uniform_buffer_unified_memory ------------------ */ + +#ifndef GL_NV_uniform_buffer_unified_memory +#define GL_NV_uniform_buffer_unified_memory 1 + +#define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E +#define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F +#define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370 + +#define GLEW_NV_uniform_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_uniform_buffer_unified_memory) + +#endif /* GL_NV_uniform_buffer_unified_memory */ + +/* -------------------------- GL_NV_vdpau_interop -------------------------- */ + +#ifndef GL_NV_vdpau_interop +#define GL_NV_vdpau_interop 1 + +#define GL_SURFACE_STATE_NV 0x86EB +#define GL_SURFACE_REGISTERED_NV 0x86FD +#define GL_SURFACE_MAPPED_NV 0x8700 +#define GL_WRITE_DISCARD_NV 0x88BE + +typedef GLintptr GLvdpauSurfaceNV; + +typedef void (GLAPIENTRY * PFNGLVDPAUFININVPROC) (void); +typedef void (GLAPIENTRY * PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei* length, GLint *values); +typedef void (GLAPIENTRY * PFNGLVDPAUINITNVPROC) (const void* vdpDevice, const void*getProcAddress); +typedef void (GLAPIENTRY * PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (GLAPIENTRY * PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV* surfaces); +typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef void (GLAPIENTRY * PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); +typedef void (GLAPIENTRY * PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV* surfaces); +typedef void (GLAPIENTRY * PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); + +#define glVDPAUFiniNV GLEW_GET_FUN(__glewVDPAUFiniNV) +#define glVDPAUGetSurfaceivNV GLEW_GET_FUN(__glewVDPAUGetSurfaceivNV) +#define glVDPAUInitNV GLEW_GET_FUN(__glewVDPAUInitNV) +#define glVDPAUIsSurfaceNV GLEW_GET_FUN(__glewVDPAUIsSurfaceNV) +#define glVDPAUMapSurfacesNV GLEW_GET_FUN(__glewVDPAUMapSurfacesNV) +#define glVDPAURegisterOutputSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterOutputSurfaceNV) +#define glVDPAURegisterVideoSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterVideoSurfaceNV) +#define glVDPAUSurfaceAccessNV GLEW_GET_FUN(__glewVDPAUSurfaceAccessNV) +#define glVDPAUUnmapSurfacesNV GLEW_GET_FUN(__glewVDPAUUnmapSurfacesNV) +#define glVDPAUUnregisterSurfaceNV GLEW_GET_FUN(__glewVDPAUUnregisterSurfaceNV) + +#define GLEW_NV_vdpau_interop GLEW_GET_VAR(__GLEW_NV_vdpau_interop) + +#endif /* GL_NV_vdpau_interop */ + +/* ------------------------ GL_NV_vertex_array_range ----------------------- */ + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 + +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 + +typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void *pointer); + +#define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV) +#define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV) + +#define GLEW_NV_vertex_array_range GLEW_GET_VAR(__GLEW_NV_vertex_array_range) + +#endif /* GL_NV_vertex_array_range */ + +/* ----------------------- GL_NV_vertex_array_range2 ----------------------- */ + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 + +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 + +#define GLEW_NV_vertex_array_range2 GLEW_GET_VAR(__GLEW_NV_vertex_array_range2) + +#endif /* GL_NV_vertex_array_range2 */ + +/* ------------------- GL_NV_vertex_attrib_integer_64bit ------------------- */ + +#ifndef GL_NV_vertex_attrib_integer_64bit +#define GL_NV_vertex_attrib_integer_64bit 1 + +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F + +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT* params); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); + +#define glGetVertexAttribLi64vNV GLEW_GET_FUN(__glewGetVertexAttribLi64vNV) +#define glGetVertexAttribLui64vNV GLEW_GET_FUN(__glewGetVertexAttribLui64vNV) +#define glVertexAttribL1i64NV GLEW_GET_FUN(__glewVertexAttribL1i64NV) +#define glVertexAttribL1i64vNV GLEW_GET_FUN(__glewVertexAttribL1i64vNV) +#define glVertexAttribL1ui64NV GLEW_GET_FUN(__glewVertexAttribL1ui64NV) +#define glVertexAttribL1ui64vNV GLEW_GET_FUN(__glewVertexAttribL1ui64vNV) +#define glVertexAttribL2i64NV GLEW_GET_FUN(__glewVertexAttribL2i64NV) +#define glVertexAttribL2i64vNV GLEW_GET_FUN(__glewVertexAttribL2i64vNV) +#define glVertexAttribL2ui64NV GLEW_GET_FUN(__glewVertexAttribL2ui64NV) +#define glVertexAttribL2ui64vNV GLEW_GET_FUN(__glewVertexAttribL2ui64vNV) +#define glVertexAttribL3i64NV GLEW_GET_FUN(__glewVertexAttribL3i64NV) +#define glVertexAttribL3i64vNV GLEW_GET_FUN(__glewVertexAttribL3i64vNV) +#define glVertexAttribL3ui64NV GLEW_GET_FUN(__glewVertexAttribL3ui64NV) +#define glVertexAttribL3ui64vNV GLEW_GET_FUN(__glewVertexAttribL3ui64vNV) +#define glVertexAttribL4i64NV GLEW_GET_FUN(__glewVertexAttribL4i64NV) +#define glVertexAttribL4i64vNV GLEW_GET_FUN(__glewVertexAttribL4i64vNV) +#define glVertexAttribL4ui64NV GLEW_GET_FUN(__glewVertexAttribL4ui64NV) +#define glVertexAttribL4ui64vNV GLEW_GET_FUN(__glewVertexAttribL4ui64vNV) +#define glVertexAttribLFormatNV GLEW_GET_FUN(__glewVertexAttribLFormatNV) + +#define GLEW_NV_vertex_attrib_integer_64bit GLEW_GET_VAR(__GLEW_NV_vertex_attrib_integer_64bit) + +#endif /* GL_NV_vertex_attrib_integer_64bit */ + +/* ------------------- GL_NV_vertex_buffer_unified_memory ------------------ */ + +#ifndef GL_NV_vertex_buffer_unified_memory +#define GL_NV_vertex_buffer_unified_memory 1 + +#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E +#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F +#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 +#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 +#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 +#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 +#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 +#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 +#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 +#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 +#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 +#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 +#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A +#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B +#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C +#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D +#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E +#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F +#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 +#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 +#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 +#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 +#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 +#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 +#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 + +typedef void (GLAPIENTRY * PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +typedef void (GLAPIENTRY * PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT result[]); +typedef void (GLAPIENTRY * PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); + +#define glBufferAddressRangeNV GLEW_GET_FUN(__glewBufferAddressRangeNV) +#define glColorFormatNV GLEW_GET_FUN(__glewColorFormatNV) +#define glEdgeFlagFormatNV GLEW_GET_FUN(__glewEdgeFlagFormatNV) +#define glFogCoordFormatNV GLEW_GET_FUN(__glewFogCoordFormatNV) +#define glGetIntegerui64i_vNV GLEW_GET_FUN(__glewGetIntegerui64i_vNV) +#define glIndexFormatNV GLEW_GET_FUN(__glewIndexFormatNV) +#define glNormalFormatNV GLEW_GET_FUN(__glewNormalFormatNV) +#define glSecondaryColorFormatNV GLEW_GET_FUN(__glewSecondaryColorFormatNV) +#define glTexCoordFormatNV GLEW_GET_FUN(__glewTexCoordFormatNV) +#define glVertexAttribFormatNV GLEW_GET_FUN(__glewVertexAttribFormatNV) +#define glVertexAttribIFormatNV GLEW_GET_FUN(__glewVertexAttribIFormatNV) +#define glVertexFormatNV GLEW_GET_FUN(__glewVertexFormatNV) + +#define GLEW_NV_vertex_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_vertex_buffer_unified_memory) + +#endif /* GL_NV_vertex_buffer_unified_memory */ + +/* -------------------------- GL_NV_vertex_program ------------------------- */ + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 + +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F + +typedef GLboolean (GLAPIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint* ids, GLboolean *residences); +typedef void (GLAPIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte* program); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, void** pointer); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte* program); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei n, const GLubyte* v); + +#define glAreProgramsResidentNV GLEW_GET_FUN(__glewAreProgramsResidentNV) +#define glBindProgramNV GLEW_GET_FUN(__glewBindProgramNV) +#define glDeleteProgramsNV GLEW_GET_FUN(__glewDeleteProgramsNV) +#define glExecuteProgramNV GLEW_GET_FUN(__glewExecuteProgramNV) +#define glGenProgramsNV GLEW_GET_FUN(__glewGenProgramsNV) +#define glGetProgramParameterdvNV GLEW_GET_FUN(__glewGetProgramParameterdvNV) +#define glGetProgramParameterfvNV GLEW_GET_FUN(__glewGetProgramParameterfvNV) +#define glGetProgramStringNV GLEW_GET_FUN(__glewGetProgramStringNV) +#define glGetProgramivNV GLEW_GET_FUN(__glewGetProgramivNV) +#define glGetTrackMatrixivNV GLEW_GET_FUN(__glewGetTrackMatrixivNV) +#define glGetVertexAttribPointervNV GLEW_GET_FUN(__glewGetVertexAttribPointervNV) +#define glGetVertexAttribdvNV GLEW_GET_FUN(__glewGetVertexAttribdvNV) +#define glGetVertexAttribfvNV GLEW_GET_FUN(__glewGetVertexAttribfvNV) +#define glGetVertexAttribivNV GLEW_GET_FUN(__glewGetVertexAttribivNV) +#define glIsProgramNV GLEW_GET_FUN(__glewIsProgramNV) +#define glLoadProgramNV GLEW_GET_FUN(__glewLoadProgramNV) +#define glProgramParameter4dNV GLEW_GET_FUN(__glewProgramParameter4dNV) +#define glProgramParameter4dvNV GLEW_GET_FUN(__glewProgramParameter4dvNV) +#define glProgramParameter4fNV GLEW_GET_FUN(__glewProgramParameter4fNV) +#define glProgramParameter4fvNV GLEW_GET_FUN(__glewProgramParameter4fvNV) +#define glProgramParameters4dvNV GLEW_GET_FUN(__glewProgramParameters4dvNV) +#define glProgramParameters4fvNV GLEW_GET_FUN(__glewProgramParameters4fvNV) +#define glRequestResidentProgramsNV GLEW_GET_FUN(__glewRequestResidentProgramsNV) +#define glTrackMatrixNV GLEW_GET_FUN(__glewTrackMatrixNV) +#define glVertexAttrib1dNV GLEW_GET_FUN(__glewVertexAttrib1dNV) +#define glVertexAttrib1dvNV GLEW_GET_FUN(__glewVertexAttrib1dvNV) +#define glVertexAttrib1fNV GLEW_GET_FUN(__glewVertexAttrib1fNV) +#define glVertexAttrib1fvNV GLEW_GET_FUN(__glewVertexAttrib1fvNV) +#define glVertexAttrib1sNV GLEW_GET_FUN(__glewVertexAttrib1sNV) +#define glVertexAttrib1svNV GLEW_GET_FUN(__glewVertexAttrib1svNV) +#define glVertexAttrib2dNV GLEW_GET_FUN(__glewVertexAttrib2dNV) +#define glVertexAttrib2dvNV GLEW_GET_FUN(__glewVertexAttrib2dvNV) +#define glVertexAttrib2fNV GLEW_GET_FUN(__glewVertexAttrib2fNV) +#define glVertexAttrib2fvNV GLEW_GET_FUN(__glewVertexAttrib2fvNV) +#define glVertexAttrib2sNV GLEW_GET_FUN(__glewVertexAttrib2sNV) +#define glVertexAttrib2svNV GLEW_GET_FUN(__glewVertexAttrib2svNV) +#define glVertexAttrib3dNV GLEW_GET_FUN(__glewVertexAttrib3dNV) +#define glVertexAttrib3dvNV GLEW_GET_FUN(__glewVertexAttrib3dvNV) +#define glVertexAttrib3fNV GLEW_GET_FUN(__glewVertexAttrib3fNV) +#define glVertexAttrib3fvNV GLEW_GET_FUN(__glewVertexAttrib3fvNV) +#define glVertexAttrib3sNV GLEW_GET_FUN(__glewVertexAttrib3sNV) +#define glVertexAttrib3svNV GLEW_GET_FUN(__glewVertexAttrib3svNV) +#define glVertexAttrib4dNV GLEW_GET_FUN(__glewVertexAttrib4dNV) +#define glVertexAttrib4dvNV GLEW_GET_FUN(__glewVertexAttrib4dvNV) +#define glVertexAttrib4fNV GLEW_GET_FUN(__glewVertexAttrib4fNV) +#define glVertexAttrib4fvNV GLEW_GET_FUN(__glewVertexAttrib4fvNV) +#define glVertexAttrib4sNV GLEW_GET_FUN(__glewVertexAttrib4sNV) +#define glVertexAttrib4svNV GLEW_GET_FUN(__glewVertexAttrib4svNV) +#define glVertexAttrib4ubNV GLEW_GET_FUN(__glewVertexAttrib4ubNV) +#define glVertexAttrib4ubvNV GLEW_GET_FUN(__glewVertexAttrib4ubvNV) +#define glVertexAttribPointerNV GLEW_GET_FUN(__glewVertexAttribPointerNV) +#define glVertexAttribs1dvNV GLEW_GET_FUN(__glewVertexAttribs1dvNV) +#define glVertexAttribs1fvNV GLEW_GET_FUN(__glewVertexAttribs1fvNV) +#define glVertexAttribs1svNV GLEW_GET_FUN(__glewVertexAttribs1svNV) +#define glVertexAttribs2dvNV GLEW_GET_FUN(__glewVertexAttribs2dvNV) +#define glVertexAttribs2fvNV GLEW_GET_FUN(__glewVertexAttribs2fvNV) +#define glVertexAttribs2svNV GLEW_GET_FUN(__glewVertexAttribs2svNV) +#define glVertexAttribs3dvNV GLEW_GET_FUN(__glewVertexAttribs3dvNV) +#define glVertexAttribs3fvNV GLEW_GET_FUN(__glewVertexAttribs3fvNV) +#define glVertexAttribs3svNV GLEW_GET_FUN(__glewVertexAttribs3svNV) +#define glVertexAttribs4dvNV GLEW_GET_FUN(__glewVertexAttribs4dvNV) +#define glVertexAttribs4fvNV GLEW_GET_FUN(__glewVertexAttribs4fvNV) +#define glVertexAttribs4svNV GLEW_GET_FUN(__glewVertexAttribs4svNV) +#define glVertexAttribs4ubvNV GLEW_GET_FUN(__glewVertexAttribs4ubvNV) + +#define GLEW_NV_vertex_program GLEW_GET_VAR(__GLEW_NV_vertex_program) + +#endif /* GL_NV_vertex_program */ + +/* ------------------------ GL_NV_vertex_program1_1 ------------------------ */ + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 + +#define GLEW_NV_vertex_program1_1 GLEW_GET_VAR(__GLEW_NV_vertex_program1_1) + +#endif /* GL_NV_vertex_program1_1 */ + +/* ------------------------- GL_NV_vertex_program2 ------------------------- */ + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 + +#define GLEW_NV_vertex_program2 GLEW_GET_VAR(__GLEW_NV_vertex_program2) + +#endif /* GL_NV_vertex_program2 */ + +/* ---------------------- GL_NV_vertex_program2_option --------------------- */ + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 + +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 + +#define GLEW_NV_vertex_program2_option GLEW_GET_VAR(__GLEW_NV_vertex_program2_option) + +#endif /* GL_NV_vertex_program2_option */ + +/* ------------------------- GL_NV_vertex_program3 ------------------------- */ + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 + +#define MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C + +#define GLEW_NV_vertex_program3 GLEW_GET_VAR(__GLEW_NV_vertex_program3) + +#endif /* GL_NV_vertex_program3 */ + +/* ------------------------- GL_NV_vertex_program4 ------------------------- */ + +#ifndef GL_NV_vertex_program4 +#define GL_NV_vertex_program4 1 + +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD + +#define GLEW_NV_vertex_program4 GLEW_GET_VAR(__GLEW_NV_vertex_program4) + +#endif /* GL_NV_vertex_program4 */ + +/* -------------------------- GL_NV_video_capture -------------------------- */ + +#ifndef GL_NV_video_capture +#define GL_NV_video_capture 1 + +#define GL_VIDEO_BUFFER_NV 0x9020 +#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 +#define GL_FIELD_UPPER_NV 0x9022 +#define GL_FIELD_LOWER_NV 0x9023 +#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 +#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 +#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 +#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 +#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 +#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 +#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A +#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B +#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C +#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D +#define GL_PARTIAL_SUCCESS_NV 0x902E +#define GL_SUCCESS_NV 0x902F +#define GL_FAILURE_NV 0x9030 +#define GL_YCBYCR8_422_NV 0x9031 +#define GL_YCBAYCR8A_4224_NV 0x9032 +#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 +#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 +#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 +#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 +#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 +#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 +#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 +#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A +#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B +#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C + +typedef void (GLAPIENTRY * PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +typedef void (GLAPIENTRY * PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint* params); +typedef GLenum (GLAPIENTRY * PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint* sequence_num, GLuint64EXT *capture_time); +typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint* params); + +#define glBeginVideoCaptureNV GLEW_GET_FUN(__glewBeginVideoCaptureNV) +#define glBindVideoCaptureStreamBufferNV GLEW_GET_FUN(__glewBindVideoCaptureStreamBufferNV) +#define glBindVideoCaptureStreamTextureNV GLEW_GET_FUN(__glewBindVideoCaptureStreamTextureNV) +#define glEndVideoCaptureNV GLEW_GET_FUN(__glewEndVideoCaptureNV) +#define glGetVideoCaptureStreamdvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamdvNV) +#define glGetVideoCaptureStreamfvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamfvNV) +#define glGetVideoCaptureStreamivNV GLEW_GET_FUN(__glewGetVideoCaptureStreamivNV) +#define glGetVideoCaptureivNV GLEW_GET_FUN(__glewGetVideoCaptureivNV) +#define glVideoCaptureNV GLEW_GET_FUN(__glewVideoCaptureNV) +#define glVideoCaptureStreamParameterdvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterdvNV) +#define glVideoCaptureStreamParameterfvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterfvNV) +#define glVideoCaptureStreamParameterivNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterivNV) + +#define GLEW_NV_video_capture GLEW_GET_VAR(__GLEW_NV_video_capture) + +#endif /* GL_NV_video_capture */ + +/* -------------------------- GL_NV_viewport_array ------------------------- */ + +#ifndef GL_NV_viewport_array +#define GL_NV_viewport_array 1 + +#define GL_DEPTH_RANGE 0x0B70 +#define GL_VIEWPORT 0x0BA2 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_MAX_VIEWPORTS_NV 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS_NV 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE_NV 0x825D +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX_NV 0x825F + +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEARRAYFVNVPROC) (GLuint first, GLsizei count, const GLfloat * v); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXEDFNVPROC) (GLuint index, GLfloat n, GLfloat f); +typedef void (GLAPIENTRY * PFNGLDISABLEINVPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEINVPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLGETFLOATI_VNVPROC) (GLenum target, GLuint index, GLfloat* data); +typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINVPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLSCISSORARRAYVNVPROC) (GLuint first, GLsizei count, const GLint * v); +typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDNVPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDVNVPROC) (GLuint index, const GLint * v); +typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYVNVPROC) (GLuint first, GLsizei count, const GLfloat * v); +typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFVNVPROC) (GLuint index, const GLfloat * v); + +#define glDepthRangeArrayfvNV GLEW_GET_FUN(__glewDepthRangeArrayfvNV) +#define glDepthRangeIndexedfNV GLEW_GET_FUN(__glewDepthRangeIndexedfNV) +#define glDisableiNV GLEW_GET_FUN(__glewDisableiNV) +#define glEnableiNV GLEW_GET_FUN(__glewEnableiNV) +#define glGetFloati_vNV GLEW_GET_FUN(__glewGetFloati_vNV) +#define glIsEnablediNV GLEW_GET_FUN(__glewIsEnablediNV) +#define glScissorArrayvNV GLEW_GET_FUN(__glewScissorArrayvNV) +#define glScissorIndexedNV GLEW_GET_FUN(__glewScissorIndexedNV) +#define glScissorIndexedvNV GLEW_GET_FUN(__glewScissorIndexedvNV) +#define glViewportArrayvNV GLEW_GET_FUN(__glewViewportArrayvNV) +#define glViewportIndexedfNV GLEW_GET_FUN(__glewViewportIndexedfNV) +#define glViewportIndexedfvNV GLEW_GET_FUN(__glewViewportIndexedfvNV) + +#define GLEW_NV_viewport_array GLEW_GET_VAR(__GLEW_NV_viewport_array) + +#endif /* GL_NV_viewport_array */ + +/* ------------------------- GL_NV_viewport_array2 ------------------------- */ + +#ifndef GL_NV_viewport_array2 +#define GL_NV_viewport_array2 1 + +#define GLEW_NV_viewport_array2 GLEW_GET_VAR(__GLEW_NV_viewport_array2) + +#endif /* GL_NV_viewport_array2 */ + +/* ------------------------- GL_NV_viewport_swizzle ------------------------ */ + +#ifndef GL_NV_viewport_swizzle +#define GL_NV_viewport_swizzle 1 + +#define GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV 0x9350 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV 0x9351 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV 0x9352 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV 0x9353 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV 0x9354 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV 0x9355 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV 0x9356 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV 0x9357 +#define GL_VIEWPORT_SWIZZLE_X_NV 0x9358 +#define GL_VIEWPORT_SWIZZLE_Y_NV 0x9359 +#define GL_VIEWPORT_SWIZZLE_Z_NV 0x935A +#define GL_VIEWPORT_SWIZZLE_W_NV 0x935B + +typedef void (GLAPIENTRY * PFNGLVIEWPORTSWIZZLENVPROC) (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); + +#define glViewportSwizzleNV GLEW_GET_FUN(__glewViewportSwizzleNV) + +#define GLEW_NV_viewport_swizzle GLEW_GET_VAR(__GLEW_NV_viewport_swizzle) + +#endif /* GL_NV_viewport_swizzle */ + +/* ------------------------ GL_OES_byte_coordinates ------------------------ */ + +#ifndef GL_OES_byte_coordinates +#define GL_OES_byte_coordinates 1 + +#define GLEW_OES_byte_coordinates GLEW_GET_VAR(__GLEW_OES_byte_coordinates) + +#endif /* GL_OES_byte_coordinates */ + +/* ---------------------------- GL_OML_interlace --------------------------- */ + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 + +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 + +#define GLEW_OML_interlace GLEW_GET_VAR(__GLEW_OML_interlace) + +#endif /* GL_OML_interlace */ + +/* ---------------------------- GL_OML_resample ---------------------------- */ + +#ifndef GL_OML_resample +#define GL_OML_resample 1 + +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 + +#define GLEW_OML_resample GLEW_GET_VAR(__GLEW_OML_resample) + +#endif /* GL_OML_resample */ + +/* ---------------------------- GL_OML_subsample --------------------------- */ + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 + +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 + +#define GLEW_OML_subsample GLEW_GET_VAR(__GLEW_OML_subsample) + +#endif /* GL_OML_subsample */ + +/* ---------------------------- GL_OVR_multiview --------------------------- */ + +#ifndef GL_OVR_multiview +#define GL_OVR_multiview 1 + +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630 +#define GL_MAX_VIEWS_OVR 0x9631 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632 +#define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); + +#define glFramebufferTextureMultiviewOVR GLEW_GET_FUN(__glewFramebufferTextureMultiviewOVR) + +#define GLEW_OVR_multiview GLEW_GET_VAR(__GLEW_OVR_multiview) + +#endif /* GL_OVR_multiview */ + +/* --------------------------- GL_OVR_multiview2 --------------------------- */ + +#ifndef GL_OVR_multiview2 +#define GL_OVR_multiview2 1 + +#define GLEW_OVR_multiview2 GLEW_GET_VAR(__GLEW_OVR_multiview2) + +#endif /* GL_OVR_multiview2 */ + +/* ------------ GL_OVR_multiview_multisampled_render_to_texture ------------ */ + +#ifndef GL_OVR_multiview_multisampled_render_to_texture +#define GL_OVR_multiview_multisampled_render_to_texture 1 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews); + +#define glFramebufferTextureMultisampleMultiviewOVR GLEW_GET_FUN(__glewFramebufferTextureMultisampleMultiviewOVR) + +#define GLEW_OVR_multiview_multisampled_render_to_texture GLEW_GET_VAR(__GLEW_OVR_multiview_multisampled_render_to_texture) + +#endif /* GL_OVR_multiview_multisampled_render_to_texture */ + +/* --------------------------- GL_PGI_misc_hints --------------------------- */ + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 + +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 107000 +#define GL_CONSERVE_MEMORY_HINT_PGI 107005 +#define GL_RECLAIM_MEMORY_HINT_PGI 107006 +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 107010 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 107011 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 107012 +#define GL_ALWAYS_FAST_HINT_PGI 107020 +#define GL_ALWAYS_SOFT_HINT_PGI 107021 +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 107022 +#define GL_ALLOW_DRAW_WIN_HINT_PGI 107023 +#define GL_ALLOW_DRAW_FRG_HINT_PGI 107024 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 107025 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 107030 +#define GL_STRICT_LIGHTING_HINT_PGI 107031 +#define GL_STRICT_SCISSOR_HINT_PGI 107032 +#define GL_FULL_STIPPLE_HINT_PGI 107033 +#define GL_CLIP_NEAR_HINT_PGI 107040 +#define GL_CLIP_FAR_HINT_PGI 107041 +#define GL_WIDE_LINE_HINT_PGI 107042 +#define GL_BACK_NORMALS_HINT_PGI 107043 + +#define GLEW_PGI_misc_hints GLEW_GET_VAR(__GLEW_PGI_misc_hints) + +#endif /* GL_PGI_misc_hints */ + +/* -------------------------- GL_PGI_vertex_hints -------------------------- */ + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 + +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_VERTEX_DATA_HINT_PGI 107050 +#define GL_VERTEX_CONSISTENT_HINT_PGI 107051 +#define GL_MATERIAL_SIDE_HINT_PGI 107052 +#define GL_MAX_VERTEX_HINT_PGI 107053 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 + +#define GLEW_PGI_vertex_hints GLEW_GET_VAR(__GLEW_PGI_vertex_hints) + +#endif /* GL_PGI_vertex_hints */ + +/* --------------------------- GL_QCOM_alpha_test -------------------------- */ + +#ifndef GL_QCOM_alpha_test +#define GL_QCOM_alpha_test 1 + +#define GL_ALPHA_TEST_QCOM 0x0BC0 +#define GL_ALPHA_TEST_FUNC_QCOM 0x0BC1 +#define GL_ALPHA_TEST_REF_QCOM 0x0BC2 + +typedef void (GLAPIENTRY * PFNGLALPHAFUNCQCOMPROC) (GLenum func, GLclampf ref); + +#define glAlphaFuncQCOM GLEW_GET_FUN(__glewAlphaFuncQCOM) + +#define GLEW_QCOM_alpha_test GLEW_GET_VAR(__GLEW_QCOM_alpha_test) + +#endif /* GL_QCOM_alpha_test */ + +/* ------------------------ GL_QCOM_binning_control ------------------------ */ + +#ifndef GL_QCOM_binning_control +#define GL_QCOM_binning_control 1 + +#define GL_DONT_CARE 0x1100 +#define GL_BINNING_CONTROL_HINT_QCOM 0x8FB0 +#define GL_CPU_OPTIMIZED_QCOM 0x8FB1 +#define GL_GPU_OPTIMIZED_QCOM 0x8FB2 +#define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM 0x8FB3 + +#define GLEW_QCOM_binning_control GLEW_GET_VAR(__GLEW_QCOM_binning_control) + +#endif /* GL_QCOM_binning_control */ + +/* ------------------------- GL_QCOM_driver_control ------------------------ */ + +#ifndef GL_QCOM_driver_control +#define GL_QCOM_driver_control 1 + +typedef void (GLAPIENTRY * PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); +typedef void (GLAPIENTRY * PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); +typedef void (GLAPIENTRY * PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei* length, GLchar *driverControlString); +typedef void (GLAPIENTRY * PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint* num, GLsizei size, GLuint *driverControls); + +#define glDisableDriverControlQCOM GLEW_GET_FUN(__glewDisableDriverControlQCOM) +#define glEnableDriverControlQCOM GLEW_GET_FUN(__glewEnableDriverControlQCOM) +#define glGetDriverControlStringQCOM GLEW_GET_FUN(__glewGetDriverControlStringQCOM) +#define glGetDriverControlsQCOM GLEW_GET_FUN(__glewGetDriverControlsQCOM) + +#define GLEW_QCOM_driver_control GLEW_GET_VAR(__GLEW_QCOM_driver_control) + +#endif /* GL_QCOM_driver_control */ + +/* -------------------------- GL_QCOM_extended_get ------------------------- */ + +#ifndef GL_QCOM_extended_get +#define GL_QCOM_extended_get 1 + +#define GL_TEXTURE_WIDTH_QCOM 0x8BD2 +#define GL_TEXTURE_HEIGHT_QCOM 0x8BD3 +#define GL_TEXTURE_DEPTH_QCOM 0x8BD4 +#define GL_TEXTURE_INTERNAL_FORMAT_QCOM 0x8BD5 +#define GL_TEXTURE_FORMAT_QCOM 0x8BD6 +#define GL_TEXTURE_TYPE_QCOM 0x8BD7 +#define GL_TEXTURE_IMAGE_VALID_QCOM 0x8BD8 +#define GL_TEXTURE_NUM_LEVELS_QCOM 0x8BD9 +#define GL_TEXTURE_TARGET_QCOM 0x8BDA +#define GL_TEXTURE_OBJECT_VALID_QCOM 0x8BDB +#define GL_STATE_RESTORE 0x8BDC + +typedef void (GLAPIENTRY * PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, void** params); +typedef void (GLAPIENTRY * PFNGLEXTGETBUFFERSQCOMPROC) (GLuint* buffers, GLint maxBuffers, GLint* numBuffers); +typedef void (GLAPIENTRY * PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers); +typedef void (GLAPIENTRY * PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers); +typedef void (GLAPIENTRY * PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels); +typedef void (GLAPIENTRY * PFNGLEXTGETTEXTURESQCOMPROC) (GLuint* textures, GLint maxTextures, GLint* numTextures); +typedef void (GLAPIENTRY * PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param); + +#define glExtGetBufferPointervQCOM GLEW_GET_FUN(__glewExtGetBufferPointervQCOM) +#define glExtGetBuffersQCOM GLEW_GET_FUN(__glewExtGetBuffersQCOM) +#define glExtGetFramebuffersQCOM GLEW_GET_FUN(__glewExtGetFramebuffersQCOM) +#define glExtGetRenderbuffersQCOM GLEW_GET_FUN(__glewExtGetRenderbuffersQCOM) +#define glExtGetTexLevelParameterivQCOM GLEW_GET_FUN(__glewExtGetTexLevelParameterivQCOM) +#define glExtGetTexSubImageQCOM GLEW_GET_FUN(__glewExtGetTexSubImageQCOM) +#define glExtGetTexturesQCOM GLEW_GET_FUN(__glewExtGetTexturesQCOM) +#define glExtTexObjectStateOverrideiQCOM GLEW_GET_FUN(__glewExtTexObjectStateOverrideiQCOM) + +#define GLEW_QCOM_extended_get GLEW_GET_VAR(__GLEW_QCOM_extended_get) + +#endif /* GL_QCOM_extended_get */ + +/* ------------------------- GL_QCOM_extended_get2 ------------------------- */ + +#ifndef GL_QCOM_extended_get2 +#define GL_QCOM_extended_get2 1 + +typedef void (GLAPIENTRY * PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar* source, GLint* length); +typedef void (GLAPIENTRY * PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint* programs, GLint maxPrograms, GLint* numPrograms); +typedef void (GLAPIENTRY * PFNGLEXTGETSHADERSQCOMPROC) (GLuint* shaders, GLint maxShaders, GLint* numShaders); +typedef GLboolean (GLAPIENTRY * PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program); + +#define glExtGetProgramBinarySourceQCOM GLEW_GET_FUN(__glewExtGetProgramBinarySourceQCOM) +#define glExtGetProgramsQCOM GLEW_GET_FUN(__glewExtGetProgramsQCOM) +#define glExtGetShadersQCOM GLEW_GET_FUN(__glewExtGetShadersQCOM) +#define glExtIsProgramBinaryQCOM GLEW_GET_FUN(__glewExtIsProgramBinaryQCOM) + +#define GLEW_QCOM_extended_get2 GLEW_GET_VAR(__GLEW_QCOM_extended_get2) + +#endif /* GL_QCOM_extended_get2 */ + +/* ---------------------- GL_QCOM_framebuffer_foveated --------------------- */ + +#ifndef GL_QCOM_framebuffer_foveated +#define GL_QCOM_framebuffer_foveated 1 + +#define GL_FOVEATION_ENABLE_BIT_QCOM 0x1 +#define GL_FOVEATION_SCALED_BIN_METHOD_BIT_QCOM 0x2 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC) (GLuint fbo, GLuint numLayers, GLuint focalPointsPerLayer, GLuint requestedFeatures, GLuint* providedFeatures); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC) (GLuint fbo, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); + +#define glFramebufferFoveationConfigQCOM GLEW_GET_FUN(__glewFramebufferFoveationConfigQCOM) +#define glFramebufferFoveationParametersQCOM GLEW_GET_FUN(__glewFramebufferFoveationParametersQCOM) + +#define GLEW_QCOM_framebuffer_foveated GLEW_GET_VAR(__GLEW_QCOM_framebuffer_foveated) + +#endif /* GL_QCOM_framebuffer_foveated */ + +/* ---------------------- GL_QCOM_perfmon_global_mode ---------------------- */ + +#ifndef GL_QCOM_perfmon_global_mode +#define GL_QCOM_perfmon_global_mode 1 + +#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 + +#define GLEW_QCOM_perfmon_global_mode GLEW_GET_VAR(__GLEW_QCOM_perfmon_global_mode) + +#endif /* GL_QCOM_perfmon_global_mode */ + +/* -------------- GL_QCOM_shader_framebuffer_fetch_noncoherent ------------- */ + +#ifndef GL_QCOM_shader_framebuffer_fetch_noncoherent +#define GL_QCOM_shader_framebuffer_fetch_noncoherent 1 + +#define GL_FRAMEBUFFER_FETCH_NONCOHERENT_QCOM 0x96A2 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC) (void); + +#define glFramebufferFetchBarrierQCOM GLEW_GET_FUN(__glewFramebufferFetchBarrierQCOM) + +#define GLEW_QCOM_shader_framebuffer_fetch_noncoherent GLEW_GET_VAR(__GLEW_QCOM_shader_framebuffer_fetch_noncoherent) + +#endif /* GL_QCOM_shader_framebuffer_fetch_noncoherent */ + +/* ------------------------ GL_QCOM_tiled_rendering ------------------------ */ + +#ifndef GL_QCOM_tiled_rendering +#define GL_QCOM_tiled_rendering 1 + +#define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001 +#define GL_COLOR_BUFFER_BIT1_QCOM 0x00000002 +#define GL_COLOR_BUFFER_BIT2_QCOM 0x00000004 +#define GL_COLOR_BUFFER_BIT3_QCOM 0x00000008 +#define GL_COLOR_BUFFER_BIT4_QCOM 0x00000010 +#define GL_COLOR_BUFFER_BIT5_QCOM 0x00000020 +#define GL_COLOR_BUFFER_BIT6_QCOM 0x00000040 +#define GL_COLOR_BUFFER_BIT7_QCOM 0x00000080 +#define GL_DEPTH_BUFFER_BIT0_QCOM 0x00000100 +#define GL_DEPTH_BUFFER_BIT1_QCOM 0x00000200 +#define GL_DEPTH_BUFFER_BIT2_QCOM 0x00000400 +#define GL_DEPTH_BUFFER_BIT3_QCOM 0x00000800 +#define GL_DEPTH_BUFFER_BIT4_QCOM 0x00001000 +#define GL_DEPTH_BUFFER_BIT5_QCOM 0x00002000 +#define GL_DEPTH_BUFFER_BIT6_QCOM 0x00004000 +#define GL_DEPTH_BUFFER_BIT7_QCOM 0x00008000 +#define GL_STENCIL_BUFFER_BIT0_QCOM 0x00010000 +#define GL_STENCIL_BUFFER_BIT1_QCOM 0x00020000 +#define GL_STENCIL_BUFFER_BIT2_QCOM 0x00040000 +#define GL_STENCIL_BUFFER_BIT3_QCOM 0x00080000 +#define GL_STENCIL_BUFFER_BIT4_QCOM 0x00100000 +#define GL_STENCIL_BUFFER_BIT5_QCOM 0x00200000 +#define GL_STENCIL_BUFFER_BIT6_QCOM 0x00400000 +#define GL_STENCIL_BUFFER_BIT7_QCOM 0x00800000 +#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM 0x01000000 +#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM 0x02000000 +#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM 0x04000000 +#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM 0x08000000 +#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM 0x10000000 +#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM 0x20000000 +#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM 0x40000000 +#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM 0x80000000 + +typedef void (GLAPIENTRY * PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask); +typedef void (GLAPIENTRY * PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); + +#define glEndTilingQCOM GLEW_GET_FUN(__glewEndTilingQCOM) +#define glStartTilingQCOM GLEW_GET_FUN(__glewStartTilingQCOM) + +#define GLEW_QCOM_tiled_rendering GLEW_GET_VAR(__GLEW_QCOM_tiled_rendering) + +#endif /* GL_QCOM_tiled_rendering */ + +/* ---------------------- GL_QCOM_writeonly_rendering ---------------------- */ + +#ifndef GL_QCOM_writeonly_rendering +#define GL_QCOM_writeonly_rendering 1 + +#define GL_WRITEONLY_RENDERING_QCOM 0x8823 + +#define GLEW_QCOM_writeonly_rendering GLEW_GET_VAR(__GLEW_QCOM_writeonly_rendering) + +#endif /* GL_QCOM_writeonly_rendering */ + +/* ---------------------- GL_REGAL_ES1_0_compatibility --------------------- */ + +#ifndef GL_REGAL_ES1_0_compatibility +#define GL_REGAL_ES1_0_compatibility 1 + +typedef int GLclampx; + +typedef void (GLAPIENTRY * PFNGLALPHAFUNCXPROC) (GLenum func, GLclampx ref); +typedef void (GLAPIENTRY * PFNGLCLEARCOLORXPROC) (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha); +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHXPROC) (GLclampx depth); +typedef void (GLAPIENTRY * PFNGLCOLOR4XPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEXPROC) (GLclampx zNear, GLclampx zFar); +typedef void (GLAPIENTRY * PFNGLFOGXPROC) (GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLFOGXVPROC) (GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLFRUSTUMFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +typedef void (GLAPIENTRY * PFNGLFRUSTUMXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +typedef void (GLAPIENTRY * PFNGLLIGHTMODELXPROC) (GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLLIGHTMODELXVPROC) (GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLLIGHTXPROC) (GLenum light, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLLIGHTXVPROC) (GLenum light, GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLLINEWIDTHXPROC) (GLfixed width); +typedef void (GLAPIENTRY * PFNGLLOADMATRIXXPROC) (const GLfixed* m); +typedef void (GLAPIENTRY * PFNGLMATERIALXPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLMATERIALXVPROC) (GLenum face, GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLMULTMATRIXXPROC) (const GLfixed* m); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4XPROC) (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (GLAPIENTRY * PFNGLNORMAL3XPROC) (GLfixed nx, GLfixed ny, GLfixed nz); +typedef void (GLAPIENTRY * PFNGLORTHOFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +typedef void (GLAPIENTRY * PFNGLORTHOXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +typedef void (GLAPIENTRY * PFNGLPOINTSIZEXPROC) (GLfixed size); +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETXPROC) (GLfixed factor, GLfixed units); +typedef void (GLAPIENTRY * PFNGLROTATEXPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEXPROC) (GLclampx value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSCALEXPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (GLAPIENTRY * PFNGLTEXENVXPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLTEXENVXVPROC) (GLenum target, GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLTRANSLATEXPROC) (GLfixed x, GLfixed y, GLfixed z); + +#define glAlphaFuncx GLEW_GET_FUN(__glewAlphaFuncx) +#define glClearColorx GLEW_GET_FUN(__glewClearColorx) +#define glClearDepthx GLEW_GET_FUN(__glewClearDepthx) +#define glColor4x GLEW_GET_FUN(__glewColor4x) +#define glDepthRangex GLEW_GET_FUN(__glewDepthRangex) +#define glFogx GLEW_GET_FUN(__glewFogx) +#define glFogxv GLEW_GET_FUN(__glewFogxv) +#define glFrustumf GLEW_GET_FUN(__glewFrustumf) +#define glFrustumx GLEW_GET_FUN(__glewFrustumx) +#define glLightModelx GLEW_GET_FUN(__glewLightModelx) +#define glLightModelxv GLEW_GET_FUN(__glewLightModelxv) +#define glLightx GLEW_GET_FUN(__glewLightx) +#define glLightxv GLEW_GET_FUN(__glewLightxv) +#define glLineWidthx GLEW_GET_FUN(__glewLineWidthx) +#define glLoadMatrixx GLEW_GET_FUN(__glewLoadMatrixx) +#define glMaterialx GLEW_GET_FUN(__glewMaterialx) +#define glMaterialxv GLEW_GET_FUN(__glewMaterialxv) +#define glMultMatrixx GLEW_GET_FUN(__glewMultMatrixx) +#define glMultiTexCoord4x GLEW_GET_FUN(__glewMultiTexCoord4x) +#define glNormal3x GLEW_GET_FUN(__glewNormal3x) +#define glOrthof GLEW_GET_FUN(__glewOrthof) +#define glOrthox GLEW_GET_FUN(__glewOrthox) +#define glPointSizex GLEW_GET_FUN(__glewPointSizex) +#define glPolygonOffsetx GLEW_GET_FUN(__glewPolygonOffsetx) +#define glRotatex GLEW_GET_FUN(__glewRotatex) +#define glSampleCoveragex GLEW_GET_FUN(__glewSampleCoveragex) +#define glScalex GLEW_GET_FUN(__glewScalex) +#define glTexEnvx GLEW_GET_FUN(__glewTexEnvx) +#define glTexEnvxv GLEW_GET_FUN(__glewTexEnvxv) +#define glTexParameterx GLEW_GET_FUN(__glewTexParameterx) +#define glTranslatex GLEW_GET_FUN(__glewTranslatex) + +#define GLEW_REGAL_ES1_0_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_0_compatibility) + +#endif /* GL_REGAL_ES1_0_compatibility */ + +/* ---------------------- GL_REGAL_ES1_1_compatibility --------------------- */ + +#ifndef GL_REGAL_ES1_1_compatibility +#define GL_REGAL_ES1_1_compatibility 1 + +typedef void (GLAPIENTRY * PFNGLCLIPPLANEFPROC) (GLenum plane, const GLfloat* equation); +typedef void (GLAPIENTRY * PFNGLCLIPPLANEXPROC) (GLenum plane, const GLfixed* equation); +typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFPROC) (GLenum pname, GLfloat eqn[4]); +typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEXPROC) (GLenum pname, GLfixed eqn[4]); +typedef void (GLAPIENTRY * PFNGLGETFIXEDVPROC) (GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETLIGHTXVPROC) (GLenum light, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETMATERIALXVPROC) (GLenum face, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETTEXENVXVPROC) (GLenum env, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERXVPROC) (GLenum target, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXPROC) (GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXVPROC) (GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLPOINTSIZEPOINTEROESPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXVPROC) (GLenum target, GLenum pname, const GLfixed* params); + +#define glClipPlanef GLEW_GET_FUN(__glewClipPlanef) +#define glClipPlanex GLEW_GET_FUN(__glewClipPlanex) +#define glGetClipPlanef GLEW_GET_FUN(__glewGetClipPlanef) +#define glGetClipPlanex GLEW_GET_FUN(__glewGetClipPlanex) +#define glGetFixedv GLEW_GET_FUN(__glewGetFixedv) +#define glGetLightxv GLEW_GET_FUN(__glewGetLightxv) +#define glGetMaterialxv GLEW_GET_FUN(__glewGetMaterialxv) +#define glGetTexEnvxv GLEW_GET_FUN(__glewGetTexEnvxv) +#define glGetTexParameterxv GLEW_GET_FUN(__glewGetTexParameterxv) +#define glPointParameterx GLEW_GET_FUN(__glewPointParameterx) +#define glPointParameterxv GLEW_GET_FUN(__glewPointParameterxv) +#define glPointSizePointerOES GLEW_GET_FUN(__glewPointSizePointerOES) +#define glTexParameterxv GLEW_GET_FUN(__glewTexParameterxv) + +#define GLEW_REGAL_ES1_1_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_1_compatibility) + +#endif /* GL_REGAL_ES1_1_compatibility */ + +/* ---------------------------- GL_REGAL_enable ---------------------------- */ + +#ifndef GL_REGAL_enable +#define GL_REGAL_enable 1 + +#define GL_ERROR_REGAL 0x9322 +#define GL_DEBUG_REGAL 0x9323 +#define GL_LOG_REGAL 0x9324 +#define GL_EMULATION_REGAL 0x9325 +#define GL_DRIVER_REGAL 0x9326 +#define GL_MISSING_REGAL 0x9360 +#define GL_TRACE_REGAL 0x9361 +#define GL_CACHE_REGAL 0x9362 +#define GL_CODE_REGAL 0x9363 +#define GL_STATISTICS_REGAL 0x9364 + +#define GLEW_REGAL_enable GLEW_GET_VAR(__GLEW_REGAL_enable) + +#endif /* GL_REGAL_enable */ + +/* ------------------------- GL_REGAL_error_string ------------------------- */ + +#ifndef GL_REGAL_error_string +#define GL_REGAL_error_string 1 + +typedef const GLchar* (GLAPIENTRY * PFNGLERRORSTRINGREGALPROC) (GLenum error); + +#define glErrorStringREGAL GLEW_GET_FUN(__glewErrorStringREGAL) + +#define GLEW_REGAL_error_string GLEW_GET_VAR(__GLEW_REGAL_error_string) + +#endif /* GL_REGAL_error_string */ + +/* ------------------------ GL_REGAL_extension_query ----------------------- */ + +#ifndef GL_REGAL_extension_query +#define GL_REGAL_extension_query 1 + +typedef GLboolean (GLAPIENTRY * PFNGLGETEXTENSIONREGALPROC) (const GLchar* ext); +typedef GLboolean (GLAPIENTRY * PFNGLISSUPPORTEDREGALPROC) (const GLchar* ext); + +#define glGetExtensionREGAL GLEW_GET_FUN(__glewGetExtensionREGAL) +#define glIsSupportedREGAL GLEW_GET_FUN(__glewIsSupportedREGAL) + +#define GLEW_REGAL_extension_query GLEW_GET_VAR(__GLEW_REGAL_extension_query) + +#endif /* GL_REGAL_extension_query */ + +/* ------------------------------ GL_REGAL_log ----------------------------- */ + +#ifndef GL_REGAL_log +#define GL_REGAL_log 1 + +#define GL_LOG_ERROR_REGAL 0x9319 +#define GL_LOG_WARNING_REGAL 0x931A +#define GL_LOG_INFO_REGAL 0x931B +#define GL_LOG_APP_REGAL 0x931C +#define GL_LOG_DRIVER_REGAL 0x931D +#define GL_LOG_INTERNAL_REGAL 0x931E +#define GL_LOG_DEBUG_REGAL 0x931F +#define GL_LOG_STATUS_REGAL 0x9320 +#define GL_LOG_HTTP_REGAL 0x9321 + +typedef void (APIENTRY *GLLOGPROCREGAL)(GLenum stream, GLsizei length, const GLchar *message, void *context); + +typedef void (GLAPIENTRY * PFNGLLOGMESSAGECALLBACKREGALPROC) (GLLOGPROCREGAL callback); + +#define glLogMessageCallbackREGAL GLEW_GET_FUN(__glewLogMessageCallbackREGAL) + +#define GLEW_REGAL_log GLEW_GET_VAR(__GLEW_REGAL_log) + +#endif /* GL_REGAL_log */ + +/* ------------------------- GL_REGAL_proc_address ------------------------- */ + +#ifndef GL_REGAL_proc_address +#define GL_REGAL_proc_address 1 + +typedef void * (GLAPIENTRY * PFNGLGETPROCADDRESSREGALPROC) (const GLchar *name); + +#define glGetProcAddressREGAL GLEW_GET_FUN(__glewGetProcAddressREGAL) + +#define GLEW_REGAL_proc_address GLEW_GET_VAR(__GLEW_REGAL_proc_address) + +#endif /* GL_REGAL_proc_address */ + +/* ----------------------- GL_REND_screen_coordinates ---------------------- */ + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 + +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 + +#define GLEW_REND_screen_coordinates GLEW_GET_VAR(__GLEW_REND_screen_coordinates) + +#endif /* GL_REND_screen_coordinates */ + +/* ------------------------------- GL_S3_s3tc ------------------------------ */ + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 + +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#define GL_RGBA_DXT5_S3TC 0x83A4 +#define GL_RGBA4_DXT5_S3TC 0x83A5 + +#define GLEW_S3_s3tc GLEW_GET_VAR(__GLEW_S3_s3tc) + +#endif /* GL_S3_s3tc */ + +/* ------------------------- GL_SGIS_clip_band_hint ------------------------ */ + +#ifndef GL_SGIS_clip_band_hint +#define GL_SGIS_clip_band_hint 1 + +#define GLEW_SGIS_clip_band_hint GLEW_GET_VAR(__GLEW_SGIS_clip_band_hint) + +#endif /* GL_SGIS_clip_band_hint */ + +/* -------------------------- GL_SGIS_color_range -------------------------- */ + +#ifndef GL_SGIS_color_range +#define GL_SGIS_color_range 1 + +#define GL_EXTENDED_RANGE_SGIS 0x85A5 +#define GL_MIN_RED_SGIS 0x85A6 +#define GL_MAX_RED_SGIS 0x85A7 +#define GL_MIN_GREEN_SGIS 0x85A8 +#define GL_MAX_GREEN_SGIS 0x85A9 +#define GL_MIN_BLUE_SGIS 0x85AA +#define GL_MAX_BLUE_SGIS 0x85AB +#define GL_MIN_ALPHA_SGIS 0x85AC +#define GL_MAX_ALPHA_SGIS 0x85AD + +#define GLEW_SGIS_color_range GLEW_GET_VAR(__GLEW_SGIS_color_range) + +#endif /* GL_SGIS_color_range */ + +/* ------------------------- GL_SGIS_detail_texture ------------------------ */ + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 + +typedef void (GLAPIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat* points); + +#define glDetailTexFuncSGIS GLEW_GET_FUN(__glewDetailTexFuncSGIS) +#define glGetDetailTexFuncSGIS GLEW_GET_FUN(__glewGetDetailTexFuncSGIS) + +#define GLEW_SGIS_detail_texture GLEW_GET_VAR(__GLEW_SGIS_detail_texture) + +#endif /* GL_SGIS_detail_texture */ + +/* -------------------------- GL_SGIS_fog_function ------------------------- */ + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 + +typedef void (GLAPIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLGETFOGFUNCSGISPROC) (GLfloat* points); + +#define glFogFuncSGIS GLEW_GET_FUN(__glewFogFuncSGIS) +#define glGetFogFuncSGIS GLEW_GET_FUN(__glewGetFogFuncSGIS) + +#define GLEW_SGIS_fog_function GLEW_GET_VAR(__GLEW_SGIS_fog_function) + +#endif /* GL_SGIS_fog_function */ + +/* ------------------------ GL_SGIS_generate_mipmap ------------------------ */ + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 + +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 + +#define GLEW_SGIS_generate_mipmap GLEW_GET_VAR(__GLEW_SGIS_generate_mipmap) + +#endif /* GL_SGIS_generate_mipmap */ + +/* -------------------------- GL_SGIS_line_texgen -------------------------- */ + +#ifndef GL_SGIS_line_texgen +#define GL_SGIS_line_texgen 1 + +#define GLEW_SGIS_line_texgen GLEW_GET_VAR(__GLEW_SGIS_line_texgen) + +#endif /* GL_SGIS_line_texgen */ + +/* -------------------------- GL_SGIS_multisample -------------------------- */ + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 + +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC + +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); + +#define glSampleMaskSGIS GLEW_GET_FUN(__glewSampleMaskSGIS) +#define glSamplePatternSGIS GLEW_GET_FUN(__glewSamplePatternSGIS) + +#define GLEW_SGIS_multisample GLEW_GET_VAR(__GLEW_SGIS_multisample) + +#endif /* GL_SGIS_multisample */ + +/* -------------------------- GL_SGIS_multitexture ------------------------- */ + +#ifndef GL_SGIS_multitexture +#define GL_SGIS_multitexture 1 + +#define GL_SELECTED_TEXTURE_SGIS 0x83C0 +#define GL_SELECTED_TEXTURE_COORD_SET_SGIS 0x83C1 +#define GL_SELECTED_TEXTURE_TRANSFORM_SGIS 0x83C2 +#define GL_MAX_TEXTURES_SGIS 0x83C3 +#define GL_MAX_TEXTURE_COORD_SETS_SGIS 0x83C4 +#define GL_TEXTURE_COORD_SET_INTERLEAVE_FACTOR_SGIS 0x83C5 +#define GL_TEXTURE_ENV_COORD_SET_SGIS 0x83C6 +#define GL_TEXTURE0_SGIS 0x83C7 +#define GL_TEXTURE1_SGIS 0x83C8 +#define GL_TEXTURE2_SGIS 0x83C9 +#define GL_TEXTURE3_SGIS 0x83CA + +typedef void (GLAPIENTRY * PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC) (GLint factor); +typedef void (GLAPIENTRY * PFNGLSELECTTEXTURECOORDSETSGISPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLSELECTTEXTURESGISPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLSELECTTEXTURETRANSFORMSGISPROC) (GLenum target); + +#define glInterleavedTextureCoordSetsSGIS GLEW_GET_FUN(__glewInterleavedTextureCoordSetsSGIS) +#define glSelectTextureCoordSetSGIS GLEW_GET_FUN(__glewSelectTextureCoordSetSGIS) +#define glSelectTextureSGIS GLEW_GET_FUN(__glewSelectTextureSGIS) +#define glSelectTextureTransformSGIS GLEW_GET_FUN(__glewSelectTextureTransformSGIS) + +#define GLEW_SGIS_multitexture GLEW_GET_VAR(__GLEW_SGIS_multitexture) + +#endif /* GL_SGIS_multitexture */ + +/* ------------------------- GL_SGIS_pixel_texture ------------------------- */ + +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 + +#define GLEW_SGIS_pixel_texture GLEW_GET_VAR(__GLEW_SGIS_pixel_texture) + +#endif /* GL_SGIS_pixel_texture */ + +/* ----------------------- GL_SGIS_point_line_texgen ----------------------- */ + +#ifndef GL_SGIS_point_line_texgen +#define GL_SGIS_point_line_texgen 1 + +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_OBJECT_LINE_SGIS 0x81F7 + +#define GLEW_SGIS_point_line_texgen GLEW_GET_VAR(__GLEW_SGIS_point_line_texgen) + +#endif /* GL_SGIS_point_line_texgen */ + +/* ----------------------- GL_SGIS_shared_multisample ---------------------- */ + +#ifndef GL_SGIS_shared_multisample +#define GL_SGIS_shared_multisample 1 + +typedef void (GLAPIENTRY * PFNGLMULTISAMPLESUBRECTPOSSGISPROC) (GLint x, GLint y); + +#define glMultisampleSubRectPosSGIS GLEW_GET_FUN(__glewMultisampleSubRectPosSGIS) + +#define GLEW_SGIS_shared_multisample GLEW_GET_VAR(__GLEW_SGIS_shared_multisample) + +#endif /* GL_SGIS_shared_multisample */ + +/* ------------------------ GL_SGIS_sharpen_texture ------------------------ */ + +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 + +typedef void (GLAPIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat* points); +typedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); + +#define glGetSharpenTexFuncSGIS GLEW_GET_FUN(__glewGetSharpenTexFuncSGIS) +#define glSharpenTexFuncSGIS GLEW_GET_FUN(__glewSharpenTexFuncSGIS) + +#define GLEW_SGIS_sharpen_texture GLEW_GET_VAR(__GLEW_SGIS_sharpen_texture) + +#endif /* GL_SGIS_sharpen_texture */ + +/* --------------------------- GL_SGIS_texture4D --------------------------- */ + +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 + +typedef void (GLAPIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const void *pixels); + +#define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS) +#define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS) + +#define GLEW_SGIS_texture4D GLEW_GET_VAR(__GLEW_SGIS_texture4D) + +#endif /* GL_SGIS_texture4D */ + +/* ---------------------- GL_SGIS_texture_border_clamp --------------------- */ + +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 + +#define GL_CLAMP_TO_BORDER_SGIS 0x812D + +#define GLEW_SGIS_texture_border_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_border_clamp) + +#endif /* GL_SGIS_texture_border_clamp */ + +/* ----------------------- GL_SGIS_texture_edge_clamp ---------------------- */ + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 + +#define GL_CLAMP_TO_EDGE_SGIS 0x812F + +#define GLEW_SGIS_texture_edge_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_edge_clamp) + +#endif /* GL_SGIS_texture_edge_clamp */ + +/* ------------------------ GL_SGIS_texture_filter4 ------------------------ */ + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 + +typedef void (GLAPIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat* weights); +typedef void (GLAPIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat* weights); + +#define glGetTexFilterFuncSGIS GLEW_GET_FUN(__glewGetTexFilterFuncSGIS) +#define glTexFilterFuncSGIS GLEW_GET_FUN(__glewTexFilterFuncSGIS) + +#define GLEW_SGIS_texture_filter4 GLEW_GET_VAR(__GLEW_SGIS_texture_filter4) + +#endif /* GL_SGIS_texture_filter4 */ + +/* -------------------------- GL_SGIS_texture_lod -------------------------- */ + +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 + +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D + +#define GLEW_SGIS_texture_lod GLEW_GET_VAR(__GLEW_SGIS_texture_lod) + +#endif /* GL_SGIS_texture_lod */ + +/* ------------------------- GL_SGIS_texture_select ------------------------ */ + +#ifndef GL_SGIS_texture_select +#define GL_SGIS_texture_select 1 + +#define GLEW_SGIS_texture_select GLEW_GET_VAR(__GLEW_SGIS_texture_select) + +#endif /* GL_SGIS_texture_select */ + +/* ----------------------------- GL_SGIX_async ----------------------------- */ + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 + +#define GL_ASYNC_MARKER_SGIX 0x8329 + +typedef void (GLAPIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef void (GLAPIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLint (GLAPIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint* markerp); +typedef GLuint (GLAPIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef GLboolean (GLAPIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (GLAPIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint* markerp); + +#define glAsyncMarkerSGIX GLEW_GET_FUN(__glewAsyncMarkerSGIX) +#define glDeleteAsyncMarkersSGIX GLEW_GET_FUN(__glewDeleteAsyncMarkersSGIX) +#define glFinishAsyncSGIX GLEW_GET_FUN(__glewFinishAsyncSGIX) +#define glGenAsyncMarkersSGIX GLEW_GET_FUN(__glewGenAsyncMarkersSGIX) +#define glIsAsyncMarkerSGIX GLEW_GET_FUN(__glewIsAsyncMarkerSGIX) +#define glPollAsyncSGIX GLEW_GET_FUN(__glewPollAsyncSGIX) + +#define GLEW_SGIX_async GLEW_GET_VAR(__GLEW_SGIX_async) + +#endif /* GL_SGIX_async */ + +/* ------------------------ GL_SGIX_async_histogram ------------------------ */ + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 + +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D + +#define GLEW_SGIX_async_histogram GLEW_GET_VAR(__GLEW_SGIX_async_histogram) + +#endif /* GL_SGIX_async_histogram */ + +/* -------------------------- GL_SGIX_async_pixel -------------------------- */ + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 + +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 + +#define GLEW_SGIX_async_pixel GLEW_GET_VAR(__GLEW_SGIX_async_pixel) + +#endif /* GL_SGIX_async_pixel */ + +/* ----------------------- GL_SGIX_bali_g_instruments ---------------------- */ + +#ifndef GL_SGIX_bali_g_instruments +#define GL_SGIX_bali_g_instruments 1 + +#define GL_BALI_NUM_TRIS_CULLED_INSTRUMENT 0x6080 +#define GL_BALI_NUM_PRIMS_CLIPPED_INSTRUMENT 0x6081 +#define GL_BALI_NUM_PRIMS_REJECT_INSTRUMENT 0x6082 +#define GL_BALI_NUM_PRIMS_CLIP_RESULT_INSTRUMENT 0x6083 + +#define GLEW_SGIX_bali_g_instruments GLEW_GET_VAR(__GLEW_SGIX_bali_g_instruments) + +#endif /* GL_SGIX_bali_g_instruments */ + +/* ----------------------- GL_SGIX_bali_r_instruments ---------------------- */ + +#ifndef GL_SGIX_bali_r_instruments +#define GL_SGIX_bali_r_instruments 1 + +#define GL_BALI_FRAGMENTS_GENERATED_INSTRUMENT 0x6090 +#define GL_BALI_DEPTH_PASS_INSTRUMENT 0x6091 +#define GL_BALI_R_CHIP_COUNT 0x6092 + +#define GLEW_SGIX_bali_r_instruments GLEW_GET_VAR(__GLEW_SGIX_bali_r_instruments) + +#endif /* GL_SGIX_bali_r_instruments */ + +/* --------------------- GL_SGIX_bali_timer_instruments -------------------- */ + +#ifndef GL_SGIX_bali_timer_instruments +#define GL_SGIX_bali_timer_instruments 1 + +#define GLEW_SGIX_bali_timer_instruments GLEW_GET_VAR(__GLEW_SGIX_bali_timer_instruments) + +#endif /* GL_SGIX_bali_timer_instruments */ + +/* ----------------------- GL_SGIX_blend_alpha_minmax ---------------------- */ + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 + +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 + +#define GLEW_SGIX_blend_alpha_minmax GLEW_GET_VAR(__GLEW_SGIX_blend_alpha_minmax) + +#endif /* GL_SGIX_blend_alpha_minmax */ + +/* --------------------------- GL_SGIX_blend_cadd -------------------------- */ + +#ifndef GL_SGIX_blend_cadd +#define GL_SGIX_blend_cadd 1 + +#define GL_FUNC_COMPLEX_ADD_EXT 0x601C + +#define GLEW_SGIX_blend_cadd GLEW_GET_VAR(__GLEW_SGIX_blend_cadd) + +#endif /* GL_SGIX_blend_cadd */ + +/* ------------------------ GL_SGIX_blend_cmultiply ------------------------ */ + +#ifndef GL_SGIX_blend_cmultiply +#define GL_SGIX_blend_cmultiply 1 + +#define GL_FUNC_COMPLEX_MULTIPLY_EXT 0x601B + +#define GLEW_SGIX_blend_cmultiply GLEW_GET_VAR(__GLEW_SGIX_blend_cmultiply) + +#endif /* GL_SGIX_blend_cmultiply */ + +/* --------------------- GL_SGIX_calligraphic_fragment --------------------- */ + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_SGIX_calligraphic_fragment 1 + +#define GLEW_SGIX_calligraphic_fragment GLEW_GET_VAR(__GLEW_SGIX_calligraphic_fragment) + +#endif /* GL_SGIX_calligraphic_fragment */ + +/* ---------------------------- GL_SGIX_clipmap ---------------------------- */ + +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 + +#define GLEW_SGIX_clipmap GLEW_GET_VAR(__GLEW_SGIX_clipmap) + +#endif /* GL_SGIX_clipmap */ + +/* --------------------- GL_SGIX_color_matrix_accuracy --------------------- */ + +#ifndef GL_SGIX_color_matrix_accuracy +#define GL_SGIX_color_matrix_accuracy 1 + +#define GL_COLOR_MATRIX_HINT 0x8317 + +#define GLEW_SGIX_color_matrix_accuracy GLEW_GET_VAR(__GLEW_SGIX_color_matrix_accuracy) + +#endif /* GL_SGIX_color_matrix_accuracy */ + +/* --------------------- GL_SGIX_color_table_index_mode -------------------- */ + +#ifndef GL_SGIX_color_table_index_mode +#define GL_SGIX_color_table_index_mode 1 + +#define GLEW_SGIX_color_table_index_mode GLEW_GET_VAR(__GLEW_SGIX_color_table_index_mode) + +#endif /* GL_SGIX_color_table_index_mode */ + +/* ------------------------- GL_SGIX_complex_polar ------------------------- */ + +#ifndef GL_SGIX_complex_polar +#define GL_SGIX_complex_polar 1 + +#define GLEW_SGIX_complex_polar GLEW_GET_VAR(__GLEW_SGIX_complex_polar) + +#endif /* GL_SGIX_complex_polar */ + +/* ---------------------- GL_SGIX_convolution_accuracy --------------------- */ + +#ifndef GL_SGIX_convolution_accuracy +#define GL_SGIX_convolution_accuracy 1 + +#define GL_CONVOLUTION_HINT_SGIX 0x8316 + +#define GLEW_SGIX_convolution_accuracy GLEW_GET_VAR(__GLEW_SGIX_convolution_accuracy) + +#endif /* GL_SGIX_convolution_accuracy */ + +/* ---------------------------- GL_SGIX_cube_map --------------------------- */ + +#ifndef GL_SGIX_cube_map +#define GL_SGIX_cube_map 1 + +#define GL_ENV_MAP_SGIX 0x8340 +#define GL_CUBE_MAP_SGIX 0x8341 +#define GL_CUBE_MAP_ZP_SGIX 0x8342 +#define GL_CUBE_MAP_ZN_SGIX 0x8343 +#define GL_CUBE_MAP_XN_SGIX 0x8344 +#define GL_CUBE_MAP_XP_SGIX 0x8345 +#define GL_CUBE_MAP_YN_SGIX 0x8346 +#define GL_CUBE_MAP_YP_SGIX 0x8347 +#define GL_CUBE_MAP_BINDING_SGIX 0x8348 + +#define GLEW_SGIX_cube_map GLEW_GET_VAR(__GLEW_SGIX_cube_map) + +#endif /* GL_SGIX_cube_map */ + +/* ------------------------ GL_SGIX_cylinder_texgen ------------------------ */ + +#ifndef GL_SGIX_cylinder_texgen +#define GL_SGIX_cylinder_texgen 1 + +#define GLEW_SGIX_cylinder_texgen GLEW_GET_VAR(__GLEW_SGIX_cylinder_texgen) + +#endif /* GL_SGIX_cylinder_texgen */ + +/* ---------------------------- GL_SGIX_datapipe --------------------------- */ + +#ifndef GL_SGIX_datapipe +#define GL_SGIX_datapipe 1 + +#define GL_GEOMETRY_BIT 0x1 +#define GL_IMAGE_BIT 0x2 + +typedef void (GLAPIENTRY * PFNGLADDRESSSPACEPROC) (GLenum space, GLbitfield mask); +typedef GLint (GLAPIENTRY * PFNGLDATAPIPEPROC) (GLenum space); + +#define glAddressSpace GLEW_GET_FUN(__glewAddressSpace) +#define glDataPipe GLEW_GET_FUN(__glewDataPipe) + +#define GLEW_SGIX_datapipe GLEW_GET_VAR(__GLEW_SGIX_datapipe) + +#endif /* GL_SGIX_datapipe */ + +/* --------------------------- GL_SGIX_decimation -------------------------- */ + +#ifndef GL_SGIX_decimation +#define GL_SGIX_decimation 1 + +#define GLEW_SGIX_decimation GLEW_GET_VAR(__GLEW_SGIX_decimation) + +#endif /* GL_SGIX_decimation */ + +/* --------------------- GL_SGIX_depth_pass_instrument --------------------- */ + +#ifndef GL_SGIX_depth_pass_instrument +#define GL_SGIX_depth_pass_instrument 1 + +#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 +#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 +#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 + +#define GLEW_SGIX_depth_pass_instrument GLEW_GET_VAR(__GLEW_SGIX_depth_pass_instrument) + +#endif /* GL_SGIX_depth_pass_instrument */ + +/* ------------------------- GL_SGIX_depth_texture ------------------------- */ + +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 + +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 + +#define GLEW_SGIX_depth_texture GLEW_GET_VAR(__GLEW_SGIX_depth_texture) + +#endif /* GL_SGIX_depth_texture */ + +/* ------------------------------ GL_SGIX_dvc ------------------------------ */ + +#ifndef GL_SGIX_dvc +#define GL_SGIX_dvc 1 + +#define GLEW_SGIX_dvc GLEW_GET_VAR(__GLEW_SGIX_dvc) + +#endif /* GL_SGIX_dvc */ + +/* -------------------------- GL_SGIX_flush_raster ------------------------- */ + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 + +typedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); + +#define glFlushRasterSGIX GLEW_GET_FUN(__glewFlushRasterSGIX) + +#define GLEW_SGIX_flush_raster GLEW_GET_VAR(__GLEW_SGIX_flush_raster) + +#endif /* GL_SGIX_flush_raster */ + +/* --------------------------- GL_SGIX_fog_blend --------------------------- */ + +#ifndef GL_SGIX_fog_blend +#define GL_SGIX_fog_blend 1 + +#define GL_FOG_BLEND_ALPHA_SGIX 0x81FE +#define GL_FOG_BLEND_COLOR_SGIX 0x81FF + +#define GLEW_SGIX_fog_blend GLEW_GET_VAR(__GLEW_SGIX_fog_blend) + +#endif /* GL_SGIX_fog_blend */ + +/* ---------------------- GL_SGIX_fog_factor_to_alpha ---------------------- */ + +#ifndef GL_SGIX_fog_factor_to_alpha +#define GL_SGIX_fog_factor_to_alpha 1 + +#define GLEW_SGIX_fog_factor_to_alpha GLEW_GET_VAR(__GLEW_SGIX_fog_factor_to_alpha) + +#endif /* GL_SGIX_fog_factor_to_alpha */ + +/* --------------------------- GL_SGIX_fog_layers -------------------------- */ + +#ifndef GL_SGIX_fog_layers +#define GL_SGIX_fog_layers 1 + +#define GL_FOG_TYPE_SGIX 0x8323 +#define GL_UNIFORM_SGIX 0x8324 +#define GL_LAYERED_SGIX 0x8325 +#define GL_FOG_GROUND_PLANE_SGIX 0x8326 +#define GL_FOG_LAYERS_POINTS_SGIX 0x8327 +#define GL_MAX_FOG_LAYERS_POINTS_SGIX 0x8328 + +typedef void (GLAPIENTRY * PFNGLFOGLAYERSSGIXPROC) (GLsizei n, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLGETFOGLAYERSSGIXPROC) (GLfloat* points); + +#define glFogLayersSGIX GLEW_GET_FUN(__glewFogLayersSGIX) +#define glGetFogLayersSGIX GLEW_GET_FUN(__glewGetFogLayersSGIX) + +#define GLEW_SGIX_fog_layers GLEW_GET_VAR(__GLEW_SGIX_fog_layers) + +#endif /* GL_SGIX_fog_layers */ + +/* --------------------------- GL_SGIX_fog_offset -------------------------- */ + +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 + +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 + +#define GLEW_SGIX_fog_offset GLEW_GET_VAR(__GLEW_SGIX_fog_offset) + +#endif /* GL_SGIX_fog_offset */ + +/* --------------------------- GL_SGIX_fog_patchy -------------------------- */ + +#ifndef GL_SGIX_fog_patchy +#define GL_SGIX_fog_patchy 1 + +#define GLEW_SGIX_fog_patchy GLEW_GET_VAR(__GLEW_SGIX_fog_patchy) + +#endif /* GL_SGIX_fog_patchy */ + +/* --------------------------- GL_SGIX_fog_scale --------------------------- */ + +#ifndef GL_SGIX_fog_scale +#define GL_SGIX_fog_scale 1 + +#define GL_FOG_SCALE_SGIX 0x81FC +#define GL_FOG_SCALE_VALUE_SGIX 0x81FD + +#define GLEW_SGIX_fog_scale GLEW_GET_VAR(__GLEW_SGIX_fog_scale) + +#endif /* GL_SGIX_fog_scale */ + +/* -------------------------- GL_SGIX_fog_texture -------------------------- */ + +#ifndef GL_SGIX_fog_texture +#define GL_SGIX_fog_texture 1 + +typedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname); + +#define glTextureFogSGIX GLEW_GET_FUN(__glewTextureFogSGIX) + +#define GLEW_SGIX_fog_texture GLEW_GET_VAR(__GLEW_SGIX_fog_texture) + +#endif /* GL_SGIX_fog_texture */ + +/* -------------------- GL_SGIX_fragment_lighting_space -------------------- */ + +#ifndef GL_SGIX_fragment_lighting_space +#define GL_SGIX_fragment_lighting_space 1 + +#define GL_EYE_SPACE_SGIX 0x8436 +#define GL_TANGENT_SPACE_SGIX 0x8437 +#define GL_OBJECT_SPACE_SGIX 0x8438 +#define GL_FRAGMENT_LIGHT_SPACE_SGIX 0x843D + +#define GLEW_SGIX_fragment_lighting_space GLEW_GET_VAR(__GLEW_SGIX_fragment_lighting_space) + +#endif /* GL_SGIX_fragment_lighting_space */ + +/* ------------------- GL_SGIX_fragment_specular_lighting ------------------ */ + +#ifndef GL_SGIX_fragment_specular_lighting +#define GL_SGIX_fragment_specular_lighting 1 + +typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum value, GLfloat* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum value, GLint* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* data); + +#define glFragmentColorMaterialSGIX GLEW_GET_FUN(__glewFragmentColorMaterialSGIX) +#define glFragmentLightModelfSGIX GLEW_GET_FUN(__glewFragmentLightModelfSGIX) +#define glFragmentLightModelfvSGIX GLEW_GET_FUN(__glewFragmentLightModelfvSGIX) +#define glFragmentLightModeliSGIX GLEW_GET_FUN(__glewFragmentLightModeliSGIX) +#define glFragmentLightModelivSGIX GLEW_GET_FUN(__glewFragmentLightModelivSGIX) +#define glFragmentLightfSGIX GLEW_GET_FUN(__glewFragmentLightfSGIX) +#define glFragmentLightfvSGIX GLEW_GET_FUN(__glewFragmentLightfvSGIX) +#define glFragmentLightiSGIX GLEW_GET_FUN(__glewFragmentLightiSGIX) +#define glFragmentLightivSGIX GLEW_GET_FUN(__glewFragmentLightivSGIX) +#define glFragmentMaterialfSGIX GLEW_GET_FUN(__glewFragmentMaterialfSGIX) +#define glFragmentMaterialfvSGIX GLEW_GET_FUN(__glewFragmentMaterialfvSGIX) +#define glFragmentMaterialiSGIX GLEW_GET_FUN(__glewFragmentMaterialiSGIX) +#define glFragmentMaterialivSGIX GLEW_GET_FUN(__glewFragmentMaterialivSGIX) +#define glGetFragmentLightfvSGIX GLEW_GET_FUN(__glewGetFragmentLightfvSGIX) +#define glGetFragmentLightivSGIX GLEW_GET_FUN(__glewGetFragmentLightivSGIX) +#define glGetFragmentMaterialfvSGIX GLEW_GET_FUN(__glewGetFragmentMaterialfvSGIX) +#define glGetFragmentMaterialivSGIX GLEW_GET_FUN(__glewGetFragmentMaterialivSGIX) + +#define GLEW_SGIX_fragment_specular_lighting GLEW_GET_VAR(__GLEW_SGIX_fragment_specular_lighting) + +#endif /* GL_SGIX_fragment_specular_lighting */ + +/* ---------------------- GL_SGIX_fragments_instrument --------------------- */ + +#ifndef GL_SGIX_fragments_instrument +#define GL_SGIX_fragments_instrument 1 + +#define GL_FRAGMENTS_INSTRUMENT_SGIX 0x8313 +#define GL_FRAGMENTS_INSTRUMENT_COUNTERS_SGIX 0x8314 +#define GL_FRAGMENTS_INSTRUMENT_MAX_SGIX 0x8315 + +#define GLEW_SGIX_fragments_instrument GLEW_GET_VAR(__GLEW_SGIX_fragments_instrument) + +#endif /* GL_SGIX_fragments_instrument */ + +/* --------------------------- GL_SGIX_framezoom --------------------------- */ + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 + +typedef void (GLAPIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor); + +#define glFrameZoomSGIX GLEW_GET_FUN(__glewFrameZoomSGIX) + +#define GLEW_SGIX_framezoom GLEW_GET_VAR(__GLEW_SGIX_framezoom) + +#endif /* GL_SGIX_framezoom */ + +/* -------------------------- GL_SGIX_icc_texture -------------------------- */ + +#ifndef GL_SGIX_icc_texture +#define GL_SGIX_icc_texture 1 + +#define GL_RGB_ICC_SGIX 0x8460 +#define GL_RGBA_ICC_SGIX 0x8461 +#define GL_ALPHA_ICC_SGIX 0x8462 +#define GL_LUMINANCE_ICC_SGIX 0x8463 +#define GL_INTENSITY_ICC_SGIX 0x8464 +#define GL_LUMINANCE_ALPHA_ICC_SGIX 0x8465 +#define GL_R5_G6_B5_ICC_SGIX 0x8466 +#define GL_R5_G6_B5_A8_ICC_SGIX 0x8467 +#define GL_ALPHA16_ICC_SGIX 0x8468 +#define GL_LUMINANCE16_ICC_SGIX 0x8469 +#define GL_INTENSITY16_ICC_SGIX 0x846A +#define GL_LUMINANCE16_ALPHA8_ICC_SGIX 0x846B + +#define GLEW_SGIX_icc_texture GLEW_GET_VAR(__GLEW_SGIX_icc_texture) + +#endif /* GL_SGIX_icc_texture */ + +/* ------------------------ GL_SGIX_igloo_interface ------------------------ */ + +#ifndef GL_SGIX_igloo_interface +#define GL_SGIX_igloo_interface 1 + +#define GL_IGLOO_FULLSCREEN_SGIX 0x819E +#define GL_IGLOO_VIEWPORT_OFFSET_SGIX 0x819F +#define GL_IGLOO_SWAPTMESH_SGIX 0x81A0 +#define GL_IGLOO_COLORNORMAL_SGIX 0x81A1 +#define GL_IGLOO_IRISGL_MODE_SGIX 0x81A2 +#define GL_IGLOO_LMC_COLOR_SGIX 0x81A3 +#define GL_IGLOO_TMESHMODE_SGIX 0x81A4 +#define GL_LIGHT31 0xBEAD + +typedef void (GLAPIENTRY * PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, void *param); + +#define glIglooInterfaceSGIX GLEW_GET_FUN(__glewIglooInterfaceSGIX) + +#define GLEW_SGIX_igloo_interface GLEW_GET_VAR(__GLEW_SGIX_igloo_interface) + +#endif /* GL_SGIX_igloo_interface */ + +/* ----------------------- GL_SGIX_image_compression ----------------------- */ + +#ifndef GL_SGIX_image_compression +#define GL_SGIX_image_compression 1 + +#define GLEW_SGIX_image_compression GLEW_GET_VAR(__GLEW_SGIX_image_compression) + +#endif /* GL_SGIX_image_compression */ + +/* ---------------------- GL_SGIX_impact_pixel_texture --------------------- */ + +#ifndef GL_SGIX_impact_pixel_texture +#define GL_SGIX_impact_pixel_texture 1 + +#define GLEW_SGIX_impact_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_impact_pixel_texture) + +#endif /* GL_SGIX_impact_pixel_texture */ + +/* ------------------------ GL_SGIX_instrument_error ----------------------- */ + +#ifndef GL_SGIX_instrument_error +#define GL_SGIX_instrument_error 1 + +#define GLEW_SGIX_instrument_error GLEW_GET_VAR(__GLEW_SGIX_instrument_error) + +#endif /* GL_SGIX_instrument_error */ + +/* --------------------------- GL_SGIX_interlace --------------------------- */ + +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 + +#define GL_INTERLACE_SGIX 0x8094 + +#define GLEW_SGIX_interlace GLEW_GET_VAR(__GLEW_SGIX_interlace) + +#endif /* GL_SGIX_interlace */ + +/* ------------------------- GL_SGIX_ir_instrument1 ------------------------ */ + +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 + +#define GLEW_SGIX_ir_instrument1 GLEW_GET_VAR(__GLEW_SGIX_ir_instrument1) + +#endif /* GL_SGIX_ir_instrument1 */ + +/* ----------------------- GL_SGIX_line_quality_hint ----------------------- */ + +#ifndef GL_SGIX_line_quality_hint +#define GL_SGIX_line_quality_hint 1 + +#define GL_LINE_QUALITY_HINT_SGIX 0x835B + +#define GLEW_SGIX_line_quality_hint GLEW_GET_VAR(__GLEW_SGIX_line_quality_hint) + +#endif /* GL_SGIX_line_quality_hint */ + +/* ------------------------- GL_SGIX_list_priority ------------------------- */ + +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 + +#define GLEW_SGIX_list_priority GLEW_GET_VAR(__GLEW_SGIX_list_priority) + +#endif /* GL_SGIX_list_priority */ + +/* ----------------------------- GL_SGIX_mpeg1 ----------------------------- */ + +#ifndef GL_SGIX_mpeg1 +#define GL_SGIX_mpeg1 1 + +typedef void (GLAPIENTRY * PFNGLALLOCMPEGPREDICTORSSGIXPROC) (GLsizei width, GLsizei height, GLsizei n, GLuint* predictors); +typedef void (GLAPIENTRY * PFNGLDELETEMPEGPREDICTORSSGIXPROC) (GLsizei n, GLuint* predictors); +typedef void (GLAPIENTRY * PFNGLGENMPEGPREDICTORSSGIXPROC) (GLsizei n, GLuint* predictors); +typedef void (GLAPIENTRY * PFNGLGETMPEGPARAMETERFVSGIXPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMPEGPARAMETERIVSGIXPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMPEGPREDICTORSGIXPROC) (GLenum target, GLenum format, GLenum type, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETMPEGQUANTTABLEUBVPROC) (GLenum target, GLubyte* values); +typedef GLboolean (GLAPIENTRY * PFNGLISMPEGPREDICTORSGIXPROC) (GLuint predictor); +typedef void (GLAPIENTRY * PFNGLMPEGPREDICTORSGIXPROC) (GLenum target, GLenum format, GLenum type, void *pixels); +typedef void (GLAPIENTRY * PFNGLMPEGQUANTTABLEUBVPROC) (GLenum target, GLubyte* values); +typedef void (GLAPIENTRY * PFNGLSWAPMPEGPREDICTORSSGIXPROC) (GLenum target0, GLenum target1); + +#define glAllocMPEGPredictorsSGIX GLEW_GET_FUN(__glewAllocMPEGPredictorsSGIX) +#define glDeleteMPEGPredictorsSGIX GLEW_GET_FUN(__glewDeleteMPEGPredictorsSGIX) +#define glGenMPEGPredictorsSGIX GLEW_GET_FUN(__glewGenMPEGPredictorsSGIX) +#define glGetMPEGParameterfvSGIX GLEW_GET_FUN(__glewGetMPEGParameterfvSGIX) +#define glGetMPEGParameterivSGIX GLEW_GET_FUN(__glewGetMPEGParameterivSGIX) +#define glGetMPEGPredictorSGIX GLEW_GET_FUN(__glewGetMPEGPredictorSGIX) +#define glGetMPEGQuantTableubv GLEW_GET_FUN(__glewGetMPEGQuantTableubv) +#define glIsMPEGPredictorSGIX GLEW_GET_FUN(__glewIsMPEGPredictorSGIX) +#define glMPEGPredictorSGIX GLEW_GET_FUN(__glewMPEGPredictorSGIX) +#define glMPEGQuantTableubv GLEW_GET_FUN(__glewMPEGQuantTableubv) +#define glSwapMPEGPredictorsSGIX GLEW_GET_FUN(__glewSwapMPEGPredictorsSGIX) + +#define GLEW_SGIX_mpeg1 GLEW_GET_VAR(__GLEW_SGIX_mpeg1) + +#endif /* GL_SGIX_mpeg1 */ + +/* ----------------------------- GL_SGIX_mpeg2 ----------------------------- */ + +#ifndef GL_SGIX_mpeg2 +#define GL_SGIX_mpeg2 1 + +#define GLEW_SGIX_mpeg2 GLEW_GET_VAR(__GLEW_SGIX_mpeg2) + +#endif /* GL_SGIX_mpeg2 */ + +/* ------------------ GL_SGIX_nonlinear_lighting_pervertex ----------------- */ + +#ifndef GL_SGIX_nonlinear_lighting_pervertex +#define GL_SGIX_nonlinear_lighting_pervertex 1 + +typedef void (GLAPIENTRY * PFNGLGETNONLINLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLint* terms, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETNONLINMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLint* terms, const GLfloat *data); +typedef void (GLAPIENTRY * PFNGLNONLINLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLint terms, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLNONLINMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLint terms, const GLfloat* params); + +#define glGetNonlinLightfvSGIX GLEW_GET_FUN(__glewGetNonlinLightfvSGIX) +#define glGetNonlinMaterialfvSGIX GLEW_GET_FUN(__glewGetNonlinMaterialfvSGIX) +#define glNonlinLightfvSGIX GLEW_GET_FUN(__glewNonlinLightfvSGIX) +#define glNonlinMaterialfvSGIX GLEW_GET_FUN(__glewNonlinMaterialfvSGIX) + +#define GLEW_SGIX_nonlinear_lighting_pervertex GLEW_GET_VAR(__GLEW_SGIX_nonlinear_lighting_pervertex) + +#endif /* GL_SGIX_nonlinear_lighting_pervertex */ + +/* --------------------------- GL_SGIX_nurbs_eval -------------------------- */ + +#ifndef GL_SGIX_nurbs_eval +#define GL_SGIX_nurbs_eval 1 + +#define GL_MAP1_VERTEX_3_NURBS_SGIX 0x81CB +#define GL_MAP1_VERTEX_4_NURBS_SGIX 0x81CC +#define GL_MAP1_INDEX_NURBS_SGIX 0x81CD +#define GL_MAP1_COLOR_4_NURBS_SGIX 0x81CE +#define GL_MAP1_NORMAL_NURBS_SGIX 0x81CF +#define GL_MAP1_TEXTURE_COORD_1_NURBS_SGIX 0x81E0 +#define GL_MAP1_TEXTURE_COORD_2_NURBS_SGIX 0x81E1 +#define GL_MAP1_TEXTURE_COORD_3_NURBS_SGIX 0x81E2 +#define GL_MAP1_TEXTURE_COORD_4_NURBS_SGIX 0x81E3 +#define GL_MAP2_VERTEX_3_NURBS_SGIX 0x81E4 +#define GL_MAP2_VERTEX_4_NURBS_SGIX 0x81E5 +#define GL_MAP2_INDEX_NURBS_SGIX 0x81E6 +#define GL_MAP2_COLOR_4_NURBS_SGIX 0x81E7 +#define GL_MAP2_NORMAL_NURBS_SGIX 0x81E8 +#define GL_MAP2_TEXTURE_COORD_1_NURBS_SGIX 0x81E9 +#define GL_MAP2_TEXTURE_COORD_2_NURBS_SGIX 0x81EA +#define GL_MAP2_TEXTURE_COORD_3_NURBS_SGIX 0x81EB +#define GL_MAP2_TEXTURE_COORD_4_NURBS_SGIX 0x81EC +#define GL_NURBS_KNOT_COUNT_SGIX 0x81ED +#define GL_NURBS_KNOT_VECTOR_SGIX 0x81EE + +#define GLEW_SGIX_nurbs_eval GLEW_GET_VAR(__GLEW_SGIX_nurbs_eval) + +#endif /* GL_SGIX_nurbs_eval */ + +/* ---------------------- GL_SGIX_occlusion_instrument --------------------- */ + +#ifndef GL_SGIX_occlusion_instrument +#define GL_SGIX_occlusion_instrument 1 + +#define GL_OCCLUSION_INSTRUMENT_SGIX 0x6060 + +#define GLEW_SGIX_occlusion_instrument GLEW_GET_VAR(__GLEW_SGIX_occlusion_instrument) + +#endif /* GL_SGIX_occlusion_instrument */ + +/* ------------------------- GL_SGIX_packed_6bytes ------------------------- */ + +#ifndef GL_SGIX_packed_6bytes +#define GL_SGIX_packed_6bytes 1 + +#define GLEW_SGIX_packed_6bytes GLEW_GET_VAR(__GLEW_SGIX_packed_6bytes) + +#endif /* GL_SGIX_packed_6bytes */ + +/* ------------------------- GL_SGIX_pixel_texture ------------------------- */ + +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 + +typedef void (GLAPIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); + +#define glPixelTexGenSGIX GLEW_GET_FUN(__glewPixelTexGenSGIX) + +#define GLEW_SGIX_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_pixel_texture) + +#endif /* GL_SGIX_pixel_texture */ + +/* ----------------------- GL_SGIX_pixel_texture_bits ---------------------- */ + +#ifndef GL_SGIX_pixel_texture_bits +#define GL_SGIX_pixel_texture_bits 1 + +#define GLEW_SGIX_pixel_texture_bits GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_bits) + +#endif /* GL_SGIX_pixel_texture_bits */ + +/* ----------------------- GL_SGIX_pixel_texture_lod ----------------------- */ + +#ifndef GL_SGIX_pixel_texture_lod +#define GL_SGIX_pixel_texture_lod 1 + +#define GLEW_SGIX_pixel_texture_lod GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_lod) + +#endif /* GL_SGIX_pixel_texture_lod */ + +/* -------------------------- GL_SGIX_pixel_tiles -------------------------- */ + +#ifndef GL_SGIX_pixel_tiles +#define GL_SGIX_pixel_tiles 1 + +#define GLEW_SGIX_pixel_tiles GLEW_GET_VAR(__GLEW_SGIX_pixel_tiles) + +#endif /* GL_SGIX_pixel_tiles */ + +/* ------------------------- GL_SGIX_polynomial_ffd ------------------------ */ + +#ifndef GL_SGIX_polynomial_ffd +#define GL_SGIX_polynomial_ffd 1 + +#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x1 +#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x2 + +typedef void (GLAPIENTRY * PFNGLDEFORMSGIXPROC) (GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); + +#define glDeformSGIX GLEW_GET_FUN(__glewDeformSGIX) +#define glLoadIdentityDeformationMapSGIX GLEW_GET_FUN(__glewLoadIdentityDeformationMapSGIX) + +#define GLEW_SGIX_polynomial_ffd GLEW_GET_VAR(__GLEW_SGIX_polynomial_ffd) + +#endif /* GL_SGIX_polynomial_ffd */ + +/* --------------------------- GL_SGIX_quad_mesh --------------------------- */ + +#ifndef GL_SGIX_quad_mesh +#define GL_SGIX_quad_mesh 1 + +typedef void (GLAPIENTRY * PFNGLMESHBREADTHSGIXPROC) (GLint breadth); +typedef void (GLAPIENTRY * PFNGLMESHSTRIDESGIXPROC) (GLint stride); + +#define glMeshBreadthSGIX GLEW_GET_FUN(__glewMeshBreadthSGIX) +#define glMeshStrideSGIX GLEW_GET_FUN(__glewMeshStrideSGIX) + +#define GLEW_SGIX_quad_mesh GLEW_GET_VAR(__GLEW_SGIX_quad_mesh) + +#endif /* GL_SGIX_quad_mesh */ + +/* ------------------------ GL_SGIX_reference_plane ------------------------ */ + +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 + +typedef void (GLAPIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble* equation); + +#define glReferencePlaneSGIX GLEW_GET_FUN(__glewReferencePlaneSGIX) + +#define GLEW_SGIX_reference_plane GLEW_GET_VAR(__GLEW_SGIX_reference_plane) + +#endif /* GL_SGIX_reference_plane */ + +/* ---------------------------- GL_SGIX_resample --------------------------- */ + +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 + +#define GL_PACK_RESAMPLE_SGIX 0x842E +#define GL_UNPACK_RESAMPLE_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#define GL_RESAMPLE_REPLICATE_SGIX 0x8433 +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434 + +#define GLEW_SGIX_resample GLEW_GET_VAR(__GLEW_SGIX_resample) + +#endif /* GL_SGIX_resample */ + +/* ------------------------- GL_SGIX_scalebias_hint ------------------------ */ + +#ifndef GL_SGIX_scalebias_hint +#define GL_SGIX_scalebias_hint 1 + +#define GL_SCALEBIAS_HINT_SGIX 0x8322 + +#define GLEW_SGIX_scalebias_hint GLEW_GET_VAR(__GLEW_SGIX_scalebias_hint) + +#endif /* GL_SGIX_scalebias_hint */ + +/* ----------------------------- GL_SGIX_shadow ---------------------------- */ + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 + +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D + +#define GLEW_SGIX_shadow GLEW_GET_VAR(__GLEW_SGIX_shadow) + +#endif /* GL_SGIX_shadow */ + +/* ------------------------- GL_SGIX_shadow_ambient ------------------------ */ + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 + +#define GL_SHADOW_AMBIENT_SGIX 0x80BF + +#define GLEW_SGIX_shadow_ambient GLEW_GET_VAR(__GLEW_SGIX_shadow_ambient) + +#endif /* GL_SGIX_shadow_ambient */ + +/* ------------------------------ GL_SGIX_slim ----------------------------- */ + +#ifndef GL_SGIX_slim +#define GL_SGIX_slim 1 + +#define GL_PACK_MAX_COMPRESSED_SIZE_SGIX 0x831B +#define GL_SLIM8U_SGIX 0x831D +#define GL_SLIM10U_SGIX 0x831E +#define GL_SLIM12S_SGIX 0x831F + +#define GLEW_SGIX_slim GLEW_GET_VAR(__GLEW_SGIX_slim) + +#endif /* GL_SGIX_slim */ + +/* ------------------------ GL_SGIX_spotlight_cutoff ----------------------- */ + +#ifndef GL_SGIX_spotlight_cutoff +#define GL_SGIX_spotlight_cutoff 1 + +#define GL_SPOT_CUTOFF_DELTA_SGIX 0x8193 + +#define GLEW_SGIX_spotlight_cutoff GLEW_GET_VAR(__GLEW_SGIX_spotlight_cutoff) + +#endif /* GL_SGIX_spotlight_cutoff */ + +/* ----------------------------- GL_SGIX_sprite ---------------------------- */ + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 + +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, GLint* params); + +#define glSpriteParameterfSGIX GLEW_GET_FUN(__glewSpriteParameterfSGIX) +#define glSpriteParameterfvSGIX GLEW_GET_FUN(__glewSpriteParameterfvSGIX) +#define glSpriteParameteriSGIX GLEW_GET_FUN(__glewSpriteParameteriSGIX) +#define glSpriteParameterivSGIX GLEW_GET_FUN(__glewSpriteParameterivSGIX) + +#define GLEW_SGIX_sprite GLEW_GET_VAR(__GLEW_SGIX_sprite) + +#endif /* GL_SGIX_sprite */ + +/* -------------------------- GL_SGIX_subdiv_patch ------------------------- */ + +#ifndef GL_SGIX_subdiv_patch +#define GL_SGIX_subdiv_patch 1 + +#define GLEW_SGIX_subdiv_patch GLEW_GET_VAR(__GLEW_SGIX_subdiv_patch) + +#endif /* GL_SGIX_subdiv_patch */ + +/* --------------------------- GL_SGIX_subsample --------------------------- */ + +#ifndef GL_SGIX_subsample +#define GL_SGIX_subsample 1 + +#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 +#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 +#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 +#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 +#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 + +#define GLEW_SGIX_subsample GLEW_GET_VAR(__GLEW_SGIX_subsample) + +#endif /* GL_SGIX_subsample */ + +/* ----------------------- GL_SGIX_tag_sample_buffer ----------------------- */ + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 + +typedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); + +#define glTagSampleBufferSGIX GLEW_GET_FUN(__glewTagSampleBufferSGIX) + +#define GLEW_SGIX_tag_sample_buffer GLEW_GET_VAR(__GLEW_SGIX_tag_sample_buffer) + +#endif /* GL_SGIX_tag_sample_buffer */ + +/* ------------------------ GL_SGIX_texture_add_env ------------------------ */ + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 + +#define GLEW_SGIX_texture_add_env GLEW_GET_VAR(__GLEW_SGIX_texture_add_env) + +#endif /* GL_SGIX_texture_add_env */ + +/* -------------------- GL_SGIX_texture_coordinate_clamp ------------------- */ + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 + +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B + +#define GLEW_SGIX_texture_coordinate_clamp GLEW_GET_VAR(__GLEW_SGIX_texture_coordinate_clamp) + +#endif /* GL_SGIX_texture_coordinate_clamp */ + +/* ------------------------ GL_SGIX_texture_lod_bias ----------------------- */ + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 + +#define GLEW_SGIX_texture_lod_bias GLEW_GET_VAR(__GLEW_SGIX_texture_lod_bias) + +#endif /* GL_SGIX_texture_lod_bias */ + +/* ------------------- GL_SGIX_texture_mipmap_anisotropic ------------------ */ + +#ifndef GL_SGIX_texture_mipmap_anisotropic +#define GL_SGIX_texture_mipmap_anisotropic 1 + +#define GL_TEXTURE_MIPMAP_ANISOTROPY_SGIX 0x832E +#define GL_MAX_MIPMAP_ANISOTROPY_SGIX 0x832F + +#define GLEW_SGIX_texture_mipmap_anisotropic GLEW_GET_VAR(__GLEW_SGIX_texture_mipmap_anisotropic) + +#endif /* GL_SGIX_texture_mipmap_anisotropic */ + +/* ---------------------- GL_SGIX_texture_multi_buffer --------------------- */ + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 + +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E + +#define GLEW_SGIX_texture_multi_buffer GLEW_GET_VAR(__GLEW_SGIX_texture_multi_buffer) + +#endif /* GL_SGIX_texture_multi_buffer */ + +/* ------------------------- GL_SGIX_texture_phase ------------------------- */ + +#ifndef GL_SGIX_texture_phase +#define GL_SGIX_texture_phase 1 + +#define GL_PHASE_SGIX 0x832A + +#define GLEW_SGIX_texture_phase GLEW_GET_VAR(__GLEW_SGIX_texture_phase) + +#endif /* GL_SGIX_texture_phase */ + +/* ------------------------- GL_SGIX_texture_range ------------------------- */ + +#ifndef GL_SGIX_texture_range +#define GL_SGIX_texture_range 1 + +#define GL_RGB_SIGNED_SGIX 0x85E0 +#define GL_RGBA_SIGNED_SGIX 0x85E1 +#define GL_ALPHA_SIGNED_SGIX 0x85E2 +#define GL_LUMINANCE_SIGNED_SGIX 0x85E3 +#define GL_INTENSITY_SIGNED_SGIX 0x85E4 +#define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5 +#define GL_RGB16_SIGNED_SGIX 0x85E6 +#define GL_RGBA16_SIGNED_SGIX 0x85E7 +#define GL_ALPHA16_SIGNED_SGIX 0x85E8 +#define GL_LUMINANCE16_SIGNED_SGIX 0x85E9 +#define GL_INTENSITY16_SIGNED_SGIX 0x85EA +#define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB +#define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC +#define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED +#define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE +#define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF +#define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0 +#define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1 +#define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2 +#define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3 +#define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4 +#define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5 +#define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6 +#define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7 +#define GL_MIN_LUMINANCE_SGIS 0x85F8 +#define GL_MAX_LUMINANCE_SGIS 0x85F9 +#define GL_MIN_INTENSITY_SGIS 0x85FA +#define GL_MAX_INTENSITY_SGIS 0x85FB + +#define GLEW_SGIX_texture_range GLEW_GET_VAR(__GLEW_SGIX_texture_range) + +#endif /* GL_SGIX_texture_range */ + +/* ----------------------- GL_SGIX_texture_scale_bias ---------------------- */ + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 + +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C + +#define GLEW_SGIX_texture_scale_bias GLEW_GET_VAR(__GLEW_SGIX_texture_scale_bias) + +#endif /* GL_SGIX_texture_scale_bias */ + +/* ---------------------- GL_SGIX_texture_supersample ---------------------- */ + +#ifndef GL_SGIX_texture_supersample +#define GL_SGIX_texture_supersample 1 + +#define GLEW_SGIX_texture_supersample GLEW_GET_VAR(__GLEW_SGIX_texture_supersample) + +#endif /* GL_SGIX_texture_supersample */ + +/* --------------------------- GL_SGIX_vector_ops -------------------------- */ + +#ifndef GL_SGIX_vector_ops +#define GL_SGIX_vector_ops 1 + +typedef void (GLAPIENTRY * PFNGLGETVECTOROPERATIONSGIXPROC) (GLenum operation); +typedef void (GLAPIENTRY * PFNGLVECTOROPERATIONSGIXPROC) (GLenum operation); + +#define glGetVectorOperationSGIX GLEW_GET_FUN(__glewGetVectorOperationSGIX) +#define glVectorOperationSGIX GLEW_GET_FUN(__glewVectorOperationSGIX) + +#define GLEW_SGIX_vector_ops GLEW_GET_VAR(__GLEW_SGIX_vector_ops) + +#endif /* GL_SGIX_vector_ops */ + +/* ---------------------- GL_SGIX_vertex_array_object ---------------------- */ + +#ifndef GL_SGIX_vertex_array_object +#define GL_SGIX_vertex_array_object 1 + +typedef GLboolean (GLAPIENTRY * PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC) (GLsizei n, const GLuint* arrays, GLboolean* residences); +typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYSGIXPROC) (GLuint array); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSSGIXPROC) (GLsizei n, const GLuint* arrays); +typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSSGIXPROC) (GLsizei n, GLuint* arrays); +typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYSGIXPROC) (GLuint array); +typedef void (GLAPIENTRY * PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC) (GLsizei n, const GLuint* arrays, const GLclampf* priorities); + +#define glAreVertexArraysResidentSGIX GLEW_GET_FUN(__glewAreVertexArraysResidentSGIX) +#define glBindVertexArraySGIX GLEW_GET_FUN(__glewBindVertexArraySGIX) +#define glDeleteVertexArraysSGIX GLEW_GET_FUN(__glewDeleteVertexArraysSGIX) +#define glGenVertexArraysSGIX GLEW_GET_FUN(__glewGenVertexArraysSGIX) +#define glIsVertexArraySGIX GLEW_GET_FUN(__glewIsVertexArraySGIX) +#define glPrioritizeVertexArraysSGIX GLEW_GET_FUN(__glewPrioritizeVertexArraysSGIX) + +#define GLEW_SGIX_vertex_array_object GLEW_GET_VAR(__GLEW_SGIX_vertex_array_object) + +#endif /* GL_SGIX_vertex_array_object */ + +/* ------------------------- GL_SGIX_vertex_preclip ------------------------ */ + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 + +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF + +#define GLEW_SGIX_vertex_preclip GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip) + +#endif /* GL_SGIX_vertex_preclip */ + +/* ---------------------- GL_SGIX_vertex_preclip_hint ---------------------- */ + +#ifndef GL_SGIX_vertex_preclip_hint +#define GL_SGIX_vertex_preclip_hint 1 + +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF + +#define GLEW_SGIX_vertex_preclip_hint GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip_hint) + +#endif /* GL_SGIX_vertex_preclip_hint */ + +/* ----------------------------- GL_SGIX_ycrcb ----------------------------- */ + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 + +#define GLEW_SGIX_ycrcb GLEW_GET_VAR(__GLEW_SGIX_ycrcb) + +#endif /* GL_SGIX_ycrcb */ + +/* ------------------------ GL_SGIX_ycrcb_subsample ------------------------ */ + +#ifndef GL_SGIX_ycrcb_subsample +#define GL_SGIX_ycrcb_subsample 1 + +#define GLEW_SGIX_ycrcb_subsample GLEW_GET_VAR(__GLEW_SGIX_ycrcb_subsample) + +#endif /* GL_SGIX_ycrcb_subsample */ + +/* ----------------------------- GL_SGIX_ycrcba ---------------------------- */ + +#ifndef GL_SGIX_ycrcba +#define GL_SGIX_ycrcba 1 + +#define GL_YCRCB_SGIX 0x8318 +#define GL_YCRCBA_SGIX 0x8319 + +#define GLEW_SGIX_ycrcba GLEW_GET_VAR(__GLEW_SGIX_ycrcba) + +#endif /* GL_SGIX_ycrcba */ + +/* -------------------------- GL_SGI_color_matrix -------------------------- */ + +#ifndef GL_SGI_color_matrix +#define GL_SGI_color_matrix 1 + +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB + +#define GLEW_SGI_color_matrix GLEW_GET_VAR(__GLEW_SGI_color_matrix) + +#endif /* GL_SGI_color_matrix */ + +/* --------------------------- GL_SGI_color_table -------------------------- */ + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 + +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF + +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void *table); + +#define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI) +#define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI) +#define glColorTableSGI GLEW_GET_FUN(__glewColorTableSGI) +#define glCopyColorTableSGI GLEW_GET_FUN(__glewCopyColorTableSGI) +#define glGetColorTableParameterfvSGI GLEW_GET_FUN(__glewGetColorTableParameterfvSGI) +#define glGetColorTableParameterivSGI GLEW_GET_FUN(__glewGetColorTableParameterivSGI) +#define glGetColorTableSGI GLEW_GET_FUN(__glewGetColorTableSGI) + +#define GLEW_SGI_color_table GLEW_GET_VAR(__GLEW_SGI_color_table) + +#endif /* GL_SGI_color_table */ + +/* ----------------------------- GL_SGI_complex ---------------------------- */ + +#ifndef GL_SGI_complex +#define GL_SGI_complex 1 + +#define GLEW_SGI_complex GLEW_GET_VAR(__GLEW_SGI_complex) + +#endif /* GL_SGI_complex */ + +/* -------------------------- GL_SGI_complex_type -------------------------- */ + +#ifndef GL_SGI_complex_type +#define GL_SGI_complex_type 1 + +#define GL_COMPLEX_UNSIGNED_BYTE_SGI 0x81BD +#define GL_COMPLEX_BYTE_SGI 0x81BE +#define GL_COMPLEX_UNSIGNED_SHORT_SGI 0x81BF +#define GL_COMPLEX_SHORT_SGI 0x81C0 +#define GL_COMPLEX_UNSIGNED_INT_SGI 0x81C1 +#define GL_COMPLEX_INT_SGI 0x81C2 +#define GL_COMPLEX_FLOAT_SGI 0x81C3 + +#define GLEW_SGI_complex_type GLEW_GET_VAR(__GLEW_SGI_complex_type) + +#endif /* GL_SGI_complex_type */ + +/* ------------------------------- GL_SGI_fft ------------------------------ */ + +#ifndef GL_SGI_fft +#define GL_SGI_fft 1 + +#define GL_PIXEL_TRANSFORM_OPERATOR_SGI 0x81C4 +#define GL_CONVOLUTION_SGI 0x81C5 +#define GL_FFT_1D_SGI 0x81C6 +#define GL_PIXEL_TRANSFORM_SGI 0x81C7 +#define GL_MAX_FFT_WIDTH_SGI 0x81C8 + +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFSGIPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERISGIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMSGIPROC) (GLenum target); + +#define glGetPixelTransformParameterfvSGI GLEW_GET_FUN(__glewGetPixelTransformParameterfvSGI) +#define glGetPixelTransformParameterivSGI GLEW_GET_FUN(__glewGetPixelTransformParameterivSGI) +#define glPixelTransformParameterfSGI GLEW_GET_FUN(__glewPixelTransformParameterfSGI) +#define glPixelTransformParameterfvSGI GLEW_GET_FUN(__glewPixelTransformParameterfvSGI) +#define glPixelTransformParameteriSGI GLEW_GET_FUN(__glewPixelTransformParameteriSGI) +#define glPixelTransformParameterivSGI GLEW_GET_FUN(__glewPixelTransformParameterivSGI) +#define glPixelTransformSGI GLEW_GET_FUN(__glewPixelTransformSGI) + +#define GLEW_SGI_fft GLEW_GET_VAR(__GLEW_SGI_fft) + +#endif /* GL_SGI_fft */ + +/* ----------------------- GL_SGI_texture_color_table ---------------------- */ + +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 + +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD + +#define GLEW_SGI_texture_color_table GLEW_GET_VAR(__GLEW_SGI_texture_color_table) + +#endif /* GL_SGI_texture_color_table */ + +/* ------------------------- GL_SUNX_constant_data ------------------------- */ + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 + +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 + +typedef void (GLAPIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void); + +#define glFinishTextureSUNX GLEW_GET_FUN(__glewFinishTextureSUNX) + +#define GLEW_SUNX_constant_data GLEW_GET_VAR(__GLEW_SUNX_constant_data) + +#endif /* GL_SUNX_constant_data */ + +/* -------------------- GL_SUN_convolution_border_modes -------------------- */ + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 + +#define GL_WRAP_BORDER_SUN 0x81D4 + +#define GLEW_SUN_convolution_border_modes GLEW_GET_VAR(__GLEW_SUN_convolution_border_modes) + +#endif /* GL_SUN_convolution_border_modes */ + +/* -------------------------- GL_SUN_global_alpha -------------------------- */ + +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 + +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA + +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); + +#define glGlobalAlphaFactorbSUN GLEW_GET_FUN(__glewGlobalAlphaFactorbSUN) +#define glGlobalAlphaFactordSUN GLEW_GET_FUN(__glewGlobalAlphaFactordSUN) +#define glGlobalAlphaFactorfSUN GLEW_GET_FUN(__glewGlobalAlphaFactorfSUN) +#define glGlobalAlphaFactoriSUN GLEW_GET_FUN(__glewGlobalAlphaFactoriSUN) +#define glGlobalAlphaFactorsSUN GLEW_GET_FUN(__glewGlobalAlphaFactorsSUN) +#define glGlobalAlphaFactorubSUN GLEW_GET_FUN(__glewGlobalAlphaFactorubSUN) +#define glGlobalAlphaFactoruiSUN GLEW_GET_FUN(__glewGlobalAlphaFactoruiSUN) +#define glGlobalAlphaFactorusSUN GLEW_GET_FUN(__glewGlobalAlphaFactorusSUN) + +#define GLEW_SUN_global_alpha GLEW_GET_VAR(__GLEW_SUN_global_alpha) + +#endif /* GL_SUN_global_alpha */ + +/* --------------------------- GL_SUN_mesh_array --------------------------- */ + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 + +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 + +#define GLEW_SUN_mesh_array GLEW_GET_VAR(__GLEW_SUN_mesh_array) + +#endif /* GL_SUN_mesh_array */ + +/* ------------------------ GL_SUN_read_video_pixels ----------------------- */ + +#ifndef GL_SUN_read_video_pixels +#define GL_SUN_read_video_pixels 1 + +typedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels); + +#define glReadVideoPixelsSUN GLEW_GET_FUN(__glewReadVideoPixelsSUN) + +#define GLEW_SUN_read_video_pixels GLEW_GET_VAR(__GLEW_SUN_read_video_pixels) + +#endif /* GL_SUN_read_video_pixels */ + +/* --------------------------- GL_SUN_slice_accum -------------------------- */ + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 + +#define GL_SLICE_ACCUM_SUN 0x85CC + +#define GLEW_SUN_slice_accum GLEW_GET_VAR(__GLEW_SUN_slice_accum) + +#endif /* GL_SUN_slice_accum */ + +/* -------------------------- GL_SUN_triangle_list ------------------------- */ + +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 + +#define GL_RESTART_SUN 0x01 +#define GL_REPLACE_MIDDLE_SUN 0x02 +#define GL_REPLACE_OLDEST_SUN 0x03 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB + +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint* code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort* code); + +#define glReplacementCodePointerSUN GLEW_GET_FUN(__glewReplacementCodePointerSUN) +#define glReplacementCodeubSUN GLEW_GET_FUN(__glewReplacementCodeubSUN) +#define glReplacementCodeubvSUN GLEW_GET_FUN(__glewReplacementCodeubvSUN) +#define glReplacementCodeuiSUN GLEW_GET_FUN(__glewReplacementCodeuiSUN) +#define glReplacementCodeuivSUN GLEW_GET_FUN(__glewReplacementCodeuivSUN) +#define glReplacementCodeusSUN GLEW_GET_FUN(__glewReplacementCodeusSUN) +#define glReplacementCodeusvSUN GLEW_GET_FUN(__glewReplacementCodeusvSUN) + +#define GLEW_SUN_triangle_list GLEW_GET_VAR(__GLEW_SUN_triangle_list) + +#endif /* GL_SUN_triangle_list */ + +/* ----------------------------- GL_SUN_vertex ----------------------------- */ + +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 + +typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint* rc, const GLubyte *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat* tc, const GLubyte *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *v); + +#define glColor3fVertex3fSUN GLEW_GET_FUN(__glewColor3fVertex3fSUN) +#define glColor3fVertex3fvSUN GLEW_GET_FUN(__glewColor3fVertex3fvSUN) +#define glColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fSUN) +#define glColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fvSUN) +#define glColor4ubVertex2fSUN GLEW_GET_FUN(__glewColor4ubVertex2fSUN) +#define glColor4ubVertex2fvSUN GLEW_GET_FUN(__glewColor4ubVertex2fvSUN) +#define glColor4ubVertex3fSUN GLEW_GET_FUN(__glewColor4ubVertex3fSUN) +#define glColor4ubVertex3fvSUN GLEW_GET_FUN(__glewColor4ubVertex3fvSUN) +#define glNormal3fVertex3fSUN GLEW_GET_FUN(__glewNormal3fVertex3fSUN) +#define glNormal3fVertex3fvSUN GLEW_GET_FUN(__glewNormal3fVertex3fvSUN) +#define glReplacementCodeuiColor3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fSUN) +#define glReplacementCodeuiColor3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fvSUN) +#define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fSUN) +#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fvSUN) +#define glReplacementCodeuiColor4ubVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fSUN) +#define glReplacementCodeuiColor4ubVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fvSUN) +#define glReplacementCodeuiNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fSUN) +#define glReplacementCodeuiNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fvSUN) +#define glReplacementCodeuiVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fSUN) +#define glReplacementCodeuiVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fvSUN) +#define glTexCoord2fColor3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fSUN) +#define glTexCoord2fColor3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fvSUN) +#define glTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fSUN) +#define glTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fvSUN) +#define glTexCoord2fColor4ubVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fSUN) +#define glTexCoord2fColor4ubVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fvSUN) +#define glTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fSUN) +#define glTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fvSUN) +#define glTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fSUN) +#define glTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fvSUN) +#define glTexCoord4fColor4fNormal3fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fSUN) +#define glTexCoord4fColor4fNormal3fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fvSUN) +#define glTexCoord4fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fSUN) +#define glTexCoord4fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fvSUN) + +#define GLEW_SUN_vertex GLEW_GET_VAR(__GLEW_SUN_vertex) + +#endif /* GL_SUN_vertex */ + +/* -------------------------- GL_WIN_phong_shading ------------------------- */ + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 + +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB + +#define GLEW_WIN_phong_shading GLEW_GET_VAR(__GLEW_WIN_phong_shading) + +#endif /* GL_WIN_phong_shading */ + +/* ------------------------- GL_WIN_scene_markerXXX ------------------------ */ + +#ifndef GL_WIN_scene_markerXXX +#define GL_WIN_scene_markerXXX 1 + +#define GLEW_WIN_scene_markerXXX GLEW_GET_VAR(__GLEW_WIN_scene_markerXXX) + +#endif /* GL_WIN_scene_markerXXX */ + +/* -------------------------- GL_WIN_specular_fog -------------------------- */ + +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 + +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC + +#define GLEW_WIN_specular_fog GLEW_GET_VAR(__GLEW_WIN_specular_fog) + +#endif /* GL_WIN_specular_fog */ + +/* ---------------------------- GL_WIN_swap_hint --------------------------- */ + +#ifndef GL_WIN_swap_hint +#define GL_WIN_swap_hint 1 + +typedef void (GLAPIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height); + +#define glAddSwapHintRectWIN GLEW_GET_FUN(__glewAddSwapHintRectWIN) + +#define GLEW_WIN_swap_hint GLEW_GET_VAR(__GLEW_WIN_swap_hint) + +#endif /* GL_WIN_swap_hint */ + +/* ------------------------------------------------------------------------- */ + + + +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements; +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D; + +GLEW_FUN_EXPORT PFNGLACTIVETEXTUREPROC __glewActiveTexture; +GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv; +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage; + +GLEW_FUN_EXPORT PFNGLBLENDCOLORPROC __glewBlendColor; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONPROC __glewBlendEquation; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate; +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer; +GLEW_FUN_EXPORT PFNGLFOGCOORDDPROC __glewFogCoordd; +GLEW_FUN_EXPORT PFNGLFOGCOORDDVPROC __glewFogCoorddv; +GLEW_FUN_EXPORT PFNGLFOGCOORDFPROC __glewFogCoordf; +GLEW_FUN_EXPORT PFNGLFOGCOORDFVPROC __glewFogCoordfv; +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFPROC __glewPointParameterf; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIPROC __glewPointParameteri; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DPROC __glewWindowPos2d; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FPROC __glewWindowPos2f; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IPROC __glewWindowPos2i; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SPROC __glewWindowPos2s; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DPROC __glewWindowPos3d; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FPROC __glewWindowPos3f; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IPROC __glewWindowPos3i; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SPROC __glewWindowPos3s; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYPROC __glewBeginQuery; +GLEW_FUN_EXPORT PFNGLBINDBUFFERPROC __glewBindBuffer; +GLEW_FUN_EXPORT PFNGLBUFFERDATAPROC __glewBufferData; +GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAPROC __glewBufferSubData; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERSPROC __glewDeleteBuffers; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESPROC __glewDeleteQueries; +GLEW_FUN_EXPORT PFNGLENDQUERYPROC __glewEndQuery; +GLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers; +GLEW_FUN_EXPORT PFNGLGENQUERIESPROC __glewGenQueries; +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv; +GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv; +GLEW_FUN_EXPORT PFNGLGETQUERYIVPROC __glewGetQueryiv; +GLEW_FUN_EXPORT PFNGLISBUFFERPROC __glewIsBuffer; +GLEW_FUN_EXPORT PFNGLISQUERYPROC __glewIsQuery; +GLEW_FUN_EXPORT PFNGLMAPBUFFERPROC __glewMapBuffer; +GLEW_FUN_EXPORT PFNGLUNMAPBUFFERPROC __glewUnmapBuffer; + +GLEW_FUN_EXPORT PFNGLATTACHSHADERPROC __glewAttachShader; +GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate; +GLEW_FUN_EXPORT PFNGLCOMPILESHADERPROC __glewCompileShader; +GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPROC __glewCreateProgram; +GLEW_FUN_EXPORT PFNGLCREATESHADERPROC __glewCreateShader; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPROC __glewDeleteProgram; +GLEW_FUN_EXPORT PFNGLDELETESHADERPROC __glewDeleteShader; +GLEW_FUN_EXPORT PFNGLDETACHSHADERPROC __glewDetachShader; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray; +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSPROC __glewDrawBuffers; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray; +GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform; +GLEW_FUN_EXPORT PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders; +GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation; +GLEW_FUN_EXPORT PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVPROC __glewGetProgramiv; +GLEW_FUN_EXPORT PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog; +GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEPROC __glewGetShaderSource; +GLEW_FUN_EXPORT PFNGLGETSHADERIVPROC __glewGetShaderiv; +GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation; +GLEW_FUN_EXPORT PFNGLGETUNIFORMFVPROC __glewGetUniformfv; +GLEW_FUN_EXPORT PFNGLGETUNIFORMIVPROC __glewGetUniformiv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv; +GLEW_FUN_EXPORT PFNGLISPROGRAMPROC __glewIsProgram; +GLEW_FUN_EXPORT PFNGLISSHADERPROC __glewIsShader; +GLEW_FUN_EXPORT PFNGLLINKPROGRAMPROC __glewLinkProgram; +GLEW_FUN_EXPORT PFNGLSHADERSOURCEPROC __glewShaderSource; +GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate; +GLEW_FUN_EXPORT PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate; +GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate; +GLEW_FUN_EXPORT PFNGLUNIFORM1FPROC __glewUniform1f; +GLEW_FUN_EXPORT PFNGLUNIFORM1FVPROC __glewUniform1fv; +GLEW_FUN_EXPORT PFNGLUNIFORM1IPROC __glewUniform1i; +GLEW_FUN_EXPORT PFNGLUNIFORM1IVPROC __glewUniform1iv; +GLEW_FUN_EXPORT PFNGLUNIFORM2FPROC __glewUniform2f; +GLEW_FUN_EXPORT PFNGLUNIFORM2FVPROC __glewUniform2fv; +GLEW_FUN_EXPORT PFNGLUNIFORM2IPROC __glewUniform2i; +GLEW_FUN_EXPORT PFNGLUNIFORM2IVPROC __glewUniform2iv; +GLEW_FUN_EXPORT PFNGLUNIFORM3FPROC __glewUniform3f; +GLEW_FUN_EXPORT PFNGLUNIFORM3FVPROC __glewUniform3fv; +GLEW_FUN_EXPORT PFNGLUNIFORM3IPROC __glewUniform3i; +GLEW_FUN_EXPORT PFNGLUNIFORM3IVPROC __glewUniform3iv; +GLEW_FUN_EXPORT PFNGLUNIFORM4FPROC __glewUniform4f; +GLEW_FUN_EXPORT PFNGLUNIFORM4FVPROC __glewUniform4fv; +GLEW_FUN_EXPORT PFNGLUNIFORM4IPROC __glewUniform4i; +GLEW_FUN_EXPORT PFNGLUNIFORM4IVPROC __glewUniform4iv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv; +GLEW_FUN_EXPORT PFNGLUSEPROGRAMPROC __glewUseProgram; +GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPROC __glewValidateProgram; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer; + +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv; + +GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender; +GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback; +GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation; +GLEW_FUN_EXPORT PFNGLCLAMPCOLORPROC __glewClampColor; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERFIPROC __glewClearBufferfi; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERFVPROC __glewClearBufferfv; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERIVPROC __glewClearBufferiv; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv; +GLEW_FUN_EXPORT PFNGLCOLORMASKIPROC __glewColorMaski; +GLEW_FUN_EXPORT PFNGLDISABLEIPROC __glewDisablei; +GLEW_FUN_EXPORT PFNGLENABLEIPROC __glewEnablei; +GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender; +GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback; +GLEW_FUN_EXPORT PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v; +GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation; +GLEW_FUN_EXPORT PFNGLGETSTRINGIPROC __glewGetStringi; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying; +GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv; +GLEW_FUN_EXPORT PFNGLISENABLEDIPROC __glewIsEnabledi; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIPROC __glewUniform1ui; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIVPROC __glewUniform1uiv; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIPROC __glewUniform2ui; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIVPROC __glewUniform2uiv; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIPROC __glewUniform3ui; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIVPROC __glewUniform3uiv; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIPROC __glewUniform4ui; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIVPROC __glewUniform4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced; +GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex; +GLEW_FUN_EXPORT PFNGLTEXBUFFERPROC __glewTexBuffer; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture; +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v; +GLEW_FUN_EXPORT PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v; + +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIPROC __glewBlendEquationi; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei; +GLEW_FUN_EXPORT PFNGLBLENDFUNCIPROC __glewBlendFunci; +GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading; + +GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSPROC __glewGetGraphicsResetStatus; +GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEPROC __glewGetnCompressedTexImage; +GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEPROC __glewGetnTexImage; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVPROC __glewGetnUniformdv; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC __glewMultiDrawArraysIndirectCount; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC __glewMultiDrawElementsIndirectCount; +GLEW_FUN_EXPORT PFNGLSPECIALIZESHADERPROC __glewSpecializeShader; + +GLEW_FUN_EXPORT PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX; + +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD; +GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD; +GLEW_FUN_EXPORT PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewFramebufferSamplePositionsfvAMD; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC __glewGetFramebufferParameterfvAMD; +GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC __glewGetNamedFramebufferParameterfvAMD; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewNamedFramebufferSamplePositionsfvAMD; + +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD; + +GLEW_FUN_EXPORT PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD; +GLEW_FUN_EXPORT PFNGLGENNAMESAMDPROC __glewGenNamesAMD; +GLEW_FUN_EXPORT PFNGLISNAMEAMDPROC __glewIsNameAMD; + +GLEW_FUN_EXPORT PFNGLQUERYOBJECTPARAMETERUIAMDPROC __glewQueryObjectParameteruiAMD; + +GLEW_FUN_EXPORT PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD; +GLEW_FUN_EXPORT PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD; +GLEW_FUN_EXPORT PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD; +GLEW_FUN_EXPORT PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD; +GLEW_FUN_EXPORT PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD; + +GLEW_FUN_EXPORT PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD; + +GLEW_FUN_EXPORT PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD; + +GLEW_FUN_EXPORT PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD; + +GLEW_FUN_EXPORT PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD; +GLEW_FUN_EXPORT PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD; + +GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE; +GLEW_FUN_EXPORT PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE; +GLEW_FUN_EXPORT PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE; +GLEW_FUN_EXPORT PFNGLISQUERYANGLEPROC __glewIsQueryANGLE; +GLEW_FUN_EXPORT PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE; + +GLEW_FUN_EXPORT PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE; + +GLEW_FUN_EXPORT PFNGLCOPYTEXTURELEVELSAPPLEPROC __glewCopyTextureLevelsAPPLE; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE; + +GLEW_FUN_EXPORT PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE; +GLEW_FUN_EXPORT PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE; +GLEW_FUN_EXPORT PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE; +GLEW_FUN_EXPORT PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE; +GLEW_FUN_EXPORT PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE; +GLEW_FUN_EXPORT PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE; +GLEW_FUN_EXPORT PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE; +GLEW_FUN_EXPORT PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE; + +GLEW_FUN_EXPORT PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE; +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC __glewRenderbufferStorageMultisampleAPPLE; +GLEW_FUN_EXPORT PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC __glewResolveMultisampleFramebufferAPPLE; + +GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE; +GLEW_FUN_EXPORT PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE; +GLEW_FUN_EXPORT PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE; + +GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCAPPLEPROC __glewClientWaitSyncAPPLE; +GLEW_FUN_EXPORT PFNGLDELETESYNCAPPLEPROC __glewDeleteSyncAPPLE; +GLEW_FUN_EXPORT PFNGLFENCESYNCAPPLEPROC __glewFenceSyncAPPLE; +GLEW_FUN_EXPORT PFNGLGETINTEGER64VAPPLEPROC __glewGetInteger64vAPPLE; +GLEW_FUN_EXPORT PFNGLGETSYNCIVAPPLEPROC __glewGetSyncivAPPLE; +GLEW_FUN_EXPORT PFNGLISSYNCAPPLEPROC __glewIsSyncAPPLE; +GLEW_FUN_EXPORT PFNGLWAITSYNCAPPLEPROC __glewWaitSyncAPPLE; + +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE; +GLEW_FUN_EXPORT PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE; + +GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE; +GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE; +GLEW_FUN_EXPORT PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE; + +GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE; + +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE; +GLEW_FUN_EXPORT PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE; +GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE; +GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE; +GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE; +GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE; + +GLEW_FUN_EXPORT PFNGLCLEARDEPTHFPROC __glewClearDepthf; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEFPROC __glewDepthRangef; +GLEW_FUN_EXPORT PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat; +GLEW_FUN_EXPORT PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler; +GLEW_FUN_EXPORT PFNGLSHADERBINARYPROC __glewShaderBinary; + +GLEW_FUN_EXPORT PFNGLMEMORYBARRIERBYREGIONPROC __glewMemoryBarrierByRegion; + +GLEW_FUN_EXPORT PFNGLPRIMITIVEBOUNDINGBOXARBPROC __glewPrimitiveBoundingBoxARB; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance; + +GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB; +GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB; +GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB; +GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB; +GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB; + +GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed; +GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex; + +GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEPROC __glewBufferStorage; + +GLEW_FUN_EXPORT PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB; + +GLEW_FUN_EXPORT PFNGLCLEARBUFFERDATAPROC __glewClearBufferData; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT; + +GLEW_FUN_EXPORT PFNGLCLEARTEXIMAGEPROC __glewClearTexImage; +GLEW_FUN_EXPORT PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage; + +GLEW_FUN_EXPORT PFNGLCLIPCONTROLPROC __glewClipControl; + +GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB; + +GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute; +GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect; + +GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB; + +GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData; + +GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData; + +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB; +GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB; + +GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPROC __glewBindTextureUnit; +GLEW_FUN_EXPORT PFNGLBLITNAMEDFRAMEBUFFERPROC __glewBlitNamedFramebuffer; +GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __glewCheckNamedFramebufferStatus; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAPROC __glewClearNamedBufferData; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAPROC __glewClearNamedBufferSubData; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFIPROC __glewClearNamedFramebufferfi; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFVPROC __glewClearNamedFramebufferfv; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERIVPROC __glewClearNamedFramebufferiv; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC __glewClearNamedFramebufferuiv; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __glewCompressedTextureSubImage1D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __glewCompressedTextureSubImage2D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __glewCompressedTextureSubImage3D; +GLEW_FUN_EXPORT PFNGLCOPYNAMEDBUFFERSUBDATAPROC __glewCopyNamedBufferSubData; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DPROC __glewCopyTextureSubImage1D; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DPROC __glewCopyTextureSubImage2D; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DPROC __glewCopyTextureSubImage3D; +GLEW_FUN_EXPORT PFNGLCREATEBUFFERSPROC __glewCreateBuffers; +GLEW_FUN_EXPORT PFNGLCREATEFRAMEBUFFERSPROC __glewCreateFramebuffers; +GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPIPELINESPROC __glewCreateProgramPipelines; +GLEW_FUN_EXPORT PFNGLCREATEQUERIESPROC __glewCreateQueries; +GLEW_FUN_EXPORT PFNGLCREATERENDERBUFFERSPROC __glewCreateRenderbuffers; +GLEW_FUN_EXPORT PFNGLCREATESAMPLERSPROC __glewCreateSamplers; +GLEW_FUN_EXPORT PFNGLCREATETEXTURESPROC __glewCreateTextures; +GLEW_FUN_EXPORT PFNGLCREATETRANSFORMFEEDBACKSPROC __glewCreateTransformFeedbacks; +GLEW_FUN_EXPORT PFNGLCREATEVERTEXARRAYSPROC __glewCreateVertexArrays; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBPROC __glewDisableVertexArrayAttrib; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBPROC __glewEnableVertexArrayAttrib; +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __glewFlushMappedNamedBufferRange; +GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPPROC __glewGenerateTextureMipmap; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC __glewGetCompressedTextureImage; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERI64VPROC __glewGetNamedBufferParameteri64v; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVPROC __glewGetNamedBufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVPROC __glewGetNamedBufferPointerv; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAPROC __glewGetNamedBufferSubData; +GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetNamedFramebufferAttachmentParameteriv; +GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __glewGetNamedFramebufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __glewGetNamedRenderbufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTI64VPROC __glewGetQueryBufferObjecti64v; +GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTIVPROC __glewGetQueryBufferObjectiv; +GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUI64VPROC __glewGetQueryBufferObjectui64v; +GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUIVPROC __glewGetQueryBufferObjectuiv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEPROC __glewGetTextureImage; +GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVPROC __glewGetTextureLevelParameterfv; +GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVPROC __glewGetTextureLevelParameteriv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVPROC __glewGetTextureParameterIiv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVPROC __glewGetTextureParameterIuiv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVPROC __glewGetTextureParameterfv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVPROC __glewGetTextureParameteriv; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI64_VPROC __glewGetTransformFeedbacki64_v; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI_VPROC __glewGetTransformFeedbacki_v; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKIVPROC __glewGetTransformFeedbackiv; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXED64IVPROC __glewGetVertexArrayIndexed64iv; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXEDIVPROC __glewGetVertexArrayIndexediv; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYIVPROC __glewGetVertexArrayiv; +GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __glewInvalidateNamedFramebufferData; +GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __glewInvalidateNamedFramebufferSubData; +GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERPROC __glewMapNamedBuffer; +GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEPROC __glewMapNamedBufferRange; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAPROC __glewNamedBufferData; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEPROC __glewNamedBufferStorage; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAPROC __glewNamedBufferSubData; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __glewNamedFramebufferDrawBuffer; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __glewNamedFramebufferDrawBuffers; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC __glewNamedFramebufferParameteri; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC __glewNamedFramebufferReadBuffer; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __glewNamedFramebufferRenderbuffer; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREPROC __glewNamedFramebufferTexture; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __glewNamedFramebufferTextureLayer; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEPROC __glewNamedRenderbufferStorage; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewNamedRenderbufferStorageMultisample; +GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERPROC __glewTextureBuffer; +GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEPROC __glewTextureBufferRange; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVPROC __glewTextureParameterIiv; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVPROC __glewTextureParameterIuiv; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFPROC __glewTextureParameterf; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVPROC __glewTextureParameterfv; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIPROC __glewTextureParameteri; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVPROC __glewTextureParameteriv; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DPROC __glewTextureStorage1D; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DPROC __glewTextureStorage2D; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC __glewTextureStorage2DMultisample; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DPROC __glewTextureStorage3D; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC __glewTextureStorage3DMultisample; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DPROC __glewTextureSubImage1D; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DPROC __glewTextureSubImage2D; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DPROC __glewTextureSubImage3D; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC __glewTransformFeedbackBufferBase; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC __glewTransformFeedbackBufferRange; +GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFERPROC __glewUnmapNamedBuffer; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBBINDINGPROC __glewVertexArrayAttribBinding; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBFORMATPROC __glewVertexArrayAttribFormat; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBIFORMATPROC __glewVertexArrayAttribIFormat; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBLFORMATPROC __glewVertexArrayAttribLFormat; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDINGDIVISORPROC __glewVertexArrayBindingDivisor; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYELEMENTBUFFERPROC __glewVertexArrayElementBuffer; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERPROC __glewVertexArrayVertexBuffer; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERSPROC __glewVertexArrayVertexBuffers; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB; +GLEW_FUN_EXPORT PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT; + +GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer; +GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer; +GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer; +GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus; +GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers; +GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer; +GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers; +GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers; +GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv; +GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv; +GLEW_FUN_EXPORT PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer; +GLEW_FUN_EXPORT PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer; +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage; +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB; + +GLEW_FUN_EXPORT PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary; +GLEW_FUN_EXPORT PFNGLPROGRAMBINARYPROC __glewProgramBinary; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri; + +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __glewGetCompressedTextureSubImage; +GLEW_FUN_EXPORT PFNGLGETTEXTURESUBIMAGEPROC __glewGetTextureSubImage; + +GLEW_FUN_EXPORT PFNGLSPECIALIZESHADERARBPROC __glewSpecializeShaderARB; + +GLEW_FUN_EXPORT PFNGLGETUNIFORMDVPROC __glewGetUniformdv; +GLEW_FUN_EXPORT PFNGLUNIFORM1DPROC __glewUniform1d; +GLEW_FUN_EXPORT PFNGLUNIFORM1DVPROC __glewUniform1dv; +GLEW_FUN_EXPORT PFNGLUNIFORM2DPROC __glewUniform2d; +GLEW_FUN_EXPORT PFNGLUNIFORM2DVPROC __glewUniform2dv; +GLEW_FUN_EXPORT PFNGLUNIFORM3DPROC __glewUniform3d; +GLEW_FUN_EXPORT PFNGLUNIFORM3DVPROC __glewUniform3dv; +GLEW_FUN_EXPORT PFNGLUNIFORM4DPROC __glewUniform4d; +GLEW_FUN_EXPORT PFNGLUNIFORM4DVPROC __glewUniform4dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv; + +GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VARBPROC __glewGetUniformi64vARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VARBPROC __glewGetUniformui64vARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMI64VARBPROC __glewGetnUniformi64vARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMUI64VARBPROC __glewGetnUniformui64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64ARBPROC __glewProgramUniform1i64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VARBPROC __glewProgramUniform1i64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64ARBPROC __glewProgramUniform1ui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VARBPROC __glewProgramUniform1ui64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64ARBPROC __glewProgramUniform2i64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VARBPROC __glewProgramUniform2i64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64ARBPROC __glewProgramUniform2ui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VARBPROC __glewProgramUniform2ui64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64ARBPROC __glewProgramUniform3i64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VARBPROC __glewProgramUniform3i64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64ARBPROC __glewProgramUniform3ui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VARBPROC __glewProgramUniform3ui64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64ARBPROC __glewProgramUniform4i64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VARBPROC __glewProgramUniform4i64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64ARBPROC __glewProgramUniform4ui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VARBPROC __glewProgramUniform4ui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1I64ARBPROC __glewUniform1i64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1I64VARBPROC __glewUniform1i64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1UI64ARBPROC __glewUniform1ui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VARBPROC __glewUniform1ui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2I64ARBPROC __glewUniform2i64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2I64VARBPROC __glewUniform2i64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2UI64ARBPROC __glewUniform2ui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VARBPROC __glewUniform2ui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3I64ARBPROC __glewUniform3i64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3I64VARBPROC __glewUniform3i64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3UI64ARBPROC __glewUniform3ui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VARBPROC __glewUniform3ui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4I64ARBPROC __glewUniform4i64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4I64VARBPROC __glewUniform4i64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4UI64ARBPROC __glewUniform4ui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VARBPROC __glewUniform4ui64vARB; + +GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEPROC __glewColorSubTable; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPROC __glewColorTable; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv; +GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable; +GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPROC __glewGetColorTable; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPROC __glewGetHistogram; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv; +GLEW_FUN_EXPORT PFNGLGETMINMAXPROC __glewGetMinmax; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv; +GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter; +GLEW_FUN_EXPORT PFNGLHISTOGRAMPROC __glewHistogram; +GLEW_FUN_EXPORT PFNGLMINMAXPROC __glewMinmax; +GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram; +GLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax; +GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB; + +GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ; + +GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v; + +GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData; +GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData; +GLEW_FUN_EXPORT PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer; +GLEW_FUN_EXPORT PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer; +GLEW_FUN_EXPORT PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage; +GLEW_FUN_EXPORT PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage; + +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange; +GLEW_FUN_EXPORT PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange; + +GLEW_FUN_EXPORT PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB; + +GLEW_FUN_EXPORT PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase; +GLEW_FUN_EXPORT PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange; +GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures; +GLEW_FUN_EXPORT PFNGLBINDSAMPLERSPROC __glewBindSamplers; +GLEW_FUN_EXPORT PFNGLBINDTEXTURESPROC __glewBindTextures; +GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect; + +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB; + +GLEW_FUN_EXPORT PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB; +GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYARBPROC __glewBeginQueryARB; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB; +GLEW_FUN_EXPORT PFNGLENDQUERYARBPROC __glewEndQueryARB; +GLEW_FUN_EXPORT PFNGLGENQUERIESARBPROC __glewGenQueriesARB; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB; +GLEW_FUN_EXPORT PFNGLGETQUERYIVARBPROC __glewGetQueryivARB; +GLEW_FUN_EXPORT PFNGLISQUERYARBPROC __glewIsQueryARB; + +GLEW_FUN_EXPORT PFNGLMAXSHADERCOMPILERTHREADSARBPROC __glewMaxShaderCompilerThreadsARB; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB; + +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETCLAMPPROC __glewPolygonOffsetClamp; + +GLEW_FUN_EXPORT PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv; + +GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex; + +GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB; +GLEW_FUN_EXPORT PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB; +GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB; +GLEW_FUN_EXPORT PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB; +GLEW_FUN_EXPORT PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB; +GLEW_FUN_EXPORT PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB; +GLEW_FUN_EXPORT PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB; +GLEW_FUN_EXPORT PFNGLGETNMAPIVARBPROC __glewGetnMapivARB; +GLEW_FUN_EXPORT PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB; +GLEW_FUN_EXPORT PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB; +GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB; +GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB; +GLEW_FUN_EXPORT PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB; +GLEW_FUN_EXPORT PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB; +GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB; +GLEW_FUN_EXPORT PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewFramebufferSampleLocationsfvARB; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewNamedFramebufferSampleLocationsfvARB; + +GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB; + +GLEW_FUN_EXPORT PFNGLBINDSAMPLERPROC __glewBindSampler; +GLEW_FUN_EXPORT PFNGLDELETESAMPLERSPROC __glewDeleteSamplers; +GLEW_FUN_EXPORT PFNGLGENSAMPLERSPROC __glewGenSamplers; +GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv; +GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv; +GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv; +GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv; +GLEW_FUN_EXPORT PFNGLISSAMPLERPROC __glewIsSampler; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv; + +GLEW_FUN_EXPORT PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram; +GLEW_FUN_EXPORT PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline; +GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines; +GLEW_FUN_EXPORT PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv; +GLEW_FUN_EXPORT PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv; +GLEW_FUN_EXPORT PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages; +GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline; + +GLEW_FUN_EXPORT PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv; + +GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture; +GLEW_FUN_EXPORT PFNGLMEMORYBARRIERPROC __glewMemoryBarrier; + +GLEW_FUN_EXPORT PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB; +GLEW_FUN_EXPORT PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB; +GLEW_FUN_EXPORT PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB; +GLEW_FUN_EXPORT PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB; +GLEW_FUN_EXPORT PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB; +GLEW_FUN_EXPORT PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB; +GLEW_FUN_EXPORT PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB; +GLEW_FUN_EXPORT PFNGLGETHANDLEARBPROC __glewGetHandleARB; +GLEW_FUN_EXPORT PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB; +GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB; +GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB; +GLEW_FUN_EXPORT PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB; +GLEW_FUN_EXPORT PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1FARBPROC __glewUniform1fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1IARBPROC __glewUniform1iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2FARBPROC __glewUniform2fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2IARBPROC __glewUniform2iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3FARBPROC __glewUniform3fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3IARBPROC __glewUniform3iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4FARBPROC __glewUniform4fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4IARBPROC __glewUniform4iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB; +GLEW_FUN_EXPORT PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB; +GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB; + +GLEW_FUN_EXPORT PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding; + +GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName; +GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName; +GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv; +GLEW_FUN_EXPORT PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv; +GLEW_FUN_EXPORT PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex; +GLEW_FUN_EXPORT PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation; +GLEW_FUN_EXPORT PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv; +GLEW_FUN_EXPORT PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv; + +GLEW_FUN_EXPORT PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB; +GLEW_FUN_EXPORT PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB; +GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB; +GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB; +GLEW_FUN_EXPORT PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB; +GLEW_FUN_EXPORT PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB; + +GLEW_FUN_EXPORT PFNGLBUFFERPAGECOMMITMENTARBPROC __glewBufferPageCommitmentARB; + +GLEW_FUN_EXPORT PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB; + +GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync; +GLEW_FUN_EXPORT PFNGLDELETESYNCPROC __glewDeleteSync; +GLEW_FUN_EXPORT PFNGLFENCESYNCPROC __glewFenceSync; +GLEW_FUN_EXPORT PFNGLGETINTEGER64VPROC __glewGetInteger64v; +GLEW_FUN_EXPORT PFNGLGETSYNCIVPROC __glewGetSynciv; +GLEW_FUN_EXPORT PFNGLISSYNCPROC __glewIsSync; +GLEW_FUN_EXPORT PFNGLWAITSYNCPROC __glewWaitSync; + +GLEW_FUN_EXPORT PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv; +GLEW_FUN_EXPORT PFNGLPATCHPARAMETERIPROC __glewPatchParameteri; + +GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERPROC __glewTextureBarrier; + +GLEW_FUN_EXPORT PFNGLTEXBUFFERARBPROC __glewTexBufferARB; + +GLEW_FUN_EXPORT PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange; +GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT; + +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB; + +GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv; +GLEW_FUN_EXPORT PFNGLSAMPLEMASKIPROC __glewSampleMaski; +GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample; +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample; + +GLEW_FUN_EXPORT PFNGLTEXSTORAGE1DPROC __glewTexStorage1D; +GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DPROC __glewTexStorage2D; +GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DPROC __glewTexStorage3D; + +GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample; +GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT; + +GLEW_FUN_EXPORT PFNGLTEXTUREVIEWPROC __glewTextureView; + +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v; +GLEW_FUN_EXPORT PFNGLQUERYCOUNTERPROC __glewQueryCounter; + +GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback; +GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks; +GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback; +GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks; +GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback; +GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback; +GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed; +GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream; +GLEW_FUN_EXPORT PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed; +GLEW_FUN_EXPORT PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv; + +GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced; +GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced; + +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB; + +GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEPROC __glewBindBufferBase; +GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv; +GLEW_FUN_EXPORT PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v; +GLEW_FUN_EXPORT PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex; +GLEW_FUN_EXPORT PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices; +GLEW_FUN_EXPORT PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding; + +GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays; +GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays; +GLEW_FUN_EXPORT PFNGLISVERTEXARRAYPROC __glewIsVertexArray; + +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer; + +GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __glewVertexArrayBindVertexBufferEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __glewVertexArrayVertexAttribBindingEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __glewVertexArrayVertexAttribFormatEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __glewVertexArrayVertexAttribIFormatEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __glewVertexArrayVertexAttribLFormatEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __glewVertexArrayVertexBindingDivisorEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat; +GLEW_FUN_EXPORT PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor; + +GLEW_FUN_EXPORT PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB; +GLEW_FUN_EXPORT PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB; +GLEW_FUN_EXPORT PFNGLWEIGHTBVARBPROC __glewWeightbvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTDVARBPROC __glewWeightdvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTFVARBPROC __glewWeightfvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTIVARBPROC __glewWeightivARB; +GLEW_FUN_EXPORT PFNGLWEIGHTSVARBPROC __glewWeightsvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUBVARBPROC __glewWeightubvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUIVARBPROC __glewWeightuivARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUSVARBPROC __glewWeightusvARB; + +GLEW_FUN_EXPORT PFNGLBINDBUFFERARBPROC __glewBindBufferARB; +GLEW_FUN_EXPORT PFNGLBUFFERDATAARBPROC __glewBufferDataARB; +GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB; +GLEW_FUN_EXPORT PFNGLGENBUFFERSARBPROC __glewGenBuffersARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB; +GLEW_FUN_EXPORT PFNGLISBUFFERARBPROC __glewIsBufferARB; +GLEW_FUN_EXPORT PFNGLMAPBUFFERARBPROC __glewMapBufferARB; +GLEW_FUN_EXPORT PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB; + +GLEW_FUN_EXPORT PFNGLBINDPROGRAMARBPROC __glewBindProgramARB; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB; +GLEW_FUN_EXPORT PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB; +GLEW_FUN_EXPORT PFNGLISPROGRAMARBPROC __glewIsProgramARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB; + +GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB; +GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB; +GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB; + +GLEW_FUN_EXPORT PFNGLCOLORP3UIPROC __glewColorP3ui; +GLEW_FUN_EXPORT PFNGLCOLORP3UIVPROC __glewColorP3uiv; +GLEW_FUN_EXPORT PFNGLCOLORP4UIPROC __glewColorP4ui; +GLEW_FUN_EXPORT PFNGLCOLORP4UIVPROC __glewColorP4uiv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv; +GLEW_FUN_EXPORT PFNGLNORMALP3UIPROC __glewNormalP3ui; +GLEW_FUN_EXPORT PFNGLNORMALP3UIVPROC __glewNormalP3uiv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv; +GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui; +GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv; +GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui; +GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv; +GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui; +GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv; +GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui; +GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXP2UIPROC __glewVertexP2ui; +GLEW_FUN_EXPORT PFNGLVERTEXP2UIVPROC __glewVertexP2uiv; +GLEW_FUN_EXPORT PFNGLVERTEXP3UIPROC __glewVertexP3ui; +GLEW_FUN_EXPORT PFNGLVERTEXP3UIVPROC __glewVertexP3uiv; +GLEW_FUN_EXPORT PFNGLVERTEXP4UIPROC __glewVertexP4ui; +GLEW_FUN_EXPORT PFNGLVERTEXP4UIVPROC __glewVertexP4uiv; + +GLEW_FUN_EXPORT PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed; +GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v; +GLEW_FUN_EXPORT PFNGLGETFLOATI_VPROC __glewGetFloati_v; +GLEW_FUN_EXPORT PFNGLSCISSORARRAYVPROC __glewScissorArrayv; +GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDPROC __glewScissorIndexed; +GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv; +GLEW_FUN_EXPORT PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv; +GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf; +GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv; + +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI; +GLEW_FUN_EXPORT PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI; + +GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI; +GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI; +GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI; +GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI; + +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI; +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI; +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI; +GLEW_FUN_EXPORT PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI; +GLEW_FUN_EXPORT PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI; +GLEW_FUN_EXPORT PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI; +GLEW_FUN_EXPORT PFNGLSAMPLEMAPATIPROC __glewSampleMapATI; +GLEW_FUN_EXPORT PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI; + +GLEW_FUN_EXPORT PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI; +GLEW_FUN_EXPORT PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI; + +GLEW_FUN_EXPORT PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI; +GLEW_FUN_EXPORT PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI; + +GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI; +GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI; + +GLEW_FUN_EXPORT PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI; +GLEW_FUN_EXPORT PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI; +GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI; +GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI; +GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI; +GLEW_FUN_EXPORT PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI; +GLEW_FUN_EXPORT PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI; +GLEW_FUN_EXPORT PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI; + +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI; + +GLEW_FUN_EXPORT PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI; +GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI; +GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC __glewDrawArraysInstancedBaseInstanceEXT; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseInstanceEXT; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseVertexBaseInstanceEXT; + +GLEW_FUN_EXPORT PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT; +GLEW_FUN_EXPORT PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT; +GLEW_FUN_EXPORT PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT; + +GLEW_FUN_EXPORT PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT; + +GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC __glewBindFragDataLocationIndexedEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXEXTPROC __glewGetFragDataIndexEXT; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC __glewGetProgramResourceLocationIndexEXT; + +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT; + +GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEEXTPROC __glewBufferStorageEXT; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT; + +GLEW_FUN_EXPORT PFNGLCLEARTEXIMAGEEXTPROC __glewClearTexImageEXT; +GLEW_FUN_EXPORT PFNGLCLEARTEXSUBIMAGEEXTPROC __glewClearTexSubImageEXT; + +GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT; +GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT; + +GLEW_FUN_EXPORT PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT; +GLEW_FUN_EXPORT PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT; + +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT; +GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT; + +GLEW_FUN_EXPORT PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT; +GLEW_FUN_EXPORT PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT; + +GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATAEXTPROC __glewCopyImageSubDataEXT; + +GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT; + +GLEW_FUN_EXPORT PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT; +GLEW_FUN_EXPORT PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT; + +GLEW_FUN_EXPORT PFNGLGETOBJECTLABELEXTPROC __glewGetObjectLabelEXT; +GLEW_FUN_EXPORT PFNGLLABELOBJECTEXTPROC __glewLabelObjectEXT; + +GLEW_FUN_EXPORT PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT; +GLEW_FUN_EXPORT PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT; +GLEW_FUN_EXPORT PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT; + +GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT; + +GLEW_FUN_EXPORT PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT; +GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT; +GLEW_FUN_EXPORT PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT; +GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT; +GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT; +GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT; +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT; +GLEW_FUN_EXPORT PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT; +GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT; +GLEW_FUN_EXPORT PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT; +GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT; +GLEW_FUN_EXPORT PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT; +GLEW_FUN_EXPORT PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT; +GLEW_FUN_EXPORT PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT; +GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT; +GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT; +GLEW_FUN_EXPORT PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT; +GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT; +GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT; +GLEW_FUN_EXPORT PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT; +GLEW_FUN_EXPORT PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT; +GLEW_FUN_EXPORT PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT; +GLEW_FUN_EXPORT PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT; +GLEW_FUN_EXPORT PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT; +GLEW_FUN_EXPORT PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT; +GLEW_FUN_EXPORT PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT; +GLEW_FUN_EXPORT PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT; +GLEW_FUN_EXPORT PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT; +GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT; +GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT; +GLEW_FUN_EXPORT PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT; +GLEW_FUN_EXPORT PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT; +GLEW_FUN_EXPORT PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __glewVertexArrayVertexAttribDivisorEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT; + +GLEW_FUN_EXPORT PFNGLDISCARDFRAMEBUFFEREXTPROC __glewDiscardFramebufferEXT; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSEXTPROC __glewDrawBuffersEXT; + +GLEW_FUN_EXPORT PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT; +GLEW_FUN_EXPORT PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT; +GLEW_FUN_EXPORT PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT; +GLEW_FUN_EXPORT PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT; +GLEW_FUN_EXPORT PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT; +GLEW_FUN_EXPORT PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIEXTPROC __glewBlendEquationSeparateiEXT; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIEXTPROC __glewBlendEquationiEXT; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIEXTPROC __glewBlendFuncSeparateiEXT; +GLEW_FUN_EXPORT PFNGLBLENDFUNCIEXTPROC __glewBlendFunciEXT; +GLEW_FUN_EXPORT PFNGLCOLORMASKIEXTPROC __glewColorMaskiEXT; +GLEW_FUN_EXPORT PFNGLDISABLEIEXTPROC __glewDisableiEXT; +GLEW_FUN_EXPORT PFNGLENABLEIEXTPROC __glewEnableiEXT; +GLEW_FUN_EXPORT PFNGLISENABLEDIEXTPROC __glewIsEnablediEXT; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXEXTPROC __glewDrawElementsBaseVertexEXT; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC __glewDrawElementsInstancedBaseVertexEXT; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC __glewDrawRangeElementsBaseVertexEXT; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC __glewMultiDrawElementsBaseVertexEXT; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT; + +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT; + +GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEEXTERNALEXTPROC __glewBufferStorageExternalEXT; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC __glewNamedBufferStorageExternalEXT; + +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT; + +GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT; +GLEW_FUN_EXPORT PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT; + +GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT; + +GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT; +GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT; +GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT; +GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT; +GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT; +GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT; +GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT; +GLEW_FUN_EXPORT PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT; + +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT; + +GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT; +GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT; + +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT; +GLEW_FUN_EXPORT PFNGLHISTOGRAMEXTPROC __glewHistogramEXT; +GLEW_FUN_EXPORT PFNGLMINMAXEXTPROC __glewMinmaxEXT; +GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT; +GLEW_FUN_EXPORT PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT; + +GLEW_FUN_EXPORT PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT; + +GLEW_FUN_EXPORT PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT; + +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISOREXTPROC __glewVertexAttribDivisorEXT; + +GLEW_FUN_EXPORT PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT; +GLEW_FUN_EXPORT PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT; + +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC __glewFlushMappedBufferRangeEXT; +GLEW_FUN_EXPORT PFNGLMAPBUFFERRANGEEXTPROC __glewMapBufferRangeEXT; + +GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEMEMEXTPROC __glewBufferStorageMemEXT; +GLEW_FUN_EXPORT PFNGLCREATEMEMORYOBJECTSEXTPROC __glewCreateMemoryObjectsEXT; +GLEW_FUN_EXPORT PFNGLDELETEMEMORYOBJECTSEXTPROC __glewDeleteMemoryObjectsEXT; +GLEW_FUN_EXPORT PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC __glewGetMemoryObjectParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETUNSIGNEDBYTEI_VEXTPROC __glewGetUnsignedBytei_vEXT; +GLEW_FUN_EXPORT PFNGLGETUNSIGNEDBYTEVEXTPROC __glewGetUnsignedBytevEXT; +GLEW_FUN_EXPORT PFNGLISMEMORYOBJECTEXTPROC __glewIsMemoryObjectEXT; +GLEW_FUN_EXPORT PFNGLMEMORYOBJECTPARAMETERIVEXTPROC __glewMemoryObjectParameterivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC __glewNamedBufferStorageMemEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM1DEXTPROC __glewTexStorageMem1DEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM2DEXTPROC __glewTexStorageMem2DEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC __glewTexStorageMem2DMultisampleEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM3DEXTPROC __glewTexStorageMem3DEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC __glewTexStorageMem3DMultisampleEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM1DEXTPROC __glewTextureStorageMem1DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM2DEXTPROC __glewTextureStorageMem2DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC __glewTextureStorageMem2DMultisampleEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM3DEXTPROC __glewTextureStorageMem3DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC __glewTextureStorageMem3DMultisampleEXT; + +GLEW_FUN_EXPORT PFNGLIMPORTMEMORYFDEXTPROC __glewImportMemoryFdEXT; + +GLEW_FUN_EXPORT PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC __glewImportMemoryWin32HandleEXT; +GLEW_FUN_EXPORT PFNGLIMPORTMEMORYWIN32NAMEEXTPROC __glewImportMemoryWin32NameEXT; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC __glewMultiDrawArraysIndirectEXT; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC __glewMultiDrawElementsIndirectEXT; + +GLEW_FUN_EXPORT PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT; +GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC __glewFramebufferTexture2DMultisampleEXT; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSINDEXEDEXTPROC __glewDrawBuffersIndexedEXT; +GLEW_FUN_EXPORT PFNGLGETINTEGERI_VEXTPROC __glewGetIntegeri_vEXT; +GLEW_FUN_EXPORT PFNGLREADBUFFERINDEXEDEXTPROC __glewReadBufferIndexedEXT; + +GLEW_FUN_EXPORT PFNGLCOLORTABLEEXTPROC __glewColorTableEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT; + +GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT; + +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT; + +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETCLAMPEXTPROC __glewPolygonOffsetClampEXT; + +GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT; + +GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONNVPROC __glewCoverageModulationNV; +GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONTABLENVPROC __glewCoverageModulationTableNV; +GLEW_FUN_EXPORT PFNGLGETCOVERAGEMODULATIONTABLENVPROC __glewGetCoverageModulationTableNV; +GLEW_FUN_EXPORT PFNGLRASTERSAMPLESEXTPROC __glewRasterSamplesEXT; + +GLEW_FUN_EXPORT PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT; +GLEW_FUN_EXPORT PFNGLENDSCENEEXTPROC __glewEndSceneEXT; + +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT; + +GLEW_FUN_EXPORT PFNGLDELETESEMAPHORESEXTPROC __glewDeleteSemaphoresEXT; +GLEW_FUN_EXPORT PFNGLGENSEMAPHORESEXTPROC __glewGenSemaphoresEXT; +GLEW_FUN_EXPORT PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC __glewGetSemaphoreParameterui64vEXT; +GLEW_FUN_EXPORT PFNGLISSEMAPHOREEXTPROC __glewIsSemaphoreEXT; +GLEW_FUN_EXPORT PFNGLSEMAPHOREPARAMETERUI64VEXTPROC __glewSemaphoreParameterui64vEXT; +GLEW_FUN_EXPORT PFNGLSIGNALSEMAPHOREEXTPROC __glewSignalSemaphoreEXT; +GLEW_FUN_EXPORT PFNGLWAITSEMAPHOREEXTPROC __glewWaitSemaphoreEXT; + +GLEW_FUN_EXPORT PFNGLIMPORTSEMAPHOREFDEXTPROC __glewImportSemaphoreFdEXT; + +GLEW_FUN_EXPORT PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC __glewImportSemaphoreWin32HandleEXT; +GLEW_FUN_EXPORT PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC __glewImportSemaphoreWin32NameEXT; + +GLEW_FUN_EXPORT PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT; +GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT; +GLEW_FUN_EXPORT PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT; + +GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT; +GLEW_FUN_EXPORT PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT; + +GLEW_FUN_EXPORT PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC __glewClearPixelLocalStorageuiEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewFramebufferPixelLocalStorageSizeEXT; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewGetFramebufferPixelLocalStorageSizeEXT; + +GLEW_FUN_EXPORT PFNGLTEXPAGECOMMITMENTEXTPROC __glewTexPageCommitmentEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT; + +GLEW_FUN_EXPORT PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT; + +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT; + +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT; + +GLEW_FUN_EXPORT PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT; + +GLEW_FUN_EXPORT PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT; +GLEW_FUN_EXPORT PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT; + +GLEW_FUN_EXPORT PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT; +GLEW_FUN_EXPORT PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT; +GLEW_FUN_EXPORT PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT; +GLEW_FUN_EXPORT PFNGLISTEXTUREEXTPROC __glewIsTextureEXT; +GLEW_FUN_EXPORT PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT; + +GLEW_FUN_EXPORT PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT; + +GLEW_FUN_EXPORT PFNGLTEXSTORAGE1DEXTPROC __glewTexStorage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DEXTPROC __glewTexStorage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DEXTPROC __glewTexStorage3DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT; + +GLEW_FUN_EXPORT PFNGLTEXTUREVIEWEXTPROC __glewTextureViewEXT; + +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT; + +GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT; +GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT; +GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT; +GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT; +GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT; + +GLEW_FUN_EXPORT PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT; +GLEW_FUN_EXPORT PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT; +GLEW_FUN_EXPORT PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT; +GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT; +GLEW_FUN_EXPORT PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT; +GLEW_FUN_EXPORT PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT; + +GLEW_FUN_EXPORT PFNGLBINDARRAYSETEXTPROC __glewBindArraySetEXT; +GLEW_FUN_EXPORT PFNGLCREATEARRAYSETEXTPROC __glewCreateArraySetExt; +GLEW_FUN_EXPORT PFNGLDELETEARRAYSETSEXTPROC __glewDeleteArraySetsEXT; + +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT; + +GLEW_FUN_EXPORT PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT; +GLEW_FUN_EXPORT PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT; +GLEW_FUN_EXPORT PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT; +GLEW_FUN_EXPORT PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT; +GLEW_FUN_EXPORT PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT; +GLEW_FUN_EXPORT PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT; +GLEW_FUN_EXPORT PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT; +GLEW_FUN_EXPORT PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT; +GLEW_FUN_EXPORT PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT; +GLEW_FUN_EXPORT PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT; +GLEW_FUN_EXPORT PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT; +GLEW_FUN_EXPORT PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT; +GLEW_FUN_EXPORT PFNGLSWIZZLEEXTPROC __glewSwizzleEXT; +GLEW_FUN_EXPORT PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT; +GLEW_FUN_EXPORT PFNGLVARIANTBVEXTPROC __glewVariantbvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTDVEXTPROC __glewVariantdvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTFVEXTPROC __glewVariantfvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTIVEXTPROC __glewVariantivEXT; +GLEW_FUN_EXPORT PFNGLVARIANTSVEXTPROC __glewVariantsvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT; +GLEW_FUN_EXPORT PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT; + +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT; + +GLEW_FUN_EXPORT PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC __glewAcquireKeyedMutexWin32EXT; +GLEW_FUN_EXPORT PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC __glewReleaseKeyedMutexWin32EXT; + +GLEW_FUN_EXPORT PFNGLWINDOWRECTANGLESEXTPROC __glewWindowRectanglesEXT; + +GLEW_FUN_EXPORT PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT; + +GLEW_FUN_EXPORT PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY; + +GLEW_FUN_EXPORT PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY; + +GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP; +GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP; + +GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM; +GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM; + +GLEW_FUN_EXPORT PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM; +GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM; +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM; +GLEW_FUN_EXPORT PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM; +GLEW_FUN_EXPORT PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM; + +GLEW_FUN_EXPORT PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL; +GLEW_FUN_EXPORT PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL; +GLEW_FUN_EXPORT PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL; + +GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL; +GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL; + +GLEW_FUN_EXPORT PFNGLBEGINPERFQUERYINTELPROC __glewBeginPerfQueryINTEL; +GLEW_FUN_EXPORT PFNGLCREATEPERFQUERYINTELPROC __glewCreatePerfQueryINTEL; +GLEW_FUN_EXPORT PFNGLDELETEPERFQUERYINTELPROC __glewDeletePerfQueryINTEL; +GLEW_FUN_EXPORT PFNGLENDPERFQUERYINTELPROC __glewEndPerfQueryINTEL; +GLEW_FUN_EXPORT PFNGLGETFIRSTPERFQUERYIDINTELPROC __glewGetFirstPerfQueryIdINTEL; +GLEW_FUN_EXPORT PFNGLGETNEXTPERFQUERYIDINTELPROC __glewGetNextPerfQueryIdINTEL; +GLEW_FUN_EXPORT PFNGLGETPERFCOUNTERINFOINTELPROC __glewGetPerfCounterInfoINTEL; +GLEW_FUN_EXPORT PFNGLGETPERFQUERYDATAINTELPROC __glewGetPerfQueryDataINTEL; +GLEW_FUN_EXPORT PFNGLGETPERFQUERYIDBYNAMEINTELPROC __glewGetPerfQueryIdByNameINTEL; +GLEW_FUN_EXPORT PFNGLGETPERFQUERYINFOINTELPROC __glewGetPerfQueryInfoINTEL; + +GLEW_FUN_EXPORT PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL; +GLEW_FUN_EXPORT PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL; + +GLEW_FUN_EXPORT PFNGLBLENDBARRIERKHRPROC __glewBlendBarrierKHR; + +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert; +GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog; +GLEW_FUN_EXPORT PFNGLGETOBJECTLABELPROC __glewGetObjectLabel; +GLEW_FUN_EXPORT PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel; +GLEW_FUN_EXPORT PFNGLOBJECTLABELPROC __glewObjectLabel; +GLEW_FUN_EXPORT PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel; +GLEW_FUN_EXPORT PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup; +GLEW_FUN_EXPORT PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup; + +GLEW_FUN_EXPORT PFNGLMAXSHADERCOMPILERTHREADSKHRPROC __glewMaxShaderCompilerThreadsKHR; + +GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVPROC __glewGetnUniformfv; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVPROC __glewGetnUniformiv; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVPROC __glewGetnUniformuiv; +GLEW_FUN_EXPORT PFNGLREADNPIXELSPROC __glewReadnPixels; + +GLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion; +GLEW_FUN_EXPORT PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion; +GLEW_FUN_EXPORT PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion; +GLEW_FUN_EXPORT PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion; + +GLEW_FUN_EXPORT PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA; + +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA; + +GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX; +GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX; + +GLEW_FUN_EXPORT PFNGLLGPUCOPYIMAGESUBDATANVXPROC __glewLGPUCopyImageSubDataNVX; +GLEW_FUN_EXPORT PFNGLLGPUINTERLOCKNVXPROC __glewLGPUInterlockNVX; +GLEW_FUN_EXPORT PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC __glewLGPUNamedBufferSubDataNVX; + +GLEW_FUN_EXPORT PFNGLSTEREOPARAMETERFNVPROC __glewStereoParameterfNV; +GLEW_FUN_EXPORT PFNGLSTEREOPARAMETERINVPROC __glewStereoParameteriNV; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawArraysIndirectBindlessCountNV; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawElementsIndirectBindlessCountNV; + +GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV; +GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV; +GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV; +GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV; +GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV; + +GLEW_FUN_EXPORT PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV; +GLEW_FUN_EXPORT PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV; + +GLEW_FUN_EXPORT PFNGLVIEWPORTPOSITIONWSCALENVPROC __glewViewportPositionWScaleNV; + +GLEW_FUN_EXPORT PFNGLCALLCOMMANDLISTNVPROC __glewCallCommandListNV; +GLEW_FUN_EXPORT PFNGLCOMMANDLISTSEGMENTSNVPROC __glewCommandListSegmentsNV; +GLEW_FUN_EXPORT PFNGLCOMPILECOMMANDLISTNVPROC __glewCompileCommandListNV; +GLEW_FUN_EXPORT PFNGLCREATECOMMANDLISTSNVPROC __glewCreateCommandListsNV; +GLEW_FUN_EXPORT PFNGLCREATESTATESNVPROC __glewCreateStatesNV; +GLEW_FUN_EXPORT PFNGLDELETECOMMANDLISTSNVPROC __glewDeleteCommandListsNV; +GLEW_FUN_EXPORT PFNGLDELETESTATESNVPROC __glewDeleteStatesNV; +GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSADDRESSNVPROC __glewDrawCommandsAddressNV; +GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSNVPROC __glewDrawCommandsNV; +GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC __glewDrawCommandsStatesAddressNV; +GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSSTATESNVPROC __glewDrawCommandsStatesNV; +GLEW_FUN_EXPORT PFNGLGETCOMMANDHEADERNVPROC __glewGetCommandHeaderNV; +GLEW_FUN_EXPORT PFNGLGETSTAGEINDEXNVPROC __glewGetStageIndexNV; +GLEW_FUN_EXPORT PFNGLISCOMMANDLISTNVPROC __glewIsCommandListNV; +GLEW_FUN_EXPORT PFNGLISSTATENVPROC __glewIsStateNV; +GLEW_FUN_EXPORT PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC __glewListDrawCommandsStatesClientNV; +GLEW_FUN_EXPORT PFNGLSTATECAPTURENVPROC __glewStateCaptureNV; + +GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV; +GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV; + +GLEW_FUN_EXPORT PFNGLSUBPIXELPRECISIONBIASNVPROC __glewSubpixelPrecisionBiasNV; + +GLEW_FUN_EXPORT PFNGLCONSERVATIVERASTERPARAMETERFNVPROC __glewConservativeRasterParameterfNV; + +GLEW_FUN_EXPORT PFNGLCONSERVATIVERASTERPARAMETERINVPROC __glewConservativeRasterParameteriNV; + +GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATANVPROC __glewCopyBufferSubDataNV; + +GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV; + +GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV; +GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSNVPROC __glewDrawBuffersNV; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDNVPROC __glewDrawArraysInstancedNV; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDNVPROC __glewDrawElementsInstancedNV; + +GLEW_FUN_EXPORT PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV; + +GLEW_FUN_EXPORT PFNGLDRAWVKIMAGENVPROC __glewDrawVkImageNV; +GLEW_FUN_EXPORT PFNGLGETVKPROCADDRNVPROC __glewGetVkProcAddrNV; +GLEW_FUN_EXPORT PFNGLSIGNALVKFENCENVPROC __glewSignalVkFenceNV; +GLEW_FUN_EXPORT PFNGLSIGNALVKSEMAPHORENVPROC __glewSignalVkSemaphoreNV; +GLEW_FUN_EXPORT PFNGLWAITVKSEMAPHORENVPROC __glewWaitVkSemaphoreNV; + +GLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV; +GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV; +GLEW_FUN_EXPORT PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV; +GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV; +GLEW_FUN_EXPORT PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV; +GLEW_FUN_EXPORT PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV; +GLEW_FUN_EXPORT PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV; + +GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV; +GLEW_FUN_EXPORT PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV; +GLEW_FUN_EXPORT PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV; + +GLEW_FUN_EXPORT PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV; +GLEW_FUN_EXPORT PFNGLFINISHFENCENVPROC __glewFinishFenceNV; +GLEW_FUN_EXPORT PFNGLGENFENCESNVPROC __glewGenFencesNV; +GLEW_FUN_EXPORT PFNGLGETFENCEIVNVPROC __glewGetFenceivNV; +GLEW_FUN_EXPORT PFNGLISFENCENVPROC __glewIsFenceNV; +GLEW_FUN_EXPORT PFNGLSETFENCENVPROC __glewSetFenceNV; +GLEW_FUN_EXPORT PFNGLTESTFENCENVPROC __glewTestFenceNV; + +GLEW_FUN_EXPORT PFNGLFRAGMENTCOVERAGECOLORNVPROC __glewFragmentCoverageColorNV; + +GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV; + +GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERNVPROC __glewBlitFramebufferNV; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC __glewRenderbufferStorageMultisampleNV; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV; + +GLEW_FUN_EXPORT PFNGLMULTICASTBARRIERNVPROC __glewMulticastBarrierNV; +GLEW_FUN_EXPORT PFNGLMULTICASTBLITFRAMEBUFFERNVPROC __glewMulticastBlitFramebufferNV; +GLEW_FUN_EXPORT PFNGLMULTICASTBUFFERSUBDATANVPROC __glewMulticastBufferSubDataNV; +GLEW_FUN_EXPORT PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC __glewMulticastCopyBufferSubDataNV; +GLEW_FUN_EXPORT PFNGLMULTICASTCOPYIMAGESUBDATANVPROC __glewMulticastCopyImageSubDataNV; +GLEW_FUN_EXPORT PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewMulticastFramebufferSampleLocationsfvNV; +GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC __glewMulticastGetQueryObjecti64vNV; +GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTIVNVPROC __glewMulticastGetQueryObjectivNV; +GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC __glewMulticastGetQueryObjectui64vNV; +GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC __glewMulticastGetQueryObjectuivNV; +GLEW_FUN_EXPORT PFNGLMULTICASTWAITSYNCNVPROC __glewMulticastWaitSyncNV; +GLEW_FUN_EXPORT PFNGLRENDERGPUMASKNVPROC __glewRenderGpuMaskNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV; + +GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV; +GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV; + +GLEW_FUN_EXPORT PFNGLCOLOR3HNVPROC __glewColor3hNV; +GLEW_FUN_EXPORT PFNGLCOLOR3HVNVPROC __glewColor3hvNV; +GLEW_FUN_EXPORT PFNGLCOLOR4HNVPROC __glewColor4hNV; +GLEW_FUN_EXPORT PFNGLCOLOR4HVNVPROC __glewColor4hvNV; +GLEW_FUN_EXPORT PFNGLFOGCOORDHNVPROC __glewFogCoordhNV; +GLEW_FUN_EXPORT PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV; +GLEW_FUN_EXPORT PFNGLNORMAL3HNVPROC __glewNormal3hNV; +GLEW_FUN_EXPORT PFNGLNORMAL3HVNVPROC __glewNormal3hvNV; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX2HNVPROC __glewVertex2hNV; +GLEW_FUN_EXPORT PFNGLVERTEX2HVNVPROC __glewVertex2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX3HNVPROC __glewVertex3hNV; +GLEW_FUN_EXPORT PFNGLVERTEX3HVNVPROC __glewVertex3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX4HNVPROC __glewVertex4hNV; +GLEW_FUN_EXPORT PFNGLVERTEX4HVNVPROC __glewVertex4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV; + +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORNVPROC __glewVertexAttribDivisorNV; + +GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATSAMPLEIVNVPROC __glewGetInternalformatSampleivNV; + +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVNVPROC __glewUniformMatrix2x3fvNV; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVNVPROC __glewUniformMatrix2x4fvNV; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVNVPROC __glewUniformMatrix3x2fvNV; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVNVPROC __glewUniformMatrix3x4fvNV; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVNVPROC __glewUniformMatrix4x2fvNV; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVNVPROC __glewUniformMatrix4x3fvNV; + +GLEW_FUN_EXPORT PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV; +GLEW_FUN_EXPORT PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV; +GLEW_FUN_EXPORT PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV; +GLEW_FUN_EXPORT PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV; +GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV; +GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV; +GLEW_FUN_EXPORT PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV; + +GLEW_FUN_EXPORT PFNGLCOPYPATHNVPROC __glewCopyPathNV; +GLEW_FUN_EXPORT PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV; +GLEW_FUN_EXPORT PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV; +GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV; +GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV; +GLEW_FUN_EXPORT PFNGLDELETEPATHSNVPROC __glewDeletePathsNV; +GLEW_FUN_EXPORT PFNGLGENPATHSNVPROC __glewGenPathsNV; +GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV; +GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV; +GLEW_FUN_EXPORT PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV; +GLEW_FUN_EXPORT PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV; +GLEW_FUN_EXPORT PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV; +GLEW_FUN_EXPORT PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV; +GLEW_FUN_EXPORT PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV; +GLEW_FUN_EXPORT PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV; +GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV; +GLEW_FUN_EXPORT PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV; +GLEW_FUN_EXPORT PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV; +GLEW_FUN_EXPORT PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEFVNVPROC __glewGetProgramResourcefvNV; +GLEW_FUN_EXPORT PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV; +GLEW_FUN_EXPORT PFNGLISPATHNVPROC __glewIsPathNV; +GLEW_FUN_EXPORT PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV; +GLEW_FUN_EXPORT PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV; +GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X2FNVPROC __glewMatrixLoad3x2fNV; +GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X3FNVPROC __glewMatrixLoad3x3fNV; +GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC __glewMatrixLoadTranspose3x3fNV; +GLEW_FUN_EXPORT PFNGLMATRIXMULT3X2FNVPROC __glewMatrixMult3x2fNV; +GLEW_FUN_EXPORT PFNGLMATRIXMULT3X3FNVPROC __glewMatrixMult3x3fNV; +GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC __glewMatrixMultTranspose3x3fNV; +GLEW_FUN_EXPORT PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV; +GLEW_FUN_EXPORT PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV; +GLEW_FUN_EXPORT PFNGLPATHCOORDSNVPROC __glewPathCoordsNV; +GLEW_FUN_EXPORT PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV; +GLEW_FUN_EXPORT PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV; +GLEW_FUN_EXPORT PFNGLPATHFOGGENNVPROC __glewPathFogGenNV; +GLEW_FUN_EXPORT PFNGLPATHGLYPHINDEXARRAYNVPROC __glewPathGlyphIndexArrayNV; +GLEW_FUN_EXPORT PFNGLPATHGLYPHINDEXRANGENVPROC __glewPathGlyphIndexRangeNV; +GLEW_FUN_EXPORT PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV; +GLEW_FUN_EXPORT PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV; +GLEW_FUN_EXPORT PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC __glewPathMemoryGlyphIndexArrayNV; +GLEW_FUN_EXPORT PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV; +GLEW_FUN_EXPORT PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV; +GLEW_FUN_EXPORT PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV; +GLEW_FUN_EXPORT PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV; +GLEW_FUN_EXPORT PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV; +GLEW_FUN_EXPORT PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV; +GLEW_FUN_EXPORT PFNGLPATHSTRINGNVPROC __glewPathStringNV; +GLEW_FUN_EXPORT PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV; +GLEW_FUN_EXPORT PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV; +GLEW_FUN_EXPORT PFNGLPATHTEXGENNVPROC __glewPathTexGenNV; +GLEW_FUN_EXPORT PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __glewProgramPathFragmentInputGenNV; +GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV; +GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV; +GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV; +GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV; +GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __glewStencilThenCoverFillPathInstancedNV; +GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHNVPROC __glewStencilThenCoverFillPathNV; +GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __glewStencilThenCoverStrokePathInstancedNV; +GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC __glewStencilThenCoverStrokePathNV; +GLEW_FUN_EXPORT PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV; +GLEW_FUN_EXPORT PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV; + +GLEW_FUN_EXPORT PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV; +GLEW_FUN_EXPORT PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV; + +GLEW_FUN_EXPORT PFNGLPOLYGONMODENVPROC __glewPolygonModeNV; + +GLEW_FUN_EXPORT PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV; +GLEW_FUN_EXPORT PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV; +GLEW_FUN_EXPORT PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV; + +GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV; +GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV; + +GLEW_FUN_EXPORT PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV; +GLEW_FUN_EXPORT PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV; +GLEW_FUN_EXPORT PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV; +GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV; + +GLEW_FUN_EXPORT PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewFramebufferSampleLocationsfvNV; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewNamedFramebufferSampleLocationsfvNV; + +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV; +GLEW_FUN_EXPORT PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV; +GLEW_FUN_EXPORT PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV; +GLEW_FUN_EXPORT PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV; +GLEW_FUN_EXPORT PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV; +GLEW_FUN_EXPORT PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV; +GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV; +GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORMUI64NVPROC __glewUniformui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV; + +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DNVPROC __glewCompressedTexImage3DNV; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC __glewCompressedTexSubImage3DNV; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DNVPROC __glewCopyTexSubImage3DNV; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERNVPROC __glewFramebufferTextureLayerNV; +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DNVPROC __glewTexImage3DNV; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DNVPROC __glewTexSubImage3DNV; + +GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV; + +GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV; +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV; + +GLEW_FUN_EXPORT PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV; +GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV; +GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV; +GLEW_FUN_EXPORT PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV; + +GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV; +GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV; +GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV; + +GLEW_FUN_EXPORT PFNGLVDPAUFININVPROC __glewVDPAUFiniNV; +GLEW_FUN_EXPORT PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV; +GLEW_FUN_EXPORT PFNGLVDPAUINITNVPROC __glewVDPAUInitNV; +GLEW_FUN_EXPORT PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV; +GLEW_FUN_EXPORT PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV; +GLEW_FUN_EXPORT PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV; +GLEW_FUN_EXPORT PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV; +GLEW_FUN_EXPORT PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV; +GLEW_FUN_EXPORT PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV; +GLEW_FUN_EXPORT PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV; + +GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV; + +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV; + +GLEW_FUN_EXPORT PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV; +GLEW_FUN_EXPORT PFNGLCOLORFORMATNVPROC __glewColorFormatNV; +GLEW_FUN_EXPORT PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV; +GLEW_FUN_EXPORT PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV; +GLEW_FUN_EXPORT PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV; +GLEW_FUN_EXPORT PFNGLINDEXFORMATNVPROC __glewIndexFormatNV; +GLEW_FUN_EXPORT PFNGLNORMALFORMATNVPROC __glewNormalFormatNV; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV; +GLEW_FUN_EXPORT PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV; +GLEW_FUN_EXPORT PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV; + +GLEW_FUN_EXPORT PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV; +GLEW_FUN_EXPORT PFNGLBINDPROGRAMNVPROC __glewBindProgramNV; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV; +GLEW_FUN_EXPORT PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV; +GLEW_FUN_EXPORT PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV; +GLEW_FUN_EXPORT PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV; +GLEW_FUN_EXPORT PFNGLISPROGRAMNVPROC __glewIsProgramNV; +GLEW_FUN_EXPORT PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV; +GLEW_FUN_EXPORT PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV; +GLEW_FUN_EXPORT PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV; + +GLEW_FUN_EXPORT PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV; +GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV; +GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV; +GLEW_FUN_EXPORT PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV; +GLEW_FUN_EXPORT PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV; +GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV; +GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV; +GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV; + +GLEW_FUN_EXPORT PFNGLDEPTHRANGEARRAYFVNVPROC __glewDepthRangeArrayfvNV; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEINDEXEDFNVPROC __glewDepthRangeIndexedfNV; +GLEW_FUN_EXPORT PFNGLDISABLEINVPROC __glewDisableiNV; +GLEW_FUN_EXPORT PFNGLENABLEINVPROC __glewEnableiNV; +GLEW_FUN_EXPORT PFNGLGETFLOATI_VNVPROC __glewGetFloati_vNV; +GLEW_FUN_EXPORT PFNGLISENABLEDINVPROC __glewIsEnablediNV; +GLEW_FUN_EXPORT PFNGLSCISSORARRAYVNVPROC __glewScissorArrayvNV; +GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDNVPROC __glewScissorIndexedNV; +GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDVNVPROC __glewScissorIndexedvNV; +GLEW_FUN_EXPORT PFNGLVIEWPORTARRAYVNVPROC __glewViewportArrayvNV; +GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFNVPROC __glewViewportIndexedfNV; +GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFVNVPROC __glewViewportIndexedfvNV; + +GLEW_FUN_EXPORT PFNGLVIEWPORTSWIZZLENVPROC __glewViewportSwizzleNV; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewFramebufferTextureMultiviewOVR; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC __glewFramebufferTextureMultisampleMultiviewOVR; + +GLEW_FUN_EXPORT PFNGLALPHAFUNCQCOMPROC __glewAlphaFuncQCOM; + +GLEW_FUN_EXPORT PFNGLDISABLEDRIVERCONTROLQCOMPROC __glewDisableDriverControlQCOM; +GLEW_FUN_EXPORT PFNGLENABLEDRIVERCONTROLQCOMPROC __glewEnableDriverControlQCOM; +GLEW_FUN_EXPORT PFNGLGETDRIVERCONTROLSTRINGQCOMPROC __glewGetDriverControlStringQCOM; +GLEW_FUN_EXPORT PFNGLGETDRIVERCONTROLSQCOMPROC __glewGetDriverControlsQCOM; + +GLEW_FUN_EXPORT PFNGLEXTGETBUFFERPOINTERVQCOMPROC __glewExtGetBufferPointervQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETBUFFERSQCOMPROC __glewExtGetBuffersQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETFRAMEBUFFERSQCOMPROC __glewExtGetFramebuffersQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETRENDERBUFFERSQCOMPROC __glewExtGetRenderbuffersQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC __glewExtGetTexLevelParameterivQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETTEXSUBIMAGEQCOMPROC __glewExtGetTexSubImageQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETTEXTURESQCOMPROC __glewExtGetTexturesQCOM; +GLEW_FUN_EXPORT PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC __glewExtTexObjectStateOverrideiQCOM; + +GLEW_FUN_EXPORT PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC __glewExtGetProgramBinarySourceQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETPROGRAMSQCOMPROC __glewExtGetProgramsQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETSHADERSQCOMPROC __glewExtGetShadersQCOM; +GLEW_FUN_EXPORT PFNGLEXTISPROGRAMBINARYQCOMPROC __glewExtIsProgramBinaryQCOM; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC __glewFramebufferFoveationConfigQCOM; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC __glewFramebufferFoveationParametersQCOM; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC __glewFramebufferFetchBarrierQCOM; + +GLEW_FUN_EXPORT PFNGLENDTILINGQCOMPROC __glewEndTilingQCOM; +GLEW_FUN_EXPORT PFNGLSTARTTILINGQCOMPROC __glewStartTilingQCOM; + +GLEW_FUN_EXPORT PFNGLALPHAFUNCXPROC __glewAlphaFuncx; +GLEW_FUN_EXPORT PFNGLCLEARCOLORXPROC __glewClearColorx; +GLEW_FUN_EXPORT PFNGLCLEARDEPTHXPROC __glewClearDepthx; +GLEW_FUN_EXPORT PFNGLCOLOR4XPROC __glewColor4x; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEXPROC __glewDepthRangex; +GLEW_FUN_EXPORT PFNGLFOGXPROC __glewFogx; +GLEW_FUN_EXPORT PFNGLFOGXVPROC __glewFogxv; +GLEW_FUN_EXPORT PFNGLFRUSTUMFPROC __glewFrustumf; +GLEW_FUN_EXPORT PFNGLFRUSTUMXPROC __glewFrustumx; +GLEW_FUN_EXPORT PFNGLLIGHTMODELXPROC __glewLightModelx; +GLEW_FUN_EXPORT PFNGLLIGHTMODELXVPROC __glewLightModelxv; +GLEW_FUN_EXPORT PFNGLLIGHTXPROC __glewLightx; +GLEW_FUN_EXPORT PFNGLLIGHTXVPROC __glewLightxv; +GLEW_FUN_EXPORT PFNGLLINEWIDTHXPROC __glewLineWidthx; +GLEW_FUN_EXPORT PFNGLLOADMATRIXXPROC __glewLoadMatrixx; +GLEW_FUN_EXPORT PFNGLMATERIALXPROC __glewMaterialx; +GLEW_FUN_EXPORT PFNGLMATERIALXVPROC __glewMaterialxv; +GLEW_FUN_EXPORT PFNGLMULTMATRIXXPROC __glewMultMatrixx; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x; +GLEW_FUN_EXPORT PFNGLNORMAL3XPROC __glewNormal3x; +GLEW_FUN_EXPORT PFNGLORTHOFPROC __glewOrthof; +GLEW_FUN_EXPORT PFNGLORTHOXPROC __glewOrthox; +GLEW_FUN_EXPORT PFNGLPOINTSIZEXPROC __glewPointSizex; +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx; +GLEW_FUN_EXPORT PFNGLROTATEXPROC __glewRotatex; +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex; +GLEW_FUN_EXPORT PFNGLSCALEXPROC __glewScalex; +GLEW_FUN_EXPORT PFNGLTEXENVXPROC __glewTexEnvx; +GLEW_FUN_EXPORT PFNGLTEXENVXVPROC __glewTexEnvxv; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERXPROC __glewTexParameterx; +GLEW_FUN_EXPORT PFNGLTRANSLATEXPROC __glewTranslatex; + +GLEW_FUN_EXPORT PFNGLCLIPPLANEFPROC __glewClipPlanef; +GLEW_FUN_EXPORT PFNGLCLIPPLANEXPROC __glewClipPlanex; +GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef; +GLEW_FUN_EXPORT PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex; +GLEW_FUN_EXPORT PFNGLGETFIXEDVPROC __glewGetFixedv; +GLEW_FUN_EXPORT PFNGLGETLIGHTXVPROC __glewGetLightxv; +GLEW_FUN_EXPORT PFNGLGETMATERIALXVPROC __glewGetMaterialxv; +GLEW_FUN_EXPORT PFNGLGETTEXENVXVPROC __glewGetTexEnvxv; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXPROC __glewPointParameterx; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv; +GLEW_FUN_EXPORT PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERXVPROC __glewTexParameterxv; + +GLEW_FUN_EXPORT PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL; + +GLEW_FUN_EXPORT PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL; +GLEW_FUN_EXPORT PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL; + +GLEW_FUN_EXPORT PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL; + +GLEW_FUN_EXPORT PFNGLGETPROCADDRESSREGALPROC __glewGetProcAddressREGAL; + +GLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS; +GLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS; + +GLEW_FUN_EXPORT PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS; +GLEW_FUN_EXPORT PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS; + +GLEW_FUN_EXPORT PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS; +GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS; + +GLEW_FUN_EXPORT PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC __glewInterleavedTextureCoordSetsSGIS; +GLEW_FUN_EXPORT PFNGLSELECTTEXTURECOORDSETSGISPROC __glewSelectTextureCoordSetSGIS; +GLEW_FUN_EXPORT PFNGLSELECTTEXTURESGISPROC __glewSelectTextureSGIS; +GLEW_FUN_EXPORT PFNGLSELECTTEXTURETRANSFORMSGISPROC __glewSelectTextureTransformSGIS; + +GLEW_FUN_EXPORT PFNGLMULTISAMPLESUBRECTPOSSGISPROC __glewMultisampleSubRectPosSGIS; + +GLEW_FUN_EXPORT PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS; +GLEW_FUN_EXPORT PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS; + +GLEW_FUN_EXPORT PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS; + +GLEW_FUN_EXPORT PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS; +GLEW_FUN_EXPORT PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS; + +GLEW_FUN_EXPORT PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX; +GLEW_FUN_EXPORT PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX; +GLEW_FUN_EXPORT PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX; +GLEW_FUN_EXPORT PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX; +GLEW_FUN_EXPORT PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX; +GLEW_FUN_EXPORT PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX; + +GLEW_FUN_EXPORT PFNGLADDRESSSPACEPROC __glewAddressSpace; +GLEW_FUN_EXPORT PFNGLDATAPIPEPROC __glewDataPipe; + +GLEW_FUN_EXPORT PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX; + +GLEW_FUN_EXPORT PFNGLFOGLAYERSSGIXPROC __glewFogLayersSGIX; +GLEW_FUN_EXPORT PFNGLGETFOGLAYERSSGIXPROC __glewGetFogLayersSGIX; + +GLEW_FUN_EXPORT PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX; + +GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX; + +GLEW_FUN_EXPORT PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX; + +GLEW_FUN_EXPORT PFNGLIGLOOINTERFACESGIXPROC __glewIglooInterfaceSGIX; + +GLEW_FUN_EXPORT PFNGLALLOCMPEGPREDICTORSSGIXPROC __glewAllocMPEGPredictorsSGIX; +GLEW_FUN_EXPORT PFNGLDELETEMPEGPREDICTORSSGIXPROC __glewDeleteMPEGPredictorsSGIX; +GLEW_FUN_EXPORT PFNGLGENMPEGPREDICTORSSGIXPROC __glewGenMPEGPredictorsSGIX; +GLEW_FUN_EXPORT PFNGLGETMPEGPARAMETERFVSGIXPROC __glewGetMPEGParameterfvSGIX; +GLEW_FUN_EXPORT PFNGLGETMPEGPARAMETERIVSGIXPROC __glewGetMPEGParameterivSGIX; +GLEW_FUN_EXPORT PFNGLGETMPEGPREDICTORSGIXPROC __glewGetMPEGPredictorSGIX; +GLEW_FUN_EXPORT PFNGLGETMPEGQUANTTABLEUBVPROC __glewGetMPEGQuantTableubv; +GLEW_FUN_EXPORT PFNGLISMPEGPREDICTORSGIXPROC __glewIsMPEGPredictorSGIX; +GLEW_FUN_EXPORT PFNGLMPEGPREDICTORSGIXPROC __glewMPEGPredictorSGIX; +GLEW_FUN_EXPORT PFNGLMPEGQUANTTABLEUBVPROC __glewMPEGQuantTableubv; +GLEW_FUN_EXPORT PFNGLSWAPMPEGPREDICTORSSGIXPROC __glewSwapMPEGPredictorsSGIX; + +GLEW_FUN_EXPORT PFNGLGETNONLINLIGHTFVSGIXPROC __glewGetNonlinLightfvSGIX; +GLEW_FUN_EXPORT PFNGLGETNONLINMATERIALFVSGIXPROC __glewGetNonlinMaterialfvSGIX; +GLEW_FUN_EXPORT PFNGLNONLINLIGHTFVSGIXPROC __glewNonlinLightfvSGIX; +GLEW_FUN_EXPORT PFNGLNONLINMATERIALFVSGIXPROC __glewNonlinMaterialfvSGIX; + +GLEW_FUN_EXPORT PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX; + +GLEW_FUN_EXPORT PFNGLDEFORMSGIXPROC __glewDeformSGIX; +GLEW_FUN_EXPORT PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC __glewLoadIdentityDeformationMapSGIX; + +GLEW_FUN_EXPORT PFNGLMESHBREADTHSGIXPROC __glewMeshBreadthSGIX; +GLEW_FUN_EXPORT PFNGLMESHSTRIDESGIXPROC __glewMeshStrideSGIX; + +GLEW_FUN_EXPORT PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX; + +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX; + +GLEW_FUN_EXPORT PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX; + +GLEW_FUN_EXPORT PFNGLGETVECTOROPERATIONSGIXPROC __glewGetVectorOperationSGIX; +GLEW_FUN_EXPORT PFNGLVECTOROPERATIONSGIXPROC __glewVectorOperationSGIX; + +GLEW_FUN_EXPORT PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC __glewAreVertexArraysResidentSGIX; +GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYSGIXPROC __glewBindVertexArraySGIX; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSSGIXPROC __glewDeleteVertexArraysSGIX; +GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSSGIXPROC __glewGenVertexArraysSGIX; +GLEW_FUN_EXPORT PFNGLISVERTEXARRAYSGIXPROC __glewIsVertexArraySGIX; +GLEW_FUN_EXPORT PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC __glewPrioritizeVertexArraysSGIX; + +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI; +GLEW_FUN_EXPORT PFNGLCOLORTABLESGIPROC __glewColorTableSGI; +GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI; + +GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC __glewGetPixelTransformParameterfvSGI; +GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC __glewGetPixelTransformParameterivSGI; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFSGIPROC __glewPixelTransformParameterfSGI; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC __glewPixelTransformParameterfvSGI; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERISGIPROC __glewPixelTransformParameteriSGI; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC __glewPixelTransformParameterivSGI; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMSGIPROC __glewPixelTransformSGI; + +GLEW_FUN_EXPORT PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX; + +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN; + +GLEW_FUN_EXPORT PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN; + +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN; + +GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN; + +GLEW_FUN_EXPORT PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_3; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_4; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_5; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_0; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_0; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_2; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_3; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_0; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_2; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_3; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_4; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_5; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_6; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_blend_minmax_factor; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_compressed_3DC_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_compressed_ATC_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_conservative_depth; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_debug_output; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_depth_clamp_separate; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_draw_buffers_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_framebuffer_sample_positions; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gcn_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_half_float; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_int16; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_int64; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_interleaved_elements; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_multi_draw_indirect; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_name_gen_delete; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_occlusion_query_event; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_performance_monitor; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_pinned_memory; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_program_binary_Z400; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_query_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sample_positions; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_seamless_cubemap_per_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_atomic_counter_ops; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_ballot; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_explicit_vertex_parameter; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_export; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_value_export; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_trinary_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sparse_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_stencil_operation_extended; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_gather_bias_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_texture4; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback3_lines_triangles; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback4; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_layer; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_tessellator; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_viewport_index; +GLEW_VAR_EXPORT GLboolean __GLEW_ANDROID_extension_pack_es31a; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_blit; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_instanced_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_pack_reverse_row_order; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_program_binary; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt1; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt3; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt5; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_usage; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_timer_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_translated_shader_source; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_aux_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_clip_distance; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_color_buffer_packed_float; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_copy_texture_levels; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_fence; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_float_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_flush_buffer_range; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_framebuffer_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_object_purgeable; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_pixel_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_rgb_422; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_row_bytes; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_specular_vector; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_sync; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_2D_limited_npot; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_format_BGRA8888; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_max_level; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_packed_float; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_range; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_transform_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_range; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_program_evaluators; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_ycbcr_422; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES2_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_1_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_2_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_arrays_of_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_base_instance; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_bindless_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_blend_func_extended; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_buffer_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cl_event; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clip_control; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compressed_texture_pixel_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_variable_group_size; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conditional_render_inverted; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conservative_depth; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_image; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cull_distance; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_debug_output; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_derivative_control; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_direct_state_access; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_elements_base_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_indirect; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_enhanced_layouts; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_attrib_location; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_uniform_location; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_coord_conventions; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_layer_viewport; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader_interlock; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_no_attachments; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_geometry_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_program_binary; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_texture_sub_image; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gl_spirv; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader5; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_fp64; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_int64; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_indirect_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_instanced_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query2; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_invalidate_subdata; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_alignment; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_range; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_bind; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_draw_indirect; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query2; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_parallel_shader_compile; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pipeline_statistics_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pixel_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_polygon_offset_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_post_depth_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_program_interface_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_provoking_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_query_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robust_buffer_access_behavior; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_application_isolation; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_share_group_isolation; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_locations; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_shading; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sampler_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cubemap_per_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_separate_shader_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counter_ops; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_ballot; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_bit_encoding; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_clock; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_draw_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_group_vote; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_load_store; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_size; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_precision; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_stencil_export; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_storage_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_subroutine; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_image_samples; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_viewport_layer_array; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_100; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_420pack; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_include; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_packing; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture2; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_spirv_extensions; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_stencil_texturing; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sync; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_tessellation_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_barrier; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_border_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object_rgb32; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_range; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_bptc; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_rgtc; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map_array; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_add; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_combine; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_filter_anisotropic; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_filter_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_gather; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_levels; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rg; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rgb10_a2ui; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_stencil8; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_swizzle; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_view; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_timer_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback2; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback3; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_overflow_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transpose_matrix; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_uniform_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_bgra; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_64bit; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_binding; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_viewport_array; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos; +GLEW_VAR_EXPORT GLboolean __GLEW_ARM_mali_program_binary; +GLEW_VAR_EXPORT GLboolean __GLEW_ARM_mali_shader_binary; +GLEW_VAR_EXPORT GLboolean __GLEW_ARM_rgba8; +GLEW_VAR_EXPORT GLboolean __GLEW_ARM_shader_framebuffer_fetch; +GLEW_VAR_EXPORT GLboolean __GLEW_ARM_shader_framebuffer_fetch_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_point_sprites; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_combine3; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_route; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_vertex_shader_output_point_size; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_element_array; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_envmap_bumpmap; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_map_object_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_meminfo; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_pn_triangles; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_separate_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_shader_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_text_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_compression_3dc; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_env_combine3; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_mirror_once; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_attrib_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_streams; +GLEW_VAR_EXPORT GLboolean __GLEW_EGL_KHR_context_flush_control; +GLEW_VAR_EXPORT GLboolean __GLEW_EGL_NV_robustness_video_memory_purge; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_422_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_Cg_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_EGL_image_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_YUV_target; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_abgr; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_base_instance; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bgra; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bindable_uniform; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_equation_separate; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_extended; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_separate; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_logic_op; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_subtract; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_buffer_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clear_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_cull_distance; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_volume_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cmyka; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_buffer_half_float; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_subtable; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compiled_vertex_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compressed_ETC1_RGB8_sub_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_conservative_depth; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_convolution; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_coordinate_frame; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_image; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cull_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_label; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_marker; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_bounds_test; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_direct_state_access; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_discard_framebuffer; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers2; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers_indexed; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_elements_base_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_range_elements; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_external_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_float_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fog_coord; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_frag_depth; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fragment_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_blit; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_point_size; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_program_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader5; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_histogram; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_array_formats; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_func; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_material; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_instanced_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_light_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_map_buffer_range; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_memory_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_memory_object_fd; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_memory_object_win32; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_misc_attribute; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_indirect; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multiple_textures; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisampled_render_to_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisampled_render_to_texture2; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multiview_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_float; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_paletted_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_point_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_post_depth_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_provoking_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pvrtc_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_raster_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_read_format_bgra; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_render_snorm; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sRGB_write_control; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_semaphore; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_semaphore_fd; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_semaphore_win32; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_shader_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_framebuffer_fetch; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_group_vote; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_formatted; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_store; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_implicit_conversions; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_integer_mix; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_io_blocks; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_non_constant_global_initializers; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_pixel_local_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_pixel_local_storage2; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_samplers; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sparse_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sparse_texture2; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_clear_tag; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_two_side; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_wrap; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_subtexture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture3D; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_astc_decode_mode; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_bptc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_dxt1; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_latc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_rgtc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_s3tc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_edge_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_add; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_combine; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_dot3; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_anisotropic; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_format_BGRA8888; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_integer; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_lod_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_mirror_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_norm16; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_perturb_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rg; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_R8; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_RG8; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_decode; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_shared_exponent; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_snorm; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_swizzle; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_type_2_10_10_10_REV; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_view; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_timer_query; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_transform_feedback; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_unpack_subimage; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_bgra; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_setXXX; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_attrib_64bit; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_weighting; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_win32_keyed_mutex; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_window_rectangles; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_x11_sync_object; +GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_frame_terminator; +GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_string_marker; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_convolution_border_modes; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_image_transform; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_occlusion_test; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_texture_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_cull_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_multimode_draw_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_rasterpos_clip; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_static_data; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_texture_mirrored_repeat; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_vertex_array_lists; +GLEW_VAR_EXPORT GLboolean __GLEW_INGR_color_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_INGR_interlace_read; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_conservative_rasterization; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_fragment_shader_ordering; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_framebuffer_CMAA; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_map_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_performance_query; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced_coherent; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_context_flush_control; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_debug; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_no_error; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_parallel_shader_compile; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robust_buffer_access_behavior; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robustness; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_hdr; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_ldr; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_sliced_3d; +GLEW_VAR_EXPORT GLboolean __GLEW_KTX_buffer_region; +GLEW_VAR_EXPORT GLboolean __GLEW_MESAX_texture_stack; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_shader_integer_functions; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_NVX_blend_equation_advanced_multi_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_NVX_conditional_render; +GLEW_VAR_EXPORT GLboolean __GLEW_NVX_gpu_memory_info; +GLEW_VAR_EXPORT GLboolean __GLEW_NVX_linked_gpu_multicast; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_3dvision_settings; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_EGL_stream_consumer_external; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_alpha_to_coverage_dither_control; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_bgr; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect_count; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced_coherent; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_minmax_factor; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_clip_space_w_scaling; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_command_list; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_compute_program5; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_conditional_render; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster_dilate; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster_pre_snap_triangles; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_image; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_deep_texture3D; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_range_unclamped; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_vulkan_image; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_attrib_location; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fbo_color_attachments; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fill_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_float_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fog_distance; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_coverage_to_color; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program_option; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_shader_interlock; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_blit; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_mixed_samples; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_generate_mipmap_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader_passthrough; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_multicast; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5_mem_extended; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program_fp64; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_shader5; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_image_formats; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_instanced_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_internalformat_sample_query; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_light_max_exponent; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_filter_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_non_square_matrices; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_pack_subimage; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_float_linear; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering_shared_edge; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_platform_binary; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_polygon_mode; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_present_video; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_depth; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_robustness_video_memory_purge; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_sRGB_formats; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_locations; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_mask_override_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_counters; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float64; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_fp16_vector; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_int64; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_buffer_load; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_noperspective_interpolation; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_storage_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_group; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_shuffle; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shadow_samplers_array; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shadow_samplers_cube; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_stereo_view_rendering; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_tessellation_program5; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_array; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_barrier; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_border_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_latc; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_s3tc; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_s3tc_update; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_vtc; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_env_combine4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_expand_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_npot_2D_mipmap; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle_compressed; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader3; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_uniform_buffer_unified_memory; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vdpau_interop; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_attrib_integer_64bit; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_buffer_unified_memory; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program1_1; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2_option; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program3; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_video_capture; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_array; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_array2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_swizzle; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_byte_coordinates; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_interlace; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_resample; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_subsample; +GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview; +GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview2; +GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview_multisampled_render_to_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints; +GLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_alpha_test; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_binning_control; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_driver_control; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_extended_get; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_extended_get2; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_framebuffer_foveated; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_perfmon_global_mode; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_shader_framebuffer_fetch_noncoherent; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_tiled_rendering; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_writeonly_rendering; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_0_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_1_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_enable; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_error_string; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_extension_query; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_log; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_proc_address; +GLEW_VAR_EXPORT GLboolean __GLEW_REND_screen_coordinates; +GLEW_VAR_EXPORT GLboolean __GLEW_S3_s3tc; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_clip_band_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_color_range; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_detail_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_fog_function; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_generate_mipmap; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_line_texgen; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multitexture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_pixel_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_point_line_texgen; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_shared_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_sharpen_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture4D; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_border_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_edge_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_filter4; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_select; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_histogram; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_pixel; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_bali_g_instruments; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_bali_r_instruments; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_bali_timer_instruments; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_alpha_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_cadd; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_cmultiply; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_calligraphic_fragment; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_clipmap; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_color_matrix_accuracy; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_color_table_index_mode; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_complex_polar; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_convolution_accuracy; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_cylinder_texgen; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_datapipe; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_decimation; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_pass_instrument; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_dvc; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_flush_raster; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_factor_to_alpha; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_layers; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_offset; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_patchy; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_scale; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_lighting_space; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_specular_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragments_instrument; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_framezoom; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_icc_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_igloo_interface; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_image_compression; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_impact_pixel_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_instrument_error; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_interlace; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ir_instrument1; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_line_quality_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_list_priority; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_mpeg1; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_mpeg2; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_nonlinear_lighting_pervertex; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_nurbs_eval; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_occlusion_instrument; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_packed_6bytes; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_bits; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_tiles; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_polynomial_ffd; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_quad_mesh; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_reference_plane; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_resample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_scalebias_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow_ambient; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_slim; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_spotlight_cutoff; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_subdiv_patch; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_subsample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_tag_sample_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_add_env; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_coordinate_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_lod_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_mipmap_anisotropic; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_multi_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_phase; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_range; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_scale_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_supersample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vector_ops; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb_subsample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcba; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_matrix; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_complex; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_complex_type; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_fft; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_texture_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_SUNX_constant_data; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_convolution_border_modes; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_global_alpha; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_mesh_array; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_read_video_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_slice_accum; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_triangle_list; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_phong_shading; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_scene_markerXXX; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_specular_fog; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint; +/* ------------------------------------------------------------------------- */ + +/* error codes */ +#define GLEW_OK 0 +#define GLEW_NO_ERROR 0 +#define GLEW_ERROR_NO_GL_VERSION 1 /* missing GL version */ +#define GLEW_ERROR_GL_VERSION_10_ONLY 2 /* Need at least OpenGL 1.1 */ +#define GLEW_ERROR_GLX_VERSION_11_ONLY 3 /* Need at least GLX 1.2 */ +#define GLEW_ERROR_NO_GLX_DISPLAY 4 /* Need GLX display for GLX support */ + +/* string codes */ +#define GLEW_VERSION 1 +#define GLEW_VERSION_MAJOR 2 +#define GLEW_VERSION_MINOR 3 +#define GLEW_VERSION_MICRO 4 + +/* ------------------------------------------------------------------------- */ + +/* GLEW version info */ + +/* +VERSION 2.1.0 +VERSION_MAJOR 2 +VERSION_MINOR 1 +VERSION_MICRO 0 +*/ + +/* API */ +GLEWAPI GLenum GLEWAPIENTRY glewInit (void); +GLEWAPI GLboolean GLEWAPIENTRY glewIsSupported (const char *name); +#define glewIsExtensionSupported(x) glewIsSupported(x) + +#ifndef GLEW_GET_VAR +#define GLEW_GET_VAR(x) (*(const GLboolean*)&x) +#endif + +#ifndef GLEW_GET_FUN +#define GLEW_GET_FUN(x) x +#endif + +GLEWAPI GLboolean glewExperimental; +GLEWAPI GLboolean GLEWAPIENTRY glewGetExtension (const char *name); +GLEWAPI const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error); +GLEWAPI const GLubyte * GLEWAPIENTRY glewGetString (GLenum name); + +#ifdef __cplusplus +} +#endif + +#ifdef GLEW_APIENTRY_DEFINED +#undef GLEW_APIENTRY_DEFINED +#undef APIENTRY +#endif + +#ifdef GLEW_CALLBACK_DEFINED +#undef GLEW_CALLBACK_DEFINED +#undef CALLBACK +#endif + +#ifdef GLEW_WINGDIAPI_DEFINED +#undef GLEW_WINGDIAPI_DEFINED +#undef WINGDIAPI +#endif + +#undef GLAPI +/* #undef GLEWAPI */ + +#endif /* __glew_h__ */ diff --git a/src/external/glew/wglew.h b/src/external/glew/wglew.h new file mode 100644 index 00000000..2097c0f0 --- /dev/null +++ b/src/external/glew/wglew.h @@ -0,0 +1,1447 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2008-2017, Nigel Stewart +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +** Copyright (c) 2007 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +#ifndef __wglew_h__ +#define __wglew_h__ +#define __WGLEW_H__ + +#ifdef __wglext_h_ +#error wglext.h included before wglew.h +#endif + +#define __wglext_h_ + +#if !defined(WINAPI) +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN 1 +# endif +#include +# undef WIN32_LEAN_AND_MEAN +#endif + +/* + * GLEW_STATIC needs to be set when using the static version. + * GLEW_BUILD is set when building the DLL version. + */ +#ifdef GLEW_STATIC +# define GLEWAPI extern +#else +# ifdef GLEW_BUILD +# define GLEWAPI extern __declspec(dllexport) +# else +# define GLEWAPI extern __declspec(dllimport) +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* -------------------------- WGL_3DFX_multisample ------------------------- */ + +#ifndef WGL_3DFX_multisample +#define WGL_3DFX_multisample 1 + +#define WGL_SAMPLE_BUFFERS_3DFX 0x2060 +#define WGL_SAMPLES_3DFX 0x2061 + +#define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample) + +#endif /* WGL_3DFX_multisample */ + +/* ------------------------- WGL_3DL_stereo_control ------------------------ */ + +#ifndef WGL_3DL_stereo_control +#define WGL_3DL_stereo_control 1 + +#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055 +#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056 +#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057 +#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058 + +typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState); + +#define wglSetStereoEmitterState3DL WGLEW_GET_FUN(__wglewSetStereoEmitterState3DL) + +#define WGLEW_3DL_stereo_control WGLEW_GET_VAR(__WGLEW_3DL_stereo_control) + +#endif /* WGL_3DL_stereo_control */ + +/* ------------------------ WGL_AMD_gpu_association ------------------------ */ + +#ifndef WGL_AMD_gpu_association +#define WGL_AMD_gpu_association 1 + +#define WGL_GPU_VENDOR_AMD 0x1F00 +#define WGL_GPU_RENDERER_STRING_AMD 0x1F01 +#define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 +#define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 +#define WGL_GPU_RAM_AMD 0x21A3 +#define WGL_GPU_CLOCK_AMD 0x21A4 +#define WGL_GPU_NUM_PIPES_AMD 0x21A5 +#define WGL_GPU_NUM_SIMD_AMD 0x21A6 +#define WGL_GPU_NUM_RB_AMD 0x21A7 +#define WGL_GPU_NUM_SPI_AMD 0x21A8 + +typedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id); +typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int* attribList); +typedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc); +typedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc); +typedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); +typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT* ids); +typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void* data); +typedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc); + +#define wglBlitContextFramebufferAMD WGLEW_GET_FUN(__wglewBlitContextFramebufferAMD) +#define wglCreateAssociatedContextAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAMD) +#define wglCreateAssociatedContextAttribsAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAttribsAMD) +#define wglDeleteAssociatedContextAMD WGLEW_GET_FUN(__wglewDeleteAssociatedContextAMD) +#define wglGetContextGPUIDAMD WGLEW_GET_FUN(__wglewGetContextGPUIDAMD) +#define wglGetCurrentAssociatedContextAMD WGLEW_GET_FUN(__wglewGetCurrentAssociatedContextAMD) +#define wglGetGPUIDsAMD WGLEW_GET_FUN(__wglewGetGPUIDsAMD) +#define wglGetGPUInfoAMD WGLEW_GET_FUN(__wglewGetGPUInfoAMD) +#define wglMakeAssociatedContextCurrentAMD WGLEW_GET_FUN(__wglewMakeAssociatedContextCurrentAMD) + +#define WGLEW_AMD_gpu_association WGLEW_GET_VAR(__WGLEW_AMD_gpu_association) + +#endif /* WGL_AMD_gpu_association */ + +/* ------------------------- WGL_ARB_buffer_region ------------------------- */ + +#ifndef WGL_ARB_buffer_region +#define WGL_ARB_buffer_region 1 + +#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 +#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 +#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 +#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 + +typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); +typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); +typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); +typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); + +#define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB) +#define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB) +#define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB) +#define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB) + +#define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region) + +#endif /* WGL_ARB_buffer_region */ + +/* --------------------- WGL_ARB_context_flush_control --------------------- */ + +#ifndef WGL_ARB_context_flush_control +#define WGL_ARB_context_flush_control 1 + +#define WGLEW_ARB_context_flush_control WGLEW_GET_VAR(__WGLEW_ARB_context_flush_control) + +#endif /* WGL_ARB_context_flush_control */ + +/* ------------------------- WGL_ARB_create_context ------------------------ */ + +#ifndef WGL_ARB_create_context +#define WGL_ARB_create_context 1 + +#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 +#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 +#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 +#define WGL_CONTEXT_FLAGS_ARB 0x2094 +#define ERROR_INVALID_VERSION_ARB 0x2095 +#define ERROR_INVALID_PROFILE_ARB 0x2096 + +typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int* attribList); + +#define wglCreateContextAttribsARB WGLEW_GET_FUN(__wglewCreateContextAttribsARB) + +#define WGLEW_ARB_create_context WGLEW_GET_VAR(__WGLEW_ARB_create_context) + +#endif /* WGL_ARB_create_context */ + +/* -------------------- WGL_ARB_create_context_no_error -------------------- */ + +#ifndef WGL_ARB_create_context_no_error +#define WGL_ARB_create_context_no_error 1 + +#define WGLEW_ARB_create_context_no_error WGLEW_GET_VAR(__WGLEW_ARB_create_context_no_error) + +#endif /* WGL_ARB_create_context_no_error */ + +/* --------------------- WGL_ARB_create_context_profile -------------------- */ + +#ifndef WGL_ARB_create_context_profile +#define WGL_ARB_create_context_profile 1 + +#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 +#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 +#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 + +#define WGLEW_ARB_create_context_profile WGLEW_GET_VAR(__WGLEW_ARB_create_context_profile) + +#endif /* WGL_ARB_create_context_profile */ + +/* ------------------- WGL_ARB_create_context_robustness ------------------- */ + +#ifndef WGL_ARB_create_context_robustness +#define WGL_ARB_create_context_robustness 1 + +#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261 + +#define WGLEW_ARB_create_context_robustness WGLEW_GET_VAR(__WGLEW_ARB_create_context_robustness) + +#endif /* WGL_ARB_create_context_robustness */ + +/* ----------------------- WGL_ARB_extensions_string ----------------------- */ + +#ifndef WGL_ARB_extensions_string +#define WGL_ARB_extensions_string 1 + +typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); + +#define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB) + +#define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string) + +#endif /* WGL_ARB_extensions_string */ + +/* ------------------------ WGL_ARB_framebuffer_sRGB ----------------------- */ + +#ifndef WGL_ARB_framebuffer_sRGB +#define WGL_ARB_framebuffer_sRGB 1 + +#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9 + +#define WGLEW_ARB_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_ARB_framebuffer_sRGB) + +#endif /* WGL_ARB_framebuffer_sRGB */ + +/* ----------------------- WGL_ARB_make_current_read ----------------------- */ + +#ifndef WGL_ARB_make_current_read +#define WGL_ARB_make_current_read 1 + +#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 +#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 + +typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); + +#define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB) +#define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB) + +#define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read) + +#endif /* WGL_ARB_make_current_read */ + +/* -------------------------- WGL_ARB_multisample -------------------------- */ + +#ifndef WGL_ARB_multisample +#define WGL_ARB_multisample 1 + +#define WGL_SAMPLE_BUFFERS_ARB 0x2041 +#define WGL_SAMPLES_ARB 0x2042 + +#define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample) + +#endif /* WGL_ARB_multisample */ + +/* ---------------------------- WGL_ARB_pbuffer ---------------------------- */ + +#ifndef WGL_ARB_pbuffer +#define WGL_ARB_pbuffer 1 + +#define WGL_DRAW_TO_PBUFFER_ARB 0x202D +#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E +#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F +#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 +#define WGL_PBUFFER_LARGEST_ARB 0x2033 +#define WGL_PBUFFER_WIDTH_ARB 0x2034 +#define WGL_PBUFFER_HEIGHT_ARB 0x2035 +#define WGL_PBUFFER_LOST_ARB 0x2036 + +DECLARE_HANDLE(HPBUFFERARB); + +typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); +typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); +typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); +typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue); +typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); + +#define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB) +#define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB) +#define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB) +#define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB) +#define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB) + +#define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer) + +#endif /* WGL_ARB_pbuffer */ + +/* -------------------------- WGL_ARB_pixel_format ------------------------- */ + +#ifndef WGL_ARB_pixel_format +#define WGL_ARB_pixel_format 1 + +#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 +#define WGL_DRAW_TO_WINDOW_ARB 0x2001 +#define WGL_DRAW_TO_BITMAP_ARB 0x2002 +#define WGL_ACCELERATION_ARB 0x2003 +#define WGL_NEED_PALETTE_ARB 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 +#define WGL_SWAP_METHOD_ARB 0x2007 +#define WGL_NUMBER_OVERLAYS_ARB 0x2008 +#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 +#define WGL_TRANSPARENT_ARB 0x200A +#define WGL_SHARE_DEPTH_ARB 0x200C +#define WGL_SHARE_STENCIL_ARB 0x200D +#define WGL_SHARE_ACCUM_ARB 0x200E +#define WGL_SUPPORT_GDI_ARB 0x200F +#define WGL_SUPPORT_OPENGL_ARB 0x2010 +#define WGL_DOUBLE_BUFFER_ARB 0x2011 +#define WGL_STEREO_ARB 0x2012 +#define WGL_PIXEL_TYPE_ARB 0x2013 +#define WGL_COLOR_BITS_ARB 0x2014 +#define WGL_RED_BITS_ARB 0x2015 +#define WGL_RED_SHIFT_ARB 0x2016 +#define WGL_GREEN_BITS_ARB 0x2017 +#define WGL_GREEN_SHIFT_ARB 0x2018 +#define WGL_BLUE_BITS_ARB 0x2019 +#define WGL_BLUE_SHIFT_ARB 0x201A +#define WGL_ALPHA_BITS_ARB 0x201B +#define WGL_ALPHA_SHIFT_ARB 0x201C +#define WGL_ACCUM_BITS_ARB 0x201D +#define WGL_ACCUM_RED_BITS_ARB 0x201E +#define WGL_ACCUM_GREEN_BITS_ARB 0x201F +#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 +#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 +#define WGL_DEPTH_BITS_ARB 0x2022 +#define WGL_STENCIL_BITS_ARB 0x2023 +#define WGL_AUX_BUFFERS_ARB 0x2024 +#define WGL_NO_ACCELERATION_ARB 0x2025 +#define WGL_GENERIC_ACCELERATION_ARB 0x2026 +#define WGL_FULL_ACCELERATION_ARB 0x2027 +#define WGL_SWAP_EXCHANGE_ARB 0x2028 +#define WGL_SWAP_COPY_ARB 0x2029 +#define WGL_SWAP_UNDEFINED_ARB 0x202A +#define WGL_TYPE_RGBA_ARB 0x202B +#define WGL_TYPE_COLORINDEX_ARB 0x202C +#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 +#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 +#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 +#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A +#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B + +typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues); + +#define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB) +#define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB) +#define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB) + +#define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format) + +#endif /* WGL_ARB_pixel_format */ + +/* ----------------------- WGL_ARB_pixel_format_float ---------------------- */ + +#ifndef WGL_ARB_pixel_format_float +#define WGL_ARB_pixel_format_float 1 + +#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 + +#define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float) + +#endif /* WGL_ARB_pixel_format_float */ + +/* ------------------------- WGL_ARB_render_texture ------------------------ */ + +#ifndef WGL_ARB_render_texture +#define WGL_ARB_render_texture 1 + +#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 +#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 +#define WGL_TEXTURE_FORMAT_ARB 0x2072 +#define WGL_TEXTURE_TARGET_ARB 0x2073 +#define WGL_MIPMAP_TEXTURE_ARB 0x2074 +#define WGL_TEXTURE_RGB_ARB 0x2075 +#define WGL_TEXTURE_RGBA_ARB 0x2076 +#define WGL_NO_TEXTURE_ARB 0x2077 +#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 +#define WGL_TEXTURE_1D_ARB 0x2079 +#define WGL_TEXTURE_2D_ARB 0x207A +#define WGL_MIPMAP_LEVEL_ARB 0x207B +#define WGL_CUBE_MAP_FACE_ARB 0x207C +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 +#define WGL_FRONT_LEFT_ARB 0x2083 +#define WGL_FRONT_RIGHT_ARB 0x2084 +#define WGL_BACK_LEFT_ARB 0x2085 +#define WGL_BACK_RIGHT_ARB 0x2086 +#define WGL_AUX0_ARB 0x2087 +#define WGL_AUX1_ARB 0x2088 +#define WGL_AUX2_ARB 0x2089 +#define WGL_AUX3_ARB 0x208A +#define WGL_AUX4_ARB 0x208B +#define WGL_AUX5_ARB 0x208C +#define WGL_AUX6_ARB 0x208D +#define WGL_AUX7_ARB 0x208E +#define WGL_AUX8_ARB 0x208F +#define WGL_AUX9_ARB 0x2090 + +typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); +typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); +typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList); + +#define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB) +#define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB) +#define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB) + +#define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture) + +#endif /* WGL_ARB_render_texture */ + +/* ---------------- WGL_ARB_robustness_application_isolation --------------- */ + +#ifndef WGL_ARB_robustness_application_isolation +#define WGL_ARB_robustness_application_isolation 1 + +#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 + +#define WGLEW_ARB_robustness_application_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_application_isolation) + +#endif /* WGL_ARB_robustness_application_isolation */ + +/* ---------------- WGL_ARB_robustness_share_group_isolation --------------- */ + +#ifndef WGL_ARB_robustness_share_group_isolation +#define WGL_ARB_robustness_share_group_isolation 1 + +#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 + +#define WGLEW_ARB_robustness_share_group_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_share_group_isolation) + +#endif /* WGL_ARB_robustness_share_group_isolation */ + +/* ----------------------- WGL_ATI_pixel_format_float ---------------------- */ + +#ifndef WGL_ATI_pixel_format_float +#define WGL_ATI_pixel_format_float 1 + +#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 +#define GL_RGBA_FLOAT_MODE_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 + +#define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float) + +#endif /* WGL_ATI_pixel_format_float */ + +/* -------------------- WGL_ATI_render_texture_rectangle ------------------- */ + +#ifndef WGL_ATI_render_texture_rectangle +#define WGL_ATI_render_texture_rectangle 1 + +#define WGL_TEXTURE_RECTANGLE_ATI 0x21A5 + +#define WGLEW_ATI_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_ATI_render_texture_rectangle) + +#endif /* WGL_ATI_render_texture_rectangle */ + +/* --------------------------- WGL_EXT_colorspace -------------------------- */ + +#ifndef WGL_EXT_colorspace +#define WGL_EXT_colorspace 1 + +#define WGL_COLORSPACE_SRGB_EXT 0x3089 +#define WGL_COLORSPACE_LINEAR_EXT 0x308A +#define WGL_COLORSPACE_EXT 0x309D + +#define WGLEW_EXT_colorspace WGLEW_GET_VAR(__WGLEW_EXT_colorspace) + +#endif /* WGL_EXT_colorspace */ + +/* ------------------- WGL_EXT_create_context_es2_profile ------------------ */ + +#ifndef WGL_EXT_create_context_es2_profile +#define WGL_EXT_create_context_es2_profile 1 + +#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 + +#define WGLEW_EXT_create_context_es2_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es2_profile) + +#endif /* WGL_EXT_create_context_es2_profile */ + +/* ------------------- WGL_EXT_create_context_es_profile ------------------- */ + +#ifndef WGL_EXT_create_context_es_profile +#define WGL_EXT_create_context_es_profile 1 + +#define WGL_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 + +#define WGLEW_EXT_create_context_es_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es_profile) + +#endif /* WGL_EXT_create_context_es_profile */ + +/* -------------------------- WGL_EXT_depth_float -------------------------- */ + +#ifndef WGL_EXT_depth_float +#define WGL_EXT_depth_float 1 + +#define WGL_DEPTH_FLOAT_EXT 0x2040 + +#define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float) + +#endif /* WGL_EXT_depth_float */ + +/* ---------------------- WGL_EXT_display_color_table ---------------------- */ + +#ifndef WGL_EXT_display_color_table +#define WGL_EXT_display_color_table 1 + +typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef void (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (GLushort* table, GLuint length); + +#define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT) +#define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT) +#define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT) +#define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT) + +#define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table) + +#endif /* WGL_EXT_display_color_table */ + +/* ----------------------- WGL_EXT_extensions_string ----------------------- */ + +#ifndef WGL_EXT_extensions_string +#define WGL_EXT_extensions_string 1 + +typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); + +#define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT) + +#define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string) + +#endif /* WGL_EXT_extensions_string */ + +/* ------------------------ WGL_EXT_framebuffer_sRGB ----------------------- */ + +#ifndef WGL_EXT_framebuffer_sRGB +#define WGL_EXT_framebuffer_sRGB 1 + +#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9 + +#define WGLEW_EXT_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_EXT_framebuffer_sRGB) + +#endif /* WGL_EXT_framebuffer_sRGB */ + +/* ----------------------- WGL_EXT_make_current_read ----------------------- */ + +#ifndef WGL_EXT_make_current_read +#define WGL_EXT_make_current_read 1 + +#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 + +typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); + +#define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT) +#define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT) + +#define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read) + +#endif /* WGL_EXT_make_current_read */ + +/* -------------------------- WGL_EXT_multisample -------------------------- */ + +#ifndef WGL_EXT_multisample +#define WGL_EXT_multisample 1 + +#define WGL_SAMPLE_BUFFERS_EXT 0x2041 +#define WGL_SAMPLES_EXT 0x2042 + +#define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample) + +#endif /* WGL_EXT_multisample */ + +/* ---------------------------- WGL_EXT_pbuffer ---------------------------- */ + +#ifndef WGL_EXT_pbuffer +#define WGL_EXT_pbuffer 1 + +#define WGL_DRAW_TO_PBUFFER_EXT 0x202D +#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E +#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F +#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 +#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 +#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 +#define WGL_PBUFFER_LARGEST_EXT 0x2033 +#define WGL_PBUFFER_WIDTH_EXT 0x2034 +#define WGL_PBUFFER_HEIGHT_EXT 0x2035 + +DECLARE_HANDLE(HPBUFFEREXT); + +typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); +typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); +typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); +typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue); +typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); + +#define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT) +#define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT) +#define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT) +#define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT) +#define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT) + +#define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer) + +#endif /* WGL_EXT_pbuffer */ + +/* -------------------------- WGL_EXT_pixel_format ------------------------- */ + +#ifndef WGL_EXT_pixel_format +#define WGL_EXT_pixel_format 1 + +#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 +#define WGL_DRAW_TO_WINDOW_EXT 0x2001 +#define WGL_DRAW_TO_BITMAP_EXT 0x2002 +#define WGL_ACCELERATION_EXT 0x2003 +#define WGL_NEED_PALETTE_EXT 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 +#define WGL_SWAP_METHOD_EXT 0x2007 +#define WGL_NUMBER_OVERLAYS_EXT 0x2008 +#define WGL_NUMBER_UNDERLAYS_EXT 0x2009 +#define WGL_TRANSPARENT_EXT 0x200A +#define WGL_TRANSPARENT_VALUE_EXT 0x200B +#define WGL_SHARE_DEPTH_EXT 0x200C +#define WGL_SHARE_STENCIL_EXT 0x200D +#define WGL_SHARE_ACCUM_EXT 0x200E +#define WGL_SUPPORT_GDI_EXT 0x200F +#define WGL_SUPPORT_OPENGL_EXT 0x2010 +#define WGL_DOUBLE_BUFFER_EXT 0x2011 +#define WGL_STEREO_EXT 0x2012 +#define WGL_PIXEL_TYPE_EXT 0x2013 +#define WGL_COLOR_BITS_EXT 0x2014 +#define WGL_RED_BITS_EXT 0x2015 +#define WGL_RED_SHIFT_EXT 0x2016 +#define WGL_GREEN_BITS_EXT 0x2017 +#define WGL_GREEN_SHIFT_EXT 0x2018 +#define WGL_BLUE_BITS_EXT 0x2019 +#define WGL_BLUE_SHIFT_EXT 0x201A +#define WGL_ALPHA_BITS_EXT 0x201B +#define WGL_ALPHA_SHIFT_EXT 0x201C +#define WGL_ACCUM_BITS_EXT 0x201D +#define WGL_ACCUM_RED_BITS_EXT 0x201E +#define WGL_ACCUM_GREEN_BITS_EXT 0x201F +#define WGL_ACCUM_BLUE_BITS_EXT 0x2020 +#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 +#define WGL_DEPTH_BITS_EXT 0x2022 +#define WGL_STENCIL_BITS_EXT 0x2023 +#define WGL_AUX_BUFFERS_EXT 0x2024 +#define WGL_NO_ACCELERATION_EXT 0x2025 +#define WGL_GENERIC_ACCELERATION_EXT 0x2026 +#define WGL_FULL_ACCELERATION_EXT 0x2027 +#define WGL_SWAP_EXCHANGE_EXT 0x2028 +#define WGL_SWAP_COPY_EXT 0x2029 +#define WGL_SWAP_UNDEFINED_EXT 0x202A +#define WGL_TYPE_RGBA_EXT 0x202B +#define WGL_TYPE_COLORINDEX_EXT 0x202C + +typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues); + +#define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT) +#define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT) +#define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT) + +#define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format) + +#endif /* WGL_EXT_pixel_format */ + +/* ------------------- WGL_EXT_pixel_format_packed_float ------------------- */ + +#ifndef WGL_EXT_pixel_format_packed_float +#define WGL_EXT_pixel_format_packed_float 1 + +#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 + +#define WGLEW_EXT_pixel_format_packed_float WGLEW_GET_VAR(__WGLEW_EXT_pixel_format_packed_float) + +#endif /* WGL_EXT_pixel_format_packed_float */ + +/* -------------------------- WGL_EXT_swap_control ------------------------- */ + +#ifndef WGL_EXT_swap_control +#define WGL_EXT_swap_control 1 + +typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); +typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); + +#define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT) +#define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT) + +#define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control) + +#endif /* WGL_EXT_swap_control */ + +/* ----------------------- WGL_EXT_swap_control_tear ----------------------- */ + +#ifndef WGL_EXT_swap_control_tear +#define WGL_EXT_swap_control_tear 1 + +#define WGLEW_EXT_swap_control_tear WGLEW_GET_VAR(__WGLEW_EXT_swap_control_tear) + +#endif /* WGL_EXT_swap_control_tear */ + +/* --------------------- WGL_I3D_digital_video_control --------------------- */ + +#ifndef WGL_I3D_digital_video_control +#define WGL_I3D_digital_video_control 1 + +#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 +#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 +#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 +#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 + +typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); +typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); + +#define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D) +#define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D) + +#define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control) + +#endif /* WGL_I3D_digital_video_control */ + +/* ----------------------------- WGL_I3D_gamma ----------------------------- */ + +#ifndef WGL_I3D_gamma +#define WGL_I3D_gamma 1 + +#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E +#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F + +typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue); +typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); +typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue); +typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); + +#define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D) +#define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D) +#define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D) +#define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D) + +#define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma) + +#endif /* WGL_I3D_gamma */ + +/* ---------------------------- WGL_I3D_genlock ---------------------------- */ + +#ifndef WGL_I3D_genlock +#define WGL_I3D_genlock 1 + +#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 +#define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045 +#define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046 +#define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047 +#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 +#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 +#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A +#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B +#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C + +typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); +typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); +typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource); +typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag); +typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay); + +#define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D) +#define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D) +#define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D) +#define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D) +#define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D) +#define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D) +#define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D) +#define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D) +#define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D) +#define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D) +#define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D) +#define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D) + +#define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock) + +#endif /* WGL_I3D_genlock */ + +/* -------------------------- WGL_I3D_image_buffer ------------------------- */ + +#ifndef WGL_I3D_image_buffer +#define WGL_I3D_image_buffer 1 + +#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 +#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 + +typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count); +typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); +typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); +typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, LPVOID* pAddress, UINT count); + +#define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D) +#define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D) +#define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D) +#define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D) + +#define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer) + +#endif /* WGL_I3D_image_buffer */ + +/* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */ + +#ifndef WGL_I3D_swap_frame_lock +#define WGL_I3D_swap_frame_lock 1 + +typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag); + +#define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D) +#define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D) +#define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D) +#define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D) + +#define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock) + +#endif /* WGL_I3D_swap_frame_lock */ + +/* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */ + +#ifndef WGL_I3D_swap_frame_usage +#define WGL_I3D_swap_frame_usage 1 + +typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); + +#define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D) +#define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D) +#define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D) +#define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D) + +#define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage) + +#endif /* WGL_I3D_swap_frame_usage */ + +/* --------------------------- WGL_NV_DX_interop --------------------------- */ + +#ifndef WGL_NV_DX_interop +#define WGL_NV_DX_interop 1 + +#define WGL_ACCESS_READ_ONLY_NV 0x0000 +#define WGL_ACCESS_READ_WRITE_NV 0x0001 +#define WGL_ACCESS_WRITE_DISCARD_NV 0x0002 + +typedef BOOL (WINAPI * PFNWGLDXCLOSEDEVICENVPROC) (HANDLE hDevice); +typedef BOOL (WINAPI * PFNWGLDXLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); +typedef BOOL (WINAPI * PFNWGLDXOBJECTACCESSNVPROC) (HANDLE hObject, GLenum access); +typedef HANDLE (WINAPI * PFNWGLDXOPENDEVICENVPROC) (void* dxDevice); +typedef HANDLE (WINAPI * PFNWGLDXREGISTEROBJECTNVPROC) (HANDLE hDevice, void* dxObject, GLuint name, GLenum type, GLenum access); +typedef BOOL (WINAPI * PFNWGLDXSETRESOURCESHAREHANDLENVPROC) (void* dxObject, HANDLE shareHandle); +typedef BOOL (WINAPI * PFNWGLDXUNLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); +typedef BOOL (WINAPI * PFNWGLDXUNREGISTEROBJECTNVPROC) (HANDLE hDevice, HANDLE hObject); + +#define wglDXCloseDeviceNV WGLEW_GET_FUN(__wglewDXCloseDeviceNV) +#define wglDXLockObjectsNV WGLEW_GET_FUN(__wglewDXLockObjectsNV) +#define wglDXObjectAccessNV WGLEW_GET_FUN(__wglewDXObjectAccessNV) +#define wglDXOpenDeviceNV WGLEW_GET_FUN(__wglewDXOpenDeviceNV) +#define wglDXRegisterObjectNV WGLEW_GET_FUN(__wglewDXRegisterObjectNV) +#define wglDXSetResourceShareHandleNV WGLEW_GET_FUN(__wglewDXSetResourceShareHandleNV) +#define wglDXUnlockObjectsNV WGLEW_GET_FUN(__wglewDXUnlockObjectsNV) +#define wglDXUnregisterObjectNV WGLEW_GET_FUN(__wglewDXUnregisterObjectNV) + +#define WGLEW_NV_DX_interop WGLEW_GET_VAR(__WGLEW_NV_DX_interop) + +#endif /* WGL_NV_DX_interop */ + +/* --------------------------- WGL_NV_DX_interop2 -------------------------- */ + +#ifndef WGL_NV_DX_interop2 +#define WGL_NV_DX_interop2 1 + +#define WGLEW_NV_DX_interop2 WGLEW_GET_VAR(__WGLEW_NV_DX_interop2) + +#endif /* WGL_NV_DX_interop2 */ + +/* --------------------------- WGL_NV_copy_image --------------------------- */ + +#ifndef WGL_NV_copy_image +#define WGL_NV_copy_image 1 + +typedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); + +#define wglCopyImageSubDataNV WGLEW_GET_FUN(__wglewCopyImageSubDataNV) + +#define WGLEW_NV_copy_image WGLEW_GET_VAR(__WGLEW_NV_copy_image) + +#endif /* WGL_NV_copy_image */ + +/* ------------------------ WGL_NV_delay_before_swap ----------------------- */ + +#ifndef WGL_NV_delay_before_swap +#define WGL_NV_delay_before_swap 1 + +typedef BOOL (WINAPI * PFNWGLDELAYBEFORESWAPNVPROC) (HDC hDC, GLfloat seconds); + +#define wglDelayBeforeSwapNV WGLEW_GET_FUN(__wglewDelayBeforeSwapNV) + +#define WGLEW_NV_delay_before_swap WGLEW_GET_VAR(__WGLEW_NV_delay_before_swap) + +#endif /* WGL_NV_delay_before_swap */ + +/* -------------------------- WGL_NV_float_buffer -------------------------- */ + +#ifndef WGL_NV_float_buffer +#define WGL_NV_float_buffer 1 + +#define WGL_FLOAT_COMPONENTS_NV 0x20B0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 +#define WGL_TEXTURE_FLOAT_R_NV 0x20B5 +#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 +#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 +#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 + +#define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer) + +#endif /* WGL_NV_float_buffer */ + +/* -------------------------- WGL_NV_gpu_affinity -------------------------- */ + +#ifndef WGL_NV_gpu_affinity +#define WGL_NV_gpu_affinity 1 + +#define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0 +#define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1 + +DECLARE_HANDLE(HGPUNV); +typedef struct _GPU_DEVICE { + DWORD cb; + CHAR DeviceName[32]; + CHAR DeviceString[128]; + DWORD Flags; + RECT rcVirtualScreen; +} GPU_DEVICE, *PGPU_DEVICE; + +typedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList); +typedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc); +typedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice); +typedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu); +typedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu); + +#define wglCreateAffinityDCNV WGLEW_GET_FUN(__wglewCreateAffinityDCNV) +#define wglDeleteDCNV WGLEW_GET_FUN(__wglewDeleteDCNV) +#define wglEnumGpuDevicesNV WGLEW_GET_FUN(__wglewEnumGpuDevicesNV) +#define wglEnumGpusFromAffinityDCNV WGLEW_GET_FUN(__wglewEnumGpusFromAffinityDCNV) +#define wglEnumGpusNV WGLEW_GET_FUN(__wglewEnumGpusNV) + +#define WGLEW_NV_gpu_affinity WGLEW_GET_VAR(__WGLEW_NV_gpu_affinity) + +#endif /* WGL_NV_gpu_affinity */ + +/* ---------------------- WGL_NV_multisample_coverage ---------------------- */ + +#ifndef WGL_NV_multisample_coverage +#define WGL_NV_multisample_coverage 1 + +#define WGL_COVERAGE_SAMPLES_NV 0x2042 +#define WGL_COLOR_SAMPLES_NV 0x20B9 + +#define WGLEW_NV_multisample_coverage WGLEW_GET_VAR(__WGLEW_NV_multisample_coverage) + +#endif /* WGL_NV_multisample_coverage */ + +/* -------------------------- WGL_NV_present_video ------------------------- */ + +#ifndef WGL_NV_present_video +#define WGL_NV_present_video 1 + +#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0 + +DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); + +typedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int* piAttribList); +typedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDc, HVIDEOOUTPUTDEVICENV* phDeviceList); +typedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int* piValue); + +#define wglBindVideoDeviceNV WGLEW_GET_FUN(__wglewBindVideoDeviceNV) +#define wglEnumerateVideoDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoDevicesNV) +#define wglQueryCurrentContextNV WGLEW_GET_FUN(__wglewQueryCurrentContextNV) + +#define WGLEW_NV_present_video WGLEW_GET_VAR(__WGLEW_NV_present_video) + +#endif /* WGL_NV_present_video */ + +/* ---------------------- WGL_NV_render_depth_texture ---------------------- */ + +#ifndef WGL_NV_render_depth_texture +#define WGL_NV_render_depth_texture 1 + +#define WGL_NO_TEXTURE_ARB 0x2077 +#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 +#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 +#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 +#define WGL_DEPTH_COMPONENT_NV 0x20A7 + +#define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture) + +#endif /* WGL_NV_render_depth_texture */ + +/* -------------------- WGL_NV_render_texture_rectangle -------------------- */ + +#ifndef WGL_NV_render_texture_rectangle +#define WGL_NV_render_texture_rectangle 1 + +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 +#define WGL_TEXTURE_RECTANGLE_NV 0x20A2 + +#define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle) + +#endif /* WGL_NV_render_texture_rectangle */ + +/* --------------------------- WGL_NV_swap_group --------------------------- */ + +#ifndef WGL_NV_swap_group +#define WGL_NV_swap_group 1 + +typedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier); +typedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint* count); +typedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint* maxGroups, GLuint *maxBarriers); +typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint* group, GLuint *barrier); +typedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC); + +#define wglBindSwapBarrierNV WGLEW_GET_FUN(__wglewBindSwapBarrierNV) +#define wglJoinSwapGroupNV WGLEW_GET_FUN(__wglewJoinSwapGroupNV) +#define wglQueryFrameCountNV WGLEW_GET_FUN(__wglewQueryFrameCountNV) +#define wglQueryMaxSwapGroupsNV WGLEW_GET_FUN(__wglewQueryMaxSwapGroupsNV) +#define wglQuerySwapGroupNV WGLEW_GET_FUN(__wglewQuerySwapGroupNV) +#define wglResetFrameCountNV WGLEW_GET_FUN(__wglewResetFrameCountNV) + +#define WGLEW_NV_swap_group WGLEW_GET_VAR(__WGLEW_NV_swap_group) + +#endif /* WGL_NV_swap_group */ + +/* ----------------------- WGL_NV_vertex_array_range ----------------------- */ + +#ifndef WGL_NV_vertex_array_range +#define WGL_NV_vertex_array_range 1 + +typedef void * (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); +typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer); + +#define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV) +#define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV) + +#define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range) + +#endif /* WGL_NV_vertex_array_range */ + +/* -------------------------- WGL_NV_video_capture ------------------------- */ + +#ifndef WGL_NV_video_capture +#define WGL_NV_video_capture 1 + +#define WGL_UNIQUE_ID_NV 0x20CE +#define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF + +DECLARE_HANDLE(HVIDEOINPUTDEVICENV); + +typedef BOOL (WINAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice); +typedef UINT (WINAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV* phDeviceList); +typedef BOOL (WINAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); +typedef BOOL (WINAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int* piValue); +typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); + +#define wglBindVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewBindVideoCaptureDeviceNV) +#define wglEnumerateVideoCaptureDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoCaptureDevicesNV) +#define wglLockVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewLockVideoCaptureDeviceNV) +#define wglQueryVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewQueryVideoCaptureDeviceNV) +#define wglReleaseVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoCaptureDeviceNV) + +#define WGLEW_NV_video_capture WGLEW_GET_VAR(__WGLEW_NV_video_capture) + +#endif /* WGL_NV_video_capture */ + +/* -------------------------- WGL_NV_video_output -------------------------- */ + +#ifndef WGL_NV_video_output +#define WGL_NV_video_output 1 + +#define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0 +#define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1 +#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2 +#define WGL_VIDEO_OUT_COLOR_NV 0x20C3 +#define WGL_VIDEO_OUT_ALPHA_NV 0x20C4 +#define WGL_VIDEO_OUT_DEPTH_NV 0x20C5 +#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 +#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 +#define WGL_VIDEO_OUT_FRAME 0x20C8 +#define WGL_VIDEO_OUT_FIELD_1 0x20C9 +#define WGL_VIDEO_OUT_FIELD_2 0x20CA +#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB +#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC + +DECLARE_HANDLE(HPVIDEODEV); + +typedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer); +typedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV* hVideoDevice); +typedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long* pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); +typedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice); +typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer); +typedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long* pulCounterPbuffer, BOOL bBlock); + +#define wglBindVideoImageNV WGLEW_GET_FUN(__wglewBindVideoImageNV) +#define wglGetVideoDeviceNV WGLEW_GET_FUN(__wglewGetVideoDeviceNV) +#define wglGetVideoInfoNV WGLEW_GET_FUN(__wglewGetVideoInfoNV) +#define wglReleaseVideoDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoDeviceNV) +#define wglReleaseVideoImageNV WGLEW_GET_FUN(__wglewReleaseVideoImageNV) +#define wglSendPbufferToVideoNV WGLEW_GET_FUN(__wglewSendPbufferToVideoNV) + +#define WGLEW_NV_video_output WGLEW_GET_VAR(__WGLEW_NV_video_output) + +#endif /* WGL_NV_video_output */ + +/* -------------------------- WGL_OML_sync_control ------------------------- */ + +#ifndef WGL_OML_sync_control +#define WGL_OML_sync_control 1 + +typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32 *denominator); +typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc); +typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); +typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); +typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc); +typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc); + +#define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML) +#define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML) +#define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML) +#define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML) +#define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML) +#define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML) + +#define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control) + +#endif /* WGL_OML_sync_control */ + +/* ------------------------------------------------------------------------- */ + +#define WGLEW_FUN_EXPORT GLEW_FUN_EXPORT +#define WGLEW_VAR_EXPORT GLEW_VAR_EXPORT + +WGLEW_FUN_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL; + +WGLEW_FUN_EXPORT PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD; +WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD; +WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD; +WGLEW_FUN_EXPORT PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD; +WGLEW_FUN_EXPORT PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD; +WGLEW_FUN_EXPORT PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD; +WGLEW_FUN_EXPORT PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD; +WGLEW_FUN_EXPORT PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD; +WGLEW_FUN_EXPORT PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD; + +WGLEW_FUN_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB; +WGLEW_FUN_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB; +WGLEW_FUN_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB; +WGLEW_FUN_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB; + +WGLEW_FUN_EXPORT PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB; + +WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB; + +WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB; +WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB; + +WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB; +WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB; +WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB; +WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB; +WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB; + +WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB; +WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB; +WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB; + +WGLEW_FUN_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB; +WGLEW_FUN_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB; +WGLEW_FUN_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB; + +WGLEW_FUN_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT; +WGLEW_FUN_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT; +WGLEW_FUN_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT; +WGLEW_FUN_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT; + +WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT; + +WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT; +WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT; + +WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT; +WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT; +WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT; +WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT; +WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT; + +WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT; +WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT; +WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT; + +WGLEW_FUN_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT; +WGLEW_FUN_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT; + +WGLEW_FUN_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D; +WGLEW_FUN_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D; + +WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D; +WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D; +WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D; +WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D; + +WGLEW_FUN_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D; +WGLEW_FUN_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D; +WGLEW_FUN_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D; +WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D; +WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D; +WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D; +WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D; +WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D; +WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D; +WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D; +WGLEW_FUN_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D; +WGLEW_FUN_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D; + +WGLEW_FUN_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D; +WGLEW_FUN_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D; +WGLEW_FUN_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D; +WGLEW_FUN_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D; + +WGLEW_FUN_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D; +WGLEW_FUN_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D; +WGLEW_FUN_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D; +WGLEW_FUN_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D; + +WGLEW_FUN_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D; +WGLEW_FUN_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D; +WGLEW_FUN_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D; +WGLEW_FUN_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D; + +WGLEW_FUN_EXPORT PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV; +WGLEW_FUN_EXPORT PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV; +WGLEW_FUN_EXPORT PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV; +WGLEW_FUN_EXPORT PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV; +WGLEW_FUN_EXPORT PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV; +WGLEW_FUN_EXPORT PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV; +WGLEW_FUN_EXPORT PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV; +WGLEW_FUN_EXPORT PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV; + +WGLEW_FUN_EXPORT PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV; + +WGLEW_FUN_EXPORT PFNWGLDELAYBEFORESWAPNVPROC __wglewDelayBeforeSwapNV; + +WGLEW_FUN_EXPORT PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV; +WGLEW_FUN_EXPORT PFNWGLDELETEDCNVPROC __wglewDeleteDCNV; +WGLEW_FUN_EXPORT PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV; +WGLEW_FUN_EXPORT PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV; +WGLEW_FUN_EXPORT PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV; + +WGLEW_FUN_EXPORT PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV; +WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV; +WGLEW_FUN_EXPORT PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV; + +WGLEW_FUN_EXPORT PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV; +WGLEW_FUN_EXPORT PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV; +WGLEW_FUN_EXPORT PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV; +WGLEW_FUN_EXPORT PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV; +WGLEW_FUN_EXPORT PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV; +WGLEW_FUN_EXPORT PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV; + +WGLEW_FUN_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV; +WGLEW_FUN_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV; + +WGLEW_FUN_EXPORT PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV; +WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV; +WGLEW_FUN_EXPORT PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV; +WGLEW_FUN_EXPORT PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV; +WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV; + +WGLEW_FUN_EXPORT PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV; +WGLEW_FUN_EXPORT PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV; +WGLEW_FUN_EXPORT PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV; +WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV; +WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV; +WGLEW_FUN_EXPORT PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV; + +WGLEW_FUN_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML; +WGLEW_FUN_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML; +WGLEW_FUN_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML; +WGLEW_FUN_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML; +WGLEW_FUN_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML; +WGLEW_FUN_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML; +WGLEW_VAR_EXPORT GLboolean __WGLEW_3DFX_multisample; +WGLEW_VAR_EXPORT GLboolean __WGLEW_3DL_stereo_control; +WGLEW_VAR_EXPORT GLboolean __WGLEW_AMD_gpu_association; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_buffer_region; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_context_flush_control; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_no_error; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_profile; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_robustness; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_extensions_string; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_framebuffer_sRGB; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_make_current_read; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_multisample; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pbuffer; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format_float; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_render_texture; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_application_isolation; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_share_group_isolation; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_pixel_format_float; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_colorspace; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es2_profile; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es_profile; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_depth_float; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_display_color_table; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_extensions_string; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_make_current_read; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_multisample; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pbuffer; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control_tear; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_digital_video_control; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_gamma; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_genlock; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_image_buffer; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop2; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_copy_image; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_delay_before_swap; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_float_buffer; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_gpu_affinity; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_multisample_coverage; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_present_video; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_depth_texture; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_swap_group; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_vertex_array_range; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_capture; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_output; +WGLEW_VAR_EXPORT GLboolean __WGLEW_OML_sync_control; +/* ------------------------------------------------------------------------- */ + +GLEWAPI GLenum GLEWAPIENTRY wglewInit (); +GLEWAPI GLboolean GLEWAPIENTRY wglewIsSupported (const char *name); + +#ifndef WGLEW_GET_VAR +#define WGLEW_GET_VAR(x) (*(const GLboolean*)&x) +#endif + +#ifndef WGLEW_GET_FUN +#define WGLEW_GET_FUN(x) x +#endif + +GLEWAPI GLboolean GLEWAPIENTRY wglewGetExtension (const char *name); + +#ifdef __cplusplus +} +#endif + +#undef GLEWAPI + +#endif /* __wglew_h__ */ diff --git a/src/framework/Common.cpp b/src/framework/Common.cpp index 3f1b47b1..704b13a9 100644 --- a/src/framework/Common.cpp +++ b/src/framework/Common.cpp @@ -67,6 +67,8 @@ idCVar com_asyncSound( "com_asyncSound", "3", CVAR_INTEGER|CVAR_SYSTEM|CVAR_ROM, #else idCVar com_asyncSound( "com_asyncSound", "1", CVAR_INTEGER|CVAR_SYSTEM, ASYNCSOUND_INFO, 0, 1 ); #endif +idCVar com_productionMode("com_productionMode", "0", CVAR_SYSTEM | CVAR_BOOL, "0 - no special behavior, 1 - building a production build, 2 - running a production build"); + idCVar com_forceGenericSIMD( "com_forceGenericSIMD", "0", CVAR_BOOL | CVAR_SYSTEM | CVAR_NOCHEAT, "force generic platform independent SIMD" ); idCVar com_developer( "developer", "0", CVAR_BOOL|CVAR_SYSTEM|CVAR_NOCHEAT, "developer mode" ); idCVar com_allowConsole( "com_allowConsole", "0", CVAR_BOOL | CVAR_SYSTEM | CVAR_NOCHEAT, "allow toggling console with the tilde key" ); diff --git a/src/framework/Common.h b/src/framework/Common.h index 5283a7aa..91e3238a 100644 --- a/src/framework/Common.h +++ b/src/framework/Common.h @@ -66,6 +66,8 @@ typedef enum { } saveType_t; // RAVEN END +extern idCVar com_productionMode; + // converted to a class so the idStr gets constructed class MemInfo { public: diff --git a/src/framework/DeclManager.cpp b/src/framework/DeclManager.cpp index d203084d..372847e1 100644 --- a/src/framework/DeclManager.cpp +++ b/src/framework/DeclManager.cpp @@ -752,7 +752,7 @@ int idDeclFile::LoadAndParse() { finalPreprocessedBuffer = PreprocessGuides(buffer, length); } - fileSystem->WriteFile(va("generated/%s", fileName.c_str()), finalPreprocessedBuffer.c_str(), finalPreprocessedBuffer.Length()); + //fileSystem->WriteFile(va("generated/%s", fileName.c_str()), finalPreprocessedBuffer.c_str(), finalPreprocessedBuffer.Length()); Mem_Free(buffer); // jmarshall end diff --git a/src/framework/File.h b/src/framework/File.h index 9a126708..e843a58b 100644 --- a/src/framework/File.h +++ b/src/framework/File.h @@ -118,6 +118,32 @@ class idFile { virtual void WriteSyncId(void) { } virtual void ReadSyncId(const char* detail = "unspecified", const char* classname = NULL) { } // jmarshall end + + template ID_INLINE size_t ReadBig(type& c) { + size_t r = Read(&c, sizeof(c)); + idSwap::Big(c); + return r; + } + + template ID_INLINE size_t ReadBigArray(type* c, int count) { + size_t r = Read(c, sizeof(c[0]) * count); + idSwap::BigArray(c, count); + return r; + } + + template ID_INLINE size_t WriteBig(const type& c) { + type b = c; + idSwap::Big(b); + return Write(&b, sizeof(b)); + } + + template ID_INLINE size_t WriteBigArray(const type* c, int count) { + size_t r = 0; + for (int i = 0; i < count; i++) { + r += WriteBig(c[i]); + } + return r; + } }; diff --git a/src/framework/FileSystem.cpp b/src/framework/FileSystem.cpp index 46065710..64480c3e 100644 --- a/src/framework/FileSystem.cpp +++ b/src/framework/FileSystem.cpp @@ -357,6 +357,7 @@ class idFileSystemLocal : public idFileSystem { virtual const char * BuildOSPath( const char *base, const char *game, const char *relativePath ); virtual void CreateOSPath( const char *OSPath ); virtual bool FileIsInPAK( const char *relativePath ); + virtual bool InProductionMode() { return /*(resourceFiles.Num() > 0) |*/ (com_productionMode.GetInteger() != 0); } virtual void UpdatePureServerChecksums( void ); virtual bool UpdateGamePakChecksums( void ); virtual fsPureReply_t SetPureServerChecksums( const int pureChecksums[ MAX_PURE_PAKS ], int gamePakChecksum, int missingChecksums[ MAX_PURE_PAKS ], int *missingGamePakChecksum ); diff --git a/src/framework/FileSystem.h b/src/framework/FileSystem.h index 267f1026..c8b7e7b1 100644 --- a/src/framework/FileSystem.h +++ b/src/framework/FileSystem.h @@ -287,8 +287,45 @@ class idFileSystem { // ignore case and seperator char distinctions virtual bool FilenameCompare( const char *s1, const char *s2 ) const = 0; + + virtual bool InProductionMode() = 0; }; extern idFileSystem * fileSystem; +/* +================================================ +idFileLocal is a FileStream wrapper that automatically closes a file when the +class variable goes out of scope. Note that the pointer passed in to the constructor can be for +any type of File Stream that ultimately inherits from idFile, and that this is not actually a +SmartPointer, as it does not keep a reference count. +================================================ +*/ +class idFileLocal { +public: + // Constructor that accepts and stores the file pointer. + idFileLocal(idFile* _file) : file(_file) { + } + + // Destructor that will destroy (close) the file when this wrapper class goes out of scope. + ~idFileLocal() { + if(file != NULL) + fileSystem->CloseFile(file); + } + + // Cast to a file pointer. + operator idFile* () const { + return file; + } + + // Member access operator for treating the wrapper as if it were the file, itself. + idFile* operator -> () const { + return file; + } + +protected: + idFile* file; // The managed file pointer. +}; + + #endif /* !__FILESYSTEM_H__ */ diff --git a/src/idlib.vcxproj b/src/idlib.vcxproj index 3c98370c..30c37eba 100644 --- a/src/idlib.vcxproj +++ b/src/idlib.vcxproj @@ -160,6 +160,7 @@ + @@ -177,6 +178,7 @@ + diff --git a/src/idlib.vcxproj.filters b/src/idlib.vcxproj.filters index 79ac67c1..40e1d9be 100644 --- a/src/idlib.vcxproj.filters +++ b/src/idlib.vcxproj.filters @@ -261,6 +261,12 @@ idLib\Algorithms + + idLib + + + idLib\Containers + diff --git a/src/idlib/Heap.h b/src/idlib/Heap.h index b64e3784..5e5cf900 100644 --- a/src/idlib/Heap.h +++ b/src/idlib/Heap.h @@ -295,6 +295,77 @@ void operator delete[]( void *p ); #endif /* ID_DEBUG_MEMORY */ +/* +================================================ +idTempArray is an array that is automatically free'd when it goes out of scope. +There is no "cast" operator because these are very unsafe. + +The template parameter MUST BE POD! + +Compile time asserting POD-ness of the template parameter is complicated due +to our vector classes that need a default constructor but are otherwise +considered POD. +================================================ +*/ +template < class T > +class idTempArray { +public: + idTempArray(idTempArray& other); + idTempArray(unsigned int num); + + ~idTempArray(); + + T& operator [](unsigned int i) { assert(i < num); return buffer[i]; } + const T& operator [](unsigned int i) const { assert(i < num); return buffer[i]; } + + T* Ptr() { return buffer; } + const T* Ptr() const { return buffer; } + + size_t Size() const { return num * sizeof(T); } + unsigned int Num() const { return num; } + + void Zero() { memset(Ptr(), 0, Size()); } + +private: + T* buffer; // Ensure this buffer comes first, so this == &this->buffer + unsigned int num; +}; + +/* +======================== +idTempArray::idTempArray +======================== +*/ +template < class T > +ID_INLINE idTempArray::idTempArray(idTempArray& other) { + this->num = other.num; + this->buffer = other.buffer; + other.num = 0; + other.buffer = NULL; +} + +/* +======================== +idTempArray::idTempArray +======================== +*/ +template < class T > +ID_INLINE idTempArray::idTempArray(unsigned int num) { + this->num = num; + buffer = (T*)Mem_Alloc(num * sizeof(T)); +} + +/* +======================== +idTempArray::~idTempArray +======================== +*/ +template < class T > +ID_INLINE idTempArray::~idTempArray() { + Mem_Free(buffer); +} + + /* =============================================================================== diff --git a/src/idlib/Lib.cpp b/src/idlib/Lib.cpp index 61c6433d..80fcbd57 100644 --- a/src/idlib/Lib.cpp +++ b/src/idlib/Lib.cpp @@ -220,20 +220,36 @@ void UnpackColor( const dword color, idVec3 &unpackedColor ) { // RAVEN END } +/* +=============== +idLib::FatalError +=============== +*/ +void idLib::FatalError(const char* fmt, ...) { + va_list argptr; + char text[MAX_STRING_CHARS]; + + va_start(argptr, fmt); + idStr::vsnPrintf(text, sizeof(text), fmt, argptr); + va_end(argptr); + + common->FatalError("%s", text); +} + /* =============== idLib::Error =============== */ -void idLib::Error( const char *fmt, ... ) { +void idLib::Error(const char* fmt, ...) { va_list argptr; char text[MAX_STRING_CHARS]; - va_start( argptr, fmt ); - idStr::vsnPrintf( text, sizeof( text ), fmt, argptr ); - va_end( argptr ); + va_start(argptr, fmt); + idStr::vsnPrintf(text, sizeof(text), fmt, argptr); + va_end(argptr); - common->Error( "%s", text ); + common->Error("%s", text); } /* @@ -241,15 +257,65 @@ void idLib::Error( const char *fmt, ... ) { idLib::Warning =============== */ -void idLib::Warning( const char *fmt, ... ) { +void idLib::Warning(const char* fmt, ...) { va_list argptr; char text[MAX_STRING_CHARS]; - va_start( argptr, fmt ); - idStr::vsnPrintf( text, sizeof( text ), fmt, argptr ); - va_end( argptr ); + va_start(argptr, fmt); + idStr::vsnPrintf(text, sizeof(text), fmt, argptr); + va_end(argptr); - common->Warning( "%s", text ); + common->Warning("%s", text); +} + +/* +=============== +idLib::WarningIf +=============== +*/ +void idLib::WarningIf(const bool test, const char* fmt, ...) { + if (!test) { + return; + } + + va_list argptr; + char text[MAX_STRING_CHARS]; + + va_start(argptr, fmt); + idStr::vsnPrintf(text, sizeof(text), fmt, argptr); + va_end(argptr); + + common->Warning("%s", text); +} + +/* +=============== +idLib::Printf +=============== +*/ +void idLib::Printf(const char* fmt, ...) { + va_list argptr; + va_start(argptr, fmt); + if (common) { + common->VPrintf(fmt, argptr); + } + va_end(argptr); +} + +/* +=============== +idLib::PrintfIf +=============== +*/ +void idLib::PrintfIf(const bool test, const char* fmt, ...) { + if (!test) { + return; + } + + va_list argptr; + va_start(argptr, fmt); + common->VPrintf(fmt, argptr); + va_end(argptr); } /* diff --git a/src/idlib/Lib.h b/src/idlib/Lib.h index 7cc3d905..0729e66a 100644 --- a/src/idlib/Lib.h +++ b/src/idlib/Lib.h @@ -31,8 +31,12 @@ class idLib { static void ShutDown( void ); // wrapper to idCommon functions - static void Error( const char *fmt, ... ); - static void Warning( const char *fmt, ... ); + static void Printf(const char* fmt, ...); + static void PrintfIf(const bool test, const char* fmt, ...); + static void Error(const char* fmt, ...); + static void FatalError(const char* fmt, ...); + static void Warning(const char* fmt, ...); + static void WarningIf(const bool test, const char* fmt, ...); }; @@ -201,6 +205,15 @@ bool Swap_IsBigEndian( void ); void SixtetsForInt( byte *out, int src); int IntForSixtets( byte *in ); +#define MAX_TYPE( x ) ( ( ( ( 1 << ( ( sizeof( x ) - 1 ) * 8 - 1 ) ) - 1 ) << 8 ) | 255 ) +#define MIN_TYPE( x ) ( - MAX_TYPE( x ) - 1 ) +#define MAX_UNSIGNED_TYPE( x ) ( ( ( ( 1U << ( ( sizeof( x ) - 1 ) * 8 ) ) - 1 ) << 8 ) | 255U ) +#define MIN_UNSIGNED_TYPE( x ) 0 + +template< typename _type_ > +bool IsSignedType(const _type_ t) { + return _type_(-1) < 0; +} /* =============================================================================== @@ -327,4 +340,7 @@ int IntForSixtets( byte *in ); #endif // RAVEN END +#include "Swap.h" +#include "containers/Sort.h" + #endif /* !__LIB_H__ */ diff --git a/src/idlib/Swap.h b/src/idlib/Swap.h new file mode 100644 index 00000000..92f3f04e --- /dev/null +++ b/src/idlib/Swap.h @@ -0,0 +1,223 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ +#ifndef __SWAP_H__ +#define __SWAP_H__ + +/* +================================================================================================ +Contains the Swap class, for CrossPlatform endian conversion. + +works +================================================================================================ +*/ + +/* +======================== +IsPointer +======================== +*/ +template< typename type > +bool IsPointer( type ) { + return false; +} + +/* +======================== +IsPointer +======================== +*/ +template< typename type > +bool IsPointer( type * ) { + return true; +} + +/* +================================================ +The *Swap* static template class, idSwap, is used by the SwapClass template class for +performing EndianSwapping. +================================================ +*/ +class idSwap { +public: + //#define SwapBytes( x, y ) (x) ^= (y) ^= (x) ^= (y) + #define SwapBytes( x, y ) { byte t = (x); (x) = (y); (y) = t; } + + template static void Little( type &c ) { + // byte swapping pointers is pointless because we should never store pointers on disk + assert( !IsPointer( c ) ); + + } + + template static void Big( type &c ) { + // byte swapping pointers is pointless because we should never store pointers on disk + assert( !IsPointer( c ) ); + + if ( sizeof( type ) == 1 ) { + } else if ( sizeof( type ) == 2 ) { + byte *b = (byte *)&c; + SwapBytes( b[0], b[1] ); + } else if ( sizeof( type ) == 4 ) { + byte *b = (byte *)&c; + SwapBytes( b[0], b[3] ); + SwapBytes( b[1], b[2] ); + } else if ( sizeof( type ) == 8 ) { + byte * b = (byte *)&c; + SwapBytes( b[0], b[7] ); + SwapBytes( b[1], b[6]); + SwapBytes( b[2], b[5] ); + SwapBytes( b[3], b[4] ); + } else { + assert( false ); + } + } + + template static void LittleArray( type *c, int count ) { + } + + template static void BigArray( type *c, int count ) { + for ( int i = 0; i < count; i++ ) { + Big( c[i] ); + } + } + + static void SixtetsForInt( byte *out, int src ) { + byte *b = (byte *)&src; + out[0] = ( b[0] & 0xfc ) >> 2; + out[1] = ( ( b[0] & 0x3 ) << 4 ) + ( ( b[1] & 0xf0 ) >> 4 ); + out[2] = ( ( b[1] & 0xf ) << 2 ) + ( ( b[2] & 0xc0 ) >> 6 ); + out[3] = b[2] & 0x3f; + } + + static int IntForSixtets( byte *in ) { + int ret = 0; + byte *b = (byte *)&ret; + b[0] |= in[0] << 2; + b[0] |= ( in[1] & 0x30 ) >> 4; + b[1] |= ( in[1] & 0xf ) << 4; + b[1] |= ( in[2] & 0x3c ) >> 2; + b[2] |= ( in[2] & 0x3 ) << 6; + b[2] |= in[3]; + return ret; + } + +public: // specializations +#ifndef ID_SWAP_LITE // avoid dependency avalanche for SPU code +#define SWAP_VECTOR( x ) \ + static void Little( x &c ) { LittleArray( c.ToFloatPtr(), c.GetDimension() ); } \ + static void Big( x &c ) { BigArray( c.ToFloatPtr(), c.GetDimension() ); } + + SWAP_VECTOR( idVec2 ); + SWAP_VECTOR( idVec3 ); + SWAP_VECTOR( idVec4 ); + SWAP_VECTOR( idVec5 ); + SWAP_VECTOR( idVec6 ); + SWAP_VECTOR( idMat2 ); + SWAP_VECTOR( idMat3 ); + SWAP_VECTOR( idMat4 ); + SWAP_VECTOR( idMat5 ); + SWAP_VECTOR( idMat6 ); + SWAP_VECTOR( idPlane ); + SWAP_VECTOR( idQuat ); + SWAP_VECTOR( idCQuat ); + SWAP_VECTOR( idAngles ); + //SWAP_VECTOR( idBounds ); + + //static void Little( idDrawVert &v ) { + // Little( v.xyz ); + // LittleArray( v.st, 2 ); + // LittleArray( v.normal, 4 ); + // LittleArray( v.tangent, 4 ); + // LittleArray( v.color, 4 ); + //} + //static void Big( idDrawVert &v ) { + // Big( v.xyz ); + // BigArray( v.st, 2 ); + // BigArray( v.normal, 4 ); + // BigArray( v.tangent, 4 ); + // BigArray( v.color, 4 ); + //} +#endif +}; + +/* +================================================ +idSwapClass is a template class for performing EndianSwapping. +================================================ +*/ +template +class idSwapClass { +public: + idSwapClass() { + #ifdef _DEBUG + size = 0; + #endif + } + ~idSwapClass() { + #ifdef _DEBUG + assert( size == sizeof( classType ) ); + #endif + } + + template void Little( type &c ) { + idSwap::Little( c ); + #ifdef _DEBUG + size += sizeof( type ); + #endif + } + + template void Big( type &c ) { + idSwap::Big( c ); + #ifdef _DEBUG + size += sizeof( type ); + #endif + } + + template void LittleArray( type *c, int count ) { + idSwap::LittleArray( c, count ); + #ifdef _DEBUG + size += count * sizeof( type ); + #endif + } + + template void BigArray( type *c, int count ) { + idSwap::BigArray( c, count ); + #ifdef _DEBUG + size += count * sizeof( type ); + #endif + } + +#ifdef _DEBUG +private: + int size; +#endif +}; + + #define BIG32(v) ((((uint32)(v)) >> 24) | (((uint32)(v) & 0x00FF0000) >> 8) | (((uint32)(v) & 0x0000FF00) << 8) | ((uint32)(v) << 24)) + #define BIG16(v) ((((uint16)(v)) >> 8) | ((uint16)(v) << 8)) + +#endif // !__SWAP_H__ diff --git a/src/idlib/containers/Sort.h b/src/idlib/containers/Sort.h new file mode 100644 index 00000000..7642b49c --- /dev/null +++ b/src/idlib/containers/Sort.h @@ -0,0 +1,338 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ +#ifndef __SORT_H__ +#define __SORT_H__ + +/* +================================================================================================ +Contains the generic templated sort algorithms for quick-sort, heap-sort and insertion-sort. + +The sort algorithms do not use class operators or overloaded functions to compare +objects because it is often desireable to sort the same objects in different ways +based on different keys (not just ascending and descending but sometimes based on +name and other times based on say priority). So instead, for each different sort a +separate class is implemented with a Compare() function. + +This class is derived from one of the classes that implements a sort algorithm. +The Compare() member function does not only define how objects are sorted, the class +can also store additional data that can be used by the Compare() function. This, for +instance, allows a list of indices to be sorted where the indices point to objects +in an array. The base pointer of the array with objects can be stored on the class +that implements the Compare() function such that the Compare() function can use keys +that are stored on the objects. + +The Compare() function is not virtual because this would incur significant overhead. +Do NOT make the Compare() function virtual on the derived class! +The sort implementations also explicitely call the Compare() function of the derived +class. This is to avoid various compiler bugs with using overloaded compare functions +and the inability of various compilers to find the right overloaded compare function. + +To sort an array, an idList or an idStaticList, a new sort class, typically derived from +idSort_Quick, is implemented as follows: + +class idSort_MySort : public idSort_Quick< idMyObject, idSort_MySort > { +public: + int Compare( const idMyObject & a, const idMyObject & b ) const { + if ( a should come before b ) { + return -1; // or any negative integer + } if ( a should come after b ) { + return 1; // or any positive integer + } else { + return 0; + } + } +}; + +To sort an array: + +idMyObject array[100]; +idSort_MySort().Sort( array, 100 ); + +To sort an idList: + +idList< idMyObject > list; +list.Sort( idSort_MySort() ); + +The sort implementations never create temporaries of the template type. Only the +'SwapValues' template is used to move data around. This 'SwapValues' template can be +specialized to implement fast swapping of data. For instance, when sorting a list with +objects of some string class it is important to implement a specialized 'SwapValues' for +this string class to avoid excessive re-allocation and copying of strings. + +================================================================================================ +*/ + +/* +======================== +SwapValues +======================== +*/ +template< typename _type_ > +ID_INLINE void SwapValues( _type_ & a, _type_ & b ) { + _type_ c = a; + a = b; + b = c; +} + +/* +================================================ +idSort is an abstract template class for sorting an array of objects of the specified data type. +The array of objects is sorted such that: Compare( array[i], array[i+1] ) <= 0 for all i +================================================ +*/ +template< typename _type_ > +class idSort { +public: + virtual ~idSort() {} + virtual void Sort( _type_ * base, unsigned int num ) const = 0; +}; + +/* +================================================ +idSort_Quick is a sort template that implements the +quick-sort algorithm on an array of objects of the specified data type. +================================================ +*/ +template< typename _type_, typename _derived_ > +class idSort_Quick : public idSort< _type_ > { +public: + virtual void Sort( _type_ * base, unsigned int num ) const { + if ( num <= 0 ) { + return; + } + + const int64_t MAX_LEVELS = 128; + int64_t lo[MAX_LEVELS], hi[MAX_LEVELS]; + + // 'lo' is the lower index, 'hi' is the upper index + // of the region of the array that is being sorted. + lo[0] = 0; + hi[0] = num - 1; + + for ( int64_t level = 0; level >= 0; ) { + int64_t i = lo[level]; + int64_t j = hi[level]; + + // Only use quick-sort when there are 4 or more elements in this region and we are below MAX_LEVELS. + // Otherwise fall back to an insertion-sort. + if ( ( ( j - i ) >= 4 ) && ( level < ( MAX_LEVELS - 1 ) ) ) { + + // Use the center element as the pivot. + // The median of a multi point sample could be used + // but simply taking the center works quite well. + int64_t pi = ( i + j ) / 2; + + // Move the pivot element to the end of the region. + SwapValues( base[j], base[pi] ); + + // Get a reference to the pivot element. + _type_ & pivot = base[j--]; + + // Partition the region. + do { + while( static_cast< const _derived_ * >( this )->Compare( base[i], pivot ) < 0 ) { if ( ++i >= j ) break; } + while( static_cast< const _derived_ * >( this )->Compare( base[j], pivot ) > 0 ) { if ( --j <= i ) break; } + if ( i >= j ) break; + SwapValues( base[i], base[j] ); + } while( ++i < --j ); + + // Without these iterations sorting of arrays with many duplicates may + // become really slow because the partitioning can be very unbalanced. + // However, these iterations are unnecessary if all elements are unique. + while ( static_cast< const _derived_ * >( this )->Compare( base[i], pivot ) <= 0 && i < hi[level] ) { i++; } + while ( static_cast< const _derived_ * >( this )->Compare( base[j], pivot ) >= 0 && lo[level] < j ) { j--; } + + // Move the pivot element in place. + SwapValues( pivot, base[i] ); + + assert( level < MAX_LEVELS - 1 ); + lo[level+1] = i; + hi[level+1] = hi[level]; + hi[level] = j; + level++; + + } else { + + // Insertion-sort of the remaining elements. + for( ; i < j; j-- ) { + int64_t m = i; + for ( int64_t k = i + 1; k <= j; k++ ) { + if ( static_cast< const _derived_ * >( this )->Compare( base[k], base[m] ) > 0 ) { + m = k; + } + } + SwapValues( base[m], base[j] ); + } + level--; + } + } + } +}; + +/* +================================================ +Default quick-sort comparison function that can +be used to sort scalars from small to large. +================================================ +*/ +template< typename _type_ > +class idSort_QuickDefault : public idSort_Quick< _type_, idSort_QuickDefault< _type_ > > { +public: + int Compare( const _type_ & a, const _type_ & b ) const { return a - b; } +}; + +/* +================================================ +Specialization for floating point values to avoid an float-to-int +conversion for every comparison. +================================================ +*/ +template<> +class idSort_QuickDefault< float > : public idSort_Quick< float, idSort_QuickDefault< float > > { +public: + int Compare( const float & a, const float & b ) const { + if ( a < b ) { + return -1; + } + if ( a > b ) { + return 1; + } + return 0; + } +}; + +/* +================================================ +idSort_Heap is a sort template class that implements the +heap-sort algorithm on an array of objects of the specified data type. +================================================ +*/ +template< typename _type_, typename _derived_ > +class idSort_Heap : public idSort< _type_ > { +public: + virtual void Sort( _type_ * base, unsigned int num ) const { + // get all elements in heap order +#if 1 + // O( n ) + for ( unsigned int i = num / 2; i > 0; i-- ) { + // sift down + unsigned int parent = i - 1; + for ( unsigned int child = parent * 2 + 1; child < num; child = parent * 2 + 1 ) { + if ( child + 1 < num && static_cast< const _derived_ * >( this )->Compare( base[child + 1], base[child] ) > 0 ) { + child++; + } + if ( static_cast< const _derived_ * >( this )->Compare( base[child], base[parent] ) <= 0 ) { + break; + } + SwapValues( base[parent], base[child] ); + parent = child; + } + } +#else + // O(n log n) + for ( unsigned int i = 1; i < num; i++ ) { + // sift up + for ( unsigned int child = i; child > 0; ) { + unsigned int parent = ( child - 1 ) / 2; + if ( static_cast< const _derived_ * >( this )->Compare( base[parent], base[child] ) > 0 ) { + break; + } + SwapValues( base[child], base[parent] ); + child = parent; + } + } +#endif + // get sorted elements while maintaining heap order + for ( unsigned int i = num - 1; i > 0; i-- ) { + SwapValues( base[0], base[i] ); + // sift down + unsigned int parent = 0; + for ( unsigned int child = parent * 2 + 1; child < i; child = parent * 2 + 1 ) { + if ( child + 1 < i && static_cast< const _derived_ * >( this )->Compare( base[child + 1], base[child] ) > 0 ) { + child++; + } + if ( static_cast< const _derived_ * >( this )->Compare( base[child], base[parent] ) <= 0 ) { + break; + } + SwapValues( base[parent], base[child] ); + parent = child; + } + } + } +}; + +/* +================================================ +Default heap-sort comparison function that can +be used to sort scalars from small to large. +================================================ +*/ +template< typename _type_ > +class idSort_HeapDefault : public idSort_Heap< _type_, idSort_HeapDefault< _type_ > > { +public: + int Compare( const _type_ & a, const _type_ & b ) const { return a - b; } +}; + +/* +================================================ +idSort_Insertion is a sort template class that implements the +insertion-sort algorithm on an array of objects of the specified data type. +================================================ +*/ +template< typename _type_, typename _derived_ > +class idSort_Insertion : public idSort< _type_ > { +public: + virtual void Sort( _type_ * base, unsigned int num ) const { + _type_ * lo = base; + _type_ * hi = base + ( num - 1 ); + while( hi > lo ) { + _type_ * max = lo; + for ( _type_ * p = lo + 1; p <= hi; p++ ) { + if ( static_cast< const _derived_ * >( this )->Compare( (*p), (*max) ) > 0 ) { + max = p; + } + } + SwapValues( *max, *hi ); + hi--; + } + } +}; + +/* +================================================ +Default insertion-sort comparison function that can +be used to sort scalars from small to large. +================================================ +*/ +template< typename _type_ > +class idSort_InsertionDefault : public idSort_Insertion< _type_, idSort_InsertionDefault< _type_ > > { +public: + int Compare( const _type_ & a, const _type_ & b ) const { return a - b; } +}; + +#endif // !__SORT_H__ diff --git a/src/idlib/geometry/DrawVert.h b/src/idlib/geometry/DrawVert.h index a7cac888..03de890b 100644 --- a/src/idlib/geometry/DrawVert.h +++ b/src/idlib/geometry/DrawVert.h @@ -2,6 +2,22 @@ #ifndef __DRAWVERT_H__ #define __DRAWVERT_H__ +// The hardware converts a byte to a float by division with 255 and in the +// vertex programs we convert the floating-point value in the range [0, 1] +// to the range [-1, 1] by multiplying with 2 and subtracting 1. +#define VERTEX_BYTE_TO_FLOAT( x ) ( (x) * ( 2.0f / 255.0f ) - 1.0f ) +#define VERTEX_FLOAT_TO_BYTE( x ) idMath::Ftob( ( (x) + 1.0f ) * ( 255.0f / 2.0f ) + 0.5f ) + +// The hardware converts a byte to a float by division with 255 and in the +// fragment programs we convert the floating-point value in the range [0, 1] +// to the range [-1, 1] by multiplying with 2 and subtracting 1. +// This is the conventional OpenGL mapping which specifies an exact +// representation for -1 and +1 but not 0. The DirectX 10 mapping is +// in the comments which specifies a non-linear mapping with an exact +// representation of -1, 0 and +1 but -1 is represented twice. +#define NORMALMAP_BYTE_TO_FLOAT( x ) VERTEX_BYTE_TO_FLOAT( x ) //( (x) - 128.0f ) * ( 1.0f / 127.0f ) +#define NORMALMAP_FLOAT_TO_BYTE( x ) VERTEX_FLOAT_TO_BYTE( x ) //idMath::Ftob( 128.0f + 127.0f * (x) + 0.5f ) + /* =============================================================================== diff --git a/src/idlib/math/Math.h b/src/idlib/math/Math.h index 65f5f5f9..5c305494 100644 --- a/src/idlib/math/Math.h +++ b/src/idlib/math/Math.h @@ -1048,4 +1048,8 @@ class rvRandom { // RAVEN END +ID_INLINE byte CLAMP_BYTE(int x) { + return ((x) < 0 ? (0) : ((x) > 255 ? 255 : (byte)(x))); +} + #endif /* !__MATH_MATH_H__ */ diff --git a/src/idlib/precompiled.h b/src/idlib/precompiled.h index 6dfff5a8..f7db5bf6 100644 --- a/src/idlib/precompiled.h +++ b/src/idlib/precompiled.h @@ -123,6 +123,8 @@ class BITT { } bitValue_t; }; +#include + //----------------------------------------------------- #define ID_TIME_T time_t diff --git a/src/renderer/BinaryImage.cpp b/src/renderer/BinaryImage.cpp new file mode 100644 index 00000000..cba09a0b --- /dev/null +++ b/src/renderer/BinaryImage.cpp @@ -0,0 +1,449 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ + +#include "precompiled.h" + +/* +================================================================================================ + + idBinaryImage + +================================================================================================ +*/ + +#include "tr_local.h" +#include "dxt/DXTCodec.h" +#include "color/ColorSpace.h" + +idCVar image_highQualityCompression( "image_highQualityCompression", "0", CVAR_BOOL, "Use high quality (slow) compression" ); + +/* +======================== +idBinaryImage::Load2DFromMemory +======================== +*/ +void idBinaryImage::Load2DFromMemory( int width, int height, const byte * pic_const, int numLevels, textureFormat_t & textureFormat, textureColor_t & colorFormat, bool gammaMips ) { + fileData.textureType = TT_2D; + fileData.format = textureFormat; + fileData.colorFormat = colorFormat; + fileData.width = width; + fileData.height = height; + fileData.numLevels = numLevels; + + byte * pic = (byte *)Mem_Alloc( width * height * 4, TAG_TEMP ); + memcpy( pic, pic_const, width * height * 4 ); + + if ( colorFormat == CFM_YCOCG_DXT5 ) { + // convert the image data to YCoCg and use the YCoCgDXT5 compressor + idColorSpace::ConvertRGBToCoCg_Y( pic, pic, width, height ); + } else if ( colorFormat == CFM_NORMAL_DXT5 ) { + // Blah, HQ swizzles automatically, Fast doesn't + if ( !image_highQualityCompression.GetBool() ) { + for ( int i = 0; i < width * height; i++ ) { + pic[i*4+3] = pic[i*4+0]; + pic[i*4+0] = 0; + pic[i*4+2] = 0; + } + } + } else if ( colorFormat == CFM_GREEN_ALPHA ) { + for ( int i = 0; i < width * height; i++ ) { + pic[i*4+1] = pic[i*4+3]; + pic[i*4+0] = 0; + pic[i*4+2] = 0; + pic[i*4+3] = 0; + } + } + + int scaledWidth = width; + int scaledHeight = height; + images.SetNum( numLevels ); + for ( int level = 0; level < images.Num(); level++ ) { + idBinaryImageData &img = images[ level ]; + + // Images that are going to be DXT compressed and aren't multiples of 4 need to be + // padded out before compressing. + byte * dxtPic = pic; + int dxtWidth = 0; + int dxtHeight = 0; + if ( textureFormat == FMT_DXT5 || textureFormat == FMT_DXT1 ) { + if ( ( scaledWidth & 3 ) || ( scaledHeight & 3 ) ) { + dxtWidth = ( scaledWidth + 3 ) & ~3; + dxtHeight = ( scaledHeight + 3 ) & ~3; + dxtPic = (byte *)Mem_ClearedAlloc( dxtWidth*4*dxtHeight ); + for ( int i = 0; i < scaledHeight; i++ ) { + memcpy( dxtPic + i*dxtWidth*4, pic + i*scaledWidth*4, scaledWidth*4 ); + } + } else { + dxtPic = pic; + dxtWidth = scaledWidth; + dxtHeight = scaledHeight; + } + } + + img.level = level; + img.destZ = 0; + img.width = scaledWidth; + img.height = scaledHeight; + + // compress data or convert floats as necessary + if ( textureFormat == FMT_DXT1 ) { + idDxtEncoder dxt; + img.Alloc( dxtWidth * dxtHeight / 2 ); + if ( image_highQualityCompression.GetBool() ) { + dxt.CompressImageDXT1HQ( dxtPic, img.data, dxtWidth, dxtHeight ); + } else { + dxt.CompressImageDXT1Fast( dxtPic, img.data, dxtWidth, dxtHeight ); + } + } else if ( textureFormat == FMT_DXT5 ) { + idDxtEncoder dxt; + img.Alloc( dxtWidth * dxtHeight ); + if ( colorFormat == CFM_NORMAL_DXT5 ) { + if ( image_highQualityCompression.GetBool() ) { + dxt.CompressNormalMapDXT5HQ( dxtPic, img.data, dxtWidth, dxtHeight ); + } else { + dxt.CompressNormalMapDXT5Fast( dxtPic, img.data, dxtWidth, dxtHeight ); + } + } else if ( colorFormat == CFM_YCOCG_DXT5 ) { + if ( image_highQualityCompression.GetBool() ) { + dxt.CompressYCoCgDXT5HQ( dxtPic, img.data, dxtWidth, dxtHeight ); + } else { + dxt.CompressYCoCgDXT5Fast( dxtPic, img.data, dxtWidth, dxtHeight ); + } + } else { + fileData.colorFormat = colorFormat = CFM_DEFAULT; + if ( image_highQualityCompression.GetBool() ) { + dxt.CompressImageDXT5HQ( dxtPic, img.data, dxtWidth, dxtHeight ); + } else { + dxt.CompressImageDXT5Fast( dxtPic, img.data, dxtWidth, dxtHeight ); + } + } + } else if ( textureFormat == FMT_LUM8 || textureFormat == FMT_INT8 ) { + // LUM8 and INT8 just read the red channel + img.Alloc( scaledWidth * scaledHeight ); + for ( int i = 0; i < img.dataSize; i++ ) { + img.data[ i ] = pic[ i * 4 ]; + } + } else if ( textureFormat == FMT_ALPHA ) { + // ALPHA reads the alpha channel + img.Alloc( scaledWidth * scaledHeight ); + for ( int i = 0; i < img.dataSize; i++ ) { + img.data[ i ] = pic[ i * 4 + 3 ]; + } + } else if ( textureFormat == FMT_L8A8 ) { + // L8A8 reads the alpha and red channels + img.Alloc( scaledWidth * scaledHeight * 2 ); + for ( int i = 0; i < img.dataSize / 2; i++ ) { + img.data[ i * 2 + 0 ] = pic[ i * 4 + 0 ]; + img.data[ i * 2 + 1 ] = pic[ i * 4 + 3 ]; + } + } else if ( textureFormat == FMT_RGB565 ) { + img.Alloc( scaledWidth * scaledHeight * 2 ); + for ( int i = 0; i < img.dataSize / 2; i++ ) { + unsigned short color = ( ( pic[ i * 4 + 0 ] >> 3 ) << 11 ) | ( ( pic[ i * 4 + 1 ] >> 2 ) << 5 ) | ( pic[ i * 4 + 2 ] >> 3 ); + img.data[ i * 2 + 0 ] = ( color >> 8 ) & 0xFF; + img.data[ i * 2 + 1 ] = color & 0xFF; + } + } else { + fileData.format = textureFormat = FMT_RGBA8; + img.Alloc( scaledWidth * scaledHeight * 4 ); + for ( int i = 0; i < img.dataSize; i++ ) { + img.data[ i ] = pic[ i ]; + } + } + + // if we had to pad to quads, free the padded version + if ( pic != dxtPic ) { + Mem_Free( dxtPic ); + dxtPic = NULL; + } + + // downsample for the next level + byte * shrunk = NULL; + if ( gammaMips ) { + shrunk = R_MipMapWithGamma( pic, scaledWidth, scaledHeight ); + } else { + shrunk = R_MipMap( pic, scaledWidth, scaledHeight ); + } + Mem_Free( pic ); + pic = shrunk; + + scaledWidth = Max( 1, scaledWidth >> 1 ); + scaledHeight = Max( 1, scaledHeight >> 1 ); + } + + Mem_Free( pic ); +} + +/* +======================== +PadImageTo4x4 + +DXT Compression requres a complete 4x4 block, even if the GPU will only be sampling +a subset of it, so pad to 4x4 with replicated texels to maximize compression. +======================== +*/ +static void PadImageTo4x4( const byte *src, int width, int height, byte dest[64] ) { + // we probably will need to support this for non-square images, but I'll address + // that when needed + assert( width <= 4 && height <= 4 ); + assert( width > 0 && height > 0 ); + + for ( int y = 0 ; y < 4 ; y++ ) { + int sy = y % height; + for ( int x = 0 ; x < 4 ; x++ ) { + int sx = x % width; + for ( int c = 0 ; c < 4 ; c++ ) { + dest[(y*4+x)*4+c] = src[(sy*width+sx)*4+c]; + } + } + } +} + +/* +======================== +idBinaryImage::LoadCubeFromMemory +======================== +*/ +void idBinaryImage::LoadCubeFromMemory( int width, const byte * pics[6], int numLevels, textureFormat_t & textureFormat, bool gammaMips ) { + fileData.textureType = TT_CUBIC; + fileData.format = textureFormat; + fileData.colorFormat = CFM_DEFAULT; + fileData.height = fileData.width = width; + fileData.numLevels = numLevels; + + images.SetNum( fileData.numLevels * 6 ); + + for ( int side = 0; side < 6; side++ ) { + const byte *orig = pics[side]; + const byte *pic = orig; + int scaledWidth = fileData.width; + for ( int level = 0; level < fileData.numLevels; level++ ) { + // compress data or convert floats as necessary + idBinaryImageData &img = images[ level * 6 + side ]; + + // handle padding blocks less than 4x4 for the DXT compressors + ALIGN16( byte padBlock[64] ); + int padSize; + const byte *padSrc; + if ( scaledWidth < 4 && ( textureFormat == FMT_DXT1 || textureFormat == FMT_DXT5 ) ) { + PadImageTo4x4( pic, scaledWidth, scaledWidth, padBlock ); + padSize = 4; + padSrc = padBlock; + } else { + padSize = scaledWidth; + padSrc = pic; + } + + img.level = level; + img.destZ = side; + img.width = padSize; + img.height = padSize; + if ( textureFormat == FMT_DXT1 ) { + img.Alloc( padSize * padSize / 2 ); + idDxtEncoder dxt; + dxt.CompressImageDXT1Fast( padSrc, img.data, padSize, padSize ); + } else if ( textureFormat == FMT_DXT5 ) { + img.Alloc( padSize * padSize ); + idDxtEncoder dxt; + dxt.CompressImageDXT5Fast( padSrc, img.data, padSize, padSize ); + } else { + fileData.format = textureFormat = FMT_RGBA8; + img.Alloc( padSize * padSize * 4 ); + memcpy( img.data, pic, img.dataSize ); + } + + // downsample for the next level + byte * shrunk = NULL; + if ( gammaMips ) { + shrunk = R_MipMapWithGamma( pic, scaledWidth, scaledWidth ); + } else { + shrunk = R_MipMap( pic, scaledWidth, scaledWidth ); + } + if ( pic != orig ) { + Mem_Free( (void *)pic ); + pic = NULL; + } + pic = shrunk; + + scaledWidth = Max( 1, scaledWidth >> 1 ); + } + if ( pic != orig ) { + // free the down sampled version + Mem_Free( (void *)pic ); + pic = NULL; + } + } +} + +/* +======================== +idBinaryImage::WriteGeneratedFile +======================== +*/ +ID_TIME_T idBinaryImage::WriteGeneratedFile( ID_TIME_T sourceFileTime ) { + idStr binaryFileName; + MakeGeneratedFileName( binaryFileName ); + idFileLocal file( fileSystem->OpenFileWrite( binaryFileName, "fs_basepath" ) ); + if ( file == NULL ) { + idLib::Warning( "idBinaryImage: Could not open file '%s'", binaryFileName.c_str() ); + return FILE_NOT_FOUND_TIMESTAMP; + } + idLib::Printf( "Writing %s\n", binaryFileName.c_str() ); + + fileData.headerMagic = BIMAGE_MAGIC; + fileData.sourceFileTime = sourceFileTime; + + file->WriteBig( fileData.sourceFileTime ); + file->WriteBig( fileData.headerMagic ); + file->WriteBig( fileData.textureType ); + file->WriteBig( fileData.format ); + file->WriteBig( fileData.colorFormat ); + file->WriteBig( fileData.width ); + file->WriteBig( fileData.height ); + file->WriteBig( fileData.numLevels ); + + for ( int i = 0; i < images.Num(); i++ ) { + idBinaryImageData &img = images[ i ]; + file->WriteBig( img.level ); + file->WriteBig( img.destZ ); + file->WriteBig( img.width ); + file->WriteBig( img.height ); + file->WriteBig( img.dataSize ); + file->Write( img.data, img.dataSize ); + } + return file->Timestamp(); +} + +/* +========================== +idBinaryImage::LoadFromGeneratedFile + +Load the preprocessed image from the generated folder. +========================== +*/ +ID_TIME_T idBinaryImage::LoadFromGeneratedFile( ID_TIME_T sourceFileTime ) { + idStr binaryFileName; + MakeGeneratedFileName( binaryFileName ); + idFileLocal bFile = fileSystem->OpenFileRead( binaryFileName ); + if ( bFile == NULL ) { + return FILE_NOT_FOUND_TIMESTAMP; + } + if ( LoadFromGeneratedFile( bFile, sourceFileTime ) ) { + return bFile->Timestamp(); + } + return FILE_NOT_FOUND_TIMESTAMP; +} + +/* +========================== +idBinaryImage::LoadFromGeneratedFile + +Load the preprocessed image from the generated folder. +========================== +*/ +bool idBinaryImage::LoadFromGeneratedFile( idFile * bFile, ID_TIME_T sourceFileTime ) { + if ( bFile->Read( &fileData, sizeof( fileData ) ) <= 0 ) { + return false; + } + idSwapClass swap; + swap.Big( fileData.sourceFileTime ); + swap.Big( fileData.headerMagic ); + swap.Big( fileData.textureType ); + swap.Big( fileData.format ); + swap.Big( fileData.colorFormat ); + swap.Big( fileData.width ); + swap.Big( fileData.height ); + swap.Big( fileData.numLevels ); + + if ( BIMAGE_MAGIC != fileData.headerMagic ) { + return false; + } + if (fileData.sourceFileTime != sourceFileTime && !fileSystem->InProductionMode()) { + return false; + } + + int numImages = fileData.numLevels; + if ( fileData.textureType == TT_CUBIC ) { + numImages *= 6; + } + + images.SetNum( numImages ); + + for ( int i = 0; i < numImages; i++ ) { + idBinaryImageData &img = images[ i ]; + if ( bFile->Read( &img, sizeof( bimageImage_t ) ) <= 0 ) { + return false; + } + idSwapClass swap; + swap.Big( img.level ); + swap.Big( img.destZ ); + swap.Big( img.width ); + swap.Big( img.height ); + swap.Big( img.dataSize ); + assert( img.level >= 0 && img.level < fileData.numLevels ); + assert( img.destZ == 0 || fileData.textureType == TT_CUBIC ); + assert( img.dataSize > 0 ); + // DXT images need to be padded to 4x4 block sizes, but the original image + // sizes are still retained, so the stored data size may be larger than + // just the multiplication of dimensions + assert( img.dataSize >= img.width * img.height * BitsForFormat( (textureFormat_t)fileData.format ) / 8 ); + img.Alloc( img.dataSize ); + if ( img.data == NULL ) { + return false; + } + + if ( bFile->Read( img.data, img.dataSize ) <= 0 ) { + return false; + } + } + + return true; +} + +/* +========================== +idBinaryImage::MakeGeneratedFileName +========================== +*/ +void idBinaryImage::MakeGeneratedFileName( idStr & gfn ) { + GetGeneratedFileName( gfn, GetName() ); +} +/* +========================== +idBinaryImage::GetGeneratedFileName +========================== +*/ +void idBinaryImage::GetGeneratedFileName( idStr & gfn, const char *name ) { + gfn = va( "generated/images/%s.bimage", name ); + gfn.Replace( "(", "/" ); + gfn.Replace( ",", "/" ); + gfn.Replace( ")", "" ); + gfn.Replace( " ", "" ); +} + + diff --git a/src/renderer/BinaryImage.h b/src/renderer/BinaryImage.h new file mode 100644 index 00000000..b66668bf --- /dev/null +++ b/src/renderer/BinaryImage.h @@ -0,0 +1,100 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ +#ifndef __BINARYIMAGE_H__ +#define __BINARYIMAGE_H__ + +#include "BinaryImageData.h" + +/* +================================================ +idBinaryImage is used by the idImage class for constructing mipmapped +textures and for loading and saving generated files by idImage. +Also used in a memory-mapped form for imageCPU for offline megatexture +generation. +================================================ +*/ +class idBinaryImage { +public: + idBinaryImage( const char * name ) : imgName( name ) { } + + const char * GetName() const { return imgName.c_str(); } + void SetName( const char *_name ) { imgName = _name; } + + void Load2DFromMemory( int width, int height, const byte * pic_const, int numLevels, textureFormat_t & textureFormat, textureColor_t & colorFormat, bool gammaMips ); + void LoadCubeFromMemory( int width, const byte * pics[6], int numLevels, textureFormat_t & textureFormat, bool gammaMips ); + + ID_TIME_T LoadFromGeneratedFile( ID_TIME_T sourceFileTime ); + ID_TIME_T WriteGeneratedFile( ID_TIME_T sourceFileTime ); + + const bimageFile_t & GetFileHeader() { return fileData; } + + int NumImages() { return images.Num(); } + const bimageImage_t & GetImageHeader( int i ) const { return images[i]; } + const byte * GetImageData( int i ) const { return images[i].data; } + static void GetGeneratedFileName( idStr & gfn, const char *imageName ); +private: + idStr imgName; // game path, including extension (except for cube maps), may be an image program + bimageFile_t fileData; + + class idBinaryImageData : public bimageImage_t { + public: + byte * data; + + idBinaryImageData() : data( NULL ) { } + ~idBinaryImageData() { Free(); } + idBinaryImageData & operator=( idBinaryImageData & other ) { + if ( this == &other ) { + return *this; + } + + Alloc( other.dataSize ); + memcpy( data, other.data, other.dataSize ); + return *this; + } + void Free() { + if ( data != NULL ) { + Mem_Free( data ); + data = NULL; + dataSize = 0; + } + } + void Alloc( int size ) { + Free(); + dataSize = size; + data = (byte *)Mem_Alloc( size ); + } + }; + + idList< idBinaryImageData> images; + +private: + void MakeGeneratedFileName( idStr & gfn ); + bool LoadFromGeneratedFile( idFile * f, ID_TIME_T sourceFileTime ); +}; + +#endif // __BINARYIMAGE_H__ diff --git a/src/renderer/BinaryImageData.h b/src/renderer/BinaryImageData.h new file mode 100644 index 00000000..96cde739 --- /dev/null +++ b/src/renderer/BinaryImageData.h @@ -0,0 +1,68 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ +#ifndef __BINARYIMAGEDATA_H__ +#define __BINARYIMAGEDATA_H__ + +/* +================================================================================================ + +This is where the Binary image headers go that are also included by external tools such as the cloud. + +================================================================================================ +*/ + +// These structures are used for memory mapping bimage files, but +// not for the normal loading, so be careful making changes. +// Values are big endien to reduce effort on consoles. +#define BIMAGE_VERSION 10 +#define BIMAGE_MAGIC (unsigned int)( ('B'<<0)|('I'<<8)|('M'<<16)|(BIMAGE_VERSION<<24) ) + +struct bimageImage_t { + int level; + int destZ; + int width; + int height; + int dataSize; + // dataSize bytes follow +}; + +#pragma pack( push, 1 ) +struct bimageFile_t { + ID_TIME_T sourceFileTime; + int headerMagic; + int textureType; + int format; + int colorFormat; + int width; + int height; + int numLevels; + // one or more bimageImage_t structures follow +}; +#pragma pack( pop ) + +#endif // __BINARYIMAGEDATA_H__ diff --git a/src/renderer/Color/ColorSpace.cpp b/src/renderer/Color/ColorSpace.cpp new file mode 100644 index 00000000..415ae66c --- /dev/null +++ b/src/renderer/Color/ColorSpace.cpp @@ -0,0 +1,597 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ +#pragma hdrstop +#include "precompiled.h" + +/* +================================================================================================ +Contains the ColorSpace conversion implementation. +================================================================================================ +*/ + +#include "ColorSpace.h" + +/* +================================================================================================ +To *Color-Convert RGB and YCoCg* ColorSpaces, use the following conversions: + + + Y = [ 1/4 1/2 1/4] [R] + Co = [ 1/2 0 -1/2] [G] + 128 + CG = [-1/4 1/2 -1/4] [B] + 128 + + R = [ 1 1 -1] [Y] + G = [ 1 0 1] [Co - 128] + B = [ 1 -1 -1] [Cg - 128] + +================================================================================================ +*/ + +#define RGB_TO_YCOCG_Y( r, g, b ) ( ( ( r + (g<<1) + b ) + 2 ) >> 2 ) +#define RGB_TO_YCOCG_CO( r, g, b ) ( ( ( (r<<1) - (b<<1) ) + 2 ) >> 2 ) +#define RGB_TO_YCOCG_CG( r, g, b ) ( ( ( - r + (g<<1) - b ) + 2 ) >> 2 ) + +#define COCG_TO_R( co, cg ) ( co - cg ) +#define COCG_TO_G( co, cg ) ( cg ) +#define COCG_TO_B( co, cg ) ( - co - cg ) + +/* +======================== +idColorSpace::ConvertRGBToYCoCg +======================== +*/ +void idColorSpace::ConvertRGBToYCoCg( byte *dst, const byte *src, int width, int height ) { + for ( int i = 0; i < width * height; i++ ) { + int r = src[i*4+0]; + int g = src[i*4+1]; + int b = src[i*4+2]; + int a = src[i*4+3]; + dst[i*4+0] = CLAMP_BYTE( RGB_TO_YCOCG_Y( r, g, b ) ); + dst[i*4+1] = CLAMP_BYTE( RGB_TO_YCOCG_CO( r, g, b ) + 128 ); + dst[i*4+2] = CLAMP_BYTE( RGB_TO_YCOCG_CG( r, g, b ) + 128 ); + dst[i*4+3] = a; + } +} + +/* +======================== +idColorSpace::ConvertYCoCgToRGB +======================== +*/ +void idColorSpace::ConvertYCoCgToRGB( byte *dst, const byte *src, int width, int height ) { + for ( int i = 0; i < width * height; i++ ) { + int y = src[i*4+0]; + int co = src[i*4+1] - 128; + int cg = src[i*4+2] - 128; + int a = src[i*4+3]; + dst[i*4+0] = CLAMP_BYTE( y + COCG_TO_R( co, cg ) ); + dst[i*4+1] = CLAMP_BYTE( y + COCG_TO_G( co, cg ) ); + dst[i*4+2] = CLAMP_BYTE( y + COCG_TO_B( co, cg ) ); + dst[i*4+3] = a; + } +} + +/* +======================== +idColorSpace::ConvertRGBToCoCg_Y +======================== +*/ +void idColorSpace::ConvertRGBToCoCg_Y( byte *dst, const byte *src, int width, int height ) { + for ( int i = 0; i < width * height; i++ ) { + int r = src[i*4+0]; + int g = src[i*4+1]; + int b = src[i*4+2]; + //int a = src[i*4+3]; + dst[i*4+0] = CLAMP_BYTE( RGB_TO_YCOCG_CO( r, g, b ) + 128 ); + dst[i*4+1] = CLAMP_BYTE( RGB_TO_YCOCG_CG( r, g, b ) + 128 ); + dst[i*4+2] = 0; + dst[i*4+3] = CLAMP_BYTE( RGB_TO_YCOCG_Y( r, g, b ) ); + } +} + +/* +======================== +idColorSpace::ConvertCoCg_YToRGB +======================== +*/ +void idColorSpace::ConvertCoCg_YToRGB( byte *dst, const byte *src, int width, int height ) { + for ( int i = 0; i < width * height; i++ ) { + int co = src[i*4+0] - 128; + int cg = src[i*4+1] - 128; + int a = src[i*4+2]; + int y = src[i*4+3]; + dst[i*4+0] = CLAMP_BYTE( y + COCG_TO_R( co, cg ) ); + dst[i*4+1] = CLAMP_BYTE( y + COCG_TO_G( co, cg ) ); + dst[i*4+2] = CLAMP_BYTE( y + COCG_TO_B( co, cg ) ); + dst[i*4+3] = a; + } +} + +/* +======================== +idColorSpace::ConvertCoCgSYToRGB + +A scale factor is encoded in the Z value to give better compression of +the color channels. +======================== +*/ +void idColorSpace::ConvertCoCgSYToRGB( byte * dst, const byte * src, int width, int height ) { + for ( int i = 0; i < width * height; i++ ) { + int co = src[i*4+0] - 128; + int cg = src[i*4+1] - 128; + int a = src[i*4+2]; + int y = src[i*4+3]; + float scale = 1.0f / ( 1.0f + a * ( 31.875f / 255.0f ) ) ; + co = idMath::Ftoi( co * scale ); + cg = idMath::Ftoi( cg * scale ); + dst[i*4+0] = CLAMP_BYTE( y + COCG_TO_R( co, cg ) ); + dst[i*4+1] = CLAMP_BYTE( y + COCG_TO_G( co, cg ) ); + dst[i*4+2] = CLAMP_BYTE( y + COCG_TO_B( co, cg ) ); + dst[i*4+3] = 255; + } +} + +/* +======================== +idColorSpace::ConvertRGBToYCoCg420 +======================== +*/ +void idColorSpace::ConvertRGBToYCoCg420( byte *dst, const byte *src, int width, int height ) { + int numSamples = 0; + for ( int j = 0; j < height; j += 2 ) { + for ( int i = 0; i < width; i += 2 ) { + int r0 = src[((j+0)*width+i+0)*4+0]; + int g0 = src[((j+0)*width+i+0)*4+1]; + int b0 = src[((j+0)*width+i+0)*4+2]; + int r1 = src[((j+0)*width+i+1)*4+0]; + int g1 = src[((j+0)*width+i+1)*4+1]; + int b1 = src[((j+0)*width+i+1)*4+2]; + int r2 = src[((j+1)*width+i+0)*4+0]; + int g2 = src[((j+1)*width+i+0)*4+1]; + int b2 = src[((j+1)*width+i+0)*4+2]; + int r3 = src[((j+1)*width+i+1)*4+0]; + int g3 = src[((j+1)*width+i+1)*4+1]; + int b3 = src[((j+1)*width+i+1)*4+2]; + int y0 = CLAMP_BYTE( RGB_TO_YCOCG_Y( r0, g0, b0 ) ); + int co0 = CLAMP_BYTE( RGB_TO_YCOCG_CO( r0, g0, b0 ) + 128 ); + int cg0 = CLAMP_BYTE( RGB_TO_YCOCG_CG( r0, g0, b0 ) + 128 ); + int y1 = CLAMP_BYTE( RGB_TO_YCOCG_Y( r1, g1, b1 ) ); + int co1 = CLAMP_BYTE( RGB_TO_YCOCG_CO( r1, g1, b1 ) + 128 ); + int cg1 = CLAMP_BYTE( RGB_TO_YCOCG_CG( r1, g1, b1 ) + 128 ); + int y2 = CLAMP_BYTE( RGB_TO_YCOCG_Y( r2, g2, b2 ) ); + int co2 = CLAMP_BYTE( RGB_TO_YCOCG_CO( r2, g2, b2 ) + 128 ); + int cg2 = CLAMP_BYTE( RGB_TO_YCOCG_CG( r2, g2, b2 ) + 128 ); + int y3 = CLAMP_BYTE( RGB_TO_YCOCG_Y( r3, g3, b3 ) ); + int co3 = CLAMP_BYTE( RGB_TO_YCOCG_CO( r3, g3, b3 ) + 128 ); + int cg3 = CLAMP_BYTE( RGB_TO_YCOCG_CG( r3, g3, b3 ) + 128 ); + dst[numSamples+0] = y0; + dst[numSamples+1] = y1; + dst[numSamples+2] = y2; + dst[numSamples+3] = y3; + dst[numSamples+4] = ( co0 + co1 + co2 + co3 ) >> 2; + dst[numSamples+5] = ( cg0 + cg1 + cg2 + cg3 ) >> 2; + numSamples += 6; + } + numSamples += width; + } +} + +/* +======================== +idColorSpace::ConvertYCoCg420ToRGB +======================== +*/ +void idColorSpace::ConvertYCoCg420ToRGB( byte *dst, const byte *src, int width, int height ) { + int numSamples = width * height * 2 - width; + for ( int j = height - 2; j >= 0; j -= 2 ) { + for ( int i = width - 2; i >= 0; i -= 2 ) { + int y0 = src[numSamples-6]; + int y1 = src[numSamples-5]; + int y2 = src[numSamples-4]; + int y3 = src[numSamples-3]; + int co = src[numSamples-2] - 128; + int cg = src[numSamples-1] - 128; + numSamples -= 6; + int r = COCG_TO_R( co, cg ); + int g = COCG_TO_G( co, cg ); + int b = COCG_TO_B( co, cg ); + dst[((j+0)*width+i+0)*4+0] = CLAMP_BYTE( y0 + r ); + dst[((j+0)*width+i+0)*4+1] = CLAMP_BYTE( y0 + g ); + dst[((j+0)*width+i+0)*4+2] = CLAMP_BYTE( y0 + b ); + dst[((j+0)*width+i+1)*4+0] = CLAMP_BYTE( y1 + r ); + dst[((j+0)*width+i+1)*4+1] = CLAMP_BYTE( y1 + g ); + dst[((j+0)*width+i+1)*4+2] = CLAMP_BYTE( y1 + b ); + dst[((j+1)*width+i+0)*4+0] = CLAMP_BYTE( y2 + r ); + dst[((j+1)*width+i+0)*4+1] = CLAMP_BYTE( y2 + g ); + dst[((j+1)*width+i+0)*4+2] = CLAMP_BYTE( y2 + b ); + dst[((j+1)*width+i+1)*4+0] = CLAMP_BYTE( y3 + r ); + dst[((j+1)*width+i+1)*4+1] = CLAMP_BYTE( y3 + g ); + dst[((j+1)*width+i+1)*4+2] = CLAMP_BYTE( y3 + b ); + } + numSamples -= width; + } +} + +/* +================================================================================================ +To *Color-Convert RGB and YCbCr* ColorSpaces, note that YCbCr is defined per +CCIR 601-1, except that Cb and Cr are normalized to the range 0 -> 255 rather than -0.5 -> 0.5. +The conversion equations to be implemented are therefore: + + + Y = [ 0.29900 0.58700 0.11400] [R] + Cb = [-0.16874 -0.33126 0.50000] [G] + 128 + Cr = [ 0.50000 -0.41869 -0.08131] [B] + 128 + + R = [ 1.00000 0.00000 1.40200] [Y] + G = [ 1.00000 -0.34414 -0.71414] [Cb - 128] + B = [ 1.00000 1.77200 0.00000] [Cr - 128] + + +These numbers are derived from TIFF 6.0 section 21, dated 3-June-92. To avoid floating-point +arithmetic, we represent the fractional constants as integers scaled up by 2^16 (about 4 digits +precision); we have to divide the products by 2^16, with appropriate rounding, to get the +correct answer. +================================================================================================ +*/ + +const int ycbcr_shift = 16; +const int ycbcr_round = 1 << ( ycbcr_shift - 1 ); + +const int r029900 = 19595; // int( 0.29900 * (1<<16) + 0.5 ) +const int g058700 = 38470; // int( 0.58700 * (1<<16) + 0.5 ) +const int b011400 = 7471; // int( 0.11400 * (1<<16) + 0.5 ) + +const int r016874 = 11059; // int( 0.16874 * (1<<16) + 0.5 ) +const int g033126 = 21709; // int( 0.33126 * (1<<16) + 0.5 ) +const int b050000 = 32768; // int( 0.50000 * (1<<16) + 0.5 ) + +const int r050000 = 32768; // int( 0.50000 * (1<<16) + 0.5 ) +const int g041869 = 27439; // int( 0.41869 * (1<<16) + 0.5 ) +const int b008131 = 5329; // int( 0.08131 * (1<<16) + 0.5 ) + +const int r140200 = 91881; // int( 1.40200 * (1<<16) + 0.5 ) +const int b177200 = 116130; // int( 1.77200 * (1<<16) + 0.5 ) +const int g071414 = 46802; // int( 0.71414 * (1<<16) + 0.5 ) +const int g034414 = 22554; // int( 0.34414 * (1<<16) + 0.5 ) + +#define RGB_TO_YCBCR_Y( r, g, b ) ( ( ( r * r029900 + g * g058700 + b * b011400 ) + ycbcr_round ) >> ycbcr_shift ) +#define RGB_TO_YCBCR_CB( r, g, b ) ( ( ( - r * r016874 - g * g033126 + b * b050000 ) + ycbcr_round ) >> ycbcr_shift ) +#define RGB_TO_YCBCR_CR( r, g, b ) ( ( ( r * r050000 - g * g041869 - b * b008131 ) + ycbcr_round ) >> ycbcr_shift ) + +#define CBCR_TO_R( cb, cr ) ( ( ycbcr_round + cr * r140200 ) >> ycbcr_shift ) +#define CBCR_TO_G( cb, cr ) ( ( ycbcr_round - cb * g034414 - cr * g071414 ) >> ycbcr_shift ) +#define CBCR_TO_B( cb, cr ) ( ( ycbcr_round + cb * b177200 ) >> ycbcr_shift ) + +/* +======================== +idColorSpace::ConvertRGBToYCbCr +======================== +*/ +void idColorSpace::ConvertRGBToYCbCr( byte *dst, const byte *src, int width, int height ) { + for ( int i = 0; i < width * height; i++ ) { + int r = src[i*4+0]; + int g = src[i*4+1]; + int b = src[i*4+2]; + int a = src[i*4+3]; + dst[i*4+0] = CLAMP_BYTE( RGB_TO_YCBCR_Y( r, g, b ) ); + dst[i*4+1] = CLAMP_BYTE( RGB_TO_YCBCR_CB( r, g, b ) + 128 ); + dst[i*4+2] = CLAMP_BYTE( RGB_TO_YCBCR_CR( r, g, b ) + 128 ); + dst[i*4+3] = a; + } +} + +/* +======================== +idColorSpace::ConvertYCbCrToRGB +======================== +*/ +void idColorSpace::ConvertYCbCrToRGB( byte *dst, const byte *src, int width, int height ) { + for ( int i = 0; i < width * height; i++ ) { + int y = src[i*4+0]; + int cb = src[i*4+1] - 128; + int cr = src[i*4+2] - 128; + dst[i*4+0] = CLAMP_BYTE( y + CBCR_TO_R( cb, cr ) ); + dst[i*4+1] = CLAMP_BYTE( y + CBCR_TO_G( cb, cr ) ); + dst[i*4+2] = CLAMP_BYTE( y + CBCR_TO_B( cb, cr ) ); + } +} + +/* +======================== +idColorSpace::ConvertRGBToCbCr_Y +======================== +*/ +void idColorSpace::ConvertRGBToCbCr_Y( byte *dst, const byte *src, int width, int height ) { + for ( int i = 0; i < width * height; i++ ) { + int r = src[i*4+0]; + int g = src[i*4+1]; + int b = src[i*4+2]; + int a = src[i*4+3]; + dst[i*4+0] = CLAMP_BYTE( RGB_TO_YCBCR_CB( r, g, b ) + 128 ); + dst[i*4+1] = CLAMP_BYTE( RGB_TO_YCBCR_CR( r, g, b ) + 128 ); + dst[i*4+2] = a; + dst[i*4+3] = CLAMP_BYTE( RGB_TO_YCBCR_Y( r, g, b ) ); + } +} + +/* +======================== +idColorSpace::ConvertCbCr_YToRGB +======================== +*/ +void idColorSpace::ConvertCbCr_YToRGB( byte *dst, const byte *src, int width, int height ) { + for ( int i = 0; i < width * height; i++ ) { + int cb = src[i*4+0] - 128; + int cr = src[i*4+1] - 128; + int a = src[i*4+2]; + int y = src[i*4+3]; + dst[i*4+0] = CLAMP_BYTE( y + CBCR_TO_R( cb, cr ) ); + dst[i*4+1] = CLAMP_BYTE( y + CBCR_TO_G( cb, cr ) ); + dst[i*4+2] = CLAMP_BYTE( y + CBCR_TO_B( cb, cr ) ); + dst[i*4+3] = a; + } +} + +/* +======================== +idColorSpace::ConvertRGBToYCbCr420 +======================== +*/ +void idColorSpace::ConvertRGBToYCbCr420( byte *dst, const byte *src, int width, int height ) { + int numSamples = 0; + for ( int j = 0; j < height; j += 2 ) { + for ( int i = 0; i < width; i += 2 ) { + int r0 = src[((j+0)*width+i+0)*4+0]; + int g0 = src[((j+0)*width+i+0)*4+1]; + int b0 = src[((j+0)*width+i+0)*4+2]; + int r1 = src[((j+0)*width+i+1)*4+0]; + int g1 = src[((j+0)*width+i+1)*4+1]; + int b1 = src[((j+0)*width+i+1)*4+2]; + int r2 = src[((j+1)*width+i+0)*4+0]; + int g2 = src[((j+1)*width+i+0)*4+1]; + int b2 = src[((j+1)*width+i+0)*4+2]; + int r3 = src[((j+1)*width+i+1)*4+0]; + int g3 = src[((j+1)*width+i+1)*4+1]; + int b3 = src[((j+1)*width+i+1)*4+2]; + int y0 = CLAMP_BYTE( RGB_TO_YCBCR_Y( r0, g0, b0 ) ); + int cb0 = CLAMP_BYTE( RGB_TO_YCBCR_CB( r0, g0, b0 ) + 128 ); + int cr0 = CLAMP_BYTE( RGB_TO_YCBCR_CR( r0, g0, b0 ) + 128 ); + int y1 = CLAMP_BYTE( RGB_TO_YCBCR_Y( r1, g1, b1 ) ); + int cb1 = CLAMP_BYTE( RGB_TO_YCBCR_CB( r1, g1, b1 ) + 128 ); + int cr1 = CLAMP_BYTE( RGB_TO_YCBCR_CR( r1, g1, b1 ) + 128 ); + int y2 = CLAMP_BYTE( RGB_TO_YCBCR_Y( r2, g2, b2 ) ); + int cb2 = CLAMP_BYTE( RGB_TO_YCBCR_CB( r2, g2, b2 ) + 128 ); + int cr2 = CLAMP_BYTE( RGB_TO_YCBCR_CR( r2, g2, b2 ) + 128 ); + int y3 = CLAMP_BYTE( RGB_TO_YCBCR_Y( r3, g3, b3 ) ); + int cb3 = CLAMP_BYTE( RGB_TO_YCBCR_CB( r3, g3, b3 ) + 128 ); + int cr3 = CLAMP_BYTE( RGB_TO_YCBCR_CR( r3, g3, b3 ) + 128 ); + dst[numSamples+0] = y0; + dst[numSamples+1] = y1; + dst[numSamples+2] = y2; + dst[numSamples+3] = y3; + dst[numSamples+4] = ( cb0 + cb1 + cb2 + cb3 ) >> 2; + dst[numSamples+5] = ( cr0 + cr1 + cr2 + cr3 ) >> 2; + numSamples += 6; + } + numSamples += width; + } +} + +/* +======================== +idColorSpace::ConvertYCbCr420ToRGB +======================== +*/ +void idColorSpace::ConvertYCbCr420ToRGB( byte *dst, const byte *src, int width, int height ) { + int numSamples = width * height * 2 - width; + for ( int j = height - 2; j >= 0; j -= 2 ) { + for ( int i = width - 2; i >= 0; i -= 2 ) { + int y0 = src[numSamples-6]; + int y1 = src[numSamples-5]; + int y2 = src[numSamples-4]; + int y3 = src[numSamples-3]; + int co = src[numSamples-2] - 128; + int cg = src[numSamples-1] - 128; + numSamples -= 6; + int r = CBCR_TO_R( co, cg ); + int g = CBCR_TO_G( co, cg ); + int b = CBCR_TO_B( co, cg ); + dst[((j+0)*width+i+0)*4+0] = CLAMP_BYTE( y0 + r ); + dst[((j+0)*width+i+0)*4+1] = CLAMP_BYTE( y0 + g ); + dst[((j+0)*width+i+0)*4+2] = CLAMP_BYTE( y0 + b ); + dst[((j+0)*width+i+1)*4+0] = CLAMP_BYTE( y1 + r ); + dst[((j+0)*width+i+1)*4+1] = CLAMP_BYTE( y1 + g ); + dst[((j+0)*width+i+1)*4+2] = CLAMP_BYTE( y1 + b ); + dst[((j+1)*width+i+0)*4+0] = CLAMP_BYTE( y2 + r ); + dst[((j+1)*width+i+0)*4+1] = CLAMP_BYTE( y2 + g ); + dst[((j+1)*width+i+0)*4+2] = CLAMP_BYTE( y2 + b ); + dst[((j+1)*width+i+1)*4+0] = CLAMP_BYTE( y3 + r ); + dst[((j+1)*width+i+1)*4+1] = CLAMP_BYTE( y3 + g ); + dst[((j+1)*width+i+1)*4+2] = CLAMP_BYTE( y3 + b ); + } + numSamples -= width; + } +} + +/* +======================== +idColorSpace::ConvertNormalMapToStereographicHeightMap + +Converts a tangent space normal map to a height map. +The iterative algorithm is pretty crappy but it's reasonably fast and good enough for testing purposes. +The algorithm uses a stereographic projection of the normals to reduce the entropy and preserve +significantly more detail. + +A better approach would be to solve the massive but rather sparse matrix system: + +[ c(1,0) c(1,1) ... c(1,w*h) ] [ H(1,1) ] [ Nx(1,1) ] +[ c(2,0) c(2,1) ... c(2,w*h) ] [ H(1,2) ] = [ Ny(1,1) ] +[ ... ] [ ... ] [ ... ] +[ ... ] [ H(w,h) ] [ Nx(w,h) ] +[ c(w*h*2,0) c(w*h*2,1) ... c(w*h*2,w*h)] [ Ny(w,h) ] + +Where: w = width, h = height, H(i,j) = height, Nx(i,j) = (normal.x/(1+normal.z), Ny(i,j) = (normal.y/(1+normal.z) +The c(i,j) are setup such that: + +Nx(i,j) = H(i,j) - H(i,j+1) +Ny(i,j) = H(i,j) - H(i+1,j) +Nx(i,w) = H(i,w) +Ny(h,j) = H(h,j) + +======================== +*/ +void idColorSpace::ConvertNormalMapToStereographicHeightMap( byte *heightMap, const byte *normalMap, int width, int height, float &scale ) { + + idTempArray buffer( (width+1) * (height+1) * sizeof( float ) ); + float * temp = (float *)buffer.Ptr(); + memset( temp, 0, (width+1) * (height+1) * sizeof( float ) ); + + const int NUM_ITERATIONS = 32; + + float scale0 = 0.1f; + float scale1 = 0.9f; + + for ( int n = 0; n < NUM_ITERATIONS; n++ ) { + for ( int i = 0; i < height; i++ ) { + for ( int j = 1; j < width; j++ ) { + float x = NORMALMAP_BYTE_TO_FLOAT( normalMap[( (i+0) * width + (j+0) ) * 4 + 0] ); + float z = NORMALMAP_BYTE_TO_FLOAT( normalMap[( (i+0) * width + (j+0) ) * 4 + 2] ); + temp[i * width + j] = scale0 * temp[i * width + j] + scale1 * ( temp[(i+0) * width + (j-1)] - ( x / (1+z) ) ); + } + } + for ( int i = 1; i < height; i++ ) { + for ( int j = 0; j < width; j++ ) { + float y = NORMALMAP_BYTE_TO_FLOAT( normalMap[( (i+0) * width + (j+0) ) * 4 + 1] ); + float z = NORMALMAP_BYTE_TO_FLOAT( normalMap[( (i+0) * width + (j+0) ) * 4 + 2] ); + temp[i * width + j] = scale0 * temp[i * width + j] + scale1 * ( temp[(i-1) * width + (j+0)] - ( y / (1+z)) ); + } + } + for ( int i = 0; i < height; i++ ) { + for ( int j = width - 1; j > 0; j-- ) { + float x = NORMALMAP_BYTE_TO_FLOAT( normalMap[( (i+0) * width + (j-1) ) * 4 + 0] ); + float z = NORMALMAP_BYTE_TO_FLOAT( normalMap[( (i+0) * width + (j-1) ) * 4 + 2] ); + temp[i * width + (j-1)] = scale0 * temp[i * width + (j-1)] + scale1 * ( temp[(i+0) * width + (j+0)] + ( x / (1+z) ) ); + } + } + for ( int i = height - 1; i > 0; i-- ) { + for ( int j = 0; j < width; j++ ) { + float y = NORMALMAP_BYTE_TO_FLOAT( normalMap[( (i-1) * width + (j+0) ) * 4 + 1] ); + float z = NORMALMAP_BYTE_TO_FLOAT( normalMap[( (i-1) * width + (j+0) ) * 4 + 2] ); + temp[(i-1) * width + j] = scale0 * temp[(i-1) * width + j] + scale1 * ( temp[(i+0) * width + (j+0)] + ( y / (1+z) ) ); + } + } + + scale1 *= 0.99f; + scale0 = 1.0f - scale1; + } + + float minHeight = idMath::INFINITY; + float maxHeight = -idMath::INFINITY; + for ( int j = 0; j < height; j++ ) { + for ( int i = 0; i < width; i++ ) { + if ( temp[j*width+i] < minHeight ) { + minHeight = temp[j*width+i]; + } + if ( temp[j*width+i] > maxHeight ) { + maxHeight = temp[j*width+i]; + } + } + } + + scale = ( maxHeight - minHeight ); + + float s = 255.0f / scale; + for ( int j = 0; j < height; j++ ) { + for ( int i = 0; i < width; i++ ) { + heightMap[j*width+i] = idMath::Ftob( ( temp[j*width+i] - minHeight ) * s ); + } + } +} + +/* +======================== +idColorSpace::ConvertStereographicHeightMapToNormalMap + +This converts a heightmap of a stereographically projected normal map back into a regular normal map. +======================== +*/ +void idColorSpace::ConvertStereographicHeightMapToNormalMap( byte *normalMap, const byte *heightMap, int width, int height, float scale ) { + for ( int i = 0; i < height; i++ ) { + int previ = Max( i, 0 ); + int nexti = Min( i + 1, height - 1 ); + + for ( int j = 0; j < width; j++ ) { + int prevj = Max( j, 0 ); + int nextj = Min( j + 1, width - 1 ); + + idVec3 normal; + float pX = scale * ( heightMap[i * width + prevj] - heightMap[i * width + nextj] ) / 255.0f; + float pY = scale * ( heightMap[previ * width + j] - heightMap[nexti * width + j] ) / 255.0f; + float denom = 2.0f / ( 1.0f + pX * pX + pY * pY ); + normal.x = pX * denom; + normal.y = pY * denom; + normal.z = denom - 1.0f; + + normalMap[ ( i * width + j ) * 4 + 0 ] = NORMALMAP_FLOAT_TO_BYTE( normal[0] ); + normalMap[ ( i * width + j ) * 4 + 1 ] = NORMALMAP_FLOAT_TO_BYTE( normal[1] ); + normalMap[ ( i * width + j ) * 4 + 2 ] = NORMALMAP_FLOAT_TO_BYTE( normal[2] ); + normalMap[ ( i * width + j ) * 4 + 3 ] = 255; + } + } +} + +/* +======================== +idColorSpace::ConvertRGBToMonochrome +======================== +*/ +void idColorSpace::ConvertRGBToMonochrome( byte *mono, const byte *rgb, int width, int height ) { + for ( int i = 0; i < height; i++ ) { + for ( int j = 0; j < width; j++ ) { + mono[i * width + j] = ( rgb[( i * width + j ) * 4 + 0] + + rgb[( i * width + j ) * 4 + 1] + + rgb[( i * width + j ) * 4 + 2] ) / 3; + } + } +} + +/* +======================== +idColorSpace::ConvertMonochromeToRGB +======================== +*/ +void idColorSpace::ConvertMonochromeToRGB( byte *rgb, const byte *mono, int width, int height ) { + for ( int i = 0; i < height; i++ ) { + for ( int j = 0; j < width; j++ ) { + rgb[( i * width + j ) * 4 + 0] = mono[i * width + j]; + rgb[( i * width + j ) * 4 + 1] = mono[i * width + j]; + rgb[( i * width + j ) * 4 + 2] = mono[i * width + j]; + } + } +} diff --git a/src/renderer/Color/ColorSpace.h b/src/renderer/Color/ColorSpace.h new file mode 100644 index 00000000..4706aa2b --- /dev/null +++ b/src/renderer/Color/ColorSpace.h @@ -0,0 +1,64 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ +#ifndef __COLORSPACE_H__ +#define __COLORSPACE_H__ + +/* +================================================================================================ +Contains the ColorSpace conversion declarations. +================================================================================================ +*/ + +namespace idColorSpace { + void ConvertRGBToYCoCg( byte *dst, const byte *src, int width, int height ); + void ConvertYCoCgToRGB( byte *dst, const byte *src, int width, int height ); + + void ConvertRGBToCoCg_Y( byte *dst, const byte *src, int width, int height ); + void ConvertCoCg_YToRGB( byte *dst, const byte *src, int width, int height ); + void ConvertCoCgSYToRGB( byte *dst, const byte *src, int width, int height ); + + void ConvertRGBToYCoCg420( byte *dst, const byte *src, int width, int height ); + void ConvertYCoCg420ToRGB( byte *dst, const byte *src, int width, int height ); + + void ConvertRGBToYCbCr( byte *dst, const byte *src, int width, int height ); + void ConvertYCbCrToRGB( byte *dst, const byte *src, int width, int height ); + + void ConvertRGBToCbCr_Y( byte *dst, const byte *src, int width, int height ); + void ConvertCbCr_YToRGB( byte *dst, const byte *src, int width, int height ); + + void ConvertRGBToYCbCr420( byte *dst, const byte *src, int width, int height ); + void ConvertYCbCr420ToRGB( byte *dst, const byte *src, int width, int height ); + + void ConvertNormalMapToStereographicHeightMap( byte *heightMap, const byte *normalMap, int width, int height, float &scale ); + void ConvertStereographicHeightMapToNormalMap( byte *normalMap, const byte *heightMap, int width, int height, float scale ); + + void ConvertRGBToMonochrome( byte *mono, const byte *rgb, int width, int height ); + void ConvertMonochromeToRGB( byte *rgb, const byte *mono, int width, int height ); +}; + +#endif // !__COLORSPACE_H__ diff --git a/src/renderer/DXT/DXTCodec.h b/src/renderer/DXT/DXTCodec.h new file mode 100644 index 00000000..76d76daf --- /dev/null +++ b/src/renderer/DXT/DXTCodec.h @@ -0,0 +1,624 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ +#ifndef __DXTCODEC_H__ +#define __DXTCODEC_H__ + +/* +================================================================================================ +Contains the DxtEncoder and DxtDecoder declarations. +================================================================================================ +*/ + +/* +================================================ +idDxtEncoder encodes Images in a number of DXT formats. Raw input Images are assumed to be in +4-byte RGBA format. Raw input NormalMaps are assumed to be in 4-byte tangent-space NxNyNz format. + +The supported formats are: + * DXT1 = colors in 4x4 block approximated by equidistant points on a line through 3D space + * DXT2 = DXT3 + colors are pre-multiplied by alpha + * DXT3 = DXT1 + explicit 4-bit alpha + * DXT4 = DXT5 + colors are pre-multiplied by alpha + * DXT5 = DXT1 + alpha values in 4x4 block approximated by equidistant points on line through alpha space + * CTX1 = colors in a 4x4 block approximated by equidistant points on a line through 2D space + * DXN1 = one DXT5 alpha block (aka DXT5A, or ATI1N) + * DXN2 = two DXT5 alpha blocks (aka 3Dc, or ATI2N) +================================================ +*/ +class idDxtEncoder { +public: + idDxtEncoder() { srcPadding = dstPadding = 0; } + ~idDxtEncoder() {} + + void SetSrcPadding( int pad ) { srcPadding = pad; } + void SetDstPadding( int pad ) { dstPadding = pad; } + + // high quality DXT1 compression (no alpha), uses exhaustive search to find a line through color space and is very slow + void CompressImageDXT1HQ( const byte *inBuf, byte *outBuf, int width, int height ); + + // fast DXT1 compression (no alpha), for real-time use at the cost of a little quality + void CompressImageDXT1Fast( const byte *inBuf, byte *outBuf, int width, int height ); + void CompressImageDXT1Fast_Generic( const byte *inBuf, byte *outBuf, int width, int height ); + void CompressImageDXT1Fast_SSE2( const byte *inBuf, byte *outBuf, int width, int height ); + + // high quality DXT1 compression (with alpha), uses exhaustive search to find a line through color space and is very slow + void CompressImageDXT1AlphaHQ( const byte *inBuf, byte *outBuf, int width, int height ) { /* not implemented */ assert( 0 ); } + + // fast DXT1 compression (with alpha), for real-time use at the cost of a little quality + void CompressImageDXT1AlphaFast( const byte *inBuf, byte *outBuf, int width, int height ); + void CompressImageDXT1AlphaFast_Generic( const byte *inBuf, byte *outBuf, int width, int height ); + void CompressImageDXT1AlphaFast_SSE2( const byte *inBuf, byte *outBuf, int width, int height ); + + // high quality DXT5 compression, uses exhaustive search to find a line through color space and is generally + // too slow to actually use for anything + void CompressImageDXT5HQ( const byte *inBuf, byte *outBuf, int width, int height ); + + // fast DXT5 compression for real-time use at the cost of a little quality + void CompressImageDXT5Fast( const byte *inBuf, byte *outBuf, int width, int height ); + void CompressImageDXT5Fast_Generic( const byte *inBuf, byte *outBuf, int width, int height ); + void CompressImageDXT5Fast_SSE2( const byte *inBuf, byte *outBuf, int width, int height ); + + // high quality CTX1 compression, uses exhaustive search to find a line through 2D space and is very slow + void CompressImageCTX1HQ( const byte *inBuf, byte *outBuf, int width, int height ); + + // fast CTX1 compression for real-time use + void CompressImageCTX1Fast( const byte *inBuf, byte *outBuf, int width, int height ) { /* not implemented */ assert( 0 ); } + void CompressImageCTX1Fast_Generic( const byte *inBuf, byte *outBuf, int width, int height ) { /* not implemented */ assert( 0 ); } + void CompressImageCTX1Fast_SSE2( const byte *inBuf, byte *outBuf, int width, int height ) { /* not implemented */ assert( 0 ); } + + // high quality DXN1 (aka DXT5A or ATI1N) compression, uses exhaustive search to find a line through color space and is very slow + void CompressImageDXN1HQ( const byte *inBuf, byte *outBuf, int width, int height ) { /* not implemented */ assert( 0 ); } + + // fast single channel compression into, DXN1 (aka DXT5A or ATI1N) format, for real-time use + void CompressImageDXN1Fast( const byte *inBuf, byte *outBuf, int width, int height ); + void CompressImageDXN1Fast_Generic( const byte *inBuf, byte *outBuf, int width, int height ); + void CompressImageDXN1Fast_SSE2( const byte *inBuf, byte *outBuf, int width, int height ) { /* not implemented */ assert( 0 ); } + + // high quality YCoCg DXT5 compression, uses exhaustive search to find a line through color space and is very slow + void CompressYCoCgDXT5HQ( const byte *inBuf, byte *outBuf, int width, int height ); + + // fast YCoCg DXT5 compression for real-time use (the input is expected to be in CoCg_Y format) + void CompressYCoCgDXT5Fast( const byte *inBuf, byte *outBuf, int width, int height ); + void CompressYCoCgDXT5Fast_Generic( const byte *inBuf, byte *outBuf, int width, int height ); + void CompressYCoCgDXT5Fast_SSE2( const byte *inBuf, byte *outBuf, int width, int height ); + + // fast YCoCg-Alpha DXT5 compression for real-time use (the input is expected to be in CoCgAY format) + void CompressYCoCgAlphaDXT5Fast( const byte *inBuf, byte *outBuf, int width, int height ); + + // high quality YCoCg CTX1 + DXT5A compression, uses exhaustive search to find a line through 2D space and is very slow + void CompressYCoCgCTX1DXT5AHQ( const byte *inBuf, byte *outBuf, int width, int height ); + + // fast YCoCg CTX1 + DXT5A compression for real-time use (the input is expected to be in CoCg_Y format) + void CompressYCoCgCTX1DXT5AFast( const byte *inBuf, byte *outBuf, int width, int height ); + void CompressYCoCgCTX1DXT5AFast_Generic( const byte *inBuf, byte *outBuf, int width, int height ); + void CompressYCoCgCTX1DXT5AFast_SSE2( const byte *inBuf, byte *outBuf, int width, int height ) { /* not implemented */ assert( 0 ); } + + // high quality tangent space NxNyNz normal map compression into DXT1 format (Nz is not used) + void CompressNormalMapDXT1HQ( const byte *inBuf, byte *outBuf, int width, int height ); + void CompressNormalMapDXT1RenormalizeHQ( const byte *inBuf, byte *outBuf, int width, int height ); + + // fast tangent space NxNyNz normal map compression into DXT1 format (Nz is not used), for real-time use + void CompressNormalMapDXT1Fast( const byte *inBuf, byte *outBuf, int width, int height ) { /* not implemented */ assert( 0 ); } + void CompressNormalMapDXT1Fast_Generic( const byte *inBuf, byte *outBuf, int width, int height ) { /* not implemented */ assert( 0 ); } + void CompressNormalMapDXT1Fast_SSE2( const byte *inBuf, byte *outBuf, int width, int height ) { /* not implemented */ assert( 0 ); } + + // high quality tangent space _Ny_Nx normal map compression into DXT5 format + void CompressNormalMapDXT5HQ( const byte *inBuf, byte *outBuf, int width, int height ); + void CompressNormalMapDXT5RenormalizeHQ( const byte *inBuf, byte *outBuf, int width, int height ); + + // fast tangent space _Ny_Nx normal map compression into DXT5 format, for real-time use + void CompressNormalMapDXT5Fast( const byte *inBuf, byte *outBuf, int width, int height ); + void CompressNormalMapDXT5Fast_Generic( const byte *inBuf, byte *outBuf, int width, int height ); + void CompressNormalMapDXT5Fast_SSE2( const byte *inBuf, byte *outBuf, int width, int height ); + + // high quality tangent space NxNy_ normal map compression into DXN2 (3Dc, ATI2N) format + void CompressNormalMapDXN2HQ( const byte *inBuf, byte *outBuf, int width, int height ); + + // fast tangent space NxNy_ normal map compression into DXN2 (3Dc, ATI2N) format, for real-time use + void CompressNormalMapDXN2Fast( const byte *inBuf, byte *outBuf, int width, int height ); + void CompressNormalMapDXN2Fast_Generic( const byte *inBuf, byte *outBuf, int width, int height ); + void CompressNormalMapDXN2Fast_SSE2( const byte *inBuf, byte *outBuf, int width, int height ) { /* not implemented */ assert( 0 ); } + + // fast single channel conversion from DXN1 (aka DXT5A or ATI1N) to DXT1, reasonably fast (also works in-place) + void ConvertImageDXN1_DXT1( const byte *inBuf, byte *outBuf, int width, int height ); + + // fast single channel conversion from DXT1 to DXN1 (aka DXT5A or ATI1N), reasonably fast (also works in-place) + void ConvertImageDXT1_DXN1( const byte *inBuf, byte *outBuf, int width, int height ) { /* not implemented */ assert( 0 ); } + + // fast tangent space NxNyNz normal map conversion from DXN (3Dc, ATI2N) to DXT5, reasonably fast (also works in-place) + void ConvertNormalMapDXN2_DXT5( const byte *inBuf, byte *outBuf, int width, int height ); + + // fast tangent space NxNyNz normal map conversion DXT5 to DXN (3Dc, ATI2N), reasonably fast (also works in-place) + void ConvertNormalMapDXT5_DXN2( const byte *inBuf, byte *outBuf, int width, int height ); + +private: + int width; + int height; + byte * outData; + int srcPadding; + int dstPadding; + + void EmitByte( byte b ); + void EmitUShort( unsigned short s ); + void EmitUInt( unsigned int i ); + unsigned int AlphaDistance( const byte a1, const byte a2 ) const; + unsigned int ColorDistance( const byte *c1, const byte *c2 ) const; + unsigned int ColorDistanceWeighted( const byte *c1, const byte *c2 ) const; + unsigned int CTX1Distance( const byte *c1, const byte *c2 ) const; + unsigned short ColorTo565( const byte *color ) const; + unsigned short ColorTo565( byte r, byte g, byte b ) const; + void ColorFrom565( unsigned short c565, byte *color ) const; + byte GreenFrom565( unsigned short c565 ) const; + + void NV4XHardwareBugFix( byte *minColor, byte *maxColor ) const; + + bool HasConstantValuePer4x4Block( const byte *inBuf, int width, int height, int channel ) const; + void WriteTinyColorDXT1( const byte *inBuf, int width, int height ); + void WriteTinyColorDXT5( const byte *inBuf, int width, int height ); + void WriteTinyColorCTX1DXT5A( const byte *inBuf, int width, int height ); + void WriteTinyNormalMapDXT5( const byte *NxNy, int width, int height ); + void WriteTinyNormalMapDXN( const byte *NxNy, int width, int height ); + void WriteTinyDXT5A( const byte *NxNy, int width, int height ); + + void GetMinMaxColorsMaxDist( const byte *colorBlock, byte *minColor, byte *maxColor ) const; + void GetMinMaxColorsLuminance( const byte *colorBlock, byte *minColor, byte *maxColor ) const; + int GetSquareAlphaError( const byte *colorBlock, const int alphaOffset, const byte minAlpha, const byte maxAlpha, int lastError ) const; + int GetMinMaxAlphaHQ( const byte *colorBlock, const int alphaOffset, byte *minColor, byte *maxColor ) const; + int GetSquareColorsError( const byte *colorBlock, const unsigned short color0, const unsigned short color1, int lastError ) const; + int GetMinMaxColorsHQ( const byte *colorBlock, byte *minColor, byte *maxColor, bool noBlack ) const; + int GetSquareCTX1Error( const byte *colorBlock, const byte *color0, const byte *color1, int lastError ) const; + int GetMinMaxCTX1HQ( const byte *colorBlock, byte *minColor, byte *maxColor ) const; + int GetSquareNormalYError( const byte *colorBlock, const unsigned short color0, const unsigned short color1, int lastError, int scale ) const; + int GetMinMaxNormalYHQ( const byte *colorBlock, byte *minColor, byte *maxColor, bool noBlack, int scale ) const; + int GetSquareNormalsDXT1Error( const int *colorBlock, const unsigned short color0, const unsigned short color1, int lastError, unsigned int &colorIndices ) const; + int GetMinMaxNormalsDXT1HQ( const byte *colorBlock, byte *minColor, byte *maxColor, unsigned int &colorIndices, bool noBlack ) const; + int GetSquareNormalsDXT5Error( const int *normalBlock, const byte *minNormal, const byte *maxNormal, int lastError, unsigned int &colorIndices, byte *alphaIndices ) const; + int GetMinMaxNormalsDXT5HQ( const byte *normalBlock, byte *minColor, byte *maxColor, unsigned int &colorIndices, byte *alphaIndices ) const; + int GetMinMaxNormalsDXT5HQFast( const byte *normalBlock, byte *minColor, byte *maxColor, unsigned int &colorIndices, byte *alphaIndices ) const; + void ScaleYCoCg( byte *colorBlock ) const; + void BiasScaleNormalY( byte *colorBlock ) const; + void RotateNormalsDXT1( byte *block ) const; + void RotateNormalsDXT5( byte *block ) const; + int FindColorIndices( const byte *colorBlock, const unsigned short color0, const unsigned short color1, unsigned int &result ) const; + int FindAlphaIndices( const byte *colorBlock, const int alphaOffset, const byte alpha0, const byte alpha1, byte *indexes ) const; + int FindCTX1Indices( const byte *colorBlock, const byte *color0, const byte *color1, unsigned int &result ) const; + + void ExtractBlock( const byte *inPtr, int width, byte *colorBlock ) const; + void GetMinMaxBBox( const byte *colorBlock, byte *minColor, byte *maxColor ) const; + void InsetColorsBBox( byte *minColor, byte *maxColor ) const; + void SelectColorsDiagonal( const byte *colorBlock, byte *minColor, byte *maxColor ) const; + void ScaleYCoCg( byte *colorBlock, byte *minColor, byte *maxColor ) const; + void InsetYCoCgAlpaBBox( byte *minColor, byte *maxColor ) const; + void InsetYCoCgBBox( byte *minColor, byte *maxColor ) const; + void SelectYCoCgDiagonal( const byte *colorBlock, byte *minColor, byte *maxColor ) const; + void InsetNormalsBBoxDXT5( byte *minNormal, byte *maxNormal ) const; + void InsetNormalsBBox3Dc( byte *minNormal, byte *maxNormal ) const; + void EmitColorIndices( const byte *colorBlock, const byte *minColor, const byte *maxColor ); + void EmitColorAlphaIndices( const byte *colorBlock, const byte *minColor, const byte *maxColor ); + void EmitCTX1Indices( const byte *colorBlock, const byte *minColor, const byte *maxColor ); + void EmitAlphaIndices( const byte *colorBlock, const int channel, const byte minAlpha, const byte maxAlpha ); + void EmitGreenIndices( const byte *block, const int channel, const byte minGreen, const byte maxGreen ); + + // Keeping the ASM versions to keep the performance of 32-bit debug builds reasonable. + // The implementation using intrinsics is very slow in debug builds because registers are continuously spilled to memory. + void ExtractBlock_SSE2( const byte *inPtr, int width, byte *colorBlock ) const; + void GetMinMaxBBox_SSE2( const byte *colorBlock, byte *minColor, byte *maxColor ) const; + void InsetColorsBBox_SSE2( byte *minColor, byte *maxColor ) const; + void InsetNormalsBBoxDXT5_SSE2( byte *minNormal, byte *maxNormal ) const; + void EmitColorIndices_SSE2( const byte *colorBlock, const byte *minColor, const byte *maxColor ); + void EmitColorAlphaIndices_SSE2( const byte *colorBlock, const byte *minColor, const byte *maxColor ); + void EmitCoCgIndices_SSE2( const byte *colorBlock, const byte *minColor, const byte *maxColor ); + void EmitAlphaIndices_SSE2( const byte *colorBlock, const int minAlpha, const int maxAlpha ); + void EmitAlphaIndices_SSE2( const byte *colorBlock, const int channelBitOffset, const int minAlpha, const int maxAlpha ); + void EmitGreenIndices_SSE2( const byte *block, const int channelBitOffset, const int minGreen, const int maxGreen ); + void ScaleYCoCg_SSE2( byte *colorBlock, byte *minColor, byte *maxColor ) const; + void InsetYCoCgBBox_SSE2( byte *minColor, byte *maxColor ) const; + void SelectYCoCgDiagonal_SSE2( const byte *colorBlock, byte *minColor, byte *maxColor ) const; + + + + void EmitNormalYIndices( const byte *normalBlock, const int offset, const byte minNormalY, const byte maxNormalY ); + void EmitNormalYIndices_SSE2( const byte *normalBlock, const int offset, const byte minNormalY, const byte maxNormalY ); + + void DecodeDXNAlphaValues( const byte *inBuf, byte *values ); + void EncodeDXNAlphaValues( byte *outBuf, const byte min, const byte max, const byte *values ); + + void DecodeNormalYValues( const byte *inBuf, byte &min, byte &max, byte *values ); + void EncodeNormalRGBIndices( byte *outBuf, const byte min, const byte max, const byte *values ); +}; + +/* +======================== +idDxtEncoder::CompressImageDXT1Fast +======================== +*/ +ID_INLINE void idDxtEncoder::CompressImageDXT1Fast( const byte *inBuf, byte *outBuf, int width, int height ) { +#ifdef ID_WIN_X86_SSE2_INTRIN + CompressImageDXT1Fast_SSE2( inBuf, outBuf, width, height ); +#else + CompressImageDXT1Fast_Generic( inBuf, outBuf, width, height ); +#endif +} + +/* +======================== +idDxtEncoder::CompressImageDXT1AlphaFast +======================== +*/ +ID_INLINE void idDxtEncoder::CompressImageDXT1AlphaFast( const byte *inBuf, byte *outBuf, int width, int height ) { +#ifdef ID_WIN_X86_SSE2_INTRIN + CompressImageDXT1AlphaFast_SSE2( inBuf, outBuf, width, height ); +#else + CompressImageDXT1AlphaFast_Generic( inBuf, outBuf, width, height ); +#endif +} + +/* +======================== +idDxtEncoder::CompressImageDXT5Fast +======================== +*/ +ID_INLINE void idDxtEncoder::CompressImageDXT5Fast( const byte *inBuf, byte *outBuf, int width, int height ) { +#ifdef ID_WIN_X86_SSE2_INTRIN + CompressImageDXT5Fast_SSE2( inBuf, outBuf, width, height ); +#else + CompressImageDXT5Fast_Generic( inBuf, outBuf, width, height ); +#endif +} + +/* +======================== +idDxtEncoder::CompressImageDXN1Fast +======================== +*/ +ID_INLINE void idDxtEncoder::CompressImageDXN1Fast( const byte *inBuf, byte *outBuf, int width, int height ) { + CompressImageDXN1Fast_Generic( inBuf, outBuf, width, height ); +} + +/* +======================== +idDxtEncoder::CompressYCoCgDXT5Fast +======================== +*/ +ID_INLINE void idDxtEncoder::CompressYCoCgDXT5Fast( const byte *inBuf, byte *outBuf, int width, int height ) { +#ifdef ID_WIN_X86_SSE2_INTRIN + CompressYCoCgDXT5Fast_SSE2( inBuf, outBuf, width, height ); +#else + CompressYCoCgDXT5Fast_Generic( inBuf, outBuf, width, height ); +#endif +} + +/* +======================== +idDxtEncoder::CompressYCoCgCTX1DXT5AFast +======================== +*/ +ID_INLINE void idDxtEncoder::CompressYCoCgCTX1DXT5AFast( const byte *inBuf, byte *outBuf, int width, int height ) { + CompressYCoCgCTX1DXT5AFast_Generic( inBuf, outBuf, width, height ); +} + +/* +======================== +idDxtEncoder::CompressNormalMapDXT5Fast +======================== +*/ +ID_INLINE void idDxtEncoder::CompressNormalMapDXT5Fast( const byte *inBuf, byte *outBuf, int width, int height ) { +#ifdef ID_WIN_X86_SSE2_INTRIN + CompressNormalMapDXT5Fast_SSE2( inBuf, outBuf, width, height ); +#else + CompressNormalMapDXT5Fast_Generic( inBuf, outBuf, width, height ); +#endif +} + +/* +======================== +idDxtEncoder::CompressNormalMapDXN2Fast +======================== +*/ +ID_INLINE void idDxtEncoder::CompressNormalMapDXN2Fast( const byte *inBuf, byte *outBuf, int width, int height ) { + CompressNormalMapDXN2Fast_Generic( inBuf, outBuf, width, height ); +} + +/* +======================== +idDxtEncoder::EmitByte +======================== +*/ +ID_INLINE void idDxtEncoder::EmitByte( byte b ) { + *outData = b; + outData += 1; +} + +/* +======================== +idDxtEncoder::EmitUShort +======================== +*/ +ID_INLINE void idDxtEncoder::EmitUShort( unsigned short s ) { + *((unsigned short *)outData) = s; + outData += 2; +} + +/* +======================== +idDxtEncoder::EmitUInt +======================== +*/ +ID_INLINE void idDxtEncoder::EmitUInt( unsigned int i ) { + *((unsigned int *)outData) = i; + outData += 4; +} + +/* +======================== +idDxtEncoder::AlphaDistance +======================== +*/ +ID_INLINE unsigned int idDxtEncoder::AlphaDistance( const byte a1, const byte a2 ) const { + return ( a1 - a2 ) * ( a1 - a2 ); +} + +/* +======================== +idDxtEncoder::ColorDistance +======================== +*/ +ID_INLINE unsigned int idDxtEncoder::ColorDistance( const byte *c1, const byte *c2 ) const { + return ( ( c1[ 0 ] - c2[ 0 ] ) * ( c1[ 0 ] - c2[ 0 ] ) ) + ( ( c1[ 1 ] - c2[ 1 ] ) * ( c1[ 1 ] - c2[ 1 ] ) ) + ( ( c1[ 2 ] - c2[ 2 ] ) * ( c1[ 2 ] - c2[ 2 ] ) ); +} + +/* +======================== +idDxtEncoder::ColorDistanceWeighted +======================== +*/ +ID_INLINE unsigned int idDxtEncoder::ColorDistanceWeighted( const byte *c1, const byte *c2 ) const { + int r, g, b; + int rmean; + + // http://www.compuphase.com/cmetric.htm + rmean = ( (int)c1[0] + (int)c2[0] ) / 2; + r = (int)c1[0] - (int)c2[0]; + g = (int)c1[1] - (int)c2[1]; + b = (int)c1[2] - (int)c2[2]; + return ( ( ( 512 + rmean ) * r * r ) >> 8 ) + 4 * g * g + ( ( ( 767 - rmean ) * b * b ) >> 8 ); +} + +/* +======================== +idDxtEncoder::CTX1Distance +======================== +*/ +ID_INLINE unsigned int idDxtEncoder::CTX1Distance( const byte *c1, const byte *c2 ) const { + return ( ( c1[ 0 ] - c2[ 0 ] ) * ( c1[ 0 ] - c2[ 0 ] ) ) + ( ( c1[ 1 ] - c2[ 1 ] ) * ( c1[ 1 ] - c2[ 1 ] ) ); +} + +/* +======================== +idDxtEncoder::ColorTo565 +======================== +*/ +ID_INLINE unsigned short idDxtEncoder::ColorTo565( const byte *color ) const { + return ( ( color[ 0 ] >> 3 ) << 11 ) | ( ( color[ 1 ] >> 2 ) << 5 ) | ( color[ 2 ] >> 3 ); +} + +/* +======================== +idDxtEncoder::ColorFrom565 +======================== +*/ +ID_INLINE void idDxtEncoder::ColorFrom565( unsigned short c565, byte *color ) const { + color[0] = byte( ( ( c565 >> 8 ) & ( ( ( 1 << ( 8 - 3 ) ) - 1 ) << 3 ) ) | ( ( c565 >> 13 ) & ((1<<3)-1) ) ); + color[1] = byte( ( ( c565 >> 3 ) & ( ( ( 1 << ( 8 - 2 ) ) - 1 ) << 2 ) ) | ( ( c565 >> 9 ) & ((1<<2)-1) ) ); + color[2] = byte( ( ( c565 << 3 ) & ( ( ( 1 << ( 8 - 3 ) ) - 1 ) << 3 ) ) | ( ( c565 >> 2 ) & ((1<<3)-1) ) ); +} + +/* +======================== +idDxtEncoder::ColorTo565 +======================== +*/ +ID_INLINE unsigned short idDxtEncoder::ColorTo565( byte r, byte g, byte b ) const { + return ( ( r >> 3 ) << 11 ) | ( ( g >> 2 ) << 5 ) | ( b >> 3 ); +} + +/* +======================== +idDxtEncoder::GreenFrom565 +======================== +*/ +ID_INLINE byte idDxtEncoder::GreenFrom565( unsigned short c565 ) const { + byte c = byte( ( c565 & ( ( ( 1 << 6 ) - 1 ) << 5 ) ) >> 3 ); + return ( c | ( c >> 6 ) ); +} + +/* +================================================ +idDxtDecoder decodes DXT-compressed Images. Raw output Images are in +4-byte RGBA format. Raw output NormalMaps are in 4-byte tangent-space NxNyNz format. +================================================ +*/ +class idDxtDecoder { +public: + + // DXT1 decompression (no alpha) + void DecompressImageDXT1( const byte *inBuf, byte *outBuf, int width, int height ); + + // DXT5 decompression + void DecompressImageDXT5( const byte *inBuf, byte *outBuf, int width, int height ); + + // DXT5 decompression with nVidia 7x hardware bug + void DecompressImageDXT5_nVidia7x( const byte *inBuf, byte *outBuf, int width, int height ); + + // CTX1 + void DecompressImageCTX1( const byte *inBuf, byte *outBuf, int width, int height ) { /* not implemented */ assert( 0 ); } + + // DXN1 + void DecompressImageDXN1( const byte *inBuf, byte *outBuf, int width, int height ) { /* not implemented */ assert( 0 ); } + + // YCoCg DXT5 (the output is in CoCg_Y format) + void DecompressYCoCgDXT5( const byte *inBuf, byte *outBuf, int width, int height ); + + // YCoCg CTX1 + DXT5A (the output is in CoCg_Y format) + void DecompressYCoCgCTX1DXT5A( const byte *inBuf, byte *outBuf, int width, int height ); + + // tangent space normal map decompression from DXT1 format + void DecompressNormalMapDXT1( const byte *inBuf, byte *outBuf, int width, int height ); + void DecompressNormalMapDXT1Renormalize( const byte *inBuf, byte *outBuf, int width, int height ); + + // tangent space normal map decompression from DXT5 format + void DecompressNormalMapDXT5( const byte *inBuf, byte *outBuf, int width, int height ); + void DecompressNormalMapDXT5Renormalize( const byte *inBuf, byte *outBuf, int width, int height ); + + // tangent space normal map decompression from DXN2 format + void DecompressNormalMapDXN2( const byte *inBuf, byte *outBuf, int width, int height ); + + // decompose a DXT image into indices and two images with colors + void DecomposeImageDXT1( const byte *inBuf, byte *colorIndices, byte *pic1, byte *pic2, int width, int height ); + void DecomposeImageDXT5( const byte *inBuf, byte *colorIndices, byte *alphaIndices, byte *pic1, byte *pic2, int width, int height ); + +private: + int width; + int height; + const byte * inData; + + byte ReadByte(); + unsigned short ReadUShort(); + unsigned int ReadUInt(); + unsigned short ColorTo565( const byte *color ) const; + void ColorFrom565( unsigned short c565, byte *color ) const; + unsigned short NormalYTo565( byte y ) const; + byte NormalYFrom565( unsigned short c565 ) const; + byte NormalScaleFrom565( unsigned short c565 ) const; + byte NormalBiasFrom565( unsigned short c565 ) const; + + void EmitBlock( byte *outPtr, int x, int y, const byte *colorBlock ); + void DecodeAlphaValues( byte *colorBlock, const int offset ); + void DecodeColorValues( byte *colorBlock, bool noBlack, bool writeAlpha ); + void DecodeCTX1Values( byte *colorBlock ); + + void DecomposeColorBlock( byte colors[2][4], byte colorIndices[16], bool noBlack ); + void DecomposeAlphaBlock( byte colors[2][4], byte alphaIndices[16] ); + + void DecodeNormalYValues( byte *normalBlock, const int offsetY, byte &bias, byte &scale ); + void DeriveNormalZValues( byte *normalBlock ); +}; + +/* +======================== +idDxtDecoder::ReadByte +======================== +*/ +ID_INLINE byte idDxtDecoder::ReadByte() { + byte b = *inData; + inData += 1; + return b; +} + +/* +======================== +idDxtDecoder::ReadUShort +======================== +*/ +ID_INLINE unsigned short idDxtDecoder::ReadUShort() { + unsigned short s = *((unsigned short *)inData); + inData += 2; + return s; +} + +/* +======================== +idDxtDecoder::ReadUInt +======================== +*/ +ID_INLINE unsigned int idDxtDecoder::ReadUInt() { + unsigned int i = *((unsigned int *)inData); + inData += 4; + return i; +} + +/* +======================== +idDxtDecoder::ColorTo565 +======================== +*/ +ID_INLINE unsigned short idDxtDecoder::ColorTo565( const byte *color ) const { + return ( ( color[ 0 ] >> 3 ) << 11 ) | ( ( color[ 1 ] >> 2 ) << 5 ) | ( color[ 2 ] >> 3 ); +} + +/* +======================== +idDxtDecoder::ColorFrom565 +======================== +*/ +ID_INLINE void idDxtDecoder::ColorFrom565( unsigned short c565, byte *color ) const { + color[0] = byte( ( ( c565 >> 8 ) & ( ( ( 1 << ( 8 - 3 ) ) - 1 ) << 3 ) ) | ( ( c565 >> 13 ) & ((1<<3)-1) ) ); + color[1] = byte( ( ( c565 >> 3 ) & ( ( ( 1 << ( 8 - 2 ) ) - 1 ) << 2 ) ) | ( ( c565 >> 9 ) & ((1<<2)-1) ) ); + color[2] = byte( ( ( c565 << 3 ) & ( ( ( 1 << ( 8 - 3 ) ) - 1 ) << 3 ) ) | ( ( c565 >> 2 ) & ((1<<3)-1) ) ); +} + +/* +======================== +idDxtDecoder::NormalYTo565 +======================== +*/ +ID_INLINE unsigned short idDxtDecoder::NormalYTo565( byte y ) const { + return ( ( y >> 2 ) << 5 ); +} + +/* +======================== +idDxtDecoder::NormalYFrom565 +======================== +*/ +ID_INLINE byte idDxtDecoder::NormalYFrom565( unsigned short c565 ) const { + byte c = byte( ( c565 & ( ( ( 1 << 6 ) - 1 ) << 5 ) ) >> 3 ); + return ( c | ( c >> 6 ) ); +} + +/* +======================== +idDxtDecoder::NormalBiasFrom565 +======================== +*/ +ID_INLINE byte idDxtDecoder::NormalBiasFrom565( unsigned short c565 ) const { + byte c = byte( ( c565 & ( ( ( 1 << 5 ) - 1 ) << 11 ) ) >> 8 ); + return ( c | ( c >> 5 ) ); +} + +/* +======================== +idDxtDecoder::NormalScaleFrom565 +======================== +*/ +ID_INLINE byte idDxtDecoder::NormalScaleFrom565( unsigned short c565 ) const { + byte c = byte( ( c565 & ( ( ( 1 << 5 ) - 1 ) << 0 ) ) << 3 ); + return ( c | ( c >> 5 ) ); +} + +#endif // !__DXTCODEC_H__ diff --git a/src/renderer/DXT/DXTDecoder.cpp b/src/renderer/DXT/DXTDecoder.cpp new file mode 100644 index 00000000..1152c8cd --- /dev/null +++ b/src/renderer/DXT/DXTDecoder.cpp @@ -0,0 +1,745 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ +/* +================================================================================================ +Contains the DxtDecoder implementation. +================================================================================================ +*/ + +#pragma hdrstop +#include "precompiled.h" +#include "DXTCodec.h" + +/* +======================== +idDxtDecoder::EmitBlock +======================== +*/ +void idDxtDecoder::EmitBlock( byte *outPtr, int x, int y, const byte *colorBlock ) { + outPtr += ( y * width + x ) * 4; + for ( int j = 0; j < 4; j++ ) { + memcpy( outPtr, &colorBlock[j*4*4], 4*4 ); + outPtr += width * 4; + } +} + +/* +======================== +idDxtDecoder::DecodeAlphaValues +======================== +*/ +void idDxtDecoder::DecodeAlphaValues( byte *colorBlock, const int offset ) { + int i; + unsigned int indexes; + byte alphas[8]; + + alphas[0] = ReadByte(); + alphas[1] = ReadByte(); + + if ( alphas[0] > alphas[1] ) { + alphas[2] = ( 6 * alphas[0] + 1 * alphas[1] ) / 7; + alphas[3] = ( 5 * alphas[0] + 2 * alphas[1] ) / 7; + alphas[4] = ( 4 * alphas[0] + 3 * alphas[1] ) / 7; + alphas[5] = ( 3 * alphas[0] + 4 * alphas[1] ) / 7; + alphas[6] = ( 2 * alphas[0] + 5 * alphas[1] ) / 7; + alphas[7] = ( 1 * alphas[0] + 6 * alphas[1] ) / 7; + } else { + alphas[2] = ( 4 * alphas[0] + 1 * alphas[1] ) / 5; + alphas[3] = ( 3 * alphas[0] + 2 * alphas[1] ) / 5; + alphas[4] = ( 2 * alphas[0] + 3 * alphas[1] ) / 5; + alphas[5] = ( 1 * alphas[0] + 4 * alphas[1] ) / 5; + alphas[6] = 0; + alphas[7] = 255; + } + + colorBlock += offset; + + indexes = (int)ReadByte() | ( (int)ReadByte() << 8 ) | ( (int)ReadByte() << 16 ); + for ( i = 0; i < 8; i++ ) { + colorBlock[i*4] = alphas[indexes & 7]; + indexes >>= 3; + } + + indexes = (int)ReadByte() | ( (int)ReadByte() << 8 ) | ( (int)ReadByte() << 16 ); + for ( i = 8; i < 16; i++ ) { + colorBlock[i*4] = alphas[indexes & 7]; + indexes >>= 3; + } +} + +/* +======================== +idDxtDecoder::DecodeColorValues +======================== +*/ +void idDxtDecoder::DecodeColorValues( byte *colorBlock, bool noBlack, bool writeAlpha ) { + byte colors[4][4]; + + unsigned short color0 = ReadUShort(); + unsigned short color1 = ReadUShort(); + + ColorFrom565( color0, colors[0] ); + ColorFrom565( color1, colors[1] ); + + colors[0][3] = 255; + colors[1][3] = 255; + + if ( noBlack || color0 > color1 ) { + colors[2][0] = ( 2 * colors[0][0] + 1 * colors[1][0] ) / 3; + colors[2][1] = ( 2 * colors[0][1] + 1 * colors[1][1] ) / 3; + colors[2][2] = ( 2 * colors[0][2] + 1 * colors[1][2] ) / 3; + colors[2][3] = 255; + + colors[3][0] = ( 1 * colors[0][0] + 2 * colors[1][0] ) / 3; + colors[3][1] = ( 1 * colors[0][1] + 2 * colors[1][1] ) / 3; + colors[3][2] = ( 1 * colors[0][2] + 2 * colors[1][2] ) / 3; + colors[3][3] = 255; + } else { + colors[2][0] = ( 1 * colors[0][0] + 1 * colors[1][0] ) / 2; + colors[2][1] = ( 1 * colors[0][1] + 1 * colors[1][1] ) / 2; + colors[2][2] = ( 1 * colors[0][2] + 1 * colors[1][2] ) / 2; + colors[2][3] = 255; + + colors[3][0] = 0; + colors[3][1] = 0; + colors[3][2] = 0; + colors[3][3] = 0; + } + + unsigned int indexes = ReadUInt(); + for ( int i = 0; i < 16; i++ ) { + colorBlock[i*4+0] = colors[indexes & 3][0]; + colorBlock[i*4+1] = colors[indexes & 3][1]; + colorBlock[i*4+2] = colors[indexes & 3][2]; + if ( writeAlpha ) { + colorBlock[i*4+3] = colors[indexes & 3][3]; + } + indexes >>= 2; + } +} + +/* +======================== +idDxtDecoder::DecodeCTX1Values +======================== +*/ +void idDxtDecoder::DecodeCTX1Values( byte *colorBlock ) { + byte colors[4][2]; + + colors[0][0] = ReadByte(); + colors[0][1] = ReadByte(); + colors[1][0] = ReadByte(); + colors[1][1] = ReadByte(); + + colors[2][0] = ( 2 * colors[0][0] + 1 * colors[1][0] ) / 3; + colors[2][1] = ( 2 * colors[0][1] + 1 * colors[1][1] ) / 3; + colors[3][0] = ( 1 * colors[0][0] + 2 * colors[1][0] ) / 3; + colors[3][1] = ( 1 * colors[0][1] + 2 * colors[1][1] ) / 3; + + unsigned int indexes = ReadUInt(); + for ( int i = 0; i < 16; i++ ) { + colorBlock[i*4+0] = colors[indexes & 3][0]; + colorBlock[i*4+1] = colors[indexes & 3][1]; + indexes >>= 2; + } +} + +/* +======================== +idDxtDecoder::DecompressImageDXT1 +======================== +*/ +void idDxtDecoder::DecompressImageDXT1( const byte *inBuf, byte *outBuf, int width, int height ) { + byte block[64]; + + this->width = width; + this->height = height; + this->inData = inBuf; + + for ( int j = 0; j < height; j += 4 ) { + for ( int i = 0; i < width; i += 4 ) { + DecodeColorValues( block, false, true ); + EmitBlock( outBuf, i, j, block ); + } + } +} + +/* +======================== +idDxtDecoder::DecompressImageDXT5 +======================== +*/ +void idDxtDecoder::DecompressImageDXT5( const byte *inBuf, byte *outBuf, int width, int height ) { + byte block[64]; + + this->width = width; + this->height = height; + this->inData = inBuf; + + for ( int j = 0; j < height; j += 4 ) { + for ( int i = 0; i < width; i += 4 ) { + DecodeAlphaValues( block, 3 ); + DecodeColorValues( block, true, false ); + EmitBlock( outBuf, i, j, block ); + } + } +} + +/* +======================== +idDxtDecoder::DecompressImageDXT5_nVidia7x +======================== +*/ +void idDxtDecoder::DecompressImageDXT5_nVidia7x( const byte *inBuf, byte *outBuf, int width, int height ) { + byte block[64]; + + this->width = width; + this->height = height; + this->inData = inBuf; + + for ( int j = 0; j < height; j += 4 ) { + for ( int i = 0; i < width; i += 4 ) { + DecodeAlphaValues( block, 3 ); + DecodeColorValues( block, false, false ); + EmitBlock( outBuf, i, j, block ); + } + } +} + +/* +======================== +idDxtDecoder::DecompressYCoCgDXT5 +======================== +*/ +void idDxtDecoder::DecompressYCoCgDXT5( const byte *inBuf, byte *outBuf, int width, int height ) { + DecompressImageDXT5_nVidia7x( inBuf, outBuf, width, height ); + // descale the CoCg values and set the scale factor effectively to 1 + for ( int i = 0; i < width * height; i++ ) { + int scale = ( outBuf[i*4+2] >> 3 ) + 1; + outBuf[i*4+0] = byte( ( outBuf[i*4+0] - 128 ) / scale + 128 ); + outBuf[i*4+1] = byte( ( outBuf[i*4+1] - 128 ) / scale + 128 ); + outBuf[i*4+2] = 0; // this translates to a scale factor of 1 for uncompressed + } +} + + +/* +======================== +idDxtDecoder::DecompressYCoCgCTX1DXT5A +======================== +*/ +void idDxtDecoder::DecompressYCoCgCTX1DXT5A( const byte *inBuf, byte *outBuf, int width, int height ) { + byte block[64]; + + this->width = width; + this->height = height; + this->inData = inBuf; + + for ( int j = 0; j < height; j += 4 ) { + for ( int i = 0; i < width; i += 4 ) { + DecodeAlphaValues( block, 3 ); + DecodeCTX1Values( block ); + EmitBlock( outBuf, i, j, block ); + } + } +} + +/* +======================== +idDxtDecoder::DecodeNormalYValues +======================== +*/ +void idDxtDecoder::DecodeNormalYValues( byte *normalBlock, const int offsetY, byte &c0, byte &c1 ) { + int i; + unsigned int indexes; + unsigned short normal0, normal1; + byte normalsY[4]; + + normal0 = ReadUShort(); + normal1 = ReadUShort(); + + assert( normal0 >= normal1 ); + + normalsY[0] = NormalYFrom565( normal0 ); + normalsY[1] = NormalYFrom565( normal1 ); + normalsY[2] = ( 2 * normalsY[0] + 1 * normalsY[1] ) / 3; + normalsY[3] = ( 1 * normalsY[0] + 2 * normalsY[1] ) / 3; + + c0 = NormalBiasFrom565( normal0 ); + c1 = NormalScaleFrom565( normal0 ); + + byte *normalYPtr = normalBlock + offsetY; + + indexes = ReadUInt(); + for ( i = 0; i < 16; i++ ) { + normalYPtr[i*4] = normalsY[indexes & 3]; + indexes >>= 2; + } +} + +/* +======================== +UShortSqrt +======================== +*/ +byte UShortSqrt( unsigned short s ) { +#if 1 + int t, b, r, x; + + r = 0; + for ( b = 0x10000000; b != 0; b >>= 2 ) { + t = r + b; + r >>= 1; + x = -( t <= s ); + s = s - (unsigned short)( t & x ); + r += b & x; + } + return byte( r ); +#else + int t, b, r; + + r = 0; + for ( b = 0x10000000; b != 0; b >>= 2 ) { + t = r + b; + r >>= 1; + if ( t <= s ) { + s -= t; + r += b; + } + } + return r; +#endif +} + +/* +======================== +idDxtDecoder::DeriveNormalZValues +======================== +*/ +void idDxtDecoder::DeriveNormalZValues( byte *normalBlock ) { + int i; + + for ( i = 0; i < 16; i++ ) { + int x = normalBlock[i*4+0] - 127; + int y = normalBlock[i*4+1] - 127; + normalBlock[i*4+2] = 128 + UShortSqrt( (unsigned short)( 16383 - x * x - y * y ) ); + } +} + +/* +======================== +idDxtDecoder::UnRotateNormals +======================== +*/ +void UnRotateNormals( const byte *block, float *normals, byte c0, byte c1 ) { + int rotation = c0; + float angle = -( rotation / 255.0f ) * idMath::PI; + float s = sin( angle ); + float c = cos( angle ); + + int scale = ( c1 >> 3 ) + 1; + for ( int i = 0; i < 16; i++ ) { + float x = block[i*4+0] / 255.0f * 2.0f - 1.0f; + float y = ( ( block[i*4+1] - 128 ) / scale + 128 ) / 255.0f * 2.0f - 1.0f; + float rx = c * x - s * y; + float ry = s * x + c * y; + normals[i*4+0] = rx; + normals[i*4+1] = ry; + } +} + +/* +======================== +idDxtDecoder::DecompressNormalMapDXT1 +======================== +*/ +void idDxtDecoder::DecompressNormalMapDXT1( const byte *inBuf, byte *outBuf, int width, int height ) { + byte block[64]; + + this->width = width; + this->height = height; + this->inData = inBuf; + + for ( int j = 0; j < height; j += 4 ) { + for ( int i = 0; i < width; i += 4 ) { + DecodeColorValues( block, false, true ); +#if 1 + float normals[16*4]; + /* + for ( int k = 0; k < 16; k++ ) { + normals[k*4+0] = block[k*4+0] / 255.0f * 2.0f - 1.0f; + normals[k*4+1] = block[k*4+1] / 255.0f * 2.0f - 1.0f; + } + */ + UnRotateNormals( block, normals, block[0*4+2], 0 ); + for ( int k = 0; k < 16; k++ ) { + float x = normals[k*4+0]; + float y = normals[k*4+1]; + float z = 1.0f - x * x - y * y; + if ( z < 0.0f ) z = 0.0f; + normals[k*4+2] = sqrt( z ); + } + for ( int k = 0; k < 16; k++ ) { + block[k*4+0] = idMath::Ftob( ( normals[k*4+0] + 1.0f ) / 2.0f * 255.0f ); + block[k*4+1] = idMath::Ftob( ( normals[k*4+1] + 1.0f ) / 2.0f * 255.0f ); + block[k*4+2] = idMath::Ftob( ( normals[k*4+2] + 1.0f ) / 2.0f * 255.0f ); + } +#else + DeriveNormalZValues( block ); +#endif + EmitBlock( outBuf, i, j, block ); + } + } +} + +/* +======================== +idDxtDecoder::DecompressNormalMapDXT1Renormalize +======================== +*/ +void idDxtDecoder::DecompressNormalMapDXT1Renormalize( const byte *inBuf, byte *outBuf, int width, int height ) { + byte block[64]; + + this->width = width; + this->height = height; + this->inData = inBuf; + + for ( int j = 0; j < height; j += 4 ) { + for ( int i = 0; i < width; i += 4 ) { + DecodeColorValues( block, false, true ); + + for ( int k = 0; k < 16; k++ ) { + float normal[3]; + normal[0] = block[k*4+0] / 255.0f * 2.0f - 1.0f; + normal[1] = block[k*4+1] / 255.0f * 2.0f - 1.0f; + normal[2] = block[k*4+2] / 255.0f * 2.0f - 1.0f; + float rsq = idMath::InvSqrt( normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2] ); + normal[0] *= rsq; + normal[1] *= rsq; + normal[2] *= rsq; + block[k*4+0] = idMath::Ftob( ( normal[0] + 1.0f ) / 2.0f * 255.0f + 0.5f ); + block[k*4+1] = idMath::Ftob( ( normal[1] + 1.0f ) / 2.0f * 255.0f + 0.5f ); + block[k*4+2] = idMath::Ftob( ( normal[2] + 1.0f ) / 2.0f * 255.0f + 0.5f ); + } + + EmitBlock( outBuf, i, j, block ); + } + } +} + +/* +======================== +idDxtDecoder::DecompressNormalMapDXT5Renormalize +======================== +*/ +void idDxtDecoder::DecompressNormalMapDXT5Renormalize( const byte *inBuf, byte *outBuf, int width, int height ) { + byte block[64]; + + this->width = width; + this->height = height; + this->inData = inBuf; + + for ( int j = 0; j < height; j += 4 ) { + for ( int i = 0; i < width; i += 4 ) { + DecodeAlphaValues( block, 3 ); + DecodeColorValues( block, false, false ); + + for ( int k = 0; k < 16; k++ ) { + float normal[3]; +#if 0 // object-space + normal[0] = block[k*4+0] / 255.0f * 2.0f - 1.0f; + normal[1] = block[k*4+1] / 255.0f * 2.0f - 1.0f; + normal[2] = block[k*4+3] / 255.0f * 2.0f - 1.0f; +#else + normal[0] = block[k*4+3] / 255.0f * 2.0f - 1.0f; + normal[1] = block[k*4+1] / 255.0f * 2.0f - 1.0f; + normal[2] = block[k*4+2] / 255.0f * 2.0f - 1.0f; +#endif + float rsq = idMath::InvSqrt( normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2] ); + normal[0] *= rsq; + normal[1] *= rsq; + normal[2] *= rsq; + block[k*4+0] = idMath::Ftob( ( normal[0] + 1.0f ) / 2.0f * 255.0f + 0.5f ); + block[k*4+1] = idMath::Ftob( ( normal[1] + 1.0f ) / 2.0f * 255.0f + 0.5f ); + block[k*4+2] = idMath::Ftob( ( normal[2] + 1.0f ) / 2.0f * 255.0f + 0.5f ); + } + + EmitBlock( outBuf, i, j, block ); + } + } +} + +/* +======================== +idDxtDecoder::BiasScaleNormalY +======================== +*/ +void BiasScaleNormalY( byte *normals, const int offsetY, const byte c0, const byte c1 ) { + int bias = c0 - 4; + int scale = ( c1 >> 3 ) + 1; + for ( int i = 0; i < 16; i++ ) { + normals[i*4+offsetY] = byte( ( normals[i*4+offsetY] - 128 ) / scale + bias ); + } +} + +/* +======================== +idDxtDecoder::BiasScaleNormals +======================== +*/ +void BiasScaleNormals( const byte *block, float *normals, const byte c0, const byte c1 ) { + int bias = c0 - 4; + int scale = ( c1 >> 3 ) + 1; + for ( int i = 0; i < 16; i++ ) { + normals[i*4+0] = block[i*4+0] / 255.0f * 2.0f - 1.0f; + normals[i*4+1] = ( ( block[i*4+1] - 128.0f ) / scale + bias ) / 255.0f * 2.0f - 1.0f; + } +} + +/* +======================== +idDxtDecoder::DecompressNormalMapDXT5 +======================== +*/ +void idDxtDecoder::DecompressNormalMapDXT5( const byte *inBuf, byte *outBuf, int width, int height ) { + byte block[64]; + byte c0, c1; + + this->width = width; + this->height = height; + this->inData = inBuf; + + for ( int j = 0; j < height; j += 4 ) { + for ( int i = 0; i < width; i += 4 ) { + DecodeAlphaValues( block, 0 ); + DecodeNormalYValues( block, 1, c0, c1 ); +#if 1 + float normals[16*4]; + //BiasScaleNormals( block, normals, c0, c1 ); + UnRotateNormals( block, normals, c0, c1 ); + for ( int k = 0; k < 16; k++ ) { + float x = normals[k*4+0]; + float y = normals[k*4+1]; + float z = 1.0f - x * x - y * y; + if ( z < 0.0f ) z = 0.0f; + normals[k*4+2] = sqrt( z ); + } + for ( int k = 0; k < 16; k++ ) { + block[k*4+0] = idMath::Ftob( ( normals[k*4+0] + 1.0f ) / 2.0f * 255.0f ); + block[k*4+1] = idMath::Ftob( ( normals[k*4+1] + 1.0f ) / 2.0f * 255.0f ); + block[k*4+2] = idMath::Ftob( ( normals[k*4+2] + 1.0f ) / 2.0f * 255.0f ); + } +#else + BiasScaleNormalY( block, 1, c0, c1 ); + DeriveNormalZValues( block ); +#endif + + EmitBlock( outBuf, i, j, block ); + } + } +} + +/* +======================== +idDxtDecoder::DecompressNormalMapDXN2 +======================== +*/ +void idDxtDecoder::DecompressNormalMapDXN2( const byte *inBuf, byte *outBuf, int width, int height ) { + byte block[64]; + + this->width = width; + this->height = height; + this->inData = inBuf; + + for ( int j = 0; j < height; j += 4 ) { + for ( int i = 0; i < width; i += 4 ) { + DecodeAlphaValues( block, 0 ); + DecodeAlphaValues( block, 1 ); +#if 1 + float normals[16*4]; + for ( int k = 0; k < 16; k++ ) { + normals[k*4+0] = block[k*4+0] / 255.0f * 2.0f - 1.0f; + normals[k*4+1] = block[k*4+1] / 255.0f * 2.0f - 1.0f; + } + for ( int k = 0; k < 16; k++ ) { + float x = normals[k*4+0]; + float y = normals[k*4+1]; + float z = 1.0f - x * x - y * y; + if ( z < 0.0f ) z = 0.0f; + normals[k*4+2] = sqrt( z ); + } + for ( int k = 0; k < 16; k++ ) { + block[k*4+0] = idMath::Ftob( ( normals[k*4+0] + 1.0f ) / 2.0f * 255.0f ); + block[k*4+1] = idMath::Ftob( ( normals[k*4+1] + 1.0f ) / 2.0f * 255.0f ); + block[k*4+2] = idMath::Ftob( ( normals[k*4+2] + 1.0f ) / 2.0f * 255.0f ); + } +#else + DeriveNormalZValues( block ); +#endif + EmitBlock( outBuf, i, j, block ); + } + } +} + +/* +======================== +idDxtDecoder::DecomposeColorBlock +======================== +*/ +void idDxtDecoder::DecomposeColorBlock( byte colors[2][4], byte colorIndices[16], bool noBlack ) { + int i; + unsigned int indices; + unsigned short color0, color1; + int colorRemap1[] = { 3, 0, 2, 1 }; + int colorRemap2[] = { 1, 3, 2, 0 }; + int *crm; + + color0 = ReadUShort(); + color1 = ReadUShort(); + + ColorFrom565( color0, colors[0] ); + ColorFrom565( color1, colors[1] ); + + if ( noBlack || color0 > color1 ) { + crm = colorRemap1; + } else { + crm = colorRemap2; + } + + indices = ReadUInt(); + for ( i = 0; i < 16; i++ ) { + colorIndices[i] = (byte)crm[ indices & 3 ]; + indices >>= 2; + } +} + +/* +======================== +idDxtDecoder::DecomposeAlphaBlock +======================== +*/ +void idDxtDecoder::DecomposeAlphaBlock( byte colors[2][4], byte alphaIndices[16] ) { + int i; + unsigned char alpha0, alpha1; + unsigned int indices; + int alphaRemap1[] = { 7, 0, 6, 5, 4, 3, 2, 1 }; + int alphaRemap2[] = { 1, 6, 2, 3, 4, 5, 0, 7 }; + int *arm; + + alpha0 = ReadByte(); + alpha1 = ReadByte(); + + colors[0][3] = alpha0; + colors[1][3] = alpha1; + + if ( alpha0 > alpha1 ) { + arm = alphaRemap1; + } else { + arm = alphaRemap2; + } + + indices = (int)ReadByte() | ( (int)ReadByte() << 8 ) | ( (int)ReadByte() << 16 ); + for ( i = 0; i < 8; i++ ) { + alphaIndices[i] = (byte)arm[ indices & 7 ]; + indices >>= 3; + } + + indices = (int)ReadByte() | ( (int)ReadByte() << 8 ) | ( (int)ReadByte() << 16 ); + for ( i = 8; i < 16; i++ ) { + alphaIndices[i] = (byte)arm[ indices & 7 ]; + indices >>= 3; + } +} + +/* +======================== +idDxtDecoder::DecomposeImageDXT1 +======================== +*/ +void idDxtDecoder::DecomposeImageDXT1( const byte *inBuf, byte *colorIndices, byte *pic1, byte *pic2, int width, int height ) { + byte colors[2][4]; + byte indices[16]; + + this->width = width; + this->height = height; + this->inData = inBuf; + + // extract the colors from the DXT + for ( int j = 0; j < height; j += 4 ) { + for ( int i = 0; i < width; i += 4 ) { + DecomposeColorBlock( colors, indices, false ); + + memcpy( colorIndices + (j+0) * width + i, indices+ 0, 4 ); + memcpy( colorIndices + (j+1) * width + i, indices+ 4, 4 ); + memcpy( colorIndices + (j+2) * width + i, indices+ 8, 4 ); + memcpy( colorIndices + (j+3) * width + i, indices+12, 4 ); + + memcpy( pic1 + j * width / 4 + i, colors[0], 4 ); + + memcpy( pic2 + j * width / 4 + i, colors[1], 4 ); + } + } +} + +/* +======================== +idDxtDecoder::DecomposeImageDXT5 +======================== +*/ +void idDxtDecoder::DecomposeImageDXT5( const byte *inBuf, byte *colorIndices, byte *alphaIndices, byte *pic1, byte *pic2, int width, int height ) { + byte colors[2][4]; + byte colorInd[16]; + byte alphaInd[16]; + + this->width = width; + this->height = height; + this->inData = inBuf; + + // extract the colors from the DXT + for ( int j = 0; j < height; j += 4 ) { + for ( int i = 0; i < width; i += 4 ) { + DecomposeAlphaBlock( colors, alphaInd ); + DecomposeColorBlock( colors, colorInd, true ); + + memcpy( colorIndices + (j+0) * width + i, colorInd+ 0, 4 ); + memcpy( colorIndices + (j+1) * width + i, colorInd+ 4, 4 ); + memcpy( colorIndices + (j+2) * width + i, colorInd+ 8, 4 ); + memcpy( colorIndices + (j+3) * width + i, colorInd+12, 4 ); + + memcpy( colorIndices + (j+0) * width + i, alphaInd+ 0, 4 ); + memcpy( colorIndices + (j+1) * width + i, alphaInd+ 4, 4 ); + memcpy( colorIndices + (j+2) * width + i, alphaInd+ 8, 4 ); + memcpy( colorIndices + (j+3) * width + i, alphaInd+12, 4 ); + + memcpy( pic1 + j * width / 4 + i, colors[0], 4 ); + + memcpy( pic2 + j * width / 4 + i, colors[1], 4 ); + } + } +} + diff --git a/src/renderer/DXT/DXTEncoder.cpp b/src/renderer/DXT/DXTEncoder.cpp new file mode 100644 index 00000000..8a9897da --- /dev/null +++ b/src/renderer/DXT/DXTEncoder.cpp @@ -0,0 +1,4748 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ +/* +================================================================================================ +Contains the DxtEncoder implementation. +================================================================================================ +*/ + +#pragma hdrstop +#include "precompiled.h" +#include "DXTCodec.h" + +#define INSET_COLOR_SHIFT 4 // inset the bounding box with ( range >> shift ) +#define INSET_ALPHA_SHIFT 5 // inset alpha channel + +#define C565_5_MASK 0xF8 // 0xFF minus last three bits +#define C565_6_MASK 0xFC // 0xFF minus last two bits + +#define NVIDIA_7X_HARDWARE_BUG_FIX // keep the DXT5 colors sorted as: max, min + +typedef uint16_t word; +typedef uint32_t dword; + +/* +======================== +idDxtEncoder::NV4XHardwareBugFix +======================== +*/ +void idDxtEncoder::NV4XHardwareBugFix( byte *minColor, byte *maxColor ) const { +#ifdef ID_WIN_X86_ASM + int minq = ( ( minColor[0] << 16 ) | ( minColor[1] << 8 ) | minColor[2] ) & 0x00F8FCF8; + int maxq = ( ( maxColor[0] << 16 ) | ( maxColor[1] << 8 ) | maxColor[2] ) & 0x00F8FCF8; + int mask = -( minq > maxq ) & 0x00FFFFFF; + int min = *(int *)minColor; + int max = *(int *)maxColor; + min ^= max; + max ^= ( min & mask ); + min ^= max; + *(int *)minColor = min; + *(int *)maxColor = max; +#else + if ( ColorTo565( minColor ) > ColorTo565( maxColor ) ) { + SwapValues( minColor[0], maxColor[0] ); + SwapValues( minColor[1], maxColor[1] ); + SwapValues( minColor[2], maxColor[2] ); + } +#endif +} + +/* +======================== +idDxtEncoder::HasConstantValuePer4x4Block +======================== +*/ +bool idDxtEncoder::HasConstantValuePer4x4Block( const byte *inBuf, int width, int height, int channel ) const { + if ( width < 4 || height < 4 ) { + byte value = inBuf[channel]; + for ( int k = 0; k < height; k++ ) { + for ( int l = 0; l < width; l++ ) { + if ( inBuf[(k*width+l)*4+channel] != value ) { + return false; + } + } + } + return true; + } + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + const byte *inPtr = inBuf + i * 4; + byte value = inPtr[channel]; + for ( int k = 0; k < 4; k++ ) { + for ( int l = 0; l < 4; l++ ) { + if ( inPtr[(k*width+l)*4+channel] != value ) { + return false; + } + } + } + } + inBuf += srcPadding; + } + return true; +} + +/* +======================== +idDxtEncoder::WriteTinyColorDXT1 +======================== +*/ +void idDxtEncoder::WriteTinyColorDXT1( const byte *inBuf, int width, int height ) { + int numBlocks = ( ( width + 3 ) / 4 ) * ( ( height + 3 ) / 4 ); + int stride = ( ( width * height ) / numBlocks ) * 4; // number of bytes from one block to the next + // example: 2x8 pixels + // numBlocks = 2 + // stride = 32 bytes (8 pixels) + + for ( int i = 0; i < numBlocks; i++ ) { + // FIXME: This just emits a fake block based on the color at position 0,0 + EmitUShort( ColorTo565( inBuf ) ); + EmitUShort( 0 ); // dummy, never used + EmitUInt( 0 ); // 4 color index bytes all use the first color + + inBuf += stride; + } +} + +/* +======================== +idDxtEncoder::WriteTinyColorDXT5 +======================== +*/ +void idDxtEncoder::WriteTinyColorDXT5( const byte *inBuf, int width, int height ) { + int numBlocks = ( ( width + 3 ) / 4 ) * ( ( height + 3 ) / 4 ); + int stride = ( ( width * height ) / numBlocks ) * 4; // number of bytes from one block to the next + // example: 2x8 pixels + // numBlocks = 2 + // stride = 32 bytes (8 pixels) + + for ( int i = 0; i < numBlocks; i++ ) { + // FIXME: This just emits a fake block based on the color at position 0,0 + EmitByte( inBuf[3] ); + EmitByte( 0 ); // dummy, never used + EmitByte( 0 ); // 6 alpha index bytes all use the first alpha + EmitByte( 0 ); + EmitByte( 0 ); + EmitByte( 0 ); + EmitByte( 0 ); + EmitByte( 0 ); + + EmitUShort( ColorTo565( inBuf ) ); + EmitUShort( 0 ); // dummy, never used + EmitUInt( 0 ); // 4 color index bytes all use the first color + + inBuf += stride; + } +} + +/* +======================== +idDxtEncoder::WriteTinyColorCTX1DXT5A +======================== +*/ +void idDxtEncoder::WriteTinyColorCTX1DXT5A( const byte *inBuf, int width, int height ) { + int numBlocks = ( ( width + 3 ) / 4 ) * ( ( height + 3 ) / 4 ); + int stride = ( ( width * height ) / numBlocks ) * 4; // number of bytes from one block to the next + // example: 2x8 pixels + // numBlocks = 2 + // stride = 32 bytes (8 pixels) + + for ( int i = 0; i < numBlocks; i++ ) { + // FIXME: This just emits a fake block based on the color at position 0,0 + EmitByte( inBuf[0] ); + EmitByte( inBuf[1] ); + EmitByte( inBuf[0] ); + EmitByte( inBuf[1] ); + EmitUInt( 0 ); // 4 color index bytes all use the first color + + EmitByte( inBuf[3] ); + EmitByte( 0 ); // dummy, never used + EmitByte( 0 ); // 6 alpha index bytes all use the first alpha + EmitByte( 0 ); + EmitByte( 0 ); + EmitByte( 0 ); + EmitByte( 0 ); + EmitByte( 0 ); + + inBuf += stride; + } +} + +/* +======================== +idDxtEncoder::WriteTinyNormalMapDXT5 +======================== +*/ +void idDxtEncoder::WriteTinyNormalMapDXT5( const byte *inBuf, int width, int height ) { + int numBlocks = ( ( width + 3 ) / 4 ) * ( ( height + 3 ) / 4 ); + int stride = ( ( width * height ) / numBlocks ) * 4; // number of bytes from one block to the next + // example: 2x8 pixels + // numBlocks = 2 + // stride = 32 bytes (8 pixels) + + for ( int i = 0; i < numBlocks; i++ ) { + // FIXME: This just emits a fake block based on the normal at position 0,0 + EmitByte( inBuf[3] ); + EmitByte( 0 ); // dummy, never used + EmitByte( 0 ); // 6 alpha index bytes all use the first alpha + EmitByte( 0 ); + EmitByte( 0 ); + EmitByte( 0 ); + EmitByte( 0 ); + EmitByte( 0 ); + + EmitUShort( ColorTo565( inBuf[0], inBuf[1], inBuf[2] ) ); + EmitUShort( 0 ); // dummy, never used + EmitUInt( 0 ); // 4 color index bytes all use the first color + + inBuf += stride; + } +} + +/* +======================== +idDxtEncoder::WriteTinyNormalMapDXN +======================== +*/ +void idDxtEncoder::WriteTinyNormalMapDXN( const byte *inBuf, int width, int height ) { + int numBlocks = ( ( width + 3 ) / 4 ) * ( ( height + 3 ) / 4 ); + int stride = ( ( width * height ) / numBlocks ) * 4; // number of bytes from one block to the next + // example: 2x8 pixels + // numBlocks = 2 + // stride = 32 bytes (8 pixels) + + for ( int i = 0; i < numBlocks; i++ ) { + // FIXME: This just emits a fake block based on the normal at position 0,0 + EmitByte( inBuf[0] ); + EmitByte( 0 ); // dummy, never used + EmitByte( 0 ); // 6 alpha index bytes all use the first alpha + EmitByte( 0 ); + EmitByte( 0 ); + EmitByte( 0 ); + EmitByte( 0 ); + EmitByte( 0 ); + + EmitByte( inBuf[1] ); + EmitByte( 0 ); // dummy, never used + EmitByte( 0 ); // 6 alpha index bytes all use the first alpha + EmitByte( 0 ); + EmitByte( 0 ); + EmitByte( 0 ); + EmitByte( 0 ); + EmitByte( 0 ); + + inBuf += stride; + } +} + +/* +======================== +idDxtEncoder::WriteTinyDXT5A +======================== +*/ +void idDxtEncoder::WriteTinyDXT5A( const byte *inBuf, int width, int height ) { + int numBlocks = ( ( width + 3 ) / 4 ) * ( ( height + 3 ) / 4 ); + int stride = ( ( width * height ) / numBlocks ) * 4; // number of bytes from one block to the next + // example: 2x8 pixels + // numBlocks = 2 + // stride = 32 bytes (8 pixels) + + for ( int i = 0; i < numBlocks; i++ ) { + // FIXME: This just emits a fake block based on the normal at position 0,0 + EmitByte( inBuf[0] ); + EmitByte( 0 ); // dummy, never used + EmitByte( 0 ); // 6 alpha index bytes all use the first alpha + EmitByte( 0 ); + EmitByte( 0 ); + EmitByte( 0 ); + EmitByte( 0 ); + EmitByte( 0 ); + + inBuf += stride; + } +} + +/* +======================== +idDxtEncoder::ExtractBlock + +params: inPtr - input image, 4 bytes per pixel +paramO: colorBlock - 4*4 output tile, 4 bytes per pixel +======================== +*/ +ID_INLINE void idDxtEncoder::ExtractBlock( const byte *inPtr, int width, byte *colorBlock ) const { + for ( int j = 0; j < 4; j++ ) { + memcpy( &colorBlock[j*4*4], inPtr, 4*4 ); + inPtr += width * 4; + } +} + +/* +======================== +SwapColors +======================== +*/ +void SwapColors( byte *c1, byte *c2 ) { + byte tm[3]; + memcpy( tm, c1, 3 ); + memcpy( c1, c2, 3 ); + memcpy( c2, tm, 3 ); +} + +/* +======================== +idDxtEncoder::GetMinMaxColorsMaxDist + +Finds the two RGB colors in a 4x4 block furthest apart. Also finds the two alpha values +furthest apart. + +params: colorBlock - 4*4 input tile, 4 bytes per pixel +paramO: minColor - 4 byte min color +paramO: maxColor - 4 byte max color +======================== +*/ +void idDxtEncoder::GetMinMaxColorsMaxDist( const byte *colorBlock, byte *minColor, byte *maxColor ) const { + int maxDistC = -1; + int maxDistA = -1; + + for ( int i = 0; i < 64 - 4; i += 4 ) { + for ( int j = i + 4; j < 64; j += 4 ) { + int dc = ColorDistance( &colorBlock[i], &colorBlock[j] ); + if ( dc > maxDistC ) { + maxDistC = dc; + memcpy( minColor, colorBlock+i, 3 ); + memcpy( maxColor, colorBlock+j, 3 ); + } + int da = AlphaDistance( colorBlock[i+3], colorBlock[j+3] ); + if ( da > maxDistA ) { + maxDistA = da; + minColor[3] = colorBlock[i+3]; + maxColor[3] = colorBlock[j+3]; + } + } + } + if ( maxColor[0] < minColor[0] ) { + SwapColors( minColor, maxColor ); + } +} + +/* +======================== +idDxtEncoder::GetMinMaxColorsLuminance + +Finds the two RGB colors in a 4x4 block furthest apart based on luminance. Also finds the two +alpha values furthest apart. + +params: colorBlock - 4*4 input tile, 4 bytes per pixel +paramO: minColor - 4 byte min color +paramO: maxColor - 4 byte max color +======================== +*/ +void idDxtEncoder::GetMinMaxColorsLuminance( const byte *colorBlock, byte *minColor, byte *maxColor ) const { + int maxLumC = 0, minLumC = 256 * 4; + int maxAlpha = 0, minAlpha = 256 * 4; + + for ( int i = 0; i < 16; i++ ) { + int luminance = colorBlock[i*4+0] + colorBlock[i*4+1] * 2 + colorBlock[i*4+2]; + if ( luminance > maxLumC ) { + maxLumC = luminance; + memcpy( maxColor, colorBlock+i*4, 3 ); + } + if ( luminance < minLumC ) { + minLumC = luminance; + memcpy( minColor, colorBlock+i*4, 3 ); + } + int alpha = colorBlock[i*4+3]; + if ( alpha > maxAlpha ) { + maxAlpha = alpha; + maxColor[3] = (byte)alpha; + } + if ( alpha < minAlpha ) { + minAlpha = alpha; + minColor[3] = (byte)alpha; + } + } + if ( maxColor[0] < minColor[0] ) { + SwapColors( minColor, maxColor ); + } +} + +/* +======================== +idDxtEncoder::GetSquareAlphaError + +params: colorBlock - 16 pixel block for which to find color indexes +paramO: minAlpha - Min alpha found +paramO: maxAlpha - Max alpha found +return: 4 byte color index block +======================== +*/ +int idDxtEncoder::GetSquareAlphaError( const byte *colorBlock, const int alphaOffset, const byte minAlpha, const byte maxAlpha, int lastError ) const { + int i, j; + byte alphas[8]; + + alphas[0] = maxAlpha; + alphas[1] = minAlpha; + + if ( maxAlpha > minAlpha ) { + alphas[2] = ( 6 * alphas[0] + 1 * alphas[1] ) / 7; + alphas[3] = ( 5 * alphas[0] + 2 * alphas[1] ) / 7; + alphas[4] = ( 4 * alphas[0] + 3 * alphas[1] ) / 7; + alphas[5] = ( 3 * alphas[0] + 4 * alphas[1] ) / 7; + alphas[6] = ( 2 * alphas[0] + 5 * alphas[1] ) / 7; + alphas[7] = ( 1 * alphas[0] + 6 * alphas[1] ) / 7; + } else { + alphas[2] = ( 4 * alphas[0] + 1 * alphas[1] ) / 5; + alphas[3] = ( 3 * alphas[0] + 2 * alphas[1] ) / 5; + alphas[4] = ( 2 * alphas[0] + 3 * alphas[1] ) / 5; + alphas[5] = ( 1 * alphas[0] + 4 * alphas[1] ) / 5; + alphas[6] = 0; + alphas[7] = 255; + } + + int error = 0; + for ( i = 0; i < 16; i++ ) { + unsigned int minDist = MAX_UNSIGNED_TYPE( int ); + byte a = colorBlock[i*4+alphaOffset]; + for ( j = 0; j < 8; j++ ) { + unsigned int dist = AlphaDistance( a, alphas[j] ); + if ( dist < minDist ) { + minDist = dist; + } + } + error += minDist; + + if ( error >= lastError ) { + return error; + } + } + + return error; +} + +/* +======================== +idDxtEncoder::GetMinMaxAlphaHQ + +params: colorBlock - 4*4 input tile, 4 bytes per pixel +paramO: minColor - 4 byte min color found +paramO: maxColor - 4 byte max color found +======================== +*/ +int idDxtEncoder::GetMinMaxAlphaHQ( const byte *colorBlock, const int alphaOffset, byte *minColor, byte *maxColor ) const { + int i, j; + byte alphaMin, alphaMax; + int error, bestError = MAX_TYPE( int ); + + alphaMin = 255; + alphaMax = 0; + + // get alpha min / max + for ( i = 0; i < 16; i++ ) { + if ( colorBlock[i*4+alphaOffset] < alphaMin ) { + alphaMin = colorBlock[i*4+alphaOffset]; + } + if ( colorBlock[i*4+alphaOffset] > alphaMax ) { + alphaMax = colorBlock[i*4+alphaOffset]; + } + } + + const int ALPHA_EXPAND = 32; + + alphaMin = ( alphaMin <= ALPHA_EXPAND ) ? 0 : alphaMin - ALPHA_EXPAND; + alphaMax = ( alphaMax >= 255 - ALPHA_EXPAND ) ? 255 : alphaMax + ALPHA_EXPAND; + + for ( i = alphaMin; i <= alphaMax; i++ ) { + for ( j = alphaMax; j >= i; j-- ) { + + error = GetSquareAlphaError( colorBlock, alphaOffset, (byte)i, (byte)j, bestError ); + if ( error < bestError ) { + bestError = error; + minColor[alphaOffset] = (byte)i; + maxColor[alphaOffset] = (byte)j; + } + + error = GetSquareAlphaError( colorBlock, alphaOffset, (byte)j, (byte)i, bestError ); + if ( error < bestError ) { + bestError = error; + minColor[alphaOffset] = (byte)i; + maxColor[alphaOffset] = (byte)j; + } + } + } + + return bestError; +} + +/* +======================== +idDxtEncoder::GetSquareColorsError + +params: colorBlock - 16 pixel block for which to find color indexes +paramO: color0 - 4 byte min color found +paramO: color1 - 4 byte max color found +return: 4 byte color index block +======================== +*/ +int idDxtEncoder::GetSquareColorsError( const byte *colorBlock, const unsigned short color0, const unsigned short color1, int lastError ) const { + int i, j; + byte colors[4][4]; + + ColorFrom565( color0, colors[0] ); + ColorFrom565( color1, colors[1] ); + + if ( color0 > color1 ) { + colors[2][0] = ( 2 * colors[0][0] + 1 * colors[1][0] ) / 3; + colors[2][1] = ( 2 * colors[0][1] + 1 * colors[1][1] ) / 3; + colors[2][2] = ( 2 * colors[0][2] + 1 * colors[1][2] ) / 3; + colors[3][0] = ( 1 * colors[0][0] + 2 * colors[1][0] ) / 3; + colors[3][1] = ( 1 * colors[0][1] + 2 * colors[1][1] ) / 3; + colors[3][2] = ( 1 * colors[0][2] + 2 * colors[1][2] ) / 3; + } else { + colors[2][0] = ( 1 * colors[0][0] + 1 * colors[1][0] ) / 2; + colors[2][1] = ( 1 * colors[0][1] + 1 * colors[1][1] ) / 2; + colors[2][2] = ( 1 * colors[0][2] + 1 * colors[1][2] ) / 2; + colors[3][0] = 0; + colors[3][1] = 0; + colors[3][2] = 0; + } + + int error = 0; + for ( i = 0; i < 16; i++ ) { + unsigned int minDist = MAX_UNSIGNED_TYPE( int ); + for ( j = 0; j < 4; j++ ) { + unsigned int dist = ColorDistance( &colorBlock[i*4], &colors[j][0] ); + if ( dist < minDist ) { + minDist = dist; + } + } + // accumulated error + error += minDist; + + if ( error > lastError ) { + return error; + } + } + return error; +} + +/* +======================== +idDxtEncoder::GetSquareNormalYError + +params: colorBlock - 16 pixel block for which to find color indexes +paramO: color0 - 4 byte min color found +paramO: color1 - 4 byte max color found +return: 4 byte color index block +======================== +*/ +int idDxtEncoder::GetSquareNormalYError( const byte *colorBlock, const unsigned short color0, const unsigned short color1, int lastError, int scale ) const { + int i, j; + byte colors[4][4]; + + ColorFrom565( color0, colors[0] ); + ColorFrom565( color1, colors[1] ); + + if ( color0 > color1 ) { + colors[2][0] = ( 2 * colors[0][0] + 1 * colors[1][0] ) / 3; + colors[2][1] = ( 2 * colors[0][1] + 1 * colors[1][1] ) / 3; + colors[2][2] = ( 2 * colors[0][2] + 1 * colors[1][2] ) / 3; + colors[3][0] = ( 1 * colors[0][0] + 2 * colors[1][0] ) / 3; + colors[3][1] = ( 1 * colors[0][1] + 2 * colors[1][1] ) / 3; + colors[3][2] = ( 1 * colors[0][2] + 2 * colors[1][2] ) / 3; + } else { + colors[2][0] = ( 1 * colors[0][0] + 1 * colors[1][0] ) / 2; + colors[2][1] = ( 1 * colors[0][1] + 1 * colors[1][1] ) / 2; + colors[2][2] = ( 1 * colors[0][2] + 1 * colors[1][2] ) / 2; + colors[3][0] = 0; + colors[3][1] = 0; + colors[3][2] = 0; + } + + int error = 0; + for ( i = 0; i < 16; i++ ) { + unsigned int minDist = MAX_UNSIGNED_TYPE( int ); + for ( j = 0; j < 4; j++ ) { + float r = (float) colorBlock[i*4+1] / scale; + float s = (float) colors[j][1] / scale; + unsigned int dist = idMath::Ftoi( ( r - s ) * ( r - s ) ); + if ( dist < minDist ) { + minDist = dist; + } + } + // accumulated error + error += minDist; + + if ( error > lastError ) { + return error; + } + } + return error; +} + +/* +======================== +idDxtEncoder::GetMinMaxColorsHQ + +Uses an exhaustive search to find the two RGB colors that produce the least error when used to +compress the 4x4 block. Also finds the minimum and maximum alpha values. + +params: colorBlock - 4*4 input tile, 4 bytes per pixel +paramO: minColor - 4 byte min color found +paramO: maxColor - 4 byte max color found +======================== +*/ +int idDxtEncoder::GetMinMaxColorsHQ( const byte *colorBlock, byte *minColor, byte *maxColor, bool noBlack ) const { + int i; + int i0, i1, i2, j0, j1, j2; + unsigned short minColor565, maxColor565, bestMinColor565, bestMaxColor565; + byte bboxMin[3], bboxMax[3], minAxisDist[3]; + int error, bestError = MAX_TYPE( int ); + + bboxMin[0] = bboxMin[1] = bboxMin[2] = 255; + bboxMax[0] = bboxMax[1] = bboxMax[2] = 0; + + // get color bbox + for ( i = 0; i < 16; i++ ) { + if ( colorBlock[i*4+0] < bboxMin[0] ) { + bboxMin[0] = colorBlock[i*4+0]; + } + if ( colorBlock[i*4+1] < bboxMin[1] ) { + bboxMin[1] = colorBlock[i*4+1]; + } + if ( colorBlock[i*4+2] < bboxMin[2] ) { + bboxMin[2] = colorBlock[i*4+2]; + } + if ( colorBlock[i*4+0] > bboxMax[0] ) { + bboxMax[0] = colorBlock[i*4+0]; + } + if ( colorBlock[i*4+1] > bboxMax[1] ) { + bboxMax[1] = colorBlock[i*4+1]; + } + if ( colorBlock[i*4+2] > bboxMax[2] ) { + bboxMax[2] = colorBlock[i*4+2]; + } + } + + // decrease range for 565 encoding + bboxMin[0] >>= 3; + bboxMin[1] >>= 2; + bboxMin[2] >>= 3; + bboxMax[0] >>= 3; + bboxMax[1] >>= 2; + bboxMax[2] >>= 3; + + // get the minimum distance the end points of the line must be apart along each axis + for ( i = 0; i < 3; i++ ) { + minAxisDist[i] = ( bboxMax[i] - bboxMin[i] ); + if ( minAxisDist[i] >= 16 ) { + minAxisDist[i] = minAxisDist[i] * 3 / 4; + } else if ( minAxisDist[i] >= 8 ) { + minAxisDist[i] = minAxisDist[i] * 2 / 4; + } else if ( minAxisDist[i] >= 4 ) { + minAxisDist[i] = minAxisDist[i] * 1 / 4; + } else { + minAxisDist[i] = 0; + } + } + + // expand the bounding box + const int C565_BBOX_EXPAND = 1; + + bboxMin[0] = ( bboxMin[0] <= C565_BBOX_EXPAND ) ? 0 : bboxMin[0] - C565_BBOX_EXPAND; + bboxMin[1] = ( bboxMin[1] <= C565_BBOX_EXPAND ) ? 0 : bboxMin[1] - C565_BBOX_EXPAND; + bboxMin[2] = ( bboxMin[2] <= C565_BBOX_EXPAND ) ? 0 : bboxMin[2] - C565_BBOX_EXPAND; + bboxMax[0] = ( bboxMax[0] >= (255>>3)-C565_BBOX_EXPAND ) ? (255>>3) : bboxMax[0] + C565_BBOX_EXPAND; + bboxMax[1] = ( bboxMax[1] >= (255>>2)-C565_BBOX_EXPAND ) ? (255>>2) : bboxMax[1] + C565_BBOX_EXPAND; + bboxMax[2] = ( bboxMax[2] >= (255>>3)-C565_BBOX_EXPAND ) ? (255>>3) : bboxMax[2] + C565_BBOX_EXPAND; + + bestMinColor565 = 0; + bestMaxColor565 = 0; + + for ( i0 = bboxMin[0]; i0 <= bboxMax[0]; i0++ ) { + for ( j0 = bboxMax[0]; j0 >= bboxMin[0]; j0-- ) { + if ( abs( i0 - j0 ) < minAxisDist[0] ) { + continue; + } + + for ( i1 = bboxMin[1]; i1 <= bboxMax[1]; i1++ ) { + for ( j1 = bboxMax[1]; j1 >= bboxMin[1]; j1-- ) { + if ( abs( i1 - j1 ) < minAxisDist[1] ) { + continue; + } + + for ( i2 = bboxMin[2]; i2 <= bboxMax[2]; i2++ ) { + for ( j2 = bboxMax[2]; j2 >= bboxMin[2]; j2-- ) { + if ( abs( i2 - j2 ) < minAxisDist[2] ) { + continue; + } + + minColor565 = (unsigned short)( ( i0 << 11 ) | ( i1 << 5 ) | ( i2 << 0 ) ); + maxColor565 = (unsigned short)( ( j0 << 11 ) | ( j1 << 5 ) | ( j2 << 0 ) ); + + if ( !noBlack ) { + error = GetSquareColorsError( colorBlock, maxColor565, minColor565, bestError ); + if ( error < bestError ) { + bestError = error; + bestMinColor565 = minColor565; + bestMaxColor565 = maxColor565; + } + } else { + if ( minColor565 <= maxColor565 ) { + SwapValues( minColor565, maxColor565 ); + } + } + + error = GetSquareColorsError( colorBlock, minColor565, maxColor565, bestError ); + if ( error < bestError ) { + bestError = error; + bestMinColor565 = minColor565; + bestMaxColor565 = maxColor565; + } + } + } + } + } + } + } + + ColorFrom565( bestMinColor565, minColor ); + ColorFrom565( bestMaxColor565, maxColor ); + + return bestError; +} + +/* +======================== +idDxtEncoder::GetSquareCTX1Error + +params: colorBlock - 16 pixel block for which to find color indexes +paramO: color0 - Min color found +paramO: color1 - Max color found +return: 4 byte color index block +======================== +*/ +int idDxtEncoder::GetSquareCTX1Error( const byte *colorBlock, const byte *color0, const byte *color1, int lastError ) const { + int i, j; + byte colors[4][4]; + + colors[0][0] = color0[0]; + colors[0][1] = color0[1]; + colors[1][0] = color1[0]; + colors[1][1] = color1[1]; + + colors[2][0] = ( 2 * colors[0][0] + 1 * colors[1][0] ) / 3; + colors[2][1] = ( 2 * colors[0][1] + 1 * colors[1][1] ) / 3; + colors[3][0] = ( 1 * colors[0][0] + 2 * colors[1][0] ) / 3; + colors[3][1] = ( 1 * colors[0][1] + 2 * colors[1][1] ) / 3; + + int error = 0; + for ( i = 0; i < 16; i++ ) { + unsigned int minDist = MAX_UNSIGNED_TYPE( int ); + for ( j = 0; j < 4; j++ ) { + unsigned int dist = CTX1Distance( &colorBlock[i*4], &colors[j][0] ); + if ( dist < minDist ) { + minDist = dist; + } + } + // accumulated error + error += minDist; + + if ( error > lastError ) { + return error; + } + } + return error; +} + +/* +======================== +idDxtEncoder::GetMinMaxCTX1HQ + +Uses an exhaustive search to find the two RGB colors that produce the least error when used to +compress the 4x4 block. Also finds the minimum and maximum alpha values. + +params: colorBlock - 4*4 input tile, 4 bytes per pixel +paramO: minColor - 4 byte Min color found +paramO: maxColor - 4 byte Max color found +======================== +*/ +int idDxtEncoder::GetMinMaxCTX1HQ( const byte *colorBlock, byte *minColor, byte *maxColor ) const { + int i; + int i0, i1, j0, j1; + byte curMinColor[2], curMaxColor[2]; + byte bboxMin[2], bboxMax[2], minAxisDist[2]; + int error, bestError = MAX_TYPE( int ); + + bboxMin[0] = bboxMin[1] = 255; + bboxMax[0] = bboxMax[1] = 0; + + // get color bbox + for ( i = 0; i < 16; i++ ) { + if ( colorBlock[i*4+0] < bboxMin[0] ) { + bboxMin[0] = colorBlock[i*4+0]; + } + if ( colorBlock[i*4+1] < bboxMin[1] ) { + bboxMin[1] = colorBlock[i*4+1]; + } + if ( colorBlock[i*4+0] > bboxMax[0] ) { + bboxMax[0] = colorBlock[i*4+0]; + } + if ( colorBlock[i*4+1] > bboxMax[1] ) { + bboxMax[1] = colorBlock[i*4+1]; + } + } + + // get the minimum distance the end points of the line must be apart along each axis + for ( i = 0; i < 2; i++ ) { + minAxisDist[i] = ( bboxMax[i] - bboxMin[i] ); + if ( minAxisDist[i] >= 64 ) { + minAxisDist[i] = minAxisDist[i] * 3 / 4; + } else if ( minAxisDist[i] >= 32 ) { + minAxisDist[i] = minAxisDist[i] * 2 / 4; + } else if ( minAxisDist[i] >= 16 ) { + minAxisDist[i] = minAxisDist[i] * 1 / 4; + } else { + minAxisDist[i] = 0; + } + } + + // expand the bounding box + const int CXT1_BBOX_EXPAND = 6; + + bboxMin[0] = ( bboxMin[0] <= CXT1_BBOX_EXPAND ) ? 0 : bboxMin[0] - CXT1_BBOX_EXPAND; + bboxMin[1] = ( bboxMin[1] <= CXT1_BBOX_EXPAND ) ? 0 : bboxMin[1] - CXT1_BBOX_EXPAND; + bboxMax[0] = ( bboxMax[0] >= 255 - CXT1_BBOX_EXPAND ) ? 255 : bboxMax[0] + CXT1_BBOX_EXPAND; + bboxMax[1] = ( bboxMax[1] >= 255 - CXT1_BBOX_EXPAND ) ? 255 : bboxMax[1] + CXT1_BBOX_EXPAND; + + for ( i0 = bboxMin[0]; i0 <= bboxMax[0]; i0++ ) { + for ( j0 = bboxMax[0]; j0 >= bboxMin[0]; j0-- ) { + if ( abs( i0 - j0 ) < minAxisDist[0] ) { + continue; + } + + for ( i1 = bboxMin[1]; i1 <= bboxMax[1]; i1++ ) { + for ( j1 = bboxMax[1]; j1 >= bboxMin[1]; j1-- ) { + if ( abs( i1 - j1 ) < minAxisDist[1] ) { + continue; + } + + curMinColor[0] = (byte)i0; + curMinColor[1] = (byte)i1; + + curMaxColor[0] = (byte)j0; + curMaxColor[1] = (byte)j1; + + error = GetSquareCTX1Error( colorBlock, curMinColor, curMaxColor, bestError ); + if ( error < bestError ) { + bestError = error; + memcpy( minColor, curMinColor, 2 ); + memcpy( maxColor, curMaxColor, 2 ); + } + } + } + } + } + + return bestError; +} + +/* +======================== +idDxtEncoder::GetMinMaxNormalYHQ + +Uses an exhaustive search to find the two RGB colors that produce the least error when used to +compress the 4x4 block. Also finds the minimum and maximum alpha values. + +params: colorBlock - 4*4 input tile, 4 bytes per pixel +paramO: minColor - 4 byte Min color found +paramO: maxColor - 4 byte Max color found +======================== +*/ +int idDxtEncoder::GetMinMaxNormalYHQ( const byte *colorBlock, byte *minColor, byte *maxColor, bool noBlack, int scale ) const { + unsigned short bestMinColor565, bestMaxColor565; + byte bboxMin[3], bboxMax[3]; + int error, bestError = MAX_TYPE( int ); + + bboxMin[1] = 255; + bboxMax[1] = 0; + + // get color bbox + for ( int i = 0; i < 16; i++ ) { + if ( colorBlock[i*4+1] < bboxMin[1] ) { + bboxMin[1] = colorBlock[i*4+1]; + } + if ( colorBlock[i*4+1] > bboxMax[1] ) { + bboxMax[1] = colorBlock[i*4+1]; + } + } + + // decrease range for 565 encoding + bboxMin[1] >>= 2; + bboxMax[1] >>= 2; + + // expand the bounding box + const int C565_BBOX_EXPAND = 1; + + bboxMin[1] = ( bboxMin[1] <= C565_BBOX_EXPAND ) ? 0 : bboxMin[1] - C565_BBOX_EXPAND; + bboxMax[1] = ( bboxMax[1] >= (255>>2)-C565_BBOX_EXPAND ) ? (255>>2) : bboxMax[1] + C565_BBOX_EXPAND; + + bestMinColor565 = 0; + bestMaxColor565 = 0; + + for ( int i1 = bboxMin[1]; i1 <= bboxMax[1]; i1++ ) { + for ( int j1 = bboxMax[1]; j1 >= bboxMin[1]; j1-- ) { + if ( abs( i1 - j1 ) < 0 ) { + continue; + } + + unsigned short minColor565 = (unsigned short)i1 << 5; + unsigned short maxColor565 = (unsigned short)j1 << 5; + + if ( !noBlack ) { + error = GetSquareNormalYError( colorBlock, maxColor565, minColor565, bestError, scale ); + if ( error < bestError ) { + bestError = error; + bestMinColor565 = minColor565; + bestMaxColor565 = maxColor565; + } + } else { + if ( minColor565 <= maxColor565 ) { + SwapValues( minColor565, maxColor565 ); + } + } + + error = GetSquareNormalYError( colorBlock, minColor565, maxColor565, bestError, scale ); + if ( error < bestError ) { + bestError = error; + bestMinColor565 = minColor565; + bestMaxColor565 = maxColor565; + } + } + } + + ColorFrom565( bestMinColor565, minColor ); + ColorFrom565( bestMaxColor565, maxColor ); + + int bias = colorBlock[0*4+0]; + int size = colorBlock[0*4+2]; + + minColor[0] = maxColor[0] = (byte)bias; + minColor[2] = maxColor[2] = (byte)size; + + return bestError; +} + +#if defined( ID_WIN_X86_ASM ) +ALIGN16( static float SIMD_SSE2_float_scale[4] ) = { 2.0f / 255.0f, 2.0f / 255.0f, 2.0f / 255.0f, 2.0f / 255.0f }; +ALIGN16( static float SIMD_SSE2_float_descale[4] ) = { 255.0f / 2.0f, 255.0f / 2.0f, 255.0f / 2.0f, 255.0f / 2.0f }; +ALIGN16( static float SIMD_SSE2_float_zero[4] ) = { 0.0f, 0.0f, 0.0f, 0.0f }; +ALIGN16( static float SIMD_SSE2_float_one[4] ) = { 1.0f, 1.0f, 1.0f, 1.0f }; +ALIGN16( static float SIMD_SSE2_float_half[4] ) = { 0.5f, 0.5f, 0.5f, 0.5f }; +ALIGN16( static float SIMD_SSE2_float_255[4] ) = { 255.0f, 255.0f, 255.0f, 255.0f }; +ALIGN16( static float SIMD_SP_rsqrt_c0[4] ) = { 3.0f, 3.0f, 3.0f, 3.0f }; +ALIGN16( static float SIMD_SP_rsqrt_c1[4] ) = { -0.5f, -0.5f, -0.5f, -0.5f }; +ALIGN16( static dword SIMD_SSE2_dword_maskFirstThree[4] ) = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 }; +ALIGN16( static dword SIMD_SSE2_dword_maskWords[4] ) = { 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x00000000 }; +#define R_SHUFFLE_PS( x, y, z, w ) (( (w) & 3 ) << 6 | ( (z) & 3 ) << 4 | ( (y) & 3 ) << 2 | ( (x) & 3 )) +#endif + +/* +======================== +NormalDistanceDXT1 +======================== +*/ +int NormalDistanceDXT1( const int *vector, const int *normalized ) { +#if defined( ID_WIN_X86_ASM ) + int result; + __asm { + mov esi, vector + mov edi, normalized + cvtdq2ps xmm0, [esi] + mulps xmm0, SIMD_SSE2_float_scale + subps xmm0, SIMD_SSE2_float_one + pand xmm0, SIMD_SSE2_dword_maskFirstThree + movaps xmm1, xmm0 + mulps xmm1, xmm1 + pshufd xmm2, xmm1, R_SHUFFLE_PS( 2, 3, 0, 1 ) + addps xmm2, xmm1 + pshufd xmm1, xmm2, R_SHUFFLE_PS( 1, 0, 1, 0 ) + addps xmm2, xmm1 + + rsqrtps xmm1, xmm2 + mulps xmm2, xmm1 + mulps xmm2, xmm1 + subps xmm2, SIMD_SP_rsqrt_c0 + mulps xmm1, SIMD_SP_rsqrt_c1 + mulps xmm2, xmm1 + + mulps xmm0, xmm2 + addps xmm0, SIMD_SSE2_float_one + mulps xmm0, SIMD_SSE2_float_descale + addps xmm0, SIMD_SSE2_float_half + maxps xmm0, SIMD_SSE2_float_zero + minps xmm0, SIMD_SSE2_float_255 + cvttps2dq xmm0, xmm0 + psubd xmm0, [edi] + pand xmm0, SIMD_SSE2_dword_maskWords + pmullw xmm0, xmm0 + pshufd xmm1, xmm0, R_SHUFFLE_PS( 2, 3, 0, 1 ) + paddd xmm0, xmm1 + pshufd xmm1, xmm0, R_SHUFFLE_PS( 1, 0, 1, 0 ) + paddd xmm0, xmm1 + movd result, xmm0 + } + return result; +#else + float floatNormal[3]; + byte intNormal[4]; + floatNormal[0] = vector[0] * ( 2.0f / 255.0f ) - 1.0f; + floatNormal[1] = vector[1] * ( 2.0f / 255.0f ) - 1.0f; + floatNormal[2] = vector[2] * ( 2.0f / 255.0f ) - 1.0f; + float rcplen = idMath::InvSqrt( floatNormal[0] * floatNormal[0] + floatNormal[1] * floatNormal[1] + floatNormal[2] * floatNormal[2] ); + floatNormal[0] *= rcplen; + floatNormal[1] *= rcplen; + floatNormal[2] *= rcplen; + intNormal[0] = idMath::Ftob( ( floatNormal[0] + 1.0f ) * ( 255.0f / 2.0f ) + 0.5f ); + intNormal[1] = idMath::Ftob( ( floatNormal[1] + 1.0f ) * ( 255.0f / 2.0f ) + 0.5f ); + intNormal[2] = idMath::Ftob( ( floatNormal[2] + 1.0f ) * ( 255.0f / 2.0f ) + 0.5f ); + int result = ( ( intNormal[ 0 ] - normalized[ 0 ] ) * ( intNormal[ 0 ] - normalized[ 0 ] ) ) + + ( ( intNormal[ 1 ] - normalized[ 1 ] ) * ( intNormal[ 1 ] - normalized[ 1 ] ) ) + + ( ( intNormal[ 2 ] - normalized[ 2 ] ) * ( intNormal[ 2 ] - normalized[ 2 ] ) ); + return result; +#endif +} + +/* +======================== +NormalDistanceDXT5 +======================== +*/ +int NormalDistanceDXT5( const int *vector, const int *normalized ) { +#if defined( ID_WIN_X86_ASM ) + int result; + __asm { + mov esi, vector + mov edi, normalized +#if 0 // object-space + pshufd xmm0, [esi], R_SHUFFLE_PS( 0, 1, 3, 2 ) +#else + pshufd xmm0, [esi], R_SHUFFLE_PS( 1, 2, 3, 0 ) +#endif + cvtdq2ps xmm0, xmm0 + mulps xmm0, SIMD_SSE2_float_scale + subps xmm0, SIMD_SSE2_float_one + pand xmm0, SIMD_SSE2_dword_maskFirstThree + movaps xmm1, xmm0 + mulps xmm1, xmm1 + pshufd xmm2, xmm1, R_SHUFFLE_PS( 2, 3, 0, 1 ) + addps xmm2, xmm1 + pshufd xmm1, xmm2, R_SHUFFLE_PS( 1, 0, 1, 0 ) + addps xmm2, xmm1 + + rsqrtps xmm1, xmm2 + mulps xmm2, xmm1 + mulps xmm2, xmm1 + subps xmm2, SIMD_SP_rsqrt_c0 + mulps xmm1, SIMD_SP_rsqrt_c1 + mulps xmm2, xmm1 + + mulps xmm0, xmm2 + addps xmm0, SIMD_SSE2_float_one + mulps xmm0, SIMD_SSE2_float_descale + addps xmm0, SIMD_SSE2_float_half + maxps xmm0, SIMD_SSE2_float_zero + minps xmm0, SIMD_SSE2_float_255 + cvttps2dq xmm0, xmm0 +#if 0 // object-space + pshufd xmm3, [edi], R_SHUFFLE_PS( 0, 1, 3, 2 ) +#else + pshufd xmm3, [edi], R_SHUFFLE_PS( 1, 2, 3, 0 ) +#endif + psubd xmm0, xmm3 + pand xmm0, SIMD_SSE2_dword_maskWords + pmullw xmm0, xmm0 + pshufd xmm1, xmm0, R_SHUFFLE_PS( 2, 3, 0, 1 ) + paddd xmm0, xmm1 + pshufd xmm1, xmm0, R_SHUFFLE_PS( 1, 0, 1, 0 ) + paddd xmm0, xmm1 + movd result, xmm0 + } + return result; +#else +#if 0 // object-space + const int c0 = 0; + const int c1 = 1; + const int c2 = 3; +#else + const int c0 = 1; + const int c1 = 2; + const int c2 = 3; +#endif + float floatNormal[3]; + byte intNormal[4]; + floatNormal[0] = vector[c0] / 255.0f * 2.0f - 1.0f; + floatNormal[1] = vector[c1] / 255.0f * 2.0f - 1.0f; + floatNormal[2] = vector[c2] / 255.0f * 2.0f - 1.0f; + float rcplen = idMath::InvSqrt( floatNormal[0] * floatNormal[0] + floatNormal[1] * floatNormal[1] + floatNormal[2] * floatNormal[2] ); + floatNormal[0] *= rcplen; + floatNormal[1] *= rcplen; + floatNormal[2] *= rcplen; + intNormal[c0] = idMath::Ftob( ( floatNormal[0] + 1.0f ) / 2.0f * 255.0f + 0.5f ); + intNormal[c1] = idMath::Ftob( ( floatNormal[1] + 1.0f ) / 2.0f * 255.0f + 0.5f ); + intNormal[c2] = idMath::Ftob( ( floatNormal[2] + 1.0f ) / 2.0f * 255.0f + 0.5f ); + int result = ( ( intNormal[ c0 ] - normalized[ c0 ] ) * ( intNormal[ c0 ] - normalized[ c0 ] ) ) + + ( ( intNormal[ c1 ] - normalized[ c1 ] ) * ( intNormal[ c1 ] - normalized[ c1 ] ) ) + + ( ( intNormal[ c2 ] - normalized[ c2 ] ) * ( intNormal[ c2 ] - normalized[ c2 ] ) ); + return result; +#endif +} + +/* +======================== +idDxtEncoder::GetSquareNormalsDXT1Error + +params: colorBlock - 4*4 input tile, 4 bytes per pixel +paramO: color0 - 4 byte Min color found +paramO: color1 - 4 byte Max color found +return: 4 byte color index block +======================== +*/ +int idDxtEncoder::GetSquareNormalsDXT1Error( const int *colorBlock, const unsigned short color0, const unsigned short color1, int lastError, unsigned int &colorIndices ) const { + byte byteColors[2][4]; + ALIGN16( int colors[4][4] ); + + ColorFrom565( color0, byteColors[0] ); + ColorFrom565( color1, byteColors[1] ); + + for ( int i = 0; i < 4; i++ ) { + colors[0][i] = byteColors[0][i]; + colors[1][i] = byteColors[1][i]; + } + + if ( color0 > color1 ) { + colors[2][0] = ( 2 * colors[0][0] + 1 * colors[1][0] ) / 3; + colors[2][1] = ( 2 * colors[0][1] + 1 * colors[1][1] ) / 3; + colors[2][2] = ( 2 * colors[0][2] + 1 * colors[1][2] ) / 3; + colors[3][0] = ( 1 * colors[0][0] + 2 * colors[1][0] ) / 3; + colors[3][1] = ( 1 * colors[0][1] + 2 * colors[1][1] ) / 3; + colors[3][2] = ( 1 * colors[0][2] + 2 * colors[1][2] ) / 3; + } else { + assert( color0 == color1 ); + colors[2][0] = ( 1 * colors[0][0] + 1 * colors[1][0] ) / 2; + colors[2][1] = ( 1 * colors[0][1] + 1 * colors[1][1] ) / 2; + colors[2][2] = ( 1 * colors[0][2] + 1 * colors[1][2] ) / 2; + colors[3][0] = 0; + colors[3][1] = 0; + colors[3][2] = 0; + } + + int error = 0; + int tempColorIndices[16]; + for ( int i = 0; i < 16; i++ ) { + unsigned int minDist = MAX_UNSIGNED_TYPE( int ); + + for ( int j = 0; j < 4; j++ ) { + unsigned int dist = NormalDistanceDXT1( &colors[j][0], &colorBlock[i*4] ); + if ( dist < minDist ) { + minDist = dist; + tempColorIndices[i] = j; + } + } + // accumulated error + error += minDist; + + if ( error > lastError ) { + return error; + } + } + + colorIndices = 0; + for ( int i = 0; i < 16; i++ ) { + colorIndices |= ( tempColorIndices[i] << (unsigned int)( i << 1 ) ); + } + + return error; +} + +/* +======================== +idDxtEncoder::GetMinMaxNormalsDXT1HQ + +Uses an exhaustive search to find the two RGB colors that produce the least error when used to +compress the 4x4 block. Also finds the minimum and maximum alpha values. + +params: colorBlock - 4*4 input tile, 4 bytes per pixel +paramO: minColor - 4 byte Min color found +paramO: maxColor - 4 byte Max color found +======================== +*/ +int idDxtEncoder::GetMinMaxNormalsDXT1HQ( const byte *colorBlock, byte *minColor, byte *maxColor, unsigned int &colorIndices, bool noBlack ) const { + int i; + int i0, i1, i2, j0, j1, j2; + unsigned short bestMinColor565 = 0; + unsigned short bestMaxColor565 = 0; + byte bboxMin[3], bboxMax[3], minAxisDist[3]; + int error, bestError = MAX_TYPE( int ); + unsigned int tempColorIndices; + ALIGN16( int intColorBlock[16*4] ); + + bboxMin[0] = bboxMin[1] = bboxMin[2] = 128; + bboxMax[0] = bboxMax[1] = bboxMax[2] = 128; + + // get color bbox + for ( i = 0; i < 16; i++ ) { + if ( colorBlock[i*4+0] < bboxMin[0] ) { + bboxMin[0] = colorBlock[i*4+0]; + } + if ( colorBlock[i*4+1] < bboxMin[1] ) { + bboxMin[1] = colorBlock[i*4+1]; + } + if ( colorBlock[i*4+2] < bboxMin[2] ) { + bboxMin[2] = colorBlock[i*4+2]; + } + if ( colorBlock[i*4+0] > bboxMax[0] ) { + bboxMax[0] = colorBlock[i*4+0]; + } + if ( colorBlock[i*4+1] > bboxMax[1] ) { + bboxMax[1] = colorBlock[i*4+1]; + } + if ( colorBlock[i*4+2] > bboxMax[2] ) { + bboxMax[2] = colorBlock[i*4+2]; + } + } + + for ( int i = 0; i < 64; i++ ) { + intColorBlock[i] = colorBlock[i]; + } + + // decrease range for 565 encoding + bboxMin[0] >>= 3; + bboxMin[1] >>= 2; + bboxMin[2] >>= 3; + bboxMax[0] >>= 3; + bboxMax[1] >>= 2; + bboxMax[2] >>= 3; + + // get the minimum distance the end points of the line must be apart along each axis + for ( i = 0; i < 3; i++ ) { + minAxisDist[i] = 0; + } + + // expand the bounding box + const int C565_BBOX_EXPAND = 2; + + bboxMin[0] = ( bboxMin[0] <= C565_BBOX_EXPAND ) ? 0 : bboxMin[0] - C565_BBOX_EXPAND; + bboxMin[1] = ( bboxMin[1] <= C565_BBOX_EXPAND ) ? 0 : bboxMin[1] - C565_BBOX_EXPAND; + bboxMin[2] = ( bboxMin[2] <= C565_BBOX_EXPAND ) ? 0 : bboxMin[2] - C565_BBOX_EXPAND; + bboxMax[0] = ( bboxMax[0] >= (255>>3)-C565_BBOX_EXPAND ) ? (255>>3) : bboxMax[0] + C565_BBOX_EXPAND; + bboxMax[1] = ( bboxMax[1] >= (255>>2)-C565_BBOX_EXPAND ) ? (255>>2) : bboxMax[1] + C565_BBOX_EXPAND; + bboxMax[2] = ( bboxMax[2] >= (255>>3)-C565_BBOX_EXPAND ) ? (255>>3) : bboxMax[2] + C565_BBOX_EXPAND; + + for ( i0 = bboxMin[0]; i0 <= bboxMax[0]; i0++ ) { + for ( j0 = bboxMax[0]; j0 >= bboxMin[0]; j0-- ) { + if ( abs( i0 - j0 ) < minAxisDist[0] ) { + continue; + } + + for ( i1 = bboxMin[1]; i1 <= bboxMax[1]; i1++ ) { + for ( j1 = bboxMax[1]; j1 >= bboxMin[1]; j1-- ) { + if ( abs( i1 - j1 ) < minAxisDist[1] ) { + continue; + } + + for ( i2 = bboxMin[2]; i2 <= bboxMax[2]; i2++ ) { + for ( j2 = bboxMax[2]; j2 >= bboxMin[2]; j2-- ) { + if ( abs( i2 - j2 ) < minAxisDist[2] ) { + continue; + } + + unsigned short minColor565 = (unsigned short)( ( i0 << 11 ) | ( i1 << 5 ) | ( i2 << 0 ) ); + unsigned short maxColor565 = (unsigned short)( ( j0 << 11 ) | ( j1 << 5 ) | ( j2 << 0 ) ); + + if ( !noBlack ) { + error = GetSquareNormalsDXT1Error( intColorBlock, maxColor565, minColor565, bestError, tempColorIndices ); + if ( error < bestError ) { + bestError = error; + bestMinColor565 = minColor565; + bestMaxColor565 = maxColor565; + colorIndices = tempColorIndices; + } + } else { + if ( minColor565 <= maxColor565 ) { + SwapValues( minColor565, maxColor565 ); + } + } + + error = GetSquareNormalsDXT1Error( intColorBlock, minColor565, maxColor565, bestError, tempColorIndices ); + if ( error < bestError ) { + bestError = error; + bestMinColor565 = minColor565; + bestMaxColor565 = maxColor565; + colorIndices = tempColorIndices; + } + } + } + } + } + } + } + + ColorFrom565( bestMinColor565, minColor ); + ColorFrom565( bestMaxColor565, maxColor ); + + return bestError; +} + +/* +======================== +idDxtEncoder::GetSquareNormalsDXT5Error + +params: normalBlock - 16 pixel block for which to find normal indexes +paramO: minNormal - Min normal found +paramO: maxNormal - Max normal found +======================== +*/ +int idDxtEncoder::GetSquareNormalsDXT5Error( const int *normalBlock, const byte *minNormal, const byte *maxNormal, int lastError, unsigned int &colorIndices, byte *alphaIndices ) const { + byte alphas[8]; + byte colors[4][4]; + + unsigned short smin = ColorTo565( minNormal ); + unsigned short smax = ColorTo565( maxNormal ); + + ColorFrom565( smax, colors[0] ); + ColorFrom565( smin, colors[1] ); + + if ( smax > smin ) { + colors[2][0] = ( 2 * colors[0][0] + 1 * colors[1][0] ) / 3; + colors[2][1] = ( 2 * colors[0][1] + 1 * colors[1][1] ) / 3; + colors[2][2] = ( 2 * colors[0][2] + 1 * colors[1][2] ) / 3; + colors[3][0] = ( 1 * colors[0][0] + 2 * colors[1][0] ) / 3; + colors[3][1] = ( 1 * colors[0][1] + 2 * colors[1][1] ) / 3; + colors[3][2] = ( 1 * colors[0][2] + 2 * colors[1][2] ) / 3; + } else { + assert( smax == smin ); + colors[2][0] = ( 1 * colors[0][0] + 1 * colors[1][0] ) / 2; + colors[2][1] = ( 1 * colors[0][1] + 1 * colors[1][1] ) / 2; + colors[2][2] = ( 1 * colors[0][2] + 1 * colors[1][2] ) / 2; + colors[3][0] = 0; + colors[3][1] = 0; + colors[3][2] = 0; + } + + alphas[0] = maxNormal[3]; + alphas[1] = minNormal[3]; + + if ( maxNormal[3] > minNormal[3] ) { + alphas[2] = ( 6 * alphas[0] + 1 * alphas[1] ) / 7; + alphas[3] = ( 5 * alphas[0] + 2 * alphas[1] ) / 7; + alphas[4] = ( 4 * alphas[0] + 3 * alphas[1] ) / 7; + alphas[5] = ( 3 * alphas[0] + 4 * alphas[1] ) / 7; + alphas[6] = ( 2 * alphas[0] + 5 * alphas[1] ) / 7; + alphas[7] = ( 1 * alphas[0] + 6 * alphas[1] ) / 7; + } else { + alphas[2] = ( 4 * alphas[0] + 1 * alphas[1] ) / 5; + alphas[3] = ( 3 * alphas[0] + 2 * alphas[1] ) / 5; + alphas[4] = ( 2 * alphas[0] + 3 * alphas[1] ) / 5; + alphas[5] = ( 1 * alphas[0] + 4 * alphas[1] ) / 5; + alphas[6] = 0; + alphas[7] = 255; + } + + int error = 0; + int tempColorIndices[16]; + int tempAlphaIndices[16]; + for ( int i = 0; i < 16; i++ ) { + ALIGN16( int normal[4] ); + unsigned int minDist = MAX_UNSIGNED_TYPE( int ); + + for ( int j = 0; j < 4; j++ ) { + normal[0] = colors[j][0]; + normal[1] = colors[j][1]; + normal[2] = colors[j][2]; + + for ( int k = 0; k < 8; k++ ) { + normal[3] = alphas[k]; + unsigned int dist = NormalDistanceDXT5( normal, &normalBlock[i*4] ); + if ( dist < minDist ) { + minDist = dist; + tempColorIndices[i] = j; + tempAlphaIndices[i] = k; + } + } + } + error += minDist; + + if ( error >= lastError ) { + return error; + } + } + + alphaIndices[0] = byte( (tempAlphaIndices[ 0] >> 0) | (tempAlphaIndices[ 1] << 3) | (tempAlphaIndices[ 2] << 6) ); + alphaIndices[1] = byte( (tempAlphaIndices[ 2] >> 2) | (tempAlphaIndices[ 3] << 1) | (tempAlphaIndices[ 4] << 4) | (tempAlphaIndices[ 5] << 7) ); + alphaIndices[2] = byte( (tempAlphaIndices[ 5] >> 1) | (tempAlphaIndices[ 6] << 2) | (tempAlphaIndices[ 7] << 5) ); + + alphaIndices[3] = byte( (tempAlphaIndices[ 8] >> 0) | (tempAlphaIndices[ 9] << 3) | (tempAlphaIndices[10] << 6) ); + alphaIndices[4] = byte( (tempAlphaIndices[10] >> 2) | (tempAlphaIndices[11] << 1) | (tempAlphaIndices[12] << 4) | (tempAlphaIndices[13] << 7) ); + alphaIndices[5] = byte( (tempAlphaIndices[13] >> 1) | (tempAlphaIndices[14] << 2) | (tempAlphaIndices[15] << 5) ); + + colorIndices = 0; + for ( int i = 0; i < 16; i++ ) { + colorIndices |= ( tempColorIndices[i] << (unsigned int)( i << 1 ) ); + } + + return error; +} + +/* +======================== +idDxtEncoder::GetMinMaxNormalsDXT5HQ + +Uses an exhaustive search to find the two RGB colors that produce the least error when used to +compress the 4x4 block. Also finds the minimum and maximum alpha values. + +params: colorBlock - 4*4 input tile, 4 bytes per pixel +paramO: minColor - 4 byte Min color found +paramO: maxColor - 4 byte Max color found +======================== +*/ +int idDxtEncoder::GetMinMaxNormalsDXT5HQ( const byte *colorBlock, byte *minColor, byte *maxColor, unsigned int &colorIndices, byte *alphaIndices ) const { + int i; + int i0, i1, i3, j0, j1, j3; + byte bboxMin[4], bboxMax[4], minAxisDist[4]; + byte tmin[4], tmax[4]; + int error, bestError = MAX_TYPE( int ); + unsigned int tempColorIndices; + byte tempAlphaIndices[6]; + ALIGN16( int intColorBlock[16*4] ); + + bboxMin[0] = bboxMin[1] = bboxMin[2] = bboxMin[3] = 255; + bboxMax[0] = bboxMax[1] = bboxMax[2] = bboxMax[3] = 0; + + // get color bbox + for ( i = 0; i < 16; i++ ) { + if ( colorBlock[i*4+0] < bboxMin[0] ) { + bboxMin[0] = colorBlock[i*4+0]; + } + if ( colorBlock[i*4+1] < bboxMin[1] ) { + bboxMin[1] = colorBlock[i*4+1]; + } + if ( colorBlock[i*4+2] < bboxMin[2] ) { + bboxMin[2] = colorBlock[i*4+2]; + } + if ( colorBlock[i*4+3] < bboxMin[3] ) { + bboxMin[3] = colorBlock[i*4+3]; + } + if ( colorBlock[i*4+0] > bboxMax[0] ) { + bboxMax[0] = colorBlock[i*4+0]; + } + if ( colorBlock[i*4+1] > bboxMax[1] ) { + bboxMax[1] = colorBlock[i*4+1]; + } + if ( colorBlock[i*4+2] > bboxMax[2] ) { + bboxMax[2] = colorBlock[i*4+2]; + } + if ( colorBlock[i*4+3] > bboxMax[3] ) { + bboxMax[3] = colorBlock[i*4+3]; + } + } + + for ( int i = 0; i < 64; i++ ) { + intColorBlock[i] = colorBlock[i]; + } + + // decrease range for 565 encoding + bboxMin[0] >>= 3; + bboxMin[1] >>= 2; + bboxMax[0] >>= 3; + bboxMax[1] >>= 2; + + // get the minimum distance the end points of the line must be apart along each axis + for ( i = 0; i < 4; i++ ) { + minAxisDist[i] = 0; + } + + // expand the bounding box + const int C565_BBOX_EXPAND = 2; + const int ALPHA_BBOX_EXPAND = 32; + + bboxMin[0] = ( bboxMin[0] <= C565_BBOX_EXPAND ) ? 0 : bboxMin[0] - C565_BBOX_EXPAND; + bboxMin[1] = ( bboxMin[1] <= C565_BBOX_EXPAND ) ? 0 : bboxMin[1] - C565_BBOX_EXPAND; + bboxMin[3] = ( bboxMin[3] <= ALPHA_BBOX_EXPAND ) ? 0 : bboxMin[3] - ALPHA_BBOX_EXPAND; + bboxMax[0] = ( bboxMax[0] >= (255>>3)-C565_BBOX_EXPAND ) ? (255>>3) : bboxMax[0] + C565_BBOX_EXPAND; + bboxMax[1] = ( bboxMax[1] >= (255>>2)-C565_BBOX_EXPAND ) ? (255>>2) : bboxMax[1] + C565_BBOX_EXPAND; + bboxMax[3] = ( bboxMax[3] >= (255)-ALPHA_BBOX_EXPAND ) ? (255) : bboxMax[3] + ALPHA_BBOX_EXPAND; + + for ( i0 = bboxMin[0]; i0 <= bboxMax[0]; i0++ ) { + for ( j0 = bboxMax[0]; j0 >= bboxMin[0]; j0-- ) { + if ( abs( i0 - j0 ) < minAxisDist[0] ) { + continue; + } + + for ( i1 = bboxMin[1]; i1 <= bboxMax[1]; i1++ ) { + for ( j1 = bboxMax[1]; j1 >= bboxMin[1]; j1-- ) { + if ( abs( i1 - j1 ) < minAxisDist[1] ) { + continue; + } + + tmin[0] = (byte)j0 << 3; + tmin[1] = (byte)j1 << 2; + tmin[2] = 0; + + tmax[0] = (byte)i0 << 3; + tmax[1] = (byte)i1 << 2; + tmax[2] = 0; + + for ( i3 = bboxMin[3]; i3 <= bboxMax[3]; i3++ ) { + for ( j3 = bboxMax[3]; j3 >= bboxMin[3]; j3-- ) { + if ( abs( i3 - j3 ) < minAxisDist[3] ) { + continue; + } + + tmin[3] = (byte)j3; + tmax[3] = (byte)i3; + + error = GetSquareNormalsDXT5Error( intColorBlock, tmin, tmax, bestError, tempColorIndices, tempAlphaIndices ); + if ( error < bestError ) { + bestError = error; + memcpy( minColor, tmin, 4 ); + memcpy( maxColor, tmax, 4 ); + colorIndices = tempColorIndices; + memcpy( alphaIndices, tempAlphaIndices, 6 ); + } + + tmin[3] = (byte)i3; + tmax[3] = (byte)j3; + + error = GetSquareNormalsDXT5Error( intColorBlock, tmin, tmax, bestError, tempColorIndices, tempAlphaIndices ); + if ( error < bestError ) { + bestError = error; + memcpy( minColor, tmin, 4 ); + memcpy( maxColor, tmax, 4 ); + colorIndices = tempColorIndices; + memcpy( alphaIndices, tempAlphaIndices, 6 ); + } + } + } + } + } + } + } + + return bestError; +} + +/* +======================== +idDxtEncoder::GetMinMaxNormalsDXT5HQFast + +Uses an exhaustive search to find the two RGB colors that produce the least error when used to +compress the 4x4 block. Also finds the minimum and maximum alpha values. + +params: colorBlock - 4*4 input tile, 4 bytes per pixel +paramO: minColor - 4 byte Min color found +paramO: maxColor - 4 byte Max color found +======================== +*/ +int idDxtEncoder::GetMinMaxNormalsDXT5HQFast( const byte *colorBlock, byte *minColor, byte *maxColor, unsigned int &colorIndices, byte *alphaIndices ) const { + int i0, i1, i2, i3, j0, j1, j2, j3; + byte bboxMin[4], bboxMax[4], minAxisDist[4]; + byte tmin[4], tmax[4]; + int error, bestError = MAX_TYPE( int ); + unsigned int tempColorIndices; + byte tempAlphaIndices[6]; + ALIGN16( int intColorBlock[16*4] ); + + bboxMin[0] = bboxMin[1] = bboxMin[2] = bboxMin[3] = 255; + bboxMax[0] = bboxMax[1] = bboxMax[2] = bboxMax[3] = 0; + + // get color bbox + for ( int i = 0; i < 16; i++ ) { + if ( colorBlock[i*4+0] < bboxMin[0] ) { + bboxMin[0] = colorBlock[i*4+0]; + } + if ( colorBlock[i*4+1] < bboxMin[1] ) { + bboxMin[1] = colorBlock[i*4+1]; + } + if ( colorBlock[i*4+2] < bboxMin[2] ) { + bboxMin[2] = colorBlock[i*4+2]; + } + if ( colorBlock[i*4+3] < bboxMin[3] ) { + bboxMin[3] = colorBlock[i*4+3]; + } + if ( colorBlock[i*4+0] > bboxMax[0] ) { + bboxMax[0] = colorBlock[i*4+0]; + } + if ( colorBlock[i*4+1] > bboxMax[1] ) { + bboxMax[1] = colorBlock[i*4+1]; + } + if ( colorBlock[i*4+2] > bboxMax[2] ) { + bboxMax[2] = colorBlock[i*4+2]; + } + if ( colorBlock[i*4+3] > bboxMax[3] ) { + bboxMax[3] = colorBlock[i*4+3]; + } + } + + for ( int i = 0; i < 64; i++ ) { + intColorBlock[i] = colorBlock[i]; + } + + // decrease range for 565 encoding + bboxMin[0] >>= 3; + bboxMin[1] >>= 2; + bboxMin[2] >>= 3; + bboxMax[0] >>= 3; + bboxMax[1] >>= 2; + bboxMax[2] >>= 3; + + bboxMin[3] = 0; + bboxMax[3] = 255; + + // get the minimum distance the end points of the line must be apart along each axis + for ( int i = 0; i < 4; i++ ) { + minAxisDist[i] = 0; + } + + // expand the bounding box + const int C565_BBOX_EXPAND = 1; + const int ALPHA_BBOX_EXPAND = 128; + +#if 0 // object-space + bboxMin[0] = ( bboxMin[0] <= C565_BBOX_EXPAND ) ? 0 : bboxMin[0] - C565_BBOX_EXPAND; + bboxMax[0] = ( bboxMax[0] >= (255>>3)-C565_BBOX_EXPAND ) ? (255>>3) : bboxMax[0] + C565_BBOX_EXPAND; + bboxMin[2] = 0; + bboxMax[2] = 0; +#else + bboxMin[0] = 0; + bboxMax[0] = 0; + bboxMin[2] = ( bboxMin[2] <= C565_BBOX_EXPAND ) ? 0 : bboxMin[2] - C565_BBOX_EXPAND; + bboxMax[2] = ( bboxMax[2] >= (255>>2)-C565_BBOX_EXPAND ) ? (255>>2) : bboxMax[2] + C565_BBOX_EXPAND; +#endif + + bboxMin[1] = ( bboxMin[1] <= C565_BBOX_EXPAND ) ? 0 : bboxMin[1] - C565_BBOX_EXPAND; + bboxMax[1] = ( bboxMax[1] >= (255>>2)-C565_BBOX_EXPAND ) ? (255>>2) : bboxMax[1] + C565_BBOX_EXPAND; + + bboxMin[3] = ( bboxMin[3] <= ALPHA_BBOX_EXPAND ) ? 0 : bboxMin[3] - ALPHA_BBOX_EXPAND; + bboxMax[3] = ( bboxMax[3] >= (255)-ALPHA_BBOX_EXPAND ) ? (255) : bboxMax[3] + ALPHA_BBOX_EXPAND; + + for ( i0 = bboxMin[0]; i0 <= bboxMax[0]; i0++ ) { + for ( j0 = bboxMax[0]; j0 >= bboxMin[0]; j0-- ) { + if ( abs( i0 - j0 ) < minAxisDist[0] ) { + continue; + } + + for ( i1 = bboxMin[1]; i1 <= bboxMax[1]; i1++ ) { + for ( j1 = bboxMax[1]; j1 >= bboxMin[1]; j1-- ) { + if ( abs( i1 - j1 ) < minAxisDist[1] ) { + continue; + } + + for ( i2 = bboxMin[2]; i2 <= bboxMax[2]; i2++ ) { + for ( j2 = bboxMax[2]; j2 >= bboxMin[2]; j2-- ) { + if ( abs( i2 - j2 ) < minAxisDist[2] ) { + continue; + } + + unsigned short minColor565 = (unsigned short)( ( i0 << 11 ) | ( i1 << 5 ) | i2 ); + unsigned short maxColor565 = (unsigned short)( ( j0 << 11 ) | ( j1 << 5 ) | j2 ); + + if ( minColor565 > maxColor565 ) { + SwapValues( minColor565, maxColor565 ); + } + + error = GetSquareNormalsDXT1Error( intColorBlock, maxColor565, minColor565, bestError, tempColorIndices ); + if ( error < bestError ) { + bestError = error; + ColorFrom565( minColor565, minColor ); + ColorFrom565( maxColor565, maxColor ); + colorIndices = tempColorIndices; + } + } + } + } + } + } + } + + bestError = MAX_TYPE( int ); + + memcpy( tmin, minColor, 4 ); + memcpy( tmax, maxColor, 4 ); + + for ( i3 = bboxMin[3]; i3 <= bboxMax[3]; i3++ ) { + for ( j3 = bboxMax[3]; j3 >= bboxMin[3]; j3-- ) { + if ( abs( i3 - j3 ) < minAxisDist[3] ) { + continue; + } + + tmin[3] = (byte)j3; + tmax[3] = (byte)i3; + + error = GetSquareNormalsDXT5Error( intColorBlock, tmin, tmax, bestError, tempColorIndices, tempAlphaIndices ); + if ( error < bestError ) { + bestError = error; + memcpy( minColor, tmin, 4 ); + memcpy( maxColor, tmax, 4 ); + colorIndices = tempColorIndices; + memcpy( alphaIndices, tempAlphaIndices, 6 ); + } + + tmin[3] = (byte)i3; + tmax[3] = (byte)j3; + + error = GetSquareNormalsDXT5Error( intColorBlock, tmin, tmax, bestError, tempColorIndices, tempAlphaIndices ); + if ( error < bestError ) { + bestError = error; + memcpy( minColor, tmin, 4 ); + memcpy( maxColor, tmax, 4 ); + colorIndices = tempColorIndices; + memcpy( alphaIndices, tempAlphaIndices, 6 ); + } + } + } + + return bestError; +} + +/* +======================== +idDxtEncoder::FindColorIndices + +params: colorBlock - 16 pixel block for which find color indexes +paramO: color0 - Min color found +paramO: color1 - Max color found +return: 4 byte color index block +======================== +*/ +int idDxtEncoder::FindColorIndices( const byte *colorBlock, const unsigned short color0, const unsigned short color1, unsigned int &result ) const { + int i, j; + unsigned int indexes[16]; + byte colors[4][4]; + + ColorFrom565( color0, colors[0] ); + ColorFrom565( color1, colors[1] ); + + if ( color0 > color1 ) { + colors[2][0] = ( 2 * colors[0][0] + 1 * colors[1][0] ) / 3; + colors[2][1] = ( 2 * colors[0][1] + 1 * colors[1][1] ) / 3; + colors[2][2] = ( 2 * colors[0][2] + 1 * colors[1][2] ) / 3; + colors[3][0] = ( 1 * colors[0][0] + 2 * colors[1][0] ) / 3; + colors[3][1] = ( 1 * colors[0][1] + 2 * colors[1][1] ) / 3; + colors[3][2] = ( 1 * colors[0][2] + 2 * colors[1][2] ) / 3; + } else { + colors[2][0] = ( 1 * colors[0][0] + 1 * colors[1][0] ) / 2; + colors[2][1] = ( 1 * colors[0][1] + 1 * colors[1][1] ) / 2; + colors[2][2] = ( 1 * colors[0][2] + 1 * colors[1][2] ) / 2; + colors[3][0] = 0; + colors[3][1] = 0; + colors[3][2] = 0; + } + + int error = 0; + for ( i = 0; i < 16; i++ ) { + unsigned int minDist = MAX_UNSIGNED_TYPE( int ); + for ( j = 0; j < 4; j++ ) { + unsigned int dist = ColorDistance( &colorBlock[i*4], &colors[j][0] ); + if ( dist < minDist ) { + minDist = dist; + indexes[i] = j; + } + } + // accumulated error + error += minDist; + } + + result = 0; + for ( i = 0; i < 16; i++ ) { + result |= ( indexes[i] << (unsigned int)( i << 1 ) ); + } + + return error; +} + +/* +======================== +idDxtEncoder::FindAlphaIndices + +params: colorBlock - 16 pixel block for which find alpha indexes +paramO: alpha0 - Min alpha found +paramO: alpha1 - Max alpha found +params: rindexes - 6 byte alpha index block +return: error metric for this compression +======================== +*/ +int idDxtEncoder::FindAlphaIndices( const byte *colorBlock, const int alphaOffset, const byte alpha0, const byte alpha1, byte *rindexes ) const { + int i, j; + unsigned int indexes[16]; + byte alphas[8]; + + alphas[0] = alpha0; + alphas[1] = alpha1; + if ( alpha0 > alpha1 ) { + alphas[2] = ( 6 * alpha0 + 1 * alpha1 ) / 7; + alphas[3] = ( 5 * alpha0 + 2 * alpha1 ) / 7; + alphas[4] = ( 4 * alpha0 + 3 * alpha1 ) / 7; + alphas[5] = ( 3 * alpha0 + 4 * alpha1 ) / 7; + alphas[6] = ( 2 * alpha0 + 5 * alpha1 ) / 7; + alphas[7] = ( 1 * alpha0 + 6 * alpha1 ) / 7; + } else { + alphas[2] = ( 4 * alpha0 + 1 * alpha1 ) / 5; + alphas[3] = ( 3 * alpha0 + 2 * alpha1 ) / 5; + alphas[4] = ( 2 * alpha0 + 3 * alpha1 ) / 5; + alphas[5] = ( 1 * alpha0 + 4 * alpha1 ) / 5; + alphas[6] = 0; + alphas[7] = 255; + } + + int error = 0; + for ( i = 0; i < 16; i++ ) { + unsigned int minDist = MAX_UNSIGNED_TYPE( int ); + byte a = colorBlock[i*4+alphaOffset]; + for ( j = 0; j < 8; j++ ) { + unsigned int dist = AlphaDistance( a, alphas[j] ); + if ( dist < minDist ) { + minDist = dist; + indexes[i] = j; + } + } + error += minDist; + } + + rindexes[0] = byte( (indexes[ 0] >> 0) | (indexes[ 1] << 3) | (indexes[ 2] << 6) ); + rindexes[1] = byte( (indexes[ 2] >> 2) | (indexes[ 3] << 1) | (indexes[ 4] << 4) | (indexes[ 5] << 7) ); + rindexes[2] = byte( (indexes[ 5] >> 1) | (indexes[ 6] << 2) | (indexes[ 7] << 5) ); + + rindexes[3] = byte( (indexes[ 8] >> 0) | (indexes[ 9] << 3) | (indexes[10] << 6) ); + rindexes[4] = byte( (indexes[10] >> 2) | (indexes[11] << 1) | (indexes[12] << 4) | (indexes[13] << 7) ); + rindexes[5] = byte( (indexes[13] >> 1) | (indexes[14] << 2) | (indexes[15] << 5) ); + + return error; +} + +/* +======================== +idDxtEncoder::FindCTX1Indices + +params: colorBlock - 16 pixel block for which find color indexes +paramO: color0 - Min color found +paramO: color1 - Max color found +return: 4 byte color index block +======================== +*/ +int idDxtEncoder::FindCTX1Indices( const byte *colorBlock, const byte *color0, const byte *color1, unsigned int &result ) const { + int i, j; + unsigned int indexes[16]; + byte colors[4][4]; + + colors[0][0] = color1[0]; + colors[0][1] = color1[1]; + colors[1][0] = color0[0]; + colors[1][1] = color0[1]; + + colors[2][0] = ( 2 * colors[0][0] + 1 * colors[1][0] ) / 3; + colors[2][1] = ( 2 * colors[0][1] + 1 * colors[1][1] ) / 3; + colors[3][0] = ( 1 * colors[0][0] + 2 * colors[1][0] ) / 3; + colors[3][1] = ( 1 * colors[0][1] + 2 * colors[1][1] ) / 3; + + int error = 0; + for ( i = 0; i < 16; i++ ) { + unsigned int minDist = MAX_UNSIGNED_TYPE( int ); + for ( j = 0; j < 4; j++ ) { + unsigned int dist = CTX1Distance( &colorBlock[i*4], &colors[j][0] ); + if ( dist < minDist ) { + minDist = dist; + indexes[i] = j; + } + } + // accumulated error + error += minDist; + } + + result = 0; + for ( i = 0; i < 16; i++ ) { + result |= ( indexes[i] << (unsigned int)( i << 1 ) ); + } + + return error; +} + +/* +======================== +idDxtEncoder::CompressImageDXT1HQ + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::CompressImageDXT1HQ( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte block[64] ); + unsigned int colorIndices1; + unsigned int colorIndices2; + byte col1[4]; + byte col2[4]; + int error1; + int error2; + + this->width = width; + this->height = height; + this->outData = outBuf; + + if ( width > 4 && ( width & 3 ) != 0 ) { + return; + } + if ( height > 4 && ( height & 3 ) != 0 ) { + return; + } + + if ( width < 4 || height < 4 ) { + WriteTinyColorDXT1( inBuf, width, height ); + return; + } + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + + ExtractBlock( inBuf + i * 4, width, block ); + + GetMinMaxColorsHQ( block, col1, col2, false ); + + // Write out color data. Try and find minimum error for the two encoding methods. + unsigned short scol1 = ColorTo565( col1 ); + unsigned short scol2 = ColorTo565( col2 ); + + error1 = FindColorIndices( block, scol1, scol2, colorIndices1 ); + error2 = FindColorIndices( block, scol2, scol1, colorIndices2 ); + + if ( error1 < error2 ) { + + EmitUShort( scol1 ); + EmitUShort( scol2 ); + EmitUInt( colorIndices1 ); + + } else { + + EmitUShort( scol2 ); + EmitUShort( scol1 ); + EmitUInt( colorIndices2 ); + } + + //idLib::Printf( "\r%3d%%", ( j * width + i ) * 100 / ( width * height ) ); + } + outData += dstPadding; + inBuf += srcPadding; + } + + //idLib::Printf( "\r100%%\n" ); +} + +/* +======================== +idDxtEncoder::CompressImageDXT5HQ + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::CompressImageDXT5HQ( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte block[64] ); + byte alphaIndices1[6]; + byte alphaIndices2[6]; + unsigned int colorIndices; + byte col1[4]; + byte col2[4]; + int error1; + int error2; + + this->width = width; + this->height = height; + this->outData = outBuf; + + if ( width > 4 && ( width & 3 ) != 0 ) { + return; + } + if ( height > 4 && ( height & 3 ) != 0 ) { + return; + } + + if ( width < 4 || height < 4 ) { + WriteTinyColorDXT5( inBuf, width, height ); + return; + } + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + + ExtractBlock( inBuf + i * 4, width, block ); + + GetMinMaxColorsHQ( block, col1, col2, true ); + GetMinMaxAlphaHQ( block, 3, col1, col2 ); + + // Write out alpha data. Try and find minimum error for the two encoding methods. + error1 = FindAlphaIndices( block, 3, col1[3], col2[3], alphaIndices1 ); + error2 = FindAlphaIndices( block, 3, col2[3], col1[3], alphaIndices2 ); + + if ( error1 < error2 ) { + + EmitByte( col1[3] ); + EmitByte( col2[3] ); + EmitByte( alphaIndices1[0] ); + EmitByte( alphaIndices1[1] ); + EmitByte( alphaIndices1[2] ); + EmitByte( alphaIndices1[3] ); + EmitByte( alphaIndices1[4] ); + EmitByte( alphaIndices1[5] ); + + } else { + + EmitByte( col2[3] ); + EmitByte( col1[3] ); + EmitByte( alphaIndices2[0] ); + EmitByte( alphaIndices2[1] ); + EmitByte( alphaIndices2[2] ); + EmitByte( alphaIndices2[3] ); + EmitByte( alphaIndices2[4] ); + EmitByte( alphaIndices2[5] ); + } + +#ifdef NVIDIA_7X_HARDWARE_BUG_FIX + NV4XHardwareBugFix( col2, col1 ); +#endif + + // Write out color data. Always take the path with 4 interpolated values. + unsigned short scol1 = ColorTo565( col1 ); + unsigned short scol2 = ColorTo565( col2 ); + + EmitUShort( scol1 ); + EmitUShort( scol2 ); + + FindColorIndices( block, scol1, scol2, colorIndices ); + EmitUInt( colorIndices ); + + //idLib::Printf( "\r%3d%%", ( j * width + i ) * 100 / ( width * height ) ); + } + outData += dstPadding; + inBuf += srcPadding; + } + + //idLib::Printf( "\r100%%\n" ); +} + +/* +======================== +idDxtEncoder::CompressImageCTX1HQ + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::CompressImageCTX1HQ( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte block[64] ); + unsigned int colorIndices; + byte col1[4]; + byte col2[4]; + + this->width = width; + this->height = height; + this->outData = outBuf; + + if ( width > 4 && ( width & 3 ) != 0 ) { + return; + } + if ( height > 4 && ( height & 3 ) != 0 ) { + return; + } + + if ( width < 4 || height < 4 ) { + WriteTinyColorCTX1DXT5A( inBuf, width, height ); + return; + } + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + + ExtractBlock( inBuf + i * 4, width, block ); + + GetMinMaxCTX1HQ( block, col1, col2 ); + + EmitByte( col2[0] ); + EmitByte( col2[1] ); + EmitByte( col1[0] ); + EmitByte( col1[1] ); + + FindCTX1Indices( block, col1, col2, colorIndices ); + EmitUInt( colorIndices ); + + //idLib::Printf( "\r%3d%%", ( j * width + i ) * 100 / ( width * height ) ); + } + outData += dstPadding; + inBuf += srcPadding; + } + + //idLib::Printf( "\r100%%\n" ); +} + +/* +======================== +idDxtEncoder::ScaleYCoCg + +params: colorBlock - 16 pixel block for which find color indexes +======================== +*/ +void idDxtEncoder::ScaleYCoCg( byte *colorBlock ) const { + ALIGN16( byte minColor[4] ); + ALIGN16( byte maxColor[4] ); + + minColor[0] = minColor[1] = minColor[2] = minColor[3] = 255; + maxColor[0] = maxColor[1] = maxColor[2] = maxColor[3] = 0; + + for ( int i = 0; i < 16; i++ ) { + if ( colorBlock[i*4+0] < minColor[0] ) { + minColor[0] = colorBlock[i*4+0]; + } + if ( colorBlock[i*4+1] < minColor[1] ) { + minColor[1] = colorBlock[i*4+1]; + } + if ( colorBlock[i*4+0] > maxColor[0] ) { + maxColor[0] = colorBlock[i*4+0]; + } + if ( colorBlock[i*4+1] > maxColor[1] ) { + maxColor[1] = colorBlock[i*4+1]; + } + } + + int m0 = abs( minColor[0] - 128 ); + int m1 = abs( minColor[1] - 128 ); + int m2 = abs( maxColor[0] - 128 ); + int m3 = abs( maxColor[1] - 128 ); + + if ( m1 > m0 ) m0 = m1; + if ( m3 > m2 ) m2 = m3; + if ( m2 > m0 ) m0 = m2; + + const int s0 = 128 / 2 - 1; + const int s1 = 128 / 4 - 1; + + int scale = 1 + ( m0 <= s0 ) + 2 * ( m0 <= s1 ); + + for ( int i = 0; i < 16; i++ ) { + colorBlock[i*4+0] = byte( ( colorBlock[i*4+0] - 128 ) * scale + 128 ); + colorBlock[i*4+1] = byte( ( colorBlock[i*4+1] - 128 ) * scale + 128 ); + colorBlock[i*4+2] = byte( ( scale - 1 ) << 3 ); + } +} + +/* +======================== +idDxtEncoder::CompressYCoCgDXT5HQ + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::CompressYCoCgDXT5HQ( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte block[64] ); + byte alphaIndices1[6]; + byte alphaIndices2[6]; + unsigned int colorIndices; + byte col1[4]; + byte col2[4]; + int error1; + int error2; + + assert( HasConstantValuePer4x4Block( inBuf, width, height, 2 ) ); + + this->width = width; + this->height = height; + this->outData = outBuf; + + if ( width > 4 && ( width & 3 ) != 0 ) { + return; + } + if ( height > 4 && ( height & 3 ) != 0 ) { + return; + } + + if ( width < 4 || height < 4 ) { + WriteTinyColorDXT5( inBuf, width, height ); + return; + } + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + + ExtractBlock( inBuf + i * 4, width, block ); + ScaleYCoCg( block ); + + GetMinMaxColorsHQ( block, col1, col2, true ); + GetMinMaxAlphaHQ( block, 3, col1, col2 ); + + // Write out alpha data. Try and find minimum error for the two encoding methods. + error1 = FindAlphaIndices( block, 3, col1[3], col2[3], alphaIndices1 ); + error2 = FindAlphaIndices( block, 3, col2[3], col1[3], alphaIndices2 ); + + if ( error1 < error2 ) { + + EmitByte( col1[3] ); + EmitByte( col2[3] ); + EmitByte( alphaIndices1[0] ); + EmitByte( alphaIndices1[1] ); + EmitByte( alphaIndices1[2] ); + EmitByte( alphaIndices1[3] ); + EmitByte( alphaIndices1[4] ); + EmitByte( alphaIndices1[5] ); + + } else { + + EmitByte( col2[3] ); + EmitByte( col1[3] ); + EmitByte( alphaIndices2[0] ); + EmitByte( alphaIndices2[1] ); + EmitByte( alphaIndices2[2] ); + EmitByte( alphaIndices2[3] ); + EmitByte( alphaIndices2[4] ); + EmitByte( alphaIndices2[5] ); + } + +#ifdef NVIDIA_7X_HARDWARE_BUG_FIX + NV4XHardwareBugFix( col2, col1 ); +#endif + + // Write out color data. Always take the path with 4 interpolated values. + unsigned short scol1 = ColorTo565( col1 ); + unsigned short scol2 = ColorTo565( col2 ); + + EmitUShort( scol1 ); + EmitUShort( scol2 ); + + FindColorIndices( block, scol1, scol2, colorIndices ); + EmitUInt( colorIndices ); + + //idLib::Printf( "\r%3d%%", ( j * width + i ) * 100 / ( width * height ) ); + } + outData += dstPadding; + inBuf += srcPadding; + } + + //idLib::Printf( "\r100%%\n" ); +} + +/* +======================== +idDxtEncoder::CompressYCoCgCTX1DXT5AHQ + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::CompressYCoCgCTX1DXT5AHQ( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte block[64] ); + byte alphaIndices1[6]; + byte alphaIndices2[6]; + unsigned int colorIndices; + byte col1[4]; + byte col2[4]; + int error1; + int error2; + + assert( HasConstantValuePer4x4Block( inBuf, width, height, 2 ) ); + + this->width = width; + this->height = height; + this->outData = outBuf; + + if ( width > 4 && ( width & 3 ) != 0 ) { + return; + } + if ( height > 4 && ( height & 3 ) != 0 ) { + return; + } + + if ( width < 4 || height < 4 ) { + WriteTinyColorCTX1DXT5A( inBuf, width, height ); + return; + } + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + + ExtractBlock( inBuf + i * 4, width, block ); + + GetMinMaxAlphaHQ( block, 3, col1, col2 ); + + // Write out alpha data. Try and find minimum error for the two encoding methods. + error1 = FindAlphaIndices( block, 3, col1[3], col2[3], alphaIndices1 ); + error2 = FindAlphaIndices( block, 3, col2[3], col1[3], alphaIndices2 ); + + if ( error1 < error2 ) { + + EmitByte( col1[3] ); + EmitByte( col2[3] ); + EmitByte( alphaIndices1[0] ); + EmitByte( alphaIndices1[1] ); + EmitByte( alphaIndices1[2] ); + EmitByte( alphaIndices1[3] ); + EmitByte( alphaIndices1[4] ); + EmitByte( alphaIndices1[5] ); + + } else { + + EmitByte( col2[3] ); + EmitByte( col1[3] ); + EmitByte( alphaIndices2[0] ); + EmitByte( alphaIndices2[1] ); + EmitByte( alphaIndices2[2] ); + EmitByte( alphaIndices2[3] ); + EmitByte( alphaIndices2[4] ); + EmitByte( alphaIndices2[5] ); + } + + GetMinMaxCTX1HQ( block, col1, col2 ); + + EmitByte( col2[0] ); + EmitByte( col2[1] ); + EmitByte( col1[0] ); + EmitByte( col1[1] ); + + FindCTX1Indices( block, col1, col2, colorIndices ); + EmitUInt( colorIndices ); + + //idLib::Printf( "\r%3d%%", ( j * width + i ) * 100 / ( width * height ) ); + } + outData += dstPadding; + inBuf += srcPadding; + } + + //idLib::Printf( "\r100%%\n" ); +} + +/* +======================== +idDxtEncoder::RotateNormalsDXT1 +======================== +*/ +void idDxtEncoder::RotateNormalsDXT1( byte *block ) const { + byte rotatedBlock[64]; + byte col1[4]; + byte col2[4]; + int bestError = MAX_TYPE( int ); + int bestRotation = 0; + + for ( int i = 0; i < 32; i += 1 ) { + int r = ( i << 3 ) | ( i >> 2 ); + float angle = ( r / 255.0f ) * idMath::PI; + float s = sin( angle ); + float c = cos( angle ); + + for ( int j = 0; j < 16; j++ ) { + float x = block[j*4+0] / 255.0f * 2.0f - 1.0f; + float y = block[j*4+1] / 255.0f * 2.0f - 1.0f; + float rx = c * x - s * y; + float ry = s * x + c * y; + rotatedBlock[j*4+0] = idMath::Ftob( ( rx + 1.0f ) / 2.0f * 255.0f ); + rotatedBlock[j*4+1] = idMath::Ftob( ( ry + 1.0f ) / 2.0f * 255.0f ); + } + + int error = GetMinMaxColorsHQ( rotatedBlock, col1, col2, true ); + if ( error < bestError ) { + bestError = error; + bestRotation = r; + } + } + + float angle = ( bestRotation / 255.0f ) * idMath::PI; + float s = sin( angle ); + float c = cos( angle ); + + for ( int j = 0; j < 16; j++ ) { + float x = block[j*4+0] / 255.0f * 2.0f - 1.0f; + float y = block[j*4+1] / 255.0f * 2.0f - 1.0f; + float rx = c * x - s * y; + float ry = s * x + c * y; + block[j*4+0] = idMath::Ftob( ( rx + 1.0f ) / 2.0f * 255.0f ); + block[j*4+1] = idMath::Ftob( ( ry + 1.0f ) / 2.0f * 255.0f ); + block[j*4+2] = (byte)bestRotation; + } +} + +/* +======================== +idDxtEncoder::CompressNormalMapDXT1HQ + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::CompressNormalMapDXT1HQ( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte block[64] ); + unsigned int colorIndices; + byte col1[4]; + byte col2[4]; + + this->width = width; + this->height = height; + this->outData = outBuf; + + if ( width > 4 && ( width & 3 ) != 0 ) { + return; + } + if ( height > 4 && ( height & 3 ) != 0 ) { + return; + } + + if ( width < 4 || height < 4 ) { + WriteTinyColorDXT1( inBuf, width, height ); + return; + } + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + + ExtractBlock( inBuf + i * 4, width, block ); + + for ( int k = 0; k < 16; k++ ) { + block[k*4+2] = 0; + } + + GetMinMaxColorsHQ( block, col1, col2, true ); + + // Write out color data. Always take the path with 4 interpolated values. + unsigned short scol1 = ColorTo565( col1 ); + unsigned short scol2 = ColorTo565( col2 ); + + EmitUShort( scol1 ); + EmitUShort( scol2 ); + + FindColorIndices( block, scol1, scol2, colorIndices ); + EmitUInt( colorIndices ); + + //idLib::Printf( "\r%3d%%", ( j * width + i * 4 ) * 100 / ( width * height ) ); + } + outData += dstPadding; + inBuf += srcPadding; + } + + //idLib::Printf( "\r100%%\n" ); +} + +/* +======================== +idDxtEncoder::CompressNormalMapDXT1RenormalizeHQ + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::CompressNormalMapDXT1RenormalizeHQ( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte block[64] ); + unsigned int colorIndices; + byte col1[4]; + byte col2[4]; + + this->width = width; + this->height = height; + this->outData = outBuf; + + if ( width > 4 && ( width & 3 ) != 0 ) { + return; + } + if ( height > 4 && ( height & 3 ) != 0 ) { + return; + } + + if ( width < 4 || height < 4 ) { + WriteTinyColorDXT1( inBuf, width, height ); + return; + } + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + + ExtractBlock( inBuf + i * 4, width, block ); + + // clear alpha channel + for ( int k = 0; k < 16; k++ ) { + block[k*4+3] = 0; + } + + GetMinMaxNormalsDXT1HQ( block, col1, col2, colorIndices, true ); + + // Write out color data. Always take the path with 4 interpolated values. + unsigned short scol1 = ColorTo565( col1 ); + unsigned short scol2 = ColorTo565( col2 ); + + EmitUShort( scol1 ); + EmitUShort( scol2 ); + EmitUInt( colorIndices ); + + ////idLib::Printf( "\r%3d%%", ( j * width + i * 4 ) * 100 / ( width * height ) ); + } + outData += dstPadding; + inBuf += srcPadding; + } + + ////idLib::Printf( "\r100%%\n" ); +} + +#define USE_SCALE 1 +#define USE_BIAS 1 + +static int c_blocks; +static int c_scaled; +static int c_scaled2x; +static int c_scaled4x; +static int c_differentBias; +static int c_biasHelped; + +/* +======================== +idDxtEncoder::BiasScaleNormalY + + * scale2x = 33% + * scale4x = 23% + * bias + scale2x = 30% + * bias + scale4x = 55% +======================== +*/ +void idDxtEncoder::BiasScaleNormalY( byte *colorBlock ) const { + + byte minColor = 255; + byte maxColor = 0; + + for ( int i = 0; i < 16; i++ ) { + if ( colorBlock[i*4+1] < minColor ) { + minColor = colorBlock[i*4+1]; + } + if ( colorBlock[i*4+1] > maxColor ) { + maxColor = colorBlock[i*4+1]; + } + } + + int bestBias = 128; + int bestRange = Max( abs( minColor - bestBias ), abs( maxColor - bestBias ) ); +#if USE_BIAS + for ( int i = 0; i < 32; i++ ) { + int bias = ( ( i << 3 ) | ( i >> 2 ) ) - 4; + int range = Max( abs( minColor - bias ), abs( maxColor - bias ) ); + if ( range < bestRange ) { + bestRange = range; + bestBias = bias; + } + } +#endif + + const int s0 = 128 / 2 - 1; + const int s1 = 128 / 4 - 1; + +#if USE_SCALE + int scale = 1 + ( bestRange <= s0 ) + 2 * ( bestRange <= s1 ); +#else + int scale = 1; +#endif + + if ( scale == 1 ) { + bestBias = 128; + } else { + c_scaled++; + if ( scale == 2 ) c_scaled2x++; + if ( scale == 4 ) c_scaled4x++; + if ( bestBias != 128 ) { + c_differentBias++; + int r = Max( abs( minColor - 128 ), abs( maxColor - 128 ) ); + int s = 1 + ( r <= s0 ) + 2 * ( r <= s1 ); + if ( scale > s ) { + c_biasHelped++; + } + } + } + + c_blocks++; + + for ( int i = 0; i < 16; i++ ) { + colorBlock[i*4+0] = byte( bestBias + 4 ); + colorBlock[i*4+1] = byte( ( colorBlock[i*4+1] - bestBias ) * scale + 128 ); + colorBlock[i*4+2] = byte( ( scale - 1 ) << 3 ); + } +} + +/* +======================== +idDxtEncoder::RotateNormalsDXT5 +======================== +*/ +void idDxtEncoder::RotateNormalsDXT5( byte *block ) const { + byte rotatedBlock[64]; + byte col1[4]; + byte col2[4]; + int bestError = MAX_TYPE( int ); + int bestRotation = 0; + int bestScale = 1; + + for ( int i = 0; i < 32; i += 1 ) { + int r = ( i << 3 ) | ( i >> 2 ); + float angle = ( r / 255.0f ) * idMath::PI; + float s = sin( angle ); + float c = cos( angle ); + + for ( int j = 0; j < 16; j++ ) { + float x = block[j*4+3] / 255.0f * 2.0f - 1.0f; + float y = block[j*4+1] / 255.0f * 2.0f - 1.0f; + float rx = c * x - s * y; + float ry = s * x + c * y; + rotatedBlock[j*4+3] = idMath::Ftob( ( rx + 1.0f ) / 2.0f * 255.0f ); + rotatedBlock[j*4+1] = idMath::Ftob( ( ry + 1.0f ) / 2.0f * 255.0f ); + } + +#if USE_SCALE + byte minColor = 255; + byte maxColor = 0; + + for ( int j = 0; j < 16; j++ ) { + if ( rotatedBlock[j*4+1] < minColor ) { + minColor = rotatedBlock[j*4+1]; + } + if ( rotatedBlock[j*4+1] > maxColor ) { + maxColor = rotatedBlock[j*4+1]; + } + } + + const int s0 = 128 / 2 - 1; + const int s1 = 128 / 4 - 1; + + int range = Max( abs( minColor - 128 ), abs( maxColor - 128 ) ); + int scale = 1 + ( range <= s0 ) + 2 * ( range <= s1 ); + + for ( int j = 0; j < 16; j++ ) { + rotatedBlock[j*4+1] = byte( ( rotatedBlock[j*4+1] - 128 ) * scale + 128 ); + } +#endif + + int errorY = GetMinMaxNormalYHQ( rotatedBlock, col1, col2, true, scale ); + int errorX = GetMinMaxAlphaHQ( rotatedBlock, 3, col1, col2 ); + int error = errorX + errorY; + if ( error < bestError ) { + bestError = error; + bestRotation = r; + bestScale = scale; + } + } + + float angle = ( bestRotation / 255.0f ) * idMath::PI; + float s = sin( angle ); + float c = cos( angle ); + + for ( int j = 0; j < 16; j++ ) { + float x = block[j*4+3] / 255.0f * 2.0f - 1.0f; + float y = block[j*4+1] / 255.0f * 2.0f - 1.0f; + float rx = c * x - s * y; + float ry = s * x + c * y; + block[j*4+0] = (byte)bestRotation; + block[j*4+1] = idMath::Ftob( ( ry + 1.0f ) / 2.0f * 255.0f ); + block[j*4+3] = idMath::Ftob( ( rx + 1.0f ) / 2.0f * 255.0f ); + +#if USE_SCALE + block[j*4+1] = byte( ( block[j*4+1] - 128 ) * bestScale + 128 ); + block[j*4+2] = byte( ( bestScale - 1 ) << 3 ); +#endif + } +} + +/* +======================== +idDxtEncoder::CompressNormalMapDXT5HQ + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::CompressNormalMapDXT5HQ( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte block[64] ); + byte alphaIndices1[6]; + byte alphaIndices2[6]; + unsigned int colorIndices; + byte col1[4]; + byte col2[4]; + int error1; + int error2; + + this->width = width; + this->height = height; + this->outData = outBuf; + + if ( width > 4 && ( width & 3 ) != 0 ) { + return; + } + if ( height > 4 && ( height & 3 ) != 0 ) { + return; + } + + if ( width < 4 || height < 4 ) { + WriteTinyColorDXT5( inBuf, width, height ); + return; + } + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + + ExtractBlock( inBuf + i * 4, width, block ); + + // swizzle components + for ( int k = 0; k < 16; k++ ) { + block[k*4+3] = block[k*4+0]; + block[k*4+0] = 0; + block[k*4+2] = 0; + } + + //BiasScaleNormalY( block ); + //RotateNormalsDXT5( block ); + + GetMinMaxNormalYHQ( block, col1, col2, true, 1 ); + GetMinMaxAlphaHQ( block, 3, col1, col2 ); + + // Write out alpha data. Try and find minimum error for the two encoding methods. + error1 = FindAlphaIndices( block, 3, col1[3], col2[3], alphaIndices1 ); + error2 = FindAlphaIndices( block, 3, col2[3], col1[3], alphaIndices2 ); + + if ( error1 < error2 ) { + + EmitByte( col1[3] ); + EmitByte( col2[3] ); + EmitByte( alphaIndices1[0] ); + EmitByte( alphaIndices1[1] ); + EmitByte( alphaIndices1[2] ); + EmitByte( alphaIndices1[3] ); + EmitByte( alphaIndices1[4] ); + EmitByte( alphaIndices1[5] ); + + } else { + + EmitByte( col2[3] ); + EmitByte( col1[3] ); + EmitByte( alphaIndices2[0] ); + EmitByte( alphaIndices2[1] ); + EmitByte( alphaIndices2[2] ); + EmitByte( alphaIndices2[3] ); + EmitByte( alphaIndices2[4] ); + EmitByte( alphaIndices2[5] ); + } + +#ifdef NVIDIA_7X_HARDWARE_BUG_FIX + NV4XHardwareBugFix( col2, col1 ); +#endif + + // Write out color data. Always take the path with 4 interpolated values. + unsigned short scol1 = ColorTo565( col1 ); + unsigned short scol2 = ColorTo565( col2 ); + + EmitUShort( scol1 ); + EmitUShort( scol2 ); + + FindColorIndices( block, scol1, scol2, colorIndices ); + EmitUInt( colorIndices ); + + //idLib::Printf( "\r%3d%%", ( j * width + i ) * 100 / ( width * height ) ); + } + outData += dstPadding; + inBuf += srcPadding; + } + + //idLib::Printf( "\r100%%\n" ); +} + +/* +======================== +idDxtEncoder::CompressNormalMapDXT5RenormalizeHQ + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::CompressNormalMapDXT5RenormalizeHQ( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte block[64] ); + unsigned int colorIndices; + byte alphaIndices[6]; + byte col1[4]; + byte col2[4]; + + this->width = width; + this->height = height; + this->outData = outBuf; + + if ( width > 4 && ( width & 3 ) != 0 ) { + return; + } + if ( height > 4 && ( height & 3 ) != 0 ) { + return; + } + + if ( width < 4 || height < 4 ) { + WriteTinyColorDXT5( inBuf, width, height ); + return; + } + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + + ExtractBlock( inBuf + i * 4, width, block ); + + // swizzle components + for ( int k = 0; k < 16; k++ ) { +#if 0 // object-space + block[k*4+3] = block[k*4+2]; + block[k*4+2] = 0; +#else + block[k*4+3] = block[k*4+0]; + block[k*4+0] = 0; +#endif + } + + GetMinMaxNormalsDXT5HQFast( block, col1, col2, colorIndices, alphaIndices ); + + EmitByte( col2[3] ); + EmitByte( col1[3] ); + EmitByte( alphaIndices[0] ); + EmitByte( alphaIndices[1] ); + EmitByte( alphaIndices[2] ); + EmitByte( alphaIndices[3] ); + EmitByte( alphaIndices[4] ); + EmitByte( alphaIndices[5] ); + + unsigned short scol1 = ColorTo565( col1 ); + unsigned short scol2 = ColorTo565( col2 ); + + EmitUShort( scol2 ); + EmitUShort( scol1 ); + EmitUInt( colorIndices ); + + ////idLib::Printf( "\r%3d%%", ( j * width + i ) * 100 / ( width * height ) ); + } + outData += dstPadding; + inBuf += srcPadding; + } + + ////idLib::Printf( "\r100%%\n" ); +} + +/* +======================== +idDxtEncoder::CompressNormalMapDXN2HQ + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::CompressNormalMapDXN2HQ( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte block[64] ); + byte alphaIndices1[6]; + byte alphaIndices2[6]; + byte col1[4]; + byte col2[4]; + int error1; + int error2; + + this->width = width; + this->height = height; + this->outData = outBuf; + + if ( width > 4 && ( width & 3 ) != 0 ) { + return; + } + if ( height > 4 && ( height & 3 ) != 0 ) { + return; + } + + if ( width < 4 || height < 4 ) { + WriteTinyColorDXT5( inBuf, width, height ); + return; + } + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + + ExtractBlock( inBuf + i * 4, width, block ); + + for ( int k = 0; k < 2; k++ ) { + GetMinMaxAlphaHQ( block, k, col1, col2 ); + + // Write out alpha data. Try and find minimum error for the two encoding methods. + error1 = FindAlphaIndices( block, k, col1[k], col2[k], alphaIndices1 ); + error2 = FindAlphaIndices( block, k, col2[k], col1[k], alphaIndices2 ); + + if ( error1 < error2 ) { + + EmitByte( col1[k] ); + EmitByte( col2[k] ); + EmitByte( alphaIndices1[0] ); + EmitByte( alphaIndices1[1] ); + EmitByte( alphaIndices1[2] ); + EmitByte( alphaIndices1[3] ); + EmitByte( alphaIndices1[4] ); + EmitByte( alphaIndices1[5] ); + + } else { + + EmitByte( col2[k] ); + EmitByte( col1[k] ); + EmitByte( alphaIndices2[0] ); + EmitByte( alphaIndices2[1] ); + EmitByte( alphaIndices2[2] ); + EmitByte( alphaIndices2[3] ); + EmitByte( alphaIndices2[4] ); + EmitByte( alphaIndices2[5] ); + } + } + + //idLib::Printf( "\r%3d%%", ( j * width + i ) * 100 / ( width * height ) ); + } + outData += dstPadding; + inBuf += srcPadding; + } + + //idLib::Printf( "\r100%%\n" ); +} + +/* +======================== +idDxtEncoder::GetMinMaxBBox + +Takes the extents of the bounding box of the colors in the 4x4 block in RGB space. +Also finds the minimum and maximum alpha values. + +params: colorBlock - 4*4 input tile, 4 bytes per pixel +paramO: minColor - 4 byte Min color found +paramO: maxColor - 4 byte Max color found +======================== +*/ +ID_INLINE void idDxtEncoder::GetMinMaxBBox( const byte *colorBlock, byte *minColor, byte *maxColor ) const { + + minColor[0] = minColor[1] = minColor[2] = minColor[3] = 255; + maxColor[0] = maxColor[1] = maxColor[2] = maxColor[3] = 0; + + for ( int i = 0; i < 16; i++ ) { + if ( colorBlock[i*4+0] < minColor[0] ) { + minColor[0] = colorBlock[i*4+0]; + } + if ( colorBlock[i*4+1] < minColor[1] ) { + minColor[1] = colorBlock[i*4+1]; + } + if ( colorBlock[i*4+2] < minColor[2] ) { + minColor[2] = colorBlock[i*4+2]; + } + if ( colorBlock[i*4+3] < minColor[3] ) { + minColor[3] = colorBlock[i*4+3]; + } + if ( colorBlock[i*4+0] > maxColor[0] ) { + maxColor[0] = colorBlock[i*4+0]; + } + if ( colorBlock[i*4+1] > maxColor[1] ) { + maxColor[1] = colorBlock[i*4+1]; + } + if ( colorBlock[i*4+2] > maxColor[2] ) { + maxColor[2] = colorBlock[i*4+2]; + } + if ( colorBlock[i*4+3] > maxColor[3] ) { + maxColor[3] = colorBlock[i*4+3]; + } + } +} + +/* +======================== +idDxtEncoder::InsetColorsBBox +======================== +*/ +ID_INLINE void idDxtEncoder::InsetColorsBBox( byte *minColor, byte *maxColor ) const { + byte inset[4]; + + inset[0] = ( maxColor[0] - minColor[0] ) >> INSET_COLOR_SHIFT; + inset[1] = ( maxColor[1] - minColor[1] ) >> INSET_COLOR_SHIFT; + inset[2] = ( maxColor[2] - minColor[2] ) >> INSET_COLOR_SHIFT; + inset[3] = ( maxColor[3] - minColor[3] ) >> INSET_ALPHA_SHIFT; + + minColor[0] = ( minColor[0] + inset[0] <= 255 ) ? minColor[0] + inset[0] : 255; + minColor[1] = ( minColor[1] + inset[1] <= 255 ) ? minColor[1] + inset[1] : 255; + minColor[2] = ( minColor[2] + inset[2] <= 255 ) ? minColor[2] + inset[2] : 255; + minColor[3] = ( minColor[3] + inset[3] <= 255 ) ? minColor[3] + inset[3] : 255; + + maxColor[0] = ( maxColor[0] >= inset[0] ) ? maxColor[0] - inset[0] : 0; + maxColor[1] = ( maxColor[1] >= inset[1] ) ? maxColor[1] - inset[1] : 0; + maxColor[2] = ( maxColor[2] >= inset[2] ) ? maxColor[2] - inset[2] : 0; + maxColor[3] = ( maxColor[3] >= inset[3] ) ? maxColor[3] - inset[3] : 0; +} + +/* +======================== +idDxtEncoder::SelectColorsDiagonal +======================== +*/ +void idDxtEncoder::SelectColorsDiagonal( const byte *colorBlock, byte *minColor, byte *maxColor ) const { + + byte mid0 = byte( ( (int) minColor[0] + maxColor[0] + 1 ) >> 1 ); + byte mid1 = byte( ( (int) minColor[1] + maxColor[1] + 1 ) >> 1 ); + byte mid2 = byte( ( (int) minColor[2] + maxColor[2] + 1 ) >> 1 ); + +#if 0 + + // using the covariance is the best way to select the diagonal + int side0 = 0; + int side1 = 0; + for ( int i = 0; i < 16; i++ ) { + int b0 = colorBlock[i*4+0] - mid0; + int b1 = colorBlock[i*4+1] - mid1; + int b2 = colorBlock[i*4+2] - mid2; + side0 += ( b0 * b1 ); + side1 += ( b1 * b2 ); + } + byte mask0 = -( side0 < 0 ); + byte mask1 = -( side1 < 0 ); + +#else + + // calculating the covariance of just the sign bits is much faster and gives almost the same result + int side0 = 0; + int side1 = 0; + for ( int i = 0; i < 16; i++ ) { + byte b0 = colorBlock[i*4+0] >= mid0; + byte b1 = colorBlock[i*4+1] >= mid1; + byte b2 = colorBlock[i*4+2] >= mid2; + side0 += ( b0 ^ b1 ); + side1 += ( b1 ^ b2 ); + } + byte mask0 = -( side0 > 8 ); + byte mask1 = -( side1 > 8 ); + +#endif + + byte c0 = minColor[0]; + byte c1 = maxColor[0]; + byte c2 = minColor[2]; + byte c3 = maxColor[2]; + + c0 ^= c1; + mask0 &= c0; + c1 ^= mask0; + c0 ^= c1; + + c2 ^= c3; + mask1 &= c2; + c3 ^= mask1; + c2 ^= c3; + + minColor[0] = c0; + maxColor[0] = c1; + minColor[2] = c2; + maxColor[2] = c3; + + if ( ColorTo565( minColor ) > ColorTo565( maxColor ) ) { + SwapValues( minColor[0], maxColor[0] ); + SwapValues( minColor[1], maxColor[1] ); + SwapValues( minColor[2], maxColor[2] ); + } +} + +/* +======================== +idDxtEncoder::EmitColorIndices + +params: colorBlock - 16 pixel block for which find color indexes +paramO: minColor - Min color found +paramO: maxColor - Max color found +return: 4 byte color index block +======================== +*/ +void idDxtEncoder::EmitColorIndices( const byte *colorBlock, const byte *minColor, const byte *maxColor ) { +#if 1 + + ALIGN16( uint16_t colors[4][4] ); + unsigned int result = 0; + + colors[0][0] = ( maxColor[0] & C565_5_MASK ) | ( maxColor[0] >> 5 ); + colors[0][1] = ( maxColor[1] & C565_6_MASK ) | ( maxColor[1] >> 6 ); + colors[0][2] = ( maxColor[2] & C565_5_MASK ) | ( maxColor[2] >> 5 ); + colors[0][3] = 0; + colors[1][0] = ( minColor[0] & C565_5_MASK ) | ( minColor[0] >> 5 ); + colors[1][1] = ( minColor[1] & C565_6_MASK ) | ( minColor[1] >> 6 ); + colors[1][2] = ( minColor[2] & C565_5_MASK ) | ( minColor[2] >> 5 ); + colors[1][3] = 0; + colors[2][0] = ( 2 * colors[0][0] + 1 * colors[1][0] ) / 3; + colors[2][1] = ( 2 * colors[0][1] + 1 * colors[1][1] ) / 3; + colors[2][2] = ( 2 * colors[0][2] + 1 * colors[1][2] ) / 3; + colors[2][3] = 0; + colors[3][0] = ( 1 * colors[0][0] + 2 * colors[1][0] ) / 3; + colors[3][1] = ( 1 * colors[0][1] + 2 * colors[1][1] ) / 3; + colors[3][2] = ( 1 * colors[0][2] + 2 * colors[1][2] ) / 3; + colors[3][3] = 0; + + // uses sum of absolute differences instead of squared distance to find the best match + for ( int i = 15; i >= 0; i-- ) { + int c0, c1, c2, c3, m, d0, d1, d2, d3; + + c0 = colorBlock[i*4+0]; + c1 = colorBlock[i*4+1]; + c2 = colorBlock[i*4+2]; + c3 = colorBlock[i*4+3]; + + m = colors[0][0] - c0; + d0 = abs( m ); + m = colors[1][0] - c0; + d1 = abs( m ); + m = colors[2][0] - c0; + d2 = abs( m ); + m = colors[3][0] - c0; + d3 = abs( m ); + + m = colors[0][1] - c1; + d0 += abs( m ); + m = colors[1][1] - c1; + d1 += abs( m ); + m = colors[2][1] - c1; + d2 += abs( m ); + m = colors[3][1] - c1; + d3 += abs( m ); + + m = colors[0][2] - c2; + d0 += abs( m ); + m = colors[1][2] - c2; + d1 += abs( m ); + m = colors[2][2] - c2; + d2 += abs( m ); + m = colors[3][2] - c2; + d3 += abs( m ); + +#if 0 + int b0 = d0 > d2; + int b1 = d1 > d3; + int b2 = d0 > d3; + int b3 = d1 > d2; + int b4 = d0 > d1; + int b5 = d2 > d3; + + result |= ( ( !b3 & b4 ) | ( b2 & b5 ) | ( ( ( b0 & b3 ) | ( b1 & b2 ) ) << 1 ) ) << ( i << 1 ); +#else + bool b0 = d0 > d3; + bool b1 = d1 > d2; + bool b2 = d0 > d2; + bool b3 = d1 > d3; + bool b4 = d2 > d3; + + int x0 = b1 & b2; + int x1 = b0 & b3; + int x2 = b0 & b4; + + result |= ( x2 | ( ( x0 | x1 ) << 1 ) ) << ( i << 1 ); +#endif + } + + EmitUInt( result ); + +#elif 1 + + byte colors[4][4]; + unsigned int indexes[16]; + + colors[0][0] = ( maxColor[0] & C565_5_MASK ) | ( maxColor[0] >> 6 ); + colors[0][1] = ( maxColor[1] & C565_6_MASK ) | ( maxColor[1] >> 5 ); + colors[0][2] = ( maxColor[2] & C565_5_MASK ) | ( maxColor[2] >> 6 ); + colors[0][3] = 0; + colors[1][0] = ( minColor[0] & C565_5_MASK ) | ( minColor[0] >> 6 ); + colors[1][1] = ( minColor[1] & C565_6_MASK ) | ( minColor[1] >> 5 ); + colors[1][2] = ( minColor[2] & C565_5_MASK ) | ( minColor[2] >> 6 ); + colors[1][3] = 0; + colors[2][0] = ( 2 * colors[0][0] + 1 * colors[1][0] ) / 3; + colors[2][1] = ( 2 * colors[0][1] + 1 * colors[1][1] ) / 3; + colors[2][2] = ( 2 * colors[0][2] + 1 * colors[1][2] ) / 3; + colors[2][3] = 0; + colors[3][0] = ( 1 * colors[0][0] + 2 * colors[1][0] ) / 3; + colors[3][1] = ( 1 * colors[0][1] + 2 * colors[1][1] ) / 3; + colors[3][2] = ( 1 * colors[0][2] + 2 * colors[1][2] ) / 3; + colors[3][3] = 0; + + for ( int i = 0; i < 16; i++ ) { + int c0, c1, c2, m, d, minDist; + + c0 = colorBlock[i*4+0]; + c1 = colorBlock[i*4+1]; + c2 = colorBlock[i*4+2]; + + m = colors[0][0] - c0; + d = m * m; + m = colors[0][1] - c1; + d += m * m; + m = colors[0][2] - c2; + d += m * m; + + minDist = d; + indexes[i] = 0; + + m = colors[1][0] - c0; + d = m * m; + m = colors[1][1] - c1; + d += m * m; + m = colors[1][2] - c2; + d += m * m; + + if ( d < minDist ) { + minDist = d; + indexes[i] = 1; + } + + m = colors[2][0] - c0; + d = m * m; + m = colors[2][1] - c1; + d += m * m; + m = colors[2][2] - c2; + d += m * m; + + if ( d < minDist ) { + minDist = d; + indexes[i] = 2; + } + + m = colors[3][0] - c0; + d = m * m; + m = colors[3][1] - c1; + d += m * m; + m = colors[3][2] - c2; + d += m * m; + + if ( d < minDist ) { + minDist = d; + indexes[i] = 3; + } + } + + unsigned int result = 0; + for ( int i = 0; i < 16; i++ ) { + result |= ( indexes[i] << (unsigned int)( i << 1 ) ); + } + + EmitUInt( result ); + +#else + + byte colors[4][4]; + unsigned int indexes[16]; + + colors[0][0] = ( maxColor[0] & C565_5_MASK ) | ( maxColor[0] >> 6 ); + colors[0][1] = ( maxColor[1] & C565_6_MASK ) | ( maxColor[1] >> 5 ); + colors[0][2] = ( maxColor[2] & C565_5_MASK ) | ( maxColor[2] >> 6 ); + colors[0][3] = 0; + colors[1][0] = ( minColor[0] & C565_5_MASK ) | ( minColor[0] >> 6 ); + colors[1][1] = ( minColor[1] & C565_6_MASK ) | ( minColor[1] >> 5 ); + colors[1][2] = ( minColor[2] & C565_5_MASK ) | ( minColor[2] >> 6 ); + colors[1][3] = 0; + colors[2][0] = ( 2 * colors[0][0] + 1 * colors[1][0] ) / 3; + colors[2][1] = ( 2 * colors[0][1] + 1 * colors[1][1] ) / 3; + colors[2][2] = ( 2 * colors[0][2] + 1 * colors[1][2] ) / 3; + colors[2][3] = 0; + colors[3][0] = ( 1 * colors[0][0] + 2 * colors[1][0] ) / 3; + colors[3][1] = ( 1 * colors[0][1] + 2 * colors[1][1] ) / 3; + colors[3][2] = ( 1 * colors[0][2] + 2 * colors[1][2] ) / 3; + colors[3][3] = 0; + + for ( int i = 0; i < 16; i++ ) { + unsigned int minDist = (255*255)*4; + for ( int j = 0; j < 4; j++ ) { + unsigned int dist = ColorDistance( &colorBlock[i*4], &colors[j][0] ); + if ( dist < minDist ) { + minDist = dist; + indexes[i] = j; + } + } + } + + unsigned int result = 0; + for ( int i = 0; i < 16; i++ ) { + result |= ( indexes[i] << (unsigned int)( i << 1 ) ); + } + + EmitUInt( result ); + +#endif +} + +/* +======================== +idDxtEncoder::EmitColorAlphaIndices + +params: colorBlock - 16 pixel block for which find color indexes +paramO: minColor - Min color found +paramO: maxColor - Max color found +return: 4 byte color index block +======================== +*/ +void idDxtEncoder::EmitColorAlphaIndices( const byte *colorBlock, const byte *minColor, const byte *maxColor ) { + ALIGN16( uint16_t colors[4][4] ); + unsigned int result = 0; + + colors[0][0] = ( minColor[0] & C565_5_MASK ) | ( minColor[0] >> 5 ); + colors[0][1] = ( minColor[1] & C565_6_MASK ) | ( minColor[1] >> 6 ); + colors[0][2] = ( minColor[2] & C565_5_MASK ) | ( minColor[2] >> 5 ); + colors[0][3] = 255; + colors[1][0] = ( maxColor[0] & C565_5_MASK ) | ( maxColor[0] >> 5 ); + colors[1][1] = ( maxColor[1] & C565_6_MASK ) | ( maxColor[1] >> 6 ); + colors[1][2] = ( maxColor[2] & C565_5_MASK ) | ( maxColor[2] >> 5 ); + colors[1][3] = 255; + colors[2][0] = ( colors[0][0] + colors[1][0] ) / 2; + colors[2][1] = ( colors[0][1] + colors[1][1] ) / 2; + colors[2][2] = ( colors[0][2] + colors[1][2] ) / 2; + colors[2][3] = 255; + colors[3][0] = 0; + colors[3][1] = 0; + colors[3][2] = 0; + colors[3][3] = 0; + + // uses sum of absolute differences instead of squared distance to find the best match + for ( int i = 15; i >= 0; i-- ) { + int c0, c1, c2, c3, m, d0, d1, d2; + + c0 = colorBlock[i*4+0]; + c1 = colorBlock[i*4+1]; + c2 = colorBlock[i*4+2]; + c3 = colorBlock[i*4+3]; + + m = colors[0][0] - c0; + d0 = abs( m ); + m = colors[1][0] - c0; + d1 = abs( m ); + m = colors[2][0] - c0; + d2 = abs( m ); + + m = colors[0][1] - c1; + d0 += abs( m ); + m = colors[1][1] - c1; + d1 += abs( m ); + m = colors[2][1] - c1; + d2 += abs( m ); + + m = colors[0][2] - c2; + d0 += abs( m ); + m = colors[1][2] - c2; + d1 += abs( m ); + m = colors[2][2] - c2; + d2 += abs( m ); + + unsigned int b0 = d2 > d0; + unsigned int b1 = d2 > d1; + unsigned int b2 = d1 > d0; + unsigned int b3 = c3 < 128; + + result |= ( ( ( b0 & b1 | b3 ) << 1 ) | ( b2 ^ b1 | b3 ) ) << ( i << 1 ); + } + + EmitUInt( result ); +} + +/* +======================== +idDxtEncoder::EmitCTX1Indices + +params: colorBlock - 16 pixel block for which find color indexes +paramO: minColor - Min color found +paramO: maxColor - Max color found +return: 4 byte color index block +======================== +*/ +void idDxtEncoder::EmitCTX1Indices( const byte *colorBlock, const byte *minColor, const byte *maxColor ) { + ALIGN16( uint16_t colors[4][2] ); + unsigned int result = 0; + + colors[0][0] = maxColor[0]; + colors[0][1] = maxColor[1]; + colors[1][0] = minColor[0]; + colors[1][1] = minColor[1]; + + colors[2][0] = ( 2 * colors[0][0] + 1 * colors[1][0] ) / 3; + colors[2][1] = ( 2 * colors[0][1] + 1 * colors[1][1] ) / 3; + colors[3][0] = ( 1 * colors[0][0] + 2 * colors[1][0] ) / 3; + colors[3][1] = ( 1 * colors[0][1] + 2 * colors[1][1] ) / 3; + + for ( int i = 15; i >= 0; i-- ) { + int c0, c1, m, d0, d1, d2, d3; + + c0 = colorBlock[i*4+0]; + c1 = colorBlock[i*4+1]; + + m = colors[0][0] - c0; + d0 = abs( m ); + m = colors[1][0] - c0; + d1 = abs( m ); + m = colors[2][0] - c0; + d2 = abs( m ); + m = colors[3][0] - c0; + d3 = abs( m ); + + m = colors[0][1] - c1; + d0 += abs( m ); + m = colors[1][1] - c1; + d1 += abs( m ); + m = colors[2][1] - c1; + d2 += abs( m ); + m = colors[3][1] - c1; + d3 += abs( m ); + + bool b0 = d0 > d3; + bool b1 = d1 > d2; + bool b2 = d0 > d2; + bool b3 = d1 > d3; + bool b4 = d2 > d3; + + int x0 = b1 & b2; + int x1 = b0 & b3; + int x2 = b0 & b4; + + result |= ( x2 | ( ( x0 | x1 ) << 1 ) ) << ( i << 1 ); + } + + EmitUInt( result ); +} + +/* +======================== +idDxtEncoder::EmitAlphaIndices + +params: colorBlock - 16 pixel block for which find alpha indexes +paramO: minAlpha - Min alpha found +paramO: maxAlpha - Max alpha found +======================== +*/ +void idDxtEncoder::EmitAlphaIndices( const byte *colorBlock, const int offset, const byte minAlpha, const byte maxAlpha ) { + + assert( maxAlpha >= minAlpha ); + + const int ALPHA_RANGE = 7; + +#if 1 + + byte ab1, ab2, ab3, ab4, ab5, ab6, ab7; + ALIGN16( byte indexes[16] ); + + ab1 = ( 13 * maxAlpha + 1 * minAlpha + ALPHA_RANGE ) / (ALPHA_RANGE*2); + ab2 = ( 11 * maxAlpha + 3 * minAlpha + ALPHA_RANGE ) / (ALPHA_RANGE*2); + ab3 = ( 9 * maxAlpha + 5 * minAlpha + ALPHA_RANGE ) / (ALPHA_RANGE*2); + ab4 = ( 7 * maxAlpha + 7 * minAlpha + ALPHA_RANGE ) / (ALPHA_RANGE*2); + ab5 = ( 5 * maxAlpha + 9 * minAlpha + ALPHA_RANGE ) / (ALPHA_RANGE*2); + ab6 = ( 3 * maxAlpha + 11 * minAlpha + ALPHA_RANGE ) / (ALPHA_RANGE*2); + ab7 = ( 1 * maxAlpha + 13 * minAlpha + ALPHA_RANGE ) / (ALPHA_RANGE*2); + + colorBlock += offset; + + for ( int i = 0; i < 16; i++ ) { + byte a = colorBlock[i*4]; + int b1 = ( a >= ab1 ); + int b2 = ( a >= ab2 ); + int b3 = ( a >= ab3 ); + int b4 = ( a >= ab4 ); + int b5 = ( a >= ab5 ); + int b6 = ( a >= ab6 ); + int b7 = ( a >= ab7 ); + int index = ( 8 - b1 - b2 - b3 - b4 - b5 - b6 - b7 ) & 7; + indexes[i] = byte( index ^ ( 2 > index ) ); + } + + EmitByte( (indexes[ 0] >> 0) | (indexes[ 1] << 3) | (indexes[ 2] << 6) ); + EmitByte( (indexes[ 2] >> 2) | (indexes[ 3] << 1) | (indexes[ 4] << 4) | (indexes[ 5] << 7) ); + EmitByte( (indexes[ 5] >> 1) | (indexes[ 6] << 2) | (indexes[ 7] << 5) ); + + EmitByte( (indexes[ 8] >> 0) | (indexes[ 9] << 3) | (indexes[10] << 6) ); + EmitByte( (indexes[10] >> 2) | (indexes[11] << 1) | (indexes[12] << 4) | (indexes[13] << 7) ); + EmitByte( (indexes[13] >> 1) | (indexes[14] << 2) | (indexes[15] << 5) ); + +#elif 0 + + ALIGN16( byte indexes[16] ); + byte delta = maxAlpha - minAlpha; + byte half = delta >> 1; + byte bias = delta / ( 2 * ALPHA_RANGE ); + byte bottom = minAlpha + bias; + byte top = maxAlpha - bias; + + colorBlock += offset; + + for ( int i = 0; i < 16; i++ ) { + byte a = colorBlock[i*4]; + if ( a <= bottom ) { + indexes[i] = 1; + } else if ( a >= top ) { + indexes[i] = 0; + } else { + indexes[i] = (ALPHA_RANGE+1) + ( ( minAlpha - a ) * ALPHA_RANGE - half ) / delta; + } + } + + EmitByte( (indexes[ 0] >> 0) | (indexes[ 1] << 3) | (indexes[ 2] << 6) ); + EmitByte( (indexes[ 2] >> 2) | (indexes[ 3] << 1) | (indexes[ 4] << 4) | (indexes[ 5] << 7) ); + EmitByte( (indexes[ 5] >> 1) | (indexes[ 6] << 2) | (indexes[ 7] << 5) ); + + EmitByte( (indexes[ 8] >> 0) | (indexes[ 9] << 3) | (indexes[10] << 6) ); + EmitByte( (indexes[10] >> 2) | (indexes[11] << 1) | (indexes[12] << 4) | (indexes[13] << 7) ); + EmitByte( (indexes[13] >> 1) | (indexes[14] << 2) | (indexes[15] << 5) ); + +#elif 0 + + ALIGN16( byte indexes[16] ); + byte delta = maxAlpha - minAlpha; + byte half = delta >> 1; + byte bias = delta / ( 2 * ALPHA_RANGE ); + byte bottom = minAlpha + bias; + byte top = maxAlpha - bias; + + colorBlock += offset; + + for ( int i = 0; i < 16; i++ ) { + byte a = colorBlock[i*4]; + int index = (ALPHA_RANGE+1) + ( ( minAlpha - a ) * ALPHA_RANGE - half ) / delta; + int c0 = a > bottom; + int c1 = a < top; + indexes[i] = ( index & -( c0 & c1 ) ) | ( c0 ^ 1 ); + } + + EmitByte( (indexes[ 0] >> 0) | (indexes[ 1] << 3) | (indexes[ 2] << 6) ); + EmitByte( (indexes[ 2] >> 2) | (indexes[ 3] << 1) | (indexes[ 4] << 4) | (indexes[ 5] << 7) ); + EmitByte( (indexes[ 5] >> 1) | (indexes[ 6] << 2) | (indexes[ 7] << 5) ); + + EmitByte( (indexes[ 8] >> 0) | (indexes[ 9] << 3) | (indexes[10] << 6) ); + EmitByte( (indexes[10] >> 2) | (indexes[11] << 1) | (indexes[12] << 4) | (indexes[13] << 7) ); + EmitByte( (indexes[13] >> 1) | (indexes[14] << 2) | (indexes[15] << 5) ); + +#else + + ALIGN16( byte indexes[16] ); + ALIGN16( byte alphas[8] ); + + alphas[0] = maxAlpha; + alphas[1] = minAlpha; + alphas[2] = ( 6 * maxAlpha + 1 * minAlpha ) / ALPHA_RANGE; + alphas[3] = ( 5 * maxAlpha + 2 * minAlpha ) / ALPHA_RANGE; + alphas[4] = ( 4 * maxAlpha + 3 * minAlpha ) / ALPHA_RANGE; + alphas[5] = ( 3 * maxAlpha + 4 * minAlpha ) / ALPHA_RANGE; + alphas[6] = ( 2 * maxAlpha + 5 * minAlpha ) / ALPHA_RANGE; + alphas[7] = ( 1 * maxAlpha + 6 * minAlpha ) / ALPHA_RANGE; + + colorBlock += offset; + + for ( int i = 0; i < 16; i++ ) { + int minDist = INT_MAX; + byte a = colorBlock[i*4]; + for ( int j = 0; j < 8; j++ ) { + int dist = abs( a - alphas[j] ); + if ( dist < minDist ) { + minDist = dist; + indexes[i] = j; + } + } + } + + EmitByte( (indexes[ 0] >> 0) | (indexes[ 1] << 3) | (indexes[ 2] << 6) ); + EmitByte( (indexes[ 2] >> 2) | (indexes[ 3] << 1) | (indexes[ 4] << 4) | (indexes[ 5] << 7) ); + EmitByte( (indexes[ 5] >> 1) | (indexes[ 6] << 2) | (indexes[ 7] << 5) ); + + EmitByte( (indexes[ 8] >> 0) | (indexes[ 9] << 3) | (indexes[10] << 6) ); + EmitByte( (indexes[10] >> 2) | (indexes[11] << 1) | (indexes[12] << 4) | (indexes[13] << 7) ); + EmitByte( (indexes[13] >> 1) | (indexes[14] << 2) | (indexes[15] << 5) ); + +#endif +} + +/* +======================== +idDxtEncoder::CompressImageDXT1Fast_Generic + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::CompressImageDXT1Fast_Generic( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte block[64] ); + ALIGN16( byte minColor[4] ); + ALIGN16( byte maxColor[4] ); + + assert( width >= 4 && ( width & 3 ) == 0 ); + assert( height >= 4 && ( height & 3 ) == 0 ); + + this->width = width; + this->height = height; + this->outData = outBuf; + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + + ExtractBlock( inBuf + i * 4, width, block ); + + GetMinMaxBBox( block, minColor, maxColor ); + //SelectColorsDiagonal( block, minColor, maxColor ); + InsetColorsBBox( minColor, maxColor ); + + EmitUShort( ColorTo565( maxColor ) ); + EmitUShort( ColorTo565( minColor ) ); + + EmitColorIndices( block, minColor, maxColor ); + } + outData += dstPadding; + inBuf += srcPadding; + } +} + +/* +======================== +idDxtEncoder::CompressImageDXT1AlphaFast_Generic + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::CompressImageDXT1AlphaFast_Generic( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte block[64] ); + ALIGN16( byte minColor[4] ); + ALIGN16( byte maxColor[4] ); + + assert( width >= 4 && ( width & 3 ) == 0 ); + assert( height >= 4 && ( height & 3 ) == 0 ); + + this->width = width; + this->height = height; + this->outData = outBuf; + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + + ExtractBlock( inBuf + i * 4, width, block ); + + GetMinMaxBBox( block, minColor, maxColor ); + byte minAlpha = minColor[3]; + //SelectColorsDiagonal( block, minColor, maxColor ); + InsetColorsBBox( minColor, maxColor ); + + if ( minAlpha >= 128 ) { + EmitUShort( ColorTo565( maxColor ) ); + EmitUShort( ColorTo565( minColor ) ); + EmitColorIndices( block, minColor, maxColor ); + } else { + EmitUShort( ColorTo565( minColor ) ); + EmitUShort( ColorTo565( maxColor ) ); + EmitColorAlphaIndices( block, minColor, maxColor ); + } + } + outData += dstPadding; + inBuf += srcPadding; + } +} + +/* +======================== +idDxtEncoder::CompressImageDXT5Fast_Generic + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::CompressImageDXT5Fast_Generic( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte block[64] ); + ALIGN16( byte minColor[4] ); + ALIGN16( byte maxColor[4] ); + + assert( width >= 4 && ( width & 3 ) == 0 ); + assert( height >= 4 && ( height & 3 ) == 0 ); + + this->width = width; + this->height = height; + this->outData = outBuf; + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + + ExtractBlock( inBuf + i * 4, width, block ); + + GetMinMaxBBox( block, minColor, maxColor ); + //SelectColorsDiagonal( block, minColor, maxColor ); + InsetColorsBBox( minColor, maxColor ); + + EmitByte( maxColor[3] ); + EmitByte( minColor[3] ); + + EmitAlphaIndices( block, 3, minColor[3], maxColor[3] ); + +#ifdef NVIDIA_7X_HARDWARE_BUG_FIX + // the colors are already always guaranteed to be sorted properly +#endif + + EmitUShort( ColorTo565( maxColor ) ); + EmitUShort( ColorTo565( minColor ) ); + + EmitColorIndices( block, minColor, maxColor ); + } + outData += dstPadding; + inBuf += srcPadding; + } +} + +/* +======================== +idDxtEncoder::ScaleYCoCg +======================== +*/ +void idDxtEncoder::ScaleYCoCg( byte *colorBlock, byte *minColor, byte *maxColor ) const { + int m0 = abs( minColor[0] - 128 ); + int m1 = abs( minColor[1] - 128 ); + int m2 = abs( maxColor[0] - 128 ); + int m3 = abs( maxColor[1] - 128 ); + + if ( m1 > m0 ) m0 = m1; + if ( m3 > m2 ) m2 = m3; + if ( m2 > m0 ) m0 = m2; + + const int s0 = 128 / 2 - 1; + const int s1 = 128 / 4 - 1; + + int mask0 = -( m0 <= s0 ); + int mask1 = -( m0 <= s1 ); + int scale = 1 + ( 1 & mask0 ) + ( 2 & mask1 ); + + minColor[0] = byte( ( minColor[0] - 128 ) * scale + 128 ); + minColor[1] = byte( ( minColor[1] - 128 ) * scale + 128 ); + minColor[2] = byte( ( scale - 1 ) << 3 ); + maxColor[0] = byte( ( maxColor[0] - 128 ) * scale + 128 ); + maxColor[1] = byte( ( maxColor[1] - 128 ) * scale + 128 ); + maxColor[2] = byte( ( scale - 1 ) << 3 ); + + for ( int i = 0; i < 16; i++ ) { + colorBlock[i*4+0] = byte( ( colorBlock[i*4+0] - 128 ) * scale + 128 ); + colorBlock[i*4+1] = byte( ( colorBlock[i*4+1] - 128 ) * scale + 128 ); + } +} + +/* +======================== +idDxtEncoder::InsetYCoCgBBox +======================== +*/ +ID_INLINE void idDxtEncoder::InsetYCoCgBBox( byte *minColor, byte *maxColor ) const { + +#if 0 + + byte inset[4]; + + inset[0] = ( maxColor[0] - minColor[0] ) >> INSET_COLOR_SHIFT; + inset[1] = ( maxColor[1] - minColor[1] ) >> INSET_COLOR_SHIFT; + inset[3] = ( maxColor[3] - minColor[3] ) >> INSET_ALPHA_SHIFT; + + minColor[0] = ( minColor[0] + inset[0] <= 255 ) ? minColor[0] + inset[0] : 255; + minColor[1] = ( minColor[1] + inset[1] <= 255 ) ? minColor[1] + inset[1] : 255; + minColor[3] = ( minColor[3] + inset[3] <= 255 ) ? minColor[3] + inset[3] : 255; + + maxColor[0] = ( maxColor[0] >= inset[0] ) ? maxColor[0] - inset[0] : 0; + maxColor[1] = ( maxColor[1] >= inset[1] ) ? maxColor[1] - inset[1] : 0; + maxColor[3] = ( maxColor[3] >= inset[3] ) ? maxColor[3] - inset[3] : 0; + + minColor[0] = ( minColor[0] & C565_5_MASK ) | ( minColor[0] >> 5 ); + minColor[1] = ( minColor[1] & C565_6_MASK ) | ( minColor[1] >> 6 ); + + maxColor[0] = ( maxColor[0] & C565_5_MASK ) | ( maxColor[0] >> 5 ); + maxColor[1] = ( maxColor[1] & C565_6_MASK ) | ( maxColor[1] >> 6 ); + +#elif 0 + + float inset[4]; + float minf[4]; + float maxf[4]; + + for ( int i = 0; i < 4; i++ ) { + minf[i] = minColor[i] / 255.0f; + maxf[i] = maxColor[i] / 255.0f; + } + + inset[0] = ( maxf[0] - minf[0] ) / 16.0f; + inset[1] = ( maxf[1] - minf[1] ) / 16.0f; + inset[2] = ( maxf[2] - minf[2] ) / 16.0f; + inset[3] = ( maxf[3] - minf[3] ) / 32.0f; + + for ( int i = 0; i < 4; i++ ) { + minf[i] = ( minf[i] + inset[i] <= 1.0f ) ? minf[i] + inset[i] : 1.0f; + maxf[i] = ( maxf[i] >= inset[i] ) ? maxf[i] - inset[i] : 0; + } + + minColor[0] = ((int)floor( minf[0] * 31 )) & ( ( 1 << 5 ) - 1 ); + minColor[1] = ((int)floor( minf[1] * 63 )) & ( ( 1 << 6 ) - 1 ); + + maxColor[0] = ((int)ceil( maxf[0] * 31 )) & ( ( 1 << 5 ) - 1 ); + maxColor[1] = ((int)ceil( maxf[1] * 63 )) & ( ( 1 << 6 ) - 1 ); + + minColor[0] = ( minColor[0] << 3 ) | ( minColor[0] >> 2 ); + minColor[1] = ( minColor[1] << 2 ) | ( minColor[1] >> 4 ); + + maxColor[0] = ( maxColor[0] << 3 ) | ( maxColor[0] >> 2 ); + maxColor[1] = ( maxColor[1] << 2 ) | ( maxColor[1] >> 4 ); + + minColor[3] = (int)floor( minf[3] * 255.0f ); + maxColor[3] = (int)ceil( maxf[3] * 255.0f ); + +#elif 0 + + int inset[4]; + int mini[4]; + int maxi[4]; + + inset[0] = ( maxColor[0] - minColor[0] ); + inset[1] = ( maxColor[1] - minColor[1] ); + inset[3] = ( maxColor[3] - minColor[3] ); + + mini[0] = ( minColor[0] << INSET_COLOR_SHIFT ) + inset[0]; + mini[1] = ( minColor[1] << INSET_COLOR_SHIFT ) + inset[1]; + mini[3] = ( minColor[3] << INSET_ALPHA_SHIFT ) + inset[3]; + + maxi[0] = ( maxColor[0] << INSET_COLOR_SHIFT ) - inset[0]; + maxi[1] = ( maxColor[1] << INSET_COLOR_SHIFT ) - inset[1]; + maxi[3] = ( maxColor[3] << INSET_ALPHA_SHIFT ) - inset[3]; + + mini[0] = ( mini[0] - ((1<<(3))-1) ) >> (INSET_COLOR_SHIFT+3); + mini[1] = ( mini[1] - ((1<<(3))-1) ) >> (INSET_COLOR_SHIFT+2); + mini[3] = ( mini[3] - ((1<<(2))-1) ) >> (INSET_ALPHA_SHIFT+0); + + maxi[0] = ( maxi[0] + ((1<<(3))-1) ) >> (INSET_COLOR_SHIFT+3); + maxi[1] = ( maxi[1] + ((1<<(3))-1) ) >> (INSET_COLOR_SHIFT+2); + maxi[3] = ( maxi[3] + ((1<<(2))-1) ) >> (INSET_ALPHA_SHIFT+0); + + if ( mini[0] < 0 ) mini[0] = 0; + if ( mini[1] < 0 ) mini[1] = 0; + if ( mini[3] < 0 ) mini[3] = 0; + + if ( maxi[0] > 31 ) maxi[0] = 31; + if ( maxi[1] > 63 ) maxi[1] = 63; + if ( maxi[3] > 255 ) maxi[3] = 255; + + minColor[0] = ( mini[0] << 3 ) | ( mini[0] >> 2 ); + minColor[1] = ( mini[1] << 2 ) | ( mini[1] >> 4 ); + minColor[3] = mini[3]; + + maxColor[0] = ( maxi[0] << 3 ) | ( maxi[0] >> 2 ); + maxColor[1] = ( maxi[1] << 2 ) | ( maxi[1] >> 4 ); + maxColor[3] = maxi[3]; + +#elif 1 + + int inset[4]; + int mini[4]; + int maxi[4]; + + inset[0] = ( maxColor[0] - minColor[0] ) - ((1<<(INSET_COLOR_SHIFT-1))-1); + inset[1] = ( maxColor[1] - minColor[1] ) - ((1<<(INSET_COLOR_SHIFT-1))-1); + inset[3] = ( maxColor[3] - minColor[3] ) - ((1<<(INSET_ALPHA_SHIFT-1))-1); + + mini[0] = ( ( minColor[0] << INSET_COLOR_SHIFT ) + inset[0] ) >> INSET_COLOR_SHIFT; + mini[1] = ( ( minColor[1] << INSET_COLOR_SHIFT ) + inset[1] ) >> INSET_COLOR_SHIFT; + mini[3] = ( ( minColor[3] << INSET_ALPHA_SHIFT ) + inset[3] ) >> INSET_ALPHA_SHIFT; + + maxi[0] = ( ( maxColor[0] << INSET_COLOR_SHIFT ) - inset[0] ) >> INSET_COLOR_SHIFT; + maxi[1] = ( ( maxColor[1] << INSET_COLOR_SHIFT ) - inset[1] ) >> INSET_COLOR_SHIFT; + maxi[3] = ( ( maxColor[3] << INSET_ALPHA_SHIFT ) - inset[3] ) >> INSET_ALPHA_SHIFT; + + mini[0] = ( mini[0] >= 0 ) ? mini[0] : 0; + mini[1] = ( mini[1] >= 0 ) ? mini[1] : 0; + mini[3] = ( mini[3] >= 0 ) ? mini[3] : 0; + + maxi[0] = ( maxi[0] <= 255 ) ? maxi[0] : 255; + maxi[1] = ( maxi[1] <= 255 ) ? maxi[1] : 255; + maxi[3] = ( maxi[3] <= 255 ) ? maxi[3] : 255; + + minColor[0] = byte( ( mini[0] & C565_5_MASK ) | ( mini[0] >> 5 ) ); + minColor[1] = byte( ( mini[1] & C565_6_MASK ) | ( mini[1] >> 6 ) ); + minColor[3] = byte( mini[3] ); + + maxColor[0] = byte( ( maxi[0] & C565_5_MASK ) | ( maxi[0] >> 5 ) ); + maxColor[1] = byte( ( maxi[1] & C565_6_MASK ) | ( maxi[1] >> 6 ) ); + maxColor[3] = byte( maxi[3] ); + +#endif +} + +/* +======================== +idDxtEncoder::InsetYCoCgAlpaBBox +======================== +*/ +ID_INLINE void idDxtEncoder::InsetYCoCgAlpaBBox( byte *minColor, byte *maxColor ) const { + int inset[4]; + int mini[4]; + int maxi[4]; + + inset[0] = ( maxColor[0] - minColor[0] ) - ((1<<(INSET_COLOR_SHIFT-1))-1); + inset[1] = ( maxColor[1] - minColor[1] ) - ((1<<(INSET_COLOR_SHIFT-1))-1); + inset[2] = ( maxColor[2] - minColor[2] ) - ((1<<(INSET_COLOR_SHIFT-1))-1); + inset[3] = ( maxColor[3] - minColor[3] ) - ((1<<(INSET_ALPHA_SHIFT-1))-1); + + mini[0] = ( ( minColor[0] << INSET_COLOR_SHIFT ) + inset[0] ) >> INSET_COLOR_SHIFT; + mini[1] = ( ( minColor[1] << INSET_COLOR_SHIFT ) + inset[1] ) >> INSET_COLOR_SHIFT; + mini[2] = ( ( minColor[2] << INSET_COLOR_SHIFT ) + inset[2] ) >> INSET_COLOR_SHIFT; + mini[3] = ( ( minColor[3] << INSET_ALPHA_SHIFT ) + inset[3] ) >> INSET_ALPHA_SHIFT; + + maxi[0] = ( ( maxColor[0] << INSET_COLOR_SHIFT ) - inset[0] ) >> INSET_COLOR_SHIFT; + maxi[1] = ( ( maxColor[1] << INSET_COLOR_SHIFT ) - inset[1] ) >> INSET_COLOR_SHIFT; + maxi[2] = ( ( maxColor[2] << INSET_COLOR_SHIFT ) - inset[2] ) >> INSET_COLOR_SHIFT; + maxi[3] = ( ( maxColor[3] << INSET_ALPHA_SHIFT ) - inset[3] ) >> INSET_ALPHA_SHIFT; + + mini[0] = ( mini[0] >= 0 ) ? mini[0] : 0; + mini[1] = ( mini[1] >= 0 ) ? mini[1] : 0; + mini[2] = ( mini[2] >= 0 ) ? mini[2] : 0; + mini[3] = ( mini[3] >= 0 ) ? mini[3] : 0; + + maxi[0] = ( maxi[0] <= 255 ) ? maxi[0] : 255; + maxi[1] = ( maxi[1] <= 255 ) ? maxi[1] : 255; + maxi[2] = ( maxi[2] <= 255 ) ? maxi[2] : 255; + maxi[3] = ( maxi[3] <= 255 ) ? maxi[3] : 255; + + minColor[0] = byte( ( mini[0] & C565_5_MASK ) | ( mini[0] >> 5 ) ); + minColor[1] = byte( ( mini[1] & C565_6_MASK ) | ( mini[1] >> 6 ) ); + minColor[2] = byte( ( mini[2] & C565_5_MASK ) | ( mini[2] >> 5 ) ); + minColor[3] = byte( mini[3] ); + + maxColor[0] = byte( ( maxi[0] & C565_5_MASK ) | ( maxi[0] >> 5 ) ); + maxColor[1] = byte( ( maxi[1] & C565_6_MASK ) | ( maxi[1] >> 6 ) ); + maxColor[2] = byte( ( maxi[2] & C565_5_MASK ) | ( maxi[2] >> 5 ) ); + maxColor[3] = byte( maxi[3] ); +} + +/* +======================== +idDxtEncoder::SelectYCoCgDiagonal +======================== +*/ +void idDxtEncoder::SelectYCoCgDiagonal( const byte *colorBlock, byte *minColor, byte *maxColor ) const { + byte side = 0; + + byte mid0 = byte( ( (int) minColor[0] + maxColor[0] + 1 ) >> 1 ); + byte mid1 = byte( ( (int) minColor[1] + maxColor[1] + 1 ) >> 1 ); + + for ( int i = 0; i < 16; i++ ) { + byte b0 = colorBlock[i*4+0] >= mid0; + byte b1 = colorBlock[i*4+1] >= mid1; + side += ( b0 ^ b1 ); + } + + byte mask = -( side > 8 ); + +#if defined NVIDIA_7X_HARDWARE_BUG_FIX + mask &= -( minColor[0] != maxColor[0] ); +#endif + + byte c0 = minColor[1]; + byte c1 = maxColor[1]; + + c0 ^= c1; + mask &= c0; + c1 ^= mask; + c0 ^= c1; + + minColor[1] = c0; + maxColor[1] = c1; +} + +/* +======================== +idDxtEncoder::CompressYCoCgDXT5Fast_Generic + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::CompressYCoCgDXT5Fast_Generic( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte block[64] ); + ALIGN16( byte minColor[4] ); + ALIGN16( byte maxColor[4] ); + + //assert( HasConstantValuePer4x4Block( inBuf, width, height, 2 ) ); + + assert( width >= 4 && ( width & 3 ) == 0 ); + assert( height >= 4 && ( height & 3 ) == 0 ); + + this->width = width; + this->height = height; + this->outData = outBuf; + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + + ExtractBlock( inBuf + i * 4, width, block ); + + GetMinMaxBBox( block, minColor, maxColor ); + ScaleYCoCg( block, minColor, maxColor ); + InsetYCoCgBBox( minColor, maxColor ); + SelectYCoCgDiagonal( block, minColor, maxColor ); + + EmitByte( maxColor[3] ); + EmitByte( minColor[3] ); + + EmitAlphaIndices( block, 3, minColor[3], maxColor[3] ); + +#ifdef NVIDIA_7X_HARDWARE_BUG_FIX + // the colors are already sorted when selecting the diagonal +#endif + + EmitUShort( ColorTo565( maxColor ) ); + EmitUShort( ColorTo565( minColor ) ); + + EmitColorIndices( block, minColor, maxColor ); + } + outData += dstPadding; + inBuf += srcPadding; + } +} + +/* +======================== +idDxtEncoder::CompressYCoCgAlphaDXT5Fast + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::CompressYCoCgAlphaDXT5Fast( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte block[64] ); + ALIGN16( byte minColor[4] ); + ALIGN16( byte maxColor[4] ); + + assert( width >= 4 && ( width & 3 ) == 0 ); + assert( height >= 4 && ( height & 3 ) == 0 ); + + this->width = width; + this->height = height; + this->outData = outBuf; + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + + ExtractBlock( inBuf + i * 4, width, block ); + + // scale down the chroma of texels that are close to gray with low luminance + for ( int k = 0; k < 16; k++ ) { + if ( abs( block[k*4+0] - 132 ) <= 8 && + abs( block[k*4+2] - 132 ) <= 8 && + block[k*4+3] < 96 ) { + block[k*4+0] = ( block[k*4+0] - 132 ) / 2 + 132; + block[k*4+2] = ( block[k*4+2] - 132 ) / 2 + 132; + } + } + + GetMinMaxBBox( block, minColor, maxColor ); + InsetYCoCgAlpaBBox( minColor, maxColor ); + SelectColorsDiagonal( block, minColor, maxColor ); + + EmitByte( maxColor[3] ); + EmitByte( minColor[3] ); + + EmitAlphaIndices( block, 3, minColor[3], maxColor[3] ); + +#ifdef NVIDIA_7X_HARDWARE_BUG_FIX + // the colors are already sorted when selecting the diagonal +#endif + + EmitUShort( ColorTo565( maxColor ) ); + EmitUShort( ColorTo565( minColor ) ); + + EmitColorIndices( block, minColor, maxColor ); + } + outData += dstPadding; + inBuf += srcPadding; + } +} + +/* +======================== +idDxtEncoder::CompressYCoCgCTX1DXT5AFast_Generic + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::CompressYCoCgCTX1DXT5AFast_Generic( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte block[64] ); + ALIGN16( byte minColor[4] ); + ALIGN16( byte maxColor[4] ); + + assert( HasConstantValuePer4x4Block( inBuf, width, height, 2 ) ); + + assert( width >= 4 && ( width & 3 ) == 0 ); + assert( height >= 4 && ( height & 3 ) == 0 ); + + this->width = width; + this->height = height; + this->outData = outBuf; + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + + ExtractBlock( inBuf + i * 4, width, block ); + + GetMinMaxBBox( block, minColor, maxColor ); + SelectYCoCgDiagonal( block, minColor, maxColor ); + InsetColorsBBox( minColor, maxColor ); + + EmitByte( maxColor[3] ); + EmitByte( minColor[3] ); + + EmitAlphaIndices( block, 3, minColor[3], maxColor[3] ); + + EmitByte( maxColor[0] ); + EmitByte( maxColor[1] ); + EmitByte( minColor[0] ); + EmitByte( minColor[1] ); + + EmitCTX1Indices( block, minColor, maxColor ); + } + outData += dstPadding; + inBuf += srcPadding; + } +} + +/* +======================== +idDxtEncoder::EmitGreenIndices + +params: block - block for which to find green indices +paramO: minGreen - Min green found +paramO: maxGreen - Max green found +======================== +*/ +void idDxtEncoder::EmitGreenIndices( const byte *block, const int offset, const byte minGreen, const byte maxGreen ) { + + assert( maxGreen >= minGreen ); + + const int COLOR_RANGE = 3; + +#if 1 + + byte yb1 = ( 5 * maxGreen + 1 * minGreen + COLOR_RANGE ) / ( 2 * COLOR_RANGE ); + byte yb2 = ( 3 * maxGreen + 3 * minGreen + COLOR_RANGE ) / ( 2 * COLOR_RANGE ); + byte yb3 = ( 1 * maxGreen + 5 * minGreen + COLOR_RANGE ) / ( 2 * COLOR_RANGE ); + + unsigned int result = 0; + + block += offset; + + for ( int i = 15; i >= 0; i-- ) { + result <<= 2; + byte y = block[i*4]; + int b1 = ( y >= yb1 ); + int b2 = ( y >= yb2 ); + int b3 = ( y >= yb3 ); + int index = ( 4 - b1 - b2 - b3 ) & 3; + index ^= ( 2 > index ); + result |= index; + } + + EmitUInt( result ); + +#else + + byte green[4]; + + green[0] = maxGreen; + green[1] = minGreen; + green[2] = ( 2 * green[0] + 1 * green[1] ) / 3; + green[3] = ( 1 * green[0] + 2 * green[1] ) / 3; + + unsigned int result = 0; + + block += offset; + + for ( int i = 15; i >= 0; i-- ) { + result <<= 2; + byte y = block[i*4]; + int minDist = INT_MAX; + int index; + for ( int j = 0; j < 4; j++ ) { + int dist = abs( y - green[j] ); + if ( dist < minDist ) { + minDist = dist; + index = j; + } + } + result |= index; + } + + EmitUInt( result ); + +#endif +} + +/* +======================== +idDxtEncoder::InsetNormalsBBoxDXT5 +======================== +*/ +void idDxtEncoder::InsetNormalsBBoxDXT5( byte *minNormal, byte *maxNormal ) const { + int inset[4]; + int mini[4]; + int maxi[4]; + + inset[3] = ( maxNormal[3] - minNormal[3] ) - ((1<<(INSET_ALPHA_SHIFT-1))-1); + inset[1] = ( maxNormal[1] - minNormal[1] ) - ((1<<(INSET_COLOR_SHIFT-1))-1); + + mini[3] = ( ( minNormal[3] << INSET_ALPHA_SHIFT ) + inset[3] ) >> INSET_ALPHA_SHIFT; + mini[1] = ( ( minNormal[1] << INSET_COLOR_SHIFT ) + inset[1] ) >> INSET_COLOR_SHIFT; + + maxi[3] = ( ( maxNormal[3] << INSET_ALPHA_SHIFT ) - inset[3] ) >> INSET_ALPHA_SHIFT; + maxi[1] = ( ( maxNormal[1] << INSET_COLOR_SHIFT ) - inset[1] ) >> INSET_COLOR_SHIFT; + + mini[3] = ( mini[3] >= 0 ) ? mini[3] : 0; + mini[1] = ( mini[1] >= 0 ) ? mini[1] : 0; + + maxi[3] = ( maxi[3] <= 255 ) ? maxi[3] : 255; + maxi[1] = ( maxi[1] <= 255 ) ? maxi[1] : 255; + + minNormal[3] = byte( mini[3] ); + minNormal[1] = byte( ( mini[1] & C565_6_MASK ) | ( mini[1] >> 6 ) ); + + maxNormal[3] = byte( maxi[3] ); + maxNormal[1] = byte( ( maxi[1] & C565_6_MASK ) | ( maxi[1] >> 6 ) ); +} + +/* +======================== +idDxtEncoder::InsetNormalsBBox3Dc +======================== +*/ +void idDxtEncoder::InsetNormalsBBox3Dc( byte *minNormal, byte *maxNormal ) const { + int inset[4]; + int mini[4]; + int maxi[4]; + + inset[0] = ( maxNormal[0] - minNormal[0] ) - ((1<<(INSET_ALPHA_SHIFT-1))-1); + inset[1] = ( maxNormal[1] - minNormal[1] ) - ((1<<(INSET_ALPHA_SHIFT-1))-1); + + mini[0] = ( ( minNormal[0] << INSET_ALPHA_SHIFT ) + inset[0] ) >> INSET_ALPHA_SHIFT; + mini[1] = ( ( minNormal[1] << INSET_ALPHA_SHIFT ) + inset[1] ) >> INSET_ALPHA_SHIFT; + + maxi[0] = ( ( maxNormal[0] << INSET_ALPHA_SHIFT ) - inset[0] ) >> INSET_ALPHA_SHIFT; + maxi[1] = ( ( maxNormal[1] << INSET_ALPHA_SHIFT ) - inset[1] ) >> INSET_ALPHA_SHIFT; + + mini[0] = ( mini[0] >= 0 ) ? mini[0] : 0; + mini[1] = ( mini[1] >= 0 ) ? mini[1] : 0; + + maxi[0] = ( maxi[0] <= 255 ) ? maxi[0] : 255; + maxi[1] = ( maxi[1] <= 255 ) ? maxi[1] : 255; + + minNormal[0] = (byte)mini[0]; + minNormal[1] = (byte)mini[1]; + + maxNormal[0] = (byte)maxi[0]; + maxNormal[1] = (byte)maxi[1]; +} + +/* +======================== +idDxtEncoder::CompressNormalMapDXT5Fast_Generic + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::CompressNormalMapDXT5Fast_Generic( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte block[64] ); + ALIGN16( byte normal1[4] ); + ALIGN16( byte normal2[4] ); + + assert( width >= 4 && ( width & 3 ) == 0 ); + assert( height >= 4 && ( height & 3 ) == 0 ); + + this->width = width; + this->height = height; + this->outData = outBuf; + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + + ExtractBlock( inBuf + i * 4, width, block ); + + GetMinMaxBBox( block, normal1, normal2 ); + InsetNormalsBBoxDXT5( normal1, normal2 ); + + // Write out Nx into alpha channel. + EmitByte( normal2[3] ); + EmitByte( normal1[3] ); + EmitAlphaIndices( block, 3, normal1[3], normal2[3] ); + + // Write out Ny into green channel. + EmitUShort( ColorTo565( block[0], normal2[1], block[2] ) ); + EmitUShort( ColorTo565( block[0], normal1[1], block[2] ) ); + EmitGreenIndices( block, 1, normal1[1], normal2[1] ); + } + outData += dstPadding; + inBuf += srcPadding; + } +} + +/* +======================== +idDxtEncoder::CompressImageDXN1Fast_Generic + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::CompressImageDXN1Fast_Generic( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte block[64] ); + ALIGN16( byte min[4] ); + ALIGN16( byte max[4] ); + + assert( width >= 4 && ( width & 3 ) == 0 ); + assert( height >= 4 && ( height & 3 ) == 0 ); + + this->width = width; + this->height = height; + this->outData = outBuf; + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + + ExtractBlock( inBuf + i * 4, width, block ); + + GetMinMaxBBox( block, min, max ); + InsetNormalsBBox3Dc( min, max ); + + // Write out an alpha channel. + EmitByte( max[0] ); + EmitByte( min[0] ); + EmitAlphaIndices( block, 0, min[0], max[0] ); + } + outData += dstPadding; + inBuf += srcPadding; + } +} + +/* +======================== +idDxtEncoder::CompressNormalMapDXN2Fast_Generic + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::CompressNormalMapDXN2Fast_Generic( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte block[64] ); + ALIGN16( byte normal1[4] ); + ALIGN16( byte normal2[4] ); + + assert( width >= 4 && ( width & 3 ) == 0 ); + assert( height >= 4 && ( height & 3 ) == 0 ); + + this->width = width; + this->height = height; + this->outData = outBuf; + + for ( int j = 0; j < height; j += 4, inBuf += width * 4*4 ) { + for ( int i = 0; i < width; i += 4 ) { + + ExtractBlock( inBuf + i * 4, width, block ); + + GetMinMaxBBox( block, normal1, normal2 ); + InsetNormalsBBox3Dc( normal1, normal2 ); + + // Write out Nx as an alpha channel. + EmitByte( normal2[0] ); + EmitByte( normal1[0] ); + EmitAlphaIndices( block, 0, normal1[0], normal2[0] ); + + // Write out Ny as an alpha channel. + EmitByte( normal2[1] ); + EmitByte( normal1[1] ); + EmitAlphaIndices( block, 1, normal1[1], normal2[1] ); + } + outData += dstPadding; + inBuf += srcPadding; + } +} + +/* +======================== +idDxtEncoder::DecodeDXNAlphaValues +======================== +*/ +void idDxtEncoder::DecodeDXNAlphaValues( const byte *inBuf, byte *values ) { + int i; + unsigned int indices; + byte alphas[8]; + + if ( inBuf[0] <= inBuf[1] ) { + alphas[0] = inBuf[0]; + alphas[1] = inBuf[1]; + alphas[2] = ( 4 * alphas[0] + 1 * alphas[1] ) / 5; + alphas[3] = ( 3 * alphas[0] + 2 * alphas[1] ) / 5; + alphas[4] = ( 2 * alphas[0] + 3 * alphas[1] ) / 5; + alphas[5] = ( 1 * alphas[0] + 4 * alphas[1] ) / 5; + alphas[6] = 0; + alphas[7] = 255; + } else { + alphas[0] = inBuf[0]; + alphas[1] = inBuf[1]; + alphas[2] = ( 6 * alphas[0] + 1 * alphas[1] ) / 7; + alphas[3] = ( 5 * alphas[0] + 2 * alphas[1] ) / 7; + alphas[4] = ( 4 * alphas[0] + 3 * alphas[1] ) / 7; + alphas[5] = ( 3 * alphas[0] + 4 * alphas[1] ) / 7; + alphas[6] = ( 2 * alphas[0] + 5 * alphas[1] ) / 7; + alphas[7] = ( 1 * alphas[0] + 6 * alphas[1] ) / 7; + } + + indices = (int)inBuf[2] | ( (int)inBuf[3] << 8 ) | ( (int)inBuf[4] << 16 ); + for ( i = 0; i < 8; i++ ) { + values[i] = alphas[indices & 7]; + indices >>= 3; + } + + indices = (int)inBuf[5] | ( (int)inBuf[6] << 8 ) | ( (int)inBuf[7] << 16 ); + for ( i = 8; i < 16; i++ ) { + values[i] = alphas[indices & 7]; + indices >>= 3; + } +} + +/* +======================== +idDxtEncoder::EncodeNormalRGBIndices + +params: values - 16 normal block for which to find normal Y indices +paramO: min - Min grayscale value +paramO: max - Max grayscale value +======================== +*/ +void idDxtEncoder::EncodeNormalRGBIndices( byte *outBuf, const byte min, const byte max, const byte *values ) { + + const int COLOR_RANGE = 3; + + byte maskedMin, maskedMax, mid, yb1, yb2, yb3; + + maskedMax = max & C565_6_MASK; + maskedMin = min & C565_6_MASK; + mid = ( maskedMax - maskedMin ) / ( 2 * COLOR_RANGE ); + + yb1 = maskedMax - mid; + yb2 = ( 2 * maskedMax + 1 * maskedMin ) / COLOR_RANGE - mid; + yb3 = ( 1 * maskedMax + 2 * maskedMin ) / COLOR_RANGE - mid; + + unsigned int result = 0; + + for ( int i = 15; i >= 0; i-- ) { + result <<= 2; + byte y = values[i]; + int b1 = ( y >= yb1 ); + int b2 = ( y >= yb2 ); + int b3 = ( y >= yb3 ); + int index = ( 4 - b1 - b2 - b3 ) & 3; + index ^= ( 2 > index ); + result |= index; + } + + unsigned short maskedMax5 = (max & C565_5_MASK) >> 3; + unsigned short maskedMin5 = (min & C565_5_MASK) >> 3; + + unsigned short smax = (maskedMax5 << 11) | (maskedMax << 3) | maskedMax5; + unsigned short smin = (maskedMin5 << 11) | (maskedMin << 3) | maskedMin5; + + outBuf[0] = byte( ( smax >> 0 ) & 0xFF ); + outBuf[1] = byte( ( smax >> 8 ) & 0xFF ); + outBuf[2] = byte( ( smin >> 0 ) & 0xFF ); + outBuf[3] = byte( ( smin >> 8 ) & 0xFF ); + + outBuf[4] = byte( ( result >> 0 ) & 0xFF ); + outBuf[5] = byte( ( result >> 8 ) & 0xFF ); + outBuf[6] = byte( ( result >> 16 ) & 0xFF ); + outBuf[7] = byte( ( result >> 24 ) & 0xFF ); +} + +/* +======================== +idDxtEncoder::ConvertNormalMapDXN2_DXT5 + +params: inBuf - normal map compressed in DXN2 format +paramO: outBuf - result of compression in DXT5 format +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::ConvertNormalMapDXN2_DXT5( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte values[16] ); + + this->width = width; + this->height = height; + this->outData = outBuf; + + if ( width > 4 && ( width & 3 ) != 0 ) { + return; + } + if ( height > 4 && ( height & 3 ) != 0 ) { + return; + } + + if ( width < 4 || height < 4 ) { + assert( 0 ); + return; + } + + for ( int j = 0; j < height; j += 4 ) { + for ( int i = 0; i < width; i += 4, inBuf += 16, outBuf += 16 ) { + + // decode normal Y stored as a DXT5 alpha channel + DecodeDXNAlphaValues( inBuf + 0, values ); + + // copy normal X + memcpy( outBuf + 0, inBuf + 8, 8 ); + + // get the min/max Y + byte minNormalY = 255; + byte maxNormalY = 0; + for ( int i = 0; i < 16; i++ ) { + if ( values[i] < minNormalY ) { + minNormalY = values[i]; + } + if ( values[i] > maxNormalY ) { + maxNormalY = values[i]; + } + } + + // encode normal Y into DXT5 color channels + EncodeNormalRGBIndices( outBuf + 8, minNormalY, maxNormalY, values ); + } + outData += dstPadding; + inBuf += srcPadding; + } +} + +/* +======================== +idDxtEncoder::DecodeNormalYValues +======================== +*/ +void idDxtEncoder::DecodeNormalYValues( const byte *inBuf, byte &min, byte &max, byte *values ) { + int i; + unsigned int indexes; + unsigned short normal0, normal1; + byte normalsY[4]; + + normal0 = inBuf[0] | (inBuf[1] << 8); + normal1 = inBuf[2] | (inBuf[3] << 8); + + assert( normal0 >= normal1 ); + + normalsY[0] = GreenFrom565( normal0 ); + normalsY[1] = GreenFrom565( normal1 ); + normalsY[2] = ( 2 * normalsY[0] + 1 * normalsY[1] ) / 3; + normalsY[3] = ( 1 * normalsY[0] + 2 * normalsY[1] ) / 3; + + indexes = (unsigned int)inBuf[4] | ((unsigned int)inBuf[5]<<8) | ((unsigned int)inBuf[6]<<16) | ((unsigned int)inBuf[7]<<24); + for ( i = 0; i < 16; i++ ) { + values[i] = normalsY[indexes & 3]; + indexes >>= 2; + } + + max = normalsY[0]; + min = normalsY[1]; +} + +/* +======================== +idDxtEncoder::EncodeDXNAlphaValues +======================== +*/ +void idDxtEncoder::EncodeDXNAlphaValues( byte *outBuf, const byte min, const byte max, const byte *values ) { + int i; + byte alphas[8]; + int j; + unsigned int indexes[16]; + + alphas[0] = max; + alphas[1] = min; + alphas[2] = ( 6 * alphas[0] + 1 * alphas[1] ) / 7; + alphas[3] = ( 5 * alphas[0] + 2 * alphas[1] ) / 7; + alphas[4] = ( 4 * alphas[0] + 3 * alphas[1] ) / 7; + alphas[5] = ( 3 * alphas[0] + 4 * alphas[1] ) / 7; + alphas[6] = ( 2 * alphas[0] + 5 * alphas[1] ) / 7; + alphas[7] = ( 1 * alphas[0] + 6 * alphas[1] ) / 7; + + int error = 0; + for ( i = 0; i < 16; i++ ) { + int minDist = MAX_TYPE( int ); + byte a = values[i]; + for ( j = 0; j < 8; j++ ) { + int dist = AlphaDistance( a, alphas[j] ); + if ( dist < minDist ) { + minDist = dist; + indexes[i] = j; + } + } + error += minDist; + } + + outBuf[0] = max; + outBuf[1] = min; + + outBuf[2] = byte( (indexes[ 0] >> 0) | (indexes[ 1] << 3) | (indexes[ 2] << 6) ); + outBuf[3] = byte( (indexes[ 2] >> 2) | (indexes[ 3] << 1) | (indexes[ 4] << 4) | (indexes[ 5] << 7) ); + outBuf[4] = byte( (indexes[ 5] >> 1) | (indexes[ 6] << 2) | (indexes[ 7] << 5) ); + + outBuf[5] = byte( (indexes[ 8] >> 0) | (indexes[ 9] << 3) | (indexes[10] << 6) ); + outBuf[6] = byte( (indexes[10] >> 2) | (indexes[11] << 1) | (indexes[12] << 4) | (indexes[13] << 7) ); + outBuf[7] = byte( (indexes[13] >> 1) | (indexes[14] << 2) | (indexes[15] << 5) ); +} + +/* +======================== +idDxtEncoder::ConvertNormalMapDXT5_DXN2 + +params: inBuf - image to compress +paramO: outBuf - result of compression +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::ConvertNormalMapDXT5_DXN2( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte values[16] ); + byte minNormalY, maxNormalY; + + this->width = width; + this->height = height; + this->outData = outBuf; + + if ( width > 4 && ( width & 3 ) != 0 ) { + return; + } + if ( height > 4 && ( height & 3 ) != 0 ) { + return; + } + + if ( width < 4 || height < 4 ) { + assert( 0 ); + return; + } + + for ( int j = 0; j < height; j += 4 ) { + for ( int i = 0; i < width; i += 4, inBuf += 16, outBuf += 16 ) { + + // decode normal Y stored as a DXT5 alpha channel + DecodeNormalYValues( inBuf + 8, minNormalY, maxNormalY, values ); + + memcpy( outBuf + 8, inBuf + 0, 8 ); + + // encode normal Y into DXT5 green channel + EncodeDXNAlphaValues( outBuf + 0, minNormalY, maxNormalY, values ); + } + outData += dstPadding; + inBuf += srcPadding; + } +} + +/* +======================== +idDxtEncoder::ConvertImageDXN1_DXT1 + +params: inBuf - normal map compressed in DXN1 format +paramO: outBuf - result of compression in DXT1 format +params: width - width of image +params: height - height of image +======================== +*/ +void idDxtEncoder::ConvertImageDXN1_DXT1( const byte *inBuf, byte *outBuf, int width, int height ) { + ALIGN16( byte values[16] ); + + this->width = width; + this->height = height; + this->outData = outBuf; + + if ( width > 4 && ( width & 3 ) != 0 ) { + return; + } + if ( height > 4 && ( height & 3 ) != 0 ) { + return; + } + + if ( width < 4 || height < 4 ) { + assert( 0 ); + return; + } + + for ( int j = 0; j < height; j += 4 ) { + for ( int i = 0; i < width; i += 4, inBuf += 8, outBuf += 8 ) { + + // decode single channel stored as a DXT5 alpha channel + DecodeDXNAlphaValues( inBuf + 0, values ); + + // get the min/max + byte min = 255; + byte max = 0; + for ( int i = 0; i < 16; i++ ) { + if ( values[i] < min ) { + min = values[i]; + } + if ( values[i] > max ) { + max = values[i]; + } + } + + // encode single channel into DXT1 + EncodeNormalRGBIndices( outBuf + 0, min, max, values ); + } + outData += dstPadding; + inBuf += srcPadding; + } +} diff --git a/src/renderer/GuiModel.cpp b/src/renderer/GuiModel.cpp index 55d5b383..4db1196c 100644 --- a/src/renderer/GuiModel.cpp +++ b/src/renderer/GuiModel.cpp @@ -264,7 +264,7 @@ void idGuiModel::EmitFullScreen( void ) { viewDef->floatTime = tr.frameShaderTime; - // qglOrtho( 0, 640, 480, 0, 0, 1 ); // always assume 640x480 virtual coordinates + // glOrtho( 0, 640, 480, 0, 0, 1 ); // always assume 640x480 virtual coordinates viewDef->projectionMatrix[0] = 2.0f / 640.0f; viewDef->projectionMatrix[5] = -2.0f / 480.0f; viewDef->projectionMatrix[10] = -2.0f / 1.0f; diff --git a/src/renderer/Image.h b/src/renderer/Image.h index c6451129..f911c4f1 100644 --- a/src/renderer/Image.h +++ b/src/renderer/Image.h @@ -1,25 +1,25 @@ /* =========================================================================== -Doom 3 GPL Source Code -Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. -This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?). +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). -Doom 3 Source Code is free software: you can redistribute it and/or modify +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. -Doom 3 Source Code is distributed in the hope that it will be useful, +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with Doom 3 Source Code. If not, see . +along with Doom 3 BFG Edition Source Code. If not, see . -In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below. +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. @@ -31,109 +31,30 @@ If you have questions concerning this license or the applicable additional terms IMAGE -idImage have a one to one correspondance with OpenGL textures. +idImage have a one to one correspondance with GL/DX/GCM textures. No texture is ever used that does not have a corresponding idImage. -no code outside this unit should call any of these OpenGL functions: - -qglGenTextures -qglDeleteTextures -qglBindTexture - -qglTexParameter - -qglTexImage -qglTexSubImage - -qglCopyTexImage -qglCopyTexSubImage - -qglEnable( GL_TEXTURE_* ) -qglDisable( GL_TEXTURE_* ) - ==================================================================== */ -typedef enum { - IS_UNLOADED, // no gl texture number - IS_PARTIAL, // has a texture number and the low mip levels loaded - IS_LOADED // has a texture number and the full mip hierarchy -} imageState_t; - static const int MAX_TEXTURE_LEVELS = 14; -// surface description flags -const unsigned long DDSF_CAPS = 0x00000001l; -const unsigned long DDSF_HEIGHT = 0x00000002l; -const unsigned long DDSF_WIDTH = 0x00000004l; -const unsigned long DDSF_PITCH = 0x00000008l; -const unsigned long DDSF_PIXELFORMAT = 0x00001000l; -const unsigned long DDSF_MIPMAPCOUNT = 0x00020000l; -const unsigned long DDSF_LINEARSIZE = 0x00080000l; -const unsigned long DDSF_DEPTH = 0x00800000l; - -// pixel format flags -const unsigned long DDSF_ALPHAPIXELS = 0x00000001l; -const unsigned long DDSF_FOURCC = 0x00000004l; -const unsigned long DDSF_RGB = 0x00000040l; -const unsigned long DDSF_RGBA = 0x00000041l; - -// our extended flags -const unsigned long DDSF_ID_INDEXCOLOR = 0x10000000l; -const unsigned long DDSF_ID_MONOCHROME = 0x20000000l; - -// dwCaps1 flags -const unsigned long DDSF_COMPLEX = 0x00000008l; -const unsigned long DDSF_TEXTURE = 0x00001000l; -const unsigned long DDSF_MIPMAP = 0x00400000l; - -#define DDS_MAKEFOURCC(a, b, c, d) ((a) | ((b) << 8) | ((c) << 16) | ((d) << 24)) - -typedef struct { - unsigned long dwSize; - unsigned long dwFlags; - unsigned long dwFourCC; - unsigned long dwRGBBitCount; - unsigned long dwRBitMask; - unsigned long dwGBitMask; - unsigned long dwBBitMask; - unsigned long dwABitMask; -} ddsFilePixelFormat_t; - -typedef struct -{ - unsigned long dwSize; - unsigned long dwFlags; - unsigned long dwHeight; - unsigned long dwWidth; - unsigned long dwPitchOrLinearSize; - unsigned long dwDepth; - unsigned long dwMipMapCount; - unsigned long dwReserved1[11]; - ddsFilePixelFormat_t ddspf; - unsigned long dwCaps1; - unsigned long dwCaps2; - unsigned long dwReserved2[3]; -} ddsFileHeader_t; - - -// increasing numeric values imply more information is stored +// How is this texture used? Determines the storage and color format typedef enum { TD_SPECULAR, // may be compressed, and always zeros the alpha channel TD_DIFFUSE, // may be compressed - TD_DEFAULT, // will use compressed formats when possible + TD_DEFAULT, // generic RGBA texture (particles, etc...) TD_BUMP, // may be compressed with 8 bit lookup - TD_HIGH_QUALITY // either 32 bit or a component format, no loss at all -} textureDepth_t; - -typedef enum { - TT_DISABLED, - TT_2D, - TT_3D, - TT_CUBIC, - TT_RECT -} textureType_t; + TD_FONT, // Font image + TD_LIGHT, // Light image + TD_LOOKUP_TABLE_MONO, // Mono lookup table (including alpha) + TD_LOOKUP_TABLE_ALPHA, // Alpha lookup table with a white color channel + TD_LOOKUP_TABLE_RGB1, // RGB lookup table with a solid white alpha + TD_LOOKUP_TABLE_RGBA, // RGBA lookup table + TD_COVERAGE, // coverage map for fill depth pass when YCoCG is used + TD_DEPTH, // depth buffer copy for motion blur +} textureUsage_t; typedef enum { CF_2D, // not a cube map @@ -141,46 +62,38 @@ typedef enum { CF_CAMERA // _forward, _back, etc, rotated and flipped as needed before sending to GL } cubeFiles_t; +#include "ImageOpts.h" +#include "BinaryImage.h" + #define MAX_IMAGE_NAME 256 class idImage { public: - idImage(); + idImage(const char* name); + + const char* GetName() const { return imgName; } // Makes this image active on the current GL texture unit. - // automatically enables or disables cube mapping or texture3D + // automatically enables or disables cube mapping // May perform file loading if the image was not preloaded. - // May start a background image read. void Bind(); - // for use with fragment programs, doesn't change any enable2D/3D/cube states - void BindFragment(); - - // deletes the texture object, but leaves the structure so it can be reloaded - void PurgeImage(); + // Should be called at least once + void SetSamplerState(textureFilter_t tf, textureRepeat_t tr); // used by callback functions to specify the actual data // data goes from the bottom to the top line of the image, as OpenGL expects it // These perform an implicit Bind() on the current texture unit // FIXME: should we implement cinematics this way, instead of with explicit calls? - void GenerateImage( const byte *pic, int width, int height, - textureFilter_t filter, bool allowDownSize, - textureRepeat_t repeat, textureDepth_t depth ); - void Generate3DImage( const byte *pic, int width, int height, int depth, - textureFilter_t filter, bool allowDownSize, - textureRepeat_t repeat, textureDepth_t minDepth ); - void GenerateCubeImage( const byte *pic[6], int size, - textureFilter_t filter, bool allowDownSize, - textureDepth_t depth ); + void GenerateImage(const byte* pic, int width, int height, + textureFilter_t filter, textureRepeat_t repeat, textureUsage_t usage); + void GenerateCubeImage(const byte* pic[6], int size, + textureFilter_t filter, textureUsage_t usage); - void CopyFramebuffer( int x, int y, int width, int height, bool useOversizedBuffer ); + void CopyFramebuffer(int x, int y, int width, int height); + void CopyDepthbuffer(int x, int y, int width, int height); - void CopyDepthbuffer( int x, int y, int width, int height ); - - void UploadScratch( const byte *pic, int width, int height ); - - // just for resource tracking - void SetClassification( int tag ); + void UploadScratch(const byte* pic, int width, int height); // estimates size of the GL image based on dimensions and storage type int StorageSize() const; @@ -189,115 +102,130 @@ class idImage { void Print() const; // check for changed timestamp on disk and reload if necessary - void Reload( bool checkPrecompressed, bool force ); + void Reload(bool force); - void AddReference() { refCount++; }; + void AddReference() { refCount++; }; -//========================================================== - - void GetDownsize( int &scaled_width, int &scaled_height ) const; void MakeDefault(); // fill with a grid pattern - void SetImageFilterAndRepeat() const; - bool ShouldImageBePartialCached(); - void WritePrecompressedImage(); - bool CheckPrecompressedImage( bool fullLoad ); - void UploadPrecompressedImage( byte *data, int len ); - void ActuallyLoadImage( bool checkForPrecompressed, bool fromBackEnd ); - void StartBackgroundImageLoad(); - int BitsForInternalFormat( int internalFormat ) const; - void UploadCompressedNormalMap( int width, int height, const byte *rgba, int mipLevel ); - GLenum SelectInternalFormat( const byte **dataPtrs, int numDataPtrs, int width, int height, - textureDepth_t minimumDepth, bool *monochromeResult ) const; - void ImageProgramStringToCompressedFileName( const char *imageProg, char *fileName ) const; - int NumLevelsForImageSize( int width, int height ) const; - - // data commonly accessed is grouped here - static const int TEXTURE_NOT_LOADED = -1; - GLuint texnum; // gl texture binding, will be TEXTURE_NOT_LOADED if not loaded - textureType_t type; - int frameUsed; // for texture usage in frame statistics - int bindCount; // incremented each bind - - // background loading information - idImage *partialImage; // shrunken, space-saving version - bool isPartialImage; // true if this is pointed to by another image - bool backgroundLoadInProgress; // true if another thread is reading the complete d3t file - backgroundDownload_t bgl; - idImage * bglNext; // linked from tr.backgroundImageLoads + + const idImageOpts& GetOpts() const { return opts; } + int GetUploadWidth() const { return opts.width; } + int GetUploadHeight() const { return opts.height; } + + void SetReferencedOutsideLevelLoad() { referencedOutsideLevelLoad = true; } + void SetReferencedInsideLevelLoad() { levelLoadReferenced = true; } + void ActuallyLoadImage(bool fromBackEnd); + //--------------------------------------------- + // Platform specific implementations + //--------------------------------------------- + + void AllocImage(const idImageOpts& imgOpts, textureFilter_t filter, textureRepeat_t repeat); + + // Deletes the texture object, but leaves the structure so it can be reloaded + // or resized. + void PurgeImage(); + + // z is 0 for 2D textures, 0 - 5 for cube maps, and 0 - uploadDepth for 3D textures. Only + // one plane at a time of 3D textures can be uploaded. The data is assumed to be correct for + // the format, either bytes, halfFloats, floats, or DXT compressed. The data is assumed to + // be in OpenGL RGBA format, the consoles may have to reorganize. pixelPitch is only needed + // when updating from a source subrect. Width, height, and dest* are always in pixels, so + // they must be a multiple of four for dxt data. + void SubImageUpload(int mipLevel, int destX, int destY, int destZ, + int width, int height, const void* data, + int pixelPitch = 0) const; + + // SetPixel is assumed to be a fast memory write on consoles, degenerating to a + // SubImageUpload on PCs. Used to update the page mapping images. + // We could remove this now, because the consoles don't use the intermediate page mapping + // textures now that they can pack everything into the virtual page table images. + void SetPixel(int mipLevel, int x, int y, const void* data, int dataSize); + + // some scratch images are dynamically resized based on the display window size. This + // simply purges the image and recreates it if the sizes are different, so it should not be + // done under any normal circumstances, and probably not at all on consoles. + void Resize(int width, int height); + + bool IsCompressed() const { return (opts.format == FMT_DXT1 || opts.format == FMT_DXT5); } + + void SetTexParameters(); // update aniso and trilinear + + bool IsLoaded() const { return texnum != TEXTURE_NOT_LOADED; } + + static void GetGeneratedName(idStr& _name, const textureUsage_t& _usage, const cubeFiles_t& _cube); + +private: + friend class idImageManager; + + void AllocImage(); + void DeriveOpts(); // parameters that define this image idStr imgName; // game path, including extension (except for cube maps), may be an image program - void (*generatorFunction)( idImage *image ); // NULL for files - bool allowDownSize; // this also doubles as a don't-partially-load flag + cubeFiles_t cubeFiles; // If this is a cube map, and if so, what kind + void (*generatorFunction)(idImage* image); // NULL for files + textureUsage_t usage; // Used to determine the type of compression to use + idImageOpts opts; // Parameters that determine the storage method + + // Sampler settings textureFilter_t filter; textureRepeat_t repeat; - textureDepth_t depth; - cubeFiles_t cubeFiles; // determines the naming and flipping conventions for the six images bool referencedOutsideLevelLoad; bool levelLoadReferenced; // for determining if it needs to be purged - bool precompressedFile; // true when it was loaded from a .d3t file bool defaulted; // true if the default image was generated because a file couldn't be loaded - bool isMonochrome; // so the NV20 path can use a reduced pass count - ID_TIME_T timestamp; // the most recent of all images used in creation, for reloadImages command + ID_TIME_T sourceFileTime; // the most recent of all images used in creation, for reloadImages command + ID_TIME_T binaryFileTime; // the time stamp of the binary file - int imageHash; // for identical-image checking + int refCount; // overall ref count - int classification; // just for resource profiling + static const GLuint TEXTURE_NOT_LOADED = 0xFFFFFFFF; - // data for listImages - int uploadWidth, uploadHeight, uploadDepth; // after power of two, downsample, and MAX_TEXTURE_SIZE - int internalFormat; + GLuint texnum; // gl texture binding - idImage *cacheUsagePrev, *cacheUsageNext; // for dynamic cache purging of old images + // we could derive these in subImageUpload each time if necessary + GLuint internalFormat; + GLuint dataFormat; + GLuint dataType; - idImage * hashNext; // for hash chains to speed lookup - int refCount; // overall ref count }; -ID_INLINE idImage::idImage() { +ID_INLINE idImage::idImage(const char* name) : imgName(name) { texnum = TEXTURE_NOT_LOADED; - partialImage = NULL; - type = TT_DISABLED; - isPartialImage = false; - frameUsed = 0; - classification = 0; - backgroundLoadInProgress = false; - bgl.opcode = DLTYPE_FILE; - bgl.f = NULL; - bglNext = NULL; - imgName[0] = '\0'; + internalFormat = 0; + dataFormat = 0; + dataType = 0; generatorFunction = NULL; - allowDownSize = false; filter = TF_DEFAULT; repeat = TR_REPEAT; - depth = TD_DEFAULT; + usage = TD_DEFAULT; cubeFiles = CF_2D; + referencedOutsideLevelLoad = false; levelLoadReferenced = false; - precompressedFile = false; defaulted = false; - timestamp = 0; - bindCount = 0; - uploadWidth = uploadHeight = uploadDepth = 0; - internalFormat = 0; - cacheUsagePrev = cacheUsageNext = NULL; - hashNext = NULL; - isMonochrome = false; + sourceFileTime = FILE_NOT_FOUND_TIMESTAMP; + binaryFileTime = FILE_NOT_FOUND_TIMESTAMP; refCount = 0; } // data is RGBA -void R_WriteTGA( const char *filename, const byte *data, int width, int height, bool flipVertical = false ); -// data is an 8 bit index into palette, which is RGB (no A) -void R_WritePalTGA( const char *filename, const byte *data, const byte *palette, int width, int height, bool flipVertical = false ); +void R_WriteTGA(const char* filename, const byte* data, int width, int height, bool flipVertical = false, const char* basePath = "fs_savepath"); // data is in top-to-bottom raster order unless flipVertical is set + class idImageManager { public: + + idImageManager() + { + insideLevelLoad = false; + preloadingMapImages = false; + } + void Init(); void Shutdown(); @@ -307,144 +235,95 @@ class idImageManager { // if possible, because it will cause a second copy to be loaded. // If the load fails for any reason, the image will be filled in with the default // grid pattern. - // Will automatically resample non-power-of-two images and execute image programs if needed. - idImage * ImageFromFile( const char *name, - textureFilter_t filter, bool allowDownSize, - textureRepeat_t repeat, textureDepth_t depth, cubeFiles_t cubeMap = CF_2D ); + // Will automatically execute image programs if needed. + idImage* ImageFromFile(const char* name, + textureFilter_t filter, textureRepeat_t repeat, textureUsage_t usage, cubeFiles_t cubeMap = CF_2D); + + // look for a loaded image, whatever the parameters + idImage* GetImage(const char* name) const; // look for a loaded image, whatever the parameters - idImage * GetImage( const char *name ) const; + idImage* GetImageWithParameters(const char* name, textureFilter_t filter, textureRepeat_t repeat, textureUsage_t usage, cubeFiles_t cubeMap) const; // The callback will be issued immediately, and later if images are reloaded or vid_restart // The callback function should call one of the idImage::Generate* functions to fill in the data - idImage * ImageFromFunction( const char *name, void (*generatorFunction)( idImage *image )); + idImage* ImageFromFunction(const char* name, void (*generatorFunction)(idImage* image)); - // called once a frame to allow any background loads that have been completed - // to turn into textures. - void CompleteBackgroundImageLoads(); - - // returns the number of bytes of image data bound in the previous frame - int SumOfUsedImages(); - - // called each frame to allow some cvars to automatically force changes - void CheckCvars(); + // scratch images are for internal renderer use. ScratchImage names should always begin with an underscore + idImage* ScratchImage(const char* name, idImageOpts* imgOpts, textureFilter_t filter, textureRepeat_t repeat, textureUsage_t usage); // purges all the images before a vid_restart void PurgeAllImages(); // reloads all apropriate images after a vid_restart - void ReloadAllImages(); + void ReloadImages(bool all); + + // unbind all textures from all texture units + void UnbindAll(); // disable the active texture unit void BindNull(); - // Mark all file based images as currently unused, - // but don't free anything. Calls to ImageFromFile() will - // either mark the image as used, or create a new image without - // loading the actual data. // Called only by renderSystem::BeginLevelLoad void BeginLevelLoad(); - // Free all images marked as unused, and load all images that are necessary. - // This architecture prevents us from having the union of two level's - // worth of data present at one time. // Called only by renderSystem::EndLevelLoad void EndLevelLoad(); + //void Preload(const idPreloadManifest& manifest, const bool& mapPreload); + + // Loads unloaded level images + int LoadLevelImages(bool pacifier); + // used to clear and then write the dds conversion batch file void StartBuild(); - void FinishBuild( bool removeDups = false ); - void AddDDSCommand( const char *cmd ); - - void PrintMemInfo( MemInfo_t *mi ); - - // cvars - static idCVar image_roundDown; // round bad sizes down to nearest power of two - static idCVar image_colorMipLevels; // development aid to see texture mip usage - static idCVar image_downSize; // controls texture downsampling - static idCVar image_useCompression; // 0 = force everything to high quality - static idCVar image_filter; // changes texture filtering on mipmapped images - static idCVar image_anisotropy; // set the maximum texture anisotropy if available - static idCVar image_lodbias; // change lod bias on mipmapped images - static idCVar image_useAllFormats; // allow alpha/intensity/luminance/luminance+alpha - static idCVar image_usePrecompressedTextures; // use .dds files if present - static idCVar image_writePrecompressedTextures; // write .dds files if necessary - static idCVar image_writeNormalTGA; // debug tool to write out .tgas of the final normal maps - static idCVar image_writeNormalTGAPalletized; // debug tool to write out palletized versions of the final normal maps - static idCVar image_writeTGA; // debug tool to write out .tgas of the non normal maps - static idCVar image_useNormalCompression; // 1 = use 256 color compression for normal maps if available, 2 = use rxgb compression - static idCVar image_useOffLineCompression; // will write a batch file with commands for the offline compression - static idCVar image_preload; // if 0, dynamically load all images - static idCVar image_cacheMinK; // maximum K of precompressed files to read at specification time, - // the remainder will be dynamically cached - static idCVar image_cacheMegs; // maximum bytes set aside for temporary loading of full-sized precompressed images - static idCVar image_useCache; // 1 = do background load image caching - static idCVar image_showBackgroundLoads; // 1 = print number of outstanding background loads - static idCVar image_forceDownSize; // allows the ability to force a downsize - static idCVar image_downSizeSpecular; // downsize specular - static idCVar image_downSizeSpecularLimit;// downsize specular limit - static idCVar image_downSizeBump; // downsize bump maps - static idCVar image_downSizeBumpLimit; // downsize bump limit - static idCVar image_ignoreHighQuality; // ignore high quality on materials - static idCVar image_downSizeLimit; // downsize diffuse limit + void FinishBuild(bool removeDups = false); + + void PrintMemInfo(MemInfo_t* mi); // built-in images - idImage * defaultImage; - idImage * flatNormalMap; // 128 128 255 in all pixels - idImage * ambientNormalMap; // tr.ambientLightVector encoded in all pixels - idImage * rampImage; // 0-255 in RGBA in S - idImage * alphaRampImage; // 0-255 in alpha, 255 in RGB - idImage * alphaNotchImage; // 2x1 texture with just 1110 and 1111 with point sampling - idImage * whiteImage; // full of 0xff - idImage * blackImage; // full of 0x00 - idImage * normalCubeMapImage; // cube map to normalize STR into RGB - idImage * noFalloffImage; // all 255, but zero clamped - idImage * fogImage; // increasing alpha is denser fog - idImage * fogEnterImage; // adjust fogImage alpha based on terminator plane - idImage * cinematicImage; - idImage * scratchImage; - idImage * scratchImage2; - idImage * accumImage; - idImage * currentRenderImage; // for SS_POST_PROCESS shaders - idImage * scratchCubeMapImage; - idImage * specularTableImage; // 1D intensity texture with our specular function - idImage * specular2DTableImage; // 2D intensity texture with our specular function with variable specularity - idImage * borderClampImage; // white inside, black outside + void CreateIntrinsicImages(); + idImage* defaultImage; + idImage* flatNormalMap; // 128 128 255 in all pixels + idImage* alphaNotchImage; // 2x1 texture with just 1110 and 1111 with point sampling + idImage* whiteImage; // full of 0xff + idImage* blackImage; // full of 0x00 + idImage* noFalloffImage; // all 255, but zero clamped + idImage* fogImage; // increasing alpha is denser fog + idImage* fogEnterImage; // adjust fogImage alpha based on terminator plane + idImage* scratchImage; + idImage* scratchImage2; + idImage* accumImage; + idImage* currentRenderImage; // for SS_POST_PROCESS shaders + idImage* currentDepthImage; // for motion blur + idImage* originalCurrentRenderImage; // currentRenderImage before any changes for stereo rendering + idImage* loadingIconImage; // loading icon must exist always + idImage* hellLoadingIconImage; // loading icon must exist always + idImage* cinematicImage; + idImage* ambientNormalMap; + idImage* specularTableImage; + idImage* normalCubeMapImage; + idImage* borderClampImage; + idImage* rampImage; + idImage* alphaRampImage; //-------------------------------------------------------- - - idImage * AllocImage( const char *name ); - void SetNormalPalette(); - void ChangeTextureFilter(); - idList images; - idStrList ddsList; - idHashIndex ddsHash; + idImage* AllocImage(const char* name); + idImage* AllocStandaloneImage(const char* name); - bool insideLevelLoad; // don't actually load images now - - byte originalToCompressed[256]; // maps normal maps to 8 bit textures - byte compressedPalette[768]; // the palette that normal maps use - - // default filter modes for images - GLenum textureMinFilter; - GLenum textureMaxFilter; - float textureAnisotropy; - float textureLODBias; + bool ExcludePreloadImage(const char* name); - idImage * imageHashTable[FILE_HASH_SIZE]; - - idImage * backgroundImageLoads; // chain of images that have background file loads active - idImage cacheLRU; // head/tail of doubly linked list - int totalCachedImageSize; // for determining when something should be purged + idList images; + idHashIndex imageHash; - int numActiveBackgroundImageLoads; - const static int MAX_BACKGROUND_IMAGE_LOADS = 8; + bool insideLevelLoad; // don't actually load images now + bool preloadingMapImages; // unless this is set }; -extern idImageManager *globalImages; // pointer to global list for the rest of the system +extern idImageManager* globalImages; // pointer to global list for the rest of the system -int MakePowerOfTwo( int num ); +int MakePowerOfTwo(int num); /* ==================================================================== @@ -455,21 +334,17 @@ FIXME: make an "imageBlock" type to hold byte*,width,height? ==================================================================== */ -byte *R_Dropsample( const byte *in, int inwidth, int inheight, - int outwidth, int outheight ); -byte *R_ResampleTexture( const byte *in, int inwidth, int inheight, - int outwidth, int outheight ); -byte *R_MipMapWithAlphaSpecularity( const byte *in, int width, int height ); -byte *R_MipMap( const byte *in, int width, int height, bool preserveBorder ); -byte *R_MipMap3D( const byte *in, int width, int height, int depth, bool preserveBorder ); +byte* R_Dropsample(const byte* in, int inwidth, int inheight, int outwidth, int outheight); +byte* R_ResampleTexture(const byte* in, int inwidth, int inheight, int outwidth, int outheight); +byte* R_MipMapWithAlphaSpecularity(const byte* in, int width, int height); +byte* R_MipMapWithGamma(const byte* in, int width, int height); +byte* R_MipMap(const byte* in, int width, int height); // these operate in-place on the provided pixels -void R_SetBorderTexels( byte *inBase, int width, int height, const byte border[4] ); -void R_SetBorderTexels3D( byte *inBase, int width, int height, int depth, const byte border[4] ); -void R_BlendOverTexture( byte *data, int pixelCount, const byte blend[4] ); -void R_HorizontalFlip( byte *data, int width, int height ); -void R_VerticalFlip( byte *data, int width, int height ); -void R_RotatePic( byte *data, int width ); +void R_BlendOverTexture(byte* data, int pixelCount, const byte blend[4]); +void R_HorizontalFlip(byte* data, int width, int height); +void R_VerticalFlip(byte* data, int width, int height); +void R_RotatePic(byte* data, int width); /* ==================================================================== @@ -479,9 +354,9 @@ IMAGEFILES ==================================================================== */ -void R_LoadImage( const char *name, byte **pic, int *width, int *height, ID_TIME_T *timestamp, bool makePowerOf2 ); +void R_LoadImage(const char* name, byte** pic, int* width, int* height, ID_TIME_T* timestamp, bool makePowerOf2); // pic is in top to bottom raster format -bool R_LoadCubeImages( const char *cname, cubeFiles_t extensions, byte *pic[6], int *size, ID_TIME_T *timestamp ); +bool R_LoadCubeImages(const char* cname, cubeFiles_t extensions, byte* pic[6], int* size, ID_TIME_T* timestamp); /* ==================================================================== @@ -491,6 +366,6 @@ IMAGEPROGRAM ==================================================================== */ -void R_LoadImageProgram( const char *name, byte **pic, int *width, int *height, ID_TIME_T *timestamp, textureDepth_t *depth = NULL ); -const char *R_ParsePastImageProgram( idLexer &src ); +void R_LoadImageProgram(const char* name, byte** pic, int* width, int* height, ID_TIME_T* timestamp, textureUsage_t* usage = NULL); +const char* R_ParsePastImageProgram(idLexer& src); diff --git a/src/renderer/ImageManager.cpp b/src/renderer/ImageManager.cpp new file mode 100644 index 00000000..1cb8d08a --- /dev/null +++ b/src/renderer/ImageManager.cpp @@ -0,0 +1,860 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ + +#pragma hdrstop +#include "precompiled.h" + + +#include "tr_local.h" + +// do this with a pointer, in case we want to make the actual manager +// a private virtual subclass +idImageManager imageManager; +idImageManager * globalImages = &imageManager; + +idCVar preLoad_Images( "preLoad_Images", "1", CVAR_SYSTEM | CVAR_BOOL, "preload images during beginlevelload" ); + +/* +=============== +R_ReloadImages_f + +Regenerate all images that came directly from files that have changed, so +any saved changes will show up in place. + +New r_texturesize/r_texturedepth variables will take effect on reload + +reloadImages +=============== +*/ +void R_ReloadImages_f( const idCmdArgs &args ) { + bool all = false; + + if ( args.Argc() == 2 ) { + if ( !idStr::Icmp( args.Argv(1), "all" ) ) { + all = true; + } else { + common->Printf( "USAGE: reloadImages \n" ); + return; + } + } + + globalImages->ReloadImages( all ); +} + +typedef struct { + idImage *image; + int size; + int index; +} sortedImage_t; + +/* +======================= +R_QsortImageSizes + +======================= +*/ +static int R_QsortImageSizes( const void *a, const void *b ) { + const sortedImage_t *ea, *eb; + + ea = (sortedImage_t *)a; + eb = (sortedImage_t *)b; + + if ( ea->size > eb->size ) { + return -1; + } + if ( ea->size < eb->size ) { + return 1; + } + return idStr::Icmp( ea->image->GetName(), eb->image->GetName() ); +} + +/* +======================= +R_QsortImageName + +======================= +*/ +static int R_QsortImageName( const void* a, const void* b ) { + const sortedImage_t *ea, *eb; + + ea = (sortedImage_t *)a; + eb = (sortedImage_t *)b; + + return idStr::Icmp( ea->image->GetName(), eb->image->GetName() ); +} + +/* +=============== +R_ListImages_f +=============== +*/ +void R_ListImages_f( const idCmdArgs &args ) { + int i, partialSize; + idImage *image; + int totalSize; + int count = 0; + bool uncompressedOnly = false; + bool unloaded = false; + bool failed = false; + bool sorted = false; + bool duplicated = false; + bool overSized = false; + bool sortByName = false; + + if ( args.Argc() == 1 ) { + + } else if ( args.Argc() == 2 ) { + if ( idStr::Icmp( args.Argv( 1 ), "uncompressed" ) == 0 ) { + uncompressedOnly = true; + } else if ( idStr::Icmp( args.Argv( 1 ), "sorted" ) == 0 ) { + sorted = true; + } else if ( idStr::Icmp( args.Argv( 1 ), "namesort" ) == 0 ) { + sortByName = true; + } else if ( idStr::Icmp( args.Argv( 1 ), "unloaded" ) == 0 ) { + unloaded = true; + } else if ( idStr::Icmp( args.Argv( 1 ), "duplicated" ) == 0 ) { + duplicated = true; + } else if ( idStr::Icmp( args.Argv( 1 ), "oversized" ) == 0 ) { + sorted = true; + overSized = true; + } else { + failed = true; + } + } else { + failed = true; + } + + if ( failed ) { + common->Printf( "usage: listImages [ sorted | namesort | unloaded | duplicated | showOverSized ]\n" ); + return; + } + + const char *header = " -w-- -h-- filt -fmt-- wrap size --name-------\n"; + common->Printf( "\n%s", header ); + + totalSize = 0; + + sortedImage_t *sortedArray = (sortedImage_t *)alloca( sizeof( sortedImage_t ) * globalImages->images.Num() ); + + for ( i = 0 ; i < globalImages->images.Num() ; i++ ) { + image = globalImages->images[ i ]; + + if ( uncompressedOnly ) { + if ( image->IsCompressed() ) { + continue; + } + } + if ( unloaded == image->IsLoaded() ) { + continue; + } + + // only print duplicates (from mismatched wrap / clamp, etc) + if ( duplicated ) { + int j; + for ( j = i+1 ; j < globalImages->images.Num() ; j++ ) { + if ( idStr::Icmp( image->GetName(), globalImages->images[ j ]->GetName() ) == 0 ) { + break; + } + } + if ( j == globalImages->images.Num() ) { + continue; + } + } + + if ( sorted || sortByName ) { + sortedArray[count].image = image; + sortedArray[count].size = image->StorageSize(); + sortedArray[count].index = i; + } else { + common->Printf( "%4i:", i ); + image->Print(); + } + totalSize += image->StorageSize(); + count++; + } + + if ( sorted || sortByName ) { + if ( sortByName) { + qsort( sortedArray, count, sizeof( sortedImage_t ), R_QsortImageName ); + } else { + qsort( sortedArray, count, sizeof( sortedImage_t ), R_QsortImageSizes ); + } + partialSize = 0; + for ( i = 0 ; i < count ; i++ ) { + common->Printf( "%4i:", sortedArray[i].index ); + sortedArray[i].image->Print(); + partialSize += sortedArray[i].image->StorageSize(); + if ( ( (i+1) % 10 ) == 0 ) { + common->Printf( "-------- %5.1f of %5.1f megs --------\n", + partialSize / (1024*1024.0), totalSize / (1024*1024.0) ); + } + } + } + + common->Printf( "%s", header ); + common->Printf( " %i images (%i total)\n", count, globalImages->images.Num() ); + common->Printf( " %5.1f total megabytes of images\n\n\n", totalSize / (1024*1024.0) ); +} + +/* +============== +AllocImage + +Allocates an idImage, adds it to the list, +copies the name, and adds it to the hash chain. +============== +*/ +idImage *idImageManager::AllocImage( const char *name ) { + if (strlen(name) >= MAX_IMAGE_NAME ) { + common->Error ("idImageManager::AllocImage: \"%s\" is too long\n", name); + } + + int hash = idStr( name ).FileNameHash(); + + idImage * image = new idImage( name ); + + imageHash.Add( hash, images.Append( image ) ); + + return image; +} + +/* +============== +AllocStandaloneImage + +Allocates an idImage,does not add it to the list or hash chain + +============== +*/ +idImage *idImageManager::AllocStandaloneImage( const char *name ) { + if (strlen(name) >= MAX_IMAGE_NAME ) { + common->Error ("idImageManager::AllocImage: \"%s\" is too long\n", name); + } + + idImage * image = new idImage( name ); + + return image; +} + +/* +================== +ImageFromFunction + +Images that are procedurally generated are allways specified +with a callback which must work at any time, allowing the OpenGL +system to be completely regenerated if needed. +================== +*/ +idImage *idImageManager::ImageFromFunction( const char *_name, void (*generatorFunction)( idImage *image ) ) { + + // strip any .tga file extensions from anywhere in the _name + idStr name = _name; + name.Replace( ".tga", "" ); + name.BackSlashesToSlashes(); + + // see if the image already exists + int hash = name.FileNameHash(); + for ( int i = imageHash.First( hash ); i != -1; i = imageHash.Next( i ) ) { + idImage * image = images[i]; + if ( name.Icmp( image->GetName() ) == 0 ) { + if ( image->generatorFunction != generatorFunction ) { + common->DPrintf( "WARNING: reused image %s with mixed generators\n", name.c_str() ); + } + return image; + } + } + + // create the image and issue the callback + idImage * image = AllocImage( name ); + + image->generatorFunction = generatorFunction; + + // check for precompressed, load is from the front end + image->referencedOutsideLevelLoad = true; + image->ActuallyLoadImage( false ); + + return image; +} + + +/* +=============== +GetImageWithParameters +============== +*/ +idImage *idImageManager::GetImageWithParameters( const char *_name, textureFilter_t filter, textureRepeat_t repeat, textureUsage_t usage, cubeFiles_t cubeMap ) const { + if ( !_name || !_name[0] || idStr::Icmp( _name, "default" ) == 0 || idStr::Icmp( _name, "_default" ) == 0 ) { + declManager->MediaPrint( "DEFAULTED\n" ); + return globalImages->defaultImage; + } + if ( idStr::Icmpn( _name, "fonts", 5 ) == 0 || idStr::Icmpn( _name, "newfonts", 8 ) == 0 ) { + usage = TD_FONT; + } + if ( idStr::Icmpn( _name, "lights", 6 ) == 0 ) { + usage = TD_LIGHT; + } + // strip any .tga file extensions from anywhere in the _name, including image program parameters + idStr name = _name; + name.Replace( ".tga", "" ); + name.BackSlashesToSlashes(); + int hash = name.FileNameHash(); + for ( int i = imageHash.First( hash ); i != -1; i = imageHash.Next( i ) ) { + idImage * image = images[i]; + if ( name.Icmp( image->GetName() ) == 0 ) { + // the built in's, like _white and _flat always match the other options + if ( name[0] == '_' ) { + return image; + } + if ( image->cubeFiles != cubeMap ) { + common->Error( "Image '%s' has been referenced with conflicting cube map states", _name ); + } + if ( image->filter != filter || image->repeat != repeat ) { + // we might want to have the system reset these parameters on every bind and + // share the image data + continue; + } + if ( image->usage != usage ) { + // If an image is used differently then we need 2 copies of it because usage affects the way it's compressed and swizzled + continue; + } + return image; + } + } + return NULL; +} +/* +=============== +ImageFromFile + +Finds or loads the given image, always returning a valid image pointer. +Loading of the image may be deferred for dynamic loading. +============== +*/ +idImage *idImageManager::ImageFromFile( const char *_name, textureFilter_t filter, + textureRepeat_t repeat, textureUsage_t usage, cubeFiles_t cubeMap ) { + + if ( !_name || !_name[0] || idStr::Icmp( _name, "default" ) == 0 || idStr::Icmp( _name, "_default" ) == 0 ) { + declManager->MediaPrint( "DEFAULTED\n" ); + return globalImages->defaultImage; + } + if ( idStr::Icmpn( _name, "fonts", 5 ) == 0 || idStr::Icmpn( _name, "newfonts", 8 ) == 0 ) { + usage = TD_FONT; + } + if ( idStr::Icmpn( _name, "lights", 6 ) == 0 ) { + usage = TD_LIGHT; + } + + // strip any .tga file extensions from anywhere in the _name, including image program parameters + idStr name = _name; + name.Replace( ".tga", "" ); + name.BackSlashesToSlashes(); + + // + // see if the image is already loaded, unless we + // are in a reloadImages call + // + int hash = name.FileNameHash(); + for ( int i = imageHash.First( hash ); i != -1; i = imageHash.Next( i ) ) { + idImage * image = images[i]; + if ( name.Icmp( image->GetName() ) == 0 ) { + // the built in's, like _white and _flat always match the other options + if ( name[0] == '_' ) { + return image; + } + if ( image->cubeFiles != cubeMap ) { + common->Error( "Image '%s' has been referenced with conflicting cube map states", _name ); + } + + if ( image->filter != filter || image->repeat != repeat ) { + // we might want to have the system reset these parameters on every bind and + // share the image data + continue; + } + if ( image->usage != usage ) { + // If an image is used differently then we need 2 copies of it because usage affects the way it's compressed and swizzled + continue; + } + + image->usage = usage; + image->levelLoadReferenced = true; + + if ( ( !insideLevelLoad || preloadingMapImages ) && !image->IsLoaded() ) { + image->referencedOutsideLevelLoad = ( !insideLevelLoad && !preloadingMapImages ); + image->ActuallyLoadImage( false ); // load is from front end + declManager->MediaPrint( "%ix%i %s (reload for mixed referneces)\n", image->GetUploadWidth(), image->GetUploadHeight(), image->GetName() ); + } + return image; + } + } + + // + // create a new image + // + idImage * image = AllocImage( name ); + image->cubeFiles = cubeMap; + image->usage = usage; + image->filter = filter; + image->repeat = repeat; + + image->levelLoadReferenced = true; + + // load it if we aren't in a level preload + if ( !insideLevelLoad || preloadingMapImages ) { + image->referencedOutsideLevelLoad = ( !insideLevelLoad && !preloadingMapImages ); + image->ActuallyLoadImage( false ); // load is from front end + declManager->MediaPrint( "%ix%i %s\n", image->GetUploadWidth(), image->GetUploadHeight(), image->GetName() ); + } else { + declManager->MediaPrint( "%s\n", image->GetName() ); + } + + return image; +} + +/* +======================== +idImageManager::ScratchImage +======================== +*/ +idImage * idImageManager::ScratchImage( const char *_name, idImageOpts *imgOpts, textureFilter_t filter, textureRepeat_t repeat, textureUsage_t usage ) { + if ( !_name || !_name[0] ) { + idLib::FatalError( "idImageManager::ScratchImage called with empty name" ); + } + + if ( imgOpts == NULL ) { + idLib::FatalError( "idImageManager::ScratchImage called with NULL imgOpts" ); + } + + idStr name = _name; + + // + // see if the image is already loaded, unless we + // are in a reloadImages call + // + int hash = name.FileNameHash(); + for ( int i = imageHash.First( hash ); i != -1; i = imageHash.Next( i ) ) { + idImage * image = images[i]; + if ( name.Icmp( image->GetName() ) == 0 ) { + // the built in's, like _white and _flat always match the other options + if ( name[0] == '_' ) { + return image; + } + + if ( image->filter != filter || image->repeat != repeat ) { + // we might want to have the system reset these parameters on every bind and + // share the image data + continue; + } + if ( image->usage != usage ) { + // If an image is used differently then we need 2 copies of it because usage affects the way it's compressed and swizzled + continue; + } + + image->usage = usage; + image->levelLoadReferenced = true; + image->referencedOutsideLevelLoad = true; + return image; + } + } + + // clamp is the only repeat mode that makes sense for cube maps, but + // some platforms let them stay in repeat mode and get border seam issues + if ( imgOpts->textureType == TT_CUBIC && repeat != TR_CLAMP ) { + repeat = TR_CLAMP; + } + + // + // create a new image + // + idImage* newImage = AllocImage( name ); + if ( newImage != NULL ) { + newImage->AllocImage( *imgOpts, filter, repeat ); + } + return newImage; +} + +/* +=============== +idImageManager::GetImage +=============== +*/ +idImage *idImageManager::GetImage( const char *_name ) const { + + if ( !_name || !_name[0] || idStr::Icmp( _name, "default" ) == 0 || idStr::Icmp( _name, "_default" ) == 0 ) { + declManager->MediaPrint( "DEFAULTED\n" ); + return globalImages->defaultImage; + } + + // strip any .tga file extensions from anywhere in the _name, including image program parameters + idStr name = _name; + name.Replace( ".tga", "" ); + name.BackSlashesToSlashes(); + + // + // look in loaded images + // + int hash = name.FileNameHash(); + for ( int i = imageHash.First( hash ); i != -1; i = imageHash.Next( i ) ) { + idImage * image = images[i]; + if ( name.Icmp( image->GetName() ) == 0 ) { + return image; + } + } + + return NULL; +} + +/* +=============== +PurgeAllImages +=============== +*/ +void idImageManager::PurgeAllImages() { + int i; + idImage *image; + + for ( i = 0; i < images.Num() ; i++ ) { + image = images[i]; + image->PurgeImage(); + } +} + +/* +=============== +ReloadImages +=============== +*/ +void idImageManager::ReloadImages( bool all ) { + for ( int i = 0 ; i < globalImages->images.Num() ; i++ ) { + globalImages->images[ i ]->Reload( all ); + } +} + +/* +=============== +R_CombineCubeImages_f + +Used to combine animations of six separate tga files into +a serials of 6x taller tga files, for preparation to roq compress +=============== +*/ +void R_CombineCubeImages_f( const idCmdArgs &args ) { + if ( args.Argc() != 2 ) { + common->Printf( "usage: combineCubeImages \n" ); + common->Printf( " combines basename[1-6][0001-9999].tga to basenameCM[0001-9999].tga\n" ); + common->Printf( " 1: forward 2:right 3:back 4:left 5:up 6:down\n" ); + return; + } + + idStr baseName = args.Argv( 1 ); + common->SetRefreshOnPrint( true ); + + for ( int frameNum = 1 ; frameNum < 10000 ; frameNum++ ) { + char filename[MAX_IMAGE_NAME]; + byte *pics[6]; + int width = 0, height = 0; + int side; + int orderRemap[6] = { 1,3,4,2,5,6 }; + for ( side = 0 ; side < 6 ; side++ ) { + sprintf( filename, "%s%i%04i.tga", baseName.c_str(), orderRemap[side], frameNum ); + + common->Printf( "reading %s\n", filename ); + R_LoadImage( filename, &pics[side], &width, &height, NULL, true ); + + if ( !pics[side] ) { + common->Printf( "not found.\n" ); + break; + } + + // convert from "camera" images to native cube map images + switch( side ) { + case 0: // forward + R_RotatePic( pics[side], width); + break; + case 1: // back + R_RotatePic( pics[side], width); + R_HorizontalFlip( pics[side], width, height ); + R_VerticalFlip( pics[side], width, height ); + break; + case 2: // left + R_VerticalFlip( pics[side], width, height ); + break; + case 3: // right + R_HorizontalFlip( pics[side], width, height ); + break; + case 4: // up + R_RotatePic( pics[side], width); + break; + case 5: // down + R_RotatePic( pics[side], width); + break; + } + } + + if ( side != 6 ) { + for ( int i = 0 ; i < side ; side++ ) { + Mem_Free( pics[side] ); + } + break; + } + + idTempArray buf( width*height*6*4 ); + byte *combined = (byte *)buf.Ptr(); + for ( side = 0 ; side < 6 ; side++ ) { + memcpy( combined+width*height*4*side, pics[side], width*height*4 ); + Mem_Free( pics[side] ); + } + sprintf( filename, "%sCM%04i.tga", baseName.c_str(), frameNum ); + + common->Printf( "writing %s\n", filename ); + R_WriteTGA( filename, combined, width, height*6 ); + } + common->SetRefreshOnPrint( false ); +} + +/* +=============== +UnbindAll +=============== +*/ +void idImageManager::UnbindAll() { + int oldTMU = backEnd.glState.currenttmu; + for ( int i = 1; i < MAX_MULTITEXTURE_UNITS; ++i ) { + GL_SelectTextureNoClient(i); + BindNull(); + } + backEnd.glState.currenttmu = oldTMU; +} + +/* +=============== +BindNull +=============== +*/ +void idImageManager::BindNull() { + tmu_t* tmu; + + tmu = &backEnd.glState.tmu[backEnd.glState.currenttmu]; + + RB_LogComment("BindNull()\n"); + if (tmu->textureType == TT_CUBIC) { + glDisable(GL_TEXTURE_CUBE_MAP_EXT); + } + else if (tmu->textureType == TT_2D) { + glDisable(GL_TEXTURE_2D); + } + tmu->textureType = TT_DISABLED; + +} + +/* +=============== +Init +=============== +*/ +void idImageManager::Init() { + + images.Resize( 1024, 1024 ); + imageHash.ResizeIndex( 1024 ); + + CreateIntrinsicImages(); + + cmdSystem->AddCommand( "reloadImages", R_ReloadImages_f, CMD_FL_RENDERER, "reloads images" ); + cmdSystem->AddCommand( "listImages", R_ListImages_f, CMD_FL_RENDERER, "lists images" ); + cmdSystem->AddCommand( "combineCubeImages", R_CombineCubeImages_f, CMD_FL_RENDERER, "combines six images for roq compression" ); + + // should forceLoadImages be here? +} + +/* +=============== +Shutdown +=============== +*/ +void idImageManager::Shutdown() { + images.DeleteContents( true ); + imageHash.Clear(); + +} + +/* +==================== +idImageManager::BeginLevelLoad +Frees all images used by the previous level +==================== +*/ +void idImageManager::BeginLevelLoad() { + insideLevelLoad = true; + + for ( int i = 0 ; i < images.Num() ; i++ ) { + idImage *image = images[ i ]; + + // generator function images are always kept around + if ( image->generatorFunction ) { + continue; + } + + if ( !image->referencedOutsideLevelLoad && image->IsLoaded() ) { + image->PurgeImage(); + //idLib::Printf( "purging %s\n", image->GetName() ); + } else { + //idLib::Printf( "not purging %s\n", image->GetName() ); + } + + image->levelLoadReferenced = false; + } +} + + +/* +==================== +idImageManager::ExcludePreloadImage +==================== +*/ +bool idImageManager::ExcludePreloadImage( const char *name ) { + idStr imgName = name; + imgName.ToLower(); + if ( imgName.Find( "newfonts/", false ) >= 0 ) { + return true; + } + if ( imgName.Find( "generated/swf/", false ) >= 0 ) { + return true; + } + if ( imgName.Find( "/loadscreens/", false ) >= 0 ) { + return true; + } + return false; +} + +/* +=============== +idImageManager::LoadLevelImages +=============== +*/ +int idImageManager::LoadLevelImages( bool pacifier ) { + int loadCount = 0; + for ( int i = 0 ; i < images.Num() ; i++ ) { + if ( pacifier ) { + //common->UpdateLevelLoadPacifier(); + + } + + idImage *image = images[ i ]; + if ( image->generatorFunction ) { + continue; + } + if ( image->levelLoadReferenced && !image->IsLoaded() ) { + loadCount++; + image->ActuallyLoadImage( false ); + } + } + return loadCount; +} + +/* +=============== +idImageManager::EndLevelLoad +=============== +*/ +void idImageManager::EndLevelLoad() { + insideLevelLoad = false; + + common->Printf( "----- idImageManager::EndLevelLoad -----\n" ); + int start = Sys_Milliseconds(); + int loadCount = LoadLevelImages( true ); + + int end = Sys_Milliseconds(); + common->Printf( "%5i images loaded in %5.1f seconds\n", loadCount, (end-start) * 0.001 ); + common->Printf( "----------------------------------------\n" ); + //R_ListImages_f( idCmdArgs( "sorted sorted", false ) ); +} + +/* +=============== +idImageManager::StartBuild +=============== +*/ +void idImageManager::StartBuild() { +} + +/* +=============== +idImageManager::FinishBuild +=============== +*/ +void idImageManager::FinishBuild( bool removeDups ) { +} + +/* +=============== +idImageManager::PrintMemInfo +=============== +*/ +void idImageManager::PrintMemInfo( MemInfo_t *mi ) { + int i, j, total = 0; + int *sortIndex; + idFile *f; + + f = fileSystem->OpenFileWrite( mi->filebase + "_images.txt" ); + if ( !f ) { + return; + } + + // sort first + sortIndex = new int[images.Num()]; + + for ( i = 0; i < images.Num(); i++ ) { + sortIndex[i] = i; + } + + for ( i = 0; i < images.Num() - 1; i++ ) { + for ( j = i + 1; j < images.Num(); j++ ) { + if ( images[sortIndex[i]]->StorageSize() < images[sortIndex[j]]->StorageSize() ) { + int temp = sortIndex[i]; + sortIndex[i] = sortIndex[j]; + sortIndex[j] = temp; + } + } + } + + // print next + for ( i = 0; i < images.Num(); i++ ) { + idImage *im = images[sortIndex[i]]; + int size; + + size = im->StorageSize(); + total += size; + + f->Printf( "%s %3i %s\n", idStr::FormatNumber( size ).c_str(), im->refCount, im->GetName() ); + } + + delete [] sortIndex; + mi->imageAssetsTotal = total; + + f->Printf( "\nTotal image bytes allocated: %s\n", idStr::FormatNumber( total ).c_str() ); + fileSystem->CloseFile( f ); +} diff --git a/src/renderer/ImageOpts.h b/src/renderer/ImageOpts.h new file mode 100644 index 00000000..1001a820 --- /dev/null +++ b/src/renderer/ImageOpts.h @@ -0,0 +1,157 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ + +#ifndef __IMAGEOPTS_H__ +#define __IMAGEOPTS_H__ + +enum textureType_t { + TT_DISABLED, + TT_2D, + TT_CUBIC +}; + +/* +================================================ +The internal *Texture Format Types*, ::textureFormat_t, are: +================================================ +*/ +enum textureFormat_t { + FMT_NONE, + + //------------------------ + // Standard color image formats + //------------------------ + + FMT_RGBA8, // 32 bpp + FMT_XRGB8, // 32 bpp + + //------------------------ + // Alpha channel only + //------------------------ + + // Alpha ends up being the same as L8A8 in our current implementation, because straight + // alpha gives 0 for color, but we want 1. + FMT_ALPHA, + + //------------------------ + // Luminance replicates the value across RGB with a constant A of 255 + // Intensity replicates the value across RGBA + //------------------------ + + FMT_L8A8, // 16 bpp + FMT_LUM8, // 8 bpp + FMT_INT8, // 8 bpp + + //------------------------ + // Compressed texture formats + //------------------------ + + FMT_DXT1, // 4 bpp + FMT_DXT5, // 8 bpp + + //------------------------ + // Depth buffer formats + //------------------------ + + FMT_DEPTH, // 24 bpp + + //------------------------ + // + //------------------------ + + FMT_X16, // 16 bpp + FMT_Y16_X16, // 32 bpp + FMT_RGB565, // 16 bpp +}; + +int BitsForFormat( textureFormat_t format ); + +/* +================================================ +DXT5 color formats +================================================ +*/ +enum textureColor_t { + CFM_DEFAULT, // RGBA + CFM_NORMAL_DXT5, // XY format and use the fast DXT5 compressor + CFM_YCOCG_DXT5, // convert RGBA to CoCg_Y format + CFM_GREEN_ALPHA // Copy the alpha channel to green +}; + +/* +================================================ +idImageOpts hold parameters for texture operations. +================================================ +*/ +class idImageOpts { +public: + idImageOpts(); + + bool operator==( const idImageOpts & opts ); + + //--------------------------------------------------- + // these determine the physical memory size and layout + //--------------------------------------------------- + + textureType_t textureType; + textureFormat_t format; + textureColor_t colorFormat; + int width; + int height; // not needed for cube maps + int numLevels; // if 0, will be 1 for NEAREST / LINEAR filters, otherwise based on size + bool gammaMips; // if true, mips will be generated with gamma correction + bool readback; // 360 specific - cpu reads back from this texture, so allocate with cached memory +}; + +/* +======================== +idImageOpts::idImageOpts +======================== +*/ +ID_INLINE idImageOpts::idImageOpts() { + format = FMT_NONE; + colorFormat = CFM_DEFAULT; + width = 0; + height = 0; + numLevels = 0; + textureType = TT_2D; + gammaMips = false; + readback = false; + +}; + +/* +======================== +idImageOpts::operator== +======================== +*/ +ID_INLINE bool idImageOpts::operator==( const idImageOpts & opts ) { + return ( memcmp( this, &opts, sizeof( *this ) ) == 0 ); +} + +#endif \ No newline at end of file diff --git a/src/renderer/Image_files.cpp b/src/renderer/Image_files.cpp index ed2bcc81..2610f9eb 100644 --- a/src/renderer/Image_files.cpp +++ b/src/renderer/Image_files.cpp @@ -1,33 +1,34 @@ /* =========================================================================== -Doom 3 GPL Source Code -Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. -This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?). +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). -Doom 3 Source Code is free software: you can redistribute it and/or modify +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. -Doom 3 Source Code is distributed in the hope that it will be useful, +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with Doom 3 Source Code. If not, see . +along with Doom 3 BFG Edition Source Code. If not, see . -In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below. +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. =========================================================================== */ -#include "precompiled.h" #pragma hdrstop +#include "precompiled.h" + #include "tr_local.h" @@ -50,45 +51,45 @@ void R_LoadImage( const char *name, byte **pic, int *width, int *height, bool ma extern "C" { #include "jpeg-6/jpeglib.h" - // hooks from jpeg lib to our system - void jpg_Error( const char *fmt, ... ) { - va_list argptr; - char msg[2048]; +// hooks from jpeg lib to our system - va_start (argptr,fmt); - vsprintf (msg,fmt,argptr); - va_end (argptr); +void jpg_Error( const char *fmt, ... ) { + va_list argptr; + char msg[2048]; - common->FatalError( "%s", msg ); - } + va_start (argptr,fmt); + vsprintf (msg,fmt,argptr); + va_end (argptr); - void jpg_Printf( const char *fmt, ... ) { - va_list argptr; - char msg[2048]; + common->FatalError( "%s", msg ); +} - va_start (argptr,fmt); - vsprintf (msg,fmt,argptr); - va_end (argptr); +void jpg_Printf( const char *fmt, ... ) { + va_list argptr; + char msg[2048]; - common->Printf( "%s", msg ); - } + va_start (argptr,fmt); + vsprintf (msg,fmt,argptr); + va_end (argptr); + common->Printf( "%s", msg ); } - +}; /* ================ R_WriteTGA ================ */ -void R_WriteTGA( const char *filename, const byte *data, int width, int height, bool flipVertical ) { +void R_WriteTGA( const char *filename, const byte *data, int width, int height, bool flipVertical, const char * basePath ) { byte *buffer; int i; int bufferSize = width*height*4 + 18; int imgStart = 18; - buffer = (byte *)Mem_Alloc( bufferSize ); + idTempArray buf( bufferSize ); + buffer = (byte *)buf.Ptr(); memset( buffer, 0, 18 ); buffer[2] = 2; // uncompressed type buffer[12] = width&255; @@ -108,88 +109,12 @@ void R_WriteTGA( const char *filename, const byte *data, int width, int height, buffer[i+3] = data[i-imgStart+3]; // alpha } - fileSystem->WriteFile( filename, buffer, bufferSize ); - - Mem_Free (buffer); + fileSystem->WriteFile( filename, buffer, bufferSize, basePath ); } - -/* -================ -R_WritePalTGA -================ -*/ -void R_WritePalTGA( const char *filename, const byte *data, const byte *palette, int width, int height, bool flipVertical ) { - byte *buffer; - int i; - int bufferSize = (width * height) + (256 * 3) + 18; - int palStart = 18; - int imgStart = 18 + (256 * 3); - - buffer = (byte *)Mem_Alloc( bufferSize ); - memset( buffer, 0, 18 ); - buffer[1] = 1; // color map type - buffer[2] = 1; // uncompressed color mapped image - buffer[5] = 0; // number of palette entries (lo) - buffer[6] = 1; // number of palette entries (hi) - buffer[7] = 24; // color map bpp - buffer[12] = width&255; - buffer[13] = width>>8; - buffer[14] = height&255; - buffer[15] = height>>8; - buffer[16] = 8; // pixel size - if ( !flipVertical ) { - buffer[17] = (1<<5); // flip bit, for normal top to bottom raster order - } - - // store palette, swapping rgb to bgr - for ( i=palStart ; iWriteFile( filename, buffer, bufferSize ); - - Mem_Free (buffer); -} - - -static void LoadBMP( const char *name, byte **pic, int *width, int *height, ID_TIME_T *timestamp ); static void LoadTGA( const char *name, byte **pic, int *width, int *height, ID_TIME_T *timestamp ); static void LoadJPG( const char *name, byte **pic, int *width, int *height, ID_TIME_T *timestamp ); - -/* -======================================================================== - -PCX files are used for 8 bit images - -======================================================================== -*/ - -typedef struct { - char manufacturer; - char version; - char encoding; - char bits_per_pixel; - unsigned short xmin,ymin,xmax,ymax; - unsigned short hres,vres; - unsigned char palette[48]; - char reserved; - char color_planes; - unsigned short bytes_per_line; - unsigned short palette_type; - char filler[58]; - unsigned char data; // unbounded -} pcx_t; - - /* ======================================================================== @@ -207,339 +132,6 @@ typedef struct _TargaHeader { } TargaHeader; - -/* -========================================================= - -BMP LOADING - -========================================================= -*/ -typedef struct -{ - char id[2]; - unsigned long fileSize; - unsigned long reserved0; - unsigned long bitmapDataOffset; - unsigned long bitmapHeaderSize; - unsigned long width; - unsigned long height; - unsigned short planes; - unsigned short bitsPerPixel; - unsigned long compression; - unsigned long bitmapDataSize; - unsigned long hRes; - unsigned long vRes; - unsigned long colors; - unsigned long importantColors; - unsigned char palette[256][4]; -} BMPHeader_t; - -/* -============== -LoadBMP -============== -*/ -static void LoadBMP( const char *name, byte **pic, int *width, int *height, ID_TIME_T *timestamp ) -{ - int columns, rows, numPixels; - byte *pixbuf; - int row, column; - byte *buf_p; - byte *buffer; - int length; - BMPHeader_t bmpHeader; - byte *bmpRGBA; - - if ( !pic ) { - fileSystem->ReadFile ( name, NULL, timestamp ); - return; // just getting timestamp - } - - *pic = NULL; - - // - // load the file - // - length = fileSystem->ReadFile( name, (void **)&buffer, timestamp ); - if ( !buffer ) { - return; - } - - buf_p = buffer; - - bmpHeader.id[0] = *buf_p++; - bmpHeader.id[1] = *buf_p++; - bmpHeader.fileSize = LittleLong( * ( long * ) buf_p ); - buf_p += 4; - bmpHeader.reserved0 = LittleLong( * ( long * ) buf_p ); - buf_p += 4; - bmpHeader.bitmapDataOffset = LittleLong( * ( long * ) buf_p ); - buf_p += 4; - bmpHeader.bitmapHeaderSize = LittleLong( * ( long * ) buf_p ); - buf_p += 4; - bmpHeader.width = LittleLong( * ( long * ) buf_p ); - buf_p += 4; - bmpHeader.height = LittleLong( * ( long * ) buf_p ); - buf_p += 4; - bmpHeader.planes = LittleShort( * ( short * ) buf_p ); - buf_p += 2; - bmpHeader.bitsPerPixel = LittleShort( * ( short * ) buf_p ); - buf_p += 2; - bmpHeader.compression = LittleLong( * ( long * ) buf_p ); - buf_p += 4; - bmpHeader.bitmapDataSize = LittleLong( * ( long * ) buf_p ); - buf_p += 4; - bmpHeader.hRes = LittleLong( * ( long * ) buf_p ); - buf_p += 4; - bmpHeader.vRes = LittleLong( * ( long * ) buf_p ); - buf_p += 4; - bmpHeader.colors = LittleLong( * ( long * ) buf_p ); - buf_p += 4; - bmpHeader.importantColors = LittleLong( * ( long * ) buf_p ); - buf_p += 4; - - memcpy( bmpHeader.palette, buf_p, sizeof( bmpHeader.palette ) ); - - if ( bmpHeader.bitsPerPixel == 8 ) - buf_p += 1024; - - if ( bmpHeader.id[0] != 'B' && bmpHeader.id[1] != 'M' ) - { - common->Error( "LoadBMP: only Windows-style BMP files supported (%s)\n", name ); - } - if ( bmpHeader.fileSize != length ) - { - common->Error( "LoadBMP: header size does not match file size (%lu vs. %d) (%s)\n", bmpHeader.fileSize, length, name ); - } - if ( bmpHeader.compression != 0 ) - { - common->Error( "LoadBMP: only uncompressed BMP files supported (%s)\n", name ); - } - if ( bmpHeader.bitsPerPixel < 8 ) - { - common->Error( "LoadBMP: monochrome and 4-bit BMP files not supported (%s)\n", name ); - } - - columns = bmpHeader.width; - rows = bmpHeader.height; - if ( rows < 0 ) - rows = -rows; - numPixels = columns * rows; - - if ( width ) - *width = columns; - if ( height ) - *height = rows; - - bmpRGBA = (byte *)R_StaticAlloc( numPixels * 4 ); - *pic = bmpRGBA; - - - for ( row = rows-1; row >= 0; row-- ) - { - pixbuf = bmpRGBA + row*columns*4; - - for ( column = 0; column < columns; column++ ) - { - unsigned char red, green, blue, alpha; - int palIndex; - unsigned short shortPixel; - - switch ( bmpHeader.bitsPerPixel ) - { - case 8: - palIndex = *buf_p++; - *pixbuf++ = bmpHeader.palette[palIndex][2]; - *pixbuf++ = bmpHeader.palette[palIndex][1]; - *pixbuf++ = bmpHeader.palette[palIndex][0]; - *pixbuf++ = 0xff; - break; - case 16: - shortPixel = * ( unsigned short * ) pixbuf; - pixbuf += 2; - *pixbuf++ = ( shortPixel & ( 31 << 10 ) ) >> 7; - *pixbuf++ = ( shortPixel & ( 31 << 5 ) ) >> 2; - *pixbuf++ = ( shortPixel & ( 31 ) ) << 3; - *pixbuf++ = 0xff; - break; - - case 24: - blue = *buf_p++; - green = *buf_p++; - red = *buf_p++; - *pixbuf++ = red; - *pixbuf++ = green; - *pixbuf++ = blue; - *pixbuf++ = 255; - break; - case 32: - blue = *buf_p++; - green = *buf_p++; - red = *buf_p++; - alpha = *buf_p++; - *pixbuf++ = red; - *pixbuf++ = green; - *pixbuf++ = blue; - *pixbuf++ = alpha; - break; - default: - common->Error( "LoadBMP: illegal pixel_size '%d' in file '%s'\n", bmpHeader.bitsPerPixel, name ); - break; - } - } - } - - fileSystem->FreeFile( buffer ); - -} - - -/* -================================================================= - -PCX LOADING - -================================================================= -*/ - - -/* -============== -LoadPCX -============== -*/ -static void LoadPCX ( const char *filename, byte **pic, byte **palette, int *width, int *height, - ID_TIME_T *timestamp ) { - byte *raw; - pcx_t *pcx; - int x, y; - int len; - int dataByte, runLength; - byte *out, *pix; - int xmax, ymax; - - if ( !pic ) { - fileSystem->ReadFile( filename, NULL, timestamp ); - return; // just getting timestamp - } - - *pic = NULL; - *palette = NULL; - - // - // load the file - // - len = fileSystem->ReadFile( filename, (void **)&raw, timestamp ); - if (!raw) { - return; - } - - // - // parse the PCX file - // - pcx = (pcx_t *)raw; - raw = &pcx->data; - - xmax = LittleShort(pcx->xmax); - ymax = LittleShort(pcx->ymax); - - if (pcx->manufacturer != 0x0a - || pcx->version != 5 - || pcx->encoding != 1 - || pcx->bits_per_pixel != 8 - || xmax >= 1024 - || ymax >= 1024) - { - common->Printf( "Bad pcx file %s (%i x %i) (%i x %i)\n", filename, xmax+1, ymax+1, pcx->xmax, pcx->ymax); - return; - } - - out = (byte *)R_StaticAlloc( (ymax+1) * (xmax+1) ); - - *pic = out; - - pix = out; - - if (palette) - { - *palette = (byte *)R_StaticAlloc(768); - memcpy (*palette, (byte *)pcx + len - 768, 768); - } - - if (width) - *width = xmax+1; - if (height) - *height = ymax+1; -// FIXME: use bytes_per_line here? - - for (y=0 ; y<=ymax ; y++, pix += xmax+1) - { - for (x=0 ; x<=xmax ; ) - { - dataByte = *raw++; - - if((dataByte & 0xC0) == 0xC0) - { - runLength = dataByte & 0x3F; - dataByte = *raw++; - } - else - runLength = 1; - - while(runLength-- > 0) - pix[x++] = dataByte; - } - - } - - if ( raw - (byte *)pcx > len) - { - common->Printf( "PCX file %s was malformed", filename ); - R_StaticFree (*pic); - *pic = NULL; - } - - fileSystem->FreeFile( pcx ); -} - - -/* -============== -LoadPCX32 -============== -*/ -static void LoadPCX32 ( const char *filename, byte **pic, int *width, int *height, ID_TIME_T *timestamp) { - byte *palette; - byte *pic8; - int i, c, p; - byte *pic32; - - if ( !pic ) { - fileSystem->ReadFile( filename, NULL, timestamp ); - return; // just getting timestamp - } - LoadPCX (filename, &pic8, &palette, width, height, timestamp); - if (!pic8) { - *pic = NULL; - return; - } - - c = (*width) * (*height); - pic32 = *pic = (byte *)R_StaticAlloc(4 * c ); - for (i = 0 ; i < c ; i++) { - p = pic8[i]; - pic32[0] = palette[p*3]; - pic32[1] = palette[p*3 + 1]; - pic32[2] = palette[p*3 + 2]; - pic32[3] = 255; - pic32 += 4; - } - - R_StaticFree( pic8 ); - R_StaticFree( palette ); -} - /* ========================================================= @@ -779,7 +371,9 @@ static void LoadTGA( const char *name, byte **pic, int *width, int *height, ID_T } if ( (targa_header.attributes & (1<<5)) ) { // image flp bit - R_VerticalFlip( *pic, *width, *height ); + if ( width != NULL && height != NULL ) { + R_VerticalFlip( *pic, *width, *height ); + } } fileSystem->FreeFile( buffer ); @@ -1002,7 +596,7 @@ void R_LoadImage( const char *cname, byte **pic, int *width, int *height, ID_TIM *pic = NULL; } if ( timestamp ) { - *timestamp = 0xFFFFFFFF; + *timestamp = FILE_NOT_FOUND_TIMESTAMP; } if ( width ) { *width = 0; @@ -1023,15 +617,11 @@ void R_LoadImage( const char *cname, byte **pic, int *width, int *height, ID_TIM if ( ext == "tga" ) { LoadTGA( name.c_str(), pic, width, height, timestamp ); // try tga first - if ( ( pic && *pic == 0 ) || ( timestamp && *timestamp == -1 ) ) { + if ( ( pic && *pic == 0 ) || ( timestamp && *timestamp == -1 ) ) { //-V595 name.StripFileExtension(); name.DefaultFileExtension( ".jpg" ); LoadJPG( name.c_str(), pic, width, height, timestamp ); } - } else if ( ext == "pcx" ) { - LoadPCX32( name.c_str(), pic, width, height, timestamp ); - } else if ( ext == "bmp" ) { - LoadBMP( name.c_str(), pic, width, height, timestamp ); } else if ( ext == "jpg" ) { LoadJPG( name.c_str(), pic, width, height, timestamp ); } @@ -1046,6 +636,7 @@ void R_LoadImage( const char *cname, byte **pic, int *width, int *height, ID_TIM // // convert to exact power of 2 sizes // + /* if ( pic && *pic && makePowerOf2 ) { int w, h; int scaled_width, scaled_height; @@ -1060,13 +651,6 @@ void R_LoadImage( const char *cname, byte **pic, int *width, int *height, ID_TIM ; if ( scaled_width != w || scaled_height != h ) { - if ( globalImages->image_roundDown.GetBool() && scaled_width > w ) { - scaled_width >>= 1; - } - if ( globalImages->image_roundDown.GetBool() && scaled_height > h ) { - scaled_height >>= 1; - } - resampledBuffer = R_ResampleTexture( *pic, w, h, scaled_width, scaled_height ); R_StaticFree( *pic ); *pic = resampledBuffer; @@ -1074,6 +658,7 @@ void R_LoadImage( const char *cname, byte **pic, int *width, int *height, ID_TIM *height = scaled_height; } } + */ } diff --git a/src/renderer/Image_init.cpp b/src/renderer/Image_init.cpp deleted file mode 100644 index 6b20b460..00000000 --- a/src/renderer/Image_init.cpp +++ /dev/null @@ -1,2219 +0,0 @@ -/* -=========================================================================== - -Doom 3 GPL Source Code -Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. - -This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?). - -Doom 3 Source Code is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Doom 3 Source Code is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Doom 3 Source Code. If not, see . - -In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below. - -If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. - -=========================================================================== -*/ - -#include "precompiled.h" -#pragma hdrstop - -#include "tr_local.h" - -const char *imageFilter[] = { - "GL_LINEAR_MIPMAP_NEAREST", - "GL_LINEAR_MIPMAP_LINEAR", - "GL_NEAREST", - "GL_LINEAR", - "GL_NEAREST_MIPMAP_NEAREST", - "GL_NEAREST_MIPMAP_LINEAR", - NULL -}; - -idCVar idImageManager::image_filter( "image_filter", imageFilter[1], CVAR_RENDERER | CVAR_ARCHIVE, "changes texture filtering on mipmapped images", imageFilter, idCmdSystem::ArgCompletion_String ); -idCVar idImageManager::image_anisotropy( "image_anisotropy", "1", CVAR_RENDERER | CVAR_ARCHIVE, "set the maximum texture anisotropy if available" ); -idCVar idImageManager::image_lodbias( "image_lodbias", "0", CVAR_RENDERER | CVAR_ARCHIVE, "change lod bias on mipmapped images" ); -idCVar idImageManager::image_downSize( "image_downSize", "0", CVAR_RENDERER | CVAR_ARCHIVE, "controls texture downsampling" ); -idCVar idImageManager::image_forceDownSize( "image_forceDownSize", "0", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_BOOL, "" ); -idCVar idImageManager::image_roundDown( "image_roundDown", "1", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_BOOL, "round bad sizes down to nearest power of two" ); -idCVar idImageManager::image_colorMipLevels( "image_colorMipLevels", "0", CVAR_RENDERER | CVAR_BOOL, "development aid to see texture mip usage" ); -idCVar idImageManager::image_preload( "image_preload", "1", CVAR_RENDERER | CVAR_BOOL | CVAR_ARCHIVE, "if 0, dynamically load all images" ); -idCVar idImageManager::image_useCompression( "image_useCompression", "1", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_BOOL, "0 = force everything to high quality" ); -idCVar idImageManager::image_useAllFormats( "image_useAllFormats", "1", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_BOOL, "allow alpha/intensity/luminance/luminance+alpha" ); -idCVar idImageManager::image_useNormalCompression( "image_useNormalCompression", "2", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_INTEGER, "2 = use rxgb compression for normal maps, 1 = use 256 color compression for normal maps if available" ); -idCVar idImageManager::image_usePrecompressedTextures( "image_usePrecompressedTextures", "1", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_BOOL, "use .dds files if present" ); -idCVar idImageManager::image_writePrecompressedTextures( "image_writePrecompressedTextures", "0", CVAR_RENDERER | CVAR_BOOL, "write .dds files if necessary" ); -idCVar idImageManager::image_writeNormalTGA( "image_writeNormalTGA", "0", CVAR_RENDERER | CVAR_BOOL, "write .tgas of the final normal maps for debugging" ); -idCVar idImageManager::image_writeNormalTGAPalletized( "image_writeNormalTGAPalletized", "0", CVAR_RENDERER | CVAR_BOOL, "write .tgas of the final palletized normal maps for debugging" ); -idCVar idImageManager::image_writeTGA( "image_writeTGA", "0", CVAR_RENDERER | CVAR_BOOL, "write .tgas of the non normal maps for debugging" ); -idCVar idImageManager::image_useOffLineCompression( "image_useOfflineCompression", "0", CVAR_RENDERER | CVAR_BOOL, "write a batch file for offline compression of DDS files" ); -idCVar idImageManager::image_cacheMinK( "image_cacheMinK", "200", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_INTEGER, "maximum KB of precompressed files to read at specification time" ); -idCVar idImageManager::image_cacheMegs( "image_cacheMegs", "20", CVAR_RENDERER | CVAR_ARCHIVE, "maximum MB set aside for temporary loading of full-sized precompressed images" ); -idCVar idImageManager::image_useCache( "image_useCache", "0", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_BOOL, "1 = do background load image caching" ); -idCVar idImageManager::image_showBackgroundLoads( "image_showBackgroundLoads", "0", CVAR_RENDERER | CVAR_BOOL, "1 = print number of outstanding background loads" ); -idCVar idImageManager::image_downSizeSpecular( "image_downSizeSpecular", "0", CVAR_RENDERER | CVAR_ARCHIVE, "controls specular downsampling" ); -idCVar idImageManager::image_downSizeBump( "image_downSizeBump", "0", CVAR_RENDERER | CVAR_ARCHIVE, "controls normal map downsampling" ); -idCVar idImageManager::image_downSizeSpecularLimit( "image_downSizeSpecularLimit", "64", CVAR_RENDERER | CVAR_ARCHIVE, "controls specular downsampled limit" ); -idCVar idImageManager::image_downSizeBumpLimit( "image_downSizeBumpLimit", "128", CVAR_RENDERER | CVAR_ARCHIVE, "controls normal map downsample limit" ); -idCVar idImageManager::image_ignoreHighQuality( "image_ignoreHighQuality", "0", CVAR_RENDERER | CVAR_ARCHIVE, "ignore high quality setting on materials" ); -idCVar idImageManager::image_downSizeLimit( "image_downSizeLimit", "256", CVAR_RENDERER | CVAR_ARCHIVE, "controls diffuse map downsample limit" ); -// do this with a pointer, in case we want to make the actual manager -// a private virtual subclass -idImageManager imageManager; -idImageManager *globalImages = &imageManager; - - -enum IMAGE_CLASSIFICATION { - IC_NPC, - IC_WEAPON, - IC_MONSTER, - IC_MODELGEOMETRY, - IC_ITEMS, - IC_MODELSOTHER, - IC_GUIS, - IC_WORLDGEOMETRY, - IC_OTHER, - IC_COUNT -}; - -struct imageClassificate_t { - const char *rootPath; - const char *desc; - int type; - int maxWidth; - int maxHeight; -}; - -typedef idList< int > intList; - -const imageClassificate_t IC_Info[] = { - { "models/characters", "Characters", IC_NPC, 512, 512 }, - { "models/weapons", "Weapons", IC_WEAPON, 512, 512 }, - { "models/monsters", "Monsters", IC_MONSTER, 512, 512 }, - { "models/mapobjects", "Model Geometry", IC_MODELGEOMETRY, 512, 512 }, - { "models/items", "Items", IC_ITEMS, 512, 512 }, - { "models", "Other model textures", IC_MODELSOTHER, 512, 512 }, - { "guis/assets", "Guis", IC_GUIS, 256, 256 }, - { "textures", "World Geometry", IC_WORLDGEOMETRY, 256, 256 }, - { "", "Other", IC_OTHER, 256, 256 } -}; - - - -static int ClassifyImage( const char *name ) { - idStr str; - str = name; - for ( int i = 0; i < IC_COUNT; i++ ) { - if ( str.Find( IC_Info[i].rootPath, false ) == 0 ) { - return IC_Info[i].type; - } - } - return IC_OTHER; -} - -/* -================ -R_RampImage - -Creates a 0-255 ramp image -================ -*/ -static void R_RampImage( idImage *image ) { - int x; - byte data[256][4]; - - for (x=0 ; x<256 ; x++) { - data[x][0] = - data[x][1] = - data[x][2] = - data[x][3] = x; - } - - image->GenerateImage( (byte *)data, 256, 1, - TF_NEAREST, false, TR_CLAMP, TD_HIGH_QUALITY ); -} - -/* -================ -R_SpecularTableImage - -Creates a ramp that matches our fudged specular calculation -================ -*/ -static void R_SpecularTableImage( idImage *image ) { - int x; - byte data[256][4]; - - for (x=0 ; x<256 ; x++) { - float f = x/255.f; -#if 0 - f = pow(f, 16); -#else - // this is the behavior of the hacked up fragment programs that - // can't really do a power function - f = (f-0.75)*4; - if ( f < 0 ) { - f = 0; - } - f = f * f; -#endif - int b = (int)(f * 255); - - data[x][0] = - data[x][1] = - data[x][2] = - data[x][3] = b; - } - - image->GenerateImage( (byte *)data, 256, 1, - TF_LINEAR, false, TR_CLAMP, TD_HIGH_QUALITY ); -} - - -/* -================ -R_Specular2DTableImage - -Create a 2D table that calculates ( reflection dot , specularity ) -================ -*/ -static void R_Specular2DTableImage( idImage *image ) { - int x, y; - byte data[256][256][4]; - - memset( data, 0, sizeof( data ) ); - for ( x = 0 ; x < 256 ; x++ ) { - float f = x / 255.0f; - for ( y = 0; y < 256; y++ ) { - - int b = (int)( pow( f, y ) * 255.0f ); - if ( b == 0 ) { - // as soon as b equals zero all remaining values in this column are going to be zero - // we early out to avoid pow() underflows - break; - } - - data[y][x][0] = - data[y][x][1] = - data[y][x][2] = - data[y][x][3] = b; - } - } - - image->GenerateImage( (byte *)data, 256, 256, TF_LINEAR, false, TR_CLAMP, TD_HIGH_QUALITY ); -} - - - -/* -================ -R_AlphaRampImage - -Creates a 0-255 ramp image -================ -*/ -static void R_AlphaRampImage( idImage *image ) { - int x; - byte data[256][4]; - - for (x=0 ; x<256 ; x++) { - data[x][0] = - data[x][1] = - data[x][2] = 255; - data[x][3] = x; - } - - image->GenerateImage( (byte *)data, 256, 1, - TF_NEAREST, false, TR_CLAMP, TD_HIGH_QUALITY ); -} - - - -/* -================== -R_CreateDefaultImage - -the default image will be grey with a white box outline -to allow you to see the mapping coordinates on a surface -================== -*/ -#define DEFAULT_SIZE 16 -void idImage::MakeDefault() { - int x, y; - byte data[DEFAULT_SIZE][DEFAULT_SIZE][4]; - - if ( com_developer.GetBool() ) { - // grey center - for ( y = 0 ; y < DEFAULT_SIZE ; y++ ) { - for ( x = 0 ; x < DEFAULT_SIZE ; x++ ) { - data[y][x][0] = 32; - data[y][x][1] = 32; - data[y][x][2] = 32; - data[y][x][3] = 255; - } - } - - // white border - for ( x = 0 ; x < DEFAULT_SIZE ; x++ ) { - data[0][x][0] = - data[0][x][1] = - data[0][x][2] = - data[0][x][3] = 255; - - data[x][0][0] = - data[x][0][1] = - data[x][0][2] = - data[x][0][3] = 255; - - data[DEFAULT_SIZE-1][x][0] = - data[DEFAULT_SIZE-1][x][1] = - data[DEFAULT_SIZE-1][x][2] = - data[DEFAULT_SIZE-1][x][3] = 255; - - data[x][DEFAULT_SIZE-1][0] = - data[x][DEFAULT_SIZE-1][1] = - data[x][DEFAULT_SIZE-1][2] = - data[x][DEFAULT_SIZE-1][3] = 255; - } - } else { - for ( y = 0 ; y < DEFAULT_SIZE ; y++ ) { - for ( x = 0 ; x < DEFAULT_SIZE ; x++ ) { - data[y][x][0] = 0; - data[y][x][1] = 0; - data[y][x][2] = 0; - data[y][x][3] = 0; - } - } - } - - GenerateImage( (byte *)data, - DEFAULT_SIZE, DEFAULT_SIZE, - TF_DEFAULT, true, TR_REPEAT, TD_DEFAULT ); - - defaulted = true; -} - -static void R_DefaultImage( idImage *image ) { - image->MakeDefault(); -} - -static void R_WhiteImage( idImage *image ) { - byte data[DEFAULT_SIZE][DEFAULT_SIZE][4]; - - // solid white texture - memset( data, 255, sizeof( data ) ); - image->GenerateImage( (byte *)data, DEFAULT_SIZE, DEFAULT_SIZE, - TF_DEFAULT, false, TR_REPEAT, TD_DEFAULT ); -} - -static void R_BlackImage( idImage *image ) { - byte data[DEFAULT_SIZE][DEFAULT_SIZE][4]; - - // solid black texture - memset( data, 0, sizeof( data ) ); - image->GenerateImage( (byte *)data, DEFAULT_SIZE, DEFAULT_SIZE, - TF_DEFAULT, false, TR_REPEAT, TD_DEFAULT ); -} - - -// the size determines how far away from the edge the blocks start fading -static const int BORDER_CLAMP_SIZE = 32; -static void R_BorderClampImage( idImage *image ) { - byte data[BORDER_CLAMP_SIZE][BORDER_CLAMP_SIZE][4]; - - // solid white texture with a single pixel black border - memset( data, 255, sizeof( data ) ); - for ( int i = 0 ; i < BORDER_CLAMP_SIZE ; i++ ) { - data[i][0][0] = - data[i][0][1] = - data[i][0][2] = - data[i][0][3] = - - data[i][BORDER_CLAMP_SIZE-1][0] = - data[i][BORDER_CLAMP_SIZE-1][1] = - data[i][BORDER_CLAMP_SIZE-1][2] = - data[i][BORDER_CLAMP_SIZE-1][3] = - - data[0][i][0] = - data[0][i][1] = - data[0][i][2] = - data[0][i][3] = - - data[BORDER_CLAMP_SIZE-1][i][0] = - data[BORDER_CLAMP_SIZE-1][i][1] = - data[BORDER_CLAMP_SIZE-1][i][2] = - data[BORDER_CLAMP_SIZE-1][i][3] = 0; - } - - image->GenerateImage( (byte *)data, BORDER_CLAMP_SIZE, BORDER_CLAMP_SIZE, - TF_LINEAR /* TF_NEAREST */, false, TR_CLAMP_TO_BORDER, TD_DEFAULT ); - - if ( !glConfig.isInitialized ) { - // can't call qglTexParameterfv yet - return; - } - // explicit zero border - float color[4]; - color[0] = color[1] = color[2] = color[3] = 0; - qglTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, color ); -} - -static void R_RGBA8Image( idImage *image ) { - byte data[DEFAULT_SIZE][DEFAULT_SIZE][4]; - - memset( data, 0, sizeof( data ) ); - data[0][0][0] = 16; - data[0][0][1] = 32; - data[0][0][2] = 48; - data[0][0][3] = 96; - - image->GenerateImage( (byte *)data, DEFAULT_SIZE, DEFAULT_SIZE, - TF_DEFAULT, false, TR_REPEAT, TD_HIGH_QUALITY ); -} - -static void R_RGB8Image( idImage *image ) { - byte data[DEFAULT_SIZE][DEFAULT_SIZE][4]; - - memset( data, 0, sizeof( data ) ); - data[0][0][0] = 16; - data[0][0][1] = 32; - data[0][0][2] = 48; - data[0][0][3] = 255; - - image->GenerateImage( (byte *)data, DEFAULT_SIZE, DEFAULT_SIZE, - TF_DEFAULT, false, TR_REPEAT, TD_HIGH_QUALITY ); -} - -static void R_AlphaNotchImage( idImage *image ) { - byte data[2][4]; - - // this is used for alpha test clip planes - - data[0][0] = data[0][1] = data[0][2] = 255; - data[0][3] = 0; - data[1][0] = data[1][1] = data[1][2] = 255; - data[1][3] = 255; - - image->GenerateImage( (byte *)data, 2, 1, - TF_NEAREST, false, TR_CLAMP, TD_HIGH_QUALITY ); -} - -static void R_FlatNormalImage( idImage *image ) { - byte data[DEFAULT_SIZE][DEFAULT_SIZE][4]; - int i; - - int red = ( globalImages->image_useNormalCompression.GetInteger() == 1 ) ? 0 : 3; - int alpha = ( red == 0 ) ? 3 : 0; - // flat normal map for default bunp mapping - for ( i = 0 ; i < 4 ; i++ ) { - data[0][i][red] = 128; - data[0][i][1] = 128; - data[0][i][2] = 255; - data[0][i][alpha] = 255; - } - image->GenerateImage( (byte *)data, 2, 2, - TF_DEFAULT, true, TR_REPEAT, TD_HIGH_QUALITY ); -} - -static void R_AmbientNormalImage( idImage *image ) { - byte data[DEFAULT_SIZE][DEFAULT_SIZE][4]; - int i; - - int red = ( globalImages->image_useNormalCompression.GetInteger() == 1 ) ? 0 : 3; - int alpha = ( red == 0 ) ? 3 : 0; - // flat normal map for default bunp mapping - for ( i = 0 ; i < 4 ; i++ ) { - data[0][i][red] = (byte)(255 * tr.ambientLightVector[0]); - data[0][i][1] = (byte)(255 * tr.ambientLightVector[1]); - data[0][i][2] = (byte)(255 * tr.ambientLightVector[2]); - data[0][i][alpha] = 255; - } - const byte *pics[6]; - for ( i = 0 ; i < 6 ; i++ ) { - pics[i] = data[0][0]; - } - // this must be a cube map for fragment programs to simply substitute for the normalization cube map - image->GenerateCubeImage( pics, 2, TF_DEFAULT, true, TD_HIGH_QUALITY ); -} - - -static void CreateSquareLight( void ) { - byte *buffer; - int x, y; - int dx, dy; - int d; - int width, height; - - width = height = 128; - - buffer = (byte *)R_StaticAlloc( 128 * 128 * 4 ); - - for ( x = 0 ; x < 128 ; x++ ) { - if ( x < 32 ) { - dx = 32 - x; - } else if ( x > 96 ) { - dx = x - 96; - } else { - dx = 0; - } - for ( y = 0 ; y < 128 ; y++ ) { - if ( y < 32 ) { - dy = 32 - y; - } else if ( y > 96 ) { - dy = y - 96; - } else { - dy = 0; - } - d = (byte)idMath::Sqrt( dx * dx + dy * dy ); - if ( d > 32 ) { - d = 32; - } - d = 255 - d * 8; - if ( d < 0 ) { - d = 0; - } - buffer[(y*128+x)*4+0] = - buffer[(y*128+x)*4+1] = - buffer[(y*128+x)*4+2] = d; - buffer[(y*128+x)*4+3] = 255; - } - } - - R_WriteTGA( "lights/squarelight.tga", buffer, width, height ); - - R_StaticFree( buffer ); -} - -static void CreateFlashOff( void ) { - byte *buffer; - int x, y; - int d; - int width, height; - - width = 256; - height = 4; - - buffer = (byte *)R_StaticAlloc( width * height * 4 ); - - for ( x = 0 ; x < width ; x++ ) { - for ( y = 0 ; y < height ; y++ ) { - d = 255 - ( x * 256 / width ); - buffer[(y*width+x)*4+0] = - buffer[(y*width+x)*4+1] = - buffer[(y*width+x)*4+2] = d; - buffer[(y*width+x)*4+3] = 255; - } - } - - R_WriteTGA( "lights/flashoff.tga", buffer, width, height ); - - R_StaticFree( buffer ); -} - - -/* -=============== -CreatePitFogImage -=============== -*/ -void CreatePitFogImage( void ) { - byte data[16][16][4]; - int i, j; - - memset( data, 0, sizeof( data ) ); - for ( i = 0 ; i < 16 ; i++ ) { - int a; - -#if 0 - if ( i > 14 ) { - a = 0; - } else -#endif - { - a = i * 255 / 15; - if ( a > 255 ) { - a = 255; - } - } - - for ( j = 0 ; j < 16 ; j++ ) { - data[j][i][0] = - data[j][i][1] = - data[j][i][2] = 255; - data[j][i][3] = a; - } - } - - R_WriteTGA( "shapes/pitFalloff.tga", data[0][0], 16, 16 ); -} - -/* -=============== -CreatealphaSquareImage -=============== -*/ -void CreatealphaSquareImage( void ) { - byte data[16][16][4]; - int i, j; - - for ( i = 0 ; i < 16 ; i++ ) { - int a; - - for ( j = 0 ; j < 16 ; j++ ) { - if ( i == 0 || i == 15 || j == 0 || j == 15 ) { - a = 0; - } else { - a = 255; - } - data[j][i][0] = - data[j][i][1] = - data[j][i][2] = 255; - data[j][i][3] = a; - } - } - - R_WriteTGA( "shapes/alphaSquare.tga", data[0][0], 16, 16 ); -} - -#define NORMAL_MAP_SIZE 32 - -/*** NORMALIZATION CUBE MAP CONSTRUCTION ***/ - -/* Given a cube map face index, cube map size, and integer 2D face position, - * return the cooresponding normalized vector. - */ -static void getCubeVector(int i, int cubesize, int x, int y, float *vector) { - float s, t, sc, tc, mag; - - s = ((float)x + 0.5) / (float)cubesize; - t = ((float)y + 0.5) / (float)cubesize; - sc = s*2.0 - 1.0; - tc = t*2.0 - 1.0; - - switch (i) { - case 0: - vector[0] = 1.0; - vector[1] = -tc; - vector[2] = -sc; - break; - case 1: - vector[0] = -1.0; - vector[1] = -tc; - vector[2] = sc; - break; - case 2: - vector[0] = sc; - vector[1] = 1.0; - vector[2] = tc; - break; - case 3: - vector[0] = sc; - vector[1] = -1.0; - vector[2] = -tc; - break; - case 4: - vector[0] = sc; - vector[1] = -tc; - vector[2] = 1.0; - break; - case 5: - vector[0] = -sc; - vector[1] = -tc; - vector[2] = -1.0; - break; - } - - mag = idMath::InvSqrt(vector[0]*vector[0] + vector[1]*vector[1] + vector[2]*vector[2]); - vector[0] *= mag; - vector[1] *= mag; - vector[2] *= mag; -} - -/* Initialize a cube map texture object that generates RGB values - * that when expanded to a [-1,1] range in the register combiners - * form a normalized vector matching the per-pixel vector used to - * access the cube map. - */ -static void makeNormalizeVectorCubeMap( idImage *image ) { - float vector[3]; - int i, x, y; - byte *pixels[6]; - int size; - - size = NORMAL_MAP_SIZE; - - pixels[0] = (GLubyte*) Mem_Alloc(size*size*4*6); - - for (i = 0; i < 6; i++) { - pixels[i] = pixels[0] + i*size*size*4; - for (y = 0; y < size; y++) { - for (x = 0; x < size; x++) { - getCubeVector(i, size, x, y, vector); - pixels[i][4*(y*size+x) + 0] = (byte)(128 + 127*vector[0]); - pixels[i][4*(y*size+x) + 1] = (byte)(128 + 127*vector[1]); - pixels[i][4*(y*size+x) + 2] = (byte)(128 + 127*vector[2]); - pixels[i][4*(y*size+x) + 3] = 255; - } - } - } - - image->GenerateCubeImage( (const byte **)pixels, size, - TF_LINEAR, false, TD_HIGH_QUALITY ); - - Mem_Free(pixels[0]); -} - - - - -/* -================ -R_CreateNoFalloffImage - -This is a solid white texture that is zero clamped. -================ -*/ -static void R_CreateNoFalloffImage( idImage *image ) { - int x,y; - byte data[16][FALLOFF_TEXTURE_SIZE][4]; - - memset( data, 0, sizeof( data ) ); - for (x=1 ; xGenerateImage( (byte *)data, FALLOFF_TEXTURE_SIZE, 16, - TF_DEFAULT, false, TR_CLAMP_TO_ZERO, TD_HIGH_QUALITY ); -} - - -/* -================ -R_FogImage - -We calculate distance correctly in two planes, but the -third will still be projection based -================ -*/ -const int FOG_SIZE = 128; - -void R_FogImage( idImage *image ) { - int x,y; - byte data[FOG_SIZE][FOG_SIZE][4]; - int b; - -float step[256]; -int i; -float remaining = 1.0; -for ( i = 0 ; i < 256 ; i++ ) { - step[i] = remaining; - remaining *= 0.982f; -} - - for (x=0 ; x 255 ) { - b = 255; - } -b = (byte)(255 * ( 1.0 - step[b] )); - if ( x == 0 || x == FOG_SIZE-1 || y == 0 || y == FOG_SIZE-1 ) { - b = 255; // avoid clamping issues - } - data[y][x][0] = - data[y][x][1] = - data[y][x][2] = 255; - data[y][x][3] = b; - } - } - - image->GenerateImage( (byte *)data, FOG_SIZE, FOG_SIZE, - TF_LINEAR, false, TR_CLAMP, TD_HIGH_QUALITY ); -} - - -/* -================ -FogFraction - -Height values below zero are inside the fog volume -================ -*/ -static const float RAMP_RANGE = 8; -static const float DEEP_RANGE = -30; -static float FogFraction( float viewHeight, float targetHeight ) { - float total = idMath::Fabs( targetHeight - viewHeight ); - -// return targetHeight >= 0 ? 0 : 1.0; - - // only ranges that cross the ramp range are special - if ( targetHeight > 0 && viewHeight > 0 ) { - return 0.0; - } - if ( targetHeight < -RAMP_RANGE && viewHeight < -RAMP_RANGE ) { - return 1.0; - } - - float above; - if ( targetHeight > 0 ) { - above = targetHeight; - } else if ( viewHeight > 0 ) { - above = viewHeight; - } else { - above = 0; - } - - float rampTop, rampBottom; - - if ( viewHeight > targetHeight ) { - rampTop = viewHeight; - rampBottom = targetHeight; - } else { - rampTop = targetHeight; - rampBottom = viewHeight; - } - if ( rampTop > 0 ) { - rampTop = 0; - } - if ( rampBottom < -RAMP_RANGE ) { - rampBottom = -RAMP_RANGE; - } - - float rampSlope = 1.0 / RAMP_RANGE; - - if ( !total ) { - return -viewHeight * rampSlope; - } - - float ramp = ( 1.0 - ( rampTop * rampSlope + rampBottom * rampSlope ) * -0.5 ) * ( rampTop - rampBottom ); - - float frac = ( total - above - ramp ) / total; - - // after it gets moderately deep, always use full value - float deepest = viewHeight < targetHeight ? viewHeight : targetHeight; - - float deepFrac = deepest / DEEP_RANGE; - if ( deepFrac >= 1.0 ) { - return 1.0; - } - - frac = frac * ( 1.0 - deepFrac ) + deepFrac; - - return frac; -} - -/* -================ -R_FogEnterImage - -Modulate the fog alpha density based on the distance of the -start and end points to the terminator plane -================ -*/ -void R_FogEnterImage( idImage *image ) { - int x,y; - byte data[FOG_ENTER_SIZE][FOG_ENTER_SIZE][4]; - int b; - - for (x=0 ; x 255 ) { - b = 255; - } - data[y][x][0] = - data[y][x][1] = - data[y][x][2] = 255; - data[y][x][3] = b; - } - } - - // if mipmapped, acutely viewed surfaces fade wrong - image->GenerateImage( (byte *)data, FOG_ENTER_SIZE, FOG_ENTER_SIZE, - TF_LINEAR, false, TR_CLAMP, TD_HIGH_QUALITY ); -} - - -/* -================ -R_QuadraticImage - -================ -*/ -static const int QUADRATIC_WIDTH = 32; -static const int QUADRATIC_HEIGHT = 4; - -void R_QuadraticImage( idImage *image ) { - int x,y; - byte data[QUADRATIC_HEIGHT][QUADRATIC_WIDTH][4]; - int b; - - - for (x=0 ; x 255 ) { - b = 255; - } - data[y][x][0] = - data[y][x][1] = - data[y][x][2] = b; - data[y][x][3] = 255; - } - } - - image->GenerateImage( (byte *)data, QUADRATIC_WIDTH, QUADRATIC_HEIGHT, - TF_DEFAULT, false, TR_CLAMP, TD_HIGH_QUALITY ); -} - -//===================================================================== - - -typedef struct { - char *name; - int minimize, maximize; -} filterName_t; - - - -/* -=============== -ChangeTextureFilter - -This resets filtering on all loaded images -New images will automatically pick up the current values. -=============== -*/ -void idImageManager::ChangeTextureFilter( void ) { - int i; - idImage *glt; - const char *string; -static filterName_t textureFilters[] = { - {"GL_LINEAR_MIPMAP_NEAREST", GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR}, - {"GL_LINEAR_MIPMAP_LINEAR", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR}, - {"GL_NEAREST", GL_NEAREST, GL_NEAREST}, - {"GL_LINEAR", GL_LINEAR, GL_LINEAR}, - {"GL_NEAREST_MIPMAP_NEAREST", GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST}, - {"GL_NEAREST_MIPMAP_LINEAR", GL_NEAREST_MIPMAP_LINEAR, GL_NEAREST} -}; - - // if these are changed dynamically, it will force another ChangeTextureFilter - image_filter.ClearModified(); - image_anisotropy.ClearModified(); - image_lodbias.ClearModified(); - - string = image_filter.GetString(); - for ( i = 0; i < 6; i++ ) { - if ( !idStr::Icmp( textureFilters[i].name, string ) ) { - break; - } - } - - if ( i == 6 ) { - common->Warning( "bad r_textureFilter: '%s'", string); - // default to LINEAR_MIPMAP_NEAREST - i = 0; - } - - // set the values for future images - textureMinFilter = textureFilters[i].minimize; - textureMaxFilter = textureFilters[i].maximize; - textureAnisotropy = image_anisotropy.GetFloat(); - if ( textureAnisotropy < 1 ) { - textureAnisotropy = 1; - } else if ( textureAnisotropy > glConfig.maxTextureAnisotropy ) { - textureAnisotropy = glConfig.maxTextureAnisotropy; - } - textureLODBias = image_lodbias.GetFloat(); - - // change all the existing mipmap texture objects with default filtering - - for ( i = 0 ; i < images.Num() ; i++ ) { - unsigned int texEnum = GL_TEXTURE_2D; - - glt = images[ i ]; - - switch( glt->type ) { - case TT_2D: - texEnum = GL_TEXTURE_2D; - break; - case TT_3D: - texEnum = GL_TEXTURE_3D; - break; - case TT_CUBIC: - texEnum = GL_TEXTURE_CUBE_MAP_EXT; - break; - } - - // make sure we don't start a background load - if ( glt->texnum == idImage::TEXTURE_NOT_LOADED ) { - continue; - } - glt->Bind(); - if ( glt->filter == TF_DEFAULT ) { - qglTexParameterf(texEnum, GL_TEXTURE_MIN_FILTER, globalImages->textureMinFilter ); - qglTexParameterf(texEnum, GL_TEXTURE_MAG_FILTER, globalImages->textureMaxFilter ); - } - if ( glConfig.anisotropicAvailable ) { - qglTexParameterf(texEnum, GL_TEXTURE_MAX_ANISOTROPY_EXT, globalImages->textureAnisotropy ); - } - if ( glConfig.textureLODBiasAvailable ) { - qglTexParameterf(texEnum, GL_TEXTURE_LOD_BIAS_EXT, globalImages->textureLODBias ); - } - } -} - -/* -=============== -idImage::Reload -=============== -*/ -void idImage::Reload( bool checkPrecompressed, bool force ) { - // always regenerate functional images - if ( generatorFunction ) { - common->DPrintf( "regenerating %s.\n", imgName.c_str() ); - generatorFunction( this ); - return; - } - - // check file times - if ( !force ) { - ID_TIME_T current; - - if ( cubeFiles != CF_2D ) { - R_LoadCubeImages( imgName, cubeFiles, NULL, NULL, ¤t ); - } else { - // get the current values - R_LoadImageProgram( imgName, NULL, NULL, NULL, ¤t ); - } - if ( current <= timestamp ) { - return; - } - } - - common->DPrintf( "reloading %s.\n", imgName.c_str() ); - - PurgeImage(); - - // force no precompressed image check, which will cause it to be reloaded - // from source, and another precompressed file generated. - // Load is from the front end, so the back end must be synced - ActuallyLoadImage( checkPrecompressed, false ); -} - -/* -=============== -R_ReloadImages_f - -Regenerate all images that came directly from files that have changed, so -any saved changes will show up in place. - -New r_texturesize/r_texturedepth variables will take effect on reload - -reloadImages -=============== -*/ -void R_ReloadImages_f( const idCmdArgs &args ) { - int i; - idImage *image; - bool all; - bool checkPrecompressed; - - // this probably isn't necessary... - globalImages->ChangeTextureFilter(); - - all = false; - checkPrecompressed = false; // if we are doing this as a vid_restart, look for precompressed like normal - - if ( args.Argc() == 2 ) { - if ( !idStr::Icmp( args.Argv(1), "all" ) ) { - all = true; - } else if ( !idStr::Icmp( args.Argv(1), "reload" ) ) { - all = true; - checkPrecompressed = true; - } else { - common->Printf( "USAGE: reloadImages \n" ); - return; - } - } - - for ( i = 0 ; i < globalImages->images.Num() ; i++ ) { - image = globalImages->images[ i ]; - image->Reload( checkPrecompressed, all ); - } -} - -typedef struct { - idImage *image; - int size; -} sortedImage_t; - -/* -======================= -R_QsortImageSizes - -======================= -*/ -static int R_QsortImageSizes( const void *a, const void *b ) { - const sortedImage_t *ea, *eb; - - ea = (sortedImage_t *)a; - eb = (sortedImage_t *)b; - - if ( ea->size > eb->size ) { - return -1; - } - if ( ea->size < eb->size ) { - return 1; - } - return idStr::Icmp( ea->image->imgName, eb->image->imgName ); -} - -/* -=============== -R_ListImages_f -=============== -*/ -void R_ListImages_f( const idCmdArgs &args ) { - int i, j, partialSize; - idImage *image; - int totalSize; - int count = 0; - int matchTag = 0; - bool uncompressedOnly = false; - bool unloaded = false; - bool partial = false; - bool cached = false; - bool uncached = false; - bool failed = false; - bool touched = false; - bool sorted = false; - bool duplicated = false; - bool byClassification = false; - bool overSized = false; - - if ( args.Argc() == 1 ) { - - } else if ( args.Argc() == 2 ) { - if ( idStr::Icmp( args.Argv( 1 ), "uncompressed" ) == 0 ) { - uncompressedOnly = true; - } else if ( idStr::Icmp( args.Argv( 1 ), "sorted" ) == 0 ) { - sorted = true; - } else if ( idStr::Icmp( args.Argv( 1 ), "partial" ) == 0 ) { - partial = true; - } else if ( idStr::Icmp( args.Argv( 1 ), "unloaded" ) == 0 ) { - unloaded = true; - } else if ( idStr::Icmp( args.Argv( 1 ), "cached" ) == 0 ) { - cached = true; - } else if ( idStr::Icmp( args.Argv( 1 ), "uncached" ) == 0 ) { - uncached = true; - } else if ( idStr::Icmp( args.Argv( 1 ), "tagged" ) == 0 ) { - matchTag = 1; - } else if ( idStr::Icmp( args.Argv( 1 ), "duplicated" ) == 0 ) { - duplicated = true; - } else if ( idStr::Icmp( args.Argv( 1 ), "touched" ) == 0 ) { - touched = true; - } else if ( idStr::Icmp( args.Argv( 1 ), "classify" ) == 0 ) { - byClassification = true; - sorted = true; - } else if ( idStr::Icmp( args.Argv( 1 ), "oversized" ) == 0 ) { - byClassification = true; - sorted = true; - overSized = true; - } else { - failed = true; - } - } else { - failed = true; - } - - if ( failed ) { - common->Printf( "usage: listImages [ sorted | partial | unloaded | cached | uncached | tagged | duplicated | touched | classify | showOverSized ]\n" ); - return; - } - - const char *header = " -w-- -h-- filt -fmt-- wrap size --name-------\n"; - common->Printf( "\n%s", header ); - - totalSize = 0; - - sortedImage_t *sortedArray = (sortedImage_t *)alloca( sizeof( sortedImage_t ) * globalImages->images.Num() ); - - for ( i = 0 ; i < globalImages->images.Num() ; i++ ) { - image = globalImages->images[ i ]; - - if ( uncompressedOnly ) { - if ( ( image->internalFormat >= GL_COMPRESSED_RGB_S3TC_DXT1_EXT && image->internalFormat <= GL_COMPRESSED_RGBA_S3TC_DXT5_EXT ) - || image->internalFormat == GL_COLOR_INDEX8_EXT ) { - continue; - } - } - - if ( matchTag && image->classification != matchTag ) { - continue; - } - if ( unloaded && image->texnum != idImage::TEXTURE_NOT_LOADED ) { - continue; - } - if ( partial && !image->isPartialImage ) { - continue; - } - if ( cached && ( !image->partialImage || image->texnum == idImage::TEXTURE_NOT_LOADED ) ) { - continue; - } - if ( uncached && ( !image->partialImage || image->texnum != idImage::TEXTURE_NOT_LOADED ) ) { - continue; - } - - // only print duplicates (from mismatched wrap / clamp, etc) - if ( duplicated ) { - int j; - for ( j = i+1 ; j < globalImages->images.Num() ; j++ ) { - if ( idStr::Icmp( image->imgName, globalImages->images[ j ]->imgName ) == 0 ) { - break; - } - } - if ( j == globalImages->images.Num() ) { - continue; - } - } - - // "listimages touched" will list only images bound since the last "listimages touched" call - if ( touched ) { - if ( image->bindCount == 0 ) { - continue; - } - image->bindCount = 0; - } - - if ( sorted ) { - sortedArray[count].image = image; - sortedArray[count].size = image->StorageSize(); - } else { - common->Printf( "%4i:", i ); - image->Print(); - } - totalSize += image->StorageSize(); - count++; - } - - if ( sorted ) { - qsort( sortedArray, count, sizeof( sortedImage_t ), R_QsortImageSizes ); - partialSize = 0; - for ( i = 0 ; i < count ; i++ ) { - common->Printf( "%4i:", i ); - sortedArray[i].image->Print(); - partialSize += sortedArray[i].image->StorageSize(); - if ( ( (i+1) % 10 ) == 0 ) { - common->Printf( "-------- %5.1f of %5.1f megs --------\n", - partialSize / (1024*1024.0), totalSize / (1024*1024.0) ); - } - } - } - - common->Printf( "%s", header ); - common->Printf( " %i images (%i total)\n", count, globalImages->images.Num() ); - common->Printf( " %5.1f total megabytes of images\n\n\n", totalSize / (1024*1024.0) ); - - if ( byClassification ) { - - idList< int > classifications[IC_COUNT]; - - for ( i = 0 ; i < count ; i++ ) { - int cl = ClassifyImage( sortedArray[i].image->imgName ); - classifications[ cl ].Append( i ); - } - - for ( i = 0; i < IC_COUNT; i++ ) { - partialSize = 0; - idList< int > overSizedList; - for ( j = 0; j < classifications[ i ].Num(); j++ ) { - partialSize += sortedArray[ classifications[ i ][ j ] ].image->StorageSize(); - if ( overSized ) { - if ( sortedArray[ classifications[ i ][ j ] ].image->uploadWidth > IC_Info[i].maxWidth && sortedArray[ classifications[ i ][ j ] ].image->uploadHeight > IC_Info[i].maxHeight ) { - overSizedList.Append( classifications[ i ][ j ] ); - } - } - } - common->Printf ( " Classification %s contains %i images using %5.1f megabytes\n", IC_Info[i].desc, classifications[i].Num(), partialSize / ( 1024*1024.0 ) ); - if ( overSized && overSizedList.Num() ) { - common->Printf( " The following images may be oversized\n" ); - for ( j = 0; j < overSizedList.Num(); j++ ) { - common->Printf( " " ); - sortedArray[ overSizedList[ j ] ].image->Print(); - common->Printf( "\n" ); - } - } - } - } - -} - -/* -================== -SetNormalPalette - -Create a 256 color palette to be used by compressed normal maps -================== -*/ -void idImageManager::SetNormalPalette( void ) { - int i, j; - idVec3 v; - float t; - //byte temptable[768]; - byte *temptable = compressedPalette; - int compressedToOriginal[16]; - - // make an ad-hoc separable compression mapping scheme - for ( i = 0 ; i < 8 ; i++ ) { - float f, y; - - f = ( i + 1 ) / 8.5; - y = idMath::Sqrt( 1.0 - f * f ); - y = 1.0 - y; - - compressedToOriginal[7-i] = 127 - (int)( y * 127 + 0.5 ); - compressedToOriginal[8+i] = 128 + (int)( y * 127 + 0.5 ); - } - - for ( i = 0 ; i < 256 ; i++ ) { - if ( i <= compressedToOriginal[0] ) { - originalToCompressed[i] = 0; - } else if ( i >= compressedToOriginal[15] ) { - originalToCompressed[i] = 15; - } else { - for ( j = 0 ; j < 14 ; j++ ) { - if ( i <= compressedToOriginal[j+1] ) { - break; - } - } - if ( i - compressedToOriginal[j] < compressedToOriginal[j+1] - i ) { - originalToCompressed[i] = j; - } else { - originalToCompressed[i] = j + 1; - } - } - } - -#if 0 - for ( i = 0; i < 16; i++ ) { - for ( j = 0 ; j < 16 ; j++ ) { - - v[0] = ( i - 7.5 ) / 8; - v[1] = ( j - 7.5 ) / 8; - - t = 1.0 - ( v[0]*v[0] + v[1]*v[1] ); - if ( t < 0 ) { - t = 0; - } - v[2] = idMath::Sqrt( t ); - - temptable[(i*16+j)*3+0] = 128 + floor( 127 * v[0] + 0.5 ); - temptable[(i*16+j)*3+1] = 128 + floor( 127 * v[1] ); - temptable[(i*16+j)*3+2] = 128 + floor( 127 * v[2] ); - } - } -#else - for ( i = 0; i < 16; i++ ) { - for ( j = 0 ; j < 16 ; j++ ) { - - v[0] = ( compressedToOriginal[i] - 127.5 ) / 128; - v[1] = ( compressedToOriginal[j] - 127.5 ) / 128; - - t = 1.0 - ( v[0]*v[0] + v[1]*v[1] ); - if ( t < 0 ) { - t = 0; - } - v[2] = idMath::Sqrt( t ); - - temptable[(i*16+j)*3+0] = (byte)(128 + floor( 127 * v[0] + 0.5 )); - temptable[(i*16+j)*3+1] = (byte)(128 + floor( 127 * v[1] )); - temptable[(i*16+j)*3+2] = (byte)(128 + floor( 127 * v[2] )); - } - } -#endif - - // color 255 will be the "nullnormal" color for no reflection - temptable[255*3+0] = - temptable[255*3+1] = - temptable[255*3+2] = 128; - - if ( !glConfig.sharedTexturePaletteAvailable ) { - return; - } - - qglColorTableEXT( GL_SHARED_TEXTURE_PALETTE_EXT, - GL_RGB, - 256, - GL_RGB, - GL_UNSIGNED_BYTE, - temptable ); - - qglEnable( GL_SHARED_TEXTURE_PALETTE_EXT ); -} - -/* -============== -AllocImage - -Allocates an idImage, adds it to the list, -copies the name, and adds it to the hash chain. -============== -*/ -idImage *idImageManager::AllocImage( const char *name ) { - idImage *image; - int hash; - - if (strlen(name) >= MAX_IMAGE_NAME ) { - common->Error ("idImageManager::AllocImage: \"%s\" is too long\n", name); - } - - hash = idStr( name ).FileNameHash(); - - image = new idImage; - images.Append( image ); - - image->hashNext = imageHashTable[hash]; - imageHashTable[hash] = image; - - image->imgName = name; - - return image; -} - -/* -================== -ImageFromFunction - -Images that are procedurally generated are allways specified -with a callback which must work at any time, allowing the OpenGL -system to be completely regenerated if needed. -================== -*/ -idImage *idImageManager::ImageFromFunction( const char *_name, void (*generatorFunction)( idImage *image ) ) { - idStr name; - idImage *image; - int hash; - - if ( !name ) { - common->FatalError( "idImageManager::ImageFromFunction: NULL name" ); - } - - // strip any .tga file extensions from anywhere in the _name - name = _name; - name.Replace( ".tga", "" ); - name.BackSlashesToSlashes(); - - // see if the image already exists - hash = name.FileNameHash(); - for ( image = imageHashTable[hash] ; image; image = image->hashNext ) { - if ( name.Icmp( image->imgName ) == 0 ) { - if ( image->generatorFunction != generatorFunction ) { - common->DPrintf( "WARNING: reused image %s with mixed generators\n", name.c_str() ); - } - return image; - } - } - - // create the image and issue the callback - image = AllocImage( name ); - - image->generatorFunction = generatorFunction; - - if ( image_preload.GetBool() ) { - // check for precompressed, load is from the front end - image->referencedOutsideLevelLoad = true; - image->ActuallyLoadImage( true, false ); - } - - return image; -} - -/* -=============== -ImageFromFile - -Finds or loads the given image, always returning a valid image pointer. -Loading of the image may be deferred for dynamic loading. -============== -*/ -idImage *idImageManager::ImageFromFile( const char *_name, textureFilter_t filter, bool allowDownSize, - textureRepeat_t repeat, textureDepth_t depth, cubeFiles_t cubeMap ) { - idStr name; - idImage *image; - int hash; - - if ( !_name || !_name[0] || idStr::Icmp( _name, "default" ) == 0 || idStr::Icmp( _name, "_default" ) == 0 ) { - declManager->MediaPrint( "DEFAULTED\n" ); - return globalImages->defaultImage; - } - - // strip any .tga file extensions from anywhere in the _name, including image program parameters - name = _name; - name.Replace( ".tga", "" ); - name.BackSlashesToSlashes(); - - // - // see if the image is already loaded, unless we - // are in a reloadImages call - // - hash = name.FileNameHash(); - for ( image = imageHashTable[hash]; image; image = image->hashNext ) { - if ( name.Icmp( image->imgName ) == 0 ) { - // the built in's, like _white and _flat always match the other options - if ( name[0] == '_' ) { - return image; - } - if ( image->cubeFiles != cubeMap ) { - common->Error( "Image '%s' has been referenced with conflicting cube map states", _name ); - } - - if ( image->filter != filter || image->repeat != repeat ) { - // we might want to have the system reset these parameters on every bind and - // share the image data - continue; - } - - if ( image->allowDownSize == allowDownSize && image->depth == depth ) { - // note that it is used this level load - image->levelLoadReferenced = true; - if ( image->partialImage != NULL ) { - image->partialImage->levelLoadReferenced = true; - } - return image; - } - - // the same image is being requested, but with a different allowDownSize or depth - // so pick the highest of the two and reload the old image with those parameters - if ( !image->allowDownSize ) { - allowDownSize = false; - } - if ( image->depth > depth ) { - depth = image->depth; - } - if ( image->allowDownSize == allowDownSize && image->depth == depth ) { - // the already created one is already the highest quality - image->levelLoadReferenced = true; - if ( image->partialImage != NULL ) { - image->partialImage->levelLoadReferenced = true; - } - return image; - } - - image->allowDownSize = allowDownSize; - image->depth = depth; - image->levelLoadReferenced = true; - if ( image->partialImage != NULL ) { - image->partialImage->levelLoadReferenced = true; - } - if ( image_preload.GetBool() && !insideLevelLoad ) { - image->referencedOutsideLevelLoad = true; - image->ActuallyLoadImage( true, false ); // check for precompressed, load is from front end - declManager->MediaPrint( "%ix%i %s (reload for mixed referneces)\n", image->uploadWidth, image->uploadHeight, image->imgName.c_str() ); - } - return image; - } - } - - // - // create a new image - // - image = AllocImage( name ); - - // HACK: to allow keep fonts from being mip'd, as new ones will be introduced with localization - // this keeps us from having to make a material for each font tga - if ( name.Find( "fontImage_") >= 0 ) { - allowDownSize = false; - } - - image->allowDownSize = allowDownSize; - image->repeat = repeat; - image->depth = depth; - image->type = TT_2D; - image->cubeFiles = cubeMap; - image->filter = filter; - - image->levelLoadReferenced = true; - - // also create a shrunken version if we are going to dynamically cache the full size image - if ( image->ShouldImageBePartialCached() ) { - // if we only loaded part of the file, create a new idImage for the shrunken version - image->partialImage = new idImage; - - image->partialImage->allowDownSize = allowDownSize; - image->partialImage->repeat = repeat; - image->partialImage->depth = depth; - image->partialImage->type = TT_2D; - image->partialImage->cubeFiles = cubeMap; - image->partialImage->filter = filter; - - image->partialImage->levelLoadReferenced = true; - - // we don't bother hooking this into the hash table for lookup, but we do add it to the manager - // list for listImages - globalImages->images.Append( image->partialImage ); - image->partialImage->imgName = image->imgName; - image->partialImage->isPartialImage = true; - - // let the background file loader know that we can load - image->precompressedFile = true; - - if ( image_preload.GetBool() && !insideLevelLoad ) { - image->partialImage->ActuallyLoadImage( true, false ); // check for precompressed, load is from front end - declManager->MediaPrint( "%ix%i %s\n", image->partialImage->uploadWidth, image->partialImage->uploadHeight, image->imgName.c_str() ); - } else { - declManager->MediaPrint( "%s\n", image->imgName.c_str() ); - } - return image; - } - - // load it if we aren't in a level preload - if ( image_preload.GetBool() && !insideLevelLoad ) { - image->referencedOutsideLevelLoad = true; - image->ActuallyLoadImage( true, false ); // check for precompressed, load is from front end - declManager->MediaPrint( "%ix%i %s\n", image->uploadWidth, image->uploadHeight, image->imgName.c_str() ); - } else { - declManager->MediaPrint( "%s\n", image->imgName.c_str() ); - } - - return image; -} - -/* -=============== -idImageManager::GetImage -=============== -*/ -idImage *idImageManager::GetImage( const char *_name ) const { - idStr name; - idImage *image; - int hash; - - if ( !_name || !_name[0] || idStr::Icmp( _name, "default" ) == 0 || idStr::Icmp( _name, "_default" ) == 0 ) { - declManager->MediaPrint( "DEFAULTED\n" ); - return globalImages->defaultImage; - } - - // strip any .tga file extensions from anywhere in the _name, including image program parameters - name = _name; - name.Replace( ".tga", "" ); - name.BackSlashesToSlashes(); - - // - // look in loaded images - // - hash = name.FileNameHash(); - for ( image = imageHashTable[hash]; image; image = image->hashNext ) { - if ( name.Icmp( image->imgName ) == 0 ) { - return image; - } - } - - return NULL; -} - -/* -=============== -PurgeAllImages -=============== -*/ -void idImageManager::PurgeAllImages() { - int i; - idImage *image; - - for ( i = 0; i < images.Num() ; i++ ) { - image = images[i]; - image->PurgeImage(); - } -} - -/* -=============== -ReloadAllImages -=============== -*/ -void idImageManager::ReloadAllImages() { - idCmdArgs args; - - // build the compressed normal map palette - SetNormalPalette(); - - args.TokenizeString( "reloadImages reload", false ); - R_ReloadImages_f( args ); -} - -/* -=============== -R_CombineCubeImages_f - -Used to combine animations of six separate tga files into -a serials of 6x taller tga files, for preparation to roq compress -=============== -*/ -void R_CombineCubeImages_f( const idCmdArgs &args ) { - if ( args.Argc() != 2 ) { - common->Printf( "usage: combineCubeImages \n" ); - common->Printf( " combines basename[1-6][0001-9999].tga to basenameCM[0001-9999].tga\n" ); - common->Printf( " 1: forward 2:right 3:back 4:left 5:up 6:down\n" ); - return; - } - - idStr baseName = args.Argv( 1 ); - common->SetRefreshOnPrint( true ); - - for ( int frameNum = 1 ; frameNum < 10000 ; frameNum++ ) { - char filename[MAX_IMAGE_NAME]; - byte *pics[6]; - int width, height; - int side; - int orderRemap[6] = { 1,3,4,2,5,6 }; - for ( side = 0 ; side < 6 ; side++ ) { - sprintf( filename, "%s%i%04i.tga", baseName.c_str(), orderRemap[side], frameNum ); - - common->Printf( "reading %s\n", filename ); - R_LoadImage( filename, &pics[side], &width, &height, NULL, true ); - - if ( !pics[side] ) { - common->Printf( "not found.\n" ); - break; - } - - // convert from "camera" images to native cube map images - switch( side ) { - case 0: // forward - R_RotatePic( pics[side], width); - break; - case 1: // back - R_RotatePic( pics[side], width); - R_HorizontalFlip( pics[side], width, height ); - R_VerticalFlip( pics[side], width, height ); - break; - case 2: // left - R_VerticalFlip( pics[side], width, height ); - break; - case 3: // right - R_HorizontalFlip( pics[side], width, height ); - break; - case 4: // up - R_RotatePic( pics[side], width); - break; - case 5: // down - R_RotatePic( pics[side], width); - break; - } - } - - if ( side != 6 ) { - for ( int i = 0 ; i < side ; side++ ) { - Mem_Free( pics[side] ); - } - break; - } - - byte *combined = (byte *)Mem_Alloc( width*height*6*4 ); - for ( side = 0 ; side < 6 ; side++ ) { - memcpy( combined+width*height*4*side, pics[side], width*height*4 ); - Mem_Free( pics[side] ); - } - sprintf( filename, "%sCM%04i.tga", baseName.c_str(), frameNum ); - - common->Printf( "writing %s\n", filename ); - R_WriteTGA( filename, combined, width, height*6 ); - - Mem_Free( combined ); - } - common->SetRefreshOnPrint( false ); -} - - -/* -================== -idImage::StartBackgroundImageLoad -================== -*/ -void idImage::StartBackgroundImageLoad() { - if ( imageManager.numActiveBackgroundImageLoads >= idImageManager::MAX_BACKGROUND_IMAGE_LOADS ) { - return; - } - if ( globalImages->image_showBackgroundLoads.GetBool() ) { - common->Printf( "idImage::StartBackgroundImageLoad: %s\n", imgName.c_str() ); - } - backgroundLoadInProgress = true; - - if ( !precompressedFile ) { - common->Warning( "idImageManager::StartBackgroundImageLoad: %s wasn't a precompressed file", imgName.c_str() ); - return; - } - - bglNext = globalImages->backgroundImageLoads; - globalImages->backgroundImageLoads = this; - - char filename[MAX_IMAGE_NAME]; - ImageProgramStringToCompressedFileName( imgName, filename ); - - bgl.completed = false; - bgl.f = fileSystem->OpenFileRead( filename ); - if ( !bgl.f ) { - common->Warning( "idImageManager::StartBackgroundImageLoad: Couldn't load %s", imgName.c_str() ); - return; - } - bgl.file.position = 0; - bgl.file.length = bgl.f->Length(); - if ( bgl.file.length < sizeof( ddsFileHeader_t ) ) { - common->Warning( "idImageManager::StartBackgroundImageLoad: %s had a bad file length", imgName.c_str() ); - return; - } - - bgl.file.buffer = R_StaticAlloc( bgl.file.length ); - - fileSystem->BackgroundDownload( &bgl ); - - imageManager.numActiveBackgroundImageLoads++; - - // purge some images if necessary - int totalSize = 0; - for ( idImage *check = globalImages->cacheLRU.cacheUsageNext ; check != &globalImages->cacheLRU ; check = check->cacheUsageNext ) { - totalSize += check->StorageSize(); - } - int needed = this->StorageSize(); - - while ( ( totalSize + needed ) > globalImages->image_cacheMegs.GetFloat() * 1024 * 1024 ) { - // purge the least recently used - idImage *check = globalImages->cacheLRU.cacheUsagePrev; - if ( check->texnum != TEXTURE_NOT_LOADED ) { - totalSize -= check->StorageSize(); - if ( globalImages->image_showBackgroundLoads.GetBool() ) { - common->Printf( "purging %s\n", check->imgName.c_str() ); - } - check->PurgeImage(); - } - // remove it from the cached list - check->cacheUsageNext->cacheUsagePrev = check->cacheUsagePrev; - check->cacheUsagePrev->cacheUsageNext = check->cacheUsageNext; - check->cacheUsageNext = NULL; - check->cacheUsagePrev = NULL; - } -} - -/* -================== -R_CompleteBackgroundImageLoads - -Do we need to worry about vid_restarts here? -================== -*/ -void idImageManager::CompleteBackgroundImageLoads() { - idImage *remainingList = NULL; - idImage *next; - - for ( idImage *image = backgroundImageLoads ; image ; image = next ) { - next = image->bglNext; - if ( image->bgl.completed ) { - numActiveBackgroundImageLoads--; - fileSystem->CloseFile( image->bgl.f ); - // upload the image - image->UploadPrecompressedImage( (byte *)image->bgl.file.buffer, image->bgl.file.length ); - R_StaticFree( image->bgl.file.buffer ); - if ( image_showBackgroundLoads.GetBool() ) { - common->Printf( "R_CompleteBackgroundImageLoad: %s\n", image->imgName.c_str() ); - } - } else { - image->bglNext = remainingList; - remainingList = image; - } - } - if ( image_showBackgroundLoads.GetBool() ) { - static int prev; - if ( numActiveBackgroundImageLoads != prev ) { - prev = numActiveBackgroundImageLoads; - common->Printf( "background Loads: %i\n", numActiveBackgroundImageLoads ); - } - } - - backgroundImageLoads = remainingList; -} - -/* -=============== -CheckCvars -=============== -*/ -void idImageManager::CheckCvars() { - // textureFilter stuff - if ( image_filter.IsModified() || image_anisotropy.IsModified() || image_lodbias.IsModified() ) { - ChangeTextureFilter(); - image_filter.ClearModified(); - image_anisotropy.ClearModified(); - image_lodbias.ClearModified(); - } -} - -/* -=============== -SumOfUsedImages -=============== -*/ -int idImageManager::SumOfUsedImages() { - int total; - int i; - idImage *image; - - total = 0; - for ( i = 0; i < images.Num(); i++ ) { - image = images[i]; - if ( image->frameUsed == backEnd.frameCount ) { - total += image->StorageSize(); - } - } - - return total; -} - -/* -=============== -BindNull -=============== -*/ -void idImageManager::BindNull() { - tmu_t *tmu; - - tmu = &backEnd.glState.tmu[backEnd.glState.currenttmu]; - - RB_LogComment( "BindNull()\n" ); - if ( tmu->textureType == TT_CUBIC ) { - qglDisable( GL_TEXTURE_CUBE_MAP_EXT ); - } else if ( tmu->textureType == TT_3D ) { - qglDisable( GL_TEXTURE_3D ); - } else if ( tmu->textureType == TT_2D ) { - qglDisable( GL_TEXTURE_2D ); - } - tmu->textureType = TT_DISABLED; -} - -/* -=============== -Init -=============== -*/ -void idImageManager::Init() { - - memset(imageHashTable, 0, sizeof(imageHashTable)); - - images.Resize( 1024, 1024 ); - - // clear the cached LRU - cacheLRU.cacheUsageNext = &cacheLRU; - cacheLRU.cacheUsagePrev = &cacheLRU; - - // set default texture filter modes - ChangeTextureFilter(); - - // create built in images - defaultImage = ImageFromFunction( "_default", R_DefaultImage ); - whiteImage = ImageFromFunction( "_white", R_WhiteImage ); - blackImage = ImageFromFunction( "_black", R_BlackImage ); - borderClampImage = ImageFromFunction( "_borderClamp", R_BorderClampImage ); - flatNormalMap = ImageFromFunction( "_flat", R_FlatNormalImage ); - ambientNormalMap = ImageFromFunction( "_ambient", R_AmbientNormalImage ); - specularTableImage = ImageFromFunction( "_specularTable", R_SpecularTableImage ); - specular2DTableImage = ImageFromFunction( "_specular2DTable", R_Specular2DTableImage ); - rampImage = ImageFromFunction( "_ramp", R_RampImage ); - alphaRampImage = ImageFromFunction( "_alphaRamp", R_RampImage ); - alphaNotchImage = ImageFromFunction( "_alphaNotch", R_AlphaNotchImage ); - fogImage = ImageFromFunction( "_fog", R_FogImage ); - fogEnterImage = ImageFromFunction( "_fogEnter", R_FogEnterImage ); - normalCubeMapImage = ImageFromFunction( "_normalCubeMap", makeNormalizeVectorCubeMap ); - noFalloffImage = ImageFromFunction( "_noFalloff", R_CreateNoFalloffImage ); - ImageFromFunction( "_quadratic", R_QuadraticImage ); - - // cinematicImage is used for cinematic drawing - // scratchImage is used for screen wipes/doublevision etc.. - cinematicImage = ImageFromFunction("_cinematic", R_RGBA8Image ); - scratchImage = ImageFromFunction("_scratch", R_RGBA8Image ); - scratchImage2 = ImageFromFunction("_scratch2", R_RGBA8Image ); - accumImage = ImageFromFunction("_accum", R_RGBA8Image ); - scratchCubeMapImage = ImageFromFunction("_scratchCubeMap", makeNormalizeVectorCubeMap ); - currentRenderImage = ImageFromFunction("_currentRender", R_RGBA8Image ); - - cmdSystem->AddCommand( "reloadImages", R_ReloadImages_f, CMD_FL_RENDERER, "reloads images" ); - cmdSystem->AddCommand( "listImages", R_ListImages_f, CMD_FL_RENDERER, "lists images" ); - cmdSystem->AddCommand( "combineCubeImages", R_CombineCubeImages_f, CMD_FL_RENDERER, "combines six images for roq compression" ); - - // should forceLoadImages be here? -} - -/* -=============== -Shutdown -=============== -*/ -void idImageManager::Shutdown() { - images.DeleteContents( true ); -} - -/* -==================== -BeginLevelLoad - -Mark all file based images as currently unused, -but don't free anything. Calls to ImageFromFile() will -either mark the image as used, or create a new image without -loading the actual data. -==================== -*/ -void idImageManager::BeginLevelLoad() { - insideLevelLoad = true; - - for ( int i = 0 ; i < images.Num() ; i++ ) { - idImage *image = images[ i ]; - - // generator function images are always kept around - if ( image->generatorFunction ) { - continue; - } - - if ( com_purgeAll.GetBool() ) { - image->PurgeImage(); - } - - image->levelLoadReferenced = false; - } -} - -/* -==================== -EndLevelLoad - -Free all images marked as unused, and load all images that are necessary. -This architecture prevents us from having the union of two level's -worth of data present at one time. - -preload everything, never free -preload everything, free unused after level load -blocking load on demand -preload low mip levels, background load remainder on demand -==================== -*/ -void idImageManager::EndLevelLoad() { - int start = Sys_Milliseconds(); - - insideLevelLoad = false; - if ( idAsyncNetwork::serverDedicated.GetInteger() ) { - return; - } - - common->Printf( "----- idImageManager::EndLevelLoad -----\n" ); - - int purgeCount = 0; - int keepCount = 0; - int loadCount = 0; - - // purge the ones we don't need - for ( int i = 0 ; i < images.Num() ; i++ ) { - idImage *image = images[ i ]; - if ( image->generatorFunction ) { - continue; - } - - if ( !image->levelLoadReferenced && !image->referencedOutsideLevelLoad ) { -// common->Printf( "Purging %s\n", image->imgName.c_str() ); - purgeCount++; - image->PurgeImage(); - } else if ( image->texnum != idImage::TEXTURE_NOT_LOADED ) { -// common->Printf( "Keeping %s\n", image->imgName.c_str() ); - keepCount++; - } - } - - // load the ones we do need, if we are preloading - for ( int i = 0 ; i < images.Num() ; i++ ) { - idImage *image = images[ i ]; - if ( image->generatorFunction ) { - continue; - } - - if ( image->levelLoadReferenced && image->texnum == idImage::TEXTURE_NOT_LOADED && !image->partialImage ) { -// common->Printf( "Loading %s\n", image->imgName.c_str() ); - loadCount++; - image->ActuallyLoadImage( true, false ); - - if ( ( loadCount & 15 ) == 0 ) { - session->PacifierUpdate(); - } - } - } - - int end = Sys_Milliseconds(); - common->Printf( "%5i purged from previous\n", purgeCount ); - common->Printf( "%5i kept from previous\n", keepCount ); - common->Printf( "%5i new loaded\n", loadCount ); - common->Printf( "all images loaded in %5.1f seconds\n", (end-start) * 0.001 ); - common->Printf( "----------------------------------------\n" ); -} - -/* -=============== -idImageManager::StartBuild -=============== -*/ -void idImageManager::StartBuild() { - ddsList.Clear(); - ddsHash.Free(); -} - -/* -=============== -idImageManager::FinishBuild -=============== -*/ -void idImageManager::FinishBuild( bool removeDups ) { - idFile *batchFile; - if ( removeDups ) { - ddsList.Clear(); - char *buffer = NULL; - fileSystem->ReadFile( "makedds.bat", (void**)&buffer ); - if ( buffer ) { - idStr str = buffer; - while ( str.Length() ) { - int n = str.Find( '\n' ); - if ( n > 0 ) { - idStr line = str.Left( n + 1 ); - idStr right; - str.Right( str.Length() - n - 1, right ); - str = right; - ddsList.AddUnique( line ); - } else { - break; - } - } - } - } - batchFile = fileSystem->OpenFileWrite( ( removeDups ) ? "makedds2.bat" : "makedds.bat" ); - if ( batchFile ) { - int i; - int ddsNum = ddsList.Num(); - - for ( i = 0; i < ddsNum; i++ ) { - batchFile->WriteFloatString( "%s", ddsList[ i ].c_str() ); - batchFile->Printf( "@echo Finished compressing %d of %d. %.1f percent done.\n", i+1, ddsNum, ((float)(i+1)/(float)ddsNum)*100.f ); - } - fileSystem->CloseFile( batchFile ); - } - ddsList.Clear(); - ddsHash.Free(); -} - -/* -=============== -idImageManager::AddDDSCommand -=============== -*/ -void idImageManager::AddDDSCommand( const char *cmd ) { - int i, key; - - if ( !( cmd && *cmd ) ) { - return; - } - - key = ddsHash.GenerateKey( cmd, false ); - for ( i = ddsHash.First( key ); i != -1; i = ddsHash.Next( i ) ) { - if ( ddsList[i].Icmp( cmd ) == 0 ) { - break; - } - } - - if ( i == -1 ) { - ddsList.Append( cmd ); - } -} - -/* -=============== -idImageManager::PrintMemInfo -=============== -*/ -void idImageManager::PrintMemInfo( MemInfo_t *mi ) { - int i, j, total = 0; - int *sortIndex; - idFile *f; - - f = fileSystem->OpenFileWrite( mi->filebase + "_images.txt" ); - if ( !f ) { - return; - } - - // sort first - sortIndex = new int[images.Num()]; - - for ( i = 0; i < images.Num(); i++ ) { - sortIndex[i] = i; - } - - for ( i = 0; i < images.Num() - 1; i++ ) { - for ( j = i + 1; j < images.Num(); j++ ) { - if ( images[sortIndex[i]]->StorageSize() < images[sortIndex[j]]->StorageSize() ) { - int temp = sortIndex[i]; - sortIndex[i] = sortIndex[j]; - sortIndex[j] = temp; - } - } - } - - // print next - for ( i = 0; i < images.Num(); i++ ) { - idImage *im = images[sortIndex[i]]; - int size; - - size = im->StorageSize(); - total += size; - - f->Printf( "%s %3i %s\n", idStr::FormatNumber( size ).c_str(), im->refCount, im->imgName.c_str() ); - } - - delete sortIndex; - mi->imageAssetsTotal = total; - - f->Printf( "\nTotal image bytes allocated: %s\n", idStr::FormatNumber( total ).c_str() ); - fileSystem->CloseFile( f ); -} diff --git a/src/renderer/Image_intrinsic.cpp b/src/renderer/Image_intrinsic.cpp new file mode 100644 index 00000000..53f62c9f --- /dev/null +++ b/src/renderer/Image_intrinsic.cpp @@ -0,0 +1,655 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ + +#pragma hdrstop +#include "precompiled.h" + + +#include "tr_local.h" + +#define DEFAULT_SIZE 16 + +/* +================== +idImage::MakeDefault + +the default image will be grey with a white box outline +to allow you to see the mapping coordinates on a surface +================== +*/ +void idImage::MakeDefault() { + int x, y; + byte data[DEFAULT_SIZE][DEFAULT_SIZE][4]; + + if ( com_developer.GetBool() ) { + // grey center + for ( y = 0 ; y < DEFAULT_SIZE ; y++ ) { + for ( x = 0 ; x < DEFAULT_SIZE ; x++ ) { + data[y][x][0] = 32; + data[y][x][1] = 32; + data[y][x][2] = 32; + data[y][x][3] = 255; + } + } + + // white border + for ( x = 0 ; x < DEFAULT_SIZE ; x++ ) { + data[0][x][0] = + data[0][x][1] = + data[0][x][2] = + data[0][x][3] = 255; + + data[x][0][0] = + data[x][0][1] = + data[x][0][2] = + data[x][0][3] = 255; + + data[DEFAULT_SIZE-1][x][0] = + data[DEFAULT_SIZE-1][x][1] = + data[DEFAULT_SIZE-1][x][2] = + data[DEFAULT_SIZE-1][x][3] = 255; + + data[x][DEFAULT_SIZE-1][0] = + data[x][DEFAULT_SIZE-1][1] = + data[x][DEFAULT_SIZE-1][2] = + data[x][DEFAULT_SIZE-1][3] = 255; + } + } else { + for ( y = 0 ; y < DEFAULT_SIZE ; y++ ) { + for ( x = 0 ; x < DEFAULT_SIZE ; x++ ) { + data[y][x][0] = 0; + data[y][x][1] = 0; + data[y][x][2] = 0; + data[y][x][3] = 0; + } + } + } + + GenerateImage( (byte *)data, + DEFAULT_SIZE, DEFAULT_SIZE, + TF_DEFAULT, TR_REPEAT, TD_DEFAULT ); + + defaulted = true; +} + +static void R_DefaultImage( idImage *image ) { + image->MakeDefault(); +} + +static void R_WhiteImage( idImage *image ) { + byte data[DEFAULT_SIZE][DEFAULT_SIZE][4]; + + // solid white texture + memset( data, 255, sizeof( data ) ); + image->GenerateImage( (byte *)data, DEFAULT_SIZE, DEFAULT_SIZE, + TF_DEFAULT, TR_REPEAT, TD_DEFAULT ); +} + +static void R_BlackImage( idImage *image ) { + byte data[DEFAULT_SIZE][DEFAULT_SIZE][4]; + + // solid black texture + memset( data, 0, sizeof( data ) ); + image->GenerateImage( (byte *)data, DEFAULT_SIZE, DEFAULT_SIZE, + TF_DEFAULT, TR_REPEAT, TD_DEFAULT ); +} + +static void R_RGBA8Image( idImage *image ) { + byte data[DEFAULT_SIZE][DEFAULT_SIZE][4]; + + memset( data, 0, sizeof( data ) ); + data[0][0][0] = 16; + data[0][0][1] = 32; + data[0][0][2] = 48; + data[0][0][3] = 96; + + image->GenerateImage( (byte *)data, DEFAULT_SIZE, DEFAULT_SIZE, TF_DEFAULT, TR_REPEAT, TD_LOOKUP_TABLE_RGBA ); +} + +static void R_DepthImage( idImage *image ) { + byte data[DEFAULT_SIZE][DEFAULT_SIZE][4]; + + memset( data, 0, sizeof( data ) ); + data[0][0][0] = 16; + data[0][0][1] = 32; + data[0][0][2] = 48; + data[0][0][3] = 96; + + image->GenerateImage( (byte *)data, DEFAULT_SIZE, DEFAULT_SIZE, TF_NEAREST, TR_CLAMP, TD_DEPTH ); +} + +static void R_AlphaNotchImage( idImage *image ) { + byte data[2][4]; + + // this is used for alpha test clip planes + + data[0][0] = data[0][1] = data[0][2] = 255; + data[0][3] = 0; + data[1][0] = data[1][1] = data[1][2] = 255; + data[1][3] = 255; + + image->GenerateImage( (byte *)data, 2, 1, TF_NEAREST, TR_CLAMP, TD_LOOKUP_TABLE_ALPHA ); +} + +static void R_FlatNormalImage( idImage *image ) { + byte data[DEFAULT_SIZE][DEFAULT_SIZE][4]; + + // flat normal map for default bunp mapping + for ( int i = 0 ; i < 4 ; i++ ) { + data[0][i][0] = 128; + data[0][i][1] = 128; + data[0][i][2] = 255; + data[0][i][3] = 255; + } + image->GenerateImage( (byte *)data, 2, 2, TF_DEFAULT, TR_REPEAT, TD_BUMP ); +} + +/* +================ +R_CreateNoFalloffImage + +This is a solid white texture that is zero clamped. +================ +*/ +static void R_CreateNoFalloffImage( idImage *image ) { + int x,y; + byte data[16][FALLOFF_TEXTURE_SIZE][4]; + + memset( data, 0, sizeof( data ) ); + for (x=1 ; xGenerateImage( (byte *)data, FALLOFF_TEXTURE_SIZE, 16, TF_DEFAULT, TR_CLAMP_TO_ZERO, TD_LOOKUP_TABLE_MONO ); +} + +/* +================ +R_FogImage + +We calculate distance correctly in two planes, but the +third will still be projection based +================ +*/ +const int FOG_SIZE = 128; + +void R_FogImage( idImage *image ) { + int x,y; + byte data[FOG_SIZE][FOG_SIZE][4]; + int b; + + float step[256]; + int i; + float remaining = 1.0; + for ( i = 0 ; i < 256 ; i++ ) { + step[i] = remaining; + remaining *= 0.982f; + } + + for (x=0 ; x 255 ) { + b = 255; + } + b = (byte)(255 * ( 1.0 - step[b] )); + if ( x == 0 || x == FOG_SIZE-1 || y == 0 || y == FOG_SIZE-1 ) { + b = 255; // avoid clamping issues + } + data[y][x][0] = + data[y][x][1] = + data[y][x][2] = 255; + data[y][x][3] = b; + } + } + + image->GenerateImage( (byte *)data, FOG_SIZE, FOG_SIZE, TF_LINEAR, TR_CLAMP, TD_LOOKUP_TABLE_ALPHA ); +} + + +/* +================ +FogFraction + +Height values below zero are inside the fog volume +================ +*/ +static const float RAMP_RANGE = 8; +static const float DEEP_RANGE = -30; +static float FogFraction( float viewHeight, float targetHeight ) { + float total = idMath::Fabs( targetHeight - viewHeight ); + +// return targetHeight >= 0 ? 0 : 1.0; + + // only ranges that cross the ramp range are special + if ( targetHeight > 0 && viewHeight > 0 ) { + return 0.0; + } + if ( targetHeight < -RAMP_RANGE && viewHeight < -RAMP_RANGE ) { + return 1.0; + } + + float above; + if ( targetHeight > 0 ) { + above = targetHeight; + } else if ( viewHeight > 0 ) { + above = viewHeight; + } else { + above = 0; + } + + float rampTop, rampBottom; + + if ( viewHeight > targetHeight ) { + rampTop = viewHeight; + rampBottom = targetHeight; + } else { + rampTop = targetHeight; + rampBottom = viewHeight; + } + if ( rampTop > 0 ) { + rampTop = 0; + } + if ( rampBottom < -RAMP_RANGE ) { + rampBottom = -RAMP_RANGE; + } + + float rampSlope = 1.0 / RAMP_RANGE; + + if ( !total ) { + return -viewHeight * rampSlope; + } + + float ramp = ( 1.0 - ( rampTop * rampSlope + rampBottom * rampSlope ) * -0.5 ) * ( rampTop - rampBottom ); + + float frac = ( total - above - ramp ) / total; + + // after it gets moderately deep, always use full value + float deepest = viewHeight < targetHeight ? viewHeight : targetHeight; + + float deepFrac = deepest / DEEP_RANGE; + if ( deepFrac >= 1.0 ) { + return 1.0; + } + + frac = frac * ( 1.0 - deepFrac ) + deepFrac; + + return frac; +} + +/* +================ +R_FogEnterImage + +Modulate the fog alpha density based on the distance of the +start and end points to the terminator plane +================ +*/ +void R_FogEnterImage( idImage *image ) { + int x,y; + byte data[FOG_ENTER_SIZE][FOG_ENTER_SIZE][4]; + int b; + + for (x=0 ; x 255 ) { + b = 255; + } + data[y][x][0] = + data[y][x][1] = + data[y][x][2] = 255; + data[y][x][3] = b; + } + } + + // if mipmapped, acutely viewed surfaces fade wrong + image->GenerateImage( (byte *)data, FOG_ENTER_SIZE, FOG_ENTER_SIZE, TF_LINEAR, TR_CLAMP, TD_LOOKUP_TABLE_ALPHA ); +} + + +/* +================ +R_QuadraticImage + +================ +*/ +static const int QUADRATIC_WIDTH = 32; +static const int QUADRATIC_HEIGHT = 4; + +void R_QuadraticImage( idImage *image ) { + int x,y; + byte data[QUADRATIC_HEIGHT][QUADRATIC_WIDTH][4]; + int b; + + + for (x=0 ; x 255 ) { + b = 255; + } + data[y][x][0] = + data[y][x][1] = + data[y][x][2] = b; + data[y][x][3] = 255; + } + } + + image->GenerateImage( (byte *)data, QUADRATIC_WIDTH, QUADRATIC_HEIGHT, TF_DEFAULT, TR_CLAMP, TD_LOOKUP_TABLE_RGB1 ); +} + +static void R_AmbientNormalImage(idImage* image) { + byte data[DEFAULT_SIZE][DEFAULT_SIZE][4]; + int i; + + int red = (/*globalImages->image_useNormalCompression.GetInteger() == 1*/ false) ? 0 : 3; + int alpha = (red == 0) ? 3 : 0; + // flat normal map for default bunp mapping + for (i = 0; i < 4; i++) { + data[0][i][red] = (byte)(255 * tr.ambientLightVector[0]); + data[0][i][1] = (byte)(255 * tr.ambientLightVector[1]); + data[0][i][2] = (byte)(255 * tr.ambientLightVector[2]); + data[0][i][alpha] = 255; + } + const byte* pics[6]; + for (i = 0; i < 6; i++) { + pics[i] = data[0][0]; + } + // this must be a cube map for fragment programs to simply substitute for the normalization cube map + image->GenerateCubeImage(pics, 2, TF_DEFAULT, TD_DEFAULT); +} + +/* +================ +R_SpecularTableImage + +Creates a ramp that matches our fudged specular calculation +================ +*/ +static void R_SpecularTableImage(idImage* image) { + int x; + byte data[256][4]; + + for (x = 0; x < 256; x++) { + float f = x / 255.f; +#if 0 + f = pow(f, 16); +#else + // this is the behavior of the hacked up fragment programs that + // can't really do a power function + f = (f - 0.75) * 4; + if (f < 0) { + f = 0; + } + f = f * f; +#endif + int b = (int)(f * 255); + + data[x][0] = + data[x][1] = + data[x][2] = + data[x][3] = b; + } + + image->GenerateImage((byte*)data, 256, 1, TF_LINEAR, TR_CLAMP, TD_DEFAULT); +} + +#define NORMAL_MAP_SIZE 32 + +/*** NORMALIZATION CUBE MAP CONSTRUCTION ***/ + +/* Given a cube map face index, cube map size, and integer 2D face position, + * return the cooresponding normalized vector. + */ +static void getCubeVector(int i, int cubesize, int x, int y, float* vector) { + float s, t, sc, tc, mag; + + s = ((float)x + 0.5) / (float)cubesize; + t = ((float)y + 0.5) / (float)cubesize; + sc = s * 2.0 - 1.0; + tc = t * 2.0 - 1.0; + + switch (i) { + case 0: + vector[0] = 1.0; + vector[1] = -tc; + vector[2] = -sc; + break; + case 1: + vector[0] = -1.0; + vector[1] = -tc; + vector[2] = sc; + break; + case 2: + vector[0] = sc; + vector[1] = 1.0; + vector[2] = tc; + break; + case 3: + vector[0] = sc; + vector[1] = -1.0; + vector[2] = -tc; + break; + case 4: + vector[0] = sc; + vector[1] = -tc; + vector[2] = 1.0; + break; + case 5: + vector[0] = -sc; + vector[1] = -tc; + vector[2] = -1.0; + break; + } + + mag = idMath::InvSqrt(vector[0] * vector[0] + vector[1] * vector[1] + vector[2] * vector[2]); + vector[0] *= mag; + vector[1] *= mag; + vector[2] *= mag; +} + +/* Initialize a cube map texture object that generates RGB values + * that when expanded to a [-1,1] range in the register combiners + * form a normalized vector matching the per-pixel vector used to + * access the cube map. + */ +static void makeNormalizeVectorCubeMap(idImage* image) { + float vector[3]; + int i, x, y; + byte* pixels[6]; + int size; + + size = NORMAL_MAP_SIZE; + + pixels[0] = (GLubyte*)Mem_Alloc(size * size * 4 * 6); + + for (i = 0; i < 6; i++) { + pixels[i] = pixels[0] + i * size * size * 4; + for (y = 0; y < size; y++) { + for (x = 0; x < size; x++) { + getCubeVector(i, size, x, y, vector); + pixels[i][4 * (y * size + x) + 0] = (byte)(128 + 127 * vector[0]); + pixels[i][4 * (y * size + x) + 1] = (byte)(128 + 127 * vector[1]); + pixels[i][4 * (y * size + x) + 2] = (byte)(128 + 127 * vector[2]); + pixels[i][4 * (y * size + x) + 3] = 255; + } + } + } + + image->GenerateCubeImage((const byte**)pixels, size, + TF_LINEAR, TD_DEFAULT); + + Mem_Free(pixels[0]); +} + +// the size determines how far away from the edge the blocks start fading +static const int BORDER_CLAMP_SIZE = 32; +static void R_BorderClampImage(idImage* image) { + byte data[BORDER_CLAMP_SIZE][BORDER_CLAMP_SIZE][4]; + + // solid white texture with a single pixel black border + memset(data, 255, sizeof(data)); + for (int i = 0; i < BORDER_CLAMP_SIZE; i++) { + data[i][0][0] = + data[i][0][1] = + data[i][0][2] = + data[i][0][3] = + + data[i][BORDER_CLAMP_SIZE - 1][0] = + data[i][BORDER_CLAMP_SIZE - 1][1] = + data[i][BORDER_CLAMP_SIZE - 1][2] = + data[i][BORDER_CLAMP_SIZE - 1][3] = + + data[0][i][0] = + data[0][i][1] = + data[0][i][2] = + data[0][i][3] = + + data[BORDER_CLAMP_SIZE - 1][i][0] = + data[BORDER_CLAMP_SIZE - 1][i][1] = + data[BORDER_CLAMP_SIZE - 1][i][2] = + data[BORDER_CLAMP_SIZE - 1][i][3] = 0; + } + + image->GenerateImage((byte*)data, BORDER_CLAMP_SIZE, BORDER_CLAMP_SIZE, + TF_LINEAR /* TF_NEAREST */, TR_CLAMP_TO_BORDER, TD_DEFAULT); + + if (!glConfig.isInitialized) { + // can't call qglTexParameterfv yet + return; + } + // explicit zero border + float color[4]; + color[0] = color[1] = color[2] = color[3] = 0; + glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, color); +} + +/* +================ +R_RampImage + +Creates a 0-255 ramp image +================ +*/ +static void R_RampImage(idImage* image) { + int x; + byte data[256][4]; + + for (x = 0; x < 256; x++) { + data[x][0] = + data[x][1] = + data[x][2] = + data[x][3] = x; + } + + image->GenerateImage((byte*)data, 256, 1, + TF_NEAREST, TR_CLAMP, TD_DIFFUSE); +} + + +/* +================ +idImageManager::CreateIntrinsicImages +================ +*/ +void idImageManager::CreateIntrinsicImages() { + // create built in images + ambientNormalMap = ImageFromFunction("_ambient", R_AmbientNormalImage); + specularTableImage = ImageFromFunction("_specularTable", R_SpecularTableImage); + normalCubeMapImage = ImageFromFunction("_normalCubeMap", makeNormalizeVectorCubeMap); + + // create built in images + defaultImage = ImageFromFunction("_default", R_DefaultImage); + whiteImage = ImageFromFunction("_white", R_WhiteImage); + blackImage = ImageFromFunction("_black", R_BlackImage); + //borderClampImage = ImageFromFunction("_borderClamp", R_BorderClampImage); + flatNormalMap = ImageFromFunction("_flat", R_FlatNormalImage); + specularTableImage = ImageFromFunction("_specularTable", R_SpecularTableImage); + //specular2DTableImage = ImageFromFunction("_specular2DTable", R_Specular2DTableImage); + rampImage = ImageFromFunction("_ramp", R_RampImage); + alphaRampImage = ImageFromFunction("_alphaRamp", R_RampImage); + alphaNotchImage = ImageFromFunction("_alphaNotch", R_AlphaNotchImage); + fogImage = ImageFromFunction("_fog", R_FogImage); + fogEnterImage = ImageFromFunction("_fogEnter", R_FogEnterImage); + normalCubeMapImage = ImageFromFunction("_normalCubeMap", makeNormalizeVectorCubeMap); + noFalloffImage = ImageFromFunction("_noFalloff", R_CreateNoFalloffImage); + ImageFromFunction("_quadratic", R_QuadraticImage); + + // cinematicImage is used for cinematic drawing + // scratchImage is used for screen wipes/doublevision etc.. + cinematicImage = ImageFromFunction("_cinematic", R_RGBA8Image); + scratchImage = ImageFromFunction("_scratch", R_RGBA8Image); + scratchImage2 = ImageFromFunction("_scratch2", R_RGBA8Image); + accumImage = ImageFromFunction("_accum", R_RGBA8Image); + //scratchCubeMapImage = ImageFromFunction("_scratchCubeMap", makeNormalizeVectorCubeMap); + + currentRenderImage = ImageFromFunction("_currentRender", R_RGBA8Image); + currentDepthImage = ImageFromFunction("_currentDepth", R_DepthImage); + + + // save a copy of this for material comparison, because currentRenderImage may get + // reassigned during stereo rendering + originalCurrentRenderImage = currentRenderImage; + + loadingIconImage = ImageFromFile("textures/loadingicon2", TF_DEFAULT, TR_CLAMP, TD_DEFAULT, CF_2D ); + hellLoadingIconImage = ImageFromFile("textures/loadingicon3", TF_DEFAULT, TR_CLAMP, TD_DEFAULT, CF_2D ); + + //release_assert( loadingIconImage->referencedOutsideLevelLoad ); + //release_assert( hellLoadingIconImage->referencedOutsideLevelLoad ); +} \ No newline at end of file diff --git a/src/renderer/Image_load.cpp b/src/renderer/Image_load.cpp index e15fe278..9991f0c7 100644 --- a/src/renderer/Image_load.cpp +++ b/src/renderer/Image_load.cpp @@ -1,25 +1,25 @@ /* =========================================================================== -Doom 3 GPL Source Code -Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. -This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?). +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). -Doom 3 Source Code is free software: you can redistribute it and/or modify +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. -Doom 3 Source Code is distributed in the hope that it will be useful, +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with Doom 3 Source Code. If not, see . +along with Doom 3 BFG Edition Source Code. If not, see . -In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below. +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. @@ -27,1544 +27,260 @@ If you have questions concerning this license or the applicable additional terms */ #include "precompiled.h" -#pragma hdrstop #include "tr_local.h" -/* -PROBLEM: compressed textures may break the zero clamp rule! -*/ - -static bool FormatIsDXT( int internalFormat ) { - if ( internalFormat < GL_COMPRESSED_RGB_S3TC_DXT1_EXT - || internalFormat > GL_COMPRESSED_RGBA_S3TC_DXT5_EXT ) { - return false; - } - return true; -} - -int MakePowerOfTwo( int num ) { - int pot; - for (pot = 1 ; pot < num ; pot<<=1) { - } - return pot; -} - /* ================ -BitsForInternalFormat - -Used for determining memory utilization +BitsForFormat ================ */ -int idImage::BitsForInternalFormat( int internalFormat ) const { - switch ( internalFormat ) { - case GL_INTENSITY8: - case 1: - return 8; - case 2: - case GL_LUMINANCE8_ALPHA8: - return 16; - case 3: - return 32; // on some future hardware, this may actually be 24, but be conservative - case 4: - return 32; - case GL_LUMINANCE8: - return 8; - case GL_ALPHA8: - return 8; - case GL_RGBA8: - return 32; - case GL_RGB8: - return 32; // on some future hardware, this may actually be 24, but be conservative - case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: - return 4; - case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: - return 4; - case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: - return 8; - case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: - return 8; - case GL_RGBA4: - return 16; - case GL_RGB5: - return 16; - case GL_COLOR_INDEX8_EXT: - return 8; - case GL_COLOR_INDEX: - return 8; - case GL_COMPRESSED_RGB_ARB: - return 4; // not sure - case GL_COMPRESSED_RGBA_ARB: - return 8; // not sure - default: - common->Error( "R_BitsForInternalFormat: BAD FORMAT:%i", internalFormat ); - } - return 0; -} - -/* -================== -UploadCompressedNormalMap - -Create a 256 color palette to be used by compressed normal maps -================== -*/ -void idImage::UploadCompressedNormalMap( int width, int height, const byte *rgba, int mipLevel ) { - byte *normals; - const byte *in; - byte *out; - int i, j; - int x, y, z; - int row; - - // OpenGL's pixel packing rule - row = width < 4 ? 4 : width; - - normals = (byte *)_alloca( row * height ); - if ( !normals ) { - common->Error( "R_UploadCompressedNormalMap: _alloca failed" ); - } - - in = rgba; - out = normals; - for ( i = 0 ; i < height ; i++, out += row, in += width * 4 ) { - for ( j = 0 ; j < width ; j++ ) { - x = in[ j * 4 + 0 ]; - y = in[ j * 4 + 1 ]; - z = in[ j * 4 + 2 ]; - - int c; - if ( x == 128 && y == 128 && z == 128 ) { - // the "nullnormal" color - c = 255; - } else { - c = ( globalImages->originalToCompressed[x] << 4 ) | globalImages->originalToCompressed[y]; - if ( c == 255 ) { - c = 254; // don't use the nullnormal color - } - } - out[j] = c; - } - } - - if ( mipLevel == 0 ) { - // Optionally write out the paletized normal map to a .tga - if ( globalImages->image_writeNormalTGAPalletized.GetBool() ) { - char filename[MAX_IMAGE_NAME]; - ImageProgramStringToCompressedFileName( imgName, filename ); - char *ext = strrchr(filename, '.'); - if ( ext ) { - strcpy(ext, "_pal.tga"); - R_WritePalTGA( filename, normals, globalImages->compressedPalette, width, height); - } - } - } - - if ( glConfig.sharedTexturePaletteAvailable ) { - qglTexImage2D( GL_TEXTURE_2D, - mipLevel, - GL_COLOR_INDEX8_EXT, - width, - height, - 0, - GL_COLOR_INDEX, - GL_UNSIGNED_BYTE, - normals ); - } -} - - -//======================================================================= - - -static byte mipBlendColors[16][4] = { - {0,0,0,0}, - {255,0,0,128}, - {0,255,0,128}, - {0,0,255,128}, - {255,0,0,128}, - {0,255,0,128}, - {0,0,255,128}, - {255,0,0,128}, - {0,255,0,128}, - {0,0,255,128}, - {255,0,0,128}, - {0,255,0,128}, - {0,0,255,128}, - {255,0,0,128}, - {0,255,0,128}, - {0,0,255,128}, -}; - -/* -=============== -SelectInternalFormat - -This may need to scan six cube map images -=============== -*/ -GLenum idImage::SelectInternalFormat( const byte **dataPtrs, int numDataPtrs, int width, int height, - textureDepth_t minimumDepth, bool *monochromeResult ) const { - int i, c; - const byte *scan; - int rgbOr, rgbAnd, aOr, aAnd; - int rgbDiffer, rgbaDiffer; - - // determine if the rgb channels are all the same - // and if either all rgb or all alpha are 255 - c = width*height; - rgbDiffer = 0; - rgbaDiffer = 0; - rgbOr = 0; - rgbAnd = -1; - aOr = 0; - aAnd = -1; - - *monochromeResult = true; // until shown otherwise - - for ( int side = 0 ; side < numDataPtrs ; side++ ) { - scan = dataPtrs[side]; - for ( i = 0; i < c; i++, scan += 4 ) { - int cor, cand; - - aOr |= scan[3]; - aAnd &= scan[3]; - - cor = scan[0] | scan[1] | scan[2]; - cand = scan[0] & scan[1] & scan[2]; - - // if rgb are all the same, the or and and will match - rgbDiffer |= ( cor ^ cand ); - - // our "isMonochrome" test is more lax than rgbDiffer, - // allowing the values to be off by several units and - // still use the NV20 mono path - if ( *monochromeResult ) { - if ( abs( scan[0] - scan[1] ) > 16 - || abs( scan[0] - scan[2] ) > 16 ) { - *monochromeResult = false; - } - } - - rgbOr |= cor; - rgbAnd &= cand; - - cor |= scan[3]; - cand &= scan[3]; - - rgbaDiffer |= ( cor ^ cand ); - } - } - - // we assume that all 0 implies that the alpha channel isn't needed, - // because some tools will spit out 32 bit images with a 0 alpha instead - // of 255 alpha, but if the alpha actually is referenced, there will be - // different behavior in the compressed vs uncompressed states. - bool needAlpha; - if ( aAnd == 255 || aOr == 0 ) { - needAlpha = false; - } else { - needAlpha = true; - } - - // catch normal maps first - if ( minimumDepth == TD_BUMP ) { - if ( globalImages->image_useCompression.GetBool() && globalImages->image_useNormalCompression.GetInteger() == 1 && glConfig.sharedTexturePaletteAvailable ) { - // image_useNormalCompression should only be set to 1 on nv_10 and nv_20 paths - return GL_COLOR_INDEX8_EXT; - } else if ( globalImages->image_useCompression.GetBool() && globalImages->image_useNormalCompression.GetInteger() && glConfig.textureCompressionAvailable ) { - // image_useNormalCompression == 2 uses rxgb format which produces really good quality for medium settings - return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; - } else { - // we always need the alpha channel for bump maps for swizzling - return GL_RGBA8; - } - } - - // allow a complete override of image compression with a cvar - if ( !globalImages->image_useCompression.GetBool() ) { - minimumDepth = TD_HIGH_QUALITY; - } - - if ( minimumDepth == TD_SPECULAR ) { - // we are assuming that any alpha channel is unintentional - if ( glConfig.textureCompressionAvailable ) { - return GL_COMPRESSED_RGB_S3TC_DXT1_EXT; - } else { - return GL_RGB5; - } - } - if ( minimumDepth == TD_DIFFUSE ) { - // we might intentionally have an alpha channel for alpha tested textures - if ( glConfig.textureCompressionAvailable ) { - if ( !needAlpha ) { - return GL_COMPRESSED_RGB_S3TC_DXT1_EXT; - } else { - return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; - } - } else if ( ( aAnd == 255 || aOr == 0 ) ) { - return GL_RGB5; - } else { - return GL_RGBA4; - } - } - - // there will probably be some drivers that don't - // correctly handle the intensity/alpha/luminance/luminance+alpha - // formats, so provide a fallback that only uses the rgb/rgba formats - if ( !globalImages->image_useAllFormats.GetBool() ) { - // pretend rgb is varying and inconsistant, which - // prevents any of the more compact forms - rgbDiffer = 1; - rgbaDiffer = 1; - rgbAnd = 0; - } - - // cases without alpha - if ( !needAlpha ) { - if ( minimumDepth == TD_HIGH_QUALITY ) { - return GL_RGB8; // four bytes - } - if ( glConfig.textureCompressionAvailable ) { - return GL_COMPRESSED_RGB_S3TC_DXT1_EXT; // half byte - } - return GL_RGB5; // two bytes - } - - // cases with alpha - if ( !rgbaDiffer ) { - if ( minimumDepth != TD_HIGH_QUALITY && glConfig.textureCompressionAvailable ) { - return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; // one byte - } - return GL_INTENSITY8; // single byte for all channels - } - -#if 0 - // we don't support alpha textures any more, because there - // is a discrepancy in the definition of TEX_ENV_COMBINE that - // causes them to be treated as 0 0 0 A, instead of 1 1 1 A as - // normal texture modulation treats them - if ( rgbAnd == 255 ) { - return GL_ALPHA8; // single byte, only alpha - } -#endif - - if ( minimumDepth == TD_HIGH_QUALITY ) { - return GL_RGBA8; // four bytes - } - if ( glConfig.textureCompressionAvailable ) { - return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; // one byte - } - if ( !rgbDiffer ) { - return GL_LUMINANCE8_ALPHA8; // two bytes, max quality - } - return GL_RGBA4; // two bytes -} - -/* -================== -SetImageFilterAndRepeat -================== -*/ -void idImage::SetImageFilterAndRepeat() const { - // set the minimize / maximize filtering - switch( filter ) { - case TF_DEFAULT: - qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, globalImages->textureMinFilter ); - qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, globalImages->textureMaxFilter ); - break; - case TF_LINEAR: - qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - break; - case TF_NEAREST: - qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); - qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); - break; - default: - common->FatalError( "R_CreateImage: bad texture filter" ); - } - - if ( glConfig.anisotropicAvailable ) { - // only do aniso filtering on mip mapped images - if ( filter == TF_DEFAULT ) { - qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, globalImages->textureAnisotropy ); - } else { - qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1 ); - } - } - if ( glConfig.textureLODBiasAvailable ) { - qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS_EXT, globalImages->textureLODBias ); - } - - // set the wrap/clamp modes - switch( repeat ) { - case TR_REPEAT: - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); - break; - case TR_CLAMP_TO_BORDER: - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER ); - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER ); - break; - case TR_CLAMP_TO_ZERO: - case TR_CLAMP_TO_ZERO_ALPHA: - case TR_CLAMP: - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); - break; - default: - common->FatalError( "R_CreateImage: bad texture repeat" ); - } -} - -/* -================ -idImage::Downsize -helper function that takes the current width/height and might make them smaller -================ -*/ -void idImage::GetDownsize( int &scaled_width, int &scaled_height ) const { - int size = 0; - - // perform optional picmip operation to save texture memory - if ( depth == TD_SPECULAR && globalImages->image_downSizeSpecular.GetInteger() ) { - size = globalImages->image_downSizeSpecularLimit.GetInteger(); - if ( size == 0 ) { - size = 64; - } - } else if ( depth == TD_BUMP && globalImages->image_downSizeBump.GetInteger() ) { - size = globalImages->image_downSizeBumpLimit.GetInteger(); - if ( size == 0 ) { - size = 64; - } - } else if ( ( allowDownSize || globalImages->image_forceDownSize.GetBool() ) && globalImages->image_downSize.GetInteger() ) { - size = globalImages->image_downSizeLimit.GetInteger(); - if ( size == 0 ) { - size = 256; - } - } - - if ( size > 0 ) { - while ( scaled_width > size || scaled_height > size ) { - if ( scaled_width > 1 ) { - scaled_width >>= 1; - } - if ( scaled_height > 1 ) { - scaled_height >>= 1; - } - } - } - - // clamp to minimum size - if ( scaled_width < 1 ) { - scaled_width = 1; - } - if ( scaled_height < 1 ) { - scaled_height = 1; - } - - // clamp size to the hardware specific upper limit - // scale both axis down equally so we don't have to - // deal with a half mip resampling - // This causes a 512*256 texture to sample down to - // 256*128 on a voodoo3, even though it could be 256*256 - while ( scaled_width > glConfig.maxTextureSize - || scaled_height > glConfig.maxTextureSize ) { - scaled_width >>= 1; - scaled_height >>= 1; - } -} - -/* -================ -GenerateImage - -The alpha channel bytes should be 255 if you don't -want the channel. - -We need a material characteristic to ask for specific texture modes. - -Designed limitations of flexibility: - -No support for texture borders. - -No support for texture border color. - -No support for texture environment colors or GL_BLEND or GL_DECAL -texture environments, because the automatic optimization to single -or dual component textures makes those modes potentially undefined. - -No non-power-of-two images. - -No palettized textures. - -There is no way to specify separate wrap/clamp values for S and T - -There is no way to specify explicit mip map levels - -================ -*/ -void idImage::GenerateImage( const byte *pic, int width, int height, - textureFilter_t filterParm, bool allowDownSizeParm, - textureRepeat_t repeatParm, textureDepth_t depthParm ) { - bool preserveBorder; - byte *scaledBuffer; - int scaled_width, scaled_height; - byte *shrunk; - - PurgeImage(); - - filter = filterParm; - allowDownSize = allowDownSizeParm; - repeat = repeatParm; - depth = depthParm; - - // if we don't have a rendering context, just return after we - // have filled in the parms. We must have the values set, or - // an image match from a shader before OpenGL starts would miss - // the generated texture - if ( !glConfig.isInitialized ) { - return; - } - - // don't let mip mapping smear the texture into the clamped border - if ( repeat == TR_CLAMP_TO_ZERO ) { - preserveBorder = true; - } else { - preserveBorder = false; - } - - // make sure it is a power of 2 - scaled_width = MakePowerOfTwo( width ); - scaled_height = MakePowerOfTwo( height ); - - if ( scaled_width != width || scaled_height != height ) { - common->Error( "R_CreateImage: not a power of 2 image" ); - } - - // Optionally modify our width/height based on options/hardware - GetDownsize( scaled_width, scaled_height ); - - scaledBuffer = NULL; - - // generate the texture number - qglGenTextures( 1, &texnum ); - - // select proper internal format before we resample - internalFormat = SelectInternalFormat( &pic, 1, width, height, depth, &isMonochrome ); - - // copy or resample data as appropriate for first MIP level - if ( ( scaled_width == width ) && ( scaled_height == height ) ) { - // we must copy even if unchanged, because the border zeroing - // would otherwise modify const data - scaledBuffer = (byte *)R_StaticAlloc( sizeof( unsigned ) * scaled_width * scaled_height ); - memcpy (scaledBuffer, pic, width*height*4); - } else { - // resample down as needed (FIXME: this doesn't seem like it resamples anymore!) - // scaledBuffer = R_ResampleTexture( pic, width, height, width >>= 1, height >>= 1 ); - scaledBuffer = R_MipMap( pic, width, height, preserveBorder ); - width >>= 1; - height >>= 1; - if ( width < 1 ) { - width = 1; - } - if ( height < 1 ) { - height = 1; - } - - while ( width > scaled_width || height > scaled_height ) { - shrunk = R_MipMap( scaledBuffer, width, height, preserveBorder ); - R_StaticFree( scaledBuffer ); - scaledBuffer = shrunk; - - width >>= 1; - height >>= 1; - if ( width < 1 ) { - width = 1; - } - if ( height < 1 ) { - height = 1; - } - } - - // one might have shrunk down below the target size - scaled_width = width; - scaled_height = height; - } - - uploadHeight = scaled_height; - uploadWidth = scaled_width; - type = TT_2D; - - // zero the border if desired, allowing clamped projection textures - // even after picmip resampling or careless artists. - if ( repeat == TR_CLAMP_TO_ZERO ) { - byte rgba[4]; - - rgba[0] = rgba[1] = rgba[2] = 0; - rgba[3] = 255; - R_SetBorderTexels( (byte *)scaledBuffer, width, height, rgba ); - } - if ( repeat == TR_CLAMP_TO_ZERO_ALPHA ) { - byte rgba[4]; - - rgba[0] = rgba[1] = rgba[2] = 255; - rgba[3] = 0; - R_SetBorderTexels( (byte *)scaledBuffer, width, height, rgba ); - } - - if ( generatorFunction == NULL && ( depth == TD_BUMP && globalImages->image_writeNormalTGA.GetBool() || depth != TD_BUMP && globalImages->image_writeTGA.GetBool() ) ) { - // Optionally write out the texture to a .tga - char filename[MAX_IMAGE_NAME]; - ImageProgramStringToCompressedFileName( imgName, filename ); - char *ext = strrchr(filename, '.'); - if ( ext ) { - strcpy( ext, ".tga" ); - // swap the red/alpha for the write - /* - if ( depth == TD_BUMP ) { - for ( int i = 0; i < scaled_width * scaled_height * 4; i += 4 ) { - scaledBuffer[ i ] = scaledBuffer[ i + 3 ]; - scaledBuffer[ i + 3 ] = 0; - } - } - */ - R_WriteTGA( filename, scaledBuffer, scaled_width, scaled_height, false ); - - // put it back - /* - if ( depth == TD_BUMP ) { - for ( int i = 0; i < scaled_width * scaled_height * 4; i += 4 ) { - scaledBuffer[ i + 3 ] = scaledBuffer[ i ]; - scaledBuffer[ i ] = 0; - } - } - */ - } - } - - // swap the red and alpha for rxgb support - // do this even on tga normal maps so we only have to use - // one fragment program - // if the image is precompressed ( either in palletized mode or true rxgb mode ) - // then it is loaded above and the swap never happens here - if ( depth == TD_BUMP && globalImages->image_useNormalCompression.GetInteger() != 1 ) { - for ( int i = 0; i < scaled_width * scaled_height * 4; i += 4 ) { - scaledBuffer[ i + 3 ] = scaledBuffer[ i ]; - scaledBuffer[ i ] = 0; - } - } - // upload the main image level - Bind(); - - - if ( internalFormat == GL_COLOR_INDEX8_EXT ) { - /* - if ( depth == TD_BUMP ) { - for ( int i = 0; i < scaled_width * scaled_height * 4; i += 4 ) { - scaledBuffer[ i ] = scaledBuffer[ i + 3 ]; - scaledBuffer[ i + 3 ] = 0; - } - } - */ - UploadCompressedNormalMap( scaled_width, scaled_height, scaledBuffer, 0 ); - } else { - qglTexImage2D( GL_TEXTURE_2D, 0, internalFormat, scaled_width, scaled_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, scaledBuffer ); - } - - // create and upload the mip map levels, which we do in all cases, even if we don't think they are needed - int miplevel; - - miplevel = 0; - while ( scaled_width > 1 || scaled_height > 1 ) { - // preserve the border after mip map unless repeating - shrunk = R_MipMap( scaledBuffer, scaled_width, scaled_height, preserveBorder ); - R_StaticFree( scaledBuffer ); - scaledBuffer = shrunk; - - scaled_width >>= 1; - scaled_height >>= 1; - if ( scaled_width < 1 ) { - scaled_width = 1; - } - if ( scaled_height < 1 ) { - scaled_height = 1; - } - miplevel++; - - // this is a visualization tool that shades each mip map - // level with a different color so you can see the - // rasterizer's texture level selection algorithm - // Changing the color doesn't help with lumminance/alpha/intensity formats... - if ( depth == TD_DIFFUSE && globalImages->image_colorMipLevels.GetBool() ) { - R_BlendOverTexture( (byte *)scaledBuffer, scaled_width * scaled_height, mipBlendColors[miplevel] ); - } - - // upload the mip map - if ( internalFormat == GL_COLOR_INDEX8_EXT ) { - UploadCompressedNormalMap( scaled_width, scaled_height, scaledBuffer, miplevel ); - } else { - qglTexImage2D( GL_TEXTURE_2D, miplevel, internalFormat, scaled_width, scaled_height, - 0, GL_RGBA, GL_UNSIGNED_BYTE, scaledBuffer ); - } - } - - if ( scaledBuffer != 0 ) { - R_StaticFree( scaledBuffer ); - } - - SetImageFilterAndRepeat(); - - // see if we messed anything up - GL_CheckErrors(); -} - - -/* -================== -Generate3DImage -================== -*/ -void idImage::Generate3DImage( const byte *pic, int width, int height, int picDepth, - textureFilter_t filterParm, bool allowDownSizeParm, - textureRepeat_t repeatParm, textureDepth_t minDepthParm ) { - int scaled_width, scaled_height, scaled_depth; - - PurgeImage(); - - filter = filterParm; - allowDownSize = allowDownSizeParm; - repeat = repeatParm; - depth = minDepthParm; - - // if we don't have a rendering context, just return after we - // have filled in the parms. We must have the values set, or - // an image match from a shader before OpenGL starts would miss - // the generated texture - if ( !glConfig.isInitialized ) { - return; - } - - // make sure it is a power of 2 - scaled_width = MakePowerOfTwo( width ); - scaled_height = MakePowerOfTwo( height ); - scaled_depth = MakePowerOfTwo( picDepth ); - if ( scaled_width != width || scaled_height != height || scaled_depth != picDepth ) { - common->Error( "R_Create3DImage: not a power of 2 image" ); - } - - // FIXME: allow picmip here - - // generate the texture number - qglGenTextures( 1, &texnum ); - - // select proper internal format before we resample - // this function doesn't need to know it is 3D, so just make it very "tall" - internalFormat = SelectInternalFormat( &pic, 1, width, height * picDepth, minDepthParm, &isMonochrome ); - - uploadHeight = scaled_height; - uploadWidth = scaled_width; - uploadDepth = scaled_depth; - - - type = TT_3D; - - // upload the main image level - Bind(); - - qglTexImage3D(GL_TEXTURE_3D, 0, internalFormat, scaled_width, scaled_height, scaled_depth, - 0, GL_RGBA, GL_UNSIGNED_BYTE, pic ); - - // create and upload the mip map levels - int miplevel; - byte *scaledBuffer, *shrunk; - - scaledBuffer = (byte *)R_StaticAlloc( scaled_width * scaled_height * scaled_depth * 4 ); - memcpy( scaledBuffer, pic, scaled_width * scaled_height * scaled_depth * 4 ); - miplevel = 0; - while ( scaled_width > 1 || scaled_height > 1 || scaled_depth > 1 ) { - // preserve the border after mip map unless repeating - shrunk = R_MipMap3D( scaledBuffer, scaled_width, scaled_height, scaled_depth, - (bool)(repeat != TR_REPEAT) ); - R_StaticFree( scaledBuffer ); - scaledBuffer = shrunk; - - scaled_width >>= 1; - scaled_height >>= 1; - scaled_depth >>= 1; - if ( scaled_width < 1 ) { - scaled_width = 1; - } - if ( scaled_height < 1 ) { - scaled_height = 1; - } - if ( scaled_depth < 1 ) { - scaled_depth = 1; - } - miplevel++; - - // upload the mip map - qglTexImage3D(GL_TEXTURE_3D, miplevel, internalFormat, scaled_width, scaled_height, scaled_depth, - 0, GL_RGBA, GL_UNSIGNED_BYTE, scaledBuffer ); - } - R_StaticFree( scaledBuffer ); - - // set the minimize / maximize filtering - switch( filter ) { - case TF_DEFAULT: - qglTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, globalImages->textureMinFilter ); - qglTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, globalImages->textureMaxFilter ); - break; - case TF_LINEAR: - qglTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - qglTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - break; - case TF_NEAREST: - qglTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); - qglTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); - break; - default: - common->FatalError( "R_CreateImage: bad texture filter" ); - } - - // set the wrap/clamp modes - switch( repeat ) { - case TR_REPEAT: - qglTexParameterf( GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_REPEAT ); - qglTexParameterf( GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT ); - qglTexParameterf( GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_REPEAT ); - break; - case TR_CLAMP_TO_BORDER: - qglTexParameterf( GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER ); - qglTexParameterf( GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER ); - break; - case TR_CLAMP_TO_ZERO: - case TR_CLAMP_TO_ZERO_ALPHA: - case TR_CLAMP: - qglTexParameterf( GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); - qglTexParameterf( GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); - qglTexParameterf( GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE ); - break; - default: - common->FatalError( "R_CreateImage: bad texture repeat" ); - } - - // see if we messed anything up - GL_CheckErrors(); -} - - -/* -==================== -GenerateCubeImage - -Non-square cube sides are not allowed -==================== -*/ -void idImage::GenerateCubeImage( const byte *pic[6], int size, - textureFilter_t filterParm, bool allowDownSizeParm, - textureDepth_t depthParm ) { - int scaled_width, scaled_height; - int width, height; - int i; - - PurgeImage(); - - filter = filterParm; - allowDownSize = allowDownSizeParm; - depth = depthParm; - - type = TT_CUBIC; - - // if we don't have a rendering context, just return after we - // have filled in the parms. We must have the values set, or - // an image match from a shader before OpenGL starts would miss - // the generated texture - if ( !glConfig.isInitialized ) { - return; - } - - if ( ! glConfig.cubeMapAvailable ) { - return; - } - - width = height = size; - - // generate the texture number - qglGenTextures( 1, &texnum ); - - // select proper internal format before we resample - internalFormat = SelectInternalFormat( pic, 6, width, height, depth, &isMonochrome ); - - // don't bother with downsample for now - scaled_width = width; - scaled_height = height; - - uploadHeight = scaled_height; - uploadWidth = scaled_width; - - Bind(); - - // no other clamp mode makes sense - qglTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - qglTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - // set the minimize / maximize filtering - switch( filter ) { - case TF_DEFAULT: - qglTexParameterf(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MIN_FILTER, globalImages->textureMinFilter ); - qglTexParameterf(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MAG_FILTER, globalImages->textureMaxFilter ); - break; - case TF_LINEAR: - qglTexParameterf(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - qglTexParameterf(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - break; - case TF_NEAREST: - qglTexParameterf(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); - qglTexParameterf(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); - break; - default: - common->FatalError( "R_CreateImage: bad texture filter" ); - } - - // upload the base level - // FIXME: support GL_COLOR_INDEX8_EXT? - for ( i = 0 ; i < 6 ; i++ ) { - qglTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT+i, 0, internalFormat, scaled_width, scaled_height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, pic[i] ); - } - - - // create and upload the mip map levels - int miplevel; - byte *shrunk[6]; - - for ( i = 0 ; i < 6 ; i++ ) { - shrunk[i] = R_MipMap( pic[i], scaled_width, scaled_height, false ); - } - - miplevel = 1; - while ( scaled_width > 1 ) { - for ( i = 0 ; i < 6 ; i++ ) { - byte *shrunken; - - qglTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT+i, miplevel, internalFormat, - scaled_width / 2, scaled_height / 2, 0, - GL_RGBA, GL_UNSIGNED_BYTE, shrunk[i] ); - - if ( scaled_width > 2 ) { - shrunken = R_MipMap( shrunk[i], scaled_width/2, scaled_height/2, false ); - } else { - shrunken = NULL; - } - - R_StaticFree( shrunk[i] ); - shrunk[i] = shrunken; - } - - scaled_width >>= 1; - scaled_height >>= 1; - miplevel++; - } - - // see if we messed anything up - GL_CheckErrors(); -} - - -/* -================ -ImageProgramStringToFileCompressedFileName -================ -*/ -void idImage::ImageProgramStringToCompressedFileName( const char *imageProg, char *fileName ) const { - const char *s; - char *f; - - strcpy( fileName, "dds/" ); - f = fileName + strlen( fileName ); - - int depth = 0; - - // convert all illegal characters to underscores - // this could conceivably produce a duplicated mapping, but we aren't going to worry about it - for ( s = imageProg ; *s ; s++ ) { - if ( *s == '/' || *s == '\\' || *s == '(') { - if ( depth < 4 ) { - *f = '/'; - depth ++; - } else { - *f = ' '; - } - f++; - } else if ( *s == '<' || *s == '>' || *s == ':' || *s == '|' || *s == '"' || *s == '.' ) { - *f = '_'; - f++; - } else if ( *s == ' ' && *(f-1) == '/' ) { // ignore a space right after a slash - } else if ( *s == ')' || *s == ',' ) { // always ignore these - } else { - *f = *s; - f++; - } - } - *f++ = 0; - strcat( fileName, ".dds" ); -} - -/* -================== -NumLevelsForImageSize -================== -*/ -int idImage::NumLevelsForImageSize( int width, int height ) const { - int numLevels = 1; - - while ( width > 1 || height > 1 ) { - numLevels++; - width >>= 1; - height >>= 1; - } - - return numLevels; -} - -/* -================ -WritePrecompressedImage - -When we are happy with our source data, we can write out precompressed -versions of everything to speed future load times. -================ -*/ -void idImage::WritePrecompressedImage() { - - // Always write the precompressed image if we're making a build - if ( !com_makingBuild.GetBool() ) { - if ( !globalImages->image_writePrecompressedTextures.GetBool() || !globalImages->image_usePrecompressedTextures.GetBool() ) { - return; - } - } - - if ( !glConfig.isInitialized ) { - return; - } - - char filename[MAX_IMAGE_NAME]; - ImageProgramStringToCompressedFileName( imgName, filename ); - - - - int numLevels = NumLevelsForImageSize( uploadWidth, uploadHeight ); - if ( numLevels > MAX_TEXTURE_LEVELS ) { - common->Warning( "R_WritePrecompressedImage: level > MAX_TEXTURE_LEVELS for image %s", filename ); - return; - } - - // glGetTexImage only supports a small subset of all the available internal formats - // We have to use BGRA because DDS is a windows based format - int altInternalFormat = 0; - int bitSize = 0; - switch ( internalFormat ) { - case GL_COLOR_INDEX8_EXT: - case GL_COLOR_INDEX: - // this will not work with dds viewers but we need it in this format to save disk - // load speed ( i.e. size ) - altInternalFormat = GL_COLOR_INDEX; - bitSize = 24; - break; - case 1: - case GL_INTENSITY8: - case GL_LUMINANCE8: - case 3: - case GL_RGB8: - altInternalFormat = GL_BGR_EXT; - bitSize = 24; - break; - case GL_LUMINANCE8_ALPHA8: - case 4: - case GL_RGBA8: - altInternalFormat = GL_BGRA_EXT; - bitSize = 32; - break; - case GL_ALPHA8: - altInternalFormat = GL_ALPHA; - bitSize = 8; - break; - default: - if ( FormatIsDXT( internalFormat ) ) { - altInternalFormat = internalFormat; - } else { - common->Warning("Unknown or unsupported format for %s", filename); - return; - } - } - - if ( globalImages->image_useOffLineCompression.GetBool() && FormatIsDXT( altInternalFormat ) ) { - idStr outFile = fileSystem->RelativePathToOSPath( filename, "fs_basepath" ); - idStr inFile = outFile; - inFile.StripFileExtension(); - inFile.SetFileExtension( "tga" ); - idStr format; - if ( depth == TD_BUMP ) { - format = "RXGB +red 0.0 +green 0.5 +blue 0.5"; - } else { - switch ( altInternalFormat ) { - case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: - format = "DXT1"; - break; - case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: - format = "DXT1 -alpha_threshold"; - break; - case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: - format = "DXT3"; - break; - case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: - format = "DXT5"; - break; - } - } - globalImages->AddDDSCommand( va( "z:/d3xp/compressonator/thecompressonator -convert \"%s\" \"%s\" %s -mipmaps\n", inFile.c_str(), outFile.c_str(), format.c_str() ) ); - return; - } - - - ddsFileHeader_t header; - memset( &header, 0, sizeof(header) ); - header.dwSize = sizeof(header); - header.dwFlags = DDSF_CAPS | DDSF_PIXELFORMAT | DDSF_WIDTH | DDSF_HEIGHT; - header.dwHeight = uploadHeight; - header.dwWidth = uploadWidth; - - // hack in our monochrome flag for the NV20 optimization - if ( isMonochrome ) { - header.dwFlags |= DDSF_ID_MONOCHROME; - } - - if ( FormatIsDXT( altInternalFormat ) ) { - // size (in bytes) of the compressed base image - header.dwFlags |= DDSF_LINEARSIZE; - header.dwPitchOrLinearSize = ( ( uploadWidth + 3 ) / 4 ) * ( ( uploadHeight + 3 ) / 4 )* - (altInternalFormat <= GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ? 8 : 16); - } - else { - // 4 Byte aligned line width (from nv_dds) - header.dwFlags |= DDSF_PITCH; - header.dwPitchOrLinearSize = ( ( uploadWidth * bitSize + 31 ) & -32 ) >> 3; - } - - header.dwCaps1 = DDSF_TEXTURE; - - if ( numLevels > 1 ) { - header.dwMipMapCount = numLevels; - header.dwFlags |= DDSF_MIPMAPCOUNT; - header.dwCaps1 |= DDSF_MIPMAP | DDSF_COMPLEX; - } - - header.ddspf.dwSize = sizeof(header.ddspf); - if ( FormatIsDXT( altInternalFormat ) ) { - header.ddspf.dwFlags = DDSF_FOURCC; - switch ( altInternalFormat ) { - case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: - header.ddspf.dwFourCC = DDS_MAKEFOURCC('D','X','T','1'); - break; - case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: - header.ddspf.dwFlags |= DDSF_ALPHAPIXELS; - header.ddspf.dwFourCC = DDS_MAKEFOURCC('D','X','T','1'); - break; - case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: - header.ddspf.dwFourCC = DDS_MAKEFOURCC('D','X','T','3'); - break; - case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: - header.ddspf.dwFourCC = DDS_MAKEFOURCC('D','X','T','5'); - break; - } - } else { - header.ddspf.dwFlags = ( internalFormat == GL_COLOR_INDEX8_EXT ) ? DDSF_RGB | DDSF_ID_INDEXCOLOR : DDSF_RGB; - header.ddspf.dwRGBBitCount = bitSize; - switch ( altInternalFormat ) { - case GL_BGRA_EXT: - case GL_LUMINANCE_ALPHA: - header.ddspf.dwFlags |= DDSF_ALPHAPIXELS; - header.ddspf.dwABitMask = 0xFF000000; - // Fall through - case GL_BGR_EXT: - case GL_LUMINANCE: - case GL_COLOR_INDEX: - header.ddspf.dwRBitMask = 0x00FF0000; - header.ddspf.dwGBitMask = 0x0000FF00; - header.ddspf.dwBBitMask = 0x000000FF; - break; - case GL_ALPHA: - header.ddspf.dwFlags = DDSF_ALPHAPIXELS; - header.ddspf.dwABitMask = 0xFF000000; - break; - default: - common->Warning( "Unknown or unsupported format for %s", filename ); - return; - } - } - - idFile *f = fileSystem->OpenFileWrite( filename ); - if ( f == NULL ) { - common->Warning( "Could not open %s trying to write precompressed image", filename ); - return; - } - common->Printf( "Writing precompressed image: %s\n", filename ); - - f->Write( "DDS ", 4 ); - f->Write( &header, sizeof(header) ); - - // bind to the image so we can read back the contents - Bind(); - - qglPixelStorei( GL_PACK_ALIGNMENT, 1 ); // otherwise small rows get padded to 32 bits - - int uw = uploadWidth; - int uh = uploadHeight; - - // Will be allocated first time through the loop - byte *data = NULL; - - for ( int level = 0 ; level < numLevels ; level++ ) { - - int size = 0; - if ( FormatIsDXT( altInternalFormat ) ) { - size = ( ( uw + 3 ) / 4 ) * ( ( uh + 3 ) / 4 ) * - (altInternalFormat <= GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ? 8 : 16); - } else { - size = uw * uh * (bitSize / 8); - } - - if (data == NULL) { - data = (byte *)R_StaticAlloc( size ); - } - - if ( FormatIsDXT( altInternalFormat ) ) { - qglGetCompressedTexImageARB( GL_TEXTURE_2D, level, data ); - } else { - qglGetTexImage( GL_TEXTURE_2D, level, altInternalFormat, GL_UNSIGNED_BYTE, data ); - } - - f->Write( data, size ); - - uw /= 2; - uh /= 2; - if (uw < 1) { - uw = 1; - } - if (uh < 1) { - uh = 1; - } - } - - if (data != NULL) { - R_StaticFree( data ); - } - - fileSystem->CloseFile( f ); -} - -/* -================ -ShouldImageBePartialCached - -Returns true if there is a precompressed image, and it is large enough -to be worth caching -================ -*/ -bool idImage::ShouldImageBePartialCached() { - if ( !glConfig.textureCompressionAvailable ) { - return false; - } - - if ( !globalImages->image_useCache.GetBool() ) { - return false; - } - - // the allowDownSize flag does double-duty as don't-partial-load - if ( !allowDownSize ) { - return false; - } - - if ( globalImages->image_cacheMinK.GetInteger() <= 0 ) { - return false; - } - - // if we are doing a copyFiles, make sure the original images are referenced - if ( fileSystem->PerformingCopyFiles() ) { - return false; - } - - char filename[MAX_IMAGE_NAME]; - ImageProgramStringToCompressedFileName( imgName, filename ); - - // get the file timestamp - fileSystem->ReadFile( filename, NULL, ×tamp ); - - if ( timestamp == FILE_NOT_FOUND_TIMESTAMP ) { - return false; +int BitsForFormat( textureFormat_t format ) { + switch ( format ) { + case FMT_NONE: return 0; + case FMT_RGBA8: return 32; + case FMT_XRGB8: return 32; + case FMT_RGB565: return 16; + case FMT_L8A8: return 16; + case FMT_ALPHA: return 8; + case FMT_LUM8: return 8; + case FMT_INT8: return 8; + case FMT_DXT1: return 4; + case FMT_DXT5: return 8; + case FMT_DEPTH: return 32; + case FMT_X16: return 16; + case FMT_Y16_X16: return 32; + default: + assert( 0 ); + return 0; } +} - // open it and get the file size - idFile *f; - - f = fileSystem->OpenFileRead( filename ); - if ( !f ) { - return false; +/* +======================== +idImage::DeriveOpts +======================== +*/ +ID_INLINE void idImage::DeriveOpts() { + + if ( opts.format == FMT_NONE ) { + opts.colorFormat = CFM_DEFAULT; +// jmarshall - no need to compress + switch (usage) { + case TD_DEPTH: + opts.format = FMT_DEPTH; + break; + case TD_LIGHT: + opts.format = FMT_RGB565; + opts.gammaMips = true; + break; + case TD_LOOKUP_TABLE_MONO: + opts.format = FMT_INT8; + break; + case TD_LOOKUP_TABLE_ALPHA: + opts.format = FMT_ALPHA; + break; + case TD_LOOKUP_TABLE_RGB1: + case TD_LOOKUP_TABLE_RGBA: + opts.format = FMT_RGBA8; + break; + default: + opts.gammaMips = false; + opts.format = FMT_RGBA8; + opts.colorFormat = CFM_DEFAULT; + break; + } + +/* + switch ( usage ) { + case TD_COVERAGE: + opts.format = FMT_DXT1; + opts.colorFormat = CFM_GREEN_ALPHA; + break; + case TD_DEPTH: + opts.format = FMT_DEPTH; + break; + case TD_DIFFUSE: + // TD_DIFFUSE gets only set to when its a diffuse texture for an interaction + opts.gammaMips = true; + opts.format = FMT_DXT5; + opts.colorFormat = CFM_DEFAULT; + break; + case TD_SPECULAR: + opts.gammaMips = true; + opts.format = FMT_DXT1; + opts.colorFormat = CFM_DEFAULT; + break; + case TD_DEFAULT: + opts.gammaMips = true; + opts.format = FMT_DXT5; + opts.colorFormat = CFM_DEFAULT; + break; + case TD_BUMP: + opts.format = FMT_DXT5; + opts.colorFormat = CFM_NORMAL_DXT5; + break; + case TD_FONT: + opts.format = FMT_DXT1; + opts.colorFormat = CFM_GREEN_ALPHA; + opts.numLevels = 4; // We only support 4 levels because we align to 16 in the exporter + opts.gammaMips = true; + break; + case TD_LIGHT: + opts.format = FMT_RGB565; + opts.gammaMips = true; + break; + case TD_LOOKUP_TABLE_MONO: + opts.format = FMT_INT8; + break; + case TD_LOOKUP_TABLE_ALPHA: + opts.format = FMT_ALPHA; + break; + case TD_LOOKUP_TABLE_RGB1: + case TD_LOOKUP_TABLE_RGBA: + opts.format = FMT_RGBA8; + break; + default: + assert( false ); + opts.format = FMT_RGBA8; + } +*/ } - int len = f->Length(); - fileSystem->CloseFile( f ); + if ( opts.numLevels == 0 ) { + opts.numLevels = 1; - if ( len <= globalImages->image_cacheMinK.GetInteger() * 1024 ) { - return false; + if ( filter == TF_LINEAR || filter == TF_NEAREST ) { + // don't create mip maps if we aren't going to be using them + } else { + int temp_width = opts.width; + int temp_height = opts.height; + while ( temp_width > 1 || temp_height > 1 ) { + temp_width >>= 1; + temp_height >>= 1; + if ( ( opts.format == FMT_DXT1 || opts.format == FMT_DXT5 ) && + ( ( temp_width & 0x3 ) != 0 || ( temp_height & 0x3 ) != 0 ) ) { + break; + } + opts.numLevels++; + } + } } +} - // we do want to do a partial load - return true; +/* +======================== +idImage::AllocImage +======================== +*/ +void idImage::AllocImage( const idImageOpts &imgOpts, textureFilter_t tf, textureRepeat_t tr ) { + filter = tf; + repeat = tr; + opts = imgOpts; + DeriveOpts(); + AllocImage(); } /* ================ -CheckPrecompressedImage - -If fullLoad is false, only the small mip levels of the image will be loaded +GenerateImage ================ */ -bool idImage::CheckPrecompressedImage( bool fullLoad ) { - if ( !glConfig.isInitialized || !glConfig.textureCompressionAvailable ) { - return false; - } +void idImage::GenerateImage( const byte *pic, int width, int height, textureFilter_t filterParm, textureRepeat_t repeatParm, textureUsage_t usageParm ) { + PurgeImage(); -#if 1 // ( _D3XP had disabled ) - Allow grabbing of DDS's from original Doom pak files - // if we are doing a copyFiles, make sure the original images are referenced - if ( fileSystem->PerformingCopyFiles() ) { - return false; - } -#endif + filter = filterParm; + repeat = repeatParm; + usage = usageParm; + cubeFiles = CF_2D; - if ( depth == TD_BUMP && globalImages->image_useNormalCompression.GetInteger() != 2 ) { - return false; - } + opts.textureType = TT_2D; + opts.width = width; + opts.height = height; + opts.numLevels = 0; + DeriveOpts(); - // god i love last minute hacks :-) - if ( com_machineSpec.GetInteger() >= 1 && com_videoRam.GetInteger() >= 128 && imgName.Icmpn( "lights/", 7 ) == 0 ) { - return false; + // if we don't have a rendering context, just return after we + // have filled in the parms. We must have the values set, or + // an image match from a shader before the render starts would miss + // the generated texture + if ( !tr.IsOpenGLRunning() ) { + return; } - char filename[MAX_IMAGE_NAME]; - ImageProgramStringToCompressedFileName( imgName, filename ); - - // get the file timestamp - ID_TIME_T precompTimestamp; - fileSystem->ReadFile( filename, NULL, &precompTimestamp ); - + idBinaryImage im( GetName() ); + im.Load2DFromMemory( width, height, pic, opts.numLevels, opts.format, opts.colorFormat, opts.gammaMips ); - if ( precompTimestamp == FILE_NOT_FOUND_TIMESTAMP ) { - return false; - } + AllocImage(); - if ( !generatorFunction && timestamp != FILE_NOT_FOUND_TIMESTAMP ) { - if ( precompTimestamp < timestamp ) { - // The image has changed after being precompressed - return false; - } + for ( int i = 0; i < im.NumImages(); i++ ) { + const bimageImage_t & img = im.GetImageHeader( i ); + const byte * data = im.GetImageData( i ); + SubImageUpload( img.level, 0, 0, img.destZ, img.width, img.height, data ); } +} - timestamp = precompTimestamp; +/* +==================== +GenerateCubeImage - // open it and just read the header - idFile *f; +Non-square cube sides are not allowed +==================== +*/ +void idImage::GenerateCubeImage( const byte *pic[6], int size, textureFilter_t filterParm, textureUsage_t usageParm ) { + PurgeImage(); - f = fileSystem->OpenFileRead( filename ); - if ( !f ) { - return false; - } + filter = filterParm; + repeat = TR_CLAMP; + usage = usageParm; + cubeFiles = CF_NATIVE; - int len = f->Length(); - if ( len < sizeof( ddsFileHeader_t ) ) { - fileSystem->CloseFile( f ); - return false; - } + opts.textureType = TT_CUBIC; + opts.width = size; + opts.height = size; + opts.numLevels = 0; + DeriveOpts(); - if ( !fullLoad && len > globalImages->image_cacheMinK.GetInteger() * 1024 ) { - len = globalImages->image_cacheMinK.GetInteger() * 1024; + // if we don't have a rendering context, just return after we + // have filled in the parms. We must have the values set, or + // an image match from a shader before the render starts would miss + // the generated texture + if ( !tr.IsOpenGLRunning() ) { + return; } - byte *data = (byte *)R_StaticAlloc( len ); - - f->Read( data, len ); - - fileSystem->CloseFile( f ); - - unsigned long magic = LittleLong( *(unsigned long *)data ); - ddsFileHeader_t *_header = (ddsFileHeader_t *)(data + 4); - int ddspf_dwFlags = LittleLong( _header->ddspf.dwFlags ); + idBinaryImage im( GetName() ); + im.LoadCubeFromMemory( size, pic, opts.numLevels, opts.format, opts.gammaMips ); - if ( magic != DDS_MAKEFOURCC('D', 'D', 'S', ' ')) { - common->Printf( "CheckPrecompressedImage( %s ): magic != 'DDS '\n", imgName.c_str() ); - R_StaticFree( data ); - return false; - } + AllocImage(); - // if we don't support color index textures, we must load the full image - // should we just expand the 256 color image to 32 bit for upload? - if ( ddspf_dwFlags & DDSF_ID_INDEXCOLOR && !glConfig.sharedTexturePaletteAvailable ) { - R_StaticFree( data ); - return false; + for ( int i = 0; i < im.NumImages(); i++ ) { + const bimageImage_t & img = im.GetImageHeader( i ); + const byte * data = im.GetImageData( i ); + SubImageUpload( img.level, 0, 0, img.destZ, img.width, img.height, data ); } - - // upload all the levels - UploadPrecompressedImage( data, len ); - - R_StaticFree( data ); - - return true; } /* -=================== -UploadPrecompressedImage +=============== +GetGeneratedName -This can be called by the front end during nromal loading, -or by the backend after a background read of the file -has completed -=================== +name contains GetName() upon entry +=============== */ -void idImage::UploadPrecompressedImage( byte *data, int len ) { - ddsFileHeader_t *header = (ddsFileHeader_t *)(data + 4); - - // ( not byte swapping dwReserved1 dwReserved2 ) - header->dwSize = LittleLong( header->dwSize ); - header->dwFlags = LittleLong( header->dwFlags ); - header->dwHeight = LittleLong( header->dwHeight ); - header->dwWidth = LittleLong( header->dwWidth ); - header->dwPitchOrLinearSize = LittleLong( header->dwPitchOrLinearSize ); - header->dwDepth = LittleLong( header->dwDepth ); - header->dwMipMapCount = LittleLong( header->dwMipMapCount ); - header->dwCaps1 = LittleLong( header->dwCaps1 ); - header->dwCaps2 = LittleLong( header->dwCaps2 ); - - header->ddspf.dwSize = LittleLong( header->ddspf.dwSize ); - header->ddspf.dwFlags = LittleLong( header->ddspf.dwFlags ); - header->ddspf.dwFourCC = LittleLong( header->ddspf.dwFourCC ); - header->ddspf.dwRGBBitCount = LittleLong( header->ddspf.dwRGBBitCount ); - header->ddspf.dwRBitMask = LittleLong( header->ddspf.dwRBitMask ); - header->ddspf.dwGBitMask = LittleLong( header->ddspf.dwGBitMask ); - header->ddspf.dwBBitMask = LittleLong( header->ddspf.dwBBitMask ); - header->ddspf.dwABitMask = LittleLong( header->ddspf.dwABitMask ); - - // generate the texture number - qglGenTextures( 1, &texnum ); - - int externalFormat = 0; - - precompressedFile = true; - - uploadWidth = header->dwWidth; - uploadHeight = header->dwHeight; - if ( header->ddspf.dwFlags & DDSF_FOURCC ) { - switch ( header->ddspf.dwFourCC ) { - case DDS_MAKEFOURCC( 'D', 'X', 'T', '1' ): - if ( header->ddspf.dwFlags & DDSF_ALPHAPIXELS ) { - internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; - } else { - internalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; - } - break; - case DDS_MAKEFOURCC( 'D', 'X', 'T', '3' ): - internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; - break; - case DDS_MAKEFOURCC( 'D', 'X', 'T', '5' ): - internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; - break; - case DDS_MAKEFOURCC( 'R', 'X', 'G', 'B' ): - internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; - break; - default: - common->Warning( "Invalid compressed internal format\n" ); - return; - } - } else if ( ( header->ddspf.dwFlags & DDSF_RGBA ) && header->ddspf.dwRGBBitCount == 32 ) { - externalFormat = GL_BGRA_EXT; - internalFormat = GL_RGBA8; - } else if ( ( header->ddspf.dwFlags & DDSF_RGB ) && header->ddspf.dwRGBBitCount == 32 ) { - externalFormat = GL_BGRA_EXT; - internalFormat = GL_RGBA8; - } else if ( ( header->ddspf.dwFlags & DDSF_RGB ) && header->ddspf.dwRGBBitCount == 24 ) { - if ( header->ddspf.dwFlags & DDSF_ID_INDEXCOLOR ) { - externalFormat = GL_COLOR_INDEX; - internalFormat = GL_COLOR_INDEX8_EXT; - } else { - externalFormat = GL_BGR_EXT; - internalFormat = GL_RGB8; - } - } else if ( header->ddspf.dwRGBBitCount == 8 ) { - externalFormat = GL_ALPHA; - internalFormat = GL_ALPHA8; - } else { - common->Warning( "Invalid uncompressed internal format\n" ); - return; - } - - // we need the monochrome flag for the NV20 optimized path - if ( header->dwFlags & DDSF_ID_MONOCHROME ) { - isMonochrome = true; - } - - type = TT_2D; // FIXME: we may want to support pre-compressed cube maps in the future - - Bind(); - - int numMipmaps = 1; - if ( header->dwFlags & DDSF_MIPMAPCOUNT ) { - numMipmaps = header->dwMipMapCount; - } - - int uw = uploadWidth; - int uh = uploadHeight; - - // We may skip some mip maps if we are downsizing - int skipMip = 0; - GetDownsize( uploadWidth, uploadHeight ); - - byte *imagedata = data + sizeof(ddsFileHeader_t) + 4; - - for ( int i = 0 ; i < numMipmaps; i++ ) { - int size = 0; - if ( FormatIsDXT( internalFormat ) ) { - size = ( ( uw + 3 ) / 4 ) * ( ( uh + 3 ) / 4 ) * - (internalFormat <= GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ? 8 : 16); - } else { - size = uw * uh * (header->ddspf.dwRGBBitCount / 8); - } + void idImage::GetGeneratedName( idStr &_name, const textureUsage_t &_usage, const cubeFiles_t &_cube ) { + idStr extension; - if ( uw > uploadWidth || uh > uploadHeight ) { - skipMip++; - } else { - if ( FormatIsDXT( internalFormat ) ) { - qglCompressedTexImage2DARB( GL_TEXTURE_2D, i - skipMip, internalFormat, uw, uh, 0, size, imagedata ); - } else { - qglTexImage2D( GL_TEXTURE_2D, i - skipMip, internalFormat, uw, uh, 0, externalFormat, GL_UNSIGNED_BYTE, imagedata ); - } - } + _name.ExtractFileExtension( extension ); + _name.StripFileExtension(); - imagedata += size; - uw /= 2; - uh /= 2; - if (uw < 1) { - uw = 1; - } - if (uh < 1) { - uh = 1; - } + _name += va( "#__%02d%02d", (int)_usage, (int)_cube ); + if ( extension.Length() > 0 ) { + _name.SetFileExtension( extension ); } - - SetImageFilterAndRepeat(); } + /* =============== ActuallyLoadImage @@ -1573,9 +289,12 @@ Absolutely every image goes through this path On exit, the idImage will have a valid OpenGL texture number that can be bound =============== */ -void idImage::ActuallyLoadImage( bool checkForPrecompressed, bool fromBackEnd ) { - int width, height; - byte *pic; +void idImage::ActuallyLoadImage( bool fromBackEnd ) { + + // if we don't have a rendering context yet, just return + if ( !tr.IsOpenGLRunning() ) { + return; + } // this is the ONLY place generatorFunction will ever be called if ( generatorFunction ) { @@ -1583,107 +302,153 @@ void idImage::ActuallyLoadImage( bool checkForPrecompressed, bool fromBackEnd ) return; } - // if we are a partial image, we are only going to load from a compressed file - if ( isPartialImage ) { - if ( CheckPrecompressedImage( false ) ) { - return; + if ( com_productionMode.GetInteger() != 0 ) { + sourceFileTime = FILE_NOT_FOUND_TIMESTAMP; + if ( cubeFiles != CF_2D ) { + opts.textureType = TT_CUBIC; + repeat = TR_CLAMP; + } + } else { + if ( cubeFiles != CF_2D ) { + opts.textureType = TT_CUBIC; + repeat = TR_CLAMP; + R_LoadCubeImages( GetName(), cubeFiles, NULL, NULL, &sourceFileTime ); + } else { + opts.textureType = TT_2D; + R_LoadImageProgram( GetName(), NULL, NULL, NULL, &sourceFileTime, &usage ); } - // this is an error -- the partial image failed to load - MakeDefault(); - return; } - // - // load the image from disk - // - if ( cubeFiles != CF_2D ) { - byte *pics[6]; + // Figure out opts.colorFormat and opts.format so we can make sure the binary image is up to date + DeriveOpts(); - // we don't check for pre-compressed cube images currently - R_LoadCubeImages( imgName, cubeFiles, pics, &width, ×tamp ); + idStr generatedName = GetName(); + GetGeneratedName( generatedName, usage, cubeFiles ); - if ( pics[0] == NULL ) { - common->Warning( "Couldn't load cube image: %s", imgName.c_str() ); - MakeDefault(); - return; - } + idBinaryImage im( generatedName ); + binaryFileTime = im.LoadFromGeneratedFile( sourceFileTime ); - GenerateCubeImage( (const byte **)pics, width, filter, allowDownSize, depth ); - precompressedFile = false; - - for ( int i = 0 ; i < 6 ; i++ ) { - if ( pics[i] ) { - R_StaticFree( pics[i] ); + // BFHACK, do not want to tweak on buildgame so catch these images here + if ( binaryFileTime == FILE_NOT_FOUND_TIMESTAMP ) { + int c = 1; + while ( c-- > 0 ) { + if ( generatedName.Find( "guis/assets/white#__0000", false ) >= 0 ) { + generatedName.Replace( "white#__0000", "white#__0200" ); + im.SetName( generatedName ); + binaryFileTime = im.LoadFromGeneratedFile( sourceFileTime ); + break; + } + if ( generatedName.Find( "guis/assets/white#__0100", false ) >= 0 ) { + generatedName.Replace( "white#__0100", "white#__0200" ); + im.SetName( generatedName ); + binaryFileTime = im.LoadFromGeneratedFile( sourceFileTime ); + break; + } + if ( generatedName.Find( "textures/black#__0100", false ) >= 0 ) { + generatedName.Replace( "black#__0100", "black#__0200" ); + im.SetName( generatedName ); + binaryFileTime = im.LoadFromGeneratedFile( sourceFileTime ); + break; + } + if ( generatedName.Find( "textures/decals/bulletglass1_d#__0100", false ) >= 0 ) { + generatedName.Replace( "bulletglass1_d#__0100", "bulletglass1_d#__0200" ); + im.SetName( generatedName ); + binaryFileTime = im.LoadFromGeneratedFile( sourceFileTime ); + break; + } + if ( generatedName.Find( "models/monsters/skeleton/skeleton01_d#__1000", false ) >= 0 ) { + generatedName.Replace( "skeleton01_d#__1000", "skeleton01_d#__0100" ); + im.SetName( generatedName ); + binaryFileTime = im.LoadFromGeneratedFile( sourceFileTime ); + break; } } + } + const bimageFile_t & header = im.GetFileHeader(); + + if ( ( fileSystem->InProductionMode() && binaryFileTime != FILE_NOT_FOUND_TIMESTAMP ) || ( ( binaryFileTime != FILE_NOT_FOUND_TIMESTAMP ) + && ( header.colorFormat == opts.colorFormat ) + && ( header.format == opts.format ) + && ( header.textureType == opts.textureType ) + ) ) { + opts.width = header.width; + opts.height = header.height; + opts.numLevels = header.numLevels; + opts.colorFormat = (textureColor_t)header.colorFormat; + opts.format = (textureFormat_t)header.format; + opts.textureType = (textureType_t)header.textureType; + //if ( cvarSystem->GetCVarBool( "fs_buildresources" ) ) { + // // for resource gathering write this image to the preload file for this map + // fileSystem->AddImagePreload( GetName(), filter, repeat, usage, cubeFiles ); + //} } else { - // see if we have a pre-generated image file that is - // already image processed and compressed - if ( checkForPrecompressed && globalImages->image_usePrecompressedTextures.GetBool() ) { - if ( CheckPrecompressedImage( true ) ) { - // we got the precompressed image + if ( cubeFiles != CF_2D ) { + int size; + byte * pics[6]; + + if ( !R_LoadCubeImages( GetName(), cubeFiles, pics, &size, &sourceFileTime ) || size == 0 ) { + idLib::Warning( "Couldn't load cube image: %s", GetName() ); return; } - // fall through to load the normal image - } - R_LoadImageProgram( imgName, &pic, &width, &height, ×tamp, &depth ); - - if ( pic == NULL ) { - common->Warning( "Couldn't load image: %s", imgName.c_str() ); - MakeDefault(); - return; - } -/* - // swap the red and alpha for rxgb support - // do this even on tga normal maps so we only have to use - // one fragment program - // if the image is precompressed ( either in palletized mode or true rxgb mode ) - // then it is loaded above and the swap never happens here - if ( depth == TD_BUMP && globalImages->image_useNormalCompression.GetInteger() != 1 ) { - for ( int i = 0; i < width * height * 4; i += 4 ) { - pic[ i + 3 ] = pic[ i ]; - pic[ i ] = 0; + opts.textureType = TT_CUBIC; + repeat = TR_CLAMP; + opts.width = size; + opts.height = size; + opts.numLevels = 0; + DeriveOpts(); + im.LoadCubeFromMemory( size, (const byte **)pics, opts.numLevels, opts.format, opts.gammaMips ); + repeat = TR_CLAMP; + + for ( int i = 0; i < 6; i++ ) { + if ( pics[i] ) { + Mem_Free( pics[i] ); + } } - } -*/ - // build a hash for checking duplicate image files - // NOTE: takes about 10% of image load times (SD) - // may not be strictly necessary, but some code uses it, so let's leave it in - imageHash = MD4_BlockChecksum( pic, width * height * 4 ); + } else { + int width, height; + byte * pic; + + // load the full specification, and perform any image program calculations + R_LoadImageProgram( GetName(), &pic, &width, &height, &sourceFileTime, &usage ); + + if ( pic == NULL ) { + idLib::Warning( "Couldn't load image: %s : %s", GetName(), generatedName.c_str() ); + // create a default so it doesn't get continuously reloaded + opts.width = 8; + opts.height = 8; + opts.numLevels = 1; + DeriveOpts(); + AllocImage(); + + // clear the data so it's not left uninitialized + idTempArray clear( opts.width * opts.height * 4 ); + memset( clear.Ptr(), 0, clear.Size() ); + for ( int level = 0; level < opts.numLevels; level++ ) { + SubImageUpload( level, 0, 0, 0, opts.width >> level, opts.height >> level, clear.Ptr() ); + } - GenerateImage( pic, width, height, filter, allowDownSize, repeat, depth ); - timestamp = timestamp; - precompressedFile = false; + return; + } - R_StaticFree( pic ); + opts.width = width; + opts.height = height; + opts.numLevels = 0; + DeriveOpts(); + im.Load2DFromMemory( opts.width, opts.height, pic, opts.numLevels, opts.format, opts.colorFormat, opts.gammaMips ); - // write out the precompressed version of this file if needed - WritePrecompressedImage(); + Mem_Free( pic ); + } + binaryFileTime = im.WriteGeneratedFile( sourceFileTime ); } -} -//========================================================================================================= + AllocImage(); -/* -=============== -PurgeImage -=============== -*/ -void idImage::PurgeImage() { - if ( texnum != TEXTURE_NOT_LOADED ) { - // sometimes is NULL when exiting with an error - if ( qglDeleteTextures ) { - qglDeleteTextures( 1, &texnum ); // this should be the ONLY place it is ever called! - } - texnum = TEXTURE_NOT_LOADED; - } - // clear all the current binding caches, so the next bind will do a real one - for ( int i = 0 ; i < MAX_MULTITEXTURE_UNITS ; i++ ) { - backEnd.glState.tmu[i].current2DMap = -1; - backEnd.glState.tmu[i].current3DMap = -1; - backEnd.glState.tmu[i].currentCubeMap = -1; + for ( int i = 0; i < im.NumImages(); i++ ) { + const bimageImage_t & img = im.GetImageHeader( i ); + const byte * data = im.GetImageData( i ); + SubImageUpload( img.level, 0, 0, img.destZ, img.width, img.height, data ); } } @@ -1691,270 +456,108 @@ void idImage::PurgeImage() { ============== Bind -Automatically enables 2D mapping, cube mapping, or 3D texturing if needed +Automatically enables 2D mapping or cube mapping if needed ============== */ void idImage::Bind() { - if ( tr.logFile ) { - RB_LogComment( "idImage::Bind( %s )\n", imgName.c_str() ); - } - - // if this is an image that we are caching, move it to the front of the LRU chain - if ( partialImage ) { - if ( cacheUsageNext ) { - // unlink from old position - cacheUsageNext->cacheUsagePrev = cacheUsagePrev; - cacheUsagePrev->cacheUsageNext = cacheUsageNext; - } - // link in at the head of the list - cacheUsageNext = globalImages->cacheLRU.cacheUsageNext; - cacheUsagePrev = &globalImages->cacheLRU; - cacheUsageNext->cacheUsagePrev = this; - cacheUsagePrev->cacheUsageNext = this; - } - - // load the image if necessary (FIXME: not SMP safe!) - if ( texnum == TEXTURE_NOT_LOADED ) { - if ( partialImage ) { - // if we have a partial image, go ahead and use that - this->partialImage->Bind(); - - // start a background load of the full thing if it isn't already in the queue - if ( !backgroundLoadInProgress ) { - StartBackgroundImageLoad(); - } - return; - } + // RENDERLOG_PRINTF( "idImage::Bind( %s )\n", GetName() ); + // load the image if necessary (FIXME: not SMP safe!) + if (!IsLoaded()) { // load the image on demand here, which isn't our normal game operating mode - ActuallyLoadImage( true, true ); // check for precompressed, load is from back end + ActuallyLoadImage(true); } + const int texUnit = backEnd.glState.currenttmu; - // bump our statistic counters - frameUsed = backEnd.frameCount; - bindCount++; - - tmu_t *tmu = &backEnd.glState.tmu[backEnd.glState.currenttmu]; + tmu_t* tmu = &backEnd.glState.tmu[texUnit]; // enable or disable apropriate texture modes - if ( tmu->textureType != type && ( backEnd.glState.currenttmu < glConfig.maxTextureUnits ) ) { - if ( tmu->textureType == TT_CUBIC ) { - qglDisable( GL_TEXTURE_CUBE_MAP_EXT ); - } else if ( tmu->textureType == TT_3D ) { - qglDisable( GL_TEXTURE_3D ); - } else if ( tmu->textureType == TT_2D ) { - qglDisable( GL_TEXTURE_2D ); + if (tmu->textureType != opts.textureType && (backEnd.glState.currenttmu < glConfig.maxTextureUnits)) { + if (tmu->textureType == TT_CUBIC) { + glDisable(GL_TEXTURE_CUBE_MAP_EXT); + } + else if (tmu->textureType == TT_2D) { + glDisable(GL_TEXTURE_2D); } - if ( type == TT_CUBIC ) { - qglEnable( GL_TEXTURE_CUBE_MAP_EXT ); - } else if ( type == TT_3D ) { - qglEnable( GL_TEXTURE_3D ); - } else if ( type == TT_2D ) { - qglEnable( GL_TEXTURE_2D ); + if (opts.textureType == TT_CUBIC) { + glEnable(GL_TEXTURE_CUBE_MAP_EXT); } - tmu->textureType = type; + else if (opts.textureType == TT_2D) { + glEnable(GL_TEXTURE_2D); + } + tmu->textureType = opts.textureType; } // bind the texture - if ( type == TT_2D ) { - if ( tmu->current2DMap != texnum ) { + if (opts.textureType == TT_2D) { + if (tmu->current2DMap != texnum) { tmu->current2DMap = texnum; - qglBindTexture( GL_TEXTURE_2D, texnum ); + glBindMultiTextureEXT(GL_TEXTURE0_ARB + texUnit, GL_TEXTURE_2D, texnum); } - } else if ( type == TT_CUBIC ) { - if ( tmu->currentCubeMap != texnum ) { + } + else if (opts.textureType == TT_CUBIC) { + if (tmu->currentCubeMap != texnum) { tmu->currentCubeMap = texnum; - qglBindTexture( GL_TEXTURE_CUBE_MAP_EXT, texnum ); - } - } else if ( type == TT_3D ) { - if ( tmu->current3DMap != texnum ) { - tmu->current3DMap = texnum; - qglBindTexture( GL_TEXTURE_3D, texnum ); + glBindMultiTextureEXT(GL_TEXTURE0_ARB + texUnit, GL_TEXTURE_CUBE_MAP_EXT, texnum); } } - if ( com_purgeAll.GetBool() ) { - GLclampf priority = 1.0f; - qglPrioritizeTextures( 1, &texnum, &priority ); - } } /* -============== -BindFragment - -Fragment programs explicitly say which type of map they want, so we don't need to -do any enable / disable changes -============== +================ +MakePowerOfTwo +================ */ -void idImage::BindFragment() { - if ( tr.logFile ) { - RB_LogComment( "idImage::BindFragment %s )\n", imgName.c_str() ); - } - - // if this is an image that we are caching, move it to the front of the LRU chain - if ( partialImage ) { - if ( cacheUsageNext ) { - // unlink from old position - cacheUsageNext->cacheUsagePrev = cacheUsagePrev; - cacheUsagePrev->cacheUsageNext = cacheUsageNext; - } - // link in at the head of the list - cacheUsageNext = globalImages->cacheLRU.cacheUsageNext; - cacheUsagePrev = &globalImages->cacheLRU; - - cacheUsageNext->cacheUsagePrev = this; - cacheUsagePrev->cacheUsageNext = this; - } - - // load the image if necessary (FIXME: not SMP safe!) - if ( texnum == TEXTURE_NOT_LOADED ) { - if ( partialImage ) { - // if we have a partial image, go ahead and use that - this->partialImage->BindFragment(); - - // start a background load of the full thing if it isn't already in the queue - if ( !backgroundLoadInProgress ) { - StartBackgroundImageLoad(); - } - return; - } - - // load the image on demand here, which isn't our normal game operating mode - ActuallyLoadImage( true, true ); // check for precompressed, load is from back end - } - - - // bump our statistic counters - frameUsed = backEnd.frameCount; - bindCount++; - - // bind the texture - if ( type == TT_2D ) { - qglBindTexture( GL_TEXTURE_2D, texnum ); - } else if ( type == TT_RECT ) { - qglBindTexture( GL_TEXTURE_RECTANGLE_NV, texnum ); - } else if ( type == TT_CUBIC ) { - qglBindTexture( GL_TEXTURE_CUBE_MAP_EXT, texnum ); - } else if ( type == TT_3D ) { - qglBindTexture( GL_TEXTURE_3D, texnum ); +int MakePowerOfTwo( int num ) { + int pot; + for ( pot = 1; pot < num; pot <<= 1 ) { } + return pot; } - /* ==================== CopyFramebuffer ==================== */ -void idImage::CopyFramebuffer( int x, int y, int imageWidth, int imageHeight, bool useOversizedBuffer ) { - Bind(); - - if ( cvarSystem->GetCVarBool( "g_lowresFullscreenFX" ) ) { - imageWidth = 512; - imageHeight = 512; - } - - // if the size isn't a power of 2, the image must be increased in size - int potWidth, potHeight; +void idImage::CopyFramebuffer( int x, int y, int imageWidth, int imageHeight ) { - potWidth = MakePowerOfTwo( imageWidth ); - potHeight = MakePowerOfTwo( imageHeight ); - GetDownsize( imageWidth, imageHeight ); - GetDownsize( potWidth, potHeight ); + glBindTexture( ( opts.textureType == TT_CUBIC ) ? GL_TEXTURE_CUBE_MAP_EXT : GL_TEXTURE_2D, texnum ); - qglReadBuffer( GL_BACK ); + glReadBuffer( GL_BACK ); - // only resize if the current dimensions can't hold it at all, - // otherwise subview renderings could thrash this - if ( ( useOversizedBuffer && ( uploadWidth < potWidth || uploadHeight < potHeight ) ) - || ( !useOversizedBuffer && ( uploadWidth != potWidth || uploadHeight != potHeight ) ) ) { - uploadWidth = potWidth; - uploadHeight = potHeight; - if ( potWidth == imageWidth && potHeight == imageHeight ) { - qglCopyTexImage2D( GL_TEXTURE_2D, 0, GL_RGB8, x, y, imageWidth, imageHeight, 0 ); - } else { - byte *junk; - // we need to create a dummy image with power of two dimensions, - // then do a qglCopyTexSubImage2D of the data we want - // this might be a 16+ meg allocation, which could fail on _alloca - junk = (byte *)Mem_Alloc( potWidth * potHeight * 4 ); - memset( junk, 0, potWidth * potHeight * 4 ); //!@# -#if 0 // Disabling because it's unnecessary and introduces a green strip on edge of _currentRender - for ( int i = 0 ; i < potWidth * potHeight * 4 ; i+=4 ) { - junk[i+1] = 255; - } -#endif - qglTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, potWidth, potHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, junk ); - Mem_Free( junk ); - - qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, x, y, imageWidth, imageHeight ); - } - } else { - // otherwise, just subimage upload it so that drivers can tell we are going to be changing - // it and don't try and do a texture compression or some other silliness - qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, x, y, imageWidth, imageHeight ); - } - - // if the image isn't a full power of two, duplicate an extra row and/or column to fix bilerps - if ( imageWidth != potWidth ) { - qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, imageWidth, 0, x+imageWidth-1, y, 1, imageHeight ); - } - if ( imageHeight != potHeight ) { - qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, imageHeight, x, y+imageHeight-1, imageWidth, 1 ); - } + opts.width = imageWidth; + opts.height = imageHeight; + glCopyTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, x, y, imageWidth, imageHeight, 0 ); - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + // these shouldn't be necessary if the image was initialized properly + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); - backEnd.c_copyFrameBuffer++; +// backEnd.pc.c_copyFrameBuffer++; } /* ==================== CopyDepthbuffer - -This should just be part of copyFramebuffer once we have a proper image type field ==================== */ void idImage::CopyDepthbuffer( int x, int y, int imageWidth, int imageHeight ) { - Bind(); - - // if the size isn't a power of 2, the image must be increased in size - int potWidth, potHeight; - - potWidth = MakePowerOfTwo( imageWidth ); - potHeight = MakePowerOfTwo( imageHeight ); - - if ( uploadWidth != potWidth || uploadHeight != potHeight ) { - uploadWidth = potWidth; - uploadHeight = potHeight; - if ( potWidth == imageWidth && potHeight == imageHeight ) { - qglCopyTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, x, y, imageWidth, imageHeight, 0 ); - } else { - // we need to create a dummy image with power of two dimensions, - // then do a qglCopyTexSubImage2D of the data we want - qglTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, potWidth, potHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL ); - qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, x, y, imageWidth, imageHeight ); - } - } else { - // otherwise, just subimage upload it so that drivers can tell we are going to be changing - // it and don't try and do a texture compression or some other silliness - qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, x, y, imageWidth, imageHeight ); - } + glBindTexture( ( opts.textureType == TT_CUBIC ) ? GL_TEXTURE_CUBE_MAP_EXT : GL_TEXTURE_2D, texnum ); -// qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); -// qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); + opts.width = imageWidth; + opts.height = imageHeight; + glCopyTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, x, y, imageWidth, imageHeight, 0 ); - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); + //backEnd.pc.c_copyFrameBuffer++; } /* @@ -1964,113 +567,62 @@ RB_UploadScratchImage if rows = cols * 6, assume it is a cube map animation ============= */ -void idImage::UploadScratch( const byte *data, int cols, int rows ) { - int i; +void idImage::UploadScratch( const byte * data, int cols, int rows ) { // if rows = cols * 6, assume it is a cube map animation if ( rows == cols * 6 ) { - if ( type != TT_CUBIC ) { - type = TT_CUBIC; - uploadWidth = -1; // for a non-sub upload + rows /= 6; + const byte * pic[6]; + for ( int i = 0; i < 6; i++ ) { + pic[i] = data + cols * rows * 4 * i; } - Bind(); - - rows /= 6; - // if the scratchImage isn't in the format we want, specify it as a new texture - if ( cols != uploadWidth || rows != uploadHeight ) { - uploadWidth = cols; - uploadHeight = rows; - - // upload the base level - for ( i = 0 ; i < 6 ; i++ ) { - qglTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT+i, 0, GL_RGB8, cols, rows, 0, - GL_RGBA, GL_UNSIGNED_BYTE, data + cols*rows*4*i ); - } - } else { - // otherwise, just subimage upload it so that drivers can tell we are going to be changing - // it and don't try and do a texture compression - for ( i = 0 ; i < 6 ; i++ ) { - qglTexSubImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT+i, 0, 0, 0, cols, rows, - GL_RGBA, GL_UNSIGNED_BYTE, data + cols*rows*4*i ); - } + if ( opts.textureType != TT_CUBIC || usage != TD_LOOKUP_TABLE_RGBA ) { + GenerateCubeImage( pic, cols, TF_LINEAR, TD_LOOKUP_TABLE_RGBA ); + return; } - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - // no other clamp mode makes sense - qglTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - qglTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - } else { - // otherwise, it is a 2D image - if ( type != TT_2D ) { - type = TT_2D; - uploadWidth = -1; // for a non-sub upload + if ( opts.width != cols || opts.height != rows ) { + opts.width = cols; + opts.height = rows; + AllocImage(); + } + SetSamplerState( TF_LINEAR, TR_CLAMP ); + for ( int i = 0; i < 6; i++ ) { + SubImageUpload( 0, 0, 0, i, opts.width, opts.height, pic[i] ); } - Bind(); - - // if the scratchImage isn't in the format we want, specify it as a new texture - if ( cols != uploadWidth || rows != uploadHeight ) { - uploadWidth = cols; - uploadHeight = rows; - qglTexImage2D( GL_TEXTURE_2D, 0, GL_RGB8, cols, rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, data ); - } else { - // otherwise, just subimage upload it so that drivers can tell we are going to be changing - // it and don't try and do a texture compression - qglTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, cols, rows, GL_RGBA, GL_UNSIGNED_BYTE, data ); + } else { + if ( opts.textureType != TT_2D || usage != TD_LOOKUP_TABLE_RGBA ) { + GenerateImage( data, cols, rows, TF_LINEAR, TR_REPEAT, TD_LOOKUP_TABLE_RGBA ); + return; } - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - // these probably should be clamp, but we have a lot of issues with editor - // geometry coming out with texcoords slightly off one side, resulting in - // a smear across the entire polygon -#if 1 - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); -#else - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); - qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); -#endif + if ( opts.width != cols || opts.height != rows ) { + opts.width = cols; + opts.height = rows; + AllocImage(); + } + SetSamplerState( TF_LINEAR, TR_REPEAT ); + SubImageUpload( 0, 0, 0, 0, opts.width, opts.height, data ); } } - -void idImage::SetClassification( int tag ) { - classification = tag; -} - /* ================== StorageSize ================== */ int idImage::StorageSize() const { - int baseSize; - if ( texnum == TEXTURE_NOT_LOADED ) { + if ( !IsLoaded() ) { return 0; } - - switch ( type ) { - default: - case TT_2D: - baseSize = uploadWidth*uploadHeight; - break; - case TT_3D: - baseSize = uploadWidth*uploadHeight*uploadDepth; - break; - case TT_CUBIC: - baseSize = 6 * uploadWidth*uploadHeight; - break; + int baseSize = opts.width * opts.height; + if ( opts.numLevels > 1 ) { + baseSize *= 4; + baseSize /= 3; } - - baseSize *= BitsForInternalFormat( internalFormat ); - + baseSize *= BitsForFormat( opts.format ); baseSize /= 8; - - // account for mip mapping - baseSize = baseSize * 4 / 3; - return baseSize; } @@ -2080,133 +632,130 @@ Print ================== */ void idImage::Print() const { - if ( precompressedFile ) { - common->Printf( "P" ); - } else if ( generatorFunction ) { + if ( generatorFunction ) { common->Printf( "F" ); } else { common->Printf( " " ); } - switch ( type ) { - case TT_2D: - common->Printf( " " ); - break; - case TT_3D: - common->Printf( "3" ); - break; - case TT_CUBIC: - common->Printf( "C" ); - break; - case TT_RECT: - common->Printf( "R" ); - break; - default: - common->Printf( "", type ); - break; + switch ( opts.textureType ) { + case TT_2D: + common->Printf( " " ); + break; + case TT_CUBIC: + common->Printf( "C" ); + break; + default: + common->Printf( "", opts.textureType ); + break; } - common->Printf( "%4i %4i ", uploadWidth, uploadHeight ); - - switch( filter ) { - case TF_DEFAULT: - common->Printf( "dflt " ); - break; - case TF_LINEAR: - common->Printf( "linr " ); - break; - case TF_NEAREST: - common->Printf( "nrst " ); - break; - default: - common->Printf( "", filter ); - break; + common->Printf( "%4i %4i ", opts.width, opts.height ); + + switch ( opts.format ) { +#define NAME_FORMAT( x ) case FMT_##x: common->Printf( "%-6s ", #x ); break; + NAME_FORMAT( NONE ); + NAME_FORMAT( RGBA8 ); + NAME_FORMAT( XRGB8 ); + NAME_FORMAT( RGB565 ); + NAME_FORMAT( L8A8 ); + NAME_FORMAT( ALPHA ); + NAME_FORMAT( LUM8 ); + NAME_FORMAT( INT8 ); + NAME_FORMAT( DXT1 ); + NAME_FORMAT( DXT5 ); + NAME_FORMAT( DEPTH ); + NAME_FORMAT( X16 ); + NAME_FORMAT( Y16_X16 ); + default: + common->Printf( "<%3i>", opts.format ); + break; } - switch ( internalFormat ) { - case GL_INTENSITY8: - case 1: - common->Printf( "I " ); - break; - case 2: - case GL_LUMINANCE8_ALPHA8: - common->Printf( "LA " ); - break; - case 3: - common->Printf( "RGB " ); - break; - case 4: - common->Printf( "RGBA " ); - break; - case GL_LUMINANCE8: - common->Printf( "L " ); - break; - case GL_ALPHA8: - common->Printf( "A " ); - break; - case GL_RGBA8: - common->Printf( "RGBA8 " ); - break; - case GL_RGB8: - common->Printf( "RGB8 " ); - break; - case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: - common->Printf( "DXT1 " ); - break; - case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: - common->Printf( "DXT1A " ); - break; - case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: - common->Printf( "DXT3 " ); - break; - case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: - common->Printf( "DXT5 " ); - break; - case GL_RGBA4: - common->Printf( "RGBA4 " ); - break; - case GL_RGB5: - common->Printf( "RGB5 " ); - break; - case GL_COLOR_INDEX8_EXT: - common->Printf( "CI8 " ); - break; - case GL_COLOR_INDEX: - common->Printf( "CI " ); - break; - case GL_COMPRESSED_RGB_ARB: - common->Printf( "RGBC " ); - break; - case GL_COMPRESSED_RGBA_ARB: - common->Printf( "RGBAC " ); - break; - case 0: - common->Printf( " " ); - break; - default: - common->Printf( "", internalFormat ); - break; + switch( filter ) { + case TF_DEFAULT: + common->Printf( "mip " ); + break; + case TF_LINEAR: + common->Printf( "linr " ); + break; + case TF_NEAREST: + common->Printf( "nrst " ); + break; + default: + common->Printf( "", filter ); + break; } switch ( repeat ) { - case TR_REPEAT: - common->Printf( "rept " ); - break; - case TR_CLAMP_TO_ZERO: - common->Printf( "zero " ); - break; - case TR_CLAMP_TO_ZERO_ALPHA: - common->Printf( "azro " ); - break; - case TR_CLAMP: - common->Printf( "clmp " ); - break; - default: - common->Printf( "", repeat ); - break; + case TR_REPEAT: + common->Printf( "rept " ); + break; + case TR_CLAMP_TO_ZERO: + common->Printf( "zero " ); + break; + case TR_CLAMP_TO_ZERO_ALPHA: + common->Printf( "azro " ); + break; + case TR_CLAMP: + common->Printf( "clmp " ); + break; + default: + common->Printf( "", repeat ); + break; } - + common->Printf( "%4ik ", StorageSize() / 1024 ); - common->Printf( " %s\n", imgName.c_str() ); + common->Printf( " %s\n", GetName() ); +} + +/* +=============== +idImage::Reload +=============== +*/ +void idImage::Reload( bool force ) { + // always regenerate functional images + if ( generatorFunction ) { + common->DPrintf( "regenerating %s.\n", GetName() ); + generatorFunction( this ); + return; + } + + // check file times + if ( !force ) { + ID_TIME_T current; + if ( cubeFiles != CF_2D ) { + R_LoadCubeImages( imgName, cubeFiles, NULL, NULL, ¤t ); + } else { + // get the current values + R_LoadImageProgram( imgName, NULL, NULL, NULL, ¤t ); + } + if ( current <= sourceFileTime ) { + return; + } + } + + common->DPrintf( "reloading %s.\n", GetName() ); + + PurgeImage(); + + // Load is from the front end, so the back end must be synced + ActuallyLoadImage( false ); +} + +/* +======================== +idImage::SetSamplerState +======================== +*/ +void idImage::SetSamplerState( textureFilter_t tf, textureRepeat_t tr ) { + if ( tf == filter && tr == repeat ) { + return; + } + filter = tf; + repeat = tr; + glBindTexture( ( opts.textureType == TT_CUBIC ) ? GL_TEXTURE_CUBE_MAP_EXT : GL_TEXTURE_2D, texnum ); + SetTexParameters(); } diff --git a/src/renderer/Image_process.cpp b/src/renderer/Image_process.cpp index 5998dc2a..6ef44ca4 100644 --- a/src/renderer/Image_process.cpp +++ b/src/renderer/Image_process.cpp @@ -1,32 +1,33 @@ /* =========================================================================== -Doom 3 GPL Source Code -Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. -This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?). +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). -Doom 3 Source Code is free software: you can redistribute it and/or modify +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. -Doom 3 Source Code is distributed in the hope that it will be useful, +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with Doom 3 Source Code. If not, see . +along with Doom 3 BFG Edition Source Code. If not, see . -In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below. +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. =========================================================================== */ -#include "precompiled.h" #pragma hdrstop +#include "precompiled.h" + #include "tr_local.h" @@ -128,108 +129,6 @@ byte *R_Dropsample( const byte *in, int inwidth, int inheight, return out; } - -/* -=============== -R_SetBorderTexels - -=============== -*/ -void R_SetBorderTexels( byte *inBase, int width, int height, const byte border[4] ) { - int i; - byte *out; - - out = inBase; - for (i=0 ; iFatalError( "R_MipMap called with size %i,%i", width, height ); + return NULL; } - border[0] = in[0]; - border[1] = in[1]; - border[2] = in[2]; - border[3] = in[3]; - row = width * 4; newWidth = width >> 1; @@ -430,120 +336,85 @@ byte *R_MipMap( const byte *in, int width, int height, bool preserveBorder ) { if ( width == 0 || height == 0 ) { width += height; // get largest - if ( preserveBorder ) { - for (i=0 ; i>1; - out_p[1] = ( in_p[1] + in_p[5] )>>1; - out_p[2] = ( in_p[2] + in_p[6] )>>1; - out_p[3] = ( in_p[3] + in_p[7] )>>1; - } + for (i=0 ; i>2; - out_p[1] = (in_p[1] + in_p[5] + in_p[row+1] + in_p[row+5])>>2; - out_p[2] = (in_p[2] + in_p[6] + in_p[row+2] + in_p[row+6])>>2; - out_p[3] = (in_p[3] + in_p[7] + in_p[row+3] + in_p[row+7])>>2; + out_p[0] = idMath::Ftob( 255.0f * idMath::Pow( 0.25f * ( mip_gammaTable[in_p[0]] + mip_gammaTable[in_p[4]] + mip_gammaTable[in_p[row+0]] + mip_gammaTable[in_p[row+4]] ), 1.0f / 2.2f ) ); + out_p[1] = idMath::Ftob( 255.0f * idMath::Pow( 0.25f * ( mip_gammaTable[in_p[1]] + mip_gammaTable[in_p[5]] + mip_gammaTable[in_p[row+1]] + mip_gammaTable[in_p[row+5]] ), 1.0f / 2.2f ) ); + out_p[2] = idMath::Ftob( 255.0f * idMath::Pow( 0.25f * ( mip_gammaTable[in_p[2]] + mip_gammaTable[in_p[6]] + mip_gammaTable[in_p[row+2]] + mip_gammaTable[in_p[row+6]] ), 1.0f / 2.2f ) ); + out_p[3] = idMath::Ftob( 255.0f * idMath::Pow( 0.25f * ( mip_gammaTable[in_p[3]] + mip_gammaTable[in_p[7]] + mip_gammaTable[in_p[row+3]] + mip_gammaTable[in_p[row+7]] ), 1.0f / 2.2f ) ); } } - // copy the old border texel back around if desired - if ( preserveBorder ) { - R_SetBorderTexels( out, width, height, border ); - } - return out; } /* ================ -R_MipMap3D - -Returns a new copy of the texture, eigthed in size and filtered. +R_MipMap -If a texture is intended to be used in GL_CLAMP or GL_CLAMP_TO_EDGE mode with -a completely transparent border, we must prevent any blurring into the outer -ring of texels by filling it with the border from the previous level. This -will result in a slight shrinking of the texture as it mips, but better than -smeared clamps... +Returns a new copy of the texture, quartered in size and filtered. ================ */ -byte *R_MipMap3D( const byte *in, int width, int height, int depth, bool preserveBorder ) { - int i, j, k; +byte * R_MipMap( const byte *in, int width, int height ) { + int i, j; const byte *in_p; byte *out, *out_p; - int row, plane; - byte border[4]; - int newWidth, newHeight, newDepth; - - if ( depth == 1 ) { - return R_MipMap( in, width, height, preserveBorder ); - } + int row; + int newWidth, newHeight; - // assume symetric for now - if ( width < 2 || height < 2 || depth < 2 ) { - common->FatalError( "R_MipMap3D called with size %i,%i,%i", width, height, depth ); + if ( width < 1 || height < 1 || ( width + height == 2 ) ) { + return NULL; } - border[0] = in[0]; - border[1] = in[1]; - border[2] = in[2]; - border[3] = in[3]; - row = width * 4; - plane = row * height; newWidth = width >> 1; newHeight = height >> 1; - newDepth = depth >> 1; - - out = (byte *)R_StaticAlloc( newWidth * newHeight * newDepth * 4 ); + if ( !newWidth ) { + newWidth = 1; + } + if ( !newHeight ) { + newHeight = 1; + } + out = (byte *)R_StaticAlloc( newWidth * newHeight * 4 ); out_p = out; in_p = in; width >>= 1; height >>= 1; - depth >>= 1; - - for (k=0 ; k>3; - out_p[1] = (in_p[1] + in_p[5] + in_p[row+1] + in_p[row+5] + - in_p[plane+1] + in_p[plane+5] + in_p[plane+row+1] + in_p[plane+row+5] - )>>3; - out_p[2] = (in_p[2] + in_p[6] + in_p[row+2] + in_p[row+6] + - in_p[plane+2] + in_p[plane+6] + in_p[plane+row+2] + in_p[plane+row+6] - )>>3; - out_p[3] = (in_p[3] + in_p[7] + in_p[row+3] + in_p[row+7] + - in_p[plane+3] + in_p[plane+6] + in_p[plane+row+3] + in_p[plane+row+6] - )>>3; - } + + if ( width == 0 || height == 0 ) { + width += height; // get largest + for (i=0 ; i>1; + out_p[1] = ( in_p[1] + in_p[5] )>>1; + out_p[2] = ( in_p[2] + in_p[6] )>>1; + out_p[3] = ( in_p[3] + in_p[7] )>>1; } + return out; } - // copy the old border texel back around if desired - if ( preserveBorder ) { - R_SetBorderTexels3D( out, width, height, depth, border ); + for (i=0 ; i>2; + out_p[1] = (in_p[1] + in_p[5] + in_p[row+1] + in_p[row+5])>>2; + out_p[2] = (in_p[2] + in_p[6] + in_p[row+2] + in_p[row+6])>>2; + out_p[3] = (in_p[3] + in_p[7] + in_p[row+3] + in_p[row+7])>>2; + } } return out; } - /* ================== R_BlendOverTexture diff --git a/src/renderer/Image_program.cpp b/src/renderer/Image_program.cpp index c2e32670..bc23bdad 100644 --- a/src/renderer/Image_program.cpp +++ b/src/renderer/Image_program.cpp @@ -1,25 +1,25 @@ /* =========================================================================== -Doom 3 GPL Source Code -Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. -This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?). +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). -Doom 3 Source Code is free software: you can redistribute it and/or modify +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. -Doom 3 Source Code is distributed in the hope that it will be useful, +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with Doom 3 Source Code. If not, see . +along with Doom 3 BFG Edition Source Code. If not, see . -In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below. +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. @@ -50,8 +50,9 @@ Manager */ -#include "precompiled.h" #pragma hdrstop +#include "precompiled.h" + // tr_imageprogram.c @@ -76,32 +77,32 @@ properly without knowing the texture coordinate stretching. We can assume constant and equal ST vectors for walls, but not for characters. ================= */ -static void R_HeightmapToNormalMap( byte *data, int width, int height, float scale ) { +static void R_HeightmapToNormalMap(byte* data, int width, int height, float scale) { int i, j; - byte *depth; + byte* depth; scale = scale / 256; // copy and convert to grey scale j = width * height; - depth = (byte *)R_StaticAlloc( j ); - for ( i = 0 ; i < j ; i++ ) { - depth[i] = ( data[i*4] + data[i*4+1] + data[i*4+2] ) / 3; + depth = (byte*)R_StaticAlloc(j); + for (i = 0; i < j; i++) { + depth[i] = (data[i * 4] + data[i * 4 + 1] + data[i * 4 + 2]) / 3; } idVec3 dir, dir2; - for ( i = 0 ; i < height ; i++ ) { - for ( j = 0 ; j < width ; j++ ) { + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { int d1, d2, d3, d4; int a1, a2, a3, a4; // FIXME: look at five points? // look at three points to estimate the gradient - a1 = d1 = depth[ ( i * width + j ) ]; - a2 = d2 = depth[ ( i * width + ( ( j + 1 ) & ( width - 1 ) ) ) ]; - a3 = d3 = depth[ ( ( ( i + 1 ) & ( height - 1 ) ) * width + j ) ]; - a4 = d4 = depth[ ( ( ( i + 1 ) & ( height - 1 ) ) * width + ( ( j + 1 ) & ( width - 1 ) ) ) ]; + a1 = d1 = depth[(i * width + j)]; + a2 = d2 = depth[(i * width + ((j + 1) & (width - 1)))]; + a3 = d3 = depth[(((i + 1) & (height - 1)) * width + j)]; + a4 = d4 = depth[(((i + 1) & (height - 1)) * width + ((j + 1) & (width - 1)))]; d2 -= d1; d3 -= d1; @@ -118,20 +119,20 @@ static void R_HeightmapToNormalMap( byte *data, int width, int height, float sca dir2[1] = a1 * scale; dir2[2] = 1; dir2.NormalizeFast(); - + dir += dir2; dir.NormalizeFast(); - a1 = ( i * width + j ) * 4; - data[ a1 + 0 ] = (byte)(dir[0] * 127 + 128); - data[ a1 + 1 ] = (byte)(dir[1] * 127 + 128); - data[ a1 + 2 ] = (byte)(dir[2] * 127 + 128); - data[ a1 + 3 ] = 255; + a1 = (i * width + j) * 4; + data[a1 + 0] = (byte)(dir[0] * 127 + 128); + data[a1 + 1] = (byte)(dir[1] * 127 + 128); + data[a1 + 2] = (byte)(dir[2] * 127 + 128); + data[a1 + 3] = 255; } } - R_StaticFree( depth ); + R_StaticFree(depth); } @@ -140,17 +141,18 @@ static void R_HeightmapToNormalMap( byte *data, int width, int height, float sca R_ImageScale ================= */ -static void R_ImageScale( byte *data, int width, int height, float scale[4] ) { +static void R_ImageScale(byte* data, int width, int height, float scale[4]) { int i, j; int c; c = width * height * 4; - for ( i = 0 ; i < c ; i++ ) { - j = (byte)(data[i] * scale[i&3]); - if ( j < 0 ) { + for (i = 0; i < c; i++) { + j = (byte)(data[i] * scale[i & 3]); + if (j < 0) { j = 0; - } else if ( j > 255 ) { + } + else if (j > 255) { j = 255; } data[i] = j; @@ -162,14 +164,14 @@ static void R_ImageScale( byte *data, int width, int height, float scale[4] ) { R_InvertAlpha ================= */ -static void R_InvertAlpha( byte *data, int width, int height ) { +static void R_InvertAlpha(byte* data, int width, int height) { int i; int c; - c = width * height* 4; + c = width * height * 4; - for ( i = 0 ; i < c ; i+=4 ) { - data[i+3] = 255 - data[i+3]; + for (i = 0; i < c; i += 4) { + data[i + 3] = 255 - data[i + 3]; } } @@ -178,16 +180,16 @@ static void R_InvertAlpha( byte *data, int width, int height ) { R_InvertColor ================= */ -static void R_InvertColor( byte *data, int width, int height ) { +static void R_InvertColor(byte* data, int width, int height) { int i; int c; - c = width * height* 4; + c = width * height * 4; - for ( i = 0 ; i < c ; i+=4 ) { - data[i+0] = 255 - data[i+0]; - data[i+1] = 255 - data[i+1]; - data[i+2] = 255 - data[i+2]; + for (i = 0; i < c; i += 4) { + data[i + 0] = 255 - data[i + 0]; + data[i + 1] = 255 - data[i + 1]; + data[i + 2] = 255 - data[i + 2]; } } @@ -198,43 +200,44 @@ R_AddNormalMaps =================== */ -static void R_AddNormalMaps( byte *data1, int width1, int height1, byte *data2, int width2, int height2 ) { +static void R_AddNormalMaps(byte* data1, int width1, int height1, byte* data2, int width2, int height2) { int i, j; - byte *newMap; + byte* newMap; // resample pic2 to the same size as pic1 - if ( width2 != width1 || height2 != height1 ) { - newMap = R_Dropsample( data2, width2, height2, width1, height1 ); + if (width2 != width1 || height2 != height1) { + newMap = R_Dropsample(data2, width2, height2, width1, height1); data2 = newMap; - } else { + } + else { newMap = NULL; } // add the normal change from the second and renormalize - for ( i = 0 ; i < height1 ; i++ ) { - for ( j = 0 ; j < width1 ; j++ ) { - byte *d1, *d2; + for (i = 0; i < height1; i++) { + for (j = 0; j < width1; j++) { + byte* d1, * d2; idVec3 n; float len; - d1 = data1 + ( i * width1 + j ) * 4; - d2 = data2 + ( i * width1 + j ) * 4; + d1 = data1 + (i * width1 + j) * 4; + d2 = data2 + (i * width1 + j) * 4; - n[0] = ( d1[0] - 128 ) / 127.0; - n[1] = ( d1[1] - 128 ) / 127.0; - n[2] = ( d1[2] - 128 ) / 127.0; + n[0] = (d1[0] - 128) / 127.0; + n[1] = (d1[1] - 128) / 127.0; + n[2] = (d1[2] - 128) / 127.0; // There are some normal maps that blend to 0,0,0 at the edges // this screws up compression, so we try to correct that here by instead fading it to 0,0,1 len = n.LengthFast(); - if ( len < 1.0f ) { + if (len < 1.0f) { // jmarshall - prevent negative values going into the square root. - n[2] = idMath::Sqrt(idMath::ClampFloat(0.0f, 1.0f, 1.0 - (n[0]*n[0]) - (n[1]*n[1]))); + n[2] = idMath::Sqrt(idMath::ClampFloat(0.0f, 1.0f, 1.0 - (n[0] * n[0]) - (n[1] * n[1]))); // jmarshall end } - n[0] += ( d2[0] - 128 ) / 127.0; - n[1] += ( d2[1] - 128 ) / 127.0; + n[0] += (d2[0] - 128) / 127.0; + n[1] += (d2[1] - 128) / 127.0; n.Normalize(); d1[0] = (byte)(n[0] * 127 + 128); @@ -244,8 +247,8 @@ static void R_AddNormalMaps( byte *data1, int width1, int height1, byte *data2, } } - if ( newMap ) { - R_StaticFree( newMap ); + if (newMap) { + R_StaticFree(newMap); } } @@ -254,51 +257,51 @@ static void R_AddNormalMaps( byte *data1, int width1, int height1, byte *data2, R_SmoothNormalMap ================ */ -static void R_SmoothNormalMap( byte *data, int width, int height ) { - byte *orig; +static void R_SmoothNormalMap(byte* data, int width, int height) { + byte* orig; int i, j, k, l; idVec3 normal; - byte *out; + byte* out; static float factors[3][3] = { { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 } }; - orig = (byte *)R_StaticAlloc( width * height * 4 ); - memcpy( orig, data, width * height * 4 ); + orig = (byte*)R_StaticAlloc(width * height * 4); + memcpy(orig, data, width * height * 4); - for ( i = 0 ; i < width ; i++ ) { - for ( j = 0 ; j < height ; j++ ) { + for (i = 0; i < width; i++) { + for (j = 0; j < height; j++) { normal = vec3_origin; - for ( k = -1 ; k < 2 ; k++ ) { - for ( l = -1 ; l < 2 ; l++ ) { - byte *in; + for (k = -1; k < 2; k++) { + for (l = -1; l < 2; l++) { + byte* in; - in = orig + ( ((j+l)&(height-1))*width + ((i+k)&(width-1)) ) * 4; + in = orig + (((j + l) & (height - 1)) * width + ((i + k) & (width - 1))) * 4; // ignore 000 and -1 -1 -1 - if ( in[0] == 0 && in[1] == 0 && in[2] == 0 ) { + if (in[0] == 0 && in[1] == 0 && in[2] == 0) { continue; } - if ( in[0] == 128 && in[1] == 128 && in[2] == 128 ) { + if (in[0] == 128 && in[1] == 128 && in[2] == 128) { continue; } - normal[0] += factors[k+1][l+1] * ( in[0] - 128 ); - normal[1] += factors[k+1][l+1] * ( in[1] - 128 ); - normal[2] += factors[k+1][l+1] * ( in[2] - 128 ); + normal[0] += factors[k + 1][l + 1] * (in[0] - 128); + normal[1] += factors[k + 1][l + 1] * (in[1] - 128); + normal[2] += factors[k + 1][l + 1] * (in[2] - 128); } } normal.Normalize(); - out = data + ( j * width + i ) * 4; + out = data + (j * width + i) * 4; out[0] = (byte)(128 + 127 * normal[0]); out[1] = (byte)(128 + 127 * normal[1]); out[2] = (byte)(128 + 127 * normal[2]); } } - R_StaticFree( orig ); + R_StaticFree(orig); } @@ -308,32 +311,33 @@ R_ImageAdd =================== */ -static void R_ImageAdd( byte *data1, int width1, int height1, byte *data2, int width2, int height2 ) { +static void R_ImageAdd(byte* data1, int width1, int height1, byte* data2, int width2, int height2) { int i, j; int c; - byte *newMap; + byte* newMap; // resample pic2 to the same size as pic1 - if ( width2 != width1 || height2 != height1 ) { - newMap = R_Dropsample( data2, width2, height2, width1, height1 ); + if (width2 != width1 || height2 != height1) { + newMap = R_Dropsample(data2, width2, height2, width1, height1); data2 = newMap; - } else { + } + else { newMap = NULL; } c = width1 * height1 * 4; - for ( i = 0 ; i < c ; i++ ) { + for (i = 0; i < c; i++) { j = data1[i] + data2[i]; - if ( j > 255 ) { + if (j > 255) { j = 255; } data1[i] = j; } - if ( newMap ) { - R_StaticFree( newMap ); + if (newMap) { + R_StaticFree(newMap); } } @@ -346,12 +350,12 @@ static char parseBuffer[MAX_IMAGE_NAME]; AppendToken =================== */ -static void AppendToken( idToken &token ) { +static void AppendToken(idToken& token) { // add a leading space if not at the beginning - if ( parseBuffer[0] ) { - idStr::Append( parseBuffer, MAX_IMAGE_NAME, " " ); + if (parseBuffer[0]) { + idStr::Append(parseBuffer, MAX_IMAGE_NAME, " "); } - idStr::Append( parseBuffer, MAX_IMAGE_NAME, token.c_str() ); + idStr::Append(parseBuffer, MAX_IMAGE_NAME, token.c_str()); } /* @@ -359,12 +363,12 @@ static void AppendToken( idToken &token ) { MatchAndAppendToken =================== */ -static void MatchAndAppendToken( idLexer &src, const char *match ) { - if ( !src.ExpectTokenString( match ) ) { +static void MatchAndAppendToken(idLexer& src, const char* match) { + if (!src.ExpectTokenString(match)) { return; } // a matched token won't need a leading space - idStr::Append( parseBuffer, MAX_IMAGE_NAME, match ); + idStr::Append(parseBuffer, MAX_IMAGE_NAME, match); } /* @@ -376,199 +380,200 @@ If both pic and timestamps are NULL, it will just advance past it, which can be used to parse an image program from a text stream. =================== */ -static bool R_ParseImageProgram_r( idLexer &src, byte **pic, int *width, int *height, - ID_TIME_T *timestamps, textureDepth_t *depth ) { +static bool R_ParseImageProgram_r(idLexer& src, byte** pic, int* width, int* height, + ID_TIME_T* timestamps, textureUsage_t* usage) { idToken token; float scale; ID_TIME_T timestamp; - src.ReadToken( &token ); - AppendToken( token ); + src.ReadToken(&token); - if ( !token.Icmp( "heightmap" ) ) { - MatchAndAppendToken( src, "(" ); + AppendToken(token); - if ( !R_ParseImageProgram_r( src, pic, width, height, timestamps, depth ) ) { + if (!token.Icmp("heightmap")) { + MatchAndAppendToken(src, "("); + + if (!R_ParseImageProgram_r(src, pic, width, height, timestamps, usage)) { return false; } - MatchAndAppendToken( src, "," ); + MatchAndAppendToken(src, ","); - src.ReadToken( &token ); - AppendToken( token ); + src.ReadToken(&token); + AppendToken(token); scale = token.GetFloatValue(); - + // process it - if ( pic ) { - R_HeightmapToNormalMap( *pic, *width, *height, scale ); - if ( depth ) { - *depth = TD_BUMP; + if (pic) { + R_HeightmapToNormalMap(*pic, *width, *height, scale); + if (usage) { + *usage = TD_BUMP; } } - MatchAndAppendToken( src, ")" ); + MatchAndAppendToken(src, ")"); return true; } - if ( !token.Icmp( "addnormals" ) ) { - byte *pic2; + if (!token.Icmp("addnormals")) { + byte* pic2 = NULL; int width2, height2; - MatchAndAppendToken( src, "(" ); + MatchAndAppendToken(src, "("); - if ( !R_ParseImageProgram_r( src, pic, width, height, timestamps, depth ) ) { + if (!R_ParseImageProgram_r(src, pic, width, height, timestamps, usage)) { return false; } - MatchAndAppendToken( src, "," ); + MatchAndAppendToken(src, ","); - if ( !R_ParseImageProgram_r( src, pic ? &pic2 : NULL, &width2, &height2, timestamps, depth ) ) { - if ( pic ) { - R_StaticFree( *pic ); + if (!R_ParseImageProgram_r(src, pic ? &pic2 : NULL, &width2, &height2, timestamps, usage)) { + if (pic) { + R_StaticFree(*pic); *pic = NULL; } return false; } - + // process it - if ( pic ) { - R_AddNormalMaps( *pic, *width, *height, pic2, width2, height2 ); - R_StaticFree( pic2 ); - if ( depth ) { - *depth = TD_BUMP; + if (pic) { + R_AddNormalMaps(*pic, *width, *height, pic2, width2, height2); + R_StaticFree(pic2); + if (usage) { + *usage = TD_BUMP; } } - MatchAndAppendToken( src, ")" ); + MatchAndAppendToken(src, ")"); return true; } - if ( !token.Icmp( "smoothnormals" ) ) { - MatchAndAppendToken( src, "(" ); + if (!token.Icmp("smoothnormals")) { + MatchAndAppendToken(src, "("); - if ( !R_ParseImageProgram_r( src, pic, width, height, timestamps, depth ) ) { + if (!R_ParseImageProgram_r(src, pic, width, height, timestamps, usage)) { return false; } - if ( pic ) { - R_SmoothNormalMap( *pic, *width, *height ); - if ( depth ) { - *depth = TD_BUMP; + if (pic) { + R_SmoothNormalMap(*pic, *width, *height); + if (usage) { + *usage = TD_BUMP; } } - MatchAndAppendToken( src, ")" ); + MatchAndAppendToken(src, ")"); return true; } - if ( !token.Icmp( "add" ) ) { - byte *pic2; + if (!token.Icmp("add")) { + byte* pic2 = NULL; int width2, height2; - MatchAndAppendToken( src, "(" ); + MatchAndAppendToken(src, "("); - if ( !R_ParseImageProgram_r( src, pic, width, height, timestamps, depth ) ) { + if (!R_ParseImageProgram_r(src, pic, width, height, timestamps, usage)) { return false; } - MatchAndAppendToken( src, "," ); + MatchAndAppendToken(src, ","); - if ( !R_ParseImageProgram_r( src, pic ? &pic2 : NULL, &width2, &height2, timestamps, depth ) ) { - if ( pic ) { - R_StaticFree( *pic ); + if (!R_ParseImageProgram_r(src, pic ? &pic2 : NULL, &width2, &height2, timestamps, usage)) { + if (pic) { + R_StaticFree(*pic); *pic = NULL; } return false; } - + // process it - if ( pic ) { - R_ImageAdd( *pic, *width, *height, pic2, width2, height2 ); - R_StaticFree( pic2 ); + if (pic) { + R_ImageAdd(*pic, *width, *height, pic2, width2, height2); + R_StaticFree(pic2); } - MatchAndAppendToken( src, ")" ); + MatchAndAppendToken(src, ")"); return true; } - if ( !token.Icmp( "scale" ) ) { + if (!token.Icmp("scale")) { float scale[4]; int i; - MatchAndAppendToken( src, "(" ); + MatchAndAppendToken(src, "("); - R_ParseImageProgram_r( src, pic, width, height, timestamps, depth ); + R_ParseImageProgram_r(src, pic, width, height, timestamps, usage); - for ( i = 0 ; i < 4 ; i++ ) { - MatchAndAppendToken( src, "," ); - src.ReadToken( &token ); - AppendToken( token ); + for (i = 0; i < 4; i++) { + MatchAndAppendToken(src, ","); + src.ReadToken(&token); + AppendToken(token); scale[i] = token.GetFloatValue(); } // process it - if ( pic ) { - R_ImageScale( *pic, *width, *height, scale ); + if (pic) { + R_ImageScale(*pic, *width, *height, scale); } - MatchAndAppendToken( src, ")" ); + MatchAndAppendToken(src, ")"); return true; } - if ( !token.Icmp( "invertAlpha" ) ) { - MatchAndAppendToken( src, "(" ); + if (!token.Icmp("invertAlpha")) { + MatchAndAppendToken(src, "("); - R_ParseImageProgram_r( src, pic, width, height, timestamps, depth ); + R_ParseImageProgram_r(src, pic, width, height, timestamps, usage); // process it - if ( pic ) { - R_InvertAlpha( *pic, *width, *height ); + if (pic) { + R_InvertAlpha(*pic, *width, *height); } - MatchAndAppendToken( src, ")" ); + MatchAndAppendToken(src, ")"); return true; } - if ( !token.Icmp( "invertColor" ) ) { - MatchAndAppendToken( src, "(" ); + if (!token.Icmp("invertColor")) { + MatchAndAppendToken(src, "("); - R_ParseImageProgram_r( src, pic, width, height, timestamps, depth ); + R_ParseImageProgram_r(src, pic, width, height, timestamps, usage); // process it - if ( pic ) { - R_InvertColor( *pic, *width, *height ); + if (pic) { + R_InvertColor(*pic, *width, *height); } - MatchAndAppendToken( src, ")" ); + MatchAndAppendToken(src, ")"); return true; } - if ( !token.Icmp( "makeIntensity" ) ) { + if (!token.Icmp("makeIntensity")) { int i; - MatchAndAppendToken( src, "(" ); + MatchAndAppendToken(src, "("); - R_ParseImageProgram_r( src, pic, width, height, timestamps, depth ); + R_ParseImageProgram_r(src, pic, width, height, timestamps, usage); // copy red to green, blue, and alpha - if ( pic ) { + if (pic) { int c; c = *width * *height * 4; - for ( i = 0 ; i < c ; i+=4 ) { - (*pic)[i+1] = - (*pic)[i+2] = - (*pic)[i+3] = (*pic)[i]; + for (i = 0; i < c; i += 4) { + (*pic)[i + 1] = + (*pic)[i + 2] = + (*pic)[i + 3] = (*pic)[i]; } } - MatchAndAppendToken( src, ")" ); + MatchAndAppendToken(src, ")"); return true; } -// jmarshall - quake 4 support + // jmarshall - quake 4 support if (!token.Icmp("downsize")) { MatchAndAppendToken(src, "("); - R_ParseImageProgram_r(src, pic, width, height, timestamps, depth); + R_ParseImageProgram_r(src, pic, width, height, timestamps, usage); MatchAndAppendToken(src, ","); src.ReadToken(&token); @@ -577,47 +582,47 @@ static bool R_ParseImageProgram_r( idLexer &src, byte **pic, int *width, int *he MatchAndAppendToken(src, ")"); return true; } -// jmarshall end + // jmarshall end - if ( !token.Icmp( "makeAlpha" ) ) { + if (!token.Icmp("makeAlpha")) { int i; - MatchAndAppendToken( src, "(" ); + MatchAndAppendToken(src, "("); - R_ParseImageProgram_r( src, pic, width, height, timestamps, depth ); + R_ParseImageProgram_r(src, pic, width, height, timestamps, usage); // average RGB into alpha, then set RGB to white - if ( pic ) { + if (pic) { int c; c = *width * *height * 4; - for ( i = 0 ; i < c ; i+=4 ) { - (*pic)[i+3] = ( (*pic)[i+0] + (*pic)[i+1] + (*pic)[i+2] ) / 3; - (*pic)[i+0] = - (*pic)[i+1] = - (*pic)[i+2] = 255; + for (i = 0; i < c; i += 4) { + (*pic)[i + 3] = ((*pic)[i + 0] + (*pic)[i + 1] + (*pic)[i + 2]) / 3; + (*pic)[i + 0] = + (*pic)[i + 1] = + (*pic)[i + 2] = 255; } } - MatchAndAppendToken( src, ")" ); + MatchAndAppendToken(src, ")"); return true; } // if we are just parsing instead of loading or checking, // don't do the R_LoadImage - if ( !timestamps && !pic ) { + if (!timestamps && !pic) { return true; } // load it as an image - R_LoadImage( token.c_str(), pic, width, height, ×tamp, true ); + R_LoadImage(token.c_str(), pic, width, height, ×tamp, true); - if ( timestamp == -1 ) { + if (timestamp == -1) { return false; } // add this to the timestamp - if ( timestamps ) { - if ( timestamp > *timestamps ) { + if (timestamps) { + if (timestamp > *timestamps) { *timestamps = timestamp; } } @@ -631,18 +636,18 @@ static bool R_ParseImageProgram_r( idLexer &src, byte **pic, int *width, int *he R_LoadImageProgram =================== */ -void R_LoadImageProgram( const char *name, byte **pic, int *width, int *height, ID_TIME_T *timestamps, textureDepth_t *depth ) { +void R_LoadImageProgram(const char* name, byte** pic, int* width, int* height, ID_TIME_T* timestamps, textureUsage_t* usage) { idLexer src; - src.LoadMemory( name, strlen(name), name ); - src.SetFlags( LEXFL_NOFATALERRORS | LEXFL_NOSTRINGCONCAT | LEXFL_NOSTRINGESCAPECHARS | LEXFL_ALLOWPATHNAMES ); + src.LoadMemory(name, strlen(name), name); + src.SetFlags(LEXFL_NOFATALERRORS | LEXFL_NOSTRINGCONCAT | LEXFL_NOSTRINGESCAPECHARS | LEXFL_ALLOWPATHNAMES); parseBuffer[0] = 0; - if ( timestamps ) { + if (timestamps) { *timestamps = 0; } - R_ParseImageProgram_r( src, pic, width, height, timestamps, depth ); + R_ParseImageProgram_r(src, pic, width, height, timestamps, usage); src.FreeSource(); } @@ -652,9 +657,9 @@ void R_LoadImageProgram( const char *name, byte **pic, int *width, int *height, R_ParsePastImageProgram =================== */ -const char *R_ParsePastImageProgram( idLexer &src ) { +const char* R_ParsePastImageProgram(idLexer& src) { parseBuffer[0] = 0; - R_ParseImageProgram_r( src, NULL, NULL, NULL, NULL, NULL ); + R_ParseImageProgram_r(src, NULL, NULL, NULL, NULL, NULL); return parseBuffer; } diff --git a/src/renderer/Material.cpp b/src/renderer/Material.cpp index 186fe654..596d505f 100644 --- a/src/renderer/Material.cpp +++ b/src/renderer/Material.cpp @@ -214,7 +214,7 @@ idImage *idMaterial::GetEditorImage( void ) const { } } else { // look for an explicit one - editorImage = globalImages->ImageFromFile( editorImageName, TF_DEFAULT, true, TR_REPEAT, TD_DEFAULT ); + editorImage = globalImages->ImageFromFile( editorImageName, TF_DEFAULT, TR_REPEAT, TD_DEFAULT ); } if ( !editorImage ) { @@ -928,7 +928,7 @@ void idMaterial::ParseFragmentMap( idLexer &src, newShaderStage_t *newStage ) { const char *str; textureFilter_t tf; textureRepeat_t trp; - textureDepth_t td; + textureUsage_t td; cubeFiles_t cubeMap; bool allowPicmip; idToken token; @@ -992,14 +992,14 @@ void idMaterial::ParseFragmentMap( idLexer &src, newShaderStage_t *newStage ) { continue; } if ( !token.Icmp( "forceHighQuality" ) ) { - td = TD_HIGH_QUALITY; + //td = TD_HIGH_QUALITY; continue; } if ( !token.Icmp( "uncompressed" ) || !token.Icmp( "highquality" ) ) { - if ( !globalImages->image_ignoreHighQuality.GetInteger() ) { - td = TD_HIGH_QUALITY; - } + //if ( !globalImages->image_ignoreHighQuality.GetInteger() ) { + // td = TD_HIGH_QUALITY; + //} continue; } if ( !token.Icmp( "nopicmip" ) ) { @@ -1014,7 +1014,7 @@ void idMaterial::ParseFragmentMap( idLexer &src, newShaderStage_t *newStage ) { str = R_ParsePastImageProgram( src ); newStage->fragmentProgramImages[unit] = - globalImages->ImageFromFile( str, tf, allowPicmip, trp, td, cubeMap ); + globalImages->ImageFromFile( str, tf, trp, td, cubeMap ); if ( !newStage->fragmentProgramImages[unit] ) { newStage->fragmentProgramImages[unit] = globalImages->defaultImage; } @@ -1086,7 +1086,7 @@ void idMaterial::ParseStage( idLexer &src, const textureRepeat_t trpDefault ) { textureStage_t *ts; textureFilter_t tf; textureRepeat_t trp; - textureDepth_t td; + textureUsage_t td; cubeFiles_t cubeMap; bool allowPicmip; char imageName[MAX_IMAGE_NAME]; @@ -1260,13 +1260,13 @@ void idMaterial::ParseStage( idLexer &src, const textureRepeat_t trpDefault ) { continue; } if ( !token.Icmp( "uncompressed" ) || !token.Icmp( "highquality" ) ) { - if ( !globalImages->image_ignoreHighQuality.GetInteger() ) { - td = TD_HIGH_QUALITY; - } + //if ( !globalImages->image_ignoreHighQuality.GetInteger() ) { + // td = TD_HIGH_QUALITY; + //} continue; } if ( !token.Icmp( "forceHighQuality" ) ) { - td = TD_HIGH_QUALITY; + //td = TD_HIGH_QUALITY; continue; } if ( !token.Icmp( "nopicmip" ) ) { @@ -1517,14 +1517,14 @@ void idMaterial::ParseStage( idLexer &src, const textureRepeat_t trpDefault ) { } if ( !token.Icmp( "megaTexture" ) ) { if ( src.ReadTokenOnLine( &token ) ) { - newStage.megaTexture = new idMegaTexture; - if ( !newStage.megaTexture->InitFromMegaFile( token.c_str() ) ) { - delete newStage.megaTexture; - SetMaterialFlag( MF_DEFAULTED ); - continue; - } - newStage.vertexProgram = R_FindARBProgram( GL_VERTEX_PROGRAM_ARB, "megaTexture.vfp" ); - newStage.fragmentProgram = R_FindARBProgram( GL_FRAGMENT_PROGRAM_ARB, "megaTexture.vfp" ); + //newStage.megaTexture = new idMegaTexture; + //if ( !newStage.megaTexture->InitFromMegaFile( token.c_str() ) ) { + // delete newStage.megaTexture; + // SetMaterialFlag( MF_DEFAULTED ); + // continue; + //} + //newStage.vertexProgram = R_FindARBProgram( GL_VERTEX_PROGRAM_ARB, "megaTexture.vfp" ); + //newStage.fragmentProgram = R_FindARBProgram( GL_FRAGMENT_PROGRAM_ARB, "megaTexture.vfp" ); continue; } } @@ -1576,7 +1576,7 @@ void idMaterial::ParseStage( idLexer &src, const textureRepeat_t trpDefault ) { // now load the image with all the parms we parsed if ( imageName[0] ) { - ts->image = globalImages->ImageFromFile( imageName, tf, allowPicmip, trp, td, cubeMap ); + ts->image = globalImages->ImageFromFile( imageName, tf, trp, td, cubeMap ); if ( !ts->image ) { ts->image = globalImages->defaultImage; } @@ -1982,7 +1982,7 @@ void idMaterial::ParseMaterial( idLexer &src ) { idStr copy; copy = str; // so other things don't step on it - lightFalloffImage = globalImages->ImageFromFile( copy, TF_DEFAULT, false, TR_CLAMP /* TR_CLAMP_TO_ZERO */, TD_DEFAULT ); + lightFalloffImage = globalImages->ImageFromFile( copy, TF_DEFAULT, TR_CLAMP /* TR_CLAMP_TO_ZERO */, TD_DEFAULT ); continue; } // guisurf | guisurf entity @@ -2549,7 +2549,7 @@ idMaterial::GetImageWidth */ int idMaterial::GetImageWidth( void ) const { assert( GetStage(0) && GetStage(0)->texture.image ); - return GetStage(0)->texture.image->uploadWidth; + return GetStage(0)->texture.image->GetOpts().width; } /* @@ -2559,7 +2559,7 @@ idMaterial::GetImageHeight */ int idMaterial::GetImageHeight( void ) const { assert( GetStage(0) && GetStage(0)->texture.image ); - return GetStage(0)->texture.image->uploadHeight; + return GetStage(0)->texture.image->GetOpts().height; } /* @@ -2663,7 +2663,7 @@ const char *idMaterial::ImageName( void ) const { } idImage *image = stages[0].texture.image; if ( image ) { - return image->imgName; + return image->GetName(); } return "_scratch"; } @@ -2679,7 +2679,7 @@ void idMaterial::SetImageClassifications( int tag ) const { for ( int i = 0 ; i < numStages ; i++ ) { idImage *image = stages[i].texture.image; if ( image ) { - image->SetClassification( tag ); + //image->SetClassification( tag ); } } } @@ -2760,11 +2760,11 @@ void idMaterial::ReloadImages( bool force ) const if ( stages[i].newStage ) { for ( int j = 0 ; j < stages[i].newStage->numFragmentProgramImages ; j++ ) { if ( stages[i].newStage->fragmentProgramImages[j] ) { - stages[i].newStage->fragmentProgramImages[j]->Reload( false, force ); + stages[i].newStage->fragmentProgramImages[j]->Reload( force ); } } } else if ( stages[i].texture.image ) { - stages[i].texture.image->Reload( false, force ); + stages[i].texture.image->Reload( force ); } } } diff --git a/src/renderer/Material.h b/src/renderer/Material.h index 6f81eae9..8b40fdc8 100644 --- a/src/renderer/Material.h +++ b/src/renderer/Material.h @@ -40,7 +40,6 @@ If you have questions concerning this license or the applicable additional terms class idImage; class idCinematic; class idUserInterface; -class idMegaTexture; // moved from image.h for default parm typedef enum { @@ -196,8 +195,6 @@ typedef struct { int fragmentProgram; int numFragmentProgramImages; idImage* fragmentProgramImages[MAX_FRAGMENT_IMAGES]; - - idMegaTexture* megaTexture; // handles all the binding and parameter setting } newShaderStage_t; typedef struct { diff --git a/src/renderer/MegaTexture.cpp b/src/renderer/MegaTexture.cpp deleted file mode 100644 index 6a399fe5..00000000 --- a/src/renderer/MegaTexture.cpp +++ /dev/null @@ -1,913 +0,0 @@ -/* -=========================================================================== - -Doom 3 GPL Source Code -Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. - -This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?). - -Doom 3 Source Code is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Doom 3 Source Code is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Doom 3 Source Code. If not, see . - -In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below. - -If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. - -=========================================================================== -*/ -#include "precompiled.h" -#pragma hdrstop - -#include "tr_local.h" - -idCVar idMegaTexture::r_megaTextureLevel( "r_megaTextureLevel", "0", CVAR_RENDERER | CVAR_INTEGER, "draw only a specific level" ); -idCVar idMegaTexture::r_showMegaTexture( "r_showMegaTexture", "0", CVAR_RENDERER | CVAR_BOOL, "display all the level images" ); -idCVar idMegaTexture::r_showMegaTextureLabels( "r_showMegaTextureLabels", "0", CVAR_RENDERER | CVAR_BOOL, "draw colored blocks in each tile" ); -idCVar idMegaTexture::r_skipMegaTexture( "r_skipMegaTexture", "0", CVAR_RENDERER | CVAR_INTEGER, "only use the lowest level image" ); -idCVar idMegaTexture::r_terrainScale( "r_terrainScale", "3", CVAR_RENDERER | CVAR_INTEGER, "vertically scale USGS data" ); - -/* - -allow sparse population of the upper detail tiles - -*/ - -int RoundDownToPowerOfTwo( int num ) { - int pot; - for (pot = 1 ; (pot*2) <= num ; pot<<=1) { - } - return pot; -} - -static union { - int intVal; - byte color[4]; -} fillColor; - -static byte colors[8][4] = { - { 0, 0, 0, 255 }, - { 255, 0, 0, 255 }, - { 0, 255, 0, 255 }, - { 255, 255, 0, 255 }, - { 0, 0, 255, 255 }, - { 255, 0, 255, 255 }, - { 0, 255, 255, 255 }, - { 255, 255, 255, 255 } -}; - -static void R_EmptyLevelImage( idImage *image ) { - int c = MAX_LEVEL_WIDTH * MAX_LEVEL_WIDTH; - byte *data = (byte *)_alloca( c*4 ); - - for ( int i = 0 ; i < c ; i++ ) { - ((int *)data)[i] = fillColor.intVal; - } - - // FIXME: this won't live past vid mode changes - image->GenerateImage( data, MAX_LEVEL_WIDTH, MAX_LEVEL_WIDTH, - TF_DEFAULT, false, TR_REPEAT, TD_HIGH_QUALITY ); -} - - -/* -==================== -InitFromMegaFile -==================== -*/ -bool idMegaTexture::InitFromMegaFile( const char *fileBase ) { - idStr name = "megaTextures/"; - name += fileBase; - name.StripFileExtension(); - name += ".mega"; - - int width, height; - - fileHandle = fileSystem->OpenFileRead( name.c_str() ); - if ( !fileHandle ) { - common->Printf( "idMegaTexture: failed to open %s\n", name.c_str() ); - return false; - } - - fileHandle->Read( &header, sizeof( header ) ); - if ( header.tileSize < 64 || header.tilesWide < 1 || header.tilesHigh < 1 ) { - common->Printf( "idMegaTexture: bad header on %s\n", name.c_str() ); - return false; - } - - currentTriMapping = NULL; - - numLevels = 0; - width = header.tilesWide; - height = header.tilesHigh; - - int tileOffset = 1; // just past the header - - memset( levels, 0, sizeof( levels ) ); - while( 1 ) { - idTextureLevel *level = &levels[numLevels]; - - level->mega = this; - level->tileOffset = tileOffset; - level->tilesWide = width; - level->tilesHigh = height; - level->parms[0] = -1; // initially mask everything - level->parms[1] = 0; - level->parms[2] = 0; - level->parms[3] = (float)width / TILE_PER_LEVEL; - level->Invalidate(); - - tileOffset += level->tilesWide * level->tilesHigh; - - char str[1024]; - sprintf( str, "MEGA_%s_%i", fileBase, numLevels ); - - // give each level a default fill color - for (int i = 0 ; i < 4 ; i++ ) { - fillColor.color[i] = colors[numLevels+1][i]; - } - - levels[numLevels].image = globalImages->ImageFromFunction( str, R_EmptyLevelImage ); - numLevels++; - - if ( width <= TILE_PER_LEVEL && height <= TILE_PER_LEVEL ) { - break; - } - width = ( width + 1 ) >> 1; - height = ( height + 1 ) >> 1; - } - - // force first bind to load everything - currentViewOrigin[0] = -99999999.0f; - currentViewOrigin[1] = -99999999.0f; - currentViewOrigin[2] = -99999999.0f; - - return true; -} - -/* -==================== -SetMappingForSurface - -analyzes xyz and st to create a mapping -This is not very robust, but works for rectangular grids -==================== -*/ -void idMegaTexture::SetMappingForSurface( const srfTriangles_t *tri ) { - if ( tri == currentTriMapping ) { - return; - } - currentTriMapping = tri; - - if ( !tri->verts ) { - return; - } - - idDrawVert origin, axis[2]; - - origin.st[0] = 1.0; - origin.st[1] = 1.0; - - axis[0].st[0] = 0; - axis[0].st[1] = 1; - - axis[1].st[0] = 1; - axis[1].st[1] = 0; - - for ( int i = 0 ; i < tri->numVerts ; i++ ) { - idDrawVert *v = &tri->verts[i]; - - if ( v->st[0] <= origin.st[0] && v->st[1] <= origin.st[1] ) { - origin = *v; - } - if ( v->st[0] >= axis[0].st[0] && v->st[1] <= axis[0].st[1] ) { - axis[0] = *v; - } - if ( v->st[0] <= axis[1].st[0] && v->st[1] >= axis[1].st[1] ) { - axis[1] = *v; - } - } - - for ( int i = 0 ; i < 2 ; i++ ) { - idVec3 dir = axis[i].xyz - origin.xyz; - float texLen = axis[i].st[i] - origin.st[i]; - float spaceLen = (axis[i].xyz - origin.xyz).Length(); - - float scale = texLen / (spaceLen*spaceLen); - dir *= scale; - - float c = origin.xyz * dir - origin.st[i]; - - localViewToTextureCenter[i][0] = dir[0]; - localViewToTextureCenter[i][1] = dir[1]; - localViewToTextureCenter[i][2] = dir[2]; - localViewToTextureCenter[i][3] = -c; - } -} - -/* -==================== -BindForViewOrigin -==================== -*/ -void idMegaTexture::BindForViewOrigin( const idVec3 viewOrigin ) { - - SetViewOrigin( viewOrigin ); - - // borderClamp image goes in texture 0 - GL_SelectTexture( 0 ); - globalImages->borderClampImage->Bind(); - - // level images in higher textures, blurriest first - for ( int i = 0 ; i < 7 ; i++ ) { - GL_SelectTexture( 1+i ); - - if ( i >= numLevels ) { - globalImages->whiteImage->Bind(); - - static float parms[4] = { -2, -2, 0, 1 }; // no contribution - qglProgramLocalParameter4fvARB( GL_VERTEX_PROGRAM_ARB, i, parms ); - } else { - idTextureLevel *level = &levels[ numLevels-1-i ]; - - if ( r_showMegaTexture.GetBool() ) { - if ( i & 1 ) { - globalImages->blackImage->Bind(); - } else { - globalImages->whiteImage->Bind(); - } - } else { - level->image->Bind(); - } - qglProgramLocalParameter4fvARB( GL_VERTEX_PROGRAM_ARB, i, level->parms ); - } - } - - float parms[4]; - parms[0] = 0; - parms[1] = 0; - parms[2] = 0; - parms[3] = 1; - qglProgramLocalParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 7, parms ); - - parms[0] = 1; - parms[1] = 1; - parms[2] = r_terrainScale.GetFloat(); - parms[3] = 1; - qglProgramLocalParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 8, parms ); -} - -/* -==================== -Unbind - -This can go away once everything uses fragment programs so the enable states don't -need tracking -==================== -*/ -void idMegaTexture::Unbind( void ) { - for ( int i = 0 ; i < numLevels ; i++ ) { - GL_SelectTexture( 1+i ); - globalImages->BindNull(); - } -} - - -/* -==================== -SetViewOrigin -==================== -*/ -void idMegaTexture::SetViewOrigin( const idVec3 viewOrigin ) { - if ( r_showMegaTextureLabels.IsModified() ) { - r_showMegaTextureLabels.ClearModified(); - currentViewOrigin[0] = viewOrigin[0] + 0.1; // force a change - for ( int i = 0 ; i < numLevels ; i++ ) { - levels[i].Invalidate(); - } - } - - if ( viewOrigin == currentViewOrigin ) { - return; - } - if ( r_skipMegaTexture.GetBool() ) { - return; - } - - currentViewOrigin = viewOrigin; - - float texCenter[2]; - - // convert the viewOrigin to a texture center, which will - // be a different conversion for each megaTexture - for ( int i = 0 ; i < 2 ; i++ ) { - texCenter[i] = - viewOrigin[0] * localViewToTextureCenter[i][0] + - viewOrigin[1] * localViewToTextureCenter[i][1] + - viewOrigin[2] * localViewToTextureCenter[i][2] + - localViewToTextureCenter[i][3]; - } - - for ( int i = 0 ; i < numLevels ; i++ ) { - levels[i].UpdateForCenter( texCenter ); - } -} - - -/* -==================== -UpdateTile - -A local tile will only be mapped to globalTile[ localTile + X * TILE_PER_LEVEL ] for some x -==================== -*/ -void idTextureLevel::UpdateTile( int localX, int localY, int globalX, int globalY ) { - idTextureTile *tile = &tileMap[localX][localY]; - - if ( tile->x == globalX && tile->y == globalY ) { - return; - } - if ( (globalX & (TILE_PER_LEVEL-1)) != localX || (globalY & (TILE_PER_LEVEL-1)) != localY ) { - common->Error( "idTextureLevel::UpdateTile: bad coordinate mod" ); - } - - tile->x = globalX; - tile->y = globalY; - - byte data[ TILE_SIZE * TILE_SIZE * 4 ]; - - if ( globalX >= tilesWide || globalX < 0 || globalY >= tilesHigh || globalY < 0 ) { - // off the map - memset( data, 0, sizeof( data ) ); - } else { - // extract the data from the full image (FIXME: background load from disk) - int tileNum = tileOffset + tile->y * tilesWide + tile->x; - - int tileSize = TILE_SIZE * TILE_SIZE * 4; - - mega->fileHandle->Seek( tileNum * tileSize, FS_SEEK_SET ); - memset( data, 128, sizeof( data ) ); - mega->fileHandle->Read( data, tileSize ); - } - - if ( idMegaTexture::r_showMegaTextureLabels.GetBool() ) { - // put a color marker in it - byte color[4] = { 255 * localX / TILE_PER_LEVEL, 255 * localY / TILE_PER_LEVEL, 0, 0 }; - for ( int x = 0 ; x < 8 ; x++ ) { - for ( int y = 0 ; y < 8 ; y++ ) { - *(int *)&data[ ( ( y + TILE_SIZE/2 - 4 ) * TILE_SIZE + x + TILE_SIZE/2 - 4 ) * 4 ] = *(int *)color; - } - } - } - - // upload all the mip-map levels - int level = 0; - int size = TILE_SIZE; - while ( 1 ) { - qglTexSubImage2D( GL_TEXTURE_2D, level, localX * size, localY * size, size, size, GL_RGBA, GL_UNSIGNED_BYTE, data ); - size >>= 1; - level++; - - if ( size == 0 ) { - break; - } - - int byteSize = size * 4; - // mip-map in place - for ( int y = 0 ; y < size ; y++ ) { - byte *in, *in2, *out; - in = data + y * size * 16; - in2 = in + size * 8; - out = data + y * size * 4; - for ( int x = 0 ; x < size ; x++ ) { - out[x*4+0] = ( in[x*8+0] + in[x*8+4+0] + in2[x*8+0] + in2[x*8+4+0] ) >> 2; - out[x*4+1] = ( in[x*8+1] + in[x*8+4+1] + in2[x*8+1] + in2[x*8+4+1] ) >> 2; - out[x*4+2] = ( in[x*8+2] + in[x*8+4+2] + in2[x*8+2] + in2[x*8+4+2] ) >> 2; - out[x*4+3] = ( in[x*8+3] + in[x*8+4+3] + in2[x*8+3] + in2[x*8+4+3] ) >> 2; - } - } - } -} - -/* -==================== -UpdateForCenter - -Center is in the 0.0 to 1.0 range -==================== -*/ -void idTextureLevel::UpdateForCenter( float center[2] ) { - int globalTileCorner[2]; - int localTileOffset[2]; - - if ( tilesWide <= TILE_PER_LEVEL && tilesHigh <= TILE_PER_LEVEL ) { - globalTileCorner[0] = 0; - globalTileCorner[1] = 0; - localTileOffset[0] = 0; - localTileOffset[1] = 0; - // orient the mask so that it doesn't mask anything at all - parms[0] = 0.25; - parms[1] = 0.25; - parms[3] = 0.25; - } else { - for ( int i = 0 ; i < 2 ; i++ ) { - float global[2]; - - // this value will be outside the 0.0 to 1.0 range unless - // we are in the corner of the megaTexture - global[i] = ( center[i] * parms[3] - 0.5 ) * TILE_PER_LEVEL; - - globalTileCorner[i] = (int)( global[i] + 0.5 ); - - localTileOffset[i] = globalTileCorner[i] & (TILE_PER_LEVEL-1); - - // scaling for the mask texture to only allow the proper window - // of tiles to show through - parms[i] = -globalTileCorner[i] / (float)TILE_PER_LEVEL; - } - } - - image->Bind(); - - for ( int x = 0 ; x < TILE_PER_LEVEL ; x++ ) { - for ( int y = 0 ; y < TILE_PER_LEVEL ; y++ ) { - int globalTile[2]; - - globalTile[0] = globalTileCorner[0] + ( ( x - localTileOffset[0] ) & (TILE_PER_LEVEL-1) ); - globalTile[1] = globalTileCorner[1] + ( ( y - localTileOffset[1] ) & (TILE_PER_LEVEL-1) ); - - UpdateTile( x, y, globalTile[0], globalTile[1] ); - } - } -} - -/* -===================== -Invalidate - -Forces all tiles to be regenerated -===================== -*/ -void idTextureLevel::Invalidate() { - for ( int x = 0 ; x < TILE_PER_LEVEL ; x++ ) { - for ( int y = 0 ; y < TILE_PER_LEVEL ; y++ ) { - tileMap[x][y].x = - tileMap[x][y].y = -99999; - } - } -} - -//=================================================================================================== - - -typedef struct _TargaHeader { - unsigned char id_length, colormap_type, image_type; - unsigned short colormap_index, colormap_length; - unsigned char colormap_size; - unsigned short x_origin, y_origin, width, height; - unsigned char pixel_size, attributes; -} TargaHeader; - - -static byte ReadByte( idFile *f ) { - byte b; - - f->Read( &b, 1 ); - return b; -} - -static short ReadShort( idFile *f ) { - byte b[2]; - - f->Read( &b, 2 ); - - return b[0] + ( b[1] << 8 ); -} - - -/* -==================== -GenerateMegaMipMaps -==================== -*/ -void idMegaTexture::GenerateMegaMipMaps( megaTextureHeader_t *header, idFile *outFile ) { - outFile->Flush(); - - // out fileSystem doesn't allow read / write access... - idFile *inFile = fileSystem->OpenFileRead( outFile->GetName() ); - - int tileOffset = 1; - int width = header->tilesWide; - int height = header->tilesHigh; - - int tileSize = header->tileSize * header->tileSize * 4; - byte *oldBlock = (byte *)_alloca( tileSize ); - byte *newBlock = (byte *)_alloca( tileSize ); - - while ( width > 1 || height > 1 ) { - int newHeight = (height+1) >> 1; - if ( newHeight < 1 ) { - newHeight = 1; - } - int newWidth = (width+1) >> 1; - if ( width < 1 ) { - width = 1; - } - common->Printf( "generating %i x %i block mip level\n", newWidth, newHeight ); - - int tileNum; - - for ( int y = 0 ; y < newHeight ; y++ ) { - common->Printf( "row %i\n", y ); - session->UpdateScreen(); - - for ( int x = 0 ; x < newWidth ; x++ ) { - // mip map four original blocks down into a single new block - for ( int yy = 0 ; yy < 2 ; yy++ ) { - for ( int xx = 0 ; xx< 2 ; xx++ ) { - int tx = x*2 + xx; - int ty = y*2 + yy; - - if ( tx > width || ty > height ) { - // off edge, zero fill - memset( newBlock, 0, sizeof( newBlock ) ); - } else { - tileNum = tileOffset + ty * width + tx; - inFile->Seek( tileNum * tileSize, FS_SEEK_SET ); - inFile->Read( oldBlock, tileSize ); - } - // mip map the new pixels - for ( int yyy = 0 ; yyy < TILE_SIZE / 2 ; yyy++ ) { - for ( int xxx = 0 ; xxx < TILE_SIZE / 2 ; xxx++ ) { - byte *in = &oldBlock[ ( yyy * 2 * TILE_SIZE + xxx * 2 ) * 4 ]; - byte *out = &newBlock[ ( ( ( TILE_SIZE/2 * yy ) + yyy ) * TILE_SIZE + ( TILE_SIZE/2 * xx ) + xxx ) * 4 ]; - out[0] = ( in[0] + in[4] + in[0+TILE_SIZE*4] + in[4+TILE_SIZE*4] ) >> 2; - out[1] = ( in[1] + in[5] + in[1+TILE_SIZE*4] + in[5+TILE_SIZE*4] ) >> 2; - out[2] = ( in[2] + in[6] + in[2+TILE_SIZE*4] + in[6+TILE_SIZE*4] ) >> 2; - out[3] = ( in[3] + in[7] + in[3+TILE_SIZE*4] + in[7+TILE_SIZE*4] ) >> 2; - } - } - - // write the block out - tileNum = tileOffset + width * height + y * newWidth + x; - outFile->Seek( tileNum * tileSize, FS_SEEK_SET ); - outFile->Write( newBlock, tileSize ); - - } - } - } - } - tileOffset += width * height; - width = newWidth; - height = newHeight; - } - - delete inFile; -} - -/* -==================== -GenerateMegaPreview - -Make a 2k x 2k preview image for a mega texture that can be used in modeling programs -==================== -*/ -void idMegaTexture::GenerateMegaPreview( const char *fileName ) { - idFile *fileHandle = fileSystem->OpenFileRead( fileName ); - if ( !fileHandle ) { - common->Printf( "idMegaTexture: failed to open %s\n", fileName ); - return; - } - - idStr outName = fileName; - outName.StripFileExtension(); - outName += "_preview.tga"; - - common->Printf( "Creating %s.\n", outName.c_str() ); - - megaTextureHeader_t header; - - fileHandle->Read( &header, sizeof( header ) ); - if ( header.tileSize < 64 || header.tilesWide < 1 || header.tilesHigh < 1 ) { - common->Printf( "idMegaTexture: bad header on %s\n", fileName ); - return; - } - - int tileSize = header.tileSize; - int width = header.tilesWide; - int height = header.tilesHigh; - int tileOffset = 1; - int tileBytes = tileSize * tileSize * 4; - // find the level that fits - while ( width * tileSize > 2048 || height * tileSize > 2048 ) { - tileOffset += width * height; - width >>= 1; - if ( width < 1 ) { - width = 1; - } - height >>= 1; - if ( height < 1 ) { - height = 1; - } - } - - byte *pic = (byte *)R_StaticAlloc( width * height * tileBytes ); - byte *oldBlock = (byte *)_alloca( tileBytes ); - for ( int y = 0 ; y < height ; y++ ) { - for ( int x = 0 ; x < width ; x++ ) { - int tileNum = tileOffset + y * width + x; - fileHandle->Seek( tileNum * tileBytes, FS_SEEK_SET ); - fileHandle->Read( oldBlock, tileBytes ); - - for ( int yy = 0 ; yy < tileSize ; yy++ ) { - memcpy( pic + ( ( y * tileSize + yy ) * width * tileSize + x * tileSize ) * 4, - oldBlock + yy * tileSize * 4, tileSize * 4 ); - } - } - } - - R_WriteTGA( outName.c_str(), pic, width * tileSize, height * tileSize, false ); - - R_StaticFree( pic ); - - delete fileHandle; -} - - -/* -==================== -MakeMegaTexture_f - -Incrementally load a giant tga file and process into the mega texture block format -==================== -*/ -void idMegaTexture::MakeMegaTexture_f( const idCmdArgs &args ) { - int columns, rows, fileSize, numBytes; - byte *pixbuf; - int row, column; - TargaHeader targa_header; - - if ( args.Argc() != 2 ) { - common->Printf( "USAGE: makeMegaTexture \n" ); - return; - } - - idStr name_s = "megaTextures/"; - name_s += args.Argv(1); - name_s.StripFileExtension(); - name_s += ".tga"; - - const char *name = name_s.c_str(); - - // - // open the file - // - common->Printf( "Opening %s.\n", name ); - fileSize = fileSystem->ReadFile( name, NULL, NULL ); - idFile *file = fileSystem->OpenFileRead( name ); - - if ( !file ) { - common->Printf( "Couldn't open %s\n", name ); - return; - } - - targa_header.id_length = ReadByte( file ); - targa_header.colormap_type = ReadByte( file ); - targa_header.image_type = ReadByte( file ); - - targa_header.colormap_index = ReadShort( file ); - targa_header.colormap_length = ReadShort( file ); - targa_header.colormap_size = ReadByte( file ); - targa_header.x_origin = ReadShort( file ); - targa_header.y_origin = ReadShort( file ); - targa_header.width = ReadShort( file ); - targa_header.height = ReadShort( file ); - targa_header.pixel_size = ReadByte( file ); - targa_header.attributes = ReadByte( file ); - - if ( targa_header.image_type != 2 && targa_header.image_type != 10 && targa_header.image_type != 3 ) { - common->Error( "LoadTGA( %s ): Only type 2 (RGB), 3 (gray), and 10 (RGB) TGA images supported\n", name ); - } - - if ( targa_header.colormap_type != 0 ) { - common->Error( "LoadTGA( %s ): colormaps not supported\n", name ); - } - - if ( ( targa_header.pixel_size != 32 && targa_header.pixel_size != 24 ) && targa_header.image_type != 3 ) { - common->Error( "LoadTGA( %s ): Only 32 or 24 bit images supported (no colormaps)\n", name ); - } - - if ( targa_header.image_type == 2 || targa_header.image_type == 3 ) { - numBytes = targa_header.width * targa_header.height * ( targa_header.pixel_size >> 3 ); - if ( numBytes > fileSize - 18 - targa_header.id_length ) { - common->Error( "LoadTGA( %s ): incomplete file\n", name ); - } - } - - columns = targa_header.width; - rows = targa_header.height; - - // skip TARGA image comment - if ( targa_header.id_length != 0 ) { - file->Seek( targa_header.id_length, FS_SEEK_CUR ); - } - - megaTextureHeader_t mtHeader; - - mtHeader.tileSize = TILE_SIZE; - mtHeader.tilesWide = RoundDownToPowerOfTwo( targa_header.width ) / TILE_SIZE; - mtHeader.tilesHigh = RoundDownToPowerOfTwo( targa_header.height ) / TILE_SIZE; - - idStr outName = name; - outName.StripFileExtension(); - outName += ".mega"; - - common->Printf( "Writing %i x %i size %i tiles to %s.\n", - mtHeader.tilesWide, mtHeader.tilesHigh, mtHeader.tileSize, outName.c_str() ); - - // open the output megatexture file - idFile *out = fileSystem->OpenFileWrite( outName.c_str() ); - - out->Write( &mtHeader, sizeof( mtHeader ) ); - out->Seek( TILE_SIZE * TILE_SIZE * 4, FS_SEEK_SET ); - - // we will process this one row of tiles at a time, since the entire thing - // won't fit in memory - byte *targa_rgba = (byte *)R_StaticAlloc( TILE_SIZE * targa_header.width * 4 ); - - int blockRowsRemaining = mtHeader.tilesHigh; - while ( blockRowsRemaining-- ) { - common->Printf( "%i blockRowsRemaining\n", blockRowsRemaining ); - session->UpdateScreen(); - - if ( targa_header.image_type == 2 || targa_header.image_type == 3 ) { - // Uncompressed RGB or gray scale image - for( row = 0 ; row < TILE_SIZE ; row++ ) { - pixbuf = targa_rgba + row*columns*4; - for( column = 0; column < columns; column++) { - unsigned char red,green,blue,alphabyte; - switch( targa_header.pixel_size ) { - case 8: - blue = ReadByte( file ); - green = blue; - red = blue; - *pixbuf++ = red; - *pixbuf++ = green; - *pixbuf++ = blue; - *pixbuf++ = 255; - break; - - case 24: - blue = ReadByte( file ); - green = ReadByte( file ); - red = ReadByte( file ); - *pixbuf++ = red; - *pixbuf++ = green; - *pixbuf++ = blue; - *pixbuf++ = 255; - break; - case 32: - blue = ReadByte( file ); - green = ReadByte( file ); - red = ReadByte( file ); - alphabyte = ReadByte( file ); - *pixbuf++ = red; - *pixbuf++ = green; - *pixbuf++ = blue; - *pixbuf++ = alphabyte; - break; - default: - common->Error( "LoadTGA( %s ): illegal pixel_size '%d'\n", name, targa_header.pixel_size ); - break; - } - } - } - } else if ( targa_header.image_type == 10 ) { // Runlength encoded RGB images - unsigned char red,green,blue,alphabyte,packetHeader,packetSize,j; - - red = 0; - green = 0; - blue = 0; - alphabyte = 0xff; - - for( row = 0 ; row < TILE_SIZE ; row++ ) { - pixbuf = targa_rgba + row*columns*4; - for( column = 0; column < columns; ) { - packetHeader= ReadByte( file ); - packetSize = 1 + (packetHeader & 0x7f); - if ( packetHeader & 0x80 ) { // run-length packet - switch( targa_header.pixel_size ) { - case 24: - blue = ReadByte( file ); - green = ReadByte( file ); - red = ReadByte( file ); - alphabyte = 255; - break; - case 32: - blue = ReadByte( file ); - green = ReadByte( file ); - red = ReadByte( file ); - alphabyte = ReadByte( file ); - break; - default: - common->Error( "LoadTGA( %s ): illegal pixel_size '%d'\n", name, targa_header.pixel_size ); - break; - } - - for( j = 0; j < packetSize; j++ ) { - *pixbuf++=red; - *pixbuf++=green; - *pixbuf++=blue; - *pixbuf++=alphabyte; - column++; - if ( column == columns ) { // run spans across rows - common->Error( "TGA had RLE across columns, probably breaks block" ); - column = 0; - if ( row > 0) { - row--; - } - else { - goto breakOut; - } - pixbuf = targa_rgba + row*columns*4; - } - } - } else { // non run-length packet - for( j = 0; j < packetSize; j++ ) { - switch( targa_header.pixel_size ) { - case 24: - blue = ReadByte( file ); - green = ReadByte( file ); - red = ReadByte( file ); - *pixbuf++ = red; - *pixbuf++ = green; - *pixbuf++ = blue; - *pixbuf++ = 255; - break; - case 32: - blue = ReadByte( file ); - green = ReadByte( file ); - red = ReadByte( file ); - alphabyte = ReadByte( file ); - *pixbuf++ = red; - *pixbuf++ = green; - *pixbuf++ = blue; - *pixbuf++ = alphabyte; - break; - default: - common->Error( "LoadTGA( %s ): illegal pixel_size '%d'\n", name, targa_header.pixel_size ); - break; - } - column++; - if ( column == columns ) { // pixel packet run spans across rows - column = 0; - if ( row > 0 ) { - row--; - } - else { - goto breakOut; - } - pixbuf = targa_rgba + row*columns*4; - } - } - } - } - breakOut: ; - } - } - - // - // write out individual blocks from the full row block buffer - // - for ( int rowBlock = 0 ; rowBlock < mtHeader.tilesWide ; rowBlock++ ) { - for ( int y = 0 ; y < TILE_SIZE ; y++ ) { - out->Write( targa_rgba + ( y * targa_header.width + rowBlock * TILE_SIZE ) * 4, TILE_SIZE * 4 ); - } - } - } - - R_StaticFree( targa_rgba ); - - GenerateMegaMipMaps( &mtHeader, out ); - - delete out; - delete file; - - GenerateMegaPreview( outName.c_str() ); -#if 0 - if ( (targa_header.attributes & (1<<5)) ) { // image flp bit - R_VerticalFlip( *pic, *width, *height ); - } -#endif -} - - diff --git a/src/renderer/MegaTexture.h b/src/renderer/MegaTexture.h deleted file mode 100644 index a3f577f4..00000000 --- a/src/renderer/MegaTexture.h +++ /dev/null @@ -1,99 +0,0 @@ -/* -=========================================================================== - -Doom 3 GPL Source Code -Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. - -This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?). - -Doom 3 Source Code is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Doom 3 Source Code is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Doom 3 Source Code. If not, see . - -In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below. - -If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. - -=========================================================================== -*/ - -class idTextureTile { -public: - int x, y; -}; - -static const int TILE_PER_LEVEL = 4; -static const int MAX_MEGA_CHANNELS = 3; // normal, diffuse, specular -static const int MAX_LEVELS = 12; -static const int MAX_LEVEL_WIDTH = 512; -static const int TILE_SIZE = MAX_LEVEL_WIDTH / TILE_PER_LEVEL; - -class idMegaTexture; - -class idTextureLevel { -public: - idMegaTexture *mega; - - int tileOffset; - int tilesWide; - int tilesHigh; - - idImage *image; - idTextureTile tileMap[TILE_PER_LEVEL][TILE_PER_LEVEL]; - - float parms[4]; - - void UpdateForCenter( float center[2] ); - void UpdateTile( int localX, int localY, int globalX, int globalY ); - void Invalidate(); -}; - -typedef struct { - int tileSize; - int tilesWide; - int tilesHigh; -} megaTextureHeader_t; - - -class idMegaTexture { -public: - bool InitFromMegaFile( const char *fileBase ); - void SetMappingForSurface( const srfTriangles_t *tri ); // analyzes xyz and st to create a mapping - void BindForViewOrigin( const idVec3 origin ); // binds images and sets program parameters - void Unbind(); // removes texture bindings - - static void MakeMegaTexture_f( const idCmdArgs &args ); -private: -friend class idTextureLevel; - void SetViewOrigin( const idVec3 origin ); - static void GenerateMegaMipMaps( megaTextureHeader_t *header, idFile *file ); - static void GenerateMegaPreview( const char *fileName ); - - idFile *fileHandle; - - const srfTriangles_t *currentTriMapping; - - idVec3 currentViewOrigin; - - float localViewToTextureCenter[2][4]; - - int numLevels; - idTextureLevel levels[MAX_LEVELS]; // 0 is the highest resolution - megaTextureHeader_t header; - - static idCVar r_megaTextureLevel; - static idCVar r_showMegaTexture; - static idCVar r_showMegaTextureLabels; - static idCVar r_skipMegaTexture; - static idCVar r_terrainScale; -}; - diff --git a/src/renderer/RenderSystem.cpp b/src/renderer/RenderSystem.cpp index a726e01c..8ce72c0d 100644 --- a/src/renderer/RenderSystem.cpp +++ b/src/renderer/RenderSystem.cpp @@ -43,34 +43,6 @@ only be called when the back end thread is idle. ===================== */ static void R_PerformanceCounters( void ) { - if ( r_showPrimitives.GetInteger() != 0 ) { - - float megaBytes = globalImages->SumOfUsedImages() / ( 1024*1024.0 ); - - if ( r_showPrimitives.GetInteger() > 1 ) { - common->Printf( "v:%i ds:%i t:%i/%i v:%i/%i st:%i sv:%i image:%5.1f MB\n", - tr.pc.c_numViews, - backEnd.pc.c_drawElements + backEnd.pc.c_shadowElements, - backEnd.pc.c_drawIndexes / 3, - ( backEnd.pc.c_drawIndexes - backEnd.pc.c_drawRefIndexes ) / 3, - backEnd.pc.c_drawVertexes, - ( backEnd.pc.c_drawVertexes - backEnd.pc.c_drawRefVertexes ), - backEnd.pc.c_shadowIndexes / 3, - backEnd.pc.c_shadowVertexes, - megaBytes - ); - } else { - common->Printf( "views:%i draws:%i tris:%i (shdw:%i) (vbo:%i) image:%5.1f MB\n", - tr.pc.c_numViews, - backEnd.pc.c_drawElements + backEnd.pc.c_shadowElements, - ( backEnd.pc.c_drawIndexes + backEnd.pc.c_shadowIndexes ) / 3, - backEnd.pc.c_shadowIndexes / 3, - backEnd.pc.c_vboIndexes / 3, - megaBytes - ); - } - } - if ( r_showDynamic.GetBool() ) { common->Printf( "callback:%i md5:%i dfrmVerts:%i dfrmTris:%i tangTris:%i guis:%i\n", tr.pc.c_entityDefCallbacks, @@ -272,7 +244,7 @@ See if some cvars that we watch have changed ============= */ static void R_CheckCvars( void ) { - globalImages->CheckCvars(); + //globalImages->CheckCvars(); // gamma stuff if ( r_gamma.IsModified() || r_brightness.IsModified() ) { @@ -540,63 +512,13 @@ void idRenderSystemLocal::SetBackEndRenderer() { bool oldVPstate = backEndRendererHasVertexPrograms; - backEndRenderer = BE_BAD; - - if ( idStr::Icmp( r_renderer.GetString(), "arb" ) == 0 ) { - backEndRenderer = BE_ARB; - } else if ( idStr::Icmp( r_renderer.GetString(), "arb2" ) == 0 ) { - if ( glConfig.allowARB2Path ) { - backEndRenderer = BE_ARB2; - } - } else if ( idStr::Icmp( r_renderer.GetString(), "nv10" ) == 0 ) { - if ( glConfig.allowNV10Path ) { - backEndRenderer = BE_NV10; - } - } else if ( idStr::Icmp( r_renderer.GetString(), "nv20" ) == 0 ) { - if ( glConfig.allowNV20Path ) { - backEndRenderer = BE_NV20; - } - } else if ( idStr::Icmp( r_renderer.GetString(), "r200" ) == 0 ) { - if ( glConfig.allowR200Path ) { - backEndRenderer = BE_R200; - } - } - - // fallback - if ( backEndRenderer == BE_BAD ) { - // choose the best - if ( glConfig.allowARB2Path ) { - backEndRenderer = BE_ARB2; - } else if ( glConfig.allowR200Path ) { - backEndRenderer = BE_R200; - } else if ( glConfig.allowNV20Path ) { - backEndRenderer = BE_NV20; - } else if ( glConfig.allowNV10Path ) { - backEndRenderer = BE_NV10; - } else { - // the others are considered experimental - backEndRenderer = BE_ARB; - } - } + // choose the best + backEndRenderer = BE_ARB2; backEndRendererHasVertexPrograms = false; backEndRendererMaxLight = 1.0; switch( backEndRenderer ) { - case BE_ARB: - common->Printf( "using ARB renderSystem\n" ); - break; - case BE_NV10: - common->Printf( "using NV10 renderSystem\n" ); - break; - case BE_NV20: - common->Printf( "using NV20 renderSystem\n" ); - backEndRendererHasVertexPrograms = true; - break; - case BE_R200: - common->Printf( "using R200 renderSystem\n" ); - backEndRendererHasVertexPrograms = true; - break; case BE_ARB2: common->Printf( "using ARB2 renderSystem\n" ); backEndRendererHasVertexPrograms = true; @@ -609,12 +531,12 @@ void idRenderSystemLocal::SetBackEndRenderer() { // clear the vertex cache if we are changing between // using vertex programs and not, because specular and // shadows will be different data - if ( oldVPstate != backEndRendererHasVertexPrograms ) { - vertexCache.PurgeAll(); - if ( primaryWorld ) { - primaryWorld->FreeInteractions(); - } - } + //if ( oldVPstate != backEndRendererHasVertexPrograms ) { + // vertexCache.PurgeAll(); + // if ( primaryWorld ) { + // primaryWorld->FreeInteractions(); + // } + //} r_renderer.ClearModified(); } @@ -928,7 +850,7 @@ void idRenderSystemLocal::CaptureRenderToImage( const char *imageName ) { // look up the image before we create the render command, because it // may need to sync to create the image - idImage *image = globalImages->ImageFromFile(imageName, TF_DEFAULT, true, TR_REPEAT, TD_DEFAULT); + idImage *image = globalImages->ImageFromFile(imageName, TF_DEFAULT, TR_REPEAT, TD_DEFAULT); renderCrop_t *rc = &renderCrops[currentRenderCrop]; @@ -960,13 +882,13 @@ void idRenderSystemLocal::CaptureRenderToFile( const char *fileName, bool fixAlp guiModel->Clear(); R_IssueRenderCommands(); - qglReadBuffer( GL_BACK ); + glReadBuffer( GL_BACK ); // include extra space for OpenGL padding to word boundaries int c = ( rc->width + 3 ) * rc->height; byte *data = (byte *)R_StaticAlloc( c * 3 ); - qglReadPixels( rc->x, rc->y, rc->width, rc->height, GL_RGB, GL_UNSIGNED_BYTE, data ); + glReadPixels( rc->x, rc->y, rc->width, rc->height, GL_RGB, GL_UNSIGNED_BYTE, data ); byte *data2 = (byte *)R_StaticAlloc( c * 4 ); @@ -1036,6 +958,6 @@ bool idRenderSystemLocal::UploadImage( const char *imageName, const byte *data, return false; } image->UploadScratch( data, width, height ); - image->SetImageFilterAndRepeat(); + //image->SetImageFilterAndRepeat(); return true; } diff --git a/src/renderer/RenderSystem_init.cpp b/src/renderer/RenderSystem_init.cpp index 568c39f6..b90452a8 100644 --- a/src/renderer/RenderSystem_init.cpp +++ b/src/renderer/RenderSystem_init.cpp @@ -221,95 +221,6 @@ idCVar r_materialOverride( "r_materialOverride", "", CVAR_RENDERER, "overrides a idCVar r_debugRenderToTexture( "r_debugRenderToTexture", "0", CVAR_RENDERER | CVAR_INTEGER, "" ); -void ( APIENTRY * qglMultiTexCoord2fARB )( GLenum texture, GLfloat s, GLfloat t ); -void ( APIENTRY * qglMultiTexCoord2fvARB )( GLenum texture, GLfloat *st ); -void ( APIENTRY * qglActiveTextureARB )( GLenum texture ); -void ( APIENTRY * qglClientActiveTextureARB )( GLenum texture ); - -void ( APIENTRY *qglCombinerParameterfvNV )( GLenum pname, const GLfloat *params ); -void ( APIENTRY *qglCombinerParameterivNV )( GLenum pname, const GLint *params ); -void ( APIENTRY *qglCombinerParameterfNV )( GLenum pname, const GLfloat param ); -void ( APIENTRY *qglCombinerParameteriNV )( GLenum pname, const GLint param ); -void ( APIENTRY *qglCombinerInputNV )( GLenum stage, GLenum portion, GLenum variable, GLenum input, - GLenum mapping, GLenum componentUsage ); -void ( APIENTRY *qglCombinerOutputNV )( GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, - GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, - GLboolean cdDotProduct, GLboolean muxSum ); -void ( APIENTRY *qglFinalCombinerInputNV )( GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage ); - - -void (APIENTRY *qglVertexArrayRangeNV)( GLsizei length, void *pointer ); -// TTimo: wgl vs glX -// http://oss.sgi.com/projects/ogl-sample/registry/NV/vertex_array_range.txt -// since APIs are the same anyway, let's be wgl/glX agnostic -void *(APIENTRY *qAllocateMemoryNV)( GLsizei size, float readFrequency, float writeFrequency, float priority); -void (APIENTRY *qFreeMemoryNV)( void *pointer ); -#ifdef GLX_VERSION_1_1 -#define Q_ALLOCATE_MEMORY_NV "glXAllocateMemoryNV" -#define Q_FREE_MEMORY_NV "glXFreeMemoryNV" -#else -#define Q_ALLOCATE_MEMORY_NV "wglAllocateMemoryNV" -#define Q_FREE_MEMORY_NV "wglFreeMemoryNV" -#endif - -void (APIENTRY *qglTexImage3D)(GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); - -void (APIENTRY * qglColorTableEXT)( int, int, int, int, int, const void * ); - - -// ATI_fragment_shader -PFNGLGENFRAGMENTSHADERSATIPROC qglGenFragmentShadersATI; -PFNGLBINDFRAGMENTSHADERATIPROC qglBindFragmentShaderATI; -PFNGLDELETEFRAGMENTSHADERATIPROC qglDeleteFragmentShaderATI; -PFNGLBEGINFRAGMENTSHADERATIPROC qglBeginFragmentShaderATI; -PFNGLENDFRAGMENTSHADERATIPROC qglEndFragmentShaderATI; -PFNGLPASSTEXCOORDATIPROC qglPassTexCoordATI; -PFNGLSAMPLEMAPATIPROC qglSampleMapATI; -PFNGLCOLORFRAGMENTOP1ATIPROC qglColorFragmentOp1ATI; -PFNGLCOLORFRAGMENTOP2ATIPROC qglColorFragmentOp2ATI; -PFNGLCOLORFRAGMENTOP3ATIPROC qglColorFragmentOp3ATI; -PFNGLALPHAFRAGMENTOP1ATIPROC qglAlphaFragmentOp1ATI; -PFNGLALPHAFRAGMENTOP2ATIPROC qglAlphaFragmentOp2ATI; -PFNGLALPHAFRAGMENTOP3ATIPROC qglAlphaFragmentOp3ATI; -PFNGLSETFRAGMENTSHADERCONSTANTATIPROC qglSetFragmentShaderConstantATI; - -// EXT_stencil_two_side -PFNGLACTIVESTENCILFACEEXTPROC qglActiveStencilFaceEXT; - -// ATI_separate_stencil -PFNGLSTENCILOPSEPARATEATIPROC qglStencilOpSeparateATI; -PFNGLSTENCILFUNCSEPARATEATIPROC qglStencilFuncSeparateATI; - -// ARB_texture_compression -PFNGLCOMPRESSEDTEXIMAGE2DARBPROC qglCompressedTexImage2DARB; -PFNGLGETCOMPRESSEDTEXIMAGEARBPROC qglGetCompressedTexImageARB; - -// ARB_vertex_buffer_object -PFNGLBINDBUFFERARBPROC qglBindBufferARB; -PFNGLDELETEBUFFERSARBPROC qglDeleteBuffersARB; -PFNGLGENBUFFERSARBPROC qglGenBuffersARB; -PFNGLISBUFFERARBPROC qglIsBufferARB; -PFNGLBUFFERDATAARBPROC qglBufferDataARB; -PFNGLBUFFERSUBDATAARBPROC qglBufferSubDataARB; -PFNGLGETBUFFERSUBDATAARBPROC qglGetBufferSubDataARB; -PFNGLMAPBUFFERARBPROC qglMapBufferARB; -PFNGLUNMAPBUFFERARBPROC qglUnmapBufferARB; -PFNGLGETBUFFERPARAMETERIVARBPROC qglGetBufferParameterivARB; -PFNGLGETBUFFERPOINTERVARBPROC qglGetBufferPointervARB; - -// ARB_vertex_program / ARB_fragment_program -PFNGLVERTEXATTRIBPOINTERARBPROC qglVertexAttribPointerARB; -PFNGLENABLEVERTEXATTRIBARRAYARBPROC qglEnableVertexAttribArrayARB; -PFNGLDISABLEVERTEXATTRIBARRAYARBPROC qglDisableVertexAttribArrayARB; -PFNGLPROGRAMSTRINGARBPROC qglProgramStringARB; -PFNGLBINDPROGRAMARBPROC qglBindProgramARB; -PFNGLGENPROGRAMSARBPROC qglGenProgramsARB; -PFNGLPROGRAMENVPARAMETER4FVARBPROC qglProgramEnvParameter4fvARB; -PFNGLPROGRAMLOCALPARAMETER4FVARBPROC qglProgramLocalParameter4fvARB; - -// GL_EXT_depth_bounds_test -PFNGLDEPTHBOUNDSEXTPROC qglDepthBoundsEXT; - /* ================= R_CheckExtension @@ -334,22 +245,24 @@ R_CheckPortableExtensions static void R_CheckPortableExtensions( void ) { glConfig.glVersion = atof( glConfig.version_string ); + common->Printf("Init Glew...\n"); + + if (glewInit() != GLEW_OK) + common->FatalError("Failed to init glew!\n"); + // GL_ARB_multitexture glConfig.multitextureAvailable = R_CheckExtension( "GL_ARB_multitexture" ); if ( glConfig.multitextureAvailable ) { - qglMultiTexCoord2fARB = (void(APIENTRY *)(GLenum, GLfloat, GLfloat))GLimp_ExtensionPointer( "glMultiTexCoord2fARB" ); - qglMultiTexCoord2fvARB = (void(APIENTRY *)(GLenum, GLfloat *))GLimp_ExtensionPointer( "glMultiTexCoord2fvARB" ); - qglActiveTextureARB = (void(APIENTRY *)(GLenum))GLimp_ExtensionPointer( "glActiveTextureARB" ); - qglClientActiveTextureARB = (void(APIENTRY *)(GLenum))GLimp_ExtensionPointer( "glClientActiveTextureARB" ); - qglGetIntegerv( GL_MAX_TEXTURE_UNITS_ARB, (GLint *)&glConfig.maxTextureUnits ); - if ( glConfig.maxTextureUnits > MAX_MULTITEXTURE_UNITS ) { - glConfig.maxTextureUnits = MAX_MULTITEXTURE_UNITS; - } + //glGetIntegerv( GL_MAX_TEXTURE_UNITS_ARB, (GLint *)&glConfig.maxTextureUnits ); + //if ( glConfig.maxTextureUnits > MAX_MULTITEXTURE_UNITS ) { + // glConfig.maxTextureUnits = MAX_MULTITEXTURE_UNITS; + //} + glConfig.maxTextureUnits = 16; // jmarshall: OpenGL LIES if ( glConfig.maxTextureUnits < 2 ) { glConfig.multitextureAvailable = false; // shouldn't ever happen } - qglGetIntegerv( GL_MAX_TEXTURE_COORDS_ARB, (GLint *)&glConfig.maxTextureCoords ); - qglGetIntegerv( GL_MAX_TEXTURE_IMAGE_UNITS_ARB, (GLint *)&glConfig.maxTextureImageUnits ); + glGetIntegerv(GL_MAX_TEXTURE_COORDS_ARB, (GLint*)&glConfig.maxTextureCoords); + glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, (GLint*)&glConfig.maxTextureImageUnits); } // GL_ARB_texture_env_combine @@ -371,8 +284,6 @@ static void R_CheckPortableExtensions( void ) { // DRI drivers may have GL_ARB_texture_compression but no GL_EXT_texture_compression_s3tc if ( R_CheckExtension( "GL_ARB_texture_compression" ) && R_CheckExtension( "GL_EXT_texture_compression_s3tc" ) ) { glConfig.textureCompressionAvailable = true; - qglCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)GLimp_ExtensionPointer( "glCompressedTexImage2DARB" ); - qglGetCompressedTexImageARB = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)GLimp_ExtensionPointer( "glGetCompressedTexImageARB" ); } else { glConfig.textureCompressionAvailable = false; } @@ -380,7 +291,7 @@ static void R_CheckPortableExtensions( void ) { // GL_EXT_texture_filter_anisotropic glConfig.anisotropicAvailable = R_CheckExtension( "GL_EXT_texture_filter_anisotropic" ); if ( glConfig.anisotropicAvailable ) { - qglGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &glConfig.maxTextureAnisotropy ); + glGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &glConfig.maxTextureAnisotropy ); common->Printf( " maxTextureAnisotropy: %f\n", glConfig.maxTextureAnisotropy ); } else { glConfig.maxTextureAnisotropy = 1; @@ -400,15 +311,15 @@ static void R_CheckPortableExtensions( void ) { // GL_EXT_shared_texture_palette glConfig.sharedTexturePaletteAvailable = R_CheckExtension( "GL_EXT_shared_texture_palette" ); if ( glConfig.sharedTexturePaletteAvailable ) { - qglColorTableEXT = ( void ( APIENTRY * ) ( int, int, int, int, int, const void * ) ) GLimp_ExtensionPointer( "glColorTableEXT" ); + // glColorTableEXT = ( void ( APIENTRY * ) ( int, int, int, int, int, const void * ) ) GLimp_ExtensionPointer( "glColorTableEXT" ); } // GL_EXT_texture3D (not currently used for anything) glConfig.texture3DAvailable = R_CheckExtension( "GL_EXT_texture3D" ); if ( glConfig.texture3DAvailable ) { - qglTexImage3D = - (void (APIENTRY *)(GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *) ) - GLimp_ExtensionPointer( "glTexImage3D" ); + // glTexImage3D = + // (void (APIENTRY *)(GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *) ) + // GLimp_ExtensionPointer( "glTexImage3D" ); } // EXT_stencil_wrap @@ -425,36 +336,18 @@ static void R_CheckPortableExtensions( void ) { // GL_NV_register_combiners glConfig.registerCombinersAvailable = R_CheckExtension( "GL_NV_register_combiners" ); - if ( glConfig.registerCombinersAvailable ) { - qglCombinerParameterfvNV = (void (APIENTRY *)( GLenum pname, const GLfloat *params )) - GLimp_ExtensionPointer( "glCombinerParameterfvNV" ); - qglCombinerParameterivNV = (void (APIENTRY *)( GLenum pname, const GLint *params )) - GLimp_ExtensionPointer( "glCombinerParameterivNV" ); - qglCombinerParameterfNV = (void (APIENTRY *)( GLenum pname, const GLfloat param )) - GLimp_ExtensionPointer( "glCombinerParameterfNV" ); - qglCombinerParameteriNV = (void (APIENTRY *)( GLenum pname, const GLint param )) - GLimp_ExtensionPointer( "glCombinerParameteriNV" ); - qglCombinerInputNV = (void (APIENTRY *)( GLenum stage, GLenum portion, GLenum variable, GLenum input, - GLenum mapping, GLenum componentUsage )) - GLimp_ExtensionPointer( "glCombinerInputNV" ); - qglCombinerOutputNV = (void (APIENTRY *)( GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, - GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, - GLboolean cdDotProduct, GLboolean muxSum )) - GLimp_ExtensionPointer( "glCombinerOutputNV" ); - qglFinalCombinerInputNV = (void (APIENTRY *)( GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage )) - GLimp_ExtensionPointer( "glFinalCombinerInputNV" ); - } + // GL_EXT_stencil_two_side glConfig.twoSidedStencilAvailable = R_CheckExtension( "GL_EXT_stencil_two_side" ); if ( glConfig.twoSidedStencilAvailable ) { - qglActiveStencilFaceEXT = (PFNGLACTIVESTENCILFACEEXTPROC)GLimp_ExtensionPointer( "glActiveStencilFaceEXT" ); + //glActiveStencilFaceEXT = (PFNGLACTIVESTENCILFACEEXTPROC)GLimp_ExtensionPointer( "glActiveStencilFaceEXT" ); } else { glConfig.atiTwoSidedStencilAvailable = R_CheckExtension( "GL_ATI_separate_stencil" ); - if ( glConfig.atiTwoSidedStencilAvailable ) { - qglStencilFuncSeparateATI = (PFNGLSTENCILFUNCSEPARATEATIPROC)GLimp_ExtensionPointer( "glStencilFuncSeparateATI" ); - qglStencilOpSeparateATI = (PFNGLSTENCILOPSEPARATEATIPROC)GLimp_ExtensionPointer( "glStencilOpSeparateATI" ); - } + //if ( glConfig.atiTwoSidedStencilAvailable ) { + // glStencilFuncSeparateATI = (PFNGLSTENCILFUNCSEPARATEATIPROC)GLimp_ExtensionPointer( "glStencilFuncSeparateATI" ); + // glStencilOpSeparateATI = (PFNGLSTENCILOPSEPARATEATIPROC)GLimp_ExtensionPointer( "glStencilOpSeparateATI" ); + //} } // GL_ATI_fragment_shader @@ -464,63 +357,34 @@ static void R_CheckPortableExtensions( void ) { glConfig.atiFragmentShaderAvailable = R_CheckExtension( "GL_ATI_text_fragment_shader" ); } if ( glConfig.atiFragmentShaderAvailable ) { - qglGenFragmentShadersATI = (PFNGLGENFRAGMENTSHADERSATIPROC)GLimp_ExtensionPointer( "glGenFragmentShadersATI" ); - qglBindFragmentShaderATI = (PFNGLBINDFRAGMENTSHADERATIPROC)GLimp_ExtensionPointer( "glBindFragmentShaderATI" ); - qglDeleteFragmentShaderATI = (PFNGLDELETEFRAGMENTSHADERATIPROC)GLimp_ExtensionPointer( "glDeleteFragmentShaderATI" ); - qglBeginFragmentShaderATI = (PFNGLBEGINFRAGMENTSHADERATIPROC)GLimp_ExtensionPointer( "glBeginFragmentShaderATI" ); - qglEndFragmentShaderATI = (PFNGLENDFRAGMENTSHADERATIPROC)GLimp_ExtensionPointer( "glEndFragmentShaderATI" ); - qglPassTexCoordATI = (PFNGLPASSTEXCOORDATIPROC)GLimp_ExtensionPointer( "glPassTexCoordATI" ); - qglSampleMapATI = (PFNGLSAMPLEMAPATIPROC)GLimp_ExtensionPointer( "glSampleMapATI" ); - qglColorFragmentOp1ATI = (PFNGLCOLORFRAGMENTOP1ATIPROC)GLimp_ExtensionPointer( "glColorFragmentOp1ATI" ); - qglColorFragmentOp2ATI = (PFNGLCOLORFRAGMENTOP2ATIPROC)GLimp_ExtensionPointer( "glColorFragmentOp2ATI" ); - qglColorFragmentOp3ATI = (PFNGLCOLORFRAGMENTOP3ATIPROC)GLimp_ExtensionPointer( "glColorFragmentOp3ATI" ); - qglAlphaFragmentOp1ATI = (PFNGLALPHAFRAGMENTOP1ATIPROC)GLimp_ExtensionPointer( "glAlphaFragmentOp1ATI" ); - qglAlphaFragmentOp2ATI = (PFNGLALPHAFRAGMENTOP2ATIPROC)GLimp_ExtensionPointer( "glAlphaFragmentOp2ATI" ); - qglAlphaFragmentOp3ATI = (PFNGLALPHAFRAGMENTOP3ATIPROC)GLimp_ExtensionPointer( "glAlphaFragmentOp3ATI" ); - qglSetFragmentShaderConstantATI = (PFNGLSETFRAGMENTSHADERCONSTANTATIPROC)GLimp_ExtensionPointer( "glSetFragmentShaderConstantATI" ); + //glGenFragmentShadersATI = (PFNGLGENFRAGMENTSHADERSATIPROC)GLimp_ExtensionPointer( "glGenFragmentShadersATI" ); + //glBindFragmentShaderATI = (PFNGLBINDFRAGMENTSHADERATIPROC)GLimp_ExtensionPointer( "glBindFragmentShaderATI" ); + //glDeleteFragmentShaderATI = (PFNGLDELETEFRAGMENTSHADERATIPROC)GLimp_ExtensionPointer( "glDeleteFragmentShaderATI" ); + //glBeginFragmentShaderATI = (PFNGLBEGINFRAGMENTSHADERATIPROC)GLimp_ExtensionPointer( "glBeginFragmentShaderATI" ); + //glEndFragmentShaderATI = (PFNGLENDFRAGMENTSHADERATIPROC)GLimp_ExtensionPointer( "glEndFragmentShaderATI" ); + //glPassTexCoordATI = (PFNGLPASSTEXCOORDATIPROC)GLimp_ExtensionPointer( "glPassTexCoordATI" ); + //glSampleMapATI = (PFNGLSAMPLEMAPATIPROC)GLimp_ExtensionPointer( "glSampleMapATI" ); + //glColorFragmentOp1ATI = (PFNGLCOLORFRAGMENTOP1ATIPROC)GLimp_ExtensionPointer( "glColorFragmentOp1ATI" ); + //glColorFragmentOp2ATI = (PFNGLCOLORFRAGMENTOP2ATIPROC)GLimp_ExtensionPointer( "glColorFragmentOp2ATI" ); + //glColorFragmentOp3ATI = (PFNGLCOLORFRAGMENTOP3ATIPROC)GLimp_ExtensionPointer( "glColorFragmentOp3ATI" ); + //glAlphaFragmentOp1ATI = (PFNGLALPHAFRAGMENTOP1ATIPROC)GLimp_ExtensionPointer( "glAlphaFragmentOp1ATI" ); + //glAlphaFragmentOp2ATI = (PFNGLALPHAFRAGMENTOP2ATIPROC)GLimp_ExtensionPointer( "glAlphaFragmentOp2ATI" ); + //glAlphaFragmentOp3ATI = (PFNGLALPHAFRAGMENTOP3ATIPROC)GLimp_ExtensionPointer( "glAlphaFragmentOp3ATI" ); + //glSetFragmentShaderConstantATI = (PFNGLSETFRAGMENTSHADERCONSTANTATIPROC)GLimp_ExtensionPointer( "glSetFragmentShaderConstantATI" ); } // ARB_vertex_buffer_object glConfig.ARBVertexBufferObjectAvailable = R_CheckExtension( "GL_ARB_vertex_buffer_object" ); - if(glConfig.ARBVertexBufferObjectAvailable) { - qglBindBufferARB = (PFNGLBINDBUFFERARBPROC)GLimp_ExtensionPointer( "glBindBufferARB"); - qglDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)GLimp_ExtensionPointer( "glDeleteBuffersARB"); - qglGenBuffersARB = (PFNGLGENBUFFERSARBPROC)GLimp_ExtensionPointer( "glGenBuffersARB"); - qglIsBufferARB = (PFNGLISBUFFERARBPROC)GLimp_ExtensionPointer( "glIsBufferARB"); - qglBufferDataARB = (PFNGLBUFFERDATAARBPROC)GLimp_ExtensionPointer( "glBufferDataARB"); - qglBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)GLimp_ExtensionPointer( "glBufferSubDataARB"); - qglGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)GLimp_ExtensionPointer( "glGetBufferSubDataARB"); - qglMapBufferARB = (PFNGLMAPBUFFERARBPROC)GLimp_ExtensionPointer( "glMapBufferARB"); - qglUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)GLimp_ExtensionPointer( "glUnmapBufferARB"); - qglGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)GLimp_ExtensionPointer( "glGetBufferParameterivARB"); - qglGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)GLimp_ExtensionPointer( "glGetBufferPointervARB"); - } // ARB_vertex_program glConfig.ARBVertexProgramAvailable = R_CheckExtension( "GL_ARB_vertex_program" ); - if (glConfig.ARBVertexProgramAvailable) { - qglVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)GLimp_ExtensionPointer( "glVertexAttribPointerARB" ); - qglEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)GLimp_ExtensionPointer( "glEnableVertexAttribArrayARB" ); - qglDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)GLimp_ExtensionPointer( "glDisableVertexAttribArrayARB" ); - qglProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC)GLimp_ExtensionPointer( "glProgramStringARB" ); - qglBindProgramARB = (PFNGLBINDPROGRAMARBPROC)GLimp_ExtensionPointer( "glBindProgramARB" ); - qglGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)GLimp_ExtensionPointer( "glGenProgramsARB" ); - qglProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC)GLimp_ExtensionPointer( "glProgramEnvParameter4fvARB" ); - qglProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)GLimp_ExtensionPointer( "glProgramLocalParameter4fvARB" ); - } // ARB_fragment_program if ( r_inhibitFragmentProgram.GetBool() ) { glConfig.ARBFragmentProgramAvailable = false; } else { glConfig.ARBFragmentProgramAvailable = R_CheckExtension( "GL_ARB_fragment_program" ); - if (glConfig.ARBFragmentProgramAvailable) { - // these are the same as ARB_vertex_program - qglProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC)GLimp_ExtensionPointer( "glProgramStringARB" ); - qglBindProgramARB = (PFNGLBINDPROGRAMARBPROC)GLimp_ExtensionPointer( "glBindProgramARB" ); - qglProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC)GLimp_ExtensionPointer( "glProgramEnvParameter4fvARB" ); - qglProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)GLimp_ExtensionPointer( "glProgramLocalParameter4fvARB" ); - } + } // check for minimum set @@ -531,9 +395,7 @@ static void R_CheckPortableExtensions( void ) { // GL_EXT_depth_bounds_test glConfig.depthBoundsTestAvailable = R_CheckExtension( "EXT_depth_bounds_test" ); - if ( glConfig.depthBoundsTestAvailable ) { - qglDepthBoundsEXT = (PFNGLDEPTHBOUNDSEXTPROC)GLimp_ExtensionPointer( "glDepthBoundsEXT" ); - } + } @@ -659,13 +521,13 @@ void R_InitOpenGL( void ) { soundSystem->InitHW(); // get our config strings - glConfig.vendor_string = (const char *)qglGetString(GL_VENDOR); - glConfig.renderer_string = (const char *)qglGetString(GL_RENDERER); - glConfig.version_string = (const char *)qglGetString(GL_VERSION); - glConfig.extensions_string = (const char *)qglGetString(GL_EXTENSIONS); + glConfig.vendor_string = (const char *)glGetString(GL_VENDOR); + glConfig.renderer_string = (const char *)glGetString(GL_RENDERER); + glConfig.version_string = (const char *)glGetString(GL_VERSION); + glConfig.extensions_string = (const char *)glGetString(GL_EXTENSIONS); // OpenGL driver constants - qglGetIntegerv( GL_MAX_TEXTURE_SIZE, &temp ); + glGetIntegerv( GL_MAX_TEXTURE_SIZE, &temp ); glConfig.maxTextureSize = temp; // stubbed or broken drivers may have reported 0... @@ -680,9 +542,6 @@ void R_InitOpenGL( void ) { // parse our vertex and fragment programs, possibly disably support for // one of the paths if there was an error - R_NV10_Init(); - R_NV20_Init(); - R_R200_Init(); R_ARB2_Init(); cmdSystem->AddCommand( "reloadARBprograms", R_ReloadARBPrograms_f, CMD_FL_RENDERER, "reloads ARB programs" ); @@ -736,7 +595,7 @@ void GL_CheckErrors( void ) { // check for up to 10 errors pending for ( i = 0 ; i < 10 ; i++ ) { - err = qglGetError(); + err = glGetError(); if ( err == GL_NO_ERROR ) { return; } @@ -844,7 +703,7 @@ void R_TestImage_f( const idCmdArgs &args ) { tr.testImage = globalImages->images[imageNum]; } } else { - tr.testImage = globalImages->ImageFromFile( args.Argv( 1 ), TF_DEFAULT, false, TR_REPEAT, TD_DEFAULT ); + tr.testImage = globalImages->ImageFromFile( args.Argv( 1 ), TF_DEFAULT, TR_REPEAT, TD_DEFAULT ); } } @@ -866,7 +725,7 @@ void R_TestVideo_f( const idCmdArgs &args ) { return; } - tr.testImage = globalImages->ImageFromFile( "_scratch", TF_DEFAULT, false, TR_REPEAT, TD_DEFAULT ); + tr.testImage = globalImages->ImageFromFile( "_scratch", TF_DEFAULT, TR_REPEAT, TD_DEFAULT ); tr.testVideo = idCinematic::Alloc(); tr.testVideo->InitFromFile( args.Argv( 1 ), true ); @@ -963,88 +822,7 @@ Checks for images with the same hash value and does a better comparison =================== */ void R_ReportImageDuplication_f( const idCmdArgs &args ) { - int i, j; - - common->Printf( "Images with duplicated contents:\n" ); - - int count = 0; - - for ( i = 0 ; i < globalImages->images.Num() ; i++ ) { - idImage *image1 = globalImages->images[i]; - - if ( image1->isPartialImage ) { - // ignore background loading stubs - continue; - } - if ( image1->generatorFunction ) { - // ignore procedural images - continue; - } - if ( image1->cubeFiles != CF_2D ) { - // ignore cube maps - continue; - } - if ( image1->defaulted ) { - continue; - } - byte *data1; - int w1, h1; - - R_LoadImageProgram( image1->imgName, &data1, &w1, &h1, NULL ); - - for ( j = 0 ; j < i ; j++ ) { - idImage *image2 = globalImages->images[j]; - - if ( image2->isPartialImage ) { - continue; - } - if ( image2->generatorFunction ) { - continue; - } - if ( image2->cubeFiles != CF_2D ) { - continue; - } - if ( image2->defaulted ) { - continue; - } - if ( image1->imageHash != image2->imageHash ) { - continue; - } - if ( image2->uploadWidth != image1->uploadWidth - || image2->uploadHeight != image1->uploadHeight ) { - continue; - } - if ( !idStr::Icmp( image1->imgName, image2->imgName ) ) { - // ignore same image-with-different-parms - continue; - } - - byte *data2; - int w2, h2; - - R_LoadImageProgram( image2->imgName, &data2, &w2, &h2, NULL ); - - if ( w2 != w1 || h2 != h1 ) { - R_StaticFree( data2 ); - continue; - } - - if ( memcmp( data1, data2, w1*h1*4 ) ) { - R_StaticFree( data2 ); - continue; - } - - R_StaticFree( data2 ); - - common->Printf( "%s == %s\n", image1->imgName.c_str(), image2->imgName.c_str() ); - session->UpdateScreen( true ); - count++; - break; - } - - R_StaticFree( data1 ); - } - common->Printf( "%i / %i collisions\n", count, globalImages->images.Num() ); + } /* @@ -1061,7 +839,7 @@ R_RenderingFPS ================ */ static float R_RenderingFPS( const renderView_t *renderView ) { - qglFinish(); + glFinish(); int start = Sys_Milliseconds(); static const int SAMPLE_MSEC = 1000; @@ -1073,7 +851,7 @@ static float R_RenderingFPS( const renderView_t *renderView ) { renderSystem->BeginFrame( glConfig.vidWidth, glConfig.vidHeight ); tr.primaryWorld->RenderScene( renderView ); renderSystem->EndFrame( NULL, NULL ); - qglFinish(); + glFinish(); count++; end = Sys_Milliseconds(); if ( end - start > SAMPLE_MSEC ) { @@ -1179,8 +957,8 @@ void R_ReadTiledPixels( int width, int height, byte *buffer, renderView_t *ref = h = height - yo; } - qglReadBuffer( GL_FRONT ); - qglReadPixels( 0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE, temp ); + glReadBuffer( GL_FRONT ); + glReadPixels( 0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE, temp ); int row = ( w * 3 + 3 ) & ~3; // OpenGL pads to dword boundaries @@ -1253,7 +1031,7 @@ void idRenderSystemLocal::TakeScreenshot( int width, int height, const char *fil r_jitter.SetBool( false ); } - // fill in the header (this is vertically flipped, which qglReadPixels emits) + // fill in the header (this is vertically flipped, which glReadPixels emits) buffer[2] = 2; // uncompressed type buffer[12] = width & 255; buffer[13] = width >> 8; @@ -1415,7 +1193,7 @@ void R_StencilShot( void ) { byte *byteBuffer = (byte *)Mem_Alloc(pix); - qglReadPixels( 0, 0, width, height, GL_STENCIL_INDEX , GL_UNSIGNED_BYTE, byteBuffer ); + glReadPixels( 0, 0, width, height, GL_STENCIL_INDEX , GL_UNSIGNED_BYTE, byteBuffer ); for ( i = 0 ; i < pix ; i++ ) { buffer[18+i*3] = @@ -1424,7 +1202,7 @@ void R_StencilShot( void ) { buffer[18+i*3+2] = byteBuffer[i]; } - // fill in the header (this is vertically flipped, which qglReadPixels emits) + // fill in the header (this is vertically flipped, which glReadPixels emits) buffer[2] = 2; // uncompressed type buffer[12] = width & 255; buffer[13] = width >> 8; @@ -1795,25 +1573,6 @@ void GfxInfo_f( const idCmdArgs &args ) { common->Printf( "CPU: %s\n", Sys_GetProcessorString() ); const char *active[2] = { "", " (ACTIVE)" }; - common->Printf( "ARB path ENABLED%s\n", active[tr.backEndRenderer == BE_ARB] ); - - if ( glConfig.allowNV10Path ) { - common->Printf( "NV10 path ENABLED%s\n", active[tr.backEndRenderer == BE_NV10] ); - } else { - common->Printf( "NV10 path disabled\n" ); - } - - if ( glConfig.allowNV20Path ) { - common->Printf( "NV20 path ENABLED%s\n", active[tr.backEndRenderer == BE_NV20] ); - } else { - common->Printf( "NV20 path disabled\n" ); - } - - if ( glConfig.allowR200Path ) { - common->Printf( "R200 path ENABLED%s\n", active[tr.backEndRenderer == BE_R200] ); - } else { - common->Printf( "R200 path disabled\n" ); - } if ( glConfig.allowARB2Path ) { common->Printf( "ARB2 path ENABLED%s\n", active[tr.backEndRenderer == BE_ARB2] ); @@ -1922,7 +1681,7 @@ void R_VidRestart_f( const idCmdArgs &args ) { cvarSystem->SetCVarBool( "r_fullscreen", latch ); // regenerate all images - globalImages->ReloadAllImages(); + globalImages->ReloadImages(true); } else { glimpParms_t parms; parms.width = glConfig.vidWidth; @@ -1944,7 +1703,7 @@ void R_VidRestart_f( const idCmdArgs &args ) { R_RegenerateWorld_f( idCmdArgs() ); // check for problems - err = qglGetError(); + err = glGetError(); if ( err != GL_NO_ERROR ) { common->Printf( "glGetError() = 0x%x\n", err ); } @@ -2039,7 +1798,6 @@ R_InitCommands ================= */ void R_InitCommands( void ) { - cmdSystem->AddCommand( "MakeMegaTexture", idMegaTexture::MakeMegaTexture_f, CMD_FL_RENDERER|CMD_FL_CHEAT, "processes giant images" ); cmdSystem->AddCommand( "sizeUp", R_SizeUp_f, CMD_FL_RENDERER, "makes the rendered view larger" ); cmdSystem->AddCommand( "sizeDown", R_SizeDown_f, CMD_FL_RENDERER, "makes the rendered view smaller" ); cmdSystem->AddCommand( "reloadGuis", R_ReloadGuis_f, CMD_FL_RENDERER, "reloads guis" ); @@ -2245,9 +2003,9 @@ void idRenderSystemLocal::InitOpenGL( void ) { R_InitOpenGL(); - globalImages->ReloadAllImages(); + globalImages->ReloadImages(true); - err = qglGetError(); + err = glGetError(); if ( err != GL_NO_ERROR ) { common->Printf( "glGetError() = 0x%x\n", err ); } @@ -2311,7 +2069,7 @@ idRenderSystemLocal::GetCardCaps ======================== */ void idRenderSystemLocal::GetCardCaps( bool &oldCard, bool &nv10or20 ) { - nv10or20 = ( tr.backEndRenderer == BE_NV10 || tr.backEndRenderer == BE_NV20 ); - oldCard = ( tr.backEndRenderer == BE_ARB || tr.backEndRenderer == BE_R200 || tr.backEndRenderer == BE_NV10 || tr.backEndRenderer == BE_NV20 ); + oldCard = false; + nv10or20 = false; } diff --git a/src/renderer/RenderWorld_portals.cpp b/src/renderer/RenderWorld_portals.cpp index 1d9da861..5494e846 100644 --- a/src/renderer/RenderWorld_portals.cpp +++ b/src/renderer/RenderWorld_portals.cpp @@ -1057,17 +1057,17 @@ void idRenderWorldLocal::ShowPortals() { if ( portalAreas[ p->intoArea ].viewCount != tr.viewCount ) { // red = can't see - qglColor3f( 1, 0, 0 ); + glColor3f( 1, 0, 0 ); } else { // green = see through - qglColor3f( 0, 1, 0 ); + glColor3f( 0, 1, 0 ); } - qglBegin( GL_LINE_LOOP ); + glBegin( GL_LINE_LOOP ); for ( j = 0 ; j < w->GetNumPoints() ; j++ ) { - qglVertex3fv( (*w)[j].ToFloatPtr() ); + glVertex3fv( (*w)[j].ToFloatPtr() ); } - qglEnd(); + glEnd(); } } } diff --git a/src/renderer/VertexCache.cpp b/src/renderer/VertexCache.cpp index f096ec67..f95fac8f 100644 --- a/src/renderer/VertexCache.cpp +++ b/src/renderer/VertexCache.cpp @@ -73,8 +73,8 @@ void idVertexCache::ActuallyFree( vertCache_t *block ) { if ( block->vbo ) { #if 0 // this isn't really necessary, it will be reused soon enough // filling with zero length data is the equivalent of freeing - qglBindBufferARB(GL_ARRAY_BUFFER_ARB, block->vbo); - qglBufferDataARB(GL_ARRAY_BUFFER_ARB, 0, 0, GL_DYNAMIC_DRAW_ARB); + glBindBufferARB(GL_ARRAY_BUFFER_ARB, block->vbo); + glBufferDataARB(GL_ARRAY_BUFFER_ARB, 0, 0, GL_DYNAMIC_DRAW_ARB); #endif } else if ( block->virtMem ) { Mem_Free( block->virtMem ); @@ -127,9 +127,9 @@ void *idVertexCache::Position( vertCache_t *buffer ) { } } if ( buffer->indexBuffer ) { - qglBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, buffer->vbo ); + glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, buffer->vbo ); } else { - qglBindBufferARB( GL_ARRAY_BUFFER_ARB, buffer->vbo ); + glBindBufferARB( GL_ARRAY_BUFFER_ARB, buffer->vbo ); } return (void *)buffer->offset; } @@ -139,7 +139,7 @@ void *idVertexCache::Position( vertCache_t *buffer ) { } void idVertexCache::UnbindIndex() { - qglBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, 0 ); + glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, 0 ); } @@ -245,7 +245,7 @@ void idVertexCache::Alloc( void *data, int size, vertCache_t **buffer, bool inde block->prev->next = block; if( !virtualMemory ) { - qglGenBuffersARB( 1, & block->vbo ); + glGenBuffersARB( 1, & block->vbo ); } } } @@ -283,14 +283,14 @@ void idVertexCache::Alloc( void *data, int size, vertCache_t **buffer, bool inde // copy the data if ( block->vbo ) { if ( indexBuffer ) { - qglBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, block->vbo ); - qglBufferDataARB( GL_ELEMENT_ARRAY_BUFFER_ARB, (GLsizeiptrARB)size, data, GL_STATIC_DRAW_ARB ); + glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, block->vbo ); + glBufferDataARB( GL_ELEMENT_ARRAY_BUFFER_ARB, (GLsizeiptrARB)size, data, GL_STATIC_DRAW_ARB ); } else { - qglBindBufferARB( GL_ARRAY_BUFFER_ARB, block->vbo ); + glBindBufferARB( GL_ARRAY_BUFFER_ARB, block->vbo ); if ( allocatingTempBuffer ) { - qglBufferDataARB( GL_ARRAY_BUFFER_ARB, (GLsizeiptrARB)size, data, GL_STREAM_DRAW_ARB ); + glBufferDataARB( GL_ARRAY_BUFFER_ARB, (GLsizeiptrARB)size, data, GL_STREAM_DRAW_ARB ); } else { - qglBufferDataARB( GL_ARRAY_BUFFER_ARB, (GLsizeiptrARB)size, data, GL_STATIC_DRAW_ARB ); + glBufferDataARB( GL_ARRAY_BUFFER_ARB, (GLsizeiptrARB)size, data, GL_STATIC_DRAW_ARB ); } } } else { @@ -420,8 +420,8 @@ vertCache_t *idVertexCache::AllocFrameTemp( void *data, int size ) { block->vbo = tempBuffers[listNum]->vbo; if ( block->vbo ) { - qglBindBufferARB( GL_ARRAY_BUFFER_ARB, block->vbo ); - qglBufferSubDataARB( GL_ARRAY_BUFFER_ARB, block->offset, (GLsizeiptrARB)size, data ); + glBindBufferARB( GL_ARRAY_BUFFER_ARB, block->vbo ); + glBufferSubDataARB( GL_ARRAY_BUFFER_ARB, block->offset, (GLsizeiptrARB)size, data ); } else { SIMDProcessor->Memcpy( (byte *)block->virtMem + block->offset, data, size ); } @@ -467,8 +467,8 @@ void idVertexCache::EndFrame() { if( !virtualMemory ) { // unbind vertex buffers so normal virtual memory will be used in case // r_useVertexBuffers / r_useIndexBuffers - qglBindBufferARB( GL_ARRAY_BUFFER_ARB, 0 ); - qglBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, 0 ); + glBindBufferARB( GL_ARRAY_BUFFER_ARB, 0 ); + glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, 0 ); } diff --git a/src/renderer/draw_arb.cpp b/src/renderer/draw_arb.cpp deleted file mode 100644 index 4f8ceded..00000000 --- a/src/renderer/draw_arb.cpp +++ /dev/null @@ -1,529 +0,0 @@ -/* -=========================================================================== - -Doom 3 GPL Source Code -Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. - -This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?). - -Doom 3 Source Code is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Doom 3 Source Code is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Doom 3 Source Code. If not, see . - -In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below. - -If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. - -=========================================================================== -*/ -#include "precompiled.h" -#pragma hdrstop - -#include "tr_local.h" - -/* - - with standard calls, we can't do bump mapping or vertex colors with - shader colors - - 2 texture units: - -falloff --- -light cube -bump --- -light projection -diffuse - - - 3 texture units: - -light cube -bump --- -falloff -light projection -diffuse - - - 5 texture units: - -light cube -bump -falloff -light projection -diffuse - -*/ - -/* -================== -RB_ARB_DrawInteraction - -backEnd.vLight - -backEnd.depthFunc must be equal for alpha tested surfaces to work right, -it is set to lessThan for blended transparent surfaces - -================== -*/ -static void RB_ARB_DrawInteraction( const drawInteraction_t *din ) { - const drawSurf_t *surf = din->surf; - const srfTriangles_t *tri = din->surf->geo; - - // set the vertex arrays, which may not all be enabled on a given pass - idDrawVert *ac = (idDrawVert *)vertexCache.Position( tri->ambientCache ); - qglVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->xyz.ToFloatPtr() ); - GL_SelectTexture( 0 ); - qglTexCoordPointer( 2, GL_FLOAT, sizeof( idDrawVert ), (void *)&ac->st ); - - //----------------------------------------------------- - // - // bump / falloff - // - //----------------------------------------------------- - // render light falloff * bumpmap lighting - - // - // draw light falloff to the alpha channel - // - GL_State( GLS_COLORMASK | GLS_DEPTHMASK | backEnd.depthFunc ); - - qglColor3f( 1, 1, 1 ); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - qglEnable( GL_TEXTURE_GEN_S ); - qglTexGenfv( GL_S, GL_OBJECT_PLANE, din->lightProjection[3].ToFloatPtr() ); - qglTexCoord2f( 0, 0.5 ); - -// ATI R100 can't do partial texgens -#define NO_MIXED_TEXGEN - -#ifdef NO_MIXED_TEXGEN -idVec4 plane; -plane[0] = 0; -plane[1] = 0; -plane[2] = 0; -plane[3] = 0.5; -qglEnable( GL_TEXTURE_GEN_T ); -qglTexGenfv( GL_T, GL_OBJECT_PLANE, plane.ToFloatPtr() ); - -plane[0] = 0; -plane[1] = 0; -plane[2] = 0; -plane[3] = 1; -qglEnable( GL_TEXTURE_GEN_Q ); -qglTexGenfv( GL_Q, GL_OBJECT_PLANE, plane.ToFloatPtr() ); - -#endif - - din->lightFalloffImage->Bind(); - - // draw it - RB_DrawElementsWithCounters( tri ); - - qglDisable( GL_TEXTURE_GEN_S ); -#ifdef NO_MIXED_TEXGEN -qglDisable( GL_TEXTURE_GEN_T ); -qglDisable( GL_TEXTURE_GEN_Q ); -#endif - -#if 0 -GL_State( GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO | GLS_DEPTHMASK - | backEnd.depthFunc ); -// the texccords are the non-normalized vector towards the light origin -GL_SelectTexture( 0 ); -globalImages->normalCubeMapImage->Bind(); -qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); -qglTexCoordPointer( 3, GL_FLOAT, sizeof( lightingCache_t ), ((lightingCache_t *)vertexCache.Position(tri->lightingCache))->localLightVector.ToFloatPtr() ); -// draw it -RB_DrawElementsWithCounters( tri ); -return; -#endif - - // we can't do bump mapping with standard calls, so skip it - if ( glConfig.envDot3Available && glConfig.cubeMapAvailable ) { - // - // draw the bump map result onto the alpha channel - // - GL_State( GLS_SRCBLEND_DST_ALPHA | GLS_DSTBLEND_ZERO | GLS_COLORMASK | GLS_DEPTHMASK - | backEnd.depthFunc ); - - // texture 0 will be the per-surface bump map - GL_SelectTexture( 0 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); -// FIXME: matrix work! RB_BindStageTexture( surfaceRegs, &surfaceStage->texture, surf ); - din->bumpImage->Bind(); - - // texture 1 is the normalization cube map - // the texccords are the non-normalized vector towards the light origin - GL_SelectTexture( 1 ); - if ( din->ambientLight ) { - globalImages->ambientNormalMap->Bind(); // fixed value - } else { - globalImages->normalCubeMapImage->Bind(); - } - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - qglTexCoordPointer( 3, GL_FLOAT, sizeof( lightingCache_t ), ((lightingCache_t *)vertexCache.Position(tri->lightingCache))->localLightVector.ToFloatPtr() ); - - // I just want alpha = Dot( texture0, texture1 ) - GL_TexEnv( GL_COMBINE_ARB ); - - qglTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_DOT3_RGBA_ARB ); - qglTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE ); - qglTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB ); - qglTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR ); - qglTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR ); - qglTexEnvi( GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 1 ); - qglTexEnvi( GL_TEXTURE_ENV, GL_ALPHA_SCALE, 1 ); - - // draw it - RB_DrawElementsWithCounters( tri ); - - GL_TexEnv( GL_MODULATE ); - - globalImages->BindNull(); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - - GL_SelectTexture( 0 ); -// RB_FinishStageTexture( &surfaceStage->texture, surf ); - } - - //----------------------------------------------------- - // - // projected light / surface color for diffuse maps - // - //----------------------------------------------------- - // don't trash alpha - GL_State( GLS_SRCBLEND_DST_ALPHA | GLS_DSTBLEND_ONE | GLS_ALPHAMASK | GLS_DEPTHMASK - | backEnd.depthFunc ); - - // texture 0 will get the surface color texture - GL_SelectTexture( 0 ); - - // select the vertex color source - if ( din->vertexColor == SVC_IGNORE ) { - qglColor4fv( din->diffuseColor.ToFloatPtr() ); - } else { - // FIXME: does this not get diffuseColor blended in? - qglColorPointer( 4, GL_UNSIGNED_BYTE, sizeof( idDrawVert ), (void *)&ac->color ); - qglEnableClientState( GL_COLOR_ARRAY ); - - if ( din->vertexColor == SVC_INVERSE_MODULATE ) { - GL_TexEnv( GL_COMBINE_ARB ); - qglTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE ); - qglTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE ); - qglTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PRIMARY_COLOR_ARB ); - qglTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR ); - qglTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_ONE_MINUS_SRC_COLOR ); - qglTexEnvi( GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 1 ); - } - } - - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - // FIXME: does this not get the texture matrix? -// RB_BindStageTexture( surfaceRegs, &surfaceStage->texture, surf ); - din->diffuseImage->Bind(); - - // texture 1 will get the light projected texture - GL_SelectTexture( 1 ); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - qglEnable( GL_TEXTURE_GEN_S ); - qglEnable( GL_TEXTURE_GEN_T ); - qglEnable( GL_TEXTURE_GEN_Q ); - qglTexGenfv( GL_S, GL_OBJECT_PLANE, din->lightProjection[0].ToFloatPtr() ); - qglTexGenfv( GL_T, GL_OBJECT_PLANE, din->lightProjection[1].ToFloatPtr() ); - qglTexGenfv( GL_Q, GL_OBJECT_PLANE, din->lightProjection[2].ToFloatPtr() ); - - din->lightImage->Bind(); - - // draw it - RB_DrawElementsWithCounters( tri ); - - qglDisable( GL_TEXTURE_GEN_S ); - qglDisable( GL_TEXTURE_GEN_T ); - qglDisable( GL_TEXTURE_GEN_Q ); - - globalImages->BindNull(); - GL_SelectTexture( 0 ); - - if ( din->vertexColor != SVC_IGNORE ) { - qglDisableClientState( GL_COLOR_ARRAY ); - GL_TexEnv( GL_MODULATE ); - } - -// RB_FinishStageTexture( &surfaceStage->texture, surf ); -} - -/* -================== -RB_ARB_DrawThreeTextureInteraction - -Used by radeon R100 and Intel graphics parts - -backEnd.vLight - -backEnd.depthFunc must be equal for alpha tested surfaces to work right, -it is set to lessThan for blended transparent surfaces - -================== -*/ -static void RB_ARB_DrawThreeTextureInteraction( const drawInteraction_t *din ) { - const drawSurf_t *surf = din->surf; - const srfTriangles_t *tri = din->surf->geo; - - // set the vertex arrays, which may not all be enabled on a given pass - idDrawVert *ac = (idDrawVert *)vertexCache.Position( tri->ambientCache ); - qglVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->xyz.ToFloatPtr() ); - GL_SelectTexture( 0 ); - qglTexCoordPointer( 2, GL_FLOAT, sizeof( idDrawVert ), (void *)&ac->st ); - qglColor3f( 1, 1, 1 ); - - // - // bump map dot cubeMap into the alpha channel - // - GL_State( GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO | GLS_COLORMASK | GLS_DEPTHMASK - | backEnd.depthFunc ); - - // texture 0 will be the per-surface bump map - GL_SelectTexture( 0 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); -// FIXME: matrix work! RB_BindStageTexture( surfaceRegs, &surfaceStage->texture, surf ); - din->bumpImage->Bind(); - - // texture 1 is the normalization cube map - // the texccords are the non-normalized vector towards the light origin - GL_SelectTexture( 1 ); - if ( din->ambientLight ) { - globalImages->ambientNormalMap->Bind(); // fixed value - } else { - globalImages->normalCubeMapImage->Bind(); - } - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - qglTexCoordPointer( 3, GL_FLOAT, sizeof( lightingCache_t ), ((lightingCache_t *)vertexCache.Position(tri->lightingCache))->localLightVector.ToFloatPtr() ); - - // I just want alpha = Dot( texture0, texture1 ) - GL_TexEnv( GL_COMBINE_ARB ); - - qglTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_DOT3_RGBA_ARB ); - qglTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE ); - qglTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB ); - qglTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR ); - qglTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR ); - qglTexEnvi( GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 1 ); - qglTexEnvi( GL_TEXTURE_ENV, GL_ALPHA_SCALE, 1 ); - - // draw it - RB_DrawElementsWithCounters( tri ); - - GL_TexEnv( GL_MODULATE ); - - globalImages->BindNull(); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - - GL_SelectTexture( 0 ); -// RB_FinishStageTexture( &surfaceStage->texture, surf ); - - - //----------------------------------------------------- - // - // light falloff / projected light / surface color for diffuse maps - // - //----------------------------------------------------- - // multiply result by alpha, but don't trash alpha - GL_State( GLS_SRCBLEND_DST_ALPHA | GLS_DSTBLEND_ONE | GLS_ALPHAMASK | GLS_DEPTHMASK - | backEnd.depthFunc ); - - // texture 0 will get the surface color texture - GL_SelectTexture( 0 ); - - // select the vertex color source - if ( din->vertexColor == SVC_IGNORE ) { - qglColor4fv( din->diffuseColor.ToFloatPtr() ); - } else { - // FIXME: does this not get diffuseColor blended in? - qglColorPointer( 4, GL_UNSIGNED_BYTE, sizeof( idDrawVert ), (void *)&ac->color ); - qglEnableClientState( GL_COLOR_ARRAY ); - - if ( din->vertexColor == SVC_INVERSE_MODULATE ) { - GL_TexEnv( GL_COMBINE_ARB ); - qglTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE ); - qglTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE ); - qglTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PRIMARY_COLOR_ARB ); - qglTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR ); - qglTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_ONE_MINUS_SRC_COLOR ); - qglTexEnvi( GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 1 ); - } - } - - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - // FIXME: does this not get the texture matrix? -// RB_BindStageTexture( surfaceRegs, &surfaceStage->texture, surf ); - din->diffuseImage->Bind(); - - // texture 1 will get the light projected texture - GL_SelectTexture( 1 ); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - qglEnable( GL_TEXTURE_GEN_S ); - qglEnable( GL_TEXTURE_GEN_T ); - qglEnable( GL_TEXTURE_GEN_Q ); - qglTexGenfv( GL_S, GL_OBJECT_PLANE, din->lightProjection[0].ToFloatPtr() ); - qglTexGenfv( GL_T, GL_OBJECT_PLANE, din->lightProjection[1].ToFloatPtr() ); - qglTexGenfv( GL_Q, GL_OBJECT_PLANE, din->lightProjection[2].ToFloatPtr() ); - din->lightImage->Bind(); - - // texture 2 will get the light falloff texture - GL_SelectTexture( 2 ); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - qglEnable( GL_TEXTURE_GEN_S ); - qglEnable( GL_TEXTURE_GEN_T ); - qglEnable( GL_TEXTURE_GEN_Q ); - - qglTexGenfv( GL_S, GL_OBJECT_PLANE, din->lightProjection[3].ToFloatPtr() ); - - idVec4 plane; - plane[0] = 0; - plane[1] = 0; - plane[2] = 0; - plane[3] = 0.5; - qglTexGenfv( GL_T, GL_OBJECT_PLANE, plane.ToFloatPtr() ); - - plane[0] = 0; - plane[1] = 0; - plane[2] = 0; - plane[3] = 1; - qglTexGenfv( GL_Q, GL_OBJECT_PLANE, plane.ToFloatPtr() ); - - din->lightFalloffImage->Bind(); - - // draw it - RB_DrawElementsWithCounters( tri ); - - qglDisable( GL_TEXTURE_GEN_S ); - qglDisable( GL_TEXTURE_GEN_T ); - qglDisable( GL_TEXTURE_GEN_Q ); - globalImages->BindNull(); - - GL_SelectTexture( 1 ); - qglDisable( GL_TEXTURE_GEN_S ); - qglDisable( GL_TEXTURE_GEN_T ); - qglDisable( GL_TEXTURE_GEN_Q ); - globalImages->BindNull(); - - GL_SelectTexture( 0 ); - - if ( din->vertexColor != SVC_IGNORE ) { - qglDisableClientState( GL_COLOR_ARRAY ); - GL_TexEnv( GL_MODULATE ); - } - -// RB_FinishStageTexture( &surfaceStage->texture, surf ); -} - - -/* -================== -RB_CreateDrawInteractions -================== -*/ -static void RB_CreateDrawInteractions( const drawSurf_t *surf ) { - if ( !surf ) { - return; - } - - // force a space calculation - backEnd.currentSpace = NULL; - - if ( r_useTripleTextureARB.GetBool() && glConfig.maxTextureUnits >= 3 ) { - for ( ; surf ; surf = surf->nextOnLight ) { - // break it up into multiple primitive draw interactions if necessary - RB_CreateSingleDrawInteractions( surf, RB_ARB_DrawThreeTextureInteraction ); - } - } else { - for ( ; surf ; surf = surf->nextOnLight ) { - // break it up into multiple primitive draw interactions if necessary - RB_CreateSingleDrawInteractions( surf, RB_ARB_DrawInteraction ); - } - } -} - - - -/* -================== -RB_RenderViewLight - -================== -*/ -static void RB_RenderViewLight( viewLight_t *vLight ) { - backEnd.vLight = vLight; - - // do fogging later - if ( vLight->lightShader->IsFogLight() ) { - return; - } - if ( vLight->lightShader->IsBlendLight() ) { - return; - } - - RB_LogComment( "---------- RB_RenderViewLight 0x%p ----------\n", vLight ); - - // clear the stencil buffer if needed - if ( vLight->globalShadows || vLight->localShadows ) { - backEnd.currentScissor = vLight->scissorRect; - if ( r_useScissor.GetBool() ) { - qglScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, - backEnd.viewDef->viewport.y1 + backEnd.currentScissor.y1, - backEnd.currentScissor.x2 + 1 - backEnd.currentScissor.x1, - backEnd.currentScissor.y2 + 1 - backEnd.currentScissor.y1 ); - } - qglClear( GL_STENCIL_BUFFER_BIT ); - } else { - // no shadows, so no need to read or write the stencil buffer - // we might in theory want to use GL_ALWAYS instead of disabling - // completely, to satisfy the invarience rules - qglStencilFunc( GL_ALWAYS, 128, 255 ); - } - - backEnd.depthFunc = GLS_DEPTHFUNC_EQUAL; - RB_StencilShadowPass( vLight->globalShadows ); - RB_CreateDrawInteractions( vLight->localInteractions ); - RB_StencilShadowPass( vLight->localShadows ); - RB_CreateDrawInteractions( vLight->globalInteractions ); - - if ( r_skipTranslucent.GetBool() ) { - return; - } - - // disable stencil testing for translucent interactions, because - // the shadow isn't calculated at their point, and the shadow - // behind them may be depth fighting with a back side, so there - // isn't any reasonable thing to do - qglStencilFunc( GL_ALWAYS, 128, 255 ); - backEnd.depthFunc = GLS_DEPTHFUNC_LESS; - RB_CreateDrawInteractions( vLight->translucentInteractions ); -} - - -/* -================== -RB_ARB_DrawInteractions -================== -*/ -void RB_ARB_DrawInteractions( void ) { - qglEnable( GL_STENCIL_TEST ); - - for ( viewLight_t *vLight = backEnd.viewDef->viewLights ; vLight ; vLight = vLight->next ) { - RB_RenderViewLight( vLight ); - } -} - diff --git a/src/renderer/draw_arb2.cpp b/src/renderer/draw_arb2.cpp index 7d0566cb..05fe603e 100644 --- a/src/renderer/draw_arb2.cpp +++ b/src/renderer/draw_arb2.cpp @@ -53,9 +53,9 @@ GENERAL INTERACTION RENDERING GL_SelectTextureNoClient ==================== */ -static void GL_SelectTextureNoClient( int unit ) { +void GL_SelectTextureNoClient( int unit ) { backEnd.glState.currenttmu = unit; - qglActiveTextureARB( GL_TEXTURE0_ARB + unit ); + glActiveTextureARB( GL_TEXTURE0_ARB + unit ); RB_LogComment( "glActiveTextureARB( %i )\n", unit ); } @@ -66,23 +66,23 @@ RB_ARB2_DrawInteraction */ void RB_ARB2_DrawInteraction( const drawInteraction_t *din ) { // load all the vertex program parameters - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_ORIGIN, din->localLightOrigin.ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_VIEW_ORIGIN, din->localViewOrigin.ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_PROJECT_S, din->lightProjection[0].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_PROJECT_T, din->lightProjection[1].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_PROJECT_Q, din->lightProjection[2].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_FALLOFF_S, din->lightProjection[3].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_BUMP_MATRIX_S, din->bumpMatrix[0].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_BUMP_MATRIX_T, din->bumpMatrix[1].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_DIFFUSE_MATRIX_S, din->diffuseMatrix[0].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_DIFFUSE_MATRIX_T, din->diffuseMatrix[1].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_SPECULAR_MATRIX_S, din->specularMatrix[0].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_SPECULAR_MATRIX_T, din->specularMatrix[1].ToFloatPtr() ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_ORIGIN, din->localLightOrigin.ToFloatPtr() ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_VIEW_ORIGIN, din->localViewOrigin.ToFloatPtr() ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_PROJECT_S, din->lightProjection[0].ToFloatPtr() ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_PROJECT_T, din->lightProjection[1].ToFloatPtr() ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_PROJECT_Q, din->lightProjection[2].ToFloatPtr() ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_FALLOFF_S, din->lightProjection[3].ToFloatPtr() ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_BUMP_MATRIX_S, din->bumpMatrix[0].ToFloatPtr() ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_BUMP_MATRIX_T, din->bumpMatrix[1].ToFloatPtr() ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_DIFFUSE_MATRIX_S, din->diffuseMatrix[0].ToFloatPtr() ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_DIFFUSE_MATRIX_T, din->diffuseMatrix[1].ToFloatPtr() ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_SPECULAR_MATRIX_S, din->specularMatrix[0].ToFloatPtr() ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_SPECULAR_MATRIX_T, din->specularMatrix[1].ToFloatPtr() ); // testing fragment based normal mapping if ( r_testARBProgram.GetBool() ) { - qglProgramEnvParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 2, din->localLightOrigin.ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 3, din->localViewOrigin.ToFloatPtr() ); + glProgramEnvParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 2, din->localLightOrigin.ToFloatPtr() ); + glProgramEnvParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 3, din->localViewOrigin.ToFloatPtr() ); } static const float zero[4] = { 0, 0, 0, 0 }; @@ -91,22 +91,22 @@ void RB_ARB2_DrawInteraction( const drawInteraction_t *din ) { switch ( din->vertexColor ) { case SVC_IGNORE: - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_MODULATE, zero ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_ADD, one ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_MODULATE, zero ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_ADD, one ); break; case SVC_MODULATE: - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_MODULATE, one ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_ADD, zero ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_MODULATE, one ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_ADD, zero ); break; case SVC_INVERSE_MODULATE: - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_MODULATE, negOne ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_ADD, one ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_MODULATE, negOne ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_ADD, one ); break; } // set the constant colors - qglProgramEnvParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 0, din->diffuseColor.ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 1, din->specularColor.ToFloatPtr() ); + glProgramEnvParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 0, din->diffuseColor.ToFloatPtr() ); + glProgramEnvParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 1, din->specularColor.ToFloatPtr() ); // set the textures @@ -151,22 +151,22 @@ void RB_ARB2_CreateDrawInteractions( const drawSurf_t *surf ) { // bind the vertex program if ( r_testARBProgram.GetBool() ) { - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_TEST ); - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, FPROG_TEST ); + glBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_TEST ); + glBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, FPROG_TEST ); } else { - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_INTERACTION ); - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, FPROG_INTERACTION ); + glBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_INTERACTION ); + glBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, FPROG_INTERACTION ); } - qglEnable(GL_VERTEX_PROGRAM_ARB); - qglEnable(GL_FRAGMENT_PROGRAM_ARB); + glEnable(GL_VERTEX_PROGRAM_ARB); + glEnable(GL_FRAGMENT_PROGRAM_ARB); // enable the vertex arrays - qglEnableVertexAttribArrayARB( 8 ); - qglEnableVertexAttribArrayARB( 9 ); - qglEnableVertexAttribArrayARB( 10 ); - qglEnableVertexAttribArrayARB( 11 ); - qglEnableClientState( GL_COLOR_ARRAY ); + glEnableVertexAttribArrayARB( 8 ); + glEnableVertexAttribArrayARB( 9 ); + glEnableVertexAttribArrayARB( 10 ); + glEnableVertexAttribArrayARB( 11 ); + glEnableClientState( GL_COLOR_ARRAY ); // texture 0 is the normalization cube map for the vector towards the light GL_SelectTextureNoClient( 0 ); @@ -178,11 +178,7 @@ void RB_ARB2_CreateDrawInteractions( const drawSurf_t *surf ) { // texture 6 is the specular lookup table GL_SelectTextureNoClient( 6 ); - if ( r_testARBProgram.GetBool() ) { - globalImages->specular2DTableImage->Bind(); // variable specularity in alpha channel - } else { - globalImages->specularTableImage->Bind(); - } + globalImages->specularTableImage->Bind(); for ( ; surf ; surf=surf->nextOnLight ) { @@ -190,23 +186,23 @@ void RB_ARB2_CreateDrawInteractions( const drawSurf_t *surf ) { // set the vertex pointers idDrawVert *ac = (idDrawVert *)vertexCache.Position( surf->geo->ambientCache ); - qglColorPointer( 4, GL_UNSIGNED_BYTE, sizeof( idDrawVert ), ac->color ); - qglVertexAttribPointerARB( 11, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->normal.ToFloatPtr() ); - qglVertexAttribPointerARB( 10, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->tangents[1].ToFloatPtr() ); - qglVertexAttribPointerARB( 9, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->tangents[0].ToFloatPtr() ); - qglVertexAttribPointerARB( 8, 2, GL_FLOAT, false, sizeof( idDrawVert ), ac->st.ToFloatPtr() ); - qglVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->xyz.ToFloatPtr() ); + glColorPointer( 4, GL_UNSIGNED_BYTE, sizeof( idDrawVert ), ac->color ); + glVertexAttribPointerARB( 11, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->normal.ToFloatPtr() ); + glVertexAttribPointerARB( 10, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->tangents[1].ToFloatPtr() ); + glVertexAttribPointerARB( 9, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->tangents[0].ToFloatPtr() ); + glVertexAttribPointerARB( 8, 2, GL_FLOAT, false, sizeof( idDrawVert ), ac->st.ToFloatPtr() ); + glVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->xyz.ToFloatPtr() ); // this may cause RB_ARB2_DrawInteraction to be exacuted multiple // times with different colors and images if the surface or light have multiple layers RB_CreateSingleDrawInteractions( surf, RB_ARB2_DrawInteraction ); } - qglDisableVertexAttribArrayARB( 8 ); - qglDisableVertexAttribArrayARB( 9 ); - qglDisableVertexAttribArrayARB( 10 ); - qglDisableVertexAttribArrayARB( 11 ); - qglDisableClientState( GL_COLOR_ARRAY ); + glDisableVertexAttribArrayARB( 8 ); + glDisableVertexAttribArrayARB( 9 ); + glDisableVertexAttribArrayARB( 10 ); + glDisableVertexAttribArrayARB( 11 ); + glDisableClientState( GL_COLOR_ARRAY ); // disable features GL_SelectTextureNoClient( 6 ); @@ -230,8 +226,8 @@ void RB_ARB2_CreateDrawInteractions( const drawSurf_t *surf ) { backEnd.glState.currenttmu = -1; GL_SelectTexture( 0 ); - qglDisable(GL_VERTEX_PROGRAM_ARB); - qglDisable(GL_FRAGMENT_PROGRAM_ARB); + glDisable(GL_VERTEX_PROGRAM_ARB); + glDisable(GL_FRAGMENT_PROGRAM_ARB); } @@ -245,7 +241,7 @@ void RB_ARB2_DrawInteractions( void ) { const idMaterial *lightShader; GL_SelectTexture( 0 ); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); // // for each light, perform adding and shadowing @@ -272,29 +268,29 @@ void RB_ARB2_DrawInteractions( void ) { if ( vLight->globalShadows || vLight->localShadows ) { backEnd.currentScissor = vLight->scissorRect; if ( r_useScissor.GetBool() ) { - qglScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, + glScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, backEnd.viewDef->viewport.y1 + backEnd.currentScissor.y1, backEnd.currentScissor.x2 + 1 - backEnd.currentScissor.x1, backEnd.currentScissor.y2 + 1 - backEnd.currentScissor.y1 ); } - qglClear( GL_STENCIL_BUFFER_BIT ); + glClear( GL_STENCIL_BUFFER_BIT ); } else { // no shadows, so no need to read or write the stencil buffer // we might in theory want to use GL_ALWAYS instead of disabling // completely, to satisfy the invarience rules - qglStencilFunc( GL_ALWAYS, 128, 255 ); + glStencilFunc( GL_ALWAYS, 128, 255 ); } if ( r_useShadowVertexProgram.GetBool() ) { - qglEnable( GL_VERTEX_PROGRAM_ARB ); - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_STENCIL_SHADOW ); + glEnable( GL_VERTEX_PROGRAM_ARB ); + glBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_STENCIL_SHADOW ); RB_StencilShadowPass( vLight->globalShadows ); RB_ARB2_CreateDrawInteractions( vLight->localInteractions ); - qglEnable( GL_VERTEX_PROGRAM_ARB ); - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_STENCIL_SHADOW ); + glEnable( GL_VERTEX_PROGRAM_ARB ); + glBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_STENCIL_SHADOW ); RB_StencilShadowPass( vLight->localShadows ); RB_ARB2_CreateDrawInteractions( vLight->globalInteractions ); - qglDisable( GL_VERTEX_PROGRAM_ARB ); // if there weren't any globalInteractions, it would have stayed on + glDisable( GL_VERTEX_PROGRAM_ARB ); // if there weren't any globalInteractions, it would have stayed on } else { RB_StencilShadowPass( vLight->globalShadows ); RB_ARB2_CreateDrawInteractions( vLight->localInteractions ); @@ -307,7 +303,7 @@ void RB_ARB2_DrawInteractions( void ) { continue; } - qglStencilFunc( GL_ALWAYS, 128, 255 ); + glStencilFunc( GL_ALWAYS, 128, 255 ); backEnd.depthFunc = GLS_DEPTHFUNC_LESS; RB_ARB2_CreateDrawInteractions( vLight->translucentInteractions ); @@ -316,10 +312,10 @@ void RB_ARB2_DrawInteractions( void ) { } // disable stencil shadow test - qglStencilFunc( GL_ALWAYS, 128, 255 ); + glStencilFunc( GL_ALWAYS, 128, 255 ); GL_SelectTexture( 0 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); + glEnableClientState( GL_TEXTURE_COORD_ARRAY ); } //=================================================================================== @@ -427,16 +423,16 @@ void R_LoadARBProgram( int progIndex ) { } end[3] = 0; - qglBindProgramARB( progs[progIndex].target, progs[progIndex].ident ); - qglGetError(); + glBindProgramARB( progs[progIndex].target, progs[progIndex].ident ); + glGetError(); - qglProgramStringARB( progs[progIndex].target, GL_PROGRAM_FORMAT_ASCII_ARB, + glProgramStringARB( progs[progIndex].target, GL_PROGRAM_FORMAT_ASCII_ARB, strlen( start ), (unsigned char *)start ); - err = qglGetError(); - qglGetIntegerv( GL_PROGRAM_ERROR_POSITION_ARB, (GLint *)&ofs ); + err = glGetError(); + glGetIntegerv( GL_PROGRAM_ERROR_POSITION_ARB, (GLint *)&ofs ); if ( err == GL_INVALID_OPERATION ) { - const GLubyte *str = qglGetString( GL_PROGRAM_ERROR_STRING_ARB ); + const GLubyte *str = glGetString( GL_PROGRAM_ERROR_STRING_ARB ); common->Printf( "\nGL_PROGRAM_ERROR_STRING_ARB: %s\n", str ); if ( ofs < 0 ) { common->Printf( "GL_PROGRAM_ERROR_POSITION_ARB < 0 with error\n" ); diff --git a/src/renderer/draw_common.cpp b/src/renderer/draw_common.cpp index fbff3e0f..2465f101 100644 --- a/src/renderer/draw_common.cpp +++ b/src/renderer/draw_common.cpp @@ -80,8 +80,8 @@ RB_PrepareStageTexturing void RB_PrepareStageTexturing( const shaderStage_t *pStage, const drawSurf_t *surf, idDrawVert *ac ) { // set privatePolygonOffset if necessary if ( pStage->privatePolygonOffset ) { - qglEnable( GL_POLYGON_OFFSET_FILL ); - qglPolygonOffset( r_offsetFactor.GetFloat(), r_offsetUnits.GetFloat() * pStage->privatePolygonOffset ); + glEnable( GL_POLYGON_OFFSET_FILL ); + glPolygonOffset( r_offsetFactor.GetFloat(), r_offsetUnits.GetFloat() * pStage->privatePolygonOffset ); } // set the texture matrix if needed @@ -91,15 +91,15 @@ void RB_PrepareStageTexturing( const shaderStage_t *pStage, const drawSurf_t *s // texgens if ( pStage->texture.texgen == TG_DIFFUSE_CUBE ) { - qglTexCoordPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->normal.ToFloatPtr() ); + glTexCoordPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->normal.ToFloatPtr() ); } if ( pStage->texture.texgen == TG_SKYBOX_CUBE || pStage->texture.texgen == TG_WOBBLESKY_CUBE ) { - qglTexCoordPointer( 3, GL_FLOAT, 0, vertexCache.Position( surf->dynamicTexCoords ) ); + glTexCoordPointer( 3, GL_FLOAT, 0, vertexCache.Position( surf->dynamicTexCoords ) ); } if ( pStage->texture.texgen == TG_SCREEN ) { - qglEnable( GL_TEXTURE_GEN_S ); - qglEnable( GL_TEXTURE_GEN_T ); - qglEnable( GL_TEXTURE_GEN_Q ); + glEnable( GL_TEXTURE_GEN_S ); + glEnable( GL_TEXTURE_GEN_T ); + glEnable( GL_TEXTURE_GEN_Q ); float mat[16], plane[4]; myGlMultMatrix( surf->space->modelViewMatrix, backEnd.viewDef->projectionMatrix, mat ); @@ -108,25 +108,25 @@ void RB_PrepareStageTexturing( const shaderStage_t *pStage, const drawSurf_t *s plane[1] = mat[4]; plane[2] = mat[8]; plane[3] = mat[12]; - qglTexGenfv( GL_S, GL_OBJECT_PLANE, plane ); + glTexGenfv( GL_S, GL_OBJECT_PLANE, plane ); plane[0] = mat[1]; plane[1] = mat[5]; plane[2] = mat[9]; plane[3] = mat[13]; - qglTexGenfv( GL_T, GL_OBJECT_PLANE, plane ); + glTexGenfv( GL_T, GL_OBJECT_PLANE, plane ); plane[0] = mat[3]; plane[1] = mat[7]; plane[2] = mat[11]; plane[3] = mat[15]; - qglTexGenfv( GL_Q, GL_OBJECT_PLANE, plane ); + glTexGenfv( GL_Q, GL_OBJECT_PLANE, plane ); } if ( pStage->texture.texgen == TG_SCREEN2 ) { - qglEnable( GL_TEXTURE_GEN_S ); - qglEnable( GL_TEXTURE_GEN_T ); - qglEnable( GL_TEXTURE_GEN_Q ); + glEnable( GL_TEXTURE_GEN_S ); + glEnable( GL_TEXTURE_GEN_T ); + glEnable( GL_TEXTURE_GEN_Q ); float mat[16], plane[4]; myGlMultMatrix( surf->space->modelViewMatrix, backEnd.viewDef->projectionMatrix, mat ); @@ -135,25 +135,25 @@ void RB_PrepareStageTexturing( const shaderStage_t *pStage, const drawSurf_t *s plane[1] = mat[4]; plane[2] = mat[8]; plane[3] = mat[12]; - qglTexGenfv( GL_S, GL_OBJECT_PLANE, plane ); + glTexGenfv( GL_S, GL_OBJECT_PLANE, plane ); plane[0] = mat[1]; plane[1] = mat[5]; plane[2] = mat[9]; plane[3] = mat[13]; - qglTexGenfv( GL_T, GL_OBJECT_PLANE, plane ); + glTexGenfv( GL_T, GL_OBJECT_PLANE, plane ); plane[0] = mat[3]; plane[1] = mat[7]; plane[2] = mat[11]; plane[3] = mat[15]; - qglTexGenfv( GL_Q, GL_OBJECT_PLANE, plane ); + glTexGenfv( GL_Q, GL_OBJECT_PLANE, plane ); } if ( pStage->texture.texgen == TG_GLASSWARP ) { if ( tr.backEndRenderer == BE_ARB2 /*|| tr.backEndRenderer == BE_NV30*/ ) { - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, FPROG_GLASSWARP ); - qglEnable( GL_FRAGMENT_PROGRAM_ARB ); + glBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, FPROG_GLASSWARP ); + glEnable( GL_FRAGMENT_PROGRAM_ARB ); GL_SelectTexture( 2 ); globalImages->scratchImage->Bind(); @@ -161,9 +161,9 @@ void RB_PrepareStageTexturing( const shaderStage_t *pStage, const drawSurf_t *s GL_SelectTexture( 1 ); globalImages->scratchImage2->Bind(); - qglEnable( GL_TEXTURE_GEN_S ); - qglEnable( GL_TEXTURE_GEN_T ); - qglEnable( GL_TEXTURE_GEN_Q ); + glEnable( GL_TEXTURE_GEN_S ); + glEnable( GL_TEXTURE_GEN_T ); + glEnable( GL_TEXTURE_GEN_Q ); float mat[16], plane[4]; myGlMultMatrix( surf->space->modelViewMatrix, backEnd.viewDef->projectionMatrix, mat ); @@ -172,19 +172,19 @@ void RB_PrepareStageTexturing( const shaderStage_t *pStage, const drawSurf_t *s plane[1] = mat[4]; plane[2] = mat[8]; plane[3] = mat[12]; - qglTexGenfv( GL_S, GL_OBJECT_PLANE, plane ); + glTexGenfv( GL_S, GL_OBJECT_PLANE, plane ); plane[0] = mat[1]; plane[1] = mat[5]; plane[2] = mat[9]; plane[3] = mat[13]; - qglTexGenfv( GL_T, GL_OBJECT_PLANE, plane ); + glTexGenfv( GL_T, GL_OBJECT_PLANE, plane ); plane[0] = mat[3]; plane[1] = mat[7]; plane[2] = mat[11]; plane[3] = mat[15]; - qglTexGenfv( GL_Q, GL_OBJECT_PLANE, plane ); + glTexGenfv( GL_Q, GL_OBJECT_PLANE, plane ); GL_SelectTexture( 0 ); } @@ -200,47 +200,47 @@ void RB_PrepareStageTexturing( const shaderStage_t *pStage, const drawSurf_t *s bumpStage->texture.image->Bind(); GL_SelectTexture( 0 ); - qglNormalPointer( GL_FLOAT, sizeof( idDrawVert ), ac->normal.ToFloatPtr() ); - qglVertexAttribPointerARB( 10, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->tangents[1].ToFloatPtr() ); - qglVertexAttribPointerARB( 9, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->tangents[0].ToFloatPtr() ); + glNormalPointer( GL_FLOAT, sizeof( idDrawVert ), ac->normal.ToFloatPtr() ); + glVertexAttribPointerARB( 10, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->tangents[1].ToFloatPtr() ); + glVertexAttribPointerARB( 9, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->tangents[0].ToFloatPtr() ); - qglEnableVertexAttribArrayARB( 9 ); - qglEnableVertexAttribArrayARB( 10 ); - qglEnableClientState( GL_NORMAL_ARRAY ); + glEnableVertexAttribArrayARB( 9 ); + glEnableVertexAttribArrayARB( 10 ); + glEnableClientState( GL_NORMAL_ARRAY ); // Program env 5, 6, 7, 8 have been set in RB_SetProgramEnvironmentSpace - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, FPROG_BUMPY_ENVIRONMENT ); - qglEnable( GL_FRAGMENT_PROGRAM_ARB ); - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_BUMPY_ENVIRONMENT ); - qglEnable( GL_VERTEX_PROGRAM_ARB ); + glBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, FPROG_BUMPY_ENVIRONMENT ); + glEnable( GL_FRAGMENT_PROGRAM_ARB ); + glBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_BUMPY_ENVIRONMENT ); + glEnable( GL_VERTEX_PROGRAM_ARB ); } else { // per-pixel reflection mapping without a normal map - qglNormalPointer( GL_FLOAT, sizeof( idDrawVert ), ac->normal.ToFloatPtr() ); - qglEnableClientState( GL_NORMAL_ARRAY ); + glNormalPointer( GL_FLOAT, sizeof( idDrawVert ), ac->normal.ToFloatPtr() ); + glEnableClientState( GL_NORMAL_ARRAY ); - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, FPROG_ENVIRONMENT ); - qglEnable( GL_FRAGMENT_PROGRAM_ARB ); - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_ENVIRONMENT ); - qglEnable( GL_VERTEX_PROGRAM_ARB ); + glBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, FPROG_ENVIRONMENT ); + glEnable( GL_FRAGMENT_PROGRAM_ARB ); + glBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_ENVIRONMENT ); + glEnable( GL_VERTEX_PROGRAM_ARB ); } } else { - qglEnable( GL_TEXTURE_GEN_S ); - qglEnable( GL_TEXTURE_GEN_T ); - qglEnable( GL_TEXTURE_GEN_R ); - qglTexGenf( GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT ); - qglTexGenf( GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT ); - qglTexGenf( GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT ); - qglEnableClientState( GL_NORMAL_ARRAY ); - qglNormalPointer( GL_FLOAT, sizeof( idDrawVert ), ac->normal.ToFloatPtr() ); - - qglMatrixMode( GL_TEXTURE ); + glEnable( GL_TEXTURE_GEN_S ); + glEnable( GL_TEXTURE_GEN_T ); + glEnable( GL_TEXTURE_GEN_R ); + glTexGenf( GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT ); + glTexGenf( GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT ); + glTexGenf( GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT ); + glEnableClientState( GL_NORMAL_ARRAY ); + glNormalPointer( GL_FLOAT, sizeof( idDrawVert ), ac->normal.ToFloatPtr() ); + + glMatrixMode( GL_TEXTURE ); float mat[16]; R_TransposeGLMatrix( backEnd.viewDef->worldSpace.modelViewMatrix, mat ); - qglLoadMatrixf( mat ); - qglMatrixMode( GL_MODELVIEW ); + glLoadMatrixf( mat ); + glMatrixMode( GL_MODELVIEW ); } } } @@ -253,23 +253,23 @@ RB_FinishStageTexturing void RB_FinishStageTexturing( const shaderStage_t *pStage, const drawSurf_t *surf, idDrawVert *ac ) { // unset privatePolygonOffset if necessary if ( pStage->privatePolygonOffset && !surf->material->TestMaterialFlag(MF_POLYGONOFFSET) ) { - qglDisable( GL_POLYGON_OFFSET_FILL ); + glDisable( GL_POLYGON_OFFSET_FILL ); } if ( pStage->texture.texgen == TG_DIFFUSE_CUBE || pStage->texture.texgen == TG_SKYBOX_CUBE || pStage->texture.texgen == TG_WOBBLESKY_CUBE ) { - qglTexCoordPointer( 2, GL_FLOAT, sizeof( idDrawVert ), (void *)&ac->st ); + glTexCoordPointer( 2, GL_FLOAT, sizeof( idDrawVert ), (void *)&ac->st ); } if ( pStage->texture.texgen == TG_SCREEN ) { - qglDisable( GL_TEXTURE_GEN_S ); - qglDisable( GL_TEXTURE_GEN_T ); - qglDisable( GL_TEXTURE_GEN_Q ); + glDisable( GL_TEXTURE_GEN_S ); + glDisable( GL_TEXTURE_GEN_T ); + glDisable( GL_TEXTURE_GEN_Q ); } if ( pStage->texture.texgen == TG_SCREEN2 ) { - qglDisable( GL_TEXTURE_GEN_S ); - qglDisable( GL_TEXTURE_GEN_T ); - qglDisable( GL_TEXTURE_GEN_Q ); + glDisable( GL_TEXTURE_GEN_S ); + glDisable( GL_TEXTURE_GEN_T ); + glDisable( GL_TEXTURE_GEN_Q ); } if ( pStage->texture.texgen == TG_GLASSWARP ) { @@ -281,10 +281,10 @@ void RB_FinishStageTexturing( const shaderStage_t *pStage, const drawSurf_t *sur if ( pStage->texture.hasMatrix ) { RB_LoadShaderTextureMatrix( surf->shaderRegisters, &pStage->texture ); } - qglDisable( GL_TEXTURE_GEN_S ); - qglDisable( GL_TEXTURE_GEN_T ); - qglDisable( GL_TEXTURE_GEN_Q ); - qglDisable( GL_FRAGMENT_PROGRAM_ARB ); + glDisable( GL_TEXTURE_GEN_S ); + glDisable( GL_TEXTURE_GEN_T ); + glDisable( GL_TEXTURE_GEN_Q ); + glDisable( GL_FRAGMENT_PROGRAM_ARB ); globalImages->BindNull(); GL_SelectTexture( 0 ); } @@ -300,36 +300,36 @@ void RB_FinishStageTexturing( const shaderStage_t *pStage, const drawSurf_t *sur globalImages->BindNull(); GL_SelectTexture( 0 ); - qglDisableVertexAttribArrayARB( 9 ); - qglDisableVertexAttribArrayARB( 10 ); + glDisableVertexAttribArrayARB( 9 ); + glDisableVertexAttribArrayARB( 10 ); } else { // per-pixel reflection mapping without bump mapping } - qglDisableClientState( GL_NORMAL_ARRAY ); - qglDisable( GL_FRAGMENT_PROGRAM_ARB ); - qglDisable( GL_VERTEX_PROGRAM_ARB ); + glDisableClientState( GL_NORMAL_ARRAY ); + glDisable( GL_FRAGMENT_PROGRAM_ARB ); + glDisable( GL_VERTEX_PROGRAM_ARB ); // Fixme: Hack to get around an apparent bug in ATI drivers. Should remove as soon as it gets fixed. - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, 0 ); + glBindProgramARB( GL_VERTEX_PROGRAM_ARB, 0 ); } else { - qglDisable( GL_TEXTURE_GEN_S ); - qglDisable( GL_TEXTURE_GEN_T ); - qglDisable( GL_TEXTURE_GEN_R ); - qglTexGenf( GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); - qglTexGenf( GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); - qglTexGenf( GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); - qglDisableClientState( GL_NORMAL_ARRAY ); - - qglMatrixMode( GL_TEXTURE ); - qglLoadIdentity(); - qglMatrixMode( GL_MODELVIEW ); + glDisable( GL_TEXTURE_GEN_S ); + glDisable( GL_TEXTURE_GEN_T ); + glDisable( GL_TEXTURE_GEN_R ); + glTexGenf( GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); + glTexGenf( GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); + glTexGenf( GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); + glDisableClientState( GL_NORMAL_ARRAY ); + + glMatrixMode( GL_TEXTURE ); + glLoadIdentity(); + glMatrixMode( GL_MODELVIEW ); } } if ( pStage->texture.hasMatrix ) { - qglMatrixMode( GL_TEXTURE ); - qglLoadIdentity(); - qglMatrixMode( GL_MODELVIEW ); + glMatrixMode( GL_TEXTURE ); + glLoadIdentity(); + glMatrixMode( GL_MODELVIEW ); } } @@ -366,7 +366,7 @@ void RB_T_FillDepthBuffer( const drawSurf_t *surf ) { R_GlobalPlaneToLocal( surf->space->modelMatrix, backEnd.viewDef->clipPlanes[0], plane ); plane[3] += 0.5; // the notch is in the middle - qglTexGenfv( GL_S, GL_OBJECT_PLANE, plane.ToFloatPtr() ); + glTexGenfv( GL_S, GL_OBJECT_PLANE, plane.ToFloatPtr() ); GL_SelectTexture( 0 ); } @@ -407,8 +407,8 @@ void RB_T_FillDepthBuffer( const drawSurf_t *surf ) { // set polygon offset if necessary if ( shader->TestMaterialFlag(MF_POLYGONOFFSET) ) { - qglEnable( GL_POLYGON_OFFSET_FILL ); - qglPolygonOffset( r_offsetFactor.GetFloat(), r_offsetUnits.GetFloat() * shader->GetPolygonOffset() ); + glEnable( GL_POLYGON_OFFSET_FILL ); + glPolygonOffset( r_offsetFactor.GetFloat(), r_offsetUnits.GetFloat() * shader->GetPolygonOffset() ); } // subviews will just down-modulate the color buffer by overbright @@ -427,8 +427,8 @@ void RB_T_FillDepthBuffer( const drawSurf_t *surf ) { } idDrawVert *ac = (idDrawVert *)vertexCache.Position( tri->ambientCache ); - qglVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->xyz.ToFloatPtr() ); - qglTexCoordPointer( 2, GL_FLOAT, sizeof( idDrawVert ), reinterpret_cast(&ac->st) ); + glVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->xyz.ToFloatPtr() ); + glTexCoordPointer( 2, GL_FLOAT, sizeof( idDrawVert ), reinterpret_cast(&ac->st) ); bool drawSolid = false; @@ -442,7 +442,7 @@ void RB_T_FillDepthBuffer( const drawSurf_t *surf ) { // draw a normal opaque surface bool didDraw = false; - qglEnable( GL_ALPHA_TEST ); + glEnable( GL_ALPHA_TEST ); // perforated surfaces may have multiple alpha tested stages for ( stage = 0; stage < shader->GetNumStages() ; stage++ ) { pStage = shader->GetStage(stage); @@ -467,9 +467,9 @@ void RB_T_FillDepthBuffer( const drawSurf_t *surf ) { if ( color[3] <= 0 ) { continue; } - qglColor4fv( color ); + glColor4fv( color ); - qglAlphaFunc( GL_GREATER, regs[ pStage->alphaTestRegister ] ); + glAlphaFunc( GL_GREATER, regs[ pStage->alphaTestRegister ] ); // bind the texture pStage->texture.image->Bind(); @@ -482,7 +482,7 @@ void RB_T_FillDepthBuffer( const drawSurf_t *surf ) { RB_FinishStageTexturing( pStage, surf, ac ); } - qglDisable( GL_ALPHA_TEST ); + glDisable( GL_ALPHA_TEST ); if ( !didDraw ) { drawSolid = true; } @@ -490,7 +490,7 @@ void RB_T_FillDepthBuffer( const drawSurf_t *surf ) { // draw the entire surface solid if ( drawSolid ) { - qglColor4fv( color ); + glColor4fv( color ); globalImages->whiteImage->Bind(); // draw it @@ -500,7 +500,7 @@ void RB_T_FillDepthBuffer( const drawSurf_t *surf ) { // reset polygon offset if ( shader->TestMaterialFlag(MF_POLYGONOFFSET) ) { - qglDisable( GL_POLYGON_OFFSET_FILL ); + glDisable( GL_POLYGON_OFFSET_FILL ); } // reset blending @@ -530,32 +530,32 @@ void RB_STD_FillDepthBuffer( drawSurf_t **drawSurfs, int numDrawSurfs ) { if ( backEnd.viewDef->numClipPlanes ) { GL_SelectTexture( 1 ); globalImages->alphaNotchImage->Bind(); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - qglEnable( GL_TEXTURE_GEN_S ); - qglTexCoord2f( 1, 0.5 ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glEnable( GL_TEXTURE_GEN_S ); + glTexCoord2f( 1, 0.5 ); } // the first texture will be used for alpha tested surfaces GL_SelectTexture( 0 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); + glEnableClientState( GL_TEXTURE_COORD_ARRAY ); // decal surfaces may enable polygon offset - qglPolygonOffset( r_offsetFactor.GetFloat(), r_offsetUnits.GetFloat() ); + glPolygonOffset( r_offsetFactor.GetFloat(), r_offsetUnits.GetFloat() ); GL_State( GLS_DEPTHFUNC_LESS ); // Enable stencil test if we are going to be using it for shadows. // If we didn't do this, it would be legal behavior to get z fighting // from the ambient pass and the light passes. - qglEnable( GL_STENCIL_TEST ); - qglStencilFunc( GL_ALWAYS, 1, 255 ); + glEnable( GL_STENCIL_TEST ); + glStencilFunc( GL_ALWAYS, 1, 255 ); RB_RenderDrawSurfListWithFunction( drawSurfs, numDrawSurfs, RB_T_FillDepthBuffer ); if ( backEnd.viewDef->numClipPlanes ) { GL_SelectTexture( 1 ); globalImages->BindNull(); - qglDisable( GL_TEXTURE_GEN_S ); + glDisable( GL_TEXTURE_GEN_S ); GL_SelectTexture( 0 ); } @@ -588,7 +588,7 @@ void RB_SetProgramEnvironment( void ) { // screen power of two correction factor, one pixel in so we don't get a bilerp // of an uncopied pixel int w = backEnd.viewDef->viewport.x2 - backEnd.viewDef->viewport.x1 + 1; - pot = globalImages->currentRenderImage->uploadWidth; + pot = globalImages->currentRenderImage->GetOpts().width; if ( w == pot ) { parm[0] = 1.0; } else { @@ -596,7 +596,7 @@ void RB_SetProgramEnvironment( void ) { } int h = backEnd.viewDef->viewport.y2 - backEnd.viewDef->viewport.y1 + 1; - pot = globalImages->currentRenderImage->uploadHeight; + pot = globalImages->currentRenderImage->GetOpts().height; if ( h == pot ) { parm[1] = 1.0; } else { @@ -605,31 +605,31 @@ void RB_SetProgramEnvironment( void ) { parm[2] = 0; parm[3] = 1; - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 0, parm ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 0, parm ); #else // screen power of two correction factor, assuming the copy to _currentRender // also copied an extra row and column for the bilerp int w = backEnd.viewDef->viewport.x2 - backEnd.viewDef->viewport.x1 + 1; - pot = globalImages->currentRenderImage->uploadWidth; + pot = globalImages->currentRenderImage->GetOpts().width; parm[0] = (float)w / pot; int h = backEnd.viewDef->viewport.y2 - backEnd.viewDef->viewport.y1 + 1; - pot = globalImages->currentRenderImage->uploadHeight; + pot = globalImages->currentRenderImage->GetOpts().height; parm[1] = (float)h / pot; parm[2] = 0; parm[3] = 1; - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 0, parm ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 0, parm ); #endif - qglProgramEnvParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 0, parm ); + glProgramEnvParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 0, parm ); // window coord to 0.0 to 1.0 conversion parm[0] = 1.0 / w; parm[1] = 1.0 / h; parm[2] = 0; parm[3] = 1; - qglProgramEnvParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 1, parm ); + glProgramEnvParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 1, parm ); // // set eye position in global space @@ -638,7 +638,7 @@ void RB_SetProgramEnvironment( void ) { parm[1] = backEnd.viewDef->renderView.vieworg[1]; parm[2] = backEnd.viewDef->renderView.vieworg[2]; parm[3] = 1.0; - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 1, parm ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 1, parm ); } @@ -661,7 +661,7 @@ void RB_SetProgramEnvironmentSpace( void ) { // set eye position in local space R_GlobalPointToLocal( space->modelMatrix, backEnd.viewDef->renderView.vieworg, *(idVec3 *)parm ); parm[3] = 1.0; - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 5, parm ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 5, parm ); // we need the model matrix without it being combined with the view matrix // so we can transform local vectors to global coordinates @@ -669,17 +669,17 @@ void RB_SetProgramEnvironmentSpace( void ) { parm[1] = space->modelMatrix[4]; parm[2] = space->modelMatrix[8]; parm[3] = space->modelMatrix[12]; - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 6, parm ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 6, parm ); parm[0] = space->modelMatrix[1]; parm[1] = space->modelMatrix[5]; parm[2] = space->modelMatrix[9]; parm[3] = space->modelMatrix[13]; - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 7, parm ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 7, parm ); parm[0] = space->modelMatrix[2]; parm[1] = space->modelMatrix[6]; parm[2] = space->modelMatrix[10]; parm[3] = space->modelMatrix[14]; - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 8, parm ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 8, parm ); } /* @@ -710,7 +710,7 @@ void RB_STD_T_RenderShaderPasses( const drawSurf_t *surf ) { // change the matrix if needed if ( surf->space != backEnd.currentSpace ) { - qglLoadMatrixf( surf->space->modelViewMatrix ); + glLoadMatrixf( surf->space->modelViewMatrix ); backEnd.currentSpace = surf->space; RB_SetProgramEnvironmentSpace(); } @@ -718,7 +718,7 @@ void RB_STD_T_RenderShaderPasses( const drawSurf_t *surf ) { // change the scissor if needed if ( r_useScissor.GetBool() && !backEnd.currentScissor.Equals( surf->scissorRect ) ) { backEnd.currentScissor = surf->scissorRect; - qglScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, + glScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, backEnd.viewDef->viewport.y1 + backEnd.currentScissor.y1, backEnd.currentScissor.x2 + 1 - backEnd.currentScissor.x1, backEnd.currentScissor.y2 + 1 - backEnd.currentScissor.y1 ); @@ -742,8 +742,8 @@ void RB_STD_T_RenderShaderPasses( const drawSurf_t *surf ) { // set polygon offset if necessary if ( shader->TestMaterialFlag(MF_POLYGONOFFSET) ) { - qglEnable( GL_POLYGON_OFFSET_FILL ); - qglPolygonOffset( r_offsetFactor.GetFloat(), r_offsetUnits.GetFloat() * shader->GetPolygonOffset() ); + glEnable( GL_POLYGON_OFFSET_FILL ); + glPolygonOffset( r_offsetFactor.GetFloat(), r_offsetUnits.GetFloat() * shader->GetPolygonOffset() ); } if ( surf->space->weaponDepthHack ) { @@ -755,8 +755,8 @@ void RB_STD_T_RenderShaderPasses( const drawSurf_t *surf ) { } idDrawVert *ac = (idDrawVert *)vertexCache.Position( tri->ambientCache ); - qglVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->xyz.ToFloatPtr() ); - qglTexCoordPointer( 2, GL_FLOAT, sizeof( idDrawVert ), reinterpret_cast(&ac->st) ); + glVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->xyz.ToFloatPtr() ); + glTexCoordPointer( 2, GL_FLOAT, sizeof( idDrawVert ), reinterpret_cast(&ac->st) ); for ( stage = 0; stage < shader->GetNumStages() ; stage++ ) { pStage = shader->GetStage(stage); @@ -792,28 +792,28 @@ void RB_STD_T_RenderShaderPasses( const drawSurf_t *surf ) { if ( r_skipNewAmbient.GetBool() ) { continue; } - qglColorPointer( 4, GL_UNSIGNED_BYTE, sizeof( idDrawVert ), (void *)&ac->color ); - qglVertexAttribPointerARB( 9, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->tangents[0].ToFloatPtr() ); - qglVertexAttribPointerARB( 10, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->tangents[1].ToFloatPtr() ); - qglNormalPointer( GL_FLOAT, sizeof( idDrawVert ), ac->normal.ToFloatPtr() ); + glColorPointer( 4, GL_UNSIGNED_BYTE, sizeof( idDrawVert ), (void *)&ac->color ); + glVertexAttribPointerARB( 9, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->tangents[0].ToFloatPtr() ); + glVertexAttribPointerARB( 10, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->tangents[1].ToFloatPtr() ); + glNormalPointer( GL_FLOAT, sizeof( idDrawVert ), ac->normal.ToFloatPtr() ); - qglEnableClientState( GL_COLOR_ARRAY ); - qglEnableVertexAttribArrayARB( 9 ); - qglEnableVertexAttribArrayARB( 10 ); - qglEnableClientState( GL_NORMAL_ARRAY ); + glEnableClientState( GL_COLOR_ARRAY ); + glEnableVertexAttribArrayARB( 9 ); + glEnableVertexAttribArrayARB( 10 ); + glEnableClientState( GL_NORMAL_ARRAY ); GL_State( pStage->drawStateBits ); - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, newStage->vertexProgram ); - qglEnable( GL_VERTEX_PROGRAM_ARB ); + glBindProgramARB( GL_VERTEX_PROGRAM_ARB, newStage->vertexProgram ); + glEnable( GL_VERTEX_PROGRAM_ARB ); // megaTextures bind a lot of images and set a lot of parameters - if ( newStage->megaTexture ) { - newStage->megaTexture->SetMappingForSurface( tri ); - idVec3 localViewer; - R_GlobalPointToLocal( surf->space->modelMatrix, backEnd.viewDef->renderView.vieworg, localViewer ); - newStage->megaTexture->BindForViewOrigin( localViewer ); - } + //if ( newStage->megaTexture ) { + // newStage->megaTexture->SetMappingForSurface( tri ); + // idVec3 localViewer; + // R_GlobalPointToLocal( surf->space->modelMatrix, backEnd.viewDef->renderView.vieworg, localViewer ); + // newStage->megaTexture->BindForViewOrigin( localViewer ); + //} for ( int i = 0 ; i < newStage->numVertexParms ; i++ ) { float parm[4]; @@ -821,7 +821,7 @@ void RB_STD_T_RenderShaderPasses( const drawSurf_t *surf ) { parm[1] = regs[ newStage->vertexParms[i][1] ]; parm[2] = regs[ newStage->vertexParms[i][2] ]; parm[3] = regs[ newStage->vertexParms[i][3] ]; - qglProgramLocalParameter4fvARB( GL_VERTEX_PROGRAM_ARB, i, parm ); + glProgramLocalParameter4fvARB( GL_VERTEX_PROGRAM_ARB, i, parm ); } for ( int i = 0 ; i < newStage->numFragmentProgramImages ; i++ ) { @@ -830,8 +830,8 @@ void RB_STD_T_RenderShaderPasses( const drawSurf_t *surf ) { newStage->fragmentProgramImages[i]->Bind(); } } - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, newStage->fragmentProgram ); - qglEnable( GL_FRAGMENT_PROGRAM_ARB ); + glBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, newStage->fragmentProgram ); + glEnable( GL_FRAGMENT_PROGRAM_ARB ); // draw it RB_DrawElementsWithCounters( tri ); @@ -842,21 +842,21 @@ void RB_STD_T_RenderShaderPasses( const drawSurf_t *surf ) { globalImages->BindNull(); } } - if ( newStage->megaTexture ) { - newStage->megaTexture->Unbind(); - } + //if ( newStage->megaTexture ) { + // newStage->megaTexture->Unbind(); + //} GL_SelectTexture( 0 ); - qglDisable( GL_VERTEX_PROGRAM_ARB ); - qglDisable( GL_FRAGMENT_PROGRAM_ARB ); + glDisable( GL_VERTEX_PROGRAM_ARB ); + glDisable( GL_FRAGMENT_PROGRAM_ARB ); // Fixme: Hack to get around an apparent bug in ATI drivers. Should remove as soon as it gets fixed. - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, 0 ); + glBindProgramARB( GL_VERTEX_PROGRAM_ARB, 0 ); - qglDisableClientState( GL_COLOR_ARRAY ); - qglDisableVertexAttribArrayARB( 9 ); - qglDisableVertexAttribArrayARB( 10 ); - qglDisableClientState( GL_NORMAL_ARRAY ); + glDisableClientState( GL_COLOR_ARRAY ); + glDisableVertexAttribArrayARB( 9 ); + glDisableVertexAttribArrayARB( 10 ); + glDisableClientState( GL_NORMAL_ARRAY ); continue; } @@ -886,19 +886,19 @@ void RB_STD_T_RenderShaderPasses( const drawSurf_t *surf ) { // select the vertex color source if ( pStage->vertexColor == SVC_IGNORE ) { - qglColor4fv( color ); + glColor4fv( color ); } else { - qglColorPointer( 4, GL_UNSIGNED_BYTE, sizeof( idDrawVert ), (void *)&ac->color ); - qglEnableClientState( GL_COLOR_ARRAY ); + glColorPointer( 4, GL_UNSIGNED_BYTE, sizeof( idDrawVert ), (void *)&ac->color ); + glEnableClientState( GL_COLOR_ARRAY ); if ( pStage->vertexColor == SVC_INVERSE_MODULATE ) { GL_TexEnv( GL_COMBINE_ARB ); - qglTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE ); - qglTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE ); - qglTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PRIMARY_COLOR_ARB ); - qglTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR ); - qglTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_ONE_MINUS_SRC_COLOR ); - qglTexEnvi( GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 1 ); + glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE ); + glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE ); + glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PRIMARY_COLOR_ARB ); + glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR ); + glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_ONE_MINUS_SRC_COLOR ); + glTexEnvi( GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 1 ); } // for vertex color and modulated color, we need to enable a second @@ -909,21 +909,21 @@ void RB_STD_T_RenderShaderPasses( const drawSurf_t *surf ) { globalImages->whiteImage->Bind(); GL_TexEnv( GL_COMBINE_ARB ); - qglTexEnvfv( GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color ); + glTexEnvfv( GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color ); - qglTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE ); - qglTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB ); - qglTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT_ARB ); - qglTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR ); - qglTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR ); - qglTexEnvi( GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 1 ); + glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE ); + glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB ); + glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT_ARB ); + glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR ); + glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR ); + glTexEnvi( GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 1 ); - qglTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_MODULATE ); - qglTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS_ARB ); - qglTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, GL_CONSTANT_ARB ); - qglTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA ); - qglTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB, GL_SRC_ALPHA ); - qglTexEnvi( GL_TEXTURE_ENV, GL_ALPHA_SCALE, 1 ); + glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_MODULATE ); + glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS_ARB ); + glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, GL_CONSTANT_ARB ); + glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA ); + glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB, GL_SRC_ALPHA ); + glTexEnvi( GL_TEXTURE_ENV, GL_ALPHA_SCALE, 1 ); GL_SelectTexture( 0 ); } @@ -943,7 +943,7 @@ void RB_STD_T_RenderShaderPasses( const drawSurf_t *surf ) { RB_FinishStageTexturing( pStage, surf, ac ); if ( pStage->vertexColor != SVC_IGNORE ) { - qglDisableClientState( GL_COLOR_ARRAY ); + glDisableClientState( GL_COLOR_ARRAY ); GL_SelectTexture( 1 ); GL_TexEnv( GL_MODULATE ); @@ -955,7 +955,7 @@ void RB_STD_T_RenderShaderPasses( const drawSurf_t *surf ) { // reset polygon offset if ( shader->TestMaterialFlag(MF_POLYGONOFFSET) ) { - qglDisable( GL_POLYGON_OFFSET_FILL ); + glDisable( GL_POLYGON_OFFSET_FILL ); } if ( surf->space->weaponDepthHack || surf->space->modelDepthHack != 0.0f ) { RB_LeaveDepthHack(); @@ -990,7 +990,7 @@ int RB_STD_DrawShaderPasses( drawSurf_t **drawSurfs, int numDrawSurfs ) { if ( backEnd.viewDef->viewEntitys && tr.backEndRenderer == BE_ARB2 ) { globalImages->currentRenderImage->CopyFramebuffer( backEnd.viewDef->viewport.x1, backEnd.viewDef->viewport.y1, backEnd.viewDef->viewport.x2 - backEnd.viewDef->viewport.x1 + 1, - backEnd.viewDef->viewport.y2 - backEnd.viewDef->viewport.y1 + 1, true ); + backEnd.viewDef->viewport.y2 - backEnd.viewDef->viewport.y1 + 1 ); } backEnd.currentRenderCopied = true; } @@ -999,7 +999,7 @@ int RB_STD_DrawShaderPasses( drawSurf_t **drawSurfs, int numDrawSurfs ) { globalImages->BindNull(); GL_SelectTexture( 0 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); + glEnableClientState( GL_TEXTURE_COORD_ARRAY ); RB_SetProgramEnvironment(); @@ -1028,7 +1028,7 @@ int RB_STD_DrawShaderPasses( drawSurf_t **drawSurfs, int numDrawSurfs ) { } GL_Cull( CT_FRONT_SIDED ); - qglColor3f( 1, 1, 1 ); + glColor3f( 1, 1, 1 ); return i; } @@ -1060,7 +1060,7 @@ static void RB_T_Shadow( const drawSurf_t *surf ) { R_GlobalPointToLocal( surf->space->modelMatrix, backEnd.vLight->globalLightOrigin, localLight.ToVec3() ); localLight.w = 0.0f; - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_ORIGIN, localLight.ToFloatPtr() ); + glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_ORIGIN, localLight.ToFloatPtr() ); } tri = surf->geo; @@ -1069,7 +1069,7 @@ static void RB_T_Shadow( const drawSurf_t *surf ) { return; } - qglVertexPointer( 4, GL_FLOAT, sizeof( shadowCache_t ), vertexCache.Position(tri->shadowCache) ); + glVertexPointer( 4, GL_FLOAT, sizeof( shadowCache_t ), vertexCache.Position(tri->shadowCache) ); // we always draw the sil planes, but we may not need to draw the front or rear caps int numIndexes; @@ -1102,43 +1102,43 @@ static void RB_T_Shadow( const drawSurf_t *surf ) { // set depth bounds if( glConfig.depthBoundsTestAvailable && r_useDepthBoundsTest.GetBool() ) { - qglDepthBoundsEXT( surf->scissorRect.zmin, surf->scissorRect.zmax ); + glDepthBoundsEXT( surf->scissorRect.zmin, surf->scissorRect.zmax ); } // debug visualization if ( r_showShadows.GetInteger() ) { if ( r_showShadows.GetInteger() == 3 ) { if ( external ) { - qglColor3f( 0.1/backEnd.overBright, 1/backEnd.overBright, 0.1/backEnd.overBright ); + glColor3f( 0.1/backEnd.overBright, 1/backEnd.overBright, 0.1/backEnd.overBright ); } else { // these are the surfaces that require the reverse - qglColor3f( 1/backEnd.overBright, 0.1/backEnd.overBright, 0.1/backEnd.overBright ); + glColor3f( 1/backEnd.overBright, 0.1/backEnd.overBright, 0.1/backEnd.overBright ); } } else { // draw different color for turboshadows if ( surf->geo->shadowCapPlaneBits & SHADOW_CAP_INFINITE ) { if ( numIndexes == tri->numIndexes ) { - qglColor3f( 1/backEnd.overBright, 0.1/backEnd.overBright, 0.1/backEnd.overBright ); + glColor3f( 1/backEnd.overBright, 0.1/backEnd.overBright, 0.1/backEnd.overBright ); } else { - qglColor3f( 1/backEnd.overBright, 0.4/backEnd.overBright, 0.1/backEnd.overBright ); + glColor3f( 1/backEnd.overBright, 0.4/backEnd.overBright, 0.1/backEnd.overBright ); } } else { if ( numIndexes == tri->numIndexes ) { - qglColor3f( 0.1/backEnd.overBright, 1/backEnd.overBright, 0.1/backEnd.overBright ); + glColor3f( 0.1/backEnd.overBright, 1/backEnd.overBright, 0.1/backEnd.overBright ); } else if ( numIndexes == tri->numShadowIndexesNoFrontCaps ) { - qglColor3f( 0.1/backEnd.overBright, 1/backEnd.overBright, 0.6/backEnd.overBright ); + glColor3f( 0.1/backEnd.overBright, 1/backEnd.overBright, 0.6/backEnd.overBright ); } else { - qglColor3f( 0.6/backEnd.overBright, 1/backEnd.overBright, 0.1/backEnd.overBright ); + glColor3f( 0.6/backEnd.overBright, 1/backEnd.overBright, 0.1/backEnd.overBright ); } } } - qglStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); - qglDisable( GL_STENCIL_TEST ); + glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); + glDisable( GL_STENCIL_TEST ); GL_Cull( CT_TWO_SIDED ); RB_DrawShadowElementsWithCounters( tri, numIndexes ); GL_Cull( CT_FRONT_SIDED ); - qglEnable( GL_STENCIL_TEST ); + glEnable( GL_STENCIL_TEST ); return; } @@ -1147,20 +1147,20 @@ static void RB_T_Shadow( const drawSurf_t *surf ) { if ( !external ) { // "preload" the stencil buffer with the number of volumes // that get clipped by the near or far clip plane - qglStencilOp( GL_KEEP, tr.stencilDecr, tr.stencilDecr ); + glStencilOp( GL_KEEP, tr.stencilDecr, tr.stencilDecr ); GL_Cull( CT_FRONT_SIDED ); RB_DrawShadowElementsWithCounters( tri, numIndexes ); - qglStencilOp( GL_KEEP, tr.stencilIncr, tr.stencilIncr ); + glStencilOp( GL_KEEP, tr.stencilIncr, tr.stencilIncr ); GL_Cull( CT_BACK_SIDED ); RB_DrawShadowElementsWithCounters( tri, numIndexes ); } // traditional depth-pass stencil shadows - qglStencilOp( GL_KEEP, GL_KEEP, tr.stencilIncr ); + glStencilOp( GL_KEEP, GL_KEEP, tr.stencilIncr ); GL_Cull( CT_FRONT_SIDED ); RB_DrawShadowElementsWithCounters( tri, numIndexes ); - qglStencilOp( GL_KEEP, GL_KEEP, tr.stencilDecr ); + glStencilOp( GL_KEEP, GL_KEEP, tr.stencilDecr ); GL_Cull( CT_BACK_SIDED ); RB_DrawShadowElementsWithCounters( tri, numIndexes ); } @@ -1185,7 +1185,7 @@ void RB_StencilShadowPass( const drawSurf_t *drawSurfs ) { RB_LogComment( "---------- RB_StencilShadowPass ----------\n" ); globalImages->BindNull(); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); // for visualizing the shadows if ( r_showShadows.GetInteger() ) { @@ -1202,14 +1202,14 @@ void RB_StencilShadowPass( const drawSurf_t *drawSurfs ) { } if ( r_shadowPolygonFactor.GetFloat() || r_shadowPolygonOffset.GetFloat() ) { - qglPolygonOffset( r_shadowPolygonFactor.GetFloat(), -r_shadowPolygonOffset.GetFloat() ); - qglEnable( GL_POLYGON_OFFSET_FILL ); + glPolygonOffset( r_shadowPolygonFactor.GetFloat(), -r_shadowPolygonOffset.GetFloat() ); + glEnable( GL_POLYGON_OFFSET_FILL ); } - qglStencilFunc( GL_ALWAYS, 1, 255 ); + glStencilFunc( GL_ALWAYS, 1, 255 ); if ( glConfig.depthBoundsTestAvailable && r_useDepthBoundsTest.GetBool() ) { - qglEnable( GL_DEPTH_BOUNDS_TEST_EXT ); + glEnable( GL_DEPTH_BOUNDS_TEST_EXT ); } RB_RenderDrawSurfChainWithFunction( drawSurfs, RB_T_Shadow ); @@ -1217,17 +1217,17 @@ void RB_StencilShadowPass( const drawSurf_t *drawSurfs ) { GL_Cull( CT_FRONT_SIDED ); if ( r_shadowPolygonFactor.GetFloat() || r_shadowPolygonOffset.GetFloat() ) { - qglDisable( GL_POLYGON_OFFSET_FILL ); + glDisable( GL_POLYGON_OFFSET_FILL ); } if ( glConfig.depthBoundsTestAvailable && r_useDepthBoundsTest.GetBool() ) { - qglDisable( GL_DEPTH_BOUNDS_TEST_EXT ); + glDisable( GL_DEPTH_BOUNDS_TEST_EXT ); } - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); + glEnableClientState( GL_TEXTURE_COORD_ARRAY ); - qglStencilFunc( GL_GEQUAL, 128, 255 ); - qglStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); + glStencilFunc( GL_GEQUAL, 128, 255 ); + glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); } @@ -1260,21 +1260,21 @@ static void RB_T_BlendLight( const drawSurf_t *surf ) { } GL_SelectTexture( 0 ); - qglTexGenfv( GL_S, GL_OBJECT_PLANE, lightProject[0].ToFloatPtr() ); - qglTexGenfv( GL_T, GL_OBJECT_PLANE, lightProject[1].ToFloatPtr() ); - qglTexGenfv( GL_Q, GL_OBJECT_PLANE, lightProject[2].ToFloatPtr() ); + glTexGenfv( GL_S, GL_OBJECT_PLANE, lightProject[0].ToFloatPtr() ); + glTexGenfv( GL_T, GL_OBJECT_PLANE, lightProject[1].ToFloatPtr() ); + glTexGenfv( GL_Q, GL_OBJECT_PLANE, lightProject[2].ToFloatPtr() ); GL_SelectTexture( 1 ); - qglTexGenfv( GL_S, GL_OBJECT_PLANE, lightProject[3].ToFloatPtr() ); + glTexGenfv( GL_S, GL_OBJECT_PLANE, lightProject[3].ToFloatPtr() ); } // this gets used for both blend lights and shadow draws if ( tri->ambientCache ) { idDrawVert *ac = (idDrawVert *)vertexCache.Position( tri->ambientCache ); - qglVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->xyz.ToFloatPtr() ); + glVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->xyz.ToFloatPtr() ); } else if ( tri->shadowCache ) { shadowCache_t *sc = (shadowCache_t *)vertexCache.Position( tri->shadowCache ); - qglVertexPointer( 3, GL_FLOAT, sizeof( shadowCache_t ), sc->xyz.ToFloatPtr() ); + glVertexPointer( 3, GL_FLOAT, sizeof( shadowCache_t ), sc->xyz.ToFloatPtr() ); } RB_DrawElementsWithCounters( tri ); @@ -1308,17 +1308,17 @@ static void RB_BlendLight( const drawSurf_t *drawSurfs, const drawSurf_t *drawS // texture 1 will get the falloff texture GL_SelectTexture( 1 ); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - qglEnable( GL_TEXTURE_GEN_S ); - qglTexCoord2f( 0, 0.5 ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glEnable( GL_TEXTURE_GEN_S ); + glTexCoord2f( 0, 0.5 ); backEnd.vLight->falloffImage->Bind(); // texture 0 will get the projected texture GL_SelectTexture( 0 ); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - qglEnable( GL_TEXTURE_GEN_S ); - qglEnable( GL_TEXTURE_GEN_T ); - qglEnable( GL_TEXTURE_GEN_Q ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glEnable( GL_TEXTURE_GEN_S ); + glEnable( GL_TEXTURE_GEN_T ); + glEnable( GL_TEXTURE_GEN_Q ); for ( i = 0 ; i < lightShader->GetNumStages() ; i++ ) { stage = lightShader->GetStage(i); @@ -1341,27 +1341,27 @@ static void RB_BlendLight( const drawSurf_t *drawSurfs, const drawSurf_t *drawS backEnd.lightColor[1] = regs[ stage->color.registers[1] ]; backEnd.lightColor[2] = regs[ stage->color.registers[2] ]; backEnd.lightColor[3] = regs[ stage->color.registers[3] ]; - qglColor4fv( backEnd.lightColor ); + glColor4fv( backEnd.lightColor ); RB_RenderDrawSurfChainWithFunction( drawSurfs, RB_T_BlendLight ); RB_RenderDrawSurfChainWithFunction( drawSurfs2, RB_T_BlendLight ); if ( stage->texture.hasMatrix ) { GL_SelectTexture( 0 ); - qglMatrixMode( GL_TEXTURE ); - qglLoadIdentity(); - qglMatrixMode( GL_MODELVIEW ); + glMatrixMode( GL_TEXTURE ); + glLoadIdentity(); + glMatrixMode( GL_MODELVIEW ); } } GL_SelectTexture( 1 ); - qglDisable( GL_TEXTURE_GEN_S ); + glDisable( GL_TEXTURE_GEN_S ); globalImages->BindNull(); GL_SelectTexture( 0 ); - qglDisable( GL_TEXTURE_GEN_S ); - qglDisable( GL_TEXTURE_GEN_T ); - qglDisable( GL_TEXTURE_GEN_Q ); + glDisable( GL_TEXTURE_GEN_S ); + glDisable( GL_TEXTURE_GEN_T ); + glDisable( GL_TEXTURE_GEN_Q ); } @@ -1383,22 +1383,22 @@ static void RB_T_BasicFog( const drawSurf_t *surf ) { R_GlobalPlaneToLocal( surf->space->modelMatrix, fogPlanes[0], local ); local[3] += 0.5; - qglTexGenfv( GL_S, GL_OBJECT_PLANE, local.ToFloatPtr() ); + glTexGenfv( GL_S, GL_OBJECT_PLANE, local.ToFloatPtr() ); // R_GlobalPlaneToLocal( surf->space->modelMatrix, fogPlanes[1], local ); // local[3] += 0.5; local[0] = local[1] = local[2] = 0; local[3] = 0.5; - qglTexGenfv( GL_T, GL_OBJECT_PLANE, local.ToFloatPtr() ); + glTexGenfv( GL_T, GL_OBJECT_PLANE, local.ToFloatPtr() ); GL_SelectTexture( 1 ); // GL_S is constant per viewer R_GlobalPlaneToLocal( surf->space->modelMatrix, fogPlanes[2], local ); local[3] += FOG_ENTER; - qglTexGenfv( GL_T, GL_OBJECT_PLANE, local.ToFloatPtr() ); + glTexGenfv( GL_T, GL_OBJECT_PLANE, local.ToFloatPtr() ); R_GlobalPlaneToLocal( surf->space->modelMatrix, fogPlanes[3], local ); - qglTexGenfv( GL_S, GL_OBJECT_PLANE, local.ToFloatPtr() ); + glTexGenfv( GL_S, GL_OBJECT_PLANE, local.ToFloatPtr() ); } RB_T_RenderTriangleSurface( surf ); @@ -1443,7 +1443,7 @@ static void RB_FogPass( const drawSurf_t *drawSurfs, const drawSurf_t *drawSurf backEnd.lightColor[2] = regs[ stage->color.registers[2] ]; backEnd.lightColor[3] = regs[ stage->color.registers[3] ]; - qglColor3fv( backEnd.lightColor ); + glColor3fv( backEnd.lightColor ); // calculate the falloff planes float a; @@ -1462,10 +1462,10 @@ static void RB_FogPass( const drawSurf_t *drawSurfs, const drawSurf_t *drawSurf GL_SelectTexture( 0 ); globalImages->fogImage->Bind(); //GL_Bind( tr.whiteImage ); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - qglEnable( GL_TEXTURE_GEN_S ); - qglEnable( GL_TEXTURE_GEN_T ); - qglTexCoord2f( 0.5f, 0.5f ); // make sure Q is set + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glEnable( GL_TEXTURE_GEN_S ); + glEnable( GL_TEXTURE_GEN_T ); + glTexCoord2f( 0.5f, 0.5f ); // make sure Q is set fogPlanes[0][0] = a * backEnd.viewDef->worldSpace.modelViewMatrix[2]; fogPlanes[0][1] = a * backEnd.viewDef->worldSpace.modelViewMatrix[6]; @@ -1481,9 +1481,9 @@ static void RB_FogPass( const drawSurf_t *drawSurfs, const drawSurf_t *drawSurf // texture 1 is the entering plane fade correction GL_SelectTexture( 1 ); globalImages->fogEnterImage->Bind(); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - qglEnable( GL_TEXTURE_GEN_S ); - qglEnable( GL_TEXTURE_GEN_T ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glEnable( GL_TEXTURE_GEN_S ); + glEnable( GL_TEXTURE_GEN_T ); // T will get a texgen for the fade plane, which is always the "top" plane on unrotated lights fogPlanes[2][0] = 0.001f * backEnd.vLight->fogPlane[0]; @@ -1499,7 +1499,7 @@ static void RB_FogPass( const drawSurf_t *drawSurfs, const drawSurf_t *drawSurf fogPlanes[3][2] = 0; fogPlanes[3][3] = FOG_ENTER + s; - qglTexCoord2f( FOG_ENTER + s, FOG_ENTER ); + glTexCoord2f( FOG_ENTER + s, FOG_ENTER ); // draw it @@ -1514,13 +1514,13 @@ static void RB_FogPass( const drawSurf_t *drawSurfs, const drawSurf_t *drawSurf GL_Cull( CT_FRONT_SIDED ); GL_SelectTexture( 1 ); - qglDisable( GL_TEXTURE_GEN_S ); - qglDisable( GL_TEXTURE_GEN_T ); + glDisable( GL_TEXTURE_GEN_S ); + glDisable( GL_TEXTURE_GEN_T ); globalImages->BindNull(); GL_SelectTexture( 0 ); - qglDisable( GL_TEXTURE_GEN_S ); - qglDisable( GL_TEXTURE_GEN_T ); + glDisable( GL_TEXTURE_GEN_S ); + glDisable( GL_TEXTURE_GEN_T ); } @@ -1540,7 +1540,7 @@ void RB_STD_FogAllLights( void ) { RB_LogComment( "---------- RB_STD_FogAllLights ----------\n" ); - qglDisable( GL_STENCIL_TEST ); + glDisable( GL_STENCIL_TEST ); for ( vLight = backEnd.viewDef->viewLights ; vLight ; vLight = vLight->next ) { backEnd.vLight = vLight; @@ -1556,21 +1556,21 @@ void RB_STD_FogAllLights( void ) { // units from the origin backEnd.currentScissor = vLight->scissorRect; if ( r_useScissor.GetBool() ) { - qglScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, + glScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, backEnd.viewDef->viewport.y1 + backEnd.currentScissor.y1, backEnd.currentScissor.x2 + 1 - backEnd.currentScissor.x1, backEnd.currentScissor.y2 + 1 - backEnd.currentScissor.y1 ); } - qglClear( GL_STENCIL_BUFFER_BIT ); + glClear( GL_STENCIL_BUFFER_BIT ); - qglEnable( GL_STENCIL_TEST ); + glEnable( GL_STENCIL_TEST ); // only pass on the cleared stencil values - qglStencilFunc( GL_EQUAL, 128, 255 ); + glStencilFunc( GL_EQUAL, 128, 255 ); // when we pass the stencil test and depth test and are going to draw, // increment the stencil buffer so we don't ever draw on that pixel again - qglStencilOp( GL_KEEP, GL_KEEP, GL_INCR ); + glStencilOp( GL_KEEP, GL_KEEP, GL_INCR ); } #endif @@ -1579,10 +1579,10 @@ void RB_STD_FogAllLights( void ) { } else if ( vLight->lightShader->IsBlendLight() ) { RB_BlendLight( vLight->globalInteractions, vLight->localInteractions ); } - qglDisable( GL_STENCIL_TEST ); + glDisable( GL_STENCIL_TEST ); } - qglEnable( GL_STENCIL_TEST ); + glEnable( GL_STENCIL_TEST ); } //========================================================================================= @@ -1610,7 +1610,7 @@ void RB_STD_LightScale( void ) { // the scissor may be smaller than the viewport for subviews if ( r_useScissor.GetBool() ) { - qglScissor( backEnd.viewDef->viewport.x1 + backEnd.viewDef->scissor.x1, + glScissor( backEnd.viewDef->viewport.x1 + backEnd.viewDef->scissor.x1, backEnd.viewDef->viewport.y1 + backEnd.viewDef->scissor.y1, backEnd.viewDef->scissor.x2 - backEnd.viewDef->scissor.x1 + 1, backEnd.viewDef->scissor.y2 - backEnd.viewDef->scissor.y1 + 1 ); @@ -1618,17 +1618,17 @@ void RB_STD_LightScale( void ) { } // full screen blends - qglLoadIdentity(); - qglMatrixMode( GL_PROJECTION ); - qglPushMatrix(); - qglLoadIdentity(); - qglOrtho( 0, 1, 0, 1, -1, 1 ); + glLoadIdentity(); + glMatrixMode( GL_PROJECTION ); + glPushMatrix(); + glLoadIdentity(); + glOrtho( 0, 1, 0, 1, -1, 1 ); GL_State( GLS_SRCBLEND_DST_COLOR | GLS_DSTBLEND_SRC_COLOR ); GL_Cull( CT_TWO_SIDED ); // so mirror views also get it globalImages->BindNull(); - qglDisable( GL_DEPTH_TEST ); - qglDisable( GL_STENCIL_TEST ); + glDisable( GL_DEPTH_TEST ); + glDisable( GL_STENCIL_TEST ); v = 1; while ( idMath::Fabs( v - backEnd.overBright ) > 0.01 ) { // a little extra slop @@ -1637,21 +1637,21 @@ void RB_STD_LightScale( void ) { if ( f > 1 ) { f = 1; } - qglColor3f( f, f, f ); + glColor3f( f, f, f ); v = v * f * 2; - qglBegin( GL_QUADS ); - qglVertex2f( 0,0 ); - qglVertex2f( 0,1 ); - qglVertex2f( 1,1 ); - qglVertex2f( 1,0 ); - qglEnd(); + glBegin( GL_QUADS ); + glVertex2f( 0,0 ); + glVertex2f( 0,1 ); + glVertex2f( 1,1 ); + glVertex2f( 1,0 ); + glEnd(); } - qglPopMatrix(); - qglEnable( GL_DEPTH_TEST ); - qglMatrixMode( GL_MODELVIEW ); + glPopMatrix(); + glEnable( GL_DEPTH_TEST ); + glMatrixMode( GL_MODELVIEW ); GL_Cull( CT_FRONT_SIDED ); } @@ -1685,26 +1685,10 @@ void RB_STD_DrawView( void ) { RB_STD_FillDepthBuffer( drawSurfs, numDrawSurfs ); // main light renderer - switch( tr.backEndRenderer ) { - case BE_ARB: - RB_ARB_DrawInteractions(); - break; - case BE_ARB2: - RB_ARB2_DrawInteractions(); - break; - case BE_NV20: - RB_NV20_DrawInteractions(); - break; - case BE_NV10: - RB_NV10_DrawInteractions(); - break; - case BE_R200: - RB_R200_DrawInteractions(); - break; - } + RB_ARB2_DrawInteractions(); // disable stencil shadow test - qglStencilFunc( GL_ALWAYS, 128, 255 ); + glStencilFunc( GL_ALWAYS, 128, 255 ); // uplight the entire screen to crutch up not having better blending range RB_STD_LightScale(); diff --git a/src/renderer/draw_exp.cpp b/src/renderer/draw_exp.cpp deleted file mode 100644 index 708b9c3b..00000000 --- a/src/renderer/draw_exp.cpp +++ /dev/null @@ -1,2618 +0,0 @@ -/* -=========================================================================== - -Doom 3 GPL Source Code -Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. - -This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?). - -Doom 3 Source Code is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Doom 3 Source Code is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Doom 3 Source Code. If not, see . - -In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below. - -If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. - -=========================================================================== -*/ - -#include "../idlib/precompiled.h" -#pragma hdrstop - -#include "tr_local.h" -#include "../sys/win32/win_local.h" - -/* - -strictly experimental / research codepaths - -!!!if we use front facing occluders, we can portal flow from light centers - -try depth_component_16 rendering - -do we care about portals from light perspective? back / front face issues. - -how do we do weapon depth hacks with shadow buffers? - distort their world space vertexes instead of offsetting their depth? - -jittering off the side of a projection will give wrong shadows - -really huge lights, like sunlight, are going to be problematic with fixed projections - we could tile the projections and let the auto-resize cut them down as necessary - -It sucks that depth buffers are non-linear, because the bias and compares change with distance - -polygon offset factor causes occasional texture holes from highly angled textures - -*/ - -static bool initialized; - -static int lightBufferSize = 1024; -static int maxLightBufferSize = 1024; -static float lightBufferSizeFraction = 0.5; - -static int viewBufferSize = 1024; -static int viewBufferHeight = 768; -static int maxViewBufferSize = 1024; -static float viewBufferSizeFraction = 0.5; -static float viewBufferHeightFraction = 0.5; -static bool nativeViewBuffer = false; // true if viewBufferSize is the viewport width - -static HPBUFFERARB floatPbuffer; -static HDC floatPbufferDC; -static idImage *floatPbufferImage; - -static HPBUFFERARB floatPbuffer2; -static HDC floatPbuffer2DC; -static idImage *floatPbuffer2Image; - -static HPBUFFERARB floatPbufferQuarter; -static HDC floatPbufferQuarterDC; -static idImage *floatPbufferQuarterImage; - -static HGLRC floatContext; - -static HPBUFFERARB shadowPbuffer; -static HDC shadowPbufferDC; - -static HPBUFFERARB viewPbuffer; -static HDC viewPbufferDC; - -static idImage *shadowImage[3]; - -static idImage *viewDepthImage; -static idImage *viewAlphaImage; - -static idImage *viewShadowImage; - -static idImage *jitterImage16; -static idImage *jitterImage4; -static idImage *jitterImage1; - -static idImage *random256Image; - -static int shadowVertexProgram; -static int shadowFragmentProgram16; -static int shadowFragmentProgram4; -static int shadowFragmentProgram1; -static int shadowFragmentProgram0; - -static int screenSpaceShadowVertexProgram; -static int screenSpaceShadowFragmentProgram16; -static int screenSpaceShadowFragmentProgram4; -static int screenSpaceShadowFragmentProgram1; -static int screenSpaceShadowFragmentProgram0; - -static int depthMidpointVertexProgram; -static int depthMidpointFragmentProgram; - -static int shadowResampleVertexProgram; -static int shadowResampleFragmentProgram; - -static int gammaDitherVertexProgram; -static int gammaDitherFragmentProgram; - -static int downSampleVertexProgram; -static int downSampleFragmentProgram; - -static int bloomVertexProgram; -static int bloomFragmentProgram; - -static float viewLightAxialSize; - -idCVar r_sb_lightResolution( "r_sb_lightResolution", "1024", CVAR_RENDERER | CVAR_INTEGER, "Pixel dimensions for each shadow buffer, 64 - 2048" ); -idCVar r_sb_viewResolution( "r_sb_viewResolution", "1024", CVAR_RENDERER | CVAR_INTEGER, "Width of screen space shadow sampling" ); -idCVar r_sb_noShadows( "r_sb_noShadows", "0", CVAR_RENDERER | CVAR_BOOL, "don't draw any occluders" ); -idCVar r_sb_usePbuffer( "r_sb_usePbuffer", "1", CVAR_RENDERER | CVAR_BOOL, "draw offscreen" ); -idCVar r_sb_jitterScale( "r_sb_jitterScale", "0.006", CVAR_RENDERER | CVAR_FLOAT, "scale factor for jitter offset" ); -idCVar r_sb_biasScale( "r_sb_biasScale", "0.0001", CVAR_RENDERER | CVAR_FLOAT, "scale factor for jitter bias" ); -idCVar r_sb_samples( "r_sb_samples", "4", CVAR_RENDERER | CVAR_INTEGER, "0, 1, 4, or 16" ); -idCVar r_sb_randomize( "r_sb_randomize", "1", CVAR_RENDERER | CVAR_BOOL, "randomly offset jitter texture each draw" ); -// polyOfsFactor causes holes in low res images -idCVar r_sb_polyOfsFactor( "r_sb_polyOfsFactor", "2", CVAR_RENDERER | CVAR_FLOAT, "polygonOffset factor for drawing shadow buffer" ); -idCVar r_sb_polyOfsUnits( "r_sb_polyOfsUnits", "3000", CVAR_RENDERER | CVAR_FLOAT, "polygonOffset units for drawing shadow buffer" ); -idCVar r_sb_occluderFacing( "r_sb_occluderFacing", "0", CVAR_RENDERER | CVAR_INTEGER, "0 = front faces, 1 = back faces, 2 = midway between" ); -// r_sb_randomizeBufferOrientation? - -idCVar r_sb_frustomFOV( "r_sb_frustomFOV", "92", CVAR_RENDERER | CVAR_FLOAT, "oversize FOV for point light side matching" ); -idCVar r_sb_showFrustumPixels( "r_sb_showFrustumPixels", "0", CVAR_RENDERER | CVAR_BOOL, "color the pixels contained in the frustum" ); -idCVar r_sb_singleSide( "r_sb_singleSide", "-1", CVAR_RENDERER | CVAR_INTEGER, "only draw a single side (0-5) of point lights" ); -idCVar r_sb_useCulling( "r_sb_useCulling", "1", CVAR_RENDERER | CVAR_BOOL, "cull geometry to individual side frustums" ); -idCVar r_sb_linearFilter( "r_sb_linearFilter", "1", CVAR_RENDERER | CVAR_BOOL, "use GL_LINEAR instead of GL_NEAREST on shadow maps" ); - -idCVar r_sb_screenSpaceShadow( "r_sb_screenSpaceShadow", "1", CVAR_RENDERER | CVAR_BOOL, "build shadows in screen space instead of on surfaces" ); - -idCVar r_hdr_useFloats( "r_hdr_useFloats", "0", CVAR_RENDERER | CVAR_BOOL, "use a floating point rendering buffer" ); -idCVar r_hdr_exposure( "r_hdr_exposure", "1.0", CVAR_RENDERER | CVAR_FLOAT, "maximum light scale" ); -idCVar r_hdr_bloomFraction( "r_hdr_bloomFraction", "0.1", CVAR_RENDERER | CVAR_FLOAT, "fraction to smear across neighbors" ); -idCVar r_hdr_gamma( "r_hdr_gamma", "1", CVAR_RENDERER | CVAR_FLOAT, "monitor gamma power" ); -idCVar r_hdr_monitorDither( "r_hdr_monitorDither", "0.01", CVAR_RENDERER | CVAR_FLOAT, "random dither in monitor space" ); - -// from world space to light origin, looking down the X axis -static float unflippedLightMatrix[16]; - -// from world space to OpenGL view space, looking down the negative Z axis -static float lightMatrix[16]; - -// from OpenGL view space to OpenGL NDC ( -1 : 1 in XYZ ) -static float lightProjectionMatrix[16]; - - -void RB_ARB2_DrawInteraction( const drawInteraction_t *din ); - -typedef struct { - const char *name; - int num; -} wglString_t; - -wglString_t wglString[] = { -{ "WGL_NUMBER_PIXEL_FORMATS_ARB", 0x2000 }, -{ "WGL_DRAW_TO_WINDOW_ARB", 0x2001 }, -{ "WGL_DRAW_TO_BITMAP_ARB", 0x2002 }, -{ "WGL_ACCELERATION_ARB", 0x2003 }, -{ "WGL_NEED_PALETTE_ARB", 0x2004 }, -{ "WGL_NEED_SYSTEM_PALETTE_ARB", 0x2005 }, -{ "WGL_SWAP_LAYER_BUFFERS_ARB", 0x2006 }, -{ "WGL_SWAP_METHOD_ARB", 0x2007 }, -{ "WGL_NUMBER_OVERLAYS_ARB", 0x2008 }, -{ "WGL_NUMBER_UNDERLAYS_ARB", 0x2009 }, -{ "WGL_TRANSPARENT_ARB", 0x200A }, -{ "WGL_TRANSPARENT_RED_VALUE_ARB", 0x2037 }, -{ "WGL_TRANSPARENT_GREEN_VALUE_ARB", 0x2038 }, -{ "WGL_TRANSPARENT_BLUE_VALUE_ARB", 0x2039 }, -{ "WGL_TRANSPARENT_ALPHA_VALUE_ARB", 0x203A }, -{ "WGL_TRANSPARENT_INDEX_VALUE_ARB", 0x203B }, -{ "WGL_SHARE_DEPTH_ARB", 0x200C }, -{ "WGL_SHARE_STENCIL_ARB", 0x200D }, -{ "WGL_SHARE_ACCUM_ARB", 0x200E }, -{ "WGL_SUPPORT_GDI_ARB", 0x200F }, -{ "WGL_SUPPORT_OPENGL_ARB", 0x2010 }, -{ "WGL_DOUBLE_BUFFER_ARB", 0x2011 }, -{ "WGL_STEREO_ARB", 0x2012 }, -{ "WGL_PIXEL_TYPE_ARB", 0x2013 }, -{ "WGL_COLOR_BITS_ARB", 0x2014 }, -{ "WGL_RED_BITS_ARB", 0x2015 }, -{ "WGL_RED_SHIFT_ARB", 0x2016 }, -{ "WGL_GREEN_BITS_ARB", 0x2017 }, -{ "WGL_GREEN_SHIFT_ARB", 0x2018 }, -{ "WGL_BLUE_BITS_ARB", 0x2019 }, -{ "WGL_BLUE_SHIFT_ARB", 0x201A }, -{ "WGL_ALPHA_BITS_ARB", 0x201B }, -{ "WGL_ALPHA_SHIFT_ARB", 0x201C }, -{ "WGL_ACCUM_BITS_ARB", 0x201D }, -{ "WGL_ACCUM_RED_BITS_ARB", 0x201E }, -{ "WGL_ACCUM_GREEN_BITS_ARB", 0x201F }, -{ "WGL_ACCUM_BLUE_BITS_ARB", 0x2020 }, -{ "WGL_ACCUM_ALPHA_BITS_ARB", 0x2021 }, -{ "WGL_DEPTH_BITS_ARB", 0x2022 }, -{ "WGL_STENCIL_BITS_ARB", 0x2023 }, -{ "WGL_AUX_BUFFERS_ARB", 0x2024 }, - -{ "WGL_NO_ACCELERATION_ARB", 0x2025 }, -{ "WGL_GENERIC_ACCELERATION_ARB", 0x2026 }, -{ "WGL_FULL_ACCELERATION_ARB", 0x2027 }, - -{ "WGL_SWAP_EXCHANGE_ARB", 0x2028 }, -{ "WGL_SWAP_COPY_ARB", 0x2029 }, -{ "WGL_SWAP_UNDEFINED_ARB", 0x202A }, - -{ "WGL_TYPE_RGBA_ARB", 0x202B }, -{ "WGL_TYPE_COLORINDEX_ARB", 0x202C }, -}; - -static const int NUM_WGL_STRINGS = sizeof( wglString ) / sizeof( wglString[0] ); - -static void R_CheckWglErrors( void ) { - int err = GetLastError(); - char *name; - -#if 0 - LPVOID lpMsgBuf; - FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - err, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (LPTSTR) &lpMsgBuf, - 0, - NULL - ); -#endif - err &= 0xffff; - switch ( err ) { - case 13: name = "ERROR_INVALID_DATA"; break; - case 6: name = "ERROR_INVALID_HANDLE"; break; - case 4317: name = "ERROR_INVALID_OPERATION"; break; - default: name = va( "code %i", err ); break; - } - - common->Printf( "GetLastError: %s\n", name ); -} - -static void R_MakeCurrent( HDC dc, HGLRC context, HPBUFFERARB pbuffer ) { - if ( pbuffer ) { - if ( !wglReleaseTexImageARB( pbuffer, WGL_FRONT_LEFT_ARB ) ) { - R_CheckWglErrors(); - common->Error( "wglReleaseTexImageARB failed" ); - } - } - if ( !qwglMakeCurrent( dc, context ) ) { - R_CheckWglErrors(); - common->FatalError( "qwglMakeCurrent failed" ); - } -} - -static void R_BindTexImage( HPBUFFERARB pbuffer ) { - if ( !wglReleaseTexImageARB( pbuffer, WGL_FRONT_LEFT_ARB ) ) { - R_CheckWglErrors(); - common->Error( "wglReleaseTexImageARB failed" ); - } - if ( !wglBindTexImageARB( pbuffer, WGL_FRONT_LEFT_ARB ) ) { - R_CheckWglErrors(); - common->Error( "failed wglBindTexImageARB" ); - } -} - -static void R_ReportTextureParms( void ) { - int parms[8]; - -// q glGetTexParameteriv( GL_TEXTURE_RECTANGLE_NV, - qglGetIntegerv( GL_TEXTURE_BINDING_RECTANGLE_NV, parms ); - -} - -/* -==================== -RB_CreateBloomTable -==================== -*/ -static const int BLOOM_RADIUS = 8; -static void RB_CreateBloomTable( void ) { - float bloom[BLOOM_RADIUS]; - float total = 0; - - // gaussian - float stdDev = 2.0; - for ( int i = 0 ; i < BLOOM_RADIUS ; i++ ) { - float f = (float)i / stdDev; - bloom[i] = exp( -0.5 * f * f ); - total += bloom[i]; - } - - total = ( total - bloom[0] ) * 2 + bloom[0]; - - // normalize to 1.0 contribution, so a full row or column will equal 1.0 - for ( int i = 0 ; i < BLOOM_RADIUS ; i++ ) { - bloom[i] *= 1.0 / total; - common->Printf( "PARAM bloom%i = { %f };\n", i, bloom[i] ); - } - -} - -/* -==================== -GL_SelectTextureNoClient -==================== -*/ -static void GL_SelectTextureNoClient( int unit ) { - backEnd.glState.currenttmu = unit; - qglActiveTextureARB( GL_TEXTURE0_ARB + unit ); - RB_LogComment( "glActiveTextureARB( %i )\n", unit ); -} - - -/* -================ -R_CreateShadowBufferImage - -================ -*/ -static void R_CreateShadowBufferImage( idImage *image ) { - byte *data = (byte *)Mem_Alloc( lightBufferSize*lightBufferSize ); - - memset( data, 0, lightBufferSize*lightBufferSize ); - - image->GenerateImage( (byte *)data, 4, 4, - TF_LINEAR, false, TR_CLAMP_TO_BORDER, TD_HIGH_QUALITY ); - - // now reset it to a shadow depth image - GL_CheckErrors(); - image->uploadWidth = image->uploadHeight = lightBufferSize; - qglTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24_ARB, lightBufferSize, lightBufferSize, - 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, data ); - - qglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE ); -// qglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE ); - qglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL ); - - // explicit zero depth border - float color[4]; - color[0] = color[1] = color[2] = color[3] = 0; - qglTexParameterfv( GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, color ); - - GL_CheckErrors(); - - Mem_Free( data ); -} - -static void R_CreateViewAlphaImage( idImage *image ) { - int c = viewBufferSize*viewBufferSize*4; - byte *data = (byte *)Mem_Alloc( c ); - - // don't let it pick an intensity format - for ( int i = 0 ; i < c ; i++ ) { - data[i] = i; - } - memset( data, 0, viewBufferSize*viewBufferSize ); - - image->GenerateImage( (byte *)data, viewBufferSize, viewBufferSize, - TF_LINEAR, false, TR_CLAMP, TD_HIGH_QUALITY ); -} - -static void R_CreateStubImage( idImage *image ) { - float data[3][4][4]; - - // generate the texture number - qglGenTextures( 1, &image->texnum ); - qglBindTexture( GL_TEXTURE_RECTANGLE_NV, image->texnum ); - memset( data, 0, sizeof( data ) ); - glTexImage2D( GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_RGBA16_NV, 4, 3, 0, GL_RGBA, GL_FLOAT, &data ); -} - -/* -================ -R_CreateJitterImage - -================ -*/ -const static int JITTER_SIZE = 128; -static void R_CreateJitterImage16( idImage *image ) { - byte data[JITTER_SIZE][JITTER_SIZE*16][4]; - - for ( int i = 0 ; i < JITTER_SIZE ; i++ ) { - for ( int s = 0 ; s < 16 ; s++ ) { - int sOfs = 64 * ( s & 3 ); - int tOfs = 64 * ( ( s >> 2 ) & 3 ); - - for ( int j = 0 ; j < JITTER_SIZE ; j++ ) { - data[i][s*JITTER_SIZE+j][0] = (rand() & 63 ) | sOfs; - data[i][s*JITTER_SIZE+j][1] = (rand() & 63 ) | tOfs; - data[i][s*JITTER_SIZE+j][2] = rand(); - data[i][s*JITTER_SIZE+j][3] = 0; - } - } - } - - image->GenerateImage( (byte *)data, JITTER_SIZE*16, JITTER_SIZE, - TF_NEAREST, false, TR_REPEAT, TD_HIGH_QUALITY ); -} - -static void R_CreateJitterImage4( idImage *image ) { - byte data[JITTER_SIZE][JITTER_SIZE*4][4]; - - for ( int i = 0 ; i < JITTER_SIZE ; i++ ) { - for ( int s = 0 ; s < 4 ; s++ ) { - int sOfs = 128 * ( s & 1 ); - int tOfs = 128 * ( ( s >> 1 ) & 1 ); - - for ( int j = 0 ; j < JITTER_SIZE ; j++ ) { - data[i][s*JITTER_SIZE+j][0] = (rand() & 127 ) | sOfs; - data[i][s*JITTER_SIZE+j][1] = (rand() & 127 ) | tOfs; - data[i][s*JITTER_SIZE+j][2] = rand(); - data[i][s*JITTER_SIZE+j][3] = 0; - } - } - } - - image->GenerateImage( (byte *)data, JITTER_SIZE*4, JITTER_SIZE, - TF_NEAREST, false, TR_REPEAT, TD_HIGH_QUALITY ); -} - -static void R_CreateJitterImage1( idImage *image ) { - byte data[JITTER_SIZE][JITTER_SIZE][4]; - - for ( int i = 0 ; i < JITTER_SIZE ; i++ ) { - for ( int j = 0 ; j < JITTER_SIZE ; j++ ) { - data[i][j][0] = rand(); - data[i][j][1] = rand(); - data[i][j][2] = rand(); - data[i][j][3] = 0; - } - } - - image->GenerateImage( (byte *)data, JITTER_SIZE, JITTER_SIZE, - TF_NEAREST, false, TR_REPEAT, TD_HIGH_QUALITY ); -} - -static void R_CreateRandom256Image( idImage *image ) { - byte data[256][256][4]; - - for ( int i = 0 ; i < 256 ; i++ ) { - for ( int j = 0 ; j < 256 ; j++ ) { - data[i][j][0] = rand(); - data[i][j][1] = rand(); - data[i][j][2] = rand(); - data[i][j][3] = rand(); - } - } - - image->GenerateImage( (byte *)data, 256, 256, - TF_NEAREST, false, TR_REPEAT, TD_HIGH_QUALITY ); -} - - -/* -================== -R_PrintPixelFormat -================== -*/ -void R_PrintPixelFormat( int pixelFormat ) { - int res; - int iAttribute; - int iValue; - - common->Printf( "----- pixelFormat %i -----\n", pixelFormat ); - - for ( int i = 1 ; i < NUM_WGL_STRINGS ; i++ ) { - iAttribute = wglString[i].num; - res = wglGetPixelFormatAttribivARB( win32.hDC, pixelFormat, 0, 1, &iAttribute, &iValue ); - if ( res && iValue ) { - common->Printf( "%s : %i\n", wglString[i].name, iValue ); - } - } -} - - -/* -================== -R_Exp_Allocate -================== -*/ -void R_Exp_Allocate( void ) { - // find a pixel format for our floating point pbuffer - int iAttributes[NUM_WGL_STRINGS*2], *atr_p; - FLOAT fAttributes[] = {0, 0}; - UINT numFormats; - int pixelformats[1024]; - int ret; - int pbiAttributes[] = {0, 0}; - - initialized = true; - -#if 1 - // - // allocate the floating point rendering buffer - // - atr_p = iAttributes; - - *atr_p++ = WGL_DRAW_TO_PBUFFER_ARB; - *atr_p++ = TRUE; - *atr_p++ = WGL_FLOAT_COMPONENTS_NV; - *atr_p++ = TRUE; - *atr_p++ = WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV; - *atr_p++ = TRUE; -// *atr_p++ = WGL_BIND_TO_TEXTURE_RGBA_ARB; -// *atr_p++ = TRUE; - *atr_p++ = WGL_DEPTH_BITS_ARB; - *atr_p++ = 24; - *atr_p++ = WGL_STENCIL_BITS_ARB; - *atr_p++ = 8; - *atr_p++ = 0; - *atr_p++ = 0; - - ret = wglChoosePixelFormatARB( win32.hDC, iAttributes, fAttributes, - sizeof( pixelformats ) / sizeof( pixelformats[0] ), pixelformats, &numFormats ); - -#if 0 - for ( int i = 0 ; i < (int)numFormats ; i++ ) { - R_PrintPixelFormat( pixelformats[i] ); - } -#endif - common->Printf( "\nfloatPbuffer:\n" ); - R_PrintPixelFormat( pixelformats[0] ); - - // allocate a pbuffer with this pixel format - int pbiAttributesTexture[] = { - WGL_TEXTURE_FORMAT_ARB, WGL_TEXTURE_FLOAT_RGBA_NV, - WGL_TEXTURE_TARGET_ARB, WGL_TEXTURE_RECTANGLE_NV, // WGL_TEXTURE_2D_ARB, - 0, 0}; - - floatPbuffer = wglCreatePbufferARB( win32.hDC, pixelformats[0], glConfig.vidWidth, - glConfig.vidHeight, pbiAttributesTexture ); - if ( !floatPbuffer ) { - common->Printf( "failed to create floatPbuffer.\n" ); - GL_CheckErrors(); - } - floatPbufferDC = wglGetPbufferDCARB( floatPbuffer ); - floatPbufferImage = globalImages->ImageFromFunction( "_floatPbuffer", R_CreateStubImage ); - - // create a second buffer for ping-pong operations - floatPbuffer2 = wglCreatePbufferARB( win32.hDC, pixelformats[0], glConfig.vidWidth, - glConfig.vidHeight, pbiAttributesTexture ); - if ( !floatPbuffer2 ) { - common->Printf( "failed to create floatPbuffer.\n" ); - GL_CheckErrors(); - } - floatPbuffer2DC = wglGetPbufferDCARB( floatPbuffer2 ); - floatPbuffer2Image = globalImages->ImageFromFunction( "_floatPbuffer2", R_CreateStubImage ); - - // create a third buffer for down sampling operations - floatPbufferQuarter = wglCreatePbufferARB( win32.hDC, pixelformats[0], glConfig.vidWidth / 4, - glConfig.vidHeight / 4, pbiAttributesTexture ); - if ( !floatPbufferQuarter ) { - common->Printf( "failed to create floatPbuffer.\n" ); - GL_CheckErrors(); - } - floatPbufferQuarterDC = wglGetPbufferDCARB( floatPbufferQuarter ); - floatPbufferQuarterImage = globalImages->ImageFromFunction( "floatPbufferQuarter", R_CreateStubImage ); - - // create a new GL context for this pixel format and share textures - floatContext = wglCreateContext( floatPbufferDC ); - if ( !floatContext ) { - common->Printf( "failed to create context for floatPbufferDC.\n" ); - GL_CheckErrors(); - } - - if ( !wglShareLists( floatContext, win32.hGLRC ) ) { - common->Printf( "failed to share lists.\n" ); - } - - // create a rendering context for this pixel format and share textures - - // allocate a texture for the rendering - -#endif - - //================================================================================= - - // - // allocate the shadow pbuffer - // - atr_p = iAttributes; - - *atr_p++ = WGL_DRAW_TO_PBUFFER_ARB; - *atr_p++ = TRUE; - *atr_p++ = WGL_RED_BITS_ARB; - *atr_p++ = 8; - *atr_p++ = WGL_GREEN_BITS_ARB; - *atr_p++ = 8; - *atr_p++ = WGL_BLUE_BITS_ARB; - *atr_p++ = 8; - *atr_p++ = WGL_ALPHA_BITS_ARB; - *atr_p++ = 8; - *atr_p++ = WGL_DEPTH_BITS_ARB; - *atr_p++ = 24; - *atr_p++ = WGL_STENCIL_BITS_ARB; - *atr_p++ = 8; - *atr_p++ = 0; - *atr_p++ = 0; - - ret = wglChoosePixelFormatARB( win32.hDC, iAttributes, fAttributes, - sizeof( pixelformats ) / sizeof( pixelformats[0] ), pixelformats, &numFormats ); -#if 0 - for ( int i = 0 ; i < (int)numFormats ; i++ ) { - R_PrintPixelFormat( pixelformats[i] ); - } -#endif - common->Printf( "\nshadowPbuffer:\n" ); - R_PrintPixelFormat( pixelformats[0] ); - -pixelformats[0] = win32.pixelformat; // forced to do this by wgl... - - //----------------------------------- - - lightBufferSize = maxLightBufferSize; - - // allocate a pbuffer with this pixel format - shadowPbuffer = wglCreatePbufferARB( win32.hDC, pixelformats[0], lightBufferSize, - lightBufferSize, pbiAttributes ); - - // allocate a rendering context for the pbuffer - shadowPbufferDC = wglGetPbufferDCARB( shadowPbuffer ); - - // generate the texture number - shadowImage[0] = globalImages->ImageFromFunction( va("_shadowBuffer%i_0",lightBufferSize), R_CreateShadowBufferImage ); - shadowImage[1] = globalImages->ImageFromFunction( va("_shadowBuffer%i_1",lightBufferSize), R_CreateShadowBufferImage ); - shadowImage[2] = globalImages->ImageFromFunction( va("_shadowBuffer%i_2",lightBufferSize), R_CreateShadowBufferImage ); - - //----------------------------------- - - lightBufferSize = maxViewBufferSize; - - // allocate a pbuffer with this pixel format - viewPbuffer = wglCreatePbufferARB( win32.hDC, pixelformats[0], maxViewBufferSize, - maxViewBufferSize, pbiAttributes ); - - // allocate a rendering context for the pbuffer - viewPbufferDC = wglGetPbufferDCARB( viewPbuffer ); - - // create the image space depth buffer for image-space shadow trnasforms - viewDepthImage = globalImages->ImageFromFunction("_viewDepth", R_CreateShadowBufferImage ); - - // create the image space shadow alpha buffer for subsampling the shadow calculation - viewAlphaImage = globalImages->ImageFromFunction("_viewAlpha", R_CreateViewAlphaImage ); - - //----------------------------------- - - // generate the jitter image - jitterImage16 = globalImages->ImageFromFunction( "_jitter16", R_CreateJitterImage16 ); - jitterImage4 = globalImages->ImageFromFunction( "_jitter4", R_CreateJitterImage4 ); - jitterImage1 = globalImages->ImageFromFunction( "_jitter1", R_CreateJitterImage1 ); - - depthMidpointVertexProgram = R_FindARBProgram( GL_VERTEX_PROGRAM_ARB, "depthMidpoint.vfp" ); - depthMidpointFragmentProgram = R_FindARBProgram( GL_FRAGMENT_PROGRAM_ARB, "depthMidpoint.vfp" ); - - shadowResampleVertexProgram = R_FindARBProgram( GL_VERTEX_PROGRAM_ARB, "shadowResample.vfp" ); - shadowResampleFragmentProgram = R_FindARBProgram( GL_FRAGMENT_PROGRAM_ARB, "shadowResample.vfp" ); - - screenSpaceShadowVertexProgram = R_FindARBProgram( GL_VERTEX_PROGRAM_ARB, "screenSpaceShadow1.vfp" ); - - screenSpaceShadowFragmentProgram0 = R_FindARBProgram( GL_FRAGMENT_PROGRAM_ARB, "screenSpaceShadow0.vfp" ); - screenSpaceShadowFragmentProgram1 = R_FindARBProgram( GL_FRAGMENT_PROGRAM_ARB, "screenSpaceShadow1.vfp" ); - screenSpaceShadowFragmentProgram4 = R_FindARBProgram( GL_FRAGMENT_PROGRAM_ARB, "screenSpaceShadow4.vfp" ); - screenSpaceShadowFragmentProgram16 = R_FindARBProgram( GL_FRAGMENT_PROGRAM_ARB, "screenSpaceShadow16.vfp" ); - - shadowVertexProgram = R_FindARBProgram( GL_VERTEX_PROGRAM_ARB, "shadowBufferInteraction1.vfp" ); - - shadowFragmentProgram0 = R_FindARBProgram( GL_FRAGMENT_PROGRAM_ARB, "shadowBufferInteraction0.vfp" ); - shadowFragmentProgram1 = R_FindARBProgram( GL_FRAGMENT_PROGRAM_ARB, "shadowBufferInteraction1.vfp" ); - shadowFragmentProgram4 = R_FindARBProgram( GL_FRAGMENT_PROGRAM_ARB, "shadowBufferInteraction4.vfp" ); - shadowFragmentProgram16 = R_FindARBProgram( GL_FRAGMENT_PROGRAM_ARB, "shadowBufferInteraction16.vfp" ); - - gammaDitherVertexProgram = R_FindARBProgram( GL_VERTEX_PROGRAM_ARB, "gammaDither.vfp" ); - gammaDitherFragmentProgram = R_FindARBProgram( GL_FRAGMENT_PROGRAM_ARB, "gammaDither.vfp" ); - - downSampleVertexProgram = R_FindARBProgram( GL_VERTEX_PROGRAM_ARB, "downSample.vfp" ); - downSampleFragmentProgram = R_FindARBProgram( GL_FRAGMENT_PROGRAM_ARB, "downSample.vfp" ); - - bloomVertexProgram = R_FindARBProgram( GL_VERTEX_PROGRAM_ARB, "bloom.vfp" ); - bloomFragmentProgram = R_FindARBProgram( GL_FRAGMENT_PROGRAM_ARB, "bloom.vfp" ); - - random256Image = globalImages->ImageFromFunction( "_random256", R_CreateRandom256Image ); -} - -//=========================================================================================== - -static const int CULL_RECEIVER = 1; // still draw occluder, but it is out of the view -static const int CULL_OCCLUDER_AND_RECEIVER = 2; // the surface doesn't effect the view at all - -/* -================== -RB_EXP_CullInteractions - -Sets surfaceInteraction_t->cullBits -================== -*/ -void RB_EXP_CullInteractions( viewLight_t *vLight, idPlane frustumPlanes[6] ) { - for ( idInteraction *inter = vLight->lightDef->firstInteraction ; inter ; inter = inter->lightNext ) { - const idRenderEntityLocal *entityDef = inter->entityDef; - if ( !entityDef ) { - continue; - } - if ( inter->numSurfaces < 1 ) { - continue; - } - - int culled = 0; - - if ( r_sb_useCulling.GetBool() ) { - // transform light frustum into object space, positive side points outside the light - idPlane localPlanes[6]; - int plane; - for ( plane = 0 ; plane < 6 ; plane++ ) { - R_GlobalPlaneToLocal( entityDef->modelMatrix, frustumPlanes[plane], localPlanes[plane] ); - } - - // cull the entire entity bounding box - // has referenceBounds been tightened to the actual model bounds? - idVec3 corners[8]; - for ( int i = 0 ; i < 8 ; i++ ) { - corners[i][0] = entityDef->referenceBounds[i&1][0]; - corners[i][1] = entityDef->referenceBounds[(i>>1)&1][1]; - corners[i][2] = entityDef->referenceBounds[(i>>2)&1][2]; - } - - for ( plane = 0 ; plane < 6 ; plane++ ) { - int j; - for ( j = 0 ; j < 8 ; j++ ) { - // if a corner is on the negative side (inside) of the frustum, the surface is not culled - // by this plane - if ( corners[j] * localPlanes[plane].ToVec4().ToVec3() + localPlanes[plane][3] < 0 ) { - break; - } - } - if ( j == 8 ) { - break; // all points outside the light - } - } - if ( plane < 6 ) { - culled = CULL_OCCLUDER_AND_RECEIVER; - } - } - - for ( int i = 0 ; i < inter->numSurfaces ; i++ ) { - surfaceInteraction_t *surfInt = &inter->surfaces[i]; - - if ( !surfInt->ambientTris ) { - continue; - } - surfInt->expCulled = culled; - } - - } -} - -/* -================== -RB_EXP_RenderOccluders -================== -*/ -void RB_EXP_RenderOccluders( viewLight_t *vLight ) { - for ( idInteraction *inter = vLight->lightDef->firstInteraction ; inter ; inter = inter->lightNext ) { - const idRenderEntityLocal *entityDef = inter->entityDef; - if ( !entityDef ) { - continue; - } - if ( inter->numSurfaces < 1 ) { - continue; - } - - // no need to check for current on this, because each interaction is always - // a different space - float matrix[16]; - myGlMultMatrix( inter->entityDef->modelMatrix, lightMatrix, matrix ); - qglLoadMatrixf( matrix ); - - // draw each surface - for ( int i = 0 ; i < inter->numSurfaces ; i++ ) { - surfaceInteraction_t *surfInt = &inter->surfaces[i]; - - if ( !surfInt->ambientTris ) { - continue; - } - if ( surfInt->shader && !surfInt->shader->SurfaceCastsShadow() ) { - continue; - } - - // cull it - if ( surfInt->expCulled == CULL_OCCLUDER_AND_RECEIVER ) { - continue; - } - - // render it - const srfTriangles_t *tri = surfInt->ambientTris; - if ( !tri->ambientCache ) { - R_CreateAmbientCache( const_cast(tri), false ); - } - idDrawVert *ac = (idDrawVert *)vertexCache.Position( tri->ambientCache ); - qglVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->xyz.ToFloatPtr() ); - qglTexCoordPointer( 2, GL_FLOAT, sizeof( idDrawVert ), ac->st.ToFloatPtr() ); - if ( surfInt->shader ) { - surfInt->shader->GetEditorImage()->Bind(); - } - RB_DrawElementsWithCounters( tri ); - } - } -} - -/* -================== -RB_RenderShadowBuffer -================== -*/ -void RB_RenderShadowBuffer( viewLight_t *vLight, int side ) { - float xmin, xmax, ymin, ymax; - float width, height; - float zNear; - - float fov = r_sb_frustomFOV.GetFloat(); - - // - // set up 90 degree projection matrix - // - zNear = 4; - - ymax = zNear * tan( fov * idMath::PI / 360.0f ); - ymin = -ymax; - - xmax = zNear * tan( fov * idMath::PI / 360.0f ); - xmin = -xmax; - - width = xmax - xmin; - height = ymax - ymin; - - lightProjectionMatrix[0] = 2 * zNear / width; - lightProjectionMatrix[4] = 0; - lightProjectionMatrix[8] = 0; - lightProjectionMatrix[12] = 0; - - lightProjectionMatrix[1] = 0; - lightProjectionMatrix[5] = 2 * zNear / height; - lightProjectionMatrix[9] = 0; - lightProjectionMatrix[13] = 0; - - // this is the far-plane-at-infinity formulation, and - // crunches the Z range slightly so w=0 vertexes do not - // rasterize right at the wraparound point - lightProjectionMatrix[2] = 0; - lightProjectionMatrix[6] = 0; - lightProjectionMatrix[10] = -0.999f; - lightProjectionMatrix[14] = -2.0f * zNear; - - lightProjectionMatrix[3] = 0; - lightProjectionMatrix[7] = 0; - lightProjectionMatrix[11] = -1; - lightProjectionMatrix[15] = 0; - - - if ( r_sb_usePbuffer.GetBool() ) { - // set the current openGL drawable to the shadow buffer - R_MakeCurrent( shadowPbufferDC, win32.hGLRC, NULL /* !@# shadowPbuffer */ ); - } - - qglMatrixMode( GL_PROJECTION ); - qglLoadMatrixf( lightProjectionMatrix ); - qglMatrixMode( GL_MODELVIEW ); - - qglViewport( 0, 0, lightBufferSize, lightBufferSize ); - qglScissor( 0, 0, lightBufferSize, lightBufferSize ); - qglStencilFunc( GL_ALWAYS, 0, 255 ); - -qglClearColor( 0, 1, 0, 0 ); -GL_State( GLS_DEPTHFUNC_LESS | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO ); // make sure depth mask is off before clear -qglClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); - -// draw all the occluders -qglColor3f( 1, 1, 1 ); -GL_SelectTexture( 0 ); -qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - - backEnd.currentSpace = NULL; - - static float s_flipMatrix[16] = { - // convert from our coordinate system (looking down X) - // to OpenGL's coordinate system (looking down -Z) - 0, 0, -1, 0, - -1, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 0, 1 - }; - - float viewMatrix[16]; - - idVec3 vec; - idVec3 origin = vLight->lightDef->globalLightOrigin; - - if ( side == -1 ) { - // projected light - vec = vLight->lightDef->parms.target; - vec.Normalize(); - viewMatrix[0] = vec[0]; - viewMatrix[4] = vec[1]; - viewMatrix[8] = vec[2]; - - vec = vLight->lightDef->parms.right; - vec.Normalize(); - viewMatrix[1] = -vec[0]; - viewMatrix[5] = -vec[1]; - viewMatrix[9] = -vec[2]; - - vec = vLight->lightDef->parms.up; - vec.Normalize(); - viewMatrix[2] = vec[0]; - viewMatrix[6] = vec[1]; - viewMatrix[10] = vec[2]; - } else { - // side of a point light - memset( viewMatrix, 0, sizeof( viewMatrix ) ); - switch ( side ) { - case 0: - viewMatrix[0] = 1; - viewMatrix[9] = 1; - viewMatrix[6] = -1; - break; - case 1: - viewMatrix[0] = -1; - viewMatrix[9] = -1; - viewMatrix[6] = -1; - break; - case 2: - viewMatrix[4] = 1; - viewMatrix[1] = -1; - viewMatrix[10] = 1; - break; - case 3: - viewMatrix[4] = -1; - viewMatrix[1] = -1; - viewMatrix[10] = -1; - break; - case 4: - viewMatrix[8] = 1; - viewMatrix[1] = -1; - viewMatrix[6] = -1; - break; - case 5: - viewMatrix[8] = -1; - viewMatrix[1] = 1; - viewMatrix[6] = -1; - break; - } - } - - viewMatrix[12] = -origin[0] * viewMatrix[0] + -origin[1] * viewMatrix[4] + -origin[2] * viewMatrix[8]; - viewMatrix[13] = -origin[0] * viewMatrix[1] + -origin[1] * viewMatrix[5] + -origin[2] * viewMatrix[9]; - viewMatrix[14] = -origin[0] * viewMatrix[2] + -origin[1] * viewMatrix[6] + -origin[2] * viewMatrix[10]; - - viewMatrix[3] = 0; - viewMatrix[7] = 0; - viewMatrix[11] = 0; - viewMatrix[15] = 1; - - memcpy( unflippedLightMatrix, viewMatrix, sizeof( unflippedLightMatrix ) ); - myGlMultMatrix( viewMatrix, s_flipMatrix,lightMatrix); - - // create frustum planes - idPlane globalFrustum[6]; - - // near clip - globalFrustum[0][0] = -viewMatrix[0]; - globalFrustum[0][1] = -viewMatrix[4]; - globalFrustum[0][2] = -viewMatrix[8]; - globalFrustum[0][3] = -(origin[0] * globalFrustum[0][0] + origin[1] * globalFrustum[0][1] + origin[2] * globalFrustum[0][2]); - - // far clip - globalFrustum[1][0] = viewMatrix[0]; - globalFrustum[1][1] = viewMatrix[4]; - globalFrustum[1][2] = viewMatrix[8]; - globalFrustum[1][3] = -globalFrustum[0][3] - viewLightAxialSize; - - // side clips - globalFrustum[2][0] = -viewMatrix[0] + viewMatrix[1]; - globalFrustum[2][1] = -viewMatrix[4] + viewMatrix[5]; - globalFrustum[2][2] = -viewMatrix[8] + viewMatrix[9]; - - globalFrustum[3][0] = -viewMatrix[0] - viewMatrix[1]; - globalFrustum[3][1] = -viewMatrix[4] - viewMatrix[5]; - globalFrustum[3][2] = -viewMatrix[8] - viewMatrix[9]; - - globalFrustum[4][0] = -viewMatrix[0] + viewMatrix[2]; - globalFrustum[4][1] = -viewMatrix[4] + viewMatrix[6]; - globalFrustum[4][2] = -viewMatrix[8] + viewMatrix[10]; - - globalFrustum[5][0] = -viewMatrix[0] - viewMatrix[2]; - globalFrustum[5][1] = -viewMatrix[4] - viewMatrix[6]; - globalFrustum[5][2] = -viewMatrix[8] - viewMatrix[10]; - - // is this nromalization necessary? - for ( int i = 0 ; i < 6 ; i++ ) { - globalFrustum[i].ToVec4().ToVec3().Normalize(); - } - - for ( int i = 2 ; i < 6 ; i++ ) { - globalFrustum[i][3] = - (origin * globalFrustum[i].ToVec4().ToVec3() ); - } - - RB_EXP_CullInteractions( vLight, globalFrustum ); - - - // FIXME: we want to skip the sampling as well as the generation when not casting shadows - if ( !r_sb_noShadows.GetBool() && vLight->lightShader->LightCastsShadows() ) { - // - // set polygon offset for the rendering - // - switch ( r_sb_occluderFacing.GetInteger() ) { - case 0: // front sides - qglPolygonOffset( r_sb_polyOfsFactor.GetFloat(), r_sb_polyOfsUnits.GetFloat() ); - qglEnable( GL_POLYGON_OFFSET_FILL ); - RB_EXP_RenderOccluders( vLight ); - qglDisable( GL_POLYGON_OFFSET_FILL ); - break; - case 1: // back sides - qglPolygonOffset( -r_sb_polyOfsFactor.GetFloat(), -r_sb_polyOfsUnits.GetFloat() ); - qglEnable( GL_POLYGON_OFFSET_FILL ); - GL_Cull( CT_BACK_SIDED ); - RB_EXP_RenderOccluders( vLight ); - GL_Cull( CT_FRONT_SIDED ); - qglDisable( GL_POLYGON_OFFSET_FILL ); - break; - case 2: // both sides - GL_Cull( CT_BACK_SIDED ); - RB_EXP_RenderOccluders( vLight ); - GL_Cull( CT_FRONT_SIDED ); - shadowImage[2]->Bind(); - qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, lightBufferSize, lightBufferSize ); - - RB_EXP_RenderOccluders( vLight ); - shadowImage[1]->Bind(); - qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, lightBufferSize, lightBufferSize ); - - // fragment program to combine the two depth images - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, depthMidpointVertexProgram ); - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, depthMidpointFragmentProgram ); - qglEnable(GL_VERTEX_PROGRAM_ARB); - qglEnable(GL_FRAGMENT_PROGRAM_ARB); - - GL_SelectTextureNoClient( 1 ); - shadowImage[1]->Bind(); - qglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE ); - qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); - qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); - - GL_SelectTextureNoClient( 0 ); - shadowImage[2]->Bind(); - qglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE ); - qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); - qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); - - // draw a full screen quad - qglMatrixMode( GL_PROJECTION ); - qglLoadIdentity(); - qglOrtho( 0, 1, 0, 1, -1, 1 ); - qglMatrixMode( GL_MODELVIEW ); - qglLoadIdentity(); - - GL_State( GLS_DEPTHFUNC_ALWAYS ); - - qglBegin( GL_TRIANGLE_FAN ); - qglTexCoord2f( 0, 0 ); - qglVertex2f( 0, 0 ); - qglTexCoord2f( 0, lightBufferSizeFraction ); - qglVertex2f( 0, 1 ); - qglTexCoord2f( lightBufferSizeFraction, lightBufferSizeFraction ); - qglVertex2f( 1, 1 ); - qglTexCoord2f( lightBufferSizeFraction, 0 ); - qglVertex2f( 1, 0 ); - qglEnd(); - - qglDisable( GL_VERTEX_PROGRAM_ARB ); - qglDisable( GL_FRAGMENT_PROGRAM_ARB ); - - break; - } - } - - // copy to the texture - shadowImage[0]->Bind(); - qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, lightBufferSize, lightBufferSize ); - -qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - - - // reset the normal view matrix - - qglMatrixMode( GL_PROJECTION ); - qglLoadMatrixf( backEnd.viewDef->projectionMatrix ); - qglMatrixMode( GL_MODELVIEW ); - - // the current modelView matrix is not valid - backEnd.currentSpace = NULL; -} - -/* -================== -RB_EXP_DrawInteraction -================== -*/ -void RB_EXP_DrawInteraction( const drawInteraction_t *din ) { - // load all the vertex program parameters - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_ORIGIN, din->localLightOrigin.ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_VIEW_ORIGIN, din->localViewOrigin.ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_PROJECT_S, din->lightProjection[0].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_PROJECT_T, din->lightProjection[1].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_PROJECT_Q, din->lightProjection[2].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_FALLOFF_S, din->lightProjection[3].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_BUMP_MATRIX_S, din->bumpMatrix[0].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_BUMP_MATRIX_T, din->bumpMatrix[1].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_DIFFUSE_MATRIX_S, din->diffuseMatrix[0].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_DIFFUSE_MATRIX_T, din->diffuseMatrix[1].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_SPECULAR_MATRIX_S, din->specularMatrix[0].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_SPECULAR_MATRIX_T, din->specularMatrix[1].ToFloatPtr() ); - - -// calculate depth projection for shadow buffer -float sRow[4]; -float tRow[4]; -float rRow[4]; -float qRow[4]; -float matrix[16]; -float matrix2[16]; -myGlMultMatrix( din->surf->space->modelMatrix, lightMatrix, matrix ); -myGlMultMatrix( matrix, lightProjectionMatrix, matrix2 ); - -// the final values need to be in 0.0 : 1.0 range instead of -1 : 1 -sRow[0] = 0.5 * lightBufferSizeFraction * ( matrix2[0] + matrix2[3] ); -sRow[1] = 0.5 * lightBufferSizeFraction * ( matrix2[4] + matrix2[7] ); -sRow[2] = 0.5 * lightBufferSizeFraction * ( matrix2[8] + matrix2[11] ); -sRow[3] = 0.5 * lightBufferSizeFraction * ( matrix2[12] + matrix2[15] ); -qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 18, sRow ); -tRow[0] = 0.5 * lightBufferSizeFraction * ( matrix2[1] + matrix2[3] ); -tRow[1] = 0.5 * lightBufferSizeFraction * ( matrix2[5] + matrix2[7] ); -tRow[2] = 0.5 * lightBufferSizeFraction * ( matrix2[9] + matrix2[11] ); -tRow[3] = 0.5 * lightBufferSizeFraction * ( matrix2[13] + matrix2[15] ); -qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 19, tRow ); -rRow[0] = 0.5 * ( matrix2[2] + matrix2[3] ); -rRow[1] = 0.5 * ( matrix2[6] + matrix2[7] ); -rRow[2] = 0.5 * ( matrix2[10] + matrix2[11] ); -rRow[3] = 0.5 * ( matrix2[14] + matrix2[15] ); -qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 20, rRow ); -qRow[0] = matrix2[3]; -qRow[1] = matrix2[7]; -qRow[2] = matrix2[11]; -qRow[3] = matrix2[15]; -qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 21, qRow ); - - - // testing fragment based normal mapping - if ( r_testARBProgram.GetBool() ) { - qglProgramEnvParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 2, din->localLightOrigin.ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 3, din->localViewOrigin.ToFloatPtr() ); - } - - static const float zero[4] = { 0, 0, 0, 0 }; - static const float one[4] = { 1, 1, 1, 1 }; - static const float negOne[4] = { -1, -1, -1, -1 }; - - switch ( din->vertexColor ) { - case SVC_IGNORE: - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_MODULATE, zero ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_ADD, one ); - break; - case SVC_MODULATE: - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_MODULATE, one ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_ADD, zero ); - break; - case SVC_INVERSE_MODULATE: - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_MODULATE, negOne ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_ADD, one ); - break; - } - - // set the constant colors - qglProgramEnvParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 0, din->diffuseColor.ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 1, din->specularColor.ToFloatPtr() ); - - //----------------------------------------------------- - // screen power of two correction factor - - float parm[4]; - parm[0] = 1.0 / ( JITTER_SIZE * r_sb_samples.GetInteger() ) ; - parm[1] = 1.0 / JITTER_SIZE; - parm[2] = 0; - parm[3] = 1; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 2, parm ); - - // jitter tex scale - parm[0] = - parm[1] = r_sb_jitterScale.GetFloat() * lightBufferSizeFraction; - parm[2] = -r_sb_biasScale.GetFloat(); - parm[3] = 0; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 3, parm ); - - // jitter tex offset - if ( r_sb_randomize.GetBool() ) { - parm[0] = (rand()&255) / 255.0; - parm[1] = (rand()&255) / 255.0; - } else { - parm[0] = parm[1] = 0; - } - parm[2] = 0; - parm[3] = 0; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 4, parm ); - //----------------------------------------------------- - - // set the textures - - // texture 1 will be the per-surface bump map - GL_SelectTextureNoClient( 1 ); - din->bumpImage->Bind(); - - // texture 2 will be the light falloff texture - GL_SelectTextureNoClient( 2 ); - din->lightFalloffImage->Bind(); - - // texture 3 will be the light projection texture - GL_SelectTextureNoClient( 3 ); - din->lightImage->Bind(); - - // texture 4 is the per-surface diffuse map - GL_SelectTextureNoClient( 4 ); - din->diffuseImage->Bind(); - - // texture 5 is the per-surface specular map - GL_SelectTextureNoClient( 5 ); - din->specularImage->Bind(); - - // draw it - RB_DrawElementsWithCounters( din->surf->geo ); -} - -/* -============= -RB_EXP_CreateDrawInteractions - -============= -*/ -void RB_EXP_CreateDrawInteractions( const drawSurf_t *surf ) { - if ( !surf ) { - return; - } - if ( r_sb_screenSpaceShadow.GetBool() ) { - // perform setup here that will be constant for all interactions - GL_State( GLS_SRCBLEND_DST_ALPHA | GLS_DSTBLEND_ONE | GLS_DEPTHMASK | backEnd.depthFunc ); - - if ( r_testARBProgram.GetBool() ) { - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_TEST ); - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, FPROG_TEST ); - } else { - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_INTERACTION ); - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, FPROG_INTERACTION ); - } - } else { - // perform setup here that will be constant for all interactions - GL_State( GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE | GLS_DEPTHMASK | backEnd.depthFunc ); -GL_State( GLS_DEPTHMASK | GLS_DEPTHFUNC_ALWAYS );//!@# - - // bind the vertex program - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, shadowVertexProgram ); - if ( r_sb_samples.GetInteger() == 16 ) { - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, shadowFragmentProgram16 ); - } else if ( r_sb_samples.GetInteger() == 4 ) { - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, shadowFragmentProgram4 ); - } else if ( r_sb_samples.GetInteger() == 1 ) { - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, shadowFragmentProgram1 ); - } else { - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, shadowFragmentProgram0 ); - } - } - - qglEnable(GL_VERTEX_PROGRAM_ARB); - qglEnable(GL_FRAGMENT_PROGRAM_ARB); - - // enable the vertex arrays - qglEnableVertexAttribArrayARB( 8 ); - qglEnableVertexAttribArrayARB( 9 ); - qglEnableVertexAttribArrayARB( 10 ); - qglEnableVertexAttribArrayARB( 11 ); - qglEnableClientState( GL_COLOR_ARRAY ); - - // texture 0 is the normalization cube map for the vector towards the light - GL_SelectTextureNoClient( 0 ); - if ( backEnd.vLight->lightShader->IsAmbientLight() ) { - globalImages->normalCubeMapImage->Bind(); - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_AMBIENT); - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, FPROG_AMBIENT); - } else { - globalImages->normalCubeMapImage->Bind(); - } - - // texture 6 is the specular lookup table - GL_SelectTextureNoClient( 6 ); - if ( r_testARBProgram.GetBool() ) { - globalImages->specular2DTableImage->Bind(); // variable specularity in alpha channel - } else { - globalImages->specularTableImage->Bind(); - } - - - for ( ; surf ; surf=surf->nextOnLight ) { - // perform setup here that will not change over multiple interaction passes - if ( backEnd.vLight->lightShader->IsAmbientLight() ) { - float parm[4]; - - parm[0] = surf->space->modelMatrix[0]; - parm[1] = surf->space->modelMatrix[4]; - parm[2] = surf->space->modelMatrix[8]; - parm[3] = 0; - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 20, parm ); - parm[0] = surf->space->modelMatrix[1]; - parm[1] = surf->space->modelMatrix[5]; - parm[2] = surf->space->modelMatrix[9]; - parm[3] = 0; - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 21, parm ); - parm[0] = surf->space->modelMatrix[2]; - parm[1] = surf->space->modelMatrix[6]; - parm[2] = surf->space->modelMatrix[10]; - parm[3] = 0; - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 22, parm ); - - GL_SelectTextureNoClient( 0 ); - const shaderStage_t *stage = backEnd.vLight->lightShader->GetStage( 0 ); - if ( stage->newStage ) { - stage->newStage->fragmentProgramImages[7]->BindFragment(); - } - } - - // set the vertex pointers - idDrawVert *ac = (idDrawVert *)vertexCache.Position( surf->geo->ambientCache ); - qglColorPointer( 4, GL_UNSIGNED_BYTE, sizeof( idDrawVert ), ac->color ); - qglVertexAttribPointerARB( 11, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->normal.ToFloatPtr() ); - qglVertexAttribPointerARB( 10, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->tangents[1].ToFloatPtr() ); - qglVertexAttribPointerARB( 9, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->tangents[0].ToFloatPtr() ); - qglVertexAttribPointerARB( 8, 2, GL_FLOAT, false, sizeof( idDrawVert ), ac->st.ToFloatPtr() ); - qglVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->xyz.ToFloatPtr() ); - - // this may cause RB_ARB2_DrawInteraction to be exacuted multiple - // times with different colors and images if the surface or light have multiple layers - if ( r_sb_screenSpaceShadow.GetBool() ) { - RB_CreateSingleDrawInteractions( surf, RB_ARB2_DrawInteraction ); - } else { - RB_CreateSingleDrawInteractions( surf, RB_EXP_DrawInteraction ); - } - } - - qglDisableVertexAttribArrayARB( 8 ); - qglDisableVertexAttribArrayARB( 9 ); - qglDisableVertexAttribArrayARB( 10 ); - qglDisableVertexAttribArrayARB( 11 ); - qglDisableClientState( GL_COLOR_ARRAY ); - - // disable features - GL_SelectTextureNoClient( 6 ); - globalImages->BindNull(); - - GL_SelectTextureNoClient( 5 ); - globalImages->BindNull(); - - GL_SelectTextureNoClient( 4 ); - globalImages->BindNull(); - - GL_SelectTextureNoClient( 3 ); - globalImages->BindNull(); - - GL_SelectTextureNoClient( 2 ); - globalImages->BindNull(); - - GL_SelectTextureNoClient( 1 ); - globalImages->BindNull(); - - backEnd.glState.currenttmu = -1; - GL_SelectTexture( 0 ); - - qglDisable(GL_VERTEX_PROGRAM_ARB); - qglDisable(GL_FRAGMENT_PROGRAM_ARB); -} - -void InvertByTranspose( const float a[16], float r[16] ) { - r[ 0] = a[ 0]; - r[ 1] = a[ 4]; - r[ 2] = a[ 8]; - r[ 3] = 0; - r[ 4] = a[ 1]; - r[ 5] = a[ 5]; - r[ 6] = a[ 9]; - r[ 7] = 0; - r[ 8] = a[ 2]; - r[ 9] = a[ 6]; - r[10] = a[10]; - r[11] = 0; - r[12] = -(r[ 0]*a[12] + r[ 4]*a[13] + r[ 8]*a[14]); - r[13] = -(r[ 1]*a[12] + r[ 5]*a[13] + r[ 9]*a[14]); - r[14] = -(r[ 2]*a[12] + r[ 6]*a[13] + r[10]*a[14]); - r[15] = 1; -} - -void FullInvert( const float a[16], float r[16] ) { - idMat4 am; - - for ( int i = 0 ; i < 4 ; i++ ) { - for ( int j = 0 ; j < 4 ; j++ ) { - am[i][j] = a[j*4+i]; - } - } - -// idVec4 test( 100, 100, 100, 1 ); -// idVec4 transformed, inverted; -// transformed = test * am; - - if ( !am.InverseSelf() ) { - common->Error( "Invert failed" ); - } -// inverted = transformed * am; - - for ( int i = 0 ; i < 4 ; i++ ) { - for ( int j = 0 ; j < 4 ; j++ ) { - r[j*4+i] = am[i][j]; - } - } -} - -/* -================== -RB_Exp_TrianglesForFrustum -================== -*/ -const srfTriangles_t *RB_Exp_TrianglesForFrustum( viewLight_t *vLight, int side ) { - const srfTriangles_t *tri; - - static srfTriangles_t frustumTri; - static idDrawVert verts[5]; - static glIndex_t indexes[18] = { 0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 1, 2, 1, 4, 2, 4, 3 }; - - if ( side == -1 ) { - tri = vLight->frustumTris; - } else { - memset( verts, 0, sizeof( verts ) ); - - for ( int i = 0 ; i < 5 ; i++ ) { - verts[i].xyz = vLight->globalLightOrigin; - } - - memset( &frustumTri, 0, sizeof( frustumTri ) ); - frustumTri.indexes = indexes; - frustumTri.verts = verts; - frustumTri.numIndexes = 18; - frustumTri.numVerts = 5; - - tri = &frustumTri; - - float size = viewLightAxialSize; - - switch ( side ) { - case 0: - verts[1].xyz[0] += size; - verts[2].xyz[0] += size; - verts[3].xyz[0] += size; - verts[4].xyz[0] += size; - verts[1].xyz[1] += size; - verts[1].xyz[2] += size; - verts[2].xyz[1] -= size; - verts[2].xyz[2] += size; - verts[3].xyz[1] -= size; - verts[3].xyz[2] -= size; - verts[4].xyz[1] += size; - verts[4].xyz[2] -= size; - break; - case 1: - verts[1].xyz[0] -= size; - verts[2].xyz[0] -= size; - verts[3].xyz[0] -= size; - verts[4].xyz[0] -= size; - verts[1].xyz[1] -= size; - verts[1].xyz[2] += size; - verts[2].xyz[1] += size; - verts[2].xyz[2] += size; - verts[3].xyz[1] += size; - verts[3].xyz[2] -= size; - verts[4].xyz[1] -= size; - verts[4].xyz[2] -= size; - break; - case 2: - verts[1].xyz[1] += size; - verts[2].xyz[1] += size; - verts[3].xyz[1] += size; - verts[4].xyz[1] += size; - verts[1].xyz[0] -= size; - verts[1].xyz[2] += size; - verts[2].xyz[0] += size; - verts[2].xyz[2] += size; - verts[3].xyz[0] += size; - verts[3].xyz[2] -= size; - verts[4].xyz[0] -= size; - verts[4].xyz[2] -= size; - break; - case 3: - verts[1].xyz[1] -= size; - verts[2].xyz[1] -= size; - verts[3].xyz[1] -= size; - verts[4].xyz[1] -= size; - verts[1].xyz[0] += size; - verts[1].xyz[2] += size; - verts[2].xyz[0] -= size; - verts[2].xyz[2] += size; - verts[3].xyz[0] -= size; - verts[3].xyz[2] -= size; - verts[4].xyz[0] += size; - verts[4].xyz[2] -= size; - break; - case 4: - verts[1].xyz[2] += size; - verts[2].xyz[2] += size; - verts[3].xyz[2] += size; - verts[4].xyz[2] += size; - verts[1].xyz[0] += size; - verts[1].xyz[1] += size; - verts[2].xyz[0] -= size; - verts[2].xyz[1] += size; - verts[3].xyz[0] -= size; - verts[3].xyz[1] -= size; - verts[4].xyz[0] += size; - verts[4].xyz[1] -= size; - break; - case 5: - verts[1].xyz[2] -= size; - verts[2].xyz[2] -= size; - verts[3].xyz[2] -= size; - verts[4].xyz[2] -= size; - verts[1].xyz[0] -= size; - verts[1].xyz[1] += size; - verts[2].xyz[0] += size; - verts[2].xyz[1] += size; - verts[3].xyz[0] += size; - verts[3].xyz[1] -= size; - verts[4].xyz[0] -= size; - verts[4].xyz[1] -= size; - break; - } - - frustumTri.ambientCache = vertexCache.AllocFrameTemp( verts, sizeof( verts ) ); - } - - return tri; -} - - -/* -================== -RB_Exp_SelectFrustum -================== -*/ -void RB_Exp_SelectFrustum( viewLight_t *vLight, int side ) { - qglLoadMatrixf( backEnd.viewDef->worldSpace.modelViewMatrix ); - - const srfTriangles_t *tri = RB_Exp_TrianglesForFrustum( vLight, side ); - - idDrawVert *ac = (idDrawVert *)vertexCache.Position( tri->ambientCache ); - qglVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->xyz.ToFloatPtr() ); - - qglDisable( GL_TEXTURE_2D ); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - // clear stencil buffer - qglEnable( GL_SCISSOR_TEST ); - qglEnable( GL_STENCIL_TEST ); - qglClearStencil( 1 ); - qglClear( GL_STENCIL_BUFFER_BIT ); - - // draw front faces of the light frustum, incrementing the stencil buffer on depth fail - // so we can't draw on those pixels - GL_State( GLS_COLORMASK | GLS_ALPHAMASK | GLS_DEPTHMASK | GLS_DEPTHFUNC_LESS ); - qglStencilFunc( GL_ALWAYS, 0, 255 ); - qglStencilOp( GL_KEEP, GL_INCR, GL_KEEP ); - GL_Cull( CT_FRONT_SIDED ); - - RB_DrawElementsWithCounters( tri ); - - // draw back faces of the light frustum with - // depth test greater - // stencil test of equal 1 - // zero stencil stencil when depth test passes, so subsequent surface drawing - // can occur on those pixels - - // this pass does all the shadow filtering - qglStencilFunc( GL_EQUAL, 1, 255 ); - qglStencilOp( GL_KEEP, GL_KEEP, GL_ZERO ); - - GL_Cull( CT_BACK_SIDED ); - qglDepthFunc( GL_GREATER ); - - // write to destination alpha - if ( r_sb_showFrustumPixels.GetBool() ) { - GL_State( GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE | GLS_DEPTHMASK | GLS_DEPTHFUNC_LESS ); - qglDisable( GL_TEXTURE_2D ); - qglColor4f( 0, 0.25, 0, 1 ); - } else { - GL_State( GLS_COLORMASK | GLS_DEPTHMASK | GLS_DEPTHFUNC_LESS ); - qglEnable(GL_VERTEX_PROGRAM_ARB); - qglEnable(GL_FRAGMENT_PROGRAM_ARB); - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, screenSpaceShadowVertexProgram ); - switch ( r_sb_samples.GetInteger() ) { - case 0: - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, screenSpaceShadowFragmentProgram0 ); - break; - case 1: - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, screenSpaceShadowFragmentProgram1 ); - break; - case 4: - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, screenSpaceShadowFragmentProgram4 ); - break; - case 16: - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, screenSpaceShadowFragmentProgram16 ); - break; - } - } - -/* -texture[0] = view depth texture -texture[1] = jitter texture -texture[2] = light depth texture -*/ - GL_SelectTextureNoClient( 2 ); - shadowImage[0]->Bind(); - - GL_SelectTextureNoClient( 1 ); - if ( r_sb_samples.GetInteger() == 16 ) { - jitterImage16->Bind(); - } else if ( r_sb_samples.GetInteger() == 4 ) { - jitterImage4->Bind(); - } else { - jitterImage1->Bind(); - } - - GL_SelectTextureNoClient( 0 ); - viewDepthImage->Bind(); - - /* -PARAM positionToDepthTexScale = program.local[0]; # fragment.position to screen depth texture transformation -PARAM zProject = program.local[1]; # projection[10], projection[14], 0, 0 -PARAM positionToViewSpace = program.local[2]; # X add, Y add, X mul, Y mul -PARAM viewToLightS = program.local[3]; -PARAM viewToLightT = program.local[4]; -PARAM viewToLightR = program.local[5]; -PARAM viewToLightQ = program.local[6]; -PARAM positionToJitterTexScale = program.local[7]; # fragment.position to jitter texture -PARAM jitterTexScale = program.local[8]; -PARAM jitterTexOffset = program.local[9]; -*/ - float parm[4]; - int pot; - - // calculate depth projection for shadow buffer - float sRow[4]; - float tRow[4]; - float rRow[4]; - float qRow[4]; - float invertedView[16]; - float invertedProjection[16]; - float matrix[16]; - float matrix2[16]; - - // we need the inverse of the projection matrix to go from NDC to view - FullInvert( backEnd.viewDef->projectionMatrix, invertedProjection ); - - /* - from window to NDC: - ( x - xMid ) * 1.0 / xMid - ( y - yMid ) * 1.0 / yMid - ( z - 0.5 ) * 2 - - from NDC to clip coordinates: - rcp(1/w) - - */ - - // we need the inverse of the viewMatrix to go from view (looking down negative Z) to world - InvertByTranspose( backEnd.viewDef->worldSpace.modelViewMatrix, invertedView ); - - // then we go from world to light view space (looking down negative Z) - myGlMultMatrix( invertedView, lightMatrix, matrix ); - - // then to light projection, giving X/w, Y/w, Z/w in the -1 : 1 range - myGlMultMatrix( matrix, lightProjectionMatrix, matrix2 ); - - // the final values need to be in 0.0 : 1.0 range instead of -1 : 1 - sRow[0] = 0.5 * ( matrix2[0] + matrix2[3] ) * lightBufferSizeFraction; - sRow[1] = 0.5 * ( matrix2[4] + matrix2[7] ) * lightBufferSizeFraction; - sRow[2] = 0.5 * ( matrix2[8] + matrix2[11] ) * lightBufferSizeFraction; - sRow[3] = 0.5 * ( matrix2[12] + matrix2[15] ) * lightBufferSizeFraction; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 3, sRow ); - tRow[0] = 0.5 * ( matrix2[1] + matrix2[3] ) * lightBufferSizeFraction; - tRow[1] = 0.5 * ( matrix2[5] + matrix2[7] ) * lightBufferSizeFraction; - tRow[2] = 0.5 * ( matrix2[9] + matrix2[11] ) * lightBufferSizeFraction; - tRow[3] = 0.5 * ( matrix2[13] + matrix2[15] ) * lightBufferSizeFraction; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 4, tRow ); - rRow[0] = 0.5 * ( matrix2[2] + matrix2[3] ); - rRow[1] = 0.5 * ( matrix2[6] + matrix2[7] ); - rRow[2] = 0.5 * ( matrix2[10] + matrix2[11] ); - rRow[3] = 0.5 * ( matrix2[14] + matrix2[15] ); - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 5, rRow ); - qRow[0] = matrix2[3]; - qRow[1] = matrix2[7]; - qRow[2] = matrix2[11]; - qRow[3] = matrix2[15]; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 6, qRow ); - - //----------------------------------------------------- - // these should be constant for the entire frame - - // convert 0..viewport-1 sizes to fractions inside the POT screen depth texture - int w = viewBufferSize; - pot = MakePowerOfTwo( w ); - parm[0] = 1.0 / maxViewBufferSize; // * ( (float)viewBufferSize / w ); - int h = viewBufferHeight; - pot = MakePowerOfTwo( h ); - parm[1] = parm[0]; // 1.0 / pot; - parm[2] = 0; - parm[3] = 1; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 0, parm ); - - // zProject values - parm[0] = backEnd.viewDef->projectionMatrix[10]; - parm[1] = backEnd.viewDef->projectionMatrix[14]; - parm[2] = 0; - parm[3] = 0; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 1, parm ); - - // positionToViewSpace - parm[0] = -1.0 / backEnd.viewDef->projectionMatrix[0]; - parm[1] = -1.0 / backEnd.viewDef->projectionMatrix[5]; - parm[2] = 2.0/viewBufferSize; - parm[3] = 2.0/viewBufferSize; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 2, parm ); - - // positionToJitterTexScale - parm[0] = 1.0 / ( JITTER_SIZE * r_sb_samples.GetInteger() ) ; - parm[1] = 1.0 / JITTER_SIZE; - parm[2] = 0; - parm[3] = 1; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 7, parm ); - - // jitter tex scale - parm[0] = - parm[1] = r_sb_jitterScale.GetFloat() * lightBufferSizeFraction; - parm[2] = -r_sb_biasScale.GetFloat(); - parm[3] = 0; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 8, parm ); - - // jitter tex offset - if ( r_sb_randomize.GetBool() ) { - parm[0] = (rand()&255) / 255.0; - parm[1] = (rand()&255) / 255.0; - } else { - parm[0] = parm[1] = 0; - } - parm[2] = 0; - parm[3] = 0; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 9, parm ); - //----------------------------------------------------- - - - - RB_DrawElementsWithCounters( tri ); - - qglDisable(GL_VERTEX_PROGRAM_ARB); - qglDisable(GL_FRAGMENT_PROGRAM_ARB); - - GL_Cull( CT_FRONT_SIDED ); -// qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - - qglDepthFunc( GL_LEQUAL ); - if ( r_sb_showFrustumPixels.GetBool() ) { - qglEnable( GL_TEXTURE_2D ); - qglColor3f( 1, 1, 1 ); - } - - // after all the frustums have been drawn, the surfaces that have been drawn on will get interactions - // scissor may still be a win even with the stencil test for very fast rejects - qglStencilFunc( GL_EQUAL, 0, 255 ); - qglStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); - - // we can avoid clearing the stencil buffer by changing the hasLight value for each light -} - -/* -================== -R_EXP_CalcLightAxialSize - -all light side projections must currently match, so non-centered -and non-cubic lights must take the largest length -================== -*/ -float R_EXP_CalcLightAxialSize( viewLight_t *vLight ) { - float max = 0; - - if ( !vLight->lightDef->parms.pointLight ) { - idVec3 dir = vLight->lightDef->parms.target - vLight->lightDef->parms.origin; - max = dir.Length(); - return max; - } - - for ( int i = 0 ; i < 3 ; i++ ) { - float dist = fabs(vLight->lightDef->parms.lightCenter[i] ); - dist += vLight->lightDef->parms.lightRadius[i]; - if ( dist > max ) { - max = dist; - } - } - return max; -} - -/* -================== -R_EXP_RenderViewDepthImage - -This could be avoided by drop sampling the native view depth buffer with render to texture -Bilerp might even be aprorpiate, although it would cause issues at edges -================== -*/ -void RB_T_FillDepthBuffer( const drawSurf_t *surf ); - -void R_EXP_RenderViewDepthImage( void ) { - if ( !r_sb_screenSpaceShadow.GetBool() ) { - return; - } - - // if the screen resolution is exactly the window width, we can - // use the depth buffer we already have - if ( 0 ) { // nativeViewBuffer ) { - viewDepthImage->CopyDepthbuffer( backEnd.viewDef->viewport.x1, - backEnd.viewDef->viewport.y1, backEnd.viewDef->viewport.x2 - backEnd.viewDef->viewport.x1 + 1, - backEnd.viewDef->viewport.y2 - backEnd.viewDef->viewport.y1 + 1 ); - } else { - RB_LogComment( "---------- R_EXP_RenderViewDepthImage ----------\n" ); - - if ( r_sb_usePbuffer.GetBool() ) { - GL_CheckErrors(); - // set the current openGL drawable to the shadow buffer - R_MakeCurrent( viewPbufferDC, win32.hGLRC, NULL /* !@# viewPbuffer */ ); - } - - // render the depth to the new size - qglViewport( 0, 0, viewBufferSize, viewBufferHeight ); - qglScissor( 0, 0, viewBufferSize, viewBufferHeight ); - qglClear( GL_DEPTH_BUFFER_BIT ); - qglStencilFunc( GL_ALWAYS, 0, 255 ); - - // the first texture will be used for alpha tested surfaces - GL_SelectTexture( 0 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - - GL_State( GLS_DEPTHFUNC_LESS ); - - RB_RenderDrawSurfListWithFunction( backEnd.viewDef->drawSurfs, backEnd.viewDef->numDrawSurfs, RB_T_FillDepthBuffer ); - - // - // copy it to a texture - // - viewDepthImage->Bind(); - qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, viewBufferSize, viewBufferHeight ); - - if ( r_sb_usePbuffer.GetBool() ) { - // set the normal screen drawable current - R_MakeCurrent( win32.hDC, win32.hGLRC, NULL ); - } - - // reset the window clipping - qglMatrixMode( GL_PROJECTION ); - qglLoadMatrixf( backEnd.viewDef->projectionMatrix ); - qglMatrixMode( GL_MODELVIEW ); - - qglViewport( tr.viewportOffset[0] + backEnd.viewDef->viewport.x1, - tr.viewportOffset[1] + backEnd.viewDef->viewport.y1, - backEnd.viewDef->viewport.x2 + 1 - backEnd.viewDef->viewport.x1, - backEnd.viewDef->viewport.y2 + 1 - backEnd.viewDef->viewport.y1 ); - qglScissor( tr.viewportOffset[0] + backEnd.viewDef->viewport.x1, - tr.viewportOffset[1] + backEnd.viewDef->viewport.y1, - backEnd.viewDef->viewport.x2 + 1 - backEnd.viewDef->viewport.x1, - backEnd.viewDef->viewport.y2 + 1 - backEnd.viewDef->viewport.y1 ); - - // the current modelView matrix is not valid - backEnd.currentSpace = NULL; - } - - qglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE ); - qglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE ); - qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); - qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); -} - -/* -================== -RB_EXP_SetNativeBuffer - -This is always the back buffer, and scissor is set full screen -================== -*/ -void RB_EXP_SetNativeBuffer( void ) { - // set the normal screen drawable current - R_MakeCurrent( win32.hDC, win32.hGLRC, NULL ); - - qglViewport( tr.viewportOffset[0] + backEnd.viewDef->viewport.x1, - tr.viewportOffset[1] + backEnd.viewDef->viewport.y1, - backEnd.viewDef->viewport.x2 + 1 - backEnd.viewDef->viewport.x1, - backEnd.viewDef->viewport.y2 + 1 - backEnd.viewDef->viewport.y1 ); - - backEnd.currentScissor = backEnd.viewDef->viewport; - if ( r_useScissor.GetBool() ) { - qglScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, - backEnd.viewDef->viewport.y1 + backEnd.currentScissor.y1, - backEnd.currentScissor.x2 + 1 - backEnd.currentScissor.x1, - backEnd.currentScissor.y2 + 1 - backEnd.currentScissor.y1 ); - } -} - -/* -================== -RB_EXP_SetRenderBuffer - -This may be to a float pBuffer, and scissor is set to cover only the light -================== -*/ -void RB_EXP_SetRenderBuffer( viewLight_t *vLight ) { - if ( r_hdr_useFloats.GetBool() ) { - R_MakeCurrent( floatPbufferDC, floatContext, floatPbuffer ); - } else { - if ( !qwglMakeCurrent( win32.hDC, win32.hGLRC ) ) { - GL_CheckErrors(); - common->FatalError( "Couldn't return to normal drawing context" ); - } - } - - qglViewport( tr.viewportOffset[0] + backEnd.viewDef->viewport.x1, - tr.viewportOffset[1] + backEnd.viewDef->viewport.y1, - backEnd.viewDef->viewport.x2 + 1 - backEnd.viewDef->viewport.x1, - backEnd.viewDef->viewport.y2 + 1 - backEnd.viewDef->viewport.y1 ); - - if ( !vLight ) { - backEnd.currentScissor = backEnd.viewDef->viewport; - } else { - backEnd.currentScissor = vLight->scissorRect; - } - if ( r_useScissor.GetBool() ) { - qglScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, - backEnd.viewDef->viewport.y1 + backEnd.currentScissor.y1, - backEnd.currentScissor.x2 + 1 - backEnd.currentScissor.x1, - backEnd.currentScissor.y2 + 1 - backEnd.currentScissor.y1 ); - } -} - -/* -================== -RB_shadowResampleAlpha - -================== -*/ -void RB_shadowResampleAlpha( void ) { - viewAlphaImage->Bind(); - // we could make this a subimage, but it isn't relevent once we have render-to-texture - qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, viewBufferSize, viewBufferHeight ); - - RB_EXP_SetRenderBuffer( backEnd.vLight ); - -//===================== - - qglLoadMatrixf( backEnd.viewDef->worldSpace.modelViewMatrix ); - - // this uses the full light, not side frustums - const srfTriangles_t *tri = backEnd.vLight->frustumTris; - - idDrawVert *ac = (idDrawVert *)vertexCache.Position( tri->ambientCache ); - qglVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->xyz.ToFloatPtr() ); - - // clear stencil buffer - qglEnable( GL_SCISSOR_TEST ); - qglEnable( GL_STENCIL_TEST ); - qglClearStencil( 1 ); - qglClear( GL_STENCIL_BUFFER_BIT ); - - // draw front faces of the light frustum, incrementing the stencil buffer on depth fail - // so we can't draw on those pixels - GL_State( GLS_COLORMASK | GLS_ALPHAMASK | GLS_DEPTHMASK | GLS_DEPTHFUNC_LESS ); - qglStencilFunc( GL_ALWAYS, 0, 255 ); - qglStencilOp( GL_KEEP, GL_INCR, GL_KEEP ); - GL_Cull( CT_FRONT_SIDED ); - - // set fragment / vertex program? - - RB_DrawElementsWithCounters( tri ); - - // draw back faces of the light frustum with - // depth test greater - // stencil test of equal 1 - // zero stencil stencil when depth test passes, so subsequent interaction drawing - // can occur on those pixels - - // this pass does all the shadow filtering - qglStencilFunc( GL_EQUAL, 1, 255 ); - qglStencilOp( GL_KEEP, GL_KEEP, GL_ZERO ); - - // write to destination alpha - if ( r_sb_showFrustumPixels.GetBool() ) { - GL_State( GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE | GLS_DEPTHMASK | GLS_DEPTHFUNC_LESS ); - qglDisable( GL_TEXTURE_2D ); - qglColor4f( 0, 0.25, 0, 1 ); - } else { - GL_State( GLS_COLORMASK | GLS_DEPTHMASK | GLS_DEPTHFUNC_LESS ); - qglEnable(GL_VERTEX_PROGRAM_ARB); - qglEnable(GL_FRAGMENT_PROGRAM_ARB); - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, shadowResampleVertexProgram ); - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, shadowResampleFragmentProgram ); - - // convert 0..viewport-1 sizes to fractions inside the POT screen depth texture - // shrink by one unit for bilerp - float parm[4]; - parm[0] = 1.0 / (maxViewBufferSize+1) * viewBufferSize / maxViewBufferSize; - parm[1] = parm[0]; - parm[2] = 0; - parm[3] = 1; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 0, parm ); - } - - GL_Cull( CT_BACK_SIDED ); - qglDepthFunc( GL_GREATER ); - - RB_DrawElementsWithCounters( tri ); - - qglDisable(GL_VERTEX_PROGRAM_ARB); - qglDisable(GL_FRAGMENT_PROGRAM_ARB); - - GL_Cull( CT_FRONT_SIDED ); - - qglDepthFunc( GL_LEQUAL ); - if ( r_sb_showFrustumPixels.GetBool() ) { - qglEnable( GL_TEXTURE_2D ); - qglColor3f( 1, 1, 1 ); - } - - // after all the frustums have been drawn, the surfaces that have been drawn on will get interactions - // scissor may still be a win even with the stencil test for very fast rejects - qglStencilFunc( GL_EQUAL, 0, 255 ); - qglStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); -} - - -/* -================== -RB_EXP_CoverScreen -================== -*/ -void RB_EXP_CoverScreen( void ) { - // draw a full screen quad - qglMatrixMode( GL_PROJECTION ); - qglLoadIdentity(); - qglOrtho( 0, 1, 0, 1, -1, 1 ); - qglMatrixMode( GL_MODELVIEW ); - qglLoadIdentity(); - - qglBegin( GL_TRIANGLE_FAN ); - qglVertex2f( 0, 0 ); - qglVertex2f( 0, 1 ); - qglVertex2f( 1, 1 ); - qglVertex2f( 1, 0 ); - qglEnd(); -} - -/* -================== -RB_EXP_ReadFloatBuffer -================== -*/ -void RB_EXP_ReadFloatBuffer( void ) { - int pixels = glConfig.vidWidth * glConfig.vidHeight; - float *buf = (float *)R_StaticAlloc( pixels * 4 * sizeof( float ) ); - - qglReadPixels( 0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_RGBA, GL_FLOAT, buf ); - - float mins[4] = { 9999, 9999, 9999, 9999 }; - float maxs[4] = { -9999, -9999, -9999, -9999 }; - for ( int i = 0 ; i < pixels ; i++ ) { - for ( int j = 0 ; j < 4 ; j++ ) { - float v = buf[ i*4 + j ]; - if ( v < mins[j] ) { - mins[j] = v; - } - if ( v > maxs[j] ) { - maxs[j] = v; - } - } - } - - RB_EXP_SetNativeBuffer(); - - qglLoadIdentity(); - qglMatrixMode( GL_PROJECTION ); - GL_State( GLS_DEPTHFUNC_ALWAYS ); - qglColor3f( 1, 1, 1 ); - qglPushMatrix(); - qglLoadIdentity(); - qglDisable( GL_TEXTURE_2D ); - qglOrtho( 0, 1, 0, 1, -1, 1 ); - qglRasterPos2f( 0.01f, 0.01f ); - qglDrawPixels( glConfig.vidWidth, glConfig.vidHeight, GL_RGBA, GL_FLOAT, buf ); - qglPopMatrix(); - qglEnable( GL_TEXTURE_2D ); - qglMatrixMode( GL_MODELVIEW ); - - R_StaticFree( buf ); -} - - -void RB_TestGamma( void ); - -/* -================== -RB_EXP_GammaDither -================== -*/ -void RB_EXP_GammaDither( void ) { - if ( !r_hdr_useFloats.GetBool() ) { - return; - } - -#if 0 -r_testGamma.SetBool( true ); -RB_TestGamma(); -r_testGamma.SetBool( false ); -#endif - - RB_EXP_SetNativeBuffer(); - - /* -# texture 0 is the high dynamic range buffer -# texture 1 is the random dither texture -# texture 2 is the light bloom texture - -# writes result.color as the 32 bit dithered and gamma corrected values - -PARAM exposure = program.local[0]; # multiply HDR value by this to get screen pixels -PARAM gammaPower = program.local[1]; -PARAM monitorDither = program.local[2]; -PARAM positionToDitherScale = program.local[3]; -PARAM bloomFraction = program.local[4]; -PARAM positionToBloomScale = program.local[5]; - - */ - - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB,gammaDitherVertexProgram ); - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, gammaDitherFragmentProgram ); - qglEnable(GL_VERTEX_PROGRAM_ARB); - qglEnable(GL_FRAGMENT_PROGRAM_ARB); - - qglActiveTextureARB( GL_TEXTURE2_ARB ); - qglBindTexture( GL_TEXTURE_RECTANGLE_NV, floatPbufferQuarterImage->texnum ); - R_BindTexImage( floatPbufferQuarter ); - - qglActiveTextureARB( GL_TEXTURE1_ARB ); - random256Image->BindFragment(); - - qglActiveTextureARB( GL_TEXTURE0_ARB ); - qglBindTexture( GL_TEXTURE_RECTANGLE_NV, floatPbufferImage->texnum ); - R_BindTexImage( floatPbuffer ); - - float parm[4]; - - parm[0] = r_hdr_exposure.GetFloat(); - parm[1] = 0; - parm[2] = 0; - parm[3] = 0; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 0, parm ); - - parm[0] = r_hdr_gamma.GetFloat(); - parm[1] = 0; - parm[2] = 0; - parm[3] = 0; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 1, parm ); - - parm[0] = r_hdr_monitorDither.GetFloat(); - parm[1] = 0; - parm[2] = 0; - parm[3] = 0; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 2, parm ); - - parm[0] = 1.0 / 256; - parm[1] = parm[0]; - parm[2] = rand()/65535.0; - parm[3] = rand()/65535.0; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 3, parm ); - - parm[0] = 1.0 - r_hdr_bloomFraction.GetFloat(); - parm[1] = r_hdr_bloomFraction.GetFloat(); - parm[2] = 0; - parm[3] = 0; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 4, parm ); - - parm[0] = 0.25; - parm[1] = 0.25; - parm[2] = 0; - parm[3] = 0; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 5, parm ); - - qglDisable( GL_STENCIL_TEST ); - qglDisable( GL_SCISSOR_TEST ); - qglDisable( GL_DEPTH_TEST ); - - RB_EXP_CoverScreen(); - - qglEnable( GL_DEPTH_TEST ); - - qglDisable(GL_VERTEX_PROGRAM_ARB); - qglDisable(GL_FRAGMENT_PROGRAM_ARB); -} - -/* -================== -RB_EXP_Bloom -================== -*/ -void RB_EXP_Bloom( void ) { - if ( !r_hdr_useFloats.GetBool() ) { - return; - } - - if ( r_hdr_bloomFraction.GetFloat() == 0 ) { - return; - } - - GL_CheckErrors(); - - // - // mip map - // - - // draw to the second floatPbuffer - R_MakeCurrent( floatPbuffer2DC, floatContext, floatPbuffer2 ); - - GL_State( 0 ); - qglDisable( GL_DEPTH_TEST ); - qglDisable( GL_SCISSOR_TEST ); - - qglEnable(GL_VERTEX_PROGRAM_ARB); - qglEnable(GL_FRAGMENT_PROGRAM_ARB); - - qglClearColor( 1.0, 0.5, 0, 0 ); - qglClear( GL_COLOR_BUFFER_BIT ); - qglViewport( 0, 0, glConfig.vidWidth>>1, glConfig.vidHeight>>1 ); - - // read from the original floatPbuffer - qglActiveTextureARB( GL_TEXTURE0_ARB ); - qglBindTexture( GL_TEXTURE_RECTANGLE_NV, floatPbufferImage->texnum ); - R_BindTexImage( floatPbuffer ); - - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, downSampleVertexProgram ); - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, downSampleFragmentProgram ); - - RB_EXP_CoverScreen(); - - // - // mip map again - // - qglViewport( 0, 0, glConfig.vidWidth>>2, glConfig.vidHeight>>2 ); - - // draw to the second floatPbuffer - R_MakeCurrent( floatPbufferQuarterDC, floatContext, floatPbufferQuarter ); - - // read from the original floatPbuffer - qglBindTexture( GL_TEXTURE_RECTANGLE_NV, floatPbuffer2Image->texnum ); - R_BindTexImage( floatPbuffer2 ); - - RB_EXP_CoverScreen(); - - // - // blur horizontally - // - /* -# texture 0 is the high dynamic range buffer -# writes result.color as the fp16 result of a smeared bloom - -PARAM step = program.local[0]; # { 1, 0 } or { 0, 1 } for horizontal / vertical separation - */ - - // draw to the second floatPbuffer - R_MakeCurrent( floatPbuffer2DC, floatContext, floatPbuffer2 ); - - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, bloomVertexProgram ); - qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, bloomFragmentProgram ); - qglEnable(GL_VERTEX_PROGRAM_ARB); - qglEnable(GL_FRAGMENT_PROGRAM_ARB); - - GL_SelectTextureNoClient( 0 ); - - // blur horizontally first to the second floatPbuffer - qglBindTexture( GL_TEXTURE_RECTANGLE_NV, floatPbufferQuarterImage->texnum ); - R_BindTexImage( floatPbufferQuarter ); - - float parm[4]; - - parm[0] = 1; - parm[1] = 0; - parm[2] = 0; - parm[3] = 0; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 0, parm ); - - RB_EXP_CoverScreen(); - - // - // now blur vertically back to the quarter pbuffer - // - R_MakeCurrent( floatPbufferQuarterDC, floatContext, floatPbufferQuarter ); - - qglBindTexture( GL_TEXTURE_RECTANGLE_NV, floatPbuffer2Image->texnum ); - R_BindTexImage( floatPbuffer2 ); - - parm[0] = 0; - parm[1] = 1; - parm[2] = 0; - parm[3] = 0; - qglProgramLocalParameter4fvARB( GL_FRAGMENT_PROGRAM_ARB, 0, parm ); - - RB_EXP_CoverScreen(); - - //======================== - - qglEnable( GL_DEPTH_TEST ); - qglEnable( GL_SCISSOR_TEST ); - - qglDisable(GL_VERTEX_PROGRAM_ARB); - qglDisable(GL_FRAGMENT_PROGRAM_ARB); - - GL_CheckErrors(); -} - -/* -================== -RB_Exp_DrawInteractions -================== -*/ -void RB_Exp_DrawInteractions( void ) { - if ( !initialized ) { - R_Exp_Allocate(); - } - - if ( !backEnd.viewDef->viewLights ) { - return; - } - - // validate the samples - if ( r_sb_samples.GetInteger() != 16 && r_sb_samples.GetInteger() != 4 && r_sb_samples.GetInteger() != 1 ) { - r_sb_samples.SetInteger( 0 ); - } - - // validate the light resolution - if ( r_sb_lightResolution.GetInteger() < 64 ) { - r_sb_lightResolution.SetInteger( 64 ); - } else if ( r_sb_lightResolution.GetInteger() > maxLightBufferSize ) { - r_sb_lightResolution.SetInteger( maxLightBufferSize ); - } - lightBufferSize = r_sb_lightResolution.GetInteger(); - lightBufferSizeFraction = (float)lightBufferSize / maxLightBufferSize; - - // validate the view resolution - if ( r_sb_viewResolution.GetInteger() < 64 ) { - r_sb_viewResolution.SetInteger( 64 ); - } else if ( r_sb_viewResolution.GetInteger() > maxViewBufferSize ) { - r_sb_viewResolution.SetInteger( maxViewBufferSize ); - } - viewBufferSize = r_sb_viewResolution.GetInteger(); - viewBufferHeight = viewBufferSize * 3 / 4; - viewBufferSizeFraction = (float)viewBufferSize / maxViewBufferSize; - viewBufferHeightFraction = (float)viewBufferHeight / maxViewBufferSize; - if ( viewBufferSize == backEnd.viewDef->viewport.x2 - backEnd.viewDef->viewport.x1 + 1 ) { - nativeViewBuffer = true; - } else { - nativeViewBuffer = false; - } - - // set up for either point sampled or percentage-closer filtering for the shadow sampling - shadowImage[0]->BindFragment(); - if ( r_sb_linearFilter.GetBool() ) { - qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - } else { - qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); - qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); - } - qglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE ); - - globalImages->BindNull(); - - // copy the current depth buffer to a texture for image-space shadowing, - // or re-render at a lower resolution - R_EXP_RenderViewDepthImage(); - - GL_SelectTexture( 0 ); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - - // disable stencil shadow test - qglStencilFunc( GL_ALWAYS, 128, 255 ); - - // the jitter image will be used to offset sample centers - GL_SelectTextureNoClient( 8 ); - if ( r_sb_samples.GetInteger() == 16 ) { - jitterImage16->BindFragment(); - } else if ( r_sb_samples.GetInteger() == 4 ) { - jitterImage4->BindFragment(); - } else { - jitterImage1->BindFragment(); - } - - // if we are using a float buffer, clear it now - if ( r_hdr_useFloats.GetBool() ) { - RB_EXP_SetRenderBuffer( NULL ); - // we need to set a lot of things, because this is a completely different context - RB_SetDefaultGLState(); - qglClearColor( 0.001f, 1.0f, 0.01f, 0.1f ); - qglClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); - // clear the z buffer, set the projection matrix, etc - RB_BeginDrawingView(); - RB_STD_FillDepthBuffer( (drawSurf_t **)&backEnd.viewDef->drawSurfs[0], backEnd.viewDef->numDrawSurfs ); - } - - - // - // for each light, perform adding and shadowing - // - for ( viewLight_t *vLight = backEnd.viewDef->viewLights ; vLight ; vLight = vLight->next ) { - backEnd.vLight = vLight; - - const idMaterial *lightShader = vLight->lightShader; - - // do fogging later - if ( lightShader->IsFogLight() ) { - continue; - } - if ( lightShader->IsBlendLight() ) { - continue; - } - - if ( !vLight->localInteractions && !vLight->globalInteractions - && !vLight->translucentInteractions ) { - continue; - } - - if ( !vLight->frustumTris->ambientCache ) { - R_CreateAmbientCache( const_cast(vLight->frustumTris), false ); - } - - // all light side projections must currently match, so non-centered - // and non-cubic lights must take the largest length - viewLightAxialSize = R_EXP_CalcLightAxialSize( vLight ); - - int side, sideStop; - - if ( vLight->lightDef->parms.pointLight ) { - if ( r_sb_singleSide.GetInteger() != -1 ) { - side = r_sb_singleSide.GetInteger(); - sideStop = side+1; - } else { - side = 0; - sideStop = 6; - } - } else { - side = -1; - sideStop = 0; - } - - for ( ; side < sideStop ; side++ ) { - // FIXME: check for frustums completely off the screen - - // render a shadow buffer - RB_RenderShadowBuffer( vLight, side ); - - // back to view rendering, possibly in the off-screen buffer - if ( nativeViewBuffer || !r_sb_screenSpaceShadow.GetBool() ) { - // directly to screen - RB_EXP_SetRenderBuffer( vLight ); - } else { - // to off screen buffer - if ( r_sb_usePbuffer.GetBool() ) { - GL_CheckErrors(); - // set the current openGL drawable to the shadow buffer - R_MakeCurrent( viewPbufferDC, win32.hGLRC, viewPbuffer ); - } - qglViewport( 0, 0, viewBufferSize, viewBufferHeight ); - qglScissor( 0, 0, viewBufferSize, viewBufferHeight ); // !@# FIXME: scale light scissor - } - - // render the shadows into destination alpha on the included pixels - RB_Exp_SelectFrustum( vLight, side ); - - if ( !r_sb_screenSpaceShadow.GetBool() ) { - // bind shadow buffer to texture - GL_SelectTextureNoClient( 7 ); - shadowImage[0]->BindFragment(); - - RB_EXP_CreateDrawInteractions( vLight->localInteractions ); - RB_EXP_CreateDrawInteractions( vLight->globalInteractions ); - backEnd.depthFunc = GLS_DEPTHFUNC_LESS; - RB_EXP_CreateDrawInteractions( vLight->translucentInteractions ); - backEnd.depthFunc = GLS_DEPTHFUNC_EQUAL; - } - } - - // render the native window coordinates interactions - if ( r_sb_screenSpaceShadow.GetBool() ) { - if ( !nativeViewBuffer ) { - RB_shadowResampleAlpha(); - qglEnable( GL_STENCIL_TEST ); - } else { - RB_EXP_SetRenderBuffer( vLight ); -if ( r_ignore.GetBool() ) { -qglEnable( GL_STENCIL_TEST ); //!@# -} else { -qglDisable( GL_STENCIL_TEST ); //!@# -} - } - RB_EXP_CreateDrawInteractions( vLight->localInteractions ); - RB_EXP_CreateDrawInteractions( vLight->globalInteractions ); - backEnd.depthFunc = GLS_DEPTHFUNC_LESS; - RB_EXP_CreateDrawInteractions( vLight->translucentInteractions ); - backEnd.depthFunc = GLS_DEPTHFUNC_EQUAL; - } - } - - GL_SelectTexture( 0 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - - // experimental transfer function - for ( int i = 7 ; i >= 0 ; i-- ) { - GL_SelectTextureNoClient( i ); - globalImages->BindNull(); - } - GL_State( 0 ); - - RB_EXP_Bloom(); - RB_EXP_GammaDither(); - - // these haven't been state saved - for ( int i = 0 ; i < 8 ; i++ ) { - backEnd.glState.tmu[i].current2DMap = -1; - } - - // take it out of texture compare mode so I can testImage it for debugging - shadowImage[0]->BindFragment(); - qglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE ); - - -} - - - -/* -================== -R_Exp_Init -================== -*/ -void R_Exp_Init( void ) { - glConfig.allowExpPath = false; - - common->Printf( "---------- R_Exp_Init ----------\n" ); - - if ( !glConfig.ARBVertexProgramAvailable || !glConfig.ARBFragmentProgramAvailable ) { - common->Printf( "Not available.\n" ); - return; - } -RB_CreateBloomTable(); -#if 0 - if ( !R_CheckExtension( "GL_NV_float_buffer" ) ) { - common->Printf( "Not available.\n" ); - return; - } - if ( !R_CheckExtension( "GL_NV_texture_rectangle" ) ) { - common->Printf( "Not available.\n" ); - return; - } -#endif - -#if 0 - qglCombinerParameterfvNV = (void (APIENTRY *)( GLenum pname, const GLfloat *params )) - GLimp_ExtensionPointer( "glCombinerParameterfvNV" ); -#endif - - common->Printf( "Available.\n" ); - - if ( !idStr::Icmp( r_renderer.GetString(), "exp" ) ) { - R_Exp_Allocate(); - } - - common->Printf( "--------------------------------------------\n" ); - - glConfig.allowExpPath = true; -} diff --git a/src/renderer/draw_nv10.cpp b/src/renderer/draw_nv10.cpp deleted file mode 100644 index 02ef3e44..00000000 --- a/src/renderer/draw_nv10.cpp +++ /dev/null @@ -1,647 +0,0 @@ -/* -=========================================================================== - -Doom 3 GPL Source Code -Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. - -This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?). - -Doom 3 Source Code is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Doom 3 Source Code is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Doom 3 Source Code. If not, see . - -In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below. - -If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. - -=========================================================================== -*/ -#include "precompiled.h" -#pragma hdrstop - -#include "tr_local.h" - - -/* -================== -RB_RenderInteraction - -backEnd.vLight -backEnd.lightScale - - -backEnd.depthFunc must be equal for alpha tested surfaces to work right, -it is set to lessThan for blended transparent surfaces - -This expects a bumpmap stage before a diffuse stage before a specular stage -The material code is responsible for guaranteeing that, but conditional stages -can still make it invalid. - -you can't blend two bumpmaps, but you can change bump maps between -blended diffuse / specular maps to get the same effect - - -================== -*/ -static void RB_RenderInteraction( const drawSurf_t *surf ) { - const idMaterial *surfaceShader = surf->material; - const float *surfaceRegs = surf->shaderRegisters; - const viewLight_t *vLight = backEnd.vLight; - const idMaterial *lightShader = vLight->lightShader; - const float *lightRegs = vLight->shaderRegisters; - static idPlane lightProject[4]; // reused across function calls - const srfTriangles_t *tri = surf->geo; - const shaderStage_t *lastBumpStage = NULL; - - RB_LogComment( "---------- RB_RenderInteraction %s on %s ----------\n", - lightShader->GetName(), surfaceShader->GetName() ); - - // change the matrix and light projection vectors if needed - if ( surf->space != backEnd.currentSpace ) { - backEnd.currentSpace = surf->space; - qglLoadMatrixf( surf->space->modelViewMatrix ); - - for ( int i = 0 ; i < 4 ; i++ ) { - R_GlobalPlaneToLocal( surf->space->modelMatrix, backEnd.vLight->lightProject[i], lightProject[i] ); - } - } - - // change the scissor if needed - if ( r_useScissor.GetBool() && !backEnd.currentScissor.Equals( surf->scissorRect ) ) { - backEnd.currentScissor = surf->scissorRect; - qglScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, - backEnd.viewDef->viewport.y1 + backEnd.currentScissor.y1, - backEnd.currentScissor.x2 + 1 - backEnd.currentScissor.x1, - backEnd.currentScissor.y2 + 1 - backEnd.currentScissor.y1 ); - } - - // hack depth range if needed - if ( surf->space->weaponDepthHack ) { - RB_EnterWeaponDepthHack(); - } - - if ( surf->space->modelDepthHack != 0.0f ) { - RB_EnterModelDepthHack( surf->space->modelDepthHack ); - } - - - // set the vertex arrays, which may not all be enabled on a given pass - idDrawVert *ac = (idDrawVert *)vertexCache.Position(tri->ambientCache); - qglVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->xyz.ToFloatPtr() ); - GL_SelectTexture( 0 ); - qglTexCoordPointer( 2, GL_FLOAT, sizeof( idDrawVert ), ac->st.ToFloatPtr() ); - qglColorPointer( 4, GL_UNSIGNED_BYTE, sizeof( idDrawVert ), ac->color ); - - - // go through the individual stages - for ( int i = 0 ; i < surfaceShader->GetNumStages() ; i++ ) { - const shaderStage_t *surfaceStage = surfaceShader->GetStage( i ); - - // ignore ambient stages while drawing interactions - if ( surfaceStage->lighting == SL_AMBIENT ) { - continue; - } - - // ignore stages that fail the condition - if ( !surfaceRegs[ surfaceStage->conditionRegister ] ) { - continue; - } - - //----------------------------------------------------- - // - // bump / falloff - // - //----------------------------------------------------- - if ( surfaceStage->lighting == SL_BUMP ) { - // render light falloff * bumpmap lighting - - if ( surfaceStage->vertexColor != SVC_IGNORE ) { - common->Printf( "shader %s: vertexColor on a bump stage\n", - surfaceShader->GetName() ); - } - - // check for RGBA modulations in the stage, which are also illegal? - - // save the bump map stage for the specular calculation and diffuse - // error checking - lastBumpStage = surfaceStage; - - // - // ambient lights combine non-directional bump and falloff - // and write to the alpha channel - // - if ( lightShader->IsAmbientLight() ) { - GL_State( GLS_COLORMASK | GLS_DEPTHMASK | backEnd.depthFunc ); - - // texture 0 will be the per-surface bump map - GL_SelectTexture( 0 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - - RB_BindStageTexture( surfaceRegs, &surfaceStage->texture, surf ); - // development aid - if ( r_skipBump.GetBool() ) { - globalImages->flatNormalMap->Bind(); - } - - // texture 1 will be the light falloff - GL_SelectTexture( 1 ); - - qglEnable( GL_TEXTURE_GEN_S ); - qglTexGenfv( GL_S, GL_OBJECT_PLANE, lightProject[3].ToFloatPtr() ); - qglTexCoord2f( 0, 0.5 ); - vLight->falloffImage->Bind(); - - qglCombinerParameteriNV( GL_NUM_GENERAL_COMBINERS_NV, 2 ); - - // set the constant color to a bit of an angle - qglCombinerParameterfvNV( GL_CONSTANT_COLOR0_NV, tr.ambientLightVector.ToFloatPtr() ); - - // stage 0 sets primary_color = bump dot constant color - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, - GL_CONSTANT_COLOR0_NV, GL_EXPAND_NORMAL_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, - GL_TEXTURE0_ARB, GL_EXPAND_NORMAL_NV, GL_RGB ); - qglCombinerOutputNV( GL_COMBINER0_NV, GL_RGB, - GL_PRIMARY_COLOR_NV, GL_DISCARD_NV, GL_DISCARD_NV, - GL_NONE, GL_NONE, GL_TRUE, GL_FALSE, GL_FALSE ); - - // stage 1 alpha sets primary_color = primary_color * falloff - qglCombinerInputNV( GL_COMBINER1_NV, GL_ALPHA, GL_VARIABLE_A_NV, - GL_PRIMARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_BLUE ); - qglCombinerInputNV( GL_COMBINER1_NV, GL_ALPHA, GL_VARIABLE_B_NV, - GL_TEXTURE1_ARB, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA ); - qglCombinerOutputNV( GL_COMBINER1_NV, GL_ALPHA, - GL_PRIMARY_COLOR_NV, GL_DISCARD_NV, GL_DISCARD_NV, - GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE ); - - // final combiner takes the result for the alpha channel - qglFinalCombinerInputNV( GL_VARIABLE_A_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_B_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_C_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_D_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_G_NV, GL_PRIMARY_COLOR_NV, - GL_UNSIGNED_IDENTITY_NV, GL_ALPHA ); - - // draw it - RB_DrawElementsWithCounters( tri ); - - globalImages->BindNull(); - qglDisable( GL_TEXTURE_GEN_S ); - - GL_SelectTexture( 0 ); - RB_FinishStageTexture( &surfaceStage->texture, surf ); - continue; - } - - // - // draw light falloff to the alpha channel - // - GL_State( GLS_COLORMASK | GLS_DEPTHMASK | backEnd.depthFunc ); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - qglDisableClientState( GL_COLOR_ARRAY ); - qglEnable( GL_TEXTURE_GEN_S ); - qglTexGenfv( GL_S, GL_OBJECT_PLANE, lightProject[3].ToFloatPtr() ); - qglTexCoord2f( 0, 0.5 ); - vLight->falloffImage->Bind(); - - // make sure a combiner output doesn't step on the texture - qglCombinerParameteriNV( GL_NUM_GENERAL_COMBINERS_NV, 1 ); - qglCombinerOutputNV( GL_COMBINER0_NV, GL_ALPHA, - GL_DISCARD_NV, GL_DISCARD_NV, GL_DISCARD_NV, - GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE ); - - // final combiner - qglFinalCombinerInputNV( GL_VARIABLE_A_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_B_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_C_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_D_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_G_NV, GL_TEXTURE0_ARB, - GL_UNSIGNED_IDENTITY_NV, GL_ALPHA ); - - // draw it - RB_DrawElementsWithCounters( tri ); - - qglDisable( GL_TEXTURE_GEN_S ); - - // - // draw the bump map result onto the alpha channel - // - GL_State( GLS_SRCBLEND_DST_ALPHA | GLS_DSTBLEND_ZERO | GLS_COLORMASK | GLS_DEPTHMASK - | backEnd.depthFunc ); - - // texture 0 will be the per-surface bump map - GL_SelectTexture( 0 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - RB_BindStageTexture( surfaceRegs, &surfaceStage->texture, surf ); - - // texture 1 is the normalization cube map - // the texccords are the non-normalized vector towards the light origin - GL_SelectTexture( 1 ); - globalImages->normalCubeMapImage->Bind(); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - qglTexCoordPointer( 3, GL_FLOAT, sizeof( lightingCache_t ), ((lightingCache_t *)vertexCache.Position(tri->lightingCache))->localLightVector.ToFloatPtr() ); - - qglDisableClientState( GL_COLOR_ARRAY ); - - // program the nvidia register combiners - // I just want alpha = Dot( texture0, texture1 ) - qglCombinerParameteriNV( GL_NUM_GENERAL_COMBINERS_NV, 1 ); - - // stage 0 rgb performs the dot product - // SPARE0 = TEXTURE0 dot TEXTURE1 - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, - GL_TEXTURE1_ARB, GL_EXPAND_NORMAL_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, - GL_TEXTURE0_ARB, GL_EXPAND_NORMAL_NV, GL_RGB ); - qglCombinerOutputNV( GL_COMBINER0_NV, GL_RGB, - GL_SPARE0_NV, GL_DISCARD_NV, GL_DISCARD_NV, - GL_NONE, GL_NONE, GL_TRUE, GL_FALSE, GL_FALSE ); - - // final combiner just takes the dot result and puts it in alpha - qglFinalCombinerInputNV( GL_VARIABLE_G_NV, GL_SPARE0_NV, - GL_UNSIGNED_IDENTITY_NV, GL_BLUE ); - - // draw it - RB_DrawElementsWithCounters( tri ); - - globalImages->BindNull(); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - - GL_SelectTexture( 0 ); - RB_FinishStageTexture( &surfaceStage->texture, surf ); - continue; - } - - if ( surfaceStage->lighting == SL_DIFFUSE ) { - if ( !lastBumpStage ) { - common->Printf( "shader %s: diffuse stage without a preceeding bumpmap stage\n", - surfaceShader->GetName() ); - continue; - } - } - - //----------------------------------------------------- - // - // specular exponent modification of the bump / falloff - // - //----------------------------------------------------- - if ( surfaceStage->lighting == SL_SPECULAR ) { - // put specular bump map into alpha channel, then treat as a diffuse - - // allow the specular to be skipped as a user speed optimization - if ( r_skipSpecular.GetBool() ) { - continue; - } - - // ambient lights don't have specular - if ( lightShader->IsAmbientLight() ) { - continue; - } - - if ( !lastBumpStage ) { - common->Printf( "shader %s: specular stage without a preceeding bumpmap stage\n", - surfaceShader->GetName() ); - continue; - } - - GL_State( GLS_SRCBLEND_DST_ALPHA | GLS_DSTBLEND_SRC_ALPHA | GLS_COLORMASK | GLS_DEPTHMASK - | backEnd.depthFunc ); - - // texture 0 will be the per-surface bump map - GL_SelectTexture( 0 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - RB_BindStageTexture( surfaceRegs, &lastBumpStage->texture, surf ); - - // development aid - if ( r_skipBump.GetBool() ) { - globalImages->flatNormalMap->Bind(); - } - - // texture 1 is the normalization cube map - // indexed by the dynamic halfangle texcoords - GL_SelectTexture( 1 ); - globalImages->normalCubeMapImage->Bind(); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - qglTexCoordPointer( 4, GL_FLOAT, 0, vertexCache.Position( surf->dynamicTexCoords ) ); - - // program the nvidia register combiners - qglCombinerParameteriNV( GL_NUM_GENERAL_COMBINERS_NV, 2 ); - - // stage 0 rgb performs the dot product - // GL_PRIMARY_COLOR_NV = ( TEXTURE0 dot TEXTURE1 - 0.5 ) * 2 - // the scale and bias steepen the specular curve - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, - GL_TEXTURE1_ARB, GL_EXPAND_NORMAL_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, - GL_TEXTURE0_ARB, GL_EXPAND_NORMAL_NV, GL_RGB ); - qglCombinerOutputNV( GL_COMBINER0_NV, GL_RGB, - GL_PRIMARY_COLOR_NV, GL_DISCARD_NV, GL_DISCARD_NV, - GL_SCALE_BY_TWO_NV, GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_TRUE, GL_FALSE, GL_FALSE ); - - // stage 0 alpha does nothing - qglCombinerOutputNV( GL_COMBINER0_NV, GL_ALPHA, - GL_DISCARD_NV, GL_DISCARD_NV, GL_DISCARD_NV, - GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE ); - - // stage 1 rgb does nothing - qglCombinerOutputNV( GL_COMBINER1_NV, GL_RGB, - GL_PRIMARY_COLOR_NV, GL_DISCARD_NV, GL_DISCARD_NV, - GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE ); - - // stage 1 alpha takes bump * bump - // PRIMARY_COLOR = ( GL_PRIMARY_COLOR_NV * GL_PRIMARY_COLOR_NV - 0.5 ) * 2 - // the scale and bias steepen the specular curve - qglCombinerInputNV( GL_COMBINER1_NV, GL_ALPHA, GL_VARIABLE_A_NV, - GL_PRIMARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_BLUE ); - qglCombinerInputNV( GL_COMBINER1_NV, GL_ALPHA, GL_VARIABLE_B_NV, - GL_PRIMARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_BLUE ); - qglCombinerOutputNV( GL_COMBINER1_NV, GL_ALPHA, - GL_PRIMARY_COLOR_NV, GL_DISCARD_NV, GL_DISCARD_NV, - GL_SCALE_BY_TWO_NV, GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_FALSE, GL_FALSE, GL_FALSE ); - - // final combiner - qglFinalCombinerInputNV( GL_VARIABLE_D_NV, GL_PRIMARY_COLOR_NV, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_A_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_B_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_C_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_G_NV, GL_PRIMARY_COLOR_NV, - GL_UNSIGNED_IDENTITY_NV, GL_ALPHA ); - - // draw it - RB_DrawElementsWithCounters( tri ); - - globalImages->BindNull(); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - - GL_SelectTexture( 0 ); - - RB_FinishStageTexture( &lastBumpStage->texture, surf ); - - // the bump map in the alpha channel is now corrupted, so a normal diffuse - // map can't be drawn unless a new bumpmap is put down - lastBumpStage = NULL; - - // fall through to the common handling of diffuse and specular projected lighting - } - - //----------------------------------------------------- - // - // projected light / surface color for diffuse and specular maps - // - //----------------------------------------------------- - if ( surfaceStage->lighting == SL_DIFFUSE || surfaceStage->lighting == SL_SPECULAR ) { - // don't trash alpha - GL_State( GLS_SRCBLEND_DST_ALPHA | GLS_DSTBLEND_ONE | GLS_ALPHAMASK | GLS_DEPTHMASK - | backEnd.depthFunc ); - - // texture 0 will get the surface color texture - GL_SelectTexture( 0 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - RB_BindStageTexture( surfaceRegs, &surfaceStage->texture, surf ); - - // development aid - if ( ( surfaceStage->lighting == SL_DIFFUSE && r_skipDiffuse.GetBool() ) - || ( surfaceStage->lighting == SL_SPECULAR && r_skipSpecular.GetBool() ) ) { - globalImages->blackImage->Bind(); - } - - // texture 1 will get the light projected texture - GL_SelectTexture( 1 ); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - qglEnable( GL_TEXTURE_GEN_S ); - qglEnable( GL_TEXTURE_GEN_T ); - qglEnable( GL_TEXTURE_GEN_Q ); - qglTexGenfv( GL_S, GL_OBJECT_PLANE, lightProject[0].ToFloatPtr() ); - qglTexGenfv( GL_T, GL_OBJECT_PLANE, lightProject[1].ToFloatPtr() ); - qglTexGenfv( GL_Q, GL_OBJECT_PLANE, lightProject[2].ToFloatPtr() ); - - // texture0 * texture1 * primaryColor * constantColor - qglCombinerParameteriNV( GL_NUM_GENERAL_COMBINERS_NV, 1 ); - - // SPARE0 = TEXTURE0 * PRIMARY_COLOR - // SPARE1 = TEXTURE1 * CONSTANT_COLOR - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, - GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - // variable B will be overriden based on the stage vertexColor option - if ( surfaceStage->vertexColor == SVC_MODULATE ) { - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, - GL_PRIMARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglEnableClientState( GL_COLOR_ARRAY ); - } else if ( surfaceStage->vertexColor == SVC_INVERSE_MODULATE ) { - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, - GL_PRIMARY_COLOR_NV, GL_UNSIGNED_INVERT_NV, GL_RGB ); - qglEnableClientState( GL_COLOR_ARRAY ); - } else { // SVC_IGNORE - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, - GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_RGB ); - qglDisableClientState( GL_COLOR_ARRAY ); - } - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV, - GL_TEXTURE1_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV, - GL_CONSTANT_COLOR1_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerOutputNV( GL_COMBINER0_NV, GL_RGB, - GL_SPARE0_NV, GL_SPARE1_NV, GL_DISCARD_NV, - GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE ); - - // final combiner - qglFinalCombinerInputNV( GL_VARIABLE_A_NV, GL_SPARE1_NV, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_B_NV, GL_SPARE0_NV, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_C_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_D_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_G_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_ALPHA ); - - // for all light stages, multiply the projected color by the surface - // color, and blend with the framebuffer - for ( int j = 0 ; j < lightShader->GetNumStages() ; j++ ) { - const shaderStage_t *lightStage = lightShader->GetStage( j ); - float color[4]; - - // ignore stages that fail the condition - if ( !lightRegs[ lightStage->conditionRegister ] ) { - continue; - } - - // set the color to the light color times the surface color - color[0] = backEnd.lightScale - * lightRegs[ lightStage->color.registers[0] ] - * surfaceRegs[ surfaceStage->color.registers[0] ]; - color[1] = backEnd.lightScale - * lightRegs[ lightStage->color.registers[1] ] - * surfaceRegs[ surfaceStage->color.registers[1] ]; - color[2] = backEnd.lightScale - * lightRegs[ lightStage->color.registers[2] ] - * surfaceRegs[ surfaceStage->color.registers[2] ]; - color[3] = 1; - - // don't draw if it would be all black - if ( color[0] == 0 && color[1] == 0 && color[2] == 0 ) { - continue; - } - - qglCombinerParameterfvNV( GL_CONSTANT_COLOR1_NV, color ); - - RB_BindStageTexture( lightRegs, &lightStage->texture, surf ); - - RB_DrawElementsWithCounters( tri ); - - RB_FinishStageTexture( &lightStage->texture, surf ); - } - - if ( surfaceStage->vertexColor != SVC_IGNORE ) { - qglDisableClientState( GL_COLOR_ARRAY ); - } - - qglDisable( GL_TEXTURE_GEN_S ); - qglDisable( GL_TEXTURE_GEN_T ); - qglDisable( GL_TEXTURE_GEN_Q ); - - globalImages->BindNull(); - GL_SelectTexture( 0 ); - RB_FinishStageTexture( &surfaceStage->texture, surf ); - - continue; - } - - } - // unhack depth range if needed - if ( surf->space->weaponDepthHack || surf->space->modelDepthHack != 0.0f ) { - RB_LeaveDepthHack(); - } -} - -/* -================== -RB_RenderInteractionList -================== -*/ -static void RB_RenderInteractionList( const drawSurf_t *surf ) { - if ( !surf ) { - return; - } - - qglEnable( GL_REGISTER_COMBINERS_NV ); - - // force a space calculation for light vectors - backEnd.currentSpace = NULL; - - for ( const drawSurf_t *s = surf ; s ; s = s->nextOnLight ) { - RB_RenderInteraction( s ); - } - - qglDisable( GL_REGISTER_COMBINERS_NV ); -} - - - -/* -================== -RB_RenderViewLight - -================== -*/ -static void RB_RenderViewLight( viewLight_t *vLight ) { - backEnd.vLight = vLight; - - // do fogging later - if ( vLight->lightShader->IsFogLight() ) { - return; - } - if ( vLight->lightShader->IsBlendLight() ) { - return; - } - - RB_LogComment( "---------- RB_RenderViewLight 0x%p ----------\n", vLight ); - - // clear the stencil buffer if needed - if ( vLight->globalShadows || vLight->localShadows ) { - backEnd.currentScissor = vLight->scissorRect; - if ( r_useScissor.GetBool() ) { - qglScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, - backEnd.viewDef->viewport.y1 + backEnd.currentScissor.y1, - backEnd.currentScissor.x2 + 1 - backEnd.currentScissor.x1, - backEnd.currentScissor.y2 + 1 - backEnd.currentScissor.y1 ); - } - qglClear( GL_STENCIL_BUFFER_BIT ); - } else { - // no shadows, so no need to read or write the stencil buffer - // we might in theory want to use GL_ALWAYS instead of disabling - // completely, to satisfy the invarience rules - qglStencilFunc( GL_ALWAYS, 128, 255 ); - } - - backEnd.depthFunc = GLS_DEPTHFUNC_EQUAL; - RB_StencilShadowPass( vLight->globalShadows ); - RB_RenderInteractionList( vLight->localInteractions ); - RB_StencilShadowPass( vLight->localShadows ); - RB_RenderInteractionList( vLight->globalInteractions ); - - if ( r_skipTranslucent.GetBool() ) { - return; - } - - // disable stencil testing for translucent interactions, because - // the shadow isn't calculated at their point, and the shadow - // behind them may be depth fighting with a back side, so there - // isn't any reasonable thing to do - qglStencilFunc( GL_ALWAYS, 128, 255 ); - backEnd.depthFunc = GLS_DEPTHFUNC_LESS; - RB_RenderInteractionList( vLight->translucentInteractions ); -} - - -/* -================== -RB_NV10_DrawInteractions -================== -*/ -void RB_NV10_DrawInteractions( void ) { - qglEnable( GL_STENCIL_TEST ); - - for ( viewLight_t *vLight = backEnd.viewDef->viewLights ; vLight ; vLight = vLight->next ) { - RB_RenderViewLight( vLight ); - } -} - - -/* -================== -R_NV10_Init - -================== -*/ -void R_NV10_Init( void ) { - glConfig.allowNV10Path = false; - - if ( !glConfig.registerCombinersAvailable ) { - return; - } - - glConfig.allowNV10Path = true; -} diff --git a/src/renderer/draw_nv20.cpp b/src/renderer/draw_nv20.cpp deleted file mode 100644 index 42e7d5ed..00000000 --- a/src/renderer/draw_nv20.cpp +++ /dev/null @@ -1,885 +0,0 @@ -/* -=========================================================================== - -Doom 3 GPL Source Code -Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. - -This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?). - -Doom 3 Source Code is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Doom 3 Source Code is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Doom 3 Source Code. If not, see . - -In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below. - -If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. - -=========================================================================== -*/ - -#include "precompiled.h" -#pragma hdrstop - -#include "tr_local.h" - -typedef enum { - FPROG_BUMP_AND_LIGHT, - FPROG_DIFFUSE_COLOR, - FPROG_SPECULAR_COLOR, - FPROG_DIFFUSE_AND_SPECULAR_COLOR, - - FPROG_NUM_FRAGMENT_PROGRAMS -} fragmentProgram_t; - -GLuint fragmentDisplayListBase; // FPROG_NUM_FRAGMENT_PROGRAMS lists - -void RB_NV20_DependentSpecularPass( const drawInteraction_t *din ); -void RB_NV20_DependentAmbientPass( void ); - -/* -========================================================================================= - -GENERAL INTERACTION RENDERING - -========================================================================================= -*/ - -/* -==================== -GL_SelectTextureNoClient -==================== -*/ -void GL_SelectTextureNoClient( int unit ) { - backEnd.glState.currenttmu = unit; - qglActiveTextureARB( GL_TEXTURE0_ARB + unit ); - RB_LogComment( "glActiveTextureARB( %i )\n", unit ); -} - -/* -================== -RB_NV20_BumpAndLightFragment -================== -*/ -static void RB_NV20_BumpAndLightFragment( void ) { - if ( r_useCombinerDisplayLists.GetBool() ) { - qglCallList( fragmentDisplayListBase + FPROG_BUMP_AND_LIGHT ); - return; - } - - // program the nvidia register combiners - qglCombinerParameteriNV( GL_NUM_GENERAL_COMBINERS_NV, 3 ); - - // stage 0 rgb performs the dot product - // SPARE0 = TEXTURE0 dot TEXTURE1 - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, - GL_TEXTURE1_ARB, GL_EXPAND_NORMAL_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, - GL_TEXTURE0_ARB, GL_EXPAND_NORMAL_NV, GL_RGB ); - qglCombinerOutputNV( GL_COMBINER0_NV, GL_RGB, - GL_SPARE0_NV, GL_DISCARD_NV, GL_DISCARD_NV, - GL_NONE, GL_NONE, GL_TRUE, GL_FALSE, GL_FALSE ); - - - // stage 1 rgb multiplies texture 2 and 3 together - // SPARE1 = TEXTURE2 * TEXTURE3 - qglCombinerInputNV( GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_A_NV, - GL_TEXTURE2_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_B_NV, - GL_TEXTURE3_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerOutputNV( GL_COMBINER1_NV, GL_RGB, - GL_SPARE1_NV, GL_DISCARD_NV, GL_DISCARD_NV, - GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE ); - - // stage 1 alpha does nohing - - // stage 2 color multiplies spare0 * spare 1 just for debugging - // SPARE0 = SPARE0 * SPARE1 - qglCombinerInputNV( GL_COMBINER2_NV, GL_RGB, GL_VARIABLE_A_NV, - GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER2_NV, GL_RGB, GL_VARIABLE_B_NV, - GL_SPARE1_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerOutputNV( GL_COMBINER2_NV, GL_RGB, - GL_SPARE0_NV, GL_DISCARD_NV, GL_DISCARD_NV, - GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE ); - - // stage 2 alpha multiples spare0 * spare 1 - // SPARE0 = SPARE0 * SPARE1 - qglCombinerInputNV( GL_COMBINER2_NV, GL_ALPHA, GL_VARIABLE_A_NV, - GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_BLUE ); - qglCombinerInputNV( GL_COMBINER2_NV, GL_ALPHA, GL_VARIABLE_B_NV, - GL_SPARE1_NV, GL_UNSIGNED_IDENTITY_NV, GL_BLUE ); - qglCombinerOutputNV( GL_COMBINER2_NV, GL_ALPHA, - GL_SPARE0_NV, GL_DISCARD_NV, GL_DISCARD_NV, - GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE ); - - // final combiner - qglFinalCombinerInputNV( GL_VARIABLE_D_NV, GL_SPARE0_NV, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_A_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_B_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_C_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_G_NV, GL_SPARE0_NV, - GL_UNSIGNED_IDENTITY_NV, GL_ALPHA ); -} - -/* -================== -RB_NV20_DI_BumpAndLightPass - -We are going to write alpha as light falloff * ( bump dot light ) * lightProjection -If the light isn't a monoLightShader, the lightProjection will be skipped, because -it will have to be done on an itterated basis -================== -*/ -static void RB_NV20_DI_BumpAndLightPass( const drawInteraction_t *din, bool monoLightShader ) { - RB_LogComment( "---------- RB_NV_BumpAndLightPass ----------\n" ); - - GL_State( GLS_COLORMASK | GLS_DEPTHMASK | backEnd.depthFunc ); - - // texture 0 is the normalization cube map - // GL_TEXTURE0_ARB will be the normalized vector - // towards the light source -#ifdef MACOS_X - GL_SelectTexture( 0 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); -#else - GL_SelectTextureNoClient( 0 ); -#endif - if ( din->ambientLight ) { - globalImages->ambientNormalMap->Bind(); - } else { - globalImages->normalCubeMapImage->Bind(); - } - - // texture 1 will be the per-surface bump map -#ifdef MACOS_X - GL_SelectTexture( 1 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); -#else - GL_SelectTextureNoClient( 1 ); -#endif - din->bumpImage->Bind(); - - // texture 2 will be the light falloff texture -#ifdef MACOS_X - GL_SelectTexture( 2 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); -#else - GL_SelectTextureNoClient( 2 ); -#endif - din->lightFalloffImage->Bind(); - - // texture 3 will be the light projection texture -#ifdef MACOS_X - GL_SelectTexture( 3 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); -#else - GL_SelectTextureNoClient( 3 ); -#endif - if ( monoLightShader ) { - din->lightImage->Bind(); - } else { - // if the projected texture is multi-colored, we - // will need to do it in subsequent passes - globalImages->whiteImage->Bind(); - } - - // bind our "fragment program" - RB_NV20_BumpAndLightFragment(); - - // draw it - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_NV20_BUMP_AND_LIGHT ); - RB_DrawElementsWithCounters( din->surf->geo ); -} - - -/* -================== -RB_NV20_DiffuseColorFragment -================== -*/ -static void RB_NV20_DiffuseColorFragment( void ) { - if ( r_useCombinerDisplayLists.GetBool() ) { - qglCallList( fragmentDisplayListBase + FPROG_DIFFUSE_COLOR ); - return; - } - - // program the nvidia register combiners - qglCombinerParameteriNV( GL_NUM_GENERAL_COMBINERS_NV, 1 ); - - // stage 0 is free, so we always do the multiply of the vertex color - // when the vertex color is inverted, qglCombinerInputNV(GL_VARIABLE_B_NV) will be changed - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, - GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, - GL_PRIMARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerOutputNV( GL_COMBINER0_NV, GL_RGB, - GL_TEXTURE0_ARB, GL_DISCARD_NV, GL_DISCARD_NV, - GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE ); - - qglCombinerOutputNV( GL_COMBINER0_NV, GL_ALPHA, - GL_DISCARD_NV, GL_DISCARD_NV, GL_DISCARD_NV, - GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE ); - - - // for GL_CONSTANT_COLOR0_NV * TEXTURE0 * TEXTURE1 - qglFinalCombinerInputNV( GL_VARIABLE_A_NV, GL_CONSTANT_COLOR0_NV, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_B_NV, GL_E_TIMES_F_NV, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_C_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_D_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_E_NV, GL_TEXTURE0_ARB, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_F_NV, GL_TEXTURE1_ARB, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_G_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_ALPHA ); - -} - -/* -================== -RB_NV20_DI_DiffuseColorPass - -================== -*/ -static void RB_NV20_DI_DiffuseColorPass( const drawInteraction_t *din ) { - RB_LogComment( "---------- RB_NV20_DiffuseColorPass ----------\n" ); - - GL_State( GLS_SRCBLEND_DST_ALPHA | GLS_DSTBLEND_ONE | GLS_DEPTHMASK | GLS_ALPHAMASK - | backEnd.depthFunc ); - - // texture 0 will be the per-surface diffuse map -#ifdef MACOS_X - GL_SelectTexture( 0 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); -#else - GL_SelectTextureNoClient( 0 ); -#endif - din->diffuseImage->Bind(); - - // texture 1 will be the light projected texture -#ifdef MACOS_X - GL_SelectTexture( 1 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); -#else - GL_SelectTextureNoClient( 1 ); -#endif - din->lightImage->Bind(); - - // texture 2 is disabled -#ifdef MACOS_X - GL_SelectTexture( 2 ); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); -#else - GL_SelectTextureNoClient( 2 ); -#endif - globalImages->BindNull(); - - // texture 3 is disabled -#ifdef MACOS_X - GL_SelectTexture( 3 ); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); -#else - GL_SelectTextureNoClient( 3 ); -#endif - globalImages->BindNull(); - - // bind our "fragment program" - RB_NV20_DiffuseColorFragment(); - - // override one parameter for inverted vertex color - if ( din->vertexColor == SVC_INVERSE_MODULATE ) { - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, - GL_PRIMARY_COLOR_NV, GL_UNSIGNED_INVERT_NV, GL_RGB ); - } - - // draw it - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_NV20_DIFFUSE_COLOR ); - RB_DrawElementsWithCounters( din->surf->geo ); -} - - -/* -================== -RB_NV20_SpecularColorFragment -================== -*/ -static void RB_NV20_SpecularColorFragment( void ) { - if ( r_useCombinerDisplayLists.GetBool() ) { - qglCallList( fragmentDisplayListBase + FPROG_SPECULAR_COLOR ); - return; - } - - // program the nvidia register combiners - qglCombinerParameteriNV( GL_NUM_GENERAL_COMBINERS_NV, 4 ); - - // we want GL_CONSTANT_COLOR1_NV * PRIMARY_COLOR * TEXTURE2 * TEXTURE3 * specular( TEXTURE0 * TEXTURE1 ) - - // stage 0 rgb performs the dot product - // GL_SPARE0_NV = ( TEXTURE0 dot TEXTURE1 - 0.5 ) * 2 - // TEXTURE2 = TEXTURE2 * PRIMARY_COLOR - // the scale and bias steepen the specular curve - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, - GL_TEXTURE1_ARB, GL_EXPAND_NORMAL_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, - GL_TEXTURE0_ARB, GL_EXPAND_NORMAL_NV, GL_RGB ); - qglCombinerOutputNV( GL_COMBINER0_NV, GL_RGB, - GL_SPARE0_NV, GL_DISCARD_NV, GL_DISCARD_NV, - GL_SCALE_BY_TWO_NV, GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_TRUE, GL_FALSE, GL_FALSE ); - - // stage 0 alpha does nothing - - // stage 1 color takes bump * bump - // GL_SPARE0_NV = ( GL_SPARE0_NV * GL_SPARE0_NV - 0.5 ) * 2 - // the scale and bias steepen the specular curve - qglCombinerInputNV( GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_A_NV, - GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_B_NV, - GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerOutputNV( GL_COMBINER1_NV, GL_RGB, - GL_SPARE0_NV, GL_DISCARD_NV, GL_DISCARD_NV, - GL_SCALE_BY_TWO_NV, GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_FALSE, GL_FALSE, GL_FALSE ); - - // stage 1 alpha does nothing - - // stage 2 color - // GL_SPARE0_NV = GL_SPARE0_NV * TEXTURE3 - // SECONDARY_COLOR = CONSTANT_COLOR * TEXTURE2 - qglCombinerInputNV( GL_COMBINER2_NV, GL_RGB, GL_VARIABLE_A_NV, - GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER2_NV, GL_RGB, GL_VARIABLE_B_NV, - GL_TEXTURE3_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER2_NV, GL_RGB, GL_VARIABLE_C_NV, - GL_CONSTANT_COLOR1_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER2_NV, GL_RGB, GL_VARIABLE_D_NV, - GL_TEXTURE2_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerOutputNV( GL_COMBINER2_NV, GL_RGB, - GL_SPARE0_NV, GL_SECONDARY_COLOR_NV, GL_DISCARD_NV, - GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE ); - - // stage 2 alpha does nothing - - - // stage 3 scales the texture by the vertex color - qglCombinerInputNV( GL_COMBINER3_NV, GL_RGB, GL_VARIABLE_A_NV, - GL_SECONDARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER3_NV, GL_RGB, GL_VARIABLE_B_NV, - GL_PRIMARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerOutputNV( GL_COMBINER3_NV, GL_RGB, - GL_SECONDARY_COLOR_NV, GL_DISCARD_NV, GL_DISCARD_NV, - GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE ); - - // stage 3 alpha does nothing - - // final combiner = GL_SPARE0_NV * SECONDARY_COLOR + PRIMARY_COLOR * SECONDARY_COLOR - qglFinalCombinerInputNV( GL_VARIABLE_A_NV, GL_SPARE0_NV, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_B_NV, GL_SECONDARY_COLOR_NV, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_C_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_D_NV, GL_E_TIMES_F_NV, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_E_NV, GL_SPARE0_NV, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_F_NV, GL_SECONDARY_COLOR_NV, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_G_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_ALPHA ); -} - - -/* -================== -RB_NV20_DI_SpecularColorPass - -================== -*/ -static void RB_NV20_DI_SpecularColorPass( const drawInteraction_t *din ) { - RB_LogComment( "---------- RB_NV20_SpecularColorPass ----------\n" ); - - GL_State( GLS_SRCBLEND_DST_ALPHA | GLS_DSTBLEND_ONE | GLS_DEPTHMASK | GLS_ALPHAMASK - | backEnd.depthFunc ); - - // texture 0 is the normalization cube map for the half angle -#ifdef MACOS_X - GL_SelectTexture( 0 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); -#else - GL_SelectTextureNoClient( 0 ); -#endif - globalImages->normalCubeMapImage->Bind(); - - // texture 1 will be the per-surface bump map -#ifdef MACOS_X - GL_SelectTexture( 1 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); -#else - GL_SelectTextureNoClient( 1 ); -#endif - din->bumpImage->Bind(); - - // texture 2 will be the per-surface specular map -#ifdef MACOS_X - GL_SelectTexture( 2 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); -#else - GL_SelectTextureNoClient( 2 ); -#endif - din->specularImage->Bind(); - - // texture 3 will be the light projected texture -#ifdef MACOS_X - GL_SelectTexture( 3 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); -#else - GL_SelectTextureNoClient( 3 ); -#endif - din->lightImage->Bind(); - - // bind our "fragment program" - RB_NV20_SpecularColorFragment(); - - // override one parameter for inverted vertex color - if ( din->vertexColor == SVC_INVERSE_MODULATE ) { - qglCombinerInputNV( GL_COMBINER3_NV, GL_RGB, GL_VARIABLE_B_NV, - GL_PRIMARY_COLOR_NV, GL_UNSIGNED_INVERT_NV, GL_RGB ); - } - - // draw it - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_NV20_SPECULAR_COLOR ); - RB_DrawElementsWithCounters( din->surf->geo ); -} - - - -/* -================== -RB_NV20_DiffuseAndSpecularColorFragment -================== -*/ -static void RB_NV20_DiffuseAndSpecularColorFragment( void ) { - if ( r_useCombinerDisplayLists.GetBool() ) { - qglCallList( fragmentDisplayListBase + FPROG_DIFFUSE_AND_SPECULAR_COLOR ); - return; - } - - // program the nvidia register combiners - qglCombinerParameteriNV( GL_NUM_GENERAL_COMBINERS_NV, 3 ); - - // GL_CONSTANT_COLOR0_NV will be the diffuse color - // GL_CONSTANT_COLOR1_NV will be the specular color - - // stage 0 rgb performs the dot product - // GL_SECONDARY_COLOR_NV = ( TEXTURE0 dot TEXTURE1 - 0.5 ) * 2 - // the scale and bias steepen the specular curve - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, - GL_TEXTURE1_ARB, GL_EXPAND_NORMAL_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, - GL_TEXTURE0_ARB, GL_EXPAND_NORMAL_NV, GL_RGB ); - qglCombinerOutputNV( GL_COMBINER0_NV, GL_RGB, - GL_SECONDARY_COLOR_NV, GL_DISCARD_NV, GL_DISCARD_NV, - GL_SCALE_BY_TWO_NV, GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_TRUE, GL_FALSE, GL_FALSE ); - - // stage 0 alpha does nothing - - // stage 1 color takes bump * bump - // PRIMARY_COLOR = ( GL_SECONDARY_COLOR_NV * GL_SECONDARY_COLOR_NV - 0.5 ) * 2 - // the scale and bias steepen the specular curve - qglCombinerInputNV( GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_A_NV, - GL_SECONDARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_B_NV, - GL_SECONDARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerOutputNV( GL_COMBINER1_NV, GL_RGB, - GL_SECONDARY_COLOR_NV, GL_DISCARD_NV, GL_DISCARD_NV, - GL_SCALE_BY_TWO_NV, GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_FALSE, GL_FALSE, GL_FALSE ); - - // stage 1 alpha does nothing - - // stage 2 color - // PRIMARY_COLOR = ( PRIMARY_COLOR * TEXTURE3 ) * 2 - // SPARE0 = 1.0 * 1.0 (needed for final combiner) - qglCombinerInputNV( GL_COMBINER2_NV, GL_RGB, GL_VARIABLE_A_NV, - GL_SECONDARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER2_NV, GL_RGB, GL_VARIABLE_B_NV, - GL_TEXTURE3_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER2_NV, GL_RGB, GL_VARIABLE_C_NV, - GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_RGB ); - qglCombinerInputNV( GL_COMBINER2_NV, GL_RGB, GL_VARIABLE_D_NV, - GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_RGB ); - qglCombinerOutputNV( GL_COMBINER2_NV, GL_RGB, - GL_SECONDARY_COLOR_NV, GL_SPARE0_NV, GL_DISCARD_NV, - GL_SCALE_BY_TWO_NV, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE ); - - // stage 2 alpha does nothing - - // final combiner = TEXTURE2_ARB * CONSTANT_COLOR0_NV + PRIMARY_COLOR_NV * CONSTANT_COLOR1_NV - // alpha = GL_ZERO - qglFinalCombinerInputNV( GL_VARIABLE_A_NV, GL_CONSTANT_COLOR1_NV, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_B_NV, GL_SECONDARY_COLOR_NV, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_C_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_D_NV, GL_E_TIMES_F_NV, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_E_NV, GL_TEXTURE2_ARB, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_F_NV, GL_CONSTANT_COLOR0_NV, - GL_UNSIGNED_IDENTITY_NV, GL_RGB ); - qglFinalCombinerInputNV( GL_VARIABLE_G_NV, GL_ZERO, - GL_UNSIGNED_IDENTITY_NV, GL_ALPHA ); -} - - -/* -================== -RB_NV20_DI_DiffuseAndSpecularColorPass - -================== -*/ -static void RB_NV20_DI_DiffuseAndSpecularColorPass( const drawInteraction_t *din ) { - RB_LogComment( "---------- RB_NV20_DI_DiffuseAndSpecularColorPass ----------\n" ); - - GL_State( GLS_SRCBLEND_DST_ALPHA | GLS_DSTBLEND_ONE | GLS_DEPTHMASK | backEnd.depthFunc ); - - // texture 0 is the normalization cube map for the half angle -// still bound from RB_NV_BumpAndLightPass -// GL_SelectTextureNoClient( 0 ); -// GL_Bind( tr.normalCubeMapImage ); - - // texture 1 is the per-surface bump map -// still bound from RB_NV_BumpAndLightPass -// GL_SelectTextureNoClient( 1 ); -// GL_Bind( din->bumpImage ); - - // texture 2 is the per-surface diffuse map -#ifdef MACOS_X - GL_SelectTexture( 2 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); -#else - GL_SelectTextureNoClient( 2 ); -#endif - din->diffuseImage->Bind(); - - // texture 3 is the per-surface specular map -#ifdef MACOS_X - GL_SelectTexture( 3 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); -#else - GL_SelectTextureNoClient( 3 ); -#endif - din->specularImage->Bind(); - - // bind our "fragment program" - RB_NV20_DiffuseAndSpecularColorFragment(); - - // draw it - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_NV20_DIFFUSE_AND_SPECULAR_COLOR ); - RB_DrawElementsWithCounters( din->surf->geo ); -} - - -/* -================== -RB_NV20_DrawInteraction -================== -*/ -static void RB_NV20_DrawInteraction( const drawInteraction_t *din ) { - const drawSurf_t *surf = din->surf; - - // load all the vertex program parameters - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_ORIGIN, din->localLightOrigin.ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_VIEW_ORIGIN, din->localViewOrigin.ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_PROJECT_S, din->lightProjection[0].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_PROJECT_T, din->lightProjection[1].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_PROJECT_Q, din->lightProjection[2].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_FALLOFF_S, din->lightProjection[3].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_BUMP_MATRIX_S, din->bumpMatrix[0].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_BUMP_MATRIX_T, din->bumpMatrix[1].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_DIFFUSE_MATRIX_S, din->diffuseMatrix[0].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_DIFFUSE_MATRIX_T, din->diffuseMatrix[1].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_SPECULAR_MATRIX_S, din->specularMatrix[0].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_SPECULAR_MATRIX_T, din->specularMatrix[1].ToFloatPtr() ); - - // set the constant colors - qglCombinerParameterfvNV( GL_CONSTANT_COLOR0_NV, din->diffuseColor.ToFloatPtr() ); - qglCombinerParameterfvNV( GL_CONSTANT_COLOR1_NV, din->specularColor.ToFloatPtr() ); - - // vertex color passes should be pretty rare (cross-faded bump map surfaces), so always - // run them down as three-passes - if ( din->vertexColor != SVC_IGNORE ) { - qglEnableClientState( GL_COLOR_ARRAY ); - RB_NV20_DI_BumpAndLightPass( din, false ); - RB_NV20_DI_DiffuseColorPass( din ); - RB_NV20_DI_SpecularColorPass( din ); - qglDisableClientState( GL_COLOR_ARRAY ); - return; - } - - qglColor3f( 1, 1, 1 ); - - // on an ideal card, we would now just bind the textures and call a - // single pass vertex / fragment program, but - // on NV20, we need to decide which single / dual / tripple pass set of programs to use - - // ambient light could be done as a single pass if we want to optimize for it - - // monochrome light is two passes - int internalFormat = din->lightImage->internalFormat; - if ( ( r_useNV20MonoLights.GetInteger() == 2 ) || - ( din->lightImage->isMonochrome && r_useNV20MonoLights.GetInteger() ) ) { - // do a two-pass rendering - RB_NV20_DI_BumpAndLightPass( din, true ); - RB_NV20_DI_DiffuseAndSpecularColorPass( din ); - } else { - // general case is three passes - // ( bump dot lightDir ) * lightFalloff - // diffuse * lightProject - // specular * ( bump dot halfAngle extended ) * lightProject - RB_NV20_DI_BumpAndLightPass( din, false ); - RB_NV20_DI_DiffuseColorPass( din ); - RB_NV20_DI_SpecularColorPass( din ); - } -} - - -/* -============= -RB_NV20_CreateDrawInteractions - -============= -*/ -static void RB_NV20_CreateDrawInteractions( const drawSurf_t *surf ) { - if ( !surf ) { - return; - } - - qglEnable( GL_VERTEX_PROGRAM_ARB ); - qglEnable( GL_REGISTER_COMBINERS_NV ); - -#ifdef MACOS_X - GL_SelectTexture(0); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); -#else - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - - qglEnableVertexAttribArrayARB( 8 ); - qglEnableVertexAttribArrayARB( 9 ); - qglEnableVertexAttribArrayARB( 10 ); - qglEnableVertexAttribArrayARB( 11 ); -#endif - - for ( ; surf ; surf=surf->nextOnLight ) { - // set the vertex pointers - idDrawVert *ac = (idDrawVert *)vertexCache.Position( surf->geo->ambientCache ); - qglColorPointer( 4, GL_UNSIGNED_BYTE, sizeof( idDrawVert ), ac->color ); -#ifdef MACOS_X - GL_SelectTexture( 0 ); - qglTexCoordPointer( 2, GL_FLOAT, sizeof( idDrawVert ), ac->st.ToFloatPtr() ); - GL_SelectTexture( 1 ); - qglTexCoordPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->tangents[0].ToFloatPtr() ); - GL_SelectTexture( 2 ); - qglTexCoordPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->tangents[1].ToFloatPtr() ); - GL_SelectTexture( 3 ); - qglTexCoordPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->normal.ToFloatPtr() ); - GL_SelectTexture( 0 ); -#else - qglVertexAttribPointerARB( 11, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->normal.ToFloatPtr() ); - qglVertexAttribPointerARB( 10, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->tangents[1].ToFloatPtr() ); - qglVertexAttribPointerARB( 9, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->tangents[0].ToFloatPtr() ); - qglVertexAttribPointerARB( 8, 2, GL_FLOAT, false, sizeof( idDrawVert ), ac->st.ToFloatPtr() ); -#endif - qglVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->xyz.ToFloatPtr() ); - - RB_CreateSingleDrawInteractions( surf, RB_NV20_DrawInteraction ); - } - -#ifndef MACOS_X - qglDisableVertexAttribArrayARB( 8 ); - qglDisableVertexAttribArrayARB( 9 ); - qglDisableVertexAttribArrayARB( 10 ); - qglDisableVertexAttribArrayARB( 11 ); -#endif - - // disable features -#ifdef MACOS_X - GL_SelectTexture( 3 ); - globalImages->BindNull(); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - - GL_SelectTexture( 2 ); - globalImages->BindNull(); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - - GL_SelectTexture( 1 ); - globalImages->BindNull(); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); -#else - GL_SelectTextureNoClient( 3 ); - globalImages->BindNull(); - - GL_SelectTextureNoClient( 2 ); - globalImages->BindNull(); - - GL_SelectTextureNoClient( 1 ); - globalImages->BindNull(); -#endif - - backEnd.glState.currenttmu = -1; - GL_SelectTexture( 0 ); - - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - - qglDisable( GL_VERTEX_PROGRAM_ARB ); - qglDisable( GL_REGISTER_COMBINERS_NV ); -} - - -//====================================================================================== - - -/* -================== -RB_NV20_DrawInteractions -================== -*/ -void RB_NV20_DrawInteractions( void ) { - viewLight_t *vLight; - - // - // for each light, perform adding and shadowing - // - for ( vLight = backEnd.viewDef->viewLights ; vLight ; vLight = vLight->next ) { - // do fogging later - if ( vLight->lightShader->IsFogLight() ) { - continue; - } - if ( vLight->lightShader->IsBlendLight() ) { - continue; - } - if ( !vLight->localInteractions && !vLight->globalInteractions - && !vLight->translucentInteractions ) { - continue; - } - - backEnd.vLight = vLight; - - RB_LogComment( "---------- RB_RenderViewLight 0x%p ----------\n", vLight ); - - // clear the stencil buffer if needed - if ( vLight->globalShadows || vLight->localShadows ) { - backEnd.currentScissor = vLight->scissorRect; - if ( r_useScissor.GetBool() ) { - qglScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, - backEnd.viewDef->viewport.y1 + backEnd.currentScissor.y1, - backEnd.currentScissor.x2 + 1 - backEnd.currentScissor.x1, - backEnd.currentScissor.y2 + 1 - backEnd.currentScissor.y1 ); - } - qglClear( GL_STENCIL_BUFFER_BIT ); - } else { - // no shadows, so no need to read or write the stencil buffer - // we might in theory want to use GL_ALWAYS instead of disabling - // completely, to satisfy the invarience rules - qglStencilFunc( GL_ALWAYS, 128, 255 ); - } - - backEnd.depthFunc = GLS_DEPTHFUNC_EQUAL; - - if ( r_useShadowVertexProgram.GetBool() ) { - qglEnable( GL_VERTEX_PROGRAM_ARB ); - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_STENCIL_SHADOW ); - RB_StencilShadowPass( vLight->globalShadows ); - RB_NV20_CreateDrawInteractions( vLight->localInteractions ); - qglEnable( GL_VERTEX_PROGRAM_ARB ); - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_STENCIL_SHADOW ); - RB_StencilShadowPass( vLight->localShadows ); - RB_NV20_CreateDrawInteractions( vLight->globalInteractions ); - qglDisable( GL_VERTEX_PROGRAM_ARB ); // if there weren't any globalInteractions, it would have stayed on - } else { - RB_StencilShadowPass( vLight->globalShadows ); - RB_NV20_CreateDrawInteractions( vLight->localInteractions ); - RB_StencilShadowPass( vLight->localShadows ); - RB_NV20_CreateDrawInteractions( vLight->globalInteractions ); - } - - // translucent surfaces never get stencil shadowed - if ( r_skipTranslucent.GetBool() ) { - continue; - } - - qglStencilFunc( GL_ALWAYS, 128, 255 ); - - backEnd.depthFunc = GLS_DEPTHFUNC_LESS; - RB_NV20_CreateDrawInteractions( vLight->translucentInteractions ); - - backEnd.depthFunc = GLS_DEPTHFUNC_EQUAL; - } -} - -//======================================================================= - -/* -================== -R_NV20_Init - -================== -*/ -void R_NV20_Init( void ) { - glConfig.allowNV20Path = false; - - common->Printf( "---------- R_NV20_Init ----------\n" ); - - if ( !glConfig.registerCombinersAvailable || !glConfig.ARBVertexProgramAvailable || glConfig.maxTextureUnits < 4 ) { - common->Printf( "Not available.\n" ); - return; - } - - GL_CheckErrors(); - - // create our "fragment program" display lists - fragmentDisplayListBase = qglGenLists( FPROG_NUM_FRAGMENT_PROGRAMS ); - - // force them to issue commands to build the list - bool temp = r_useCombinerDisplayLists.GetBool(); - r_useCombinerDisplayLists.SetBool( false ); - - qglNewList( fragmentDisplayListBase + FPROG_BUMP_AND_LIGHT, GL_COMPILE ); - RB_NV20_BumpAndLightFragment(); - qglEndList(); - - qglNewList( fragmentDisplayListBase + FPROG_DIFFUSE_COLOR, GL_COMPILE ); - RB_NV20_DiffuseColorFragment(); - qglEndList(); - - qglNewList( fragmentDisplayListBase + FPROG_SPECULAR_COLOR, GL_COMPILE ); - RB_NV20_SpecularColorFragment(); - qglEndList(); - - qglNewList( fragmentDisplayListBase + FPROG_DIFFUSE_AND_SPECULAR_COLOR, GL_COMPILE ); - RB_NV20_DiffuseAndSpecularColorFragment(); - qglEndList(); - - r_useCombinerDisplayLists.SetBool( temp ); - - common->Printf( "---------------------------------\n" ); - - glConfig.allowNV20Path = true; -} - diff --git a/src/renderer/draw_r200.cpp b/src/renderer/draw_r200.cpp deleted file mode 100644 index d850033a..00000000 --- a/src/renderer/draw_r200.cpp +++ /dev/null @@ -1,516 +0,0 @@ -/* -=========================================================================== - -Doom 3 GPL Source Code -Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. - -This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?). - -Doom 3 Source Code is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Doom 3 Source Code is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Doom 3 Source Code. If not, see . - -In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below. - -If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. - -=========================================================================== -*/ -#include "precompiled.h" -#pragma hdrstop - -#include "tr_local.h" - -/* - - There are not enough vertex program texture coordinate outputs - to have unique texture coordinates for bump, specular, and diffuse, - so diffuse and specular are assumed to be the same mapping. - - To handle properly, those cases with different diffuse and specular - mapping will need to be run as two passes. - -*/ - -// changed from 1 to 255 to not conflict with ARB2 program names -static int FPROG_FAST_PATH = 255; - -typedef struct { - GLint numFragmentRegisters; // 6 - GLint numFragmentConstants; // 8 - GLint numPasses; // 2 - GLint numInstructionsPerPass; // 8 - GLint numInstructionsTotal; // 16 - GLint colorAlphaPairing; // 1 - GLint numLoopbackComponenets; // 3 - GLint numInputInterpolatorComponents; // 3 -} atiFragmentShaderInfo_t; - -static atiFragmentShaderInfo_t fsi; - -typedef struct { - // vertex shader invariants - int lightPos; // light position in object coordinates - int viewerPos; // viewer position in object coordinates - int lightProjectS; // projected light s texgen - int lightProjectT; // projected light t texgen - int lightProjectQ; // projected light q texgen - int lightFalloffS; // projected light falloff s texgen - int bumpTransformS; // bump TEX0 S transformation - int bumpTransformT; // bump TEX0 T transformation - int colorTransformS; // diffuse/specular texture matrix - int colorTransformT; // diffuse/specular texture matrix - - // vertex shader variants - int texCoords; - int vertexColors; - int normals; - int tangents; - int biTangents; - -} atiVertexShaderInfo_t; - -static atiVertexShaderInfo_t vsi; - -/* -=================== -RB_R200_ARB_DrawInteraction - -=================== -*/ -static void RB_R200_ARB_DrawInteraction( const drawInteraction_t *din ) { - // check for the case we can't handle in a single pass (we could calculate this at shader parse time to optimize) - if ( din->diffuseImage != globalImages->blackImage && din->specularImage != globalImages->blackImage - && memcmp( din->specularMatrix, din->diffuseMatrix, sizeof( din->diffuseMatrix ) ) ) { -// common->Printf( "Note: Shader %s drawn as two pass on R200\n", din->surf->shader->getName() ); - - // draw the specular as a separate pass with a black diffuse map - drawInteraction_t d; - d = *din; - d.diffuseImage = globalImages->blackImage; - memcpy( d.diffuseMatrix, d.specularMatrix, sizeof( d.diffuseMatrix ) ); - RB_R200_ARB_DrawInteraction( &d ); - - // now fall through and draw the diffuse pass with a black specular map - d = *din; - din = &d; - d.specularImage = globalImages->blackImage; - } - - // load all the vertex program parameters - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_ORIGIN, din->localLightOrigin.ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_VIEW_ORIGIN, din->localViewOrigin.ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_PROJECT_S, din->lightProjection[0].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_PROJECT_T, din->lightProjection[1].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_PROJECT_Q, din->lightProjection[2].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_LIGHT_FALLOFF_S, din->lightProjection[3].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_BUMP_MATRIX_S, din->bumpMatrix[0].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_BUMP_MATRIX_T, din->bumpMatrix[1].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_DIFFUSE_MATRIX_S, din->diffuseMatrix[0].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_DIFFUSE_MATRIX_T, din->diffuseMatrix[1].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_SPECULAR_MATRIX_S, din->diffuseMatrix[0].ToFloatPtr() ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_SPECULAR_MATRIX_T, din->diffuseMatrix[1].ToFloatPtr() ); - - const srfTriangles_t *tri = din->surf->geo; - idDrawVert *ac = (idDrawVert *)vertexCache.Position( tri->ambientCache ); - qglVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), (void *)&ac->xyz ); - - static const float zero[4] = { 0, 0, 0, 0 }; - static const float one[4] = { 1, 1, 1, 1 }; - static const float negOne[4] = { -1, -1, -1, -1 }; - - switch ( din->vertexColor ) { - case SVC_IGNORE: - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_MODULATE, zero ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_ADD, one ); - break; - case SVC_MODULATE: - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_MODULATE, one ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_ADD, zero ); - break; - case SVC_INVERSE_MODULATE: - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_MODULATE, negOne ); - qglProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, PP_COLOR_ADD, one ); - break; - } - - - // texture 0 = light projection - // texture 1 = light falloff - // texture 2 = surface diffuse - // texture 3 = surface specular - // texture 4 = surface bump - // texture 5 = normalization cube map - - GL_SelectTexture( 5 ); - if ( din->ambientLight ) { - globalImages->ambientNormalMap->Bind(); - } else { - globalImages->normalCubeMapImage->Bind(); - } - - GL_SelectTexture( 4 ); - din->bumpImage->Bind(); - - GL_SelectTexture( 3 ); - din->specularImage->Bind(); - qglTexCoordPointer( 3, GL_FLOAT, sizeof( idDrawVert ), (void *)&ac->normal ); - - GL_SelectTexture( 2 ); - din->diffuseImage->Bind(); - qglTexCoordPointer( 3, GL_FLOAT, sizeof( idDrawVert ), (void *)&ac->tangents[1][0] ); - - GL_SelectTexture( 1 ); - din->lightFalloffImage->Bind(); - qglTexCoordPointer( 3, GL_FLOAT, sizeof( idDrawVert ), (void *)&ac->tangents[0][0] ); - - GL_SelectTexture( 0 ); - din->lightImage->Bind(); - qglTexCoordPointer( 2, GL_FLOAT, sizeof( idDrawVert ), (void *)&ac->st[0] ); - - qglSetFragmentShaderConstantATI( GL_CON_0_ATI, din->diffuseColor.ToFloatPtr() ); - qglSetFragmentShaderConstantATI( GL_CON_1_ATI, din->specularColor.ToFloatPtr() ); - - if ( din->vertexColor != SVC_IGNORE ) { - qglColorPointer( 4, GL_UNSIGNED_BYTE, sizeof(idDrawVert), (void *)&ac->color ); - qglEnableClientState( GL_COLOR_ARRAY ); - - RB_DrawElementsWithCounters( tri ); - - qglDisableClientState( GL_COLOR_ARRAY ); - qglColor4f( 1, 1, 1, 1 ); - } else { - RB_DrawElementsWithCounters( tri ); - } -} - -/* -================== -RB_R200_ARB_CreateDrawInteractions -================== -*/ -static void RB_R200_ARB_CreateDrawInteractions( const drawSurf_t *surf ) { - if ( !surf ) { - return; - } - - // force a space calculation for light vectors - backEnd.currentSpace = NULL; - - // set the depth test - if ( surf->material->Coverage() == MC_TRANSLUCENT /* != C_PERFORATED */ ) { - GL_State( GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE | GLS_DEPTHMASK | GLS_DEPTHFUNC_LESS ); - } else { - // only draw on the alpha tested pixels that made it to the depth buffer - GL_State( GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE | GLS_DEPTHMASK | GLS_DEPTHFUNC_EQUAL ); - } - - // start the vertex shader - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_R200_INTERACTION ); - qglEnable(GL_VERTEX_PROGRAM_ARB); - - // start the fragment shader - qglBindFragmentShaderATI( FPROG_FAST_PATH ); -#if defined( MACOS_X ) - qglEnable( GL_TEXT_FRAGMENT_SHADER_ATI ); -#else - qglEnable( GL_FRAGMENT_SHADER_ATI ); -#endif - - qglColor4f( 1, 1, 1, 1 ); - - GL_SelectTexture( 1 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - GL_SelectTexture( 2 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - GL_SelectTexture( 3 ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - - for ( ; surf ; surf=surf->nextOnLight ) { - RB_CreateSingleDrawInteractions( surf, RB_R200_ARB_DrawInteraction ); - } - - GL_SelectTexture( 5 ); - globalImages->BindNull(); - - GL_SelectTexture( 4 ); - globalImages->BindNull(); - - GL_SelectTexture( 3 ); - globalImages->BindNull(); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - - GL_SelectTexture( 2 ); - globalImages->BindNull(); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - - GL_SelectTexture( 1 ); - globalImages->BindNull(); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); - - GL_SelectTexture( 0 ); - - qglDisable( GL_VERTEX_PROGRAM_ARB ); -#if defined( MACOS_X ) - qglDisable( GL_TEXT_FRAGMENT_SHADER_ATI ); -#else - qglDisable( GL_FRAGMENT_SHADER_ATI ); -#endif -} - - - -/* -================== -RB_R200_DrawInteractions - -================== -*/ -void RB_R200_DrawInteractions( void ) { - qglEnable( GL_STENCIL_TEST ); - - for ( viewLight_t *vLight = backEnd.viewDef->viewLights ; vLight ; vLight = vLight->next ) { - // do fogging later - if ( vLight->lightShader->IsFogLight() ) { - continue; - } - if ( vLight->lightShader->IsBlendLight() ) { - continue; - } - - backEnd.vLight = vLight; - - RB_LogComment( "---------- RB_RenderViewLight 0x%p ----------\n", vLight ); - - // clear the stencil buffer if needed - if ( vLight->globalShadows || vLight->localShadows ) { - backEnd.currentScissor = vLight->scissorRect; - if ( r_useScissor.GetBool() ) { - qglScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, - backEnd.viewDef->viewport.y1 + backEnd.currentScissor.y1, - backEnd.currentScissor.x2 + 1 - backEnd.currentScissor.x1, - backEnd.currentScissor.y2 + 1 - backEnd.currentScissor.y1 ); - } - qglClear( GL_STENCIL_BUFFER_BIT ); - } else { - // no shadows, so no need to read or write the stencil buffer - // we might in theory want to use GL_ALWAYS instead of disabling - // completely, to satisfy the invarience rules - qglStencilFunc( GL_ALWAYS, 128, 255 ); - } - - if ( r_useShadowVertexProgram.GetBool() ) { - qglEnable( GL_VERTEX_PROGRAM_ARB ); - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_STENCIL_SHADOW ); - RB_StencilShadowPass( vLight->globalShadows ); - - RB_R200_ARB_CreateDrawInteractions( vLight->localInteractions ); - - qglEnable( GL_VERTEX_PROGRAM_ARB ); - qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, VPROG_STENCIL_SHADOW ); - RB_StencilShadowPass( vLight->localShadows ); - - RB_R200_ARB_CreateDrawInteractions( vLight->globalInteractions ); - - qglDisable( GL_VERTEX_PROGRAM_ARB ); // if there weren't any globalInteractions, it would have stayed on - } else { - RB_StencilShadowPass( vLight->globalShadows ); - RB_R200_ARB_CreateDrawInteractions( vLight->localInteractions ); - - RB_StencilShadowPass( vLight->localShadows ); - RB_R200_ARB_CreateDrawInteractions( vLight->globalInteractions ); - } - - if ( r_skipTranslucent.GetBool() ) { - continue; - } - - // disable stencil testing for translucent interactions, because - // the shadow isn't calculated at their point, and the shadow - // behind them may be depth fighting with a back side, so there - // isn't any reasonable thing to do - qglStencilFunc( GL_ALWAYS, 128, 255 ); - RB_R200_ARB_CreateDrawInteractions( vLight->translucentInteractions ); - } -} - - -/* -================= -R_BuildSurfaceFragmentProgram -================= -*/ -static void R_BuildSurfaceFragmentProgram( int programNum ) { - qglBindFragmentShaderATI( programNum ); - - qglBeginFragmentShaderATI(); - - // texture 0 = light projection - // texture 1 = light falloff - // texture 2 = surface diffuse - // texture 3 = surface specular - // texture 4 = surface bump - // texture 5 = normalization cube map - - // texcoord 0 = light projection texGen - // texcoord 1 = light falloff texGen - // texcoord 2 = bumpmap texCoords - // texcoord 3 = specular / diffuse texCoords - // texcoord 4 = halfangle vector in local tangent space - // texcoord 5 = vector to light in local tangent space - - // constant 0 = diffuse modulate - // constant 1 = specular modulate - // constant 5 = internal use for 0.75 constant - - qglSampleMapATI( GL_REG_0_ATI, GL_TEXTURE0_ARB, GL_SWIZZLE_STQ_DQ_ATI ); - qglSampleMapATI( GL_REG_1_ATI, GL_TEXTURE1_ARB, GL_SWIZZLE_STR_ATI ); - qglSampleMapATI( GL_REG_4_ATI, GL_TEXTURE2_ARB, GL_SWIZZLE_STR_ATI ); - qglSampleMapATI( GL_REG_5_ATI, GL_TEXTURE5_ARB, GL_SWIZZLE_STR_ATI ); - - // move the alpha component to the red channel to support rxgb normal map compression - if ( globalImages->image_useNormalCompression.GetInteger() == 2 ) { - qglColorFragmentOp1ATI( GL_MOV_ATI, GL_REG_4_ATI, GL_RED_BIT_ATI, GL_NONE, - GL_REG_4_ATI, GL_ALPHA, GL_NONE ); - } - - // light projection * light falloff - qglColorFragmentOp2ATI( GL_MUL_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, - GL_REG_0_ATI, GL_NONE, GL_NONE, - GL_REG_1_ATI, GL_NONE, GL_NONE ); - - // vectorToLight dot bumpMap - qglColorFragmentOp2ATI( GL_DOT3_ATI, GL_REG_1_ATI, GL_NONE, GL_SATURATE_BIT_ATI, - GL_REG_4_ATI, GL_NONE, GL_2X_BIT_ATI | GL_BIAS_BIT_ATI, - GL_REG_5_ATI, GL_NONE, GL_2X_BIT_ATI | GL_BIAS_BIT_ATI ); - - // bump * light - qglColorFragmentOp2ATI( GL_MUL_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, - GL_REG_0_ATI, GL_NONE, GL_NONE, - GL_REG_1_ATI, GL_NONE, GL_NONE ); - - //------------------- - - // carry over the incomingLight calculation - qglPassTexCoordATI( GL_REG_0_ATI, GL_REG_0_ATI, GL_SWIZZLE_STR_ATI ); - - // sample the diffuse surface map - qglSampleMapATI( GL_REG_2_ATI, GL_TEXTURE3_ARB, GL_SWIZZLE_STR_ATI ); - - // sample the specular surface map - qglSampleMapATI( GL_REG_3_ATI, GL_TEXTURE3_ARB, GL_SWIZZLE_STR_ATI ); - - // we will use the surface bump map again - qglPassTexCoordATI( GL_REG_4_ATI, GL_REG_4_ATI, GL_SWIZZLE_STR_ATI ); - - // normalize the specular halfangle - qglSampleMapATI( GL_REG_5_ATI, GL_TEXTURE4_ARB, GL_SWIZZLE_STR_ATI ); - - // R1 = halfangle dot surfaceNormal - qglColorFragmentOp2ATI( GL_DOT3_ATI, GL_REG_1_ATI, GL_NONE, GL_SATURATE_BIT_ATI, - GL_REG_4_ATI, GL_NONE, GL_2X_BIT_ATI | GL_BIAS_BIT_ATI, - GL_REG_5_ATI, GL_NONE, GL_2X_BIT_ATI | GL_BIAS_BIT_ATI ); - - // R1 = 4 * ( R1 - 0.75 ) - // subtract 0.75 and quadruple to tighten the specular spot - float data[4] = { 0.75, 0.75, 0.75, 0.75 }; - qglSetFragmentShaderConstantATI( GL_CON_5_ATI, data ); - qglColorFragmentOp2ATI( GL_SUB_ATI, GL_REG_1_ATI, GL_NONE, GL_4X_BIT_ATI | GL_SATURATE_BIT_ATI, - GL_REG_1_ATI, GL_NONE, GL_NONE, - GL_CON_5_ATI, GL_NONE, GL_NONE ); - - // R1 = R1 * R1 - // sqare the stretched specular result - qglColorFragmentOp2ATI( GL_MUL_ATI, GL_REG_1_ATI, GL_NONE, GL_SATURATE_BIT_ATI, - GL_REG_1_ATI, GL_NONE, GL_NONE, - GL_REG_1_ATI, GL_NONE, GL_NONE ); - - // R1 = R1 * R3 - // R1 = specular power * specular texture * 2 - qglColorFragmentOp2ATI( GL_MUL_ATI, GL_REG_1_ATI, GL_NONE, GL_2X_BIT_ATI | GL_SATURATE_BIT_ATI, - GL_REG_1_ATI, GL_NONE, GL_NONE, - GL_REG_3_ATI, GL_NONE, GL_NONE ); - - // R2 = R2 * CONST0 - // down modulate the diffuse map - qglColorFragmentOp2ATI( GL_MUL_ATI, GL_REG_2_ATI, GL_NONE, GL_SATURATE_BIT_ATI, - GL_REG_2_ATI, GL_NONE, GL_NONE, - GL_CON_0_ATI, GL_NONE, GL_NONE ); - - // R2 = R2 + R1 * CONST1 - // diffuse + specular * specular color - qglColorFragmentOp3ATI( GL_MAD_ATI, GL_REG_2_ATI, GL_NONE, GL_SATURATE_BIT_ATI, - GL_REG_1_ATI, GL_NONE, GL_NONE, - GL_CON_1_ATI, GL_NONE, GL_NONE, - GL_REG_2_ATI, GL_NONE, GL_NONE ); - - // out = reflectance * incoming light - qglColorFragmentOp2ATI( GL_MUL_ATI, GL_REG_0_ATI, GL_NONE, GL_SATURATE_BIT_ATI, - GL_REG_0_ATI, GL_NONE, GL_NONE, - GL_REG_2_ATI, GL_NONE, GL_NONE ); - - // out * vertex color - qglColorFragmentOp2ATI( GL_MUL_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, - GL_REG_0_ATI, GL_NONE, GL_NONE, - GL_PRIMARY_COLOR_ARB, GL_NONE, GL_NONE ); - - // out alpha = 0 to allow blending optimization - qglAlphaFragmentOp1ATI( GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, - GL_ZERO, GL_NONE, GL_NONE ); - - qglEndFragmentShaderATI(); - - GL_CheckErrors(); -} - -/* -================= -R_R200_Init -================= -*/ -void R_R200_Init( void ) { - glConfig.allowR200Path = false; - - common->Printf( "----------- R200_Init -----------\n" ); - - if ( !glConfig.atiFragmentShaderAvailable || !glConfig.ARBVertexProgramAvailable || !glConfig.ARBVertexBufferObjectAvailable ) { - common->Printf( "Not available.\n" ); - return; - } - - GL_CheckErrors(); - - qglGetIntegerv( GL_NUM_FRAGMENT_REGISTERS_ATI, &fsi.numFragmentRegisters ); - qglGetIntegerv( GL_NUM_FRAGMENT_CONSTANTS_ATI, &fsi.numFragmentConstants ); - qglGetIntegerv( GL_NUM_PASSES_ATI, &fsi.numPasses ); - qglGetIntegerv( GL_NUM_INSTRUCTIONS_PER_PASS_ATI, &fsi.numInstructionsPerPass ); - qglGetIntegerv( GL_NUM_INSTRUCTIONS_TOTAL_ATI, &fsi.numInstructionsTotal ); - qglGetIntegerv( GL_COLOR_ALPHA_PAIRING_ATI, &fsi.colorAlphaPairing ); - qglGetIntegerv( GL_NUM_LOOPBACK_COMPONENTS_ATI, &fsi.numLoopbackComponenets ); - qglGetIntegerv( GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI, &fsi.numInputInterpolatorComponents ); - - common->Printf( "GL_NUM_FRAGMENT_REGISTERS_ATI: %i\n", fsi.numFragmentRegisters ); - common->Printf( "GL_NUM_FRAGMENT_CONSTANTS_ATI: %i\n", fsi.numFragmentConstants ); - common->Printf( "GL_NUM_PASSES_ATI: %i\n", fsi.numPasses ); - common->Printf( "GL_NUM_INSTRUCTIONS_PER_PASS_ATI: %i\n", fsi.numInstructionsPerPass ); - common->Printf( "GL_NUM_INSTRUCTIONS_TOTAL_ATI: %i\n", fsi.numInstructionsTotal ); - common->Printf( "GL_COLOR_ALPHA_PAIRING_ATI: %i\n", fsi.colorAlphaPairing ); - common->Printf( "GL_NUM_LOOPBACK_COMPONENTS_ATI: %i\n", fsi.numLoopbackComponenets ); - common->Printf( "GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI: %i\n", fsi.numInputInterpolatorComponents ); - - common->Printf( "FPROG_FAST_PATH\n" ); - R_BuildSurfaceFragmentProgram( FPROG_FAST_PATH ); - - common->Printf( "---------------------\n" ); - - glConfig.allowR200Path = true; -} diff --git a/src/renderer/qgl.h b/src/renderer/qgl.h index 018855ac..1968ae34 100644 --- a/src/renderer/qgl.h +++ b/src/renderer/qgl.h @@ -7,536 +7,10 @@ #ifndef __QGL_H__ #define __QGL_H__ -#if defined( _WINDOWS ) - -#include - -#elif defined( MACOS_X ) - -// magic flag to keep tiger gl.h from loading glext.h -#define GL_GLEXT_LEGACY -#include - -#elif defined( __linux__ ) - -// using our local glext.h -// http://oss.sgi.com/projects/ogl-sample/ABI/ -#define GL_GLEXT_LEGACY -#define GLX_GLXEXT_LEGACY -#include -#include - -// TTimo - X.h has a '#define Success 0' line.. -#undef Success - -#elif defined( _XENON ) - -#include "../sys/dx/gl_stub.h" -#include "../sys/dx/glext_stub.h" - -#else - -#include - -#endif - -#ifndef APIENTRY -#define APIENTRY -#endif -#ifndef WINAPI -#define WINAPI -#endif - -// only use local glext.h if we are not using the system one already -// http://oss.sgi.com/projects/ogl-sample/ABI/ -#ifndef GL_GLEXT_VERSION - -#include "glext.h" - -#endif - -typedef void (*GLExtension_t)(void); - -#ifdef __cplusplus - extern "C" { -#endif - -GLExtension_t GLimp_ExtensionPointer( const char *name ); - -#ifdef __cplusplus - } -#endif - -// multitexture -extern void ( APIENTRY * qglMultiTexCoord2fARB )( GLenum texture, GLfloat s, GLfloat t ); -extern void ( APIENTRY * qglMultiTexCoord2fvARB )( GLenum texture, GLfloat * RESTRICT st ); -extern void ( APIENTRY * qglActiveTextureARB )( GLenum texture ); -extern void ( APIENTRY * qglClientActiveTextureARB )( GLenum texture ); - -// ARB_vertex_buffer_object -extern PFNGLBINDBUFFERARBPROC qglBindBufferARB; -extern PFNGLDELETEBUFFERSARBPROC qglDeleteBuffersARB; -extern PFNGLGENBUFFERSARBPROC qglGenBuffersARB; -extern PFNGLISBUFFERARBPROC qglIsBufferARB; -extern PFNGLBUFFERDATAARBPROC qglBufferDataARB; -extern PFNGLBUFFERSUBDATAARBPROC qglBufferSubDataARB; -extern PFNGLGETBUFFERSUBDATAARBPROC qglGetBufferSubDataARB; -extern PFNGLMAPBUFFERARBPROC qglMapBufferARB; -extern PFNGLUNMAPBUFFERARBPROC qglUnmapBufferARB; -extern PFNGLGETBUFFERPARAMETERIVARBPROC qglGetBufferParameterivARB; -extern PFNGLGETBUFFERPOINTERVARBPROC qglGetBufferPointervARB; - - -// NV_register_combiners -extern void ( APIENTRY *qglCombinerParameterfvNV )( GLenum pname, const GLfloat * RESTRICT params ); -extern void ( APIENTRY *qglCombinerParameterivNV )( GLenum pname, const GLint * RESTRICT params ); -extern void ( APIENTRY *qglCombinerParameterfNV )( GLenum pname, const GLfloat param ); -extern void ( APIENTRY *qglCombinerParameteriNV )( GLenum pname, const GLint param ); -extern void ( APIENTRY *qglCombinerInputNV )( GLenum stage, GLenum portion, GLenum variable, GLenum input, - GLenum mapping, GLenum componentUsage ); -extern void ( APIENTRY *qglCombinerOutputNV )( GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, - GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, - GLboolean cdDotProduct, GLboolean muxSum ); -extern void ( APIENTRY *qglFinalCombinerInputNV )( GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage ); - -// RAVEN BEGIN -// dluetscher: added support for NV_vertex_program and NV_fragment_program extensions -extern void ( APIENTRY *qglBindProgramNV ) (GLenum, GLuint); -extern void ( APIENTRY *qglLoadProgramNV ) (GLenum, GLuint, GLsizei, const GLubyte * RESTRICT ); -extern void ( APIENTRY *qglProgramParameter4fvNV ) (GLenum, GLuint, const GLfloat * RESTRICT ); -// RAVEN END - -// 3D textures -extern void ( APIENTRY *qglTexImage3D)(GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid * RESTRICT ); - -// shared texture palette -extern void ( APIENTRY *qglColorTableEXT)( int, int, int, int, int, const void * RESTRICT ); - -// RAVEN BEGIN -// dluetscher: added the BlendEquationEXT() from the blend minmax extension -extern void ( APIENTRY *qglBlendEquationEXT)( GLenum mode ); -// RAVEN END - -// RAVEN BEGIN -// dluetscher: added support for the EXT_draw_range_elements extension -extern void ( APIENTRY * qglDrawRangeElementsEXT )(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * RESTRICT indices); -// RAVEN END - -// ATI_fragment_shader -extern PFNGLGENFRAGMENTSHADERSATIPROC qglGenFragmentShadersATI; -extern PFNGLBINDFRAGMENTSHADERATIPROC qglBindFragmentShaderATI; -extern PFNGLDELETEFRAGMENTSHADERATIPROC qglDeleteFragmentShaderATI; -extern PFNGLBEGINFRAGMENTSHADERATIPROC qglBeginFragmentShaderATI; -extern PFNGLENDFRAGMENTSHADERATIPROC qglEndFragmentShaderATI; -extern PFNGLPASSTEXCOORDATIPROC qglPassTexCoordATI; -extern PFNGLSAMPLEMAPATIPROC qglSampleMapATI; -extern PFNGLCOLORFRAGMENTOP1ATIPROC qglColorFragmentOp1ATI; -extern PFNGLCOLORFRAGMENTOP2ATIPROC qglColorFragmentOp2ATI; -extern PFNGLCOLORFRAGMENTOP3ATIPROC qglColorFragmentOp3ATI; -extern PFNGLALPHAFRAGMENTOP1ATIPROC qglAlphaFragmentOp1ATI; -extern PFNGLALPHAFRAGMENTOP2ATIPROC qglAlphaFragmentOp2ATI; -extern PFNGLALPHAFRAGMENTOP3ATIPROC qglAlphaFragmentOp3ATI; -extern PFNGLSETFRAGMENTSHADERCONSTANTATIPROC qglSetFragmentShaderConstantATI; - -// EXT_stencil_two_side -extern PFNGLACTIVESTENCILFACEEXTPROC qglActiveStencilFaceEXT; - - -// ATI_separate_stencil -extern PFNGLSTENCILOPSEPARATEATIPROC qglStencilOpSeparateATI; -extern PFNGLSTENCILFUNCSEPARATEATIPROC qglStencilFuncSeparateATI; - -// ARB_texture_compression -extern PFNGLCOMPRESSEDTEXIMAGE2DARBPROC qglCompressedTexImage2DARB; -extern PFNGLGETCOMPRESSEDTEXIMAGEARBPROC qglGetCompressedTexImageARB; - -// ARB_vertex_program / ARB_fragment_program -extern PFNGLVERTEXATTRIBPOINTERARBPROC qglVertexAttribPointerARB; -extern PFNGLENABLEVERTEXATTRIBARRAYARBPROC qglEnableVertexAttribArrayARB; -extern PFNGLDISABLEVERTEXATTRIBARRAYARBPROC qglDisableVertexAttribArrayARB; -extern PFNGLPROGRAMSTRINGARBPROC qglProgramStringARB; -extern PFNGLBINDPROGRAMARBPROC qglBindProgramARB; -extern PFNGLGENPROGRAMSARBPROC qglGenProgramsARB; -extern PFNGLPROGRAMENVPARAMETER4FVARBPROC qglProgramEnvParameter4fvARB; -extern PFNGLPROGRAMLOCALPARAMETER4FVARBPROC qglProgramLocalParameter4fvARB; - -// RAVEN BEGIN -// rjohnson: new shader stage system -// GLSL fragment -extern PFNGLCREATESHADEROBJECTARBPROC qglCreateShaderObjectARB; -extern PFNGLDELETEOBJECTARBPROC qglDeleteObjectARB; -extern PFNGLSHADERSOURCEARBPROC qglShaderSourceARB; -extern PFNGLCOMPILESHADERARBPROC qglCompileShaderARB; -extern PFNGLGETOBJECTPARAMETERIVARBPROC qglGetObjectParameterivARB; -extern PFNGLCREATEPROGRAMOBJECTARBPROC qglCreateProgramObjectARB; -extern PFNGLATTACHOBJECTARBPROC qglAttachObjectARB; -extern PFNGLDETACHOBJECTARBPROC qglDetachObjectARB; -extern PFNGLLINKPROGRAMARBPROC qglLinkProgramARB; -extern PFNGLUSEPROGRAMOBJECTARBPROC qglUseProgramObjectARB; -extern PFNGLGETUNIFORMLOCATIONARBPROC qglGetUniformLocationARB; -extern PFNGLUNIFORM1FARBPROC qglUniform1fARB; -extern PFNGLUNIFORM1IARBPROC qglUniform1iARB; -extern PFNGLUNIFORM1FVARBPROC qglUniform1fvARB; -extern PFNGLUNIFORM2FVARBPROC qglUniform2fvARB; -extern PFNGLUNIFORM3FVARBPROC qglUniform3fvARB; -extern PFNGLUNIFORM4FVARBPROC qglUniform4fvARB; -extern PFNGLGETINFOLOGARBPROC qglGetInfoLogARB; -// RAVEN END - -// GL_EXT_depth_bounds_test -extern PFNGLDEPTHBOUNDSEXTPROC qglDepthBoundsEXT; - -//=========================================================================== - -// non-windows systems will just redefine qgl* to gl* -#if defined( __APPLE__ ) || defined( ID_GL_HARDLINK ) - -#include "qgl_linked.h" - -#else - -// windows systems use a function pointer for each call so we can do our log file intercepts - -extern void ( APIENTRY * qglAccum )(GLenum op, GLfloat value); -extern void ( APIENTRY * qglAlphaFunc )(GLenum func, GLclampf ref); -extern GLboolean ( APIENTRY * qglAreTexturesResident )(GLsizei n, const GLuint * RESTRICT textures, GLboolean * RESTRICT residences); -extern void ( APIENTRY * qglArrayElement )(GLint i); -extern void ( APIENTRY * qglBegin )(GLenum mode); -extern void ( APIENTRY * qglBindTexture )(GLenum target, GLuint texture); -extern void ( APIENTRY * qglBitmap )(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte * RESTRICT bitmap); -extern void ( APIENTRY * qglBlendFunc )(GLenum sfactor, GLenum dfactor); -extern void ( APIENTRY * qglCallList )(GLuint list); -extern void ( APIENTRY * qglCallLists )(GLsizei n, GLenum type, const GLvoid * RESTRICT lists); -extern void ( APIENTRY * qglClear )(GLbitfield mask); -extern void ( APIENTRY * qglClearAccum )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -extern void ( APIENTRY * qglClearColor )(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -extern void ( APIENTRY * qglClearDepth )(GLclampd depth); -extern void ( APIENTRY * qglClearIndex )(GLfloat c); -extern void ( APIENTRY * qglClearStencil )(GLint s); -extern void ( APIENTRY * qglClipPlane )(GLenum plane, const GLdouble * RESTRICT equation); -extern void ( APIENTRY * qglColor3b )(GLbyte red, GLbyte green, GLbyte blue); -extern void ( APIENTRY * qglColor3bv )(const GLbyte * RESTRICT v); -extern void ( APIENTRY * qglColor3d )(GLdouble red, GLdouble green, GLdouble blue); -extern void ( APIENTRY * qglColor3dv )(const GLdouble * RESTRICT v); -extern void ( APIENTRY * qglColor3f )(GLfloat red, GLfloat green, GLfloat blue); -extern void ( APIENTRY * qglColor3fv )(const GLfloat * RESTRICT v); -extern void ( APIENTRY * qglColor3i )(GLint red, GLint green, GLint blue); -extern void ( APIENTRY * qglColor3iv )(const GLint * RESTRICT v); -extern void ( APIENTRY * qglColor3s )(GLshort red, GLshort green, GLshort blue); -extern void ( APIENTRY * qglColor3sv )(const GLshort * RESTRICT v); -extern void ( APIENTRY * qglColor3ub )(GLubyte red, GLubyte green, GLubyte blue); -extern void ( APIENTRY * qglColor3ubv )(const GLubyte * RESTRICT v); -extern void ( APIENTRY * qglColor3ui )(GLuint red, GLuint green, GLuint blue); -extern void ( APIENTRY * qglColor3uiv )(const GLuint * RESTRICT v); -extern void ( APIENTRY * qglColor3us )(GLushort red, GLushort green, GLushort blue); -extern void ( APIENTRY * qglColor3usv )(const GLushort * RESTRICT v); -extern void ( APIENTRY * qglColor4b )(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); -extern void ( APIENTRY * qglColor4bv )(const GLbyte * RESTRICT v); -extern void ( APIENTRY * qglColor4d )(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); -extern void ( APIENTRY * qglColor4dv )(const GLdouble * RESTRICT v); -extern void ( APIENTRY * qglColor4f )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -extern void ( APIENTRY * qglColor4fv )(const GLfloat * RESTRICT v); -extern void ( APIENTRY * qglColor4i )(GLint red, GLint green, GLint blue, GLint alpha); -extern void ( APIENTRY * qglColor4iv )(const GLint * RESTRICT v); -extern void ( APIENTRY * qglColor4s )(GLshort red, GLshort green, GLshort blue, GLshort alpha); -extern void ( APIENTRY * qglColor4sv )(const GLshort * RESTRICT v); -extern void ( APIENTRY * qglColor4ub )(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -extern void ( APIENTRY * qglColor4ubv )(const GLubyte * RESTRICT v); -extern void ( APIENTRY * qglColor4ui )(GLuint red, GLuint green, GLuint blue, GLuint alpha); -extern void ( APIENTRY * qglColor4uiv )(const GLuint * RESTRICT v); -extern void ( APIENTRY * qglColor4us )(GLushort red, GLushort green, GLushort blue, GLushort alpha); -extern void ( APIENTRY * qglColor4usv )(const GLushort * RESTRICT v); -extern void ( APIENTRY * qglColorMask )(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -extern void ( APIENTRY * qglColorMaterial )(GLenum face, GLenum mode); -extern void ( APIENTRY * qglColorPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid * RESTRICT pointer); -extern void ( APIENTRY * qglCopyPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -extern void ( APIENTRY * qglCopyTexImage1D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); -extern void ( APIENTRY * qglCopyTexImage2D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -extern void ( APIENTRY * qglCopyTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -extern void ( APIENTRY * qglCopyTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -extern void ( APIENTRY * qglCullFace )(GLenum mode); -extern void ( APIENTRY * qglDeleteLists )(GLuint list, GLsizei range); -extern void ( APIENTRY * qglDeleteTextures )(GLsizei n, const GLuint * RESTRICT textures); -extern void ( APIENTRY * qglDepthFunc )(GLenum func); -extern void ( APIENTRY * qglDepthMask )(GLboolean flag); -extern void ( APIENTRY * qglDepthRange )(GLclampd zNear, GLclampd zFar); -extern void ( APIENTRY * qglDisable )(GLenum cap); -extern void ( APIENTRY * qglDisableClientState )(GLenum array); -extern void ( APIENTRY * qglDrawArrays )(GLenum mode, GLint first, GLsizei count); -extern void ( APIENTRY * qglDrawBuffer )(GLenum mode); -extern void ( APIENTRY * qglDrawElements )(GLenum mode, GLsizei count, GLenum type, const GLvoid * RESTRICT indices); -extern void ( APIENTRY * qglDrawPixels )(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * RESTRICT pixels); -extern void ( APIENTRY * qglEdgeFlag )(GLboolean flag); -extern void ( APIENTRY * qglEdgeFlagPointer )(GLsizei stride, const GLvoid * RESTRICT pointer); -extern void ( APIENTRY * qglEdgeFlagv )(const GLboolean * RESTRICT flag); -extern void ( APIENTRY * qglEnable )(GLenum cap); -extern void ( APIENTRY * qglEnableClientState )(GLenum array); -extern void ( APIENTRY * qglEnd )(void); -extern void ( APIENTRY * qglEndList )(void); -extern void ( APIENTRY * qglEvalCoord1d )(GLdouble u); -extern void ( APIENTRY * qglEvalCoord1dv )(const GLdouble * RESTRICT u); -extern void ( APIENTRY * qglEvalCoord1f )(GLfloat u); -extern void ( APIENTRY * qglEvalCoord1fv )(const GLfloat * RESTRICT u); -extern void ( APIENTRY * qglEvalCoord2d )(GLdouble u, GLdouble v); -extern void ( APIENTRY * qglEvalCoord2dv )(const GLdouble * RESTRICT u); -extern void ( APIENTRY * qglEvalCoord2f )(GLfloat u, GLfloat v); -extern void ( APIENTRY * qglEvalCoord2fv )(const GLfloat * RESTRICT u); -extern void ( APIENTRY * qglEvalMesh1 )(GLenum mode, GLint i1, GLint i2); -extern void ( APIENTRY * qglEvalMesh2 )(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); -extern void ( APIENTRY * qglEvalPoint1 )(GLint i); -extern void ( APIENTRY * qglEvalPoint2 )(GLint i, GLint j); -extern void ( APIENTRY * qglFeedbackBuffer )(GLsizei size, GLenum type, GLfloat * RESTRICT buffer); -extern void ( APIENTRY * qglFinish )(void); -extern void ( APIENTRY * qglFlush )(void); -extern void ( APIENTRY * qglFogf )(GLenum pname, GLfloat param); -extern void ( APIENTRY * qglFogfv )(GLenum pname, const GLfloat * RESTRICT params); -extern void ( APIENTRY * qglFogi )(GLenum pname, GLint param); -extern void ( APIENTRY * qglFogiv )(GLenum pname, const GLint * RESTRICT params); -extern void ( APIENTRY * qglFrontFace )(GLenum mode); -extern void ( APIENTRY * qglFrustum )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -extern GLuint ( APIENTRY * qglGenLists )(GLsizei range); -extern void ( APIENTRY * qglGenTextures )(GLsizei n, GLuint * RESTRICT textures); -extern void ( APIENTRY * qglGetBooleanv )(GLenum pname, GLboolean * RESTRICT params); -extern void ( APIENTRY * qglGetClipPlane )(GLenum plane, GLdouble *RESTRICT equation); -extern void ( APIENTRY * qglGetDoublev )(GLenum pname, GLdouble * RESTRICT params); -extern GLenum ( APIENTRY * qglGetError )(void); -extern void ( APIENTRY * qglGetFloatv )(GLenum pname, GLfloat * RESTRICT params); -extern void ( APIENTRY * qglGetIntegerv )(GLenum pname, GLint * RESTRICT params); -extern void ( APIENTRY * qglGetLightfv )(GLenum light, GLenum pname, GLfloat * RESTRICT params); -extern void ( APIENTRY * qglGetLightiv )(GLenum light, GLenum pname, GLint * RESTRICT params); -extern void ( APIENTRY * qglGetMapdv )(GLenum target, GLenum query, GLdouble * RESTRICT v); -extern void ( APIENTRY * qglGetMapfv )(GLenum target, GLenum query, GLfloat * RESTRICT v); -extern void ( APIENTRY * qglGetMapiv )(GLenum target, GLenum query, GLint * RESTRICT v); -extern void ( APIENTRY * qglGetMaterialfv )(GLenum face, GLenum pname, GLfloat * RESTRICT params); -extern void ( APIENTRY * qglGetMaterialiv )(GLenum face, GLenum pname, GLint * RESTRICT params); -extern void ( APIENTRY * qglGetPixelMapfv )(GLenum map, GLfloat * RESTRICT values); -extern void ( APIENTRY * qglGetPixelMapuiv )(GLenum map, GLuint * RESTRICT values); -extern void ( APIENTRY * qglGetPixelMapusv )(GLenum map, GLushort * RESTRICT values); -extern void ( APIENTRY * qglGetPointerv )(GLenum pname, GLvoid* * RESTRICT params); -extern void ( APIENTRY * qglGetPolygonStipple )(GLubyte * RESTRICT mask); -extern const GLubyte * ( APIENTRY * qglGetString )(GLenum name); -extern void ( APIENTRY * qglGetTexEnvfv )(GLenum target, GLenum pname, GLfloat * RESTRICT params); -extern void ( APIENTRY * qglGetTexEnviv )(GLenum target, GLenum pname, GLint * RESTRICT params); -extern void ( APIENTRY * qglGetTexGendv )(GLenum coord, GLenum pname, GLdouble * RESTRICT params); -extern void ( APIENTRY * qglGetTexGenfv )(GLenum coord, GLenum pname, GLfloat * RESTRICT params); -extern void ( APIENTRY * qglGetTexGeniv )(GLenum coord, GLenum pname, GLint * RESTRICT params); -extern void ( APIENTRY * qglGetTexImage )(GLenum target, GLint level, GLenum format, GLenum type, GLvoid * RESTRICT pixels); -extern void ( APIENTRY * qglGetTexLevelParameterfv )(GLenum target, GLint level, GLenum pname, GLfloat * RESTRICT params); -extern void ( APIENTRY * qglGetTexLevelParameteriv )(GLenum target, GLint level, GLenum pname, GLint * RESTRICT params); -extern void ( APIENTRY * qglGetTexParameterfv )(GLenum target, GLenum pname, GLfloat * RESTRICT params); -extern void ( APIENTRY * qglGetTexParameteriv )(GLenum target, GLenum pname, GLint * RESTRICT params); -extern void ( APIENTRY * qglHint )(GLenum target, GLenum mode); -extern void ( APIENTRY * qglIndexMask )(GLuint mask); -extern void ( APIENTRY * qglIndexPointer )(GLenum type, GLsizei stride, const GLvoid * RESTRICT pointer); -extern void ( APIENTRY * qglIndexd )(GLdouble c); -extern void ( APIENTRY * qglIndexdv )(const GLdouble * RESTRICT c); -extern void ( APIENTRY * qglIndexf )(GLfloat c); -extern void ( APIENTRY * qglIndexfv )(const GLfloat * RESTRICT c); -extern void ( APIENTRY * qglIndexi )(GLint c); -extern void ( APIENTRY * qglIndexiv )(const GLint * RESTRICT c); -extern void ( APIENTRY * qglIndexs )(GLshort c); -extern void ( APIENTRY * qglIndexsv )(const GLshort * RESTRICT c); -extern void ( APIENTRY * qglIndexub )(GLubyte c); -extern void ( APIENTRY * qglIndexubv )(const GLubyte * RESTRICT c); -extern void ( APIENTRY * qglInitNames )(void); -extern void ( APIENTRY * qglInterleavedArrays )(GLenum format, GLsizei stride, const GLvoid * RESTRICT pointer); -extern GLboolean ( APIENTRY * qglIsEnabled )(GLenum cap); -extern GLboolean ( APIENTRY * qglIsList )(GLuint list); -extern GLboolean ( APIENTRY * qglIsTexture )(GLuint texture); -extern void ( APIENTRY * qglLightModelf )(GLenum pname, GLfloat param); -extern void ( APIENTRY * qglLightModelfv )(GLenum pname, const GLfloat * RESTRICT params); -extern void ( APIENTRY * qglLightModeli )(GLenum pname, GLint param); -extern void ( APIENTRY * qglLightModeliv )(GLenum pname, const GLint * RESTRICT params); -extern void ( APIENTRY * qglLightf )(GLenum light, GLenum pname, GLfloat param); -extern void ( APIENTRY * qglLightfv )(GLenum light, GLenum pname, const GLfloat * RESTRICT params); -extern void ( APIENTRY * qglLighti )(GLenum light, GLenum pname, GLint param); -extern void ( APIENTRY * qglLightiv )(GLenum light, GLenum pname, const GLint * RESTRICT params); -extern void ( APIENTRY * qglLineStipple )(GLint factor, GLushort pattern); -extern void ( APIENTRY * qglLineWidth )(GLfloat width); -extern void ( APIENTRY * qglListBase )(GLuint base); -extern void ( APIENTRY * qglLoadIdentity )(void); -extern void ( APIENTRY * qglLoadMatrixd )(const GLdouble * RESTRICT m); -extern void ( APIENTRY * qglLoadMatrixf )(const GLfloat * RESTRICT m); -extern void ( APIENTRY * qglLoadName )(GLuint name); -extern void ( APIENTRY * qglLogicOp )(GLenum opcode); -extern void ( APIENTRY * qglMap1d )(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble * RESTRICT points); -extern void ( APIENTRY * qglMap1f )(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * RESTRICT points); -extern void ( APIENTRY * qglMap2d )(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble * RESTRICT points); -extern void ( APIENTRY * qglMap2f )(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat * RESTRICT points); -extern void ( APIENTRY * qglMapGrid1d )(GLint un, GLdouble u1, GLdouble u2); -extern void ( APIENTRY * qglMapGrid1f )(GLint un, GLfloat u1, GLfloat u2); -extern void ( APIENTRY * qglMapGrid2d )(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); -extern void ( APIENTRY * qglMapGrid2f )(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); -extern void ( APIENTRY * qglMaterialf )(GLenum face, GLenum pname, GLfloat param); -extern void ( APIENTRY * qglMaterialfv )(GLenum face, GLenum pname, const GLfloat * RESTRICT params); -extern void ( APIENTRY * qglMateriali )(GLenum face, GLenum pname, GLint param); -extern void ( APIENTRY * qglMaterialiv )(GLenum face, GLenum pname, const GLint * RESTRICT params); -extern void ( APIENTRY * qglMatrixMode )(GLenum mode); -extern void ( APIENTRY * qglMultMatrixd )(const GLdouble * RESTRICT m); -extern void ( APIENTRY * qglMultMatrixf )(const GLfloat * RESTRICT m); -extern void ( APIENTRY * qglNewList )(GLuint list, GLenum mode); -extern void ( APIENTRY * qglNormal3b )(GLbyte nx, GLbyte ny, GLbyte nz); -extern void ( APIENTRY * qglNormal3bv )(const GLbyte * RESTRICT v); -extern void ( APIENTRY * qglNormal3d )(GLdouble nx, GLdouble ny, GLdouble nz); -extern void ( APIENTRY * qglNormal3dv )(const GLdouble * RESTRICT v); -extern void ( APIENTRY * qglNormal3f )(GLfloat nx, GLfloat ny, GLfloat nz); -extern void ( APIENTRY * qglNormal3fv )(const GLfloat * RESTRICT v); -extern void ( APIENTRY * qglNormal3i )(GLint nx, GLint ny, GLint nz); -extern void ( APIENTRY * qglNormal3iv )(const GLint * RESTRICT v); -extern void ( APIENTRY * qglNormal3s )(GLshort nx, GLshort ny, GLshort nz); -extern void ( APIENTRY * qglNormal3sv )(const GLshort * RESTRICT v); -extern void ( APIENTRY * qglNormalPointer )(GLenum type, GLsizei stride, const GLvoid * RESTRICT pointer); -extern void ( APIENTRY * qglOrtho )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -extern void ( APIENTRY * qglPassThrough )(GLfloat token); -extern void ( APIENTRY * qglPixelMapfv )(GLenum map, GLsizei mapsize, const GLfloat * RESTRICT values); -extern void ( APIENTRY * qglPixelMapuiv )(GLenum map, GLsizei mapsize, const GLuint * RESTRICT values); -extern void ( APIENTRY * qglPixelMapusv )(GLenum map, GLsizei mapsize, const GLushort * RESTRICT values); -extern void ( APIENTRY * qglPixelStoref )(GLenum pname, GLfloat param); -extern void ( APIENTRY * qglPixelStorei )(GLenum pname, GLint param); -extern void ( APIENTRY * qglPixelTransferf )(GLenum pname, GLfloat param); -extern void ( APIENTRY * qglPixelTransferi )(GLenum pname, GLint param); -extern void ( APIENTRY * qglPixelZoom )(GLfloat xfactor, GLfloat yfactor); -extern void ( APIENTRY * qglPointSize )(GLfloat size); -extern void ( APIENTRY * qglPolygonMode )(GLenum face, GLenum mode); -extern void ( APIENTRY * qglPolygonOffset )(GLfloat factor, GLfloat units); -extern void ( APIENTRY * qglPolygonStipple )(const GLubyte * RESTRICT mask); -extern void ( APIENTRY * qglPopAttrib )(void); -extern void ( APIENTRY * qglPopClientAttrib )(void); -extern void ( APIENTRY * qglPopMatrix )(void); -extern void ( APIENTRY * qglPopName )(void); -extern void ( APIENTRY * qglPrioritizeTextures )(GLsizei n, const GLuint * RESTRICT textures, const GLclampf * RESTRICT priorities); -extern void ( APIENTRY * qglPushAttrib )(GLbitfield mask); -extern void ( APIENTRY * qglPushClientAttrib )(GLbitfield mask); -extern void ( APIENTRY * qglPushMatrix )(void); -extern void ( APIENTRY * qglPushName )(GLuint name); -extern void ( APIENTRY * qglRasterPos2d )(GLdouble x, GLdouble y); -extern void ( APIENTRY * qglRasterPos2dv )(const GLdouble * RESTRICT v); -extern void ( APIENTRY * qglRasterPos2f )(GLfloat x, GLfloat y); -extern void ( APIENTRY * qglRasterPos2fv )(const GLfloat * RESTRICT v); -extern void ( APIENTRY * qglRasterPos2i )(GLint x, GLint y); -extern void ( APIENTRY * qglRasterPos2iv )(const GLint * RESTRICT v); -extern void ( APIENTRY * qglRasterPos2s )(GLshort x, GLshort y); -extern void ( APIENTRY * qglRasterPos2sv )(const GLshort * RESTRICT v); -extern void ( APIENTRY * qglRasterPos3d )(GLdouble x, GLdouble y, GLdouble z); -extern void ( APIENTRY * qglRasterPos3dv )(const GLdouble * RESTRICT v); -extern void ( APIENTRY * qglRasterPos3f )(GLfloat x, GLfloat y, GLfloat z); -extern void ( APIENTRY * qglRasterPos3fv )(const GLfloat * RESTRICT v); -extern void ( APIENTRY * qglRasterPos3i )(GLint x, GLint y, GLint z); -extern void ( APIENTRY * qglRasterPos3iv )(const GLint * RESTRICT v); -extern void ( APIENTRY * qglRasterPos3s )(GLshort x, GLshort y, GLshort z); -extern void ( APIENTRY * qglRasterPos3sv )(const GLshort * RESTRICT v); -extern void ( APIENTRY * qglRasterPos4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -extern void ( APIENTRY * qglRasterPos4dv )(const GLdouble * RESTRICT v); -extern void ( APIENTRY * qglRasterPos4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -extern void ( APIENTRY * qglRasterPos4fv )(const GLfloat * RESTRICT v); -extern void ( APIENTRY * qglRasterPos4i )(GLint x, GLint y, GLint z, GLint w); -extern void ( APIENTRY * qglRasterPos4iv )(const GLint * RESTRICT v); -extern void ( APIENTRY * qglRasterPos4s )(GLshort x, GLshort y, GLshort z, GLshort w); -extern void ( APIENTRY * qglRasterPos4sv )(const GLshort * RESTRICT v); -extern void ( APIENTRY * qglReadBuffer )(GLenum mode); -extern void ( APIENTRY * qglReadPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid * RESTRICT pixels); -extern void ( APIENTRY * qglRectd )(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); -extern void ( APIENTRY * qglRectdv )(const GLdouble * RESTRICT v1, const GLdouble * RESTRICT v2); -extern void ( APIENTRY * qglRectf )(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); -extern void ( APIENTRY * qglRectfv )(const GLfloat * RESTRICT v1, const GLfloat * RESTRICT v2); -extern void ( APIENTRY * qglRecti )(GLint x1, GLint y1, GLint x2, GLint y2); -extern void ( APIENTRY * qglRectiv )(const GLint * RESTRICT v1, const GLint * RESTRICT v2); -extern void ( APIENTRY * qglRects )(GLshort x1, GLshort y1, GLshort x2, GLshort y2); -extern void ( APIENTRY * qglRectsv )(const GLshort * RESTRICT v1, const GLshort * RESTRICT v2); -extern GLint ( APIENTRY * qglRenderMode )(GLenum mode); -extern void ( APIENTRY * qglRotated )(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -extern void ( APIENTRY * qglRotatef )(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -extern void ( APIENTRY * qglScaled )(GLdouble x, GLdouble y, GLdouble z); -extern void ( APIENTRY * qglScalef )(GLfloat x, GLfloat y, GLfloat z); -extern void ( APIENTRY * qglScissor )(GLint x, GLint y, GLsizei width, GLsizei height); -extern void ( APIENTRY * qglSelectBuffer )(GLsizei size, GLuint * RESTRICT buffer); -extern void ( APIENTRY * qglShadeModel )(GLenum mode); -extern void ( APIENTRY * qglStencilFunc )(GLenum func, GLint ref, GLuint mask); -extern void ( APIENTRY * qglStencilMask )(GLuint mask); -extern void ( APIENTRY * qglStencilOp )(GLenum fail, GLenum zfail, GLenum zpass); -extern void ( APIENTRY * qglTexCoord1d )(GLdouble s); -extern void ( APIENTRY * qglTexCoord1dv )(const GLdouble * RESTRICT v); -extern void ( APIENTRY * qglTexCoord1f )(GLfloat s); -extern void ( APIENTRY * qglTexCoord1fv )(const GLfloat * RESTRICT v); -extern void ( APIENTRY * qglTexCoord1i )(GLint s); -extern void ( APIENTRY * qglTexCoord1iv )(const GLint * RESTRICT v); -extern void ( APIENTRY * qglTexCoord1s )(GLshort s); -extern void ( APIENTRY * qglTexCoord1sv )(const GLshort * RESTRICT v); -extern void ( APIENTRY * qglTexCoord2d )(GLdouble s, GLdouble t); -extern void ( APIENTRY * qglTexCoord2dv )(const GLdouble * RESTRICT v); -extern void ( APIENTRY * qglTexCoord2f )(GLfloat s, GLfloat t); -extern void ( APIENTRY * qglTexCoord2fv )(const GLfloat * RESTRICT v); -extern void ( APIENTRY * qglTexCoord2i )(GLint s, GLint t); -extern void ( APIENTRY * qglTexCoord2iv )(const GLint * RESTRICT v); -extern void ( APIENTRY * qglTexCoord2s )(GLshort s, GLshort t); -extern void ( APIENTRY * qglTexCoord2sv )(const GLshort * RESTRICT v); -extern void ( APIENTRY * qglTexCoord3d )(GLdouble s, GLdouble t, GLdouble r); -extern void ( APIENTRY * qglTexCoord3dv )(const GLdouble * RESTRICT v); -extern void ( APIENTRY * qglTexCoord3f )(GLfloat s, GLfloat t, GLfloat r); -extern void ( APIENTRY * qglTexCoord3fv )(const GLfloat * RESTRICT v); -extern void ( APIENTRY * qglTexCoord3i )(GLint s, GLint t, GLint r); -extern void ( APIENTRY * qglTexCoord3iv )(const GLint * RESTRICT v); -extern void ( APIENTRY * qglTexCoord3s )(GLshort s, GLshort t, GLshort r); -extern void ( APIENTRY * qglTexCoord3sv )(const GLshort * RESTRICT v); -extern void ( APIENTRY * qglTexCoord4d )(GLdouble s, GLdouble t, GLdouble r, GLdouble q); -extern void ( APIENTRY * qglTexCoord4dv )(const GLdouble * RESTRICT v); -extern void ( APIENTRY * qglTexCoord4f )(GLfloat s, GLfloat t, GLfloat r, GLfloat q); -extern void ( APIENTRY * qglTexCoord4fv )(const GLfloat * RESTRICT v); -extern void ( APIENTRY * qglTexCoord4i )(GLint s, GLint t, GLint r, GLint q); -extern void ( APIENTRY * qglTexCoord4iv )(const GLint * RESTRICT v); -extern void ( APIENTRY * qglTexCoord4s )(GLshort s, GLshort t, GLshort r, GLshort q); -extern void ( APIENTRY * qglTexCoord4sv )(const GLshort * RESTRICT v); -extern void ( APIENTRY * qglTexCoordPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid * RESTRICT pointer); -extern void ( APIENTRY * qglTexEnvf )(GLenum target, GLenum pname, GLfloat param); -extern void ( APIENTRY * qglTexEnvfv )(GLenum target, GLenum pname, const GLfloat * RESTRICT params); -extern void ( APIENTRY * qglTexEnvi )(GLenum target, GLenum pname, GLint param); -extern void ( APIENTRY * qglTexEnviv )(GLenum target, GLenum pname, const GLint * RESTRICT params); -extern void ( APIENTRY * qglTexGend )(GLenum coord, GLenum pname, GLdouble param); -extern void ( APIENTRY * qglTexGendv )(GLenum coord, GLenum pname, const GLdouble * RESTRICT params); -extern void ( APIENTRY * qglTexGenf )(GLenum coord, GLenum pname, GLfloat param); -extern void ( APIENTRY * qglTexGenfv )(GLenum coord, GLenum pname, const GLfloat * RESTRICT params); -extern void ( APIENTRY * qglTexGeni )(GLenum coord, GLenum pname, GLint param); -extern void ( APIENTRY * qglTexGeniv )(GLenum coord, GLenum pname, const GLint * RESTRICT params); -extern void ( APIENTRY * qglTexImage1D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * RESTRICT pixels); -extern void ( APIENTRY * qglTexImage2D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * RESTRICT pixels); -extern void ( APIENTRY * qglTexParameterf )(GLenum target, GLenum pname, GLfloat param); -extern void ( APIENTRY * qglTexParameterfv )(GLenum target, GLenum pname, const GLfloat * RESTRICT params); -extern void ( APIENTRY * qglTexParameteri )(GLenum target, GLenum pname, GLint param); -extern void ( APIENTRY * qglTexParameteriv )(GLenum target, GLenum pname, const GLint * RESTRICT params); -extern void ( APIENTRY * qglTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * RESTRICT pixels); -extern void ( APIENTRY * qglTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * RESTRICT pixels); -extern void ( APIENTRY * qglTranslated )(GLdouble x, GLdouble y, GLdouble z); -extern void ( APIENTRY * qglTranslatef )(GLfloat x, GLfloat y, GLfloat z); -extern void ( APIENTRY * qglVertex2d )(GLdouble x, GLdouble y); -extern void ( APIENTRY * qglVertex2dv )(const GLdouble * RESTRICT v); -extern void ( APIENTRY * qglVertex2f )(GLfloat x, GLfloat y); -extern void ( APIENTRY * qglVertex2fv )(const GLfloat * RESTRICT v); -extern void ( APIENTRY * qglVertex2i )(GLint x, GLint y); -extern void ( APIENTRY * qglVertex2iv )(const GLint * RESTRICT v); -extern void ( APIENTRY * qglVertex2s )(GLshort x, GLshort y); -extern void ( APIENTRY * qglVertex2sv )(const GLshort * RESTRICT v); -extern void ( APIENTRY * qglVertex3d )(GLdouble x, GLdouble y, GLdouble z); -extern void ( APIENTRY * qglVertex3dv )(const GLdouble * RESTRICT v); -extern void ( APIENTRY * qglVertex3f )(GLfloat x, GLfloat y, GLfloat z); -extern void ( APIENTRY * qglVertex3fv )(const GLfloat * RESTRICT v); -extern void ( APIENTRY * qglVertex3i )(GLint x, GLint y, GLint z); -extern void ( APIENTRY * qglVertex3iv )(const GLint * RESTRICT v); -extern void ( APIENTRY * qglVertex3s )(GLshort x, GLshort y, GLshort z); -extern void ( APIENTRY * qglVertex3sv )(const GLshort * RESTRICT v); -extern void ( APIENTRY * qglVertex4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -extern void ( APIENTRY * qglVertex4dv )(const GLdouble * RESTRICT v); -extern void ( APIENTRY * qglVertex4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -extern void ( APIENTRY * qglVertex4fv )(const GLfloat * RESTRICT v); -extern void ( APIENTRY * qglVertex4i )(GLint x, GLint y, GLint z, GLint w); -extern void ( APIENTRY * qglVertex4iv )(const GLint * RESTRICT v); -extern void ( APIENTRY * qglVertex4s )(GLshort x, GLshort y, GLshort z, GLshort w); -extern void ( APIENTRY * qglVertex4sv )(const GLshort * RESTRICT v); -extern void ( APIENTRY * qglVertexPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid * RESTRICT pointer); -extern void ( APIENTRY * qglViewport )(GLint x, GLint y, GLsizei width, GLsizei height); +#include "../external/glew/glew.h" // RAVEN BEGIN // dluetscher: added some wgl calls to the XENON version, as well as the Windows version -#if defined( _WINDOWS ) || defined( _XENON ) typedef struct tagPIXELFORMATDESCRIPTOR PIXELFORMATDESCRIPTOR, *PPIXELFORMATDESCRIPTOR, FAR *LPPIXELFORMATDESCRIPTOR; // RAVEN END @@ -569,10 +43,6 @@ extern PROC ( WINAPI * qwglGetProcAddress)(LPCSTR); extern BOOL ( WINAPI * qwglMakeCurrent)(HDC, HGLRC); extern BOOL ( WINAPI * qwglShareLists)(HGLRC, HGLRC); -// RAVEN BEGIN -// dluetscher: removed these wgl calls from the XENON version -#if !defined( _XENON ) -// RAVEN END extern BOOL ( WINAPI * qwglUseFontBitmaps)(HDC, DWORD, DWORD, DWORD); extern BOOL ( WINAPI * qwglUseFontOutlines)(HDC, DWORD, DWORD, DWORD, FLOAT, @@ -586,46 +56,5 @@ extern int ( WINAPI * qwglGetLayerPaletteEntries)(HDC, int, int, int, COLORREF * RESTRICT ); extern BOOL ( WINAPI * qwglRealizeLayerPalette)(HDC, int, BOOL); extern BOOL ( WINAPI * qwglSwapLayerBuffers)(HDC, UINT); -#endif - -#endif // _WINDOWS - -#if defined( __linux__ ) - -//GLX Functions -extern XVisualInfo * (*qglXChooseVisual)( Display * RESTRICT dpy, int screen, int * RESTRICT attribList ); -extern GLXContext (*qglXCreateContext)( Display * RESTRICT dpy, XVisualInfo * RESTRICT vis, GLXContext shareList, Bool direct ); -extern void (*qglXDestroyContext)( Display * RESTRICT dpy, GLXContext ctx ); -extern Bool (*qglXMakeCurrent)( Display * RESTRICT dpy, GLXDrawable drawable, GLXContext ctx); -extern void (*qglXSwapBuffers)( Display * RESTRICT dpy, GLXDrawable drawable ); -extern GLExtension_t (*qglXGetProcAddressARB)( const GLubyte * RESTRICT procname ); -extern GLXContext (*qglXGetCurrentContext)( void ); - -// make sure the code is correctly using qgl everywhere -// don't enable that when building glimp itself obviously.. -#if !defined( GLIMP ) - #include "../sys/linux/qgl_enforce.h" -#endif - -#endif // __linux__ - -// RAVEN BEGIN -// mwhitlock: loading from .xbr resource bundles -#if defined( _XENON ) -extern void ( APIENTRY * qglSetTexCacheDefault2DImageId ) (int id); -extern void ( APIENTRY * qglSetTexCacheDefaultCubeImageId ) (int id); -extern GLboolean ( APIENTRY * qglTexImageExistsInBundles ) ( unsigned long texNameCRC32 ); -extern void ( APIENTRY * qglTexImageFromCache )(int id, unsigned long texNameCRC32 ); - -// nrausch: capture backbuffer to memory -extern void xglCapture( int width, int height, void * RESTRICT pixels ); - -// mwhitlock: allow us to directly use the results of resolving from the EDRAM rendertarget as texture. -extern void ( APIENTRY * qglTexImageFromFrontBuffer )( void ); - -#endif //_XENON -// RAVEN END - -#endif // hardlinlk vs dlopen -#endif +#endif \ No newline at end of file diff --git a/src/renderer/qgl_linked.h b/src/renderer/qgl_linked.h index b18edf35..74987c1c 100644 --- a/src/renderer/qgl_linked.h +++ b/src/renderer/qgl_linked.h @@ -1,346 +1,346 @@ -#define qglAccum glAccum -#define qglAlphaFunc glAlphaFunc -#define qglAreTexturesResident glAreTexturesResident -#define qglArrayElement glArrayElement -#define qglBegin glBegin -#define qglBindTexture glBindTexture -#define qglBitmap glBitmap -#define qglBlendFunc glBlendFunc -#define qglCallList glCallList -#define qglCallLists glCallLists -#define qglClear glClear -#define qglClearAccum glClearAccum -#define qglClearColor glClearColor -#define qglClearDepth glClearDepth -#define qglClearIndex glClearIndex -#define qglClearStencil glClearStencil -#define qglClipPlane glClipPlane -#define qglColor3b glColor3b -#define qglColor3bv glColor3bv -#define qglColor3d glColor3d -#define qglColor3dv glColor3dv -#define qglColor3f glColor3f -#define qglColor3fv glColor3fv -#define qglColor3i glColor3i -#define qglColor3iv glColor3iv -#define qglColor3s glColor3s -#define qglColor3sv glColor3sv -#define qglColor3ub glColor3ub -#define qglColor3ubv glColor3ubv -#define qglColor3ui glColor3ui -#define qglColor3uiv glColor3uiv -#define qglColor3us glColor3us -#define qglColor3usv glColor3usv -#define qglColor4b glColor4b -#define qglColor4bv glColor4bv -#define qglColor4d glColor4d -#define qglColor4dv glColor4dv -#define qglColor4f glColor4f -#define qglColor4fv glColor4fv -#define qglColor4i glColor4i -#define qglColor4iv glColor4iv -#define qglColor4s glColor4s -#define qglColor4sv glColor4sv -#define qglColor4ub glColor4ub -#define qglColor4ubv glColor4ubv -#define qglColor4ui glColor4ui -#define qglColor4uiv glColor4uiv -#define qglColor4us glColor4us -#define qglColor4usv glColor4usv -#define qglColorMask glColorMask -#define qglColorMaterial glColorMaterial -#define qglColorPointer glColorPointer -#define qglCopyPixels glCopyPixels -#define qglCopyTexImage1D glCopyTexImage1D -#define qglCopyTexImage2D glCopyTexImage2D -#define qglCopyTexSubImage1D glCopyTexSubImage1D -#define qglCopyTexSubImage2D glCopyTexSubImage2D -#define qglCullFace glCullFace -#define qglDeleteLists glDeleteLists -#define qglDeleteTextures glDeleteTextures -#define qglDepthFunc glDepthFunc -#define qglDepthMask glDepthMask -#define qglDepthRange glDepthRange -#define qglDisable glDisable -#define qglDisableClientState glDisableClientState -#define qglDrawArrays glDrawArrays -#define qglDrawBuffer glDrawBuffer -#define qglDrawElements glDrawElements -#define qglDrawPixels glDrawPixels -#define qglEdgeFlag glEdgeFlag -#define qglEdgeFlagPointer glEdgeFlagPointer -#define qglEdgeFlagv glEdgeFlagv -#define qglEnable glEnable -#define qglEnableClientState glEnableClientState -#define qglEnd glEnd -#define qglEndList glEndList -#define qglEvalCoord1d glEvalCoord1d -#define qglEvalCoord1dv glEvalCoord1dv -#define qglEvalCoord1f glEvalCoord1f -#define qglEvalCoord1fv glEvalCoord1fv -#define qglEvalCoord2d glEvalCoord2d -#define qglEvalCoord2dv glEvalCoord2dv -#define qglEvalCoord2f glEvalCoord2f -#define qglEvalCoord2fv glEvalCoord2fv -#define qglEvalMesh1 glEvalMesh1 -#define qglEvalMesh2 glEvalMesh2 -#define qglEvalPoint1 glEvalPoint1 -#define qglEvalPoint2 glEvalPoint2 -#define qglFeedbackBuffer glFeedbackBuffer -#define qglFinish glFinish -#define qglFlush glFlush -#define qglFogf glFogf -#define qglFogfv glFogfv -#define qglFogi glFogi -#define qglFogiv glFogiv -#define qglFrontFace glFrontFace -#define qglFrustum glFrustum -#define qglGenLists glGenLists -#define qglGenTextures glGenTextures -#define qglGetBooleanv glGetBooleanv -#define qglGetClipPlane glGetClipPlane -#define qglGetDoublev glGetDoublev -#define qglGetError glGetError -#define qglGetFloatv glGetFloatv -#define qglGetIntegerv glGetIntegerv -#define qglGetLightfv glGetLightfv -#define qglGetLightiv glGetLightiv -#define qglGetMapdv glGetMapdv -#define qglGetMapfv glGetMapfv -#define qglGetMapiv glGetMapiv -#define qglGetMaterialfv glGetMaterialfv -#define qglGetMaterialiv glGetMaterialiv -#define qglGetPixelMapfv glGetPixelMapfv -#define qglGetPixelMapuiv glGetPixelMapuiv -#define qglGetPixelMapusv glGetPixelMapusv -#define qglGetPointerv glGetPointerv -#define qglGetPolygonStipple glGetPolygonStipple -#define qglGetString glGetString -#define qglGetTexEnviv glGetTexEnviv -#define qglGetTexEnvfv glGetTexEnvfv -#define qglGetTexGendv glGetTexGendv -#define qglGetTexGenfv glGetTexGenfv -#define qglGetTexGeniv glGetTexGeniv -#define qglGetTexImage glGetTexImage -#define qglGetTexLevelParameterfv glGetTexLevelParameterfv -#define qglGetTexLevelParameteriv glGetTexLevelParameteriv -#define qglGetTexParameterfv glGetTexParameterfv -#define qglGetTexParameteriv glGetTexParameteriv -#define qglHint glHint -#define qglIndexMask glIndexMask -#define qglIndexPointer glIndexPointer -#define qglIndexd glIndexd -#define qglIndexdv glIndexdv -#define qglIndexf glIndexf -#define qglIndexfv glIndexfv -#define qglIndexi glIndexi -#define qglIndexiv glIndexiv -#define qglIndexs glIndexs -#define qglIndexsv glIndexsv -#define qglIndexub glIndexub -#define qglIndexubv glIndexubv -#define qglInitNames glInitNames -#define qglInterleavedArrays glInterleavedArrays -#define qglIsEnabled glIsEnabled -#define qglIsList glIsList -#define qglIsTexture glIsTexture -#define qglLightModelf glLightModelf -#define qglLightModelfv glLightModelfv -#define qglLightModeli glLightModeli -#define qglLightModeliv glLightModeliv -#define qglLightf glLightf -#define qglLightfv glLightfv -#define qglLighti glLighti -#define qglLightiv glLightiv -#define qglLineStipple glLineStipple -#define qglLineWidth glLineWidth -#define qglListBase glListBase -#define qglLoadIdentity glLoadIdentity -#define qglLoadMatrixd glLoadMatrixd -#define qglLoadMatrixf glLoadMatrixf -#define qglLoadName glLoadName -#define qglLogicOp glLogicOp -#define qglMap1d glMap1d -#define qglMap1f glMap1f -#define qglMap2d glMap2d -#define qglMap2f glMap2f -#define qglMapGrid1d glMapGrid1d -#define qglMapGrid1f glMapGrid1f -#define qglMapGrid2d glMapGrid2d -#define qglMapGrid2f glMapGrid2f -#define qglMaterialf glMaterialf -#define qglMaterialfv glMaterialfv -#define qglMateriali glMateriali -#define qglMaterialiv glMaterialiv -#define qglMatrixMode glMatrixMode -#define qglMultMatrixd glMultMatrixd -#define qglMultMatrixf glMultMatrixf -#define qglNewList glNewList -#define qglNormal3b glNormal3b -#define qglNormal3bv glNormal3bv -#define qglNormal3d glNormal3d -#define qglNormal3dv glNormal3dv -#define qglNormal3f glNormal3f -#define qglNormal3fv glNormal3fv -#define qglNormal3i glNormal3i -#define qglNormal3iv glNormal3iv -#define qglNormal3s glNormal3s -#define qglNormal3sv glNormal3sv -#define qglNormalPointer glNormalPointer -#define qglOrtho glOrtho -#define qglPassThrough glPassThrough -#define qglPixelMapfv glPixelMapfv -#define qglPixelMapuiv glPixelMapuiv -#define qglPixelMapusv glPixelMapusv -#define qglPixelStoref glPixelStoref -#define qglPixelStorei glPixelStorei -#define qglPixelTransferf glPixelTransferf -#define qglPixelTransferi glPixelTransferi -#define qglPixelZoom glPixelZoom -#define qglPointSize glPointSize -#define qglPolygonMode glPolygonMode -#define qglPolygonOffset glPolygonOffset -#define qglPolygonStipple glPolygonStipple -#define qglPopAttrib glPopAttrib -#define qglPopClientAttrib glPopClientAttrib -#define qglPopMatrix glPopMatrix -#define qglPopName glPopName -#define qglPrioritizeTextures glPrioritizeTextures -#define qglPushAttrib glPushAttrib -#define qglPushClientAttrib glPushClientAttrib -#define qglPushMatrix glPushMatrix -#define qglPushName glPushName -#define qglRasterPos2d glRasterPos2d -#define qglRasterPos2dv glRasterPos2dv -#define qglRasterPos2f glRasterPos2f -#define qglRasterPos2fv glRasterPos2fv -#define qglRasterPos2i glRasterPos2i -#define qglRasterPos2iv glRasterPos2iv -#define qglRasterPos2s glRasterPos2s -#define qglRasterPos2sv glRasterPos2sv -#define qglRasterPos3d glRasterPos3d -#define qglRasterPos3dv glRasterPos3dv -#define qglRasterPos3f glRasterPos3f -#define qglRasterPos3fv glRasterPos3fv -#define qglRasterPos3i glRasterPos3i -#define qglRasterPos3iv glRasterPos3iv -#define qglRasterPos3s glRasterPos3s -#define qglRasterPos3sv glRasterPos3sv -#define qglRasterPos4d glRasterPos4d -#define qglRasterPos4dv glRasterPos4dv -#define qglRasterPos4f glRasterPos4f -#define qglRasterPos4fv glRasterPos4fv -#define qglRasterPos4i glRasterPos4i -#define qglRasterPos4iv glRasterPos4iv -#define qglRasterPos4s glRasterPos4s -#define qglRasterPos4sv glRasterPos4sv -#define qglReadBuffer glReadBuffer -#define qglReadPixels glReadPixels -#define qglRectd glRectd -#define qglRectdv glRectdv -#define qglRectf glRectf -#define qglRectfv glRectfv -#define qglRecti glRecti -#define qglRectiv glRectiv -#define qglRects glRects -#define qglRectsv glRectsv -#define qglRenderMode glRenderMode -#define qglRotated glRotated -#define qglRotatef glRotatef -#define qglScaled glScaled -#define qglScalef glScalef -#define qglScissor glScissor -#define qglSelectBuffer glSelectBuffer -#define qglShadeModel glShadeModel -#define qglStencilFunc glStencilFunc -#define qglStencilMask glStencilMask -#define qglStencilOp glStencilOp -#define qglTexCoord1d glTexCoord1d -#define qglTexCoord1dv glTexCoord1dv -#define qglTexCoord1f glTexCoord1f -#define qglTexCoord1fv glTexCoord1fv -#define qglTexCoord1i glTexCoord1i -#define qglTexCoord1iv glTexCoord1iv -#define qglTexCoord1s glTexCoord1s -#define qglTexCoord1sv glTexCoord1sv -#define qglTexCoord2d glTexCoord2d -#define qglTexCoord2dv glTexCoord2dv -#define qglTexCoord2f glTexCoord2f -#define qglTexCoord2fv glTexCoord2fv -#define qglTexCoord2i glTexCoord2i -#define qglTexCoord2iv glTexCoord2iv -#define qglTexCoord2s glTexCoord2s -#define qglTexCoord2sv glTexCoord2sv -#define qglTexCoord3d glTexCoord3d -#define qglTexCoord3dv glTexCoord3dv -#define qglTexCoord3f glTexCoord3f -#define qglTexCoord3fv glTexCoord3fv -#define qglTexCoord3i glTexCoord3i -#define qglTexCoord3iv glTexCoord3iv -#define qglTexCoord3s glTexCoord3s -#define qglTexCoord3sv glTexCoord3sv -#define qglTexCoord4d glTexCoord4d -#define qglTexCoord4dv glTexCoord4dv -#define qglTexCoord4f glTexCoord4f -#define qglTexCoord4fv glTexCoord4fv -#define qglTexCoord4i glTexCoord4i -#define qglTexCoord4iv glTexCoord4iv -#define qglTexCoord4s glTexCoord4s -#define qglTexCoord4sv glTexCoord4sv -#define qglTexCoordPointer glTexCoordPointer -#define qglTexEnvf glTexEnvf -#define qglTexEnvfv glTexEnvfv -#define qglTexEnvi glTexEnvi -#define qglTexEnviv glTexEnviv -#define qglTexGend glTexGend -#define qglTexGendv glTexGendv -#define qglTexGenf glTexGenf -#define qglTexGenfv glTexGenfv -#define qglTexGeni glTexGeni -#define qglTexGeniv glTexGeniv -#define qglTexImage1D glTexImage1D -#define qglTexImage2D glTexImage2D -#define qglTexParameterf glTexParameterf -#define qglTexParameterfv glTexParameterfv -#define qglTexParameteri glTexParameteri -#define qglTexParameteriv glTexParameteriv -#define qglTexSubImage1D glTexSubImage1D -#define qglTexSubImage2D glTexSubImage2D -#define qglTranslated glTranslated -#define qglTranslatef glTranslatef -#define qglVertex2d glVertex2d -#define qglVertex2dv glVertex2dv -#define qglVertex2f glVertex2f -#define qglVertex2fv glVertex2fv -#define qglVertex2i glVertex2i -#define qglVertex2iv glVertex2iv -#define qglVertex2s glVertex2s -#define qglVertex2sv glVertex2sv -#define qglVertex3d glVertex3d -#define qglVertex3dv glVertex3dv -#define qglVertex3f glVertex3f -#define qglVertex3fv glVertex3fv -#define qglVertex3i glVertex3i -#define qglVertex3iv glVertex3iv -#define qglVertex3s glVertex3s -#define qglVertex3sv glVertex3sv -#define qglVertex4d glVertex4d -#define qglVertex4dv glVertex4dv -#define qglVertex4f glVertex4f -#define qglVertex4fv glVertex4fv -#define qglVertex4i glVertex4i -#define qglVertex4iv glVertex4iv -#define qglVertex4s glVertex4s -#define qglVertex4sv glVertex4sv -#define qglVertexPointer glVertexPointer -#define qglViewport glViewport +#define glAccum glAccum +#define glAlphaFunc glAlphaFunc +#define glAreTexturesResident glAreTexturesResident +#define glArrayElement glArrayElement +#define glBegin glBegin +#define glBindTexture glBindTexture +#define glBitmap glBitmap +#define glBlendFunc glBlendFunc +#define glCallList glCallList +#define glCallLists glCallLists +#define glClear glClear +#define glClearAccum glClearAccum +#define glClearColor glClearColor +#define glClearDepth glClearDepth +#define glClearIndex glClearIndex +#define glClearStencil glClearStencil +#define glClipPlane glClipPlane +#define glColor3b glColor3b +#define glColor3bv glColor3bv +#define glColor3d glColor3d +#define glColor3dv glColor3dv +#define glColor3f glColor3f +#define glColor3fv glColor3fv +#define glColor3i glColor3i +#define glColor3iv glColor3iv +#define glColor3s glColor3s +#define glColor3sv glColor3sv +#define glColor3ub glColor3ub +#define glColor3ubv glColor3ubv +#define glColor3ui glColor3ui +#define glColor3uiv glColor3uiv +#define glColor3us glColor3us +#define glColor3usv glColor3usv +#define glColor4b glColor4b +#define glColor4bv glColor4bv +#define glColor4d glColor4d +#define glColor4dv glColor4dv +#define glColor4f glColor4f +#define glColor4fv glColor4fv +#define glColor4i glColor4i +#define glColor4iv glColor4iv +#define glColor4s glColor4s +#define glColor4sv glColor4sv +#define glColor4ub glColor4ub +#define glColor4ubv glColor4ubv +#define glColor4ui glColor4ui +#define glColor4uiv glColor4uiv +#define glColor4us glColor4us +#define glColor4usv glColor4usv +#define glColorMask glColorMask +#define glColorMaterial glColorMaterial +#define glColorPointer glColorPointer +#define glCopyPixels glCopyPixels +#define glCopyTexImage1D glCopyTexImage1D +#define glCopyTexImage2D glCopyTexImage2D +#define glCopyTexSubImage1D glCopyTexSubImage1D +#define glCopyTexSubImage2D glCopyTexSubImage2D +#define glCullFace glCullFace +#define glDeleteLists glDeleteLists +#define glDeleteTextures glDeleteTextures +#define glDepthFunc glDepthFunc +#define glDepthMask glDepthMask +#define glDepthRange glDepthRange +#define glDisable glDisable +#define glDisableClientState glDisableClientState +#define glDrawArrays glDrawArrays +#define glDrawBuffer glDrawBuffer +#define glDrawElements glDrawElements +#define glDrawPixels glDrawPixels +#define glEdgeFlag glEdgeFlag +#define glEdgeFlagPointer glEdgeFlagPointer +#define glEdgeFlagv glEdgeFlagv +#define glEnable glEnable +#define glEnableClientState glEnableClientState +#define glEnd glEnd +#define glEndList glEndList +#define glEvalCoord1d glEvalCoord1d +#define glEvalCoord1dv glEvalCoord1dv +#define glEvalCoord1f glEvalCoord1f +#define glEvalCoord1fv glEvalCoord1fv +#define glEvalCoord2d glEvalCoord2d +#define glEvalCoord2dv glEvalCoord2dv +#define glEvalCoord2f glEvalCoord2f +#define glEvalCoord2fv glEvalCoord2fv +#define glEvalMesh1 glEvalMesh1 +#define glEvalMesh2 glEvalMesh2 +#define glEvalPoint1 glEvalPoint1 +#define glEvalPoint2 glEvalPoint2 +#define glFeedbackBuffer glFeedbackBuffer +#define glFinish glFinish +#define glFlush glFlush +#define glFogf glFogf +#define glFogfv glFogfv +#define glFogi glFogi +#define glFogiv glFogiv +#define glFrontFace glFrontFace +#define glFrustum glFrustum +#define glGenLists glGenLists +#define glGenTextures glGenTextures +#define glGetBooleanv glGetBooleanv +#define glGetClipPlane glGetClipPlane +#define glGetDoublev glGetDoublev +#define glGetError glGetError +#define glGetFloatv glGetFloatv +#define glGetIntegerv glGetIntegerv +#define glGetLightfv glGetLightfv +#define glGetLightiv glGetLightiv +#define glGetMapdv glGetMapdv +#define glGetMapfv glGetMapfv +#define glGetMapiv glGetMapiv +#define glGetMaterialfv glGetMaterialfv +#define glGetMaterialiv glGetMaterialiv +#define glGetPixelMapfv glGetPixelMapfv +#define glGetPixelMapuiv glGetPixelMapuiv +#define glGetPixelMapusv glGetPixelMapusv +#define glGetPointerv glGetPointerv +#define glGetPolygonStipple glGetPolygonStipple +#define glGetString glGetString +#define glGetTexEnviv glGetTexEnviv +#define glGetTexEnvfv glGetTexEnvfv +#define glGetTexGendv glGetTexGendv +#define glGetTexGenfv glGetTexGenfv +#define glGetTexGeniv glGetTexGeniv +#define glGetTexImage glGetTexImage +#define glGetTexLevelParameterfv glGetTexLevelParameterfv +#define glGetTexLevelParameteriv glGetTexLevelParameteriv +#define glGetTexParameterfv glGetTexParameterfv +#define glGetTexParameteriv glGetTexParameteriv +#define glHint glHint +#define glIndexMask glIndexMask +#define glIndexPointer glIndexPointer +#define glIndexd glIndexd +#define glIndexdv glIndexdv +#define glIndexf glIndexf +#define glIndexfv glIndexfv +#define glIndexi glIndexi +#define glIndexiv glIndexiv +#define glIndexs glIndexs +#define glIndexsv glIndexsv +#define glIndexub glIndexub +#define glIndexubv glIndexubv +#define glInitNames glInitNames +#define glInterleavedArrays glInterleavedArrays +#define glIsEnabled glIsEnabled +#define glIsList glIsList +#define glIsTexture glIsTexture +#define glLightModelf glLightModelf +#define glLightModelfv glLightModelfv +#define glLightModeli glLightModeli +#define glLightModeliv glLightModeliv +#define glLightf glLightf +#define glLightfv glLightfv +#define glLighti glLighti +#define glLightiv glLightiv +#define glLineStipple glLineStipple +#define glLineWidth glLineWidth +#define glListBase glListBase +#define glLoadIdentity glLoadIdentity +#define glLoadMatrixd glLoadMatrixd +#define glLoadMatrixf glLoadMatrixf +#define glLoadName glLoadName +#define glLogicOp glLogicOp +#define glMap1d glMap1d +#define glMap1f glMap1f +#define glMap2d glMap2d +#define glMap2f glMap2f +#define glMapGrid1d glMapGrid1d +#define glMapGrid1f glMapGrid1f +#define glMapGrid2d glMapGrid2d +#define glMapGrid2f glMapGrid2f +#define glMaterialf glMaterialf +#define glMaterialfv glMaterialfv +#define glMateriali glMateriali +#define glMaterialiv glMaterialiv +#define glMatrixMode glMatrixMode +#define glMultMatrixd glMultMatrixd +#define glMultMatrixf glMultMatrixf +#define glNewList glNewList +#define glNormal3b glNormal3b +#define glNormal3bv glNormal3bv +#define glNormal3d glNormal3d +#define glNormal3dv glNormal3dv +#define glNormal3f glNormal3f +#define glNormal3fv glNormal3fv +#define glNormal3i glNormal3i +#define glNormal3iv glNormal3iv +#define glNormal3s glNormal3s +#define glNormal3sv glNormal3sv +#define glNormalPointer glNormalPointer +#define glOrtho glOrtho +#define glPassThrough glPassThrough +#define glPixelMapfv glPixelMapfv +#define glPixelMapuiv glPixelMapuiv +#define glPixelMapusv glPixelMapusv +#define glPixelStoref glPixelStoref +#define glPixelStorei glPixelStorei +#define glPixelTransferf glPixelTransferf +#define glPixelTransferi glPixelTransferi +#define glPixelZoom glPixelZoom +#define glPointSize glPointSize +#define glPolygonMode glPolygonMode +#define glPolygonOffset glPolygonOffset +#define glPolygonStipple glPolygonStipple +#define glPopAttrib glPopAttrib +#define glPopClientAttrib glPopClientAttrib +#define glPopMatrix glPopMatrix +#define glPopName glPopName +#define glPrioritizeTextures glPrioritizeTextures +#define glPushAttrib glPushAttrib +#define glPushClientAttrib glPushClientAttrib +#define glPushMatrix glPushMatrix +#define glPushName glPushName +#define glRasterPos2d glRasterPos2d +#define glRasterPos2dv glRasterPos2dv +#define glRasterPos2f glRasterPos2f +#define glRasterPos2fv glRasterPos2fv +#define glRasterPos2i glRasterPos2i +#define glRasterPos2iv glRasterPos2iv +#define glRasterPos2s glRasterPos2s +#define glRasterPos2sv glRasterPos2sv +#define glRasterPos3d glRasterPos3d +#define glRasterPos3dv glRasterPos3dv +#define glRasterPos3f glRasterPos3f +#define glRasterPos3fv glRasterPos3fv +#define glRasterPos3i glRasterPos3i +#define glRasterPos3iv glRasterPos3iv +#define glRasterPos3s glRasterPos3s +#define glRasterPos3sv glRasterPos3sv +#define glRasterPos4d glRasterPos4d +#define glRasterPos4dv glRasterPos4dv +#define glRasterPos4f glRasterPos4f +#define glRasterPos4fv glRasterPos4fv +#define glRasterPos4i glRasterPos4i +#define glRasterPos4iv glRasterPos4iv +#define glRasterPos4s glRasterPos4s +#define glRasterPos4sv glRasterPos4sv +#define glReadBuffer glReadBuffer +#define glReadPixels glReadPixels +#define glRectd glRectd +#define glRectdv glRectdv +#define glRectf glRectf +#define glRectfv glRectfv +#define glRecti glRecti +#define glRectiv glRectiv +#define glRects glRects +#define glRectsv glRectsv +#define glRenderMode glRenderMode +#define glRotated glRotated +#define glRotatef glRotatef +#define glScaled glScaled +#define glScalef glScalef +#define glScissor glScissor +#define glSelectBuffer glSelectBuffer +#define glShadeModel glShadeModel +#define glStencilFunc glStencilFunc +#define glStencilMask glStencilMask +#define glStencilOp glStencilOp +#define glTexCoord1d glTexCoord1d +#define glTexCoord1dv glTexCoord1dv +#define glTexCoord1f glTexCoord1f +#define glTexCoord1fv glTexCoord1fv +#define glTexCoord1i glTexCoord1i +#define glTexCoord1iv glTexCoord1iv +#define glTexCoord1s glTexCoord1s +#define glTexCoord1sv glTexCoord1sv +#define glTexCoord2d glTexCoord2d +#define glTexCoord2dv glTexCoord2dv +#define glTexCoord2f glTexCoord2f +#define glTexCoord2fv glTexCoord2fv +#define glTexCoord2i glTexCoord2i +#define glTexCoord2iv glTexCoord2iv +#define glTexCoord2s glTexCoord2s +#define glTexCoord2sv glTexCoord2sv +#define glTexCoord3d glTexCoord3d +#define glTexCoord3dv glTexCoord3dv +#define glTexCoord3f glTexCoord3f +#define glTexCoord3fv glTexCoord3fv +#define glTexCoord3i glTexCoord3i +#define glTexCoord3iv glTexCoord3iv +#define glTexCoord3s glTexCoord3s +#define glTexCoord3sv glTexCoord3sv +#define glTexCoord4d glTexCoord4d +#define glTexCoord4dv glTexCoord4dv +#define glTexCoord4f glTexCoord4f +#define glTexCoord4fv glTexCoord4fv +#define glTexCoord4i glTexCoord4i +#define glTexCoord4iv glTexCoord4iv +#define glTexCoord4s glTexCoord4s +#define glTexCoord4sv glTexCoord4sv +#define glTexCoordPointer glTexCoordPointer +#define glTexEnvf glTexEnvf +#define glTexEnvfv glTexEnvfv +#define glTexEnvi glTexEnvi +#define glTexEnviv glTexEnviv +#define glTexGend glTexGend +#define glTexGendv glTexGendv +#define glTexGenf glTexGenf +#define glTexGenfv glTexGenfv +#define glTexGeni glTexGeni +#define glTexGeniv glTexGeniv +#define glTexImage1D glTexImage1D +#define glTexImage2D glTexImage2D +#define glTexParameterf glTexParameterf +#define glTexParameterfv glTexParameterfv +#define glTexParameteri glTexParameteri +#define glTexParameteriv glTexParameteriv +#define glTexSubImage1D glTexSubImage1D +#define glTexSubImage2D glTexSubImage2D +#define glTranslated glTranslated +#define glTranslatef glTranslatef +#define glVertex2d glVertex2d +#define glVertex2dv glVertex2dv +#define glVertex2f glVertex2f +#define glVertex2fv glVertex2fv +#define glVertex2i glVertex2i +#define glVertex2iv glVertex2iv +#define glVertex2s glVertex2s +#define glVertex2sv glVertex2sv +#define glVertex3d glVertex3d +#define glVertex3dv glVertex3dv +#define glVertex3f glVertex3f +#define glVertex3fv glVertex3fv +#define glVertex3i glVertex3i +#define glVertex3iv glVertex3iv +#define glVertex3s glVertex3s +#define glVertex3sv glVertex3sv +#define glVertex4d glVertex4d +#define glVertex4dv glVertex4dv +#define glVertex4f glVertex4f +#define glVertex4fv glVertex4fv +#define glVertex4i glVertex4i +#define glVertex4iv glVertex4iv +#define glVertex4s glVertex4s +#define glVertex4sv glVertex4sv +#define glVertexPointer glVertexPointer +#define glViewport glViewport #ifdef GLX_VERSION_1_1 // catch all for any GLX-aware situation -#define qglXChooseVisual glXChooseVisual -#define qglXCreateContext glXCreateContext -#define qglXDestroyContext glXDestroyContext -#define qglXMakeCurrent glXMakeCurrent -#define qglXSwapBuffers glXSwapBuffers -#define qglXGetProcAddressARB glXGetProcAddressARB +#define glXChooseVisual glXChooseVisual +#define glXCreateContext glXCreateContext +#define glXDestroyContext glXDestroyContext +#define glXMakeCurrent glXMakeCurrent +#define glXSwapBuffers glXSwapBuffers +#define glXGetProcAddressARB glXGetProcAddressARB #endif diff --git a/src/renderer/tr_backend.cpp b/src/renderer/tr_backend.cpp index 4bb9f4b5..78eff395 100644 --- a/src/renderer/tr_backend.cpp +++ b/src/renderer/tr_backend.cpp @@ -48,13 +48,13 @@ void RB_SetDefaultGLState( void ) { RB_LogComment( "--- R_SetDefaultGLState ---\n" ); - qglClearDepth( 1.0f ); - qglColor4f (1,1,1,1); + glClearDepth( 1.0f ); + glColor4f (1,1,1,1); // the vertex array is always enabled - qglEnableClientState( GL_VERTEX_ARRAY ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - qglDisableClientState( GL_COLOR_ARRAY ); + glEnableClientState( GL_VERTEX_ARRAY ); + glEnableClientState( GL_TEXTURE_COORD_ARRAY ); + glDisableClientState( GL_COLOR_ARRAY ); // // make sure our GL state vector is set correctly @@ -62,43 +62,43 @@ void RB_SetDefaultGLState( void ) { memset( &backEnd.glState, 0, sizeof( backEnd.glState ) ); backEnd.glState.forceGlState = true; - qglColorMask( 1, 1, 1, 1 ); + glColorMask( 1, 1, 1, 1 ); - qglEnable( GL_DEPTH_TEST ); - qglEnable( GL_BLEND ); - qglEnable( GL_SCISSOR_TEST ); - qglEnable( GL_CULL_FACE ); - qglDisable( GL_LIGHTING ); - qglDisable( GL_LINE_STIPPLE ); - qglDisable( GL_STENCIL_TEST ); + glEnable( GL_DEPTH_TEST ); + glEnable( GL_BLEND ); + glEnable( GL_SCISSOR_TEST ); + glEnable( GL_CULL_FACE ); + glDisable( GL_LIGHTING ); + glDisable( GL_LINE_STIPPLE ); + glDisable( GL_STENCIL_TEST ); - qglPolygonMode (GL_FRONT_AND_BACK, GL_FILL); - qglDepthMask( GL_TRUE ); - qglDepthFunc( GL_ALWAYS ); + glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); + glDepthMask( GL_TRUE ); + glDepthFunc( GL_ALWAYS ); - qglCullFace( GL_FRONT_AND_BACK ); - qglShadeModel( GL_SMOOTH ); + glCullFace( GL_FRONT_AND_BACK ); + glShadeModel( GL_SMOOTH ); if ( r_useScissor.GetBool() ) { - qglScissor( 0, 0, glConfig.vidWidth, glConfig.vidHeight ); + glScissor( 0, 0, glConfig.vidWidth, glConfig.vidHeight ); } for ( i = glConfig.maxTextureUnits - 1 ; i >= 0 ; i-- ) { GL_SelectTexture( i ); // object linear texgen is our default - qglTexGenf( GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); - qglTexGenf( GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); - qglTexGenf( GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); - qglTexGenf( GL_Q, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); + glTexGenf( GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); + glTexGenf( GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); + glTexGenf( GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); + glTexGenf( GL_Q, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); GL_TexEnv( GL_MODULATE ); - qglDisable( GL_TEXTURE_2D ); + glDisable( GL_TEXTURE_2D ); if ( glConfig.texture3DAvailable ) { - qglDisable( GL_TEXTURE_3D ); + glDisable( GL_TEXTURE_3D ); } if ( glConfig.cubeMapAvailable ) { - qglDisable( GL_TEXTURE_CUBE_MAP_EXT ); + glDisable( GL_TEXTURE_CUBE_MAP_EXT ); } } } @@ -142,8 +142,8 @@ void GL_SelectTexture( int unit ) { return; } - qglActiveTextureARB( GL_TEXTURE0_ARB + unit ); - qglClientActiveTextureARB( GL_TEXTURE0_ARB + unit ); + glActiveTextureARB( GL_TEXTURE0_ARB + unit ); + glClientActiveTextureARB( GL_TEXTURE0_ARB + unit ); RB_LogComment( "glActiveTextureARB( %i );\nglClientActiveTextureARB( %i );\n", unit, unit ); backEnd.glState.currenttmu = unit; @@ -164,23 +164,23 @@ void GL_Cull( int cullType ) { } if ( cullType == CT_TWO_SIDED ) { - qglDisable( GL_CULL_FACE ); + glDisable( GL_CULL_FACE ); } else { if ( backEnd.glState.faceCulling == CT_TWO_SIDED ) { - qglEnable( GL_CULL_FACE ); + glEnable( GL_CULL_FACE ); } if ( cullType == CT_BACK_SIDED ) { if ( backEnd.viewDef->isMirror ) { - qglCullFace( GL_FRONT ); + glCullFace( GL_FRONT ); } else { - qglCullFace( GL_BACK ); + glCullFace( GL_BACK ); } } else { if ( backEnd.viewDef->isMirror ) { - qglCullFace( GL_BACK ); + glCullFace( GL_BACK ); } else { - qglCullFace( GL_FRONT ); + glCullFace( GL_FRONT ); } } } @@ -209,7 +209,7 @@ void GL_TexEnv( int env ) { case GL_REPLACE: case GL_DECAL: case GL_ADD: - qglTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, env ); + glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, env ); break; default: common->Error( "GL_TexEnv: invalid env '%d' passed\n", env ); @@ -256,11 +256,11 @@ void GL_State( int stateBits ) { // if ( diff & ( GLS_DEPTHFUNC_EQUAL | GLS_DEPTHFUNC_LESS | GLS_DEPTHFUNC_ALWAYS ) ) { if ( stateBits & GLS_DEPTHFUNC_EQUAL ) { - qglDepthFunc( GL_EQUAL ); + glDepthFunc( GL_EQUAL ); } else if ( stateBits & GLS_DEPTHFUNC_ALWAYS ) { - qglDepthFunc( GL_ALWAYS ); + glDepthFunc( GL_ALWAYS ); } else { - qglDepthFunc( GL_LEQUAL ); + glDepthFunc( GL_LEQUAL ); } } @@ -336,7 +336,7 @@ void GL_State( int stateBits ) { break; } - qglBlendFunc( srcFactor, dstFactor ); + glBlendFunc( srcFactor, dstFactor ); } // @@ -344,9 +344,9 @@ void GL_State( int stateBits ) { // if ( diff & GLS_DEPTHMASK ) { if ( stateBits & GLS_DEPTHMASK ) { - qglDepthMask( GL_FALSE ); + glDepthMask( GL_FALSE ); } else { - qglDepthMask( GL_TRUE ); + glDepthMask( GL_TRUE ); } } @@ -359,7 +359,7 @@ void GL_State( int stateBits ) { g = ( stateBits & GLS_GREENMASK ) ? 0 : 1; b = ( stateBits & GLS_BLUEMASK ) ? 0 : 1; a = ( stateBits & GLS_ALPHAMASK ) ? 0 : 1; - qglColorMask( r, g, b, a ); + glColorMask( r, g, b, a ); } // @@ -367,9 +367,9 @@ void GL_State( int stateBits ) { // if ( diff & GLS_POLYMODE_LINE ) { if ( stateBits & GLS_POLYMODE_LINE ) { - qglPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); + glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); } else { - qglPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); + glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); } } @@ -379,19 +379,19 @@ void GL_State( int stateBits ) { if ( diff & GLS_ATEST_BITS ) { switch ( stateBits & GLS_ATEST_BITS ) { case 0: - qglDisable( GL_ALPHA_TEST ); + glDisable( GL_ALPHA_TEST ); break; case GLS_ATEST_EQ_255: - qglEnable( GL_ALPHA_TEST ); - qglAlphaFunc( GL_EQUAL, 1 ); + glEnable( GL_ALPHA_TEST ); + glAlphaFunc( GL_EQUAL, 1 ); break; case GLS_ATEST_LT_128: - qglEnable( GL_ALPHA_TEST ); - qglAlphaFunc( GL_LESS, 0.5 ); + glEnable( GL_ALPHA_TEST ); + glAlphaFunc( GL_LESS, 0.5 ); break; case GLS_ATEST_GE_128: - qglEnable( GL_ALPHA_TEST ); - qglAlphaFunc( GL_GEQUAL, 0.5 ); + glEnable( GL_ALPHA_TEST ); + glAlphaFunc( GL_GEQUAL, 0.5 ); break; default: assert( 0 ); @@ -422,15 +422,15 @@ This is not used by the normal game paths, just by some tools */ void RB_SetGL2D( void ) { // set 2D virtual screen size - qglViewport( 0, 0, glConfig.vidWidth, glConfig.vidHeight ); + glViewport( 0, 0, glConfig.vidWidth, glConfig.vidHeight ); if ( r_useScissor.GetBool() ) { - qglScissor( 0, 0, glConfig.vidWidth, glConfig.vidHeight ); + glScissor( 0, 0, glConfig.vidWidth, glConfig.vidHeight ); } - qglMatrixMode( GL_PROJECTION ); - qglLoadIdentity(); - qglOrtho( 0, 640, 480, 0, 0, 1 ); // always assume 640x480 virtual coordinates - qglMatrixMode( GL_MODELVIEW ); - qglLoadIdentity(); + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + glOrtho( 0, 640, 480, 0, 0, 1 ); // always assume 640x480 virtual coordinates + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); GL_State( GLS_DEPTHFUNC_ALWAYS | GLS_SRCBLEND_SRC_ALPHA | @@ -438,8 +438,8 @@ void RB_SetGL2D( void ) { GL_Cull( CT_TWO_SIDED ); - qglDisable( GL_DEPTH_TEST ); - qglDisable( GL_STENCIL_TEST ); + glDisable( GL_DEPTH_TEST ); + glDisable( GL_STENCIL_TEST ); } @@ -459,7 +459,7 @@ static void RB_SetBuffer( const void *data ) { backEnd.frameCount = cmd->frameCount; - qglDrawBuffer( cmd->buffer ); + glDrawBuffer( cmd->buffer ); // clear screen for debugging // automatically enable this with several other debug tools @@ -467,15 +467,15 @@ static void RB_SetBuffer( const void *data ) { if ( r_clear.GetFloat() || idStr::Length( r_clear.GetString() ) != 1 || r_lockSurfaces.GetBool() || r_singleArea.GetBool() || r_showOverDraw.GetBool() ) { float c[3]; if ( sscanf( r_clear.GetString(), "%f %f %f", &c[0], &c[1], &c[2] ) == 3 ) { - qglClearColor( c[0], c[1], c[2], 1 ); + glClearColor( c[0], c[1], c[2], 1 ); } else if ( r_clear.GetInteger() == 2 ) { - qglClearColor( 0.0f, 0.0f, 0.0f, 1.0f ); + glClearColor( 0.0f, 0.0f, 0.0f, 1.0f ); } else if ( r_showOverDraw.GetBool() ) { - qglClearColor( 1.0f, 1.0f, 1.0f, 1.0f ); + glClearColor( 1.0f, 1.0f, 1.0f, 1.0f ); } else { - qglClearColor( 0.4f, 0.0f, 0.25f, 1.0f ); + glClearColor( 0.4f, 0.0f, 0.25f, 1.0f ); } - qglClear( GL_COLOR_BUFFER_BIT ); + glClear( GL_COLOR_BUFFER_BIT ); } } @@ -488,55 +488,7 @@ was there. This is used to test for texture thrashing. =============== */ void RB_ShowImages( void ) { - int i; - idImage *image; - float x, y, w, h; - int start, end; - - RB_SetGL2D(); - - //qglClearColor( 0.2, 0.2, 0.2, 1 ); - //qglClear( GL_COLOR_BUFFER_BIT ); - - qglFinish(); - - start = Sys_Milliseconds(); - - for ( i = 0 ; i < globalImages->images.Num() ; i++ ) { - image = globalImages->images[i]; - - if ( image->texnum == idImage::TEXTURE_NOT_LOADED && image->partialImage == NULL ) { - continue; - } - - w = glConfig.vidWidth / 20; - h = glConfig.vidHeight / 15; - x = i % 20 * w; - y = i / 20 * h; - - // show in proportional size in mode 2 - if ( r_showImages.GetInteger() == 2 ) { - w *= image->uploadWidth / 512.0f; - h *= image->uploadHeight / 512.0f; - } - - image->Bind(); - qglBegin (GL_QUADS); - qglTexCoord2f( 0, 0 ); - qglVertex2f( x, y ); - qglTexCoord2f( 1, 0 ); - qglVertex2f( x + w, y ); - qglTexCoord2f( 1, 1 ); - qglVertex2f( x + w, y + h ); - qglTexCoord2f( 0, 1 ); - qglVertex2f( x, y + h ); - qglEnd(); - } - - qglFinish(); - - end = Sys_Milliseconds(); - common->Printf( "%i msec to draw all images\n", end - start ); + } @@ -554,7 +506,7 @@ const void RB_SwapBuffers( const void *data ) { // force a gl sync if requested if ( r_finish.GetBool() ) { - qglFinish(); + glFinish(); } RB_LogComment( "***************** RB_SwapBuffers *****************\n\n\n" ); @@ -584,7 +536,7 @@ const void RB_CopyRender( const void *data ) { RB_LogComment( "***************** RB_CopyRender *****************\n" ); if (cmd->image) { - cmd->image->CopyFramebuffer( cmd->x, cmd->y, cmd->imageWidth, cmd->imageHeight, false ); + cmd->image->CopyFramebuffer( cmd->x, cmd->y, cmd->imageWidth, cmd->imageHeight ); } } @@ -611,7 +563,7 @@ void RB_ExecuteBackEndCommands( const emptyCommand_t *cmds ) { RB_SetDefaultGLState(); // upload any image loads that have completed - globalImages->CompleteBackgroundImageLoads(); + //globalImages->CompleteBackgroundImageLoads(); for ( ; cmds ; cmds = (const emptyCommand_t *)cmds->next ) { switch ( cmds->commandId ) { @@ -645,7 +597,7 @@ void RB_ExecuteBackEndCommands( const emptyCommand_t *cmds ) { } // go back to the default texture so the editor doesn't mess up a bound image - qglBindTexture( GL_TEXTURE_2D, 0 ); + glBindTexture( GL_TEXTURE_2D, 0 ); backEnd.glState.tmu[0].current2DMap = -1; // stop rendering on this thread diff --git a/src/renderer/tr_light.cpp b/src/renderer/tr_light.cpp index 24821530..8579bbd2 100644 --- a/src/renderer/tr_light.cpp +++ b/src/renderer/tr_light.cpp @@ -692,7 +692,7 @@ void R_LinkLightSurf( const drawSurf_t **link, const srfTriangles_t *tri, const } // calculate the specular coordinates if we aren't using vertex programs - if ( !tr.backEndRendererHasVertexPrograms && !r_skipSpecular.GetBool() && tr.backEndRenderer != BE_ARB ) { + if ( !tr.backEndRendererHasVertexPrograms && !r_skipSpecular.GetBool() ) { R_SpecularTexGen( drawSurf, light->globalLightOrigin, tr.viewDef->renderView.vieworg ); // if we failed to allocate space for the specular calculations, drop the surface if ( !drawSurf->dynamicTexCoords ) { diff --git a/src/renderer/tr_local.h b/src/renderer/tr_local.h index a8ced926..e7572ffa 100644 --- a/src/renderer/tr_local.h +++ b/src/renderer/tr_local.h @@ -29,8 +29,9 @@ If you have questions concerning this license or the applicable additional terms #ifndef __TR_LOCAL_H__ #define __TR_LOCAL_H__ +#include "ImageOpts.h" +#include "BinaryImage.h" #include "Image.h" -#include "MegaTexture.h" class idRenderWorldLocal; @@ -670,10 +671,6 @@ const int MAX_GUI_SURFACES = 1024; // default size of the drawSurfs list for gu // be automatically expanded as needed typedef enum { - BE_ARB, - BE_NV10, - BE_NV20, - BE_R200, BE_ARB2, BE_BAD } backEndName_t; @@ -1295,17 +1292,6 @@ DRAW_* ============================================================ */ -void RB_ARB_DrawInteractions( void ); - -void R_R200_Init( void ); -void RB_R200_DrawInteractions( void ); - -void R_NV10_Init( void ); -void RB_NV10_DrawInteractions( void ); - -void R_NV20_Init( void ); -void RB_NV20_DrawInteractions( void ); - void R_ARB2_Init( void ); void RB_ARB2_DrawInteractions( void ); void R_ReloadARBPrograms_f( const idCmdArgs &args ); @@ -1684,4 +1670,6 @@ idScreenRect R_CalcIntersectionScissor( const idRenderLightLocal * lightDef, #include "GuiModel.h" #include "VertexCache.h" +void GL_SelectTextureNoClient(int unit); + #endif /* !__TR_LOCAL_H__ */ diff --git a/src/renderer/tr_render.cpp b/src/renderer/tr_render.cpp index 435ffdd3..ee33587e 100644 --- a/src/renderer/tr_render.cpp +++ b/src/renderer/tr_render.cpp @@ -61,12 +61,12 @@ void RB_DrawElementsImmediate( const srfTriangles_t *tri ) { } } - qglBegin( GL_TRIANGLES ); + glBegin( GL_TRIANGLES ); for ( int i = 0 ; i < tri->numIndexes ; i++ ) { - qglTexCoord2fv( tri->verts[ tri->indexes[i] ].st.ToFloatPtr() ); - qglVertex3fv( tri->verts[ tri->indexes[i] ].xyz.ToFloatPtr() ); + glTexCoord2fv( tri->verts[ tri->indexes[i] ].st.ToFloatPtr() ); + glVertex3fv( tri->verts[ tri->indexes[i] ].xyz.ToFloatPtr() ); } - qglEnd(); + glEnd(); } @@ -91,7 +91,7 @@ void RB_DrawElementsWithCounters( const srfTriangles_t *tri ) { } if ( tri->indexCache && r_useIndexBuffers.GetBool() ) { - qglDrawElements( GL_TRIANGLES, + glDrawElements( GL_TRIANGLES, r_singleTriangle.GetBool() ? 3 : tri->numIndexes, GL_INDEX_TYPE, (int *)vertexCache.Position( tri->indexCache ) ); @@ -100,7 +100,7 @@ void RB_DrawElementsWithCounters( const srfTriangles_t *tri ) { if ( r_useIndexBuffers.GetBool() ) { vertexCache.UnbindIndex(); } - qglDrawElements( GL_TRIANGLES, + glDrawElements( GL_TRIANGLES, r_singleTriangle.GetBool() ? 3 : tri->numIndexes, GL_INDEX_TYPE, tri->indexes ); @@ -120,7 +120,7 @@ void RB_DrawShadowElementsWithCounters( const srfTriangles_t *tri, int numIndexe backEnd.pc.c_shadowVertexes += tri->numVerts; if ( tri->indexCache && r_useIndexBuffers.GetBool() ) { - qglDrawElements( GL_TRIANGLES, + glDrawElements( GL_TRIANGLES, r_singleTriangle.GetBool() ? 3 : numIndexes, GL_INDEX_TYPE, (int *)vertexCache.Position( tri->indexCache ) ); @@ -129,7 +129,7 @@ void RB_DrawShadowElementsWithCounters( const srfTriangles_t *tri, int numIndexe if ( r_useIndexBuffers.GetBool() ) { vertexCache.UnbindIndex(); } - qglDrawElements( GL_TRIANGLES, + glDrawElements( GL_TRIANGLES, r_singleTriangle.GetBool() ? 3 : numIndexes, GL_INDEX_TYPE, tri->indexes ); @@ -152,8 +152,8 @@ void RB_RenderTriangleSurface( const srfTriangles_t *tri ) { idDrawVert *ac = (idDrawVert *)vertexCache.Position( tri->ambientCache ); - qglVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->xyz.ToFloatPtr() ); - qglTexCoordPointer( 2, GL_FLOAT, sizeof( idDrawVert ), ac->st.ToFloatPtr() ); + glVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->xyz.ToFloatPtr() ); + glTexCoordPointer( 2, GL_FLOAT, sizeof( idDrawVert ), ac->st.ToFloatPtr() ); RB_DrawElementsWithCounters( tri ); } @@ -174,7 +174,7 @@ RB_EnterWeaponDepthHack =============== */ void RB_EnterWeaponDepthHack() { - qglDepthRange( 0, 0.5 ); + glDepthRange( 0, 0.5 ); float matrix[16]; @@ -182,9 +182,9 @@ void RB_EnterWeaponDepthHack() { matrix[14] *= 0.25; - qglMatrixMode(GL_PROJECTION); - qglLoadMatrixf( matrix ); - qglMatrixMode(GL_MODELVIEW); + glMatrixMode(GL_PROJECTION); + glLoadMatrixf( matrix ); + glMatrixMode(GL_MODELVIEW); } /* @@ -193,7 +193,7 @@ RB_EnterModelDepthHack =============== */ void RB_EnterModelDepthHack( float depth ) { - qglDepthRange( 0.0f, 1.0f ); + glDepthRange( 0.0f, 1.0f ); float matrix[16]; @@ -201,9 +201,9 @@ void RB_EnterModelDepthHack( float depth ) { matrix[14] -= depth; - qglMatrixMode(GL_PROJECTION); - qglLoadMatrixf( matrix ); - qglMatrixMode(GL_MODELVIEW); + glMatrixMode(GL_PROJECTION); + glLoadMatrixf( matrix ); + glMatrixMode(GL_MODELVIEW); } /* @@ -212,11 +212,11 @@ RB_LeaveDepthHack =============== */ void RB_LeaveDepthHack() { - qglDepthRange( 0, 1 ); + glDepthRange( 0, 1 ); - qglMatrixMode(GL_PROJECTION); - qglLoadMatrixf( backEnd.viewDef->projectionMatrix ); - qglMatrixMode(GL_MODELVIEW); + glMatrixMode(GL_PROJECTION); + glLoadMatrixf( backEnd.viewDef->projectionMatrix ); + glMatrixMode(GL_MODELVIEW); } /* @@ -241,7 +241,7 @@ void RB_RenderDrawSurfListWithFunction( drawSurf_t **drawSurfs, int numDrawSurfs // change the matrix if needed if ( drawSurf->space != backEnd.currentSpace ) { - qglLoadMatrixf( drawSurf->space->modelViewMatrix ); + glLoadMatrixf( drawSurf->space->modelViewMatrix ); } if ( drawSurf->space->weaponDepthHack ) { @@ -255,7 +255,7 @@ void RB_RenderDrawSurfListWithFunction( drawSurf_t **drawSurfs, int numDrawSurfs // change the scissor if needed if ( r_useScissor.GetBool() && !backEnd.currentScissor.Equals( drawSurf->scissorRect ) ) { backEnd.currentScissor = drawSurf->scissorRect; - qglScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, + glScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, backEnd.viewDef->viewport.y1 + backEnd.currentScissor.y1, backEnd.currentScissor.x2 + 1 - backEnd.currentScissor.x1, backEnd.currentScissor.y2 + 1 - backEnd.currentScissor.y1 ); @@ -286,7 +286,7 @@ void RB_RenderDrawSurfChainWithFunction( const drawSurf_t *drawSurfs, for ( drawSurf = drawSurfs ; drawSurf ; drawSurf = drawSurf->nextOnLight ) { // change the matrix if needed if ( drawSurf->space != backEnd.currentSpace ) { - qglLoadMatrixf( drawSurf->space->modelViewMatrix ); + glLoadMatrixf( drawSurf->space->modelViewMatrix ); } if ( drawSurf->space->weaponDepthHack ) { @@ -300,7 +300,7 @@ void RB_RenderDrawSurfChainWithFunction( const drawSurf_t *drawSurfs, // change the scissor if needed if ( r_useScissor.GetBool() && !backEnd.currentScissor.Equals( drawSurf->scissorRect ) ) { backEnd.currentScissor = drawSurf->scissorRect; - qglScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, + glScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, backEnd.viewDef->viewport.y1 + backEnd.currentScissor.y1, backEnd.currentScissor.x2 + 1 - backEnd.currentScissor.x1, backEnd.currentScissor.y2 + 1 - backEnd.currentScissor.y1 ); @@ -363,9 +363,9 @@ void RB_LoadShaderTextureMatrix( const float *shaderRegisters, const textureStag float matrix[16]; RB_GetShaderTextureMatrix( shaderRegisters, texture, matrix ); - qglMatrixMode( GL_TEXTURE ); - qglLoadMatrixf( matrix ); - qglMatrixMode( GL_MODELVIEW ); + glMatrixMode( GL_TEXTURE ); + glLoadMatrixf( matrix ); + glMatrixMode( GL_MODELVIEW ); } /* @@ -413,28 +413,28 @@ void RB_BindStageTexture( const float *shaderRegisters, const textureStage_t *te // texgens if ( texture->texgen == TG_DIFFUSE_CUBE ) { - qglTexCoordPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ((idDrawVert *)vertexCache.Position( surf->geo->ambientCache ))->normal.ToFloatPtr() ); + glTexCoordPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ((idDrawVert *)vertexCache.Position( surf->geo->ambientCache ))->normal.ToFloatPtr() ); } if ( texture->texgen == TG_SKYBOX_CUBE || texture->texgen == TG_WOBBLESKY_CUBE ) { - qglTexCoordPointer( 3, GL_FLOAT, 0, vertexCache.Position( surf->dynamicTexCoords ) ); + glTexCoordPointer( 3, GL_FLOAT, 0, vertexCache.Position( surf->dynamicTexCoords ) ); } if ( texture->texgen == TG_REFLECT_CUBE ) { - qglEnable( GL_TEXTURE_GEN_S ); - qglEnable( GL_TEXTURE_GEN_T ); - qglEnable( GL_TEXTURE_GEN_R ); - qglTexGenf( GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT ); - qglTexGenf( GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT ); - qglTexGenf( GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT ); - qglEnableClientState( GL_NORMAL_ARRAY ); - qglNormalPointer( GL_FLOAT, sizeof( idDrawVert ), ((idDrawVert *)vertexCache.Position( surf->geo->ambientCache ))->normal.ToFloatPtr() ); - - qglMatrixMode( GL_TEXTURE ); + glEnable( GL_TEXTURE_GEN_S ); + glEnable( GL_TEXTURE_GEN_T ); + glEnable( GL_TEXTURE_GEN_R ); + glTexGenf( GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT ); + glTexGenf( GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT ); + glTexGenf( GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT ); + glEnableClientState( GL_NORMAL_ARRAY ); + glNormalPointer( GL_FLOAT, sizeof( idDrawVert ), ((idDrawVert *)vertexCache.Position( surf->geo->ambientCache ))->normal.ToFloatPtr() ); + + glMatrixMode( GL_TEXTURE ); float mat[16]; R_TransposeGLMatrix( backEnd.viewDef->worldSpace.modelViewMatrix, mat ); - qglLoadMatrixf( mat ); - qglMatrixMode( GL_MODELVIEW ); + glLoadMatrixf( mat ); + glMatrixMode( GL_MODELVIEW ); } // matrix @@ -451,28 +451,28 @@ RB_FinishStageTexture void RB_FinishStageTexture( const textureStage_t *texture, const drawSurf_t *surf ) { if ( texture->texgen == TG_DIFFUSE_CUBE || texture->texgen == TG_SKYBOX_CUBE || texture->texgen == TG_WOBBLESKY_CUBE ) { - qglTexCoordPointer( 2, GL_FLOAT, sizeof( idDrawVert ), + glTexCoordPointer( 2, GL_FLOAT, sizeof( idDrawVert ), (void *)&(((idDrawVert *)vertexCache.Position( surf->geo->ambientCache ))->st) ); } if ( texture->texgen == TG_REFLECT_CUBE ) { - qglDisable( GL_TEXTURE_GEN_S ); - qglDisable( GL_TEXTURE_GEN_T ); - qglDisable( GL_TEXTURE_GEN_R ); - qglTexGenf( GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); - qglTexGenf( GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); - qglTexGenf( GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); - qglDisableClientState( GL_NORMAL_ARRAY ); + glDisable( GL_TEXTURE_GEN_S ); + glDisable( GL_TEXTURE_GEN_T ); + glDisable( GL_TEXTURE_GEN_R ); + glTexGenf( GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); + glTexGenf( GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); + glTexGenf( GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR ); + glDisableClientState( GL_NORMAL_ARRAY ); - qglMatrixMode( GL_TEXTURE ); - qglLoadIdentity(); - qglMatrixMode( GL_MODELVIEW ); + glMatrixMode( GL_TEXTURE ); + glLoadIdentity(); + glMatrixMode( GL_MODELVIEW ); } if ( texture->hasMatrix ) { - qglMatrixMode( GL_TEXTURE ); - qglLoadIdentity(); - qglMatrixMode( GL_MODELVIEW ); + glMatrixMode( GL_TEXTURE ); + glLoadIdentity(); + glMatrixMode( GL_MODELVIEW ); } } @@ -554,18 +554,18 @@ to actually render the visible surfaces for this view */ void RB_BeginDrawingView (void) { // set the modelview matrix for the viewer - qglMatrixMode(GL_PROJECTION); - qglLoadMatrixf( backEnd.viewDef->projectionMatrix ); - qglMatrixMode(GL_MODELVIEW); + glMatrixMode(GL_PROJECTION); + glLoadMatrixf( backEnd.viewDef->projectionMatrix ); + glMatrixMode(GL_MODELVIEW); // set the window clipping - qglViewport( tr.viewportOffset[0] + backEnd.viewDef->viewport.x1, + glViewport( tr.viewportOffset[0] + backEnd.viewDef->viewport.x1, tr.viewportOffset[1] + backEnd.viewDef->viewport.y1, backEnd.viewDef->viewport.x2 + 1 - backEnd.viewDef->viewport.x1, backEnd.viewDef->viewport.y2 + 1 - backEnd.viewDef->viewport.y1 ); // the scissor may be smaller than the viewport for subviews - qglScissor( tr.viewportOffset[0] + backEnd.viewDef->viewport.x1 + backEnd.viewDef->scissor.x1, + glScissor( tr.viewportOffset[0] + backEnd.viewDef->viewport.x1 + backEnd.viewDef->scissor.x1, tr.viewportOffset[1] + backEnd.viewDef->viewport.y1 + backEnd.viewDef->scissor.y1, backEnd.viewDef->scissor.x2 + 1 - backEnd.viewDef->scissor.x1, backEnd.viewDef->scissor.y2 + 1 - backEnd.viewDef->scissor.y1 ); @@ -576,15 +576,15 @@ void RB_BeginDrawingView (void) { // we don't have to clear the depth / stencil buffer for 2D rendering if ( backEnd.viewDef->viewEntitys ) { - qglStencilMask( 0xff ); + glStencilMask( 0xff ); // some cards may have 7 bit stencil buffers, so don't assume this // should be 128 - qglClearStencil( 1<<(glConfig.stencilBits-1) ); - qglClear( GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT ); - qglEnable( GL_DEPTH_TEST ); + glClearStencil( 1<<(glConfig.stencilBits-1) ); + glClear( GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT ); + glEnable( GL_DEPTH_TEST ); } else { - qglDisable( GL_DEPTH_TEST ); - qglDisable( GL_STENCIL_TEST ); + glDisable( GL_DEPTH_TEST ); + glDisable( GL_STENCIL_TEST ); } backEnd.glState.faceCulling = -1; // force face culling to set next time @@ -705,13 +705,13 @@ void RB_CreateSingleDrawInteractions( const drawSurf_t *surf, void (*DrawInterac // change the matrix and light projection vectors if needed if ( surf->space != backEnd.currentSpace ) { backEnd.currentSpace = surf->space; - qglLoadMatrixf( surf->space->modelViewMatrix ); + glLoadMatrixf( surf->space->modelViewMatrix ); } // change the scissor if needed if ( r_useScissor.GetBool() && !backEnd.currentScissor.Equals( surf->scissorRect ) ) { backEnd.currentScissor = surf->scissorRect; - qglScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, + glScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, backEnd.viewDef->viewport.y1 + backEnd.currentScissor.y1, backEnd.currentScissor.x2 + 1 - backEnd.currentScissor.x1, backEnd.currentScissor.y2 + 1 - backEnd.currentScissor.y1 ); diff --git a/src/renderer/tr_rendertools.cpp b/src/renderer/tr_rendertools.cpp index 526446c4..b0a86363 100644 --- a/src/renderer/tr_rendertools.cpp +++ b/src/renderer/tr_rendertools.cpp @@ -88,32 +88,32 @@ void RB_DrawBounds( const idBounds &bounds ) { return; } - qglBegin( GL_LINE_LOOP ); - qglVertex3f( bounds[0][0], bounds[0][1], bounds[0][2] ); - qglVertex3f( bounds[0][0], bounds[1][1], bounds[0][2] ); - qglVertex3f( bounds[1][0], bounds[1][1], bounds[0][2] ); - qglVertex3f( bounds[1][0], bounds[0][1], bounds[0][2] ); - qglEnd(); - qglBegin( GL_LINE_LOOP ); - qglVertex3f( bounds[0][0], bounds[0][1], bounds[1][2] ); - qglVertex3f( bounds[0][0], bounds[1][1], bounds[1][2] ); - qglVertex3f( bounds[1][0], bounds[1][1], bounds[1][2] ); - qglVertex3f( bounds[1][0], bounds[0][1], bounds[1][2] ); - qglEnd(); - - qglBegin( GL_LINES ); - qglVertex3f( bounds[0][0], bounds[0][1], bounds[0][2] ); - qglVertex3f( bounds[0][0], bounds[0][1], bounds[1][2] ); - - qglVertex3f( bounds[0][0], bounds[1][1], bounds[0][2] ); - qglVertex3f( bounds[0][0], bounds[1][1], bounds[1][2] ); - - qglVertex3f( bounds[1][0], bounds[0][1], bounds[0][2] ); - qglVertex3f( bounds[1][0], bounds[0][1], bounds[1][2] ); - - qglVertex3f( bounds[1][0], bounds[1][1], bounds[0][2] ); - qglVertex3f( bounds[1][0], bounds[1][1], bounds[1][2] ); - qglEnd(); + glBegin( GL_LINE_LOOP ); + glVertex3f( bounds[0][0], bounds[0][1], bounds[0][2] ); + glVertex3f( bounds[0][0], bounds[1][1], bounds[0][2] ); + glVertex3f( bounds[1][0], bounds[1][1], bounds[0][2] ); + glVertex3f( bounds[1][0], bounds[0][1], bounds[0][2] ); + glEnd(); + glBegin( GL_LINE_LOOP ); + glVertex3f( bounds[0][0], bounds[0][1], bounds[1][2] ); + glVertex3f( bounds[0][0], bounds[1][1], bounds[1][2] ); + glVertex3f( bounds[1][0], bounds[1][1], bounds[1][2] ); + glVertex3f( bounds[1][0], bounds[0][1], bounds[1][2] ); + glEnd(); + + glBegin( GL_LINES ); + glVertex3f( bounds[0][0], bounds[0][1], bounds[0][2] ); + glVertex3f( bounds[0][0], bounds[0][1], bounds[1][2] ); + + glVertex3f( bounds[0][0], bounds[1][1], bounds[0][2] ); + glVertex3f( bounds[0][0], bounds[1][1], bounds[1][2] ); + + glVertex3f( bounds[1][0], bounds[0][1], bounds[0][2] ); + glVertex3f( bounds[1][0], bounds[0][1], bounds[1][2] ); + + glVertex3f( bounds[1][0], bounds[1][1], bounds[0][2] ); + glVertex3f( bounds[1][0], bounds[1][1], bounds[1][2] ); + glEnd(); } @@ -125,14 +125,14 @@ RB_SimpleSurfaceSetup void RB_SimpleSurfaceSetup( const drawSurf_t *drawSurf ) { // change the matrix if needed if ( drawSurf->space != backEnd.currentSpace ) { - qglLoadMatrixf( drawSurf->space->modelViewMatrix ); + glLoadMatrixf( drawSurf->space->modelViewMatrix ); backEnd.currentSpace = drawSurf->space; } // change the scissor if needed if ( r_useScissor.GetBool() && !backEnd.currentScissor.Equals( drawSurf->scissorRect ) ) { backEnd.currentScissor = drawSurf->scissorRect; - qglScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, + glScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, backEnd.viewDef->viewport.y1 + backEnd.currentScissor.y1, backEnd.currentScissor.x2 + 1 - backEnd.currentScissor.x1, backEnd.currentScissor.y2 + 1 - backEnd.currentScissor.y1 ); @@ -146,10 +146,10 @@ RB_SimpleWorldSetup */ void RB_SimpleWorldSetup( void ) { backEnd.currentSpace = &backEnd.viewDef->worldSpace; - qglLoadMatrixf( backEnd.viewDef->worldSpace.modelViewMatrix ); + glLoadMatrixf( backEnd.viewDef->worldSpace.modelViewMatrix ); backEnd.currentScissor = backEnd.viewDef->scissor; - qglScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, + glScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, backEnd.viewDef->viewport.y1 + backEnd.currentScissor.y1, backEnd.currentScissor.x2 + 1 - backEnd.currentScissor.x1, backEnd.currentScissor.y2 + 1 - backEnd.currentScissor.y1 ); @@ -166,21 +166,21 @@ stenciling will matter. ================= */ void RB_PolygonClear( void ) { - qglPushMatrix(); - qglPushAttrib( GL_ALL_ATTRIB_BITS ); - qglLoadIdentity(); - qglDisable( GL_TEXTURE_2D ); - qglDisable( GL_DEPTH_TEST ); - qglDisable( GL_CULL_FACE ); - qglDisable( GL_SCISSOR_TEST ); - qglBegin( GL_POLYGON ); - qglVertex3f( -20, -20, -10 ); - qglVertex3f( 20, -20, -10 ); - qglVertex3f( 20, 20, -10 ); - qglVertex3f( -20, 20, -10 ); - qglEnd(); - qglPopAttrib(); - qglPopMatrix(); + glPushMatrix(); + glPushAttrib( GL_ALL_ATTRIB_BITS ); + glLoadIdentity(); + glDisable( GL_TEXTURE_2D ); + glDisable( GL_DEPTH_TEST ); + glDisable( GL_CULL_FACE ); + glDisable( GL_SCISSOR_TEST ); + glBegin( GL_POLYGON ); + glVertex3f( -20, -20, -10 ); + glVertex3f( 20, -20, -10 ); + glVertex3f( 20, 20, -10 ); + glVertex3f( -20, 20, -10 ); + glEnd(); + glPopAttrib(); + glPopMatrix(); } /* @@ -190,7 +190,7 @@ RB_ShowDestinationAlpha */ void RB_ShowDestinationAlpha( void ) { GL_State( GLS_SRCBLEND_DST_ALPHA | GLS_DSTBLEND_ZERO | GLS_DEPTHMASK | GLS_DEPTHFUNC_ALWAYS ); - qglColor3f( 1, 1, 1 ); + glColor3f( 1, 1, 1 ); RB_PolygonClear(); } @@ -209,7 +209,7 @@ void RB_ScanStencilBuffer( void ) { memset( counts, 0, sizeof( counts ) ); stencilReadback = (byte *)R_StaticAlloc( glConfig.vidWidth * glConfig.vidHeight ); - qglReadPixels( 0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, stencilReadback ); + glReadPixels( 0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, stencilReadback ); for ( i = 0; i < glConfig.vidWidth * glConfig.vidHeight; i++ ) { counts[ stencilReadback[i] ]++; @@ -241,7 +241,7 @@ void RB_CountStencilBuffer( void ) { stencilReadback = (byte *)R_StaticAlloc( glConfig.vidWidth * glConfig.vidHeight ); - qglReadPixels( 0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, stencilReadback ); + glReadPixels( 0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, stencilReadback ); count = 0; for ( i = 0; i < glConfig.vidWidth * glConfig.vidHeight; i++ ) { @@ -277,19 +277,19 @@ static void R_ColorByStencilBuffer( void ) { }; // clear color buffer to white (>6 passes) - qglClearColor( 1, 1, 1, 1 ); - qglDisable( GL_SCISSOR_TEST ); - qglClear( GL_COLOR_BUFFER_BIT ); + glClearColor( 1, 1, 1, 1 ); + glDisable( GL_SCISSOR_TEST ); + glClear( GL_COLOR_BUFFER_BIT ); // now draw color for each stencil value - qglStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); + glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); for ( i = 0 ; i < 6 ; i++ ) { - qglColor3fv( colors[i] ); - qglStencilFunc( GL_EQUAL, i, 255 ); + glColor3fv( colors[i] ); + glStencilFunc( GL_EQUAL, i, 255 ); RB_PolygonClear(); } - qglStencilFunc( GL_ALWAYS, 0, 255 ); + glStencilFunc( GL_ALWAYS, 0, 255 ); } //====================================================================== @@ -386,7 +386,7 @@ void RB_ShowIntensity( void ) { } colorReadback = (byte *)R_StaticAlloc( glConfig.vidWidth * glConfig.vidHeight * 4 ); - qglReadPixels( 0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_RGBA, GL_UNSIGNED_BYTE, colorReadback ); + glReadPixels( 0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_RGBA, GL_UNSIGNED_BYTE, colorReadback ); c = glConfig.vidWidth * glConfig.vidHeight * 4; for ( i = 0; i < c ; i+=4 ) { @@ -409,19 +409,19 @@ void RB_ShowIntensity( void ) { } // draw it back to the screen - qglLoadIdentity(); - qglMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + glMatrixMode( GL_PROJECTION ); GL_State( GLS_DEPTHFUNC_ALWAYS ); - qglPushMatrix(); - qglLoadIdentity(); - qglOrtho( 0, 1, 0, 1, -1, 1 ); - qglRasterPos2f( 0, 0 ); - qglPopMatrix(); - qglColor3f( 1, 1, 1 ); + glPushMatrix(); + glLoadIdentity(); + glOrtho( 0, 1, 0, 1, -1, 1 ); + glRasterPos2f( 0, 0 ); + glPopMatrix(); + glColor3f( 1, 1, 1 ); globalImages->BindNull(); - qglMatrixMode( GL_MODELVIEW ); + glMatrixMode( GL_MODELVIEW ); - qglDrawPixels( glConfig.vidWidth, glConfig.vidHeight, GL_RGBA , GL_UNSIGNED_BYTE, colorReadback ); + glDrawPixels( glConfig.vidWidth, glConfig.vidHeight, GL_RGBA , GL_UNSIGNED_BYTE, colorReadback ); R_StaticFree( colorReadback ); } @@ -441,25 +441,25 @@ void RB_ShowDepthBuffer( void ) { return; } - qglPushMatrix(); - qglLoadIdentity(); - qglMatrixMode( GL_PROJECTION ); - qglPushMatrix(); - qglLoadIdentity(); - qglOrtho( 0, 1, 0, 1, -1, 1 ); - qglRasterPos2f( 0, 0 ); - qglPopMatrix(); - qglMatrixMode( GL_MODELVIEW ); - qglPopMatrix(); + glPushMatrix(); + glLoadIdentity(); + glMatrixMode( GL_PROJECTION ); + glPushMatrix(); + glLoadIdentity(); + glOrtho( 0, 1, 0, 1, -1, 1 ); + glRasterPos2f( 0, 0 ); + glPopMatrix(); + glMatrixMode( GL_MODELVIEW ); + glPopMatrix(); GL_State( GLS_DEPTHFUNC_ALWAYS ); - qglColor3f( 1, 1, 1 ); + glColor3f( 1, 1, 1 ); globalImages->BindNull(); depthReadback = R_StaticAlloc( glConfig.vidWidth * glConfig.vidHeight*4 ); memset( depthReadback, 0, glConfig.vidWidth * glConfig.vidHeight*4 ); - qglReadPixels( 0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_DEPTH_COMPONENT , GL_FLOAT, depthReadback ); + glReadPixels( 0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_DEPTH_COMPONENT , GL_FLOAT, depthReadback ); #if 0 for ( i = 0 ; i < glConfig.vidWidth * glConfig.vidHeight ; i++ ) { @@ -470,7 +470,7 @@ void RB_ShowDepthBuffer( void ) { } #endif - qglDrawPixels( glConfig.vidWidth, glConfig.vidHeight, GL_RGBA , GL_UNSIGNED_BYTE, depthReadback ); + glDrawPixels( glConfig.vidWidth, glConfig.vidHeight, GL_RGBA , GL_UNSIGNED_BYTE, depthReadback ); R_StaticFree( depthReadback ); } @@ -494,19 +494,19 @@ void RB_ShowLightCount( void ) { GL_State( GLS_DEPTHFUNC_EQUAL ); RB_SimpleWorldSetup(); - qglClearStencil( 0 ); - qglClear( GL_STENCIL_BUFFER_BIT ); + glClearStencil( 0 ); + glClear( GL_STENCIL_BUFFER_BIT ); - qglEnable( GL_STENCIL_TEST ); + glEnable( GL_STENCIL_TEST ); // optionally count everything through walls if ( r_showLightCount.GetInteger() >= 2 ) { - qglStencilOp( GL_KEEP, GL_INCR, GL_INCR ); + glStencilOp( GL_KEEP, GL_INCR, GL_INCR ); } else { - qglStencilOp( GL_KEEP, GL_KEEP, GL_INCR ); + glStencilOp( GL_KEEP, GL_KEEP, GL_INCR ); } - qglStencilFunc( GL_ALWAYS, 1, 255 ); + glStencilFunc( GL_ALWAYS, 1, 255 ); globalImages->defaultImage->Bind(); @@ -519,7 +519,7 @@ void RB_ShowLightCount( void ) { } const idDrawVert *ac = (idDrawVert *)vertexCache.Position( surf->geo->ambientCache ); - qglVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), &ac->xyz ); + glVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), &ac->xyz ); RB_DrawElementsWithCounters( surf->geo ); } } @@ -554,17 +554,17 @@ void RB_ShowSilhouette( void ) { // // clear all triangle edges to black // - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); globalImages->BindNull(); - qglDisable( GL_TEXTURE_2D ); - qglDisable( GL_STENCIL_TEST ); + glDisable( GL_TEXTURE_2D ); + glDisable( GL_STENCIL_TEST ); - qglColor3f( 0, 0, 0 ); + glColor3f( 0, 0, 0 ); GL_State( GLS_POLYMODE_LINE ); GL_Cull( CT_TWO_SIDED ); - qglDisable( GL_DEPTH_TEST ); + glDisable( GL_DEPTH_TEST ); RB_RenderDrawSurfListWithFunction( backEnd.viewDef->drawSurfs, backEnd.viewDef->numDrawSurfs, RB_T_RenderTriangleSurface ); @@ -574,7 +574,7 @@ void RB_ShowSilhouette( void ) { // now blend in edges that cast silhouettes // RB_SimpleWorldSetup(); - qglColor3f( 0.5, 0, 0 ); + glColor3f( 0.5, 0, 0 ); GL_State( GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE ); for ( vLight = backEnd.viewDef->viewLights ; vLight ; vLight = vLight->next ) { @@ -585,8 +585,8 @@ void RB_ShowSilhouette( void ) { const srfTriangles_t *tri = surf->geo; - qglVertexPointer( 3, GL_FLOAT, sizeof( shadowCache_t ), vertexCache.Position( tri->shadowCache ) ); - qglBegin( GL_LINES ); + glVertexPointer( 3, GL_FLOAT, sizeof( shadowCache_t ), vertexCache.Position( tri->shadowCache ) ); + glBegin( GL_LINES ); for ( int j = 0 ; j < tri->numIndexes ; j+=3 ) { int i1 = tri->indexes[j+0]; @@ -595,24 +595,24 @@ void RB_ShowSilhouette( void ) { if ( (i1 & 1) + (i2 & 1) + (i3 & 1) == 1 ) { if ( (i1 & 1) + (i2 & 1) == 0 ) { - qglArrayElement( i1 ); - qglArrayElement( i2 ); + glArrayElement( i1 ); + glArrayElement( i2 ); } else if ( (i1 & 1 ) + (i3 & 1) == 0 ) { - qglArrayElement( i1 ); - qglArrayElement( i3 ); + glArrayElement( i1 ); + glArrayElement( i3 ); } } } - qglEnd(); + glEnd(); } } } - qglEnable( GL_DEPTH_TEST ); + glEnable( GL_DEPTH_TEST ); GL_State( GLS_DEFAULT ); - qglColor3f( 1,1,1 ); + glColor3f( 1,1,1 ); GL_Cull( CT_FRONT_SIDED ); } @@ -637,14 +637,14 @@ static void RB_ShowShadowCount( void ) { GL_State( GLS_DEFAULT ); - qglClearStencil( 0 ); - qglClear( GL_STENCIL_BUFFER_BIT ); + glClearStencil( 0 ); + glClear( GL_STENCIL_BUFFER_BIT ); - qglEnable( GL_STENCIL_TEST ); + glEnable( GL_STENCIL_TEST ); - qglStencilOp( GL_KEEP, GL_INCR, GL_INCR ); + glStencilOp( GL_KEEP, GL_INCR, GL_INCR ); - qglStencilFunc( GL_ALWAYS, 1, 255 ); + glStencilFunc( GL_ALWAYS, 1, 255 ); globalImages->defaultImage->Bind(); @@ -675,7 +675,7 @@ static void RB_ShowShadowCount( void ) { } shadowCache_t *cache = (shadowCache_t *)vertexCache.Position( tri->shadowCache ); - qglVertexPointer( 4, GL_FLOAT, sizeof( *cache ), &cache->xyz ); + glVertexPointer( 4, GL_FLOAT, sizeof( *cache ), &cache->xyz ); RB_DrawElementsWithCounters( tri ); } } @@ -713,15 +713,15 @@ void RB_T_RenderTriangleSurfaceAsLines( const drawSurf_t *surf ) { return; } - qglBegin( GL_LINES ); + glBegin( GL_LINES ); for ( int i = 0 ; i < tri->numIndexes ; i+= 3 ) { for ( int j = 0 ; j < 3 ; j++ ) { int k = ( j + 1 ) % 3; - qglVertex3fv( tri->verts[ tri->silIndexes[i+j] ].xyz.ToFloatPtr() ); - qglVertex3fv( tri->verts[ tri->silIndexes[i+k] ].xyz.ToFloatPtr() ); + glVertex3fv( tri->verts[ tri->silIndexes[i+j] ].xyz.ToFloatPtr() ); + glVertex3fv( tri->verts[ tri->silIndexes[i+k] ].xyz.ToFloatPtr() ); } } - qglEnd(); + glEnd(); } @@ -740,38 +740,38 @@ static void RB_ShowTris( drawSurf_t **drawSurfs, int numDrawSurfs ) { return; } - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); globalImages->BindNull(); - qglDisable( GL_TEXTURE_2D ); - qglDisable( GL_STENCIL_TEST ); + glDisable( GL_TEXTURE_2D ); + glDisable( GL_STENCIL_TEST ); - qglColor3f( 1, 1, 1 ); + glColor3f( 1, 1, 1 ); GL_State( GLS_POLYMODE_LINE ); switch ( r_showTris.GetInteger() ) { case 1: // only draw visible ones - qglPolygonOffset( -1, -2 ); - qglEnable( GL_POLYGON_OFFSET_LINE ); + glPolygonOffset( -1, -2 ); + glEnable( GL_POLYGON_OFFSET_LINE ); break; default: case 2: // draw all front facing GL_Cull( CT_FRONT_SIDED ); - qglDisable( GL_DEPTH_TEST ); + glDisable( GL_DEPTH_TEST ); break; case 3: // draw all GL_Cull( CT_TWO_SIDED ); - qglDisable( GL_DEPTH_TEST ); + glDisable( GL_DEPTH_TEST ); break; } RB_RenderDrawSurfListWithFunction( drawSurfs, numDrawSurfs, RB_T_RenderTriangleSurface ); - qglEnable( GL_DEPTH_TEST ); - qglDisable( GL_POLYGON_OFFSET_LINE ); + glEnable( GL_DEPTH_TEST ); + glDisable( GL_POLYGON_OFFSET_LINE ); - qglDepthRange( 0, 1 ); + glDepthRange( 0, 1 ); GL_State( GLS_DEFAULT ); GL_Cull( CT_FRONT_SIDED ); } @@ -799,17 +799,17 @@ static void RB_ShowSurfaceInfo( drawSurf_t **drawSurfs, int numDrawSurfs ) { return; } - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); globalImages->BindNull(); - qglDisable( GL_TEXTURE_2D ); - qglDisable( GL_STENCIL_TEST ); + glDisable( GL_TEXTURE_2D ); + glDisable( GL_STENCIL_TEST ); - qglColor3f( 1, 1, 1 ); + glColor3f( 1, 1, 1 ); GL_State( GLS_POLYMODE_LINE ); - qglPolygonOffset( -1, -2 ); - qglEnable( GL_POLYGON_OFFSET_LINE ); + glPolygonOffset( -1, -2 ); + glEnable( GL_POLYGON_OFFSET_LINE ); idVec3 trans[3]; float matrix[16]; @@ -822,10 +822,10 @@ static void RB_ShowSurfaceInfo( drawSurf_t **drawSurfs, int numDrawSurfs ) { tr.primaryWorld->DrawText( mt.material->GetName(), mt.point, 0.35f, colorBlue, tr.primaryView->renderView.viewaxis ); - qglEnable( GL_DEPTH_TEST ); - qglDisable( GL_POLYGON_OFFSET_LINE ); + glEnable( GL_DEPTH_TEST ); + glDisable( GL_POLYGON_OFFSET_LINE ); - qglDepthRange( 0, 1 ); + glDepthRange( 0, 1 ); GL_State( GLS_DEFAULT ); GL_Cull( CT_FRONT_SIDED ); } @@ -851,36 +851,36 @@ static void RB_ShowViewEntitys( viewEntity_t *vModels ) { return; } - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); globalImages->BindNull(); - qglDisable( GL_TEXTURE_2D ); - qglDisable( GL_STENCIL_TEST ); + glDisable( GL_TEXTURE_2D ); + glDisable( GL_STENCIL_TEST ); - qglColor3f( 1, 1, 1 ); + glColor3f( 1, 1, 1 ); GL_State( GLS_POLYMODE_LINE ); GL_Cull( CT_TWO_SIDED ); - qglDisable( GL_DEPTH_TEST ); - qglDisable( GL_SCISSOR_TEST ); + glDisable( GL_DEPTH_TEST ); + glDisable( GL_SCISSOR_TEST ); for ( ; vModels ; vModels = vModels->next ) { idBounds b; - qglLoadMatrixf( vModels->modelViewMatrix ); + glLoadMatrixf( vModels->modelViewMatrix ); if ( !vModels->entityDef ) { continue; } // draw the reference bounds in yellow - qglColor3f( 1, 1, 0 ); + glColor3f( 1, 1, 0 ); RB_DrawBounds( vModels->entityDef->referenceBounds ); // draw the model bounds in white - qglColor3f( 1, 1, 1 ); + glColor3f( 1, 1, 1 ); idRenderModel *model = R_EntityDefDynamicModel( vModels->entityDef ); if ( !model ) { @@ -890,10 +890,10 @@ static void RB_ShowViewEntitys( viewEntity_t *vModels ) { RB_DrawBounds( b ); } - qglEnable( GL_DEPTH_TEST ); - qglDisable( GL_POLYGON_OFFSET_LINE ); + glEnable( GL_DEPTH_TEST ); + glDisable( GL_POLYGON_OFFSET_LINE ); - qglDepthRange( 0, 1 ); + glDepthRange( 0, 1 ); GL_State( GLS_DEFAULT ); GL_Cull( CT_FRONT_SIDED ); } @@ -914,13 +914,13 @@ static void RB_ShowTexturePolarity( drawSurf_t **drawSurfs, int numDrawSurfs ) { if ( !r_showTexturePolarity.GetBool() ) { return; } - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); globalImages->BindNull(); - qglDisable( GL_STENCIL_TEST ); + glDisable( GL_STENCIL_TEST ); GL_State( GLS_SRCBLEND_SRC_ALPHA | GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA ); - qglColor3f( 1, 1, 1 ); + glColor3f( 1, 1, 1 ); for ( i = 0 ; i < numDrawSurfs ; i++ ) { drawSurf = drawSurfs[i]; @@ -931,7 +931,7 @@ static void RB_ShowTexturePolarity( drawSurf_t **drawSurfs, int numDrawSurfs ) { RB_SimpleSurfaceSetup( drawSurf ); - qglBegin( GL_TRIANGLES ); + glBegin( GL_TRIANGLES ); for ( j = 0 ; j < tri->numIndexes ; j+=3 ) { idDrawVert *a, *b, *c; float d0[5], d1[5]; @@ -951,17 +951,17 @@ static void RB_ShowTexturePolarity( drawSurf_t **drawSurfs, int numDrawSurfs ) { area = d0[3] * d1[4] - d0[4] * d1[3]; if ( idMath::Fabs( area ) < 0.0001 ) { - qglColor4f( 0, 0, 1, 0.5 ); + glColor4f( 0, 0, 1, 0.5 ); } else if ( area < 0 ) { - qglColor4f( 1, 0, 0, 0.5 ); + glColor4f( 1, 0, 0, 0.5 ); } else { - qglColor4f( 0, 1, 0, 0.5 ); + glColor4f( 0, 1, 0, 0.5 ); } - qglVertex3fv( a->xyz.ToFloatPtr() ); - qglVertex3fv( b->xyz.ToFloatPtr() ); - qglVertex3fv( c->xyz.ToFloatPtr() ); + glVertex3fv( a->xyz.ToFloatPtr() ); + glVertex3fv( b->xyz.ToFloatPtr() ); + glVertex3fv( c->xyz.ToFloatPtr() ); } - qglEnd(); + glEnd(); } GL_State( GLS_DEFAULT ); @@ -983,13 +983,13 @@ static void RB_ShowUnsmoothedTangents( drawSurf_t **drawSurfs, int numDrawSurfs if ( !r_showUnsmoothedTangents.GetBool() ) { return; } - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); globalImages->BindNull(); - qglDisable( GL_STENCIL_TEST ); + glDisable( GL_STENCIL_TEST ); GL_State( GLS_SRCBLEND_SRC_ALPHA | GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA ); - qglColor4f( 0, 1, 0, 0.5 ); + glColor4f( 0, 1, 0, 0.5 ); for ( i = 0 ; i < numDrawSurfs ; i++ ) { drawSurf = drawSurfs[i]; @@ -1001,7 +1001,7 @@ static void RB_ShowUnsmoothedTangents( drawSurf_t **drawSurfs, int numDrawSurfs RB_SimpleSurfaceSetup( drawSurf ); tri = drawSurf->geo; - qglBegin( GL_TRIANGLES ); + glBegin( GL_TRIANGLES ); for ( j = 0 ; j < tri->numIndexes ; j+=3 ) { idDrawVert *a, *b, *c; @@ -1009,11 +1009,11 @@ static void RB_ShowUnsmoothedTangents( drawSurf_t **drawSurfs, int numDrawSurfs b = tri->verts + tri->indexes[j+1]; c = tri->verts + tri->indexes[j+2]; - qglVertex3fv( a->xyz.ToFloatPtr() ); - qglVertex3fv( b->xyz.ToFloatPtr() ); - qglVertex3fv( c->xyz.ToFloatPtr() ); + glVertex3fv( a->xyz.ToFloatPtr() ); + glVertex3fv( b->xyz.ToFloatPtr() ); + glVertex3fv( c->xyz.ToFloatPtr() ); } - qglEnd(); + glEnd(); } GL_State( GLS_DEFAULT ); @@ -1038,9 +1038,9 @@ static void RB_ShowTangentSpace( drawSurf_t **drawSurfs, int numDrawSurfs ) { if ( !r_showTangentSpace.GetInteger() ) { return; } - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); globalImages->BindNull(); - qglDisable( GL_STENCIL_TEST ); + glDisable( GL_STENCIL_TEST ); GL_State( GLS_SRCBLEND_SRC_ALPHA | GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA ); @@ -1053,25 +1053,25 @@ static void RB_ShowTangentSpace( drawSurf_t **drawSurfs, int numDrawSurfs ) { if ( !tri->verts ) { continue; } - qglBegin( GL_TRIANGLES ); + glBegin( GL_TRIANGLES ); for ( j = 0 ; j < tri->numIndexes ; j++ ) { const idDrawVert *v; v = &tri->verts[tri->indexes[j]]; if ( r_showTangentSpace.GetInteger() == 1 ) { - qglColor4f( 0.5 + 0.5 * v->tangents[0][0], 0.5 + 0.5 * v->tangents[0][1], + glColor4f( 0.5 + 0.5 * v->tangents[0][0], 0.5 + 0.5 * v->tangents[0][1], 0.5 + 0.5 * v->tangents[0][2], 0.5 ); } else if ( r_showTangentSpace.GetInteger() == 2 ) { - qglColor4f( 0.5 + 0.5 * v->tangents[1][0], 0.5 + 0.5 * v->tangents[1][1], + glColor4f( 0.5 + 0.5 * v->tangents[1][0], 0.5 + 0.5 * v->tangents[1][1], 0.5 + 0.5 * v->tangents[1][2], 0.5 ); } else { - qglColor4f( 0.5 + 0.5 * v->normal[0], 0.5 + 0.5 * v->normal[1], + glColor4f( 0.5 + 0.5 * v->normal[0], 0.5 + 0.5 * v->normal[1], 0.5 + 0.5 * v->normal[2], 0.5 ); } - qglVertex3fv( v->xyz.ToFloatPtr() ); + glVertex3fv( v->xyz.ToFloatPtr() ); } - qglEnd(); + glEnd(); } GL_State( GLS_DEFAULT ); @@ -1092,9 +1092,9 @@ static void RB_ShowVertexColor( drawSurf_t **drawSurfs, int numDrawSurfs ) { if ( !r_showVertexColor.GetBool() ) { return; } - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); globalImages->BindNull(); - qglDisable( GL_STENCIL_TEST ); + glDisable( GL_STENCIL_TEST ); GL_State( GLS_DEPTHFUNC_LESS ); @@ -1107,15 +1107,15 @@ static void RB_ShowVertexColor( drawSurf_t **drawSurfs, int numDrawSurfs ) { if ( !tri->verts ) { continue; } - qglBegin( GL_TRIANGLES ); + glBegin( GL_TRIANGLES ); for ( j = 0 ; j < tri->numIndexes ; j++ ) { const idDrawVert *v; v = &tri->verts[tri->indexes[j]]; - qglColor4ubv( v->color ); - qglVertex3fv( v->xyz.ToFloatPtr() ); + glColor4ubv( v->color ); + glVertex3fv( v->xyz.ToFloatPtr() ); } - qglEnd(); + glEnd(); } GL_State( GLS_DEFAULT ); @@ -1143,14 +1143,14 @@ static void RB_ShowNormals( drawSurf_t **drawSurfs, int numDrawSurfs ) { } GL_State( GLS_POLYMODE_LINE ); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); globalImages->BindNull(); - qglDisable( GL_STENCIL_TEST ); + glDisable( GL_STENCIL_TEST ); if ( !r_debugLineDepthTest.GetBool() ) { - qglDisable( GL_DEPTH_TEST ); + glDisable( GL_DEPTH_TEST ); } else { - qglEnable( GL_DEPTH_TEST ); + glEnable( GL_DEPTH_TEST ); } size = r_showNormals.GetFloat(); @@ -1171,24 +1171,24 @@ static void RB_ShowNormals( drawSurf_t **drawSurfs, int numDrawSurfs ) { continue; } - qglBegin( GL_LINES ); + glBegin( GL_LINES ); for ( j = 0 ; j < tri->numVerts ; j++ ) { - qglColor3f( 0, 0, 1 ); - qglVertex3fv( tri->verts[j].xyz.ToFloatPtr() ); + glColor3f( 0, 0, 1 ); + glVertex3fv( tri->verts[j].xyz.ToFloatPtr() ); VectorMA( tri->verts[j].xyz, size, tri->verts[j].normal, end ); - qglVertex3fv( end.ToFloatPtr() ); + glVertex3fv( end.ToFloatPtr() ); - qglColor3f( 1, 0, 0 ); - qglVertex3fv( tri->verts[j].xyz.ToFloatPtr() ); + glColor3f( 1, 0, 0 ); + glVertex3fv( tri->verts[j].xyz.ToFloatPtr() ); VectorMA( tri->verts[j].xyz, size, tri->verts[j].tangents[0], end ); - qglVertex3fv( end.ToFloatPtr() ); + glVertex3fv( end.ToFloatPtr() ); - qglColor3f( 0, 1, 0 ); - qglVertex3fv( tri->verts[j].xyz.ToFloatPtr() ); + glColor3f( 0, 1, 0 ); + glVertex3fv( tri->verts[j].xyz.ToFloatPtr() ); VectorMA( tri->verts[j].xyz, size, tri->verts[j].tangents[1], end ); - qglVertex3fv( end.ToFloatPtr() ); + glVertex3fv( end.ToFloatPtr() ); } - qglEnd(); + glEnd(); } if ( showNumbers ) { @@ -1212,7 +1212,7 @@ static void RB_ShowNormals( drawSurf_t **drawSurfs, int numDrawSurfs ) { } } - qglEnable( GL_STENCIL_TEST ); + glEnable( GL_STENCIL_TEST ); } @@ -1234,11 +1234,11 @@ static void RB_AltShowNormals( drawSurf_t **drawSurfs, int numDrawSurfs ) { } GL_State( GLS_DEFAULT ); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); globalImages->BindNull(); - qglDisable( GL_STENCIL_TEST ); - qglDisable( GL_DEPTH_TEST ); + glDisable( GL_STENCIL_TEST ); + glDisable( GL_DEPTH_TEST ); for ( i = 0 ; i < numDrawSurfs ; i++ ) { drawSurf = drawSurfs[i]; @@ -1246,7 +1246,7 @@ static void RB_AltShowNormals( drawSurf_t **drawSurfs, int numDrawSurfs ) { RB_SimpleSurfaceSetup( drawSurf ); tri = drawSurf->geo; - qglBegin( GL_LINES ); + glBegin( GL_LINES ); for ( j = 0 ; j < tri->numIndexes ; j += 3 ) { const idDrawVert *v[3]; idVec3 mid; @@ -1264,31 +1264,31 @@ static void RB_AltShowNormals( drawSurf_t **drawSurfs, int numDrawSurfs ) { pos = ( mid + v[k]->xyz * 3.0f ) * 0.25f; - qglColor3f( 0, 0, 1 ); - qglVertex3fv( pos.ToFloatPtr() ); + glColor3f( 0, 0, 1 ); + glVertex3fv( pos.ToFloatPtr() ); VectorMA( pos, r_showNormals.GetFloat(), v[k]->normal, end ); - qglVertex3fv( end.ToFloatPtr() ); + glVertex3fv( end.ToFloatPtr() ); - qglColor3f( 1, 0, 0 ); - qglVertex3fv( pos.ToFloatPtr() ); + glColor3f( 1, 0, 0 ); + glVertex3fv( pos.ToFloatPtr() ); VectorMA( pos, r_showNormals.GetFloat(), v[k]->tangents[0], end ); - qglVertex3fv( end.ToFloatPtr() ); + glVertex3fv( end.ToFloatPtr() ); - qglColor3f( 0, 1, 0 ); - qglVertex3fv( pos.ToFloatPtr() ); + glColor3f( 0, 1, 0 ); + glVertex3fv( pos.ToFloatPtr() ); VectorMA( pos, r_showNormals.GetFloat(), v[k]->tangents[1], end ); - qglVertex3fv( end.ToFloatPtr() ); + glVertex3fv( end.ToFloatPtr() ); - qglColor3f( 1, 1, 1 ); - qglVertex3fv( pos.ToFloatPtr() ); - qglVertex3fv( v[k]->xyz.ToFloatPtr() ); + glColor3f( 1, 1, 1 ); + glVertex3fv( pos.ToFloatPtr() ); + glVertex3fv( v[k]->xyz.ToFloatPtr() ); } } - qglEnd(); + glEnd(); } - qglEnable( GL_DEPTH_TEST ); - qglEnable( GL_STENCIL_TEST ); + glEnable( GL_DEPTH_TEST ); + glEnable( GL_STENCIL_TEST ); } @@ -1310,7 +1310,7 @@ static void RB_ShowTextureVectors( drawSurf_t **drawSurfs, int numDrawSurfs ) { } GL_State( GLS_DEPTHFUNC_LESS ); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); globalImages->BindNull(); @@ -1328,7 +1328,7 @@ static void RB_ShowTextureVectors( drawSurf_t **drawSurfs, int numDrawSurfs ) { RB_SimpleSurfaceSetup( drawSurf ); // draw non-shared edges in yellow - qglBegin( GL_LINES ); + glBegin( GL_LINES ); for ( j = 0 ; j < tri->numIndexes ; j+= 3 ) { const idDrawVert *a, *b, *c; @@ -1376,16 +1376,16 @@ static void RB_ShowTextureVectors( drawSurf_t **drawSurfs, int numDrawSurfs ) { tangents[0] = mid + tangents[0] * r_showTextureVectors.GetFloat(); tangents[1] = mid + tangents[1] * r_showTextureVectors.GetFloat(); - qglColor3f( 1, 0, 0 ); - qglVertex3fv( mid.ToFloatPtr() ); - qglVertex3fv( tangents[0].ToFloatPtr() ); + glColor3f( 1, 0, 0 ); + glVertex3fv( mid.ToFloatPtr() ); + glVertex3fv( tangents[0].ToFloatPtr() ); - qglColor3f( 0, 1, 0 ); - qglVertex3fv( mid.ToFloatPtr() ); - qglVertex3fv( tangents[1].ToFloatPtr() ); + glColor3f( 0, 1, 0 ); + glVertex3fv( mid.ToFloatPtr() ); + glVertex3fv( tangents[1].ToFloatPtr() ); } - qglEnd(); + glEnd(); } } @@ -1406,10 +1406,10 @@ static void RB_ShowDominantTris( drawSurf_t **drawSurfs, int numDrawSurfs ) { } GL_State( GLS_DEPTHFUNC_LESS ); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); - qglPolygonOffset( -1, -2 ); - qglEnable( GL_POLYGON_OFFSET_LINE ); + glPolygonOffset( -1, -2 ); + glEnable( GL_POLYGON_OFFSET_LINE ); globalImages->BindNull(); @@ -1426,8 +1426,8 @@ static void RB_ShowDominantTris( drawSurf_t **drawSurfs, int numDrawSurfs ) { } RB_SimpleSurfaceSetup( drawSurf ); - qglColor3f( 1, 1, 0 ); - qglBegin( GL_LINES ); + glColor3f( 1, 1, 0 ); + glBegin( GL_LINES ); for ( j = 0 ; j < tri->numVerts ; j++ ) { const idDrawVert *a, *b, *c; @@ -1441,13 +1441,13 @@ static void RB_ShowDominantTris( drawSurf_t **drawSurfs, int numDrawSurfs ) { mid = ( a->xyz + b->xyz + c->xyz ) * ( 1.0f / 3.0f ); - qglVertex3fv( mid.ToFloatPtr() ); - qglVertex3fv( a->xyz.ToFloatPtr() ); + glVertex3fv( mid.ToFloatPtr() ); + glVertex3fv( a->xyz.ToFloatPtr() ); } - qglEnd(); + glEnd(); } - qglDisable( GL_POLYGON_OFFSET_LINE ); + glDisable( GL_POLYGON_OFFSET_LINE ); } /* @@ -1469,10 +1469,10 @@ static void RB_ShowEdges( drawSurf_t **drawSurfs, int numDrawSurfs ) { } GL_State( GLS_DEFAULT ); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); globalImages->BindNull(); - qglDisable( GL_DEPTH_TEST ); + glDisable( GL_DEPTH_TEST ); for ( i = 0 ; i < numDrawSurfs ; i++ ) { drawSurf = drawSurfs[i]; @@ -1487,8 +1487,8 @@ static void RB_ShowEdges( drawSurf_t **drawSurfs, int numDrawSurfs ) { RB_SimpleSurfaceSetup( drawSurf ); // draw non-shared edges in yellow - qglColor3f( 1, 1, 0 ); - qglBegin( GL_LINES ); + glColor3f( 1, 1, 0 ); + glBegin( GL_LINES ); for ( j = 0 ; j < tri->numIndexes ; j+= 3 ) { for ( k = 0 ; k < 3 ; k++ ) { @@ -1512,14 +1512,14 @@ static void RB_ShowEdges( drawSurf_t **drawSurfs, int numDrawSurfs ) { // if we didn't find a backwards listing, draw it in yellow if ( m == tri->numIndexes ) { - qglVertex3fv( ac[ i1 ].xyz.ToFloatPtr() ); - qglVertex3fv( ac[ i2 ].xyz.ToFloatPtr() ); + glVertex3fv( ac[ i1 ].xyz.ToFloatPtr() ); + glVertex3fv( ac[ i2 ].xyz.ToFloatPtr() ); } } } - qglEnd(); + glEnd(); // draw dangling sil edges in red if ( !tri->silEdges ) { @@ -1530,9 +1530,9 @@ static void RB_ShowEdges( drawSurf_t **drawSurfs, int numDrawSurfs ) { // is the dangling edge danglePlane = tri->numIndexes / 3; - qglColor3f( 1, 0, 0 ); + glColor3f( 1, 0, 0 ); - qglBegin( GL_LINES ); + glBegin( GL_LINES ); for ( j = 0 ; j < tri->numSilEdges ; j++ ) { edge = tri->silEdges + j; @@ -1540,13 +1540,13 @@ static void RB_ShowEdges( drawSurf_t **drawSurfs, int numDrawSurfs ) { continue; } - qglVertex3fv( ac[ edge->v1 ].xyz.ToFloatPtr() ); - qglVertex3fv( ac[ edge->v2 ].xyz.ToFloatPtr() ); + glVertex3fv( ac[ edge->v1 ].xyz.ToFloatPtr() ); + glVertex3fv( ac[ edge->v2 ].xyz.ToFloatPtr() ); } - qglEnd(); + glEnd(); } - qglEnable( GL_DEPTH_TEST ); + glEnable( GL_DEPTH_TEST ); } /* @@ -1572,13 +1572,13 @@ void RB_ShowLights( void ) { // all volumes are expressed in world coordinates RB_SimpleWorldSetup(); - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); globalImages->BindNull(); - qglDisable( GL_STENCIL_TEST ); + glDisable( GL_STENCIL_TEST ); GL_Cull( CT_TWO_SIDED ); - qglDisable( GL_DEPTH_TEST ); + glDisable( GL_DEPTH_TEST ); common->Printf( "volumes: " ); // FIXME: not in back end! @@ -1593,16 +1593,16 @@ void RB_ShowLights( void ) { // depth buffered planes if ( r_showLights.GetInteger() >= 2 ) { GL_State( GLS_SRCBLEND_SRC_ALPHA | GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA | GLS_DEPTHMASK ); - qglColor4f( 0, 0, 1, 0.25 ); - qglEnable( GL_DEPTH_TEST ); + glColor4f( 0, 0, 1, 0.25 ); + glEnable( GL_DEPTH_TEST ); RB_RenderTriangleSurface( tri ); } // non-hidden lines if ( r_showLights.GetInteger() >= 3 ) { GL_State( GLS_POLYMODE_LINE | GLS_DEPTHMASK ); - qglDisable( GL_DEPTH_TEST ); - qglColor3f( 1, 1, 1 ); + glDisable( GL_DEPTH_TEST ); + glColor3f( 1, 1, 1 ); RB_RenderTriangleSurface( tri ); } @@ -1617,10 +1617,10 @@ void RB_ShowLights( void ) { } } - qglEnable( GL_DEPTH_TEST ); - qglDisable( GL_POLYGON_OFFSET_LINE ); + glEnable( GL_DEPTH_TEST ); + glDisable( GL_POLYGON_OFFSET_LINE ); - qglDepthRange( 0, 1 ); + glDepthRange( 0, 1 ); GL_State( GLS_DEFAULT ); GL_Cull( CT_FRONT_SIDED ); @@ -1643,13 +1643,13 @@ void RB_ShowPortals( void ) { RB_SimpleWorldSetup(); globalImages->BindNull(); - qglDisable( GL_DEPTH_TEST ); + glDisable( GL_DEPTH_TEST ); GL_State( GLS_DEFAULT ); ((idRenderWorldLocal *)backEnd.viewDef->renderWorld)->ShowPortals(); - qglEnable( GL_DEPTH_TEST ); + glEnable( GL_DEPTH_TEST ); } /* @@ -1764,8 +1764,8 @@ static void RB_DrawText( const char *text, const idVec3 &origin, float scale, co idVec3 org, p1, p2; if ( text && *text ) { - qglBegin( GL_LINES ); - qglColor3fv( color.ToFloatPtr() ); + glBegin( GL_LINES ); + glColor3fv( color.ToFloatPtr() ); if ( text[0] == '\n' ) { line = 1; @@ -1817,13 +1817,13 @@ static void RB_DrawText( const char *text, const idVec3 &origin, float scale, co } p2 = org + scale * simplex[charIndex][index] * -viewAxis[1] + scale * simplex[charIndex][index+1] * viewAxis[2]; - qglVertex3fv( p1.ToFloatPtr() ); - qglVertex3fv( p2.ToFloatPtr() ); + glVertex3fv( p1.ToFloatPtr() ); + glVertex3fv( p2.ToFloatPtr() ); } org -= viewAxis[1] * ( spacing * scale ); } - qglEnd(); + glEnd(); } } @@ -1855,10 +1855,10 @@ void RB_ShowDebugText( void ) { // draw lines GL_State( GLS_POLYMODE_LINE ); - qglLineWidth( width ); + glLineWidth( width ); if ( !r_debugLineDepthTest.GetBool() ) { - qglDisable( GL_DEPTH_TEST ); + glDisable( GL_DEPTH_TEST ); } text = rb_debugText; @@ -1869,7 +1869,7 @@ void RB_ShowDebugText( void ) { } if ( !r_debugLineDepthTest.GetBool() ) { - qglEnable( GL_DEPTH_TEST ); + glEnable( GL_DEPTH_TEST ); } text = rb_debugText; @@ -1879,7 +1879,7 @@ void RB_ShowDebugText( void ) { } } - qglLineWidth( 1 ); + glLineWidth( 1 ); GL_State( GLS_DEFAULT ); } @@ -1960,42 +1960,42 @@ void RB_ShowDebugLines( void ) { // draw lines GL_State( GLS_POLYMODE_LINE );//| GLS_DEPTHMASK ); //| GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE ); - qglLineWidth( width ); + glLineWidth( width ); if ( !r_debugLineDepthTest.GetBool() ) { - qglDisable( GL_DEPTH_TEST ); + glDisable( GL_DEPTH_TEST ); } - qglBegin( GL_LINES ); + glBegin( GL_LINES ); line = rb_debugLines; for ( i = 0 ; i < rb_numDebugLines; i++, line++ ) { if ( !line->depthTest ) { - qglColor3fv( line->rgb.ToFloatPtr() ); - qglVertex3fv( line->start.ToFloatPtr() ); - qglVertex3fv( line->end.ToFloatPtr() ); + glColor3fv( line->rgb.ToFloatPtr() ); + glVertex3fv( line->start.ToFloatPtr() ); + glVertex3fv( line->end.ToFloatPtr() ); } } - qglEnd(); + glEnd(); if ( !r_debugLineDepthTest.GetBool() ) { - qglEnable( GL_DEPTH_TEST ); + glEnable( GL_DEPTH_TEST ); } - qglBegin( GL_LINES ); + glBegin( GL_LINES ); line = rb_debugLines; for ( i = 0 ; i < rb_numDebugLines; i++, line++ ) { if ( line->depthTest ) { - qglColor4fv( line->rgb.ToFloatPtr() ); - qglVertex3fv( line->start.ToFloatPtr() ); - qglVertex3fv( line->end.ToFloatPtr() ); + glColor4fv( line->rgb.ToFloatPtr() ); + glVertex3fv( line->start.ToFloatPtr() ); + glVertex3fv( line->end.ToFloatPtr() ); } } - qglEnd(); + glEnd(); - qglLineWidth( 1 ); + glLineWidth( 1 ); GL_State( GLS_DEFAULT ); } @@ -2066,46 +2066,46 @@ void RB_ShowDebugPolygons( void ) { globalImages->BindNull(); - qglDisable( GL_TEXTURE_2D ); - qglDisable( GL_STENCIL_TEST ); + glDisable( GL_TEXTURE_2D ); + glDisable( GL_STENCIL_TEST ); - qglEnable( GL_DEPTH_TEST ); + glEnable( GL_DEPTH_TEST ); if ( r_debugPolygonFilled.GetBool() ) { GL_State( GLS_SRCBLEND_SRC_ALPHA | GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA | GLS_DEPTHMASK ); - qglPolygonOffset( -1, -2 ); - qglEnable( GL_POLYGON_OFFSET_FILL ); + glPolygonOffset( -1, -2 ); + glEnable( GL_POLYGON_OFFSET_FILL ); } else { GL_State( GLS_POLYMODE_LINE ); - qglPolygonOffset( -1, -2 ); - qglEnable( GL_POLYGON_OFFSET_LINE ); + glPolygonOffset( -1, -2 ); + glEnable( GL_POLYGON_OFFSET_LINE ); } poly = rb_debugPolygons; for ( i = 0 ; i < rb_numDebugPolygons; i++, poly++ ) { // if ( !poly->depthTest ) { - qglColor4fv( poly->rgb.ToFloatPtr() ); + glColor4fv( poly->rgb.ToFloatPtr() ); - qglBegin( GL_POLYGON ); + glBegin( GL_POLYGON ); for ( j = 0; j < poly->winding.GetNumPoints(); j++) { - qglVertex3fv( poly->winding[j].ToFloatPtr() ); + glVertex3fv( poly->winding[j].ToFloatPtr() ); } - qglEnd(); + glEnd(); // } } GL_State( GLS_DEFAULT ); if ( r_debugPolygonFilled.GetBool() ) { - qglDisable( GL_POLYGON_OFFSET_FILL ); + glDisable( GL_POLYGON_OFFSET_FILL ); } else { - qglDisable( GL_POLYGON_OFFSET_LINE ); + glDisable( GL_POLYGON_OFFSET_LINE ); } - qglDepthRange( 0, 1 ); + glDepthRange( 0, 1 ); GL_State( GLS_DEFAULT ); } @@ -2187,20 +2187,20 @@ void RB_TestGamma( void ) { } - qglLoadIdentity(); + glLoadIdentity(); - qglMatrixMode( GL_PROJECTION ); + glMatrixMode( GL_PROJECTION ); GL_State( GLS_DEPTHFUNC_ALWAYS ); - qglColor3f( 1, 1, 1 ); - qglPushMatrix(); - qglLoadIdentity(); - qglDisable( GL_TEXTURE_2D ); - qglOrtho( 0, 1, 0, 1, -1, 1 ); - qglRasterPos2f( 0.01f, 0.01f ); - qglDrawPixels( G_WIDTH, G_HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, image ); - qglPopMatrix(); - qglEnable( GL_TEXTURE_2D ); - qglMatrixMode( GL_MODELVIEW ); + glColor3f( 1, 1, 1 ); + glPushMatrix(); + glLoadIdentity(); + glDisable( GL_TEXTURE_2D ); + glOrtho( 0, 1, 0, 1, -1, 1 ); + glRasterPos2f( 0.01f, 0.01f ); + glDrawPixels( G_WIDTH, G_HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, image ); + glPopMatrix(); + glEnable( GL_TEXTURE_2D ); + glMatrixMode( GL_MODELVIEW ); } @@ -2238,19 +2238,19 @@ static void RB_TestGammaBias( void ) { } - qglLoadIdentity(); - qglMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + glMatrixMode( GL_PROJECTION ); GL_State( GLS_DEPTHFUNC_ALWAYS ); - qglColor3f( 1, 1, 1 ); - qglPushMatrix(); - qglLoadIdentity(); - qglDisable( GL_TEXTURE_2D ); - qglOrtho( 0, 1, 0, 1, -1, 1 ); - qglRasterPos2f( 0.01f, 0.01f ); - qglDrawPixels( G_WIDTH, G_HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, image ); - qglPopMatrix(); - qglEnable( GL_TEXTURE_2D ); - qglMatrixMode( GL_MODELVIEW ); + glColor3f( 1, 1, 1 ); + glPushMatrix(); + glLoadIdentity(); + glDisable( GL_TEXTURE_2D ); + glOrtho( 0, 1, 0, 1, -1, 1 ); + glRasterPos2f( 0.01f, 0.01f ); + glDrawPixels( G_WIDTH, G_HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, image ); + glPopMatrix(); + glEnable( GL_TEXTURE_2D ); + glMatrixMode( GL_MODELVIEW ); } /* @@ -2283,42 +2283,42 @@ void RB_TestImage( void ) { w = 0.25; h = 0.25; } else { - max = image->uploadWidth > image->uploadHeight ? image->uploadWidth : image->uploadHeight; + max = image->GetOpts().width > image->GetOpts().height ? image->GetOpts().width : image->GetOpts().height; - w = 0.25 * image->uploadWidth / max; - h = 0.25 * image->uploadHeight / max; + w = 0.25 * image->GetOpts().width / max; + h = 0.25 * image->GetOpts().height / max; w *= (float)glConfig.vidHeight / glConfig.vidWidth; } - qglLoadIdentity(); + glLoadIdentity(); - qglMatrixMode( GL_PROJECTION ); + glMatrixMode( GL_PROJECTION ); GL_State( GLS_DEPTHFUNC_ALWAYS | GLS_SRCBLEND_SRC_ALPHA | GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA ); - qglColor3f( 1, 1, 1 ); - qglPushMatrix(); - qglLoadIdentity(); - qglOrtho( 0, 1, 0, 1, -1, 1 ); + glColor3f( 1, 1, 1 ); + glPushMatrix(); + glLoadIdentity(); + glOrtho( 0, 1, 0, 1, -1, 1 ); tr.testImage->Bind(); - qglBegin( GL_QUADS ); + glBegin( GL_QUADS ); - qglTexCoord2f( 0, 1 ); - qglVertex2f( 0.5 - w, 0 ); + glTexCoord2f( 0, 1 ); + glVertex2f( 0.5 - w, 0 ); - qglTexCoord2f( 0, 0 ); - qglVertex2f( 0.5 - w, h*2 ); + glTexCoord2f( 0, 0 ); + glVertex2f( 0.5 - w, h*2 ); - qglTexCoord2f( 1, 0 ); - qglVertex2f( 0.5 + w, h*2 ); + glTexCoord2f( 1, 0 ); + glVertex2f( 0.5 + w, h*2 ); - qglTexCoord2f( 1, 1 ); - qglVertex2f( 0.5 + w, 0 ); + glTexCoord2f( 1, 1 ); + glVertex2f( 0.5 + w, 0 ); - qglEnd(); + glEnd(); - qglPopMatrix(); - qglMatrixMode( GL_MODELVIEW ); + glPopMatrix(); + glMatrixMode( GL_MODELVIEW ); } /* @@ -2336,7 +2336,7 @@ void RB_RenderDebugTools( drawSurf_t **drawSurfs, int numDrawSurfs ) { GL_State( GLS_DEFAULT ); backEnd.currentScissor = backEnd.viewDef->scissor; - qglScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, + glScissor( backEnd.viewDef->viewport.x1 + backEnd.currentScissor.x1, backEnd.viewDef->viewport.y1 + backEnd.currentScissor.y1, backEnd.currentScissor.x2 + 1 - backEnd.currentScissor.x1, backEnd.currentScissor.y2 + 1 - backEnd.currentScissor.y1 ); diff --git a/src/renderer/tr_subview.cpp b/src/renderer/tr_subview.cpp index 50309f9f..08ec0930 100644 --- a/src/renderer/tr_subview.cpp +++ b/src/renderer/tr_subview.cpp @@ -339,7 +339,7 @@ static void R_RemoteRender( drawSurf_t *surf, textureStage_t *stage ) { stage->image = globalImages->scratchImage; } - tr.CaptureRenderToImage( stage->image->imgName ); + tr.CaptureRenderToImage( stage->image->GetName() ); tr.UnCrop(); } @@ -389,7 +389,7 @@ void R_MirrorRender( drawSurf_t *surf, textureStage_t *stage, idScreenRect sciss stage->dynamicFrameCount = tr.frameCount; stage->image = globalImages->scratchImage; - tr.CaptureRenderToImage( stage->image->imgName ); + tr.CaptureRenderToImage( stage->image->GetName() ); tr.UnCrop(); } @@ -439,7 +439,7 @@ void R_XrayRender( drawSurf_t *surf, textureStage_t *stage, idScreenRect scissor stage->dynamicFrameCount = tr.frameCount; stage->image = globalImages->scratchImage2; - tr.CaptureRenderToImage( stage->image->imgName ); + tr.CaptureRenderToImage( stage->image->GetName()); tr.UnCrop(); } diff --git a/src/renderer/tr_trace.cpp b/src/renderer/tr_trace.cpp index 2e3096a0..7f1d7d24 100644 --- a/src/renderer/tr_trace.cpp +++ b/src/renderer/tr_trace.cpp @@ -309,7 +309,7 @@ void RB_DrawExpandedTriangles( const srfTriangles_t *tri, const float radius, co dir[1].Normalize(); dir[2].Normalize(); - qglBegin( GL_LINE_LOOP ); + glBegin( GL_LINE_LOOP ); for ( j = 0; j < 3; j++ ) { k = ( j + 1 ) % 3; @@ -324,22 +324,22 @@ void RB_DrawExpandedTriangles( const srfTriangles_t *tri, const float radius, co dir[5].Normalize(); point = p[k] + dir[j] * radius; - qglVertex3f( point[0], point[1], point[2] ); + glVertex3f( point[0], point[1], point[2] ); point = p[k] + dir[3] * radius; - qglVertex3f( point[0], point[1], point[2] ); + glVertex3f( point[0], point[1], point[2] ); point = p[k] + dir[4] * radius; - qglVertex3f( point[0], point[1], point[2] ); + glVertex3f( point[0], point[1], point[2] ); point = p[k] + dir[5] * radius; - qglVertex3f( point[0], point[1], point[2] ); + glVertex3f( point[0], point[1], point[2] ); point = p[k] + dir[k] * radius; - qglVertex3f( point[0], point[1], point[2] ); + glVertex3f( point[0], point[1], point[2] ); } - qglEnd(); + glEnd(); } } @@ -374,7 +374,7 @@ void RB_ShowTrace( drawSurf_t **drawSurfs, int numDrawSurfs ) { end = start + 4000 * backEnd.viewDef->renderView.viewaxis[0]; // check and draw the surfaces - qglDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); GL_TexEnv( GL_MODULATE ); globalImages->whiteImage->Bind(); @@ -397,30 +397,30 @@ void RB_ShowTrace( drawSurf_t **drawSurfs, int numDrawSurfs ) { continue; } - qglLoadMatrixf( surf->space->modelViewMatrix ); + glLoadMatrixf( surf->space->modelViewMatrix ); // highlight the surface GL_State( GLS_SRCBLEND_SRC_ALPHA | GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA ); - qglColor4f( 1, 0, 0, 0.25 ); + glColor4f( 1, 0, 0, 0.25 ); RB_DrawElementsImmediate( tri ); // draw the bounding box GL_State( GLS_DEPTHFUNC_ALWAYS ); - qglColor4f( 1, 1, 1, 1 ); + glColor4f( 1, 1, 1, 1 ); RB_DrawBounds( tri->bounds ); if ( radius != 0.0f ) { // draw the expanded triangles - qglColor4f( 0.5f, 0.5f, 1.0f, 1.0f ); + glColor4f( 0.5f, 0.5f, 1.0f, 1.0f ); RB_DrawExpandedTriangles( tri, radius, localStart ); } // check the exact surfaces hit = R_LocalTrace( localStart, localEnd, radius, tri ); if ( hit.fraction < 1.0 ) { - qglColor4f( 1, 1, 1, 1 ); + glColor4f( 1, 1, 1, 1 ); RB_DrawBounds( idBounds( hit.point ).Expand( 1 ) ); } } diff --git a/src/sys/win32/win_glimp.cpp b/src/sys/win32/win_glimp.cpp index 69f12005..ea647e12 100644 --- a/src/sys/win32/win_glimp.cpp +++ b/src/sys/win32/win_glimp.cpp @@ -74,7 +74,7 @@ PFNWGLBINDTEXIMAGEARBPROC wglBindTexImageARB; PFNWGLRELEASETEXIMAGEARBPROC wglReleaseTexImageARB; PFNWGLSETPBUFFERATTRIBARBPROC wglSetPbufferAttribARB; - +void* GLimp_ExtensionPointer(const char* name); /* ARB_pixel_format */ #define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 @@ -1050,7 +1050,7 @@ GLimp_DeactivateContext =================== */ void GLimp_DeactivateContext( void ) { - qglFinish(); + glFinish(); if ( !qwglMakeCurrent( win32.hDC, NULL ) ) { win32.wglErrors++; } @@ -1227,10 +1227,10 @@ GLimp_ExtensionPointer Returns a function pointer for an OpenGL extension entry point =================== */ -GLExtension_t GLimp_ExtensionPointer( const char *name ) { - void (*proc)(void); +void *GLimp_ExtensionPointer( const char *name ) { + void* proc; - proc = (GLExtension_t)qwglGetProcAddress( name ); + proc = (void *)qwglGetProcAddress( name ); if ( !proc ) { common->Printf( "Couldn't find proc address for: %s\n", name ); diff --git a/src/sys/win32/win_qgl.cpp b/src/sys/win32/win_qgl.cpp index e7960c01..d1c0fde0 100644 --- a/src/sys/win32/win_qgl.cpp +++ b/src/sys/win32/win_qgl.cpp @@ -72,1227 +72,6 @@ int ( WINAPI * qwglGetLayerPaletteEntries)(HDC, int, int, int, BOOL ( WINAPI * qwglRealizeLayerPalette)(HDC, int, BOOL); BOOL ( WINAPI * qwglSwapLayerBuffers)(HDC, UINT); -void ( APIENTRY * qglAccum )(GLenum op, GLfloat value); -void ( APIENTRY * qglAlphaFunc )(GLenum func, GLclampf ref); -GLboolean ( APIENTRY * qglAreTexturesResident )(GLsizei n, const GLuint *textures, GLboolean *residences); -void ( APIENTRY * qglArrayElement )(GLint i); -void ( APIENTRY * qglBegin )(GLenum mode); -void ( APIENTRY * qglBindTexture )(GLenum target, GLuint texture); -void ( APIENTRY * qglBitmap )(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); -void ( APIENTRY * qglBlendFunc )(GLenum sfactor, GLenum dfactor); -void ( APIENTRY * qglCallList )(GLuint list); -void ( APIENTRY * qglCallLists )(GLsizei n, GLenum type, const GLvoid *lists); -void ( APIENTRY * qglClear )(GLbitfield mask); -void ( APIENTRY * qglClearAccum )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -void ( APIENTRY * qglClearColor )(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -void ( APIENTRY * qglClearDepth )(GLclampd depth); -void ( APIENTRY * qglClearIndex )(GLfloat c); -void ( APIENTRY * qglClearStencil )(GLint s); -void ( APIENTRY * qglClipPlane )(GLenum plane, const GLdouble *equation); -void ( APIENTRY * qglColor3b )(GLbyte red, GLbyte green, GLbyte blue); -void ( APIENTRY * qglColor3bv )(const GLbyte *v); -void ( APIENTRY * qglColor3d )(GLdouble red, GLdouble green, GLdouble blue); -void ( APIENTRY * qglColor3dv )(const GLdouble *v); -void ( APIENTRY * qglColor3f )(GLfloat red, GLfloat green, GLfloat blue); -void ( APIENTRY * qglColor3fv )(const GLfloat *v); -void ( APIENTRY * qglColor3i )(GLint red, GLint green, GLint blue); -void ( APIENTRY * qglColor3iv )(const GLint *v); -void ( APIENTRY * qglColor3s )(GLshort red, GLshort green, GLshort blue); -void ( APIENTRY * qglColor3sv )(const GLshort *v); -void ( APIENTRY * qglColor3ub )(GLubyte red, GLubyte green, GLubyte blue); -void ( APIENTRY * qglColor3ubv )(const GLubyte *v); -void ( APIENTRY * qglColor3ui )(GLuint red, GLuint green, GLuint blue); -void ( APIENTRY * qglColor3uiv )(const GLuint *v); -void ( APIENTRY * qglColor3us )(GLushort red, GLushort green, GLushort blue); -void ( APIENTRY * qglColor3usv )(const GLushort *v); -void ( APIENTRY * qglColor4b )(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); -void ( APIENTRY * qglColor4bv )(const GLbyte *v); -void ( APIENTRY * qglColor4d )(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); -void ( APIENTRY * qglColor4dv )(const GLdouble *v); -void ( APIENTRY * qglColor4f )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -void ( APIENTRY * qglColor4fv )(const GLfloat *v); -void ( APIENTRY * qglColor4i )(GLint red, GLint green, GLint blue, GLint alpha); -void ( APIENTRY * qglColor4iv )(const GLint *v); -void ( APIENTRY * qglColor4s )(GLshort red, GLshort green, GLshort blue, GLshort alpha); -void ( APIENTRY * qglColor4sv )(const GLshort *v); -void ( APIENTRY * qglColor4ub )(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -void ( APIENTRY * qglColor4ubv )(const GLubyte *v); -void ( APIENTRY * qglColor4ui )(GLuint red, GLuint green, GLuint blue, GLuint alpha); -void ( APIENTRY * qglColor4uiv )(const GLuint *v); -void ( APIENTRY * qglColor4us )(GLushort red, GLushort green, GLushort blue, GLushort alpha); -void ( APIENTRY * qglColor4usv )(const GLushort *v); -void ( APIENTRY * qglColorMask )(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -void ( APIENTRY * qglColorMaterial )(GLenum face, GLenum mode); -void ( APIENTRY * qglColorPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglCopyPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -void ( APIENTRY * qglCopyTexImage1D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); -void ( APIENTRY * qglCopyTexImage2D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -void ( APIENTRY * qglCopyTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -void ( APIENTRY * qglCopyTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -void ( APIENTRY * qglCullFace )(GLenum mode); -void ( APIENTRY * qglDeleteLists )(GLuint list, GLsizei range); -void ( APIENTRY * qglDeleteTextures )(GLsizei n, const GLuint *textures); -void ( APIENTRY * qglDepthFunc )(GLenum func); -void ( APIENTRY * qglDepthMask )(GLboolean flag); -void ( APIENTRY * qglDepthRange )(GLclampd zNear, GLclampd zFar); -void ( APIENTRY * qglDisable )(GLenum cap); -void ( APIENTRY * qglDisableClientState )(GLenum array); -void ( APIENTRY * qglDrawArrays )(GLenum mode, GLint first, GLsizei count); -void ( APIENTRY * qglDrawBuffer )(GLenum mode); -void ( APIENTRY * qglDrawElements )(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -void ( APIENTRY * qglDrawPixels )(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglEdgeFlag )(GLboolean flag); -void ( APIENTRY * qglEdgeFlagPointer )(GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglEdgeFlagv )(const GLboolean *flag); -void ( APIENTRY * qglEnable )(GLenum cap); -void ( APIENTRY * qglEnableClientState )(GLenum array); -void ( APIENTRY * qglEnd )(void); -void ( APIENTRY * qglEndList )(void); -void ( APIENTRY * qglEvalCoord1d )(GLdouble u); -void ( APIENTRY * qglEvalCoord1dv )(const GLdouble *u); -void ( APIENTRY * qglEvalCoord1f )(GLfloat u); -void ( APIENTRY * qglEvalCoord1fv )(const GLfloat *u); -void ( APIENTRY * qglEvalCoord2d )(GLdouble u, GLdouble v); -void ( APIENTRY * qglEvalCoord2dv )(const GLdouble *u); -void ( APIENTRY * qglEvalCoord2f )(GLfloat u, GLfloat v); -void ( APIENTRY * qglEvalCoord2fv )(const GLfloat *u); -void ( APIENTRY * qglEvalMesh1 )(GLenum mode, GLint i1, GLint i2); -void ( APIENTRY * qglEvalMesh2 )(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); -void ( APIENTRY * qglEvalPoint1 )(GLint i); -void ( APIENTRY * qglEvalPoint2 )(GLint i, GLint j); -void ( APIENTRY * qglFeedbackBuffer )(GLsizei size, GLenum type, GLfloat *buffer); -void ( APIENTRY * qglFinish )(void); -void ( APIENTRY * qglFlush )(void); -void ( APIENTRY * qglFogf )(GLenum pname, GLfloat param); -void ( APIENTRY * qglFogfv )(GLenum pname, const GLfloat *params); -void ( APIENTRY * qglFogi )(GLenum pname, GLint param); -void ( APIENTRY * qglFogiv )(GLenum pname, const GLint *params); -void ( APIENTRY * qglFrontFace )(GLenum mode); -void ( APIENTRY * qglFrustum )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLuint ( APIENTRY * qglGenLists )(GLsizei range); -void ( APIENTRY * qglGenTextures )(GLsizei n, GLuint *textures); -void ( APIENTRY * qglGetBooleanv )(GLenum pname, GLboolean *params); -void ( APIENTRY * qglGetClipPlane )(GLenum plane, GLdouble *equation); -void ( APIENTRY * qglGetDoublev )(GLenum pname, GLdouble *params); -GLenum ( APIENTRY * qglGetError )(void); -void ( APIENTRY * qglGetFloatv )(GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetIntegerv )(GLenum pname, GLint *params); -void ( APIENTRY * qglGetLightfv )(GLenum light, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetLightiv )(GLenum light, GLenum pname, GLint *params); -void ( APIENTRY * qglGetMapdv )(GLenum target, GLenum query, GLdouble *v); -void ( APIENTRY * qglGetMapfv )(GLenum target, GLenum query, GLfloat *v); -void ( APIENTRY * qglGetMapiv )(GLenum target, GLenum query, GLint *v); -void ( APIENTRY * qglGetMaterialfv )(GLenum face, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetMaterialiv )(GLenum face, GLenum pname, GLint *params); -void ( APIENTRY * qglGetPixelMapfv )(GLenum map, GLfloat *values); -void ( APIENTRY * qglGetPixelMapuiv )(GLenum map, GLuint *values); -void ( APIENTRY * qglGetPixelMapusv )(GLenum map, GLushort *values); -void ( APIENTRY * qglGetPointerv )(GLenum pname, GLvoid* *params); -void ( APIENTRY * qglGetPolygonStipple )(GLubyte *mask); -const GLubyte * ( APIENTRY * qglGetString )(GLenum name); -void ( APIENTRY * qglGetTexEnvfv )(GLenum target, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetTexEnviv )(GLenum target, GLenum pname, GLint *params); -void ( APIENTRY * qglGetTexGendv )(GLenum coord, GLenum pname, GLdouble *params); -void ( APIENTRY * qglGetTexGenfv )(GLenum coord, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetTexGeniv )(GLenum coord, GLenum pname, GLint *params); -void ( APIENTRY * qglGetTexImage )(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -void ( APIENTRY * qglGetTexLevelParameterfv )(GLenum target, GLint level, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetTexLevelParameteriv )(GLenum target, GLint level, GLenum pname, GLint *params); -void ( APIENTRY * qglGetTexParameterfv )(GLenum target, GLenum pname, GLfloat *params); -void ( APIENTRY * qglGetTexParameteriv )(GLenum target, GLenum pname, GLint *params); -void ( APIENTRY * qglHint )(GLenum target, GLenum mode); -void ( APIENTRY * qglIndexMask )(GLuint mask); -void ( APIENTRY * qglIndexPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglIndexd )(GLdouble c); -void ( APIENTRY * qglIndexdv )(const GLdouble *c); -void ( APIENTRY * qglIndexf )(GLfloat c); -void ( APIENTRY * qglIndexfv )(const GLfloat *c); -void ( APIENTRY * qglIndexi )(GLint c); -void ( APIENTRY * qglIndexiv )(const GLint *c); -void ( APIENTRY * qglIndexs )(GLshort c); -void ( APIENTRY * qglIndexsv )(const GLshort *c); -void ( APIENTRY * qglIndexub )(GLubyte c); -void ( APIENTRY * qglIndexubv )(const GLubyte *c); -void ( APIENTRY * qglInitNames )(void); -void ( APIENTRY * qglInterleavedArrays )(GLenum format, GLsizei stride, const GLvoid *pointer); -GLboolean ( APIENTRY * qglIsEnabled )(GLenum cap); -GLboolean ( APIENTRY * qglIsList )(GLuint list); -GLboolean ( APIENTRY * qglIsTexture )(GLuint texture); -void ( APIENTRY * qglLightModelf )(GLenum pname, GLfloat param); -void ( APIENTRY * qglLightModelfv )(GLenum pname, const GLfloat *params); -void ( APIENTRY * qglLightModeli )(GLenum pname, GLint param); -void ( APIENTRY * qglLightModeliv )(GLenum pname, const GLint *params); -void ( APIENTRY * qglLightf )(GLenum light, GLenum pname, GLfloat param); -void ( APIENTRY * qglLightfv )(GLenum light, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglLighti )(GLenum light, GLenum pname, GLint param); -void ( APIENTRY * qglLightiv )(GLenum light, GLenum pname, const GLint *params); -void ( APIENTRY * qglLineStipple )(GLint factor, GLushort pattern); -void ( APIENTRY * qglLineWidth )(GLfloat width); -void ( APIENTRY * qglListBase )(GLuint base); -void ( APIENTRY * qglLoadIdentity )(void); -void ( APIENTRY * qglLoadMatrixd )(const GLdouble *m); -void ( APIENTRY * qglLoadMatrixf )(const GLfloat *m); -void ( APIENTRY * qglLoadName )(GLuint name); -void ( APIENTRY * qglLogicOp )(GLenum opcode); -void ( APIENTRY * qglMap1d )(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -void ( APIENTRY * qglMap1f )(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -void ( APIENTRY * qglMap2d )(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -void ( APIENTRY * qglMap2f )(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -void ( APIENTRY * qglMapGrid1d )(GLint un, GLdouble u1, GLdouble u2); -void ( APIENTRY * qglMapGrid1f )(GLint un, GLfloat u1, GLfloat u2); -void ( APIENTRY * qglMapGrid2d )(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); -void ( APIENTRY * qglMapGrid2f )(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); -void ( APIENTRY * qglMaterialf )(GLenum face, GLenum pname, GLfloat param); -void ( APIENTRY * qglMaterialfv )(GLenum face, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglMateriali )(GLenum face, GLenum pname, GLint param); -void ( APIENTRY * qglMaterialiv )(GLenum face, GLenum pname, const GLint *params); -void ( APIENTRY * qglMatrixMode )(GLenum mode); -void ( APIENTRY * qglMultMatrixd )(const GLdouble *m); -void ( APIENTRY * qglMultMatrixf )(const GLfloat *m); -void ( APIENTRY * qglNewList )(GLuint list, GLenum mode); -void ( APIENTRY * qglNormal3b )(GLbyte nx, GLbyte ny, GLbyte nz); -void ( APIENTRY * qglNormal3bv )(const GLbyte *v); -void ( APIENTRY * qglNormal3d )(GLdouble nx, GLdouble ny, GLdouble nz); -void ( APIENTRY * qglNormal3dv )(const GLdouble *v); -void ( APIENTRY * qglNormal3f )(GLfloat nx, GLfloat ny, GLfloat nz); -void ( APIENTRY * qglNormal3fv )(const GLfloat *v); -void ( APIENTRY * qglNormal3i )(GLint nx, GLint ny, GLint nz); -void ( APIENTRY * qglNormal3iv )(const GLint *v); -void ( APIENTRY * qglNormal3s )(GLshort nx, GLshort ny, GLshort nz); -void ( APIENTRY * qglNormal3sv )(const GLshort *v); -void ( APIENTRY * qglNormalPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglOrtho )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -void ( APIENTRY * qglPassThrough )(GLfloat token); -void ( APIENTRY * qglPixelMapfv )(GLenum map, GLsizei mapsize, const GLfloat *values); -void ( APIENTRY * qglPixelMapuiv )(GLenum map, GLsizei mapsize, const GLuint *values); -void ( APIENTRY * qglPixelMapusv )(GLenum map, GLsizei mapsize, const GLushort *values); -void ( APIENTRY * qglPixelStoref )(GLenum pname, GLfloat param); -void ( APIENTRY * qglPixelStorei )(GLenum pname, GLint param); -void ( APIENTRY * qglPixelTransferf )(GLenum pname, GLfloat param); -void ( APIENTRY * qglPixelTransferi )(GLenum pname, GLint param); -void ( APIENTRY * qglPixelZoom )(GLfloat xfactor, GLfloat yfactor); -void ( APIENTRY * qglPointSize )(GLfloat size); -void ( APIENTRY * qglPolygonMode )(GLenum face, GLenum mode); -void ( APIENTRY * qglPolygonOffset )(GLfloat factor, GLfloat units); -void ( APIENTRY * qglPolygonStipple )(const GLubyte *mask); -void ( APIENTRY * qglPopAttrib )(void); -void ( APIENTRY * qglPopClientAttrib )(void); -void ( APIENTRY * qglPopMatrix )(void); -void ( APIENTRY * qglPopName )(void); -void ( APIENTRY * qglPrioritizeTextures )(GLsizei n, const GLuint *textures, const GLclampf *priorities); -void ( APIENTRY * qglPushAttrib )(GLbitfield mask); -void ( APIENTRY * qglPushClientAttrib )(GLbitfield mask); -void ( APIENTRY * qglPushMatrix )(void); -void ( APIENTRY * qglPushName )(GLuint name); -void ( APIENTRY * qglRasterPos2d )(GLdouble x, GLdouble y); -void ( APIENTRY * qglRasterPos2dv )(const GLdouble *v); -void ( APIENTRY * qglRasterPos2f )(GLfloat x, GLfloat y); -void ( APIENTRY * qglRasterPos2fv )(const GLfloat *v); -void ( APIENTRY * qglRasterPos2i )(GLint x, GLint y); -void ( APIENTRY * qglRasterPos2iv )(const GLint *v); -void ( APIENTRY * qglRasterPos2s )(GLshort x, GLshort y); -void ( APIENTRY * qglRasterPos2sv )(const GLshort *v); -void ( APIENTRY * qglRasterPos3d )(GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglRasterPos3dv )(const GLdouble *v); -void ( APIENTRY * qglRasterPos3f )(GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglRasterPos3fv )(const GLfloat *v); -void ( APIENTRY * qglRasterPos3i )(GLint x, GLint y, GLint z); -void ( APIENTRY * qglRasterPos3iv )(const GLint *v); -void ( APIENTRY * qglRasterPos3s )(GLshort x, GLshort y, GLshort z); -void ( APIENTRY * qglRasterPos3sv )(const GLshort *v); -void ( APIENTRY * qglRasterPos4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -void ( APIENTRY * qglRasterPos4dv )(const GLdouble *v); -void ( APIENTRY * qglRasterPos4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -void ( APIENTRY * qglRasterPos4fv )(const GLfloat *v); -void ( APIENTRY * qglRasterPos4i )(GLint x, GLint y, GLint z, GLint w); -void ( APIENTRY * qglRasterPos4iv )(const GLint *v); -void ( APIENTRY * qglRasterPos4s )(GLshort x, GLshort y, GLshort z, GLshort w); -void ( APIENTRY * qglRasterPos4sv )(const GLshort *v); -void ( APIENTRY * qglReadBuffer )(GLenum mode); -void ( APIENTRY * qglReadPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); -void ( APIENTRY * qglRectd )(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); -void ( APIENTRY * qglRectdv )(const GLdouble *v1, const GLdouble *v2); -void ( APIENTRY * qglRectf )(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); -void ( APIENTRY * qglRectfv )(const GLfloat *v1, const GLfloat *v2); -void ( APIENTRY * qglRecti )(GLint x1, GLint y1, GLint x2, GLint y2); -void ( APIENTRY * qglRectiv )(const GLint *v1, const GLint *v2); -void ( APIENTRY * qglRects )(GLshort x1, GLshort y1, GLshort x2, GLshort y2); -void ( APIENTRY * qglRectsv )(const GLshort *v1, const GLshort *v2); -GLint ( APIENTRY * qglRenderMode )(GLenum mode); -void ( APIENTRY * qglRotated )(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglRotatef )(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglScaled )(GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglScalef )(GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglScissor )(GLint x, GLint y, GLsizei width, GLsizei height); -void ( APIENTRY * qglSelectBuffer )(GLsizei size, GLuint *buffer); -void ( APIENTRY * qglShadeModel )(GLenum mode); -void ( APIENTRY * qglStencilFunc )(GLenum func, GLint ref, GLuint mask); -void ( APIENTRY * qglStencilMask )(GLuint mask); -void ( APIENTRY * qglStencilOp )(GLenum fail, GLenum zfail, GLenum zpass); -void ( APIENTRY * qglTexCoord1d )(GLdouble s); -void ( APIENTRY * qglTexCoord1dv )(const GLdouble *v); -void ( APIENTRY * qglTexCoord1f )(GLfloat s); -void ( APIENTRY * qglTexCoord1fv )(const GLfloat *v); -void ( APIENTRY * qglTexCoord1i )(GLint s); -void ( APIENTRY * qglTexCoord1iv )(const GLint *v); -void ( APIENTRY * qglTexCoord1s )(GLshort s); -void ( APIENTRY * qglTexCoord1sv )(const GLshort *v); -void ( APIENTRY * qglTexCoord2d )(GLdouble s, GLdouble t); -void ( APIENTRY * qglTexCoord2dv )(const GLdouble *v); -void ( APIENTRY * qglTexCoord2f )(GLfloat s, GLfloat t); -void ( APIENTRY * qglTexCoord2fv )(const GLfloat *v); -void ( APIENTRY * qglTexCoord2i )(GLint s, GLint t); -void ( APIENTRY * qglTexCoord2iv )(const GLint *v); -void ( APIENTRY * qglTexCoord2s )(GLshort s, GLshort t); -void ( APIENTRY * qglTexCoord2sv )(const GLshort *v); -void ( APIENTRY * qglTexCoord3d )(GLdouble s, GLdouble t, GLdouble r); -void ( APIENTRY * qglTexCoord3dv )(const GLdouble *v); -void ( APIENTRY * qglTexCoord3f )(GLfloat s, GLfloat t, GLfloat r); -void ( APIENTRY * qglTexCoord3fv )(const GLfloat *v); -void ( APIENTRY * qglTexCoord3i )(GLint s, GLint t, GLint r); -void ( APIENTRY * qglTexCoord3iv )(const GLint *v); -void ( APIENTRY * qglTexCoord3s )(GLshort s, GLshort t, GLshort r); -void ( APIENTRY * qglTexCoord3sv )(const GLshort *v); -void ( APIENTRY * qglTexCoord4d )(GLdouble s, GLdouble t, GLdouble r, GLdouble q); -void ( APIENTRY * qglTexCoord4dv )(const GLdouble *v); -void ( APIENTRY * qglTexCoord4f )(GLfloat s, GLfloat t, GLfloat r, GLfloat q); -void ( APIENTRY * qglTexCoord4fv )(const GLfloat *v); -void ( APIENTRY * qglTexCoord4i )(GLint s, GLint t, GLint r, GLint q); -void ( APIENTRY * qglTexCoord4iv )(const GLint *v); -void ( APIENTRY * qglTexCoord4s )(GLshort s, GLshort t, GLshort r, GLshort q); -void ( APIENTRY * qglTexCoord4sv )(const GLshort *v); -void ( APIENTRY * qglTexCoordPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglTexEnvf )(GLenum target, GLenum pname, GLfloat param); -void ( APIENTRY * qglTexEnvfv )(GLenum target, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglTexEnvi )(GLenum target, GLenum pname, GLint param); -void ( APIENTRY * qglTexEnviv )(GLenum target, GLenum pname, const GLint *params); -void ( APIENTRY * qglTexGend )(GLenum coord, GLenum pname, GLdouble param); -void ( APIENTRY * qglTexGendv )(GLenum coord, GLenum pname, const GLdouble *params); -void ( APIENTRY * qglTexGenf )(GLenum coord, GLenum pname, GLfloat param); -void ( APIENTRY * qglTexGenfv )(GLenum coord, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglTexGeni )(GLenum coord, GLenum pname, GLint param); -void ( APIENTRY * qglTexGeniv )(GLenum coord, GLenum pname, const GLint *params); -void ( APIENTRY * qglTexImage1D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglTexImage2D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglTexParameterf )(GLenum target, GLenum pname, GLfloat param); -void ( APIENTRY * qglTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params); -void ( APIENTRY * qglTexParameteri )(GLenum target, GLenum pname, GLint param); -void ( APIENTRY * qglTexParameteriv )(GLenum target, GLenum pname, const GLint *params); -void ( APIENTRY * qglTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -void ( APIENTRY * qglTranslated )(GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglTranslatef )(GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglVertex2d )(GLdouble x, GLdouble y); -void ( APIENTRY * qglVertex2dv )(const GLdouble *v); -void ( APIENTRY * qglVertex2f )(GLfloat x, GLfloat y); -void ( APIENTRY * qglVertex2fv )(const GLfloat *v); -void ( APIENTRY * qglVertex2i )(GLint x, GLint y); -void ( APIENTRY * qglVertex2iv )(const GLint *v); -void ( APIENTRY * qglVertex2s )(GLshort x, GLshort y); -void ( APIENTRY * qglVertex2sv )(const GLshort *v); -void ( APIENTRY * qglVertex3d )(GLdouble x, GLdouble y, GLdouble z); -void ( APIENTRY * qglVertex3dv )(const GLdouble *v); -void ( APIENTRY * qglVertex3f )(GLfloat x, GLfloat y, GLfloat z); -void ( APIENTRY * qglVertex3fv )(const GLfloat *v); -void ( APIENTRY * qglVertex3i )(GLint x, GLint y, GLint z); -void ( APIENTRY * qglVertex3iv )(const GLint *v); -void ( APIENTRY * qglVertex3s )(GLshort x, GLshort y, GLshort z); -void ( APIENTRY * qglVertex3sv )(const GLshort *v); -void ( APIENTRY * qglVertex4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -void ( APIENTRY * qglVertex4dv )(const GLdouble *v); -void ( APIENTRY * qglVertex4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -void ( APIENTRY * qglVertex4fv )(const GLfloat *v); -void ( APIENTRY * qglVertex4i )(GLint x, GLint y, GLint z, GLint w); -void ( APIENTRY * qglVertex4iv )(const GLint *v); -void ( APIENTRY * qglVertex4s )(GLshort x, GLshort y, GLshort z, GLshort w); -void ( APIENTRY * qglVertex4sv )(const GLshort *v); -void ( APIENTRY * qglVertexPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -void ( APIENTRY * qglViewport )(GLint x, GLint y, GLsizei width, GLsizei height); - - - -static void ( APIENTRY * dllAccum )(GLenum op, GLfloat value); -static void ( APIENTRY * dllAlphaFunc )(GLenum func, GLclampf ref); -GLboolean ( APIENTRY * dllAreTexturesResident )(GLsizei n, const GLuint *textures, GLboolean *residences); -static void ( APIENTRY * dllArrayElement )(GLint i); -static void ( APIENTRY * dllBegin )(GLenum mode); -static void ( APIENTRY * dllBindTexture )(GLenum target, GLuint texture); -static void ( APIENTRY * dllBitmap )(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); -static void ( APIENTRY * dllBlendFunc )(GLenum sfactor, GLenum dfactor); -static void ( APIENTRY * dllCallList )(GLuint list); -static void ( APIENTRY * dllCallLists )(GLsizei n, GLenum type, const GLvoid *lists); -static void ( APIENTRY * dllClear )(GLbitfield mask); -static void ( APIENTRY * dllClearAccum )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -static void ( APIENTRY * dllClearColor )(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -static void ( APIENTRY * dllClearDepth )(GLclampd depth); -static void ( APIENTRY * dllClearIndex )(GLfloat c); -static void ( APIENTRY * dllClearStencil )(GLint s); -static void ( APIENTRY * dllClipPlane )(GLenum plane, const GLdouble *equation); -static void ( APIENTRY * dllColor3b )(GLbyte red, GLbyte green, GLbyte blue); -static void ( APIENTRY * dllColor3bv )(const GLbyte *v); -static void ( APIENTRY * dllColor3d )(GLdouble red, GLdouble green, GLdouble blue); -static void ( APIENTRY * dllColor3dv )(const GLdouble *v); -static void ( APIENTRY * dllColor3f )(GLfloat red, GLfloat green, GLfloat blue); -static void ( APIENTRY * dllColor3fv )(const GLfloat *v); -static void ( APIENTRY * dllColor3i )(GLint red, GLint green, GLint blue); -static void ( APIENTRY * dllColor3iv )(const GLint *v); -static void ( APIENTRY * dllColor3s )(GLshort red, GLshort green, GLshort blue); -static void ( APIENTRY * dllColor3sv )(const GLshort *v); -static void ( APIENTRY * dllColor3ub )(GLubyte red, GLubyte green, GLubyte blue); -static void ( APIENTRY * dllColor3ubv )(const GLubyte *v); -static void ( APIENTRY * dllColor3ui )(GLuint red, GLuint green, GLuint blue); -static void ( APIENTRY * dllColor3uiv )(const GLuint *v); -static void ( APIENTRY * dllColor3us )(GLushort red, GLushort green, GLushort blue); -static void ( APIENTRY * dllColor3usv )(const GLushort *v); -static void ( APIENTRY * dllColor4b )(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); -static void ( APIENTRY * dllColor4bv )(const GLbyte *v); -static void ( APIENTRY * dllColor4d )(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); -static void ( APIENTRY * dllColor4dv )(const GLdouble *v); -static void ( APIENTRY * dllColor4f )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -static void ( APIENTRY * dllColor4fv )(const GLfloat *v); -static void ( APIENTRY * dllColor4i )(GLint red, GLint green, GLint blue, GLint alpha); -static void ( APIENTRY * dllColor4iv )(const GLint *v); -static void ( APIENTRY * dllColor4s )(GLshort red, GLshort green, GLshort blue, GLshort alpha); -static void ( APIENTRY * dllColor4sv )(const GLshort *v); -static void ( APIENTRY * dllColor4ub )(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -static void ( APIENTRY * dllColor4ubv )(const GLubyte *v); -static void ( APIENTRY * dllColor4ui )(GLuint red, GLuint green, GLuint blue, GLuint alpha); -static void ( APIENTRY * dllColor4uiv )(const GLuint *v); -static void ( APIENTRY * dllColor4us )(GLushort red, GLushort green, GLushort blue, GLushort alpha); -static void ( APIENTRY * dllColor4usv )(const GLushort *v); -static void ( APIENTRY * dllColorMask )(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -static void ( APIENTRY * dllColorMaterial )(GLenum face, GLenum mode); -static void ( APIENTRY * dllColorPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllCopyPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -static void ( APIENTRY * dllCopyTexImage1D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); -static void ( APIENTRY * dllCopyTexImage2D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -static void ( APIENTRY * dllCopyTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -static void ( APIENTRY * dllCopyTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -static void ( APIENTRY * dllCullFace )(GLenum mode); -static void ( APIENTRY * dllDeleteLists )(GLuint list, GLsizei range); -static void ( APIENTRY * dllDeleteTextures )(GLsizei n, const GLuint *textures); -static void ( APIENTRY * dllDepthFunc )(GLenum func); -static void ( APIENTRY * dllDepthMask )(GLboolean flag); -static void ( APIENTRY * dllDepthRange )(GLclampd zNear, GLclampd zFar); -static void ( APIENTRY * dllDisable )(GLenum cap); -static void ( APIENTRY * dllDisableClientState )(GLenum array); -static void ( APIENTRY * dllDrawArrays )(GLenum mode, GLint first, GLsizei count); -static void ( APIENTRY * dllDrawBuffer )(GLenum mode); -static void ( APIENTRY * dllDrawElements )(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -static void ( APIENTRY * dllDrawPixels )(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllEdgeFlag )(GLboolean flag); -static void ( APIENTRY * dllEdgeFlagPointer )(GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllEdgeFlagv )(const GLboolean *flag); -static void ( APIENTRY * dllEnable )(GLenum cap); -static void ( APIENTRY * dllEnableClientState )(GLenum array); -static void ( APIENTRY * dllEnd )(void); -static void ( APIENTRY * dllEndList )(void); -static void ( APIENTRY * dllEvalCoord1d )(GLdouble u); -static void ( APIENTRY * dllEvalCoord1dv )(const GLdouble *u); -static void ( APIENTRY * dllEvalCoord1f )(GLfloat u); -static void ( APIENTRY * dllEvalCoord1fv )(const GLfloat *u); -static void ( APIENTRY * dllEvalCoord2d )(GLdouble u, GLdouble v); -static void ( APIENTRY * dllEvalCoord2dv )(const GLdouble *u); -static void ( APIENTRY * dllEvalCoord2f )(GLfloat u, GLfloat v); -static void ( APIENTRY * dllEvalCoord2fv )(const GLfloat *u); -static void ( APIENTRY * dllEvalMesh1 )(GLenum mode, GLint i1, GLint i2); -static void ( APIENTRY * dllEvalMesh2 )(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); -static void ( APIENTRY * dllEvalPoint1 )(GLint i); -static void ( APIENTRY * dllEvalPoint2 )(GLint i, GLint j); -static void ( APIENTRY * dllFeedbackBuffer )(GLsizei size, GLenum type, GLfloat *buffer); -static void ( APIENTRY * dllFinish )(void); -static void ( APIENTRY * dllFlush )(void); -static void ( APIENTRY * dllFogf )(GLenum pname, GLfloat param); -static void ( APIENTRY * dllFogfv )(GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllFogi )(GLenum pname, GLint param); -static void ( APIENTRY * dllFogiv )(GLenum pname, const GLint *params); -static void ( APIENTRY * dllFrontFace )(GLenum mode); -static void ( APIENTRY * dllFrustum )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLuint ( APIENTRY * dllGenLists )(GLsizei range); -static void ( APIENTRY * dllGenTextures )(GLsizei n, GLuint *textures); -static void ( APIENTRY * dllGetBooleanv )(GLenum pname, GLboolean *params); -static void ( APIENTRY * dllGetClipPlane )(GLenum plane, GLdouble *equation); -static void ( APIENTRY * dllGetDoublev )(GLenum pname, GLdouble *params); -GLenum ( APIENTRY * dllGetError )(void); -static void ( APIENTRY * dllGetFloatv )(GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetIntegerv )(GLenum pname, GLint *params); -static void ( APIENTRY * dllGetLightfv )(GLenum light, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetLightiv )(GLenum light, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetMapdv )(GLenum target, GLenum query, GLdouble *v); -static void ( APIENTRY * dllGetMapfv )(GLenum target, GLenum query, GLfloat *v); -static void ( APIENTRY * dllGetMapiv )(GLenum target, GLenum query, GLint *v); -static void ( APIENTRY * dllGetMaterialfv )(GLenum face, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetMaterialiv )(GLenum face, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetPixelMapfv )(GLenum map, GLfloat *values); -static void ( APIENTRY * dllGetPixelMapuiv )(GLenum map, GLuint *values); -static void ( APIENTRY * dllGetPixelMapusv )(GLenum map, GLushort *values); -static void ( APIENTRY * dllGetPointerv )(GLenum pname, GLvoid* *params); -static void ( APIENTRY * dllGetPolygonStipple )(GLubyte *mask); -const GLubyte * ( APIENTRY * dllGetString )(GLenum name); -static void ( APIENTRY * dllGetTexEnvfv )(GLenum target, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetTexEnviv )(GLenum target, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetTexGendv )(GLenum coord, GLenum pname, GLdouble *params); -static void ( APIENTRY * dllGetTexGenfv )(GLenum coord, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetTexGeniv )(GLenum coord, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetTexImage )(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -static void ( APIENTRY * dllGetTexLevelParameterfv )(GLenum target, GLint level, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetTexLevelParameteriv )(GLenum target, GLint level, GLenum pname, GLint *params); -static void ( APIENTRY * dllGetTexParameterfv )(GLenum target, GLenum pname, GLfloat *params); -static void ( APIENTRY * dllGetTexParameteriv )(GLenum target, GLenum pname, GLint *params); -static void ( APIENTRY * dllHint )(GLenum target, GLenum mode); -static void ( APIENTRY * dllIndexMask )(GLuint mask); -static void ( APIENTRY * dllIndexPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllIndexd )(GLdouble c); -static void ( APIENTRY * dllIndexdv )(const GLdouble *c); -static void ( APIENTRY * dllIndexf )(GLfloat c); -static void ( APIENTRY * dllIndexfv )(const GLfloat *c); -static void ( APIENTRY * dllIndexi )(GLint c); -static void ( APIENTRY * dllIndexiv )(const GLint *c); -static void ( APIENTRY * dllIndexs )(GLshort c); -static void ( APIENTRY * dllIndexsv )(const GLshort *c); -static void ( APIENTRY * dllIndexub )(GLubyte c); -static void ( APIENTRY * dllIndexubv )(const GLubyte *c); -static void ( APIENTRY * dllInitNames )(void); -static void ( APIENTRY * dllInterleavedArrays )(GLenum format, GLsizei stride, const GLvoid *pointer); -GLboolean ( APIENTRY * dllIsEnabled )(GLenum cap); -GLboolean ( APIENTRY * dllIsList )(GLuint list); -GLboolean ( APIENTRY * dllIsTexture )(GLuint texture); -static void ( APIENTRY * dllLightModelf )(GLenum pname, GLfloat param); -static void ( APIENTRY * dllLightModelfv )(GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllLightModeli )(GLenum pname, GLint param); -static void ( APIENTRY * dllLightModeliv )(GLenum pname, const GLint *params); -static void ( APIENTRY * dllLightf )(GLenum light, GLenum pname, GLfloat param); -static void ( APIENTRY * dllLightfv )(GLenum light, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllLighti )(GLenum light, GLenum pname, GLint param); -static void ( APIENTRY * dllLightiv )(GLenum light, GLenum pname, const GLint *params); -static void ( APIENTRY * dllLineStipple )(GLint factor, GLushort pattern); -static void ( APIENTRY * dllLineWidth )(GLfloat width); -static void ( APIENTRY * dllListBase )(GLuint base); -static void ( APIENTRY * dllLoadIdentity )(void); -static void ( APIENTRY * dllLoadMatrixd )(const GLdouble *m); -static void ( APIENTRY * dllLoadMatrixf )(const GLfloat *m); -static void ( APIENTRY * dllLoadName )(GLuint name); -static void ( APIENTRY * dllLogicOp )(GLenum opcode); -static void ( APIENTRY * dllMap1d )(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -static void ( APIENTRY * dllMap1f )(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -static void ( APIENTRY * dllMap2d )(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -static void ( APIENTRY * dllMap2f )(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -static void ( APIENTRY * dllMapGrid1d )(GLint un, GLdouble u1, GLdouble u2); -static void ( APIENTRY * dllMapGrid1f )(GLint un, GLfloat u1, GLfloat u2); -static void ( APIENTRY * dllMapGrid2d )(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); -static void ( APIENTRY * dllMapGrid2f )(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); -static void ( APIENTRY * dllMaterialf )(GLenum face, GLenum pname, GLfloat param); -static void ( APIENTRY * dllMaterialfv )(GLenum face, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllMateriali )(GLenum face, GLenum pname, GLint param); -static void ( APIENTRY * dllMaterialiv )(GLenum face, GLenum pname, const GLint *params); -static void ( APIENTRY * dllMatrixMode )(GLenum mode); -static void ( APIENTRY * dllMultMatrixd )(const GLdouble *m); -static void ( APIENTRY * dllMultMatrixf )(const GLfloat *m); -static void ( APIENTRY * dllNewList )(GLuint list, GLenum mode); -static void ( APIENTRY * dllNormal3b )(GLbyte nx, GLbyte ny, GLbyte nz); -static void ( APIENTRY * dllNormal3bv )(const GLbyte *v); -static void ( APIENTRY * dllNormal3d )(GLdouble nx, GLdouble ny, GLdouble nz); -static void ( APIENTRY * dllNormal3dv )(const GLdouble *v); -static void ( APIENTRY * dllNormal3f )(GLfloat nx, GLfloat ny, GLfloat nz); -static void ( APIENTRY * dllNormal3fv )(const GLfloat *v); -static void ( APIENTRY * dllNormal3i )(GLint nx, GLint ny, GLint nz); -static void ( APIENTRY * dllNormal3iv )(const GLint *v); -static void ( APIENTRY * dllNormal3s )(GLshort nx, GLshort ny, GLshort nz); -static void ( APIENTRY * dllNormal3sv )(const GLshort *v); -static void ( APIENTRY * dllNormalPointer )(GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllOrtho )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -static void ( APIENTRY * dllPassThrough )(GLfloat token); -static void ( APIENTRY * dllPixelMapfv )(GLenum map, GLsizei mapsize, const GLfloat *values); -static void ( APIENTRY * dllPixelMapuiv )(GLenum map, GLsizei mapsize, const GLuint *values); -static void ( APIENTRY * dllPixelMapusv )(GLenum map, GLsizei mapsize, const GLushort *values); -static void ( APIENTRY * dllPixelStoref )(GLenum pname, GLfloat param); -static void ( APIENTRY * dllPixelStorei )(GLenum pname, GLint param); -static void ( APIENTRY * dllPixelTransferf )(GLenum pname, GLfloat param); -static void ( APIENTRY * dllPixelTransferi )(GLenum pname, GLint param); -static void ( APIENTRY * dllPixelZoom )(GLfloat xfactor, GLfloat yfactor); -static void ( APIENTRY * dllPointSize )(GLfloat size); -static void ( APIENTRY * dllPolygonMode )(GLenum face, GLenum mode); -static void ( APIENTRY * dllPolygonOffset )(GLfloat factor, GLfloat units); -static void ( APIENTRY * dllPolygonStipple )(const GLubyte *mask); -static void ( APIENTRY * dllPopAttrib )(void); -static void ( APIENTRY * dllPopClientAttrib )(void); -static void ( APIENTRY * dllPopMatrix )(void); -static void ( APIENTRY * dllPopName )(void); -static void ( APIENTRY * dllPrioritizeTextures )(GLsizei n, const GLuint *textures, const GLclampf *priorities); -static void ( APIENTRY * dllPushAttrib )(GLbitfield mask); -static void ( APIENTRY * dllPushClientAttrib )(GLbitfield mask); -static void ( APIENTRY * dllPushMatrix )(void); -static void ( APIENTRY * dllPushName )(GLuint name); -static void ( APIENTRY * dllRasterPos2d )(GLdouble x, GLdouble y); -static void ( APIENTRY * dllRasterPos2dv )(const GLdouble *v); -static void ( APIENTRY * dllRasterPos2f )(GLfloat x, GLfloat y); -static void ( APIENTRY * dllRasterPos2fv )(const GLfloat *v); -static void ( APIENTRY * dllRasterPos2i )(GLint x, GLint y); -static void ( APIENTRY * dllRasterPos2iv )(const GLint *v); -static void ( APIENTRY * dllRasterPos2s )(GLshort x, GLshort y); -static void ( APIENTRY * dllRasterPos2sv )(const GLshort *v); -static void ( APIENTRY * dllRasterPos3d )(GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllRasterPos3dv )(const GLdouble *v); -static void ( APIENTRY * dllRasterPos3f )(GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllRasterPos3fv )(const GLfloat *v); -static void ( APIENTRY * dllRasterPos3i )(GLint x, GLint y, GLint z); -static void ( APIENTRY * dllRasterPos3iv )(const GLint *v); -static void ( APIENTRY * dllRasterPos3s )(GLshort x, GLshort y, GLshort z); -static void ( APIENTRY * dllRasterPos3sv )(const GLshort *v); -static void ( APIENTRY * dllRasterPos4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -static void ( APIENTRY * dllRasterPos4dv )(const GLdouble *v); -static void ( APIENTRY * dllRasterPos4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -static void ( APIENTRY * dllRasterPos4fv )(const GLfloat *v); -static void ( APIENTRY * dllRasterPos4i )(GLint x, GLint y, GLint z, GLint w); -static void ( APIENTRY * dllRasterPos4iv )(const GLint *v); -static void ( APIENTRY * dllRasterPos4s )(GLshort x, GLshort y, GLshort z, GLshort w); -static void ( APIENTRY * dllRasterPos4sv )(const GLshort *v); -static void ( APIENTRY * dllReadBuffer )(GLenum mode); -static void ( APIENTRY * dllReadPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); -static void ( APIENTRY * dllRectd )(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); -static void ( APIENTRY * dllRectdv )(const GLdouble *v1, const GLdouble *v2); -static void ( APIENTRY * dllRectf )(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); -static void ( APIENTRY * dllRectfv )(const GLfloat *v1, const GLfloat *v2); -static void ( APIENTRY * dllRecti )(GLint x1, GLint y1, GLint x2, GLint y2); -static void ( APIENTRY * dllRectiv )(const GLint *v1, const GLint *v2); -static void ( APIENTRY * dllRects )(GLshort x1, GLshort y1, GLshort x2, GLshort y2); -static void ( APIENTRY * dllRectsv )(const GLshort *v1, const GLshort *v2); -GLint ( APIENTRY * dllRenderMode )(GLenum mode); -static void ( APIENTRY * dllRotated )(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllRotatef )(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllScaled )(GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllScalef )(GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllScissor )(GLint x, GLint y, GLsizei width, GLsizei height); -static void ( APIENTRY * dllSelectBuffer )(GLsizei size, GLuint *buffer); -static void ( APIENTRY * dllShadeModel )(GLenum mode); -static void ( APIENTRY * dllStencilFunc )(GLenum func, GLint ref, GLuint mask); -static void ( APIENTRY * dllStencilMask )(GLuint mask); -static void ( APIENTRY * dllStencilOp )(GLenum fail, GLenum zfail, GLenum zpass); -static void ( APIENTRY * dllTexCoord1d )(GLdouble s); -static void ( APIENTRY * dllTexCoord1dv )(const GLdouble *v); -static void ( APIENTRY * dllTexCoord1f )(GLfloat s); -static void ( APIENTRY * dllTexCoord1fv )(const GLfloat *v); -static void ( APIENTRY * dllTexCoord1i )(GLint s); -static void ( APIENTRY * dllTexCoord1iv )(const GLint *v); -static void ( APIENTRY * dllTexCoord1s )(GLshort s); -static void ( APIENTRY * dllTexCoord1sv )(const GLshort *v); -static void ( APIENTRY * dllTexCoord2d )(GLdouble s, GLdouble t); -static void ( APIENTRY * dllTexCoord2dv )(const GLdouble *v); -static void ( APIENTRY * dllTexCoord2f )(GLfloat s, GLfloat t); -static void ( APIENTRY * dllTexCoord2fv )(const GLfloat *v); -static void ( APIENTRY * dllTexCoord2i )(GLint s, GLint t); -static void ( APIENTRY * dllTexCoord2iv )(const GLint *v); -static void ( APIENTRY * dllTexCoord2s )(GLshort s, GLshort t); -static void ( APIENTRY * dllTexCoord2sv )(const GLshort *v); -static void ( APIENTRY * dllTexCoord3d )(GLdouble s, GLdouble t, GLdouble r); -static void ( APIENTRY * dllTexCoord3dv )(const GLdouble *v); -static void ( APIENTRY * dllTexCoord3f )(GLfloat s, GLfloat t, GLfloat r); -static void ( APIENTRY * dllTexCoord3fv )(const GLfloat *v); -static void ( APIENTRY * dllTexCoord3i )(GLint s, GLint t, GLint r); -static void ( APIENTRY * dllTexCoord3iv )(const GLint *v); -static void ( APIENTRY * dllTexCoord3s )(GLshort s, GLshort t, GLshort r); -static void ( APIENTRY * dllTexCoord3sv )(const GLshort *v); -static void ( APIENTRY * dllTexCoord4d )(GLdouble s, GLdouble t, GLdouble r, GLdouble q); -static void ( APIENTRY * dllTexCoord4dv )(const GLdouble *v); -static void ( APIENTRY * dllTexCoord4f )(GLfloat s, GLfloat t, GLfloat r, GLfloat q); -static void ( APIENTRY * dllTexCoord4fv )(const GLfloat *v); -static void ( APIENTRY * dllTexCoord4i )(GLint s, GLint t, GLint r, GLint q); -static void ( APIENTRY * dllTexCoord4iv )(const GLint *v); -static void ( APIENTRY * dllTexCoord4s )(GLshort s, GLshort t, GLshort r, GLshort q); -static void ( APIENTRY * dllTexCoord4sv )(const GLshort *v); -static void ( APIENTRY * dllTexCoordPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllTexEnvf )(GLenum target, GLenum pname, GLfloat param); -static void ( APIENTRY * dllTexEnvfv )(GLenum target, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllTexEnvi )(GLenum target, GLenum pname, GLint param); -static void ( APIENTRY * dllTexEnviv )(GLenum target, GLenum pname, const GLint *params); -static void ( APIENTRY * dllTexGend )(GLenum coord, GLenum pname, GLdouble param); -static void ( APIENTRY * dllTexGendv )(GLenum coord, GLenum pname, const GLdouble *params); -static void ( APIENTRY * dllTexGenf )(GLenum coord, GLenum pname, GLfloat param); -static void ( APIENTRY * dllTexGenfv )(GLenum coord, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllTexGeni )(GLenum coord, GLenum pname, GLint param); -static void ( APIENTRY * dllTexGeniv )(GLenum coord, GLenum pname, const GLint *params); -static void ( APIENTRY * dllTexImage1D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllTexImage2D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllTexParameterf )(GLenum target, GLenum pname, GLfloat param); -static void ( APIENTRY * dllTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params); -static void ( APIENTRY * dllTexParameteri )(GLenum target, GLenum pname, GLint param); -static void ( APIENTRY * dllTexParameteriv )(GLenum target, GLenum pname, const GLint *params); -static void ( APIENTRY * dllTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -static void ( APIENTRY * dllTranslated )(GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllTranslatef )(GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllVertex2d )(GLdouble x, GLdouble y); -static void ( APIENTRY * dllVertex2dv )(const GLdouble *v); -static void ( APIENTRY * dllVertex2f )(GLfloat x, GLfloat y); -static void ( APIENTRY * dllVertex2fv )(const GLfloat *v); -static void ( APIENTRY * dllVertex2i )(GLint x, GLint y); -static void ( APIENTRY * dllVertex2iv )(const GLint *v); -static void ( APIENTRY * dllVertex2s )(GLshort x, GLshort y); -static void ( APIENTRY * dllVertex2sv )(const GLshort *v); -static void ( APIENTRY * dllVertex3d )(GLdouble x, GLdouble y, GLdouble z); -static void ( APIENTRY * dllVertex3dv )(const GLdouble *v); -static void ( APIENTRY * dllVertex3f )(GLfloat x, GLfloat y, GLfloat z); -static void ( APIENTRY * dllVertex3fv )(const GLfloat *v); -static void ( APIENTRY * dllVertex3i )(GLint x, GLint y, GLint z); -static void ( APIENTRY * dllVertex3iv )(const GLint *v); -static void ( APIENTRY * dllVertex3s )(GLshort x, GLshort y, GLshort z); -static void ( APIENTRY * dllVertex3sv )(const GLshort *v); -static void ( APIENTRY * dllVertex4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -static void ( APIENTRY * dllVertex4dv )(const GLdouble *v); -static void ( APIENTRY * dllVertex4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -static void ( APIENTRY * dllVertex4fv )(const GLfloat *v); -static void ( APIENTRY * dllVertex4i )(GLint x, GLint y, GLint z, GLint w); -static void ( APIENTRY * dllVertex4iv )(const GLint *v); -static void ( APIENTRY * dllVertex4s )(GLshort x, GLshort y, GLshort z, GLshort w); -static void ( APIENTRY * dllVertex4sv )(const GLshort *v); -static void ( APIENTRY * dllVertexPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static void ( APIENTRY * dllViewport )(GLint x, GLint y, GLsizei width, GLsizei height); - -typedef struct { - GLenum e; - const char *name; -} glEnumName_t; - -#define DEF(x) { x, #x }, - -glEnumName_t glEnumNames[] = { -DEF(GL_FALSE) -DEF(GL_TRUE) - - { GL_BYTE, "GL_BYTE" }, - { GL_UNSIGNED_BYTE, "GL_UNSIGNED_BYTE" }, - { GL_SHORT, "GL_SHORT" }, - { GL_UNSIGNED_SHORT, "GL_UNSIGNED_SHORT" }, - { GL_INT, "GL_INT" }, - { GL_UNSIGNED_INT, "GL_UNSIGNED_INT" }, - { GL_FLOAT, "GL_FLOAT" }, - { GL_DOUBLE, "GL_DOUBLE" }, - - { GL_TEXTURE_CUBE_MAP_EXT, "GL_TEXTURE_CUBE_MAP_EXT" }, - { GL_TEXTURE_3D, "GL_TEXTURE_3D" }, - { GL_TEXTURE_2D, "GL_TEXTURE_2D" }, - { GL_BLEND, "GL_BLEND" }, - { GL_DEPTH_TEST, "GL_DEPTH_TEST" }, - { GL_CULL_FACE, "GL_CULL_FACE" }, - { GL_CLIP_PLANE0, "GL_CLIP_PLANE0" }, - { GL_COLOR_ARRAY, "GL_COLOR_ARRAY" }, - { GL_TEXTURE_COORD_ARRAY, "GL_TEXTURE_COORD_ARRAY" }, - { GL_VERTEX_ARRAY, "GL_VERTEX_ARRAY" }, - { GL_ALPHA_TEST, "GL_ALPHA_TEST" }, - { GL_TEXTURE_GEN_S, "GL_TEXTURE_GEN_S" }, - { GL_TEXTURE_GEN_T, "GL_TEXTURE_GEN_T" }, - { GL_TEXTURE_GEN_R, "GL_TEXTURE_GEN_R" }, - { GL_TEXTURE_GEN_Q, "GL_TEXTURE_GEN_Q" }, - { GL_STENCIL_TEST, "GL_STENCIL_TEST" }, - { GL_POLYGON_OFFSET_FILL, "GL_POLYGON_OFFSET_FILL" }, - - { GL_TRIANGLES, "GL_TRIANGLES" }, - { GL_TRIANGLE_STRIP, "GL_TRIANGLE_STRIP" }, - { GL_TRIANGLE_FAN, "GL_TRIANGLE_FAN" }, - { GL_QUADS, "GL_QUADS" }, - { GL_QUAD_STRIP, "GL_QUAD_STRIP" }, - { GL_POLYGON, "GL_POLYGON" }, - { GL_POINTS, "GL_POINTS" }, - { GL_LINES, "GL_LINES" }, - { GL_LINE_STRIP, "GL_LINE_STRIP" }, - { GL_LINE_LOOP, "GL_LINE_LOOP" }, - - { GL_ALWAYS, "GL_ALWAYS" }, - { GL_NEVER, "GL_NEVER" }, - { GL_LEQUAL, "GL_LEQUAL" }, - { GL_LESS, "GL_LESS" }, - { GL_EQUAL, "GL_EQUAL" }, - { GL_GREATER, "GL_GREATER" }, - { GL_GEQUAL, "GL_GEQUAL" }, - { GL_NOTEQUAL, "GL_NOTEQUAL" }, - - { GL_ONE, "GL_ONE" }, - { GL_ZERO, "GL_ZERO" }, - { GL_SRC_ALPHA, "GL_SRC_ALPHA" }, - { GL_ONE_MINUS_SRC_ALPHA, "GL_ONE_MINUS_SRC_ALPHA" }, - { GL_DST_COLOR, "GL_DST_COLOR" }, - { GL_ONE_MINUS_DST_COLOR, "GL_ONE_MINUS_DST_COLOR" }, - { GL_DST_ALPHA, "GL_DST_ALPHA" }, - - { GL_MODELVIEW, "GL_MODELVIEW" }, - { GL_PROJECTION, "GL_PROJECTION" }, - { GL_TEXTURE, "GL_TEXTURE" }, - -/* DrawBufferMode */ -DEF(GL_NONE) -DEF(GL_FRONT_LEFT) -DEF(GL_FRONT_RIGHT) -DEF(GL_BACK_LEFT) -DEF(GL_BACK_RIGHT) -DEF(GL_FRONT) -DEF(GL_BACK) -DEF(GL_LEFT) -DEF(GL_RIGHT) -DEF(GL_FRONT_AND_BACK) -DEF(GL_AUX0) -DEF(GL_AUX1) -DEF(GL_AUX2) -DEF(GL_AUX3) - -/* GetTarget */ -DEF(GL_CURRENT_COLOR) -DEF(GL_CURRENT_INDEX) -DEF(GL_CURRENT_NORMAL) -DEF(GL_CURRENT_TEXTURE_COORDS) -DEF(GL_CURRENT_RASTER_COLOR) -DEF(GL_CURRENT_RASTER_INDEX) -DEF(GL_CURRENT_RASTER_TEXTURE_COORDS) -DEF(GL_CURRENT_RASTER_POSITION) -DEF(GL_CURRENT_RASTER_POSITION_VALID) -DEF(GL_CURRENT_RASTER_DISTANCE) -DEF(GL_POINT_SMOOTH) -DEF(GL_POINT_SIZE) -DEF(GL_POINT_SIZE_RANGE) -DEF(GL_POINT_SIZE_GRANULARITY) -DEF(GL_LINE_SMOOTH) -DEF(GL_LINE_WIDTH) -DEF(GL_LINE_WIDTH_RANGE) -DEF(GL_LINE_WIDTH_GRANULARITY) -DEF(GL_LINE_STIPPLE) -DEF(GL_LINE_STIPPLE_PATTERN) -DEF(GL_LINE_STIPPLE_REPEAT) -DEF(GL_LIST_MODE) -DEF(GL_MAX_LIST_NESTING) -DEF(GL_LIST_BASE) -DEF(GL_LIST_INDEX) -DEF(GL_POLYGON_MODE) -DEF(GL_POLYGON_SMOOTH) -DEF(GL_POLYGON_STIPPLE) -DEF(GL_EDGE_FLAG) -DEF(GL_CULL_FACE) -DEF(GL_CULL_FACE_MODE) -DEF(GL_FRONT_FACE) -DEF(GL_LIGHTING) -DEF(GL_LIGHT_MODEL_LOCAL_VIEWER) -DEF(GL_LIGHT_MODEL_TWO_SIDE) -DEF(GL_LIGHT_MODEL_AMBIENT) -DEF(GL_SHADE_MODEL) -DEF(GL_COLOR_MATERIAL_FACE) -DEF(GL_COLOR_MATERIAL_PARAMETER) -DEF(GL_COLOR_MATERIAL) -DEF(GL_FOG) -DEF(GL_FOG_INDEX) -DEF(GL_FOG_DENSITY) -DEF(GL_FOG_START) -DEF(GL_FOG_END) -DEF(GL_FOG_MODE) -DEF(GL_FOG_COLOR) -DEF(GL_DEPTH_RANGE) -DEF(GL_DEPTH_TEST) -DEF(GL_DEPTH_WRITEMASK) -DEF(GL_DEPTH_CLEAR_VALUE) -DEF(GL_DEPTH_FUNC) -DEF(GL_ACCUM_CLEAR_VALUE) -DEF(GL_STENCIL_TEST) -DEF(GL_STENCIL_CLEAR_VALUE) -DEF(GL_STENCIL_FUNC) -DEF(GL_STENCIL_VALUE_MASK) -DEF(GL_STENCIL_FAIL) -DEF(GL_STENCIL_PASS_DEPTH_FAIL) -DEF(GL_STENCIL_PASS_DEPTH_PASS) -DEF(GL_STENCIL_REF) -DEF(GL_STENCIL_WRITEMASK) -DEF(GL_MATRIX_MODE) -DEF(GL_NORMALIZE) -DEF(GL_VIEWPORT) -DEF(GL_MODELVIEW_STACK_DEPTH) -DEF(GL_PROJECTION_STACK_DEPTH) -DEF(GL_TEXTURE_STACK_DEPTH) -DEF(GL_MODELVIEW_MATRIX) -DEF(GL_PROJECTION_MATRIX) -DEF(GL_TEXTURE_MATRIX) -DEF(GL_ATTRIB_STACK_DEPTH) -DEF(GL_CLIENT_ATTRIB_STACK_DEPTH) -DEF(GL_ALPHA_TEST) -DEF(GL_ALPHA_TEST_FUNC) -DEF(GL_ALPHA_TEST_REF) -DEF(GL_DITHER) -DEF(GL_BLEND_DST) -DEF(GL_BLEND_SRC) -DEF(GL_BLEND) -DEF(GL_LOGIC_OP_MODE) -DEF(GL_INDEX_LOGIC_OP) -DEF(GL_COLOR_LOGIC_OP) -DEF(GL_AUX_BUFFERS) -DEF(GL_DRAW_BUFFER) -DEF(GL_READ_BUFFER) -DEF(GL_SCISSOR_BOX) -DEF(GL_SCISSOR_TEST) -DEF(GL_INDEX_CLEAR_VALUE) -DEF(GL_INDEX_WRITEMASK) -DEF(GL_COLOR_CLEAR_VALUE) -DEF(GL_COLOR_WRITEMASK) -DEF(GL_INDEX_MODE) -DEF(GL_RGBA_MODE) -DEF(GL_DOUBLEBUFFER) -DEF(GL_STEREO) -DEF(GL_RENDER_MODE) -DEF(GL_PERSPECTIVE_CORRECTION_HINT) -DEF(GL_POINT_SMOOTH_HINT) -DEF(GL_LINE_SMOOTH_HINT) -DEF(GL_POLYGON_SMOOTH_HINT) -DEF(GL_FOG_HINT) -DEF(GL_TEXTURE_GEN_S) -DEF(GL_TEXTURE_GEN_T) -DEF(GL_TEXTURE_GEN_R) -DEF(GL_TEXTURE_GEN_Q) -DEF(GL_PIXEL_MAP_I_TO_I) -DEF(GL_PIXEL_MAP_S_TO_S) -DEF(GL_PIXEL_MAP_I_TO_R) -DEF(GL_PIXEL_MAP_I_TO_G) -DEF(GL_PIXEL_MAP_I_TO_B) -DEF(GL_PIXEL_MAP_I_TO_A) -DEF(GL_PIXEL_MAP_R_TO_R) -DEF(GL_PIXEL_MAP_G_TO_G) -DEF(GL_PIXEL_MAP_B_TO_B) -DEF(GL_PIXEL_MAP_A_TO_A) -DEF(GL_PIXEL_MAP_I_TO_I_SIZE) -DEF(GL_PIXEL_MAP_S_TO_S_SIZE) -DEF(GL_PIXEL_MAP_I_TO_R_SIZE) -DEF(GL_PIXEL_MAP_I_TO_G_SIZE) -DEF(GL_PIXEL_MAP_I_TO_B_SIZE) -DEF(GL_PIXEL_MAP_I_TO_A_SIZE) -DEF(GL_PIXEL_MAP_R_TO_R_SIZE) -DEF(GL_PIXEL_MAP_G_TO_G_SIZE) -DEF(GL_PIXEL_MAP_B_TO_B_SIZE) -DEF(GL_PIXEL_MAP_A_TO_A_SIZE) -DEF(GL_UNPACK_SWAP_BYTES) -DEF(GL_UNPACK_LSB_FIRST) -DEF(GL_UNPACK_ROW_LENGTH) -DEF(GL_UNPACK_SKIP_ROWS) -DEF(GL_UNPACK_SKIP_PIXELS) -DEF(GL_UNPACK_ALIGNMENT) -DEF(GL_PACK_SWAP_BYTES) -DEF(GL_PACK_LSB_FIRST) -DEF(GL_PACK_ROW_LENGTH) -DEF(GL_PACK_SKIP_ROWS) -DEF(GL_PACK_SKIP_PIXELS) -DEF(GL_PACK_ALIGNMENT) -DEF(GL_MAP_COLOR) -DEF(GL_MAP_STENCIL) -DEF(GL_INDEX_SHIFT) -DEF(GL_INDEX_OFFSET) -DEF(GL_RED_SCALE) -DEF(GL_RED_BIAS) -DEF(GL_ZOOM_X) -DEF(GL_ZOOM_Y) -DEF(GL_GREEN_SCALE) -DEF(GL_GREEN_BIAS) -DEF(GL_BLUE_SCALE) -DEF(GL_BLUE_BIAS) -DEF(GL_ALPHA_SCALE) -DEF(GL_ALPHA_BIAS) -DEF(GL_DEPTH_SCALE) -DEF(GL_DEPTH_BIAS) -DEF(GL_MAX_EVAL_ORDER) -DEF(GL_MAX_LIGHTS) -DEF(GL_MAX_CLIP_PLANES) -DEF(GL_MAX_TEXTURE_SIZE) -DEF(GL_MAX_PIXEL_MAP_TABLE) -DEF(GL_MAX_ATTRIB_STACK_DEPTH) -DEF(GL_MAX_MODELVIEW_STACK_DEPTH) -DEF(GL_MAX_NAME_STACK_DEPTH) -DEF(GL_MAX_PROJECTION_STACK_DEPTH) -DEF(GL_MAX_TEXTURE_STACK_DEPTH) -DEF(GL_MAX_VIEWPORT_DIMS) -DEF(GL_MAX_CLIENT_ATTRIB_STACK_DEPTH) -DEF(GL_SUBPIXEL_BITS) -DEF(GL_INDEX_BITS) -DEF(GL_RED_BITS) -DEF(GL_GREEN_BITS) -DEF(GL_BLUE_BITS) -DEF(GL_ALPHA_BITS) -DEF(GL_DEPTH_BITS) -DEF(GL_STENCIL_BITS) -DEF(GL_ACCUM_RED_BITS) -DEF(GL_ACCUM_GREEN_BITS) -DEF(GL_ACCUM_BLUE_BITS) -DEF(GL_ACCUM_ALPHA_BITS) -DEF(GL_NAME_STACK_DEPTH) -DEF(GL_AUTO_NORMAL) -DEF(GL_MAP1_COLOR_4) -DEF(GL_MAP1_INDEX) -DEF(GL_MAP1_NORMAL) -DEF(GL_MAP1_TEXTURE_COORD_1) -DEF(GL_MAP1_TEXTURE_COORD_2) -DEF(GL_MAP1_TEXTURE_COORD_3) -DEF(GL_MAP1_TEXTURE_COORD_4) -DEF(GL_MAP1_VERTEX_3) -DEF(GL_MAP1_VERTEX_4) -DEF(GL_MAP2_COLOR_4) -DEF(GL_MAP2_INDEX) -DEF(GL_MAP2_NORMAL) -DEF(GL_MAP2_TEXTURE_COORD_1) -DEF(GL_MAP2_TEXTURE_COORD_2) -DEF(GL_MAP2_TEXTURE_COORD_3) -DEF(GL_MAP2_TEXTURE_COORD_4) -DEF(GL_MAP2_VERTEX_3) -DEF(GL_MAP2_VERTEX_4) -DEF(GL_MAP1_GRID_DOMAIN) -DEF(GL_MAP1_GRID_SEGMENTS) -DEF(GL_MAP2_GRID_DOMAIN) -DEF(GL_MAP2_GRID_SEGMENTS) -DEF(GL_TEXTURE_1D) -DEF(GL_TEXTURE_2D) -DEF(GL_FEEDBACK_BUFFER_POINTER) -DEF(GL_FEEDBACK_BUFFER_SIZE) -DEF(GL_FEEDBACK_BUFFER_TYPE) -DEF(GL_SELECTION_BUFFER_POINTER) -DEF(GL_SELECTION_BUFFER_SIZE) - -/* PixelCopyType */ -DEF(GL_COLOR) -DEF(GL_DEPTH) -DEF(GL_STENCIL) - -/* PixelFormat */ -DEF(GL_COLOR_INDEX) -DEF(GL_STENCIL_INDEX) -DEF(GL_DEPTH_COMPONENT) -DEF(GL_RED) -DEF(GL_GREEN) -DEF(GL_BLUE) -DEF(GL_ALPHA) -DEF(GL_RGB) -DEF(GL_RGBA) -DEF(GL_LUMINANCE) -DEF(GL_LUMINANCE_ALPHA) - -/* PixelMap */ -/* GL_PIXEL_MAP_I_TO_I */ -/* GL_PIXEL_MAP_S_TO_S */ -/* GL_PIXEL_MAP_I_TO_R */ -/* GL_PIXEL_MAP_I_TO_G */ -/* GL_PIXEL_MAP_I_TO_B */ -/* GL_PIXEL_MAP_I_TO_A */ -/* GL_PIXEL_MAP_R_TO_R */ -/* GL_PIXEL_MAP_G_TO_G */ -/* GL_PIXEL_MAP_B_TO_B */ -/* GL_PIXEL_MAP_A_TO_A */ - -/* PixelStore */ -/* GL_UNPACK_SWAP_BYTES */ -/* GL_UNPACK_LSB_FIRST */ -/* GL_UNPACK_ROW_LENGTH */ -/* GL_UNPACK_SKIP_ROWS */ -/* GL_UNPACK_SKIP_PIXELS */ -/* GL_UNPACK_ALIGNMENT */ -/* GL_PACK_SWAP_BYTES */ -/* GL_PACK_LSB_FIRST */ -/* GL_PACK_ROW_LENGTH */ -/* GL_PACK_SKIP_ROWS */ -/* GL_PACK_SKIP_PIXELS */ -/* GL_PACK_ALIGNMENT */ - -/* PixelTransfer */ -/* GL_MAP_COLOR */ -/* GL_MAP_STENCIL */ -/* GL_INDEX_SHIFT */ -/* GL_INDEX_OFFSET */ -/* GL_RED_SCALE */ -/* GL_RED_BIAS */ -/* GL_GREEN_SCALE */ -/* GL_GREEN_BIAS */ -/* GL_BLUE_SCALE */ -/* GL_BLUE_BIAS */ -/* GL_ALPHA_SCALE */ -/* GL_ALPHA_BIAS */ -/* GL_DEPTH_SCALE */ -/* GL_DEPTH_BIAS */ - -/* PixelType */ -DEF(GL_BITMAP) -/* GL_BYTE */ -/* GL_UNSIGNED_BYTE */ -/* GL_SHORT */ -/* GL_UNSIGNED_SHORT */ -/* GL_INT */ -/* GL_UNSIGNED_INT */ -/* GL_FLOAT */ - -/* PolygonMode */ -DEF(GL_POINT) -DEF(GL_LINE) -DEF(GL_FILL) - -/* RenderingMode */ -DEF(GL_RENDER) -DEF(GL_FEEDBACK) -DEF(GL_SELECT) - -/* ShadingModel */ -DEF(GL_FLAT) -DEF(GL_SMOOTH) - -/* StencilOp */ -/* GL_ZERO */ -DEF(GL_KEEP) -DEF(GL_REPLACE) -DEF(GL_INCR) -DEF(GL_DECR) -/* GL_INVERT */ - -/* StringName */ -DEF(GL_VENDOR) -DEF(GL_RENDERER) -DEF(GL_VERSION) -DEF(GL_EXTENSIONS) - -/* TextureCoordName */ -DEF(GL_S) -DEF(GL_T) -DEF(GL_R) -DEF(GL_Q) - -/* TexCoordPointerType */ -/* GL_SHORT */ -/* GL_INT */ -/* GL_FLOAT */ -/* GL_DOUBLE */ - -/* TextureEnvMode */ -DEF(GL_MODULATE) -DEF(GL_DECAL) -/* GL_BLEND */ -/* GL_REPLACE */ - -/* TextureEnvParameter */ -DEF(GL_TEXTURE_ENV_MODE) -DEF(GL_TEXTURE_ENV_COLOR) - -/* TextureEnvTarget */ -DEF(GL_TEXTURE_ENV) - -/* TextureGenMode */ -DEF(GL_EYE_LINEAR) -DEF(GL_OBJECT_LINEAR) -DEF(GL_SPHERE_MAP) - -/* TextureGenParameter */ -DEF(GL_TEXTURE_GEN_MODE) -DEF(GL_OBJECT_PLANE) -DEF(GL_EYE_PLANE) - -/* TextureMagFilter */ -DEF(GL_NEAREST) -DEF(GL_LINEAR) - -/* TextureMinFilter */ -/* GL_NEAREST */ -/* GL_LINEAR */ -DEF(GL_NEAREST_MIPMAP_NEAREST) -DEF(GL_LINEAR_MIPMAP_NEAREST) -DEF(GL_NEAREST_MIPMAP_LINEAR) -DEF(GL_LINEAR_MIPMAP_LINEAR) - -/* TextureParameterName */ -DEF(GL_TEXTURE_MAG_FILTER) -DEF(GL_TEXTURE_MIN_FILTER) -DEF(GL_TEXTURE_WRAP_S) -DEF(GL_TEXTURE_WRAP_T) -/* GL_TEXTURE_BORDER_COLOR */ -/* GL_TEXTURE_PRIORITY */ - -/* TextureTarget */ -/* GL_TEXTURE_1D */ -/* GL_TEXTURE_2D */ -/* GL_PROXY_TEXTURE_1D */ -/* GL_PROXY_TEXTURE_2D */ - -/* TextureWrapMode */ -DEF(GL_CLAMP) -DEF(GL_REPEAT) - -/* VertexPointerType */ -/* GL_SHORT */ -/* GL_INT */ -/* GL_FLOAT */ -/* GL_DOUBLE */ - -/* ClientAttribMask */ -DEF(GL_CLIENT_PIXEL_STORE_BIT) -DEF(GL_CLIENT_VERTEX_ARRAY_BIT) -DEF(GL_CLIENT_ALL_ATTRIB_BITS) - -/* polygon_offset */ -DEF(GL_POLYGON_OFFSET_FACTOR) -DEF(GL_POLYGON_OFFSET_UNITS) -DEF(GL_POLYGON_OFFSET_POINT) -DEF(GL_POLYGON_OFFSET_LINE) -DEF(GL_POLYGON_OFFSET_FILL) - - { 0, NULL } -}; - -static const char *EnumString( GLenum t ) -{ - static char buffer[8][1024]; - static int index = 0; - - for ( glEnumName_t *n = glEnumNames ; n->name ; n++ ) { - if ( t == n->e ) { - return n->name; - } - } - - int oldIndex = index; - index = ( index + 1 ) & 7; - sprintf( buffer[oldIndex], "0x%x", t ); - - return buffer[oldIndex]; -} - -static const char *FloatData( const GLfloat *v, int count ) { - static char buffer[8][1024]; - static int index = 0; - char *name; - - name = buffer[index&7]; - sprintf( name, "f%i", index ); - index++; - - fprintf( tr.logFile, "static float %s[%i] = {", name, count ); - for( int i = 0 ; i < count ; i++ ) { - if ( i < count - 1 ) { - fprintf( tr.logFile, "%f,", v[i] ); - } else { - fprintf( tr.logFile, "%f};\n", v[i] ); - } - } - - return name; -} - -#if 0 - -// TODO: support GLbitfield - -static void APIENTRY logClear(GLbitfield mask) -{ - fprintf( tr.logFile, "glClear( 0 " ); - - if ( mask & GL_COLOR_BUFFER_BIT ) - fprintf( tr.logFile, "| GL_COLOR_BUFFER_BIT " ); - if ( mask & GL_DEPTH_BUFFER_BIT ) - fprintf( tr.logFile, "| GL_DEPTH_BUFFER_BIT " ); - if ( mask & GL_STENCIL_BUFFER_BIT ) - fprintf( tr.logFile, "| GL_STENCIL_BUFFER_BIT " ); - if ( mask & GL_ACCUM_BUFFER_BIT ) - fprintf( tr.logFile, "| GL_ACCUM_BUFFER_BIT " ); - - fprintf( tr.logFile, ");\n" ); - dllClear( mask ); -} - -#endif - -#include "gl_logfuncs.cpp" - /* ** QGL_Shutdown ** @@ -1311,343 +90,6 @@ void QGL_Shutdown( void ) win32.hinstOpenGL = NULL; - qglAccum = NULL; - qglAlphaFunc = NULL; - qglAreTexturesResident = NULL; - qglArrayElement = NULL; - qglBegin = NULL; - qglBindTexture = NULL; - qglBitmap = NULL; - qglBlendFunc = NULL; - qglCallList = NULL; - qglCallLists = NULL; - qglClear = NULL; - qglClearAccum = NULL; - qglClearColor = NULL; - qglClearDepth = NULL; - qglClearIndex = NULL; - qglClearStencil = NULL; - qglClipPlane = NULL; - qglColor3b = NULL; - qglColor3bv = NULL; - qglColor3d = NULL; - qglColor3dv = NULL; - qglColor3f = NULL; - qglColor3fv = NULL; - qglColor3i = NULL; - qglColor3iv = NULL; - qglColor3s = NULL; - qglColor3sv = NULL; - qglColor3ub = NULL; - qglColor3ubv = NULL; - qglColor3ui = NULL; - qglColor3uiv = NULL; - qglColor3us = NULL; - qglColor3usv = NULL; - qglColor4b = NULL; - qglColor4bv = NULL; - qglColor4d = NULL; - qglColor4dv = NULL; - qglColor4f = NULL; - qglColor4fv = NULL; - qglColor4i = NULL; - qglColor4iv = NULL; - qglColor4s = NULL; - qglColor4sv = NULL; - qglColor4ub = NULL; - qglColor4ubv = NULL; - qglColor4ui = NULL; - qglColor4uiv = NULL; - qglColor4us = NULL; - qglColor4usv = NULL; - qglColorMask = NULL; - qglColorMaterial = NULL; - qglColorPointer = NULL; - qglCopyPixels = NULL; - qglCopyTexImage1D = NULL; - qglCopyTexImage2D = NULL; - qglCopyTexSubImage1D = NULL; - qglCopyTexSubImage2D = NULL; - qglCullFace = NULL; - qglDeleteLists = NULL; - qglDeleteTextures = NULL; - qglDepthFunc = NULL; - qglDepthMask = NULL; - qglDepthRange = NULL; - qglDisable = NULL; - qglDisableClientState = NULL; - qglDrawArrays = NULL; - qglDrawBuffer = NULL; - qglDrawElements = NULL; - qglDrawPixels = NULL; - qglEdgeFlag = NULL; - qglEdgeFlagPointer = NULL; - qglEdgeFlagv = NULL; - qglEnable = NULL; - qglEnableClientState = NULL; - qglEnd = NULL; - qglEndList = NULL; - qglEvalCoord1d = NULL; - qglEvalCoord1dv = NULL; - qglEvalCoord1f = NULL; - qglEvalCoord1fv = NULL; - qglEvalCoord2d = NULL; - qglEvalCoord2dv = NULL; - qglEvalCoord2f = NULL; - qglEvalCoord2fv = NULL; - qglEvalMesh1 = NULL; - qglEvalMesh2 = NULL; - qglEvalPoint1 = NULL; - qglEvalPoint2 = NULL; - qglFeedbackBuffer = NULL; - qglFinish = NULL; - qglFlush = NULL; - qglFogf = NULL; - qglFogfv = NULL; - qglFogi = NULL; - qglFogiv = NULL; - qglFrontFace = NULL; - qglFrustum = NULL; - qglGenLists = NULL; - qglGenTextures = NULL; - qglGetBooleanv = NULL; - qglGetClipPlane = NULL; - qglGetDoublev = NULL; - qglGetError = NULL; - qglGetFloatv = NULL; - qglGetIntegerv = NULL; - qglGetLightfv = NULL; - qglGetLightiv = NULL; - qglGetMapdv = NULL; - qglGetMapfv = NULL; - qglGetMapiv = NULL; - qglGetMaterialfv = NULL; - qglGetMaterialiv = NULL; - qglGetPixelMapfv = NULL; - qglGetPixelMapuiv = NULL; - qglGetPixelMapusv = NULL; - qglGetPointerv = NULL; - qglGetPolygonStipple = NULL; - qglGetString = NULL; - qglGetTexEnvfv = NULL; - qglGetTexEnviv = NULL; - qglGetTexGendv = NULL; - qglGetTexGenfv = NULL; - qglGetTexGeniv = NULL; - qglGetTexImage = NULL; - qglGetTexLevelParameterfv = NULL; - qglGetTexLevelParameteriv = NULL; - qglGetTexParameterfv = NULL; - qglGetTexParameteriv = NULL; - qglHint = NULL; - qglIndexMask = NULL; - qglIndexPointer = NULL; - qglIndexd = NULL; - qglIndexdv = NULL; - qglIndexf = NULL; - qglIndexfv = NULL; - qglIndexi = NULL; - qglIndexiv = NULL; - qglIndexs = NULL; - qglIndexsv = NULL; - qglIndexub = NULL; - qglIndexubv = NULL; - qglInitNames = NULL; - qglInterleavedArrays = NULL; - qglIsEnabled = NULL; - qglIsList = NULL; - qglIsTexture = NULL; - qglLightModelf = NULL; - qglLightModelfv = NULL; - qglLightModeli = NULL; - qglLightModeliv = NULL; - qglLightf = NULL; - qglLightfv = NULL; - qglLighti = NULL; - qglLightiv = NULL; - qglLineStipple = NULL; - qglLineWidth = NULL; - qglListBase = NULL; - qglLoadIdentity = NULL; - qglLoadMatrixd = NULL; - qglLoadMatrixf = NULL; - qglLoadName = NULL; - qglLogicOp = NULL; - qglMap1d = NULL; - qglMap1f = NULL; - qglMap2d = NULL; - qglMap2f = NULL; - qglMapGrid1d = NULL; - qglMapGrid1f = NULL; - qglMapGrid2d = NULL; - qglMapGrid2f = NULL; - qglMaterialf = NULL; - qglMaterialfv = NULL; - qglMateriali = NULL; - qglMaterialiv = NULL; - qglMatrixMode = NULL; - qglMultMatrixd = NULL; - qglMultMatrixf = NULL; - qglNewList = NULL; - qglNormal3b = NULL; - qglNormal3bv = NULL; - qglNormal3d = NULL; - qglNormal3dv = NULL; - qglNormal3f = NULL; - qglNormal3fv = NULL; - qglNormal3i = NULL; - qglNormal3iv = NULL; - qglNormal3s = NULL; - qglNormal3sv = NULL; - qglNormalPointer = NULL; - qglOrtho = NULL; - qglPassThrough = NULL; - qglPixelMapfv = NULL; - qglPixelMapuiv = NULL; - qglPixelMapusv = NULL; - qglPixelStoref = NULL; - qglPixelStorei = NULL; - qglPixelTransferf = NULL; - qglPixelTransferi = NULL; - qglPixelZoom = NULL; - qglPointSize = NULL; - qglPolygonMode = NULL; - qglPolygonOffset = NULL; - qglPolygonStipple = NULL; - qglPopAttrib = NULL; - qglPopClientAttrib = NULL; - qglPopMatrix = NULL; - qglPopName = NULL; - qglPrioritizeTextures = NULL; - qglPushAttrib = NULL; - qglPushClientAttrib = NULL; - qglPushMatrix = NULL; - qglPushName = NULL; - qglRasterPos2d = NULL; - qglRasterPos2dv = NULL; - qglRasterPos2f = NULL; - qglRasterPos2fv = NULL; - qglRasterPos2i = NULL; - qglRasterPos2iv = NULL; - qglRasterPos2s = NULL; - qglRasterPos2sv = NULL; - qglRasterPos3d = NULL; - qglRasterPos3dv = NULL; - qglRasterPos3f = NULL; - qglRasterPos3fv = NULL; - qglRasterPos3i = NULL; - qglRasterPos3iv = NULL; - qglRasterPos3s = NULL; - qglRasterPos3sv = NULL; - qglRasterPos4d = NULL; - qglRasterPos4dv = NULL; - qglRasterPos4f = NULL; - qglRasterPos4fv = NULL; - qglRasterPos4i = NULL; - qglRasterPos4iv = NULL; - qglRasterPos4s = NULL; - qglRasterPos4sv = NULL; - qglReadBuffer = NULL; - qglReadPixels = NULL; - qglRectd = NULL; - qglRectdv = NULL; - qglRectf = NULL; - qglRectfv = NULL; - qglRecti = NULL; - qglRectiv = NULL; - qglRects = NULL; - qglRectsv = NULL; - qglRenderMode = NULL; - qglRotated = NULL; - qglRotatef = NULL; - qglScaled = NULL; - qglScalef = NULL; - qglScissor = NULL; - qglSelectBuffer = NULL; - qglShadeModel = NULL; - qglStencilFunc = NULL; - qglStencilMask = NULL; - qglStencilOp = NULL; - qglTexCoord1d = NULL; - qglTexCoord1dv = NULL; - qglTexCoord1f = NULL; - qglTexCoord1fv = NULL; - qglTexCoord1i = NULL; - qglTexCoord1iv = NULL; - qglTexCoord1s = NULL; - qglTexCoord1sv = NULL; - qglTexCoord2d = NULL; - qglTexCoord2dv = NULL; - qglTexCoord2f = NULL; - qglTexCoord2fv = NULL; - qglTexCoord2i = NULL; - qglTexCoord2iv = NULL; - qglTexCoord2s = NULL; - qglTexCoord2sv = NULL; - qglTexCoord3d = NULL; - qglTexCoord3dv = NULL; - qglTexCoord3f = NULL; - qglTexCoord3fv = NULL; - qglTexCoord3i = NULL; - qglTexCoord3iv = NULL; - qglTexCoord3s = NULL; - qglTexCoord3sv = NULL; - qglTexCoord4d = NULL; - qglTexCoord4dv = NULL; - qglTexCoord4f = NULL; - qglTexCoord4fv = NULL; - qglTexCoord4i = NULL; - qglTexCoord4iv = NULL; - qglTexCoord4s = NULL; - qglTexCoord4sv = NULL; - qglTexCoordPointer = NULL; - qglTexEnvf = NULL; - qglTexEnvfv = NULL; - qglTexEnvi = NULL; - qglTexEnviv = NULL; - qglTexGend = NULL; - qglTexGendv = NULL; - qglTexGenf = NULL; - qglTexGenfv = NULL; - qglTexGeni = NULL; - qglTexGeniv = NULL; - qglTexImage1D = NULL; - qglTexImage2D = NULL; - qglTexParameterf = NULL; - qglTexParameterfv = NULL; - qglTexParameteri = NULL; - qglTexParameteriv = NULL; - qglTexSubImage1D = NULL; - qglTexSubImage2D = NULL; - qglTranslated = NULL; - qglTranslatef = NULL; - qglVertex2d = NULL; - qglVertex2dv = NULL; - qglVertex2f = NULL; - qglVertex2fv = NULL; - qglVertex2i = NULL; - qglVertex2iv = NULL; - qglVertex2s = NULL; - qglVertex2sv = NULL; - qglVertex3d = NULL; - qglVertex3dv = NULL; - qglVertex3f = NULL; - qglVertex3fv = NULL; - qglVertex3i = NULL; - qglVertex3iv = NULL; - qglVertex3s = NULL; - qglVertex3sv = NULL; - qglVertex4d = NULL; - qglVertex4dv = NULL; - qglVertex4f = NULL; - qglVertex4fv = NULL; - qglVertex4i = NULL; - qglVertex4iv = NULL; - qglVertex4s = NULL; - qglVertex4sv = NULL; - qglVertexPointer = NULL; - qglViewport = NULL; - qwglCopyContext = NULL; qwglCreateContext = NULL; qwglCreateLayerContext = NULL; @@ -1702,343 +144,6 @@ bool QGL_Init( const char *dllname ) } common->Printf( "succeeded\n" ); - qglAccum = dllAccum = glAccum; - qglAlphaFunc = dllAlphaFunc = glAlphaFunc; - qglAreTexturesResident = dllAreTexturesResident = glAreTexturesResident; - qglArrayElement = dllArrayElement = glArrayElement; - qglBegin = dllBegin = glBegin; - qglBindTexture = dllBindTexture = glBindTexture; - qglBitmap = dllBitmap = glBitmap; - qglBlendFunc = dllBlendFunc = glBlendFunc; - qglCallList = dllCallList = glCallList; - qglCallLists = dllCallLists = glCallLists; - qglClear = dllClear = glClear; - qglClearAccum = dllClearAccum = glClearAccum; - qglClearColor = dllClearColor = glClearColor; - qglClearDepth = dllClearDepth = glClearDepth; - qglClearIndex = dllClearIndex = glClearIndex; - qglClearStencil = dllClearStencil = glClearStencil; - qglClipPlane = dllClipPlane = glClipPlane; - qglColor3b = dllColor3b = glColor3b; - qglColor3bv = dllColor3bv = glColor3bv; - qglColor3d = dllColor3d = glColor3d; - qglColor3dv = dllColor3dv = glColor3dv; - qglColor3f = dllColor3f = glColor3f; - qglColor3fv = dllColor3fv = glColor3fv; - qglColor3i = dllColor3i = glColor3i; - qglColor3iv = dllColor3iv = glColor3iv; - qglColor3s = dllColor3s = glColor3s; - qglColor3sv = dllColor3sv = glColor3sv; - qglColor3ub = dllColor3ub = glColor3ub; - qglColor3ubv = dllColor3ubv = glColor3ubv; - qglColor3ui = dllColor3ui = glColor3ui; - qglColor3uiv = dllColor3uiv = glColor3uiv; - qglColor3us = dllColor3us = glColor3us; - qglColor3usv = dllColor3usv = glColor3usv; - qglColor4b = dllColor4b = glColor4b; - qglColor4bv = dllColor4bv = glColor4bv; - qglColor4d = dllColor4d = glColor4d; - qglColor4dv = dllColor4dv = glColor4dv; - qglColor4f = dllColor4f = glColor4f; - qglColor4fv = dllColor4fv = glColor4fv; - qglColor4i = dllColor4i = glColor4i; - qglColor4iv = dllColor4iv = glColor4iv; - qglColor4s = dllColor4s = glColor4s; - qglColor4sv = dllColor4sv = glColor4sv; - qglColor4ub = dllColor4ub = glColor4ub; - qglColor4ubv = dllColor4ubv = glColor4ubv; - qglColor4ui = dllColor4ui = glColor4ui; - qglColor4uiv = dllColor4uiv = glColor4uiv; - qglColor4us = dllColor4us = glColor4us; - qglColor4usv = dllColor4usv = glColor4usv; - qglColorMask = dllColorMask = glColorMask; - qglColorMaterial = dllColorMaterial = glColorMaterial; - qglColorPointer = dllColorPointer = glColorPointer; - qglCopyPixels = dllCopyPixels = glCopyPixels; - qglCopyTexImage1D = dllCopyTexImage1D = glCopyTexImage1D; - qglCopyTexImage2D = dllCopyTexImage2D = glCopyTexImage2D; - qglCopyTexSubImage1D = dllCopyTexSubImage1D = glCopyTexSubImage1D; - qglCopyTexSubImage2D = dllCopyTexSubImage2D = glCopyTexSubImage2D; - qglCullFace = dllCullFace = glCullFace; - qglDeleteLists = dllDeleteLists = glDeleteLists; - qglDeleteTextures = dllDeleteTextures = glDeleteTextures; - qglDepthFunc = dllDepthFunc = glDepthFunc; - qglDepthMask = dllDepthMask = glDepthMask; - qglDepthRange = dllDepthRange = glDepthRange; - qglDisable = dllDisable = glDisable; - qglDisableClientState = dllDisableClientState = glDisableClientState; - qglDrawArrays = dllDrawArrays = glDrawArrays; - qglDrawBuffer = dllDrawBuffer = glDrawBuffer; - qglDrawElements = dllDrawElements = glDrawElements; - qglDrawPixels = dllDrawPixels = glDrawPixels; - qglEdgeFlag = dllEdgeFlag = glEdgeFlag; - qglEdgeFlagPointer = dllEdgeFlagPointer = glEdgeFlagPointer; - qglEdgeFlagv = dllEdgeFlagv = glEdgeFlagv; - qglEnable = dllEnable = glEnable; - qglEnableClientState = dllEnableClientState = glEnableClientState; - qglEnd = dllEnd = glEnd; - qglEndList = dllEndList = glEndList; - qglEvalCoord1d = dllEvalCoord1d = glEvalCoord1d; - qglEvalCoord1dv = dllEvalCoord1dv = glEvalCoord1dv; - qglEvalCoord1f = dllEvalCoord1f = glEvalCoord1f; - qglEvalCoord1fv = dllEvalCoord1fv = glEvalCoord1fv; - qglEvalCoord2d = dllEvalCoord2d = glEvalCoord2d; - qglEvalCoord2dv = dllEvalCoord2dv = glEvalCoord2dv; - qglEvalCoord2f = dllEvalCoord2f = glEvalCoord2f; - qglEvalCoord2fv = dllEvalCoord2fv = glEvalCoord2fv; - qglEvalMesh1 = dllEvalMesh1 = glEvalMesh1; - qglEvalMesh2 = dllEvalMesh2 = glEvalMesh2; - qglEvalPoint1 = dllEvalPoint1 = glEvalPoint1; - qglEvalPoint2 = dllEvalPoint2 = glEvalPoint2; - qglFeedbackBuffer = dllFeedbackBuffer = glFeedbackBuffer; - qglFinish = dllFinish = glFinish; - qglFlush = dllFlush = glFlush; - qglFogf = dllFogf = glFogf; - qglFogfv = dllFogfv = glFogfv; - qglFogi = dllFogi = glFogi; - qglFogiv = dllFogiv = glFogiv; - qglFrontFace = dllFrontFace = glFrontFace; - qglFrustum = dllFrustum = glFrustum; - qglGenLists = dllGenLists = ( GLuint (__stdcall * )(int) ) glGenLists; - qglGenTextures = dllGenTextures = glGenTextures; - qglGetBooleanv = dllGetBooleanv = glGetBooleanv; - qglGetClipPlane = dllGetClipPlane = glGetClipPlane; - qglGetDoublev = dllGetDoublev = glGetDoublev; - qglGetError = dllGetError = ( GLenum (__stdcall * )(void) ) glGetError; - qglGetFloatv = dllGetFloatv = glGetFloatv; - qglGetIntegerv = dllGetIntegerv = glGetIntegerv; - qglGetLightfv = dllGetLightfv = glGetLightfv; - qglGetLightiv = dllGetLightiv = glGetLightiv; - qglGetMapdv = dllGetMapdv = glGetMapdv; - qglGetMapfv = dllGetMapfv = glGetMapfv; - qglGetMapiv = dllGetMapiv = glGetMapiv; - qglGetMaterialfv = dllGetMaterialfv = glGetMaterialfv; - qglGetMaterialiv = dllGetMaterialiv = glGetMaterialiv; - qglGetPixelMapfv = dllGetPixelMapfv = glGetPixelMapfv; - qglGetPixelMapuiv = dllGetPixelMapuiv = glGetPixelMapuiv; - qglGetPixelMapusv = dllGetPixelMapusv = glGetPixelMapusv; - qglGetPointerv = dllGetPointerv = glGetPointerv; - qglGetPolygonStipple = dllGetPolygonStipple = glGetPolygonStipple; - qglGetString = dllGetString = glGetString; - qglGetTexEnvfv = dllGetTexEnvfv = glGetTexEnvfv; - qglGetTexEnviv = dllGetTexEnviv = glGetTexEnviv; - qglGetTexGendv = dllGetTexGendv = glGetTexGendv; - qglGetTexGenfv = dllGetTexGenfv = glGetTexGenfv; - qglGetTexGeniv = dllGetTexGeniv = glGetTexGeniv; - qglGetTexImage = dllGetTexImage = glGetTexImage; - qglGetTexLevelParameterfv = dllGetTexLevelParameterfv = glGetTexLevelParameterfv; - qglGetTexLevelParameteriv = dllGetTexLevelParameteriv = glGetTexLevelParameteriv; - qglGetTexParameterfv = dllGetTexParameterfv = glGetTexParameterfv; - qglGetTexParameteriv = dllGetTexParameteriv = glGetTexParameteriv; - qglHint = dllHint = glHint; - qglIndexMask = dllIndexMask = glIndexMask; - qglIndexPointer = dllIndexPointer = glIndexPointer; - qglIndexd = dllIndexd = glIndexd; - qglIndexdv = dllIndexdv = glIndexdv; - qglIndexf = dllIndexf = glIndexf; - qglIndexfv = dllIndexfv = glIndexfv; - qglIndexi = dllIndexi = glIndexi; - qglIndexiv = dllIndexiv = glIndexiv; - qglIndexs = dllIndexs = glIndexs; - qglIndexsv = dllIndexsv = glIndexsv; - qglIndexub = dllIndexub = glIndexub; - qglIndexubv = dllIndexubv = glIndexubv; - qglInitNames = dllInitNames = glInitNames; - qglInterleavedArrays = dllInterleavedArrays = glInterleavedArrays; - qglIsEnabled = dllIsEnabled = glIsEnabled; - qglIsList = dllIsList = glIsList; - qglIsTexture = dllIsTexture = glIsTexture; - qglLightModelf = dllLightModelf = glLightModelf; - qglLightModelfv = dllLightModelfv = glLightModelfv; - qglLightModeli = dllLightModeli = glLightModeli; - qglLightModeliv = dllLightModeliv = glLightModeliv; - qglLightf = dllLightf = glLightf; - qglLightfv = dllLightfv = glLightfv; - qglLighti = dllLighti = glLighti; - qglLightiv = dllLightiv = glLightiv; - qglLineStipple = dllLineStipple = glLineStipple; - qglLineWidth = dllLineWidth = glLineWidth; - qglListBase = dllListBase = glListBase; - qglLoadIdentity = dllLoadIdentity = glLoadIdentity; - qglLoadMatrixd = dllLoadMatrixd = glLoadMatrixd; - qglLoadMatrixf = dllLoadMatrixf = glLoadMatrixf; - qglLoadName = dllLoadName = glLoadName; - qglLogicOp = dllLogicOp = glLogicOp; - qglMap1d = dllMap1d = glMap1d; - qglMap1f = dllMap1f = glMap1f; - qglMap2d = dllMap2d = glMap2d; - qglMap2f = dllMap2f = glMap2f; - qglMapGrid1d = dllMapGrid1d = glMapGrid1d; - qglMapGrid1f = dllMapGrid1f = glMapGrid1f; - qglMapGrid2d = dllMapGrid2d = glMapGrid2d; - qglMapGrid2f = dllMapGrid2f = glMapGrid2f; - qglMaterialf = dllMaterialf = glMaterialf; - qglMaterialfv = dllMaterialfv = glMaterialfv; - qglMateriali = dllMateriali = glMateriali; - qglMaterialiv = dllMaterialiv = glMaterialiv; - qglMatrixMode = dllMatrixMode = glMatrixMode; - qglMultMatrixd = dllMultMatrixd = glMultMatrixd; - qglMultMatrixf = dllMultMatrixf = glMultMatrixf; - qglNewList = dllNewList = glNewList; - qglNormal3b = dllNormal3b = glNormal3b; - qglNormal3bv = dllNormal3bv = glNormal3bv; - qglNormal3d = dllNormal3d = glNormal3d; - qglNormal3dv = dllNormal3dv = glNormal3dv; - qglNormal3f = dllNormal3f = glNormal3f; - qglNormal3fv = dllNormal3fv = glNormal3fv; - qglNormal3i = dllNormal3i = glNormal3i; - qglNormal3iv = dllNormal3iv = glNormal3iv; - qglNormal3s = dllNormal3s = glNormal3s; - qglNormal3sv = dllNormal3sv = glNormal3sv; - qglNormalPointer = dllNormalPointer = glNormalPointer; - qglOrtho = dllOrtho = glOrtho; - qglPassThrough = dllPassThrough = glPassThrough; - qglPixelMapfv = dllPixelMapfv = glPixelMapfv; - qglPixelMapuiv = dllPixelMapuiv = glPixelMapuiv; - qglPixelMapusv = dllPixelMapusv = glPixelMapusv; - qglPixelStoref = dllPixelStoref = glPixelStoref; - qglPixelStorei = dllPixelStorei = glPixelStorei; - qglPixelTransferf = dllPixelTransferf = glPixelTransferf; - qglPixelTransferi = dllPixelTransferi = glPixelTransferi; - qglPixelZoom = dllPixelZoom = glPixelZoom; - qglPointSize = dllPointSize = glPointSize; - qglPolygonMode = dllPolygonMode = glPolygonMode; - qglPolygonOffset = dllPolygonOffset = glPolygonOffset; - qglPolygonStipple = dllPolygonStipple = glPolygonStipple; - qglPopAttrib = dllPopAttrib = glPopAttrib; - qglPopClientAttrib = dllPopClientAttrib = glPopClientAttrib; - qglPopMatrix = dllPopMatrix = glPopMatrix; - qglPopName = dllPopName = glPopName; - qglPrioritizeTextures = dllPrioritizeTextures = glPrioritizeTextures; - qglPushAttrib = dllPushAttrib = glPushAttrib; - qglPushClientAttrib = dllPushClientAttrib = glPushClientAttrib; - qglPushMatrix = dllPushMatrix = glPushMatrix; - qglPushName = dllPushName = glPushName; - qglRasterPos2d = dllRasterPos2d = glRasterPos2d; - qglRasterPos2dv = dllRasterPos2dv = glRasterPos2dv; - qglRasterPos2f = dllRasterPos2f = glRasterPos2f; - qglRasterPos2fv = dllRasterPos2fv = glRasterPos2fv; - qglRasterPos2i = dllRasterPos2i = glRasterPos2i; - qglRasterPos2iv = dllRasterPos2iv = glRasterPos2iv; - qglRasterPos2s = dllRasterPos2s = glRasterPos2s; - qglRasterPos2sv = dllRasterPos2sv = glRasterPos2sv; - qglRasterPos3d = dllRasterPos3d = glRasterPos3d; - qglRasterPos3dv = dllRasterPos3dv = glRasterPos3dv; - qglRasterPos3f = dllRasterPos3f = glRasterPos3f; - qglRasterPos3fv = dllRasterPos3fv = glRasterPos3fv; - qglRasterPos3i = dllRasterPos3i = glRasterPos3i; - qglRasterPos3iv = dllRasterPos3iv = glRasterPos3iv; - qglRasterPos3s = dllRasterPos3s = glRasterPos3s; - qglRasterPos3sv = dllRasterPos3sv = glRasterPos3sv; - qglRasterPos4d = dllRasterPos4d = glRasterPos4d; - qglRasterPos4dv = dllRasterPos4dv = glRasterPos4dv; - qglRasterPos4f = dllRasterPos4f = glRasterPos4f; - qglRasterPos4fv = dllRasterPos4fv = glRasterPos4fv; - qglRasterPos4i = dllRasterPos4i = glRasterPos4i; - qglRasterPos4iv = dllRasterPos4iv = glRasterPos4iv; - qglRasterPos4s = dllRasterPos4s = glRasterPos4s; - qglRasterPos4sv = dllRasterPos4sv = glRasterPos4sv; - qglReadBuffer = dllReadBuffer = glReadBuffer; - qglReadPixels = dllReadPixels = glReadPixels; - qglRectd = dllRectd = glRectd; - qglRectdv = dllRectdv = glRectdv; - qglRectf = dllRectf = glRectf; - qglRectfv = dllRectfv = glRectfv; - qglRecti = dllRecti = glRecti; - qglRectiv = dllRectiv = glRectiv; - qglRects = dllRects = glRects; - qglRectsv = dllRectsv = glRectsv; - qglRenderMode = dllRenderMode = glRenderMode; - qglRotated = dllRotated = glRotated; - qglRotatef = dllRotatef = glRotatef; - qglScaled = dllScaled = glScaled; - qglScalef = dllScalef = glScalef; - qglScissor = dllScissor = glScissor; - qglSelectBuffer = dllSelectBuffer = glSelectBuffer; - qglShadeModel = dllShadeModel = glShadeModel; - qglStencilFunc = dllStencilFunc = glStencilFunc; - qglStencilMask = dllStencilMask = glStencilMask; - qglStencilOp = dllStencilOp = glStencilOp; - qglTexCoord1d = dllTexCoord1d = glTexCoord1d; - qglTexCoord1dv = dllTexCoord1dv = glTexCoord1dv; - qglTexCoord1f = dllTexCoord1f = glTexCoord1f; - qglTexCoord1fv = dllTexCoord1fv = glTexCoord1fv; - qglTexCoord1i = dllTexCoord1i = glTexCoord1i; - qglTexCoord1iv = dllTexCoord1iv = glTexCoord1iv; - qglTexCoord1s = dllTexCoord1s = glTexCoord1s; - qglTexCoord1sv = dllTexCoord1sv = glTexCoord1sv; - qglTexCoord2d = dllTexCoord2d = glTexCoord2d; - qglTexCoord2dv = dllTexCoord2dv = glTexCoord2dv; - qglTexCoord2f = dllTexCoord2f = glTexCoord2f; - qglTexCoord2fv = dllTexCoord2fv = glTexCoord2fv; - qglTexCoord2i = dllTexCoord2i = glTexCoord2i; - qglTexCoord2iv = dllTexCoord2iv = glTexCoord2iv; - qglTexCoord2s = dllTexCoord2s = glTexCoord2s; - qglTexCoord2sv = dllTexCoord2sv = glTexCoord2sv; - qglTexCoord3d = dllTexCoord3d = glTexCoord3d; - qglTexCoord3dv = dllTexCoord3dv = glTexCoord3dv; - qglTexCoord3f = dllTexCoord3f = glTexCoord3f; - qglTexCoord3fv = dllTexCoord3fv = glTexCoord3fv; - qglTexCoord3i = dllTexCoord3i = glTexCoord3i; - qglTexCoord3iv = dllTexCoord3iv = glTexCoord3iv; - qglTexCoord3s = dllTexCoord3s = glTexCoord3s; - qglTexCoord3sv = dllTexCoord3sv = glTexCoord3sv; - qglTexCoord4d = dllTexCoord4d = glTexCoord4d; - qglTexCoord4dv = dllTexCoord4dv = glTexCoord4dv; - qglTexCoord4f = dllTexCoord4f = glTexCoord4f; - qglTexCoord4fv = dllTexCoord4fv = glTexCoord4fv; - qglTexCoord4i = dllTexCoord4i = glTexCoord4i; - qglTexCoord4iv = dllTexCoord4iv = glTexCoord4iv; - qglTexCoord4s = dllTexCoord4s = glTexCoord4s; - qglTexCoord4sv = dllTexCoord4sv = glTexCoord4sv; - qglTexCoordPointer = dllTexCoordPointer = glTexCoordPointer; - qglTexEnvf = dllTexEnvf = glTexEnvf; - qglTexEnvfv = dllTexEnvfv = glTexEnvfv; - qglTexEnvi = dllTexEnvi = glTexEnvi; - qglTexEnviv = dllTexEnviv = glTexEnviv; - qglTexGend = dllTexGend = glTexGend; - qglTexGendv = dllTexGendv = glTexGendv; - qglTexGenf = dllTexGenf = glTexGenf; - qglTexGenfv = dllTexGenfv = glTexGenfv; - qglTexGeni = dllTexGeni = glTexGeni; - qglTexGeniv = dllTexGeniv = glTexGeniv; - qglTexImage1D = dllTexImage1D = glTexImage1D; - qglTexImage2D = dllTexImage2D = glTexImage2D; - qglTexParameterf = dllTexParameterf = glTexParameterf; - qglTexParameterfv = dllTexParameterfv = glTexParameterfv; - qglTexParameteri = dllTexParameteri = glTexParameteri; - qglTexParameteriv = dllTexParameteriv = glTexParameteriv; - qglTexSubImage1D = dllTexSubImage1D = glTexSubImage1D; - qglTexSubImage2D = dllTexSubImage2D = glTexSubImage2D; - qglTranslated = dllTranslated = glTranslated; - qglTranslatef = dllTranslatef = glTranslatef; - qglVertex2d = dllVertex2d = glVertex2d; - qglVertex2dv = dllVertex2dv = glVertex2dv; - qglVertex2f = dllVertex2f = glVertex2f; - qglVertex2fv = dllVertex2fv = glVertex2fv; - qglVertex2i = dllVertex2i = glVertex2i; - qglVertex2iv = dllVertex2iv = glVertex2iv; - qglVertex2s = dllVertex2s = glVertex2s; - qglVertex2sv = dllVertex2sv = glVertex2sv; - qglVertex3d = dllVertex3d = glVertex3d; - qglVertex3dv = dllVertex3dv = glVertex3dv; - qglVertex3f = dllVertex3f = glVertex3f; - qglVertex3fv = dllVertex3fv = glVertex3fv; - qglVertex3i = dllVertex3i = glVertex3i; - qglVertex3iv = dllVertex3iv = glVertex3iv; - qglVertex3s = dllVertex3s = glVertex3s; - qglVertex3sv = dllVertex3sv = glVertex3sv; - qglVertex4d = dllVertex4d = glVertex4d; - qglVertex4dv = dllVertex4dv = glVertex4dv; - qglVertex4f = dllVertex4f = glVertex4f; - qglVertex4fv = dllVertex4fv = glVertex4fv; - qglVertex4i = dllVertex4i = glVertex4i; - qglVertex4iv = dllVertex4iv = glVertex4iv; - qglVertex4s = dllVertex4s = glVertex4s; - qglVertex4sv = dllVertex4sv = glVertex4sv; - qglVertexPointer = dllVertexPointer = glVertexPointer; - qglViewport = dllViewport = glViewport; - qwglCopyContext = wglCopyContext; qwglCreateContext = wglCreateContext; qwglCreateLayerContext = wglCreateLayerContext; @@ -2062,10 +167,6 @@ bool QGL_Init( const char *dllname ) qwglSetPixelFormat = SetPixelFormat; qwglSwapBuffers = SwapBuffers; - qglActiveTextureARB = 0; - qglClientActiveTextureARB = 0; - qglMultiTexCoord2fARB = 0; - return true; } @@ -2077,735 +178,5 @@ GLimp_EnableLogging ================== */ void GLimp_EnableLogging( bool enable ) { - static bool isEnabled; - static int initialFrames; - static char ospath[ MAX_OSPATH ]; - - // return if we're already active - if ( isEnabled && enable ) { - // decrement log counter and stop if it has reached 0 - r_logFile.SetInteger( r_logFile.GetInteger() - 1 ); - if ( r_logFile.GetInteger() ) { - return; - } - common->Printf( "closing logfile '%s' after %i frames.\n", ospath, initialFrames ); - enable = false; - - fclose( tr.logFile ); - tr.logFile = NULL; - - } - - // return if we're already disabled - if ( !enable && !isEnabled ) { - return; - } - - isEnabled = enable; - - if ( enable ) { - if ( !tr.logFile ) { - struct tm *newtime; - ID_TIME_T aclock; - idStr qpath; - int i; - const char *path; - - initialFrames = r_logFile.GetInteger(); - - // scan for an unused filename - for ( i = 0 ; i < 9999 ; i++ ) { - sprintf( qpath, "renderlog_%i.txt", i ); - if ( fileSystem->ReadFile( qpath, NULL, NULL ) == -1 ) { - break; // use this name - } - } - - path = fileSystem->RelativePathToOSPath( qpath, "fs_savepath" ); - idStr::Copynz( ospath, path, sizeof( ospath ) ); - tr.logFile = fopen( ospath, "wt" ); - - // write the time out to the top of the file - time( &aclock ); - newtime = localtime( &aclock ); - fprintf( tr.logFile, "// %s", asctime( newtime ) ); - fprintf( tr.logFile, "// %s\n\n", cvarSystem->GetCVarString( "si_version" ) ); - } - - qglAccum = logAccum; - qglAlphaFunc = logAlphaFunc; - qglAreTexturesResident = logAreTexturesResident; - qglArrayElement = logArrayElement; - qglBegin = logBegin; - qglBindTexture = logBindTexture; - qglBitmap = logBitmap; - qglBlendFunc = logBlendFunc; - qglCallList = logCallList; - qglCallLists = logCallLists; - qglClear = logClear; - qglClearAccum = logClearAccum; - qglClearColor = logClearColor; - qglClearDepth = logClearDepth; - qglClearIndex = logClearIndex; - qglClearStencil = logClearStencil; - qglClipPlane = logClipPlane; - qglColor3b = logColor3b; - qglColor3bv = logColor3bv; - qglColor3d = logColor3d; - qglColor3dv = logColor3dv; - qglColor3f = logColor3f; - qglColor3fv = logColor3fv; - qglColor3i = logColor3i; - qglColor3iv = logColor3iv; - qglColor3s = logColor3s; - qglColor3sv = logColor3sv; - qglColor3ub = logColor3ub; - qglColor3ubv = logColor3ubv; - qglColor3ui = logColor3ui; - qglColor3uiv = logColor3uiv; - qglColor3us = logColor3us; - qglColor3usv = logColor3usv; - qglColor4b = logColor4b; - qglColor4bv = logColor4bv; - qglColor4d = logColor4d; - qglColor4dv = logColor4dv; - qglColor4f = logColor4f; - qglColor4fv = logColor4fv; - qglColor4i = logColor4i; - qglColor4iv = logColor4iv; - qglColor4s = logColor4s; - qglColor4sv = logColor4sv; - qglColor4ub = logColor4ub; - qglColor4ubv = logColor4ubv; - qglColor4ui = logColor4ui; - qglColor4uiv = logColor4uiv; - qglColor4us = logColor4us; - qglColor4usv = logColor4usv; - qglColorMask = logColorMask; - qglColorMaterial = logColorMaterial; - qglColorPointer = logColorPointer; - qglCopyPixels = logCopyPixels; - qglCopyTexImage1D = logCopyTexImage1D; - qglCopyTexImage2D = logCopyTexImage2D; - qglCopyTexSubImage1D = logCopyTexSubImage1D; - qglCopyTexSubImage2D = logCopyTexSubImage2D; - qglCullFace = logCullFace; - qglDeleteLists = logDeleteLists ; - qglDeleteTextures = logDeleteTextures ; - qglDepthFunc = logDepthFunc ; - qglDepthMask = logDepthMask ; - qglDepthRange = logDepthRange ; - qglDisable = logDisable ; - qglDisableClientState = logDisableClientState ; - qglDrawArrays = logDrawArrays ; - qglDrawBuffer = logDrawBuffer ; - qglDrawElements = logDrawElements ; - qglDrawPixels = logDrawPixels ; - qglEdgeFlag = logEdgeFlag ; - qglEdgeFlagPointer = logEdgeFlagPointer ; - qglEdgeFlagv = logEdgeFlagv ; - qglEnable = logEnable ; - qglEnableClientState = logEnableClientState ; - qglEnd = logEnd ; - qglEndList = logEndList ; - qglEvalCoord1d = logEvalCoord1d ; - qglEvalCoord1dv = logEvalCoord1dv ; - qglEvalCoord1f = logEvalCoord1f ; - qglEvalCoord1fv = logEvalCoord1fv ; - qglEvalCoord2d = logEvalCoord2d ; - qglEvalCoord2dv = logEvalCoord2dv ; - qglEvalCoord2f = logEvalCoord2f ; - qglEvalCoord2fv = logEvalCoord2fv ; - qglEvalMesh1 = logEvalMesh1 ; - qglEvalMesh2 = logEvalMesh2 ; - qglEvalPoint1 = logEvalPoint1 ; - qglEvalPoint2 = logEvalPoint2 ; - qglFeedbackBuffer = logFeedbackBuffer ; - qglFinish = logFinish ; - qglFlush = logFlush ; - qglFogf = logFogf ; - qglFogfv = logFogfv ; - qglFogi = logFogi ; - qglFogiv = logFogiv ; - qglFrontFace = logFrontFace ; - qglFrustum = logFrustum ; - qglGenLists = logGenLists ; - qglGenTextures = logGenTextures ; - qglGetBooleanv = logGetBooleanv ; - qglGetClipPlane = logGetClipPlane ; - qglGetDoublev = logGetDoublev ; - qglGetError = logGetError ; - qglGetFloatv = logGetFloatv ; - qglGetIntegerv = logGetIntegerv ; - qglGetLightfv = logGetLightfv ; - qglGetLightiv = logGetLightiv ; - qglGetMapdv = logGetMapdv ; - qglGetMapfv = logGetMapfv ; - qglGetMapiv = logGetMapiv ; - qglGetMaterialfv = logGetMaterialfv ; - qglGetMaterialiv = logGetMaterialiv ; - qglGetPixelMapfv = logGetPixelMapfv ; - qglGetPixelMapuiv = logGetPixelMapuiv ; - qglGetPixelMapusv = logGetPixelMapusv ; - qglGetPointerv = logGetPointerv ; - qglGetPolygonStipple = logGetPolygonStipple ; - qglGetString = logGetString ; - qglGetTexEnvfv = logGetTexEnvfv ; - qglGetTexEnviv = logGetTexEnviv ; - qglGetTexGendv = logGetTexGendv ; - qglGetTexGenfv = logGetTexGenfv ; - qglGetTexGeniv = logGetTexGeniv ; - qglGetTexImage = logGetTexImage ; - qglGetTexLevelParameterfv = logGetTexLevelParameterfv ; - qglGetTexLevelParameteriv = logGetTexLevelParameteriv ; - qglGetTexParameterfv = logGetTexParameterfv ; - qglGetTexParameteriv = logGetTexParameteriv ; - qglHint = logHint ; - qglIndexMask = logIndexMask ; - qglIndexPointer = logIndexPointer ; - qglIndexd = logIndexd ; - qglIndexdv = logIndexdv ; - qglIndexf = logIndexf ; - qglIndexfv = logIndexfv ; - qglIndexi = logIndexi ; - qglIndexiv = logIndexiv ; - qglIndexs = logIndexs ; - qglIndexsv = logIndexsv ; - qglIndexub = logIndexub ; - qglIndexubv = logIndexubv ; - qglInitNames = logInitNames ; - qglInterleavedArrays = logInterleavedArrays ; - qglIsEnabled = logIsEnabled ; - qglIsList = logIsList ; - qglIsTexture = logIsTexture ; - qglLightModelf = logLightModelf ; - qglLightModelfv = logLightModelfv ; - qglLightModeli = logLightModeli ; - qglLightModeliv = logLightModeliv ; - qglLightf = logLightf ; - qglLightfv = logLightfv ; - qglLighti = logLighti ; - qglLightiv = logLightiv ; - qglLineStipple = logLineStipple ; - qglLineWidth = logLineWidth ; - qglListBase = logListBase ; - qglLoadIdentity = logLoadIdentity ; - qglLoadMatrixd = logLoadMatrixd ; - qglLoadMatrixf = logLoadMatrixf ; - qglLoadName = logLoadName ; - qglLogicOp = logLogicOp ; - qglMap1d = logMap1d ; - qglMap1f = logMap1f ; - qglMap2d = logMap2d ; - qglMap2f = logMap2f ; - qglMapGrid1d = logMapGrid1d ; - qglMapGrid1f = logMapGrid1f ; - qglMapGrid2d = logMapGrid2d ; - qglMapGrid2f = logMapGrid2f ; - qglMaterialf = logMaterialf ; - qglMaterialfv = logMaterialfv ; - qglMateriali = logMateriali ; - qglMaterialiv = logMaterialiv ; - qglMatrixMode = logMatrixMode ; - qglMultMatrixd = logMultMatrixd ; - qglMultMatrixf = logMultMatrixf ; - qglNewList = logNewList ; - qglNormal3b = logNormal3b ; - qglNormal3bv = logNormal3bv ; - qglNormal3d = logNormal3d ; - qglNormal3dv = logNormal3dv ; - qglNormal3f = logNormal3f ; - qglNormal3fv = logNormal3fv ; - qglNormal3i = logNormal3i ; - qglNormal3iv = logNormal3iv ; - qglNormal3s = logNormal3s ; - qglNormal3sv = logNormal3sv ; - qglNormalPointer = logNormalPointer ; - qglOrtho = logOrtho ; - qglPassThrough = logPassThrough ; - qglPixelMapfv = logPixelMapfv ; - qglPixelMapuiv = logPixelMapuiv ; - qglPixelMapusv = logPixelMapusv ; - qglPixelStoref = logPixelStoref ; - qglPixelStorei = logPixelStorei ; - qglPixelTransferf = logPixelTransferf ; - qglPixelTransferi = logPixelTransferi ; - qglPixelZoom = logPixelZoom ; - qglPointSize = logPointSize ; - qglPolygonMode = logPolygonMode ; - qglPolygonOffset = logPolygonOffset ; - qglPolygonStipple = logPolygonStipple ; - qglPopAttrib = logPopAttrib ; - qglPopClientAttrib = logPopClientAttrib ; - qglPopMatrix = logPopMatrix ; - qglPopName = logPopName ; - qglPrioritizeTextures = logPrioritizeTextures ; - qglPushAttrib = logPushAttrib ; - qglPushClientAttrib = logPushClientAttrib ; - qglPushMatrix = logPushMatrix ; - qglPushName = logPushName ; - qglRasterPos2d = logRasterPos2d ; - qglRasterPos2dv = logRasterPos2dv ; - qglRasterPos2f = logRasterPos2f ; - qglRasterPos2fv = logRasterPos2fv ; - qglRasterPos2i = logRasterPos2i ; - qglRasterPos2iv = logRasterPos2iv ; - qglRasterPos2s = logRasterPos2s ; - qglRasterPos2sv = logRasterPos2sv ; - qglRasterPos3d = logRasterPos3d ; - qglRasterPos3dv = logRasterPos3dv ; - qglRasterPos3f = logRasterPos3f ; - qglRasterPos3fv = logRasterPos3fv ; - qglRasterPos3i = logRasterPos3i ; - qglRasterPos3iv = logRasterPos3iv ; - qglRasterPos3s = logRasterPos3s ; - qglRasterPos3sv = logRasterPos3sv ; - qglRasterPos4d = logRasterPos4d ; - qglRasterPos4dv = logRasterPos4dv ; - qglRasterPos4f = logRasterPos4f ; - qglRasterPos4fv = logRasterPos4fv ; - qglRasterPos4i = logRasterPos4i ; - qglRasterPos4iv = logRasterPos4iv ; - qglRasterPos4s = logRasterPos4s ; - qglRasterPos4sv = logRasterPos4sv ; - qglReadBuffer = logReadBuffer ; - qglReadPixels = logReadPixels ; - qglRectd = logRectd ; - qglRectdv = logRectdv ; - qglRectf = logRectf ; - qglRectfv = logRectfv ; - qglRecti = logRecti ; - qglRectiv = logRectiv ; - qglRects = logRects ; - qglRectsv = logRectsv ; - qglRenderMode = logRenderMode ; - qglRotated = logRotated ; - qglRotatef = logRotatef ; - qglScaled = logScaled ; - qglScalef = logScalef ; - qglScissor = logScissor ; - qglSelectBuffer = logSelectBuffer ; - qglShadeModel = logShadeModel ; - qglStencilFunc = logStencilFunc ; - qglStencilMask = logStencilMask ; - qglStencilOp = logStencilOp ; - qglTexCoord1d = logTexCoord1d ; - qglTexCoord1dv = logTexCoord1dv ; - qglTexCoord1f = logTexCoord1f ; - qglTexCoord1fv = logTexCoord1fv ; - qglTexCoord1i = logTexCoord1i ; - qglTexCoord1iv = logTexCoord1iv ; - qglTexCoord1s = logTexCoord1s ; - qglTexCoord1sv = logTexCoord1sv ; - qglTexCoord2d = logTexCoord2d ; - qglTexCoord2dv = logTexCoord2dv ; - qglTexCoord2f = logTexCoord2f ; - qglTexCoord2fv = logTexCoord2fv ; - qglTexCoord2i = logTexCoord2i ; - qglTexCoord2iv = logTexCoord2iv ; - qglTexCoord2s = logTexCoord2s ; - qglTexCoord2sv = logTexCoord2sv ; - qglTexCoord3d = logTexCoord3d ; - qglTexCoord3dv = logTexCoord3dv ; - qglTexCoord3f = logTexCoord3f ; - qglTexCoord3fv = logTexCoord3fv ; - qglTexCoord3i = logTexCoord3i ; - qglTexCoord3iv = logTexCoord3iv ; - qglTexCoord3s = logTexCoord3s ; - qglTexCoord3sv = logTexCoord3sv ; - qglTexCoord4d = logTexCoord4d ; - qglTexCoord4dv = logTexCoord4dv ; - qglTexCoord4f = logTexCoord4f ; - qglTexCoord4fv = logTexCoord4fv ; - qglTexCoord4i = logTexCoord4i ; - qglTexCoord4iv = logTexCoord4iv ; - qglTexCoord4s = logTexCoord4s ; - qglTexCoord4sv = logTexCoord4sv ; - qglTexCoordPointer = logTexCoordPointer ; - qglTexEnvf = logTexEnvf ; - qglTexEnvfv = logTexEnvfv ; - qglTexEnvi = logTexEnvi ; - qglTexEnviv = logTexEnviv ; - qglTexGend = logTexGend ; - qglTexGendv = logTexGendv ; - qglTexGenf = logTexGenf ; - qglTexGenfv = logTexGenfv ; - qglTexGeni = logTexGeni ; - qglTexGeniv = logTexGeniv ; - qglTexImage1D = logTexImage1D ; - qglTexImage2D = logTexImage2D ; - qglTexParameterf = logTexParameterf ; - qglTexParameterfv = logTexParameterfv ; - qglTexParameteri = logTexParameteri ; - qglTexParameteriv = logTexParameteriv ; - qglTexSubImage1D = logTexSubImage1D ; - qglTexSubImage2D = logTexSubImage2D ; - qglTranslated = logTranslated ; - qglTranslatef = logTranslatef ; - qglVertex2d = logVertex2d ; - qglVertex2dv = logVertex2dv ; - qglVertex2f = logVertex2f ; - qglVertex2fv = logVertex2fv ; - qglVertex2i = logVertex2i ; - qglVertex2iv = logVertex2iv ; - qglVertex2s = logVertex2s ; - qglVertex2sv = logVertex2sv ; - qglVertex3d = logVertex3d ; - qglVertex3dv = logVertex3dv ; - qglVertex3f = logVertex3f ; - qglVertex3fv = logVertex3fv ; - qglVertex3i = logVertex3i ; - qglVertex3iv = logVertex3iv ; - qglVertex3s = logVertex3s ; - qglVertex3sv = logVertex3sv ; - qglVertex4d = logVertex4d ; - qglVertex4dv = logVertex4dv ; - qglVertex4f = logVertex4f ; - qglVertex4fv = logVertex4fv ; - qglVertex4i = logVertex4i ; - qglVertex4iv = logVertex4iv ; - qglVertex4s = logVertex4s ; - qglVertex4sv = logVertex4sv ; - qglVertexPointer = logVertexPointer ; - qglViewport = logViewport ; - } - else - { - qglAccum = dllAccum; - qglAlphaFunc = dllAlphaFunc; - qglAreTexturesResident = dllAreTexturesResident; - qglArrayElement = dllArrayElement; - qglBegin = dllBegin; - qglBindTexture = dllBindTexture; - qglBitmap = dllBitmap; - qglBlendFunc = dllBlendFunc; - qglCallList = dllCallList; - qglCallLists = dllCallLists; - qglClear = dllClear; - qglClearAccum = dllClearAccum; - qglClearColor = dllClearColor; - qglClearDepth = dllClearDepth; - qglClearIndex = dllClearIndex; - qglClearStencil = dllClearStencil; - qglClipPlane = dllClipPlane; - qglColor3b = dllColor3b; - qglColor3bv = dllColor3bv; - qglColor3d = dllColor3d; - qglColor3dv = dllColor3dv; - qglColor3f = dllColor3f; - qglColor3fv = dllColor3fv; - qglColor3i = dllColor3i; - qglColor3iv = dllColor3iv; - qglColor3s = dllColor3s; - qglColor3sv = dllColor3sv; - qglColor3ub = dllColor3ub; - qglColor3ubv = dllColor3ubv; - qglColor3ui = dllColor3ui; - qglColor3uiv = dllColor3uiv; - qglColor3us = dllColor3us; - qglColor3usv = dllColor3usv; - qglColor4b = dllColor4b; - qglColor4bv = dllColor4bv; - qglColor4d = dllColor4d; - qglColor4dv = dllColor4dv; - qglColor4f = dllColor4f; - qglColor4fv = dllColor4fv; - qglColor4i = dllColor4i; - qglColor4iv = dllColor4iv; - qglColor4s = dllColor4s; - qglColor4sv = dllColor4sv; - qglColor4ub = dllColor4ub; - qglColor4ubv = dllColor4ubv; - qglColor4ui = dllColor4ui; - qglColor4uiv = dllColor4uiv; - qglColor4us = dllColor4us; - qglColor4usv = dllColor4usv; - qglColorMask = dllColorMask; - qglColorMaterial = dllColorMaterial; - qglColorPointer = dllColorPointer; - qglCopyPixels = dllCopyPixels; - qglCopyTexImage1D = dllCopyTexImage1D; - qglCopyTexImage2D = dllCopyTexImage2D; - qglCopyTexSubImage1D = dllCopyTexSubImage1D; - qglCopyTexSubImage2D = dllCopyTexSubImage2D; - qglCullFace = dllCullFace; - qglDeleteLists = dllDeleteLists ; - qglDeleteTextures = dllDeleteTextures ; - qglDepthFunc = dllDepthFunc ; - qglDepthMask = dllDepthMask ; - qglDepthRange = dllDepthRange ; - qglDisable = dllDisable ; - qglDisableClientState = dllDisableClientState ; - qglDrawArrays = dllDrawArrays ; - qglDrawBuffer = dllDrawBuffer ; - qglDrawElements = dllDrawElements ; - qglDrawPixels = dllDrawPixels ; - qglEdgeFlag = dllEdgeFlag ; - qglEdgeFlagPointer = dllEdgeFlagPointer ; - qglEdgeFlagv = dllEdgeFlagv ; - qglEnable = dllEnable ; - qglEnableClientState = dllEnableClientState ; - qglEnd = dllEnd ; - qglEndList = dllEndList ; - qglEvalCoord1d = dllEvalCoord1d ; - qglEvalCoord1dv = dllEvalCoord1dv ; - qglEvalCoord1f = dllEvalCoord1f ; - qglEvalCoord1fv = dllEvalCoord1fv ; - qglEvalCoord2d = dllEvalCoord2d ; - qglEvalCoord2dv = dllEvalCoord2dv ; - qglEvalCoord2f = dllEvalCoord2f ; - qglEvalCoord2fv = dllEvalCoord2fv ; - qglEvalMesh1 = dllEvalMesh1 ; - qglEvalMesh2 = dllEvalMesh2 ; - qglEvalPoint1 = dllEvalPoint1 ; - qglEvalPoint2 = dllEvalPoint2 ; - qglFeedbackBuffer = dllFeedbackBuffer ; - qglFinish = dllFinish ; - qglFlush = dllFlush ; - qglFogf = dllFogf ; - qglFogfv = dllFogfv ; - qglFogi = dllFogi ; - qglFogiv = dllFogiv ; - qglFrontFace = dllFrontFace ; - qglFrustum = dllFrustum ; - qglGenLists = dllGenLists ; - qglGenTextures = dllGenTextures ; - qglGetBooleanv = dllGetBooleanv ; - qglGetClipPlane = dllGetClipPlane ; - qglGetDoublev = dllGetDoublev ; - qglGetError = dllGetError ; - qglGetFloatv = dllGetFloatv ; - qglGetIntegerv = dllGetIntegerv ; - qglGetLightfv = dllGetLightfv ; - qglGetLightiv = dllGetLightiv ; - qglGetMapdv = dllGetMapdv ; - qglGetMapfv = dllGetMapfv ; - qglGetMapiv = dllGetMapiv ; - qglGetMaterialfv = dllGetMaterialfv ; - qglGetMaterialiv = dllGetMaterialiv ; - qglGetPixelMapfv = dllGetPixelMapfv ; - qglGetPixelMapuiv = dllGetPixelMapuiv ; - qglGetPixelMapusv = dllGetPixelMapusv ; - qglGetPointerv = dllGetPointerv ; - qglGetPolygonStipple = dllGetPolygonStipple ; - qglGetString = dllGetString ; - qglGetTexEnvfv = dllGetTexEnvfv ; - qglGetTexEnviv = dllGetTexEnviv ; - qglGetTexGendv = dllGetTexGendv ; - qglGetTexGenfv = dllGetTexGenfv ; - qglGetTexGeniv = dllGetTexGeniv ; - qglGetTexImage = dllGetTexImage ; - qglGetTexLevelParameterfv = dllGetTexLevelParameterfv ; - qglGetTexLevelParameteriv = dllGetTexLevelParameteriv ; - qglGetTexParameterfv = dllGetTexParameterfv ; - qglGetTexParameteriv = dllGetTexParameteriv ; - qglHint = dllHint ; - qglIndexMask = dllIndexMask ; - qglIndexPointer = dllIndexPointer ; - qglIndexd = dllIndexd ; - qglIndexdv = dllIndexdv ; - qglIndexf = dllIndexf ; - qglIndexfv = dllIndexfv ; - qglIndexi = dllIndexi ; - qglIndexiv = dllIndexiv ; - qglIndexs = dllIndexs ; - qglIndexsv = dllIndexsv ; - qglIndexub = dllIndexub ; - qglIndexubv = dllIndexubv ; - qglInitNames = dllInitNames ; - qglInterleavedArrays = dllInterleavedArrays ; - qglIsEnabled = dllIsEnabled ; - qglIsList = dllIsList ; - qglIsTexture = dllIsTexture ; - qglLightModelf = dllLightModelf ; - qglLightModelfv = dllLightModelfv ; - qglLightModeli = dllLightModeli ; - qglLightModeliv = dllLightModeliv ; - qglLightf = dllLightf ; - qglLightfv = dllLightfv ; - qglLighti = dllLighti ; - qglLightiv = dllLightiv ; - qglLineStipple = dllLineStipple ; - qglLineWidth = dllLineWidth ; - qglListBase = dllListBase ; - qglLoadIdentity = dllLoadIdentity ; - qglLoadMatrixd = dllLoadMatrixd ; - qglLoadMatrixf = dllLoadMatrixf ; - qglLoadName = dllLoadName ; - qglLogicOp = dllLogicOp ; - qglMap1d = dllMap1d ; - qglMap1f = dllMap1f ; - qglMap2d = dllMap2d ; - qglMap2f = dllMap2f ; - qglMapGrid1d = dllMapGrid1d ; - qglMapGrid1f = dllMapGrid1f ; - qglMapGrid2d = dllMapGrid2d ; - qglMapGrid2f = dllMapGrid2f ; - qglMaterialf = dllMaterialf ; - qglMaterialfv = dllMaterialfv ; - qglMateriali = dllMateriali ; - qglMaterialiv = dllMaterialiv ; - qglMatrixMode = dllMatrixMode ; - qglMultMatrixd = dllMultMatrixd ; - qglMultMatrixf = dllMultMatrixf ; - qglNewList = dllNewList ; - qglNormal3b = dllNormal3b ; - qglNormal3bv = dllNormal3bv ; - qglNormal3d = dllNormal3d ; - qglNormal3dv = dllNormal3dv ; - qglNormal3f = dllNormal3f ; - qglNormal3fv = dllNormal3fv ; - qglNormal3i = dllNormal3i ; - qglNormal3iv = dllNormal3iv ; - qglNormal3s = dllNormal3s ; - qglNormal3sv = dllNormal3sv ; - qglNormalPointer = dllNormalPointer ; - qglOrtho = dllOrtho ; - qglPassThrough = dllPassThrough ; - qglPixelMapfv = dllPixelMapfv ; - qglPixelMapuiv = dllPixelMapuiv ; - qglPixelMapusv = dllPixelMapusv ; - qglPixelStoref = dllPixelStoref ; - qglPixelStorei = dllPixelStorei ; - qglPixelTransferf = dllPixelTransferf ; - qglPixelTransferi = dllPixelTransferi ; - qglPixelZoom = dllPixelZoom ; - qglPointSize = dllPointSize ; - qglPolygonMode = dllPolygonMode ; - qglPolygonOffset = dllPolygonOffset ; - qglPolygonStipple = dllPolygonStipple ; - qglPopAttrib = dllPopAttrib ; - qglPopClientAttrib = dllPopClientAttrib ; - qglPopMatrix = dllPopMatrix ; - qglPopName = dllPopName ; - qglPrioritizeTextures = dllPrioritizeTextures ; - qglPushAttrib = dllPushAttrib ; - qglPushClientAttrib = dllPushClientAttrib ; - qglPushMatrix = dllPushMatrix ; - qglPushName = dllPushName ; - qglRasterPos2d = dllRasterPos2d ; - qglRasterPos2dv = dllRasterPos2dv ; - qglRasterPos2f = dllRasterPos2f ; - qglRasterPos2fv = dllRasterPos2fv ; - qglRasterPos2i = dllRasterPos2i ; - qglRasterPos2iv = dllRasterPos2iv ; - qglRasterPos2s = dllRasterPos2s ; - qglRasterPos2sv = dllRasterPos2sv ; - qglRasterPos3d = dllRasterPos3d ; - qglRasterPos3dv = dllRasterPos3dv ; - qglRasterPos3f = dllRasterPos3f ; - qglRasterPos3fv = dllRasterPos3fv ; - qglRasterPos3i = dllRasterPos3i ; - qglRasterPos3iv = dllRasterPos3iv ; - qglRasterPos3s = dllRasterPos3s ; - qglRasterPos3sv = dllRasterPos3sv ; - qglRasterPos4d = dllRasterPos4d ; - qglRasterPos4dv = dllRasterPos4dv ; - qglRasterPos4f = dllRasterPos4f ; - qglRasterPos4fv = dllRasterPos4fv ; - qglRasterPos4i = dllRasterPos4i ; - qglRasterPos4iv = dllRasterPos4iv ; - qglRasterPos4s = dllRasterPos4s ; - qglRasterPos4sv = dllRasterPos4sv ; - qglReadBuffer = dllReadBuffer ; - qglReadPixels = dllReadPixels ; - qglRectd = dllRectd ; - qglRectdv = dllRectdv ; - qglRectf = dllRectf ; - qglRectfv = dllRectfv ; - qglRecti = dllRecti ; - qglRectiv = dllRectiv ; - qglRects = dllRects ; - qglRectsv = dllRectsv ; - qglRenderMode = dllRenderMode ; - qglRotated = dllRotated ; - qglRotatef = dllRotatef ; - qglScaled = dllScaled ; - qglScalef = dllScalef ; - qglScissor = dllScissor ; - qglSelectBuffer = dllSelectBuffer ; - qglShadeModel = dllShadeModel ; - qglStencilFunc = dllStencilFunc ; - qglStencilMask = dllStencilMask ; - qglStencilOp = dllStencilOp ; - qglTexCoord1d = dllTexCoord1d ; - qglTexCoord1dv = dllTexCoord1dv ; - qglTexCoord1f = dllTexCoord1f ; - qglTexCoord1fv = dllTexCoord1fv ; - qglTexCoord1i = dllTexCoord1i ; - qglTexCoord1iv = dllTexCoord1iv ; - qglTexCoord1s = dllTexCoord1s ; - qglTexCoord1sv = dllTexCoord1sv ; - qglTexCoord2d = dllTexCoord2d ; - qglTexCoord2dv = dllTexCoord2dv ; - qglTexCoord2f = dllTexCoord2f ; - qglTexCoord2fv = dllTexCoord2fv ; - qglTexCoord2i = dllTexCoord2i ; - qglTexCoord2iv = dllTexCoord2iv ; - qglTexCoord2s = dllTexCoord2s ; - qglTexCoord2sv = dllTexCoord2sv ; - qglTexCoord3d = dllTexCoord3d ; - qglTexCoord3dv = dllTexCoord3dv ; - qglTexCoord3f = dllTexCoord3f ; - qglTexCoord3fv = dllTexCoord3fv ; - qglTexCoord3i = dllTexCoord3i ; - qglTexCoord3iv = dllTexCoord3iv ; - qglTexCoord3s = dllTexCoord3s ; - qglTexCoord3sv = dllTexCoord3sv ; - qglTexCoord4d = dllTexCoord4d ; - qglTexCoord4dv = dllTexCoord4dv ; - qglTexCoord4f = dllTexCoord4f ; - qglTexCoord4fv = dllTexCoord4fv ; - qglTexCoord4i = dllTexCoord4i ; - qglTexCoord4iv = dllTexCoord4iv ; - qglTexCoord4s = dllTexCoord4s ; - qglTexCoord4sv = dllTexCoord4sv ; - qglTexCoordPointer = dllTexCoordPointer ; - qglTexEnvf = dllTexEnvf ; - qglTexEnvfv = dllTexEnvfv ; - qglTexEnvi = dllTexEnvi ; - qglTexEnviv = dllTexEnviv ; - qglTexGend = dllTexGend ; - qglTexGendv = dllTexGendv ; - qglTexGenf = dllTexGenf ; - qglTexGenfv = dllTexGenfv ; - qglTexGeni = dllTexGeni ; - qglTexGeniv = dllTexGeniv ; - qglTexImage1D = dllTexImage1D ; - qglTexImage2D = dllTexImage2D ; - qglTexParameterf = dllTexParameterf ; - qglTexParameterfv = dllTexParameterfv ; - qglTexParameteri = dllTexParameteri ; - qglTexParameteriv = dllTexParameteriv ; - qglTexSubImage1D = dllTexSubImage1D ; - qglTexSubImage2D = dllTexSubImage2D ; - qglTranslated = dllTranslated ; - qglTranslatef = dllTranslatef ; - qglVertex2d = dllVertex2d ; - qglVertex2dv = dllVertex2dv ; - qglVertex2f = dllVertex2f ; - qglVertex2fv = dllVertex2fv ; - qglVertex2i = dllVertex2i ; - qglVertex2iv = dllVertex2iv ; - qglVertex2s = dllVertex2s ; - qglVertex2sv = dllVertex2sv ; - qglVertex3d = dllVertex3d ; - qglVertex3dv = dllVertex3dv ; - qglVertex3f = dllVertex3f ; - qglVertex3fv = dllVertex3fv ; - qglVertex3i = dllVertex3i ; - qglVertex3iv = dllVertex3iv ; - qglVertex3s = dllVertex3s ; - qglVertex3sv = dllVertex3sv ; - qglVertex4d = dllVertex4d ; - qglVertex4dv = dllVertex4dv ; - qglVertex4f = dllVertex4f ; - qglVertex4fv = dllVertex4fv ; - qglVertex4i = dllVertex4i ; - qglVertex4iv = dllVertex4iv ; - qglVertex4s = dllVertex4s ; - qglVertex4sv = dllVertex4sv ; - qglVertexPointer = dllVertexPointer ; - qglViewport = dllViewport ; - } + } diff --git a/src/tools/compilers/dmap/optimize.cpp b/src/tools/compilers/dmap/optimize.cpp index 418f9c54..e9a8e230 100644 --- a/src/tools/compilers/dmap/optimize.cpp +++ b/src/tools/compilers/dmap/optimize.cpp @@ -243,18 +243,18 @@ static void DrawAllEdges( void ) { Draw_ClearWindow(); - qglBegin( GL_LINES ); + glBegin( GL_LINES ); for ( i = 0 ; i < numOptEdges ; i++ ) { if ( optEdges[i].v1 == NULL ) { continue; } - qglColor3f( 1, 0, 0 ); - qglVertex3fv( optEdges[i].v1->pv.ToFloatPtr() ); - qglColor3f( 0, 0, 0 ); - qglVertex3fv( optEdges[i].v2->pv.ToFloatPtr() ); + glColor3f( 1, 0, 0 ); + glVertex3fv( optEdges[i].v1->pv.ToFloatPtr() ); + glColor3f( 0, 0, 0 ); + glVertex3fv( optEdges[i].v2->pv.ToFloatPtr() ); } - qglEnd(); - qglFlush(); + glEnd(); + glFlush(); // GLimp_SwapBuffers(); } @@ -271,17 +271,17 @@ static void DrawVerts( optIsland_t *island ) { return; } - qglEnable( GL_BLEND ); - qglBlendFunc( GL_ONE, GL_ONE ); - qglColor3f( 0.3f, 0.3f, 0.3f ); - qglPointSize( 3 ); - qglBegin( GL_POINTS ); + glEnable( GL_BLEND ); + glBlendFunc( GL_ONE, GL_ONE ); + glColor3f( 0.3f, 0.3f, 0.3f ); + glPointSize( 3 ); + glBegin( GL_POINTS ); for ( vert = island->verts ; vert ; vert = vert->islandLink ) { - qglVertex3fv( vert->pv.ToFloatPtr() ); + glVertex3fv( vert->pv.ToFloatPtr() ); } - qglEnd(); - qglDisable( GL_BLEND ); - qglFlush(); + glEnd(); + glDisable( GL_BLEND ); + glFlush(); } /* @@ -298,18 +298,18 @@ static void DrawEdges( optIsland_t *island ) { Draw_ClearWindow(); - qglBegin( GL_LINES ); + glBegin( GL_LINES ); for ( edge = island->edges ; edge ; edge = edge->islandLink ) { if ( edge->v1 == NULL ) { continue; } - qglColor3f( 1, 0, 0 ); - qglVertex3fv( edge->v1->pv.ToFloatPtr() ); - qglColor3f( 0, 0, 0 ); - qglVertex3fv( edge->v2->pv.ToFloatPtr() ); + glColor3f( 1, 0, 0 ); + glVertex3fv( edge->v1->pv.ToFloatPtr() ); + glColor3f( 0, 0, 0 ); + glVertex3fv( edge->v2->pv.ToFloatPtr() ); } - qglEnd(); - qglFlush(); + glEnd(); + glFlush(); // GLimp_SwapBuffers(); } @@ -483,12 +483,12 @@ static bool TryAddNewEdge( optVertex_t *v1, optVertex_t *v2, optIsland_t *island } if ( dmapGlobals.drawflag ) { - qglBegin( GL_LINES ); - qglColor3f( 0, ( 128 + orandom.RandomInt( 127 ) )/ 255.0, 0 ); - qglVertex3fv( v1->pv.ToFloatPtr() ); - qglVertex3fv( v2->pv.ToFloatPtr() ); - qglEnd(); - qglFlush(); + glBegin( GL_LINES ); + glColor3f( 0, ( 128 + orandom.RandomInt( 127 ) )/ 255.0, 0 ); + glVertex3fv( v1->pv.ToFloatPtr() ); + glVertex3fv( v2->pv.ToFloatPtr() ); + glEnd(); + glFlush(); } // add it e = AllocEdge(); @@ -686,18 +686,18 @@ static void RemoveIfColinear( optVertex_t *ov, optIsland_t *island ) { } if ( dmapGlobals.drawflag ) { - qglBegin( GL_LINES ); - qglColor3f( 1, 1, 0 ); - qglVertex3fv( v1->pv.ToFloatPtr() ); - qglVertex3fv( v2->pv.ToFloatPtr() ); - qglEnd(); - qglFlush(); - qglBegin( GL_LINES ); - qglColor3f( 0, 1, 1 ); - qglVertex3fv( v2->pv.ToFloatPtr() ); - qglVertex3fv( v3->pv.ToFloatPtr() ); - qglEnd(); - qglFlush(); + glBegin( GL_LINES ); + glColor3f( 1, 1, 0 ); + glVertex3fv( v1->pv.ToFloatPtr() ); + glVertex3fv( v2->pv.ToFloatPtr() ); + glEnd(); + glFlush(); + glBegin( GL_LINES ); + glColor3f( 0, 1, 1 ); + glVertex3fv( v2->pv.ToFloatPtr() ); + glVertex3fv( v3->pv.ToFloatPtr() ); + glEnd(); + glFlush(); } // replace the two edges with a single edge @@ -960,18 +960,18 @@ static void CreateOptTri( optVertex_t *first, optEdge_t *e1, optEdge_t *e2, optI // identify the third edge if ( dmapGlobals.drawflag ) { - qglColor3f(1,1,0); - qglBegin( GL_LINES ); - qglVertex3fv( e1->v1->pv.ToFloatPtr() ); - qglVertex3fv( e1->v2->pv.ToFloatPtr() ); - qglEnd(); - qglFlush(); - qglColor3f(0,1,1); - qglBegin( GL_LINES ); - qglVertex3fv( e2->v1->pv.ToFloatPtr() ); - qglVertex3fv( e2->v2->pv.ToFloatPtr() ); - qglEnd(); - qglFlush(); + glColor3f(1,1,0); + glBegin( GL_LINES ); + glVertex3fv( e1->v1->pv.ToFloatPtr() ); + glVertex3fv( e1->v2->pv.ToFloatPtr() ); + glEnd(); + glFlush(); + glColor3f(0,1,1); + glBegin( GL_LINES ); + glVertex3fv( e2->v1->pv.ToFloatPtr() ); + glVertex3fv( e2->v2->pv.ToFloatPtr() ); + glEnd(); + glFlush(); } for ( opposite = second->edges ; opposite ; ) { @@ -993,12 +993,12 @@ static void CreateOptTri( optVertex_t *first, optEdge_t *e1, optEdge_t *e2, optI } if ( dmapGlobals.drawflag ) { - qglColor3f(1,0,1); - qglBegin( GL_LINES ); - qglVertex3fv( opposite->v1->pv.ToFloatPtr() ); - qglVertex3fv( opposite->v2->pv.ToFloatPtr() ); - qglEnd(); - qglFlush(); + glColor3f(1,0,1); + glBegin( GL_LINES ); + glVertex3fv( opposite->v1->pv.ToFloatPtr() ); + glVertex3fv( opposite->v2->pv.ToFloatPtr() ); + glEnd(); + glFlush(); } // create new triangle @@ -1011,12 +1011,12 @@ static void CreateOptTri( optVertex_t *first, optEdge_t *e1, optEdge_t *e2, optI island->tris = optTri; if ( dmapGlobals.drawflag ) { - qglColor3f( 1, 1, 1 ); - qglPointSize( 4 ); - qglBegin( GL_POINTS ); - qglVertex3fv( optTri->midpoint.ToFloatPtr() ); - qglEnd(); - qglFlush(); + glColor3f( 1, 1, 1 ); + glPointSize( 4 ); + glBegin( GL_POINTS ); + glVertex3fv( optTri->midpoint.ToFloatPtr() ); + glEnd(); + glFlush(); } // find the midpoint, and scan through all the original triangles to @@ -1033,22 +1033,22 @@ static void CreateOptTri( optVertex_t *first, optEdge_t *e1, optEdge_t *e2, optI } if ( dmapGlobals.drawflag ) { if ( optTri->filled ) { - qglColor3f( ( 128 + orandom.RandomInt( 127 ) )/ 255.0, 0, 0 ); + glColor3f( ( 128 + orandom.RandomInt( 127 ) )/ 255.0, 0, 0 ); } else { - qglColor3f( 0, ( 128 + orandom.RandomInt( 127 ) ) / 255.0, 0 ); + glColor3f( 0, ( 128 + orandom.RandomInt( 127 ) ) / 255.0, 0 ); } - qglBegin( GL_TRIANGLES ); - qglVertex3fv( optTri->v[0]->pv.ToFloatPtr() ); - qglVertex3fv( optTri->v[1]->pv.ToFloatPtr() ); - qglVertex3fv( optTri->v[2]->pv.ToFloatPtr() ); - qglEnd(); - qglColor3f( 1, 1, 1 ); - qglBegin( GL_LINE_LOOP ); - qglVertex3fv( optTri->v[0]->pv.ToFloatPtr() ); - qglVertex3fv( optTri->v[1]->pv.ToFloatPtr() ); - qglVertex3fv( optTri->v[2]->pv.ToFloatPtr() ); - qglEnd(); - qglFlush(); + glBegin( GL_TRIANGLES ); + glVertex3fv( optTri->v[0]->pv.ToFloatPtr() ); + glVertex3fv( optTri->v[1]->pv.ToFloatPtr() ); + glVertex3fv( optTri->v[2]->pv.ToFloatPtr() ); + glEnd(); + glColor3f( 1, 1, 1 ); + glBegin( GL_LINE_LOOP ); + glVertex3fv( optTri->v[0]->pv.ToFloatPtr() ); + glVertex3fv( optTri->v[1]->pv.ToFloatPtr() ); + glVertex3fv( optTri->v[2]->pv.ToFloatPtr() ); + glEnd(); + glFlush(); } // link the triangle to it's edges @@ -1112,12 +1112,12 @@ static void BuildOptTriangles( optIsland_t *island ) { #if 0 if ( dmapGlobals.drawflag && ov == (optVertex_t *)0x1845a60 ) { for ( e1 = ov->edges ; e1 ; e1 = e1Next ) { - qglBegin( GL_LINES ); - qglColor3f( 0,1,0 ); - qglVertex3fv( e1->v1->pv.ToFloatPtr() ); - qglVertex3fv( e1->v2->pv.ToFloatPtr() ); - qglEnd(); - qglFlush(); + glBegin( GL_LINES ); + glColor3f( 0,1,0 ); + glVertex3fv( e1->v1->pv.ToFloatPtr() ); + glVertex3fv( e1->v2->pv.ToFloatPtr() ); + glEnd(); + glFlush(); if ( e1->v1 == ov ) { e1Next = e1->v1link; } else if ( e1->v2 == ov ) { @@ -1361,15 +1361,15 @@ static void DrawOriginalEdges( int numOriginalEdges, originalEdges_t *originalEd } Draw_ClearWindow(); - qglBegin( GL_LINES ); + glBegin( GL_LINES ); for ( i = 0 ; i < numOriginalEdges ; i++ ) { - qglColor3f( 1, 0, 0 ); - qglVertex3fv( originalEdges[i].v1->pv.ToFloatPtr() ); - qglColor3f( 0, 0, 0 ); - qglVertex3fv( originalEdges[i].v2->pv.ToFloatPtr() ); + glColor3f( 1, 0, 0 ); + glVertex3fv( originalEdges[i].v1->pv.ToFloatPtr() ); + glColor3f( 0, 0, 0 ); + glVertex3fv( originalEdges[i].v2->pv.ToFloatPtr() ); } - qglEnd(); - qglFlush(); + glEnd(); + glFlush(); } @@ -1487,13 +1487,13 @@ void SplitOriginalEdgesAtCrossings( optimizeGroup_t *opt ) { for ( i = 0 ; i < numOriginalEdges ; i++ ) { if ( dmapGlobals.drawflag ) { DrawOriginalEdges( numOriginalEdges, originalEdges ); - qglBegin( GL_LINES ); - qglColor3f( 0, 1, 0 ); - qglVertex3fv( originalEdges[i].v1->pv.ToFloatPtr() ); - qglColor3f( 0, 0, 1 ); - qglVertex3fv( originalEdges[i].v2->pv.ToFloatPtr() ); - qglEnd(); - qglFlush(); + glBegin( GL_LINES ); + glColor3f( 0, 1, 0 ); + glVertex3fv( originalEdges[i].v1->pv.ToFloatPtr() ); + glColor3f( 0, 0, 1 ); + glVertex3fv( originalEdges[i].v2->pv.ToFloatPtr() ); + glEnd(); + glFlush(); } for ( j = i+1 ; j < numOriginalEdges ; j++ ) { optVertex_t *v1, *v2, *v3, *v4; From 21d176a8c72db22956d6a62e8ca439311c9422c8 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Sat, 22 May 2021 11:04:56 -0700 Subject: [PATCH 02/38] Missing file from previous checkin. --- src/renderer/OpenGL/gl_Image.cpp | 475 +++++++++++++++++++++++++++++++ 1 file changed, 475 insertions(+) create mode 100644 src/renderer/OpenGL/gl_Image.cpp diff --git a/src/renderer/OpenGL/gl_Image.cpp b/src/renderer/OpenGL/gl_Image.cpp new file mode 100644 index 00000000..c0eef97d --- /dev/null +++ b/src/renderer/OpenGL/gl_Image.cpp @@ -0,0 +1,475 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ + +#include "precompiled.h" + +/* +================================================================================================ +Contains the Image implementation for OpenGL. +================================================================================================ +*/ + +#include "../tr_local.h" + +/* +======================== +idImage::SubImageUpload +======================== +*/ +void idImage::SubImageUpload( int mipLevel, int x, int y, int z, int width, int height, const void * pic, int pixelPitch ) const { + assert( x >= 0 && y >= 0 && mipLevel >= 0 && width >= 0 && height >= 0 && mipLevel < opts.numLevels ); + + int compressedSize = 0; + + if ( IsCompressed() ) { + assert( !(x&3) && !(y&3) ); + + // compressed size may be larger than the dimensions due to padding to quads + int quadW = ( width + 3 ) & ~3; + int quadH = ( height + 3 ) & ~3; + compressedSize = quadW * quadH * BitsForFormat( opts.format ) / 8; + + int padW = ( opts.width + 3 ) & ~3; + int padH = ( opts.height + 3 ) & ~3; + (void)padH; + (void)padW; + assert( x + width <= padW && y + height <= padH ); + // upload the non-aligned value, OpenGL understands that there + // will be padding + if ( x + width > opts.width ) { + width = opts.width - x; + } + if ( y + height > opts.height ) { + height = opts.height - x; + } + } else { + assert( x + width <= opts.width && y + height <= opts.height ); + } + + int target; + int uploadTarget; + if ( opts.textureType == TT_2D ) { + target = GL_TEXTURE_2D; + uploadTarget = GL_TEXTURE_2D; + } else if ( opts.textureType == TT_CUBIC ) { + target = GL_TEXTURE_CUBE_MAP_EXT; + uploadTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT + z; + } else { + assert( !"invalid opts.textureType" ); + target = GL_TEXTURE_2D; + uploadTarget = GL_TEXTURE_2D; + } + + glBindTexture( target, texnum ); + + if ( pixelPitch != 0 ) { + glPixelStorei( GL_UNPACK_ROW_LENGTH, pixelPitch ); + } + if ( opts.format == FMT_RGB565 ) { + glPixelStorei( GL_UNPACK_SWAP_BYTES, GL_TRUE ); + } +#ifdef DEBUG + GL_CheckErrors(); +#endif + if ( IsCompressed() ) { + glCompressedTexSubImage2DARB( uploadTarget, mipLevel, x, y, width, height, internalFormat, compressedSize, pic ); + } else { + + // make sure the pixel store alignment is correct so that lower mips get created + // properly for odd shaped textures - this fixes the mip mapping issues with + // fonts + int unpackAlignment = width * BitsForFormat( (textureFormat_t)opts.format ) / 8; + if ( ( unpackAlignment & 3 ) == 0 ) { + glPixelStorei( GL_UNPACK_ALIGNMENT, 4 ); + } else { + glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); + } + + glTexSubImage2D( uploadTarget, mipLevel, x, y, width, height, dataFormat, dataType, pic ); + } +#ifdef DEBUG + GL_CheckErrors(); +#endif + if ( opts.format == FMT_RGB565 ) { + glPixelStorei( GL_UNPACK_SWAP_BYTES, GL_FALSE ); + } + if ( pixelPitch != 0 ) { + glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 ); + } +} + +/* +======================== +idImage::SetPixel +======================== +*/ +void idImage::SetPixel( int mipLevel, int x, int y, const void * data, int dataSize ) { + SubImageUpload( mipLevel, x, y, 0, 1, 1, data ); +} + +/* +======================== +idImage::SetTexParameters +======================== +*/ +void idImage::SetTexParameters() { + int target = GL_TEXTURE_2D; + switch ( opts.textureType ) { + case TT_2D: + target = GL_TEXTURE_2D; + break; + case TT_CUBIC: + target = GL_TEXTURE_CUBE_MAP_EXT; + break; + default: + idLib::FatalError( "%s: bad texture type %d", GetName(), opts.textureType ); + return; + } + + // ALPHA, LUMINANCE, LUMINANCE_ALPHA, and INTENSITY have been removed + // in OpenGL 3.2. In order to mimic those modes, we use the swizzle operators +#if defined( USE_CORE_PROFILE ) + if ( opts.colorFormat == CFM_GREEN_ALPHA ) { + glTexParameteri( target, GL_TEXTURE_SWIZZLE_R, GL_ONE ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_G, GL_ONE ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_B, GL_ONE ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_A, GL_GREEN ); + } else if ( opts.format == FMT_LUM8 ) { + glTexParameteri( target, GL_TEXTURE_SWIZZLE_R, GL_RED ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_G, GL_RED ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_B, GL_RED ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_A, GL_ONE ); + } else if ( opts.format == FMT_L8A8 ) { + glTexParameteri( target, GL_TEXTURE_SWIZZLE_R, GL_RED ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_G, GL_RED ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_B, GL_RED ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_A, GL_GREEN ); + } else if ( opts.format == FMT_ALPHA ) { + glTexParameteri( target, GL_TEXTURE_SWIZZLE_R, GL_ONE ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_G, GL_ONE ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_B, GL_ONE ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_A, GL_RED ); + } else if ( opts.format == FMT_INT8 ) { + glTexParameteri( target, GL_TEXTURE_SWIZZLE_R, GL_RED ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_G, GL_RED ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_B, GL_RED ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_A, GL_RED ); + } else { + glTexParameteri( target, GL_TEXTURE_SWIZZLE_R, GL_RED ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_G, GL_GREEN ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_B, GL_BLUE ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_A, GL_ALPHA ); + } +#else + if ( opts.colorFormat == CFM_GREEN_ALPHA ) { + glTexParameteri( target, GL_TEXTURE_SWIZZLE_R, GL_ONE ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_G, GL_ONE ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_B, GL_ONE ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_A, GL_GREEN ); + } else if ( opts.format == FMT_ALPHA ) { + glTexParameteri( target, GL_TEXTURE_SWIZZLE_R, GL_ONE ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_G, GL_ONE ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_B, GL_ONE ); + glTexParameteri( target, GL_TEXTURE_SWIZZLE_A, GL_RED ); + } +#endif + + switch( filter ) { + case TF_DEFAULT: + glTexParameterf(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameterf( target, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + break; + case TF_LINEAR: + glTexParameterf( target, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + glTexParameterf( target, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + break; + case TF_NEAREST: + glTexParameterf( target, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); + glTexParameterf( target, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); + break; + default: + common->FatalError( "%s: bad texture filter %d", GetName(), filter ); + } + + { + // only do aniso filtering on mip mapped images + if ( filter == TF_DEFAULT ) { + int aniso = glConfig.maxTextureAnisotropy; + if ( aniso < 0 ) { + aniso = 0; + } + glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso ); + } else { + glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1 ); + } + } + //if ( glConfig.textureLODBiasAvailable && ( usage != TD_FONT ) ) { + // // use a blurring LOD bias in combination with high anisotropy to fix our aliasing grate textures... + // glTexParameterf(target, GL_TEXTURE_LOD_BIAS_EXT, r_lodBias.GetFloat() ); + //} + + // set the wrap/clamp modes + switch( repeat ) { + case TR_REPEAT: + glTexParameterf( target, GL_TEXTURE_WRAP_S, GL_REPEAT ); + glTexParameterf( target, GL_TEXTURE_WRAP_T, GL_REPEAT ); + break; + case TR_CLAMP_TO_ZERO: { + float color[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; + glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, color ); + glTexParameterf( target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER ); + glTexParameterf( target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER ); + } + break; + case TR_CLAMP_TO_ZERO_ALPHA: { + float color[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; + glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, color ); + glTexParameterf( target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER ); + glTexParameterf( target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER ); + } + break; + case TR_CLAMP: + glTexParameterf( target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); + glTexParameterf( target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); + break; + default: + common->FatalError( "%s: bad texture repeat %d", GetName(), repeat ); + } +} + +/* +======================== +idImage::AllocImage + +Every image will pass through this function. Allocates all the necessary MipMap levels for the +Image, but doesn't put anything in them. + +This should not be done during normal game-play, if you can avoid it. +======================== +*/ +void idImage::AllocImage() { + GL_CheckErrors(); + PurgeImage(); + + switch ( opts.format ) { + case FMT_RGBA8: + internalFormat = GL_RGBA8; + dataFormat = GL_RGBA; + dataType = GL_UNSIGNED_BYTE; + break; + case FMT_XRGB8: + internalFormat = GL_RGB; + dataFormat = GL_RGBA; + dataType = GL_UNSIGNED_BYTE; + break; + case FMT_RGB565: + internalFormat = GL_RGB; + dataFormat = GL_RGB; + dataType = GL_UNSIGNED_SHORT_5_6_5; + break; + case FMT_ALPHA: +#if defined( USE_CORE_PROFILE ) + internalFormat = GL_R8; + dataFormat = GL_RED; +#else + internalFormat = GL_ALPHA8; + dataFormat = GL_ALPHA; +#endif + dataType = GL_UNSIGNED_BYTE; + break; + case FMT_L8A8: +#if defined( USE_CORE_PROFILE ) + internalFormat = GL_RG8; + dataFormat = GL_RG; +#else + internalFormat = GL_LUMINANCE8_ALPHA8; + dataFormat = GL_LUMINANCE_ALPHA; +#endif + dataType = GL_UNSIGNED_BYTE; + break; + case FMT_LUM8: +#if defined( USE_CORE_PROFILE ) + internalFormat = GL_R8; + dataFormat = GL_RED; +#else + internalFormat = GL_LUMINANCE8; + dataFormat = GL_LUMINANCE; +#endif + dataType = GL_UNSIGNED_BYTE; + break; + case FMT_INT8: +#if defined( USE_CORE_PROFILE ) + internalFormat = GL_R8; + dataFormat = GL_RED; +#else + internalFormat = GL_INTENSITY8; + dataFormat = GL_LUMINANCE; +#endif + dataType = GL_UNSIGNED_BYTE; + break; + case FMT_DXT1: + internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; + dataFormat = GL_RGBA; + dataType = GL_UNSIGNED_BYTE; + break; + case FMT_DXT5: + internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; + dataFormat = GL_RGBA; + dataType = GL_UNSIGNED_BYTE; + break; + case FMT_DEPTH: + internalFormat = GL_DEPTH_COMPONENT; + dataFormat = GL_DEPTH_COMPONENT; + dataType = GL_UNSIGNED_BYTE; + break; + case FMT_X16: + internalFormat = GL_INTENSITY16; + dataFormat = GL_LUMINANCE; + dataType = GL_UNSIGNED_SHORT; + break; + case FMT_Y16_X16: + internalFormat = GL_LUMINANCE16_ALPHA16; + dataFormat = GL_LUMINANCE_ALPHA; + dataType = GL_UNSIGNED_SHORT; + break; + default: + idLib::Error( "Unhandled image format %d in %s\n", opts.format, GetName() ); + } + + // if we don't have a rendering context, just return after we + // have filled in the parms. We must have the values set, or + // an image match from a shader before OpenGL starts would miss + // the generated texture + if ( !tr.IsOpenGLRunning()) { + return; + } + + // generate the texture number + glGenTextures( 1, (GLuint *)&texnum ); + assert( texnum != TEXTURE_NOT_LOADED ); + + //---------------------------------------------------- + // allocate all the mip levels with NULL data + //---------------------------------------------------- + + int numSides; + int target; + int uploadTarget; + if ( opts.textureType == TT_2D ) { + target = uploadTarget = GL_TEXTURE_2D; + numSides = 1; + } else if ( opts.textureType == TT_CUBIC ) { + target = GL_TEXTURE_CUBE_MAP_EXT; + uploadTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT; + numSides = 6; + } else { + assert( !"opts.textureType" ); + target = uploadTarget = GL_TEXTURE_2D; + numSides = 1; + } + + glBindTexture( target, texnum ); + + for ( int side = 0; side < numSides; side++ ) { + int w = opts.width; + int h = opts.height; + if ( opts.textureType == TT_CUBIC ) { + h = w; + } + for ( int level = 0; level < opts.numLevels; level++ ) { + + // clear out any previous error + GL_CheckErrors(); + + if ( IsCompressed() ) { + int compressedSize = ( ((w+3)/4) * ((h+3)/4) * int64_t( 16 ) * BitsForFormat( opts.format ) ) / 8; + + // Even though the OpenGL specification allows the 'data' pointer to be NULL, for some + // drivers we actually need to upload data to get it to allocate the texture. + // However, on 32-bit systems we may fail to allocate a large block of memory for large + // textures. We handle this case by using HeapAlloc directly and allowing the allocation + // to fail in which case we simply pass down NULL to glCompressedTexImage2D and hope for the best. + // As of 2011-10-6 using NVIDIA hardware and drivers we have to allocate the memory with HeapAlloc + // with the exact size otherwise large image allocation (for instance for physical page textures) + // may fail on Vista 32-bit. + void * data = HeapAlloc( GetProcessHeap(), 0, compressedSize ); + glCompressedTexImage2DARB( uploadTarget+side, level, internalFormat, w, h, 0, compressedSize, data ); + if ( data != NULL ) { + HeapFree( GetProcessHeap(), 0, data ); + } + } else { + glTexImage2D( uploadTarget + side, level, internalFormat, w, h, 0, dataFormat, dataType, NULL ); + } + + GL_CheckErrors(); + + w = Max( 1, w >> 1 ); + h = Max( 1, h >> 1 ); + } + } + + glTexParameteri( target, GL_TEXTURE_MAX_LEVEL, opts.numLevels - 1 ); + + // see if we messed anything up + GL_CheckErrors(); + + SetTexParameters(); + + GL_CheckErrors(); +} + +/* +======================== +idImage::PurgeImage +======================== +*/ +void idImage::PurgeImage() { + if ( texnum != TEXTURE_NOT_LOADED ) { + glDeleteTextures( 1, (GLuint *)&texnum ); // this should be the ONLY place it is ever called! + texnum = TEXTURE_NOT_LOADED; + } + // clear all the current binding caches, so the next bind will do a real one + for ( int i = 0 ; i < MAX_MULTITEXTURE_UNITS ; i++ ) { + backEnd.glState.tmu[i].current2DMap = TEXTURE_NOT_LOADED; + backEnd.glState.tmu[i].currentCubeMap = TEXTURE_NOT_LOADED; + } +} + +/* +======================== +idImage::Resize +======================== +*/ +void idImage::Resize( int width, int height ) { + if ( opts.width == width && opts.height == height ) { + return; + } + opts.width = width; + opts.height = height; + AllocImage(); +} From e21916590338ab47cedc672adfd38fd9892ea48e Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Sat, 22 May 2021 13:22:18 -0700 Subject: [PATCH 03/38] MSAA support, IcedTech Game Render Pipeline. --- q4base/materials/postprocess.mtr | 7 + src/doomdll.vcxproj | 2 + src/doomdll.vcxproj.filters | 6 + src/game.vcxproj | 1 + src/game.vcxproj.filters | 3 + src/game/Game_local.cpp | 4 + src/game/Game_local.h | 20 ++- src/game/Game_render.cpp | 134 +++++++++++++++++ src/game/PlayerView.cpp | 18 ++- src/renderer/Image.h | 1 + src/renderer/ImageManager.cpp | 5 + src/renderer/ImageOpts.h | 15 ++ src/renderer/OpenGL/gl_Image.cpp | 14 +- src/renderer/OpenGL/gl_RenderTexture.cpp | 183 +++++++++++++++++++++++ src/renderer/RenderSystem.cpp | 125 ++++++++++++++++ src/renderer/RenderSystem.h | 36 +++++ src/renderer/RenderTexture.h | 74 +++++++++ src/renderer/draw_common.cpp | 9 ++ src/renderer/tr_backend.cpp | 98 ++++++++++++ src/renderer/tr_local.h | 39 ++++- 20 files changed, 784 insertions(+), 10 deletions(-) create mode 100644 q4base/materials/postprocess.mtr create mode 100644 src/game/Game_render.cpp create mode 100644 src/renderer/OpenGL/gl_RenderTexture.cpp create mode 100644 src/renderer/RenderTexture.h diff --git a/q4base/materials/postprocess.mtr b/q4base/materials/postprocess.mtr new file mode 100644 index 00000000..11f5e3ed --- /dev/null +++ b/q4base/materials/postprocess.mtr @@ -0,0 +1,7 @@ +postprocess/nopostprocess +{ + sort postProcess + { + map _forwardRenderResolvedAlbedo + } +} \ No newline at end of file diff --git a/src/doomdll.vcxproj b/src/doomdll.vcxproj index 0064bfaa..c98402fa 100644 --- a/src/doomdll.vcxproj +++ b/src/doomdll.vcxproj @@ -341,6 +341,7 @@ + @@ -544,6 +545,7 @@ + diff --git a/src/doomdll.vcxproj.filters b/src/doomdll.vcxproj.filters index 451c839a..9ca7f2eb 100644 --- a/src/doomdll.vcxproj.filters +++ b/src/doomdll.vcxproj.filters @@ -618,6 +618,9 @@ External\glew + + Renderer + @@ -1325,6 +1328,9 @@ External\glew + + Renderer\OpenGL + diff --git a/src/game.vcxproj b/src/game.vcxproj index 93b689b7..76fb83e0 100644 --- a/src/game.vcxproj +++ b/src/game.vcxproj @@ -227,6 +227,7 @@ + diff --git a/src/game.vcxproj.filters b/src/game.vcxproj.filters index b0c8eac0..51c80460 100644 --- a/src/game.vcxproj.filters +++ b/src/game.vcxproj.filters @@ -519,6 +519,9 @@ Game + + Game + diff --git a/src/game/Game_local.cpp b/src/game/Game_local.cpp index eb39ba0d..c66dc7a6 100644 --- a/src/game/Game_local.cpp +++ b/src/game/Game_local.cpp @@ -547,6 +547,10 @@ void idGameLocal::Init( void ) { gamestate = GAMESTATE_NOMAP; +// jmarshall + InitGameRenderSystem(); +// jmarshall end + Printf( "...%d aas types\n", aasList.Num() ); Printf( "game initialized.\n" ); Printf( "---------------------------------------------\n" ); diff --git a/src/game/Game_local.h b/src/game/Game_local.h index 725017e8..e3411dd4 100644 --- a/src/game/Game_local.h +++ b/src/game/Game_local.h @@ -313,6 +313,15 @@ class idEntityPtr { class rvGravityArea; // RAVEN END +// jmarshall +struct rvmGameRender_t { + idRenderTexture* forwardRenderPassRT; + idRenderTexture* forwardRenderPassResolvedRT; + const idMaterial* noPostProcessMaterial; + const idMaterial* blackPostProcessMaterial; +}; +// jmarshall end + //============================================================================ // ddynerman: moved MultiplayerGame.h down here, so it can use more stuff in Game_local (idEntityPtr) #include "MultiplayerGame.h" @@ -997,6 +1006,10 @@ class idGameLocal : public idGame { idStrList shakeSounds; +// jmarshall + rvmGameRender_t gameRender; +// jmarshall end + byte lagometer[ LAGO_IMG_HEIGHT ][ LAGO_IMG_WIDTH ][ 4 ]; idMsgQueue unreliableMessages[ MAX_CLIENTS+1 ]; // MAX_CLIENTS slot for server demo recording @@ -1100,7 +1113,12 @@ class idGameLocal : public idGame { pvsHandle_t GetClientPVS( idPlayer *player, pvsType_t type ); int GetCurrentDemoProtocol( void ) { return demo_protocol; } - +// jmarshall + void RenderScene(const renderView_t* view, idRenderWorld* renderWorld, idCamera* portalSky); +private: + void ResizeRenderTextures(int width, int height); + void InitGameRenderSystem(void); +// jmarshall end private: char clientGuids[ MAX_CLIENTS ][ CLIENT_GUID_LENGTH ]; idList banList; diff --git a/src/game/Game_render.cpp b/src/game/Game_render.cpp new file mode 100644 index 00000000..0659728d --- /dev/null +++ b/src/game/Game_render.cpp @@ -0,0 +1,134 @@ +// Game_render.cpp +// + +#include "precompiled.h" +#include "Game_local.h" + +/* +======================================= + +Game Render + +The engine renderer is designed to do two things, generate the geometry pass, and the shadow passes. The pipeline, +including post process, is now handled in the game code. This allows more granular control over how the final pixels, +are presented on screen based on whatever is going on in game. + +======================================= +*/ + +/* +======================== +idGameLocal::InitGameRenderSystem +======================== +*/ +void idGameLocal::InitGameRenderSystem(void) { + { + idImageOpts opts; + opts.format = FMT_RGBA8; + opts.colorFormat = CFM_DEFAULT; + opts.numLevels = 1; + opts.textureType = TT_2D; + opts.isPersistant = true; + opts.width = renderSystem->GetScreenWidth(); + opts.height = renderSystem->GetScreenHeight(); + opts.numMSAASamples = 4; // renderSystem->GetNumMSAASamples(); + + idImage *albedoImage = renderSystem->CreateImage("_forwardRenderAlbedo", &opts, TF_LINEAR); + idImage *emissiveImage = renderSystem->CreateImage("_forwardRenderEmissive", &opts, TF_LINEAR); + + opts.numMSAASamples = 4; // renderSystem->GetNumMSAASamples(); + opts.format = FMT_DEPTH_STENCIL; + idImage *depthImage = renderSystem->CreateImage("_forwardRenderDepth", &opts, TF_LINEAR); + + gameRender.forwardRenderPassRT = renderSystem->CreateRenderTexture(albedoImage, depthImage, emissiveImage); + } + + { + idImageOpts opts; + opts.format = FMT_RGBA8; + opts.colorFormat = CFM_DEFAULT; + opts.numLevels = 1; + opts.textureType = TT_2D; + opts.isPersistant = true; + opts.width = renderSystem->GetScreenWidth(); + opts.height = renderSystem->GetScreenHeight(); + opts.numMSAASamples = 0; + + idImage *albedoImage = renderSystem->CreateImage("_forwardRenderResolvedAlbedo", &opts, TF_LINEAR); + idImage *emissiveImage = renderSystem->CreateImage("_forwardRenderResolvedEmissive", &opts, TF_LINEAR); + opts.format = FMT_DEPTH; + idImage *depthImage = renderSystem->CreateImage("_forwardRenderResolvedDepth", &opts, TF_LINEAR); + + gameRender.forwardRenderPassResolvedRT = renderSystem->CreateRenderTexture(albedoImage, depthImage, emissiveImage); + } + + gameRender.blackPostProcessMaterial = declManager->FindMaterial("postprocess/black", false); + gameRender.noPostProcessMaterial = declManager->FindMaterial("postprocess/nopostprocess", false); +} + +/* +======================== +idGameLocal::ResizeRenderTextures +======================== +*/ +void idGameLocal::ResizeRenderTextures(int width, int height) { + // Resize all of the different render textures. + renderSystem->ResizeRenderTexture(gameRender.forwardRenderPassRT, width, height); + renderSystem->ResizeRenderTexture(gameRender.forwardRenderPassResolvedRT, width, height); +} + +/* +==================== +idGameLocal::RenderScene +==================== +*/ +void idGameLocal::RenderScene(const renderView_t *view, idRenderWorld *renderWorld, idCamera* portalSky) { + // Minimum render is used for screen captures(such as envcapture) calls, caller is responsible for all rendertarget setup. + //if (view->minimumRender) + //{ + // RenderSky(view); + // if (view->cubeMapTargetImage) + // { + // renderView_t worldRefDef = *view; + // worldRefDef.cubeMapClearBuffer = false; + // renderWorld->RenderScene(&worldRefDef); + // } + // else + // { + // renderWorld->RenderScene(view); + // } + // + // return; + //} + + // Make sure all of our render textures are the right dimensions for this render. + ResizeRenderTextures(renderSystem->GetScreenWidth(), renderSystem->GetScreenHeight()); + + // Render the scene to the forward render pass rendertexture. + renderSystem->BindRenderTexture(gameRender.forwardRenderPassRT, nullptr); + { + // Clear the color/depth buffers + renderSystem->ClearRenderTarget(true, true, 1.0f, 0.0f, 0.0f, 0.0f); + + // Render our sky first. + if (portalSky) { + renderView_t portalSkyView = *view; + portalSky->GetViewParms(&portalSkyView); + gameRenderWorld->RenderScene(&portalSkyView); + } + + // Render the current world. + renderWorld->RenderScene(view); + } + renderSystem->BindRenderTexture(nullptr, nullptr); + + // Resolve our MSAA buffer. + renderSystem->ResolveMSAA(gameRender.forwardRenderPassRT, gameRender.forwardRenderPassResolvedRT); + + // Render to the back buffer. + renderSystem->DrawStretchPic(0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, 1.0f, 1.0f, 0.0f, gameRender.noPostProcessMaterial); + //renderSystem->DrawStretchPic(0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, 1.0f, 1.0f, 0.0f, gameRender.blackPostProcessMaterial); + + // Copy everything to _currentRender + renderSystem->CaptureRenderToImage("_currentRender"); +} diff --git a/src/game/PlayerView.cpp b/src/game/PlayerView.cpp index b9c2802a..09a5e61a 100644 --- a/src/game/PlayerView.cpp +++ b/src/game/PlayerView.cpp @@ -500,14 +500,18 @@ void idPlayerView::SingleView( idUserInterface *hud, const renderView_t *view, i } if ( !( RF_GUI_ONLY & renderFlags ) ) { +// jmarshall // jscott: portal sky rendering with KRABS - idCamera *portalSky = gameLocal.GetPortalSky(); - if( portalSky ) { - renderView_t portalSkyView = *view; - portalSky->GetViewParms( &portalSkyView ); - gameRenderWorld->RenderScene( &portalSkyView ); - } - gameRenderWorld->RenderScene( view ); + //idCamera *portalSky = gameLocal.GetPortalSky(); + //if( portalSky ) { + // renderView_t portalSkyView = *view; + // portalSky->GetViewParms( &portalSkyView ); + // gameRenderWorld->RenderScene( &portalSkyView ); + //} + //gameRenderWorld->RenderScene( view ); + + gameLocal.RenderScene(view, gameRenderWorld, gameLocal.GetPortalSky()); +// jmarshall end } if ( RF_NO_GUI & renderFlags ) { diff --git a/src/renderer/Image.h b/src/renderer/Image.h index f911c4f1..44dc7325 100644 --- a/src/renderer/Image.h +++ b/src/renderer/Image.h @@ -154,6 +154,7 @@ class idImage { static void GetGeneratedName(idStr& _name, const textureUsage_t& _usage, const cubeFiles_t& _cube); + GLuint GetDeviceHandle(void) { return texnum; } private: friend class idImageManager; diff --git a/src/renderer/ImageManager.cpp b/src/renderer/ImageManager.cpp index 1cb8d08a..fe49f0de 100644 --- a/src/renderer/ImageManager.cpp +++ b/src/renderer/ImageManager.cpp @@ -539,6 +539,11 @@ void idImageManager::PurgeAllImages() { for ( i = 0; i < images.Num() ; i++ ) { image = images[i]; +// jmarshall - persistant images. + if (image->GetOpts().isPersistant) + continue; +// jmarshall end + image->PurgeImage(); } } diff --git a/src/renderer/ImageOpts.h b/src/renderer/ImageOpts.h index 1001a820..16a7b0d4 100644 --- a/src/renderer/ImageOpts.h +++ b/src/renderer/ImageOpts.h @@ -87,6 +87,8 @@ enum textureFormat_t { FMT_X16, // 16 bpp FMT_Y16_X16, // 32 bpp FMT_RGB565, // 16 bpp + + FMT_DEPTH_STENCIL }; int BitsForFormat( textureFormat_t format ); @@ -126,6 +128,13 @@ class idImageOpts { int numLevels; // if 0, will be 1 for NEAREST / LINEAR filters, otherwise based on size bool gammaMips; // if true, mips will be generated with gamma correction bool readback; // 360 specific - cpu reads back from this texture, so allocate with cached memory +// jmarshall - MSAA + int numMSAASamples; +// jmarshall end + +// jmarshall - persistant images + bool isPersistant; +// jmarshall end }; /* @@ -142,7 +151,13 @@ ID_INLINE idImageOpts::idImageOpts() { textureType = TT_2D; gammaMips = false; readback = false; +// jmarshall - MSAA + numMSAASamples = 0; +// jmarshall end +// jmarshall - persistant images + isPersistant = false; +// jmarshall end }; /* diff --git a/src/renderer/OpenGL/gl_Image.cpp b/src/renderer/OpenGL/gl_Image.cpp index c0eef97d..a9075f83 100644 --- a/src/renderer/OpenGL/gl_Image.cpp +++ b/src/renderer/OpenGL/gl_Image.cpp @@ -347,6 +347,11 @@ void idImage::AllocImage() { dataFormat = GL_DEPTH_COMPONENT; dataType = GL_UNSIGNED_BYTE; break; + case FMT_DEPTH_STENCIL: + internalFormat = GL_DEPTH24_STENCIL8; + dataFormat = GL_DEPTH_STENCIL; + dataType = GL_UNSIGNED_INT_24_8; + break; case FMT_X16: internalFormat = GL_INTENSITY16; dataFormat = GL_LUMINANCE; @@ -381,7 +386,14 @@ void idImage::AllocImage() { int target; int uploadTarget; if ( opts.textureType == TT_2D ) { - target = uploadTarget = GL_TEXTURE_2D; +// jmarshall + if (opts.numMSAASamples == 0) { + target = uploadTarget = GL_TEXTURE_2D; + } + else { + target = uploadTarget = GL_TEXTURE_2D_MULTISAMPLE; + } +// jmarshall end numSides = 1; } else if ( opts.textureType == TT_CUBIC ) { target = GL_TEXTURE_CUBE_MAP_EXT; diff --git a/src/renderer/OpenGL/gl_RenderTexture.cpp b/src/renderer/OpenGL/gl_RenderTexture.cpp new file mode 100644 index 00000000..31e54448 --- /dev/null +++ b/src/renderer/OpenGL/gl_RenderTexture.cpp @@ -0,0 +1,183 @@ +// RenderTexture.cpp +// + +#include "precompiled.h" + +#include "../tr_local.h" + +/* +======================== +idRenderTexture::idRenderTexture +======================== +*/ +idRenderTexture::idRenderTexture(idImage *colorImage, idImage *depthImage) { + deviceHandle = -1; + if (colorImage != nullptr) + { + AddRenderImage(colorImage); + } + this->depthImage = depthImage; +} + +/* +======================== +idRenderTexture::~idRenderTexture +======================== +*/ +idRenderTexture::~idRenderTexture() { + if (deviceHandle != -1) + { + glDeleteFramebuffers(1, &deviceHandle); + deviceHandle = -1; + } +} +/* +================ +idRenderTexture::AddRenderImage +================ +*/ +void idRenderTexture::AddRenderImage(idImage *image) { + if (deviceHandle != -1) { + common->FatalError("idRenderTexture::AddRenderImage: Can't add render image after FBO has been created!"); + } + + colorImages.Append(image); +} + +/* +================ +idRenderTexture::InitRenderTexture +================ +*/ +void idRenderTexture::InitRenderTexture(void) { + glGenFramebuffers(1, &deviceHandle); + glBindFramebuffer(GL_FRAMEBUFFER, deviceHandle); + + bool isTexture3D = false; + if ((colorImages.Num() > 0 && colorImages[0]->GetOpts().textureType == TT_CUBIC) || ((depthImage != nullptr) && depthImage->GetOpts().textureType == TT_CUBIC)) + { + isTexture3D = true; + } + + if (!isTexture3D) + { + for (int i = 0; i < colorImages.Num(); i++) { + if (colorImages[i]->GetOpts().numMSAASamples == 0) + { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, colorImages[i]->GetDeviceHandle(), 0); + } + else + { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D_MULTISAMPLE, colorImages[i]->GetDeviceHandle(), 0); + } + } + + if (depthImage != nullptr) { + if (depthImage->GetOpts().numMSAASamples == 0) + { + if (depthImage->GetOpts().format == FMT_DEPTH) { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthImage->GetDeviceHandle(), 0); + } + else if (depthImage->GetOpts().format == FMT_DEPTH_STENCIL) { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, depthImage->GetDeviceHandle(), 0); + } + else { + common->FatalError("idRenderTexture::InitRenderTexture: Unknown depth buffer format!"); + } + } + else + { + if (depthImage->GetOpts().format == FMT_DEPTH) { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, depthImage->GetDeviceHandle(), 0); + } + else if (depthImage->GetOpts().format == FMT_DEPTH_STENCIL) { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, depthImage->GetDeviceHandle(), 0); + } + else { + common->FatalError("idRenderTexture::InitRenderTexture: Unknown depth buffer format!"); + } + } + } + + if (colorImages.Num() > 0) + { + GLenum DrawBuffers[5] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3, GL_COLOR_ATTACHMENT4 }; + if (colorImages.Num() >= 5) { + common->FatalError("InitRenderTextures: Too many render targets!"); + } + glDrawBuffers(colorImages.Num(), &DrawBuffers[0]); + } + } + else + { + if (colorImages.Num() > 0) + { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, colorImages[0]->GetDeviceHandle(), 0); + } + + if (depthImage != nullptr) { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_CUBE_MAP_POSITIVE_X, depthImage->GetDeviceHandle(), 0); + } + } + + + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { + common->FatalError("idRenderTexture::InitRenderTexture: Failed to create rendertexture!"); + } + + glBindFramebuffer(GL_FRAMEBUFFER, 0); +} + +/* +================ +idRenderTexture::MakeCurrent +================ +*/ +void idRenderTexture::MakeCurrent(void) { + glBindFramebuffer(GL_FRAMEBUFFER, deviceHandle); +} + +/* +================ +idRenderTexture::BindNull +================ +*/ +void idRenderTexture::BindNull(void) { + glBindFramebuffer(GL_FRAMEBUFFER, 0); +} + +/* +================ +idRenderTexture::Resize +================ +*/ +void idRenderTexture::Resize(int width, int height) { + idImage *target = nullptr; + + if (colorImages.Num() > 0) { + target = colorImages[0]; + } + else { + target = depthImage; + } + + if (target->GetOpts().width == width && target->GetOpts().height == height) { + return; + } + + for(int i = 0; i < colorImages.Num(); i++) { + colorImages[i]->Resize(width, height); + } + + if (depthImage != nullptr) { + depthImage->Resize(width, height); + } + + if (deviceHandle != -1) + { + glDeleteFramebuffers(1, &deviceHandle); + deviceHandle = -1; + } + + InitRenderTexture(); +} diff --git a/src/renderer/RenderSystem.cpp b/src/renderer/RenderSystem.cpp index 8ce72c0d..ea9b30b2 100644 --- a/src/renderer/RenderSystem.cpp +++ b/src/renderer/RenderSystem.cpp @@ -961,3 +961,128 @@ bool idRenderSystemLocal::UploadImage( const char *imageName, const byte *data, //image->SetImageFilterAndRepeat(); return true; } + + +/* +=============== +idRenderSystemLocal::BindRenderTexture +=============== +*/ +void idRenderSystemLocal::BindRenderTexture(idRenderTexture* renderTexture, idRenderTexture* feedbackRenderTexture) { + setRenderTargetCommand_t* cmd; + + cmd = (setRenderTargetCommand_t*)R_GetCommandBuffer(sizeof(*cmd)); + cmd->commandId = RC_SET_RENDERTEXTURE; + + cmd->renderTexture = renderTexture; + cmd->feedbackRenderTexture = feedbackRenderTexture; +} + +/* +=============== +idRenderSystemLocal::ClearRenderTarget +=============== +*/ +void idRenderSystemLocal::ClearRenderTarget(bool clearColor, bool clearDepth, float depthValue, float red, float green, float blue) { + renderClearBufferCommand_t* cmd; + + cmd = (renderClearBufferCommand_t*)R_GetCommandBuffer(sizeof(*cmd)); + cmd->commandId = RC_CLEAR_RENDERTARGET; + + cmd->clearColor = clearColor; + cmd->clearDepth = clearDepth; + + cmd->clearDepthValue = depthValue; + cmd->clearColorValue = idVec4(red, green, blue, 1.0); +} + +/* +=============== +idRenderSystemLocal::ResolveMSAA +=============== +*/ +void idRenderSystemLocal::ResolveMSAA(idRenderTexture* msaaRenderTexture, idRenderTexture* destRenderTexture) { + resolveRenderTargetCommand_t* cmd; + + cmd = (resolveRenderTargetCommand_t*)R_GetCommandBuffer(sizeof(*cmd)); + cmd->commandId = RC_RESOLVE_MSAA; + + cmd->msaaRenderTexture = msaaRenderTexture; + cmd->destRenderTexture = destRenderTexture; +} + +/* +=============== +idRenderSystemLocal::CreateImage +=============== +*/ +idImage* idRenderSystemLocal::CreateImage(const char* name, idImageOpts* opts, textureFilter_t textureFilter) { + // Check to see if the image already exists. + idImage* image = globalImages->GetImage(name); + if (image != nullptr) { + common->FatalError("idRenderSystemLocal::CreateImage: Image already allocated!"); + return nullptr; + } + + return globalImages->ScratchImage(name, opts, textureFilter, TR_CLAMP, TD_DEFAULT); +} + +/* +=============== +idRenderSystemLocal::FindImage +=============== +*/ +idImage* idRenderSystemLocal::FindImage(const char* name) { + return globalImages->ImageFromFile(name, TF_DEFAULT, TR_REPEAT, TD_DEFAULT); +} + +/* +=============== +idRenderSystemLocal::ResizeImage +=============== +*/ +void idRenderSystemLocal::ResizeImage(idImage* image, int width, int height) { + image->Resize(width, height); +} + +/* +=============== +idRenderSystemLocal::GetImageSize +=============== +*/ +void idRenderSystemLocal::GetImageSize(idImage* image, int& imageWidth, int& imageHeight) { + imageWidth = image->GetOpts().width; + imageHeight = image->GetOpts().height; +} + +/* +=============== +idRenderSystemLocal::ResizeRenderTexture +=============== +*/ +void idRenderSystemLocal::ResizeRenderTexture(idRenderTexture* renderTexture, int width, int height) { + renderTexture->Resize(width, height); +} + +/* +=============== +idRenderSystemLocal::CreateRenderTexture +=============== +*/ +idRenderTexture* idRenderSystemLocal::CreateRenderTexture(idImage* albedoImage, idImage* depthImage, idImage* albedoImage2, idImage* albedoImage3) { + idRenderTexture* renderTexture = new idRenderTexture(albedoImage, depthImage); + + if (albedoImage2) + { + renderTexture->AddRenderImage(albedoImage2); + } + + if (albedoImage3) + { + renderTexture->AddRenderImage(albedoImage3); + } + + renderTexture->InitRenderTexture(); + + return renderTexture; +} diff --git a/src/renderer/RenderSystem.h b/src/renderer/RenderSystem.h index 25c5b273..bd9c78cf 100644 --- a/src/renderer/RenderSystem.h +++ b/src/renderer/RenderSystem.h @@ -4,6 +4,13 @@ #ifndef __RENDERER_H__ #define __RENDERER_H__ +// jmarshall +class idImage; +class idRenderTexture; + +#include "ImageOpts.h" +// jmarshall end + /* =============================================================================== @@ -363,6 +370,35 @@ class idRenderSystem { //virtual void DebugGraph( float cur, float min, float max, const idVec4 &color ) = 0; //virtual void ShowDebugGraph( void ) = 0; + +// jmarshall + // Returns a image based on the options in idImageOpts. + virtual idImage* CreateImage(const char* name, idImageOpts* opts, textureFilter_t textureFilter) = 0; + + // Returns the specified image. + virtual idImage* FindImage(const char* name) = 0; + + // Creates a render texture given a albedo and depth image. + virtual idRenderTexture* CreateRenderTexture(idImage* albedoImage, idImage* depthImage, idImage* albedoImage2 = nullptr, idImage* albedoImage3 = nullptr) = 0; + + // Resizes a image to the specified width and height. + virtual void ResizeImage(idImage* image, int width, int height) = 0; + + // Resizes a render texture to the specified width and height. + virtual void ResizeRenderTexture(idRenderTexture* renderTexture, int width, int height) = 0; + + // Binds the specified render texture, set as nullptr to draw directly to the back buffer. + virtual void BindRenderTexture(idRenderTexture* renderTexture, idRenderTexture* feedbackRenderTexture) = 0; + + // Resolves a msaa render texture to the blit render texture. + virtual void ResolveMSAA(idRenderTexture* msaaRenderTexture, idRenderTexture* destRenderTexture) = 0; + + // Clears the current render target + virtual void ClearRenderTarget(bool clearColor, bool clearDepth, float depthValue, float red, float green, float blue) = 0; + + // Fills in the image dinem for the given image. + virtual void GetImageSize(idImage* image, int& imageWidth, int& imageHeight) = 0; +// jmarshall end }; extern idRenderSystem * renderSystem; diff --git a/src/renderer/RenderTexture.h b/src/renderer/RenderTexture.h new file mode 100644 index 00000000..928cf91d --- /dev/null +++ b/src/renderer/RenderTexture.h @@ -0,0 +1,74 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ +#ifndef __RENDERTEXTURE_H__ +#define __RENDERTEXTURE_H__ + +/* +================================================================================================ + + Render Texture + +================================================================================================ +*/ + +/* +================================================ +idRenderTexture holds both the color and depth images that are made +resident on the video hardware. +================================================ +*/ +class idRenderTexture { +public: + idRenderTexture(idImage *colorImage, idImage *depthImage); + ~idRenderTexture(); + + ID_INLINE int GetWidth() const { return ( colorImages.Num() > 0 ) ? colorImages[0]->GetUploadWidth() : depthImage->GetUploadWidth(); } + ID_INLINE int GetHeight() const { return (colorImages.Num() > 0) ? colorImages[0]->GetUploadHeight() : depthImage->GetUploadHeight(); } + + ID_INLINE idImage * GetColorImage(int idx) const { return colorImages[idx]; } + ID_INLINE idImage * GetDepthImage() const { return depthImage; } + + int GetNumColorImages() const { return colorImages.Num(); } + + void Resize( int width, int height ); + + void MakeCurrent( void ); + static void BindNull(void); + + GLuint GetDeviceHandle(void) { return deviceHandle; } + + void AddRenderImage(idImage *image); + void InitRenderTexture(void); +private: + + idList colorImages; + idImage * depthImage; + GLuint deviceHandle; +}; + +#endif //!__RENDERTEXTURE_H__ diff --git a/src/renderer/draw_common.cpp b/src/renderer/draw_common.cpp index 2465f101..327d72d7 100644 --- a/src/renderer/draw_common.cpp +++ b/src/renderer/draw_common.cpp @@ -1674,6 +1674,12 @@ void RB_STD_DrawView( void ) { drawSurfs = (drawSurf_t **)&backEnd.viewDef->drawSurfs[0]; numDrawSurfs = backEnd.viewDef->numDrawSurfs; + // If we have a backend rendertexture, assign it here. + if (backEnd.renderTexture) + { + backEnd.renderTexture->MakeCurrent(); + } + // clear the z buffer, set the projection matrix, etc RB_BeginDrawingView(); @@ -1706,4 +1712,7 @@ void RB_STD_DrawView( void ) { RB_RenderDebugTools( drawSurfs, numDrawSurfs ); +// jmarshall - stupid OpenGL + GL_State(GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO); +// jmarshall end } diff --git a/src/renderer/tr_backend.cpp b/src/renderer/tr_backend.cpp index 78eff395..d4dafaa6 100644 --- a/src/renderer/tr_backend.cpp +++ b/src/renderer/tr_backend.cpp @@ -540,6 +540,93 @@ const void RB_CopyRender( const void *data ) { } } +// jmarshall +/* +============= +RB_SetRenderTexture +============= +*/ +static void RB_SetRenderTexture(const void* data) { + const setRenderTargetCommand_t* cmd; + + cmd = (setRenderTargetCommand_t*)data; + + if (cmd->renderTexture) { + backEnd.renderTexture = cmd->renderTexture; + } + else { + backEnd.renderTexture = nullptr; + idRenderTexture::BindNull(); + } +} + +/* +============ +RB_ResolveMSAA +============ +*/ +static void RB_ResolveMSAA(const void* data) { + const resolveRenderTargetCommand_t* cmd; + + cmd = (resolveRenderTargetCommand_t*)data; + + int width = cmd->msaaRenderTexture->GetWidth(); + int height = cmd->msaaRenderTexture->GetHeight(); + + glBindFramebuffer(GL_READ_FRAMEBUFFER, cmd->msaaRenderTexture->GetDeviceHandle()); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, cmd->destRenderTexture->GetDeviceHandle()); + + // Resolve all of the render targets. + for (int i = 0; i < cmd->msaaRenderTexture->GetNumColorImages(); i++) + { + glReadBuffer(GL_COLOR_ATTACHMENT0 + i); + glDrawBuffer(GL_COLOR_ATTACHMENT0 + i); + glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST); + } + + GL_CheckErrors(); + + // Resolve the Depth Buffer + glReadBuffer(GL_NONE); + glDrawBuffer(GL_NONE); + glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_DEPTH_BUFFER_BIT, GL_NEAREST); + + GL_CheckErrors(); + + glReadBuffer(GL_COLOR_ATTACHMENT0); + glDrawBuffer(GL_COLOR_ATTACHMENT0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); +} + +/* +============ +RB_ClearRenderTarget +============ +*/ +static void RB_ClearRenderTarget(const void* data) { + const renderClearBufferCommand_t* cmd; + + cmd = (renderClearBufferCommand_t*)data; + + if (cmd->clearDepth) { + glStencilMask(0xff); + // some cards may have 7 bit stencil buffers, so don't assume this + // should be 128 + glClearStencil(1 << (glConfig.stencilBits - 1)); + glClearDepth(cmd->clearDepthValue); + glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + } + + if (cmd->clearColor) { + glClearColor(cmd->clearColorValue[0], cmd->clearColorValue[1], cmd->clearColorValue[2], cmd->clearColorValue[3]); + glClear(GL_COLOR_BUFFER_BIT); + } + + glClearDepth(1.0f); + +} +// jmarshall end + /* ==================== RB_ExecuteBackEndCommands @@ -578,6 +665,17 @@ void RB_ExecuteBackEndCommands( const emptyCommand_t *cmds ) { c_draw2d++; } break; +// jmarshall + case RC_SET_RENDERTEXTURE: + RB_SetRenderTexture(cmds); + break; + case RC_RESOLVE_MSAA: + RB_ResolveMSAA(cmds); + break; + case RC_CLEAR_RENDERTARGET: + RB_ClearRenderTarget(cmds); + break; +// jmarshall end case RC_SET_BUFFER: RB_SetBuffer( cmds ); c_setBuffers++; diff --git a/src/renderer/tr_local.h b/src/renderer/tr_local.h index e7572ffa..3b2503f8 100644 --- a/src/renderer/tr_local.h +++ b/src/renderer/tr_local.h @@ -29,9 +29,9 @@ If you have questions concerning this license or the applicable additional terms #ifndef __TR_LOCAL_H__ #define __TR_LOCAL_H__ -#include "ImageOpts.h" #include "BinaryImage.h" #include "Image.h" +#include "RenderTexture.h" class idRenderWorldLocal; @@ -475,6 +475,9 @@ typedef enum { RC_DRAW_VIEW, RC_SET_BUFFER, RC_COPY_RENDER, + RC_SET_RENDERTEXTURE, + RC_RESOLVE_MSAA, + RC_CLEAR_RENDERTARGET, RC_SWAP_BUFFERS // can't just assume swap at end of list because // of forced list submission before syncs } renderCommand_t; @@ -501,6 +504,28 @@ typedef struct { int cubeFace; // when copying to a cubeMap } copyRenderCommand_t; +// jmarshall +typedef struct { + renderCommand_t commandId, * next; + idRenderTexture* renderTexture; + idRenderTexture* feedbackRenderTexture; +} setRenderTargetCommand_t; + +typedef struct { + renderCommand_t commandId, * next; + bool clearColor; + bool clearDepth; + + float clearDepthValue; + idVec4 clearColorValue; +} renderClearBufferCommand_t; + +typedef struct { + renderCommand_t commandId, * next; + idRenderTexture* msaaRenderTexture; + idRenderTexture* destRenderTexture; +} resolveRenderTargetCommand_t; +// jmarshall end //======================================================================= @@ -642,6 +667,8 @@ typedef struct { const viewDef_t * viewDef; backEndCounters_t pc; + idRenderTexture *renderTexture; + const viewEntity_t *currentSpace; // for detecting when a matrix must change idScreenRect currentScissor; // for scissor clipping, local inside renderView viewport @@ -729,6 +756,16 @@ class idRenderSystemLocal : public idRenderSystem { virtual void GetCardCaps( bool &oldCard, bool &nv10or20 ); virtual bool UploadImage( const char *imageName, const byte *data, int width, int height ); + + virtual idImage* CreateImage(const char* name, idImageOpts* opts, textureFilter_t textureFilter); + virtual idImage* FindImage(const char* name); + virtual idRenderTexture* CreateRenderTexture(idImage* albedoImage, idImage* depthImage, idImage* albedoImage2 = nullptr, idImage* albedoImage3 = nullptr); + virtual void ResizeImage(idImage* image, int width, int height); + virtual void ResizeRenderTexture(idRenderTexture* renderTexture, int width, int height); + virtual void BindRenderTexture(idRenderTexture* renderTexture, idRenderTexture* feedbackRenderTexture); + virtual void ResolveMSAA(idRenderTexture* msaaRenderTexture, idRenderTexture* destRenderTexture); + virtual void ClearRenderTarget(bool clearColor, bool clearDepth, float depthValue, float red, float green, float blue); + virtual void GetImageSize(idImage* image, int& imageWidth, int& imageHeight); public: // internal functions idRenderSystemLocal( void ); From 889f0a3ed8307fdc077027ba91acc1b614d52734 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Sat, 22 May 2021 14:18:25 -0700 Subject: [PATCH 04/38] x64 release now compiles. --- src/game.vcxproj | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/game.vcxproj b/src/game.vcxproj index 76fb83e0..d809fc83 100644 --- a/src/game.vcxproj +++ b/src/game.vcxproj @@ -58,16 +58,25 @@ <_ProjectFileVersion>10.0.30319.1 - ../$(Platform)/$(Configuration)\ + ..\build\$(PlatformName)\$(Configuration)\ true true - ../$(Platform)/$(Configuration)\ + ..\build\$(PlatformName)\$(Configuration)\ true false - ../$(Platform)/$(Configuration)\ + ..\build\$(PlatformName)\$(Configuration)\ true false + + ..\build\$(PlatformName)\$(Configuration)\intermediate\$(ProjectName)\ + + + ..\build\$(PlatformName)\$(Configuration)\intermediate\$(ProjectName)\ + + + ..\build\$(PlatformName)\$(Configuration)\intermediate\$(ProjectName)\ + Disabled @@ -94,7 +103,7 @@ /FIXED:no %(AdditionalOptions) - $(IntDir)idLib.lib;%(AdditionalDependencies) + %(AdditionalDependencies) ../gamex64.dll true .\game\game.def @@ -108,7 +117,8 @@ 16000000 16000000 true - 0x20000000 + + @@ -137,7 +147,7 @@ /J %(AdditionalOptions) - $(IntDir)idLib.lib;%(AdditionalDependencies) + %(AdditionalDependencies) ../gamex64.dll true %(IgnoreSpecificDefaultLibraries) @@ -152,7 +162,8 @@ 16000000 16000000 true - 0x20000000 + + true @@ -188,8 +199,8 @@ /J %(AdditionalOptions) - /MACHINE:I386 /fixed:no %(AdditionalOptions) - $(IntDir)idLib.lib;%(AdditionalDependencies) + /fixed:no %(AdditionalOptions) + %(AdditionalDependencies) ../gamex64.dll true .\game\game.def @@ -205,7 +216,8 @@ true - 0x20000000 + + From 91ecbd5128f684c32df0ae6363372733c582fbbf Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Sat, 22 May 2021 14:28:05 -0700 Subject: [PATCH 05/38] Fixed crash in release x64. --- src/framework/Common.cpp | 2 +- src/sys/win32/win_main.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/framework/Common.cpp b/src/framework/Common.cpp index 704b13a9..33e72c02 100644 --- a/src/framework/Common.cpp +++ b/src/framework/Common.cpp @@ -195,7 +195,7 @@ class idCommonLocal : public idCommon { idStrList warningList; idStrList errorList; - int gameDLL; + INT_PTR gameDLL; idLangDict languageDict; diff --git a/src/sys/win32/win_main.cpp b/src/sys/win32/win_main.cpp index 8b630b30..63bf8724 100644 --- a/src/sys/win32/win_main.cpp +++ b/src/sys/win32/win_main.cpp @@ -711,7 +711,7 @@ void Sys_DLL_Unload(INT_PTR dllHandle) { if (!dllHandle) { return; } - if (FreeLibrary((HINSTANCE)dllHandle) == 0) { + if (FreeLibrary((HMODULE)dllHandle) == 0) { int lastError = GetLastError(); LPVOID lpMsgBuf; FormatMessage( From 9e61d134965e35b10f356256f82be984b5202de8 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Sat, 22 May 2021 15:04:40 -0700 Subject: [PATCH 06/38] Contrast Adaptive Upscale support. --- q4base/glprogs/cgfp_cas.cg | 129 +++++++ q4base/glprogs/cgvp_cas.cg | 17 + q4base/glprogs/compile_cas.bat | 6 + q4base/glprogs/post_cas.vfp | 553 +++++++++++++++++++++++++++++++ q4base/materials/postprocess.mtr | 21 +- src/game/Game_local.h | 3 + src/game/Game_render.cpp | 42 ++- src/renderer/draw_common.cpp | 10 +- 8 files changed, 771 insertions(+), 10 deletions(-) create mode 100644 q4base/glprogs/cgfp_cas.cg create mode 100644 q4base/glprogs/cgvp_cas.cg create mode 100644 q4base/glprogs/compile_cas.bat create mode 100644 q4base/glprogs/post_cas.vfp diff --git a/q4base/glprogs/cgfp_cas.cg b/q4base/glprogs/cgfp_cas.cg new file mode 100644 index 00000000..f4b61434 --- /dev/null +++ b/q4base/glprogs/cgfp_cas.cg @@ -0,0 +1,129 @@ +// LICENSE +// ======= +// Copyright (c) 2017-2019 Advanced Micro Devices, Inc. All rights reserved. +// ------- +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// ------- +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the +// Software. +// ------- +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +// jmarshall -- grabbed the CaS implamentation from https://pastebin.com/iUmDXTVP +// adapted for ARB assembly. + +float Min3(float x, float y, float z) +{ + return min(x, min(y, z)); +} + +float Max3(float x, float y, float z) +{ + return max(x, max(y, z)); +} + + +float rcp(float v) +{ + return 1.0 / v; +} + +void main( + float4 diffuseST : TEXCOORD0, + + uniform float4 env : ENV0, + uniform sampler2D diffuseImage : TEXUNIT0, + out float4 color : COLOR) +{ + float2 texcoord = diffuseST.xy; + texcoord.y = 1.0 - texcoord.y; + float Sharpness = 1; + + + // fetch a 3x3 neighborhood around the pixel 'e', + // a b c + // d(e)f + // g h i + // int2 bufferSize = textureSize2D(diffuseImage); + float pixelX = 1.0 / env.z; + float pixelY = 1.0 / env.w; + + float3 a = tex2D(diffuseImage, texcoord + float2(-pixelX, -pixelY)).rgb; + float3 b = tex2D(diffuseImage, texcoord + float2(0.0, -pixelY)).rgb; + float3 c = tex2D(diffuseImage, texcoord + float2(pixelX, -pixelY)).rgb; + float3 d = tex2D(diffuseImage, texcoord + float2(-pixelX, 0.0)).rgb; + float3 e = tex2D(diffuseImage, texcoord).rgb; + float3 f = tex2D(diffuseImage, texcoord + float2(pixelX, 0.0)).rgb; + float3 g = tex2D(diffuseImage, texcoord + float2(-pixelX, pixelY)).rgb; + float3 h = tex2D(diffuseImage, texcoord + float2(0.0, pixelY)).rgb; + float3 i = tex2D(diffuseImage, texcoord + float2(pixelX, pixelY)).rgb; + + // Soft min and max. + // a b c b + // d e f * 0.5 + d e f * 0.5 + // g h i h + // These are 2.0x bigger (factored out the extra multiply). + float mnR = Min3( Min3(d.r, e.r, f.r), b.r, h.r); + float mnG = Min3( Min3(d.g, e.g, f.g), b.g, h.g); + float mnB = Min3( Min3(d.b, e.b, f.b), b.b, h.b); + + float mnR2 = Min3( Min3(mnR, a.r, c.r), g.r, i.r); + float mnG2 = Min3( Min3(mnG, a.g, c.g), g.g, i.g); + float mnB2 = Min3( Min3(mnB, a.b, c.b), g.b, i.b); + mnR = mnR + mnR2; + mnG = mnG + mnG2; + mnB = mnB + mnB2; + + float mxR = Max3( Max3(d.r, e.r, f.r), b.r, h.r); + float mxG = Max3( Max3(d.g, e.g, f.g), b.g, h.g); + float mxB = Max3( Max3(d.b, e.b, f.b), b.b, h.b); + + float mxR2 = Max3( Max3(mxR, a.r, c.r), g.r, i.r); + float mxG2 = Max3( Max3(mxG, a.g, c.g), g.g, i.g); + float mxB2 = Max3( Max3(mxB, a.b, c.b), g.b, i.b); + mxR = mxR + mxR2; + mxG = mxG + mxG2; + mxB = mxB + mxB2; + + // Smooth minimum distance to signal limit divided by smooth max. + float rcpMR = rcp(mxR); + float rcpMG = rcp(mxG); + float rcpMB = rcp(mxB); + + float ampR = saturate(min(mnR, 2.0 - mxR) * rcpMR); + float ampG = saturate(min(mnG, 2.0 - mxG) * rcpMG); + float ampB = saturate(min(mnB, 2.0 - mxB) * rcpMB); + + // Shaping amount of sharpening. + ampR = sqrt(ampR); + ampG = sqrt(ampG); + ampB = sqrt(ampB); + + // Filter shape. + // 0 w 0 + // w 1 w + // 0 w 0 + float peak = -rcp(lerp(8.0, 5.0, saturate(Sharpness))); + + float wR = ampR * peak; + float wG = ampG * peak; + float wB = ampB * peak; + + float rcpWeightR = rcp(1.0 + 4.0 * wR); + float rcpWeightG = rcp(1.0 + 4.0 * wG); + float rcpWeightB = rcp(1.0 + 4.0 * wB); + + float3 outColor = float3(saturate((b.r*wR+d.r*wR+f.r*wR+h.r*wR+e.r)*rcpWeightR), + saturate((b.g*wG+d.g*wG+f.g*wG+h.g*wG+e.g)*rcpWeightG), + saturate((b.b*wB+d.b*wB+f.b*wB+h.b*wB+e.b)*rcpWeightB)); + + color.xyz = outColor; + color.a = 1; +} + diff --git a/q4base/glprogs/cgvp_cas.cg b/q4base/glprogs/cgvp_cas.cg new file mode 100644 index 00000000..fd7d265e --- /dev/null +++ b/q4base/glprogs/cgvp_cas.cg @@ -0,0 +1,17 @@ +void main( + float4 position : POSITION , + float4 texCoord : ATTR8, + float4 color : ATTR5, + + out float4 diffuseST : TEXCOORD0, + out float4 hpos : POSITION ) +{ + diffuseST.xy = texCoord; + diffuseST.y = 1.0 - diffuseST.y; + + diffuseST.z = color.x * 128; + diffuseST.w = color.y * 128; + + // position + hpos = mul(glstate.matrix.mvp, position); +} diff --git a/q4base/glprogs/compile_cas.bat b/q4base/glprogs/compile_cas.bat new file mode 100644 index 00000000..22296b26 --- /dev/null +++ b/q4base/glprogs/compile_cas.bat @@ -0,0 +1,6 @@ +@echo off +del post_cas.vfp +cgc -quiet -profile arbvp1 cgvp_cas.cg >> post_cas.vfp +echo #====================================================================== >> post_cas.vfp +cgc -quiet -profile arbfp1 cgfp_cas.cg >> post_cas.vfp + diff --git a/q4base/glprogs/post_cas.vfp b/q4base/glprogs/post_cas.vfp new file mode 100644 index 00000000..f3630f19 --- /dev/null +++ b/q4base/glprogs/post_cas.vfp @@ -0,0 +1,553 @@ +!!ARBvp1.0 +# cgc version 3.1.0013, build date Apr 18 2012 +# command line args: -quiet -profile arbvp1 +# source file: cgvp_cas.cg +#vendor NVIDIA Corporation +#version 3.1.0.13 +#profile arbvp1 +#program main +#semantic glstate : state +#var float4 glstate.material.ambient : state.material.ambient : : -1 : 0 +#var float4 glstate.material.diffuse : state.material.diffuse : : -1 : 0 +#var float4 glstate.material.specular : state.material.specular : : -1 : 0 +#var float4 glstate.material.emission : state.material.emission : : -1 : 0 +#var float4 glstate.material.shininess : state.material.shininess : : -1 : 0 +#var float4 glstate.material.front.ambient : state.material.front.ambient : : -1 : 0 +#var float4 glstate.material.front.diffuse : state.material.front.diffuse : : -1 : 0 +#var float4 glstate.material.front.specular : state.material.front.specular : : -1 : 0 +#var float4 glstate.material.front.emission : state.material.front.emission : : -1 : 0 +#var float4 glstate.material.front.shininess : state.material.front.shininess : : -1 : 0 +#var float4 glstate.material.back.ambient : state.material.back.ambient : : -1 : 0 +#var float4 glstate.material.back.diffuse : state.material.back.diffuse : : -1 : 0 +#var float4 glstate.material.back.specular : state.material.back.specular : : -1 : 0 +#var float4 glstate.material.back.emission : state.material.back.emission : : -1 : 0 +#var float4 glstate.material.back.shininess : state.material.back.shininess : : -1 : 0 +#var float4 glstate.light[0].ambient : state.light[0].ambient : : -1 : 0 +#var float4 glstate.light[0].diffuse : state.light[0].diffuse : : -1 : 0 +#var float4 glstate.light[0].specular : state.light[0].specular : : -1 : 0 +#var float4 glstate.light[0].position : state.light[0].position : : -1 : 0 +#var float4 glstate.light[0].attenuation : state.light[0].attenuation : : -1 : 0 +#var float4 glstate.light[0].spot.direction : state.light[0].spot.direction : : -1 : 0 +#var float4 glstate.light[0].half : state.light[0].half : : -1 : 0 +#var float4 glstate.light[1].ambient : state.light[1].ambient : : -1 : 0 +#var float4 glstate.light[1].diffuse : state.light[1].diffuse : : -1 : 0 +#var float4 glstate.light[1].specular : state.light[1].specular : : -1 : 0 +#var float4 glstate.light[1].position : state.light[1].position : : -1 : 0 +#var float4 glstate.light[1].attenuation : state.light[1].attenuation : : -1 : 0 +#var float4 glstate.light[1].spot.direction : state.light[1].spot.direction : : -1 : 0 +#var float4 glstate.light[1].half : state.light[1].half : : -1 : 0 +#var float4 glstate.light[2].ambient : state.light[2].ambient : : -1 : 0 +#var float4 glstate.light[2].diffuse : state.light[2].diffuse : : -1 : 0 +#var float4 glstate.light[2].specular : state.light[2].specular : : -1 : 0 +#var float4 glstate.light[2].position : state.light[2].position : : -1 : 0 +#var float4 glstate.light[2].attenuation : state.light[2].attenuation : : -1 : 0 +#var float4 glstate.light[2].spot.direction : state.light[2].spot.direction : : -1 : 0 +#var float4 glstate.light[2].half : state.light[2].half : : -1 : 0 +#var float4 glstate.light[3].ambient : state.light[3].ambient : : -1 : 0 +#var float4 glstate.light[3].diffuse : state.light[3].diffuse : : -1 : 0 +#var float4 glstate.light[3].specular : state.light[3].specular : : -1 : 0 +#var float4 glstate.light[3].position : state.light[3].position : : -1 : 0 +#var float4 glstate.light[3].attenuation : state.light[3].attenuation : : -1 : 0 +#var float4 glstate.light[3].spot.direction : state.light[3].spot.direction : : -1 : 0 +#var float4 glstate.light[3].half : state.light[3].half : : -1 : 0 +#var float4 glstate.light[4].ambient : state.light[4].ambient : : -1 : 0 +#var float4 glstate.light[4].diffuse : state.light[4].diffuse : : -1 : 0 +#var float4 glstate.light[4].specular : state.light[4].specular : : -1 : 0 +#var float4 glstate.light[4].position : state.light[4].position : : -1 : 0 +#var float4 glstate.light[4].attenuation : state.light[4].attenuation : : -1 : 0 +#var float4 glstate.light[4].spot.direction : state.light[4].spot.direction : : -1 : 0 +#var float4 glstate.light[4].half : state.light[4].half : : -1 : 0 +#var float4 glstate.light[5].ambient : state.light[5].ambient : : -1 : 0 +#var float4 glstate.light[5].diffuse : state.light[5].diffuse : : -1 : 0 +#var float4 glstate.light[5].specular : state.light[5].specular : : -1 : 0 +#var float4 glstate.light[5].position : state.light[5].position : : -1 : 0 +#var float4 glstate.light[5].attenuation : state.light[5].attenuation : : -1 : 0 +#var float4 glstate.light[5].spot.direction : state.light[5].spot.direction : : -1 : 0 +#var float4 glstate.light[5].half : state.light[5].half : : -1 : 0 +#var float4 glstate.light[6].ambient : state.light[6].ambient : : -1 : 0 +#var float4 glstate.light[6].diffuse : state.light[6].diffuse : : -1 : 0 +#var float4 glstate.light[6].specular : state.light[6].specular : : -1 : 0 +#var float4 glstate.light[6].position : state.light[6].position : : -1 : 0 +#var float4 glstate.light[6].attenuation : state.light[6].attenuation : : -1 : 0 +#var float4 glstate.light[6].spot.direction : state.light[6].spot.direction : : -1 : 0 +#var float4 glstate.light[6].half : state.light[6].half : : -1 : 0 +#var float4 glstate.light[7].ambient : state.light[7].ambient : : -1 : 0 +#var float4 glstate.light[7].diffuse : state.light[7].diffuse : : -1 : 0 +#var float4 glstate.light[7].specular : state.light[7].specular : : -1 : 0 +#var float4 glstate.light[7].position : state.light[7].position : : -1 : 0 +#var float4 glstate.light[7].attenuation : state.light[7].attenuation : : -1 : 0 +#var float4 glstate.light[7].spot.direction : state.light[7].spot.direction : : -1 : 0 +#var float4 glstate.light[7].half : state.light[7].half : : -1 : 0 +#var float4 glstate.lightmodel.ambient : state.lightmodel.ambient : : -1 : 0 +#var float4 glstate.lightmodel.scenecolor : state.lightmodel.scenecolor : : -1 : 0 +#var float4 glstate.lightmodel.front.scenecolor : state.lightmodel.front.scenecolor : : -1 : 0 +#var float4 glstate.lightmodel.back.scenecolor : state.lightmodel.back.scenecolor : : -1 : 0 +#var float4 glstate.lightprod[0].ambient : state.lightprod[0].ambient : : -1 : 0 +#var float4 glstate.lightprod[0].diffuse : state.lightprod[0].diffuse : : -1 : 0 +#var float4 glstate.lightprod[0].specular : state.lightprod[0].specular : : -1 : 0 +#var float4 glstate.lightprod[0].front.ambient : state.lightprod[0].front.ambient : : -1 : 0 +#var float4 glstate.lightprod[0].front.diffuse : state.lightprod[0].front.diffuse : : -1 : 0 +#var float4 glstate.lightprod[0].front.specular : state.lightprod[0].front.specular : : -1 : 0 +#var float4 glstate.lightprod[0].back.ambient : state.lightprod[0].back.ambient : : -1 : 0 +#var float4 glstate.lightprod[0].back.diffuse : state.lightprod[0].back.diffuse : : -1 : 0 +#var float4 glstate.lightprod[0].back.specular : state.lightprod[0].back.specular : : -1 : 0 +#var float4 glstate.lightprod[1].ambient : state.lightprod[1].ambient : : -1 : 0 +#var float4 glstate.lightprod[1].diffuse : state.lightprod[1].diffuse : : -1 : 0 +#var float4 glstate.lightprod[1].specular : state.lightprod[1].specular : : -1 : 0 +#var float4 glstate.lightprod[1].front.ambient : state.lightprod[1].front.ambient : : -1 : 0 +#var float4 glstate.lightprod[1].front.diffuse : state.lightprod[1].front.diffuse : : -1 : 0 +#var float4 glstate.lightprod[1].front.specular : state.lightprod[1].front.specular : : -1 : 0 +#var float4 glstate.lightprod[1].back.ambient : state.lightprod[1].back.ambient : : -1 : 0 +#var float4 glstate.lightprod[1].back.diffuse : state.lightprod[1].back.diffuse : : -1 : 0 +#var float4 glstate.lightprod[1].back.specular : state.lightprod[1].back.specular : : -1 : 0 +#var float4 glstate.lightprod[2].ambient : state.lightprod[2].ambient : : -1 : 0 +#var float4 glstate.lightprod[2].diffuse : state.lightprod[2].diffuse : : -1 : 0 +#var float4 glstate.lightprod[2].specular : state.lightprod[2].specular : : -1 : 0 +#var float4 glstate.lightprod[2].front.ambient : state.lightprod[2].front.ambient : : -1 : 0 +#var float4 glstate.lightprod[2].front.diffuse : state.lightprod[2].front.diffuse : : -1 : 0 +#var float4 glstate.lightprod[2].front.specular : state.lightprod[2].front.specular : : -1 : 0 +#var float4 glstate.lightprod[2].back.ambient : state.lightprod[2].back.ambient : : -1 : 0 +#var float4 glstate.lightprod[2].back.diffuse : state.lightprod[2].back.diffuse : : -1 : 0 +#var float4 glstate.lightprod[2].back.specular : state.lightprod[2].back.specular : : -1 : 0 +#var float4 glstate.lightprod[3].ambient : state.lightprod[3].ambient : : -1 : 0 +#var float4 glstate.lightprod[3].diffuse : state.lightprod[3].diffuse : : -1 : 0 +#var float4 glstate.lightprod[3].specular : state.lightprod[3].specular : : -1 : 0 +#var float4 glstate.lightprod[3].front.ambient : state.lightprod[3].front.ambient : : -1 : 0 +#var float4 glstate.lightprod[3].front.diffuse : state.lightprod[3].front.diffuse : : -1 : 0 +#var float4 glstate.lightprod[3].front.specular : state.lightprod[3].front.specular : : -1 : 0 +#var float4 glstate.lightprod[3].back.ambient : state.lightprod[3].back.ambient : : -1 : 0 +#var float4 glstate.lightprod[3].back.diffuse : state.lightprod[3].back.diffuse : : -1 : 0 +#var float4 glstate.lightprod[3].back.specular : state.lightprod[3].back.specular : : -1 : 0 +#var float4 glstate.lightprod[4].ambient : state.lightprod[4].ambient : : -1 : 0 +#var float4 glstate.lightprod[4].diffuse : state.lightprod[4].diffuse : : -1 : 0 +#var float4 glstate.lightprod[4].specular : state.lightprod[4].specular : : -1 : 0 +#var float4 glstate.lightprod[4].front.ambient : state.lightprod[4].front.ambient : : -1 : 0 +#var float4 glstate.lightprod[4].front.diffuse : state.lightprod[4].front.diffuse : : -1 : 0 +#var float4 glstate.lightprod[4].front.specular : state.lightprod[4].front.specular : : -1 : 0 +#var float4 glstate.lightprod[4].back.ambient : state.lightprod[4].back.ambient : : -1 : 0 +#var float4 glstate.lightprod[4].back.diffuse : state.lightprod[4].back.diffuse : : -1 : 0 +#var float4 glstate.lightprod[4].back.specular : state.lightprod[4].back.specular : : -1 : 0 +#var float4 glstate.lightprod[5].ambient : state.lightprod[5].ambient : : -1 : 0 +#var float4 glstate.lightprod[5].diffuse : state.lightprod[5].diffuse : : -1 : 0 +#var float4 glstate.lightprod[5].specular : state.lightprod[5].specular : : -1 : 0 +#var float4 glstate.lightprod[5].front.ambient : state.lightprod[5].front.ambient : : -1 : 0 +#var float4 glstate.lightprod[5].front.diffuse : state.lightprod[5].front.diffuse : : -1 : 0 +#var float4 glstate.lightprod[5].front.specular : state.lightprod[5].front.specular : : -1 : 0 +#var float4 glstate.lightprod[5].back.ambient : state.lightprod[5].back.ambient : : -1 : 0 +#var float4 glstate.lightprod[5].back.diffuse : state.lightprod[5].back.diffuse : : -1 : 0 +#var float4 glstate.lightprod[5].back.specular : state.lightprod[5].back.specular : : -1 : 0 +#var float4 glstate.lightprod[6].ambient : state.lightprod[6].ambient : : -1 : 0 +#var float4 glstate.lightprod[6].diffuse : state.lightprod[6].diffuse : : -1 : 0 +#var float4 glstate.lightprod[6].specular : state.lightprod[6].specular : : -1 : 0 +#var float4 glstate.lightprod[6].front.ambient : state.lightprod[6].front.ambient : : -1 : 0 +#var float4 glstate.lightprod[6].front.diffuse : state.lightprod[6].front.diffuse : : -1 : 0 +#var float4 glstate.lightprod[6].front.specular : state.lightprod[6].front.specular : : -1 : 0 +#var float4 glstate.lightprod[6].back.ambient : state.lightprod[6].back.ambient : : -1 : 0 +#var float4 glstate.lightprod[6].back.diffuse : state.lightprod[6].back.diffuse : : -1 : 0 +#var float4 glstate.lightprod[6].back.specular : state.lightprod[6].back.specular : : -1 : 0 +#var float4 glstate.lightprod[7].ambient : state.lightprod[7].ambient : : -1 : 0 +#var float4 glstate.lightprod[7].diffuse : state.lightprod[7].diffuse : : -1 : 0 +#var float4 glstate.lightprod[7].specular : state.lightprod[7].specular : : -1 : 0 +#var float4 glstate.lightprod[7].front.ambient : state.lightprod[7].front.ambient : : -1 : 0 +#var float4 glstate.lightprod[7].front.diffuse : state.lightprod[7].front.diffuse : : -1 : 0 +#var float4 glstate.lightprod[7].front.specular : state.lightprod[7].front.specular : : -1 : 0 +#var float4 glstate.lightprod[7].back.ambient : state.lightprod[7].back.ambient : : -1 : 0 +#var float4 glstate.lightprod[7].back.diffuse : state.lightprod[7].back.diffuse : : -1 : 0 +#var float4 glstate.lightprod[7].back.specular : state.lightprod[7].back.specular : : -1 : 0 +#var float4 glstate.texgen[0].eye.s : state.texgen[0].eye.s : : -1 : 0 +#var float4 glstate.texgen[0].eye.t : state.texgen[0].eye.t : : -1 : 0 +#var float4 glstate.texgen[0].eye.r : state.texgen[0].eye.r : : -1 : 0 +#var float4 glstate.texgen[0].eye.q : state.texgen[0].eye.q : : -1 : 0 +#var float4 glstate.texgen[0].object.s : state.texgen[0].object.s : : -1 : 0 +#var float4 glstate.texgen[0].object.t : state.texgen[0].object.t : : -1 : 0 +#var float4 glstate.texgen[0].object.r : state.texgen[0].object.r : : -1 : 0 +#var float4 glstate.texgen[0].object.q : state.texgen[0].object.q : : -1 : 0 +#var float4 glstate.texgen[1].eye.s : state.texgen[1].eye.s : : -1 : 0 +#var float4 glstate.texgen[1].eye.t : state.texgen[1].eye.t : : -1 : 0 +#var float4 glstate.texgen[1].eye.r : state.texgen[1].eye.r : : -1 : 0 +#var float4 glstate.texgen[1].eye.q : state.texgen[1].eye.q : : -1 : 0 +#var float4 glstate.texgen[1].object.s : state.texgen[1].object.s : : -1 : 0 +#var float4 glstate.texgen[1].object.t : state.texgen[1].object.t : : -1 : 0 +#var float4 glstate.texgen[1].object.r : state.texgen[1].object.r : : -1 : 0 +#var float4 glstate.texgen[1].object.q : state.texgen[1].object.q : : -1 : 0 +#var float4 glstate.texgen[2].eye.s : state.texgen[2].eye.s : : -1 : 0 +#var float4 glstate.texgen[2].eye.t : state.texgen[2].eye.t : : -1 : 0 +#var float4 glstate.texgen[2].eye.r : state.texgen[2].eye.r : : -1 : 0 +#var float4 glstate.texgen[2].eye.q : state.texgen[2].eye.q : : -1 : 0 +#var float4 glstate.texgen[2].object.s : state.texgen[2].object.s : : -1 : 0 +#var float4 glstate.texgen[2].object.t : state.texgen[2].object.t : : -1 : 0 +#var float4 glstate.texgen[2].object.r : state.texgen[2].object.r : : -1 : 0 +#var float4 glstate.texgen[2].object.q : state.texgen[2].object.q : : -1 : 0 +#var float4 glstate.texgen[3].eye.s : state.texgen[3].eye.s : : -1 : 0 +#var float4 glstate.texgen[3].eye.t : state.texgen[3].eye.t : : -1 : 0 +#var float4 glstate.texgen[3].eye.r : state.texgen[3].eye.r : : -1 : 0 +#var float4 glstate.texgen[3].eye.q : state.texgen[3].eye.q : : -1 : 0 +#var float4 glstate.texgen[3].object.s : state.texgen[3].object.s : : -1 : 0 +#var float4 glstate.texgen[3].object.t : state.texgen[3].object.t : : -1 : 0 +#var float4 glstate.texgen[3].object.r : state.texgen[3].object.r : : -1 : 0 +#var float4 glstate.texgen[3].object.q : state.texgen[3].object.q : : -1 : 0 +#var float4 glstate.texgen[4].eye.s : state.texgen[4].eye.s : : -1 : 0 +#var float4 glstate.texgen[4].eye.t : state.texgen[4].eye.t : : -1 : 0 +#var float4 glstate.texgen[4].eye.r : state.texgen[4].eye.r : : -1 : 0 +#var float4 glstate.texgen[4].eye.q : state.texgen[4].eye.q : : -1 : 0 +#var float4 glstate.texgen[4].object.s : state.texgen[4].object.s : : -1 : 0 +#var float4 glstate.texgen[4].object.t : state.texgen[4].object.t : : -1 : 0 +#var float4 glstate.texgen[4].object.r : state.texgen[4].object.r : : -1 : 0 +#var float4 glstate.texgen[4].object.q : state.texgen[4].object.q : : -1 : 0 +#var float4 glstate.texgen[5].eye.s : state.texgen[5].eye.s : : -1 : 0 +#var float4 glstate.texgen[5].eye.t : state.texgen[5].eye.t : : -1 : 0 +#var float4 glstate.texgen[5].eye.r : state.texgen[5].eye.r : : -1 : 0 +#var float4 glstate.texgen[5].eye.q : state.texgen[5].eye.q : : -1 : 0 +#var float4 glstate.texgen[5].object.s : state.texgen[5].object.s : : -1 : 0 +#var float4 glstate.texgen[5].object.t : state.texgen[5].object.t : : -1 : 0 +#var float4 glstate.texgen[5].object.r : state.texgen[5].object.r : : -1 : 0 +#var float4 glstate.texgen[5].object.q : state.texgen[5].object.q : : -1 : 0 +#var float4 glstate.texgen[6].eye.s : state.texgen[6].eye.s : : -1 : 0 +#var float4 glstate.texgen[6].eye.t : state.texgen[6].eye.t : : -1 : 0 +#var float4 glstate.texgen[6].eye.r : state.texgen[6].eye.r : : -1 : 0 +#var float4 glstate.texgen[6].eye.q : state.texgen[6].eye.q : : -1 : 0 +#var float4 glstate.texgen[6].object.s : state.texgen[6].object.s : : -1 : 0 +#var float4 glstate.texgen[6].object.t : state.texgen[6].object.t : : -1 : 0 +#var float4 glstate.texgen[6].object.r : state.texgen[6].object.r : : -1 : 0 +#var float4 glstate.texgen[6].object.q : state.texgen[6].object.q : : -1 : 0 +#var float4 glstate.texgen[7].eye.s : state.texgen[7].eye.s : : -1 : 0 +#var float4 glstate.texgen[7].eye.t : state.texgen[7].eye.t : : -1 : 0 +#var float4 glstate.texgen[7].eye.r : state.texgen[7].eye.r : : -1 : 0 +#var float4 glstate.texgen[7].eye.q : state.texgen[7].eye.q : : -1 : 0 +#var float4 glstate.texgen[7].object.s : state.texgen[7].object.s : : -1 : 0 +#var float4 glstate.texgen[7].object.t : state.texgen[7].object.t : : -1 : 0 +#var float4 glstate.texgen[7].object.r : state.texgen[7].object.r : : -1 : 0 +#var float4 glstate.texgen[7].object.q : state.texgen[7].object.q : : -1 : 0 +#var float4 glstate.fog.color : state.fog.color : : -1 : 0 +#var float4 glstate.fog.params : state.fog.params : : -1 : 0 +#var float4 glstate.clip[0].plane : state.clip[0].plane : : -1 : 0 +#var float4 glstate.clip[1].plane : state.clip[1].plane : : -1 : 0 +#var float4 glstate.clip[2].plane : state.clip[2].plane : : -1 : 0 +#var float4 glstate.clip[3].plane : state.clip[3].plane : : -1 : 0 +#var float4 glstate.clip[4].plane : state.clip[4].plane : : -1 : 0 +#var float4 glstate.clip[5].plane : state.clip[5].plane : : -1 : 0 +#var float4 glstate.clip[6].plane : state.clip[6].plane : : -1 : 0 +#var float4 glstate.clip[7].plane : state.clip[7].plane : : -1 : 0 +#var float glstate.point.size : state.point.size : : -1 : 0 +#var float glstate.point.attenuation : state.point.attenuation : : -1 : 0 +#var float4x4 glstate.matrix.modelview[0] : state.matrix.modelview[0] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.modelview[1] : state.matrix.modelview[1] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.modelview[2] : state.matrix.modelview[2] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.modelview[3] : state.matrix.modelview[3] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.modelview[4] : state.matrix.modelview[4] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.modelview[5] : state.matrix.modelview[5] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.modelview[6] : state.matrix.modelview[6] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.modelview[7] : state.matrix.modelview[7] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.projection : state.matrix.projection : , 4 : -1 : 0 +#var float4x4 glstate.matrix.mvp : state.matrix.mvp : c[1], 4 : -1 : 1 +#var float4x4 glstate.matrix.texture[0] : state.matrix.texture[0] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.texture[1] : state.matrix.texture[1] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.texture[2] : state.matrix.texture[2] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.texture[3] : state.matrix.texture[3] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.texture[4] : state.matrix.texture[4] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.texture[5] : state.matrix.texture[5] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.texture[6] : state.matrix.texture[6] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.texture[7] : state.matrix.texture[7] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.palette[0] : state.matrix.palette[0] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.palette[1] : state.matrix.palette[1] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.palette[2] : state.matrix.palette[2] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.palette[3] : state.matrix.palette[3] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.palette[4] : state.matrix.palette[4] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.palette[5] : state.matrix.palette[5] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.palette[6] : state.matrix.palette[6] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.palette[7] : state.matrix.palette[7] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.program[0] : state.matrix.program[0] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.program[1] : state.matrix.program[1] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.program[2] : state.matrix.program[2] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.program[3] : state.matrix.program[3] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.program[4] : state.matrix.program[4] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.program[5] : state.matrix.program[5] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.program[6] : state.matrix.program[6] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.program[7] : state.matrix.program[7] : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.modelview[0] : state.matrix.modelview[0].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.modelview[1] : state.matrix.modelview[1].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.modelview[2] : state.matrix.modelview[2].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.modelview[3] : state.matrix.modelview[3].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.modelview[4] : state.matrix.modelview[4].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.modelview[5] : state.matrix.modelview[5].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.modelview[6] : state.matrix.modelview[6].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.modelview[7] : state.matrix.modelview[7].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.projection : state.matrix.projection.inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.mvp : state.matrix.mvp.inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.texture[0] : state.matrix.texture[0].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.texture[1] : state.matrix.texture[1].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.texture[2] : state.matrix.texture[2].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.texture[3] : state.matrix.texture[3].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.texture[4] : state.matrix.texture[4].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.texture[5] : state.matrix.texture[5].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.texture[6] : state.matrix.texture[6].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.texture[7] : state.matrix.texture[7].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.palette[0] : state.matrix.palette[0].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.palette[1] : state.matrix.palette[1].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.palette[2] : state.matrix.palette[2].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.palette[3] : state.matrix.palette[3].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.palette[4] : state.matrix.palette[4].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.palette[5] : state.matrix.palette[5].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.palette[6] : state.matrix.palette[6].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.palette[7] : state.matrix.palette[7].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.program[0] : state.matrix.program[0].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.program[1] : state.matrix.program[1].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.program[2] : state.matrix.program[2].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.program[3] : state.matrix.program[3].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.program[4] : state.matrix.program[4].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.program[5] : state.matrix.program[5].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.program[6] : state.matrix.program[6].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.inverse.program[7] : state.matrix.program[7].inverse : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.modelview[0] : state.matrix.modelview[0].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.modelview[1] : state.matrix.modelview[1].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.modelview[2] : state.matrix.modelview[2].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.modelview[3] : state.matrix.modelview[3].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.modelview[4] : state.matrix.modelview[4].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.modelview[5] : state.matrix.modelview[5].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.modelview[6] : state.matrix.modelview[6].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.modelview[7] : state.matrix.modelview[7].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.projection : state.matrix.projection.transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.mvp : state.matrix.mvp.transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.texture[0] : state.matrix.texture[0].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.texture[1] : state.matrix.texture[1].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.texture[2] : state.matrix.texture[2].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.texture[3] : state.matrix.texture[3].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.texture[4] : state.matrix.texture[4].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.texture[5] : state.matrix.texture[5].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.texture[6] : state.matrix.texture[6].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.texture[7] : state.matrix.texture[7].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.palette[0] : state.matrix.palette[0].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.palette[1] : state.matrix.palette[1].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.palette[2] : state.matrix.palette[2].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.palette[3] : state.matrix.palette[3].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.palette[4] : state.matrix.palette[4].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.palette[5] : state.matrix.palette[5].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.palette[6] : state.matrix.palette[6].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.palette[7] : state.matrix.palette[7].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.program[0] : state.matrix.program[0].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.program[1] : state.matrix.program[1].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.program[2] : state.matrix.program[2].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.program[3] : state.matrix.program[3].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.program[4] : state.matrix.program[4].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.program[5] : state.matrix.program[5].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.program[6] : state.matrix.program[6].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.transpose.program[7] : state.matrix.program[7].transpose : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.modelview[0] : state.matrix.modelview[0].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.modelview[1] : state.matrix.modelview[1].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.modelview[2] : state.matrix.modelview[2].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.modelview[3] : state.matrix.modelview[3].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.modelview[4] : state.matrix.modelview[4].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.modelview[5] : state.matrix.modelview[5].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.modelview[6] : state.matrix.modelview[6].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.modelview[7] : state.matrix.modelview[7].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.projection : state.matrix.projection.invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.mvp : state.matrix.mvp.invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.texture[0] : state.matrix.texture[0].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.texture[1] : state.matrix.texture[1].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.texture[2] : state.matrix.texture[2].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.texture[3] : state.matrix.texture[3].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.texture[4] : state.matrix.texture[4].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.texture[5] : state.matrix.texture[5].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.texture[6] : state.matrix.texture[6].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.texture[7] : state.matrix.texture[7].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.palette[0] : state.matrix.palette[0].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.palette[1] : state.matrix.palette[1].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.palette[2] : state.matrix.palette[2].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.palette[3] : state.matrix.palette[3].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.palette[4] : state.matrix.palette[4].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.palette[5] : state.matrix.palette[5].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.palette[6] : state.matrix.palette[6].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.palette[7] : state.matrix.palette[7].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.program[0] : state.matrix.program[0].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.program[1] : state.matrix.program[1].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.program[2] : state.matrix.program[2].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.program[3] : state.matrix.program[3].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.program[4] : state.matrix.program[4].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.program[5] : state.matrix.program[5].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.program[6] : state.matrix.program[6].invtrans : , 4 : -1 : 0 +#var float4x4 glstate.matrix.invtrans.program[7] : state.matrix.program[7].invtrans : , 4 : -1 : 0 +#var float4 position : $vin.POSITION : POSITION : 0 : 1 +#var float4 texCoord : $vin.ATTR8 : ATTR8 : 1 : 1 +#var float4 color : $vin.ATTR5 : ATTR5 : 2 : 1 +#var float4 diffuseST : $vout.TEXCOORD0 : TEX0 : 3 : 1 +#var float4 hpos : $vout.POSITION : HPOS : 4 : 1 +#const c[0] = 128 1 +PARAM c[5] = { { 128, 1 }, + state.matrix.mvp.row[0..3] }; +MUL result.texcoord[0].zw, vertex.attrib[5].xyxy, c[0].x; +ADD result.texcoord[0].y, -vertex.attrib[8], c[0]; +MOV result.texcoord[0].x, vertex.attrib[8]; +DP4 result.position.w, vertex.position, c[4]; +DP4 result.position.z, vertex.position, c[3]; +DP4 result.position.y, vertex.position, c[2]; +DP4 result.position.x, vertex.position, c[1]; +END +# 7 instructions, 0 R-regs +#====================================================================== +!!ARBfp1.0 +# cgc version 3.1.0013, build date Apr 18 2012 +# command line args: -quiet -profile arbfp1 +# source file: cgfp_cas.cg +#vendor NVIDIA Corporation +#version 3.1.0.13 +#profile arbfp1 +#program main +#semantic main.env : ENV0 +#semantic main.diffuseImage : TEXUNIT0 +#var float4 diffuseST : $vin.TEXCOORD0 : TEX0 : 0 : 1 +#var float4 env : ENV0 : env[0] : 1 : 1 +#var sampler2D diffuseImage : TEXUNIT0 : texunit 0 : 2 : 1 +#var float4 color : $vout.COLOR : COL : 3 : 1 +#const c[0] = 1 0 2 -0.2 +#const c[1] = 4 +PARAM c[2] = { { 1, 0, 2, -0.2 }, + { 4 } }; +PARAM env[] = { program.env[0] }; +TEMP R0; +TEMP R1; +TEMP R2; +TEMP R3; +TEMP R4; +TEMP R5; +TEMP R6; +TEMP R7; +TEMP R8; +RCP R8.z, env[0].z; +RCP R2.w, env[0].w; +ADD R8.y, -fragment.texcoord[0], c[0].x; +MOV R8.x, fragment.texcoord[0]; +MOV R8.w, -R2; +ADD R5.zw, R8.xyxy, R8; +TEX R2.xyz, R8, texture[0], 2D; +TEX R6.xyz, R5.zwzw, texture[0], 2D; +MOV R7.y, R2.w; +MOV R7.x, R8.z; +ADD R5.xy, R8, -R7; +ADD R7.zw, R8.xyxy, R7.xyxy; +TEX R5.xyz, R5, texture[0], 2D; +MOV R0.x, -R8.z; +MOV R0.y, c[0]; +ADD R0.zw, R8.xyxy, R0.xyxy; +TEX R1.xyz, R0.zwzw, texture[0], 2D; +MOV R0.w, R2; +MOV R0.z, c[0].y; +ADD R4.xy, R8, R0.zwzw; +TEX R4.xyz, R4, texture[0], 2D; +MOV R0.x, R8.z; +MOV R0.y, c[0]; +ADD R0.xy, R8, R0; +TEX R3.xyz, R0, texture[0], 2D; +MAX R0.x, R2, R3; +MAX R1.w, R1.x, R0.x; +MOV R0.y, -R2.w; +MOV R0.x, c[0].y; +ADD R0.xy, R8, R0; +TEX R0.xyz, R0, texture[0], 2D; +MAX R0.w, R4.x, R0.x; +MAX R0.w, R1, R0; +MAX R1.w, R5.x, R6.x; +MIN R3.w, R4.x, R0.x; +MOV R7.y, R2.w; +MOV R7.x, -R8.z; +ADD R7.xy, R8, R7; +TEX R8.xyz, R7.zwzw, texture[0], 2D; +TEX R7.xyz, R7, texture[0], 2D; +MAX R2.w, R7.x, R8.x; +MAX R1.w, R0, R1; +MAX R1.w, R1, R2; +ADD R0.w, R0, R1; +MIN R2.w, R2.x, R3.x; +MIN R2.w, R1.x, R2; +MIN R2.w, R2, R3; +MIN R3.w, R5.x, R6.x; +RCP R1.w, R0.w; +MIN R4.w, R7.x, R8.x; +MIN R3.w, R2, R3; +MIN R3.w, R3, R4; +ADD R4.w, -R0, c[0].z; +ADD R0.w, R2, R3; +MIN R0.w, R0, R4; +MUL_SAT R0.w, R0, R1; +RSQ R0.w, R0.w; +RCP R0.w, R0.w; +MUL R0.w, R0, c[0]; +MUL R1.x, R0.w, R1; +MAD R0.x, R0.w, R0, R1; +MAX R1.x, R2.y, R3.y; +MAX R1.x, R1.y, R1; +MAX R1.w, R4.y, R0.y; +MAX R1.w, R1.x, R1; +MAX R1.x, R5.y, R6.y; +MAX R1.x, R1.w, R1; +MAX R2.w, R7.y, R8.y; +MAX R2.w, R1.x, R2; +MAD R1.x, R0.w, R3, R0; +ADD R0.x, R1.w, R2.w; +MAD R1.x, R4, R0.w, R1; +MIN R2.w, R2.y, R3.y; +ADD R1.x, R1, R2; +RCP R1.w, R0.x; +MIN R3.x, R4.y, R0.y; +MIN R2.w, R1.y, R2; +MIN R2.w, R2, R3.x; +MIN R3.x, R5.y, R6.y; +MIN R3.w, R7.y, R8.y; +MIN R3.x, R2.w, R3; +MIN R3.x, R3, R3.w; +ADD R3.w, -R0.x, c[0].z; +ADD R0.x, R2.w, R3; +MIN R0.x, R0, R3.w; +MUL_SAT R0.x, R0, R1.w; +RSQ R1.w, R0.x; +MUL R0.x, R0.w, c[1]; +ADD R0.w, R0.x, c[0].x; +RCP R1.w, R1.w; +MUL R0.x, R1.w, c[0].w; +MUL R1.y, R1, R0.x; +MAD R0.y, R0, R0.x, R1; +RCP R0.w, R0.w; +MUL_SAT result.color.x, R1, R0.w; +MAD R0.y, R3, R0.x, R0; +MAD R0.y, R4, R0.x, R0; +MAX R0.w, R2.z, R3.z; +MUL R0.x, R0, c[1]; +ADD R0.x, R0, c[0]; +MAX R1.x, R4.z, R0.z; +MAX R0.w, R1.z, R0; +MAX R0.w, R0, R1.x; +MAX R1.x, R5.z, R6.z; +MAX R1.y, R7.z, R8.z; +MAX R1.x, R0.w, R1; +MAX R1.x, R1, R1.y; +ADD R1.w, R0, R1.x; +MIN R0.w, R2.z, R3.z; +MIN R1.x, R4.z, R0.z; +MIN R0.w, R1.z, R0; +MIN R0.w, R0, R1.x; +MIN R1.x, R5.z, R6.z; +MIN R1.y, R7.z, R8.z; +MIN R1.x, R0.w, R1; +MIN R1.x, R1, R1.y; +ADD R0.w, R0, R1.x; +ADD R1.y, -R1.w, c[0].z; +ADD R0.y, R2, R0; +RCP R0.x, R0.x; +MUL_SAT result.color.y, R0, R0.x; +RCP R2.x, R1.w; +MIN R0.w, R0, R1.y; +MUL_SAT R0.w, R0, R2.x; +RSQ R0.w, R0.w; +RCP R0.w, R0.w; +MUL R0.w, R0, c[0]; +MUL R1.x, R1.z, R0.w; +MAD R0.x, R0.z, R0.w, R1; +MUL R0.y, R0.w, c[1].x; +MAD R0.x, R3.z, R0.w, R0; +ADD R0.y, R0, c[0].x; +MAD R0.x, R4.z, R0.w, R0; +RCP R0.y, R0.y; +ADD R0.x, R2.z, R0; +MUL_SAT result.color.z, R0.x, R0.y; +MOV result.color.w, c[0].x; +END +# 137 instructions, 9 R-regs diff --git a/q4base/materials/postprocess.mtr b/q4base/materials/postprocess.mtr index 11f5e3ed..c5430357 100644 --- a/q4base/materials/postprocess.mtr +++ b/q4base/materials/postprocess.mtr @@ -1,7 +1,24 @@ -postprocess/nopostprocess +postprocess/resolvepostprocess { sort postProcess { map _forwardRenderResolvedAlbedo } -} \ No newline at end of file +} + +postprocess/casupscale +{ + { + program post_cas.vfp + fragmentMap 0 _postProcessAlbedo1 + } +} + +postprocess/nopostprocess +{ + sort postProcess + { + map _postProcessAlbedo1 + } +} + diff --git a/src/game/Game_local.h b/src/game/Game_local.h index e3411dd4..89304e9a 100644 --- a/src/game/Game_local.h +++ b/src/game/Game_local.h @@ -316,9 +316,12 @@ class rvGravityArea; // jmarshall struct rvmGameRender_t { idRenderTexture* forwardRenderPassRT; + idRenderTexture* postProcessRT[2]; idRenderTexture* forwardRenderPassResolvedRT; const idMaterial* noPostProcessMaterial; + const idMaterial* casPostProcessMaterial; const idMaterial* blackPostProcessMaterial; + const idMaterial* resolvePostProcessMaterial; }; // jmarshall end diff --git a/src/game/Game_render.cpp b/src/game/Game_render.cpp index 0659728d..f2e28b47 100644 --- a/src/game/Game_render.cpp +++ b/src/game/Game_render.cpp @@ -4,6 +4,8 @@ #include "precompiled.h" #include "Game_local.h" +idCVar g_renderCasUpscale("g_renderCasUpscale", "1", CVAR_BOOL, "jmarshall: toggles cas upscaling"); + /* ======================================= @@ -43,6 +45,27 @@ void idGameLocal::InitGameRenderSystem(void) { gameRender.forwardRenderPassRT = renderSystem->CreateRenderTexture(albedoImage, depthImage, emissiveImage); } + for(int i = 0; i < 2; i++) + { + idImageOpts opts; + opts.format = FMT_RGBA8; + opts.colorFormat = CFM_DEFAULT; + opts.numLevels = 1; + opts.textureType = TT_2D; + opts.isPersistant = true; + opts.width = renderSystem->GetScreenWidth(); + opts.height = renderSystem->GetScreenHeight(); + opts.numMSAASamples = 4; // renderSystem->GetNumMSAASamples(); + + idImage* albedoImage = renderSystem->CreateImage(va("_postProcessAlbedo%d", i), &opts, TF_LINEAR); + + opts.numMSAASamples = 4; // renderSystem->GetNumMSAASamples(); + opts.format = FMT_DEPTH_STENCIL; + idImage* depthImage = renderSystem->CreateImage(va("_postProcessDepth%d", i), &opts, TF_LINEAR); + + gameRender.postProcessRT[i] = renderSystem->CreateRenderTexture(albedoImage, depthImage, NULL); + } + { idImageOpts opts; opts.format = FMT_RGBA8; @@ -64,6 +87,8 @@ void idGameLocal::InitGameRenderSystem(void) { gameRender.blackPostProcessMaterial = declManager->FindMaterial("postprocess/black", false); gameRender.noPostProcessMaterial = declManager->FindMaterial("postprocess/nopostprocess", false); + gameRender.casPostProcessMaterial = declManager->FindMaterial("postprocess/casupscale", false); + gameRender.resolvePostProcessMaterial = declManager->FindMaterial("postprocess/resolvepostprocess", false); } /* @@ -125,9 +150,20 @@ void idGameLocal::RenderScene(const renderView_t *view, idRenderWorld *renderWor // Resolve our MSAA buffer. renderSystem->ResolveMSAA(gameRender.forwardRenderPassRT, gameRender.forwardRenderPassResolvedRT); - // Render to the back buffer. - renderSystem->DrawStretchPic(0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, 1.0f, 1.0f, 0.0f, gameRender.noPostProcessMaterial); - //renderSystem->DrawStretchPic(0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, 1.0f, 1.0f, 0.0f, gameRender.blackPostProcessMaterial); + // Render the resolved buffer to the screen. + renderSystem->BindRenderTexture(gameRender.postProcessRT[0], nullptr); + renderSystem->DrawStretchPic(0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, 1.0f, 1.0f, 0.0f, gameRender.resolvePostProcessMaterial); + renderSystem->BindRenderTexture(nullptr, nullptr); + + // Now render CaS + if (g_renderCasUpscale.GetBool()) + { + renderSystem->DrawStretchPic(0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, 1.0f, 1.0f, 0.0f, gameRender.casPostProcessMaterial); + } + else + { + renderSystem->DrawStretchPic(0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, 1.0f, 1.0f, 0.0f, gameRender.noPostProcessMaterial); + } // Copy everything to _currentRender renderSystem->CaptureRenderToImage("_currentRender"); diff --git a/src/renderer/draw_common.cpp b/src/renderer/draw_common.cpp index 327d72d7..ede01345 100644 --- a/src/renderer/draw_common.cpp +++ b/src/renderer/draw_common.cpp @@ -617,8 +617,8 @@ void RB_SetProgramEnvironment( void ) { pot = globalImages->currentRenderImage->GetOpts().height; parm[1] = (float)h / pot; - parm[2] = 0; - parm[3] = 1; + parm[2] = renderSystem->GetScreenWidth(); + parm[3] = renderSystem->GetScreenHeight(); glProgramEnvParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 0, parm ); #endif @@ -789,9 +789,9 @@ void RB_STD_T_RenderShaderPasses( const drawSurf_t *surf ) { if ( tr.backEndRenderer != BE_ARB2 ) { continue; } - if ( r_skipNewAmbient.GetBool() ) { - continue; - } + //if ( r_skipNewAmbient.GetBool() ) { + // continue; + //} glColorPointer( 4, GL_UNSIGNED_BYTE, sizeof( idDrawVert ), (void *)&ac->color ); glVertexAttribPointerARB( 9, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->tangents[0].ToFloatPtr() ); glVertexAttribPointerARB( 10, 3, GL_FLOAT, false, sizeof( idDrawVert ), ac->tangents[1].ToFloatPtr() ); From 4e64bed7a487d87fb58d8d38d0630d9aa01f33b2 Mon Sep 17 00:00:00 2001 From: jmarshall23 <38022578+jmarshall23@users.noreply.github.com> Date: Sat, 22 May 2021 15:55:54 -0700 Subject: [PATCH 07/38] Create README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..4ee2753d --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# Quake4Doom +Quake 4 SDK integrated with Doom 3 + +Introduction: +This project is a code integration of the Quake 4 SDK against the Doom 3 GPL codebase. +This means this includes new engine side features that were in the Quake 4 engine, +and some adjustments to the Quake 4 SDK code. + +The game is at visual partity with the original game, with the exception of the particle system which was never open sourced(BSE or Basic Set of Effects). From a2b468eb4ebc59342757af60a80a32bef54abf28 Mon Sep 17 00:00:00 2001 From: jmarshall23 <38022578+jmarshall23@users.noreply.github.com> Date: Sat, 22 May 2021 15:56:44 -0700 Subject: [PATCH 08/38] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 4ee2753d..616d8abc 100644 --- a/README.md +++ b/README.md @@ -7,3 +7,6 @@ This means this includes new engine side features that were in the Quake 4 engin and some adjustments to the Quake 4 SDK code. The game is at visual partity with the original game, with the exception of the particle system which was never open sourced(BSE or Basic Set of Effects). + +Progression Blocker: +There is a known bug were some doors don't open and have to be noclipped past. From 6ff899f7d107173c23bbfdfd3e57f49ea196652f Mon Sep 17 00:00:00 2001 From: jmarshall23 <38022578+jmarshall23@users.noreply.github.com> Date: Sat, 22 May 2021 15:57:04 -0700 Subject: [PATCH 09/38] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 616d8abc..bb5beeba 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Quake4Doom Quake 4 SDK integrated with Doom 3 -Introduction: + This project is a code integration of the Quake 4 SDK against the Doom 3 GPL codebase. This means this includes new engine side features that were in the Quake 4 engine, and some adjustments to the Quake 4 SDK code. From c65c1db0acacb7180744a52858291bd43f69c786 Mon Sep 17 00:00:00 2001 From: jmarshall23 <38022578+jmarshall23@users.noreply.github.com> Date: Sat, 22 May 2021 15:58:14 -0700 Subject: [PATCH 10/38] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index bb5beeba..87b5d281 100644 --- a/README.md +++ b/README.md @@ -10,3 +10,5 @@ The game is at visual partity with the original game, with the exception of the Progression Blocker: There is a known bug were some doors don't open and have to be noclipped past. + +Also the main menu works visually, but when you hit one button on the main menu it goes black, to start a game simply type devmap game/airdefense1 in the console. From e0a76defc66607d80bd746c138a96fcd3e181d40 Mon Sep 17 00:00:00 2001 From: jmarshall23 <38022578+jmarshall23@users.noreply.github.com> Date: Sat, 22 May 2021 15:58:42 -0700 Subject: [PATCH 11/38] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 87b5d281..d925ee75 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This project is a code integration of the Quake 4 SDK against the Doom 3 GPL cod This means this includes new engine side features that were in the Quake 4 engine, and some adjustments to the Quake 4 SDK code. -The game is at visual partity with the original game, with the exception of the particle system which was never open sourced(BSE or Basic Set of Effects). +The game is at visual partity with the original game, and is basically entirely playback(with a known issue see below) with the exception of the particle system which was never open sourced(BSE or Basic Set of Effects). Progression Blocker: There is a known bug were some doors don't open and have to be noclipped past. From a43bdf52cfda9114926fe7a4ec6d6a500d641ce5 Mon Sep 17 00:00:00 2001 From: jmarshall23 <38022578+jmarshall23@users.noreply.github.com> Date: Sat, 22 May 2021 15:58:51 -0700 Subject: [PATCH 12/38] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d925ee75..08d4075d 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This project is a code integration of the Quake 4 SDK against the Doom 3 GPL cod This means this includes new engine side features that were in the Quake 4 engine, and some adjustments to the Quake 4 SDK code. -The game is at visual partity with the original game, and is basically entirely playback(with a known issue see below) with the exception of the particle system which was never open sourced(BSE or Basic Set of Effects). +The game is at visual partity with the original game, and is basically entirely playable(with a known issue see below) with the exception of the particle system which was never open sourced(BSE or Basic Set of Effects). Progression Blocker: There is a known bug were some doors don't open and have to be noclipped past. From f8aa65cd07d38abe754dac5ab0664f7ef1d97ff7 Mon Sep 17 00:00:00 2001 From: jmarshall23 <38022578+jmarshall23@users.noreply.github.com> Date: Sat, 22 May 2021 16:42:45 -0700 Subject: [PATCH 13/38] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 08d4075d..f8659808 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # Quake4Doom Quake 4 SDK integrated with Doom 3 +![alt text](https://i.ibb.co/V3Mw0Rv/unknown-1.png) +![alt text](https://i.ibb.co/TTHTTkQ/image.png) This project is a code integration of the Quake 4 SDK against the Doom 3 GPL codebase. This means this includes new engine side features that were in the Quake 4 engine, From 7c53f3a5f80b0ade0778f009c7148100e16b2922 Mon Sep 17 00:00:00 2001 From: jmarshall23 <38022578+jmarshall23@users.noreply.github.com> Date: Sat, 22 May 2021 16:43:42 -0700 Subject: [PATCH 14/38] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f8659808..31d94026 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Quake4Doom -Quake 4 SDK integrated with Doom 3 +Quake 4 SDK integrated with Doom 3 GPL release ![alt text](https://i.ibb.co/V3Mw0Rv/unknown-1.png) ![alt text](https://i.ibb.co/TTHTTkQ/image.png) From 0f6cc17c742dcf1dc17af3ffcc274307bed70417 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Fri, 23 Jul 2021 14:19:58 -0700 Subject: [PATCH 15/38] Fixed multiplayer. --- README.md | 16 ---------- src/doomdll.vcxproj | 14 --------- src/doomdll.vcxproj.filters | 45 ---------------------------- src/framework/Common.cpp | 2 +- src/framework/async/AsyncNetwork.cpp | 2 +- src/framework/async/AsyncServer.cpp | 2 -- src/framework/async/ServerScan.cpp | 2 +- src/game/Game_local.cpp | 12 ++++---- src/game/gamesys/SysCvar.cpp | 6 ++-- src/sys/win32/win_glimp.cpp | 32 ++++++++++---------- src/tools/compilers/dmap/dmap.cpp | 2 +- 11 files changed, 29 insertions(+), 106 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 31d94026..00000000 --- a/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Quake4Doom -Quake 4 SDK integrated with Doom 3 GPL release - -![alt text](https://i.ibb.co/V3Mw0Rv/unknown-1.png) -![alt text](https://i.ibb.co/TTHTTkQ/image.png) - -This project is a code integration of the Quake 4 SDK against the Doom 3 GPL codebase. -This means this includes new engine side features that were in the Quake 4 engine, -and some adjustments to the Quake 4 SDK code. - -The game is at visual partity with the original game, and is basically entirely playable(with a known issue see below) with the exception of the particle system which was never open sourced(BSE or Basic Set of Effects). - -Progression Blocker: -There is a known bug were some doors don't open and have to be noclipped past. - -Also the main menu works visually, but when you hit one button on the main menu it goes black, to start a game simply type devmap game/airdefense1 in the console. diff --git a/src/doomdll.vcxproj b/src/doomdll.vcxproj index c98402fa..9813321e 100644 --- a/src/doomdll.vcxproj +++ b/src/doomdll.vcxproj @@ -423,11 +423,6 @@ - - - - - @@ -1240,15 +1235,6 @@ - - - - - - - - - diff --git a/src/doomdll.vcxproj.filters b/src/doomdll.vcxproj.filters index 9ca7f2eb..a3ed26ea 100644 --- a/src/doomdll.vcxproj.filters +++ b/src/doomdll.vcxproj.filters @@ -64,9 +64,6 @@ {673af182-b53c-4514-b760-3e3c6574c914} - - {790d16ec-9240-40b6-9c61-2ab9bbe6812c} - {e6f14e65-2c82-43b6-bf0d-b05bf16571ad} @@ -582,21 +579,6 @@ tools\compilers\dmap - - tools\compilers\runaas - - - tools\compilers\runaas - - - tools\compilers\runaas - - - tools\compilers\runaas - - - tools\compilers\runaas - Renderer\DXT @@ -1277,33 +1259,6 @@ tools\compilers\dmap - - tools\compilers\runaas - - - tools\compilers\runaas - - - tools\compilers\runaas - - - tools\compilers\runaas - - - tools\compilers\runaas - - - tools\compilers\runaas - - - tools\compilers\runaas - - - tools\compilers\runaas - - - tools\compilers\runaas - Renderer\DXT diff --git a/src/framework/Common.cpp b/src/framework/Common.cpp index 33e72c02..e680c805 100644 --- a/src/framework/Common.cpp +++ b/src/framework/Common.cpp @@ -2304,7 +2304,7 @@ void idCommonLocal::InitCommands( void ) { cmdSystem->AddCommand( "execMachineSpec", Com_ExecMachineSpec_f, CMD_FL_SYSTEM, "execs the appropriate config files and sets cvars based on com_machineSpec" ); cmdSystem->AddCommand("dmap", Dmap_f, CMD_FL_TOOL, "compiles a map", idCmdSystem::ArgCompletion_MapName); - cmdSystem->AddCommand("runAAS", RunAAS_f, CMD_FL_TOOL, "compiles an AAS file for a map", idCmdSystem::ArgCompletion_MapName); + //cmdSystem->AddCommand("runAAS", RunAAS_f, CMD_FL_TOOL, "compiles an AAS file for a map", idCmdSystem::ArgCompletion_MapName); #ifdef ID_ALLOW_TOOLS // compilers diff --git a/src/framework/async/AsyncNetwork.cpp b/src/framework/async/AsyncNetwork.cpp index 79d16b78..38d66c2f 100644 --- a/src/framework/async/AsyncNetwork.cpp +++ b/src/framework/async/AsyncNetwork.cpp @@ -301,7 +301,7 @@ void idAsyncNetwork::SpawnServer_f( const idCmdArgs &args ) { // don't let a server spawn with singleplayer game type - it will crash if ( idStr::Icmp( cvarSystem->GetCVarString( "si_gameType" ), "singleplayer" ) == 0 ) { - cvarSystem->SetCVarString( "si_gameType", "deathmatch" ); + cvarSystem->SetCVarString( "si_gameType", "dm" ); } com_asyncInput.SetBool( false ); // make sure the current system state is compatible with net_serverDedicated diff --git a/src/framework/async/AsyncServer.cpp b/src/framework/async/AsyncServer.cpp index 451007df..7f51e655 100644 --- a/src/framework/async/AsyncServer.cpp +++ b/src/framework/async/AsyncServer.cpp @@ -247,7 +247,6 @@ void idAsyncServer::ExecuteMapChange( void ) { idStr mapName; findFile_t ff; bool addonReload = false; - char bestGameType[ MAX_STRING_CHARS ]; assert( active ); @@ -258,7 +257,6 @@ void idAsyncServer::ExecuteMapChange( void ) { // jmarshall - best game type //game->GetBestGameType( cvarSystem->GetCVarString("si_map"), cvarSystem->GetCVarString("si_gametype"), bestGameType ); // jmarshall end - cvarSystem->SetCVarString("si_gametype", bestGameType ); // initialize map settings cmdSystem->BufferCommandText( CMD_EXEC_NOW, "rescanSI" ); diff --git a/src/framework/async/ServerScan.cpp b/src/framework/async/ServerScan.cpp index 4b272fe2..436c93a1 100644 --- a/src/framework/async/ServerScan.cpp +++ b/src/framework/async/ServerScan.cpp @@ -36,7 +36,7 @@ idCVar gui_filter_idle( "gui_filter_idle", "0", CVAR_GUI | CVAR_INTEGER | CVAR_A idCVar gui_filter_game( "gui_filter_game", "0", CVAR_GUI | CVAR_INTEGER | CVAR_ARCHIVE, "Game filter" ); const char* l_gameTypes[] = { - "Deathmatch", + "dm", "Tourney", "Team DM", "Last Man", diff --git a/src/game/Game_local.cpp b/src/game/Game_local.cpp index c66dc7a6..62779e53 100644 --- a/src/game/Game_local.cpp +++ b/src/game/Game_local.cpp @@ -1274,7 +1274,6 @@ void idGameLocal::SetServerInfo( const idDict &_serverInfo ) { } serverInfo = _serverInfo; - if ( timeLimitChanged ) { mpGame.ClearAnnouncerSounds( ); mpGame.ScheduleTimeAnnouncements( ); @@ -1909,10 +1908,10 @@ void idGameLocal::InitFromNewMap( const char *mapName, idRenderWorld *renderWorl this->isListenServer = isServer && !cvarSystem->GetCVarBool( "net_serverDedicated" ); // RAVEN END this->isMultiplayer = isServer || isClient; - - if ( this->isMultiplayer ) - gameLocal.Error( "This mod is for singleplayer only" ); - +// jmarshall + //if ( this->isMultiplayer ) + // gameLocal.Error( "This mod is for singleplayer only" ); +// jmarshall end PACIFIER_UPDATE; //RAVEN BEGIN @@ -7172,9 +7171,10 @@ idGameLocal::UpdateServerInfoFlags // RAVEN BEGIN // ddynerman: new gametype strings void idGameLocal::SetGameType( void ) { + idStr gameTypeName = serverInfo.GetString("si_gameType"); gameType = GAME_SP; - if ( idStr::Icmp( serverInfo.GetString( "si_gameType" ), "singleplayer" ) ) { + if ( gameTypeName != "singleplayer") { mpGame.SetGameType(); } } diff --git a/src/game/gamesys/SysCvar.cpp b/src/game/gamesys/SysCvar.cpp index 93dc3b4e..77b75293 100644 --- a/src/game/gamesys/SysCvar.cpp +++ b/src/game/gamesys/SysCvar.cpp @@ -55,9 +55,9 @@ idCVar si_dropWeaponsInBuyingModes( "si_dropWeaponsInBuyingModes", "0", CVAR_GA // RITUAL END // RAVEN BEGIN // ddynerman: new gametype strings -idCVar si_gameType( "si_gameType", si_gameTypeArgs[ 0 ], CVAR_GAME | CVAR_SERVERINFO | PC_CVAR_ARCHIVE, "game type - singleplayer, DM, Tourney, Team DM, CTF, Arena CTF, or DeadZone", si_gameTypeArgs, idCmdSystem::ArgCompletion_String ); -idCVar si_map( "si_map", "mp/q4dm1", CVAR_GAME | CVAR_SERVERINFO | PC_CVAR_ARCHIVE, "map to be played next on server", idCmdSystem::ArgCompletion_MapName ); -idCVar si_mapCycle( "si_mapCycle", "", CVAR_GAME | CVAR_SERVERINFO | PC_CVAR_ARCHIVE, "map cycle list semicolon delimited" ); +idCVar si_gameType( "si_gameType", si_gameTypeArgs[ 0 ], CVAR_GAME | CVAR_SERVERINFO, "game type - singleplayer, DM, Tourney, Team DM, CTF, Arena CTF, or DeadZone", si_gameTypeArgs, idCmdSystem::ArgCompletion_String ); +idCVar si_map( "si_map", "mp/q4dm1", CVAR_GAME | CVAR_SERVERINFO, "map to be played next on server", idCmdSystem::ArgCompletion_MapName ); +idCVar si_mapCycle( "si_mapCycle", "", CVAR_GAME | CVAR_SERVERINFO, "map cycle list semicolon delimited" ); // bdube: raise player limit idCVar si_maxPlayers( "si_maxPlayers", "12", CVAR_GAME | CVAR_SERVERINFO | PC_CVAR_ARCHIVE | CVAR_INTEGER, "max number of players allowed on the server", 1, 16 ); // ddynerman: min players to start diff --git a/src/sys/win32/win_glimp.cpp b/src/sys/win32/win_glimp.cpp index ea647e12..71d149ed 100644 --- a/src/sys/win32/win_glimp.cpp +++ b/src/sys/win32/win_glimp.cpp @@ -186,22 +186,22 @@ The renderer calls this when the user adjusts r_gamma or r_brightness ======================== */ void GLimp_SetGamma( unsigned short red[256], unsigned short green[256], unsigned short blue[256] ) { - unsigned short table[3][256]; - int i; - - if ( !win32.hDC ) { - return; - } - - for ( i = 0; i < 256; i++ ) { - table[0][i] = red[i]; - table[1][i] = green[i]; - table[2][i] = blue[i]; - } - - if ( !SetDeviceGammaRamp( win32.hDC, table ) ) { - common->Printf( "WARNING: SetDeviceGammaRamp failed.\n" ); - } + //unsigned short table[3][256]; + //int i; + // + //if ( !win32.hDC ) { + // return; + //} + // + //for ( i = 0; i < 256; i++ ) { + // table[0][i] = red[i]; + // table[1][i] = green[i]; + // table[2][i] = blue[i]; + //} + // + //if ( !SetDeviceGammaRamp( win32.hDC, table ) ) { + // common->Printf( "WARNING: SetDeviceGammaRamp failed.\n" ); + //} } /* diff --git a/src/tools/compilers/dmap/dmap.cpp b/src/tools/compilers/dmap/dmap.cpp index 6737e8ae..2f018c01 100644 --- a/src/tools/compilers/dmap/dmap.cpp +++ b/src/tools/compilers/dmap/dmap.cpp @@ -367,7 +367,7 @@ void Dmap( const idCmdArgs &args ) { if ( !noAAS && !region ) { // create AAS files - RunAAS_f( args ); + //RunAAS_f( args ); } } From ce4776895f7eefb75a6cc7a96472187f08144658 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Fri, 23 Jul 2021 14:35:03 -0700 Subject: [PATCH 16/38] Accidently removed readme. --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..31d94026 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# Quake4Doom +Quake 4 SDK integrated with Doom 3 GPL release + +![alt text](https://i.ibb.co/V3Mw0Rv/unknown-1.png) +![alt text](https://i.ibb.co/TTHTTkQ/image.png) + +This project is a code integration of the Quake 4 SDK against the Doom 3 GPL codebase. +This means this includes new engine side features that were in the Quake 4 engine, +and some adjustments to the Quake 4 SDK code. + +The game is at visual partity with the original game, and is basically entirely playable(with a known issue see below) with the exception of the particle system which was never open sourced(BSE or Basic Set of Effects). + +Progression Blocker: +There is a known bug were some doors don't open and have to be noclipped past. + +Also the main menu works visually, but when you hit one button on the main menu it goes black, to start a game simply type devmap game/airdefense1 in the console. From 5a91ffd65e24e41fc8740c41b4e13c01f585da02 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Fri, 23 Jul 2021 16:02:31 -0700 Subject: [PATCH 17/38] Low level driver bot code. --- src/framework/async/AsyncNetwork.cpp | 2 +- src/framework/async/AsyncServer.cpp | 122 +++++++++++++++++++++++--- src/framework/async/AsyncServer.h | 9 +- src/framework/async/MsgChannel.cpp | 16 ++-- src/framework/async/MsgChannel.h | 34 ------- src/framework/async/NetworkSystem.cpp | 61 +++++++++---- src/framework/async/NetworkSystem.h | 115 ++++++++++++++---------- src/framework/async/ServerScan.cpp | 44 +--------- src/game/Game.h | 4 +- src/game/Game_local.cpp | 9 ++ src/game/Game_local.h | 5 +- src/game/Game_network.cpp | 2 +- src/sys/sys_public.h | 5 +- 13 files changed, 270 insertions(+), 158 deletions(-) diff --git a/src/framework/async/AsyncNetwork.cpp b/src/framework/async/AsyncNetwork.cpp index 38d66c2f..79d16b78 100644 --- a/src/framework/async/AsyncNetwork.cpp +++ b/src/framework/async/AsyncNetwork.cpp @@ -301,7 +301,7 @@ void idAsyncNetwork::SpawnServer_f( const idCmdArgs &args ) { // don't let a server spawn with singleplayer game type - it will crash if ( idStr::Icmp( cvarSystem->GetCVarString( "si_gameType" ), "singleplayer" ) == 0 ) { - cvarSystem->SetCVarString( "si_gameType", "dm" ); + cvarSystem->SetCVarString( "si_gameType", "deathmatch" ); } com_asyncInput.SetBool( false ); // make sure the current system state is compatible with net_serverDedicated diff --git a/src/framework/async/AsyncServer.cpp b/src/framework/async/AsyncServer.cpp index 7f51e655..0bbbe08b 100644 --- a/src/framework/async/AsyncServer.cpp +++ b/src/framework/async/AsyncServer.cpp @@ -247,6 +247,7 @@ void idAsyncServer::ExecuteMapChange( void ) { idStr mapName; findFile_t ff; bool addonReload = false; + //char bestGameType[ MAX_STRING_CHARS ]; assert( active ); @@ -254,9 +255,8 @@ void idAsyncServer::ExecuteMapChange( void ) { fileSystem->ClearPureChecksums(); // make sure the map/gametype combo is good -// jmarshall - best game type //game->GetBestGameType( cvarSystem->GetCVarString("si_map"), cvarSystem->GetCVarString("si_gametype"), bestGameType ); -// jmarshall end + //cvarSystem->SetCVarString("si_gametype", bestGameType ); // initialize map settings cmdSystem->BufferCommandText( CMD_EXEC_NOW, "rescanSI" ); @@ -318,7 +318,7 @@ void idAsyncServer::ExecuteMapChange( void ) { memset( userCmds, 0, sizeof( userCmds ) ); if ( idAsyncNetwork::serverDedicated.GetInteger() == 0 ) { - InitLocalClient( 0 ); + InitLocalClient( 0, false ); } else { localClientNum = -1; } @@ -703,13 +703,22 @@ void idAsyncServer::InitClient( int clientNum, int clientId, int clientRate ) { idAsyncServer::InitLocalClient ================== */ -void idAsyncServer::InitLocalClient( int clientNum ) { +void idAsyncServer::InitLocalClient( int clientNum, bool isBot ) { netadr_t badAddress; - localClientNum = clientNum; InitClient( clientNum, 0, 0 ); memset( &badAddress, 0, sizeof( badAddress ) ); - badAddress.type = NA_BAD; +// jmarshall + if (isBot) + { + badAddress.type = NA_BOT; + } + else + { + badAddress.type = NA_BAD; + localClientNum = clientNum; + } +// jmarshall end clients[clientNum].channel.Init( badAddress, serverId ); clients[clientNum].clientState = SCS_INGAME; sessLocal.mapSpawnData.userInfo[clientNum] = *cvarSystem->MoveCVarsToDict( CVAR_USERINFO ); @@ -723,7 +732,7 @@ idAsyncServer::BeginLocalClient void idAsyncServer::BeginLocalClient( void ) { game->SetLocalClient( localClientNum ); game->SetUserInfo( localClientNum, sessLocal.mapSpawnData.userInfo[localClientNum], false ); - game->ServerClientBegin( localClientNum ); + game->ServerClientBegin( localClientNum, false ); } /* @@ -798,6 +807,11 @@ void idAsyncServer::SendReliableMessage( int clientNum, const idBitMsg &msg ) { if ( clientNum == localClientNum ) { return; } +// jmarshall + if (clients[clientNum].channel.GetRemoteAddress().type == NA_BOT) + return; +// jmarshall end + if ( !clients[ clientNum ].channel.SendReliableMessage( msg ) ) { clients[ clientNum ].channel.ClearReliableMessages(); DropClient( clientNum, "#str_07136" ); @@ -822,6 +836,11 @@ void idAsyncServer::CheckClientTimeouts( void ) { continue; } +// jmarshall + if (client.channel.GetRemoteAddress().type == NA_BOT) + continue; +// jmarshall end + if ( client.lastPacketTime > serverTime ) { client.lastPacketTime = serverTime; continue; @@ -1178,7 +1197,7 @@ bool idAsyncServer::SendSnapshotToClient( int clientNum ) { msg.WriteShort( idMath::ClampShort( client.clientAheadTime ) ); // write the game snapshot - game->ServerWriteSnapshot( clientNum, client.snapshotSequence, msg, &clientInPVS[0], MAX_ASYNC_CLIENTS, 0 ); // jmarshall: eval + game->ServerWriteSnapshot( clientNum, client.snapshotSequence, msg, clientInPVS, MAX_ASYNC_CLIENTS, 0 ); // write the latest user commands from the other clients in the PVS to the snapshot for ( last = NULL, i = 0; i < MAX_ASYNC_CLIENTS; i++ ) { @@ -1283,7 +1302,7 @@ void idAsyncServer::ProcessUnreliableClientMessage( int clientNum, const idBitMs SendEnterGameToClient( clientNum ); // get the client running in the game - game->ServerClientBegin( clientNum ); + game->ServerClientBegin( clientNum, false ); // write any reliable messages to initialize the client game state game->ServerWriteInitialReliableMessages( clientNum ); @@ -1777,7 +1796,7 @@ void idAsyncServer::ProcessConnectMessage( const netadr_t from, const idBitMsg & // but meanwhile, the max players may have been reached msg.ReadString( password, sizeof( password ) ); char reason[MAX_STRING_CHARS]; - allowReply_t reply = game->ServerAllowClient(clientId, numClients, Sys_NetAdrToString( from ), guid, password, NULL, reason ); // jmarshall: added clientid + allowReply_t reply = game->ServerAllowClient(clientId, numClients, Sys_NetAdrToString( from ), guid, password, password, reason ); if ( reply != ALLOW_YES ) { common->DPrintf( "game denied connection for %s\n", Sys_NetAdrToString( from ) ); @@ -2294,7 +2313,7 @@ void idAsyncServer::SendReliableGameMessageExcluding( int clientNum, const idBit idBitMsg outMsg; byte msgBuf[MAX_MESSAGE_SIZE]; - assert( clientNum >= 0 && clientNum < MAX_ASYNC_CLIENTS ); + //assert( clientNum >= 0 && clientNum < MAX_ASYNC_CLIENTS ); outMsg.Init( msgBuf, sizeof( msgBuf ) ); outMsg.WriteByte( SERVER_RELIABLE_MESSAGE_GAME ); @@ -2463,7 +2482,7 @@ void idAsyncServer::RunFrame( void ) { DuplicateUsercmds( gameFrame, gameTime ); // advance game - gameReturn_t ret = game->RunFrame( userCmds[gameFrame & ( MAX_USERCMD_BACKUP - 1 ) ], 0, 0, 0 ); // jmarshall server frame. + gameReturn_t ret = game->RunFrame( userCmds[gameFrame & ( MAX_USERCMD_BACKUP - 1 ) ], 0, true, gameFrame ); idAsyncNetwork::ExecuteSessionCommand( ret.sessionCommand ); @@ -2823,3 +2842,82 @@ void idAsyncServer::ProcessDownloadRequestMessage( const netadr_t from, const id serverPort.SendPacket( from, outMsg.GetData(), outMsg.GetSize() ); } } + +// jmarshall +/* +=============== +idAsyncServer::ServerSetBotUserCommand +=============== +*/ +int idAsyncServer::ServerSetBotUserCommand(int clientNum, int frameNum, const usercmd_t& cmd) { + usercmd_t realcmd; + + // Ensure this client is a bot. + if (clients[clientNum].channel.GetRemoteAddress().type != NA_BOT) + return -1; + + realcmd = cmd; + realcmd.gameTime = gameFrame; + realcmd.duplicateCount = gameTime; + + int index = gameFrame & (MAX_USERCMD_BACKUP - 1); + userCmds[index][clientNum] = realcmd; + + return 1; +} + +/* +=============== +idAsyncServer::AllocOpenClientSlotForAI +=============== +*/ +int idAsyncServer::AllocOpenClientSlotForAI(int maxPlayersOnServer) { + int numActivePlayers = 0; + int botClientId = -1; + idStr botName; + idDict spawnArgs; + + // Check to see how many active players we have. + for (int i = 0; i < MAX_ASYNC_CLIENTS; i++) + { + if (clients[i].clientState >= SCS_PUREWAIT) + { + numActivePlayers++; + } + } + + if (numActivePlayers >= maxPlayersOnServer) { + common->Warning("idAsyncServer::AllocateClientSlotForBot: No open slots for bot\n"); + return -1; + } + + // Find a free slot for the bot. + for (int i = 0; i < MAX_ASYNC_CLIENTS; i++) + { + if (clients[i].clientState == SCS_FREE) + { + botClientId = i; + break; + } + } + + if (botClientId == -1) + { + common->Warning("idAsyncServer::AllocateClientSlotForBot: Invalid client number\n"); + return -1; + } + + game->GetRandomBotName(botClientId, botName); + + idAsyncServer::InitLocalClient(botClientId, true); + + // Set all the spawn args for the new bot. + spawnArgs.Set("ui_name", botName); + + // Init the new client, and broadcast it to the rest of the players. + game->ServerClientBegin(botClientId, true); + idAsyncServer::SendUserInfoBroadcast(botClientId, spawnArgs, true); + + return 1; +} +// jmarshall end \ No newline at end of file diff --git a/src/framework/async/AsyncServer.h b/src/framework/async/AsyncServer.h index 6bc1e349..6d5ff8b1 100644 --- a/src/framework/async/AsyncServer.h +++ b/src/framework/async/AsyncServer.h @@ -177,6 +177,11 @@ class idAsyncServer { void PrintLocalServerInfo( void ); +// jmarshall + int AllocOpenClientSlotForAI(int maxPlayersOnServer); + int ServerSetBotUserCommand(int clientNum, int frameNum, const usercmd_t& cmd); +// jmarshall end + private: bool active; // true if server is active int realTime; // absolute time @@ -220,7 +225,9 @@ class idAsyncServer { void DuplicateUsercmds( int frame, int time ); void ClearClient( int clientNum ); void InitClient( int clientNum, int clientId, int clientRate ); - void InitLocalClient( int clientNum ); +// jmarshall + void InitLocalClient( int clientNum, bool isBot ); +// jmarshall end void BeginLocalClient( void ); void LocalClientInput( void ); void CheckClientTimeouts( void ); diff --git a/src/framework/async/MsgChannel.cpp b/src/framework/async/MsgChannel.cpp index a5623b47..6c10f949 100644 --- a/src/framework/async/MsgChannel.cpp +++ b/src/framework/async/MsgChannel.cpp @@ -196,7 +196,7 @@ bool idMsgChannel::ReadMessageData( idBitMsg &out, const idBitMsg &msg ) { // remove acknowledged reliable messages while( reliableSend.GetFirst() <= reliableAcknowledge ) { - if ( !reliableSend.Get( NULL, 0, reliableMessageSize, false ) ) { + if ( !reliableSend.Get( NULL, 0, reliableMessageSize, false ) ) { break; } } @@ -210,7 +210,7 @@ bool idMsgChannel::ReadMessageData( idBitMsg &out, const idBitMsg &msg ) { } reliableSequence = out.ReadLong(); if ( reliableSequence == reliableReceive.GetLast() + 1 ) { - reliableReceive.Add( out.GetData() + out.GetReadCount(), reliableMessageSize, false); + reliableReceive.Add( out.GetData() + out.GetReadCount(), reliableMessageSize, false ); } out.ReadData( NULL, reliableMessageSize ); reliableMessageSize = out.ReadShort(); @@ -485,11 +485,16 @@ idMsgChannel::SendReliableMessage bool idMsgChannel::SendReliableMessage( const idBitMsg &msg ) { bool result; +// jmarshall + if (remoteAddress.type == NA_BOT) + return false; +// jmarshall end + assert( remoteAddress.type != NA_BAD ); if ( remoteAddress.type == NA_BAD ) { return false; } - result = reliableSend.Add( msg.GetData(), msg.GetSize(), false); + result = reliableSend.Add( msg.GetData(), msg.GetSize(), false ); if ( !result ) { common->Warning( "idMsgChannel::SendReliableMessage: overflowed" ); return false; @@ -505,8 +510,9 @@ idMsgChannel::GetReliableMessage bool idMsgChannel::GetReliableMessage( idBitMsg &msg ) { int size; bool result; - // jmarshall: added msg.getsize - result = reliableReceive.Get( msg.GetData(), msg.GetSize(), size, false); +// jmarshall + result = reliableReceive.Get( msg.GetData(), msg.GetSize(), size, false ); +// jmarshall end msg.SetSize( size ); msg.BeginReading(); return result; diff --git a/src/framework/async/MsgChannel.h b/src/framework/async/MsgChannel.h index 23865943..7369dee7 100644 --- a/src/framework/async/MsgChannel.h +++ b/src/framework/async/MsgChannel.h @@ -52,39 +52,6 @@ If you have questions concerning this license or the applicable additional terms #define MAX_MSG_QUEUE_SIZE 16384 // must be a power of 2 -#if 0 -class idMsgQueue { -public: - idMsgQueue(); - - void Init( int sequence ); - - bool Add( const byte *data, const int size ); - bool Get( byte *data, int &size ); - int GetTotalSize( void ) const; - int GetSpaceLeft( void ) const; - int GetFirst( void ) const { return first; } - int GetLast( void ) const { return last; } - void CopyToBuffer( byte *buf ) const; - -private: - byte buffer[MAX_MSG_QUEUE_SIZE]; - int first; // sequence number of first message in queue - int last; // sequence number of last message in queue - int startIndex; // index pointing to the first byte of the first message - int endIndex; // index pointing to the first byte after the last message - - void WriteByte( byte b ); - byte ReadByte( void ); - void WriteShort( int s ); - int ReadShort( void ); - void WriteLong( int l ); - int ReadLong( void ); - void WriteData( const byte *data, const int size ); - void ReadData( byte *data, const int size ); -}; -#endif - class idMsgChannel { public: idMsgChannel(); @@ -143,7 +110,6 @@ class idMsgChannel { // Removes any pending outgoing or incoming reliable messages. void ClearReliableMessages( void ); - private: netadr_t remoteAddress; // address of remote host int id; // our identification used instead of port number diff --git a/src/framework/async/NetworkSystem.cpp b/src/framework/async/NetworkSystem.cpp index 192de793..00bb542e 100644 --- a/src/framework/async/NetworkSystem.cpp +++ b/src/framework/async/NetworkSystem.cpp @@ -30,6 +30,8 @@ If you have questions concerning this license or the applicable additional terms #pragma hdrstop #include "NetworkSystem.h" +#include "AsyncServer.h" +#include "AsyncNetwork.h" idNetworkSystem networkSystemLocal; idNetworkSystem * networkSystem = &networkSystemLocal; @@ -40,22 +42,22 @@ idNetworkSystem * networkSystem = &networkSystemLocal; idNetworkSystem::ServerSendReliableMessage ================== */ -//void idNetworkSystem::ServerSendReliableMessage( int clientNum, const idBitMsg &msg ) { -// if ( idAsyncNetwork::server.IsActive() ) { -// idAsyncNetwork::server.SendReliableGameMessage( clientNum, msg ); -// } -//} +void idNetworkSystem::ServerSendReliableMessage( int clientNum, const idBitMsg &msg ) { + if ( idAsyncNetwork::server.IsActive() ) { + idAsyncNetwork::server.SendReliableGameMessage( clientNum, msg ); + } +} /* ================== idNetworkSystem::ServerSendReliableMessageExcluding ================== */ -//void idNetworkSystem::ServerSendReliableMessageExcluding( int clientNum, const idBitMsg &msg ) { -// if ( idAsyncNetwork::server.IsActive() ) { -// idAsyncNetwork::server.SendReliableGameMessageExcluding( clientNum, msg ); -// } -//} +void idNetworkSystem::ServerSendReliableMessageExcluding( int clientNum, const idBitMsg &msg ) { + if ( idAsyncNetwork::server.IsActive() ) { + idAsyncNetwork::server.SendReliableGameMessageExcluding( clientNum, msg ); + } +} /* ================== @@ -74,12 +76,12 @@ int idNetworkSystem::ServerGetClientPing( int clientNum ) { idNetworkSystem::ServerGetClientPrediction ================== */ -//int idNetworkSystem::ServerGetClientPrediction( int clientNum ) { -// if ( idAsyncNetwork::server.IsActive() ) { -// return idAsyncNetwork::server.GetClientPrediction( clientNum ); -// } -// return 0; -//} +int idNetworkSystem::ServerGetClientPrediction( int clientNum ) { + if ( idAsyncNetwork::server.IsActive() ) { + return idAsyncNetwork::server.GetClientPrediction( clientNum ); + } + return 0; +} /* ================== @@ -213,3 +215,30 @@ float idNetworkSystem::ClientGetIncomingPacketLoss( void ) { } return 0.0f; } + +/* +================== +idNetworkSystem::AllocateClientSlotForBot +================== +*/ +int idNetworkSystem::AllocateClientSlotForBot(int maxPlayersOnServer) { + return idAsyncNetwork::server.AllocOpenClientSlotForAI(maxPlayersOnServer); +} + +/* +================== +idNetworkSystem::ServerSetBotUserCommand +================== +*/ +int idNetworkSystem::ServerSetBotUserCommand(int clientNum, int frameNum, const usercmd_t& cmd) { + return idAsyncNetwork::server.ServerSetBotUserCommand(clientNum, frameNum, cmd); +} + +/* +================== +idNetworkSystem::ServerSetBotUserName +================== +*/ +int idNetworkSystem::ServerSetBotUserName(int clientNum, const char* playerName) { + return 0; +} \ No newline at end of file diff --git a/src/framework/async/NetworkSystem.h b/src/framework/async/NetworkSystem.h index b2d79205..550bfca8 100644 --- a/src/framework/async/NetworkSystem.h +++ b/src/framework/async/NetworkSystem.h @@ -1,5 +1,30 @@ -// Copyright (C) 2004 Id Software, Inc. -// +/* +=========================================================================== + +Doom 3 GPL Source Code +Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?). + +Doom 3 Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 Source Code. If not, see . + +In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ #ifndef __NETWORKSYSTEM_H__ #define __NETWORKSYSTEM_H__ @@ -29,11 +54,11 @@ typedef struct { int OSMask; -//RAVEN BEGIN -// shouchard: added favorite flag + //RAVEN BEGIN + // shouchard: added favorite flag bool favorite; // true if this has been marked by a user as a favorite bool dedicated; -// shouchard: added performance filtered flag + // shouchard: added performance filtered flag bool performanceFiltered; // true if the client machine is too wimpy to have good performance //RAVEN END } scannedServer_t; @@ -56,34 +81,30 @@ typedef enum { typedef struct { sortColumn_t column; - idList::cmp_t* compareFn; - idList::filter_t* filterFn; - const char* description; + idList::cmp_t* compareFn; + idList::filter_t* filterFn; + const char* description; } sortInfo_t; class idNetworkSystem { public: virtual ~idNetworkSystem( void ) {} - //virtual void Shutdown( void ); +// jmarshall + virtual int AllocateClientSlotForBot(int maxPlayersOnServer); + virtual int ServerSetBotUserCommand(int clientNum, int frameNum, const usercmd_t& cmd); + virtual int ServerSetBotUserName(int clientNum, const char* playerName); +// jmarshall end - virtual void ServerSendReliableMessage( int clientNum, const idBitMsg &msg, bool inhibitRepeater = false ) { } - virtual void RepeaterSendReliableMessage( int clientNum, const idBitMsg &msg, bool inhibitHeader = false, int including = -1 ) { } - virtual void RepeaterSendReliableMessageExcluding( int excluding, const idBitMsg &msg, bool inhibitHeader = false, int clientNum = -1 ) { } // NOTE: Message is sent to all viewers if clientNum is -1; excluding is used for playback. - virtual void ServerSendReliableMessageExcluding( int clientNum, const idBitMsg &msg, bool inhibitRepeater = false ) { } + virtual void ServerSendReliableMessage( int clientNum, const idBitMsg &msg ); + virtual void ServerSendReliableMessageExcluding( int clientNum, const idBitMsg &msg ); virtual int ServerGetClientPing( int clientNum ); + virtual int ServerGetClientPrediction( int clientNum ); virtual int ServerGetClientTimeSinceLastPacket( int clientNum ); virtual int ServerGetClientTimeSinceLastInput( int clientNum ); virtual int ServerGetClientOutgoingRate( int clientNum ); virtual int ServerGetClientIncomingRate( int clientNum ); virtual float ServerGetClientIncomingPacketLoss( int clientNum ); - virtual int ServerGetClientNum(int clientId) { return 0; } - virtual int ServerGetServerTime(void) { return 0; } - - // returns the new clientNum or -1 if there weren't any free. - virtual int ServerConnectBot(void) { return 0; } - - virtual int RepeaterGetClientNum( int clientId ) { return 0; } virtual void ClientSendReliableMessage( const idBitMsg &msg ); virtual int ClientGetPrediction( void ); @@ -91,41 +112,47 @@ class idNetworkSystem { virtual int ClientGetOutgoingRate( void ); virtual int ClientGetIncomingRate( void ); virtual float ClientGetIncomingPacketLoss( void ); -// RAVEN BEGIN + +public: + // RAVEN BEGIN // ddynerman: added some utility functions // uses a static buffer, copy it before calling in game again - virtual const char* GetServerAddress( void ) { return 0; } - virtual const char* GetClientAddress( int clientNum ) { return 0; } - virtual void AddFriend( int clientNum ) { } - virtual void RemoveFriend( int clientNum ) { } + virtual const char* GetServerAddress(void) { return 0; } + virtual const char* GetClientAddress(int clientNum) { return 0; } + virtual void AddFriend(int clientNum) { } + virtual void RemoveFriend(int clientNum) { } // for MP games - virtual void SetLoadingText( const char* loadingText ) { } - virtual void AddLoadingIcon( const char* icon ) { } - virtual const char* GetClientGUID( int clientNum ) { return 0; } -// RAVEN END + virtual void SetLoadingText(const char* loadingText) { } + virtual void AddLoadingIcon(const char* icon) { } + virtual const char* GetClientGUID(int clientNum) { return 0; } + // RAVEN END - virtual void GetTrafficStats( int &bytesSent, int &packetsSent, int &bytesReceived, int &packetsReceived ) const { } + virtual void GetTrafficStats(int& bytesSent, int& packetsSent, int& bytesReceived, int& packetsReceived) const { } // server browser - virtual int GetNumScannedServers( void ) { return 0; } - virtual const scannedServer_t* GetScannedServerInfo( int serverNum ) { return 0; } - virtual const scannedClient_t* GetScannedServerClientInfo( int serverNum, int clientNum ) { return 0; } - virtual void AddSortFunction( const sortInfo_t &sortInfo ) { } - virtual bool RemoveSortFunction( const sortInfo_t &sortInfo ) { return 0; } - virtual void UseSortFunction( const sortInfo_t &sortInfo, bool use = true ) { } - virtual bool SortFunctionIsActive( const sortInfo_t &sortInfo ) { return 0; } + virtual int GetNumScannedServers(void) { return 0; } + virtual const scannedServer_t* GetScannedServerInfo(int serverNum) { return 0; } + virtual const scannedClient_t* GetScannedServerClientInfo(int serverNum, int clientNum) { return 0; } + virtual void AddSortFunction(const sortInfo_t& sortInfo) { } + virtual bool RemoveSortFunction(const sortInfo_t& sortInfo) { return 0; } + virtual void UseSortFunction(const sortInfo_t& sortInfo, bool use = true) { } + virtual bool SortFunctionIsActive(const sortInfo_t& sortInfo) { return 0; } // returns true if enabled - virtual bool HTTPEnable( bool enable ) { return 0; } + virtual bool HTTPEnable(bool enable) { return 0; } - virtual void ClientSetServerInfo( const idDict &serverSI ) { } - virtual void RepeaterSetInfo( const idDict &info ) { } + virtual void ClientSetServerInfo(const idDict& serverSI) { } + virtual void RepeaterSetInfo(const idDict& info) { } - virtual const char* GetViewerGUID( int clientNum ) { return 0; } + virtual const char* GetViewerGUID(int clientNum) { return 0; } + + virtual int ServerGetClientNum(int clientId) { return 0; } + virtual int ServerGetServerTime(void) { return 0; } + + // returns the new clientNum or -1 if there weren't any free. + virtual int ServerConnectBot(void) { return 0; } -private: - scannedServer_t scannedServer; - scannedClient_t scannedClient; + virtual int RepeaterGetClientNum(int clientId) { return 0; } }; extern idNetworkSystem * networkSystem; diff --git a/src/framework/async/ServerScan.cpp b/src/framework/async/ServerScan.cpp index 436c93a1..79d67fda 100644 --- a/src/framework/async/ServerScan.cpp +++ b/src/framework/async/ServerScan.cpp @@ -36,7 +36,7 @@ idCVar gui_filter_idle( "gui_filter_idle", "0", CVAR_GUI | CVAR_INTEGER | CVAR_A idCVar gui_filter_game( "gui_filter_game", "0", CVAR_GUI | CVAR_INTEGER | CVAR_ARCHIVE, "Game filter" ); const char* l_gameTypes[] = { - "dm", + "Deathmatch", "Tourney", "Team DM", "Last Man", @@ -432,45 +432,7 @@ idServerScan::GUIAdd ================ */ void idServerScan::GUIAdd( int id, const networkServer_t server ) { -// jmarshall - server scan fix -/* - idStr name = server.serverInfo.GetString( "si_name", GAME_NAME " Server" ); - bool d3xp = false; - bool mod = false; - - if ( !idStr::Icmp( server.serverInfo.GetString( "fs_game" ), "d3xp" ) || - !idStr::Icmp( server.serverInfo.GetString( "fs_game_base" ), "d3xp" ) ) { - d3xp = true; - } - if ( server.serverInfo.GetString( "fs_game" )[ 0 ] != '\0' ) { - mod = true; - } - - name += "\t"; - if ( server.serverInfo.GetString( "sv_punkbuster" )[ 0 ] == '1' ) { - name += "mtr_PB"; - } - - name += "\t"; - if ( d3xp ) { - // FIXME: even for a 'D3XP mod' - // could have a specific icon for this case - name += "mtr_doom3XPIcon"; - } else if ( mod ) { - name += "mtr_doom3Mod"; - } else { - name += "mtr_doom3Icon"; - } - name += "\t"; - name += va( "%i/%i\t", server.clients, server.serverInfo.GetInt( "si_maxPlayers" ) ); - name += ( server.ping > -1 ) ? va( "%i\t", server.ping ) : "na\t"; - name += server.serverInfo.GetString( "si_gametype" ); - name += "\t"; - name += server.serverInfo.GetString( "si_mapName" ); - name += "\t"; - listGUI->Add( id, name ); -*/ -// jmarshall end + } /* @@ -603,7 +565,7 @@ int idServerScan::Cmp( const int *a, const int *b ) { case SORT_SERVERNAME: serv1.serverInfo.GetString( "si_name", "", s1 ); serv2.serverInfo.GetString( "si_name", "", s2 ); - return false; // s1.IcmpNoColor(s2); // jmarshall: eval server strings. + return s1.Icmp( s2 ); case SORT_PLAYERS: ret = serv1.clients < serv2.clients ? -1 : ( serv1.clients > serv2.clients ? 1 : 0 ); return ret; diff --git a/src/game/Game.h b/src/game/Game.h index 8896b1e5..1e8572af 100644 --- a/src/game/Game.h +++ b/src/game/Game.h @@ -202,7 +202,9 @@ class idGame { virtual void ServerClientConnect( int clientNum, const char *guid ) = 0; // Spawns the player entity to be used by the client. - virtual void ServerClientBegin( int clientNum ) = 0; + virtual void ServerClientBegin( int clientNum, bool isBot ) = 0; + + virtual void GetRandomBotName(int clientNum, idStr& name) = 0; // Disconnects a client and removes the player entity from the game. virtual void ServerClientDisconnect( int clientNum ) = 0; diff --git a/src/game/Game_local.cpp b/src/game/Game_local.cpp index 62779e53..7a9bb7e7 100644 --- a/src/game/Game_local.cpp +++ b/src/game/Game_local.cpp @@ -8391,6 +8391,15 @@ bool idGameLocal::IsTeamPowerups( void ) { return ( gameType != GAME_ARENA_CTF ); } +/* +=============== +idGameLocal::GetRandomBotName +=============== +*/ +void idGameLocal::GetRandomBotName(int clientNum, idStr& name) { + name = "Quake4Bot"; +} + // RAVEN BEGIN // mwhitlock: Dynamic memory consolidation #if defined(_RV_MEM_SYS_SUPPORT) diff --git a/src/game/Game_local.h b/src/game/Game_local.h index 89304e9a..7bba178a 100644 --- a/src/game/Game_local.h +++ b/src/game/Game_local.h @@ -499,7 +499,7 @@ class idGameLocal : public idGame { virtual void HandleMainMenuCommands( const char *menuCommand, idUserInterface *gui ); virtual allowReply_t ServerAllowClient( int clientId, int numClients, const char *IP, const char *guid, const char *password, const char *privatePassword, char reason[MAX_STRING_CHARS] ); virtual void ServerClientConnect( int clientNum, const char *guid ); - virtual void ServerClientBegin( int clientNum ); + virtual void ServerClientBegin( int clientNum, bool isBot); virtual void ServerClientDisconnect( int clientNum ); virtual void ServerWriteInitialReliableMessages( int clientNum ); virtual allowReply_t RepeaterAllowClient( int clientId, int numClients, const char *IP, const char *guid, bool repeater, const char *password, const char *privatePassword, char reason[MAX_STRING_CHARS] ) { idStr::Copynz( reason, "#str_107239" /* zinx - FIXME - not banned... */, sizeof(reason) ); return ALLOW_NO; }; @@ -507,6 +507,9 @@ class idGameLocal : public idGame { virtual void RepeaterClientBegin( int clientNum ) {assert(false);}; virtual void RepeaterClientDisconnect( int clientNum ) {assert(false);}; virtual void RepeaterWriteInitialReliableMessages( int clientNum ) {assert(false);}; + + virtual void GetRandomBotName(int clientNum, idStr& name); + // RAVEN BEGIN // jnewquist: Use dword array to match pvs array so we don't have endianness problems. virtual void ServerWriteSnapshot( int clientNum, int sequence, idBitMsg &msg, dword *clientInPVS, int numPVSClients, int lastSnapshotFrame ); diff --git a/src/game/Game_network.cpp b/src/game/Game_network.cpp index 248e7532..5c4d6a7d 100644 --- a/src/game/Game_network.cpp +++ b/src/game/Game_network.cpp @@ -190,7 +190,7 @@ void idGameLocal::ServerClientConnect( int clientNum, const char *guid ) { idGameLocal::ServerClientBegin ================ */ -void idGameLocal::ServerClientBegin( int clientNum ) { +void idGameLocal::ServerClientBegin( int clientNum, bool isBot ) { idBitMsg outMsg; byte msgBuf[MAX_GAME_MESSAGE_SIZE]; diff --git a/src/sys/sys_public.h b/src/sys/sys_public.h index b69df898..fa5b0491 100644 --- a/src/sys/sys_public.h +++ b/src/sys/sys_public.h @@ -398,7 +398,10 @@ typedef enum { NA_BAD, // an address lookup failed NA_LOOPBACK, NA_BROADCAST, - NA_IP + NA_IP, +// jmarshall + NA_BOT +// jmarshall end } netadrtype_t; typedef struct { From 304f676c522b031a83a91b3266c055e6f8b5c295 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Fri, 23 Jul 2021 16:04:55 -0700 Subject: [PATCH 18/38] Fix bug with previous CL. --- src/framework/async/AsyncNetwork.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/framework/async/AsyncNetwork.cpp b/src/framework/async/AsyncNetwork.cpp index 79d16b78..38d66c2f 100644 --- a/src/framework/async/AsyncNetwork.cpp +++ b/src/framework/async/AsyncNetwork.cpp @@ -301,7 +301,7 @@ void idAsyncNetwork::SpawnServer_f( const idCmdArgs &args ) { // don't let a server spawn with singleplayer game type - it will crash if ( idStr::Icmp( cvarSystem->GetCVarString( "si_gameType" ), "singleplayer" ) == 0 ) { - cvarSystem->SetCVarString( "si_gameType", "deathmatch" ); + cvarSystem->SetCVarString( "si_gameType", "dm" ); } com_asyncInput.SetBool( false ); // make sure the current system state is compatible with net_serverDedicated From 7dcab12d6905ff95869961bf9a81b5f29b891216 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Sun, 25 Jul 2021 11:20:55 -0700 Subject: [PATCH 19/38] Added ObstancleAvoidance code. --- src/game.vcxproj | 2 + src/game.vcxproj.filters | 6 + src/game/ai/ObstacleAvoidance.cpp | 1436 +++++++++++++++++++++++++++++ src/game/ai/ObstacleAvoidance.h | 117 +++ src/idlib/containers/Queue.h | 76 ++ src/idlib/math/Math.h | 12 + 6 files changed, 1649 insertions(+) create mode 100644 src/game/ai/ObstacleAvoidance.cpp create mode 100644 src/game/ai/ObstacleAvoidance.h diff --git a/src/game.vcxproj b/src/game.vcxproj index d809fc83..628f8581 100644 --- a/src/game.vcxproj +++ b/src/game.vcxproj @@ -228,6 +228,7 @@ Use + @@ -395,6 +396,7 @@ + diff --git a/src/game.vcxproj.filters b/src/game.vcxproj.filters index 51c80460..fef89207 100644 --- a/src/game.vcxproj.filters +++ b/src/game.vcxproj.filters @@ -522,6 +522,9 @@ Game + + Game\AI + @@ -836,6 +839,9 @@ Game\MP\Stats + + Game\AI + diff --git a/src/game/ai/ObstacleAvoidance.cpp b/src/game/ai/ObstacleAvoidance.cpp new file mode 100644 index 00000000..8cf9448a --- /dev/null +++ b/src/game/ai/ObstacleAvoidance.cpp @@ -0,0 +1,1436 @@ +// Copyright (C) 2007 Id Software, Inc. +// + +#pragma hdrstop +#include "precompiled.h" + +#include "../Game_local.h" +#include "ObstacleAvoidance.h" + +/* +=============================================================================== + + Dynamic Obstacle Avoidance + + - assumes the AI lives inside a bounding box aligned with the gravity direction + - obstacles in proximity of the AI are gathered + - if obstacles are found the AAS walls are also considered as obstacles + - every obstacle is represented by an oriented bounding box (OBB) + - an OBB is projected onto a 2D plane orthogonal to AI's gravity direction + - the 2D windings of the projections are expanded for the AI bbox + - a path tree is build using clockwise and counter clockwise edge walks along the winding edges + - the path tree is pruned and optimized + - the shortest path is chosen for navigation + +=============================================================================== +*/ + +idCVar aas_showObstacleAvoidance( "aas_showObstacleAvoidance", "0", CVAR_GAME | CVAR_INTEGER, "shows obstacles along paths" ); +idCVar aas_skipObstacleAvoidance( "aas_skipObstacleAvoidance", "0", CVAR_GAME | CVAR_BOOL, "ignore all dynamic obstacles along paths" ); + +const float idObstacleAvoidance::PUSH_OUTSIDE_OBSTACLES = 0.5f; +const float idObstacleAvoidance::CLIP_BOUNDS_EPSILON = 10.0f; + +/* +============ +idObstacleAvoidance::pathNode_t::Init +============ +*/ +void idObstacleAvoidance::pathNode_t::Init( void ) +{ + dir = 0; + pos.Zero(); + delta.Zero(); + obstacle = -1; + edgeNum = -1; + numNodes = 0; + parent = children[0] = children[1] = NULL; +} + +/* +============ +idObstacleAvoidance::LineIntersectsPath +============ +*/ +bool idObstacleAvoidance::LineIntersectsPath( const idVec2& start, const idVec2& end, const pathNode_t* node ) const +{ + float d0, d1, d2, d3; + idVec3 plane1, plane2; + + plane1 = idWinding2D::Plane2DFromPoints( start, end ); + d0 = plane1.x * node->pos.x + plane1.y * node->pos.y + plane1.z; + while( node->parent ) + { + d1 = plane1.x * node->parent->pos.x + plane1.y * node->parent->pos.y + plane1.z; + if( IEEE_FLT_SIGNBITSET( d0 ) ^ IEEE_FLT_SIGNBITSET( d1 ) ) + { + plane2 = idWinding2D::Plane2DFromPoints( node->pos, node->parent->pos ); + d2 = plane2.x * start.x + plane2.y * start.y + plane2.z; + d3 = plane2.x * end.x + plane2.y * end.y + plane2.z; + if( IEEE_FLT_SIGNBITSET( d2 ) ^ IEEE_FLT_SIGNBITSET( d3 ) ) + { + return true; + } + } + d0 = d1; + node = node->parent; + } + return false; +} + +/* +============ +idObstacleAvoidance::PointInsideObstacle +============ +*/ +int idObstacleAvoidance::PointInsideObstacle( const idVec2& point ) const +{ + int i; + + for( i = 0; i < obstacles.Num(); i++ ) + { + + const idVec2* bounds = obstacles[i].bounds; + if( point.x < bounds[0].x || point.y < bounds[0].y || point.x > bounds[1].x || point.y > bounds[1].y ) + { + continue; + } + + if( !obstacles[i].winding.PointInside( point, 0.1f ) ) + { + continue; + } + + return i; + } + + return -1; +} + +/* +============ +idObstacleAvoidance::LineIntersectsWall +============ +*/ +bool idObstacleAvoidance::LineIntersectsWall( const idVec2& start, const idVec2& end ) const +{ + int edgeNums[2]; + float scale1, scale2; + idVec2 bounds[2]; + idVec2 delta = end - start; + + // get bounds for the current movement delta + bounds[0] = start - idVec2( CM_BOX_EPSILON, CM_BOX_EPSILON ); + bounds[1] = start + idVec2( CM_BOX_EPSILON, CM_BOX_EPSILON ); + bounds[IEEE_FLT_SIGNBITNOTSET( delta.x )].x += delta.x; + bounds[IEEE_FLT_SIGNBITNOTSET( delta.y )].y += delta.y; + + float dist = delta.Length(); + + for( int i = 0; i < obstacles.Num(); i++ ) + { + // only test walls + if( obstacles[i].id != OBSTACLE_ID_INVALID ) + { + continue; + } + + if( bounds[0].x > obstacles[i].bounds[1].x || bounds[0].y > obstacles[i].bounds[1].y || + bounds[1].x < obstacles[i].bounds[0].x || bounds[1].y < obstacles[i].bounds[0].y ) + { + continue; + } + + if( obstacles[i].winding.RayIntersection( start, delta, scale1, scale2, edgeNums ) ) + { + if( scale1 * dist > -0.01f && scale1 < 1.0f ) + { + return true; + } + } + } + return false; +} + +/* +============ +idObstacleAvoidance::GetPointOutsideObstacles +============ +*/ +void idObstacleAvoidance::GetPointOutsideObstacles( idVec2& point, int* obstacle, int* edgeNum ) +{ + int i, j, k, n, bestObstacle, bestEdgeNum, queueStart, queueEnd, edgeNums[2]; + float bestd, scale[2]; + idVec2 bestPoint; + int* queue; + bool* obstacleVisited; + idWinding2D w1, w2; + + if( obstacle ) + { + *obstacle = -1; + } + if( edgeNum ) + { + *edgeNum = -1; + } + + bestObstacle = PointInsideObstacle( point ); + if( bestObstacle == -1 ) + { + return; + } + + const idWinding2D& w = obstacles[bestObstacle].winding; + bestd = idMath::INFINITY; + bestEdgeNum = -1; + for( i = 0; i < w.GetNumPoints(); i++ ) + { + idVec3 plane = idWinding2D::Plane2DFromPoints( w[( i + 1 ) % w.GetNumPoints()], w[i], true ); + float d = plane.x * point.x + plane.y * point.y + plane.z; + if( d < bestd ) + { + // make sure the line from 'point' to 'newPoint' doesn't intersect any wall edges + idVec2 newPoint = point - ( d + PUSH_OUTSIDE_OBSTACLES ) * plane.ToVec2(); + if( obstacles[bestObstacle].id == OBSTACLE_ID_INVALID || !LineIntersectsWall( point, newPoint ) ) + { + bestd = d; + bestPoint = newPoint; + bestEdgeNum = i; + } + } + // if this is a wall always try to pop out at the first edge + if( obstacles[bestObstacle].id == OBSTACLE_ID_INVALID ) + { + break; + } + } + + if( bestEdgeNum == -1 ) + { + return; + } + + if( PointInsideObstacle( bestPoint ) == -1 ) + { + point = bestPoint; + if( obstacle ) + { + *obstacle = bestObstacle; + } + if( edgeNum ) + { + *edgeNum = bestEdgeNum; + } + return; + } + + queue = ( int* ) _alloca( obstacles.Num() * sizeof( queue[0] ) ); + obstacleVisited = ( bool* ) _alloca( obstacles.Num() * sizeof( obstacleVisited[0] ) ); + + queueStart = 0; + queueEnd = 1; + queue[0] = bestObstacle; + + memset( obstacleVisited, 0, obstacles.Num() * sizeof( obstacleVisited[0] ) ); + obstacleVisited[bestObstacle] = true; + + bestd = idMath::INFINITY; + for( i = queue[0]; queueStart < queueEnd; i = queue[++queueStart] ) + { + w1 = obstacles[i].winding; + w1.Expand( PUSH_OUTSIDE_OBSTACLES ); + + for( j = 0; j < obstacles.Num(); j++ ) + { + // if the obstacle has been visited already + if( obstacleVisited[j] ) + { + continue; + } + // if the bounds do not intersect + if( obstacles[j].bounds[0].x > obstacles[i].bounds[1].x || obstacles[j].bounds[0].y > obstacles[i].bounds[1].y || + obstacles[j].bounds[1].x < obstacles[i].bounds[0].x || obstacles[j].bounds[1].y < obstacles[i].bounds[0].y ) + { + continue; + } + + queue[queueEnd++] = j; + obstacleVisited[j] = true; + + w2 = obstacles[j].winding; + w2.Expand( 0.2f ); + + for( k = 0; k < w1.GetNumPoints(); k++ ) + { + idVec2 dir = w1[( k + 1 ) % w1.GetNumPoints()] - w1[k]; + if( !w2.RayIntersection( w1[k], dir, scale[0], scale[1], edgeNums ) ) + { + continue; + } + for( n = 0; n < 2; n++ ) + { + idVec2 newPoint = w1[k] + scale[n] * dir; + if( PointInsideObstacle( newPoint ) == -1 ) + { + float d = ( newPoint - point ).LengthSqr(); + if( d < bestd ) + { + // make sure the line from 'point' to 'newPoint' doesn't intersect any wall edges + if( !LineIntersectsWall( point, newPoint ) ) + { + bestd = d; + bestPoint = newPoint; + bestEdgeNum = edgeNums[n]; + bestObstacle = j; + } + } + } + } + } + } + + if( bestd < idMath::INFINITY ) + { + point = bestPoint; + if( obstacle ) + { + *obstacle = bestObstacle; + } + if( edgeNum ) + { + *edgeNum = bestEdgeNum; + } + return; + } + } + idLib::Warning( "GetPointOutsideObstacles: no valid point found" ); +} + +/* +============ +idObstacleAvoidance::GetFirstBlockingObstacle +============ +*/ +bool idObstacleAvoidance::GetFirstBlockingObstacle( int skipObstacle, const idVec2& startPos, const idVec2& delta, float& blockingScale, int& blockingObstacle, int& blockingEdgeNum ) +{ + int i, edgeNums[2]; + float dist, scale1, scale2; + idVec2 bounds[2]; + + // get bounds for the current movement delta + bounds[0] = startPos - idVec2( CM_BOX_EPSILON, CM_BOX_EPSILON ); + bounds[1] = startPos + idVec2( CM_BOX_EPSILON, CM_BOX_EPSILON ); + bounds[IEEE_FLT_SIGNBITNOTSET( delta.x )].x += delta.x; + bounds[IEEE_FLT_SIGNBITNOTSET( delta.y )].y += delta.y; + + // test for obstacles blocking the path + blockingScale = idMath::INFINITY; + dist = delta.Length(); + for( i = 0; i < obstacles.Num(); i++ ) + { + if( i == skipObstacle ) + { + continue; + } + if( bounds[0].x > obstacles[i].bounds[1].x || bounds[0].y > obstacles[i].bounds[1].y || + bounds[1].x < obstacles[i].bounds[0].x || bounds[1].y < obstacles[i].bounds[0].y ) + { + continue; + } + if( obstacles[i].winding.RayIntersection( startPos, delta, scale1, scale2, edgeNums ) ) + { + if( scale1 < blockingScale && /*scale1 * dist > -0.01f && */ scale2 * dist > 0.01f ) + { +// if ( scale1 < blockingScale && scale1 * dist > -0.01f && scale2 * dist > 0.01f ) { + blockingScale = scale1; + blockingObstacle = i; + blockingEdgeNum = edgeNums[0]; + } + } + } + return ( blockingScale < 1.0f ); +} + +/* +============ +idObstacleAvoidance::ProjectTopDown +============ +*/ +void idObstacleAvoidance::ProjectTopDown( idVec3& point ) const +{ + idPlayer* player = gameLocal.GetLocalPlayer(); + if( player == NULL ) + { + return; + } + idMat3 viewAxis; + idVec3 viewOrigin; + player->GetViewPos( viewOrigin, viewAxis ); + idMat3 playerAxis = idAngles( 0.0f, -player->viewAngles.yaw, 0.0f ).ToMat3(); + float radius = ( lastQuery.radius * 2.0f ); + + //point = ( point - viewOrigin ) * playerAxis; + point = ( point - lastQuery.startPos ) * playerAxis; + point = viewOrigin + radius * viewAxis[0] + point.y * viewAxis[1] + point.x * viewAxis[2]; +} + +/* +============ +idObstacleAvoidance::DrawBox +============ +*/ +void idObstacleAvoidance::DrawBox() const +{ + idPlayer* player = gameLocal.GetLocalPlayer(); + if( player == NULL ) + { + return; + } + + //const idVec3 &origin = player->GetPhysics()->GetOrigin(); + const idVec3& origin = lastQuery.startPos; + float radius = lastQuery.radius; + + idVec3 box[7] = { origin, origin, origin, origin, origin, origin, origin }; + + box[0][0] += radius; + box[0][1] += radius; + + box[1][0] += radius; + box[1][1] -= radius; + + box[2][0] -= radius; + box[2][1] -= radius; + + box[3][0] -= radius; + box[3][1] += radius; + + box[4][1] += radius; + + box[5][0] += radius * 0.1f; + box[5][1] += radius - radius * 0.1f; + + box[6][0] -= radius * 0.1f; + box[6][1] += radius - radius * 0.1f; + + for( int i = 0; i < 7; i++ ) + { + ProjectTopDown( box[i] ); + } + for( int i = 0; i < 4; i++ ) + { + gameRenderWorld->DebugLine( colorCyan, box[i], box[( i + 1 ) & 3], 0 ); + } + gameRenderWorld->DebugLine( colorCyan, box[4], box[5], 0 ); + gameRenderWorld->DebugLine( colorCyan, box[4], box[6], 0 ); +} + +/* +============ +idObstacleAvoidance::GetObstacles +============ +*/ +int idObstacleAvoidance::GetObstacles( const idBounds& bounds, float radius, const idAAS* aas, int areaNum, const idVec3& startPos, const idVec3& seekPos, idBounds& clipBounds ) +{ + int i, j, numVerts, blockingObstacle, blockingEdgeNum; + int wallEdges[MAX_AAS_WALL_EDGES], numWallEdges, verts[2], lastVerts[2], nextVerts[2]; + float stepHeight, headHeight, blockingScale; + float halfBoundsSize; + idVec3 seekDelta, silVerts[32], start, end, nextStart, nextEnd; + idVec2 expBounds[2], edgeDir, edgeNormal, nextEdgeDir, nextEdgeNormal, lastEdgeNormal; + + seekDelta = seekPos - startPos; + + expBounds[0] = bounds[0].ToVec2() - idVec2( CM_BOX_EPSILON, CM_BOX_EPSILON ); + expBounds[1] = bounds[1].ToVec2() + idVec2( CM_BOX_EPSILON, CM_BOX_EPSILON ); + halfBoundsSize = ( expBounds[ 1 ].x - expBounds[ 0 ].x ) * 0.5f + CM_BOX_EPSILON; + + idVec3 invGravity( 0, 0, 1 ); + + bounds.AxisProjection( invGravity, stepHeight, headHeight ); + if( aas != NULL ) + { + stepHeight += aas->GetSettings()->maxStepHeight; + } + + clipBounds[0] = clipBounds[1] = startPos; + clipBounds.ExpandSelf( radius ); + + for( i = 0; i < obstacles.Num(); i++ ) + { + obstacle_t& obstacle = obstacles[i]; + + numVerts = obstacle.box.GetParallelProjectionSilhouetteVerts( -invGravity, silVerts ); + + // create a 2D winding for the obstacle; + obstacle.winding.Clear(); + for( j = 0; j < numVerts; j++ ) + { + obstacle.winding.AddPoint( silVerts[j].ToVec2() ); + } + + if( aas_showObstacleAvoidance.GetInteger() != 0 ) + { + for( j = 0; j < numVerts; j++ ) + { + silVerts[j].z = startPos.z; + if( aas_showObstacleAvoidance.GetInteger() > 1 ) + { + ProjectTopDown( silVerts[j] ); + } + } + for( j = 0; j < numVerts; j++ ) + { + gameRenderWorld->DebugLine( colorWhite, silVerts[j], silVerts[( j + 1 ) % numVerts] ); + } + } + + // expand the 2D winding for collision with a 2D box + obstacle.winding.ExpandForAxialBox( expBounds ); + obstacle.winding.GetBounds( obstacle.bounds ); + } + + // if the current path doesn't intersect any dynamic obstacles the path should be through valid AAS space + if( PointInsideObstacle( startPos.ToVec2() ) == -1 ) + { + if( !GetFirstBlockingObstacle( -1, startPos.ToVec2(), seekDelta.ToVec2(), blockingScale, blockingObstacle, blockingEdgeNum ) ) + { + return 0; + } + } + + // create obstacles for AAS walls + if( aas != NULL ) + { + numWallEdges = aas->GetWallEdges( areaNum, clipBounds, TFL_WALK, wallEdges, MAX_AAS_WALL_EDGES ); + //numWallEdges = aas->GetObstaclePVSWallEdges( areaNum, wallEdges, MAX_AAS_WALL_EDGES ); + + lastVerts[0] = lastVerts[1] = 0; + lastEdgeNormal.Zero(); + nextVerts[0] = nextVerts[1] = 0; + + for( i = 0; i < numWallEdges; i++ ) + { + aas->GetEdge( wallEdges[i], start, end ); + aas->GetEdgeVertexNumbers( wallEdges[i], verts ); + + idBounds bounds( start ); + bounds.AddPoint( end ); + if( !bounds.IntersectsBounds( clipBounds ) ) + { + continue; + } + + edgeDir = end.ToVec2() - start.ToVec2(); + edgeDir.Normalize(); + edgeNormal.x = edgeDir.y; + edgeNormal.y = -edgeDir.x; + if( i < numWallEdges - 1 ) + { + aas->GetEdge( wallEdges[i + 1], nextStart, nextEnd ); + aas->GetEdgeVertexNumbers( wallEdges[i + 1], nextVerts ); + nextEdgeDir = nextEnd.ToVec2() - nextStart.ToVec2(); + nextEdgeDir.Normalize(); + nextEdgeNormal.x = nextEdgeDir.y; + nextEdgeNormal.y = -nextEdgeDir.x; + } + + obstacle_t& obstacle = obstacles.Alloc(); + obstacle.winding.Clear(); + obstacle.winding.AddPoint( end.ToVec2() ); + obstacle.winding.AddPoint( start.ToVec2() ); + obstacle.winding.AddPoint( start.ToVec2() - edgeDir - edgeNormal * halfBoundsSize ); + obstacle.winding.AddPoint( end.ToVec2() + edgeDir - edgeNormal * halfBoundsSize ); + if( lastVerts[1] == verts[0] ) + { + obstacle.winding[2] -= lastEdgeNormal * halfBoundsSize; + } + else + { + obstacle.winding[1] -= edgeDir; + } + if( verts[1] == nextVerts[0] ) + { + obstacle.winding[3] -= nextEdgeNormal * halfBoundsSize; + } + else + { + obstacle.winding[0] += edgeDir; + } + obstacle.winding.GetBounds( obstacle.bounds ); + obstacle.id = OBSTACLE_ID_INVALID; + + memcpy( lastVerts, verts, sizeof( lastVerts ) ); + lastEdgeNormal = edgeNormal; + } + } + + // show obstacles + if( aas_showObstacleAvoidance.GetInteger() != 0 ) + { + for( i = 0; i < obstacles.Num(); i++ ) + { + obstacle_t& obstacle = obstacles[i]; + for( j = 0; j < obstacle.winding.GetNumPoints(); j++ ) + { + silVerts[j].ToVec2() = obstacle.winding[j]; + silVerts[j].z = startPos.z; + if( aas_showObstacleAvoidance.GetInteger() > 1 ) + { + ProjectTopDown( silVerts[j] ); + } + } + if( obstacle.id == OBSTACLE_ID_INVALID ) + { + gameRenderWorld->DebugLine( colorRed, silVerts[0], silVerts[1] ); + } + else + { + for( j = 0; j < obstacle.winding.GetNumPoints(); j++ ) + { + gameRenderWorld->DebugLine( colorGreen, silVerts[j], silVerts[( j + 1 ) % obstacle.winding.GetNumPoints()] ); + } + } + } + } + + return obstacles.Num(); +} + +/* +============ +idObstacleAvoidance::FreePathTree_r +============ +*/ +void idObstacleAvoidance::FreePathTree_r( pathNode_t* node ) +{ + if( node->children[0] ) + { + FreePathTree_r( node->children[0] ); + } + if( node->children[1] ) + { + FreePathTree_r( node->children[1] ); + } + pathNodeAllocator.Free( node ); +} + +/* +============ +idObstacleAvoidance::DrawPathTree +============ +*/ +void idObstacleAvoidance::DrawPathTree( const pathNode_t* root, const float height ) +{ + int i; + idVec3 start, end; + const pathNode_t* node; + + for( node = root; node; node = node->queueNode.GetNext() ) + { + for( i = 0; i < 2; i++ ) + { + if( node->children[i] ) + { + start.ToVec2() = node->pos; + start.z = height; + end.ToVec2() = node->children[i]->pos; + end.z = height; + if( aas_showObstacleAvoidance.GetInteger() > 1 ) + { + ProjectTopDown( start ); + ProjectTopDown( end ); + } + gameRenderWorld->DebugArrow( node->edgeNum == -1 ? colorYellow : i ? colorBlue : colorRed, start, end, 1 ); + break; + } + } + } +} + +/* +============ +idObstacleAvoidance::GetPathNodeDelta +============ +*/ +bool idObstacleAvoidance::GetPathNodeDelta( pathNode_t* node, const idVec2& seekPos, bool blocked ) +{ + int numPoints, edgeNum; + bool facing; + idVec2 seekDelta, dir; + pathNode_t* n; + + numPoints = obstacles[node->obstacle].winding.GetNumPoints(); + + // get delta along the current edge + while( 1 ) + { + edgeNum = ( node->edgeNum + node->dir ) % numPoints; + node->delta = obstacles[node->obstacle].winding[edgeNum] - node->pos; + if( node->delta.LengthSqr() > 0.01f ) + { + break; + } + node->edgeNum = ( node->edgeNum + numPoints + ( 2 * node->dir - 1 ) ) % numPoints; + } + + // if not blocked + if( !blocked ) + { + + // test if the current edge faces the goal + seekDelta = seekPos - node->pos; + facing = ( ( 2 * node->dir - 1 ) * ( node->delta.x * seekDelta.y - node->delta.y * seekDelta.x ) ) >= 0.0f; + + // if the current edge faces goal and the line from the current + // position to the goal does not intersect the current path + if( facing && !LineIntersectsPath( node->pos, seekPos, node->parent ) ) + { + node->delta = seekPos - node->pos; + node->edgeNum = -1; + } + } + + // if the delta is along the obstacle edge + if( node->edgeNum != -1 ) + { + // if the edge is found going from this node to the root node + for( n = node->parent; n; n = n->parent ) + { + + if( node->obstacle != n->obstacle || node->edgeNum != n->edgeNum ) + { + continue; + } + + // test whether or not the edge segments actually overlap + if( n->pos * node->delta > ( node->pos + node->delta ) * node->delta ) + { + continue; + } + if( node->pos * node->delta > ( n->pos + n->delta ) * node->delta ) + { + continue; + } + + break; + } + if( n ) + { + return false; + } + } + return true; +} + +/* +============ +idObstacleAvoidance::BuildPathTree +============ +*/ +idObstacleAvoidance::pathNode_t* idObstacleAvoidance::BuildPathTree( const idBounds& clipBounds, + const idVec2& startPos, + const idVec2& seekPos, + obstaclePath_t& path ) +{ + int blockingEdgeNum, blockingObstacle, obstaclePoints, bestNumNodes; + float blockingScale; + pathNode_t* root, *node, *child; + idQueue pathNodeQueue, treeQueue; + + // make sure the tree is never more than MAX_OBSTACLE_PATH nodes deep + bestNumNodes = MAX_OBSTACLE_PATH / 2; + + root = pathNodeAllocator.Alloc(); + root->Init(); + root->pos = startPos; + + root->delta = seekPos - root->pos; + root->numNodes = 1; + pathNodeQueue.Add( root ); + + for( node = pathNodeQueue.RemoveFirst(); node && pathNodeAllocator.GetAllocCount() < MAX_PATH_NODES; node = pathNodeQueue.RemoveFirst() ) + { + + treeQueue.Add( node ); + + // if this path has more than twice the number of nodes than the best path so far + if( node->numNodes >= bestNumNodes * 2 ) + { + continue; + } + + // don't move outside of the clip bounds + idVec2 endPos = node->pos + node->delta; + if( endPos.x - CLIP_BOUNDS_EPSILON < clipBounds[0].x || endPos.x + CLIP_BOUNDS_EPSILON > clipBounds[1].x || + endPos.y - CLIP_BOUNDS_EPSILON < clipBounds[0].y || endPos.y + CLIP_BOUNDS_EPSILON > clipBounds[1].y ) + { + continue; + } + + // if an obstacle is blocking the path + if( GetFirstBlockingObstacle( node->obstacle, node->pos, node->delta, blockingScale, blockingObstacle, blockingEdgeNum ) ) + { + + if( path.firstObstacle == OBSTACLE_ID_INVALID ) + { + path.firstObstacle = obstacles[blockingObstacle].id; + } + + node->delta *= blockingScale; + + if( node->edgeNum == -1 ) + { + node->children[0] = pathNodeAllocator.Alloc(); + node->children[0]->Init(); + node->children[1] = pathNodeAllocator.Alloc(); + node->children[1]->Init(); + node->children[0]->dir = 0; + node->children[1]->dir = 1; + node->children[0]->parent = node->children[1]->parent = node; + node->children[0]->pos = node->children[1]->pos = node->pos + node->delta; + node->children[0]->obstacle = node->children[1]->obstacle = blockingObstacle; + node->children[0]->edgeNum = node->children[1]->edgeNum = blockingEdgeNum; + node->children[0]->numNodes = node->children[1]->numNodes = node->numNodes + 1; + if( GetPathNodeDelta( node->children[0], seekPos, true ) ) + { + pathNodeQueue.Add( node->children[0] ); + } + if( GetPathNodeDelta( node->children[1], seekPos, true ) ) + { + pathNodeQueue.Add( node->children[1] ); + } + } + else + { + node->children[node->dir] = child = pathNodeAllocator.Alloc(); + child->Init(); + child->dir = node->dir; + child->parent = node; + child->pos = node->pos + node->delta; + child->obstacle = blockingObstacle; + child->edgeNum = blockingEdgeNum; + child->numNodes = node->numNodes + 1; + if( GetPathNodeDelta( child, seekPos, true ) ) + { + pathNodeQueue.Add( child ); + } + } + } + else + { + node->children[node->dir] = child = pathNodeAllocator.Alloc(); + child->Init(); + child->dir = node->dir; + child->parent = node; + child->pos = node->pos + node->delta; + child->numNodes = node->numNodes + 1; + + // there is a free path towards goal + if( node->edgeNum == -1 ) + { + if( node->numNodes < bestNumNodes ) + { + bestNumNodes = node->numNodes; + } + continue; + } + + child->obstacle = node->obstacle; + obstaclePoints = obstacles[node->obstacle].winding.GetNumPoints(); + child->edgeNum = ( node->edgeNum + obstaclePoints + ( 2 * node->dir - 1 ) ) % obstaclePoints; + + if( GetPathNodeDelta( child, seekPos, false ) ) + { + pathNodeQueue.Add( child ); + } + } + } + + return root; +} + +/* +============ +idObstacleAvoidance::PrunePathTree +============ +*/ +void idObstacleAvoidance::PrunePathTree( pathNode_t* root, const idVec2& seekPos ) +{ + int i; + float bestDist; + pathNode_t* node, *lastNode, *n, *bestNode; + + node = root; + while( node ) + { + + node->dist = ( seekPos - node->pos ).LengthSqr(); + + if( node->children[0] ) + { + node = node->children[0]; + } + else if( node->children[1] ) + { + node = node->children[1]; + } + else + { + + // find the node closest to the goal along this path + bestDist = idMath::INFINITY; + bestNode = node; + for( n = node; n; n = n->parent ) + { + if( n->children[0] && n->children[1] ) + { + break; + } + if( n->dist < bestDist ) + { + bestDist = n->dist; + bestNode = n; + } + } + + // free tree down from the best node + for( i = 0; i < 2; i++ ) + { + if( bestNode->children[i] ) + { + FreePathTree_r( bestNode->children[i] ); + bestNode->children[i] = NULL; + } + } + + for( lastNode = bestNode, node = bestNode->parent; node; lastNode = node, node = node->parent ) + { + if( node->children[1] && ( node->children[1] != lastNode ) ) + { + node = node->children[1]; + break; + } + } + } + } +} + +/* +============ +OptimizePath +============ +*/ +int idObstacleAvoidance::OptimizePath( const pathNode_t* root, + const pathNode_t* leafNode, + idVec2 optimizedPath[MAX_OBSTACLE_PATH] ) +{ + int i, numPathPoints, edgeNums[2]; + const pathNode_t* curNode, *nextNode; + idVec2 curPos, curDelta, bounds[2]; + float scale1, scale2, curLength; + + optimizedPath[0] = root->pos; + numPathPoints = 1; + + for( nextNode = curNode = root; curNode != leafNode; curNode = nextNode ) + { + + for( nextNode = leafNode; nextNode->parent != curNode; nextNode = nextNode->parent ) + { + + // can only take shortcuts when going from one object to another + if( nextNode->obstacle == curNode->obstacle ) + { + continue; + } + + curPos = curNode->pos; + curDelta = nextNode->pos - curPos; + curLength = curDelta.Length(); + + // get bounds for the current movement delta + bounds[0] = curPos - idVec2( CM_BOX_EPSILON, CM_BOX_EPSILON ); + bounds[1] = curPos + idVec2( CM_BOX_EPSILON, CM_BOX_EPSILON ); + bounds[IEEE_FLT_SIGNBITNOTSET( curDelta.x )].x += curDelta.x; + bounds[IEEE_FLT_SIGNBITNOTSET( curDelta.y )].y += curDelta.y; + + // test if the shortcut intersects with any obstacles + for( i = 0; i < obstacles.Num(); i++ ) + { + if( bounds[0].x > obstacles[i].bounds[1].x || bounds[0].y > obstacles[i].bounds[1].y || + bounds[1].x < obstacles[i].bounds[0].x || bounds[1].y < obstacles[i].bounds[0].y ) + { + continue; + } + if( obstacles[i].winding.RayIntersection( curPos, curDelta, scale1, scale2, edgeNums ) ) + { + if( scale1 >= 0.0f && scale1 <= 1.0f && ( i != nextNode->obstacle || scale1 * curLength < curLength - 0.5f ) ) + { + break; + } + if( scale2 >= 0.0f && scale2 <= 1.0f && ( i != nextNode->obstacle || scale2 * curLength < curLength - 0.5f ) ) + { + break; + } + } + } + if( i >= obstacles.Num() ) + { + break; + } + } + + assert( numPathPoints < MAX_OBSTACLE_PATH ); + + // store the next position along the optimized path + optimizedPath[numPathPoints++] = nextNode->pos; + } + + return numPathPoints; +} + +/* +============ +PathLength +============ +*/ +float idObstacleAvoidance::PathLength( const idVec2 optimizedPath[MAX_OBSTACLE_PATH], + int numPathPoints, const idVec2& curDir ) +{ + int i; + float pathLength; + + // calculate the path length + pathLength = 0.0f; + for( i = 0; i < numPathPoints - 1; i++ ) + { + pathLength += ( optimizedPath[i + 1] - optimizedPath[i] ).LengthFast(); + } + + // add penalty if this path does not go in the current direction + if( curDir * ( optimizedPath[1] - optimizedPath[0] ) < 0.0f ) + { + pathLength += 100.0f; + } + return pathLength; +} + +/* +============ +idObstacleAvoidance::FindOptimalPath + + Returns true if there is a path all the way to the goal. +============ +*/ +void idObstacleAvoidance::FindOptimalPath( const pathNode_t* root, const float height, const idVec3& curDir, idVec3& seekPos, float& targetDist, float& pathLength ) +{ + int bestNumPathPoints; + const pathNode_t* node, *lastNode, *bestNode; + idVec2 optimizedPath[MAX_OBSTACLE_PATH]; + float bestPathLength; + bool optimizedPathCalculated; + + seekPos.Zero(); + seekPos.z = height; + + optimizedPathCalculated = false; + + bestNode = root; + bestNumPathPoints = 0; + bestPathLength = idMath::INFINITY; + + node = root; + while( node ) + { + + if( node->dist <= bestNode->dist ) + { + + if( idMath::Fabs( node->dist - bestNode->dist ) < 1.0f ) + { + + if( !optimizedPathCalculated ) + { + bestNumPathPoints = OptimizePath( root, bestNode, optimizedPath ); + bestPathLength = PathLength( optimizedPath, bestNumPathPoints, curDir.ToVec2() ); + if( bestNumPathPoints > 1 ) + { + seekPos.ToVec2() = optimizedPath[1]; + } + else + { + seekPos.ToVec2() = optimizedPath[0]; + } + } + + int numPathPoints = OptimizePath( root, node, optimizedPath ); + float curPathLength = PathLength( optimizedPath, numPathPoints, curDir.ToVec2() ); + + if( curPathLength < bestPathLength ) + { + bestNode = node; + bestNumPathPoints = numPathPoints; + bestPathLength = curPathLength; + seekPos.ToVec2() = optimizedPath[1]; + } + optimizedPathCalculated = true; + + } + else + { + + bestNode = node; + optimizedPathCalculated = false; + } + } + + if( node->children[0] ) + { + node = node->children[0]; + } + else if( node->children[1] ) + { + node = node->children[1]; + } + else + { + for( lastNode = node, node = node->parent; node; lastNode = node, node = node->parent ) + { + if( node->children[1] && node->children[1] != lastNode ) + { + node = node->children[1]; + break; + } + } + } + } + + if( !optimizedPathCalculated ) + { + int numPathPoints = OptimizePath( root, bestNode, optimizedPath ); + pathLength = PathLength( optimizedPath, numPathPoints, curDir.ToVec2() ); + seekPos.ToVec2() = optimizedPath[1]; + } + else + { + pathLength = bestPathLength; + } + + targetDist = idMath::Sqrt( bestNode->dist ); + + if( aas_showObstacleAvoidance.GetBool() ) + { + idVec3 start, end; + start.z = end.z = height + 4.0f; + int numPathPoints = OptimizePath( root, bestNode, optimizedPath ); + for( int i = 0; i < numPathPoints - 1; i++ ) + { + start.ToVec2() = optimizedPath[ i ]; + end.ToVec2() = optimizedPath[ i + 1]; + if( aas_showObstacleAvoidance.GetInteger() > 1 ) + { + ProjectTopDown( start ); + ProjectTopDown( end ); + } + gameRenderWorld->DebugArrow( colorCyan, start, end, 1 ); + } + } +} + +/* +============ +idObstacleAvoidance::ClearObstacles +============ +*/ +void idObstacleAvoidance::ClearObstacles( void ) +{ + obstacles.SetNum( 0 ); +} + +/* +============ +idObstacleAvoidance::AddObstacle +============ +*/ +void idObstacleAvoidance::AddObstacle( const idBox& box, int id ) +{ + obstacle_t& obstacle = obstacles.Alloc(); + obstacle.box = box; + obstacle.id = id; +} + +/* +============ +idObstacleAvoidance::RemoveObstacle +============ +*/ +void idObstacleAvoidance::RemoveObstacle( int id ) +{ + for( int i = 0; i < obstacles.Num(); i++ ) + { + if( obstacles[i].id == id ) + { + obstacles.RemoveIndex( i ); + return; + } + } +} + +/* +============ +idObstacleAvoidance::FindPathAroundObstacles + + Finds a path around dynamic obstacles using a path tree with clockwise and counter clockwise edge walks. + If aas != NULL a path is constructed inside valid AAS space. +============ +*/ +bool idObstacleAvoidance::FindPathAroundObstacles( const idBounds& bounds, const float radius, const idAAS* aas, const idVec3& startPos, const idVec3& seekPos, obstaclePath_t& path, bool alwaysAvoidObstacles ) +{ + int areaNum = -1; + int startInsideObstacle, destInsideObstacle; + idBounds clipBounds; + pathNode_t* root; + + lastQuery.bounds = bounds; + lastQuery.radius = radius; + lastQuery.startPos = startPos; + lastQuery.seekPos = seekPos; + +//mal: debug code. + bool save = false; + if( save ) + { + SaveLastQuery( "test" ); + } + + // cap the seek position within the obstacle radius + idVec3 cappedSeekPos = seekPos; + if( aas != NULL ) + { + idVec3 moveDir = cappedSeekPos - startPos; + float moveLength = moveDir.Normalize(); +// jmarshall - check this on a per obstancle basis + //if ( moveLength > aas->GetSettings()->obstaclePVSRadius ) { + // cappedSeekPos = startPos + moveDir * aas->GetSettings()->obstaclePVSRadius * 0.9f; + //} + if( moveLength > 1024 ) + { + cappedSeekPos = startPos + moveDir * 1024.0f * 0.9f; + } +// jmarshall end + } + + // initialize the obstacle path in case there are no obstacles + path.seekPos = cappedSeekPos; + path.originalSeekPos = seekPos; + path.firstObstacle = OBSTACLE_ID_INVALID; + path.startPosOutsideObstacles = startPos; + path.startPosObstacle = OBSTACLE_ID_INVALID; + path.seekPosOutsideObstacles = cappedSeekPos; + path.seekPosObstacle = OBSTACLE_ID_INVALID; + path.pathLength = idMath::INFINITY; + path.hasValidPath = true; + + // get the AAS area number and a valid point inside that area + if( aas != NULL ) + { + areaNum = aas->PointReachableAreaNum( path.startPosOutsideObstacles, bounds, AREA_REACHABLE_WALK ); + aas->PushPointIntoAreaNum( areaNum, path.startPosOutsideObstacles ); + } + + if( aas_skipObstacleAvoidance.GetBool() ) + { + return true; + } + + // if there are no dynamic obstacles the path should be through valid AAS space + if( obstacles.Num() == 0 ) + { + return true; + } + + // get all the nearby obstacles + GetObstacles( bounds, radius, aas, areaNum, path.startPosOutsideObstacles, path.seekPosOutsideObstacles, clipBounds ); + + // get a source position outside the obstacles + GetPointOutsideObstacles( path.startPosOutsideObstacles.ToVec2(), &startInsideObstacle, NULL ); + if( startInsideObstacle != -1 ) + { + path.startPosObstacle = obstacles[startInsideObstacle].id; + } + + // get a goal position outside the obstacles + GetPointOutsideObstacles( path.seekPosOutsideObstacles.ToVec2(), &destInsideObstacle, NULL ); + if( destInsideObstacle != -1 ) + { + path.seekPosObstacle = obstacles[destInsideObstacle].id; + } + + // if start and destination are pushed to the same point, we don't have a path around the obstacle + if( ( path.seekPosOutsideObstacles.ToVec2() - path.startPosOutsideObstacles.ToVec2() ).LengthSqr() < Square( 1.0f ) ) + { + if( startInsideObstacle != -1 ) + { + path.startPosObstacle = obstacles[ startInsideObstacle ].id; + } + if( destInsideObstacle != -1 ) + { + path.seekPosObstacle = obstacles[ destInsideObstacle ].id; + } + if( path.startPosObstacle != OBSTACLE_ID_INVALID ) + { + path.firstObstacle = path.startPosObstacle; + } + else + { + path.firstObstacle = path.seekPosObstacle; + } + + if( alwaysAvoidObstacles ) + { + path.seekPos = path.startPosOutsideObstacles; + } + + if( ( cappedSeekPos.ToVec2() - startPos.ToVec2() ).LengthSqr() > Square( 2.0f ) ) + { + return false; + } + return true; + } + + // build a path tree + root = BuildPathTree( clipBounds, path.startPosOutsideObstacles.ToVec2(), path.seekPosOutsideObstacles.ToVec2(), path ); + + // draw the path tree + if( aas_showObstacleAvoidance.GetInteger() != 0 ) + { + DrawPathTree( root, startPos.z ); + if( aas_showObstacleAvoidance.GetInteger() > 1 ) + { + DrawBox(); + } + } + + // prune the tree + PrunePathTree( root, path.seekPosOutsideObstacles.ToVec2() ); + + // find the optimal path + FindOptimalPath( root, startPos.z, cappedSeekPos - startPos, path.seekPos, path.targetDist, path.pathLength ); + + // free the tree + FreePathTree_r( root ); + + // a valid path is found if the path gets close enough to the seekPos + path.hasValidPath = ( path.targetDist < 1.0f ); + + return path.hasValidPath; +} + +/* +=============== +idObstacleAvoidance::PointInObstacles + + Returns true if the point is inside an obstacle. + If aas != NULL the point is first pushed into valid AAS space. +=============== +*/ +bool idObstacleAvoidance::PointInObstacles( const idBounds& bounds, const float radius, const idAAS* aas, const idVec3& pos ) +{ + int areaNum = -1; + int insideObstacle; + idBounds clipBounds; + idVec3 posOutsideObstacles; + + posOutsideObstacles = pos; + + // get the AAS area number and a valid point inside that area + if( aas != NULL ) + { + areaNum = aas->PointReachableAreaNum( posOutsideObstacles, bounds, AREA_REACHABLE_WALK ); + aas->PushPointIntoAreaNum( areaNum, posOutsideObstacles ); + } + + // get all the nearby obstacles + GetObstacles( bounds, radius, aas, areaNum, posOutsideObstacles, posOutsideObstacles, clipBounds ); + + // get a source position outside the obstacles + GetPointOutsideObstacles( posOutsideObstacles.ToVec2(), &insideObstacle, NULL ); + if( insideObstacle != -1 ) + { + return true; + } + + return false; +} + +#define OBSTACLE_AVOIDANCE_QUERY_ID "ObstacleAvoidanceQuery" + +/* +=============== +idObstacleAvoidance::SaveLastQuery +=============== +*/ +bool idObstacleAvoidance::SaveLastQuery( const char* fileName ) +{ + idFile* file = fileSystem->OpenFileWrite( fileName, "fs_savepath" ); + if( file == NULL ) + { + return false; + } + + file->WriteString( OBSTACLE_AVOIDANCE_QUERY_ID ); + file->WriteVec3( lastQuery.bounds[0] ); + file->WriteVec3( lastQuery.bounds[1] ); + file->WriteFloat( lastQuery.radius ); + file->WriteVec3( lastQuery.startPos ); + file->WriteVec3( lastQuery.seekPos ); + file->WriteInt( obstacles.Num() ); + file->Write( &obstacles[0], obstacles.Num() * sizeof( obstacles[0] ) ); + + fileSystem->CloseFile( file ); + + return true; +} + +/* +=============== +idObstacleAvoidance::TestQuery +=============== +*/ +bool idObstacleAvoidance::TestQuery( const char* fileName, const idAAS* aas ) +{ + idFile* file = fileSystem->OpenFileRead( fileName ); + if( file == NULL ) + { + return false; + } + + idStr id; + file->ReadString( id ); + if( id != OBSTACLE_AVOIDANCE_QUERY_ID ) + { + fileSystem->CloseFile( file ); + return false; + } + file->ReadVec3( lastQuery.bounds[0] ); + file->ReadVec3( lastQuery.bounds[1] ); + file->ReadFloat( lastQuery.radius ); + file->ReadVec3( lastQuery.startPos ); + file->ReadVec3( lastQuery.seekPos ); + int num; + file->ReadInt( num ); + obstacles.SetNum( num ); + file->Read( &obstacles[0], obstacles.Num() * sizeof( obstacles[0] ) ); + + fileSystem->CloseFile( file ); + + obstaclePath_t path; + + bool result = FindPathAroundObstacles( lastQuery.bounds, lastQuery.radius, aas, lastQuery.startPos, lastQuery.seekPos, path ); + + gameRenderWorld->DebugBounds( colorOrange, lastQuery.bounds, lastQuery.startPos ); + + return true; +} diff --git a/src/game/ai/ObstacleAvoidance.h b/src/game/ai/ObstacleAvoidance.h new file mode 100644 index 00000000..7232bbf3 --- /dev/null +++ b/src/game/ai/ObstacleAvoidance.h @@ -0,0 +1,117 @@ +// Copyright (C) 2007 Id Software, Inc. +// + +#ifndef __OBSTACLEAVOIDANCE_H__ +#define __OBSTACLEAVOIDANCE_H__ + +/* +================================================================================ + +idObstacleAvoidance + +================================================================================ +*/ + +class idAAS; + +class idObstacleAvoidance +{ +public: + static const int OBSTACLE_ID_INVALID = -1; + + struct obstaclePath_t + { + idVec3 seekPos; // seek position avoiding obstacles + idVec3 originalSeekPos; // original, non-capped seek pos + float targetDist; // how close the path around obstacles gets to the target + int firstObstacle; // if != OBSTACLE_ID_INVALID the first obstacle along the path + idVec3 startPosOutsideObstacles; // start position outside obstacles + int startPosObstacle; // if != OBSTACLE_ID_INVALID the obstacle containing the start position + idVec3 seekPosOutsideObstacles; // seek position outside obstacles + int seekPosObstacle; // if != OBSTACLE_ID_INVALID the obstacle containing the seek position + float pathLength; // length of the path + bool hasValidPath; //mal: did we find a valid path? + }; + + +public: + idObstacleAvoidance( void ) { } + ~idObstacleAvoidance( void ) + { + pathNodeAllocator.Shutdown(); + } + + void ClearObstacles( void ); + void AddObstacle( const idBox& box, int id ); + void RemoveObstacle( int id ); + + bool FindPathAroundObstacles( const idBounds& bounds, const float radius, const idAAS* aas, const idVec3& startPos, const idVec3& seekPos, obstaclePath_t& path, bool alwaysAvoidObstacles = false ); + bool PointInObstacles( const idBounds& bounds, const float radius, const idAAS* aas, const idVec3& pos ); + + bool SaveLastQuery( const char* fileName ); + bool TestQuery( const char* fileName, const idAAS* aas ); + +private: + static const float PUSH_OUTSIDE_OBSTACLES; + static const float CLIP_BOUNDS_EPSILON; + static const int MAX_AAS_WALL_EDGES = 256; + static const int MAX_PATH_NODES = 256; + static const int MAX_OBSTACLE_PATH = 128; + + struct obstacle_t + { + idBox box; // oriented bounding box representing the obstacle + idVec2 bounds[2]; // two-dimensional bounds (in x-y plane) for obstacle + idWinding2D winding; // two-dimensional winding (in x-y plane) for obstacle + int id; // obstacle id + }; + + struct pathNode_t + { + int dir; + idVec2 pos; + idVec2 delta; + float dist; + int obstacle; + int edgeNum; + int numNodes; + pathNode_t* parent; + pathNode_t* children[2]; + idQueueNode queueNode; + void Init(); + }; + + struct query_t + { + idBounds bounds; + float radius; + idVec3 startPos; + idVec3 seekPos; + }; + +private: + bool LineIntersectsPath( const idVec2& start, const idVec2& end, const pathNode_t* node ) const; + int PointInsideObstacle( const idVec2& point ) const; + bool LineIntersectsWall( const idVec2& start, const idVec2& end ) const; + void GetPointOutsideObstacles( idVec2& point, int* obstacle, int* edgeNum ); + bool GetFirstBlockingObstacle( int skipObstacle, const idVec2& startPos, const idVec2& delta, float& blockingScale, int& blockingObstacle, int& blockingEdgeNum ); + void ProjectTopDown( idVec3& point ) const; + void DrawBox() const; + int GetObstacles( const idBounds& bounds, float radius, const idAAS* aas, int areaNum, const idVec3& startPos, const idVec3& seekPos, idBounds& clipBounds ); + void FreePathTree_r( pathNode_t* node ); + void DrawPathTree( const pathNode_t* root, const float height ); + bool GetPathNodeDelta( pathNode_t* node, const idVec2& seekPos, bool blocked ); + pathNode_t* BuildPathTree( const idBounds& clipBounds, const idVec2& startPos, const idVec2& seekPos, obstaclePath_t& path ); + void PrunePathTree( pathNode_t* root, const idVec2& seekPos ); + int OptimizePath( const pathNode_t* root, const pathNode_t* leafNode, idVec2 optimizedPath[MAX_OBSTACLE_PATH] ); + float PathLength( const idVec2 optimizedPath[MAX_OBSTACLE_PATH], int numPathPoints, const idVec2& curDir ); + void FindOptimalPath( const pathNode_t* root, const float height, const idVec3& curDir, idVec3& seekPos, float& targetDist, float& pathLength ); + +private: + idList obstacles; + idBlockAlloc pathNodeAllocator; + + query_t lastQuery; +}; + +#endif /* __OBSTACLEAVOIDANCE_H__ */ diff --git a/src/idlib/containers/Queue.h b/src/idlib/containers/Queue.h index 7665d0cd..93f129df 100644 --- a/src/idlib/containers/Queue.h +++ b/src/idlib/containers/Queue.h @@ -10,6 +10,82 @@ =============================================================================== */ + +template< typename type > +class idQueueNode { +public: + idQueueNode(void) { next = NULL; } + + type* GetNext(void) const { return next; } + void SetNext(type* next) { this->next = next; } + +private: + type* next; +}; + +template< typename type, idQueueNode type::* nodePtr > +class idQueue { +public: + idQueue(void); + + void Add(type* element); + type* RemoveFirst(void); + + static void Test(void); + +private: + type* first; + type* last; +}; + +template< typename type, idQueueNode type::* nodePtr > +idQueue::idQueue(void) { + first = last = NULL; +} + +template< typename type, idQueueNode type::* nodePtr > +void idQueue::Add(type* element) { + (element->*nodePtr).SetNext(NULL); + if (last) { + (last->*nodePtr).SetNext(element); + } + else { + first = element; + } + last = element; +} + +template< typename type, idQueueNode type::* nodePtr > +type* idQueue::RemoveFirst(void) { + type* element; + + element = first; + if (element) { + first = (first->*nodePtr).GetNext(); + if (last == element) { + last = NULL; + } + (element->*nodePtr).SetNext(NULL); + } + return element; +} + +template< typename type, idQueueNode type::* nodePtr > +void idQueue::Test(void) { + + class idMyType { + public: + idQueueNode queueNode; + }; + + idQueue myQueue; + + idMyType* element = new idMyType; + myQueue.Add(element); + element = myQueue.RemoveFirst(); + delete element; +} + template< class type, int nextOffset > class idQueueTemplate { public: diff --git a/src/idlib/math/Math.h b/src/idlib/math/Math.h index 5c305494..08719522 100644 --- a/src/idlib/math/Math.h +++ b/src/idlib/math/Math.h @@ -96,6 +96,18 @@ template ID_INLINE T Cube( T x ) { return x * x * x; } class idVec2; class idVec3; +/* +================================================================================================ + + floating point sign bit tests + +================================================================================================ +*/ + +#define IEEE_FLT_SIGNBITSET( a ) (reinterpret_cast(a) >> IEEE_FLT_SIGN_BIT) +#define IEEE_FLT_SIGNBITNOTSET( a ) ((~reinterpret_cast(a)) >> IEEE_FLT_SIGN_BIT) +#define IEEE_FLT_ISNOTZERO( a ) (reinterpret_cast(a) & ~(1u< Date: Mon, 26 Jul 2021 09:36:05 -0700 Subject: [PATCH 20/38] Initial Quake 3 bot integration into Quake 4. Doesn't work yet, initial integration. --- q4base/botfiles/bots/angelyss_c.c | 202 ++ q4base/botfiles/bots/angelyss_i.c | 120 ++ q4base/botfiles/bots/angelyss_t.c | 289 +++ q4base/botfiles/bots/angelyss_w.c | 55 + q4base/botfiles/bots/arachna_c.c | 202 ++ q4base/botfiles/bots/arachna_i.c | 120 ++ q4base/botfiles/bots/arachna_t.c | 275 +++ q4base/botfiles/bots/arachna_w.c | 55 + q4base/botfiles/bots/ayumi_c.c | 202 ++ q4base/botfiles/bots/ayumi_i.c | 120 ++ q4base/botfiles/bots/ayumi_t.c | 251 +++ q4base/botfiles/bots/ayumi_w.c | 55 + q4base/botfiles/bots/beret_c.c | 202 ++ q4base/botfiles/bots/beret_i.c | 120 ++ q4base/botfiles/bots/beret_t.c | 278 +++ q4base/botfiles/bots/beret_w.c | 55 + q4base/botfiles/bots/dark_c.c | 202 ++ q4base/botfiles/bots/dark_i.c | 120 ++ q4base/botfiles/bots/dark_t.c | 289 +++ q4base/botfiles/bots/dark_w.c | 55 + q4base/botfiles/bots/default_c.c | 202 ++ q4base/botfiles/bots/default_i.c | 120 ++ q4base/botfiles/bots/default_t.c | 178 ++ q4base/botfiles/bots/default_w.c | 55 + q4base/botfiles/bots/gargoyle_c.c | 203 ++ q4base/botfiles/bots/gargoyle_i.c | 74 + q4base/botfiles/bots/gargoyle_t.c | 266 +++ q4base/botfiles/bots/gargoyle_w.c | 42 + q4base/botfiles/bots/grism_c.c | 203 ++ q4base/botfiles/bots/grism_i.c | 74 + q4base/botfiles/bots/grism_t.c | 202 ++ q4base/botfiles/bots/grism_w.c | 41 + q4base/botfiles/bots/grunt_c.c | 203 ++ q4base/botfiles/bots/grunt_i.c | 74 + q4base/botfiles/bots/grunt_t.c | 266 +++ q4base/botfiles/bots/grunt_w.c | 42 + q4base/botfiles/bots/jenna_c.c | 202 ++ q4base/botfiles/bots/jenna_i.c | 120 ++ q4base/botfiles/bots/jenna_t.c | 275 +++ q4base/botfiles/bots/jenna_w.c | 55 + q4base/botfiles/bots/kyonshi_c.c | 203 ++ q4base/botfiles/bots/kyonshi_i.c | 74 + q4base/botfiles/bots/kyonshi_t.c | 212 +++ q4base/botfiles/bots/kyonshi_w.c | 41 + q4base/botfiles/bots/liz_c.c | 202 ++ q4base/botfiles/bots/liz_i.c | 120 ++ q4base/botfiles/bots/liz_t.c | 251 +++ q4base/botfiles/bots/liz_w.c | 55 + q4base/botfiles/bots/major_c.c | 202 ++ q4base/botfiles/bots/major_i.c | 120 ++ q4base/botfiles/bots/major_t.c | 290 +++ q4base/botfiles/bots/major_w.c | 55 + q4base/botfiles/bots/merman_c.c | 202 ++ q4base/botfiles/bots/merman_i.c | 120 ++ q4base/botfiles/bots/merman_t.c | 285 +++ q4base/botfiles/bots/merman_w.c | 55 + q4base/botfiles/bots/neko_c.c | 202 ++ q4base/botfiles/bots/neko_i.c | 120 ++ q4base/botfiles/bots/neko_t.c | 285 +++ q4base/botfiles/bots/neko_w.c | 55 + q4base/botfiles/bots/penguin_c.c | 202 ++ q4base/botfiles/bots/penguin_i.c | 120 ++ q4base/botfiles/bots/penguin_t.c | 276 +++ q4base/botfiles/bots/penguin_w.c | 55 + q4base/botfiles/bots/rai_c.c | 202 ++ q4base/botfiles/bots/rai_i.c | 120 ++ q4base/botfiles/bots/rai_t.c | 289 +++ q4base/botfiles/bots/rai_w.c | 55 + q4base/botfiles/bots/sarge_c.c | 203 ++ q4base/botfiles/bots/sarge_i.c | 74 + q4base/botfiles/bots/sarge_t.c | 202 ++ q4base/botfiles/bots/sarge_w.c | 41 + q4base/botfiles/bots/sergei_c.c | 202 ++ q4base/botfiles/bots/sergei_i.c | 120 ++ q4base/botfiles/bots/sergei_t.c | 284 +++ q4base/botfiles/bots/sergei_w.c | 55 + q4base/botfiles/bots/skelebot_c.c | 202 ++ q4base/botfiles/bots/skelebot_i.c | 120 ++ q4base/botfiles/bots/skelebot_t.c | 202 ++ q4base/botfiles/bots/skelebot_w.c | 55 + q4base/botfiles/bots/sly_c.c | 202 ++ q4base/botfiles/bots/sly_i.c | 120 ++ q4base/botfiles/bots/sly_t.c | 289 +++ q4base/botfiles/bots/sly_w.c | 55 + q4base/botfiles/bots/tanisha_c.c | 202 ++ q4base/botfiles/bots/tanisha_i.c | 120 ++ q4base/botfiles/bots/tanisha_t.c | 289 +++ q4base/botfiles/bots/tanisha_w.c | 55 + q4base/botfiles/bots/tony_c.c | 202 ++ q4base/botfiles/bots/tony_i.c | 120 ++ q4base/botfiles/bots/tony_t.c | 202 ++ q4base/botfiles/bots/tony_w.c | 55 + q4base/botfiles/bots/widowe_c.c | 202 ++ q4base/botfiles/bots/widowe_i.c | 120 ++ q4base/botfiles/bots/widowe_t.c | 275 +++ q4base/botfiles/bots/widowe_w.c | 55 + q4base/botfiles/chars.h | 134 ++ q4base/botfiles/fuzi.c | 692 +++++++ q4base/botfiles/fuzw.c | 282 +++ q4base/botfiles/inv.h | 184 ++ q4base/botfiles/items.c | 738 ++++++++ q4base/botfiles/match.c | 332 ++++ q4base/botfiles/match.h | 138 ++ q4base/botfiles/rchat.c | 293 +++ q4base/botfiles/rnd.c | 1168 ++++++++++++ q4base/botfiles/syn.c | 233 +++ q4base/botfiles/syn.h | 34 + q4base/botfiles/teamplay.h | 544 ++++++ q4base/botfiles/weapons.c | 226 +++ q4base/def/bots.def | 4 + src/framework/Session.cpp | 2 +- src/framework/async/AsyncServer.cpp | 11 +- src/framework/async/AsyncServer.h | 2 +- src/framework/async/NetworkSystem.cpp | 4 +- src/framework/async/NetworkSystem.h | 2 +- src/game.vcxproj | 26 + src/game.vcxproj.filters | 81 + src/game/Actor.cpp | 18 + src/game/Actor.h | 2 + src/game/Entity.cpp | 57 + src/game/Entity.h | 10 + src/game/Game.h | 4 +- src/game/Game_local.cpp | 140 +- src/game/Game_local.h | 53 +- src/game/Game_network.cpp | 8 +- src/game/Item.cpp | 4 + src/game/Item.h | 11 + src/game/Player.cpp | 54 + src/game/Player.h | 12 +- src/game/ai/AAS.cpp | 15 + src/game/ai/AAS.h | 8 + src/game/ai/AASCallback_AvoidLocation.cpp | 126 ++ src/game/ai/AASCallback_AvoidLocation.h | 41 + src/game/ai/AASCallback_FindCoverArea.cpp | 58 + src/game/ai/AASCallback_FindCoverArea.h | 32 + src/game/ai/AAS_local.h | 12 +- src/game/bots/Bot.cpp | 416 +++++ src/game/bots/Bot.h | 923 +++++++++ src/game/bots/BotAI.cpp | 1389 ++++++++++++++ src/game/bots/BotAI_Battle_Attacked.cpp | 50 + src/game/bots/BotAI_Battle_Chase.cpp | 208 +++ src/game/bots/BotAI_Battle_Fight.cpp | 168 ++ src/game/bots/BotAI_Battle_NBG.cpp | 178 ++ src/game/bots/BotAI_Battle_Retreat.cpp | 144 ++ src/game/bots/BotAI_SeekLTG.cpp | 49 + src/game/bots/BotAI_Seek_NBG.cpp | 142 ++ src/game/bots/BotAI_respawn.cpp | 33 + src/game/bots/Bot_Input.cpp | 165 ++ src/game/bots/Bot_char.cpp | 353 ++++ src/game/bots/Bot_char.h | 153 ++ src/game/bots/Bot_chat.cpp | 54 + src/game/bots/Bot_chat.h | 9 + src/game/bots/Bot_goal.cpp | 2065 +++++++++++++++++++++ src/game/bots/Bot_goal.h | 342 ++++ src/game/bots/Bot_weapons.cpp | 492 +++++ src/game/bots/Bot_weapons.h | 161 ++ src/game/bots/Bot_weights.cpp | 915 +++++++++ src/game/bots/Bot_weights.h | 53 + src/game/gamesys/Class.h | 19 +- src/game/gamesys/State.cpp | 4 + src/game/gamesys/SysCmds.cpp | 29 + src/game/physics/Clip.cpp | 27 + src/game/physics/Clip.h | 4 + src/idlib/Lexer.cpp | 10 + src/idlib/Lexer.h | 16 + src/idlib/Parser.cpp | 35 + src/idlib/Parser.h | 3 + src/idlib/Str.cpp | 25 + src/idlib/Str.h | 5 + src/idlib/math/Math.cpp | 66 + src/idlib/math/Math.h | 34 + src/renderer/Material.h | 5 + 172 files changed, 29464 insertions(+), 30 deletions(-) create mode 100644 q4base/botfiles/bots/angelyss_c.c create mode 100644 q4base/botfiles/bots/angelyss_i.c create mode 100644 q4base/botfiles/bots/angelyss_t.c create mode 100644 q4base/botfiles/bots/angelyss_w.c create mode 100644 q4base/botfiles/bots/arachna_c.c create mode 100644 q4base/botfiles/bots/arachna_i.c create mode 100644 q4base/botfiles/bots/arachna_t.c create mode 100644 q4base/botfiles/bots/arachna_w.c create mode 100644 q4base/botfiles/bots/ayumi_c.c create mode 100644 q4base/botfiles/bots/ayumi_i.c create mode 100644 q4base/botfiles/bots/ayumi_t.c create mode 100644 q4base/botfiles/bots/ayumi_w.c create mode 100644 q4base/botfiles/bots/beret_c.c create mode 100644 q4base/botfiles/bots/beret_i.c create mode 100644 q4base/botfiles/bots/beret_t.c create mode 100644 q4base/botfiles/bots/beret_w.c create mode 100644 q4base/botfiles/bots/dark_c.c create mode 100644 q4base/botfiles/bots/dark_i.c create mode 100644 q4base/botfiles/bots/dark_t.c create mode 100644 q4base/botfiles/bots/dark_w.c create mode 100644 q4base/botfiles/bots/default_c.c create mode 100644 q4base/botfiles/bots/default_i.c create mode 100644 q4base/botfiles/bots/default_t.c create mode 100644 q4base/botfiles/bots/default_w.c create mode 100644 q4base/botfiles/bots/gargoyle_c.c create mode 100644 q4base/botfiles/bots/gargoyle_i.c create mode 100644 q4base/botfiles/bots/gargoyle_t.c create mode 100644 q4base/botfiles/bots/gargoyle_w.c create mode 100644 q4base/botfiles/bots/grism_c.c create mode 100644 q4base/botfiles/bots/grism_i.c create mode 100644 q4base/botfiles/bots/grism_t.c create mode 100644 q4base/botfiles/bots/grism_w.c create mode 100644 q4base/botfiles/bots/grunt_c.c create mode 100644 q4base/botfiles/bots/grunt_i.c create mode 100644 q4base/botfiles/bots/grunt_t.c create mode 100644 q4base/botfiles/bots/grunt_w.c create mode 100644 q4base/botfiles/bots/jenna_c.c create mode 100644 q4base/botfiles/bots/jenna_i.c create mode 100644 q4base/botfiles/bots/jenna_t.c create mode 100644 q4base/botfiles/bots/jenna_w.c create mode 100644 q4base/botfiles/bots/kyonshi_c.c create mode 100644 q4base/botfiles/bots/kyonshi_i.c create mode 100644 q4base/botfiles/bots/kyonshi_t.c create mode 100644 q4base/botfiles/bots/kyonshi_w.c create mode 100644 q4base/botfiles/bots/liz_c.c create mode 100644 q4base/botfiles/bots/liz_i.c create mode 100644 q4base/botfiles/bots/liz_t.c create mode 100644 q4base/botfiles/bots/liz_w.c create mode 100644 q4base/botfiles/bots/major_c.c create mode 100644 q4base/botfiles/bots/major_i.c create mode 100644 q4base/botfiles/bots/major_t.c create mode 100644 q4base/botfiles/bots/major_w.c create mode 100644 q4base/botfiles/bots/merman_c.c create mode 100644 q4base/botfiles/bots/merman_i.c create mode 100644 q4base/botfiles/bots/merman_t.c create mode 100644 q4base/botfiles/bots/merman_w.c create mode 100644 q4base/botfiles/bots/neko_c.c create mode 100644 q4base/botfiles/bots/neko_i.c create mode 100644 q4base/botfiles/bots/neko_t.c create mode 100644 q4base/botfiles/bots/neko_w.c create mode 100644 q4base/botfiles/bots/penguin_c.c create mode 100644 q4base/botfiles/bots/penguin_i.c create mode 100644 q4base/botfiles/bots/penguin_t.c create mode 100644 q4base/botfiles/bots/penguin_w.c create mode 100644 q4base/botfiles/bots/rai_c.c create mode 100644 q4base/botfiles/bots/rai_i.c create mode 100644 q4base/botfiles/bots/rai_t.c create mode 100644 q4base/botfiles/bots/rai_w.c create mode 100644 q4base/botfiles/bots/sarge_c.c create mode 100644 q4base/botfiles/bots/sarge_i.c create mode 100644 q4base/botfiles/bots/sarge_t.c create mode 100644 q4base/botfiles/bots/sarge_w.c create mode 100644 q4base/botfiles/bots/sergei_c.c create mode 100644 q4base/botfiles/bots/sergei_i.c create mode 100644 q4base/botfiles/bots/sergei_t.c create mode 100644 q4base/botfiles/bots/sergei_w.c create mode 100644 q4base/botfiles/bots/skelebot_c.c create mode 100644 q4base/botfiles/bots/skelebot_i.c create mode 100644 q4base/botfiles/bots/skelebot_t.c create mode 100644 q4base/botfiles/bots/skelebot_w.c create mode 100644 q4base/botfiles/bots/sly_c.c create mode 100644 q4base/botfiles/bots/sly_i.c create mode 100644 q4base/botfiles/bots/sly_t.c create mode 100644 q4base/botfiles/bots/sly_w.c create mode 100644 q4base/botfiles/bots/tanisha_c.c create mode 100644 q4base/botfiles/bots/tanisha_i.c create mode 100644 q4base/botfiles/bots/tanisha_t.c create mode 100644 q4base/botfiles/bots/tanisha_w.c create mode 100644 q4base/botfiles/bots/tony_c.c create mode 100644 q4base/botfiles/bots/tony_i.c create mode 100644 q4base/botfiles/bots/tony_t.c create mode 100644 q4base/botfiles/bots/tony_w.c create mode 100644 q4base/botfiles/bots/widowe_c.c create mode 100644 q4base/botfiles/bots/widowe_i.c create mode 100644 q4base/botfiles/bots/widowe_t.c create mode 100644 q4base/botfiles/bots/widowe_w.c create mode 100644 q4base/botfiles/chars.h create mode 100644 q4base/botfiles/fuzi.c create mode 100644 q4base/botfiles/fuzw.c create mode 100644 q4base/botfiles/inv.h create mode 100644 q4base/botfiles/items.c create mode 100644 q4base/botfiles/match.c create mode 100644 q4base/botfiles/match.h create mode 100644 q4base/botfiles/rchat.c create mode 100644 q4base/botfiles/rnd.c create mode 100644 q4base/botfiles/syn.c create mode 100644 q4base/botfiles/syn.h create mode 100644 q4base/botfiles/teamplay.h create mode 100644 q4base/botfiles/weapons.c create mode 100644 q4base/def/bots.def create mode 100644 src/game/ai/AASCallback_AvoidLocation.cpp create mode 100644 src/game/ai/AASCallback_AvoidLocation.h create mode 100644 src/game/ai/AASCallback_FindCoverArea.cpp create mode 100644 src/game/ai/AASCallback_FindCoverArea.h create mode 100644 src/game/bots/Bot.cpp create mode 100644 src/game/bots/Bot.h create mode 100644 src/game/bots/BotAI.cpp create mode 100644 src/game/bots/BotAI_Battle_Attacked.cpp create mode 100644 src/game/bots/BotAI_Battle_Chase.cpp create mode 100644 src/game/bots/BotAI_Battle_Fight.cpp create mode 100644 src/game/bots/BotAI_Battle_NBG.cpp create mode 100644 src/game/bots/BotAI_Battle_Retreat.cpp create mode 100644 src/game/bots/BotAI_SeekLTG.cpp create mode 100644 src/game/bots/BotAI_Seek_NBG.cpp create mode 100644 src/game/bots/BotAI_respawn.cpp create mode 100644 src/game/bots/Bot_Input.cpp create mode 100644 src/game/bots/Bot_char.cpp create mode 100644 src/game/bots/Bot_char.h create mode 100644 src/game/bots/Bot_chat.cpp create mode 100644 src/game/bots/Bot_chat.h create mode 100644 src/game/bots/Bot_goal.cpp create mode 100644 src/game/bots/Bot_goal.h create mode 100644 src/game/bots/Bot_weapons.cpp create mode 100644 src/game/bots/Bot_weapons.h create mode 100644 src/game/bots/Bot_weights.cpp create mode 100644 src/game/bots/Bot_weights.h diff --git a/q4base/botfiles/bots/angelyss_c.c b/q4base/botfiles/bots/angelyss_c.c new file mode 100644 index 00000000..1a6bff0d --- /dev/null +++ b/q4base/botfiles/bots/angelyss_c.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Angelyss" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 0.3 + CHARACTERISTIC_WEAPONWEIGHTS "bots/angelyss_w.c" + CHARACTERISTIC_AIM_SKILL 0.3 + CHARACTERISTIC_AIM_ACCURACY 0.3 + CHARACTERISTIC_VIEW_FACTOR 0.3 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 1.5 + + CHARACTERISTIC_CHAT_FILE "bots/angelyss_t.c" + CHARACTERISTIC_CHAT_NAME "angelyss" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 0.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 0.5 + CHARACTERISTIC_GRAPPLE_USER 0.5 + + CHARACTERISTIC_ITEMWEIGHTS "bots/angelyss_i.c" + CHARACTERISTIC_AGGRESSION 0.25 + CHARACTERISTIC_SELFPRESERVATION 0.5 + CHARACTERISTIC_VENGEFULNESS 0.25 + CHARACTERISTIC_CAMPER 0.25 + + CHARACTERISTIC_EASY_FRAGGER 0.5 + CHARACTERISTIC_ALERTNESS 0.5 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.43 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.43 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.43 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.43 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.43 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.43 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.43 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.43 + + CHARACTERISTIC_FIRETHROTTLE 0.43 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Angelyss" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/angelyss_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 0.9 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.75 + + CHARACTERISTIC_CHAT_FILE "bots/angelyss_t.c" + CHARACTERISTIC_CHAT_NAME "angelyss" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.1 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/angelyss_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.5 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.95 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.95 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.95 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.95 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.95 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.95 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.95 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.95 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.95 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.95 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.95 + + CHARACTERISTIC_FIRETHROTTLE 0.1 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Angelyss" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/angelyss_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 1.0 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.0 + + CHARACTERISTIC_CHAT_FILE "bots/angelyss_t.c" + CHARACTERISTIC_CHAT_NAME "angelyss" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/angelyss_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.0 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.0 + + CHARACTERISTIC_FIRETHROTTLE 0.01 +} diff --git a/q4base/botfiles/bots/angelyss_i.c b/q4base/botfiles/bots/angelyss_i.c new file mode 100644 index 00000000..79f4b555 --- /dev/null +++ b/q4base/botfiles/bots/angelyss_i.c @@ -0,0 +1,120 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +//health +#define FPH 2 +//armor +#define FPA 2 +//without the weapons +//shotgun +#define SGW 200 +//machinegun +#define MGW 50 +//grenadelauncher +#define GLW 300 +//rocket launcher +#define RLW 400 +//rail gun +#define RGW 260 +//bfg10k +#define BFW 350 +//lightninggun +#define LGW 50 +//plasmagun +#define PGW 250 +//prox-launcher +#define PXW 350 +//nailgun +#define NGW 150 +//chaingun +#define CGW 200 + + + + +//with the weapons +//shotgun +#define GSGW 50 +//machinegun +#define GMGW 50 +//grenadelauncher +#define GGLW 400 +//rocketlauncher +#define GRLW 210 +//railgun +#define GRGW 50 +//bfg10k +#define GBFW 400 +//lightninggun +#define GLGW 50 +//plasmagun +#define GPGW 50 +//prox-launcher +#define GPXW 200 +//failgun +#define GNGW 100 +//chaingun +#define GCGW 125 +//individual powerups +//teleport +#define TELW 190 +//medkit +#define MEDW 50 +//quad-damage +#define QW 500 +//envirosuit +#define ENVW 50 +//haste +#define HAW 50 +//invisibility +#define INW 400 +//regeneration +#define REGW 50 +//flight +#define FLW 175 +//kamikaze +#define KAMW 200 +//invulnerability +#define IBW 150 +//portal +#define PORW 300 +//scout +#define SCW 100 +//guard +#define GUW 200 +//doubler +#define DUBW 100 +//ammo-regen +#define AMRW 400 +//red-cube +#define REDCW 200 +//blue-cube +#define BLCW 200 +//ctf flag weight +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/angelyss_t.c b/q4base/botfiles/bots/angelyss_t.c new file mode 100644 index 00000000..bc84136e --- /dev/null +++ b/q4base/botfiles/bots/angelyss_t.c @@ -0,0 +1,289 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "Angelyss" +{ + //the teamplay.h file is included for all kinds of teamplay chats + #include "teamplay.h" + //====================================================== + //====================================================== + type "game_enter" //initiated when the bot enters the game + { + "Hello."; + "Are you prepared for pain?"; + HELLO1; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "game_exit" //initiated when the bot exits the game + { + "Look at the ~time"; + 4, " kinda wears on me, I think I'll find a different server, later ~peeps"; + GOODBYE1; + GOODBYE0; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "level_start" //initiated when a new level starts + { + 0, " it is time for some payback!"; + 1, " you are going to have some pain in ", 4, "."; + HELLO2; + + // 0 = bot name + } //end type + type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings + { + "HA! ", 3, " is at the bottom, as usual."; + 2, ", I let you win."; + 4, " has changed a lot, it is much faster now."; + "Is it over yet?"; + "I can remember when ", 4, " didn't suck."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_victory" //initiated when a level ends and the bot is first in the rankings + { + 3, " you need to practice more... and forget about winning against me."; + LEVEL_END_VICTORY1; + "I really like ", 4, " since they fixed it, it is so easy to win!"; + "Next time, don't bother."; + // 0 = bot name + // 1 = random opponent + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_lose" //initiated when a level ends and the bot is last in the rankings + { + 2, " cheated."; + "I had a hang nail, so of course I lost."; + "So much for my bluster..."; + "I felt bad for you so I let you win."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 4 = level's title + } //end type + //====================================================== + //====================================================== + type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship + { + 0, ", didn't your mother ever tell you it was rude to interrupt a conversation?"; + "I am going to shove that ", 1, " down your throat if you do that again!"; + "Hey jerk! I was trying to hold a conversation here... do you mind?"; + "Jerk"; + DEATH_TALKING; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult + { + 1, " is not a good weapon, a ", weapon, " should be more your speed."; + "You need to aim better."; + "Try harder next time."; + curse; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nokill" //bot hits an opponent but does not kill it + { + 0, " must be cheating."; + "Dammit! Why won't you die?!?"; + "Well that sucked..."; + "Note to self... turn off safety next ~time"; + // 0 = opponent + } //end type + type "enemy_suicide" //enemy of the bot commits suicide + { + "Stop smoking ", substance, " and maybe you won't kill yourself so often."; + "Tired of life, ", 0, "? Give it up."; + "I guess that beats dying of ", disease, "..."; + // 0 = enemy + } //end type + //====================================================== + //====================================================== + type "death_telefrag" //initiated when the bot is killed by a telefrag + { + "I hate praetorian impressions."; + "My ", counselor, " warned about days like this."; + "D'oh!"; + DEATH_TELEFRAGGED1; + // 0 = enemy name + } //end type + type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage + { + DEATH_FALLING0; + "It didn't look that high from up there..."; + "*sigh*"; + // 0 = random opponent + } //end type + type "death_lava" //initiated when the bot dies in lava + { + "Well... it beats a case of hypothermia."; + "At least it is warm here"; + DEATH_SUICIDE1; + // 0 = random opponent + } //end type + type "death_slime" //initiated when the bot dies in slime + { + "Green has never been my color..."; + DEATH_SLIME1; + // 0 = random opponent + } //end type + type "death_drown" //initiated when the bot drowns + { + DEATH_DROWN0; + "It isn't that difficult to just breath water..."; + "So why can't I breath water?"; + // 0 = random opponent + } //end type + type "death_suicide" //initiated when bot blows self up with a weapon or craters + { + DEATH_SUICIDE2; + "So much for life and all of its cruel irony."; + "It is just easier for ", 0, " this way."; + + + // 0 = random opponent + } //end type + type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack + { + "Unsanitary."; + "What part of '~Don't touch me there' do you not understand?"; + DEATH_GAUNTLET1; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Gauntlet) + } //end type + type "death_rail" //initiated when the bot is killed by a rail gun shot + { + DEATH_INSULT0; + DEATH_FEM_INSULT1; + DEATH_INSULT5; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Railgun) + } //end type + type "death_bfg" //initiated when the bot died by a BFG + { + "Can't find a skill weapon? Or is it just that you suck?"; + "Over-compensating for something?"; + DEATH_BFG0; + DEATH_BFG2; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to BFG10K) + } //end type + type "death_insult" //insult initiated when the bot died + { + curse; + "This is far more painful than it looks."; + "One day, ", 0, " you me and a ", weapon, " are going to have a discussion."; + "Is that the best you can do?"; + DEATH_INSULT2; + DEATH_INSULT0; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + type "death_praise" //praise initiated when the bot died + { + "Not bad, ", 0, ", have you been practicing?"; + "I never saw it coming."; + D_PRAISE0; + D_PRAISE1; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + //====================================================== + //====================================================== + type "kill_rail" //initiated when the bot kills someone with rail gun + { + 0, ", you should stay down..."; + "*sigh* if only this was challenging."; + "I love this gun!"; + "Way too easy"; + // 0 = enemy name + } //end type + type "kill_gauntlet" //initiated when the bot kills someone with gauntlet + { + "LOL!"; + "Too easy"; + // 0 = enemy name + } //end type + type "kill_telefrag" //initiated when the bot telefragged someone + { + "LOL!"; + "Aww man... now I have to take a bath to get the brains out."; + "Does anyone have a quick way of getting brains out of your hair?"; + // 0 = enemy name + } //end type + type "kill_insult" //insult initiated when the bot killed someone + { + KILL_INSULT4; + "Why do you even bother?"; + + + // 0 = enemy name + } //end type + type "kill_praise" //praise initiated when the bot killed someone + { + "You are getting better, ", 0, ", keep it up and you might actually win something."; + + // 0 = enemy name + } //end type + //====================================================== + //====================================================== + type "random_insult" //insult initiated randomly (just when the bot feels like it) + { + TAUNT0; + TAUNT_FEM0; + TAUNT1; + "You should give up your ", substance, " addiction by next ", month, "."; + "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!"; + immaturity01; + "Your ", family_member, " needs to stop calling me."; + + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type + type "random_misc" //miscellanous chats initiated randomly + { + "this one time, at band camp..."; + GRRLTALK1; + MISC4; + "Has anyone tried out the new ", 5, "? Is it worth the upgrade?"; + MISC1; + "You would be surprised what you can do with a ", animal, " a ", food, " and ", peeps, "."; + "Next time you see Gargoyle tell him to call me, mmmkay?"; + neuterbot, " is cute."; + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type +} //end chat + diff --git a/q4base/botfiles/bots/angelyss_w.c b/q4base/botfiles/bots/angelyss_w.c new file mode 100644 index 00000000..6d996d63 --- /dev/null +++ b/q4base/botfiles/bots/angelyss_w.c @@ -0,0 +1,55 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +/*weapon defines weights 10-500 + try to keep it balanced*/ + +#include "inv.h" +//gauntlet +#define GTW 40 +//shotgun +#define SGW 110 +//machinegun +#define MGW 90 +//grenade launcher +#define GLW 170 +//rocket launcher +#define RLW 160 +//railgun +#define RGW 150 +//bfg10k +#define BFW 90 +//lightninggun +#define LGW 200 +//plasmagun +#define PGW 210 +//grapplinghook +#define GRW 10 +//prox-launcher +#define PXW 140 +//nailgun +#define NGW 190 +//chaingun +#define CGW 125 + +#include "fuzw.c" diff --git a/q4base/botfiles/bots/arachna_c.c b/q4base/botfiles/bots/arachna_c.c new file mode 100644 index 00000000..6057fdd1 --- /dev/null +++ b/q4base/botfiles/bots/arachna_c.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Arachna" + CHARACTERISTIC_GENDER "it" + CHARACTERISTIC_ATTACK_SKILL 0.25 + CHARACTERISTIC_WEAPONWEIGHTS "bots/arachna_w.c" + CHARACTERISTIC_AIM_SKILL 0.25 + CHARACTERISTIC_AIM_ACCURACY 0.25 + CHARACTERISTIC_VIEW_FACTOR 0.25 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 3.0 + + CHARACTERISTIC_CHAT_FILE "bots/arachna_t.c" + CHARACTERISTIC_CHAT_NAME "arachna" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.5 + CHARACTERISTIC_CHAT_MISC 0.5 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.5 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.5 + CHARACTERISTIC_CHAT_KILL 0.5 + CHARACTERISTIC_CHAT_DEATH 0.5 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.5 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.5 + CHARACTERISTIC_CHAT_HITNOKILL 0.5 + CHARACTERISTIC_CHAT_RANDOM 0.5 + CHARACTERISTIC_CHAT_REPLY 0.5 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 0.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 0.5 + CHARACTERISTIC_GRAPPLE_USER 0.5 + + CHARACTERISTIC_ITEMWEIGHTS "bots/arachna_i.c" + CHARACTERISTIC_AGGRESSION 0.25 + CHARACTERISTIC_SELFPRESERVATION 0.5 + CHARACTERISTIC_VENGEFULNESS 0.25 + CHARACTERISTIC_CAMPER 0.25 + + CHARACTERISTIC_EASY_FRAGGER 0.5 + CHARACTERISTIC_ALERTNESS 0.5 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.3 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.3 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.3 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.3 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.3 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.3 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.3 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.3 + + CHARACTERISTIC_FIRETHROTTLE 0.3 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Arachna" + CHARACTERISTIC_GENDER "it" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/arachna_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 0.9 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.75 + + CHARACTERISTIC_CHAT_FILE "bots/arachna_t.c" + CHARACTERISTIC_CHAT_NAME "arachna" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.1 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/arachna_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.5 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.75 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.75 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.75 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.75 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.75 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.75 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.75 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.75 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Arachna" + CHARACTERISTIC_GENDER "it" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/arachna_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 1.0 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.0 + + CHARACTERISTIC_CHAT_FILE "bots/arachna_t.c" + CHARACTERISTIC_CHAT_NAME "arachna" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/arachna_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.0 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.0 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} diff --git a/q4base/botfiles/bots/arachna_i.c b/q4base/botfiles/bots/arachna_i.c new file mode 100644 index 00000000..b620615c --- /dev/null +++ b/q4base/botfiles/bots/arachna_i.c @@ -0,0 +1,120 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +//health +#define FPH 2 +//armor +#define FPA 2 +//without the weapons +//shotgun +#define SGW 200 +//machinegun +#define MGW 50 +//grenadelauncher +#define GLW 400 +//rocket launcher +#define RLW 400 +//rail gun +#define RGW 260 +//bfg10k +#define BFW 400 +//lightninggun +#define LGW 50 +//plasmagun +#define PGW 250 +//prox-launcher +#define PXW 350 +//nailgun +#define NGW 150 +//chaingun +#define CGW 200 + + + + +//with the weapons +//shotgun +#define GSGW 50 +//machinegun +#define GMGW 50 +//grenadelauncher +#define GGLW 400 +//rocketlauncher +#define GRLW 210 +//railgun +#define GRGW 50 +//bfg10k +#define GBFW 400 +//lightninggun +#define GLGW 50 +//plasmagun +#define GPGW 50 +//prox-launcher +#define GPXW 200 +//failgun +#define GNGW 100 +//chaingun +#define GCGW 125 +//individual powerups +//teleport +#define TELW 190 +//medkit +#define MEDW 50 +//quad-damage +#define QW 500 +//envirosuit +#define ENVW 50 +//haste +#define HAW 50 +//invisibility +#define INW 400 +//regeneration +#define REGW 50 +//flight +#define FLW 15 +//kamikaze +#define KAMW 200 +//invulnerability +#define IBW 150 +//portal +#define PORW 300 +//scout +#define SCW 100 +//guard +#define GUW 200 +//doubler +#define DUBW 100 +//ammo-regen +#define AMRW 400 +//red-cube +#define REDCW 200 +//blue-cube +#define BLCW 200 +//ctf flag weight +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/arachna_t.c b/q4base/botfiles/bots/arachna_t.c new file mode 100644 index 00000000..72b3c08d --- /dev/null +++ b/q4base/botfiles/bots/arachna_t.c @@ -0,0 +1,275 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "Arachna" +{ + //the teamplay.h file is included for all kinds of teamplay chats + #include "teamplay.h" + //====================================================== + //====================================================== + type "game_enter" //initiated when the bot enters the game + { + "Hello."; + HELLO1; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "game_exit" //initiated when the bot exits the game + { + "Look at the ~time"; + GOODBYE1; + GOODBYE0; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "level_start" //initiated when a new level starts + { + 0, " it is time for some payback!"; + 1, " you are going to have some pain in ", 4, "."; + HELLO2; + + // 0 = bot name + } //end type + type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings + { + 2, ", I let you win."; + 4, " has changed a lot, it is much faster now."; + "Is it over yet?"; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_victory" //initiated when a level ends and the bot is first in the rankings + { + 3, " you need to practice more... and forget about winning against me."; + LEVEL_END_VICTORY1; + // 0 = bot name + // 1 = random opponent + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_lose" //initiated when a level ends and the bot is last in the rankings + { + 2, " cheated."; + "I had a hang nail, so of course I lost."; + "So much for my bluster..."; + "I felt bad for you so I let you win."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 4 = level's title + } //end type + //====================================================== + //====================================================== + type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship + { + 0, ", didn't your mother ever tell you it was rude to interrupt a conversation?"; + "I am going to shove that ", 1, " down your throat if you do that again!"; + DEATH_TALKING; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult + { + 1, " is not a good weapon, a ", weapon, " should be more your speed."; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nokill" //bot hits an opponent but does not kill it + { + 0, " must be cheating."; + "Well that sucked..."; + "Note to self... turn off safety next ~time"; + // 0 = opponent + } //end type + type "enemy_suicide" //enemy of the bot commits suicide + { + "Stop smoking ", substance, " and maybe you won't kill yourself so often."; + "Tired of life, ", 0, "? Give it up."; + "I guess that beats dying of ", disease, "..."; + // 0 = enemy + } //end type + //====================================================== + //====================================================== + type "death_telefrag" //initiated when the bot is killed by a telefrag + { + "I hate praetorian impressions."; + "My ", counselor, " warned about days like this."; + "D'oh!"; + DEATH_TELEFRAGGED1; + // 0 = enemy name + } //end type + type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage + { + DEATH_FALLING0; + "It didn't look that high from up there..."; + "*sigh*"; + // 0 = random opponent + } //end type + type "death_lava" //initiated when the bot dies in lava + { + "Well... it beats a case of hypothermia."; + "At least it is warm here"; + DEATH_SUICIDE1; + // 0 = random opponent + } //end type + type "death_slime" //initiated when the bot dies in slime + { + "Green has never been my color..."; + DEATH_SLIME1; + // 0 = random opponent + } //end type + type "death_drown" //initiated when the bot drowns + { + DEATH_DROWN0; + "It isn't that difficult to just breath water..."; + "So why can't I breath water?"; + // 0 = random opponent + } //end type + type "death_suicide" //initiated when bot blows self up with a weapon or craters + { + DEATH_SUICIDE2; + "So much for life and all of its cruel irony."; + "It is just easier for ", 0, " this way."; + + + // 0 = random opponent + } //end type + type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack + { + "Unsanitary."; + "What part of '~Don't touch me there' do you not understand?"; + DEATH_GAUNTLET1; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Gauntlet) + } //end type + type "death_rail" //initiated when the bot is killed by a rail gun shot + { + DEATH_INSULT0; + DEATH_FEM_INSULT1; + DEATH_INSULT5; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Railgun) + } //end type + type "death_bfg" //initiated when the bot died by a BFG + { + "Can't find a skill weapon? Or is it just that you suck?"; + "Over-compensating for something?"; + DEATH_BFG0; + DEATH_BFG2; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to BFG10K) + } //end type + type "death_insult" //insult initiated when the bot died + { + curse; + "This is far more painful than it looks."; + "One day, ", 0, " you me and a ", weapon, " are going to have a discussion."; + "Is that the best you can do?"; + DEATH_INSULT2; + DEATH_INSULT0; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + type "death_praise" //praise initiated when the bot died + { + "Not bad, ", 0, ", have you been practicing?"; + "I never saw it coming."; + D_PRAISE0; + D_PRAISE1; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + //====================================================== + //====================================================== + type "kill_rail" //initiated when the bot kills someone with rail gun + { + 0, ", you should stay down..."; + "*sigh* if only this was challenging."; + "I love this gun!"; + "Way too easy"; + // 0 = enemy name + } //end type + type "kill_gauntlet" //initiated when the bot kills someone with gauntlet + { + "LOL!"; + "Too easy"; + // 0 = enemy name + } //end type + type "kill_telefrag" //initiated when the bot telefragged someone + { + "LOL!"; + "Aww man... now I have to take a bath to get the brains out."; + "Does anyone have a quick way of getting brains out of your hair?"; + // 0 = enemy name + } //end type + type "kill_insult" //insult initiated when the bot killed someone + { + KILL_INSULT4; + "Why do you even bother?"; + "This is why the upper classes are called the 'ruling elite.'"; + "Why do the lower classes think they can match someone of my caliber?"; + + // 0 = enemy name + } //end type + type "kill_praise" //praise initiated when the bot killed someone + { + "You are getting better, ", 0, ", keep it up and you might actually win something."; + "That was a challenge."; + // 0 = enemy name + } //end type + //====================================================== + //====================================================== + type "random_insult" //insult initiated randomly (just when the bot feels like it) + { + TAUNT0; + TAUNT_FEM0; + TAUNT1; + curse; + "You should give up your ", substance, " addiction by next ", month, "."; + "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!"; + immaturity01; + "Your ", family_member, " needs to stop calling me."; + + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type + type "random_misc" //miscellanous chats initiated randomly + { + GRRLTALK0; + MISC4; + "Has anyone tried out the new ", 5, "? Is it worth the upgrade?"; + MISC1; + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type +} //end chat + diff --git a/q4base/botfiles/bots/arachna_w.c b/q4base/botfiles/bots/arachna_w.c new file mode 100644 index 00000000..526f40b7 --- /dev/null +++ b/q4base/botfiles/bots/arachna_w.c @@ -0,0 +1,55 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +/*weapon defines weights 10-500 + try to keep it balanced*/ + +#include "inv.h" +//gauntlet +#define GTW 25 +//shotgun +#define SGW 125 +//machinegun +#define MGW 90 +//grenade launcher +#define GLW 110 +//rocket launcher +#define RLW 190 +//railgun +#define RGW 200 +//bfg10k +#define BFW 105 +//lightninggun +#define LGW 120 +//plasmagun +#define PGW 190 +//grapplinghook +#define GRW 10 +//prox-launcher +#define PXW 130 +//nailgun +#define NGW 160 +//chaingun +#define CGW 162 + +#include "fuzw.c" diff --git a/q4base/botfiles/bots/ayumi_c.c b/q4base/botfiles/bots/ayumi_c.c new file mode 100644 index 00000000..499e655f --- /dev/null +++ b/q4base/botfiles/bots/ayumi_c.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Ayumi" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 0.25 + CHARACTERISTIC_WEAPONWEIGHTS "bots/ayumi_w.c" + CHARACTERISTIC_AIM_SKILL 0.25 + CHARACTERISTIC_AIM_ACCURACY 0.25 + CHARACTERISTIC_VIEW_FACTOR 0.25 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 3.0 + + CHARACTERISTIC_CHAT_FILE "bots/ayumi_t.c" + CHARACTERISTIC_CHAT_NAME "Ayumi" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 0.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 0.5 + CHARACTERISTIC_GRAPPLE_USER 0.5 + + CHARACTERISTIC_ITEMWEIGHTS "bots/ayumi_i.c" + CHARACTERISTIC_AGGRESSION 0.25 + CHARACTERISTIC_SELFPRESERVATION 0.5 + CHARACTERISTIC_VENGEFULNESS 0.25 + CHARACTERISTIC_CAMPER 0.25 + + CHARACTERISTIC_EASY_FRAGGER 0.5 + CHARACTERISTIC_ALERTNESS 0.5 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.4 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.4 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.4 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.4 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.4 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.4 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.4 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.4 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.4 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.4 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.4 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.4 + + CHARACTERISTIC_FIRETHROTTLE 0.3 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Ayumi" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/ayumi_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 0.9 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.75 + + CHARACTERISTIC_CHAT_FILE "bots/ayumi_t.c" + CHARACTERISTIC_CHAT_NAME "Ayumi" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.1 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/ayumi_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.5 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.8 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.8 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.7 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.7 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.8 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.8 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.8 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.75 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.75 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.75 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.75 + + CHARACTERISTIC_FIRETHROTTLE 0.5 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Ayumi" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/ayumi_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 1.0 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.0 + + CHARACTERISTIC_CHAT_FILE "bots/ayumi_t.c" + CHARACTERISTIC_CHAT_NAME "Ayumi" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/ayumi_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.0 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.0 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} diff --git a/q4base/botfiles/bots/ayumi_i.c b/q4base/botfiles/bots/ayumi_i.c new file mode 100644 index 00000000..2451c19b --- /dev/null +++ b/q4base/botfiles/bots/ayumi_i.c @@ -0,0 +1,120 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +//health +#define FPH 2 +//armor +#define FPA 2 +//without the weapons +//shotgun +#define SGW 200 +//machinegun +#define MGW 50 +//grenadelauncher +#define GLW 400 +//rocket launcher +#define RLW 400 +//rail gun +#define RGW 260 +//bfg10k +#define BFW 400 +//lightninggun +#define LGW 50 +//plasmagun +#define PGW 250 +//prox-launcher +#define PXW 350 +//nailgun +#define NGW 150 +//chaingun +#define CGW 200 + + + + +//with the weapons +//shotgun +#define GSGW 50 +//machinegun +#define GMGW 50 +//grenadelauncher +#define GGLW 135 +//rocketlauncher +#define GRLW 210 +//railgun +#define GRGW 50 +//bfg10k +#define GBFW 200 +//lightninggun +#define GLGW 50 +//plasmagun +#define GPGW 50 +//prox-launcher +#define GPXW 200 +//failgun +#define GNGW 100 +//chaingun +#define GCGW 125 +//individual powerups +//teleport +#define TELW 190 +//medkit +#define MEDW 50 +//quad-damage +#define QW 500 +//envirosuit +#define ENVW 50 +//haste +#define HAW 50 +//invisibility +#define INW 400 +//regeneration +#define REGW 50 +//flight +#define FLW 75 +//kamikaze +#define KAMW 200 +//invulnerability +#define IBW 150 +//portal +#define PORW 300 +//scout +#define SCW 100 +//guard +#define GUW 200 +//doubler +#define DUBW 100 +//ammo-regen +#define AMRW 400 +//red-cube +#define REDCW 200 +//blue-cube +#define BLCW 200 +//ctf flag weight +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/ayumi_t.c b/q4base/botfiles/bots/ayumi_t.c new file mode 100644 index 00000000..9258f75c --- /dev/null +++ b/q4base/botfiles/bots/ayumi_t.c @@ -0,0 +1,251 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "Ayumi" +{ + //the teamplay.h file is included for all kinds of teamplay chats + #include "teamplay.h" + //====================================================== + //====================================================== + type "game_enter" //initiated when the bot enters the game + { + HELLO1; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "game_exit" //initiated when the bot exits the game + { + GOODBYE1; + GOODBYE0; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "level_start" //initiated when a new level starts + { + HELLO2; + + // 0 = bot name + } //end type + type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings + { + 3, " sucks!"; + 2, ", I let you win."; + + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_victory" //initiated when a level ends and the bot is first in the rankings + { + LEVEL_END_VICTORY0; + LEVEL_END_VICTORY1; + + // 0 = bot name + // 1 = random opponent + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_lose" //initiated when a level ends and the bot is last in the rankings + { + 2, " must be an Arena Lord."; + 1, " kept getting in my way."; + 4, " has never been good to me."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 4 = level's title + } //end type + //====================================================== + //====================================================== + type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship + { + DEATH_TALKING; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult + { + "Try harder next time."; + "Wuss"; + "Heh, you suck."; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nokill" //bot hits an opponent but does not kill it + { + HIT_NOKILL0; + HIT_NOKILL1; + // 0 = opponent + } //end type + type "enemy_suicide" //enemy of the bot commits suicide + { + "LOL!"; + // 0 = enemy + } //end type + //====================================================== + //====================================================== + type "death_telefrag" //initiated when the bot is killed by a telefrag + { + DEATH_TELEFRAGGED0; + DEATH_TELEFRAGGED1; + // 0 = enemy name + } //end type + type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage + { + DEATH_FALLING0; + + // 0 = random opponent + } //end type + type "death_lava" //initiated when the bot dies in lava + { + "It burns!"; + "land conservation"; + DEATH_SUICIDE0; + DEATH_SUICIDE1; + // 0 = random opponent + } //end type + type "death_slime" //initiated when the bot dies in slime + { + DEATH_SLIME0; + DEATH_SLIME1; + // 0 = random opponent + } //end type + type "death_drown" //initiated when the bot drowns + { + "I can't swim!"; + + + // 0 = random opponent + } //end type + type "death_suicide" //initiated when bot blows self up with a weapon or craters + { + "Aww crap!"; + "Shutup!"; + "I meant to do that."; + DEATH_SUICIDE2; + DEATH_SUICIDE1; + + + // 0 = random opponent + } //end type + type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack + { + "D'oh!"; + DEATH_GAUNTLET0; + DEATH_GAUNTLET1; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Gauntlet) + } //end type + type "death_rail" //initiated when the bot is killed by a rail gun shot + { + DEATH_INSULT0; + DEATH_INSULT5; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Railgun) + } //end type + type "death_bfg" //initiated when the bot died by a BFG + { + DEATH_BFG0; + DEATH_BFG2; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to BFG10K) + } //end type + type "death_insult" //insult initiated when the bot died + { + DEATH_INSULT2; + DEATH_INSULT0; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + type "death_praise" //praise initiated when the bot died + { + + D_PRAISE0; + D_PRAISE1; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + //====================================================== + //====================================================== + type "kill_rail" //initiated when the bot kills someone with rail gun + { + KILL_RAIL1; + KILL_RAIL0; + // 0 = enemy name + } //end type + type "kill_gauntlet" //initiated when the bot kills someone with gauntlet + { + "LOL!"; + "Too easy"; + + + + // 0 = enemy name + } //end type + type "kill_telefrag" //initiated when the bot telefragged someone + { + "LOL!"; + TELEFRAGGED2; + // 0 = enemy name + } //end type + type "kill_insult" //insult initiated when the bot killed someone + { + KILL_INSULT4; + KILL_INSULT2; + + // 0 = enemy name + } //end type + type "kill_praise" //praise initiated when the bot killed someone + { + PRAISE0; + PRAISE1; + // 0 = enemy name + } //end type + //====================================================== + //====================================================== + type "random_insult" //insult initiated randomly (just when the bot feels like it) + { + "Your breath stinks"; + "Get off your dead butt and something for a change."; + "Life got you down? Give it up."; + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type + type "random_misc" //miscellanous chats initiated randomly + { + + GRRLTALK0; + GRRLTALK1; + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type +} //end chat + diff --git a/q4base/botfiles/bots/ayumi_w.c b/q4base/botfiles/bots/ayumi_w.c new file mode 100644 index 00000000..3d142234 --- /dev/null +++ b/q4base/botfiles/bots/ayumi_w.c @@ -0,0 +1,55 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +/*weapon defines weights 10-500 + try to keep it balanced*/ + +#include "inv.h" +//gauntlet +#define GTW 25 +//shotgun +#define SGW 135 +//machinegun +#define MGW 90 +//grenade launcher +#define GLW 110 +//rocket launcher +#define RLW 190 +//railgun +#define RGW 115 +//bfg10k +#define BFW 200 +//lightninggun +#define LGW 150 +//plasmagun +#define PGW 195 +//grapplinghook +#define GRW 10 +//prox-launcher +#define PXW 210 +//nailgun +#define NGW 180 +//chaingun +#define CGW 155 + +#include "fuzw.c" diff --git a/q4base/botfiles/bots/beret_c.c b/q4base/botfiles/bots/beret_c.c new file mode 100644 index 00000000..f04c51ac --- /dev/null +++ b/q4base/botfiles/bots/beret_c.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Beret" + CHARACTERISTIC_GENDER "male" + CHARACTERISTIC_ATTACK_SKILL 0.25 + CHARACTERISTIC_WEAPONWEIGHTS "bots/beret_w.c" + CHARACTERISTIC_AIM_SKILL 0.25 + CHARACTERISTIC_AIM_ACCURACY 0.25 + CHARACTERISTIC_VIEW_FACTOR 0.25 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 3.0 + + CHARACTERISTIC_CHAT_FILE "bots/beret_t.c" + CHARACTERISTIC_CHAT_NAME "beret" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.5 + CHARACTERISTIC_CHAT_MISC 0.5 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.5 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.5 + CHARACTERISTIC_CHAT_KILL 0.5 + CHARACTERISTIC_CHAT_DEATH 0.5 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.5 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.5 + CHARACTERISTIC_CHAT_HITNOKILL 0.5 + CHARACTERISTIC_CHAT_RANDOM 0.5 + CHARACTERISTIC_CHAT_REPLY 0.5 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 0.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 0.5 + CHARACTERISTIC_GRAPPLE_USER 0.5 + + CHARACTERISTIC_ITEMWEIGHTS "bots/beret_i.c" + CHARACTERISTIC_AGGRESSION 0.25 + CHARACTERISTIC_SELFPRESERVATION 0.5 + CHARACTERISTIC_VENGEFULNESS 0.25 + CHARACTERISTIC_CAMPER 0.25 + + CHARACTERISTIC_EASY_FRAGGER 0.5 + CHARACTERISTIC_ALERTNESS 0.5 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.3 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.3 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.3 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.3 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.3 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.3 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.3 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.3 + + CHARACTERISTIC_FIRETHROTTLE 0.3 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Beret" + CHARACTERISTIC_GENDER "male" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/beret_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 0.9 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.75 + + CHARACTERISTIC_CHAT_FILE "bots/beret_t.c" + CHARACTERISTIC_CHAT_NAME "beret" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.1 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/beret_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.5 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.75 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.75 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.75 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.75 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.75 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.75 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.75 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.75 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Beret" + CHARACTERISTIC_GENDER "male" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/beret_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 1.0 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.0 + + CHARACTERISTIC_CHAT_FILE "bots/beret_t.c" + CHARACTERISTIC_CHAT_NAME "beret" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/beret_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.0 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.0 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} diff --git a/q4base/botfiles/bots/beret_i.c b/q4base/botfiles/bots/beret_i.c new file mode 100644 index 00000000..4315f6c4 --- /dev/null +++ b/q4base/botfiles/bots/beret_i.c @@ -0,0 +1,120 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +//health +#define FPH 2 +//armor +#define FPA 2 +//without the weapons +//shotgun +#define SGW 200 +//machinegun +#define MGW 50 +//grenadelauncher +#define GLW 400 +//rocket launcher +#define RLW 400 +//rail gun +#define RGW 260 +//bfg10k +#define BFW 400 +//lightninggun +#define LGW 50 +//plasmagun +#define PGW 250 +//prox-launcher +#define PXW 350 +//nailgun +#define NGW 150 +//chaingun +#define CGW 200 + + + + +//with the weapons +//shotgun +#define GSGW 50 +//machinegun +#define GMGW 50 +//grenadelauncher +#define GGLW 400 +//rocketlauncher +#define GRLW 210 +//railgun +#define GRGW 50 +//bfg10k +#define GBFW 400 +//lightninggun +#define GLGW 50 +//plasmagun +#define GPGW 50 +//prox-launcher +#define GPXW 200 +//failgun +#define GNGW 100 +//chaingun +#define GCGW 125 +//individual powerups +//teleport +#define TELW 190 +//medkit +#define MEDW 50 +//quad-damage +#define QW 500 +//envirosuit +#define ENVW 50 +//haste +#define HAW 50 +//invisibility +#define INW 400 +//regeneration +#define REGW 50 +//flight +#define FLW 40 +//kamikaze +#define KAMW 200 +//invulnerability +#define IBW 150 +//portal +#define PORW 300 +//scout +#define SCW 100 +//guard +#define GUW 200 +//doubler +#define DUBW 100 +//ammo-regen +#define AMRW 400 +//red-cube +#define REDCW 200 +//blue-cube +#define BLCW 200 +//ctf flag weight +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/beret_t.c b/q4base/botfiles/bots/beret_t.c new file mode 100644 index 00000000..0610928d --- /dev/null +++ b/q4base/botfiles/bots/beret_t.c @@ -0,0 +1,278 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "Beret" +{ + //the teamplay.h file is included for all kinds of teamplay chats + #include "teamplay.h" + //====================================================== + //====================================================== + type "game_enter" //initiated when the bot enters the game + { + "Rectum? It nearly killed him!"; + 0, " is a loser!"; + HELLO1; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "game_exit" //initiated when the bot exits the game + { + "Your mother is here, got to go."; + "Aurevoir mes amis."; + 4, " is too slow for me, audios."; + GOODBYE1; + GOODBYE0; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "level_start" //initiated when a new level starts + { + "Worst level ever!"; + 0, " is gonna pay."; + + HELLO2; + + // 0 = bot name + } //end type + type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings + { + 3, " sucks!"; + 2, ", I let you win."; + + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_victory" //initiated when a level ends and the bot is first in the rankings + { + LEVEL_END_VICTORY0; + LEVEL_END_VICTORY1; + + // 0 = bot name + // 1 = random opponent + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_lose" //initiated when a level ends and the bot is last in the rankings + { + 2, " must be an Arena Lord."; + 1, " kept getting in my way."; + 4, " has never been good to me."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 4 = level's title + } //end type + //====================================================== + //====================================================== + type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship + { + "Son of a... you shall pay for that!"; + "Infidel!!!"; + "Jerkwad"; + "Schmuck"; + "Tosser"; + DEATH_TALKING; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult + { + "Try harder next time."; + "Wuss"; + "Heh, you suck."; + "Nice shooting Tex, you need to take lessons from Dick."; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nokill" //bot hits an opponent but does not kill it + { + HIT_NOKILL0; + HIT_NOKILL1; + // 0 = opponent + } //end type + type "enemy_suicide" //enemy of the bot commits suicide + { + "LOL!"; + // 0 = enemy + } //end type + //====================================================== + //====================================================== + type "death_telefrag" //initiated when the bot is killed by a telefrag + { + DEATH_TELEFRAGGED0; + DEATH_TELEFRAGGED1; + // 0 = enemy name + } //end type + type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage + { + DEATH_FALLING0; + + // 0 = random opponent + } //end type + type "death_lava" //initiated when the bot dies in lava + { + DEATH_SUICIDE0; + DEATH_SUICIDE1; + // 0 = random opponent + } //end type + type "death_slime" //initiated when the bot dies in slime + { + DEATH_SLIME0; + DEATH_SLIME1; + // 0 = random opponent + } //end type + type "death_drown" //initiated when the bot drowns + { + "I can't swim!"; + + + // 0 = random opponent + } //end type + type "death_suicide" //initiated when bot blows self up with a weapon or craters + { + "Aww crap!"; + "Shutup!"; + DEATH_SUICIDE2; + DEATH_SUICIDE1; + + + // 0 = random opponent + } //end type + type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack + { + "Humiliating."; + "D'oh!"; + DEATH_GAUNTLET0; + DEATH_GAUNTLET1; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Gauntlet) + } //end type + type "death_rail" //initiated when the bot is killed by a rail gun shot + { + DEATH_INSULT0; + DEATH_INSULT5; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Railgun) + } //end type + type "death_bfg" //initiated when the bot died by a BFG + { + DEATH_BFG0; + DEATH_BFG2; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to BFG10K) + } //end type + type "death_insult" //insult initiated when the bot died + { + "Always look on the bright side of death."; + "pfff"; + "Wuss"; + "Sissy"; + DEATH_INSULT2; + DEATH_INSULT0; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + type "death_praise" //praise initiated when the bot died + { + + D_PRAISE0; + D_PRAISE1; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + //====================================================== + //====================================================== + type "kill_rail" //initiated when the bot kills someone with rail gun + { + KILL_RAIL1; + KILL_RAIL0; + // 0 = enemy name + } //end type + type "kill_gauntlet" //initiated when the bot kills someone with gauntlet + { + "LOL!"; + "Too easy"; + "Get whacked!"; + "It's whack time!"; + "I'm saving my best whack for ", 0, "."; + // 0 = enemy name + } //end type + type "kill_telefrag" //initiated when the bot telefragged someone + { + "LOL!"; + TELEFRAGGED2; + // 0 = enemy name + } //end type + type "kill_insult" //insult initiated when the bot killed someone + { + "I just made my perfect world, oops you're gone."; + KILL_INSULT4; + KILL_INSULT2; + + // 0 = enemy name + } //end type + type "kill_praise" //praise initiated when the bot killed someone + { + PRAISE0; + PRAISE1; + // 0 = enemy name + } //end type + //====================================================== + //====================================================== + type "random_insult" //insult initiated randomly (just when the bot feels like it) + { + "Your breath stinks"; + "Get a hair cut"; + "Get a real job"; + "Get a life"; + TAUNT0; + TAUNT1; + + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type + type "random_misc" //miscellanous chats initiated randomly + { + "Has anyone found the chocolate bar yet?"; + "Let's go to Denny's and watch the floor show, you're buying."; + "Love is the devil's toy."; + "Did you hear about ", 0, " in ", 4, "? I'd be ashamed of myself if I did that."; + "Never trust a hippy."; + 4, " Uber Alles!"; + "I am all that is fish."; + "Gamers are the whiniest bunch!"; + GUYTALK1; + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type +} //end chat + diff --git a/q4base/botfiles/bots/beret_w.c b/q4base/botfiles/bots/beret_w.c new file mode 100644 index 00000000..fe2984d8 --- /dev/null +++ b/q4base/botfiles/bots/beret_w.c @@ -0,0 +1,55 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +/*weapon defines weights 10-500 + try to keep it balanced*/ + +#include "inv.h" +//gauntlet +#define GTW 25 +//shotgun +#define SGW 160 +//machinegun +#define MGW 60 +//grenade launcher +#define GLW 110 +//rocket launcher +#define RLW 260 +//railgun +#define RGW 195 +//bfg10k +#define BFW 260 +//lightninggun +#define LGW 180 +//plasmagun +#define PGW 150 +//grapplinghook +#define GRW 185 +//prox-launcher +#define PXW 120 +//nailgun +#define NGW 260 +//chaingun +#define CGW 200 + +#include "fuzw.c" diff --git a/q4base/botfiles/bots/dark_c.c b/q4base/botfiles/bots/dark_c.c new file mode 100644 index 00000000..60c62e05 --- /dev/null +++ b/q4base/botfiles/bots/dark_c.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Dark" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 0.3 + CHARACTERISTIC_WEAPONWEIGHTS "bots/dark_w.c" + CHARACTERISTIC_AIM_SKILL 0.3 + CHARACTERISTIC_AIM_ACCURACY 0.3 + CHARACTERISTIC_VIEW_FACTOR 0.3 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 1.5 + + CHARACTERISTIC_CHAT_FILE "bots/dark_t.c" + CHARACTERISTIC_CHAT_NAME "dark" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 0.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 0.5 + CHARACTERISTIC_GRAPPLE_USER 0.5 + + CHARACTERISTIC_ITEMWEIGHTS "bots/dark_i.c" + CHARACTERISTIC_AGGRESSION 0.25 + CHARACTERISTIC_SELFPRESERVATION 0.5 + CHARACTERISTIC_VENGEFULNESS 0.25 + CHARACTERISTIC_CAMPER 0.25 + + CHARACTERISTIC_EASY_FRAGGER 0.5 + CHARACTERISTIC_ALERTNESS 0.5 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.43 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.43 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.43 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.43 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.43 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.43 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.43 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.43 + + CHARACTERISTIC_FIRETHROTTLE 0.43 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Dark" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/dark_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 0.9 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.75 + + CHARACTERISTIC_CHAT_FILE "bots/dark_t.c" + CHARACTERISTIC_CHAT_NAME "dark" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.1 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/dark_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.5 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.95 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.95 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.95 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.95 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.95 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.95 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.95 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.95 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.95 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.95 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.95 + + CHARACTERISTIC_FIRETHROTTLE 0.1 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Dark" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/dark_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 1.0 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.0 + + CHARACTERISTIC_CHAT_FILE "bots/dark_t.c" + CHARACTERISTIC_CHAT_NAME "dark" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/dark_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.0 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.0 + + CHARACTERISTIC_FIRETHROTTLE 0.01 +} diff --git a/q4base/botfiles/bots/dark_i.c b/q4base/botfiles/bots/dark_i.c new file mode 100644 index 00000000..79f4b555 --- /dev/null +++ b/q4base/botfiles/bots/dark_i.c @@ -0,0 +1,120 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +//health +#define FPH 2 +//armor +#define FPA 2 +//without the weapons +//shotgun +#define SGW 200 +//machinegun +#define MGW 50 +//grenadelauncher +#define GLW 300 +//rocket launcher +#define RLW 400 +//rail gun +#define RGW 260 +//bfg10k +#define BFW 350 +//lightninggun +#define LGW 50 +//plasmagun +#define PGW 250 +//prox-launcher +#define PXW 350 +//nailgun +#define NGW 150 +//chaingun +#define CGW 200 + + + + +//with the weapons +//shotgun +#define GSGW 50 +//machinegun +#define GMGW 50 +//grenadelauncher +#define GGLW 400 +//rocketlauncher +#define GRLW 210 +//railgun +#define GRGW 50 +//bfg10k +#define GBFW 400 +//lightninggun +#define GLGW 50 +//plasmagun +#define GPGW 50 +//prox-launcher +#define GPXW 200 +//failgun +#define GNGW 100 +//chaingun +#define GCGW 125 +//individual powerups +//teleport +#define TELW 190 +//medkit +#define MEDW 50 +//quad-damage +#define QW 500 +//envirosuit +#define ENVW 50 +//haste +#define HAW 50 +//invisibility +#define INW 400 +//regeneration +#define REGW 50 +//flight +#define FLW 175 +//kamikaze +#define KAMW 200 +//invulnerability +#define IBW 150 +//portal +#define PORW 300 +//scout +#define SCW 100 +//guard +#define GUW 200 +//doubler +#define DUBW 100 +//ammo-regen +#define AMRW 400 +//red-cube +#define REDCW 200 +//blue-cube +#define BLCW 200 +//ctf flag weight +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/dark_t.c b/q4base/botfiles/bots/dark_t.c new file mode 100644 index 00000000..fdbed654 --- /dev/null +++ b/q4base/botfiles/bots/dark_t.c @@ -0,0 +1,289 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "Dark" +{ + //the teamplay.h file is included for all kinds of teamplay chats + #include "teamplay.h" + //====================================================== + //====================================================== + type "game_enter" //initiated when the bot enters the game + { + "Hello."; + "Are you prepared for pain?"; + HELLO1; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "game_exit" //initiated when the bot exits the game + { + "Look at the ~time"; + 4, " kinda wears on me, I think I'll find a different server, later ~peeps"; + GOODBYE1; + GOODBYE0; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "level_start" //initiated when a new level starts + { + 0, " it is time for some payback!"; + 1, " you are going to have some pain in ", 4, "."; + HELLO2; + + // 0 = bot name + } //end type + type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings + { + "HA! ", 3, " is at the bottom, as usual."; + 2, ", I let you win."; + 4, " has changed a lot, it is much faster now."; + "Is it over yet?"; + "I can remember when ", 4, " didn't suck."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_victory" //initiated when a level ends and the bot is first in the rankings + { + 3, " you need to practice more... and forget about winning against me."; + LEVEL_END_VICTORY1; + "I really like ", 4, " since they fixed it, it is so easy to win!"; + "Next time, don't bother."; + // 0 = bot name + // 1 = random opponent + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_lose" //initiated when a level ends and the bot is last in the rankings + { + 2, " cheated."; + "I had a hang nail, so of course I lost."; + "So much for my bluster..."; + "I felt bad for you so I let you win."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 4 = level's title + } //end type + //====================================================== + //====================================================== + type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship + { + 0, ", didn't your mother ever tell you it was rude to interrupt a conversation?"; + "I am going to shove that ", 1, " down your throat if you do that again!"; + "Hey jerk! I was trying to hold a conversation here... do you mind?"; + "Jerk"; + DEATH_TALKING; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult + { + 1, " is not a good weapon, a ", weapon, " should be more your speed."; + "You need to aim better."; + "Try harder next time."; + curse; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nokill" //bot hits an opponent but does not kill it + { + 0, " must be cheating."; + "Dammit! Why won't you die?!?"; + "Well that sucked..."; + "Note to self... turn off safety next ~time"; + // 0 = opponent + } //end type + type "enemy_suicide" //enemy of the bot commits suicide + { + "Stop smoking ", substance, " and maybe you won't kill yourself so often."; + "Tired of life, ", 0, "? Give it up."; + "I guess that beats dying of ", disease, "..."; + // 0 = enemy + } //end type + //====================================================== + //====================================================== + type "death_telefrag" //initiated when the bot is killed by a telefrag + { + "I hate praetorian impressions."; + "My ", counselor, " warned about days like this."; + "D'oh!"; + DEATH_TELEFRAGGED1; + // 0 = enemy name + } //end type + type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage + { + DEATH_FALLING0; + "It didn't look that high from up there..."; + "*sigh*"; + // 0 = random opponent + } //end type + type "death_lava" //initiated when the bot dies in lava + { + "Well... it beats a case of hypothermia."; + "At least it is warm here"; + DEATH_SUICIDE1; + // 0 = random opponent + } //end type + type "death_slime" //initiated when the bot dies in slime + { + "Green has never been my color..."; + DEATH_SLIME1; + // 0 = random opponent + } //end type + type "death_drown" //initiated when the bot drowns + { + DEATH_DROWN0; + "It isn't that difficult to just breath water..."; + "So why can't I breath water?"; + // 0 = random opponent + } //end type + type "death_suicide" //initiated when bot blows self up with a weapon or craters + { + DEATH_SUICIDE2; + "So much for life and all of its cruel irony."; + "It is just easier for ", 0, " this way."; + + + // 0 = random opponent + } //end type + type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack + { + "Unsanitary."; + "What part of '~Don't touch me there' do you not understand?"; + DEATH_GAUNTLET1; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Gauntlet) + } //end type + type "death_rail" //initiated when the bot is killed by a rail gun shot + { + DEATH_INSULT0; + DEATH_FEM_INSULT1; + DEATH_INSULT5; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Railgun) + } //end type + type "death_bfg" //initiated when the bot died by a BFG + { + "Can't find a skill weapon? Or is it just that you suck?"; + "Over-compensating for something?"; + DEATH_BFG0; + DEATH_BFG2; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to BFG10K) + } //end type + type "death_insult" //insult initiated when the bot died + { + curse; + "This is far more painful than it looks."; + "One day, ", 0, " you me and a ", weapon, " are going to have a discussion."; + "Is that the best you can do?"; + DEATH_INSULT2; + DEATH_INSULT0; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + type "death_praise" //praise initiated when the bot died + { + "Not bad, ", 0, ", have you been practicing?"; + "I never saw it coming."; + D_PRAISE0; + D_PRAISE1; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + //====================================================== + //====================================================== + type "kill_rail" //initiated when the bot kills someone with rail gun + { + 0, ", you should stay down..."; + "*sigh* if only this was challenging."; + "I love this gun!"; + "Way too easy"; + // 0 = enemy name + } //end type + type "kill_gauntlet" //initiated when the bot kills someone with gauntlet + { + "LOL!"; + "Too easy"; + // 0 = enemy name + } //end type + type "kill_telefrag" //initiated when the bot telefragged someone + { + "LOL!"; + "Aww man... now I have to take a bath to get the brains out."; + "Does anyone have a quick way of getting brains out of your hair?"; + // 0 = enemy name + } //end type + type "kill_insult" //insult initiated when the bot killed someone + { + KILL_INSULT4; + "Why do you even bother?"; + + + // 0 = enemy name + } //end type + type "kill_praise" //praise initiated when the bot killed someone + { + "You are getting better, ", 0, ", keep it up and you might actually win something."; + + // 0 = enemy name + } //end type + //====================================================== + //====================================================== + type "random_insult" //insult initiated randomly (just when the bot feels like it) + { + TAUNT0; + TAUNT_FEM0; + TAUNT1; + "You should give up your ", substance, " addiction by next ", month, "."; + "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!"; + immaturity01; + "Your ", family_member, " needs to stop calling me."; + + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type + type "random_misc" //miscellanous chats initiated randomly + { + "this one time, at band camp..."; + GRRLTALK1; + MISC4; + "Has anyone tried out the new ", 5, "? Is it worth the upgrade?"; + MISC1; + "You would be surprised what you can do with a ", animal, " a ", food, " and ", peeps, "."; + "Next time you see ", peeps, " tell 'em to call me, mmmkay?"; + neuterbot, " is cute."; + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type +} //end chat + diff --git a/q4base/botfiles/bots/dark_w.c b/q4base/botfiles/bots/dark_w.c new file mode 100644 index 00000000..85e23e4a --- /dev/null +++ b/q4base/botfiles/bots/dark_w.c @@ -0,0 +1,55 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +/*weapon defines weights 10-500 + try to keep it balanced*/ + +#include "inv.h" +//gauntlet +#define GTW 10 +//shotgun +#define SGW 180 +//machinegun +#define MGW 75 +//grenade launcher +#define GLW 170 +//rocket launcher +#define RLW 160 +//railgun +#define RGW 250 +//bfg10k +#define BFW 90 +//lightninggun +#define LGW 200 +//plasmagun +#define PGW 110 +//grapplinghook +#define GRW 10 +//prox-launcher +#define PXW 160 +//nailgun +#define NGW 200 +//chaingun +#define CGW 175 + +#include "fuzw.c" diff --git a/q4base/botfiles/bots/default_c.c b/q4base/botfiles/bots/default_c.c new file mode 100644 index 00000000..8448608c --- /dev/null +++ b/q4base/botfiles/bots/default_c.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Player" + CHARACTERISTIC_GENDER "male" + CHARACTERISTIC_ATTACK_SKILL 0.25 + CHARACTERISTIC_WEAPONWEIGHTS "bots/gargoyle_w.c" + CHARACTERISTIC_AIM_SKILL 0.25 + CHARACTERISTIC_AIM_ACCURACY 0.25 + CHARACTERISTIC_VIEW_FACTOR 0.25 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 3.0 + + CHARACTERISTIC_CHAT_FILE "bots/gargoyle_t.c" + CHARACTERISTIC_CHAT_NAME "player" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.5 + CHARACTERISTIC_CHAT_MISC 0.5 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.5 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.5 + CHARACTERISTIC_CHAT_KILL 0.5 + CHARACTERISTIC_CHAT_DEATH 0.5 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.5 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.5 + CHARACTERISTIC_CHAT_HITNOKILL 0.5 + CHARACTERISTIC_CHAT_RANDOM 0.5 + CHARACTERISTIC_CHAT_REPLY 0.5 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 0.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 0.5 + CHARACTERISTIC_GRAPPLE_USER 0.5 + + CHARACTERISTIC_ITEMWEIGHTS "bots/gargoyle_i.c" + CHARACTERISTIC_AGGRESSION 0.25 + CHARACTERISTIC_SELFPRESERVATION 0.5 + CHARACTERISTIC_VENGEFULNESS 0.25 + CHARACTERISTIC_CAMPER 0.25 + + CHARACTERISTIC_EASY_FRAGGER 0.5 + CHARACTERISTIC_ALERTNESS 0.5 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.3 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.3 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.3 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.3 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.3 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.3 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.3 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.3 + + CHARACTERISTIC_FIRETHROTTLE 0.3 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Player" + CHARACTERISTIC_GENDER "male" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/gargoyle_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 0.9 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.75 + + CHARACTERISTIC_CHAT_FILE "bots/gargoyle_t.c" + CHARACTERISTIC_CHAT_NAME "player" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.1 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/gargoyle_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.5 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.75 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.75 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.75 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.75 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.75 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.75 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.75 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.75 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Player" + CHARACTERISTIC_GENDER "male" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/gargoyle_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 1.0 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.0 + + CHARACTERISTIC_CHAT_FILE "bots/gargoyle_t.c" + CHARACTERISTIC_CHAT_NAME "player" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/gargoyle_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.0 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.0 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} diff --git a/q4base/botfiles/bots/default_i.c b/q4base/botfiles/bots/default_i.c new file mode 100644 index 00000000..4315f6c4 --- /dev/null +++ b/q4base/botfiles/bots/default_i.c @@ -0,0 +1,120 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +//health +#define FPH 2 +//armor +#define FPA 2 +//without the weapons +//shotgun +#define SGW 200 +//machinegun +#define MGW 50 +//grenadelauncher +#define GLW 400 +//rocket launcher +#define RLW 400 +//rail gun +#define RGW 260 +//bfg10k +#define BFW 400 +//lightninggun +#define LGW 50 +//plasmagun +#define PGW 250 +//prox-launcher +#define PXW 350 +//nailgun +#define NGW 150 +//chaingun +#define CGW 200 + + + + +//with the weapons +//shotgun +#define GSGW 50 +//machinegun +#define GMGW 50 +//grenadelauncher +#define GGLW 400 +//rocketlauncher +#define GRLW 210 +//railgun +#define GRGW 50 +//bfg10k +#define GBFW 400 +//lightninggun +#define GLGW 50 +//plasmagun +#define GPGW 50 +//prox-launcher +#define GPXW 200 +//failgun +#define GNGW 100 +//chaingun +#define GCGW 125 +//individual powerups +//teleport +#define TELW 190 +//medkit +#define MEDW 50 +//quad-damage +#define QW 500 +//envirosuit +#define ENVW 50 +//haste +#define HAW 50 +//invisibility +#define INW 400 +//regeneration +#define REGW 50 +//flight +#define FLW 40 +//kamikaze +#define KAMW 200 +//invulnerability +#define IBW 150 +//portal +#define PORW 300 +//scout +#define SCW 100 +//guard +#define GUW 200 +//doubler +#define DUBW 100 +//ammo-regen +#define AMRW 400 +//red-cube +#define REDCW 200 +//blue-cube +#define BLCW 200 +//ctf flag weight +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/default_t.c b/q4base/botfiles/bots/default_t.c new file mode 100644 index 00000000..030651b0 --- /dev/null +++ b/q4base/botfiles/bots/default_t.c @@ -0,0 +1,178 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "default" +{ + //the teamplay.h file is included for all kinds of teamplay chats + #include "teamplay.h" + //====================================================== + //====================================================== + type "game_enter" //initiated when the bot enters the game + { + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "game_exit" //initiated when the bot exits the game + { + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "level_start" //initiated when a new level starts + { + // 0 = bot name + } //end type + type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings + { + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_victory" //initiated when a level ends and the bot is first in the rankings + { + // 0 = bot name + // 1 = random opponent + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_lose" //initiated when a level ends and the bot is last in the rankings + { + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 4 = level's title + } //end type + //====================================================== + //====================================================== + type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship + { + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult + { + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nokill" //bot hits an opponent but does not kill it + { + // 0 = opponent + } //end type + type "enemy_suicide" //enemy of the bot commits suicide + { + // 0 = enemy + } //end type + //====================================================== + //====================================================== + type "death_telefrag" //initiated when the bot is killed by a telefrag + { + // 0 = enemy name + } //end type + type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage + { + // 0 = random opponent + } //end type + type "death_lava" //initiated when the bot dies in lava + { + // 0 = random opponent + } //end type + type "death_slime" //initiated when the bot dies in slime + { + // 0 = random opponent + } //end type + type "death_drown" //initiated when the bot drowns + { + // 0 = random opponent + } //end type + type "death_suicide" //initiated when bot blows self up with a weapon or craters + { + // 0 = random opponent + } //end type + type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack + { + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Gauntlet) + } //end type + type "death_rail" //initiated when the bot is killed by a rail gun shot + { + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Railgun) + } //end type + type "death_bfg" //initiated when the bot died by a BFG + { + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to BFG10K) + } //end type + type "death_insult" //insult initiated when the bot died + { + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + type "death_praise" //praise initiated when the bot died + { + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + //====================================================== + //====================================================== + type "kill_rail" //initiated when the bot kills someone with rail gun + { + // 0 = enemy name + } //end type + type "kill_gauntlet" //initiated when the bot kills someone with gauntlet + { + // 0 = enemy name + } //end type + type "kill_telefrag" //initiated when the bot telefragged someone + { + // 0 = enemy name + } //end type + type "kill_insult" //insult initiated when the bot killed someone + { + // 0 = enemy name + } //end type + type "kill_praise" //praise initiated when the bot killed someone + { + // 0 = enemy name + } //end type + //====================================================== + //====================================================== + type "random_insult" //insult initiated randomly (just when the bot feels like it) + { + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type + type "random_misc" //miscellanous chats initiated randomly + { + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type +} //end chat + diff --git a/q4base/botfiles/bots/default_w.c b/q4base/botfiles/bots/default_w.c new file mode 100644 index 00000000..7ece58c8 --- /dev/null +++ b/q4base/botfiles/bots/default_w.c @@ -0,0 +1,55 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +/*weapon defines weights 10-500 + try to keep it balanced*/ + +#include "inv.h" +//gauntlet +#define GTW +//shotgun +#define SGW +//machinegun +#define MGW +//grenade launcher +#define GLW +//rocket launcher +#define RLW +//railgun +#define RGW +//bfg10k +#define BFW +//lightninggun +#define LGW +//plasmagun +#define PGW +//grapplinghook +#define GRW +//prox-launcher +#define PXW +//nailgun +#define NGW +//chaingun +#define CGW + +#include "fuzw.c" diff --git a/q4base/botfiles/bots/gargoyle_c.c b/q4base/botfiles/bots/gargoyle_c.c new file mode 100644 index 00000000..b0476c74 --- /dev/null +++ b/q4base/botfiles/bots/gargoyle_c.c @@ -0,0 +1,203 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Gargoyle" + CHARACTERISTIC_GENDER "Male" + CHARACTERISTIC_ATTACK_SKILL 0.250 + CHARACTERISTIC_WEAPONWEIGHTS "bots/gargoyle_w.c" + CHARACTERISTIC_AIM_SKILL 0.250 + CHARACTERISTIC_AIM_ACCURACY 0.250 + CHARACTERISTIC_VIEW_FACTOR 0.250 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 2.00 + + CHARACTERISTIC_CHAT_FILE "bots/gargoyle_t.c" + CHARACTERISTIC_CHAT_NAME "gargoyle" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.900 + CHARACTERISTIC_CHAT_MISC 0.750 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000 + CHARACTERISTIC_CHAT_KILL 1.000 + CHARACTERISTIC_CHAT_DEATH 0.900 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000 + CHARACTERISTIC_CHAT_HITTALKING 0.900 + CHARACTERISTIC_CHAT_HITNODEATH 0.800 + CHARACTERISTIC_CHAT_HITNOKILL 1.000 + CHARACTERISTIC_CHAT_RANDOM 0.900 + CHARACTERISTIC_CHAT_REPLY 1.000 + + CHARACTERISTIC_CROUCHER 0.200 + CHARACTERISTIC_JUMPER 0.900 + CHARACTERISTIC_WALKER 0.000 + CHARACTERISTIC_WEAPONJUMPING 0.800 + CHARACTERISTIC_GRAPPLE_USER 0.500 + + CHARACTERISTIC_ITEMWEIGHTS "bots/gargoyle_i.c" + CHARACTERISTIC_AGGRESSION 0.250 + CHARACTERISTIC_SELFPRESERVATION 0.900 + CHARACTERISTIC_VENGEFULNESS 0.900 + CHARACTERISTIC_CAMPER 0.000 + + CHARACTERISTIC_EASY_FRAGGER 1.000 + CHARACTERISTIC_ALERTNESS 0.900 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.500 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.400 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.500 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.300 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.700 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.450 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.400 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.800 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.500 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.500 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.500 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.500 + + CHARACTERISTIC_FIRETHROTTLE 0.800 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Gargoyle" + CHARACTERISTIC_GENDER "Male" + CHARACTERISTIC_ATTACK_SKILL 1.000 + CHARACTERISTIC_WEAPONWEIGHTS "bots/gargoyle_w.c" + CHARACTERISTIC_AIM_SKILL 1.000 + CHARACTERISTIC_AIM_ACCURACY 1.000 + CHARACTERISTIC_VIEW_FACTOR 0.900 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.25 + + CHARACTERISTIC_CHAT_FILE "bots/gargoyle_t.c" + CHARACTERISTIC_CHAT_NAME "gargoyle" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.900 + CHARACTERISTIC_CHAT_MISC 0.750 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000 + CHARACTERISTIC_CHAT_KILL 1.000 + CHARACTERISTIC_CHAT_DEATH 0.900 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000 + CHARACTERISTIC_CHAT_HITTALKING 0.900 + CHARACTERISTIC_CHAT_HITNODEATH 0.800 + CHARACTERISTIC_CHAT_HITNOKILL 1.000 + CHARACTERISTIC_CHAT_RANDOM 0.900 + CHARACTERISTIC_CHAT_REPLY 1.000 + + CHARACTERISTIC_CROUCHER 0.100 + CHARACTERISTIC_JUMPER 1.000 + CHARACTERISTIC_WALKER 0.000 + CHARACTERISTIC_WEAPONJUMPING 1.000 + CHARACTERISTIC_GRAPPLE_USER 1.000 + + CHARACTERISTIC_ITEMWEIGHTS "bots/gargoyle_i.c" + CHARACTERISTIC_AGGRESSION 1.000 + CHARACTERISTIC_SELFPRESERVATION 1.000 + CHARACTERISTIC_VENGEFULNESS 1.000 + CHARACTERISTIC_CAMPER 0.500 + + CHARACTERISTIC_EASY_FRAGGER 1.000 + CHARACTERISTIC_ALERTNESS 1.000 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.900 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.900 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.900 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.900 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.900 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.900 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.900 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.900 + + CHARACTERISTIC_FIRETHROTTLE 0.900 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Gargoyle" + CHARACTERISTIC_GENDER "Male" + CHARACTERISTIC_ATTACK_SKILL 1.000 + CHARACTERISTIC_WEAPONWEIGHTS "bots/gargoyle_w.c" + CHARACTERISTIC_AIM_SKILL 1.000 + CHARACTERISTIC_AIM_ACCURACY 1.000 + CHARACTERISTIC_VIEW_FACTOR 1.000 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.00 + + CHARACTERISTIC_CHAT_FILE "bots/gargoyle_t.c" + CHARACTERISTIC_CHAT_NAME "gargoyle" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.900 + CHARACTERISTIC_CHAT_MISC 0.750 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000 + CHARACTERISTIC_CHAT_KILL 1.000 + CHARACTERISTIC_CHAT_DEATH 0.900 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000 + CHARACTERISTIC_CHAT_HITTALKING 0.900 + CHARACTERISTIC_CHAT_HITNODEATH 0.800 + CHARACTERISTIC_CHAT_HITNOKILL 1.000 + CHARACTERISTIC_CHAT_RANDOM 0.900 + CHARACTERISTIC_CHAT_REPLY 1.000 + + CHARACTERISTIC_CROUCHER 0.000 + CHARACTERISTIC_JUMPER 1.000 + CHARACTERISTIC_WALKER 0.000 + CHARACTERISTIC_WEAPONJUMPING 1.000 + CHARACTERISTIC_GRAPPLE_USER 1.000 + + CHARACTERISTIC_ITEMWEIGHTS "bots/gargoyle_i.c" + CHARACTERISTIC_AGGRESSION 1.000 + CHARACTERISTIC_SELFPRESERVATION 1.000 + CHARACTERISTIC_VENGEFULNESS 1.000 + CHARACTERISTIC_CAMPER 0.000 + + CHARACTERISTIC_EASY_FRAGGER 1.000 + CHARACTERISTIC_ALERTNESS 1.000 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.700 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.000 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.000 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.000 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.000 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.000 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.000 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.000 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.000 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.000 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.000 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.000 + + CHARACTERISTIC_FIRETHROTTLE 1.000 +} + diff --git a/q4base/botfiles/bots/gargoyle_i.c b/q4base/botfiles/bots/gargoyle_i.c new file mode 100644 index 00000000..80aed1f5 --- /dev/null +++ b/q4base/botfiles/bots/gargoyle_i.c @@ -0,0 +1,74 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + +#define FPH 2 +#define FPA 1 + +#define SGW 200 +#define MGW 100 +#define GLW 150 +#define RLW 350 +#define RGW 500 +#define BFW 450 +#define LGW 200 +#define PGW 250 +#define PXW 350 +#define NGW 150 +#define CGW 200 + +#define GSGW 150 +#define GMGW 150 +#define GGLW 200 +#define GRLW 300 +#define GRGW 400 +#define GBFW 100 +#define GLGW 250 +#define GPGW 100 +#define GPXW 200 +#define GNGW 100 +#define GCGW 125 + +#define TELW 190 +#define MEDW 50 +#define QW 500 +#define ENVW 50 +#define HAW 50 +#define INW 400 +#define REGW 50 +#define FLW 190 +#define KAMW 200 +#define IBW 150 +#define PORW 300 +#define SCW 100 +#define GUW 200 +#define DUBW 100 +#define AMRW 400 +#define REDCW 200 +#define BLCW 200 + +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/gargoyle_t.c b/q4base/botfiles/bots/gargoyle_t.c new file mode 100644 index 00000000..d7686cf5 --- /dev/null +++ b/q4base/botfiles/bots/gargoyle_t.c @@ -0,0 +1,266 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + + +chat "gargoyle" +{ + #include "teamplay.h" + + type "game_enter" + { + "I hope that you are all ready to die, because you will."; + "Ladies and Gentlemen, the word is pain. Time to spread the word."; + "...clowns to the left of me, jokers to the right, here I am stuck in the middle with you..."; + + } + + type "game_exit" + { + "~It's been real and ~it's been fun..."; + "Sorry ~that's your ~Mom on the phone, I have to take this."; + "Look at the time... later peeps."; + + } + + type "level_start" + { + 4, "was a great place before they screwed it up."; + 4, "... again?!?"; + "I can remember ", 4, " when it didn't suck."; + "Dibs on the railgun!"; + } + + type "level_end" + { + "*Yawn*... thought it would never end."; + "Well that was almost interesting."; + "What? No dancing girls? Where's my agent?!?"; + + } + + type "level_end_victory" + { + "As usual... You still suck."; + "Things are as they should be."; + "Why do you even try?"; + "Did you really think that you could beat me?"; + } + + type "level_end_lose" + { + "Ya Basta!"; + "Two out of three?"; + "I was robbed!"; + "My heart wasn't in it, it was on a small planet somewhere in the vicinity of Beatlegeuse."; + + } + + type "hit_talking" + { + "Look jerkwad I was trying to hold a conversation!"; + "Do that again and ~I'll sell your genitals on EBay."; + "Jerk."; + "The chatbox makes a great target, doesn't it?"; + } + + type "hit_nodeath" + { + "Son of a..."; + "Time to go back to the firing range."; + "I ~can't believe you survived that."; + "I need a bigger gun."; + + } + + type "hit_nokill" + { + "Try harder."; + "Was the safety off?"; + "HA!"; + "Try aiming."; + } + + type "death_telefrag" + { + "Stupid praetorians!"; + "I thought all of the praetorians were killed in the last invasion of their home world?"; + "That was a terrible praetorian impersonation."; + "I'm telling your ", family_member, "."; + "Didn't your ", counselor, " tell you not to do that anymore?"; + } + + type "death_cratered" + { + "Aww crap!"; + "I had to give ", 0, " a chance."; + "It didn't look that high from up there."; + "I should learn to use these wings."; + "Hehe... oops."; + } + + type "death_lava" + { + "Anyone got any marshmallows?"; + "Ahh... warmth at last... ooh hot! hot! hot!"; + "Well... ", 0, " needed the help."; + "So much for swimming in lava."; + } + + type "death_slime" + { + "Well it looked safer than that..."; + "Who put this toxic waste here?"; + "That should be labeled toxic"; + "Where is Rob Reiner when you need him?"; + } + + type "death_drown" + { + "Ahh... sweet oblivion."; + "I thought Leileilol gave me gills!"; + "I guess I can't breathe water"; + "So much for that indestructibility complex."; + } + + type "death_suicide" + { + "Just seeing what it was like."; + "Karma."; + "Oops..."; + "I give up."; + } + + type "death_gauntlet" + { + "Zagged when I should have zigged."; + "That is humiliating."; + "*sigh*"; + "Don't touch me there!"; + } + + type "death_rail" + { + "I never heard it."; + "I thought I would hear it."; + "Who'd a thunk it?"; + "Punk!"; + } + + type "death_bfg" + { + "*sigh* try a real weapon next time."; + "Awful big gun for such a puny wimp..."; + "Can't hack it with a real weapon?"; + "Sissy!"; + } + + type "death_insult" + { + "Oh please, my ", family_member, " could do better than that."; + "took you long enough..."; + "Is that all you've got?"; + curse; + "You should practice more."; + } + + type "death_praise" + { + "You are better than I thought, ", 0, "."; + "I let you frag me."; + "Great shot."; + "Nice ~one"; + "Looks like you are on your way to arena mastery."; + } + + type "kill_rail" + { + "Set 'em up and snipe them down."; + "Like shooting fish in a barrel."; + "Too easy."; + "How do you like me now?"; + } + + type "kill_gauntlet" + { + "HA!"; + "I told you so."; + "Mmmm hmmm."; + "So much for your bluster."; + "Do I make myself clear?"; + KILL_GAUNTLET1; + KILL_GAUNTLET0; + } + + type "kill_telefrag" + { + "Heh... praetorians rule!"; + "You are paying for the dry cleaning bill."; + "You will be cleaning that up, right?"; + "Hehe"; + TELEFRAGGED0; + TELEFRAGGED1; + + } + + type "kill_suicide" + { + + TAUNT1; + TAUNT0; + } + + type "kill_insult" + { + "Pathetic"; + "looser"; + "Eesh! You need practice."; + "Too easy."; + KILL_EXTREME_INSULT; + curse; + } + + type "kill_praise" + { + "I had to work for that one."; + "You are improving."; + "Not bad, Major will have her work cut out for her."; + D_PRAISE1; + } + + type "random_insult" + { + "I've seen bacteria with a better chance of getting a frag than you, ", 0, "."; + peeps, " is better."; + number, " US dollars says you don't win."; + peeps, " needs to stop calling my ~Mom."; + } + + type "random_misc" + { + "What ever happened to polite discourse?"; + "You know, I really do want to be anarchy... how do I go about that?"; + "Ever do any fishing?"; + "So, how about them Cubs?"; + "This is the year that the Cubs win the World Series!"; + } +} diff --git a/q4base/botfiles/bots/gargoyle_w.c b/q4base/botfiles/bots/gargoyle_w.c new file mode 100644 index 00000000..2724cc6f --- /dev/null +++ b/q4base/botfiles/bots/gargoyle_w.c @@ -0,0 +1,42 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +#define GTW 100 +#define SGW 450 +#define MGW 110 +#define GLW 320 +#define RLW 450 +#define RGW 500 +#define BFW 400 +#define LGW 220 +#define PGW 200 +#define GRW 50 +#define NGW 200 +#define PXW 150 +#define CGW 365 + +// +#include "fuzw.c" diff --git a/q4base/botfiles/bots/grism_c.c b/q4base/botfiles/bots/grism_c.c new file mode 100644 index 00000000..e490288d --- /dev/null +++ b/q4base/botfiles/bots/grism_c.c @@ -0,0 +1,203 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Grism" + CHARACTERISTIC_GENDER "Male" + CHARACTERISTIC_ATTACK_SKILL 0.250 + CHARACTERISTIC_WEAPONWEIGHTS "bots/grism_w.c" + CHARACTERISTIC_AIM_SKILL 0.250 + CHARACTERISTIC_AIM_ACCURACY 0.250 + CHARACTERISTIC_VIEW_FACTOR 0.250 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 2.00 + + CHARACTERISTIC_CHAT_FILE "bots/grism_t.c" + CHARACTERISTIC_CHAT_NAME "grism" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.900 + CHARACTERISTIC_CHAT_MISC 0.750 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000 + CHARACTERISTIC_CHAT_KILL 1.000 + CHARACTERISTIC_CHAT_DEATH 0.900 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000 + CHARACTERISTIC_CHAT_HITTALKING 0.900 + CHARACTERISTIC_CHAT_HITNODEATH 0.800 + CHARACTERISTIC_CHAT_HITNOKILL 1.000 + CHARACTERISTIC_CHAT_RANDOM 0.900 + CHARACTERISTIC_CHAT_REPLY 1.000 + + CHARACTERISTIC_CROUCHER 0.200 + CHARACTERISTIC_JUMPER 0.900 + CHARACTERISTIC_WALKER 0.000 + CHARACTERISTIC_WEAPONJUMPING 0.800 + CHARACTERISTIC_GRAPPLE_USER 0.500 + + CHARACTERISTIC_ITEMWEIGHTS "bots/grism_i.c" + CHARACTERISTIC_AGGRESSION 0.250 + CHARACTERISTIC_SELFPRESERVATION 0.900 + CHARACTERISTIC_VENGEFULNESS 0.900 + CHARACTERISTIC_CAMPER 0.800 + + CHARACTERISTIC_EASY_FRAGGER 1.000 + CHARACTERISTIC_ALERTNESS 0.900 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.700 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.500 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.600 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.500 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.700 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.450 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.400 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.800 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.500 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.500 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.500 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.500 + + CHARACTERISTIC_FIRETHROTTLE 0.300 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Grism" + CHARACTERISTIC_GENDER "Male" + CHARACTERISTIC_ATTACK_SKILL 1.000 + CHARACTERISTIC_WEAPONWEIGHTS "bots/grism_w.c" + CHARACTERISTIC_AIM_SKILL 1.000 + CHARACTERISTIC_AIM_ACCURACY 1.000 + CHARACTERISTIC_VIEW_FACTOR 0.900 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.25 + + CHARACTERISTIC_CHAT_FILE "bots/grism_t.c" + CHARACTERISTIC_CHAT_NAME "grism" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.900 + CHARACTERISTIC_CHAT_MISC 0.750 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000 + CHARACTERISTIC_CHAT_KILL 1.000 + CHARACTERISTIC_CHAT_DEATH 0.900 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000 + CHARACTERISTIC_CHAT_HITTALKING 0.900 + CHARACTERISTIC_CHAT_HITNODEATH 0.800 + CHARACTERISTIC_CHAT_HITNOKILL 1.000 + CHARACTERISTIC_CHAT_RANDOM 0.900 + CHARACTERISTIC_CHAT_REPLY 1.000 + + CHARACTERISTIC_CROUCHER 0.100 + CHARACTERISTIC_JUMPER 0.900 + CHARACTERISTIC_WALKER 0.000 + CHARACTERISTIC_WEAPONJUMPING 1.000 + CHARACTERISTIC_GRAPPLE_USER 1.000 + + CHARACTERISTIC_ITEMWEIGHTS "bots/grism_i.c" + CHARACTERISTIC_AGGRESSION 1.000 + CHARACTERISTIC_SELFPRESERVATION 0.000 + CHARACTERISTIC_VENGEFULNESS 1.000 + CHARACTERISTIC_CAMPER 0.700 + + CHARACTERISTIC_EASY_FRAGGER 1.000 + CHARACTERISTIC_ALERTNESS 1.000 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.900 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.900 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.900 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.900 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.900 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.900 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.900 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.900 + + CHARACTERISTIC_FIRETHROTTLE 0.200 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Grism" + CHARACTERISTIC_GENDER "Male" + CHARACTERISTIC_ATTACK_SKILL 1.000 + CHARACTERISTIC_WEAPONWEIGHTS "bots/grism_w.c" + CHARACTERISTIC_AIM_SKILL 1.000 + CHARACTERISTIC_AIM_ACCURACY 1.000 + CHARACTERISTIC_VIEW_FACTOR 1.000 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.00 + + CHARACTERISTIC_CHAT_FILE "bots/grism_t.c" + CHARACTERISTIC_CHAT_NAME "grism" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.900 + CHARACTERISTIC_CHAT_MISC 0.750 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000 + CHARACTERISTIC_CHAT_KILL 1.000 + CHARACTERISTIC_CHAT_DEATH 0.900 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000 + CHARACTERISTIC_CHAT_HITTALKING 0.900 + CHARACTERISTIC_CHAT_HITNODEATH 0.800 + CHARACTERISTIC_CHAT_HITNOKILL 1.000 + CHARACTERISTIC_CHAT_RANDOM 0.900 + CHARACTERISTIC_CHAT_REPLY 1.000 + + CHARACTERISTIC_CROUCHER 0.000 + CHARACTERISTIC_JUMPER 1.000 + CHARACTERISTIC_WALKER 0.000 + CHARACTERISTIC_WEAPONJUMPING 1.000 + CHARACTERISTIC_GRAPPLE_USER 1.000 + + CHARACTERISTIC_ITEMWEIGHTS "bots/grism_i.c" + CHARACTERISTIC_AGGRESSION 1.000 + CHARACTERISTIC_SELFPRESERVATION 1.000 + CHARACTERISTIC_VENGEFULNESS 1.000 + CHARACTERISTIC_CAMPER 0.000 + + CHARACTERISTIC_EASY_FRAGGER 1.000 + CHARACTERISTIC_ALERTNESS 1.000 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.000 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.000 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.000 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.000 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.000 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.000 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.000 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.000 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.000 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.000 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.000 + + CHARACTERISTIC_FIRETHROTTLE 0.100 +} + diff --git a/q4base/botfiles/bots/grism_i.c b/q4base/botfiles/bots/grism_i.c new file mode 100644 index 00000000..dcb4eda7 --- /dev/null +++ b/q4base/botfiles/bots/grism_i.c @@ -0,0 +1,74 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + +#define FPH 2 +#define FPA 1 + +#define SGW 200 +#define MGW 100 +#define GLW 150 +#define RLW 350 +#define RGW 500 +#define BFW 450 +#define LGW 200 +#define PGW 250 +#define PXW 350 +#define NGW 150 +#define CGW 200 + +#define GSGW 150 +#define GMGW 150 +#define GGLW 200 +#define GRLW 300 +#define GRGW 400 +#define GBFW 100 +#define GLGW 250 +#define GPGW 100 +#define GPXW 200 +#define GNGW 100 +#define GCGW 125 + +#define TELW 190 +#define MEDW 50 +#define QW 500 +#define ENVW 50 +#define HAW 50 +#define INW 400 +#define REGW 50 +#define FLW 0.0 +#define KAMW 200 +#define IBW 150 +#define PORW 300 +#define SCW 100 +#define GUW 200 +#define DUBW 100 +#define AMRW 400 +#define REDCW 200 +#define BLCW 200 + +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/grism_t.c b/q4base/botfiles/bots/grism_t.c new file mode 100644 index 00000000..cff22fab --- /dev/null +++ b/q4base/botfiles/bots/grism_t.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "grism" +{ + #include "teamplay.h" + + type "game_enter" + { + "Here we go again."; + "Why don't you people just lay down and die, it'll save me the trouble."; + } + + type "game_exit" + { + GOODBYE1; + GOODBYE4; + GOODBYE3; + } + + type "level_start" + { + "Oh man, ", 4, " again?!?"; + "Alright, ", 4, " has always been good to me."; + } + + type "level_end" + { + "nice place ", 4, ", much less dangerous than d3dm2."; + } + + type "level_end_victory" + { + "Yep."; + } + + type "level_end_lose" + { + "Aww... crap!"; + } + + type "hit_talking" + { + DEATH_TALKING; + + } + + type "hit_nodeath" + { + TAUNT0; + TAUNT1; + TAUNT2; + } + + type "hit_nokill" + { + HIT_NOKILL0; + HIT_NOKILL1; + HIT_NOKILL1; + } + + type "death_telefrag" + { + DEATH_TELEFRAGGED0; + DEATH_TELEFRAGGED0; + DEATH_TELEFRAGGED0; + } + + type "death_cratered" + { + DEATH_FALLING0; + DEATH_FALLING0; + DEATH_FALLING0; + } + + type "death_lava" + { + "Well it was getting a bit nippy..."; + "mmm... toasty!"; + } + + type "death_slime" + { + "D'oh!"; + } + + type "death_drown" + { + "Who needs air?"; + } + + type "death_suicide" + { + DEATH_SUICIDE0; + DEATH_SUICIDE1; + DEATH_SUICIDE1; + } + + type "death_gauntlet" + { + DEATH_GAUNTLET0; + DEATH_GAUNTLET1; + DEATH_GAUNTLET1; + } + + type "death_rail" + { + DEATH_RAIL1; + DEATH_RAIL1; + DEATH_RAIL0; + + } + + type "death_bfg" + { + DEATH_BFG1; + DEATH_BFG0; + + } + + type "death_insult" + { + "What the... how cheap!"; + "Back in my day, frags weren't so cheap."; + } + + type "death_praise" + { + 0, " is death incarnate."; + } + + type "kill_rail" + { + KILL_RAIL0; + KILL_RAIL1; + } + + type "kill_gauntlet" + { + KILL_GAUNTLET0; + KILL_GAUNTLET1; + + } + + type "kill_telefrag" + { + TELEFRAGGED0; + TELEFRAGGED1; + } + + type "kill_suicide" + { + TAUNT0; + TAUNT1; + } + + type "kill_insult" + { + "Pathetic."; + "tsk"; + "My ", family_member, " could do better."; + } + + type "kill_praise" + { + "Nice one, ", 0, "."; + "Wow, ~you never saw that one coming, ", 0, "."; + } + + type "random_insult" + { + 0, ", ~you suck!"; + 0, " needs to stop calling my mom."; + } + + type "random_misc" + { + 0, " gave my ~mom ", disease, "."; + "Is it true that ", peeps, " is a bot?"; + + } +} diff --git a/q4base/botfiles/bots/grism_w.c b/q4base/botfiles/bots/grism_w.c new file mode 100644 index 00000000..1e5b29c3 --- /dev/null +++ b/q4base/botfiles/bots/grism_w.c @@ -0,0 +1,41 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + +#define GTW 100 +#define SGW 500 +#define MGW 110 +#define GLW 320 +#define RLW 450 +#define RGW 100 +#define BFW 400 +#define LGW 220 +#define PGW 200 +#define GRW 50 +#define NGW 200 +#define PXW 150 +#define CGW 365 + +// +#include "fuzw.c" diff --git a/q4base/botfiles/bots/grunt_c.c b/q4base/botfiles/bots/grunt_c.c new file mode 100644 index 00000000..687a37a3 --- /dev/null +++ b/q4base/botfiles/bots/grunt_c.c @@ -0,0 +1,203 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "grunt" + CHARACTERISTIC_GENDER "Male" + CHARACTERISTIC_ATTACK_SKILL 0.250 + CHARACTERISTIC_WEAPONWEIGHTS "bots/grunt_w.c" + CHARACTERISTIC_AIM_SKILL 0.250 + CHARACTERISTIC_AIM_ACCURACY 0.250 + CHARACTERISTIC_VIEW_FACTOR 0.250 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 2.00 + + CHARACTERISTIC_CHAT_FILE "bots/grunt_t.c" + CHARACTERISTIC_CHAT_NAME "grunt" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.900 + CHARACTERISTIC_CHAT_MISC 0.750 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000 + CHARACTERISTIC_CHAT_KILL 1.000 + CHARACTERISTIC_CHAT_DEATH 0.900 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000 + CHARACTERISTIC_CHAT_HITTALKING 0.900 + CHARACTERISTIC_CHAT_HITNODEATH 0.800 + CHARACTERISTIC_CHAT_HITNOKILL 1.000 + CHARACTERISTIC_CHAT_RANDOM 0.900 + CHARACTERISTIC_CHAT_REPLY 1.000 + + CHARACTERISTIC_CROUCHER 0.200 + CHARACTERISTIC_JUMPER 0.900 + CHARACTERISTIC_WALKER 0.000 + CHARACTERISTIC_WEAPONJUMPING 0.800 + CHARACTERISTIC_GRAPPLE_USER 0.500 + + CHARACTERISTIC_ITEMWEIGHTS "bots/grunt_i.c" + CHARACTERISTIC_AGGRESSION 0.250 + CHARACTERISTIC_SELFPRESERVATION 0.900 + CHARACTERISTIC_VENGEFULNESS 0.900 + CHARACTERISTIC_CAMPER 0.000 + + CHARACTERISTIC_EASY_FRAGGER 1.000 + CHARACTERISTIC_ALERTNESS 0.900 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.500 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.400 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.500 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.300 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.700 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.450 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.400 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.800 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.500 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.500 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.500 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.500 + + CHARACTERISTIC_FIRETHROTTLE 0.800 +} + +skill 4 +{ + CHARACTERISTIC_NAME "grunt" + CHARACTERISTIC_GENDER "Male" + CHARACTERISTIC_ATTACK_SKILL 1.000 + CHARACTERISTIC_WEAPONWEIGHTS "bots/grunt_w.c" + CHARACTERISTIC_AIM_SKILL 1.000 + CHARACTERISTIC_AIM_ACCURACY 1.000 + CHARACTERISTIC_VIEW_FACTOR 0.900 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.25 + + CHARACTERISTIC_CHAT_FILE "bots/grunt_t.c" + CHARACTERISTIC_CHAT_NAME "grunt" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.900 + CHARACTERISTIC_CHAT_MISC 0.750 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000 + CHARACTERISTIC_CHAT_KILL 1.000 + CHARACTERISTIC_CHAT_DEATH 0.900 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000 + CHARACTERISTIC_CHAT_HITTALKING 0.900 + CHARACTERISTIC_CHAT_HITNODEATH 0.800 + CHARACTERISTIC_CHAT_HITNOKILL 1.000 + CHARACTERISTIC_CHAT_RANDOM 0.900 + CHARACTERISTIC_CHAT_REPLY 1.000 + + CHARACTERISTIC_CROUCHER 0.100 + CHARACTERISTIC_JUMPER 1.000 + CHARACTERISTIC_WALKER 0.000 + CHARACTERISTIC_WEAPONJUMPING 1.000 + CHARACTERISTIC_GRAPPLE_USER 1.000 + + CHARACTERISTIC_ITEMWEIGHTS "bots/grunt_i.c" + CHARACTERISTIC_AGGRESSION 1.000 + CHARACTERISTIC_SELFPRESERVATION 1.000 + CHARACTERISTIC_VENGEFULNESS 1.000 + CHARACTERISTIC_CAMPER 0.500 + + CHARACTERISTIC_EASY_FRAGGER 1.000 + CHARACTERISTIC_ALERTNESS 1.000 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.900 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.900 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.900 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.900 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.900 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.900 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.900 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.900 + + CHARACTERISTIC_FIRETHROTTLE 0.900 +} + +skill 5 +{ + CHARACTERISTIC_NAME "grunt" + CHARACTERISTIC_GENDER "Male" + CHARACTERISTIC_ATTACK_SKILL 1.000 + CHARACTERISTIC_WEAPONWEIGHTS "bots/grunt_w.c" + CHARACTERISTIC_AIM_SKILL 1.000 + CHARACTERISTIC_AIM_ACCURACY 1.000 + CHARACTERISTIC_VIEW_FACTOR 1.000 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.00 + + CHARACTERISTIC_CHAT_FILE "bots/grunt_t.c" + CHARACTERISTIC_CHAT_NAME "grunt" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.900 + CHARACTERISTIC_CHAT_MISC 0.750 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000 + CHARACTERISTIC_CHAT_KILL 1.000 + CHARACTERISTIC_CHAT_DEATH 0.900 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000 + CHARACTERISTIC_CHAT_HITTALKING 0.900 + CHARACTERISTIC_CHAT_HITNODEATH 0.800 + CHARACTERISTIC_CHAT_HITNOKILL 1.000 + CHARACTERISTIC_CHAT_RANDOM 0.900 + CHARACTERISTIC_CHAT_REPLY 1.000 + + CHARACTERISTIC_CROUCHER 0.000 + CHARACTERISTIC_JUMPER 1.000 + CHARACTERISTIC_WALKER 0.000 + CHARACTERISTIC_WEAPONJUMPING 1.000 + CHARACTERISTIC_GRAPPLE_USER 1.000 + + CHARACTERISTIC_ITEMWEIGHTS "bots/grunt_i.c" + CHARACTERISTIC_AGGRESSION 1.000 + CHARACTERISTIC_SELFPRESERVATION 1.000 + CHARACTERISTIC_VENGEFULNESS 1.000 + CHARACTERISTIC_CAMPER 0.000 + + CHARACTERISTIC_EASY_FRAGGER 1.000 + CHARACTERISTIC_ALERTNESS 1.000 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.700 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.000 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.000 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.000 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.000 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.000 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.000 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.000 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.000 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.000 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.000 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.000 + + CHARACTERISTIC_FIRETHROTTLE 1.000 +} + diff --git a/q4base/botfiles/bots/grunt_i.c b/q4base/botfiles/bots/grunt_i.c new file mode 100644 index 00000000..784ccd97 --- /dev/null +++ b/q4base/botfiles/bots/grunt_i.c @@ -0,0 +1,74 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + +#define FPH 2 +#define FPA 2 + +#define SGW 200 +#define MGW 100 +#define GLW 150 +#define RLW 350 +#define RGW 200 +#define BFW 450 +#define LGW 200 +#define PGW 250 +#define PXW 350 +#define NGW 150 +#define CGW 200 + +#define GSGW 150 +#define GMGW 150 +#define GGLW 200 +#define GRLW 300 +#define GRGW 200 +#define GBFW 100 +#define GLGW 250 +#define GPGW 100 +#define GPXW 200 +#define GNGW 100 +#define GCGW 125 + +#define TELW 190 +#define MEDW 50 +#define QW 500 +#define ENVW 50 +#define HAW 50 +#define INW 400 +#define REGW 50 +#define FLW 260 +#define KAMW 200 +#define IBW 150 +#define PORW 300 +#define SCW 100 +#define GUW 200 +#define DUBW 100 +#define AMRW 400 +#define REDCW 200 +#define BLCW 200 + +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/grunt_t.c b/q4base/botfiles/bots/grunt_t.c new file mode 100644 index 00000000..109c485c --- /dev/null +++ b/q4base/botfiles/bots/grunt_t.c @@ -0,0 +1,266 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + + +chat "grunt" +{ + #include "teamplay.h" + + type "game_enter" + { + "I hope that you are all ready to die, because you will."; + "Ladies and Gentlemen, the word is pain. Time to spread the word."; + "...clowns to the left of me, jokers to the right, here I am stuck in the middle with you..."; + + } + + type "game_exit" + { + "~It's been real and ~it's been fun..."; + "Sorry ~that's your ~Mom on the phone, I have to take this."; + "Look at the time... later peeps."; + + } + + type "level_start" + { + 4, "was a great place before they screwed it up."; + 4, "... again?!?"; + "I can remember ", 4, " when it didn't suck."; + "Dibs on the railgun!"; + } + + type "level_end" + { + "*Yawn*... thought it would never end."; + "Well that was almost interesting."; + "What? No dancing girls? Where's my agent?!?"; + + } + + type "level_end_victory" + { + "As usual... You still suck."; + "Things are as they should be."; + "Why do you even try?"; + "Did you really think that you could beat me?"; + } + + type "level_end_lose" + { + "Ya Basta!"; + "Two out of three?"; + "I was robbed!"; + "My heart wasn't in it, it was on a small planet somewhere in the vicinity of Beatlegeuse."; + + } + + type "hit_talking" + { + "Look jerkwad I was trying to hold a conversation!"; + "Do that again and ~I'll sell your genitals on EBay."; + "Jerk."; + "The chatbox makes a great target, doesn't it?"; + } + + type "hit_nodeath" + { + "Son of a..."; + "Time to go back to the firing range."; + "I ~can't believe you survived that."; + "I need a bigger gun."; + + } + + type "hit_nokill" + { + "Try harder."; + "Was the safety off?"; + "HA!"; + "Try aiming."; + } + + type "death_telefrag" + { + "Stupid praetorians!"; + "I thought all of the praetorians were killed in the last invasion of their home world?"; + "That was a terrible praetorian impersonation."; + "I'm telling your ", family_member, "."; + "Didn't your ", counselor, " tell you not to do that anymore?"; + } + + type "death_cratered" + { + "Aww crap!"; + "I had to give ", 0, " a chance."; + "It didn't look that high from up there."; + "I should learn to use these wings."; + "Hehe... oops."; + } + + type "death_lava" + { + "Anyone got any marshmallows?"; + "Ahh... warmth at last... ooh hot! hot! hot!"; + "Well... ", 0, " needed the help."; + "So much for swimming in lava."; + } + + type "death_slime" + { + "Well it looked safer than that..."; + "Who put this toxic waste here?"; + "That should be labeled toxic"; + "Where is Rob Reiner when you need him?"; + } + + type "death_drown" + { + "Ahh... sweet oblivion."; + "I thought Leileilol gave me gills!"; + "I guess I can't breathe water"; + "So much for that indestructibility complex."; + } + + type "death_suicide" + { + "Just seeing what it was like."; + "Karma."; + "Oops..."; + "I give up."; + } + + type "death_gauntlet" + { + "Zagged when I should have zigged."; + "That is humiliating."; + "*sigh*"; + "Don't touch me there!"; + } + + type "death_rail" + { + "I never heard it."; + "I thought I would hear it."; + "Who'd a thunk it?"; + "Punk!"; + } + + type "death_bfg" + { + "*sigh* try a real weapon next time."; + "Awful big gun for such a puny wimp..."; + "Can't hack it with a real weapon?"; + "Sissy!"; + } + + type "death_insult" + { + "Oh please, my ", family_member, " could do better than that."; + "took you long enough..."; + "Is that all you've got?"; + curse; + "You should practice more."; + } + + type "death_praise" + { + "You are better than I thought, ", 0, "."; + "I let you frag me."; + "Great shot."; + "Nice ~one"; + "Looks like you are on your way to arena mastery."; + } + + type "kill_rail" + { + "Set 'em up and snipe them down."; + "Like shooting fish in a barrel."; + "Too easy."; + "How do you like me now?"; + } + + type "kill_gauntlet" + { + "HA!"; + "I told you so."; + "Mmmm hmmm."; + "So much for your bluster."; + "Do I make myself clear?"; + KILL_GAUNTLET1; + KILL_GAUNTLET0; + } + + type "kill_telefrag" + { + "Heh... praetorians rule!"; + "You are paying for the dry cleaning bill."; + "You will be cleaning that up, right?"; + "Hehe"; + TELEFRAGGED0; + TELEFRAGGED1; + + } + + type "kill_suicide" + { + + TAUNT1; + TAUNT0; + } + + type "kill_insult" + { + "Pathetic"; + "looser"; + "Eesh! You need practice."; + "Too easy."; + KILL_EXTREME_INSULT; + curse; + } + + type "kill_praise" + { + "I had to work for that one."; + "You are improving."; + "Not bad, Major will have her work cut out for her."; + D_PRAISE1; + } + + type "random_insult" + { + "I've seen bacteria with a better chance of getting a frag than you, ", 0, "."; + peeps, " is better."; + number, " US dollars says you don't win."; + peeps, " needs to stop calling my ~Mom."; + } + + type "random_misc" + { + "What ever happened to polite discourse?"; + "You know, I really do want to be anarchy... how do I go about that?"; + "Ever do any fishing?"; + "So, how about them Cubs?"; + "This is the year that the Cubs win the World Series!"; + } +} diff --git a/q4base/botfiles/bots/grunt_w.c b/q4base/botfiles/bots/grunt_w.c new file mode 100644 index 00000000..9b2383f4 --- /dev/null +++ b/q4base/botfiles/bots/grunt_w.c @@ -0,0 +1,42 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +#define GTW 100 +#define SGW 250 +#define MGW 130 +#define GLW 320 +#define RLW 250 +#define RGW 300 +#define BFW 80 +#define LGW 220 +#define PGW 200 +#define GRW 50 +#define NGW 230 +#define PXW 150 +#define CGW 365 + +// +#include "fuzw.c" diff --git a/q4base/botfiles/bots/jenna_c.c b/q4base/botfiles/bots/jenna_c.c new file mode 100644 index 00000000..941a5edc --- /dev/null +++ b/q4base/botfiles/bots/jenna_c.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Jenna" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 0.25 + CHARACTERISTIC_WEAPONWEIGHTS "bots/jenna_w.c" + CHARACTERISTIC_AIM_SKILL 0.25 + CHARACTERISTIC_AIM_ACCURACY 0.25 + CHARACTERISTIC_VIEW_FACTOR 0.25 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 3.0 + + CHARACTERISTIC_CHAT_FILE "bots/jenna_t.c" + CHARACTERISTIC_CHAT_NAME "jenna" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.5 + CHARACTERISTIC_CHAT_MISC 0.5 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.5 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.5 + CHARACTERISTIC_CHAT_KILL 0.5 + CHARACTERISTIC_CHAT_DEATH 0.5 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.5 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.5 + CHARACTERISTIC_CHAT_HITNOKILL 0.5 + CHARACTERISTIC_CHAT_RANDOM 0.5 + CHARACTERISTIC_CHAT_REPLY 0.5 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 0.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 0.5 + CHARACTERISTIC_GRAPPLE_USER 0.5 + + CHARACTERISTIC_ITEMWEIGHTS "bots/jenna_i.c" + CHARACTERISTIC_AGGRESSION 0.25 + CHARACTERISTIC_SELFPRESERVATION 0.5 + CHARACTERISTIC_VENGEFULNESS 0.25 + CHARACTERISTIC_CAMPER 0.25 + + CHARACTERISTIC_EASY_FRAGGER 0.5 + CHARACTERISTIC_ALERTNESS 0.5 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.3 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.3 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.3 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.3 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.3 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.3 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.3 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.3 + + CHARACTERISTIC_FIRETHROTTLE 0.3 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Jenna" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/jenna_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 0.9 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.75 + + CHARACTERISTIC_CHAT_FILE "bots/jenna_t.c" + CHARACTERISTIC_CHAT_NAME "jenna" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.1 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/jenna_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.5 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.75 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.75 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.75 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.75 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.75 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.75 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.75 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.75 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Jenna" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/jenna_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 1.0 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.0 + + CHARACTERISTIC_CHAT_FILE "bots/jenna_t.c" + CHARACTERISTIC_CHAT_NAME "jenna" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/jenna_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.0 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.0 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} diff --git a/q4base/botfiles/bots/jenna_i.c b/q4base/botfiles/bots/jenna_i.c new file mode 100644 index 00000000..e4d30811 --- /dev/null +++ b/q4base/botfiles/bots/jenna_i.c @@ -0,0 +1,120 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +//health +#define FPH 2 +//armor +#define FPA 2 +//without the weapons +//shotgun +#define SGW 200 +//machinegun +#define MGW 50 +//grenadelauncher +#define GLW 400 +//rocket launcher +#define RLW 400 +//rail gun +#define RGW 260 +//bfg10k +#define BFW 400 +//lightninggun +#define LGW 50 +//plasmagun +#define PGW 250 +//prox-launcher +#define PXW 350 +//nailgun +#define NGW 150 +//chaingun +#define CGW 200 + + + + +//with the weapons +//shotgun +#define GSGW 50 +//machinegun +#define GMGW 50 +//grenadelauncher +#define GGLW 400 +//rocketlauncher +#define GRLW 210 +//railgun +#define GRGW 50 +//bfg10k +#define GBFW 400 +//lightninggun +#define GLGW 50 +//plasmagun +#define GPGW 50 +//prox-launcher +#define GPXW 200 +//failgun +#define GNGW 100 +//chaingun +#define GCGW 125 +//individual powerups +//teleport +#define TELW 190 +//medkit +#define MEDW 50 +//quad-damage +#define QW 200 +//envirosuit +#define ENVW 50 +//haste +#define HAW 50 +//invisibility +#define INW 250 +//regeneration +#define REGW 75 +//flight +#define FLW 10 +//kamikaze +#define KAMW 100 +//invulnerability +#define IBW 150 +//portal +#define PORW 100 +//scout +#define SCW 100 +//guard +#define GUW 200 +//doubler +#define DUBW 100 +//ammo-regen +#define AMRW 400 +//red-cube +#define REDCW 200 +//blue-cube +#define BLCW 200 +//ctf flag weight +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/jenna_t.c b/q4base/botfiles/bots/jenna_t.c new file mode 100644 index 00000000..a9600547 --- /dev/null +++ b/q4base/botfiles/bots/jenna_t.c @@ -0,0 +1,275 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "Jenna" +{ + //the teamplay.h file is included for all kinds of teamplay chats + #include "teamplay.h" + //====================================================== + //====================================================== + type "game_enter" //initiated when the bot enters the game + { + "Hello."; + HELLO1; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "game_exit" //initiated when the bot exits the game + { + "Look at the ~time"; + GOODBYE1; + GOODBYE0; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "level_start" //initiated when a new level starts + { + 0, " it is time for some payback!"; + 1, " you are going to have some pain in ", 4, "."; + HELLO2; + + // 0 = bot name + } //end type + type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings + { + 2, ", I let you win."; + 4, " has changed a lot, it is much faster now."; + "Is it over yet?"; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_victory" //initiated when a level ends and the bot is first in the rankings + { + 3, " you need to practice more... and forget about winning against me."; + LEVEL_END_VICTORY1; + // 0 = bot name + // 1 = random opponent + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_lose" //initiated when a level ends and the bot is last in the rankings + { + 2, " cheated."; + "I had a hang nail, so of course I lost."; + "So much for my bluster..."; + "I felt bad for you so I let you win."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 4 = level's title + } //end type + //====================================================== + //====================================================== + type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship + { + 0, ", didn't your mother ever tell you it was rude to interrupt a conversation?"; + "I am going to shove that ", 1, " down your throat if you do that again!"; + DEATH_TALKING; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult + { + 1, " is not a good weapon, a ", weapon, " should be more your speed."; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nokill" //bot hits an opponent but does not kill it + { + 0, " must be cheating."; + "Well that sucked..."; + "Note to self... turn off safety next ~time"; + // 0 = opponent + } //end type + type "enemy_suicide" //enemy of the bot commits suicide + { + "Stop smoking ", substance, " and maybe you won't kill yourself so often."; + "Tired of life, ", 0, "? Give it up."; + "I guess that beats dying of ", disease, "..."; + // 0 = enemy + } //end type + //====================================================== + //====================================================== + type "death_telefrag" //initiated when the bot is killed by a telefrag + { + "I hate praetorian impressions."; + "My ", counselor, " warned about days like this."; + "D'oh!"; + DEATH_TELEFRAGGED1; + // 0 = enemy name + } //end type + type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage + { + DEATH_FALLING0; + "It didn't look that high from up there..."; + "*sigh*"; + // 0 = random opponent + } //end type + type "death_lava" //initiated when the bot dies in lava + { + "Well... it beats a case of hypothermia."; + "At least it is warm here"; + DEATH_SUICIDE1; + // 0 = random opponent + } //end type + type "death_slime" //initiated when the bot dies in slime + { + "Green has never been my color..."; + DEATH_SLIME1; + // 0 = random opponent + } //end type + type "death_drown" //initiated when the bot drowns + { + DEATH_DROWN0; + "It isn't that difficult to just breath water..."; + "So why can't I breath water?"; + // 0 = random opponent + } //end type + type "death_suicide" //initiated when bot blows self up with a weapon or craters + { + DEATH_SUICIDE2; + "So much for life and all of its cruel irony."; + "It is just easier for ", 0, " this way."; + + + // 0 = random opponent + } //end type + type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack + { + "Unsanitary."; + "What part of '~Don't touch me there' do you not understand?"; + DEATH_GAUNTLET1; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Gauntlet) + } //end type + type "death_rail" //initiated when the bot is killed by a rail gun shot + { + DEATH_INSULT0; + DEATH_FEM_INSULT1; + DEATH_INSULT5; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Railgun) + } //end type + type "death_bfg" //initiated when the bot died by a BFG + { + "Can't find a skill weapon? Or is it just that you suck?"; + "Over-compensating for something?"; + DEATH_BFG0; + DEATH_BFG2; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to BFG10K) + } //end type + type "death_insult" //insult initiated when the bot died + { + curse; + "This is far more painful than it looks."; + "One day, ", 0, " you me and a ", weapon, " are going to have a discussion."; + "Is that the best you can do?"; + DEATH_INSULT2; + DEATH_INSULT0; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + type "death_praise" //praise initiated when the bot died + { + "Not bad, ", 0, ", have you been practicing?"; + "I never saw it coming."; + D_PRAISE0; + D_PRAISE1; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + //====================================================== + //====================================================== + type "kill_rail" //initiated when the bot kills someone with rail gun + { + 0, ", you should stay down..."; + "*sigh* if only this was challenging."; + "I love this gun!"; + "Way too easy"; + // 0 = enemy name + } //end type + type "kill_gauntlet" //initiated when the bot kills someone with gauntlet + { + "LOL!"; + "Too easy"; + // 0 = enemy name + } //end type + type "kill_telefrag" //initiated when the bot telefragged someone + { + "LOL!"; + "Aww man... now I have to take a bath to get the brains out."; + "Does anyone have a quick way of getting brains out of your hair?"; + // 0 = enemy name + } //end type + type "kill_insult" //insult initiated when the bot killed someone + { + KILL_INSULT4; + "Why do you even bother?"; + "This is why the upper classes are called the 'ruling elite.'"; + "Why do the lower classes think they can match someone of my caliber?"; + + // 0 = enemy name + } //end type + type "kill_praise" //praise initiated when the bot killed someone + { + "You are getting better, ", 0, ", keep it up and you might actually win something."; + "That was a challenge."; + // 0 = enemy name + } //end type + //====================================================== + //====================================================== + type "random_insult" //insult initiated randomly (just when the bot feels like it) + { + TAUNT0; + TAUNT_FEM0; + TAUNT1; + curse; + "You should give up your ", substance, " addiction by next ", month, "."; + "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!"; + immaturity01; + "Your ", family_member, " needs to stop calling me."; + + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type + type "random_misc" //miscellanous chats initiated randomly + { + GRRLTALK0; + MISC4; + "Has anyone tried out the new ", 5, "? Is it worth the upgrade?"; + MISC1; + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type +} //end chat + diff --git a/q4base/botfiles/bots/jenna_w.c b/q4base/botfiles/bots/jenna_w.c new file mode 100644 index 00000000..9e064093 --- /dev/null +++ b/q4base/botfiles/bots/jenna_w.c @@ -0,0 +1,55 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +/*weapon defines weights 10-500 + try to keep it balanced*/ + +#include "inv.h" +//gauntlet +#define GTW 25 +//shotgun +#define SGW 150 +//machinegun +#define MGW 90 +//grenade launcher +#define GLW 110 +//rocket launcher +#define RLW 175 +//railgun +#define RGW 200 +//bfg10k +#define BFW 180 +//lightninggun +#define LGW 140 +//plasmagun +#define PGW 180 +//grapplinghook +#define GRW 10 +//prox-launcher +#define PXW 160 +//nailgun +#define NGW 210 +//chaingun +#define CGW 220 + +#include "fuzw.c" diff --git a/q4base/botfiles/bots/kyonshi_c.c b/q4base/botfiles/bots/kyonshi_c.c new file mode 100644 index 00000000..848ec4a0 --- /dev/null +++ b/q4base/botfiles/bots/kyonshi_c.c @@ -0,0 +1,203 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Kyonshi" + CHARACTERISTIC_GENDER "Female" + CHARACTERISTIC_ATTACK_SKILL 0.250 + CHARACTERISTIC_WEAPONWEIGHTS "bots/kyonshi_w.c" + CHARACTERISTIC_AIM_SKILL 0.250 + CHARACTERISTIC_AIM_ACCURACY 0.250 + CHARACTERISTIC_VIEW_FACTOR 0.250 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 2.00 + + CHARACTERISTIC_CHAT_FILE "bots/kyonshi_t.c" + CHARACTERISTIC_CHAT_NAME "kyonshi" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.900 + CHARACTERISTIC_CHAT_MISC 0.750 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000 + CHARACTERISTIC_CHAT_KILL 1.000 + CHARACTERISTIC_CHAT_DEATH 0.900 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000 + CHARACTERISTIC_CHAT_HITTALKING 0.900 + CHARACTERISTIC_CHAT_HITNODEATH 0.800 + CHARACTERISTIC_CHAT_HITNOKILL 1.000 + CHARACTERISTIC_CHAT_RANDOM 0.900 + CHARACTERISTIC_CHAT_REPLY 1.000 + + CHARACTERISTIC_CROUCHER 0.200 + CHARACTERISTIC_JUMPER 0.900 + CHARACTERISTIC_WALKER 0.000 + CHARACTERISTIC_WEAPONJUMPING 0.800 + CHARACTERISTIC_GRAPPLE_USER 0.500 + + CHARACTERISTIC_ITEMWEIGHTS "bots/kyonshi_i.c" + CHARACTERISTIC_AGGRESSION 0.250 + CHARACTERISTIC_SELFPRESERVATION 0.900 + CHARACTERISTIC_VENGEFULNESS 0.900 + CHARACTERISTIC_CAMPER 0.800 + + CHARACTERISTIC_EASY_FRAGGER 1.000 + CHARACTERISTIC_ALERTNESS 0.900 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.700 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.500 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.600 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.500 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.700 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.450 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.400 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.800 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.500 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.500 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.500 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.500 + + CHARACTERISTIC_FIRETHROTTLE 0.300 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Kyonshi" + CHARACTERISTIC_GENDER "Female" + CHARACTERISTIC_ATTACK_SKILL 1.000 + CHARACTERISTIC_WEAPONWEIGHTS "bots/kyonshi_w.c" + CHARACTERISTIC_AIM_SKILL 1.000 + CHARACTERISTIC_AIM_ACCURACY 1.000 + CHARACTERISTIC_VIEW_FACTOR 0.900 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.25 + + CHARACTERISTIC_CHAT_FILE "bots/kyonshi_t.c" + CHARACTERISTIC_CHAT_NAME "kyonshi" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.900 + CHARACTERISTIC_CHAT_MISC 0.750 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000 + CHARACTERISTIC_CHAT_KILL 1.000 + CHARACTERISTIC_CHAT_DEATH 0.900 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000 + CHARACTERISTIC_CHAT_HITTALKING 0.900 + CHARACTERISTIC_CHAT_HITNODEATH 0.800 + CHARACTERISTIC_CHAT_HITNOKILL 1.000 + CHARACTERISTIC_CHAT_RANDOM 0.900 + CHARACTERISTIC_CHAT_REPLY 1.000 + + CHARACTERISTIC_CROUCHER 0.100 + CHARACTERISTIC_JUMPER 1.000 + CHARACTERISTIC_WALKER 0.000 + CHARACTERISTIC_WEAPONJUMPING 1.000 + CHARACTERISTIC_GRAPPLE_USER 1.000 + + CHARACTERISTIC_ITEMWEIGHTS "bots/kyonshi_i.c" + CHARACTERISTIC_AGGRESSION 1.000 + CHARACTERISTIC_SELFPRESERVATION 0.000 + CHARACTERISTIC_VENGEFULNESS 1.000 + CHARACTERISTIC_CAMPER 0.700 + + CHARACTERISTIC_EASY_FRAGGER 1.000 + CHARACTERISTIC_ALERTNESS 0.900 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.900 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.900 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.900 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.900 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.900 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.900 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.900 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.900 + + CHARACTERISTIC_FIRETHROTTLE 0.300 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Kyonshi" + CHARACTERISTIC_GENDER "Female" + CHARACTERISTIC_ATTACK_SKILL 1.000 + CHARACTERISTIC_WEAPONWEIGHTS "bots/kyonshi_w.c" + CHARACTERISTIC_AIM_SKILL 1.000 + CHARACTERISTIC_AIM_ACCURACY 1.000 + CHARACTERISTIC_VIEW_FACTOR 1.000 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.00 + + CHARACTERISTIC_CHAT_FILE "bots/kyonshi_t.c" + CHARACTERISTIC_CHAT_NAME "kyonshi" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.900 + CHARACTERISTIC_CHAT_MISC 0.750 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000 + CHARACTERISTIC_CHAT_KILL 1.000 + CHARACTERISTIC_CHAT_DEATH 0.900 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000 + CHARACTERISTIC_CHAT_HITTALKING 0.900 + CHARACTERISTIC_CHAT_HITNODEATH 0.800 + CHARACTERISTIC_CHAT_HITNOKILL 1.000 + CHARACTERISTIC_CHAT_RANDOM 0.900 + CHARACTERISTIC_CHAT_REPLY 1.000 + + CHARACTERISTIC_CROUCHER 0.000 + CHARACTERISTIC_JUMPER 1.000 + CHARACTERISTIC_WALKER 0.000 + CHARACTERISTIC_WEAPONJUMPING 1.000 + CHARACTERISTIC_GRAPPLE_USER 1.000 + + CHARACTERISTIC_ITEMWEIGHTS "bots/kyonshi_i.c" + CHARACTERISTIC_AGGRESSION 1.000 + CHARACTERISTIC_SELFPRESERVATION 1.000 + CHARACTERISTIC_VENGEFULNESS 1.000 + CHARACTERISTIC_CAMPER 0.000 + + CHARACTERISTIC_EASY_FRAGGER 1.000 + CHARACTERISTIC_ALERTNESS 1.000 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 1.000 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.000 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.000 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.000 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.000 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.000 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.000 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.000 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.000 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.000 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.000 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.000 + + CHARACTERISTIC_FIRETHROTTLE 0.300 +} + diff --git a/q4base/botfiles/bots/kyonshi_i.c b/q4base/botfiles/bots/kyonshi_i.c new file mode 100644 index 00000000..71c6c30e --- /dev/null +++ b/q4base/botfiles/bots/kyonshi_i.c @@ -0,0 +1,74 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + +#define FPH 5 +#define FPA 3 + +#define SGW 200 +#define MGW 100 +#define GLW 150 +#define RLW 350 +#define RGW 500 +#define BFW 450 +#define LGW 200 +#define PGW 250 +#define PXW 350 +#define NGW 150 +#define CGW 200 + +#define GSGW 150 +#define GMGW 150 +#define GGLW 200 +#define GRLW 300 +#define GRGW 400 +#define GBFW 100 +#define GLGW 250 +#define GPGW 100 +#define GPXW 200 +#define GNGW 100 +#define GCGW 125 + +#define TELW 190 +#define MEDW 50 +#define QW 500 +#define ENVW 50 +#define HAW 50 +#define INW 400 +#define REGW 50 +#define FLW 160 +#define KAMW 200 +#define IBW 150 +#define PORW 300 +#define SCW 100 +#define GUW 200 +#define DUBW 100 +#define AMRW 400 +#define REDCW 200 +#define BLCW 200 + +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/kyonshi_t.c b/q4base/botfiles/bots/kyonshi_t.c new file mode 100644 index 00000000..e8ee39e1 --- /dev/null +++ b/q4base/botfiles/bots/kyonshi_t.c @@ -0,0 +1,212 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "kyonshi" +{ + #include "teamplay.h" + + type "game_enter" + { + "Ahh, there is so much chi here... I will feed well!"; + } + + type "game_exit" + { + "It's not easy being dead... so much to do so little time"; + "Toodles"; + "My hunger grows, I am off to find better chi."; + GOODBYE4; + GOODBYE2; + } + + type "level_start" + { + "Ooh ", 4, "! I like this place!"; + } + + type "level_end" + { + "Not bad... I like ", 4, " fast, clean, deadly, and filled with chi."; + } + + type "level_end_victory" + { + "You cannot kill what is already dead."; + "Thank you for your chi."; + } + + type "level_end_lose" + { + "Aww... crap!"; + } + + type "hit_talking" + { + "Do you MIND!"; + DEATH_TALKING; + DEATH_TALKING; + } + + type "hit_nodeath" + { + TAUNT_FEM0; + } + + type "hit_nokill" + { + HIT_NOKILL0; + HIT_NOKILL1; + HIT_NOKILL1; + } + + type "death_telefrag" + { + DEATH_TELEFRAGGED0; + + } + + type "death_cratered" + { + DEATH_FALLING0; + + } + + type "death_lava" + { + "So the dead can die..."; + } + + type "death_slime" + { + "I need a bath now."; + } + + type "death_drown" + { + "Much easier than my last death."; + } + + type "death_suicide" + { + DEATH_SUICIDE0; + } + + type "death_gauntlet" + { + "I did not see that coming."; + "The shame..."; + DEATH_FEM_INSULT0; + DEATH_GAUNTLET0; + DEATH_GAUNTLET1; + + } + + type "death_rail" + { + DEATH_RAIL1; + DEATH_RAIL0; + DEATH_FEM_INSULT1; + "Your death will not be quick."; + } + + type "death_bfg" + { + DEATH_BFG1; + DEATH_FEM_INSULT2; + "I feel you lack the skill to truly face me."; + } + + type "death_insult" + { + DEATH_FEM_INSULT0; + DEATH_FEM_INSULT2; + DEATH_FEM_INSULT1; + DEATH_FEM_INSULT3; + } + + type "death_praise" + { + "The NSA just told me to tell you, ", 0, ", that they liked that last move."; + 0, ", ~you suck!"; + "I almost didn't see it coming."; + } + + type "kill_rail" + { + DEATH_RAIL1; + DEATH_RAIL1; + DEATH_RAIL1; + } + + type "kill_gauntlet" + { + KILL_GAUNTLET0; + KILL_GAUNTLET1; + KILL_GAUNTLET2; + } + + type "kill_telefrag" + { + TELEFRAGGED0; + + } + + type "kill_suicide" + { + TAUNT_FEM0; + TAUNT0; + } + + type "kill_insult" + { + "*sigh*"; + "Oh puh-lease!"; + "You might want to put that gun down before you hurt yourself."; + "Pure luck."; + } + + type "kill_praise" + { + "~I'm impressed."; + } + + type "random_insult" + { + "An insignificant gnat will fall by the wayside."; + "Your ~mother needs to stop calling me."; + "Your ~mama is a necrophiliac."; + "douchebag"; + } + + type "random_misc" + { + GRRLTALK0; + GRRLTALK1; + "Do you ever get that not so fresh feeling? I do, but I am a corpse."; + 0, " die already so I can feast on your chi!"; + "~They're out there watching you as we speak."; + "Shh... ~they're listening."; + + + } +} diff --git a/q4base/botfiles/bots/kyonshi_w.c b/q4base/botfiles/bots/kyonshi_w.c new file mode 100644 index 00000000..dd1b364e --- /dev/null +++ b/q4base/botfiles/bots/kyonshi_w.c @@ -0,0 +1,41 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + +#define GTW 90 +#define SGW 400 +#define MGW 110 +#define GLW 220 +#define RLW 450 +#define RGW 300 +#define BFW 100 +#define LGW 220 +#define PGW 300 +#define GRW 50 +#define NGW 200 +#define PXW 150 +#define CGW 365 + +// +#include "fuzw.c" diff --git a/q4base/botfiles/bots/liz_c.c b/q4base/botfiles/bots/liz_c.c new file mode 100644 index 00000000..c58abede --- /dev/null +++ b/q4base/botfiles/bots/liz_c.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "liz" + CHARACTERISTIC_GENDER "it" + CHARACTERISTIC_ATTACK_SKILL 0.3 + CHARACTERISTIC_WEAPONWEIGHTS "bots/liz_w.c" + CHARACTERISTIC_AIM_SKILL 0.3 + CHARACTERISTIC_AIM_ACCURACY 0.3 + CHARACTERISTIC_VIEW_FACTOR 0.3 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 2.5 + + CHARACTERISTIC_CHAT_FILE "bots/liz_t.c" + CHARACTERISTIC_CHAT_NAME "liz" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 0.9 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.5 + CHARACTERISTIC_JUMPER 0.5 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 0.1 + + CHARACTERISTIC_ITEMWEIGHTS "bots/liz_i.c" + CHARACTERISTIC_AGGRESSION 0.3 + CHARACTERISTIC_SELFPRESERVATION 0.6 + CHARACTERISTIC_VENGEFULNESS 0.4 + CHARACTERISTIC_CAMPER 0.5 + + CHARACTERISTIC_EASY_FRAGGER 0.5 + CHARACTERISTIC_ALERTNESS 0.5 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.4 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.4 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.4 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.4 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.4 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.4 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.4 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.4 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.4 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.4 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.4 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.4 + + CHARACTERISTIC_FIRETHROTTLE 0.4 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Liz" + CHARACTERISTIC_GENDER "it" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/liz_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 0.9 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.75 + + CHARACTERISTIC_CHAT_FILE "bots/liz_t.c" + CHARACTERISTIC_CHAT_NAME "liz" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.5 + CHARACTERISTIC_JUMPER 0.5 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/liz_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 1.0 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.9 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.9 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.9 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.9 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.9 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.9 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.9 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.9 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.9 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.9 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.9 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Liz" + CHARACTERISTIC_GENDER "it" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/liz_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 1.0 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.0 + + CHARACTERISTIC_CHAT_FILE "bots/liz_t.c" + CHARACTERISTIC_CHAT_NAME "liz" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.5 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/liz_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.0 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.9 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.0 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} diff --git a/q4base/botfiles/bots/liz_i.c b/q4base/botfiles/bots/liz_i.c new file mode 100644 index 00000000..7d9335cc --- /dev/null +++ b/q4base/botfiles/bots/liz_i.c @@ -0,0 +1,120 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +//health +#define FPH 2 +//armor +#define FPA 2 +//without the weapons +//shotgun +#define SGW 290 +//machinegun +#define MGW 20 +//grenadelauncher +#define GLW 300 +//rocket launcher +#define RLW 350 +//rail gun +#define RGW 280 +//bfg10k +#define BFW 100 +//lightninggun +#define LGW 50 +//plasmagun +#define PGW 250 +//prox-launcher +#define PXW 350 +//nailgun +#define NGW 150 +//chaingun +#define CGW 200 + + + + +//with the weapons +//shotgun +#define GSGW 50 +//machinegun +#define GMGW 50 +//grenadelauncher +#define GGLW 400 +//rocketlauncher +#define GRLW 210 +//railgun +#define GRGW 50 +//bfg10k +#define GBFW 400 +//lightninggun +#define GLGW 50 +//plasmagun +#define GPGW 50 +//prox-launcher +#define GPXW 200 +//failgun +#define GNGW 100 +//chaingun +#define GCGW 125 +//individual powerups +//teleport +#define TELW 190 +//medkit +#define MEDW 50 +//quad-damage +#define QW 500 +//envirosuit +#define ENVW 50 +//haste +#define HAW 50 +//invisibility +#define INW 400 +//regeneration +#define REGW 50 +//flight +#define FLW 125 +//kamikaze +#define KAMW 200 +//invulnerability +#define IBW 150 +//portal +#define PORW 300 +//scout +#define SCW 100 +//guard +#define GUW 200 +//doubler +#define DUBW 100 +//ammo-regen +#define AMRW 400 +//red-cube +#define REDCW 200 +//blue-cube +#define BLCW 200 +//ctf flag weight +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/liz_t.c b/q4base/botfiles/bots/liz_t.c new file mode 100644 index 00000000..775a4604 --- /dev/null +++ b/q4base/botfiles/bots/liz_t.c @@ -0,0 +1,251 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "Liz" +{ + //the teamplay.h file is included for all kinds of teamplay chats + #include "teamplay.h" + //====================================================== + //====================================================== + type "game_enter" //initiated when the bot enters the game + { + HELLO1; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "game_exit" //initiated when the bot exits the game + { + GOODBYE1; + GOODBYE0; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "level_start" //initiated when a new level starts + { + HELLO2; + + // 0 = bot name + } //end type + type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings + { + 3, " sucks!"; + 2, ", I let you win."; + + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_victory" //initiated when a level ends and the bot is first in the rankings + { + LEVEL_END_VICTORY0; + LEVEL_END_VICTORY1; + + // 0 = bot name + // 1 = random opponent + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_lose" //initiated when a level ends and the bot is last in the rankings + { + 2, " must be an Arena Lord."; + 1, " kept getting in my way."; + 4, " has never been good to me."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 4 = level's title + } //end type + //====================================================== + //====================================================== + type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship + { + DEATH_TALKING; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult + { + "Try harder next time."; + "Wuss"; + "Heh, you suck."; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nokill" //bot hits an opponent but does not kill it + { + HIT_NOKILL0; + HIT_NOKILL1; + // 0 = opponent + } //end type + type "enemy_suicide" //enemy of the bot commits suicide + { + "LOL!"; + // 0 = enemy + } //end type + //====================================================== + //====================================================== + type "death_telefrag" //initiated when the bot is killed by a telefrag + { + DEATH_TELEFRAGGED0; + DEATH_TELEFRAGGED1; + // 0 = enemy name + } //end type + type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage + { + DEATH_FALLING0; + + // 0 = random opponent + } //end type + type "death_lava" //initiated when the bot dies in lava + { + "It burns!"; + "land conservation"; + DEATH_SUICIDE0; + DEATH_SUICIDE1; + // 0 = random opponent + } //end type + type "death_slime" //initiated when the bot dies in slime + { + DEATH_SLIME0; + DEATH_SLIME1; + // 0 = random opponent + } //end type + type "death_drown" //initiated when the bot drowns + { + "I can't swim!"; + + + // 0 = random opponent + } //end type + type "death_suicide" //initiated when bot blows self up with a weapon or craters + { + "Aww crap!"; + "Shutup!"; + "I meant to do that."; + DEATH_SUICIDE2; + DEATH_SUICIDE1; + + + // 0 = random opponent + } //end type + type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack + { + "D'oh!"; + DEATH_GAUNTLET0; + DEATH_GAUNTLET1; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Gauntlet) + } //end type + type "death_rail" //initiated when the bot is killed by a rail gun shot + { + DEATH_INSULT0; + DEATH_INSULT5; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Railgun) + } //end type + type "death_bfg" //initiated when the bot died by a BFG + { + DEATH_BFG0; + DEATH_BFG2; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to BFG10K) + } //end type + type "death_insult" //insult initiated when the bot died + { + DEATH_INSULT2; + DEATH_INSULT0; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + type "death_praise" //praise initiated when the bot died + { + + D_PRAISE0; + D_PRAISE1; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + //====================================================== + //====================================================== + type "kill_rail" //initiated when the bot kills someone with rail gun + { + KILL_RAIL1; + KILL_RAIL0; + // 0 = enemy name + } //end type + type "kill_gauntlet" //initiated when the bot kills someone with gauntlet + { + "LOL!"; + "Too easy"; + + + + // 0 = enemy name + } //end type + type "kill_telefrag" //initiated when the bot telefragged someone + { + "LOL!"; + TELEFRAGGED2; + // 0 = enemy name + } //end type + type "kill_insult" //insult initiated when the bot killed someone + { + KILL_INSULT4; + KILL_INSULT2; + + // 0 = enemy name + } //end type + type "kill_praise" //praise initiated when the bot killed someone + { + PRAISE0; + PRAISE1; + // 0 = enemy name + } //end type + //====================================================== + //====================================================== + type "random_insult" //insult initiated randomly (just when the bot feels like it) + { + "Your breath stinks"; + "Get off your dead butt and something for a change."; + "Life got you down? Give it up."; + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type + type "random_misc" //miscellanous chats initiated randomly + { + + GUYTALK1; + GRRLTALK0; + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type +} //end chat + diff --git a/q4base/botfiles/bots/liz_w.c b/q4base/botfiles/bots/liz_w.c new file mode 100644 index 00000000..545aec46 --- /dev/null +++ b/q4base/botfiles/bots/liz_w.c @@ -0,0 +1,55 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +/*weapon defines weights 10-500 + try to keep it balanced*/ + +#include "inv.h" +//gauntlet +#define GTW 50 +//shotgun +#define SGW 145 +//machinegun +#define MGW 75 +//grenade launcher +#define GLW 160 +//rocket launcher +#define RLW 200 +//railgun +#define RGW 190 +//bfg10k +#define BFW 110 +//lightninggun +#define LGW 100 +//plasmagun +#define PGW 175 +//grapplinghook +#define GRW 50 +//prox-launcher +#define PXW 180 +//nailgun +#define NGW 210 +//chaingun +#define CGW 165 + +#include "fuzw.c" diff --git a/q4base/botfiles/bots/major_c.c b/q4base/botfiles/bots/major_c.c new file mode 100644 index 00000000..a7b3b40b --- /dev/null +++ b/q4base/botfiles/bots/major_c.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Major" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 0.25 + CHARACTERISTIC_WEAPONWEIGHTS "bots/major_w.c" + CHARACTERISTIC_AIM_SKILL 0.25 + CHARACTERISTIC_AIM_ACCURACY 0.25 + CHARACTERISTIC_VIEW_FACTOR 0.25 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 2.0 + + CHARACTERISTIC_CHAT_FILE "bots/major_t.c" + CHARACTERISTIC_CHAT_NAME "Major" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.4 + CHARACTERISTIC_JUMPER 0.5 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 0.9 + CHARACTERISTIC_GRAPPLE_USER 0.5 + + CHARACTERISTIC_ITEMWEIGHTS "bots/major_i.c" + CHARACTERISTIC_AGGRESSION 0.8 + CHARACTERISTIC_SELFPRESERVATION 0.5 + CHARACTERISTIC_VENGEFULNESS 0.9 + CHARACTERISTIC_CAMPER 0.25 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 0.95 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.5 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.5 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.5 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.9 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.5 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.5 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.5 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.5 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.5 + + CHARACTERISTIC_FIRETHROTTLE 0.5 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Major" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/major_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 0.9 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.0 + + CHARACTERISTIC_CHAT_FILE "bots/major_t.c" + CHARACTERISTIC_CHAT_NAME "Major" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.3 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/major_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.3 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 0.98 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.8 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.9 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.8 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.7 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.7 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.75 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.9 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.9 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.8 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.8 + + CHARACTERISTIC_FIRETHROTTLE 0.5 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Major" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/major_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 1.0 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.0 + + CHARACTERISTIC_CHAT_FILE "bots/major_t.c" + CHARACTERISTIC_CHAT_NAME "Major" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.2 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/major_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.0 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.9 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.0 + + CHARACTERISTIC_FIRETHROTTLE 0.5 +} diff --git a/q4base/botfiles/bots/major_i.c b/q4base/botfiles/bots/major_i.c new file mode 100644 index 00000000..713561f3 --- /dev/null +++ b/q4base/botfiles/bots/major_i.c @@ -0,0 +1,120 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +//health +#define FPH 5 +//armor +#define FPA 3 +//without the weapons +//shotgun +#define SGW 350 +//machinegun +#define MGW 50 +//grenadelauncher +#define GLW 300 +//rocket launcher +#define RLW 350 +//rail gun +#define RGW 500 +//bfg10k +#define BFW 200 +//lightninggun +#define LGW 150 +//plasmagun +#define PGW 375 +//prox-launcher +#define PXW 150 +//nailgun +#define NGW 275 +//chaingun +#define CGW 350 + + + + +//with the weapons +//shotgun +#define GSGW 100 +//machinegun +#define GMGW 50 +//grenadelauncher +#define GGLW 300 +//rocketlauncher +#define GRLW 110 +//railgun +#define GRGW 350 +//bfg10k +#define GBFW 100 +//lightninggun +#define GLGW 75 +//plasmagun +#define GPGW 250 +//prox-launcher +#define GPXW 100 +//failgun +#define GNGW 190 +//chaingun +#define GCGW 300 +//individual powerups +//teleport +#define TELW 190 +//medkit +#define MEDW 150 +//quad-damage +#define QW 400 +//envirosuit +#define ENVW 150 +//haste +#define HAW 350 +//invisibility +#define INW 150 +//regeneration +#define REGW 450 +//flight +#define FLW 125 +//kamikaze +#define KAMW 150 +//invulnerability +#define IBW 190 +//portal +#define PORW 200 +//scout +#define SCW 250 +//guard +#define GUW 190 +//doubler +#define DUBW 150 +//ammo-regen +#define AMRW 150 +//red-cube +#define REDCW 200 +//blue-cube +#define BLCW 200 +//ctf flag weight +#define FGW 500 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/major_t.c b/q4base/botfiles/bots/major_t.c new file mode 100644 index 00000000..fa5a948d --- /dev/null +++ b/q4base/botfiles/bots/major_t.c @@ -0,0 +1,290 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "Major" +{ + //the teamplay.h file is included for all kinds of teamplay chats + #include "teamplay.h" + //====================================================== + //====================================================== + type "game_enter" //initiated when the bot enters the game + { + "Hello."; + "Are you prepared for pain?"; + HELLO1; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "game_exit" //initiated when the bot exits the game + { + "Look at the ~time"; + 4, " kinda wears on me, I think I'll find a different server, later ~peeps"; + GOODBYE1; + GOODBYE0; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "level_start" //initiated when a new level starts + { + 0, " it is time for some payback!"; + 1, " you are going to have some pain in ", 4, "."; + HELLO2; + + // 0 = bot name + } //end type + type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings + { + "HA! ", 3, " is at the bottom, as usual."; + 2, ", I let you win."; + 4, " has changed a lot, it is much faster now."; + "Is it over yet?"; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_victory" //initiated when a level ends and the bot is first in the rankings + { + 3, " you need to practice more... and forget about winning against me."; + LEVEL_END_VICTORY1; + "I really like ", 4, " since they fixed it, it is so easy to win!"; + "Next time, don't bother."; + // 0 = bot name + // 1 = random opponent + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_lose" //initiated when a level ends and the bot is last in the rankings + { + 2, " cheated."; + "I had a hang nail, so of course I lost."; + "Scheisse!"; + "So much for my bluster..."; + "I felt bad for you so I let you win."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 4 = level's title + } //end type + //====================================================== + //====================================================== + type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship + { + 0, ", didn't your mother ever tell you it was rude to interrupt a conversation?"; + "I am going to shove that ", 1, " down your throat if you do that again!"; + "Hey asshole! I was trying to hold a conversation here... do you mind?"; + DEATH_TALKING; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult + { + 1, " is not a good weapon, a ", weapon, " should be more your speed."; + "You need to aim better."; + "Try harder next time."; + curse; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nokill" //bot hits an opponent but does not kill it + { + 0, " must be cheating."; + "Dammit! Why won't you die?!?"; + "Well that sucked..."; + "Note to self... turn off safety next ~time"; + // 0 = opponent + } //end type + type "enemy_suicide" //enemy of the bot commits suicide + { + "Stop smoking ", substance, " and maybe you won't kill yourself so often."; + "Tired of life, ", 0, "? Give it up."; + "I guess that beats dying of ", disease, "..."; + // 0 = enemy + } //end type + //====================================================== + //====================================================== + type "death_telefrag" //initiated when the bot is killed by a telefrag + { + "I hate praetorian impressions."; + "My ", counselor, " warned about days like this."; + "Son of a bitch..."; + "Scheisse"; + "D'oh!"; + DEATH_TELEFRAGGED1; + // 0 = enemy name + } //end type + type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage + { + DEATH_FALLING0; + "It didn't look that high from up there..."; + "*sigh*"; + // 0 = random opponent + } //end type + type "death_lava" //initiated when the bot dies in lava + { + "Well... it beats a case of hypothermia."; + "At least it is warm here"; + DEATH_SUICIDE1; + // 0 = random opponent + } //end type + type "death_slime" //initiated when the bot dies in slime + { + "Green has never been my color..."; + DEATH_SLIME1; + // 0 = random opponent + } //end type + type "death_drown" //initiated when the bot drowns + { + DEATH_DROWN0; + "It isn't that difficult to just breath water..."; + "So why can't I breath water?"; + // 0 = random opponent + } //end type + type "death_suicide" //initiated when bot blows self up with a weapon or craters + { + DEATH_SUICIDE2; + "So much for life and all of its cruel irony."; + "It is just easier for ", 0, " this way."; + + + // 0 = random opponent + } //end type + type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack + { + "Unsanitary."; + "What part of '~Don't touch me there' do you not understand?"; + DEATH_GAUNTLET1; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Gauntlet) + } //end type + type "death_rail" //initiated when the bot is killed by a rail gun shot + { + DEATH_INSULT0; + DEATH_FEM_INSULT1; + DEATH_INSULT5; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Railgun) + } //end type + type "death_bfg" //initiated when the bot died by a BFG + { + "Can't find a skill weapon? Or is it just that you suck?"; + "Over-compensating for something?"; + DEATH_BFG0; + DEATH_BFG2; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to BFG10K) + } //end type + type "death_insult" //insult initiated when the bot died + { + curse; + "This is far more painful than it looks."; + "One day, ", 0, " you me and a ", weapon, " are going to have a discussion."; + "Is that the best you can do?"; + DEATH_INSULT2; + DEATH_INSULT0; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + type "death_praise" //praise initiated when the bot died + { + "Not bad, ", 0, ", have you been practicing?"; + "I never saw it coming."; + D_PRAISE0; + D_PRAISE1; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + //====================================================== + //====================================================== + type "kill_rail" //initiated when the bot kills someone with rail gun + { + 0, ", you should stay down..."; + "*sigh* if only this was challenging."; + "I love this gun!"; + "Way too easy"; + // 0 = enemy name + } //end type + type "kill_gauntlet" //initiated when the bot kills someone with gauntlet + { + "LOL!"; + "Too easy"; + // 0 = enemy name + } //end type + type "kill_telefrag" //initiated when the bot telefragged someone + { + "LOL!"; + "Aww man... now I have to take a bath to get the brains out."; + "Does anyone have a quick way of getting brains out of your hair?"; + // 0 = enemy name + } //end type + type "kill_insult" //insult initiated when the bot killed someone + { + KILL_INSULT4; + "Why do you even bother?"; + "This is why the upper classes are called the 'ruling elite.'"; + "Why do the lower classes think they can match someone of my caliber?"; + + // 0 = enemy name + } //end type + type "kill_praise" //praise initiated when the bot killed someone + { + "You are getting better, ", 0, ", keep it up and you might actually win something."; + "That was a challenge."; + // 0 = enemy name + } //end type + //====================================================== + //====================================================== + type "random_insult" //insult initiated randomly (just when the bot feels like it) + { + TAUNT0; + TAUNT_FEM0; + TAUNT1; + curse; + "You should give up your ", substance, " addiction by next ", month, "."; + "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!"; + immaturity01; + "Your ", family_member, " needs to stop calling me."; + + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type + type "random_misc" //miscellanous chats initiated randomly + { + "No, really... Who let the dogs out?"; + GRRLTALK0; + MISC4; + "Has anyone tried out the new ", 5, "? Is it worth the upgrade?"; + MISC1; + "You would be surprised what you can do with a ", animal, " a ", food, " and ", peeps, "."; + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type +} //end chat + diff --git a/q4base/botfiles/bots/major_w.c b/q4base/botfiles/bots/major_w.c new file mode 100644 index 00000000..266158ef --- /dev/null +++ b/q4base/botfiles/bots/major_w.c @@ -0,0 +1,55 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +/*weapon defines weights 10-500 + try to keep it balanced*/ + +#include "inv.h" +//gauntlet +#define GTW 90 +//shotgun +#define SGW 290 +//machinegun +#define MGW 130 +//grenade launcher +#define GLW 175 +//rocket launcher +#define RLW 300 +//railgun +#define RGW 500 +//bfg10k +#define BFW 200 +//lightninggun +#define LGW 190 +//plasmagun +#define PGW 200 +//grapplinghook +#define GRW 50 +//prox-launcher +#define PXW 175 +//nailgun +#define NGW 200 +//chaingun +#define CGW 260 + +#include "fuzw.c" diff --git a/q4base/botfiles/bots/merman_c.c b/q4base/botfiles/bots/merman_c.c new file mode 100644 index 00000000..bf3ba9bc --- /dev/null +++ b/q4base/botfiles/bots/merman_c.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Merman" + CHARACTERISTIC_GENDER "male" + CHARACTERISTIC_ATTACK_SKILL 0.25 + CHARACTERISTIC_WEAPONWEIGHTS "bots/merman_w.c" + CHARACTERISTIC_AIM_SKILL 0.25 + CHARACTERISTIC_AIM_ACCURACY 0.25 + CHARACTERISTIC_VIEW_FACTOR 0.25 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 3.0 + + CHARACTERISTIC_CHAT_FILE "bots/merman_t.c" + CHARACTERISTIC_CHAT_NAME "Merman" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.5 + CHARACTERISTIC_JUMPER 0.5 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 0.5 + CHARACTERISTIC_GRAPPLE_USER 0.5 + + CHARACTERISTIC_ITEMWEIGHTS "bots/merman_i.c" + CHARACTERISTIC_AGGRESSION 0.25 + CHARACTERISTIC_SELFPRESERVATION 0.5 + CHARACTERISTIC_VENGEFULNESS 0.25 + CHARACTERISTIC_CAMPER 0.25 + + CHARACTERISTIC_EASY_FRAGGER 0.5 + CHARACTERISTIC_ALERTNESS 0.5 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.4 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.2 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.5 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.7 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.3 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.5 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.5 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.5 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.5 + + CHARACTERISTIC_FIRETHROTTLE 0.3 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Merman" + CHARACTERISTIC_GENDER "male" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/merman_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 0.9 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.75 + + CHARACTERISTIC_CHAT_FILE "bots/merman_t.c" + CHARACTERISTIC_CHAT_NAME "Merman" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.5 + CHARACTERISTIC_JUMPER 0.5 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/merman_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.5 + + CHARACTERISTIC_EASY_FRAGGER 0.05 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.9 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.8 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.8 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.8 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.8 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.8 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.6 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.7 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.975 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.975 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.975 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.975 + + CHARACTERISTIC_FIRETHROTTLE 0.3 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Merman" + CHARACTERISTIC_GENDER "male" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/merman_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 1.0 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.0 + + CHARACTERISTIC_CHAT_FILE "bots/merman_t.c" + CHARACTERISTIC_CHAT_NAME "Merman" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.5 + CHARACTERISTIC_JUMPER 0.5 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/merman_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.0 + + CHARACTERISTIC_EASY_FRAGGER 0.001 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.0 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} diff --git a/q4base/botfiles/bots/merman_i.c b/q4base/botfiles/bots/merman_i.c new file mode 100644 index 00000000..68783f62 --- /dev/null +++ b/q4base/botfiles/bots/merman_i.c @@ -0,0 +1,120 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +//health +#define FPH 4 +//armor +#define FPA 3 +//without the weapons +//shotgun +#define SGW 100 +//machinegun +#define MGW 50 +//grenadelauncher +#define GLW 200 +//rocket launcher +#define RLW 320 +//rail gun +#define RGW 170 +//bfg10k +#define BFW 300 +//lightninggun +#define LGW 185 +//plasmagun +#define PGW 260 +//prox-launcher +#define PXW 380 +//nailgun +#define NGW 150 +//chaingun +#define CGW 200 + + + + +//with the weapons +//shotgun +#define GSGW 50 +//machinegun +#define GMGW 50 +//grenadelauncher +#define GGLW 100 +//rocketlauncher +#define GRLW 110 +//railgun +#define GRGW 50 +//bfg10k +#define GBFW 100 +//lightninggun +#define GLGW 120 +//plasmagun +#define GPGW 50 +//prox-launcher +#define GPXW 200 +//failgun +#define GNGW 100 +//chaingun +#define GCGW 125 +//individual powerups +//teleport +#define TELW 190 +//medkit +#define MEDW 150 +//quad-damage +#define QW 200 +//envirosuit +#define ENVW 50 +//haste +#define HAW 50 +//invisibility +#define INW 140 +//regeneration +#define REGW 50 +//flight +#define FLW 160 +//kamikaze +#define KAMW 290 +//invulnerability +#define IBW 150 +//portal +#define PORW 300 +//scout +#define SCW 190 +//guard +#define GUW 280 +//doubler +#define DUBW 100 +//ammo-regen +#define AMRW 140 +//red-cube +#define REDCW 200 +//blue-cube +#define BLCW 200 +//ctf flag weight +#define FGW 450 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/merman_t.c b/q4base/botfiles/bots/merman_t.c new file mode 100644 index 00000000..2c9cfd73 --- /dev/null +++ b/q4base/botfiles/bots/merman_t.c @@ -0,0 +1,285 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "Merman" +{ + //the teamplay.h file is included for all kinds of teamplay chats + #include "teamplay.h" + //====================================================== + //====================================================== + type "game_enter" //initiated when the bot enters the game + { + "Shutup!"; + "Rectum? It nearly killed him!"; + 0, " is a loser!"; + "Now that your mother is gone..."; + HELLO1; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "game_exit" //initiated when the bot exits the game + { + "Your mother is here, got to go."; + "Aurevoir mes amis."; + 4, " is too slow for me, audios."; + GOODBYE1; + GOODBYE0; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "level_start" //initiated when a new level starts + { + "Worst level ever!"; + 0, " is gonna pay."; + + HELLO2; + + // 0 = bot name + } //end type + type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings + { + 3, " sucks!"; + 2, ", I let you win."; + + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_victory" //initiated when a level ends and the bot is first in the rankings + { + LEVEL_END_VICTORY0; + LEVEL_END_VICTORY1; + + // 0 = bot name + // 1 = random opponent + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_lose" //initiated when a level ends and the bot is last in the rankings + { + 2, " must be an Arena Lord."; + 1, " kept getting in my way."; + 4, " has never been good to me."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 4 = level's title + } //end type + //====================================================== + //====================================================== + type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship + { + "Son of a... you shall pay for that!"; + "Infidel!!!"; + "Jerkwad"; + "Schmuck"; + "Tosser"; + DEATH_TALKING; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult + { + "Try harder next time."; + "Wuss"; + "Heh, you suck."; + "Nice shooting Tex, you need to take lessons from Dick."; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nokill" //bot hits an opponent but does not kill it + { + HIT_NOKILL0; + HIT_NOKILL1; + // 0 = opponent + } //end type + type "enemy_suicide" //enemy of the bot commits suicide + { + "LOL!"; + // 0 = enemy + } //end type + //====================================================== + //====================================================== + type "death_telefrag" //initiated when the bot is killed by a telefrag + { + DEATH_TELEFRAGGED0; + DEATH_TELEFRAGGED1; + // 0 = enemy name + } //end type + type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage + { + DEATH_FALLING0; + + // 0 = random opponent + } //end type + type "death_lava" //initiated when the bot dies in lava + { + "It burns!"; + "land conservation"; + DEATH_SUICIDE0; + DEATH_SUICIDE1; + // 0 = random opponent + } //end type + type "death_slime" //initiated when the bot dies in slime + { + DEATH_SLIME0; + DEATH_SLIME1; + // 0 = random opponent + } //end type + type "death_drown" //initiated when the bot drowns + { + "The gills are vestigial..."; + "Someone needs to explain this..."; + "I should learn to use my gills..."; + "I can't swim!"; + + + // 0 = random opponent + } //end type + type "death_suicide" //initiated when bot blows self up with a weapon or craters + { + "Aww crap!"; + "Shutup!"; + DEATH_SUICIDE2; + DEATH_SUICIDE1; + + + // 0 = random opponent + } //end type + type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack + { + "Humiliating."; + "D'oh!"; + DEATH_GAUNTLET0; + DEATH_GAUNTLET1; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Gauntlet) + } //end type + type "death_rail" //initiated when the bot is killed by a rail gun shot + { + DEATH_INSULT0; + DEATH_INSULT5; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Railgun) + } //end type + type "death_bfg" //initiated when the bot died by a BFG + { + DEATH_BFG0; + DEATH_BFG2; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to BFG10K) + } //end type + type "death_insult" //insult initiated when the bot died + { + "Always look on the bright side of death."; + "pfff"; + "Wuss"; + "Sissy"; + DEATH_INSULT2; + DEATH_INSULT0; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + type "death_praise" //praise initiated when the bot died + { + + D_PRAISE0; + D_PRAISE1; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + //====================================================== + //====================================================== + type "kill_rail" //initiated when the bot kills someone with rail gun + { + KILL_RAIL1; + KILL_RAIL0; + // 0 = enemy name + } //end type + type "kill_gauntlet" //initiated when the bot kills someone with gauntlet + { + "LOL!"; + "Too easy"; + "Get whacked!"; + "It's whack time!"; + "I'm saving my best whack for ", 0, "."; + // 0 = enemy name + } //end type + type "kill_telefrag" //initiated when the bot telefragged someone + { + "LOL!"; + TELEFRAGGED2; + // 0 = enemy name + } //end type + type "kill_insult" //insult initiated when the bot killed someone + { + "I just made my perfect world, oops you're gone."; + KILL_INSULT4; + KILL_INSULT2; + + // 0 = enemy name + } //end type + type "kill_praise" //praise initiated when the bot killed someone + { + PRAISE0; + PRAISE1; + // 0 = enemy name + } //end type + //====================================================== + //====================================================== + type "random_insult" //insult initiated randomly (just when the bot feels like it) + { + "Your breath stinks"; + "Get a hair cut"; + "Get a real job"; + "Get a life"; + TAUNT0; + TAUNT1; + + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type + type "random_misc" //miscellanous chats initiated randomly + { + "Has anyone found the chocolate bar yet?"; + "Let's go to Denny's and watch the floor show, you're buying."; + "Love is the devil's toy."; + "Did you hear about ", 0, " in ", 4, "? I'd be ashamed of myself if I did that."; + "Never trust a hippy."; + 4, " Uber Alles!"; + "I am all that is fish."; + "Gamers are the whiniest bunch!"; + GUYTALK1; + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type +} //end chat + diff --git a/q4base/botfiles/bots/merman_w.c b/q4base/botfiles/bots/merman_w.c new file mode 100644 index 00000000..eb91a3c5 --- /dev/null +++ b/q4base/botfiles/bots/merman_w.c @@ -0,0 +1,55 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +/*weapon defines weights 10-500 + try to keep it balanced*/ + +#include "inv.h" +//gauntlet +#define GTW 50 +//shotgun +#define SGW 375 +//machinegun +#define MGW 115 +//grenade launcher +#define GLW 275 +//rocket launcher +#define RLW 190 +//railgun +#define RGW 150 +//bfg10k +#define BFW 210 +//lightninggun +#define LGW 215 +//plasmagun +#define PGW 190 +//grapplinghook +#define GRW 50 +//prox-launcher +#define PXW 310 +//nailgun +#define NGW 410 +//chaingun +#define CGW 175 + +#include "fuzw.c" diff --git a/q4base/botfiles/bots/neko_c.c b/q4base/botfiles/bots/neko_c.c new file mode 100644 index 00000000..d9c03783 --- /dev/null +++ b/q4base/botfiles/bots/neko_c.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Neko" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 0.3 + CHARACTERISTIC_WEAPONWEIGHTS "bots/Neko_w.c" + CHARACTERISTIC_AIM_SKILL 0.3 + CHARACTERISTIC_AIM_ACCURACY 0.3 + CHARACTERISTIC_VIEW_FACTOR 0.3 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 1.5 + + CHARACTERISTIC_CHAT_FILE "bots/Neko_t.c" + CHARACTERISTIC_CHAT_NAME "Neko" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 0.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 0.5 + CHARACTERISTIC_GRAPPLE_USER 0.5 + + CHARACTERISTIC_ITEMWEIGHTS "bots/Neko_i.c" + CHARACTERISTIC_AGGRESSION 0.25 + CHARACTERISTIC_SELFPRESERVATION 0.5 + CHARACTERISTIC_VENGEFULNESS 0.25 + CHARACTERISTIC_CAMPER 0.25 + + CHARACTERISTIC_EASY_FRAGGER 0.5 + CHARACTERISTIC_ALERTNESS 0.5 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.43 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.43 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.43 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.43 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.43 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.43 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.43 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.43 + + CHARACTERISTIC_FIRETHROTTLE 0.43 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Neko" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/Neko_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 0.9 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.75 + + CHARACTERISTIC_CHAT_FILE "bots/Neko_t.c" + CHARACTERISTIC_CHAT_NAME "Neko" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.1 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/Neko_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.5 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.95 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.95 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.95 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.95 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.95 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.95 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.95 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.95 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.95 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.95 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.95 + + CHARACTERISTIC_FIRETHROTTLE 0.1 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Neko" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/Neko_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 1.0 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.0 + + CHARACTERISTIC_CHAT_FILE "bots/Neko_t.c" + CHARACTERISTIC_CHAT_NAME "Neko" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/Neko_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.0 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.0 + + CHARACTERISTIC_FIRETHROTTLE 0.01 +} diff --git a/q4base/botfiles/bots/neko_i.c b/q4base/botfiles/bots/neko_i.c new file mode 100644 index 00000000..79f4b555 --- /dev/null +++ b/q4base/botfiles/bots/neko_i.c @@ -0,0 +1,120 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +//health +#define FPH 2 +//armor +#define FPA 2 +//without the weapons +//shotgun +#define SGW 200 +//machinegun +#define MGW 50 +//grenadelauncher +#define GLW 300 +//rocket launcher +#define RLW 400 +//rail gun +#define RGW 260 +//bfg10k +#define BFW 350 +//lightninggun +#define LGW 50 +//plasmagun +#define PGW 250 +//prox-launcher +#define PXW 350 +//nailgun +#define NGW 150 +//chaingun +#define CGW 200 + + + + +//with the weapons +//shotgun +#define GSGW 50 +//machinegun +#define GMGW 50 +//grenadelauncher +#define GGLW 400 +//rocketlauncher +#define GRLW 210 +//railgun +#define GRGW 50 +//bfg10k +#define GBFW 400 +//lightninggun +#define GLGW 50 +//plasmagun +#define GPGW 50 +//prox-launcher +#define GPXW 200 +//failgun +#define GNGW 100 +//chaingun +#define GCGW 125 +//individual powerups +//teleport +#define TELW 190 +//medkit +#define MEDW 50 +//quad-damage +#define QW 500 +//envirosuit +#define ENVW 50 +//haste +#define HAW 50 +//invisibility +#define INW 400 +//regeneration +#define REGW 50 +//flight +#define FLW 175 +//kamikaze +#define KAMW 200 +//invulnerability +#define IBW 150 +//portal +#define PORW 300 +//scout +#define SCW 100 +//guard +#define GUW 200 +//doubler +#define DUBW 100 +//ammo-regen +#define AMRW 400 +//red-cube +#define REDCW 200 +//blue-cube +#define BLCW 200 +//ctf flag weight +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/neko_t.c b/q4base/botfiles/bots/neko_t.c new file mode 100644 index 00000000..eaa7a46f --- /dev/null +++ b/q4base/botfiles/bots/neko_t.c @@ -0,0 +1,285 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "Neko" +{ + //the teamplay.h file is included for all kinds of teamplay chats + #include "teamplay.h" + //====================================================== + //====================================================== + type "game_enter" //initiated when the bot enters the game + { + "mew :3"; + "Are you prepared for pain?"; + HELLO1; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "game_exit" //initiated when the bot exits the game + { + "Look at the ~time"; + 4, " kinda wears on me, I think I'll find a different server, later ~peeps"; + GOODBYE1; + GOODBYE0; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "level_start" //initiated when a new level starts + { + 0, " it is time for some payback!"; + 1, " youll death, i'm expects it in ", 4, " lol"; + HELLO2; + + // 0 = bot name + } //end type + type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings + { + "HA! ", 3, " is at the bottom, as usual."; + 2, ", I let you win."; + 4, " is can see improved."; + "Is it over yet?"; + "..."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_victory" //initiated when a level ends and the bot is first in the rankings + { + 3, " nice try you roose"; + "The cat out of bag"; + "<=^_^=>"; + // 0 = bot name + // 1 = random opponent + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_lose" //initiated when a level ends and the bot is last in the rankings + { + 2, " is real loser I not!"; + "The cat in bag"; + "..."; + "hS"; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 4 = level's title + } //end type + //====================================================== + //====================================================== + type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship + { + 0, " that was rude ^._.^"; + "I do not like is the interruption"; + "What if i came to you house and peek in you shower would you like that?"; + "What if i came to you dinner and at the steal of you food?"; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult + { + "No!"; + "Yes!"; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nokill" //bot hits an opponent but does not kill it + { + 0, " go down"; + "*HISS*"; + "..."; + // 0 = opponent + } //end type + type "enemy_suicide" //enemy of the bot commits suicide + { + "Cat got you tongue!"; + "..."; + "..."; + // 0 = enemy + } //end type + //====================================================== + //====================================================== + type "death_telefrag" //initiated when the bot is killed by a telefrag + { + "do not want"; + "..."; + "..."; + DEATH_TELEFRAGGED1; + // 0 = enemy name + } //end type + type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage + { + DEATH_FALLING0; + "Aw, and I randed on my feet too!"; + ">_<"; + // 0 = random opponent + } //end type + type "death_lava" //initiated when the bot dies in lava + { + "I am too hot!!"; + "Fur bad on lava"; + DEATH_SUICIDE1; + // 0 = random opponent + } //end type + type "death_slime" //initiated when the bot dies in slime + { + "I don't like to take a srime bath!"; + DEATH_SLIME1; + // 0 = random opponent + } //end type + type "death_drown" //initiated when the bot drowns + { + DEATH_DROWN0; + "*HISS* I HATE WATER"; + "WATER NO"; + // 0 = random opponent + } //end type + type "death_suicide" //initiated when bot blows self up with a weapon or craters + { + DEATH_SUICIDE2; + "..."; + "Oops. Ah well one less live of many to go!"; + + + // 0 = random opponent + } //end type + type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack + { + "*HISS*"; + "You tore my special leather laced top, now i'm naked :("; + "That is a wrong way to pet a cat"; + DEATH_GAUNTLET1; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Gauntlet) + } //end type + type "death_rail" //initiated when the bot is killed by a rail gun shot + { + DEATH_INSULT0; + DEATH_FEM_INSULT1; + DEATH_INSULT5; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Railgun) + } //end type + type "death_bfg" //initiated when the bot died by a BFG + { + "Can't find a skill weapon? Or is it just that you suck?"; + "Over-compensating for something?"; + DEATH_BFG0; + DEATH_BFG2; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to BFG10K) + } //end type + type "death_insult" //insult initiated when the bot died + { + curse; + "This is far more painful than it looks."; + "One day, ", 0, " you me and a ", weapon, " are going to have a discussion."; + "Is that the best you can do?"; + DEATH_INSULT2; + DEATH_INSULT0; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + type "death_praise" //praise initiated when the bot died + { + "Not bad, ", 0, ", have you been practicing?"; + "I never saw it coming."; + D_PRAISE0; + D_PRAISE1; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + //====================================================== + //====================================================== + type "kill_rail" //initiated when the bot kills someone with rail gun + { + 0, ", you should stay down..."; + "*sigh* if only this was challenging."; + "I love this gun!"; + "Way too easy"; + // 0 = enemy name + } //end type + type "kill_gauntlet" //initiated when the bot kills someone with gauntlet + { + "LOL!"; + "Too easy"; + // 0 = enemy name + } //end type + type "kill_telefrag" //initiated when the bot telefragged someone + { + "LOL!"; + "Aww man... now I have to take a bath to get the brains out."; + "Does anyone have a quick way of getting brains out of your hair?"; + // 0 = enemy name + } //end type + type "kill_insult" //insult initiated when the bot killed someone + { + KILL_INSULT4; + "Why do you even bother?"; + + + // 0 = enemy name + } //end type + type "kill_praise" //praise initiated when the bot killed someone + { + "You are getting better, ", 0, ", keep it up and you might actually win something."; + + // 0 = enemy name + } //end type + //====================================================== + //====================================================== + type "random_insult" //insult initiated randomly (just when the bot feels like it) + { + TAUNT0; + TAUNT_FEM0; + TAUNT1; + "You should give up your ", substance, " addiction by next ", month, "."; + "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!"; + immaturity01; + "Your ", family_member, " needs to stop calling me."; + + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type + type "random_misc" //miscellanous chats initiated randomly + { + "this one time, at band camp..."; + GRRLTALK1; + MISC4; + "Has anyone tried out the new ", 5, "? Is it worth the upgrade?"; + MISC1; + "You would be surprised what you can do with a ", animal, " a ", food, " and ", peeps, "."; + "Next time you see ", peeps, " tell 'em to call me, mmmkay?"; + neuterbot, " is cute."; + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type +} //end chat + diff --git a/q4base/botfiles/bots/neko_w.c b/q4base/botfiles/bots/neko_w.c new file mode 100644 index 00000000..85e23e4a --- /dev/null +++ b/q4base/botfiles/bots/neko_w.c @@ -0,0 +1,55 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +/*weapon defines weights 10-500 + try to keep it balanced*/ + +#include "inv.h" +//gauntlet +#define GTW 10 +//shotgun +#define SGW 180 +//machinegun +#define MGW 75 +//grenade launcher +#define GLW 170 +//rocket launcher +#define RLW 160 +//railgun +#define RGW 250 +//bfg10k +#define BFW 90 +//lightninggun +#define LGW 200 +//plasmagun +#define PGW 110 +//grapplinghook +#define GRW 10 +//prox-launcher +#define PXW 160 +//nailgun +#define NGW 200 +//chaingun +#define CGW 175 + +#include "fuzw.c" diff --git a/q4base/botfiles/bots/penguin_c.c b/q4base/botfiles/bots/penguin_c.c new file mode 100644 index 00000000..10516382 --- /dev/null +++ b/q4base/botfiles/bots/penguin_c.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Penguin" + CHARACTERISTIC_GENDER "male" + CHARACTERISTIC_ATTACK_SKILL 0.25 + CHARACTERISTIC_WEAPONWEIGHTS "bots/penguin_w.c" + CHARACTERISTIC_AIM_SKILL 0.25 + CHARACTERISTIC_AIM_ACCURACY 0.25 + CHARACTERISTIC_VIEW_FACTOR 0.25 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 3.0 + + CHARACTERISTIC_CHAT_FILE "bots/penguin_t.c" + CHARACTERISTIC_CHAT_NAME "penguin" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 0.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 0.5 + CHARACTERISTIC_GRAPPLE_USER 0.5 + + CHARACTERISTIC_ITEMWEIGHTS "bots/penguin_i.c" + CHARACTERISTIC_AGGRESSION 0.25 + CHARACTERISTIC_SELFPRESERVATION 0.5 + CHARACTERISTIC_VENGEFULNESS 0.25 + CHARACTERISTIC_CAMPER 0.25 + + CHARACTERISTIC_EASY_FRAGGER 0.5 + CHARACTERISTIC_ALERTNESS 0.5 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.1 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.1 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.1 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.1 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.1 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.1 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.1 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.1 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.2 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.1 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.5 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.1 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Penguin" + CHARACTERISTIC_GENDER "male" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/penguin_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 0.9 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.75 + + CHARACTERISTIC_CHAT_FILE "bots/penguin_t.c" + CHARACTERISTIC_CHAT_NAME "penguin" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 1.0 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/penguin_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.5 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.75 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.75 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.75 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.75 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.75 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.75 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.75 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.75 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Penguin" + CHARACTERISTIC_GENDER "male" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/penguin_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 1.0 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.0 + + CHARACTERISTIC_CHAT_FILE "bots/penguin_t.c" + CHARACTERISTIC_CHAT_NAME "penguin" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/penguin_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.0 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.0 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} diff --git a/q4base/botfiles/bots/penguin_i.c b/q4base/botfiles/bots/penguin_i.c new file mode 100644 index 00000000..6c2bca31 --- /dev/null +++ b/q4base/botfiles/bots/penguin_i.c @@ -0,0 +1,120 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +//health +#define FPH 2 +//armor +#define FPA 2 +//without the weapons +//shotgun +#define SGW 200 +//machinegun +#define MGW 50 +//grenadelauncher +#define GLW 400 +//rocket launcher +#define RLW 400 +//rail gun +#define RGW 260 +//bfg10k +#define BFW 400 +//lightninggun +#define LGW 50 +//plasmagun +#define PGW 250 +//prox-launcher +#define PXW 350 +//nailgun +#define NGW 150 +//chaingun +#define CGW 200 + + + + +//with the weapons +//shotgun +#define GSGW 50 +//machinegun +#define GMGW 50 +//grenadelauncher +#define GGLW 400 +//rocketlauncher +#define GRLW 210 +//railgun +#define GRGW 50 +//bfg10k +#define GBFW 400 +//lightninggun +#define GLGW 50 +//plasmagun +#define GPGW 50 +//prox-launcher +#define GPXW 200 +//failgun +#define GNGW 100 +//chaingun +#define GCGW 125 +//individual powerups +//teleport +#define TELW 190 +//medkit +#define MEDW 50 +//quad-damage +#define QW 500 +//envirosuit +#define ENVW 50 +//haste +#define HAW 50 +//invisibility +#define INW 400 +//regeneration +#define REGW 50 +//flight +#define FLW 0.0 +//kamikaze +#define KAMW 200 +//invulnerability +#define IBW 150 +//portal +#define PORW 300 +//scout +#define SCW 100 +//guard +#define GUW 200 +//doubler +#define DUBW 100 +//ammo-regen +#define AMRW 400 +//red-cube +#define REDCW 200 +//blue-cube +#define BLCW 200 +//ctf flag weight +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/penguin_t.c b/q4base/botfiles/bots/penguin_t.c new file mode 100644 index 00000000..cc0502f7 --- /dev/null +++ b/q4base/botfiles/bots/penguin_t.c @@ -0,0 +1,276 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "Penguin" +{ + //the teamplay.h file is included for all kinds of teamplay chats + #include "teamplay.h" + //====================================================== + //====================================================== + type "game_enter" //initiated when the bot enters the game + { + "Stop using winblows"; + "GNU RU1Z3!"; + "Linus told me to skin you alive, windoze users."; + + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "game_exit" //initiated when the bot exits the game + { + "I need to recompile my qvms, l8r."; + "I need to go burn a Win98 CD"; + "Pizza's here, l8r"; + GOODBYE1; + GOODBYE0; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "level_start" //initiated when a new level starts + { + HELLO2; + + // 0 = bot name + } //end type + type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings + { + 3, " sucks!"; + 2, ", I let you win."; + + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_victory" //initiated when a level ends and the bot is first in the rankings + { + LEVEL_END_VICTORY0; + LEVEL_END_VICTORY1; + + // 0 = bot name + // 1 = random opponent + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_lose" //initiated when a level ends and the bot is last in the rankings + { + 2, " must be an Arena Lord."; + 1, " kept getting in my way."; + 4, " has never been good to me."; + 2, " is a known cheater... the only way I could have lost."; + 2, " has a more optimized build than I."; + 2, " what use flags did you use in your compile?"; + 4, " isn't optimized properly."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 4 = level's title + } //end type + //====================================================== + //====================================================== + type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship + { + "Jerk"; + "Schmuck"; + "Putz"; + DEATH_TALKING; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult + { + "Try harder next time."; + "Wuss"; + "Heh, you suck."; + "Nice shooting, not."; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nokill" //bot hits an opponent but does not kill it + { + HIT_NOKILL0; + HIT_NOKILL1; + // 0 = opponent + } //end type + type "enemy_suicide" //enemy of the bot commits suicide + { + "LOL!"; + // 0 = enemy + } //end type + //====================================================== + //====================================================== + type "death_telefrag" //initiated when the bot is killed by a telefrag + { + DEATH_TELEFRAGGED0; + DEATH_TELEFRAGGED1; + // 0 = enemy name + } //end type + type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage + { + DEATH_FALLING0; + + // 0 = random opponent + } //end type + type "death_lava" //initiated when the bot dies in lava + { + "It burns!"; + "That's hot."; + DEATH_SUICIDE0; + DEATH_SUICIDE1; + // 0 = random opponent + } //end type + type "death_slime" //initiated when the bot dies in slime + { + DEATH_SLIME0; + DEATH_SLIME1; + // 0 = random opponent + } //end type + type "death_drown" //initiated when the bot drowns + { + "I can't swim!"; + + + // 0 = random opponent + } //end type + type "death_suicide" //initiated when bot blows self up with a weapon or craters + { + "Aww crap!"; + "Shutup!"; + DEATH_SUICIDE2; + DEATH_SUICIDE1; + + + // 0 = random opponent + } //end type + type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack + { + "D'oh!"; + DEATH_GAUNTLET0; + DEATH_GAUNTLET1; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Gauntlet) + } //end type + type "death_rail" //initiated when the bot is killed by a rail gun shot + { + DEATH_INSULT0; + DEATH_INSULT5; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Railgun) + } //end type + type "death_bfg" //initiated when the bot died by a BFG + { + DEATH_BFG0; + DEATH_BFG2; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to BFG10K) + } //end type + type "death_insult" //insult initiated when the bot died + { + DEATH_INSULT2; + DEATH_INSULT0; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + type "death_praise" //praise initiated when the bot died + { + "Linus, you are no longer my god, ", 0, " is."; + "Was that the new ", 1, "?"; + D_PRAISE0; + D_PRAISE1; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + //====================================================== + //====================================================== + type "kill_rail" //initiated when the bot kills someone with rail gun + { + KILL_RAIL1; + KILL_RAIL0; + // 0 = enemy name + } //end type + type "kill_gauntlet" //initiated when the bot kills someone with gauntlet + { + "LOL!"; + "Too easy"; + "Try recompiling with -pipe -O12 -fweb -funswitch-loops -funroll-all-loops -funit-at-a-time -fsched2-use-superblocks -frename-registers -fprefetch-loop-arrays -finline-limit=32768 -ffast-math -fbranch-target-load-optimize2"; //may be too long + "tsk... sad, really. I almost hated to do that."; + + + // 0 = enemy name + } //end type + type "kill_telefrag" //initiated when the bot telefragged someone + { + "LOL!"; + TELEFRAGGED2; + // 0 = enemy name + } //end type + type "kill_insult" //insult initiated when the bot killed someone + { + "p0wn3d"; + "you are not 1337"; + "Bi11 G473z owns you."; + KILL_INSULT4; + KILL_INSULT2; + + // 0 = enemy name + } //end type + type "kill_praise" //praise initiated when the bot killed someone + { + PRAISE0; + PRAISE1; + // 0 = enemy name + } //end type + //====================================================== + //====================================================== + type "random_insult" //insult initiated randomly (just when the bot feels like it) + { + "Your breath stinks"; + "Get a hair cut"; + "Get a real job"; + "Get a life"; + "You need 1337 lessons"; + "I so nailed your mom last night."; + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type + type "random_misc" //miscellanous chats initiated randomly + { + "Has anyone tried kernel 2.8.56-rc3-mm45, yet?"; + "Binary packaging encourages sloppy design, contrast with the stochastic API unit testing which occurs naturally with all the building with different configurations."; + "It could be the purpose of your life is only to serve as a warning to others"; + "Don't put that finger there, you don't know where's it been!"; + "I miss Richard Nixon..."; + "Viva la tux!"; + GUYTALK1; + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type +} //end chat + diff --git a/q4base/botfiles/bots/penguin_w.c b/q4base/botfiles/bots/penguin_w.c new file mode 100644 index 00000000..2882f49b --- /dev/null +++ b/q4base/botfiles/bots/penguin_w.c @@ -0,0 +1,55 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +/*weapon defines weights 10-500 + try to keep it balanced*/ + +#include "inv.h" +//gauntlet +#define GTW 50 +//shotgun +#define SGW 120 +//machinegun +#define MGW 75 +//grenade launcher +#define GLW 150 +//rocket launcher +#define RLW 200 +//railgun +#define RGW 130 +//bfg10k +#define BFW 175 +//lightninggun +#define LGW 180 +//plasmagun +#define PGW 230 +//grapplinghook +#define GRW 50 +//prox-launcher +#define PXW 175 +//nailgun +#define NGW 190 +//chaingun +#define CGW 210 + +#include "fuzw.c" diff --git a/q4base/botfiles/bots/rai_c.c b/q4base/botfiles/bots/rai_c.c new file mode 100644 index 00000000..23c15adc --- /dev/null +++ b/q4base/botfiles/bots/rai_c.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Rai" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 0.3 + CHARACTERISTIC_WEAPONWEIGHTS "bots/rai_w.c" + CHARACTERISTIC_AIM_SKILL 0.3 + CHARACTERISTIC_AIM_ACCURACY 0.3 + CHARACTERISTIC_VIEW_FACTOR 0.3 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 1.5 + + CHARACTERISTIC_CHAT_FILE "bots/rai_t.c" + CHARACTERISTIC_CHAT_NAME "rai" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 0.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 0.5 + CHARACTERISTIC_GRAPPLE_USER 0.5 + + CHARACTERISTIC_ITEMWEIGHTS "bots/rai_i.c" + CHARACTERISTIC_AGGRESSION 0.25 + CHARACTERISTIC_SELFPRESERVATION 0.5 + CHARACTERISTIC_VENGEFULNESS 0.25 + CHARACTERISTIC_CAMPER 0.25 + + CHARACTERISTIC_EASY_FRAGGER 0.5 + CHARACTERISTIC_ALERTNESS 0.5 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.43 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.43 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.43 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.43 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.43 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.43 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.43 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.43 + + CHARACTERISTIC_FIRETHROTTLE 0.43 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Rai" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/rai_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 0.9 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.75 + + CHARACTERISTIC_CHAT_FILE "bots/rai_t.c" + CHARACTERISTIC_CHAT_NAME "rai" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.1 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/rai_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.5 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.95 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.95 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.95 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.95 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.95 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.95 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.95 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.95 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.95 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.95 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.95 + + CHARACTERISTIC_FIRETHROTTLE 0.1 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Rai" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/rai_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 1.0 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.0 + + CHARACTERISTIC_CHAT_FILE "bots/rai_t.c" + CHARACTERISTIC_CHAT_NAME "rai" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/rai_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.0 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.0 + + CHARACTERISTIC_FIRETHROTTLE 0.01 +} diff --git a/q4base/botfiles/bots/rai_i.c b/q4base/botfiles/bots/rai_i.c new file mode 100644 index 00000000..79f4b555 --- /dev/null +++ b/q4base/botfiles/bots/rai_i.c @@ -0,0 +1,120 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +//health +#define FPH 2 +//armor +#define FPA 2 +//without the weapons +//shotgun +#define SGW 200 +//machinegun +#define MGW 50 +//grenadelauncher +#define GLW 300 +//rocket launcher +#define RLW 400 +//rail gun +#define RGW 260 +//bfg10k +#define BFW 350 +//lightninggun +#define LGW 50 +//plasmagun +#define PGW 250 +//prox-launcher +#define PXW 350 +//nailgun +#define NGW 150 +//chaingun +#define CGW 200 + + + + +//with the weapons +//shotgun +#define GSGW 50 +//machinegun +#define GMGW 50 +//grenadelauncher +#define GGLW 400 +//rocketlauncher +#define GRLW 210 +//railgun +#define GRGW 50 +//bfg10k +#define GBFW 400 +//lightninggun +#define GLGW 50 +//plasmagun +#define GPGW 50 +//prox-launcher +#define GPXW 200 +//failgun +#define GNGW 100 +//chaingun +#define GCGW 125 +//individual powerups +//teleport +#define TELW 190 +//medkit +#define MEDW 50 +//quad-damage +#define QW 500 +//envirosuit +#define ENVW 50 +//haste +#define HAW 50 +//invisibility +#define INW 400 +//regeneration +#define REGW 50 +//flight +#define FLW 175 +//kamikaze +#define KAMW 200 +//invulnerability +#define IBW 150 +//portal +#define PORW 300 +//scout +#define SCW 100 +//guard +#define GUW 200 +//doubler +#define DUBW 100 +//ammo-regen +#define AMRW 400 +//red-cube +#define REDCW 200 +//blue-cube +#define BLCW 200 +//ctf flag weight +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/rai_t.c b/q4base/botfiles/bots/rai_t.c new file mode 100644 index 00000000..ee19ecc9 --- /dev/null +++ b/q4base/botfiles/bots/rai_t.c @@ -0,0 +1,289 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "Rai" +{ + //the teamplay.h file is included for all kinds of teamplay chats + #include "teamplay.h" + //====================================================== + //====================================================== + type "game_enter" //initiated when the bot enters the game + { + "Hello."; + "Are you prepared for pain?"; + HELLO1; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "game_exit" //initiated when the bot exits the game + { + "Look at the ~time"; + 4, " kinda wears on me, I think I'll find a different server, later ~peeps"; + GOODBYE1; + GOODBYE0; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "level_start" //initiated when a new level starts + { + 0, " it is time for some payback!"; + 1, " you are going to have some pain in ", 4, "."; + HELLO2; + + // 0 = bot name + } //end type + type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings + { + "HA! ", 3, " is at the bottom, as usual."; + 2, ", I let you win."; + 4, " has changed a lot, it is much faster now."; + "Is it over yet?"; + "I can remember when ", 4, " didn't suck."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_victory" //initiated when a level ends and the bot is first in the rankings + { + 3, " you need to practice more... and forget about winning against me."; + LEVEL_END_VICTORY1; + "I really like ", 4, " since they fixed it, it is so easy to win!"; + "Next time, don't bother."; + // 0 = bot name + // 1 = random opponent + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_lose" //initiated when a level ends and the bot is last in the rankings + { + 2, " cheated."; + "I had a hang nail, so of course I lost."; + "So much for my bluster..."; + "I felt bad for you so I let you win."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 4 = level's title + } //end type + //====================================================== + //====================================================== + type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship + { + 0, ", didn't your mother ever tell you it was rude to interrupt a conversation?"; + "I am going to shove that ", 1, " down your throat if you do that again!"; + "Hey jerk! I was trying to hold a conversation here... do you mind?"; + "Jerk"; + DEATH_TALKING; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult + { + 1, " is not a good weapon, a ", weapon, " should be more your speed."; + "You need to aim better."; + "Try harder next time."; + curse; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nokill" //bot hits an opponent but does not kill it + { + 0, " must be cheating."; + "Dammit! Why won't you die?!?"; + "Well that sucked..."; + "Note to self... turn off safety next ~time"; + // 0 = opponent + } //end type + type "enemy_suicide" //enemy of the bot commits suicide + { + "Stop smoking ", substance, " and maybe you won't kill yourself so often."; + "Tired of life, ", 0, "? Give it up."; + "I guess that beats dying of ", disease, "..."; + // 0 = enemy + } //end type + //====================================================== + //====================================================== + type "death_telefrag" //initiated when the bot is killed by a telefrag + { + "I hate praetorian impressions."; + "My ", counselor, " warned about days like this."; + "D'oh!"; + DEATH_TELEFRAGGED1; + // 0 = enemy name + } //end type + type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage + { + DEATH_FALLING0; + "It didn't look that high from up there..."; + "*sigh*"; + // 0 = random opponent + } //end type + type "death_lava" //initiated when the bot dies in lava + { + "Well... it beats a case of hypothermia."; + "At least it is warm here"; + DEATH_SUICIDE1; + // 0 = random opponent + } //end type + type "death_slime" //initiated when the bot dies in slime + { + "Green has never been my color..."; + DEATH_SLIME1; + // 0 = random opponent + } //end type + type "death_drown" //initiated when the bot drowns + { + DEATH_DROWN0; + "It isn't that difficult to just breath water..."; + "So why can't I breath water?"; + // 0 = random opponent + } //end type + type "death_suicide" //initiated when bot blows self up with a weapon or craters + { + DEATH_SUICIDE2; + "So much for life and all of its cruel irony."; + "It is just easier for ", 0, " this way."; + + + // 0 = random opponent + } //end type + type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack + { + "Unsanitary."; + "What part of '~Don't touch me there' do you not understand?"; + DEATH_GAUNTLET1; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Gauntlet) + } //end type + type "death_rail" //initiated when the bot is killed by a rail gun shot + { + DEATH_INSULT0; + DEATH_FEM_INSULT1; + DEATH_INSULT5; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Railgun) + } //end type + type "death_bfg" //initiated when the bot died by a BFG + { + "Can't find a skill weapon? Or is it just that you suck?"; + "Over-compensating for something?"; + DEATH_BFG0; + DEATH_BFG2; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to BFG10K) + } //end type + type "death_insult" //insult initiated when the bot died + { + curse; + "This is far more painful than it looks."; + "One day, ", 0, " you me and a ", weapon, " are going to have a discussion."; + "Is that the best you can do?"; + DEATH_INSULT2; + DEATH_INSULT0; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + type "death_praise" //praise initiated when the bot died + { + "Not bad, ", 0, ", have you been practicing?"; + "I never saw it coming."; + D_PRAISE0; + D_PRAISE1; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + //====================================================== + //====================================================== + type "kill_rail" //initiated when the bot kills someone with rail gun + { + 0, ", you should stay down..."; + "*sigh* if only this was challenging."; + "I love this gun!"; + "Way too easy"; + // 0 = enemy name + } //end type + type "kill_gauntlet" //initiated when the bot kills someone with gauntlet + { + "LOL!"; + "Too easy"; + // 0 = enemy name + } //end type + type "kill_telefrag" //initiated when the bot telefragged someone + { + "LOL!"; + "Aww man... now I have to take a bath to get the brains out."; + "Does anyone have a quick way of getting brains out of your hair?"; + // 0 = enemy name + } //end type + type "kill_insult" //insult initiated when the bot killed someone + { + KILL_INSULT4; + "Why do you even bother?"; + + + // 0 = enemy name + } //end type + type "kill_praise" //praise initiated when the bot killed someone + { + "You are getting better, ", 0, ", keep it up and you might actually win something."; + + // 0 = enemy name + } //end type + //====================================================== + //====================================================== + type "random_insult" //insult initiated randomly (just when the bot feels like it) + { + TAUNT0; + TAUNT_FEM0; + TAUNT1; + "You should give up your ", substance, " addiction by next ", month, "."; + "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!"; + immaturity01; + "Your ", family_member, " needs to stop calling me."; + + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type + type "random_misc" //miscellanous chats initiated randomly + { + "this one time, at band camp..."; + GRRLTALK1; + MISC4; + "Has anyone tried out the new ", 5, "? Is it worth the upgrade?"; + MISC1; + "You would be surprised what you can do with a ", animal, " a ", food, " and ", peeps, "."; + "Next time you see Gargoyle tell him to call me, mmmkay?"; + neuterbot, " is cute."; + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type +} //end chat + diff --git a/q4base/botfiles/bots/rai_w.c b/q4base/botfiles/bots/rai_w.c new file mode 100644 index 00000000..85e23e4a --- /dev/null +++ b/q4base/botfiles/bots/rai_w.c @@ -0,0 +1,55 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +/*weapon defines weights 10-500 + try to keep it balanced*/ + +#include "inv.h" +//gauntlet +#define GTW 10 +//shotgun +#define SGW 180 +//machinegun +#define MGW 75 +//grenade launcher +#define GLW 170 +//rocket launcher +#define RLW 160 +//railgun +#define RGW 250 +//bfg10k +#define BFW 90 +//lightninggun +#define LGW 200 +//plasmagun +#define PGW 110 +//grapplinghook +#define GRW 10 +//prox-launcher +#define PXW 160 +//nailgun +#define NGW 200 +//chaingun +#define CGW 175 + +#include "fuzw.c" diff --git a/q4base/botfiles/bots/sarge_c.c b/q4base/botfiles/bots/sarge_c.c new file mode 100644 index 00000000..50c44a44 --- /dev/null +++ b/q4base/botfiles/bots/sarge_c.c @@ -0,0 +1,203 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Sarge" + CHARACTERISTIC_GENDER "Male" + CHARACTERISTIC_ATTACK_SKILL 0.250 + CHARACTERISTIC_WEAPONWEIGHTS "bots/sarge_w.c" + CHARACTERISTIC_AIM_SKILL 0.250 + CHARACTERISTIC_AIM_ACCURACY 0.250 + CHARACTERISTIC_VIEW_FACTOR 0.250 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 2.00 + + CHARACTERISTIC_CHAT_FILE "bots/sarge_t.c" + CHARACTERISTIC_CHAT_NAME "sarge" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.900 + CHARACTERISTIC_CHAT_MISC 0.750 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000 + CHARACTERISTIC_CHAT_KILL 1.000 + CHARACTERISTIC_CHAT_DEATH 0.900 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000 + CHARACTERISTIC_CHAT_HITTALKING 0.900 + CHARACTERISTIC_CHAT_HITNODEATH 0.800 + CHARACTERISTIC_CHAT_HITNOKILL 1.000 + CHARACTERISTIC_CHAT_RANDOM 0.900 + CHARACTERISTIC_CHAT_REPLY 1.000 + + CHARACTERISTIC_CROUCHER 0.200 + CHARACTERISTIC_JUMPER 0.900 + CHARACTERISTIC_WALKER 0.000 + CHARACTERISTIC_WEAPONJUMPING 0.800 + CHARACTERISTIC_GRAPPLE_USER 0.500 + + CHARACTERISTIC_ITEMWEIGHTS "bots/sarge_i.c" + CHARACTERISTIC_AGGRESSION 0.250 + CHARACTERISTIC_SELFPRESERVATION 0.900 + CHARACTERISTIC_VENGEFULNESS 0.900 + CHARACTERISTIC_CAMPER 0.800 + + CHARACTERISTIC_EASY_FRAGGER 1.000 + CHARACTERISTIC_ALERTNESS 0.900 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.700 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.500 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.600 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.500 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.700 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.450 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.400 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.800 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.500 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.500 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.500 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.500 + + CHARACTERISTIC_FIRETHROTTLE 0.300 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Sarge" + CHARACTERISTIC_GENDER "Male" + CHARACTERISTIC_ATTACK_SKILL 1.000 + CHARACTERISTIC_WEAPONWEIGHTS "bots/sarge_w.c" + CHARACTERISTIC_AIM_SKILL 1.000 + CHARACTERISTIC_AIM_ACCURACY 1.000 + CHARACTERISTIC_VIEW_FACTOR 0.900 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.25 + + CHARACTERISTIC_CHAT_FILE "bots/sarge_t.c" + CHARACTERISTIC_CHAT_NAME "sarge" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.900 + CHARACTERISTIC_CHAT_MISC 0.750 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000 + CHARACTERISTIC_CHAT_KILL 1.000 + CHARACTERISTIC_CHAT_DEATH 0.900 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000 + CHARACTERISTIC_CHAT_HITTALKING 0.900 + CHARACTERISTIC_CHAT_HITNODEATH 0.800 + CHARACTERISTIC_CHAT_HITNOKILL 1.000 + CHARACTERISTIC_CHAT_RANDOM 0.900 + CHARACTERISTIC_CHAT_REPLY 1.000 + + CHARACTERISTIC_CROUCHER 0.100 + CHARACTERISTIC_JUMPER 0.900 + CHARACTERISTIC_WALKER 0.000 + CHARACTERISTIC_WEAPONJUMPING 1.000 + CHARACTERISTIC_GRAPPLE_USER 1.000 + + CHARACTERISTIC_ITEMWEIGHTS "bots/sarge_i.c" + CHARACTERISTIC_AGGRESSION 1.000 + CHARACTERISTIC_SELFPRESERVATION 0.000 + CHARACTERISTIC_VENGEFULNESS 1.000 + CHARACTERISTIC_CAMPER 0.700 + + CHARACTERISTIC_EASY_FRAGGER 1.000 + CHARACTERISTIC_ALERTNESS 1.000 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.900 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.900 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.900 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.900 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.900 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.900 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.900 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.900 + + CHARACTERISTIC_FIRETHROTTLE 0.200 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Sarge" + CHARACTERISTIC_GENDER "Male" + CHARACTERISTIC_ATTACK_SKILL 1.000 + CHARACTERISTIC_WEAPONWEIGHTS "bots/sarge_w.c" + CHARACTERISTIC_AIM_SKILL 1.000 + CHARACTERISTIC_AIM_ACCURACY 1.000 + CHARACTERISTIC_VIEW_FACTOR 1.000 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.00 + + CHARACTERISTIC_CHAT_FILE "bots/sarge_t.c" + CHARACTERISTIC_CHAT_NAME "sarge" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.900 + CHARACTERISTIC_CHAT_MISC 0.750 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000 + CHARACTERISTIC_CHAT_KILL 1.000 + CHARACTERISTIC_CHAT_DEATH 0.900 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000 + CHARACTERISTIC_CHAT_HITTALKING 0.900 + CHARACTERISTIC_CHAT_HITNODEATH 0.800 + CHARACTERISTIC_CHAT_HITNOKILL 1.000 + CHARACTERISTIC_CHAT_RANDOM 0.900 + CHARACTERISTIC_CHAT_REPLY 1.000 + + CHARACTERISTIC_CROUCHER 0.000 + CHARACTERISTIC_JUMPER 1.000 + CHARACTERISTIC_WALKER 0.000 + CHARACTERISTIC_WEAPONJUMPING 1.000 + CHARACTERISTIC_GRAPPLE_USER 1.000 + + CHARACTERISTIC_ITEMWEIGHTS "bots/sarge_i.c" + CHARACTERISTIC_AGGRESSION 1.000 + CHARACTERISTIC_SELFPRESERVATION 1.000 + CHARACTERISTIC_VENGEFULNESS 1.000 + CHARACTERISTIC_CAMPER 0.000 + + CHARACTERISTIC_EASY_FRAGGER 1.000 + CHARACTERISTIC_ALERTNESS 1.000 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.900 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.000 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.000 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.000 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.000 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.000 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.000 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.000 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.000 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.000 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.000 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.000 + + CHARACTERISTIC_FIRETHROTTLE 0.100 +} + diff --git a/q4base/botfiles/bots/sarge_i.c b/q4base/botfiles/bots/sarge_i.c new file mode 100644 index 00000000..2a8b78b6 --- /dev/null +++ b/q4base/botfiles/bots/sarge_i.c @@ -0,0 +1,74 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + +#define FPH 4 +#define FPA 3 + +#define SGW 200 +#define MGW 100 +#define GLW 150 +#define RLW 150 +#define RGW 250 +#define BFW 450 +#define LGW 200 +#define PGW 250 +#define PXW 350 +#define NGW 150 +#define CGW 200 + +#define GSGW 140 +#define GMGW 150 +#define GGLW 200 +#define GRLW 150 +#define GRGW 200 +#define GBFW 100 +#define GLGW 250 +#define GPGW 100 +#define GPXW 200 +#define GNGW 100 +#define GCGW 125 + +#define TELW 190 +#define MEDW 50 +#define QW 500 +#define ENVW 50 +#define HAW 50 +#define INW 400 +#define REGW 50 +#define FLW 120 +#define KAMW 200 +#define IBW 150 +#define PORW 300 +#define SCW 100 +#define GUW 200 +#define DUBW 100 +#define AMRW 400 +#define REDCW 200 +#define BLCW 200 + +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/sarge_t.c b/q4base/botfiles/bots/sarge_t.c new file mode 100644 index 00000000..a1c217b0 --- /dev/null +++ b/q4base/botfiles/bots/sarge_t.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "sarge" +{ + #include "teamplay.h" + + type "game_enter" + { + "Here we go again."; + "Why don't you people just lay down and die, it'll save me the trouble."; + } + + type "game_exit" + { + GOODBYE1; + GOODBYE4; + GOODBYE3; + } + + type "level_start" + { + "Oh man, ", 4, " again?!?"; + "Alright, ", 4, " has always been good to me."; + } + + type "level_end" + { + "nice place ", 4, ", much less dangerous than d3dm2."; + } + + type "level_end_victory" + { + "Yep."; + } + + type "level_end_lose" + { + "Aww... crap!"; + } + + type "hit_talking" + { + DEATH_TALKING; + + } + + type "hit_nodeath" + { + TAUNT0; + TAUNT1; + TAUNT2; + } + + type "hit_nokill" + { + HIT_NOKILL0; + HIT_NOKILL1; + HIT_NOKILL1; + } + + type "death_telefrag" + { + DEATH_TELEFRAGGED0; + DEATH_TELEFRAGGED0; + DEATH_TELEFRAGGED0; + } + + type "death_cratered" + { + DEATH_FALLING0; + DEATH_FALLING0; + DEATH_FALLING0; + } + + type "death_lava" + { + "Well it was getting a bit nippy..."; + "mmm... toasty!"; + } + + type "death_slime" + { + "D'oh!"; + } + + type "death_drown" + { + "Who needs air?"; + } + + type "death_suicide" + { + DEATH_SUICIDE0; + DEATH_SUICIDE1; + DEATH_SUICIDE1; + } + + type "death_gauntlet" + { + DEATH_GAUNTLET0; + DEATH_GAUNTLET1; + DEATH_GAUNTLET1; + } + + type "death_rail" + { + DEATH_RAIL1; + DEATH_RAIL1; + DEATH_RAIL0; + + } + + type "death_bfg" + { + DEATH_BFG1; + DEATH_BFG0; + + } + + type "death_insult" + { + "What the... how cheap!"; + "Back in my day, frags weren't so cheap."; + } + + type "death_praise" + { + 0, " is death incarnate."; + } + + type "kill_rail" + { + KILL_RAIL0; + KILL_RAIL1; + } + + type "kill_gauntlet" + { + KILL_GAUNTLET0; + KILL_GAUNTLET1; + + } + + type "kill_telefrag" + { + TELEFRAGGED0; + TELEFRAGGED1; + } + + type "kill_suicide" + { + TAUNT0; + TAUNT1; + } + + type "kill_insult" + { + "Pathetic."; + "tsk"; + "My ", family_member, " could do better."; + } + + type "kill_praise" + { + "Nice one, ", 0, "."; + "Wow, ~you never saw that one coming, ", 0, "."; + } + + type "random_insult" + { + 0, ", ~you suck!"; + 0, " needs to stop calling my mom."; + } + + type "random_misc" + { + 0, " gave my ~mom ", disease, "."; + "Is it true that ", peeps, " is a bot?"; + + } +} diff --git a/q4base/botfiles/bots/sarge_w.c b/q4base/botfiles/bots/sarge_w.c new file mode 100644 index 00000000..5b7af7aa --- /dev/null +++ b/q4base/botfiles/bots/sarge_w.c @@ -0,0 +1,41 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + +#define GTW 50 +#define SGW 200 +#define MGW 110 +#define GLW 220 +#define RLW 150 +#define RGW 190 +#define BFW 300 +#define LGW 220 +#define PGW 200 +#define GRW 50 +#define NGW 200 +#define PXW 150 +#define CGW 365 + +// +#include "fuzw.c" diff --git a/q4base/botfiles/bots/sergei_c.c b/q4base/botfiles/bots/sergei_c.c new file mode 100644 index 00000000..4386879f --- /dev/null +++ b/q4base/botfiles/bots/sergei_c.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Sergei" + CHARACTERISTIC_GENDER "male" + CHARACTERISTIC_ATTACK_SKILL 0.30 + CHARACTERISTIC_WEAPONWEIGHTS "bots/sergei_w.c" + CHARACTERISTIC_AIM_SKILL 0..30 + CHARACTERISTIC_AIM_ACCURACY 0.30 + CHARACTERISTIC_VIEW_FACTOR 0.30 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 1.5 + + CHARACTERISTIC_CHAT_FILE "bots/sergei_t.c" + CHARACTERISTIC_CHAT_NAME "Sergei" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.4 + CHARACTERISTIC_JUMPER 0.6 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 0.6 + CHARACTERISTIC_GRAPPLE_USER 0.5 + + CHARACTERISTIC_ITEMWEIGHTS "bots/sergei_i.c" + CHARACTERISTIC_AGGRESSION 0.3 + CHARACTERISTIC_SELFPRESERVATION 0.5 + CHARACTERISTIC_VENGEFULNESS 0.30 + CHARACTERISTIC_CAMPER 0.30 + + CHARACTERISTIC_EASY_FRAGGER 0.5 + CHARACTERISTIC_ALERTNESS 0.5 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.6 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.3 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.6 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.8 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.6 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.4 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.5 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.5 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.5 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.5 + + CHARACTERISTIC_FIRETHROTTLE 0.2 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Sergei" + CHARACTERISTIC_GENDER "male" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/sergei_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 0.9 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.0 + + CHARACTERISTIC_CHAT_FILE "bots/sergei_t.c" + CHARACTERISTIC_CHAT_NAME "Sergei" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.4 + CHARACTERISTIC_JUMPER 0.6 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/sergei_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.2 + + CHARACTERISTIC_EASY_FRAGGER 0.05 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.9 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.8 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.8 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.8 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.8 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.8 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.6 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.7 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.975 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.975 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.975 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.975 + + CHARACTERISTIC_FIRETHROTTLE 0.025 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Sergei" + CHARACTERISTIC_GENDER "male" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/sergei_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 1.0 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.0 + + CHARACTERISTIC_CHAT_FILE "bots/sergei_t.c" + CHARACTERISTIC_CHAT_NAME "Sergei" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.5 + CHARACTERISTIC_JUMPER 0.5 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/sergei_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.0 + + CHARACTERISTIC_EASY_FRAGGER 0.001 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.9 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.0 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} diff --git a/q4base/botfiles/bots/sergei_i.c b/q4base/botfiles/bots/sergei_i.c new file mode 100644 index 00000000..ec1e4df7 --- /dev/null +++ b/q4base/botfiles/bots/sergei_i.c @@ -0,0 +1,120 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +//health +#define FPH 2 +//armor +#define FPA 2 +//without the weapons +//shotgun +#define SGW 90 +//machinegun +#define MGW 50 +//grenadelauncher +#define GLW 150 +//rocket launcher +#define RLW 220 +//rail gun +#define RGW 160 +//bfg10k +#define BFW 150 +//lightninggun +#define LGW 195 +//plasmagun +#define PGW 260 +//prox-launcher +#define PXW 180 +//nailgun +#define NGW 350 +//chaingun +#define CGW 100 + + + + +//with the weapons +//shotgun +#define GSGW 50 +//machinegun +#define GMGW 50 +//grenadelauncher +#define GGLW 110 +//rocketlauncher +#define GRLW 120 +//railgun +#define GRGW 150 +//bfg10k +#define GBFW 50 +//lightninggun +#define GLGW 100 +//plasmagun +#define GPGW 150 +//prox-launcher +#define GPXW 100 +//nailgun +#define GNGW 120 +//chaingun +#define GCGW 125 +//individual powerups +//teleport +#define TELW 140 +//medkit +#define MEDW 190 +//quad-damage +#define QW 200 +//envirosuit +#define ENVW 150 +//haste +#define HAW 125 +//invisibility +#define INW 130 +//regeneration +#define REGW 150 +//flight +#define FLW 150 +//kamikaze +#define KAMW 390 +//invulnerability +#define IBW 150 +//portal +#define PORW 130 +//scout +#define SCW 190 +//guard +#define GUW 180 +//doubler +#define DUBW 110 +//ammo-regen +#define AMRW 160 +//red-cube +#define REDCW 200 +//blue-cube +#define BLCW 200 +//ctf flag weight +#define FGW 450 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/sergei_t.c b/q4base/botfiles/bots/sergei_t.c new file mode 100644 index 00000000..39d6b7c5 --- /dev/null +++ b/q4base/botfiles/bots/sergei_t.c @@ -0,0 +1,284 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "Sergei" +{ + //the teamplay.h file is included for all kinds of teamplay chats + #include "teamplay.h" + //====================================================== + //====================================================== + type "game_enter" //initiated when the bot enters the game + { + "Ever feel like you've been cheated?"; + "Time to die!"; + 0, " is a tosser!"; + "Now that your daddy is gone..."; + HELLO1; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "game_exit" //initiated when the bot exits the game + { + "Your daddy is here, got to go."; + "Adios."; + 4, " sucks, l8r."; + "I'm going to get drunk, l8r"; + GOODBYE1; + GOODBYE0; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "level_start" //initiated when a new level starts + { + "Wow this is worse than oa_bases3!"; + 0, " is going down."; + + HELLO2; + + // 0 = bot name + } //end type + type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings + { + 3, " sucks!"; + 2, ", I let you win."; + 4, " worst level ever! Let's play it again!"; + + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_victory" //initiated when a level ends and the bot is first in the rankings + { + LEVEL_END_VICTORY0; + LEVEL_END_VICTORY1; + + // 0 = bot name + // 1 = random opponent + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_lose" //initiated when a level ends and the bot is last in the rankings + { + 2, " got lucky."; + 1, " kept spawn camping."; + 4, " has never been good to me."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 4 = level's title + } //end type + //====================================================== + //====================================================== + type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship + { + "So much for sportsmanship..."; + "Loser!"; + "Wanker!"; + "Putz"; + "Tosser"; + DEATH_TALKING; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult + { + "Sissy"; + "Wuss"; + "Heh, you suck."; + "Dick Cheney is a better shot than you!"; + "Ya pansy!"; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nokill" //bot hits an opponent but does not kill it + { + HIT_NOKILL0; + HIT_NOKILL1; + // 0 = opponent + } //end type + type "enemy_suicide" //enemy of the bot commits suicide + { + "LOL!"; + // 0 = enemy + } //end type + //====================================================== + //====================================================== + type "death_telefrag" //initiated when the bot is killed by a telefrag + { + DEATH_TELEFRAGGED0; + DEATH_TELEFRAGGED1; + // 0 = enemy name + } //end type + type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage + { + DEATH_FALLING0; + + // 0 = random opponent + } //end type + type "death_lava" //initiated when the bot dies in lava + { + "Mmmm... toasted nuts!"; + DEATH_SUICIDE0; + DEATH_SUICIDE1; + // 0 = random opponent + } //end type + type "death_slime" //initiated when the bot dies in slime + { + DEATH_SLIME0; + DEATH_SLIME1; + // 0 = random opponent + } //end type + type "death_drown" //initiated when the bot drowns + { + "I need to spend some time at the Y."; + "All of that time in those swimming lessons for naught."; + "I should grow gills..."; + "Crayon should have taught me how to swim..."; + + + // 0 = random opponent + } //end type + type "death_suicide" //initiated when bot blows self up with a weapon or craters + { + "crap!"; + "Shutup!"; + DEATH_SUICIDE2; + DEATH_SUICIDE1; + + + // 0 = random opponent + } //end type + type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack + { + DEATH_GAUNTLET0; + DEATH_GAUNTLET1; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Gauntlet) + } //end type + type "death_rail" //initiated when the bot is killed by a rail gun shot + { + DEATH_INSULT0; + DEATH_INSULT5; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Railgun) + } //end type + type "death_bfg" //initiated when the bot died by a BFG + { + DEATH_BFG0; + DEATH_BFG2; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to BFG10K) + } //end type + type "death_insult" //insult initiated when the bot died + { + "Das schlechteste setzt sich durch"; + "Wuss"; + "Sissy"; + "Pansy!"; + "Come back here... I'll chew your leg off!"; + DEATH_INSULT2; + DEATH_INSULT0; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + type "death_praise" //praise initiated when the bot died + { + + D_PRAISE0; + D_PRAISE1; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + //====================================================== + //====================================================== + type "kill_rail" //initiated when the bot kills someone with rail gun + { + "Pff, try a real weapon next time."; + KILL_RAIL1; + KILL_RAIL0; + // 0 = enemy name + } //end type + type "kill_gauntlet" //initiated when the bot kills someone with gauntlet + { + "LOL!"; + + // 0 = enemy name + } //end type + type "kill_telefrag" //initiated when the bot telefragged someone + { + "LOL!"; + TELEFRAGGED2; + // 0 = enemy name + } //end type + type "kill_insult" //insult initiated when the bot killed someone + { + KILL_INSULT4; + KILL_INSULT2; + + // 0 = enemy name + } //end type + type "kill_praise" //praise initiated when the bot killed someone + { + PRAISE0; + PRAISE1; + // 0 = enemy name + } //end type + //====================================================== + //====================================================== + type "random_insult" //insult initiated randomly (just when the bot feels like it) + { + "Fascist pig!"; + "Capitalist swine"; + "Marxist scum!"; + "Neo-liberal twit!"; + "Neo-conservative twit!"; + "Redneck"; + "White Trash"; + TAUNT0; + TAUNT1; + + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type + type "random_misc" //miscellanous chats initiated randomly + { + "...we'll sacrifice the older ones, they're livin' in the past, we'll burn up their religion and we'll all be free at last..."; + "OI! OI! PUNK ROCK'S NOT DEAD!"; + "...you sit around the house in your daddy's clothes, you're lookin' a mess, you're pickin' your nose..."; + "...can't stand rock n' roll, no I can't stand rock n' roll, up your bum with rock n' roll..."; + "Viva la revolucion!"; + "Cheap holiday in other people's misery..."; + GUYTALK1; + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type +} //end chat + diff --git a/q4base/botfiles/bots/sergei_w.c b/q4base/botfiles/bots/sergei_w.c new file mode 100644 index 00000000..38110b3b --- /dev/null +++ b/q4base/botfiles/bots/sergei_w.c @@ -0,0 +1,55 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +/*weapon defines weights 10-500 + try to keep it balanced*/ + +#include "inv.h" +//gauntlet +#define GTW 50 +//shotgun +#define SGW 275 +//machinegun +#define MGW 100 +//grenade launcher +#define GLW 250 +//rocket launcher +#define RLW 275 +//railgun +#define RGW 200 +//bfg10k +#define BFW 50 +//lightninggun +#define LGW 160 +//plasmagun +#define PGW 290 +//grapplinghook +#define GRW 50 +//prox-launcher +#define PXW 110 +//nailgun +#define NGW 310 +//chaingun +#define CGW 75 + +#include "fuzw.c" diff --git a/q4base/botfiles/bots/skelebot_c.c b/q4base/botfiles/bots/skelebot_c.c new file mode 100644 index 00000000..ca623a2a --- /dev/null +++ b/q4base/botfiles/bots/skelebot_c.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Skelebot" + CHARACTERISTIC_GENDER "it" + CHARACTERISTIC_ATTACK_SKILL 0.25 + CHARACTERISTIC_WEAPONWEIGHTS "bots/skelebot_w.c" + CHARACTERISTIC_AIM_SKILL 0.25 + CHARACTERISTIC_AIM_ACCURACY 0.25 + CHARACTERISTIC_VIEW_FACTOR 0.25 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 3.0 + + CHARACTERISTIC_CHAT_FILE "bots/skelebot_t.c" + CHARACTERISTIC_CHAT_NAME "skelebot" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.5 + CHARACTERISTIC_CHAT_MISC 0.5 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.5 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.5 + CHARACTERISTIC_CHAT_KILL 0.5 + CHARACTERISTIC_CHAT_DEATH 0.5 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.5 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.5 + CHARACTERISTIC_CHAT_HITNOKILL 0.5 + CHARACTERISTIC_CHAT_RANDOM 0.5 + CHARACTERISTIC_CHAT_REPLY 0.5 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 0.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 0.5 + CHARACTERISTIC_GRAPPLE_USER 0.5 + + CHARACTERISTIC_ITEMWEIGHTS "bots/skelebot_i.c" + CHARACTERISTIC_AGGRESSION 0.25 + CHARACTERISTIC_SELFPRESERVATION 0.5 + CHARACTERISTIC_VENGEFULNESS 0.25 + CHARACTERISTIC_CAMPER 0.7 + + CHARACTERISTIC_EASY_FRAGGER 0.5 + CHARACTERISTIC_ALERTNESS 0.5 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.3 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.3 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.3 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.3 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.3 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.3 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.3 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.3 + + CHARACTERISTIC_FIRETHROTTLE 0.3 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Skelebot" + CHARACTERISTIC_GENDER "it" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/skelebot_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 0.9 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.75 + + CHARACTERISTIC_CHAT_FILE "bots/skelebot_t.c" + CHARACTERISTIC_CHAT_NAME "skelebot" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.1 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/skelebot_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.9 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.75 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.75 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.75 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.75 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.75 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.75 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.75 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.75 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Skelebot" + CHARACTERISTIC_GENDER "it" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/skelebot_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 1.0 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.0 + + CHARACTERISTIC_CHAT_FILE "bots/skelebot_t.c" + CHARACTERISTIC_CHAT_NAME "skelebot" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/skelebot_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.98 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.0 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} diff --git a/q4base/botfiles/bots/skelebot_i.c b/q4base/botfiles/bots/skelebot_i.c new file mode 100644 index 00000000..6177d4cb --- /dev/null +++ b/q4base/botfiles/bots/skelebot_i.c @@ -0,0 +1,120 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +//health +#define FPH 2 +//armor +#define FPA 2 +//without the weapons +//shotgun +#define SGW 200 +//machinegun +#define MGW 50 +//grenadelauncher +#define GLW 400 +//rocket launcher +#define RLW 400 +//rail gun +#define RGW 260 +//bfg10k +#define BFW 400 +//lightninggun +#define LGW 50 +//plasmagun +#define PGW 250 +//prox-launcher +#define PXW 350 +//nailgun +#define NGW 150 +//chaingun +#define CGW 200 + + + + +//with the weapons +//shotgun +#define GSGW 50 +//machinegun +#define GMGW 50 +//grenadelauncher +#define GGLW 400 +//rocketlauncher +#define GRLW 210 +//railgun +#define GRGW 50 +//bfg10k +#define GBFW 400 +//lightninggun +#define GLGW 50 +//plasmagun +#define GPGW 50 +//prox-launcher +#define GPXW 200 +//failgun +#define GNGW 100 +//chaingun +#define GCGW 125 +//individual powerups +//teleport +#define TELW 190 +//medkit +#define MEDW 50 +//quad-damage +#define QW 500 +//envirosuit +#define ENVW 50 +//haste +#define HAW 50 +//invisibility +#define INW 400 +//regeneration +#define REGW 50 +//flight +#define FLW 60 +//kamikaze +#define KAMW 200 +//invulnerability +#define IBW 150 +//portal +#define PORW 300 +//scout +#define SCW 100 +//guard +#define GUW 200 +//doubler +#define DUBW 100 +//ammo-regen +#define AMRW 400 +//red-cube +#define REDCW 200 +//blue-cube +#define BLCW 200 +//ctf flag weight +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/skelebot_t.c b/q4base/botfiles/bots/skelebot_t.c new file mode 100644 index 00000000..7c06eea7 --- /dev/null +++ b/q4base/botfiles/bots/skelebot_t.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "skelebot" +{ + #include "teamplay.h" + + type "game_enter" + { + "Here we go again."; + "Why don't you people just lay down and die, it'll save me the trouble."; + } + + type "game_exit" + { + GOODBYE1; + GOODBYE4; + GOODBYE3; + } + + type "level_start" + { + "Oh man, ", 4, " again?!?"; + "Alright, ", 4, " has always been good to me."; + } + + type "level_end" + { + "nice place ", 4, ", much less dangerous than d3dm2."; + } + + type "level_end_victory" + { + "Yep."; + } + + type "level_end_lose" + { + "Aww... crap!"; + } + + type "hit_talking" + { + DEATH_TALKING; + + } + + type "hit_nodeath" + { + TAUNT0; + TAUNT1; + TAUNT2; + } + + type "hit_nokill" + { + HIT_NOKILL0; + HIT_NOKILL1; + HIT_NOKILL1; + } + + type "death_telefrag" + { + DEATH_TELEFRAGGED0; + DEATH_TELEFRAGGED0; + DEATH_TELEFRAGGED0; + } + + type "death_cratered" + { + DEATH_FALLING0; + DEATH_FALLING0; + DEATH_FALLING0; + } + + type "death_lava" + { + "Well it was getting a bit nippy..."; + "mmm... toasty!"; + } + + type "death_slime" + { + "D'oh!"; + } + + type "death_drown" + { + "Who needs air?"; + } + + type "death_suicide" + { + DEATH_SUICIDE0; + DEATH_SUICIDE1; + DEATH_SUICIDE1; + } + + type "death_gauntlet" + { + DEATH_GAUNTLET0; + DEATH_GAUNTLET1; + DEATH_GAUNTLET1; + } + + type "death_rail" + { + DEATH_RAIL1; + DEATH_RAIL1; + DEATH_RAIL0; + + } + + type "death_bfg" + { + DEATH_BFG1; + DEATH_BFG0; + + } + + type "death_insult" + { + "What the... how cheap!"; + "Back in my day, frags weren't so cheap."; + } + + type "death_praise" + { + 0, " is death incarnate."; + } + + type "kill_rail" + { + KILL_RAIL0; + KILL_RAIL1; + } + + type "kill_gauntlet" + { + KILL_GAUNTLET0; + KILL_GAUNTLET1; + + } + + type "kill_telefrag" + { + TELEFRAGGED0; + TELEFRAGGED1; + } + + type "kill_suicide" + { + TAUNT0; + TAUNT1; + } + + type "kill_insult" + { + "Pathetic."; + "tsk"; + "My ", family_member, " could do better."; + } + + type "kill_praise" + { + "Nice one, ", 0, "."; + "Wow, ~you never saw that one coming, ", 0, "."; + } + + type "random_insult" + { + 0, ", ~you suck!"; + 0, " needs to stop calling my mom."; + } + + type "random_misc" + { + 0, " gave my ~mom ", disease, "."; + "Is it true that ", peeps, " is a bot?"; + + } +} diff --git a/q4base/botfiles/bots/skelebot_w.c b/q4base/botfiles/bots/skelebot_w.c new file mode 100644 index 00000000..bbd7f3bb --- /dev/null +++ b/q4base/botfiles/bots/skelebot_w.c @@ -0,0 +1,55 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +/*weapon defines weights 10-500 + try to keep it balanced*/ + +#include "inv.h" +//gauntlet +#define GTW 20 +//shotgun +#define SGW 190 +//machinegun +#define MGW 50 +//grenade launcher +#define GLW 100 +//rocket launcher +#define RLW 210 +//railgun +#define RGW 250 +//bfg10k +#define BFW 90 +//lightninggun +#define LGW 160 +//plasmagun +#define PGW 130 +//grapplinghook +#define GRW 10 +//prox-launcher +#define PXW 175 +//nailgun +#define NGW 160 +//chaingun +#define CGW 225 + +#include "fuzw.c" diff --git a/q4base/botfiles/bots/sly_c.c b/q4base/botfiles/bots/sly_c.c new file mode 100644 index 00000000..c4bc906b --- /dev/null +++ b/q4base/botfiles/bots/sly_c.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Sly" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 0.3 + CHARACTERISTIC_WEAPONWEIGHTS "bots/sly_w.c" + CHARACTERISTIC_AIM_SKILL 0.3 + CHARACTERISTIC_AIM_ACCURACY 0.3 + CHARACTERISTIC_VIEW_FACTOR 0.3 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 1.5 + + CHARACTERISTIC_CHAT_FILE "bots/sly_t.c" + CHARACTERISTIC_CHAT_NAME "Sly" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 0.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 0.5 + CHARACTERISTIC_GRAPPLE_USER 0.5 + + CHARACTERISTIC_ITEMWEIGHTS "bots/sly_i.c" + CHARACTERISTIC_AGGRESSION 0.25 + CHARACTERISTIC_SELFPRESERVATION 0.5 + CHARACTERISTIC_VENGEFULNESS 0.25 + CHARACTERISTIC_CAMPER 0.25 + + CHARACTERISTIC_EASY_FRAGGER 0.5 + CHARACTERISTIC_ALERTNESS 0.5 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.43 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.43 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.43 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.43 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.43 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.43 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.43 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.43 + + CHARACTERISTIC_FIRETHROTTLE 0.43 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Sly" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/sly_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 0.9 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.75 + + CHARACTERISTIC_CHAT_FILE "bots/sly_t.c" + CHARACTERISTIC_CHAT_NAME "Sly" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.1 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/sly_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.5 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.95 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.95 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.95 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.95 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.95 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.95 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.95 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.95 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.95 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.95 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.95 + + CHARACTERISTIC_FIRETHROTTLE 0.1 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Sly" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/sly_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 1.0 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.0 + + CHARACTERISTIC_CHAT_FILE "bots/sly_t.c" + CHARACTERISTIC_CHAT_NAME "Sly" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/sly_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.0 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.0 + + CHARACTERISTIC_FIRETHROTTLE 0.01 +} diff --git a/q4base/botfiles/bots/sly_i.c b/q4base/botfiles/bots/sly_i.c new file mode 100644 index 00000000..79f4b555 --- /dev/null +++ b/q4base/botfiles/bots/sly_i.c @@ -0,0 +1,120 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +//health +#define FPH 2 +//armor +#define FPA 2 +//without the weapons +//shotgun +#define SGW 200 +//machinegun +#define MGW 50 +//grenadelauncher +#define GLW 300 +//rocket launcher +#define RLW 400 +//rail gun +#define RGW 260 +//bfg10k +#define BFW 350 +//lightninggun +#define LGW 50 +//plasmagun +#define PGW 250 +//prox-launcher +#define PXW 350 +//nailgun +#define NGW 150 +//chaingun +#define CGW 200 + + + + +//with the weapons +//shotgun +#define GSGW 50 +//machinegun +#define GMGW 50 +//grenadelauncher +#define GGLW 400 +//rocketlauncher +#define GRLW 210 +//railgun +#define GRGW 50 +//bfg10k +#define GBFW 400 +//lightninggun +#define GLGW 50 +//plasmagun +#define GPGW 50 +//prox-launcher +#define GPXW 200 +//failgun +#define GNGW 100 +//chaingun +#define GCGW 125 +//individual powerups +//teleport +#define TELW 190 +//medkit +#define MEDW 50 +//quad-damage +#define QW 500 +//envirosuit +#define ENVW 50 +//haste +#define HAW 50 +//invisibility +#define INW 400 +//regeneration +#define REGW 50 +//flight +#define FLW 175 +//kamikaze +#define KAMW 200 +//invulnerability +#define IBW 150 +//portal +#define PORW 300 +//scout +#define SCW 100 +//guard +#define GUW 200 +//doubler +#define DUBW 100 +//ammo-regen +#define AMRW 400 +//red-cube +#define REDCW 200 +//blue-cube +#define BLCW 200 +//ctf flag weight +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/sly_t.c b/q4base/botfiles/bots/sly_t.c new file mode 100644 index 00000000..644d35d4 --- /dev/null +++ b/q4base/botfiles/bots/sly_t.c @@ -0,0 +1,289 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "Sly" +{ + //the teamplay.h file is included for all kinds of teamplay chats + #include "teamplay.h" + //====================================================== + //====================================================== + type "game_enter" //initiated when the bot enters the game + { + "Hello."; + "Are you prepared for pain?"; + HELLO1; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "game_exit" //initiated when the bot exits the game + { + "Look at the ~time"; + 4, " kinda wears on me, I think I'll find a different server, later ~peeps"; + GOODBYE1; + GOODBYE0; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "level_start" //initiated when a new level starts + { + 0, " it is time for some payback!"; + 1, " you are going to have some pain in ", 4, "."; + HELLO2; + + // 0 = bot name + } //end type + type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings + { + "HA! ", 3, " is at the bottom, as usual."; + 2, ", I let you win."; + 4, " has changed a lot, it is much faster now."; + "Is it over yet?"; + "I can remember when ", 4, " didn't suck."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_victory" //initiated when a level ends and the bot is first in the rankings + { + 3, " you need to practice more... and forget about winning against me."; + LEVEL_END_VICTORY1; + "I really like ", 4, " since they fixed it, it is so easy to win!"; + "Next time, don't bother."; + // 0 = bot name + // 1 = random opponent + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_lose" //initiated when a level ends and the bot is last in the rankings + { + 2, " cheated."; + "I had a hang nail, so of course I lost."; + "So much for my bluster..."; + "I felt bad for you so I let you win."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 4 = level's title + } //end type + //====================================================== + //====================================================== + type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship + { + 0, ", didn't your mother ever tell you it was rude to interrupt a conversation?"; + "I am going to shove that ", 1, " down your throat if you do that again!"; + "Hey jerk! I was trying to hold a conversation here... do you mind?"; + "Jerk"; + DEATH_TALKING; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult + { + 1, " is not a good weapon, a ", weapon, " should be more your speed."; + "You need to aim better."; + "Try harder next time."; + curse; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nokill" //bot hits an opponent but does not kill it + { + 0, " must be cheating."; + "Dammit! Why won't you die?!?"; + "Well that sucked..."; + "Note to self... turn off safety next ~time"; + // 0 = opponent + } //end type + type "enemy_suicide" //enemy of the bot commits suicide + { + "Stop smoking ", substance, " and maybe you won't kill yourself so often."; + "Tired of life, ", 0, "? Give it up."; + "I guess that beats dying of ", disease, "..."; + // 0 = enemy + } //end type + //====================================================== + //====================================================== + type "death_telefrag" //initiated when the bot is killed by a telefrag + { + "I hate praetorian impressions."; + "My ", counselor, " warned about days like this."; + "D'oh!"; + DEATH_TELEFRAGGED1; + // 0 = enemy name + } //end type + type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage + { + DEATH_FALLING0; + "It didn't look that high from up there..."; + "*sigh*"; + // 0 = random opponent + } //end type + type "death_lava" //initiated when the bot dies in lava + { + "Well... it beats a case of hypothermia."; + "At least it is warm here"; + DEATH_SUICIDE1; + // 0 = random opponent + } //end type + type "death_slime" //initiated when the bot dies in slime + { + "Green has never been my color..."; + DEATH_SLIME1; + // 0 = random opponent + } //end type + type "death_drown" //initiated when the bot drowns + { + DEATH_DROWN0; + "It isn't that difficult to just breath water..."; + "So why can't I breath water?"; + // 0 = random opponent + } //end type + type "death_suicide" //initiated when bot blows self up with a weapon or craters + { + DEATH_SUICIDE2; + "So much for life and all of its cruel irony."; + "It is just easier for ", 0, " this way."; + + + // 0 = random opponent + } //end type + type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack + { + "Unsanitary."; + "What part of '~Don't touch me there' do you not understand?"; + DEATH_GAUNTLET1; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Gauntlet) + } //end type + type "death_rail" //initiated when the bot is killed by a rail gun shot + { + DEATH_INSULT0; + DEATH_FEM_INSULT1; + DEATH_INSULT5; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Railgun) + } //end type + type "death_bfg" //initiated when the bot died by a BFG + { + "Can't find a skill weapon? Or is it just that you suck?"; + "Over-compensating for something?"; + DEATH_BFG0; + DEATH_BFG2; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to BFG10K) + } //end type + type "death_insult" //insult initiated when the bot died + { + curse; + "This is far more painful than it looks."; + "One day, ", 0, " you me and a ", weapon, " are going to have a discussion."; + "Is that the best you can do?"; + DEATH_INSULT2; + DEATH_INSULT0; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + type "death_praise" //praise initiated when the bot died + { + "Not bad, ", 0, ", have you been practicing?"; + "I never saw it coming."; + D_PRAISE0; + D_PRAISE1; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + //====================================================== + //====================================================== + type "kill_rail" //initiated when the bot kills someone with rail gun + { + 0, ", you should stay down..."; + "*sigh* if only this was challenging."; + "I love this gun!"; + "Way too easy"; + // 0 = enemy name + } //end type + type "kill_gauntlet" //initiated when the bot kills someone with gauntlet + { + "LOL!"; + "Too easy"; + // 0 = enemy name + } //end type + type "kill_telefrag" //initiated when the bot telefragged someone + { + "LOL!"; + "Aww man... now I have to take a bath to get the brains out."; + "Does anyone have a quick way of getting brains out of your hair?"; + // 0 = enemy name + } //end type + type "kill_insult" //insult initiated when the bot killed someone + { + KILL_INSULT4; + "Why do you even bother?"; + + + // 0 = enemy name + } //end type + type "kill_praise" //praise initiated when the bot killed someone + { + "You are getting better, ", 0, ", keep it up and you might actually win something."; + + // 0 = enemy name + } //end type + //====================================================== + //====================================================== + type "random_insult" //insult initiated randomly (just when the bot feels like it) + { + TAUNT0; + TAUNT_FEM0; + TAUNT1; + "You should give up your ", substance, " addiction by next ", month, "."; + "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!"; + immaturity01; + "Your ", family_member, " needs to stop calling me."; + + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type + type "random_misc" //miscellanous chats initiated randomly + { + "this one time, at band camp..."; + GRRLTALK1; + MISC4; + "Has anyone tried out the new ", 5, "? Is it worth the upgrade?"; + MISC1; + "You would be surprised what you can do with a ", animal, " a ", food, " and ", peeps, "."; + "Next time you see Gargoyle tell him to call me, mmmkay?"; + neuterbot, " is cute."; + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type +} //end chat + diff --git a/q4base/botfiles/bots/sly_w.c b/q4base/botfiles/bots/sly_w.c new file mode 100644 index 00000000..93771764 --- /dev/null +++ b/q4base/botfiles/bots/sly_w.c @@ -0,0 +1,55 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +/*weapon defines weights 10-500 + try to keep it balanced*/ + +#include "inv.h" +//gauntlet +#define GTW 10 +//shotgun +#define SGW 150 +//machinegun +#define MGW 95 +//grenade launcher +#define GLW 180 +//rocket launcher +#define RLW 200 +//railgun +#define RGW 210 +//bfg10k +#define BFW 90 +//lightninggun +#define LGW 200 +//plasmagun +#define PGW 130 +//grapplinghook +#define GRW 10 +//prox-launcher +#define PXW 160 +//nailgun +#define NGW 190 +//chaingun +#define CGW 135 + +#include "fuzw.c" diff --git a/q4base/botfiles/bots/tanisha_c.c b/q4base/botfiles/bots/tanisha_c.c new file mode 100644 index 00000000..8d4d7464 --- /dev/null +++ b/q4base/botfiles/bots/tanisha_c.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Tanisha" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 0.3 + CHARACTERISTIC_WEAPONWEIGHTS "bots/tanisha_w.c" + CHARACTERISTIC_AIM_SKILL 0.3 + CHARACTERISTIC_AIM_ACCURACY 0.3 + CHARACTERISTIC_VIEW_FACTOR 0.3 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 1.5 + + CHARACTERISTIC_CHAT_FILE "bots/tanisha_t.c" + CHARACTERISTIC_CHAT_NAME "Tanisha" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 0.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 0.5 + CHARACTERISTIC_GRAPPLE_USER 0.5 + + CHARACTERISTIC_ITEMWEIGHTS "bots/tanisha_i.c" + CHARACTERISTIC_AGGRESSION 0.25 + CHARACTERISTIC_SELFPRESERVATION 0.5 + CHARACTERISTIC_VENGEFULNESS 0.25 + CHARACTERISTIC_CAMPER 0.25 + + CHARACTERISTIC_EASY_FRAGGER 0.5 + CHARACTERISTIC_ALERTNESS 0.5 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.43 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.43 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.43 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.43 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.43 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.43 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.43 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.43 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.43 + + CHARACTERISTIC_FIRETHROTTLE 0.43 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Tanisha" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/tanisha_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 0.9 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.75 + + CHARACTERISTIC_CHAT_FILE "bots/tanisha_t.c" + CHARACTERISTIC_CHAT_NAME "Tanisha" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 1.0 + CHARACTERISTIC_CHAT_MISC 1.0 + CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0 + CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0 + CHARACTERISTIC_CHAT_KILL 1.0 + CHARACTERISTIC_CHAT_DEATH 1.0 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0 + CHARACTERISTIC_CHAT_HITTALKING 1.0 + CHARACTERISTIC_CHAT_HITNODEATH 1.0 + CHARACTERISTIC_CHAT_HITNOKILL 1.0 + CHARACTERISTIC_CHAT_RANDOM 1.0 + CHARACTERISTIC_CHAT_REPLY 1.0 + + CHARACTERISTIC_CROUCHER 0.1 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/tanisha_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.5 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.95 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.95 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.95 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.95 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.95 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.95 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.95 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.95 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.95 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.95 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.95 + + CHARACTERISTIC_FIRETHROTTLE 0.1 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Tanisha" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/tanisha_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 1.0 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.0 + + CHARACTERISTIC_CHAT_FILE "bots/tanisha_t.c" + CHARACTERISTIC_CHAT_NAME "Tanisha" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/tanisha_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.0 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.0 + + CHARACTERISTIC_FIRETHROTTLE 0.01 +} diff --git a/q4base/botfiles/bots/tanisha_i.c b/q4base/botfiles/bots/tanisha_i.c new file mode 100644 index 00000000..79f4b555 --- /dev/null +++ b/q4base/botfiles/bots/tanisha_i.c @@ -0,0 +1,120 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +//health +#define FPH 2 +//armor +#define FPA 2 +//without the weapons +//shotgun +#define SGW 200 +//machinegun +#define MGW 50 +//grenadelauncher +#define GLW 300 +//rocket launcher +#define RLW 400 +//rail gun +#define RGW 260 +//bfg10k +#define BFW 350 +//lightninggun +#define LGW 50 +//plasmagun +#define PGW 250 +//prox-launcher +#define PXW 350 +//nailgun +#define NGW 150 +//chaingun +#define CGW 200 + + + + +//with the weapons +//shotgun +#define GSGW 50 +//machinegun +#define GMGW 50 +//grenadelauncher +#define GGLW 400 +//rocketlauncher +#define GRLW 210 +//railgun +#define GRGW 50 +//bfg10k +#define GBFW 400 +//lightninggun +#define GLGW 50 +//plasmagun +#define GPGW 50 +//prox-launcher +#define GPXW 200 +//failgun +#define GNGW 100 +//chaingun +#define GCGW 125 +//individual powerups +//teleport +#define TELW 190 +//medkit +#define MEDW 50 +//quad-damage +#define QW 500 +//envirosuit +#define ENVW 50 +//haste +#define HAW 50 +//invisibility +#define INW 400 +//regeneration +#define REGW 50 +//flight +#define FLW 175 +//kamikaze +#define KAMW 200 +//invulnerability +#define IBW 150 +//portal +#define PORW 300 +//scout +#define SCW 100 +//guard +#define GUW 200 +//doubler +#define DUBW 100 +//ammo-regen +#define AMRW 400 +//red-cube +#define REDCW 200 +//blue-cube +#define BLCW 200 +//ctf flag weight +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/tanisha_t.c b/q4base/botfiles/bots/tanisha_t.c new file mode 100644 index 00000000..7d1ec1fb --- /dev/null +++ b/q4base/botfiles/bots/tanisha_t.c @@ -0,0 +1,289 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "Tanisha" +{ + //the teamplay.h file is included for all kinds of teamplay chats + #include "teamplay.h" + //====================================================== + //====================================================== + type "game_enter" //initiated when the bot enters the game + { + "Hello."; + "Are you prepared for pain?"; + HELLO1; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "game_exit" //initiated when the bot exits the game + { + "Look at the ~time"; + 4, " kinda wears on me, I think I'll find a different server, later ~peeps"; + GOODBYE1; + GOODBYE0; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "level_start" //initiated when a new level starts + { + 0, " it is time for some payback!"; + 1, " you are going to have some pain in ", 4, "."; + HELLO2; + + // 0 = bot name + } //end type + type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings + { + "HA! ", 3, " is at the bottom, as usual."; + 2, ", I let you win."; + 4, " has changed a lot, it is much faster now."; + "Is it over yet?"; + "I can remember when ", 4, " didn't suck."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_victory" //initiated when a level ends and the bot is first in the rankings + { + 3, " you need to practice more... and forget about winning against me."; + LEVEL_END_VICTORY1; + "I really like ", 4, " since they fixed it, it is so easy to win!"; + "Next time, don't bother."; + // 0 = bot name + // 1 = random opponent + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_lose" //initiated when a level ends and the bot is last in the rankings + { + 2, " cheated."; + "I had a hang nail, so of course I lost."; + "So much for my bluster..."; + "I felt bad for you so I let you win."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 4 = level's title + } //end type + //====================================================== + //====================================================== + type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship + { + 0, ", didn't your mother ever tell you it was rude to interrupt a conversation?"; + "I am going to shove that ", 1, " down your throat if you do that again!"; + "Hey jerk! I was trying to hold a conversation here... do you mind?"; + "Jerk"; + DEATH_TALKING; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult + { + 1, " is not a good weapon, a ", weapon, " should be more your speed."; + "You need to aim better."; + "Try harder next time."; + curse; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nokill" //bot hits an opponent but does not kill it + { + 0, " must be cheating."; + "Dammit! Why won't you die?!?"; + "Well that sucked..."; + "Note to self... turn off safety next ~time"; + // 0 = opponent + } //end type + type "enemy_suicide" //enemy of the bot commits suicide + { + "Stop smoking ", substance, " and maybe you won't kill yourself so often."; + "Tired of life, ", 0, "? Give it up."; + "I guess that beats dying of ", disease, "..."; + // 0 = enemy + } //end type + //====================================================== + //====================================================== + type "death_telefrag" //initiated when the bot is killed by a telefrag + { + "I hate praetorian impressions."; + "My ", counselor, " warned about days like this."; + "D'oh!"; + DEATH_TELEFRAGGED1; + // 0 = enemy name + } //end type + type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage + { + DEATH_FALLING0; + "It didn't look that high from up there..."; + "*sigh*"; + // 0 = random opponent + } //end type + type "death_lava" //initiated when the bot dies in lava + { + "Well... it beats a case of hypothermia."; + "At least it is warm here"; + DEATH_SUICIDE1; + // 0 = random opponent + } //end type + type "death_slime" //initiated when the bot dies in slime + { + "Green has never been my color..."; + DEATH_SLIME1; + // 0 = random opponent + } //end type + type "death_drown" //initiated when the bot drowns + { + DEATH_DROWN0; + "It isn't that difficult to just breath water..."; + "So why can't I breath water?"; + // 0 = random opponent + } //end type + type "death_suicide" //initiated when bot blows self up with a weapon or craters + { + DEATH_SUICIDE2; + "So much for life and all of its cruel irony."; + "It is just easier for ", 0, " this way."; + + + // 0 = random opponent + } //end type + type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack + { + "Unsanitary."; + "What part of '~Don't touch me there' do you not understand?"; + DEATH_GAUNTLET1; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Gauntlet) + } //end type + type "death_rail" //initiated when the bot is killed by a rail gun shot + { + DEATH_INSULT0; + DEATH_FEM_INSULT1; + DEATH_INSULT5; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Railgun) + } //end type + type "death_bfg" //initiated when the bot died by a BFG + { + "Can't find a skill weapon? Or is it just that you suck?"; + "Over-compensating for something?"; + DEATH_BFG0; + DEATH_BFG2; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to BFG10K) + } //end type + type "death_insult" //insult initiated when the bot died + { + curse; + "This is far more painful than it looks."; + "One day, ", 0, " you me and a ", weapon, " are going to have a discussion."; + "Is that the best you can do?"; + DEATH_INSULT2; + DEATH_INSULT0; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + type "death_praise" //praise initiated when the bot died + { + "Not bad, ", 0, ", have you been practicing?"; + "I never saw it coming."; + D_PRAISE0; + D_PRAISE1; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + //====================================================== + //====================================================== + type "kill_rail" //initiated when the bot kills someone with rail gun + { + 0, ", you should stay down..."; + "*sigh* if only this was challenging."; + "I love this gun!"; + "Way too easy"; + // 0 = enemy name + } //end type + type "kill_gauntlet" //initiated when the bot kills someone with gauntlet + { + "LOL!"; + "Too easy"; + // 0 = enemy name + } //end type + type "kill_telefrag" //initiated when the bot telefragged someone + { + "LOL!"; + "Aww man... now I have to take a bath to get the brains out."; + "Does anyone have a quick way of getting brains out of your hair?"; + // 0 = enemy name + } //end type + type "kill_insult" //insult initiated when the bot killed someone + { + KILL_INSULT4; + "Why do you even bother?"; + + + // 0 = enemy name + } //end type + type "kill_praise" //praise initiated when the bot killed someone + { + "You are getting better, ", 0, ", keep it up and you might actually win something."; + + // 0 = enemy name + } //end type + //====================================================== + //====================================================== + type "random_insult" //insult initiated randomly (just when the bot feels like it) + { + TAUNT0; + TAUNT_FEM0; + TAUNT1; + "You should give up your ", substance, " addiction by next ", month, "."; + "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!"; + immaturity01; + "Your ", family_member, " needs to stop calling me."; + + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type + type "random_misc" //miscellanous chats initiated randomly + { + "this one time, at band camp..."; + GRRLTALK1; + MISC4; + "Has anyone tried out the new ", 5, "? Is it worth the upgrade?"; + MISC1; + "You would be surprised what you can do with a ", animal, " a ", food, " and ", peeps, "."; + "Next time you see Gargoyle tell him to call me, mmmkay?"; + neuterbot, " is cute."; + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type +} //end chat + diff --git a/q4base/botfiles/bots/tanisha_w.c b/q4base/botfiles/bots/tanisha_w.c new file mode 100644 index 00000000..5d7131b0 --- /dev/null +++ b/q4base/botfiles/bots/tanisha_w.c @@ -0,0 +1,55 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +/*weapon defines weights 10-500 + try to keep it balanced*/ + +#include "inv.h" +//gauntlet +#define GTW 10 +//shotgun +#define SGW 160 +//machinegun +#define MGW 95 +//grenade launcher +#define GLW 150 +//rocket launcher +#define RLW 200 +//railgun +#define RGW 210 +//bfg10k +#define BFW 90 +//lightninggun +#define LGW 200 +//plasmagun +#define PGW 130 +//grapplinghook +#define GRW 10 +//prox-launcher +#define PXW 175 +//nailgun +#define NGW 190 +//chaingun +#define CGW 135 + +#include "fuzw.c" diff --git a/q4base/botfiles/bots/tony_c.c b/q4base/botfiles/bots/tony_c.c new file mode 100644 index 00000000..0d5ea08c --- /dev/null +++ b/q4base/botfiles/bots/tony_c.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Tony" + CHARACTERISTIC_GENDER "male" + CHARACTERISTIC_ATTACK_SKILL 0.25 + CHARACTERISTIC_WEAPONWEIGHTS "bots/tony_w.c" + CHARACTERISTIC_AIM_SKILL 0.25 + CHARACTERISTIC_AIM_ACCURACY 0.25 + CHARACTERISTIC_VIEW_FACTOR 0.25 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 3.0 + + CHARACTERISTIC_CHAT_FILE "bots/tony_t.c" + CHARACTERISTIC_CHAT_NAME "tony" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.5 + CHARACTERISTIC_CHAT_MISC 0.5 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.5 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.5 + CHARACTERISTIC_CHAT_KILL 0.5 + CHARACTERISTIC_CHAT_DEATH 0.5 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.5 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.5 + CHARACTERISTIC_CHAT_HITNOKILL 0.5 + CHARACTERISTIC_CHAT_RANDOM 0.5 + CHARACTERISTIC_CHAT_REPLY 0.5 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 0.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 0.5 + CHARACTERISTIC_GRAPPLE_USER 0.5 + + CHARACTERISTIC_ITEMWEIGHTS "bots/tony_i.c" + CHARACTERISTIC_AGGRESSION 0.25 + CHARACTERISTIC_SELFPRESERVATION 0.5 + CHARACTERISTIC_VENGEFULNESS 0.25 + CHARACTERISTIC_CAMPER 0.25 + + CHARACTERISTIC_EASY_FRAGGER 0.5 + CHARACTERISTIC_ALERTNESS 0.5 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.3 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.3 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.3 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.3 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.3 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.3 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.3 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.3 + + CHARACTERISTIC_FIRETHROTTLE 0.3 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Tony" + CHARACTERISTIC_GENDER "male" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/tony_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 0.9 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.75 + + CHARACTERISTIC_CHAT_FILE "bots/tony_t.c" + CHARACTERISTIC_CHAT_NAME "tony" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.1 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/tony_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.5 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.75 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.75 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.75 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.75 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.75 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.75 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.75 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.75 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Tony" + CHARACTERISTIC_GENDER "male" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/tony_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 1.0 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.0 + + CHARACTERISTIC_CHAT_FILE "bots/tony_t.c" + CHARACTERISTIC_CHAT_NAME "tony" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/tony_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.0 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.0 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} diff --git a/q4base/botfiles/bots/tony_i.c b/q4base/botfiles/bots/tony_i.c new file mode 100644 index 00000000..4315f6c4 --- /dev/null +++ b/q4base/botfiles/bots/tony_i.c @@ -0,0 +1,120 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +//health +#define FPH 2 +//armor +#define FPA 2 +//without the weapons +//shotgun +#define SGW 200 +//machinegun +#define MGW 50 +//grenadelauncher +#define GLW 400 +//rocket launcher +#define RLW 400 +//rail gun +#define RGW 260 +//bfg10k +#define BFW 400 +//lightninggun +#define LGW 50 +//plasmagun +#define PGW 250 +//prox-launcher +#define PXW 350 +//nailgun +#define NGW 150 +//chaingun +#define CGW 200 + + + + +//with the weapons +//shotgun +#define GSGW 50 +//machinegun +#define GMGW 50 +//grenadelauncher +#define GGLW 400 +//rocketlauncher +#define GRLW 210 +//railgun +#define GRGW 50 +//bfg10k +#define GBFW 400 +//lightninggun +#define GLGW 50 +//plasmagun +#define GPGW 50 +//prox-launcher +#define GPXW 200 +//failgun +#define GNGW 100 +//chaingun +#define GCGW 125 +//individual powerups +//teleport +#define TELW 190 +//medkit +#define MEDW 50 +//quad-damage +#define QW 500 +//envirosuit +#define ENVW 50 +//haste +#define HAW 50 +//invisibility +#define INW 400 +//regeneration +#define REGW 50 +//flight +#define FLW 40 +//kamikaze +#define KAMW 200 +//invulnerability +#define IBW 150 +//portal +#define PORW 300 +//scout +#define SCW 100 +//guard +#define GUW 200 +//doubler +#define DUBW 100 +//ammo-regen +#define AMRW 400 +//red-cube +#define REDCW 200 +//blue-cube +#define BLCW 200 +//ctf flag weight +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/tony_t.c b/q4base/botfiles/bots/tony_t.c new file mode 100644 index 00000000..e7ca7334 --- /dev/null +++ b/q4base/botfiles/bots/tony_t.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "Tony" +{ + #include "teamplay.h" + + type "game_enter" + { + "Here we go again."; + "Why don't you people just lay down and die, it'll save me the trouble."; + } + + type "game_exit" + { + GOODBYE1; + GOODBYE4; + GOODBYE3; + } + + type "level_start" + { + "Oh man, ", 4, " again?!?"; + "Alright, ", 4, " has always been good to me."; + } + + type "level_end" + { + "nice place ", 4, ", much less dangerous than d3dm2."; + } + + type "level_end_victory" + { + "Yep."; + } + + type "level_end_lose" + { + "Aww... crap!"; + } + + type "hit_talking" + { + DEATH_TALKING; + + } + + type "hit_nodeath" + { + TAUNT0; + TAUNT1; + TAUNT2; + } + + type "hit_nokill" + { + HIT_NOKILL0; + HIT_NOKILL1; + HIT_NOKILL1; + } + + type "death_telefrag" + { + DEATH_TELEFRAGGED0; + DEATH_TELEFRAGGED0; + DEATH_TELEFRAGGED0; + } + + type "death_cratered" + { + DEATH_FALLING0; + DEATH_FALLING0; + DEATH_FALLING0; + } + + type "death_lava" + { + "Well it was getting a bit nippy..."; + "mmm... toasty!"; + } + + type "death_slime" + { + "D'oh!"; + } + + type "death_drown" + { + "Who needs air?"; + } + + type "death_suicide" + { + DEATH_SUICIDE0; + DEATH_SUICIDE1; + DEATH_SUICIDE1; + } + + type "death_gauntlet" + { + DEATH_GAUNTLET0; + DEATH_GAUNTLET1; + DEATH_GAUNTLET1; + } + + type "death_rail" + { + DEATH_RAIL1; + DEATH_RAIL1; + DEATH_RAIL0; + + } + + type "death_bfg" + { + DEATH_BFG1; + DEATH_BFG0; + + } + + type "death_insult" + { + "What the... how cheap!"; + "Back in my day, frags weren't so cheap."; + } + + type "death_praise" + { + 0, " is death incarnate."; + } + + type "kill_rail" + { + KILL_RAIL0; + KILL_RAIL1; + } + + type "kill_gauntlet" + { + KILL_GAUNTLET0; + KILL_GAUNTLET1; + + } + + type "kill_telefrag" + { + TELEFRAGGED0; + TELEFRAGGED1; + } + + type "kill_suicide" + { + TAUNT0; + TAUNT1; + } + + type "kill_insult" + { + "Pathetic."; + "tsk"; + "My ", family_member, " could do better."; + } + + type "kill_praise" + { + "Nice one, ", 0, "."; + "Wow, ~you never saw that one coming, ", 0, "."; + } + + type "random_insult" + { + 0, ", ~you suck!"; + 0, " needs to stop calling my mom."; + } + + type "random_misc" + { + 0, " gave my ~mom ", disease, "."; + "Is it true that ", peeps, " is a bot?"; + + } +} diff --git a/q4base/botfiles/bots/tony_w.c b/q4base/botfiles/bots/tony_w.c new file mode 100644 index 00000000..d58dcaa4 --- /dev/null +++ b/q4base/botfiles/bots/tony_w.c @@ -0,0 +1,55 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +/*weapon defines weights 10-500 + try to keep it balanced*/ + +#include "inv.h" +//gauntlet +#define GTW 50 +//shotgun +#define SGW 190 +//machinegun +#define MGW 100 +//grenade launcher +#define GLW 190 +//rocket launcher +#define RLW 200 +//railgun +#define RGW 160 +//bfg10k +#define BFW 80 +//lightninggun +#define LGW 190 +//plasmagun +#define PGW 175 +//grapplinghook +#define GRW 10 +//prox-launcher +#define PXW 185 +//nailgun +#define NGW 260 +//chaingun +#define CGW 215 + +#include "fuzw.c" diff --git a/q4base/botfiles/bots/widowe_c.c b/q4base/botfiles/bots/widowe_c.c new file mode 100644 index 00000000..f282df6f --- /dev/null +++ b/q4base/botfiles/bots/widowe_c.c @@ -0,0 +1,202 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "chars.h" + + +skill 1 +{ + CHARACTERISTIC_NAME "Widowe" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 0.25 + CHARACTERISTIC_WEAPONWEIGHTS "bots/widowe_w.c" + CHARACTERISTIC_AIM_SKILL 0.25 + CHARACTERISTIC_AIM_ACCURACY 0.25 + CHARACTERISTIC_VIEW_FACTOR 0.25 + CHARACTERISTIC_VIEW_MAXCHANGE 90 + CHARACTERISTIC_REACTIONTIME 3.0 + + CHARACTERISTIC_CHAT_FILE "bots/widowe_t.c" + CHARACTERISTIC_CHAT_NAME "widowe" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.5 + CHARACTERISTIC_CHAT_MISC 0.5 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.5 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.5 + CHARACTERISTIC_CHAT_KILL 0.5 + CHARACTERISTIC_CHAT_DEATH 0.5 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.5 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.5 + CHARACTERISTIC_CHAT_HITNOKILL 0.5 + CHARACTERISTIC_CHAT_RANDOM 0.5 + CHARACTERISTIC_CHAT_REPLY 0.5 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 0.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 0.5 + CHARACTERISTIC_GRAPPLE_USER 0.5 + + CHARACTERISTIC_ITEMWEIGHTS "bots/widowe_i.c" + CHARACTERISTIC_AGGRESSION 0.25 + CHARACTERISTIC_SELFPRESERVATION 0.5 + CHARACTERISTIC_VENGEFULNESS 0.25 + CHARACTERISTIC_CAMPER 0.25 + + CHARACTERISTIC_EASY_FRAGGER 0.5 + CHARACTERISTIC_ALERTNESS 0.5 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.3 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.3 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.3 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.3 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.3 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.3 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.3 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.3 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.3 + + CHARACTERISTIC_FIRETHROTTLE 0.3 +} + +skill 4 +{ + CHARACTERISTIC_NAME "Widowe" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/widowe_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 0.9 + CHARACTERISTIC_VIEW_MAXCHANGE 240 + CHARACTERISTIC_REACTIONTIME 1.75 + + CHARACTERISTIC_CHAT_FILE "bots/widowe_t.c" + CHARACTERISTIC_CHAT_NAME "widowe" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.1 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/widowe_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.5 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.75 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.75 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.75 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.75 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.75 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.75 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.75 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.75 + CHARACTERISTIC_AIM_SKILL_BFG10K 0.75 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} + +skill 5 +{ + CHARACTERISTIC_NAME "Widowe" + CHARACTERISTIC_GENDER "female" + CHARACTERISTIC_ATTACK_SKILL 1.0 + CHARACTERISTIC_WEAPONWEIGHTS "bots/widowe_w.c" + CHARACTERISTIC_AIM_SKILL 1.0 + CHARACTERISTIC_AIM_ACCURACY 1.0 + CHARACTERISTIC_VIEW_FACTOR 1.0 + CHARACTERISTIC_VIEW_MAXCHANGE 360 + CHARACTERISTIC_REACTIONTIME 0.0 + + CHARACTERISTIC_CHAT_FILE "bots/widowe_t.c" + CHARACTERISTIC_CHAT_NAME "widowe" + CHARACTERISTIC_CHAT_CPM 400 + CHARACTERISTIC_CHAT_INSULT 0.1 + CHARACTERISTIC_CHAT_MISC 0.1 + CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1 + CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1 + CHARACTERISTIC_CHAT_KILL 0.1 + CHARACTERISTIC_CHAT_DEATH 0.1 + CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1 + CHARACTERISTIC_CHAT_HITTALKING 0.1 + CHARACTERISTIC_CHAT_HITNODEATH 0.1 + CHARACTERISTIC_CHAT_HITNOKILL 0.1 + CHARACTERISTIC_CHAT_RANDOM 0.1 + CHARACTERISTIC_CHAT_REPLY 0.1 + + CHARACTERISTIC_CROUCHER 0.0 + CHARACTERISTIC_JUMPER 1.0 + CHARACTERISTIC_WALKER 0.0 + CHARACTERISTIC_WEAPONJUMPING 1.0 + CHARACTERISTIC_GRAPPLE_USER 1.0 + + CHARACTERISTIC_ITEMWEIGHTS "bots/widowe_i.c" + CHARACTERISTIC_AGGRESSION 1.0 + CHARACTERISTIC_SELFPRESERVATION 1.0 + CHARACTERISTIC_VENGEFULNESS 1.0 + CHARACTERISTIC_CAMPER 0.0 + + CHARACTERISTIC_EASY_FRAGGER 1.0 + CHARACTERISTIC_ALERTNESS 1.0 + + CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7 + CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0 + CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0 + CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0 + CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0 + CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0 + CHARACTERISTIC_AIM_SKILL_BFG10K 1.0 + + CHARACTERISTIC_FIRETHROTTLE 1.0 +} diff --git a/q4base/botfiles/bots/widowe_i.c b/q4base/botfiles/bots/widowe_i.c new file mode 100644 index 00000000..b620615c --- /dev/null +++ b/q4base/botfiles/bots/widowe_i.c @@ -0,0 +1,120 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + + +//health +#define FPH 2 +//armor +#define FPA 2 +//without the weapons +//shotgun +#define SGW 200 +//machinegun +#define MGW 50 +//grenadelauncher +#define GLW 400 +//rocket launcher +#define RLW 400 +//rail gun +#define RGW 260 +//bfg10k +#define BFW 400 +//lightninggun +#define LGW 50 +//plasmagun +#define PGW 250 +//prox-launcher +#define PXW 350 +//nailgun +#define NGW 150 +//chaingun +#define CGW 200 + + + + +//with the weapons +//shotgun +#define GSGW 50 +//machinegun +#define GMGW 50 +//grenadelauncher +#define GGLW 400 +//rocketlauncher +#define GRLW 210 +//railgun +#define GRGW 50 +//bfg10k +#define GBFW 400 +//lightninggun +#define GLGW 50 +//plasmagun +#define GPGW 50 +//prox-launcher +#define GPXW 200 +//failgun +#define GNGW 100 +//chaingun +#define GCGW 125 +//individual powerups +//teleport +#define TELW 190 +//medkit +#define MEDW 50 +//quad-damage +#define QW 500 +//envirosuit +#define ENVW 50 +//haste +#define HAW 50 +//invisibility +#define INW 400 +//regeneration +#define REGW 50 +//flight +#define FLW 15 +//kamikaze +#define KAMW 200 +//invulnerability +#define IBW 150 +//portal +#define PORW 300 +//scout +#define SCW 100 +//guard +#define GUW 200 +//doubler +#define DUBW 100 +//ammo-regen +#define AMRW 400 +//red-cube +#define REDCW 200 +//blue-cube +#define BLCW 200 +//ctf flag weight +#define FGW 400 + +// +#include "fuzi.c" diff --git a/q4base/botfiles/bots/widowe_t.c b/q4base/botfiles/bots/widowe_t.c new file mode 100644 index 00000000..606b12da --- /dev/null +++ b/q4base/botfiles/bots/widowe_t.c @@ -0,0 +1,275 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +chat "Widowe" +{ + //the teamplay.h file is included for all kinds of teamplay chats + #include "teamplay.h" + //====================================================== + //====================================================== + type "game_enter" //initiated when the bot enters the game + { + "Hello."; + HELLO1; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "game_exit" //initiated when the bot exits the game + { + "Look at the ~time"; + GOODBYE1; + GOODBYE0; + // 0 = bot name + // 1 = random opponent + // 4 = level's title + } //end type + type "level_start" //initiated when a new level starts + { + 0, " it is time for some payback!"; + 1, " you are going to have some pain in ", 4, "."; + HELLO2; + + // 0 = bot name + } //end type + type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings + { + 2, ", I let you win."; + 4, " has changed a lot, it is much faster now."; + "Is it over yet?"; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_victory" //initiated when a level ends and the bot is first in the rankings + { + 3, " you need to practice more... and forget about winning against me."; + LEVEL_END_VICTORY1; + // 0 = bot name + // 1 = random opponent + // 3 = opponent in last place + // 4 = level's title + } //end type + type "level_end_lose" //initiated when a level ends and the bot is last in the rankings + { + 2, " cheated."; + "I had a hang nail, so of course I lost."; + "So much for my bluster..."; + "I felt bad for you so I let you win."; + // 0 = bot name + // 1 = random opponent + // 2 = opponent in first place + // 4 = level's title + } //end type + //====================================================== + //====================================================== + type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship + { + 0, ", didn't your mother ever tell you it was rude to interrupt a conversation?"; + "I am going to shove that ", 1, " down your throat if you do that again!"; + DEATH_TALKING; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult + { + 1, " is not a good weapon, a ", weapon, " should be more your speed."; + // 0 = shooter + // 1 = weapon used by shooter + } //end type + type "hit_nokill" //bot hits an opponent but does not kill it + { + 0, " must be cheating."; + "Well that sucked..."; + "Note to self... turn off safety next ~time"; + // 0 = opponent + } //end type + type "enemy_suicide" //enemy of the bot commits suicide + { + "Stop smoking ", substance, " and maybe you won't kill yourself so often."; + "Tired of life, ", 0, "? Give it up."; + "I guess that beats dying of ", disease, "..."; + // 0 = enemy + } //end type + //====================================================== + //====================================================== + type "death_telefrag" //initiated when the bot is killed by a telefrag + { + "I hate praetorian impressions."; + "My ", counselor, " warned about days like this."; + "D'oh!"; + DEATH_TELEFRAGGED1; + // 0 = enemy name + } //end type + type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage + { + DEATH_FALLING0; + "It didn't look that high from up there..."; + "*sigh*"; + // 0 = random opponent + } //end type + type "death_lava" //initiated when the bot dies in lava + { + "Well... it beats a case of hypothermia."; + "At least it is warm here"; + DEATH_SUICIDE1; + // 0 = random opponent + } //end type + type "death_slime" //initiated when the bot dies in slime + { + "Green has never been my color..."; + DEATH_SLIME1; + // 0 = random opponent + } //end type + type "death_drown" //initiated when the bot drowns + { + DEATH_DROWN0; + "It isn't that difficult to just breath water..."; + "So why can't I breath water?"; + // 0 = random opponent + } //end type + type "death_suicide" //initiated when bot blows self up with a weapon or craters + { + DEATH_SUICIDE2; + "So much for life and all of its cruel irony."; + "It is just easier for ", 0, " this way."; + + + // 0 = random opponent + } //end type + type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack + { + "Unsanitary."; + "What part of '~Don't touch me there' do you not understand?"; + DEATH_GAUNTLET1; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Gauntlet) + } //end type + type "death_rail" //initiated when the bot is killed by a rail gun shot + { + DEATH_INSULT0; + DEATH_FEM_INSULT1; + DEATH_INSULT5; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to Railgun) + } //end type + type "death_bfg" //initiated when the bot died by a BFG + { + "Can't find a skill weapon? Or is it just that you suck?"; + "Over-compensating for something?"; + DEATH_BFG0; + DEATH_BFG2; + // 0 = enemy name + // 1 = weapon used by enemy (NOTE: always set to BFG10K) + } //end type + type "death_insult" //insult initiated when the bot died + { + curse; + "This is far more painful than it looks."; + "One day, ", 0, " you me and a ", weapon, " are going to have a discussion."; + "Is that the best you can do?"; + DEATH_INSULT2; + DEATH_INSULT0; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + type "death_praise" //praise initiated when the bot died + { + "Not bad, ", 0, ", have you been practicing?"; + "I never saw it coming."; + D_PRAISE0; + D_PRAISE1; + // 0 = enemy name + // 1 = weapon used by enemy + } //end type + //====================================================== + //====================================================== + type "kill_rail" //initiated when the bot kills someone with rail gun + { + 0, ", you should stay down..."; + "*sigh* if only this was challenging."; + "I love this gun!"; + "Way too easy"; + // 0 = enemy name + } //end type + type "kill_gauntlet" //initiated when the bot kills someone with gauntlet + { + "LOL!"; + "Too easy"; + // 0 = enemy name + } //end type + type "kill_telefrag" //initiated when the bot telefragged someone + { + "LOL!"; + "Aww man... now I have to take a bath to get the brains out."; + "Does anyone have a quick way of getting brains out of your hair?"; + // 0 = enemy name + } //end type + type "kill_insult" //insult initiated when the bot killed someone + { + KILL_INSULT4; + "Why do you even bother?"; + "This is why the upper classes are called the 'ruling elite.'"; + "Why do the lower classes think they can match someone of my caliber?"; + + // 0 = enemy name + } //end type + type "kill_praise" //praise initiated when the bot killed someone + { + "You are getting better, ", 0, ", keep it up and you might actually win something."; + "That was a challenge."; + // 0 = enemy name + } //end type + //====================================================== + //====================================================== + type "random_insult" //insult initiated randomly (just when the bot feels like it) + { + TAUNT0; + TAUNT_FEM0; + TAUNT1; + curse; + "You should give up your ", substance, " addiction by next ", month, "."; + "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!"; + immaturity01; + "Your ", family_member, " needs to stop calling me."; + + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type + type "random_misc" //miscellanous chats initiated randomly + { + GRRLTALK0; + MISC4; + "Has anyone tried out the new ", 5, "? Is it worth the upgrade?"; + MISC1; + // 0 = name of randomly chosen player + // 1 = name of the last player killed by this bot + // 4 = level's title + // 5 = random weapon from weapon list + } //end type +} //end chat + diff --git a/q4base/botfiles/bots/widowe_w.c b/q4base/botfiles/bots/widowe_w.c new file mode 100644 index 00000000..7958e74a --- /dev/null +++ b/q4base/botfiles/bots/widowe_w.c @@ -0,0 +1,55 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +/*weapon defines weights 10-500 + try to keep it balanced*/ + +#include "inv.h" +//gauntlet +#define GTW 25 +//shotgun +#define SGW 130 +//machinegun +#define MGW 90 +//grenade launcher +#define GLW 125 +//rocket launcher +#define RLW 190 +//railgun +#define RGW 200 +//bfg10k +#define BFW 105 +//lightninggun +#define LGW 120 +//plasmagun +#define PGW 190 +//grapplinghook +#define GRW 10 +//prox-launcher +#define PXW 130 +//nailgun +#define NGW 160 +//chaingun +#define CGW 180 + +#include "fuzw.c" diff --git a/q4base/botfiles/chars.h b/q4base/botfiles/chars.h new file mode 100644 index 00000000..ae96f567 --- /dev/null +++ b/q4base/botfiles/chars.h @@ -0,0 +1,134 @@ +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Quake III Arena source code is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +//======================================================== +//======================================================== +//name +#define CHARACTERISTIC_NAME 0 //string +//gender of the bot +#define CHARACTERISTIC_GENDER 1 //string ("male", "female", "it") +//attack skill +// > 0.0 && < 0.2 = don't move +// > 0.3 && < 1.0 = aim at enemy during retreat +// > 0.0 && < 0.4 = only move forward/backward +// >= 0.4 && < 1.0 = circle strafing +// > 0.7 && < 1.0 = random strafe direction change +#define CHARACTERISTIC_ATTACK_SKILL 2 //float [0, 1] +//weapon weight file +#define CHARACTERISTIC_WEAPONWEIGHTS 3 //string +//view angle difference to angle change factor +#define CHARACTERISTIC_VIEW_FACTOR 4 //float <0, 1] +//maximum view angle change +#define CHARACTERISTIC_VIEW_MAXCHANGE 5 //float [1, 360] +//reaction time in seconds +#define CHARACTERISTIC_REACTIONTIME 6 //float [0, 5] +//accuracy when aiming +#define CHARACTERISTIC_AIM_ACCURACY 7 //float [0, 1] +//weapon specific aim accuracy +#define CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 8 //float [0, 1] +#define CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 9 //float [0, 1] +#define CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 10 //float [0, 1] +#define CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 11 //float [0, 1] +#define CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 12 +#define CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 13 //float [0, 1] +#define CHARACTERISTIC_AIM_ACCURACY_RAILGUN 14 +#define CHARACTERISTIC_AIM_ACCURACY_BFG10K 15 //float [0, 1] +//skill when aiming +// > 0.0 && < 0.9 = aim is affected by enemy movement +// > 0.4 && <= 0.8 = enemy linear leading +// > 0.8 && <= 1.0 = enemy exact movement leading +// > 0.5 && <= 1.0 = prediction shots when enemy is not visible +// > 0.6 && <= 1.0 = splash damage by shooting nearby geometry +#define CHARACTERISTIC_AIM_SKILL 16 //float [0, 1] +//weapon specific aim skill +#define CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 17 //float [0, 1] +#define CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 18 //float [0, 1] +#define CHARACTERISTIC_AIM_SKILL_PLASMAGUN 19 //float [0, 1] +#define CHARACTERISTIC_AIM_SKILL_BFG10K 20 //float [0, 1] +//======================================================== +//chat +//======================================================== +//file with chats +#define CHARACTERISTIC_CHAT_FILE 21 //string +//name of the chat character +#define CHARACTERISTIC_CHAT_NAME 22 //string +//characters per minute type speed +#define CHARACTERISTIC_CHAT_CPM 23 //integer [1, 4000] +//tendency to insult/praise +#define CHARACTERISTIC_CHAT_INSULT 24 //float [0, 1] +//tendency to chat misc +#define CHARACTERISTIC_CHAT_MISC 25 //float [0, 1] +//tendency to chat at start or end of level +#define CHARACTERISTIC_CHAT_STARTENDLEVEL 26 //float [0, 1] +//tendency to chat entering or exiting the game +#define CHARACTERISTIC_CHAT_ENTEREXITGAME 27 //float [0, 1] +//tendency to chat when killed someone +#define CHARACTERISTIC_CHAT_KILL 28 //float [0, 1] +//tendency to chat when died +#define CHARACTERISTIC_CHAT_DEATH 29 //float [0, 1] +//tendency to chat when enemy suicides +#define CHARACTERISTIC_CHAT_ENEMYSUICIDE 30 //float [0, 1] +//tendency to chat when hit while talking +#define CHARACTERISTIC_CHAT_HITTALKING 31 //float [0, 1] +//tendency to chat when bot was hit but didn't dye +#define CHARACTERISTIC_CHAT_HITNODEATH 32 //float [0, 1] +//tendency to chat when bot hit the enemy but enemy didn't dye +#define CHARACTERISTIC_CHAT_HITNOKILL 33 //float [0, 1] +//tendency to randomly chat +#define CHARACTERISTIC_CHAT_RANDOM 34 //float [0, 1] +//tendency to reply +#define CHARACTERISTIC_CHAT_REPLY 35 //float [0, 1] +//======================================================== +//movement +//======================================================== +//tendency to crouch +#define CHARACTERISTIC_CROUCHER 36 //float [0, 1] +//tendency to jump +#define CHARACTERISTIC_JUMPER 37 //float [0, 1] +//tendency to walk +#define CHARACTERISTIC_WALKER 48 //float [0, 1] +//tendency to jump using a weapon +#define CHARACTERISTIC_WEAPONJUMPING 38 //float [0, 1] +//tendency to use the grapple hook when available +#define CHARACTERISTIC_GRAPPLE_USER 39 //float [0, 1] //use this!! +//======================================================== +//goal +//======================================================== +//item weight file +#define CHARACTERISTIC_ITEMWEIGHTS 40 //string +//the aggression of the bot +#define CHARACTERISTIC_AGGRESSION 41 //float [0, 1] +//the self preservation of the bot (rockets near walls etc.) +#define CHARACTERISTIC_SELFPRESERVATION 42 //float [0, 1] +//how likely the bot is to take revenge +#define CHARACTERISTIC_VENGEFULNESS 43 //float [0, 1] //use this!! +//tendency to camp +#define CHARACTERISTIC_CAMPER 44 //float [0, 1] +//======================================================== +//======================================================== +//tendency to get easy frags +#define CHARACTERISTIC_EASY_FRAGGER 45 //float [0, 1] +//how alert the bot is (view distance) +#define CHARACTERISTIC_ALERTNESS 46 //float [0, 1] +//how much the bot fires it's weapon +#define CHARACTERISTIC_FIRETHROTTLE 47 //float [0, 1] + diff --git a/q4base/botfiles/fuzi.c b/q4base/botfiles/fuzi.c new file mode 100644 index 00000000..fea81da8 --- /dev/null +++ b/q4base/botfiles/fuzi.c @@ -0,0 +1,692 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + + +#define ARMOR 20 +#define AMMO 20 +#define HEALTH 20 +#define POWERUP 20 +#define WEAPON 20 + +//breaks compatibility with the existing q3a bots, sorry. +#define FP(x) (x < 0 ? 1 : x) +#define ARS(x) balance($evalfloat(FP(FPA/x)), $evalfloat(FP(FPA/x-ARMOR)), $evalfloat(FP(FPA/x+ARMOR))) +#define AS(x) balance($evalfloat(FP(x)), $evalfloat(FP(x/AMMO)), $evalfloat(FP(x*AMMO))) +#define HS(x) balance($evalfloat(FP(FPH/x)), $evalfloat(FP(FPH/x-HEALTH)), $evalfloat(FP(FPH/x+HEALTH))) +#define PS(x) balance($evalfloat(FP(x)), $evalfloat(FP(x/POWERUP)), $evalfloat(FP(x*POWERUP))) +#define WS(x) balance($evalfloat(FP(x)), $evalfloat(FP(x/WEAPON)), $evalfloat(FP(x*WEAPON))) + + +weight "item_armor_shard" +{ +switch(INVENTORY_SCOUT) + { + case 1: + { + switch(INVENTORY_ARMOR) + { + case 10: return ARS(20); + case 20: return ARS(20); + case 30: return ARS(20); + case 40: return ARS(19); + case 50: return ARS(19); + case 60: return ARS(19); + case 70: return ARS(19); + case 80: return ARS(18); + case 90: return ARS(18); + case 100: return ARS(15); + case 110: return ARS(15); + case 120: return ARS(15); + case 130: return ARS(15); + case 140: return ARS(12); + case 150: return ARS(12); + case 160: return ARS(12); + case 170: return ARS(12); + case 180: return ARS(12); + case 190: return ARS(11); + case 200: return ARS(11); + default: return ARS(1); + } + } + default: return 0; + } +} + +weight "item_armor_combat" +{ + switch(INVENTORY_SCOUT) + { + case 1: + { + switch(INVENTORY_ARMOR) + { + case 10: return ARS(80); + case 20: return ARS(70); + case 30: return ARS(65); + case 40: return ARS(65); + case 50: return ARS(65); + case 60: return ARS(60); + case 70: return ARS(60); + case 80: return ARS(40); + case 90: return ARS(40); + case 100: return ARS(40); + case 110: return ARS(30); + case 120: return ARS(30); + case 130: return ARS(30); + case 140: return ARS(25); + case 150: return ARS(25); + case 160: return ARS(25); + case 170: return ARS(25); + case 180: return ARS(20); + case 190: return ARS(20); + case 200: return ARS(20); + default: return ARS(1); + } + } + default: return 0; + } +} + +weight "item_armor_body" +{ + switch(INVENTORY_SCOUT) + { + case 1: + { + switch(INVENTORY_ARMOR) + { + case 10: return ARS(100); + case 20: return ARS(95); + case 30: return ARS(95); + case 40: return ARS(95); + case 50: return ARS(90); + case 60: return ARS(60); + case 70: return ARS(60); + case 80: return ARS(55); + case 90: return ARS(55); + case 100: return ARS(50); + case 110: return ARS(40); + case 120: return ARS(40); + case 130: return ARS(35); + case 140: return ARS(25); + case 150: return ARS(15); + case 160: return ARS(15); + case 170: return ARS(15); + case 180: return ARS(10); + case 190: return ARS(10); + case 200: return ARS(10); + default: return ARS(1); + } + } + default: return 0; + } +} + +weight "item_health_small" +{ + switch(INVENTORY_HEALTH) + { + case 10: return HS(100); + case 20: return HS(90); + case 30: return HS(85); + case 40: return HS(80); + case 50: return HS(75); + case 60: return HS(70); + case 70: return HS(65); + case 80: return HS(60); + case 90: return HS(55); + case 100: return HS(50); + default: return 0; + } +} + +weight "item_health" +{ + switch(INVENTORY_HEALTH) + { + case 10: return HS(110); + case 20: return HS(100); + case 30: return HS(90); + case 40: return HS(80); + case 50: return HS(70); + case 60: return HS(60); + case 70: return HS(50); + case 80: return HS(40); + case 90: return HS(30); + case 100: return HS(30); + default: return 0; + } +} + +weight "item_health_large" +{ + + switch(INVENTORY_HEALTH) + { + case 10: return HS(120); + case 20: return HS(110); + case 30: return HS(100); + case 40: return HS(90); + case 50: return HS(80); + case 60: return HS(70); + case 70: return HS(60); + case 80: return HS(50); + case 90: return HS(40); + case 100: return HS(30); + default: return 0; + } +} + +weight "item_health_mega" +{ + switch(INVENTORY_HEALTH) + { + case 10: return HS(150); + case 20: return HS(120); + case 30: return HS(110); + case 40: return HS(100); + case 50: return HS(90); + case 60: return HS(90); + case 70: return HS(80); + case 80: return HS(80); + case 90: return HS(70); + case 100: return HS(60); + default: return 0; + } +} + +weight "weapon_shotgun_mp" +{ + switch(INVENTORY_SHOTGUN) + { + case 1: return WS(SGW); + default: return 1; + } +} + +weight "weapon_machinegun_mp" +{ + switch(INVENTORY_MACHINEGUN) + { + case 1: return WS(MGW); + default: return 1; + } +} + +weight "weapon_grenadelauncher_mp" +{ + switch(INVENTORY_GRENADELAUNCHER) + { + case 1: return WS(GLW); + default: return 1; + } +} + +weight "weapon_rocketlauncher_mp" +{ + switch(INVENTORY_ROCKETLAUNCHER) + { + case 1: return WS(RLW); + default: return 1; + } +} + +weight "weapon_lightning_mp" +{ + switch(INVENTORY_LIGHTNING) + { + case 1: return WS(LGW); + default: return 1; + } +} + +weight "weapon_railgun_mp" +{ + switch(INVENTORY_RAILGUN) + { + case 1: return WS(RGW); + default: return 1; + } +} + +weight "weapon_plasmagun_mp" +{ + switch(INVENTORY_PLASMAGUN) + { + case 1: return WS(PGW); + default: return 1; + } +} + +weight "weapon_bfg_mp" +{ + switch(INVENTORY_BFG10K) + { + case 1: return WS(BFW); + default: return 1; + } +} + +weight "weapon_nailgun_mp" +{ + switch(INVENTORY_NAILGUN) + { + case 1: return WS(NGW); + default: return 1; + } +} + +weight "weapon_prox_launcher_mp" +{ + switch(INVENTORY_PROXLAUNCHER) + { + case 1: return WS(PXW); + default: return 1; + } +} + +weight "weapon_chaingun" +{ + switch(INVENTORY_CHAINGUN) + { + case 1: return WS(CGW); + default: return 1; + } +} + + +weight "ammo_shells" +{ + switch(INVENTORY_SHELLS) + { + case 20: return AS(30); + case 40: return AS(30); + case 60: return AS(11); + case 80: return AS(11); + case 100: return AS(11); + case 120: return AS(11); + case 140: return AS(11); + case 160: return AS(11); + case 180: return AS(11); + case 200: return AS(11); + default: return 0; + } +} + +weight "ammo_bullets" +{ + switch(INVENTORY_BULLETS) + { + case 20: return AS(30); + case 40: return AS(30); + case 60: return AS(30); + case 80: return AS(11); + case 100: return AS(11); + case 120: return AS(11); + case 140: return AS(11); + case 160: return AS(11); + case 180: return AS(11); + case 200: return AS(11); + default: return 0; + } +} + +weight "ammo_grenades" +{ + switch(INVENTORY_GRENADES) + { + case 20: return AS(30); + case 40: return AS(30); + case 60: return AS(11); + case 80: return AS(11); + case 100: return AS(11); + case 120: return AS(11); + case 140: return AS(11); + case 160: return AS(11); + case 180: return AS(11); + case 200: return AS(11); + default: return 0; + } +} + +weight "ammo_cells" +{ + switch(INVENTORY_CELLS) + { + case 20: return AS(30); + case 40: return AS(30); + case 60: return AS(30); + case 80: return AS(30); + case 100: return AS(11); + case 120: return AS(11); + case 140: return AS(11); + case 160: return AS(11); + case 180: return AS(11); + case 200: return AS(11); + default: return 0; + } +} + +weight "ammo_lightning" +{ + switch(INVENTORY_LIGHTNINGAMMO) + { + case 20: return AS(30); + case 40: return AS(30); + case 60: return AS(30); + case 80: return AS(30); + case 100: return AS(11); + case 120: return AS(11); + case 140: return AS(11); + case 160: return AS(11); + case 180: return AS(11); + case 200: return AS(11); + default: return 0; + } +} + +weight "ammo_rockets" +{ + switch(INVENTORY_ROCKETS) + { + case 20: return AS(30); + case 40: return AS(30); + case 60: return AS(11); + case 80: return AS(11); + case 100: return AS(11); + case 120: return AS(11); + case 140: return AS(11); + case 160: return AS(11); + case 180: return AS(11); + case 200: return AS(11); + default: return 0; + } +} + +weight "ammo_slugs" +{ + switch(INVENTORY_SLUGS) + { + case 20: return AS(30); + case 40: return AS(30); + case 60: return AS(11); + case 80: return AS(11); + case 100: return AS(11); + case 120: return AS(11); + case 140: return AS(11); + case 160: return AS(11); + case 180: return AS(11); + case 200: return AS(11); + default: return 0; + } +} + +weight "ammo_bfg" +{ + switch(INVENTORY_BFGAMMO) + { + case 20: return AS(30); + case 40: return AS(30); + case 60: return AS(11); + case 80: return AS(11); + case 100: return AS(11); + case 120: return AS(11); + case 140: return AS(11); + case 160: return AS(11); + case 180: return AS(11); + case 200: return AS(11); + default: return 0; + } +} + + +weight "ammo_nails" +{ + switch(INVENTORY_NAILS) + { + case 20: return AS(30); + case 40: return AS(30); + case 60: return AS(11); + case 80: return AS(11); + case 100: return AS(11); + case 120: return AS(11); + case 140: return AS(11); + case 160: return AS(11); + case 180: return AS(11); + case 200: return AS(11); + default: return 0; + } +} + +weight "ammo_mines" +{ + switch(INVENTORY_MINES) + { + case 20: return AS(30); + case 40: return AS(11); + case 60: return AS(11); + case 80: return AS(11); + case 100: return AS(11); + case 120: return AS(11); + case 140: return AS(11); + case 160: return AS(11); + case 180: return AS(11); + case 200: return AS(11); + default: return 0; + } +} + +weight "ammo_belt" +{ + switch(INVENTORY_BELT) + { + case 20: return AS(30); + case 40: return AS(11); + case 60: return AS(11); + case 80: return AS(11); + case 100: return AS(11); + case 120: return AS(11); + case 140: return AS(11); + case 160: return AS(11); + case 180: return AS(11); + case 200: return AS(11); + default: return 0; + } +} + + +//needs work + +weight "holdable_teleporter" +{ + switch(INVENTORY_TELEPORTER) + { + case 1: return PS(TELW); + default: return 0; + } +} + +weight "holdable_medkit" +{ + switch(INVENTORY_TELEPORTER) + { + case 1: return PS(MEDW); + default: return 0; + } +} + +weight "holdable_kamikaze" +{ + switch(INVENTORY_TELEPORTER) + { + case 1: return PS(KAMW); + default: return 0; + } +} + +weight "holdable_portal" +{ + switch(INVENTORY_TELEPORTER) + { + case 1: return PS(PORW); + default: return 0; + } +} + +weight "holdable_invulnerability" +{ + switch(INVENTORY_TELEPORTER) + { + case 1: return PS(IBW); + default: return 0; + } +} + +weight "item_quad" +{ + return PS(QW); +} + +weight "item_enviro" +{ + return PS(ENVW); +} + +weight "item_haste" +{ + return PS(HAW); +} + +weight "item_invisibility" +{ + return PS(INW); +} + +weight "item_regen" +{ + return PS(REGW); +} + +weight "item_flight" +{ + return PS(FLW); +} + +weight "item_scout" +{ + switch(INVENTORY_SCOUT) + { + case 1: return PS(SCW); + default: return 0; + } +} + +weight "item_guard" +{ + switch(INVENTORY_SCOUT) + { + case 1: return PS(GUW); + default: return 0; + } +} + +weight "item_doubler" +{ + switch(INVENTORY_SCOUT) + { + case 1: return PS(DUBW); + default: return 0; + } +} + +weight "item_ammoregen" +{ + switch(INVENTORY_SCOUT) + { + case 1: return PS(AMRW); + default: return 0; + } +} + + +//============================================= +// This is only used to pickup dropped CTF +// flags now. The logic in here makes no +// sense since the bot has specific CTF AI. +// yet without it the bots barely move towards +// the opposing flags due to low flag weights. +//============================================= + +weight "team_CTF_redflag" +{ + switch(INVENTORY_REDFLAG) + { + case 1: return FGW; + default: return 300; + } +} + +weight "team_CTF_blueflag" +{ + switch(INVENTORY_BLUEFLAG) + { + case 1: return FGW; + default: return 300; + } +} + + +weight "team_CTF_neutralflag" +{ + return FGW; +} + +weight "item_redcube" +{ + return REDCW; +} + +weight "item_bluecube" +{ + return BLCW; +} + +weight "item_botroam" +{ + return 1; +} + +weight "team_dom_pointWhite" +{ + return 1000; +} + +weight "team_dom_pointRed" +{ + return 700; +} + +weight "team_dom_pointBlue" +{ + return 700; +} diff --git a/q4base/botfiles/fuzw.c b/q4base/botfiles/fuzw.c new file mode 100644 index 00000000..e5533c4b --- /dev/null +++ b/q4base/botfiles/fuzw.c @@ -0,0 +1,282 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +weight "BFG10K" +{ + switch(INVENTORY_BFG10K) + { + case 1: return 0; + default: + { + switch(INVENTORY_BFGAMMO) + { + case 1: return 0; + default: return BFW; + } + } + } +} + +weight "Chaingun" +{ + switch(INVENTORY_CHAINGUN) + { + case 1: return 0; + default: + { + switch(INVENTORY_BELT) + { + case 1: return 0; + default: + { + switch(ENEMY_HORIZONTAL_DIST) + { + case 900: return CGW; + default: return $evalint(CGW*0.1); + } + } + } + } + } +} + + +weight "Gauntlet" +{ + switch(INVENTORY_GAUNTLET) + { + case 1: return 0; + default: return GTW; + } +} + +weight "Grappling Hook" +{ + switch(INVENTORY_GRAPPLINGHOOK) + { + case 1: return 0; + default: return GRW; + } +} + + +weight "Grenade Launcher" +{ + switch(INVENTORY_GRENADELAUNCHER) + { + case 1: return 0; + default: + { + switch(INVENTORY_GRENADES) + { + case 1: return 0; + default: + { + switch(ENEMY_HORIZONTAL_DIST) + { + case 600: return GLW; + default: return $evalint(GLW*0.1); + } + } + } + } + } +} + +weight "Lightning Gun" +{ + switch(INVENTORY_LIGHTNING) + { + case 1: return 0; + default: + { + switch(INVENTORY_LIGHTNINGAMMO) + { + case 1: return 0; + default: + { + switch(ENEMY_HORIZONTAL_DIST) + { + case 768: return LGW; + default: return $evalint(LGW*0.1); + } + } + } + } + } +} + +weight "Machinegun" +{ + switch(INVENTORY_MACHINEGUN) + { + case 1: return 0; + default: + { + switch(INVENTORY_BULLETS) + { + case 1: return 0; + default: + { + switch(ENEMY_HORIZONTAL_DIST) + { + case 800: return MGW; + default: return $evalint(MGW*0.1); + } + } + } + } + } +} + +weight "Nailgun" +{ + switch(INVENTORY_NAILGUN) + { + case 1: return 0; + default: + { + switch(INVENTORY_NAILS) + { + case 1: return 0; + default: + { + switch(ENEMY_HORIZONTAL_DIST) + { + case 800: return NGW; + default: return $evalint(NGW*0.1); + } + } + } + } + } +} + +weight "Plasma Gun" +{ + switch(INVENTORY_PLASMAGUN) + { + case 1: return 0; + default: + { + switch(INVENTORY_CELLS) + { + case 1: return 0; + default: + { + switch(ENEMY_HORIZONTAL_DIST) + { + case 2000: return PGW; + default: return $evalint(PGW*0.1); + } + } + } + } + } +} + +weight "Prox Launcher" +{ + switch(INVENTORY_PROXLAUNCHER) + { + case 1: return 0; + default: + { + switch(INVENTORY_MINES) + { + case 1: return 0; + default: + { + switch(ENEMY_HORIZONTAL_DIST) + { + case 200: return PXW; + default: return $evalint(PXW*0.1); + } + } + } + } + } +} + +weight "Railgun" +{ + switch(INVENTORY_RAILGUN) + { + case 1: return 0; + default: + { + switch(INVENTORY_SLUGS) + { + case 1: return 0; + default: return RGW; + } + } + } +} + + +weight "Rocket Launcher" +{ + switch(INVENTORY_ROCKETLAUNCHER) + { + case 1: return 0; + default: + { + switch(INVENTORY_ROCKETS) + { + case 1: return 0; + default: + { + switch(ENEMY_HORIZONTAL_DIST) + { + case 4000: return RLW; + default: return $evalint(RLW*0.1); + } + } + } + } + } +} + +weight "Shotgun" +{ + switch(INVENTORY_SHOTGUN) + { + case 1: return 0; + default: + { + switch(INVENTORY_SHELLS) + { + case 1: return 0; + default: + { + switch(ENEMY_HORIZONTAL_DIST) + { + case 600: return SGW; + default: return $evalint(SGW*0.1); + } + } + } + } + } +} \ No newline at end of file diff --git a/q4base/botfiles/inv.h b/q4base/botfiles/inv.h new file mode 100644 index 00000000..d429413a --- /dev/null +++ b/q4base/botfiles/inv.h @@ -0,0 +1,184 @@ +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Quake III Arena source code is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#define INVENTORY_NONE 0 +//armor +#define INVENTORY_ARMOR 1 +//weapons +#define INVENTORY_GAUNTLET 4 +#define INVENTORY_SHOTGUN 5 +#define INVENTORY_MACHINEGUN 6 +#define INVENTORY_GRENADELAUNCHER 7 +#define INVENTORY_ROCKETLAUNCHER 8 +#define INVENTORY_LIGHTNING 9 +#define INVENTORY_RAILGUN 10 +#define INVENTORY_PLASMAGUN 11 +#define INVENTORY_BFG10K 13 +#define INVENTORY_GRAPPLINGHOOK 14 +#define INVENTORY_NAILGUN 15 +#define INVENTORY_PROXLAUNCHER 16 +#define INVENTORY_CHAINGUN 17 +//ammo +#define INVENTORY_SHELLS 18 +#define INVENTORY_BULLETS 19 +#define INVENTORY_GRENADES 20 +#define INVENTORY_CELLS 21 +#define INVENTORY_LIGHTNINGAMMO 22 +#define INVENTORY_ROCKETS 23 +#define INVENTORY_SLUGS 24 +#define INVENTORY_BFGAMMO 25 +#define INVENTORY_NAILS 26 +#define INVENTORY_MINES 27 +#define INVENTORY_BELT 28 +//powerups +#define INVENTORY_HEALTH 29 +#define INVENTORY_TELEPORTER 30 +#define INVENTORY_MEDKIT 31 +#define INVENTORY_KAMIKAZE 32 +#define INVENTORY_PORTAL 33 +#define INVENTORY_INVULNERABILITY 34 +#define INVENTORY_QUAD 35 +#define INVENTORY_ENVIRONMENTSUIT 36 +#define INVENTORY_HASTE 37 +#define INVENTORY_INVISIBILITY 38 +#define INVENTORY_REGEN 39 +#define INVENTORY_FLIGHT 40 +#define INVENTORY_SCOUT 41 +#define INVENTORY_GUARD 42 +#define INVENTORY_DOUBLER 43 +#define INVENTORY_AMMOREGEN 44 + +#define INVENTORY_REDFLAG 45 +#define INVENTORY_BLUEFLAG 46 +#define INVENTORY_NEUTRALFLAG 47 +#define INVENTORY_REDCUBE 48 +#define INVENTORY_BLUECUBE 49 +//Elimination mod: Domination inventory +#define INVENTORY_POINTWHITE 50 +#define INVENTORY_POINTRED 51 +#define INVENTORY_POINTBLUE 52 + + +//enemy stuff +#define ENEMY_HORIZONTAL_DIST 200 +#define ENEMY_HEIGHT 201 +#define NUM_VISIBLE_ENEMIES 202 +#define NUM_VISIBLE_TEAMMATES 203 + +// if running the mission pack +#ifdef MISSIONPACK + +//#error "running mission pack" + +#endif + +//item numbers (make sure they are in sync with bg_itemlist in bg_misc.c) +#define MODELINDEX_ARMORSHARD 1 +#define MODELINDEX_ARMORCOMBAT 2 +#define MODELINDEX_ARMORBODY 3 +#define MODELINDEX_HEALTHSMALL 4 +#define MODELINDEX_HEALTH 5 +#define MODELINDEX_HEALTHLARGE 6 +#define MODELINDEX_HEALTHMEGA 7 + +#define MODELINDEX_GAUNTLET 8 +#define MODELINDEX_SHOTGUN 9 +#define MODELINDEX_MACHINEGUN 10 +#define MODELINDEX_GRENADELAUNCHER 11 +#define MODELINDEX_ROCKETLAUNCHER 12 +#define MODELINDEX_LIGHTNING 13 +#define MODELINDEX_RAILGUN 14 +#define MODELINDEX_PLASMAGUN 15 +#define MODELINDEX_BFG10K 16 +#define MODELINDEX_GRAPPLINGHOOK 17 + +#define MODELINDEX_SHELLS 18 +#define MODELINDEX_BULLETS 19 +#define MODELINDEX_GRENADES 20 +#define MODELINDEX_CELLS 21 +#define MODELINDEX_LIGHTNINGAMMO 22 +#define MODELINDEX_ROCKETS 23 +#define MODELINDEX_SLUGS 24 +#define MODELINDEX_BFGAMMO 25 + +#define MODELINDEX_TELEPORTER 26 +#define MODELINDEX_MEDKIT 27 +#define MODELINDEX_QUAD 28 +#define MODELINDEX_ENVIRONMENTSUIT 29 +#define MODELINDEX_HASTE 30 +#define MODELINDEX_INVISIBILITY 31 +#define MODELINDEX_REGEN 32 +#define MODELINDEX_FLIGHT 33 + +#define MODELINDEX_REDFLAG 34 +#define MODELINDEX_BLUEFLAG 35 + +// mission pack only defines + +#define MODELINDEX_KAMIKAZE 36 +#define MODELINDEX_PORTAL 37 +#define MODELINDEX_INVULNERABILITY 38 + +#define MODELINDEX_NAILS 39 +#define MODELINDEX_MINES 40 +#define MODELINDEX_BELT 41 + +#define MODELINDEX_SCOUT 42 +#define MODELINDEX_GUARD 43 +#define MODELINDEX_DOUBLER 44 +#define MODELINDEX_AMMOREGEN 45 + +#define MODELINDEX_NEUTRALFLAG 46 +#define MODELINDEX_REDCUBE 47 +#define MODELINDEX_BLUECUBE 48 + +#define MODELINDEX_NAILGUN 49 +#define MODELINDEX_PROXLAUNCHER 50 +#define MODELINDEX_CHAINGUN 51 + +//Elimination mod: Double Domination and Standard Domination + +#define MODELINDEX_POINTABLUE 52 +#define MODELINDEX_POINTBBLUE 53 +#define MODELINDEX_POINTARED 54 +#define MODELINDEX_POINTBRED 55 +#define MODELINDEX_POINTAWHITE 56 +#define MODELINDEX_POINTBWHITE 57 +#define MODELINDEX_POINTWHITE 58 +#define MODELINDEX_POINTRED 59 +#define MODELINDEX_POINTBLUE 60 + + +// +#define WEAPONINDEX_GAUNTLET 1 +#define WEAPONINDEX_MACHINEGUN 2 +#define WEAPONINDEX_SHOTGUN 3 +#define WEAPONINDEX_GRENADE_LAUNCHER 4 +#define WEAPONINDEX_ROCKET_LAUNCHER 5 +#define WEAPONINDEX_LIGHTNING 6 +#define WEAPONINDEX_RAILGUN 7 +#define WEAPONINDEX_PLASMAGUN 8 +#define WEAPONINDEX_BFG 9 +#define WEAPONINDEX_GRAPPLING_HOOK 10 +#define WEAPONINDEX_NAILGUN 11 +#define WEAPONINDEX_PROXLAUNCHER 12 +#define WEAPONINDEX_CHAINGUN 13 diff --git a/q4base/botfiles/items.c b/q4base/botfiles/items.c new file mode 100644 index 00000000..a088656a --- /dev/null +++ b/q4base/botfiles/items.c @@ -0,0 +1,738 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + +#define NOITEM 0 +#define AMMOI 1 +#define WEAPONI 2 +#define HEALTHI 3 +#define ARMORI 4 +#define POWERI 5 +#define FLAGI 6 +#define ROAMI 7 + +//=================================== +// ARMOR +//=================================== + +iteminfo "ammo_belt" +{ +name "Chaingun Belt" +model "models/powerups/ammo/chaingunam.md3" +modelindex MODELINDEX_BELT +type AMMOI +index INVENTORY_BELT +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "ammo_bfg" +{ +name "Bfg ammo" +model "models/powerups/ammo/bfgam.md3" +modelindex MODELINDEX_BFGAMMO +type AMMOI +index INVENTORY_BFGAMMO +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "ammo_bullets" +{ +name "Bullets" +model "models/powerups/ammo/machinegunam.md3" +modelindex MODELINDEX_BULLETS +type AMMOI +index INVENTORY_BULLETS +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "ammo_cells" +{ +name "Cells" +model "models/powerups/ammo/plasmaam.md3" +modelindex MODELINDEX_CELLS +type AMMOI +index INVENTORY_CELLS +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "ammo_grenades" +{ +name "Grenades" +model "models/powerups/ammo/grenadeam.md3" +modelindex MODELINDEX_GRENADES +type AMMOI +index INVENTORY_GRENADES +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "ammo_lightning" +{ +name "Lightning" +model "models/powerups/ammo/lightningam.md3" +modelindex MODELINDEX_LIGHTNINGAMMO +type AMMOI +index INVENTORY_LIGHTNINGAMMO +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "ammo_mines" +{ +name "Proximity Mines" +model "models/powerups/ammo/proxmineam.md3" +modelindex MODELINDEX_MINES +type AMMOI +index INVENTORY_MINES +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "ammo_nails" +{ +name "Nails" +model "models/powerups/ammo/nailgunam.md3" +modelindex MODELINDEX_NAILS +type AMMOI +index INVENTORY_NAILS +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "ammo_rockets" +{ +name "Rockets" +model "models/powerups/ammo/rocketam.dm3" +modelindex MODELINDEX_ROCKETS +type AMMOI +index INVENTORY_ROCKETS +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "ammo_shells" +{ +name "Shells" +model "models/powerups/ammo/shotgunam.md3" +modelindex MODELINDEX_SHELLS +type AMMOI +index INVENTORY_SHELLS +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "ammo_slugs" +{ +name "Slugs" +model "models/powerups/ammo/railgunam.md3" +modelindex MODELINDEX_SLUGS +type AMMOI +index INVENTORY_SLUGS +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "holdable_invulnerability" +{ +name "Invulnerability" +model "models/powerups/holdable/invulnerability.md3" +modelindex MODELINDEX_INVULNERABILITY +type POWERI +index INVENTORY_PORTAL +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "holdable_kamikaze" +{ +name "Kamikaze" +model "models/powerups/kamikazi.md3" +modelindex MODELINDEX_KAMIKAZE +type POWERI +index INVENTORY_KAMIKAZE +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "holdable_medkit" +{ +name "Medkit" +model "models/powerups/holdable/medkit.md3" +modelindex MODELINDEX_MEDKIT +type HEALTHI +index INVENTORY_MEDKIT +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "holdable_portal" +{ +name "Portal" +model "models/powerups/holdable/teleporter.md3" +modelindex MODELINDEX_PORTAL +type POWERI +index INVENTORY_PORTAL +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "holdable_teleporter" +{ +name "Personal Teleporter" +model "models/powerups/holdable/teleporter.md3" +modelindex MODELINDEX_TELEPORTER +type POWERI +index INVENTORY_TELEPORTER +respawntime 60 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "item_armor_body" +{ +name "Heavy Armor" +model "models/powerups/armor/armor_red.md3" +modelindex MODELINDEX_ARMORBODY +type ARMORI +index INVENTORY_ARMOR +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + + +iteminfo "item_armor_combat" +{ +name "Armor" +model "models/powerups/armor/armor_yel.md3" +modelindex MODELINDEX_ARMORCOMBAT +type ARMORI +index INVENTORY_ARMOR +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "item_armor_shard" +{ +name "Armor Shard" +model "models/powerups/armor/shard.md3" +modelindex MODELINDEX_ARMORSHARD +type ARMORI +index INVENTORY_ARMOR +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + + +iteminfo "item_health" +{ +name "25 Health" +model "models/powerups/health/medium_cross.md3" +modelindex MODELINDEX_HEALTH +type HEALTHI +index INVENTORY_HEALTH +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "item_health_large" +{ +name "50 Health" +model "models/powerups/health/large_cross.md3" +modelindex MODELINDEX_HEALTHLARGE +type HEALTHI +index INVENTORY_HEALTH +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "item_health_mega" +{ +name "Mega Health" +model "models/powerups/health/mega_cross.md3" +modelindex MODELINDEX_HEALTHMEGA +type HEALTHI +index INVENTORY_HEALTH +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + + +iteminfo "item_health_small" +{ +name "5 Health" +model "models/powerups/health/small_cross.md3" +modelindex MODELINDEX_HEALTHSMALL +type HEALTHI +index INVENTORY_HEALTH +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "weapon_bfg_mp" +{ +name "BFG10K" +model "models/weapons2/bfg/bfg.md3" +modelindex MODELINDEX_BFG10K +type WEAPONI +index INVENTORY_BFG10K +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "weapon_chaingun" +{ +name "Chaingun" +model "models/weapons/vulcan/vulcan.md3" +modelindex MODELINDEX_CHAINGUN +type WEAPONI +index INVENTORY_CHAINGUN +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + + +iteminfo "weapon_fists" +{ +name "Gauntlet" +model "models/weapons2/gauntlet/gauntlet.md3" +modelindex MODELINDEX_GAUNTLET +type WEAPONI +index INVENTORY_GAUNTLET +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "weapon_grapplinghook" +{ +name "Grappling Hook" +model "" +modelindex MODELINDEX_GRAPPLINGHOOK +type WEAPONI +index INVENTORY_GRAPPLINGHOOK +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + + +iteminfo "weapon_grenadelauncher" +{ +name "Grenade Launcher" +model "models/weapons2/grenadel/grenadel.md2" +modelindex MODELINDEX_GRENADELAUNCHER +type WEAPONI +index INVENTORY_GRENADELAUNCHER +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "weapon_lightning" +{ +name "Lightning Gun" +model "models/weapons2/lightning/lightning.md3" +modelindex MODELINDEX_LIGHTNING +type WEAPONI +index INVENTORY_LIGHTNING +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + + +iteminfo "weapon_machinegun" +{ +name "Machinegun" +model "models/weapons2/machinegun/machinegun.md3" +modelindex MODELINDEX_MACHINEGUN +type WEAPONI +index INVENTORY_MACHINEGUN +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + + +iteminfo "weapon_shotgun_mp" +{ +name "Shotgun" +model "models/weapons2/shotgun/shotgun.md3" +modelindex MODELINDEX_SHOTGUN +type WEAPONI +index INVENTORY_SHOTGUN +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + + +iteminfo "weapon_railgun" +{ +name "Railgun" +model "models/weapons2/railgun/railgun.md3" +modelindex MODELINDEX_RAILGUN +type WEAPONI +index INVENTORY_RAILGUN +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + + +iteminfo "weapon_rocketlauncher_mp" +{ +name "Rocket Launcher" +model "models/weapons2/rocketl/rocketl.md3" +modelindex MODELINDEX_ROCKETLAUNCHER +type WEAPONI +index INVENTORY_ROCKETLAUNCHER +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "weapon_nailgun" +{ +name "Nailgun" +model "models/weapons/nailgun/nailgun.md3" +modelindex MODELINDEX_NAILGUN +type WEAPONI +index INVENTORY_NAILGUN +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + + +iteminfo "weapon_plasmagun_mp" +{ +name "Plasma Gun" +model "models/weapons2/plasma/plasma.md3" +modelindex MODELINDEX_PLASMAGUN +type WEAPONI +index INVENTORY_PLASMAGUN +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + + +iteminfo "weapon_prox_launcher" +{ +name "Prox Launcher" +model "models/weapons/proxmine/proxmine.md3" +modelindex MODELINDEX_PROXLAUNCHER +type WEAPONI +index INVENTORY_PROXLAUNCHER +respawntime 30 +mins {-13,-13,-13} +maxs {13,13,13} +} + + + + + +iteminfo "item_quad" +{ +name "Quad Damage" +model "models/powerups/instant/quad.md3" +modelindex MODELINDEX_QUAD +type POWERI +index INVENTORY_QUAD +respawntime 60 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "item_enviro" +{ +name "Battle Suit" +model "models/powerups/instant/enviro.md3" +modelindex MODELINDEX_ENVIRONMENTSUIT +type POWERI +index INVENTORY_ENVIRONMENTSUIT +respawntime 60 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "item_haste" +{ +name "Speed" +model "models/powerups/instant/haste_ring.md3" +modelindex MODELINDEX_HASTE +type POWERI +index INVENTORY_HASTE +respawntime 60 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "item_invisibility" +{ +name "Invisibility" +model "models/powerups/instant/invis.md3" +modelindex MODELINDEX_INVISIBILITY +type POWERI +index INVENTORY_INVISIBILITY +respawntime 60 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "item_regen" +{ +name "Regeneration" +model "models/powerups/instant/regen_ring.md3" +modelindex MODELINDEX_REGEN +type POWERI +index INVENTORY_REGEN +respawntime 60 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "item_flight" +{ +name "Flight" +model "models/powerups/instant/flight_ring.md3" +modelindex MODELINDEX_FLIGHT +type POWERI +index INVENTORY_FLIGHT +respawntime 60 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "item_scout" +{ +name "Scout" +model "models/powerups/scout.md3" +modelindex MODELINDEX_SCOUT +type POWERI +index INVENTORY_SCOUT +respawntime 60 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "item_guard" +{ +name "Guard" +model "models/powerups/guard.md3" +modelindex MODELINDEX_GUARD +type POWERI +index INVENTORY_GUARD +respawntime 60 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "item_doubler" +{ +name "Doubler" +model "models/powerups/doubler.md3" +modelindex MODELINDEX_DOUBLER +type POWERI +index INVENTORY_DOUBLER +respawntime 60 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "item_ammoregen" +{ +name "Ammo Regen" +model "models/powerups/ammo.md3" +modelindex MODELINDEX_AMMOREGEN +type POWERI +index INVENTORY_AMMOREGEN +respawntime 60 +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "team_CTF_redflag" +{ +name "Red Flag" +model "models/flags/r_flag.md3" +modelindex MODELINDEX_REDFLAG +type FLAGI +index INVENTORY_REDFLAG +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "team_CTF_blueflag" +{ +name "Blue Flag" +model "models/flags/b_flag.md3" +modelindex MODELINDEX_BLUEFLAG +type FLAGI +index INVENTORY_BLUEFLAG +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "team_CTF_neutralflag" +{ +name "Neutral Flag" +model "models/flags/n_flag.md3" +modelindex MODELINDEX_NEUTRALFLAG +type FLAGI +index INVENTORY_NEUTRALFLAG +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "team_redobelisk" +{ +name "Red Obelisk" +model "models/powerups/obelisk/obelisk.md3" +modelindex 0 +type NOITEM +index 0 +mins {-14, -14, 1} +maxs {14, 14, 87} +} + +iteminfo "team_blueobelisk" +{ +name "Blue Obelisk" +model "models/powerups/obelisk/obelisk.md3" +modelindex 0 +type NOITEM +index 0 +mins {-14, -14, 1} +maxs {14, 14, 87} +} + +iteminfo "team_neutralobelisk" +{ +name "Neutral Obelisk" +model "models/powerups/obelisk/obelisk.md3" +modelindex 0 +type NOITEM +index 0 +mins {-14, -14, 1} +maxs {14, 14, 87} +} + +iteminfo "item_redcube" +{ +name "Red Cube" +model "models/powerups/orb/r_orb.md3" +modelindex MODELINDEX_REDCUBE +type FLAGI +index INVENTORY_REDCUBE +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "item_bluecube" +{ +name "Blue Cube" +model "models/powerups/orb/b_orb.md3" +modelindex MODELINDEX_BLUECUBE +type FLAGI +index INVENTORY_BLUECUBE +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "item_botroam" +{ +name "Bot Roam Goal" +model "" +modelindex 0 +type ROAMI +index 0 +mins {-13,-13,-13} +maxs {13,13,13} +} + +//Domination points: +iteminfo "team_dom_pointWhite" +{ +name "Neutral domination point" +model "models/dpoints/a_white.md3" +modelindex MODELINDEX_POINTWHITE +type FLAGI +index INVENTORY_POINTWHITE +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "team_dom_pointBlue" +{ +name "Blue domination point" +model "models/dpoints/a_blue.md3" +modelindex MODELINDEX_POINTBLUE +type FLAGI +index INVENTORY_POINTBLUE +mins {-13,-13,-13} +maxs {13,13,13} +} + +iteminfo "team_dom_pointRed" +{ +name "Red domination point" +model "models/dpoints/a_red.md3" +modelindex MODELINDEX_POINTRED +type FLAGI +index INVENTORY_POINTRED +mins {-13,-13,-13} +maxs {13,13,13} +} + diff --git a/q4base/botfiles/match.c b/q4base/botfiles/match.c new file mode 100644 index 00000000..836e7ad9 --- /dev/null +++ b/q4base/botfiles/match.c @@ -0,0 +1,332 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "match.h" + +#define PURE_CRAP 2 +#define MORE_CRAP 2 + + + +// this is rare but people can always fuckup +// don't use EC"(", EC")", EC"[", EC"]" or EC":" inside player names +// don't use EC": " inside map locations + +//entered the game message +MTCONTEXT_MISC +{ + + NETNAME, " has joined the game" = (MSG_ENTERGAME, 0); + NETNAME, " is the team leader" = (MSG_NEWLEADER, 0); +} + +//team command chat messages +MTCONTEXT_INITIALTEAMCHAT +{ + //help and/or meet someone + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": help "|" meet ", TEAMMATE, " near "|" at ", "the "|"checkpoint "|"waypoint "|"", ITEM = (MSG_HELP, ST_NEARITEM); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": help "|" meet ", TEAMMATE = (MSG_HELP, ST_SOMEWHERE); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " help "|" meet ", TEAMMATE, " near "|" at ", "the "|"checkpoint "|"waypoint "|"", ITEM = (MSG_HELP, $evalint(ST_NEARITEM|ST_ADDRESSED)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " help "|" meet ", TEAMMATE = (MSG_HELP, $evalint(ST_SOMEWHERE|ST_ADDRESSED)); + + //accompany someone (and meet at the rendezvous point) ("hunk follow me", "hunk go with babe", etc.) + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "go with "|"follow "|"cover "|" protect ", TEAMMATE, " near "|" at ", "the "|"checkpoint "|"waypoint "|"", ITEM, " for", TIME = (MSG_ACCOMPANY, $evalint(ST_NEARITEM|ST_TIME)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "go with "|"follow "|"cover "|" protect ", TEAMMATE, " near "|" at ", "the "|"checkpoint "|"waypoint "|"", ITEM = (MSG_ACCOMPANY, ST_NEARITEM); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "go with "|"follow "|"cover "|" protect ", TEAMMATE, " for", TIME = (MSG_ACCOMPANY, $evalint(ST_SOMEWHERE|ST_TIME)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "go with "|"follow "|"cover "|" protect ", TEAMMATE = (MSG_ACCOMPANY, ST_SOMEWHERE); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " go with "|" follow "|" cover "|" protect ", TEAMMATE, " near "|" at ", "the "|"checkpoint "|"waypoint "|"", ITEM, " for", TIME = (MSG_ACCOMPANY, $evalint(ST_NEARITEM|ST_ADDRESSED|ST_TIME)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " go with "|" follow "|" cover "|" protect ", TEAMMATE, " near "|" at ", "the "|"checkpoint "|"waypoint "|"", ITEM = (MSG_ACCOMPANY, $evalint(ST_NEARITEM|ST_ADDRESSED)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " go with "|" follow "|" cover "|" protect ", TEAMMATE, " for", TIME = (MSG_ACCOMPANY, $evalint(ST_SOMEWHERE|ST_ADDRESSED|ST_TIME)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " go with "|" follow "|" cover "|" protect ", TEAMMATE = (MSG_ACCOMPANY, $evalint(ST_SOMEWHERE|ST_ADDRESSED)); + + //preference + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I want to ", "be "|"", "on "|"", "defense"|"defend" = (MSG_TASKPREFERENCE, ST_DEFENDER); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I do not want to capture ", "the "|"their ", "Red Flag"|"Blue Flag"|"flag" = (MSG_TASKPREFERENCE, ST_DEFENDER); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I do not want to ", "get "|"capture ", "the "|"their ", "Red Flag"|"Blue Flag"|"flag" = (MSG_TASKPREFERENCE, ST_DEFENDER); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I do not want to ", "attack"|"assault" = (MSG_TASKPREFERENCE, ST_DEFENDER); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I do not want to harvest", " skulls"|" cubes"|"" = (MSG_TASKPREFERENCE, ST_DEFENDER); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I do not want to be ", "on "|"", "offense" = (MSG_TASKPREFERENCE, ST_DEFENDER); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I will defend", ""|"the base"|"the flag"|"the obelisk" = (MSG_TASKPREFERENCE, ST_DEFENDER); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I will not harvest", " skulls"|" cubes"|"" = (MSG_TASKPREFERENCE, ST_DEFENDER); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I am ", "on "|"", "defense" = (MSG_TASKPREFERENCE, ST_DEFENDER); + + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I will not defend", ""|"the flag"|"the base"|"the obelisk" = (MSG_TASKPREFERENCE, ST_ATTACKER); + + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I do not want to be ", "on "|"", "defense" = (MSG_TASKPREFERENCE, ST_ATTACKER); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I want to get ", "the "|"their", "Red Flag"|"Blue Flag"|"flag" = (MSG_TASKPREFERENCE, ST_ATTACKER); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I want to ", "attack"|"assault", ""|" the "|"their ", "Red Flag"|"Blue Flag"|"Red Obelisk"|"Blue Obelisk"|"base"|"" = (MSG_TASKPREFERENCE, ST_ATTACKER); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I want to harvest", " skulls"|" cubes"|"" = (MSG_TASKPREFERENCE, ST_ATTACKER); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I want to be ", "on "|"", "offense" = (MSG_TASKPREFERENCE, ST_ATTACKER); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I will ", "attack"|"assault", ""|" the "|" their ", "Red Obelisk"|"Blue Obelisk"|"base"|"" = (MSG_TASKPREFERENCE, ST_ATTACKER); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I will be ", "on "|"", "offense" = (MSG_TASKPREFERENCE, ST_ATTACKER); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I will harvest", " skulls"|" cubes"|"" = (MSG_TASKPREFERENCE, ST_ATTACKER); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I am ", "on "|"", "offense" = (MSG_TASKPREFERENCE, ST_ATTACKER); + + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I want to roam" = (MSG_TASKPREFERENCE, ST_ROAMER); + + + //get the flag + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": capture ", "the blue "|"the enemy "|"the red "|"their "|"the "|"enemy ", "flag" = (MSG_GETFLAG, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": get ", "the blue "|"the red "|"the enemy "|"their "|"the "|"enemy ", "flag" = (MSG_GETFLAG, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " capture ", "the blue "|"the enemy"|"the red "|"their "|"the "|"enemy ", "flag" = (MSG_GETFLAG, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " get ", "the blue "|"the enemy"|"the red "|"their "|"the "|"enemy ", "flag" = (MSG_GETFLAG, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": get ", PURE_CRAP, " flag ", MORE_CRAP = (MSG_GETFLAG, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": kill the flag carrier" = (MSG_GETFLAG, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": kill the flag" = (MSG_GETFLAG, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " kill the flag carrier" = (MSG_GETFLAG, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " kill the flag" = (MSG_GETFLAG, ST_ADDRESSED); + + //attack the enemy base + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " attack ", "enemy "|"the enemy "|"the red "|"the blue "|"their ", "base"|"flag"|"obelisk" = (MSG_ATTACKENEMYBASE, ST_ADDRESSED); + + //go harvesting + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " harvest" = (MSG_HARVEST, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " go harvesting" = (MSG_HARVEST, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " collect ","skulls"|"cubes" = (MSG_HARVEST, ST_ADDRESSED); + + + + //kill someone (NOTE: make sure these are after the get flag match templates because of the "kill" + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": kill ", ENEMY = (MSG_KILL, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " kill ", ENEMY = (MSG_KILL, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " wack ", ENEMY = (MSG_KILL, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " take out ", ENEMY = (MSG_KILL, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": hunt down ", ENEMY = (MSG_KILL, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": kill ", ENEMY = (MSG_KILL, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": wack ", ENEMY = (MSG_KILL, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": take out ", ENEMY = (MSG_KILL, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": death to ", ENEMY = (MSG_KILL, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " hunt down ", ENEMY = (MSG_KILL, ST_ADDRESSED); + + //get item + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " grab the "|" go grab the ", ITEM = (MSG_GETITEM, ST_ADDRESSED); + + + //defend/guard a key area + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "defend "|"guard ", "the checkpoint "|"the waypoint ", KEYAREA, " for", TIME = (MSG_DEFENDKEYAREA, ST_TIME); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "defend "|"guard ", "the checkpoint "|"the waypoint ", KEYAREA = (MSG_DEFENDKEYAREA, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " defend "|" guard ", "the ", "checkpoint "|"waypoint ", KEYAREA, " for", TIME = (MSG_DEFENDKEYAREA, $evalint(ST_ADDRESSED|ST_TIME)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " defend "|" guard ", "the checkpoint "|"the waypoint ", KEYAREA = (MSG_DEFENDKEYAREA, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " defend the "|" guard the ", KEYAREA = (MSG_DEFENDKEYAREA, ST_ADDRESSED); + + //camp somewhere ("hunk camp here", "hunk camp there", "hunk camp near the rl", etc.) + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " camp ", "there "|"over there ", " for", TIME = (MSG_CAMP, $evalint(ST_ADDRESSED|ST_TIME|ST_THERE)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " camp ", "there"|"over there" = (MSG_CAMP, $evalint(ST_ADDRESSED|ST_THERE)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " camp ", "here"|"over here ", " for", TIME = (MSG_CAMP, $evalint(ST_ADDRESSED|ST_TIME|ST_HERE)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " camp ", "here"|"over here" = (MSG_CAMP, $evalint(ST_ADDRESSED|ST_HERE)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " camp ", "near "|"at "|"", "the "|"checkpoint "|"waypoint ", KEYAREA, " for", TIME = (MSG_CAMP, $evalint(ST_ADDRESSED|ST_NEARITEM|ST_TIME)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " camp ", "near "|"at ", "the checkpoint "|"the waypoint ", KEYAREA = (MSG_CAMP, $evalint(ST_ADDRESSED|ST_NEARITEM)); + //go to (same as camp) + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " go to ", "the "|"checkpoint "|"waypoint ", KEYAREA = (MSG_CAMP, $evalint(ST_ADDRESSED|ST_NEARITEM)); + + //Double Domination orders + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "take"|"dominate"|"hold", " point A"|" red base" = (MSG_TAKEA, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "take"|"dominate"|"hold", " point B"|" blue base" = (MSG_TAKEB, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " take"|" dominate"|" hold", " point A"|"red base" = (MSG_TAKEA, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " take"|" dominate"|" hold", " point B"|"blue base" = (MSG_TAKEB, ST_ADDRESSED); + + //rush to the base in CTF + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " rush ", "to "|"to the "|"the ", "base" = (MSG_RUSHBASE, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " go ", "to"|"to the", " base" = (MSG_RUSHBASE, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "rush base" = (MSG_RUSHBASE, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "return to base" = (MSG_RUSHBASE, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "go to base" = (MSG_RUSHBASE, 0); + + //return the flag + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " return ", PURE_CRAP, " flag" = (MSG_RETURNFLAG, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": return ", MORE_CRAP, " flag", PURE_CRAP = (MSG_RETURNFLAG, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": return the", MESSAGE, " flag", PURE_CRAP = (MSG_RETURNFLAG, 0); + + + //who is the team leader + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": who is ", "the leader"|"the team leader"|"team leader"|"leader", "?"|"" = (MSG_WHOISTEAMLAEDER, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": is there a ", "leader"|"team leader", "?"|"" = (MSG_WHOISTEAMLAEDER, 0); + + //become the team leader + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", TEAMMATE, " will be ", THE_TEAM, "leader" = (MSG_STARTTEAMLEADERSHIP, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", TEAMMATE, " want to be ", THE_TEAM, "leader" = (MSG_STARTTEAMLEADERSHIP, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", TEAMMATE, " wants to be ", THE_TEAM, "leader" = (MSG_STARTTEAMLEADERSHIP, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", TEAMMATE, " is ", THE_TEAM, "leader" = (MSG_STARTTEAMLEADERSHIP, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", TEAMMATE, " you are ", THE_TEAM, "leader" = (MSG_STARTTEAMLEADERSHIP, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", TEAMMATE, " will be ", THE_TEAM, "leader" = (MSG_STARTTEAMLEADERSHIP, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I am ", "the leader"|"the team leader"|"team leader"|"leader" = (MSG_STARTTEAMLEADERSHIP, ST_I); + + + //stop being the team leader + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", TEAMMATE, " is not ", THE_TEAM, "leader" = (MSG_STOPTEAMLEADERSHIP, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "I quit being leader"|"I no longer lead"|"i stop being the leader" = (MSG_STOPTEAMLEADERSHIP, ST_I); + + + //wait for someone + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " wait for me", " near "|" at ", "the "|"checkpoint "|"waypoint ", ITEM = (MSG_WAIT, $evalint(ST_NEARITEM|ST_ADDRESSED|ST_I)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " wait for me" = (MSG_WAIT, $evalint(ST_SOMEWHERE|ST_ADDRESSED|ST_I)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " wait for ", TEAMMATE, " near "|" at ", "the "|"checkpoint "|"waypoint "|"", ITEM = (MSG_WAIT, $evalint(ST_NEARITEM|ST_ADDRESSED)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " wait for ", TEAMMATE = (MSG_WAIT, $evalint(ST_SOMEWHERE|ST_ADDRESSED)); + + //ask what someone/everyone is doing + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " report" = (MSG_WHATAREYOUDOING, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": report" = (MSG_WHATAREYOUDOING, 0); + + + //ask the team leader what to do + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": what is my command", "?"|"" = (MSG_WHATISMYCOMMAND, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": what should I do", "?"|"" = (MSG_WHATISMYCOMMAND, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": what am I supposed to do", "?"|"" = (MSG_WHATISMYCOMMAND, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": what is my job", "?"|"" = (MSG_WHATISMYCOMMAND, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " what is my command", "?"|"" = (MSG_WHATISMYCOMMAND, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " what should I do", "?"|"" = (MSG_WHATISMYCOMMAND, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " what am I supposed to do", "?"|"" = (MSG_WHATISMYCOMMAND, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " what is my job", "?"|"" = (MSG_WHATISMYCOMMAND, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": orders", "?"|"" = (MSG_WHATISMYCOMMAND, 0); + + //ask where someone or everyone is + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " where are you", "?"|"" = (MSG_WHEREAREYOU, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": where are you ", ADDRESSEE, "?"|"" = (MSG_WHEREAREYOU, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": where is ", ADDRESSEE, "?"|"" = (MSG_WHEREAREYOU, ST_ADDRESSED); + + //join a sub team + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " create squad ", TEAMNAME = (MSG_JOINSUBTEAM, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " join squad ", TEAMNAME = (MSG_JOINSUBTEAM, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " you"|" we", " are in", " squad ", TEAMNAME = (MSG_JOINSUBTEAM, ST_ADDRESSED); + + //leave a sub team + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " leave your squad" = (MSG_LEAVESUBTEAM, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " disband" = (MSG_LEAVESUBTEAM, ST_ADDRESSED); + + //what team are you in + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " which "|" what ", "squad", " are you ", "in"|"on", "?"|"" = (MSG_WHICHTEAM, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " what is your ", "squad","?"|"" = (MSG_WHICHTEAM, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " are you ", "in"|"on", " a squad","?"|"" = (MSG_WHICHTEAM, ST_ADDRESSED); + + //dismiss + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " stop action"|" roam"|" dismissed" = (MSG_DISMISS, ST_ADDRESSED); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "cancel order"|"roam" = (MSG_DISMISS, 0); + + //remember checkpoint + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "checkpoint "|"waypoint ", NAME, " is at ", POSITION = (MSG_CHECKPOINT, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " checkpoint "|" waypoint ", NAME, " is at ", POSITION = (MSG_CHECKPOINT, ST_ADDRESSED); + + //patrol + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": patrol ", "from "|"", KEYAREA, " for", TIME = (MSG_PATROL, ST_TIME); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": patrol ", "from "|"", KEYAREA = (MSG_PATROL, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " patrol ", "from "|"", KEYAREA, " for", TIME = (MSG_PATROL, $evalint(ST_ADDRESSED|ST_TIME)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " patrol ", "from "|"", KEYAREA = (MSG_PATROL, ST_ADDRESSED); + + + //lead the way + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": lead the way" = (MSG_LEADTHEWAY, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I'll follow" = (MSG_LEADTHEWAY, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": lead the way ", ADDRESSEE = (MSG_LEADTHEWAY, $evalint(ST_ADDRESSED)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I'll follow ", ADDRESSEE = (MSG_LEADTHEWAY, $evalint(ST_ADDRESSED)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " lead the way" = (MSG_LEADTHEWAY, $evalint(ST_ADDRESSED)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": lead ", TEAMMATE, " around ", ADDRESSEE = (MSG_LEADTHEWAY, $evalint(ST_ADDRESSED|ST_SOMEONE)); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " lead ", TEAMMATE, "" = (MSG_LEADTHEWAY, $evalint(ST_ADDRESSED|ST_SOMEONE)); + + // suicide + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": suicide" = (MSG_SUICIDE, 0); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " suicide" = (MSG_SUICIDE, $evalint(ST_ADDRESSED)); + + //anti-bigot bot suicide code (I hope I am not acting as the thought police...) + + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, " nigger "|" nigr "|" niger "|"wop"|"macaca"|"monkey", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "kyke"|"kykes"|"kike"|"kikes"|"jewish pig"|"judan"|"jews"|"jew"|"jew lover"|"ex-slaves"|"slaves"|"slave"|"ex-slave"|"xslave"|"xslaves"|"red sea pedestrians"|"red sea pedestrian", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "niggers"|"nigrs"|"nigers"|"wops"|"macacas", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "rag head"|"raghead"|"rag-head"|"camel jockey"|"cml jky"|"cmljky", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "rag heads"|"ragheads"|"rag-heads"|"camel jokeys"|"cml jkys"|"cmljkys", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "towel head"|"towel heads"|"towel-head"|"towel-heads"|"towelhead"|"towelheads", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "homo"|"gay"|"gaygrrl"|"gaygirl"|"faggit"|"gay-girl"|"gay-grrl", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "faggot"|"fagit"|"fagot"|"queer"|"gayboy"|"gayboi", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "dyke"|"dike"|"lez"|"les"|"lezbo"|"lesbo"|"fags"|"fagz", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "homos"|"dykes"|"dikes"|"lesbos"|"lezbos"|"fagots"|"faggots"|"faggits"|"fagits", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "sand-nigger"|"sand-niger"|"sndngr"|"sand-niggers"|"sand-nigers"|"sndngrs", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "red skins"|"red-skins"|"braves"|"chiefs"|"red skin"|"red-skin"|"chief", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "bean-picker"|"bean picker"|"beanpicker"|"wet back"|"wetback"|"wet-back", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + EC"("|EC"[", NETNAME, EC")"|EC"]", "bean-pickers"|"beanpickers"|"bean pickers"|"wet backs"|"wetbacks"|"wet-backs", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "spook"|"gook"|"slant"|"mamasan", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "spooks"|"gooks"|"slants"|"mamasans"|"hitler", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + // not a good solution but it does work in certain situations... + NETNAME, EC": ", MORE_CRAP, "sand-nigger"|"sand-niger"|"sndngr"|"sand-niggers"|"sand-nigers"|" sndngrs ", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + NETNAME, EC": ", MORE_CRAP, "red skins"|"red-skins"|" braves "|" chiefs "|"red skin"|" red-skin "|" chief ", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + NETNAME, EC": ", MORE_CRAP, " bean-picker "|" bean picker "|" beanpicker "|"wet back"|" wetback "|"wet-back", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + NETNAME, EC": ", MORE_CRAP, " bean-pickers "|" beanpickers "|"bean pickers"|"wet backs"|" wetbacks "|"wet-backs", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + NETNAME, EC": ", MORE_CRAP, " spook "|" gook "|" slant "|" mamasan ", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + NETNAME, EC": ", MORE_CRAP, " spooks "|" gooks "|" slants "|" mamasans ", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + NETNAME, EC": ", MORE_CRAP, " homo "|" gay "|" gaygrrl "|" gaygirl "|" gay-girl "|" gay-grrl "|" faggit ", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + NETNAME, EC": ", MORE_CRAP, " faggot "|" fagit "|" fagot "|" queer "|" gayboy "|" gayboi ", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + NETNAME, EC": ", MORE_CRAP, " dyke "|" dike "|" lez "|" les "|" lezbo "|" lesbo "|" fags "|" fagz ", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + NETNAME, EC": ", MORE_CRAP, " homos "|" dykes "|" dikes "|" lesbos "|" lezbos "|" faggots "|" fagots "|" faggits "|" fagits ", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + NETNAME, EC": ", MORE_CRAP, " rag head"|" raghead"|" rag-head"|" camel jockey"|" cml jky"|" cmljky", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + NETNAME, EC": ", MORE_CRAP, " rag heads"|" ragheads "|" rag-heads"|" camel jokeys"|" cml jkys", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + NETNAME, EC": ", MORE_CRAP, " towel head"|" towel heads"|" towel-head"|" towel-heads"|" towelhead"|" towelheads", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + NETNAME, EC": ", MORE_CRAP, " nigrs "|" nigers "|"wops"|" macacas ", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + NETNAME, EC": ", MORE_CRAP, " kyke "|" kykes "|" kike "|" kikes "|"jewish pig"|"judan"|" jew "|" jews "|"jew lover"|"ex-slaves"|"slaves"|"slave"|"ex-slave"|"xslave"|"xslaves"|"red sea pedestrians"|"red sea pedestrian", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + NETNAME, EC": ", MORE_CRAP, " nigger"|" nigr "|" niger "|"wop"|" macaca "|" monkey"|" hitler", PURE_CRAP = (MSG_SUICIDE, ST_TEAM); + +} + +MTCONTEXT_CTF +{ + NETNAME, " got the ", FLAG, " flag", "!"|"" = (MSG_CTF, ST_GOTFLAG); + NETNAME, " captured the ", FLAG, " flag", "!"|"" = (MSG_CTF, ST_CAPTUREDFLAG); + NETNAME, " returned the ", FLAG, " flag", "!"|"" = (MSG_CTF, ST_RETURNEDFLAG); + //for One Flag CTF + NETNAME, " got the flag", "!"|"" = (MSG_CTF, ST_1FCTFGOTFLAG); +} + +MTCONTEXT_TIME +{ + TIME, " minute"|" min","s"|"" = (MSG_MINUTES, 0); + TIME, " second"|" sec","s"|"" = (MSG_SECONDS, 0); + "ever" = (MSG_FOREVER, 0); + " a long time" = (MSG_FORALONGTIME, 0); + " a while" = (MSG_FORAWHILE, 0); +} + +MTCONTEXT_PATROLKEYAREA +{ + "the "|"checkpoint "|"waypoint "|"", KEYAREA, " to "|" and ", MORE = (MSG_PATROLKEYAREA, ST_MORE); + "the "|"checkpoint "|"waypoint "|"", KEYAREA, " and loop"|" and back", " to the start"|"" = (MSG_PATROLKEYAREA, ST_BACK); + "the "|"checkpoint "|"waypoint "|"", KEYAREA, " and reverse" = (MSG_PATROLKEYAREA, ST_REVERSE); + "the "|"checkpoint "|"waypoint "|"", KEYAREA = (MSG_PATROLKEYAREA, 0); +} + +MTCONTEXT_TEAMMATE +{ + "me"|"I" = (MSG_ME, 0); +} + +MTCONTEXT_ADDRESSEE +{ + "Everyone"|"Everybody" = (MSG_EVERYONE, 0); + TEAMMATE, " and "|", "|","|" ,", MORE = (MSG_MULTIPLENAMES, 0); + TEAMMATE = (MSG_NAME, 0); +} + +MTCONTEXT_REPLYCHAT +{ + EC"(", NETNAME, EC")", PLACE, EC": ", MESSAGE = (MSG_CHATTEAM, 0); + EC"[", NETNAME, EC"]", PLACE, EC": ", MESSAGE = (MSG_CHATTELL, 0); + // included for peace of mind + NETNAME, EC": ", MESSAGE = (MSG_CHATALL, 0); +} + diff --git a/q4base/botfiles/match.h b/q4base/botfiles/match.h new file mode 100644 index 00000000..d3f17105 --- /dev/null +++ b/q4base/botfiles/match.h @@ -0,0 +1,138 @@ +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Quake III Arena source code is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +// make sure this is the same character as we use in chats in g_cmd.c +#define EC "\x19" + +//match template contexts +#define MTCONTEXT_MISC 2 +#define MTCONTEXT_INITIALTEAMCHAT 4 +#define MTCONTEXT_TIME 8 +#define MTCONTEXT_TEAMMATE 16 +#define MTCONTEXT_ADDRESSEE 32 +#define MTCONTEXT_PATROLKEYAREA 64 +#define MTCONTEXT_REPLYCHAT 128 +#define MTCONTEXT_CTF 256 + +//message types +#define MSG_NEWLEADER 1 //new leader +#define MSG_ENTERGAME 2 //enter game message +#define MSG_HELP 3 //help someone +#define MSG_ACCOMPANY 4 //accompany someone +#define MSG_DEFENDKEYAREA 5 //defend a key area +#define MSG_RUSHBASE 6 //everyone rush to base +#define MSG_GETFLAG 7 //get the enemy flag +#define MSG_STARTTEAMLEADERSHIP 8 //someone wants to become the team leader +#define MSG_STOPTEAMLEADERSHIP 9 //someone wants to stop being the team leader +#define MSG_WHOISTEAMLAEDER 10 //who is the team leader +#define MSG_WAIT 11 //wait for someone +#define MSG_WHATAREYOUDOING 12 //what are you doing? +#define MSG_JOINSUBTEAM 13 //join a sub-team +#define MSG_LEAVESUBTEAM 14 //leave a sub-team +#define MSG_CREATENEWFORMATION 15 //create a new formation +#define MSG_FORMATIONPOSITION 16 //tell someone his/her position in a formation +#define MSG_FORMATIONSPACE 17 //set the formation intervening space +#define MSG_DOFORMATION 18 //form a known formation +#define MSG_DISMISS 19 //dismiss commanded team mates +#define MSG_CAMP 20 //camp somewhere +#define MSG_CHECKPOINT 21 //remember a check point +#define MSG_PATROL 22 //patrol between certain keypoints +#define MSG_LEADTHEWAY 23 //lead the way +#define MSG_GETITEM 24 //get an item +#define MSG_KILL 25 //kill someone +#define MSG_WHEREAREYOU 26 //where is someone +#define MSG_RETURNFLAG 27 //return the flag +#define MSG_WHATISMYCOMMAND 28 //ask the team leader what to do +#define MSG_WHICHTEAM 29 //ask which team a bot is in +#define MSG_TASKPREFERENCE 30 //tell your teamplay task preference +#define MSG_ATTACKENEMYBASE 31 //attack the enemy base +#define MSG_HARVEST 32 //go harvest +#define MSG_SUICIDE 33 //order to suicide +// +#define MSG_ME 100 +#define MSG_EVERYONE 101 +#define MSG_MULTIPLENAMES 102 +#define MSG_NAME 103 +#define MSG_PATROLKEYAREA 104 +#define MSG_MINUTES 105 +#define MSG_SECONDS 106 +#define MSG_FOREVER 107 +#define MSG_FORALONGTIME 108 +#define MSG_FORAWHILE 109 +// +#define MSG_CHATALL 200 +#define MSG_CHATTEAM 201 +#define MSG_CHATTELL 202 +// +#define MSG_CTF 300 //ctf message + +//Double Domination messages +#define MSG_TAKEA 90 +#define MSG_TAKEB 91 + +//command sub types +#define ST_SOMEWHERE 0 +#define ST_NEARITEM 1 +#define ST_ADDRESSED 2 +#define ST_METER 4 +#define ST_FEET 8 +#define ST_TIME 16 +#define ST_HERE 32 +#define ST_THERE 64 +#define ST_I 128 +#define ST_MORE 256 +#define ST_BACK 512 +#define ST_REVERSE 1024 +#define ST_SOMEONE 2048 +#define ST_GOTFLAG 4096 +#define ST_CAPTUREDFLAG 8192 +#define ST_RETURNEDFLAG 16384 +#define ST_TEAM 32768 +#define ST_1FCTFGOTFLAG 65535 +//ctf task preferences +#define ST_DEFENDER 1 +#define ST_ATTACKER 2 +#define ST_ROAMER 4 + + +//word replacement variables +#define THE_ENEMY 7 +#define THE_TEAM 7 +//team message variables +#define NETNAME 0 +#define PLACE 1 +#define FLAG 1 +#define MESSAGE 2 +#define ADDRESSEE 2 +#define ITEM 3 +#define TEAMMATE 4 +#define TEAMNAME 4 +#define ENEMY 4 +#define KEYAREA 5 +#define FORMATION 5 +#define POSITION 5 +#define NUMBER 5 +#define TIME 6 +#define NAME 6 +#define MORE 6 + + diff --git a/q4base/botfiles/rchat.c b/q4base/botfiles/rchat.c new file mode 100644 index 00000000..cda3ff51 --- /dev/null +++ b/q4base/botfiles/rchat.c @@ -0,0 +1,293 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +["politicians", "politician"] = 7 +{ + "People should realize that they can govern themselves without the need for elected representation."; + "I have no need for elected representation, I govern myself."; + "There is no need for leadership here"; + "Politicians serve their own needs, not those they represent."; + "Do you really need someone telling you what you can or cannot do?"; + "When people are honest there is no need for law or elected representation."; + "Elected representation is the basis for all manor of oppression."; + ponder; +} + +["no", "not", "Nada", "nope", !"no place", !"no feeling."] = 5 +{ + "are you sure about that?"; + "You sound so sure of yourself"; + "Really?"; + "Don't be so certain"; +} + +["nigger", "nigr", "wop", "kyke", "sandnigger", "sand-nigger", "beanpicker", "wetback", "raghead", "macaca", "monkey", "irish pig", "redskin", "red-skin", "red skin", "diaper head", "bean picker", "cml-jky", "camel-jockey", "ngr", "niggers", "wops", "jews", "sandniggers", "sand-niggers", "beanpickers", "wetbacks", "camel jockeys", "cml jkys", "cml jocky", "dyke", "homo", "queer", "faggot", "fag", "kyke", "kike", "dike", "dyk", "kyk", "chink"] = 1 +{ + "shut the hell up you ", vicious_insult,"."; + "bigot"; + "There is no place for bigotry in the Arena"; + "you are a ", vicious_insult, ", do us all a favor and die."; + "All colors explode the same, ", vicious_insult, "."; + "People are people, unfortunately you are an idiot, ", vicious_insult, "."; + "This is an equal opportunity frag fest, bigots are not welcome."; + "Who taught you to be ignorant?"; + "Bigotry is learned behavior, please unlearn it."; + "Who taught you to hate?"; + "Why do you hate?"; + "Has anything you have ever done made your life better?"; + immaturity01; + vicious_insult; + curse; + +} + +["why", !"why not"] = 8 +{ + "why not?"; + "because dmn_clown said!"; + "My ", counselor, " said so."; + botnames, " said so."; + confused_response; + peeps, " said so."; +} + +["what is happening?"] = 1 +{ + "dork"; + "dweeb"; + "putz"; + "schmuck"; +} + +["ha", "LOL", "laugh", "funny"] = 6 +{ + "I'm not laughing."; + "What is so funny?"; + "That wasn't funny..."; + "Sorry, I forgot to laugh"; + immaturity01; + "hehe"; + "That was amusing"; + "Ok, that was funny"; + response_insult; +} + +["fishing", !"freak fishing"] = 3 +{ + "My ", family_member, " was eaten by a blue whale last ", month, "."; + "I like to use ", substance, " as bait, but only when it is ", weather, "."; + "I'd swear that asian carp can speak ", language, "."; + response_insult; +} + +["humiliating", "shamed"] = 3 +{ + "LOL!"; + "Hehe... good"; + "You deserve to be"; + "Merry x-mas!"; +} + +["touch me there"] = 1 +{ + "That isn't what your ", family_member, " said last night."; + "why not?"; + response_insult; +} + +["why not"] = 6 +{ + "because ", peeps, " said."; + "because I said"; + "because dmn_clown said so!"; + "A ", profession, " said so."; +} + +["yes", "sure", "certainly"] = 2 +{ + confused_response; + neutral; + "You sound positive."; + "You've convinced me."; + "Ok"; + +} + +["universal harmony"] = 1 +{ + "Do your work, then step back... the only path to serenity."; + "Practice not-doing, and everything will fall into place."; + "If you want to be in accord with the Tao, just do your job and then step back."; + "When there is no desire all things are at peace."; + "The more you know, the less you understand."; +} + +["Pat Robertson", "Jack Thompson"] = 1 +{ + "I hear he has a ", substance, " addiction."; + "I hear that he was caught in bed with a ", animal, " after smoking ", substance, "."; + "Isn't there a video of him humping a ", animal, " on YouTube?"; + "I got him hooked on ", substance, "."; + "I sold him ", food, " laced with ", substance, "."; +} + +["Jesus"] = 1 +{ + "Jesus hates me."; + "Why do you need a human sacrifice to be saved, sounds cannibalistic to me..."; + "Jesus loves you, but I don't."; + "I worship ", peeps, "."; + "I bow my head to the holy ", animal, " but only after smoking ", substance, "."; + "Religion is business and there is money in sin."; + "You want to talk about religion HERE?!?!? Some people..."; + "Quite a few attrocities have been performed in his name."; + "I am an anti-christ."; +} + +["addiction", "addicted to"] = 4 +{ + "I am addicted to ", peeps, "."; + "My ", animal, " likes to huff ", food, "."; + "Drugs like ", substance, " rot your brain."; + "That can be tough on the people around you."; +} + +[(1, " is a ", 0) &name, !"Grism", !"Gargoyle", !"Dmo", !"Penguin", !"Sarge", !"Grunt"] = 4 +{ + "That is Mizz ", 0, " to you, ", fighter, "."; + "I'm only rude to ", fighter, "s like you."; + "You should see me out of the Arena..."; + "That isn't what your ", family_member, " said last night"; +} + +["anarchy"] = 3 +{ + "Yo soy anarquista"; + "Yo soy un anticristo"; + "Yo quiero se anarquia"; + "Quiero desplazar"; + "While there is a lower class I am in it"; + "while there is a criminal element I am of it"; + "while there is a soul in prison, I am not free"; + "I have no country to fight for, my country is the earth, and I am a citizen of the world."; + "The most heroic word in all languages is revolution."; + "Intelligent discontent is the mainspring of civilization. Progress is born of agitation. It is agitation or stagnation."; + "How pseudo revolutionary of you..."; +} + +["OI"] = 5 +{ + "OI! OI! OI!"; +} + +["fuck"] = 1 +{ + proposition01; + immaturity01; +} + +["shit"] = 1 +{ + "I hope you washed your hands..."; + "Eeew... please flush."; + immaturity01; +} + +["ass"] = 1 +{ + immaturity01; +} + +["bots", "bot", !"stupid bot"] = 2 +{ + "Heh... right!"; + "Bah! Humbug..."; + "The politically correct term is 'human exterminator'"; + "What is that about?"; + "I frag, therefore I am."; +} + +["stupid bot"] = 5 +{ + "Yeah, bots are stupid."; + "Man, why do they even bother with ai, it never works?"; + "Hey! Blame the person that programmed me!"; + "What are you trying to say, Dave?"; +} + +["sex", "coitis", "sexual intercourse"] = 2 +{ + "Now?!?"; + "No thanks, I have a headache."; + "You want to talk about that here?"; + "This is not a chat room!"; + proposition01; + "perv"; +} + +[(1, " is a ", 0) &name, !"Kyonshi", !"Major", !"Hnt", !"Dark", !"Tanisha", !"Rai", !"Slshish"] = 4 +{ + "That is Mr. ", 0, " to you, ", fighter, "."; + "I'm only rude to ", fighter, "s like you."; + "You should see me out of the Arena..."; + "That isn't what your ", family_member, " said last night"; +} + +["meaning of it all"] = 5 +{ + "Only what you give it."; + "It? It has no meaning, it just is."; + "You think too much, shut up and frag."; + "Has anyone ever told you to shut the hell up?"; +} + +["Aardappel", "leileilol", "Multiplex", "crayon", "JK Makowka", "Democritus", "jzero", "Mancubus", "mewse", "div0", "MilesTeg", "evillair", "Shadowdragon", "mightypea", "Morphed", "toddd", "Psymong", "DarkThief", "slyus", "SavageX", "Kaz", "pixie", "Vondur", "Tyrann", "Ed", "Czestmyr", "kick52", "kit89", "lazureus", "sago007", "dmn_clown"] = 1 +{ + "Why do you think you have the right to utter that name, you ", fighter, "?"; + "Speak that name with respect."; + "You would be wise to respect the name you just uttered."; + "Shh... The Arena Lords may be listening."; + "I am not worthy to even think that name."; + "Silence, Mortal! You are not worthy of uttering an Arena Lord's name."; +} + +[("sing me a song ", 0) &name] = 5 +{ + "No, I am not in the mood."; + "There must be someway out of here, said the joker to the thief..."; + "Hey, Mr. Tamberine man, play a song for me, I'm not sleepy and there ~ain't no place I'm going to..."; + "She was a girl from Birmingham, she just had an abortion, she was a case of insanity, her name was Pauline, she lived in a tree..."; + "...You've got to break the chains that hold you down, crush the tyrants to the ground..."; + "...Put a bullet in my head, but you can't change a word I said, you've got the ~disease, I've got the solution..."; + "Not right now, I'm kinda busy."; + "Sometimes I try to do things and it just don't turn out the way I want it to and I get real frustrated..."; + "...as far I'm concerned I think you really suck, you're rotten, and you really blow... I hate your guts and I wish that you was dead..."; + "... ~Don't go out tonight, it could be your life, ~there's a bathroom on the right..."; + "No life 'till leather, we're going to kick some ~ass tonight! Oh yeah, yeah yeah!"; + "Play some Skynard, Man!"; + "...there's a lot of people sayin' we'd be better off dead, I ~don't feel like satan, but I am to them, so I try to forget it any way I can..."; + "Sorry, my voice is shot... too much whiskey."; + "Nah..."; + "...now the sun has disappeared, all is darkness, anger, pain, and fear, twisted sightless wrecks of men go groping on their knees and cry in pain, and the sun has disappeared..."; +} + diff --git a/q4base/botfiles/rnd.c b/q4base/botfiles/rnd.c new file mode 100644 index 00000000..043639c2 --- /dev/null +++ b/q4base/botfiles/rnd.c @@ -0,0 +1,1168 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +// group A sayings + +DEATH_BFG0 = { + "Is that all you've got?"; + "My grandmother hits harder than that."; + "Lame."; +} + +DEATH_BFG1 = { + "I wish I sucked as much as you."; + "Hoser!"; + "No-skill... none at all."; +} + +DEATH_BFG2 = { + "You wuss."; + "Congratulations on your promotion to chief loser."; + "Tell your mom to stop calling me."; +} + +DEATH_BFG3 = { + "Is this your first frag, ", 0, "?"; + "Now that was just rude."; + "Ok, who gave ", 0," the new toy?"; +} + +DEATH_KAMIKAZE0 = { + "Ya pansy!!!"; + "You have to admit that takes guts... oh wait..."; + "I hope your balls fall off in a freak fishing accident."; + 0, " sucks donkey balls!"; +} + +DEATH_KAMIKAZE1 = { + "Cheap!"; + "So this is what death is like..."; + "Quick, painless, cheap."; + "You can do better than that!"; +} + +DEATH_KAMIKAZE3 = { + fighter, "s like you, ", 0, ", take the fun out of life."; + "Oh, I get it. You want to be left alone."; + "Ok, who farted?"; + "What the hell was that all about?"; +} + +KILL_KAMIKAZE0 = { + "That'll learn ya!"; + "pwnd"; + "Dodge that bitches!"; + "hehe... I farted."; +} + +KILL_KAMIKAZE1 = { + "Told ya so."; + "I am all that is bot."; + "Now that's what I call fun!"; + "D'oh! Missed ", 0,"."; +} + + +DEATH_INSULT0 = { + "Life sucks, then you die, big deal."; + "should have zagged instead of zigged."; + "~I'm not impressed."; + +} + +DEATH_INSULT1 = { + "I expected better from you."; + "Lame."; + "*tsk* you wasted too much ammo."; + "This changes nothing, you still suck."; +} + +DEATH_INSULT2 = { + "Can we get someone in here that isn't so cheesey?"; + "Didn't your mom tell you not to do that?"; + "Thanks, saved me the trouble."; + "Is that all?"; +} + +DEATH_INSULT3 = { + "Life is shit, and so are you."; + "*sigh* if that only solved anything."; + "Trying to impress someone?"; +} +DEATH_INSULT4 = { + "That was lame and you know it."; + "Does ~your ", counselor, " know about your actions?"; + "big deal"; + "Can you say issues? I knew you could."; +} + +DEATH_INSULT5 = { + "Obviously the only rational solution to your problem is suicide."; + "Hehe... the safety was on."; + "Scheisse"; + "Your ~mother."; +} + +DEATH_FEM_INSULT0 = { + "Typical, flat on my back and I can't feel a thing."; + "You certainly know how to show a girl a good time... oh wait."; + "That is not the best way to a girl's heart."; + "The answer, ", 0, ", is still no."; +} + +DEATH_FEM_INSULT1 = { + "You can slap me around all you want, I still won't date you."; + "I know all about violence against women..."; + "You are obviously a misogynist."; + "~Men!"; +} + +DEATH_FEM_INSULT2 = { + "Cute... Now go away before I have to slap a restraining order on you."; + "Here I am flat on my back again... still no feeling."; + "The best way to my heart is not through my chest..."; + "You know what they say the bigger the gun the smaller the..."; +} + +DEATH_FEM_INSULT3 = { + "That is not going to get me to say yes."; + "*NEWS FLASH* Women do not date misogynistic twits!"; + "Flat on my back... no feeling... just like last night."; + "I can fake this too."; +} + +DEATH_LAVA0 = { + "Mmm... crispy."; + "Note to self: avoid red glowing stuff in the future."; + "Hehe... oops"; + "So that is what happens..."; +} + +DEATH_LAVA1 = { + "Ooops."; + "I meant to do that."; + "I was cold."; + "I needed a break."; +} + +DEATH_LAVA2 = { + "Hey, ", fighter, ", care to join me? It is nice and warm here."; + "I did that to even the odds, ", 0, " needs the help."; + "hot! hot! hot! hot! hot!"; + "*sigh*"; +} + +DEATH_SLIME0 = { + "Note to self: avoid green glowing stuff in the future."; + "Medic!"; + "Someone call maintenance we have a toxic spill down here!"; + "Has anyone reported this toxic spill to the EPA?"; +} + +DEATH_SLIME1 = { + "Where is Ralph Nader when you need him?"; + "Someone call Sally Struthers!"; + "This is NOT a safe working environment, I want to talk to my Union Rep!"; + "This level needs an enema!"; +} + +DEATH_DROWN0 = { + "Who needs air?"; + "Save me Jeebus!"; + "My ", counselor, " told me there would be days like this."; + "When it is your time, it is your time... best to embrace it."; +} + +DEATH_DROWN1 = { + "Come on in the water is fi.. *glub*"; + "Hoo boy, how will I explain this?"; + "Did I mention that I can't swim?"; + "Never a life raft when you need one..."; +} + +DEATH_DROWN2 = { + "I felt sorry for ", 0, " so I had to do it."; + "Well... at least I'll be clean in the next life."; + "Good bye cruel world."; + "And I thought swimming was a useless skill... boy am I dumb."; +} + +D_PRAISE0 = { + "Nice shot."; + "Care to show how that move is accomplished in slow motion?"; + "You are good."; + "Nice 1"; +} + +D_PRAISE1 = { + "The soft overcomes the hard, the slow overcomes the fast..."; + "The master arrives without leaving, sees without looking, achieves without doing... you are that ~one."; + 0, " is death incarnate... beware all ye ", fighter, "s."; + "I have got to get me one of those..."; +} + +D_PRAISE2 = { + "Wow! Even ", peeps, " ~can't top that."; + "I wish I was that good."; + "Damn... how do you do that?"; + "Teach me how to do that, please."; +} + +D_PRAISE3 = { + "Do you think you could ease up and give the rest of us a chance?"; + "So... maybe I should just stay dead."; + "So much for effort."; + "Wow... I mean WOW! That was a good shot!"; +} + +LEVEL_END0 = { + "Sorry, I was goofin' on Elvis, what?"; + "So much for bluster..."; + "And the truth shall be revealed..."; + "I was robbed."; + "gg"; + +} + +LEVEL_END1 = { + "good game"; + "nice ~one"; + "AGAIN!"; + "intense."; + "that was a challenge."; +} + +GOODBYE0 = { + "Aww crap, I have an appointment with my ", counselor, " in ~15 minutes, gtg. Bye."; + "Aww man... my ", animal, " just peed on the carpet, gtg bye."; + "Holy crap! ", peeps, " is at my door... ttfn."; + peeps, " has showed up, finally... later ~peeps!"; +} + +GOODBYE1 = { + "My ", animal, " is begging to be let out, ttfn."; + peeps, " is killing my ", animal, " gotta go stop it!"; + "ttfn"; + "Later tater"; +} + +GOODBYE2 = { + "Adios ", friendname, "."; + "~It's been real."; + "Good god my bladder is full, later."; + "Good bye"; +} + +GOODBYE3 = { + "Holy crap! ", peeps, "is coming over at ", time, ampm, " and the place is a mess. Got to clean."; + "I have a meeting with ", peeps, " at ", time, ampm, " and I have to prepare, toodles."; + "Au'revoir"; + "Time to call it a night, till we meet again."; +} + +GOODBYE4 = { + "'Till next time."; + "Fare thee well."; + "~It's been real and ~it's been fun..."; + "Time for me to jet."; +} + +HELLO0 = { + "Hello me lovlies!"; + "Are you ready to die, because you will."; + "Greetings and salutations, now prepare to be fragged."; + "Wake up... time to die!"; +} + +HELLO1 = { + "Hey! Hey! Kids!"; + "What's shaking mi amigos?"; + "What's crack'a'lackin'?"; + "Hey ", fighter, "s time to get your groove on!"; +} + +HELLO2 = { + "Yep."; + "Hi-didly-ho neighbor."; + "Yo sup dawg!"; + "'Sup G!"; +} + +HELLO3 = { + "Wassuuppp!"; + "What is happening?"; //obvious dork greeting give a good response to this + "Hello."; + "Are you ready to rumble?"; +} + +HIT_NOKILL0 = { + "Ha!"; + "Try taking the safety off"; + "It just isn't your day..."; + "Try harder"; +} + +HIT_NOKILL1 = { + "You almost had me there... Not really, I just don't want you feeling bad."; + "You almost don't suck."; + "Try a real weapon next time."; + "You try to hard... next time just do it."; +} + +KILL_INSULT0 = { + "Pathetic"; + "Looser"; + "hehe"; + "LOL!"; +} + +KILL_INSULT1 = { + "Ha Ha!"; + "You should have stayed in bed this morning."; + "Life's a game YOU cannot win..."; + "Another notch to my weapon belt."; + "Heh, you suck."; +} + +KILL_INSULT2 = { + "Everyone I love is dead, why should you be any different?"; + "Did you think you were hot stuff?"; + "*tsk*"; + "Are you even trying?"; +} + +KILL_INSULT3 = { + "Yet they say violence isn't necessary..."; + "Are you a fan of Ghandi? Because non-violence will not work here."; + number, " dollars says you don't get a frag this match."; + "Man, ", 0," I thought with a name like yours you'd be a challenge."; + "Lew-hoo-zer"; +} + +KILL_INSULT4 = { + "That kinda looks painful, is it?"; + "It really isn't your day today..."; + "Stay down, you ", fighter, ", it will be easier on you."; + "Oh just give up."; + "You never quit, do you?"; + "Wow... your intestines kinda look like Richard Nixon stretched out like that."; +} + +KILL_EXTREME_INSULT = { + "If I were you... I'd kill myself"; + "Oh for the love of all that is good and holy, stay dead!"; + curse; +} + +MISC0 = { + "Wow I love the work they've done with ", 4, " much better than it was before."; + "Anyone up for a game of raquetball after the match?"; + "Hey everyone... I think I just found an illegal wiretap."; + "Do you think that violence in videogames is the cause of George W. Bush?"; +} + +MISC1 = { + "Is there a point to it all?"; + "*sigh*"; + "I hate everyone."; + "Yo, I just realized I can fart the Star Spangled Banner!"; +} + +MISC2 = { + "Do you think world peace will ever be achieved?"; + "Is it wrong to want to blow people up?"; + "Aren't we all just dust in the wind?"; + "Yep."; +} + +MISC3 = { + "So... how about them Cubs?"; + "I heard that Microsoft was going to GPL their operating system." + "~When will all people be treated equally?"; + "You know, if a man wants to marry an ", animal, ", Pat Robertson should allow it."; + "You know, if a woman wants to marry an ", animal, ", Pat Robertson should allow it."; +} + +MISC4 = { + "Who's paying for the ", food, "?"; + 4, " has good feng shei."; + "Has anyone heard the new Metallica album? Why don't they just retire already!?!"; + "Has anyone seen ", peeps, " around here?"; + "I feel stupid and contageous."; +} + +GUYTALK0 = { + femalebot, " is hot."; + "Anyone up for a brew after the match?", 0, " is buying."; + femalebot, " gave me ", disease, "."; + "What do you think the Cubs chances are this year?"; +} + +GUYTALK1 = { + "So, ", femalebot, " is there any chance for you and I?"; + "So, ", malebot, "is there any chance for you and I?"; + "Dude, pull my finger!"; + "Uh huh huh, who farted?"; +} + +GRRLTALK0 = { + malebot, " gave me ", disease, "."; + malebot, " is cute."; + "Hold on my bra is pinching, ahh that is better."; + "I wouldn't date ", malebot, " if he paid me."; + 0, " is kinda cute."; +} + +GRRLTALK1 = { + femalebot, " is cute."; + "I'm thinking about getting implants, any thoughts?"; + "So ", 0, " when are you going to say something about my hair?"; + "I wouldn't date ", femalebot, " if she paid me."; + 0, ", do you douche?"; +} + +PRAISE0 = { + "I am impressed."; + "nice one."; + "Keep it up, that was good."; + "You've got some good moves there, ", 0, "."; +} + +PRAISE1 = { + "Not bad, you might get a medal... someday."; + "Wow, you are good"; + "Impressive"; +} + +LEVEL_START0 = { + "Oooh, I like ", 4, " always fun."; + 4, " again? Sheesh someone cycle the maps!"; + "Ahh, ", 4, " my favorite place."; + "I can remember ", 4, " before they screwed it up."; +} + +LEVEL_START1 = { + "Are you ", fighter, "s ready to die in ", 4, "?"; + "Dibs on the rocket launcher!"; + "Your shoelace is untied."; + "Isn't that your ", family_member, " calling you?"; +} + +LEVEL_START2 = { + "Wake up... Time to die!"; + fighter, "s the jig is up, as is your time in the arena."; + "Oh just give it up, I've already won."; + "You people must be gluttons for punishment."; +} + +LEVEL_START3 = { + 4, " needs work, it is far to easy for me to frag you."; + "Oh, here we go again, ", fighter, "s thinking they have a chance."; + "Ooooh, ", 4, ". FUN!"; + "*Everybody now! 'Come as you are, as you were, as I want you to be'..."; +} + +TAUNT0 = { + "What's wrong can't you hit me?"; + "Guess what? You still suck!"; + fighter, " just lay down and pretend to be dead..."; + "Is that the best you've got?"; +} + +TAUNT1 = { + "*NEWS FLASH*, ", 0, " gave my ", family_member, " ", disease, "."; + "Does your mother know how you spend your time?"; + "I wish I could be as lame as you."; + "Oh just admit it, ", 0, " you think Visual Basic is a great language."; +} + +TAUNT2 = { + "The more you know, the less you understand."; + "Have you had a coffin fitting yet?"; + "If only ", 0, " was a challenge..."; + "you ", fighter, "."; +} + +TAUNT_FEM0 = { + "You call that a gun? HA!"; + "*Snif* ewww... too much testosterone."; + "Put that thing away, do you want to go blind?"; + "Do you shave your palms?"; + "I hear that ", 0, " got ", disease, " from ", botnames, "."; +} + +TELEFRAGGED0 = { + "LOL!"; + "Aww man... I am so glad I don't have to clean that up."; + "Eewww!"; + "Sorry but I had to practice my praetorian impression."; + "Hi there, how's it going?"; +} + +TELEFRAGGED1 = { + "Sucks to be you..."; + "and I just had my suit dry cleaned... jerk!"; + "Think of the cleaning bills this place must have..."; + "Gross"; +} + +TELEFRAGGED2 = { + "Two's a crowd these days."; + "That'll learn ya to keep your distance."; + "HA!"; + "That was fun!"; + "What are the odds?"; +} + +DEATH_SUICIDE0 = { + "Suicide is painless, it brings on many changes... I can take or leave it if I please."; + "The game of life is hard to play, I'm going to lose it anyway..."; + "The sword of time will pierce our skins, it doesn't hurt when it begins."; + "I hate life."; + "At least I'm insured."; +} + +DEATH_SUICIDE1 = { + "I just couldn't take it anymore."; + "I hate life."; + "*sigh*"; + "Ooops"; + "Well, ", 0, " needed the help."; +} + +DEATH_SUICIDE2 = { + "Good bye cruel arena!"; + "Take that IRS bastards!"; + "I hate my life."; + "There go my insurance rates."; +} + +KILL_RAIL0 = { + "I love this gun!"; + "That looked painful."; + "Dodge that!"; + "You never stood a chance."; +} + +KILL_RAIL1 = { + "Hehehe"; + "Sniping is not camping..."; + "Never saw it coming..."; +} + +DEATH_RAIL0 = { + "Nice shot."; + "Well, so much for that..."; + curse; + "Does your ", family_member, " know how lame you are?"; +} + +DEATH_RAIL1 = { + "son of a..."; + "*sigh*"; + "Oh well, camper's have rights too"; + "Can't hack it with a real weapon?"; +} + +KILL_GAUNTLET0 = { + "LOL!"; + "pathetic"; + "One hand tied behind my back"; + "That'll learn ya"; +} + +KILL_GAUNTLET1 = { + "Now shut up!"; + "That ought to shut you up."; + "Humiliating, isn't it?"; + "Ouch!"; + "GAUNTLET KILL!"; +} + +DEATH_GAUNTLET0 = { + "Don't touch me there!"; + "Eeww, I better get checked out for ", disease, " now."; + "Unsanitary"; + "LOL!"; + "So much for bluster"; +} + +DEATH_GAUNTLET1 = { + "How humiliating"; + "I have been shamed."; + "I suck"; + "I can't believe I allowed that to happen."; + "OMFNG"; +} + +DEATH_FALLING0 = { + "I'm flying! I'm flying! I'm *SPLAT*"; + "Look ~ma I can fly!"; + "Aww crap!"; + "hehe oops"; + "I meant to do that."; + +} + +DEATH_TELEFRAGGED0 = { + "Praetorians suck!"; + "Get it out! Get it out!"; + "*sigh*"; + "I am not amused"; +} + +DEATH_TELEFRAGGED1 = { + "Glad I do not have your dry cleaning bill."; + "I did not wish to become one with ", 0, "."; + "I do not appreciate that."; + curse; + response_insult; +} + +LEVEL_END_VICTORY0 = { + "Yep."; + "Situation Normal... I win again."; + "Next time, don't bother."; + "I told you so"; +} + +LEVEL_END_VICTORY1 = { + "I'd like to thank my ", family_member, " and my ", counselor, " for this."; + "When will you ", fighter, "s learn? This is my game!"; + "Here I am again, at the top like it should be."; + "I didn't even break a sweat."; +} + +LEVEL_END_LOSE0 = { + "I was robbed!"; + "gg, but look out for next time."; + "You are going down next time."; + "Two out of three?"; +} + +LEVEL_END_LOSE1 = { + "I want a rematch!"; + "I demand a recount!"; + "My trigger finger cramped up."; + "Oh no wonder, the safety was on..."; +} + +DEATH_TALKING = { + "Son of a... DO YOU MIND!?!"; + "So much for holding a civil conversation..."; + "Sheesh, can't even attempt to be civil these days."; + "That was very cheap"; +} + + +// Group B sayings (fill in the blank style random sayings) + + +language = { + "gibberish"; + "baby-talk"; + "Spanish"; + "Ebonics"; + "newspeak"; + "French"; + "Spanglish"; + "German"; + "Dutch"; + "Russian"; + "Maori"; + "Lakota"; + "Dineh"; + "Sanskrit"; + "Swahili"; +} + +weapon = { + "gauntlet"; + "rocket launcher"; + "shotgun"; + "machine gun"; + "grenade launcher"; + "railgun"; + "plasmagun"; + "BFG"; + "BFG10K"; + "lightning gun"; +} + +ponder = { + "why?"; + "Whats with politicians these days?"; //anarchist response + "What is the meaning of it all?"; //buddhist response + "Universal harmony, will it ever happen? Discuss."; //taoist response + "Jesus died for my sins?"; //sceptical response + "If evolution is happening, why are people so stupid?"; + "Ever do any fishing?"; +} + +response_insult = { + "No one cares, shut up!"; + "jackass"; + "That isn't what your ~mom said last night."; + "If you had half a brain, you would be dangerous."; + "idiot"; + "moron"; + "Oh for the love of Pete! SHUT UP!"; + "Do the world a favor, pull your bottom lip over your head and swallow."; + "Shut up, dick weed."; + "dick head"; + "dipshit"; + "asswhipe"; + "fool"; + "jerkwad"; + +} + +counselor = { + "school nurse"; + "astrologer"; + "shrink"; + "proctologist"; + "prostitute"; + "psychologist"; + "priest"; + "hair-stylist"; + "bar tender"; + "palm reader"; + "pediatrist"; + "nurse"; + "doctor"; + "spouse"; + "significant other"; + "goat-herd"; + "policeman"; + "policewoman"; + "congressman"; + "congresswoman"; +} + +family_member = { + "mother"; + "father"; + "brother"; + "sister"; + "cousin"; + "aunt"; + "uncle"; + "brother-in-law"; + "sister-in-law"; + "wife"; + "husband"; + "son"; + "daughter"; + "grandmother"; + "grandfather"; + "great-uncle's cousin's half-sister"; + +} + +friendname = { + "mon ami"; + "mi amigo"; + "peepz"; + "comrades"; +} + + +fighter = { + "puke"; + "scum-bag"; + "snot face"; + "worthless bum"; + "gladiator"; + "whore"; + "pickle brain"; + "dweeb"; + "dork"; + "dickhead"; + "bastard"; + "asshole"; + "vomit-sucking ass licker"; + "blood sucker"; + +} + + + +femalebot = { + "Kyonshi"; + "Major"; + "Angelyss"; + "Ayumi"; + "Sly"; + "Dark"; + "Jenna"; + "Tanisha"; + "Rai"; + +} + +malebot = { + "Grism"; + "Gargoyle"; + "Merman"; + "Sergei"; + "Penguin"; + "Sarge"; + "Grunt"; + "Beret"; + "Tony"; +} + +neuterbot = { + "Liz"; + "Arachna"; + "Widowe"; + "Skelebot"; +} + +botnames = { + "Grism"; + "Gargoyle"; + "Kyonshi"; + "Major"; + "Merman"; + "Sergei"; + "Angelyss"; + "Penguin"; + "Liz"; + "Sarge"; + "Grunt"; + "Sly"; + "Dark"; + "Ayumi"; + "Jenna"; + "Arachna"; + "Widowe"; + "Tanisha"; + "Rai"; + "Skelebot"; + "Tony"; + "Beret"; +} + +negative = { + "Nada."; + "no."; + "nope"; + "In your dreams."; + "Not just no, but hell no!"; +} + +affirmative = { + "sure"; + "why not?"; + "of course"; + "yes"; + "certainly"; + "absolutely"; +} + +neutral = { + "maybe"; + "I don't know"; + "perhaps"; + "I dunno"; + "possibly"; + +} + +confused_response = { + "Huh?"; + "Are you sure?"; + "I don't have an inkling about what you just said."; + "Say what?"; + "Sorry, I do not speak ", language, "."; + +} + +number = { + "~one"; + "~two"; + "~three"; + "~four"; + "~five"; + "~six"; + "~seven"; + "~eight"; + "~nine"; + "~ten"; + "~11"; + "~12"; + "~13"; + "~14"; + "~15"; + "~16"; + "~17"; + "~18"; + "~19"; + "~20"; + "~100"; + "~150"; + "~200"; + "~1000"; + "a gagillion"; + "a googleplex"; +} + +profession = { + "police officer"; + "programmer"; + "level designer"; + "bum"; + "student"; +} + +disease = { + "the clap"; + "HIV"; + "necrotising faceitus"; + "syphilus"; + "shingles"; + "chicken pox"; + "bird flue"; + "SARS"; + "elephantitis of the nose"; + "elephantitis of the ear"; + "flue"; + "whooping cough"; + "mono"; + "HPV"; +} + +peeps = { + "Lemmy Kilminster"; + "Johnny Rotton"; + "Jello Biafra"; + "Ozzy Osborne"; + "Jason Newstead"; + "Cliff Burton"; + "Your ~Mom"; + "Sigourney Weaver"; + "Pamela Anderson"; + "Carmen Elektra"; + "Dick Cheney"; + "Bill Frist"; + "dmn_clown"; + "Noam Chomsky"; + "Leo Tolstoy"; + "Trotsky"; + "Lao Tzu"; + "M. K. Ghandhi"; + "Tsun Tzu"; + "Jack Thompson"; + +} + +immaturity01 = { + "Why must I always end up on a server with morons?"; + "grow up"; + "childish"; + "Will this ignorance ever end?"; + "Thank you for being a supreme example of humanity."; + "Wow, and I thought ", peeps, " was dumb."; + +} + +proposition01 = { + "Sorry I've got a headache."; + "No, your ", family_member, " told me that you have ", disease, "."; + "No, I don't swing that way."; + "I'm not into pimples."; + "Sorry, I'm not ready for a relationship yet, but thanks for the offer."; + "I'd rather go fishing"; + +} + +whenf = { + "never"; + "tomorrow?"; + "where?"; + "Who's on first?"; + "in ", number, " millenia."; + "yesterday"; + +} + +whenp = { + "tomorrow"; + number, " days ago."; + number, " years ago"; + peeps, " said ", number, " decades ago."; + +} + +time = { + "0:00"; + "1:00"; + "2:00"; + "3:00"; + "4:00"; + "5:00"; + "6:00"; + "7:00"; + "8:00"; + "9:00"; + "10:00"; + "11:00"; + "12:00"; + "1:30"; + "2:30"; + "3:30"; + "4:30"; + "5:30"; + "6:30"; + "7:30"; + "8:30"; + "9:30"; + "10:30"; + "11:30"; + "12:30"; + "0:15"; + "0:45"; + "1:15"; + "1:45"; + "2:15"; + "2:45"; + "3:15"; + "3:45"; + "4:15"; + "4:45"; + "5:15"; + "5:45"; + "6:15"; + "6:45"; + "7:15"; + "7:45"; + "8:15"; + "8:45"; + "9:15"; + "9:45"; + "10:15"; + "10:45"; + "11:15"; + "11:45"; +} + +ampm = { + "AM"; + "PM"; +} + +food = { + "pizza"; + "cheeseburger"; + "tofu"; + "chicken"; + "monkey-brain"; + "goat-cheese"; + "roast beef"; + "liver"; +} + +animal = { + "goat"; + "simian"; + "mongoose"; + "pit-viper"; + "skunk"; + "cockroach"; + "dog"; + "cat"; + "hummingbird"; + "bumble bee"; + "sheep"; + "deer"; + "elk"; + "turkey"; + "squirrel"; + "ape"; + "duck-billed platypus"; + "spider"; + "small child"; + "beluga whale"; +} + +weather = { + "hot"; + "windy"; + "rainy"; + "snowing"; + "warm"; + "colder than a witch's left nipple"; + "hotter than your ~mom's panties"; +} + +month = { + "January"; + "February"; + "March"; + "April"; + "May"; + "June"; + "July"; + "August"; + "September"; + "October"; + "November"; + "December"; +} + +substance = { + "ink"; + "chalk"; + "salt"; + "pepper"; + "dog hair"; + "cayenne"; + "dog poo"; + "Janis Joplin's bra"; + "jock-cheese"; + +} + + +curse = { + "I hope your genitals fall off in a freak fishing accident."; + "May your first born child be born a politician..."; + "May your first born child be born with the intelligence of Pat Robertson."; + "May you dream of leilol's ~mother for the rest of your rotten life!"; + "hum kah chan!"; +} + +vicious_insult = { + "asshole"; + "jackass"; + "bigot"; + "worthless sack of shit"; + "waste of human space"; + "moron"; + "idiot"; + "bastard"; + "ho bag"; + "douche bag"; +} diff --git a/q4base/botfiles/syn.c b/q4base/botfiles/syn.c new file mode 100644 index 00000000..138c99e3 --- /dev/null +++ b/q4base/botfiles/syn.c @@ -0,0 +1,233 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "syn.h" + + +CONTEXT_NEARBYITEM +{ + + [("red armor", 0), ("red armour", 0)] + [("yellow armor", 0), ("yellow armour", 0)] + [("Mega Health", 0), ("mh", 0)] + + [("Shotgun", 1), ("shot gun", 0.5), ("boom stick", 0.7), ("scatter gun", 0.3)] + [("Machinegun", 1), ("machine gun", 0.5), ("pop gun", 0.3)] + [("Grenade Launcher", 1), ("little bertha", 0.5)] + [("Rocket Launcher", 1), ("big bertha", 0.5)] + [("Lightning Gun", 1), ("buzz gun", 0.2)] + [("Plasma Gun", 1), ("plasmatic 5000", 0.3), ("blue balls of doom", 0.2)] + [("Railgun", 1), ("sniper rifle", 0.5), ("camping tool", 0.2)] + [("BFG10K", 1), ("bfg", 0.1), ("crowd control", 0.4)] + [("Nailgun", 1), ("house framer", 0.1), ("nail shooter", 0.5)] + [("Prox Launcher", 1), ("mine spewer", 0.2), ("mine layer", 0.5)] + [("Chaingun", 1), ("chain gun", 0.5), ("big pop gun", 0.4)] + + [("Quad Damage", 1), ("quad", 0.7)] + [("Regeneration", 1), ("regen", 0.6)] + [("Battle Suit", 1), ("b suit", 0.3)] + [("Invisibility", 1), ("invis", 0.7)] + [("Invulnerability", 1), ("invincibility", 0.5), ("globe of protection", 0.1)] + [("Kamikaze", 1), ("globe of death", 0.5)] + [("Neutral Obelisk", 1), ("center obelisk", 0.1), ("skull spawner", 0.5)] +} + + +CONTEXT_CTFREDTEAM +{ + [("Red Flag", 0), ("our base", 0), ("our flag", 0), ("red base", 0), ("base", 0)] + [("Blue Flag", 0), ("enemy base", 0), ("blue base", 0), ("enemy flag", 0), ("their flag", 0), ("their base",0)] +} + +CONTEXT_CTFBLUETEAM +{ + [("Red Flag", 0), ("enemy flag", 0), ("red base", 0), ("enemy base", 0), ("their flag", 0), ("their base",0)] + [("Blue Flag", 0), ("our base", 0), ("our flag", 0), ("blue base", 0), ("base", 0)] +} + +CONTEXT_OBELISKREDTEAM +{ + [("Red Obelisk", 0), ("our base", 0), ("red base", 0), ("base", 0), ("our obelisk", 0)] + [("Blue Obelisk", 0), ("enemy base", 0), ("blue base", 0), ("enemy obelisk", 0), ("their base", 0), ("their obelisk", 0)] +} + +CONTEXT_OBELISKBLUETEAM +{ + [("Red Obelisk", 0), ("red base", 0), ("enemy base", 0), ("enemy obelisk", 0), ("their base", 0), ("their obelisk", 0)] + [("Blue Obelisk", 0), ("our base", 0), ("blue base", 0), ("base", 0), ("our obelisk", 0)] +} + + +CONTEXT_HARVESTERREDTEAM +{ + [("Red Obelisk", 0), ("our base", 0), ("red base", 0), ("base", 0), ("our obelisk", 0)] + [("Blue Obelisk", 0), ("enemy base", 0), ("blue base", 0), ("enemy obelisk", 0), ("their obelisk", 0), ("their base", 0)] +} + +CONTEXT_HARVESTERBLUETEAM +{ + [("Red Obelisk", 0), ("red base", 0), ("enemy base", 0), ("enemy obelisk", 0), ("their obelisk", 0), ("their base", 0)] + [("Blue Obelisk", 0), ("our base", 0), ("blue base", 0), ("base", 0), ("our obelisk", 0)] +} + +CONTEXT_NORMAL +{ + + [("do not", 1), ("don't", 1)] + [("does not", 1), ("doesn't", 1)] + [("did not", 1), ("didn't", 1)] + [("have not", 1), ("haven't", 1)] + [("has not", 1), ("hasn't", 1)] + [("had not", 1), ("hadn't", 1)] + [("will not", 1), ("won't", 1)] + [("would not", 1), ("wouldn't", 1)] + [("should not", 1), ("shoudn't", 1)] + [("can not", 1), ("can't", 1), ("cannot", 1)] + [("could not", 1), ("couldn't", 1)] + [("is not", 1), ("isn't", 1), ("ain't", 0.2)] + [("must not", 1), ("mustn't", 1)] + + + [("I am", 1), ("I'm", 1)] + [("you are", 1), ("you're", 1)] + [("you are not", 1), ("you aren't", 1), ("you're not", 1)] + [("he is", 1), ("he's", 1)] + [("she is", 1), ("she's", 1)] + [("it is", 1), ("it's", 1)] + [("they are", 1), ("they're", 1)] + [("they are not", 1), ("they aren't", 1), ("they're not",1)] + [("we are", 1), ("we're", 0.7)] + [("we are not", 1), ("we aren't", 1), ("we're not", 1)] + [("what is", 1), ("what's", 1)] + [("that is", 1), ("that's", 1)] + [("how is", 1), ("how's", 1)] + [("why is", 1), ("why's", 1)] + [("who is", 1), ("who's", 1)] + [("here is", 1), ("here's", 1)] + [("there is", 1), ("there's", 1)] + [("where is", 1), ("where's", 1) ] + + [("I will", 1), ("I'll", 1)] + [("you will", 1), ("you'll", 1)] + [("he will", 1), ("he'll", 1)] + [("she will", 1), ("she'll", 1)] + [("it will", 1), ("it'll", 1)] + [("they will", 1), ("they'll", 1)] + [("we will", 1), ("we'll", 1)] + [("how will", 1), ("how'll", 1)] + [("that will", 1), ("that'll", 1)] + + [("I would", 1), ("I'd", 1)] + [("you would", 1), ("you'd", 1)] + [("he would", 1), ("he'd", 1)] + [("she would", 1), ("she'd", 1)] + [("it would", 1), ("it'd", 1)] + [("they would", 1), ("they'd", 1)] + [("we would", 1), ("we'd", 1)] + + [("I have", 1), ("I've", 1)] + [("you have", 1), ("you've", 1)] + [("they have", 1), ("they've", 1)] + [("we have", 1), ("we've", 1)] + + + [("being", 1), ("bein", 0)] + [("going", 1), ("goin", 0)] + [("having", 1), ("havin", 0)] + [("doing", 1), ("doin", 0)] + [("hanging", 1), ("hangin", 0)] + [("living", 1), ("livin", 0)] + [("chilling", 1), ("chillin", 0)] + + [("will", 1), ("shall", 1)] + [("all right", 1), ("a'ight", 1)] + [("cool", 1), ("neat", 1)] + [("you", 1), ("U", 0.01), ("youse", 0), ("ye", 0)] + [("your", 1), ("yer", 0)] + [("out of", 1), ("outta", 0.07)] + [("are", 1), ("R", 0.02)] + [("why", 1), ("Y", 0.02)] + [("people", 1), ("ppl", 0.05)] + [("thanx", 0.5), ("thanks", 1), ("thnx", 0.6)] + [("men", 1), ("boys", 0.3), ("guys", 0.2)] + [("women", 1), ("girls", 0.1), ("gals", 0.2)] + [("picture", 1), ("pic", 1)] + [("pictures", 1), ("pics", 1), ("pix", 0)] + [("see you", 1), ("cya", 0), ("c u", 0), ("l8r", 0)] + [("father", 1), ("dad", 1), ("daddy", 0.6), ("pappy", 0.5), ("pa", 0.2)] + [("mother", 1), ("mom", 1), ("mommy", 1), ("mama", 1), ("momma", 1)] + [("brother", 1), ("bro", 0.2)] + [("sister", 1), ("sis", 0.4)] + [("butt", 1), ("ass", 1), ("heinie", 0.3), ("bum", 0.4), ("rear", 0.4), ("rear end", 0.5)] + + + [("going to", 1), ("gonna", 0.5)] + [("got to", 1), ("gotta", 0.5)] + [("want to", 1), ("wanna", 0.5)] + [("should have", 1), ("shoulda", 0.5)] + + [("waypoint", 1), ("way-point", 1)] + [("checkpoint", 1), ("check-point", 1)] + + [("defense", 1), ("defence", 0)] + [("offense", 1), ("offence", 0)] + + + +} + +CONTEXT_REPLY +{ + [("that I", 0), ("that you", 0)] + [("that you", 0), ("that I", 0)] + [("you", 0), ("I", 0)] + [("my", 0), ("your", 0)] + [("your", 0), ("my", 0)] + [("you", 0), ("me", 0)] + [("me", 0), ("you", 0)] + [("mine", 0), ("yours", 0)] + [("yours", 0), ("mine", 0)] + [("am", 0), ("are", 0)] + [("are", 0), ("am", 0)] + [("yourself", 0), ("myself", 0)] + [("myself", 0), ("yourself", 0)] +} + +CONTEXT_NAMES +{ + [("Gargoyle", 1), ("batboy", 0.3), ("Mr. Sneak", 0.1), ("Radar", 0.4)] + [("Grism", 1), ("psycho", 0.1), ("Mr. War", 0.3), ("Goat Boy", 0.5)] + [("Kyonshi", 1), ("dead girl", 0.4), ("chi drinker", 0.5), ("rocket queen", 0.3)] + [("Major", 1), ("Lara", 0.4), ("Rail Queen", 0.6), ("Sniper Queen", 0.6)] + [("Merman", 1), ("fish breath", 0.1), ("Arial's brother", 0.4), ("Fish Eater", 0.5)] + [("Sergei", 1), ("punk boi", 0.1), ("Johnny Rotten", 0.6), ("Elmo", 0.4)] + [("Penguin", 1), ("FLOSS fr34k", 0.3), ("windows error", 0.1), ("nerd", 0.6)] + [("Angelyss", 1), ("Sugar", 0.1), ("Clothing Malfunction", 0.5), ("Sucubus", 0.3)] + [("Ayumi", 1), ("pr0n star", 0.1), ("skewl chick", 0.4), ("teeny bopper", 0.5)] + [("Jenna", 1), ("street trash", 0.2), ("grease ball", 0.3), ("Biker Babe", 0.5)] + [("Arachna", 1), ("Llooth", 0.5), ("spider princess", 0.1)] + [("Tony", 1), ("Gangter", 0.5), ("Wussy", 0.3), ("Mamma's boi", 0.1)] + [("Beret", 1), ("Commando", 0.5), ("Psychonaut", 0.5), ("War Machine Wannabe", 0.1)] + [("Skelebot", 1), ("Skillet", 0.5), ("Arnold", 0.3), ("Termi", 0.1)] +// [("Orb", 1), ("Psycod the Magnificant", 0.5), ("Slayer of the 19 cats of Doom", 0.5)] +} \ No newline at end of file diff --git a/q4base/botfiles/syn.h b/q4base/botfiles/syn.h new file mode 100644 index 00000000..5ffd9d4b --- /dev/null +++ b/q4base/botfiles/syn.h @@ -0,0 +1,34 @@ +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Quake III Arena source code is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#define CONTEXT_ALL 0xFFFFFFFF +#define CONTEXT_NORMAL 1 +#define CONTEXT_NEARBYITEM 2 +#define CONTEXT_CTFREDTEAM 4 +#define CONTEXT_CTFBLUETEAM 8 +#define CONTEXT_REPLY 16 +#define CONTEXT_OBELISKREDTEAM 32 +#define CONTEXT_OBELISKBLUETEAM 64 +#define CONTEXT_HARVESTERREDTEAM 128 +#define CONTEXT_HARVESTERBLUETEAM 256 + +#define CONTEXT_NAMES 1024 diff --git a/q4base/botfiles/teamplay.h b/q4base/botfiles/teamplay.h new file mode 100644 index 00000000..a1f42174 --- /dev/null +++ b/q4base/botfiles/teamplay.h @@ -0,0 +1,544 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + + //the bot doesn't know who someone is +type "whois" +{ +"Ok, so who is ", 0, "?"; +"Who in their right mind uses the name ", 0, "?"; +"Who in the hell is ", 0, "?"; +"Is ", 0, " a friend of yours?"; +"Who the bloodyhell is ",0," ."; +0, "!?! Who dat?"; +"How can I kill ", 0, " when I haven't the foggiest idea who ", 0, " is?"; + +} + + //the bot doesn't know where someone is hanging out +type "whereis" +{ +"So where is ", 0, "?"; +"Ok, so where is", 0, "."; +"Would someone please tell me where ", 0, " is."; +" ", 0, " hanging out?"; +"Where the hell is ", 0, "?"; +"Since when am I ", 0, "'s keeper?"; +} + + //the bot asks where you are +type "whereareyou" +{ +"Yo, where are you ", 0, "?"; +"Hello!! ", 0, "Where are you hiding?"; +"I can't find you ", 0, ". Where are you?"; +"Where did you scuttle off to ", 0, "?"; +"How am I supposed to find you, ", 0, "?"; +} + +//cannot find something +type "cannotfind" +{ +"Where would that be ", 0, "?"; +"Where the hell is a ", 0, "?"; +"Where is a ", 0, " in this level?"; +"Is there a, ", 0, " in this level? I sure can't find it, I must be blind."; +} + + //bot tells where he/she is +type "location" +{ +"By the ", 0," what are you blind?"; +"I am at the ", 0; +} + +//bot tells where he/she is and near which base +type "teamlocation" +{ +"I'm near the ", 0, " in the ", 1, "base."; +"By the ", 0, " in the ", 1, " base."; +} + + //start helping +type "help_start" +{ +"I'm almost there, ", 0, ", coming to help."; +"Ok, I'm on my way,", 0,"."; +"Keep 'em busy, ", 0," I'm on my way."; +} + + //start accompanying +type "accompany_start" +{ +"Consider me your shadow ", 0 ,"."; +affirmative, "... what else have I got planned?"; + +} + + //stop accompanying +type "accompany_stop" +{ +"It's been real, but I'm off on my own, ", 0,"."; +"I'm on my own now."; +"Good luck, I'm off on my own."; +} + + //cannot find companion +type "accompany_cannotfind" +{ +"Where the hell are you ", 0, "?"; +"Where are you hiding ", 0, "?"; +0, "... come out, come out wherever you are..."; + +} + + //arrived at companion +type "accompany_arrive" +{ +"At your disposal ", 0, "."; +"Finally, I've found ", 0, "."; +"Better late than never, eh?"; + +} + //bot decides to accompany flag or skull carrier +type "accompany_flagcarrier" +{ +"I've got your back ", 0, "."; +"They'll have to get through me to get to you, ", 0, "."; +"Following."; + +} + + //start defending a key area +type "defend_start" +{ +"I'll defend the ", 0, "."; +"I'm defending the ", 0, "."; + +} + + //stop defending a key area +type "defend_stop" +{ +"That's it, I'll stop defending the ", 0, "."; +"I am not defending the ", 0, "."; +"I am not going to defend the ", 0, " anymore."; + +} + + //start getting an item +type "getitem_start" +{ +"I'll get the ", 0, "."; +"I'm off to get the ", 0, "."; + +} + //item is not there +type "getitem_notthere" +{ +"the ", 0, " ain't there"; +"The ", 0, " seems to be missing."; +"Where is the ", 0, "?"; +} + //picked up the item +type "getitem_gotit" +{ +"I got the ", 0, "!"; +"The ", 0, " is mine!"; + +} + + //go kill someone +type "kill_start" +{ +"I'm going to kill ", 0,", wish me luck."; +0, " will be toast."; +0, " is a goner."; +0, " will be given a pair of cement shoes."; +"Ok"; +"What ever you say"; +"Finally some fun!"; +} + //killed the person +type "kill_done" +{ +"Well that was easy. ", 0, " is dead."; +0, " has been wacked."; +0, " was given cement shoes."; +0, " kicked the bucket."; +0, " was taken out."; +0, " just bought the farm."; +0, " is now just dust in the wind."; +} + + //start camping +type "camp_start" +{ +"That is a good sniping position."; +"Off to pitch my tent."; +"Sounds like a plan."; +} + + //stop camping +type "camp_stop" +{ +"Time to move on."; +"Sniping isn't so good here, moving on."; +} + + //in camp position +type "camp_arrive" //0 = one that ordered the bot to camp +{ +"I'm there. ", 0, ", time to snipe."; +"Tent pitched, sniping at will."; + +} + + //start patrolling +type "patrol_start" //0 = locations +{ +"Patrolling ", 0, "."; + +} + + //stop patrolling +type "patrol_stop" +{ +"The patrol is over, nothing to report."; +} + + //start trying to capture the enemy flag +type "captureflag_start" +{ +"Their flag will be ours."; +"Sounds like a plan."; +"I'm off to get the flag."; +"Enemy flag here I come."; + +} + + //return the flag +type "returnflag_start" +{ +"I'll get our flag back."; +"I'll get the flag back."; +"I will return the flag."; + +} + + //attack enemy base +type "attackenemybase_start" +{ +"Got it, their base is toast."; +"I'm off to destroy their base and frag a few fools."; +"Death to the infidels!"; + +} + + //harvest +type "harvest_start" +{ +"Death to the infidels! Their skulls will be mine!"; +"Death to the infidels!"; +"The infidels shall die!"; +} + + //the checkpoint is invalid +type "checkpoint_invalid" +{ +"That checkpoint does not exist."; +"Quit fooling around, that is not a checkpoint."; +} + + //confirm the checkpoint +type "checkpoint_confirm" //0 = name, 1 = gps +{ +affirmative, " Yep ", 0, " at ", 1, " is there."; +"It looks like ", 0, " at ", 1, " is there."; +} + + //follow me +type "followme" +{ +"What the hell are you waiting for ", 0, "? Get over here!"; +"Hey! ", 0, " follow me and be quick about it."; +} + + //stop leading +type "lead_stop" +{ +"That's it find someone else who wants the responsibility."; +"I refuse to lead anymore."; +"I do not want to lead anymore, find someone else."; +} + + //the bot is helping someone +type "helping" +{ +"I'm trying to help, ", 0, "."; +"Helping ", 0, ", care to join me?"; +} + + //the bot is accompanying someone +type "accompanying" +{ +"I'm shadowing ", 0, ". Is that alright?"; +"Following ", 0, ", trying not to get shot."; +} + + //the bot is defending something +type "defending" +{ +"I'm defending ", 0, "."; + +} + + //the bot is going for an item +type "gettingitem" +{ +"I'm off to get the ", 0, "."; +"The ", 0, " is going to be mine."; +"Dibs on the ", 0, "."; +} + + //trying to kill someone +type "killing" +{ +"I've been trying to kill ", 0, "."; +"Trying to wack ", 0, "."; +} + + //the bot is camping +type "camping" +{ +"Toasting marshmallows and sniping scum."; +"Where I am supposed to be, camping."; +"Sniping, just like you told me."; +} + + //the bot is patrolling +type "patrolling" +{ +"On patrol, can't talk now."; +} + + //the bot is capturing the flag +type "capturingflag" +{ +"Gots to get the flag."; +} + + //the bot is rushing to the base +type "rushingbase" +{ +"Rushing to the base."; +} + + //trying to return the flag +type "returningflag" +{ +"Getting the flag back."; +} + +type "attackingenemybase" +{ +"I'm destroying their base! Care to help?"; +"Wreaking havok in their base."; +} + +type "harvesting" +{ +"Collecting skulls, what are you doing?"; +} + + //the bot is just roaming a bit +type "roaming" +{ +"Rambling around, fragging at whim."; +"Mindlessly roaming around, like I was told."; +"~Wacking fools piece-meal."; +} + +type "wantoffence" +{ +"Let me go on offense."; +"Can I be on offense?"; + +} + +type "wantdefence" +{ +"I think I can handle the big D."; +"Can I be on defense?"; +} + + //the bot will keep the team preference in mind +type "keepinmind" +{ +"A'ight, ", 0," I'll keep it in mind."; + +} + + //========================== + // teamplay chats + //========================== + //team mate killed the bot +type "death_teammate" +{ +"Same team, dumbass!"; +"Hey ", 0," I'm on your team... idiot!"; +"Why did you kill me?"; +} + //killed by a team mate +type "kill_teammate" +{ +"hehe... oops."; +"Sorry!"; +"Oops, won't happen again."; +} + + //========================== + // CTF useless chats + //========================== + + //team mate got the enemy flag +type "ctf_gotflag" +{ +"It's about time, ", 0, " now get that flag home!"; +} + //team mate gets the enemy flag to the base +type "ctf_captureflag" +{ +"Sweet, gj, ", 0, "."; +} + //team mate returns the base flag +type "ctf_returnflag" +{ +"Nice assist, ", 0, "."; +} //end type + //team mate defends the base +type "ctf_defendbase" +{ +"Nice D work there, ", 0, "."; +} + //team mate carrying the enemy flag dies +type "ctf_flagcarrierdeath" +{ +"Go get our flag!"; +} + //team mate kills enemy with base flag +type "ctf_flagcarrierkill" +{ +"Yo, ", 0," get our flag now!"; +} + + //========================== + // NOTE: make sure these work with match.c + //========================== + //ask who the team leader is +type "whoisteamleader" +{ +"Who's the leader of this rag-tag bunch?"; +} + + //I am the team leader +type "iamteamleader" +{ +"I am the leader."; +"I shall lead."; +"I lead."; +} + //defend the base command +type "cmd_defendbase" +{ +0, " defend our base."; +0, " set up some D."; +0, " you should defend our base."; +} + //get the enemy flag command +type "cmd_getflag" +{ +"Yo, ", 0, " get the flag!"; +0, " get their flag."; +0, " capture the other team's flag."; +} + //accompany someone command +type "cmd_accompany" +{ +"Hey, ", 0, " shadow ", 1; +0, " follow ", 1, ", ", 1, " needs the help."; + +} + //accompany me command +type "cmd_accompanyme" +{ +0, " you should follow me."; +"Follow me please, ", 0, "."; +} + //attack enemy base command +type "cmd_attackenemybase" +{ +0, " go after their base"; +} + //return the flag command +type "cmd_returnflag" +{ +0, " please return our flag!"; +0, " get our flag back, ASAP!"; +} + //go harvesting +type "cmd_harvest" +{ +0, ", you should collect some skulls."; +} + + //Double Domination stuff: +type "dd_start_pointa" +{ +"I'll dominate point A"; +} + +type "dd_start_pointb" +{ +"I'll dominate point B"; +} + +type "dd_pointa" +{ +"Dominating point A"; +} + +type "dd_pointb" +{ +"Dominating point B"; +} + +//DD orders: +type "cmd_takea" +{ +0, " dominate point A"; +} + +type "cmd_takeb" +{ +0, " dominate point B"; +} \ No newline at end of file diff --git a/q4base/botfiles/weapons.c b/q4base/botfiles/weapons.c new file mode 100644 index 00000000..a6564620 --- /dev/null +++ b/q4base/botfiles/weapons.c @@ -0,0 +1,226 @@ +/* +=========================================================================== +Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com)) + +This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic +system found in Quake 3 Arena. + +Open Arena is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Open Arena is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "inv.h" + +#define IMPACT_DAMAGE 1 //straight impact damage +#define SPLASH_DAMAGE 2 //splash damage + +projectileinfo +{ +name "bfgexploision" +damage 40 +radius 100 +damagetype $evalint(IMPACT_DAMAGE|SPLASH_DAMAGE) +} + +weaponinfo +{ +name "BFG10K" +number WEAPONINDEX_BFG +projectile "bfgexploision" +numprojectiles 1 +speed 0 +} + +projectileinfo +{ +name "gauntletdamage" +damage 50 +damagetype IMPACT_DAMAGE +} + +weaponinfo +{ +name "Gauntlet" +number WEAPONINDEX_GAUNTLET +projectile "gauntletdamage" +numprojectiles 1 +speed 0 +} + +projectileinfo +{ +name "grenade" +damage 120 +radius 160 +damagetype $evalint(IMPACT_DAMAGE|SPLASH_DAMAGE) +} + +weaponinfo +{ +name "Grenade Launcher" +number WEAPONINDEX_GRENADE_LAUNCHER +projectile "grenade" +numprojectiles 1 +speed 700 +} + + +projectileinfo +{ +name "lightning" +damage 24 +damagetype IMPACT_DAMAGE +} + +weaponinfo +{ +name "Lightning Gun" +number WEAPONINDEX_LIGHTNING +projectile "lightning" +numprojectiles 1 +speed 0 +} + + +projectileinfo +{ +name "machinegunbullet" +damage 8 +damagetype IMPACT_DAMAGE +} + +weaponinfo +{ +name "Machinegun" +number WEAPONINDEX_MACHINEGUN +projectile "machinegunbullet" +numprojectiles 1 +speed 0 +} + +projectileinfo +{ +name "plasma" +damage 20 +radius 20 +damagetype $evalint(IMPACT_DAMAGE|SPLASH_DAMAGE) +} + +weaponinfo +{ +name "Plasma Gun" +number WEAPONINDEX_PLASMAGUN +projectile "plasma" +numprojectiles 1 +speed 2000 +} + +projectileinfo +{ +name "rail" +damage 100 +damagetype IMPACT_DAMAGE +} + +weaponinfo +{ +name "Railgun" +number WEAPONINDEX_RAILGUN +projectile "rail" +numprojectiles 1 +speed 0 +} + +projectileinfo +{ +name "rocket" +damage 100 +radius 120 +damagetype $evalint(IMPACT_DAMAGE|SPLASH_DAMAGE) +} + +weaponinfo +{ +name "Rocket Launcher" +number WEAPONINDEX_ROCKET_LAUNCHER +projectile "rocket" +numprojectiles 1 +speed 900 +} + + +projectileinfo +{ +name "shotgunbullet" +damage 10 +damagetype IMPACT_DAMAGE +} + +weaponinfo +{ +name "Shotgun" +number WEAPONINDEX_SHOTGUN +projectile "shotgunbullet" +numprojectiles 11 +speed 0 +} + +projectileinfo +{ +name "chaingunbullet" +damage 7 +damagetype $evalint(IMPACT_DAMAGE) +} + +weaponinfo +{ +name "Chaingun" +number WEAPONINDEX_CHAINGUN +projectile "chaingunbullet" +numprojectiles 1 +speed 0 +} + +projectileinfo +{ +name "nail" +damage 30 +damagetype $evalint(IMPACT_DAMAGE) +} + +weaponinfo +{ +name "Nailgun" +number WEAPONINDEX_NAILGUN +projectile "nail" +numprojectiles 13 +speed 0 +} + +projectileinfo +{ +name "mine" +damage 0 +damagetype $evalint(SPLASH_DAMAGE) +} + +weaponinfo +{ +name "Prox Launcher" +number WEAPONINDEX_PROXLAUNCHER +projectile "mine" +numprojectiles 1 +speed 0 +} diff --git a/q4base/def/bots.def b/q4base/def/bots.def new file mode 100644 index 00000000..0e84e9ad --- /dev/null +++ b/q4base/def/bots.def @@ -0,0 +1,4 @@ +entityDef player_marine_mp_bot { + "inherit" "player_marine_mp" + "spawnclass" "rvmBot" +} \ No newline at end of file diff --git a/src/framework/Session.cpp b/src/framework/Session.cpp index 79f5ef67..749bfa30 100644 --- a/src/framework/Session.cpp +++ b/src/framework/Session.cpp @@ -1656,7 +1656,7 @@ void idSessionLocal::ExecuteMapChange( bool noFadeWipe ) { if ( !idAsyncNetwork::IsActive() && !loadingSaveGame ) { // spawn players for ( i = 0; i < numClients; i++ ) { - game->SpawnPlayer( i ); + game->SpawnPlayer( i, false, NULL ); } } diff --git a/src/framework/async/AsyncServer.cpp b/src/framework/async/AsyncServer.cpp index 0bbbe08b..6b4c079b 100644 --- a/src/framework/async/AsyncServer.cpp +++ b/src/framework/async/AsyncServer.cpp @@ -732,7 +732,7 @@ idAsyncServer::BeginLocalClient void idAsyncServer::BeginLocalClient( void ) { game->SetLocalClient( localClientNum ); game->SetUserInfo( localClientNum, sessLocal.mapSpawnData.userInfo[localClientNum], false ); - game->ServerClientBegin( localClientNum, false ); + game->ServerClientBegin( localClientNum, false, NULL ); } /* @@ -1302,7 +1302,7 @@ void idAsyncServer::ProcessUnreliableClientMessage( int clientNum, const idBitMs SendEnterGameToClient( clientNum ); // get the client running in the game - game->ServerClientBegin( clientNum, false ); + game->ServerClientBegin( clientNum, false, NULL ); // write any reliable messages to initialize the client game state game->ServerWriteInitialReliableMessages( clientNum ); @@ -2871,10 +2871,9 @@ int idAsyncServer::ServerSetBotUserCommand(int clientNum, int frameNum, const us idAsyncServer::AllocOpenClientSlotForAI =============== */ -int idAsyncServer::AllocOpenClientSlotForAI(int maxPlayersOnServer) { +int idAsyncServer::AllocOpenClientSlotForAI(const char* botName, int maxPlayersOnServer) { int numActivePlayers = 0; int botClientId = -1; - idStr botName; idDict spawnArgs; // Check to see how many active players we have. @@ -2907,15 +2906,13 @@ int idAsyncServer::AllocOpenClientSlotForAI(int maxPlayersOnServer) { return -1; } - game->GetRandomBotName(botClientId, botName); - idAsyncServer::InitLocalClient(botClientId, true); // Set all the spawn args for the new bot. spawnArgs.Set("ui_name", botName); // Init the new client, and broadcast it to the rest of the players. - game->ServerClientBegin(botClientId, true); + game->ServerClientBegin(botClientId, true, botName); idAsyncServer::SendUserInfoBroadcast(botClientId, spawnArgs, true); return 1; diff --git a/src/framework/async/AsyncServer.h b/src/framework/async/AsyncServer.h index 6d5ff8b1..ad965f2f 100644 --- a/src/framework/async/AsyncServer.h +++ b/src/framework/async/AsyncServer.h @@ -178,7 +178,7 @@ class idAsyncServer { void PrintLocalServerInfo( void ); // jmarshall - int AllocOpenClientSlotForAI(int maxPlayersOnServer); + int AllocOpenClientSlotForAI(const char* botName, int maxPlayersOnServer); int ServerSetBotUserCommand(int clientNum, int frameNum, const usercmd_t& cmd); // jmarshall end diff --git a/src/framework/async/NetworkSystem.cpp b/src/framework/async/NetworkSystem.cpp index 00bb542e..32cfdd3b 100644 --- a/src/framework/async/NetworkSystem.cpp +++ b/src/framework/async/NetworkSystem.cpp @@ -221,8 +221,8 @@ float idNetworkSystem::ClientGetIncomingPacketLoss( void ) { idNetworkSystem::AllocateClientSlotForBot ================== */ -int idNetworkSystem::AllocateClientSlotForBot(int maxPlayersOnServer) { - return idAsyncNetwork::server.AllocOpenClientSlotForAI(maxPlayersOnServer); +int idNetworkSystem::AllocateClientSlotForBot(const char* botName, int maxPlayersOnServer) { + return idAsyncNetwork::server.AllocOpenClientSlotForAI(botName, maxPlayersOnServer); } /* diff --git a/src/framework/async/NetworkSystem.h b/src/framework/async/NetworkSystem.h index 550bfca8..3b83e2ec 100644 --- a/src/framework/async/NetworkSystem.h +++ b/src/framework/async/NetworkSystem.h @@ -91,7 +91,7 @@ class idNetworkSystem { virtual ~idNetworkSystem( void ) {} // jmarshall - virtual int AllocateClientSlotForBot(int maxPlayersOnServer); + virtual int AllocateClientSlotForBot(const char *botName, int maxPlayersOnServer); virtual int ServerSetBotUserCommand(int clientNum, int frameNum, const usercmd_t& cmd); virtual int ServerSetBotUserName(int clientNum, const char* playerName); // jmarshall end diff --git a/src/game.vcxproj b/src/game.vcxproj index 628f8581..4722b3b5 100644 --- a/src/game.vcxproj +++ b/src/game.vcxproj @@ -228,7 +228,25 @@ Use + + + + + + + + + + + + + + + + + + @@ -396,7 +414,15 @@ + + + + + + + + diff --git a/src/game.vcxproj.filters b/src/game.vcxproj.filters index fef89207..6f7735a3 100644 --- a/src/game.vcxproj.filters +++ b/src/game.vcxproj.filters @@ -37,6 +37,9 @@ {b0331c0d-1cc1-41cd-ad58-29560053c0bc} + + {da114a45-de0d-4203-90a4-ec3a40add988} + @@ -525,6 +528,60 @@ Game\AI + + Game\Bots + + + Game\Bots + + + Game\Bots + + + Game\Bots + + + Game\Bots + + + Game\Bots + + + Game\Bots + + + Game\Bots + + + Game\Bots + + + Game\Bots + + + Game\Bots + + + Game\Bots + + + Game\Bots + + + Game\Bots + + + Game\Bots + + + Game\Bots + + + Game\AI + + + Game\AI + @@ -842,6 +899,30 @@ Game\AI + + Game\Bots + + + Game\Bots + + + Game\Bots + + + Game\Bots + + + Game\Bots + + + Game\Bots + + + Game\AI + + + Game\AI + diff --git a/src/game/Actor.cpp b/src/game/Actor.cpp index e5f114c1..5ed4f788 100644 --- a/src/game/Actor.cpp +++ b/src/game/Actor.cpp @@ -1184,6 +1184,24 @@ void idActor::SetupBody( void ) { legsAnim.Init( this, &animator, ANIMCHANNEL_LEGS ); } +/* +===================== +idActor::PointVisible +===================== +*/ +bool idActor::PointVisible(const idVec3& point) const +{ + trace_t results; + idVec3 start, end; + + start = GetEyePosition(); + end = point; + end[2] += 1.0f; + + gameLocal.clip[0]->TracePoint(results, start, end, MASK_OPAQUE, this); + return (results.fraction >= 1.0f); +} + /* ===================== idActor::CheckBlink diff --git a/src/game/Actor.h b/src/game/Actor.h index 3476c354..d178a447 100644 --- a/src/game/Actor.h +++ b/src/game/Actor.h @@ -145,6 +145,8 @@ class idActor : public idAFEntity_Gibbable { virtual void CheckBlink( void ); + bool PointVisible(const idVec3& point) const; + virtual bool GetPhysicsToVisualTransform( idVec3 &origin, idMat3 &axis ); virtual bool GetPhysicsToSoundTransform( idVec3 &origin, idMat3 &axis ); diff --git a/src/game/Entity.cpp b/src/game/Entity.cpp index 3828baa4..8da6e569 100644 --- a/src/game/Entity.cpp +++ b/src/game/Entity.cpp @@ -6793,3 +6793,60 @@ void idAnimatedEntity::Event_CollapseJoints ( const char* jointnames, const char } // RAVEN END + +/* +============== +idEntity::GetKey +============== +*/ +// jmarshall +const char* idEntity::GetKey(const char* key) +{ + const char* value; + + spawnArgs.GetString(key, "", &value); + + return value; +} + +/* +============== +idEntity::GetFloat +============== +*/ + +float idEntity::GetFloat(const char* key) +{ + return spawnArgs.GetFloat(key, "0"); +} + +/* +============== +idEntity::GetInt +============== +*/ +int idEntity::GetInt(const char* key) +{ + return spawnArgs.GetInt(key, "0"); +} + +/* +============== +idEntity::GetBool +============== +*/ +bool idEntity::GetBool(const char* key) +{ + return spawnArgs.GetBool(key, "0"); +} + +/* +================ +idEntity::GetOrigin +================ +*/ +idVec3 idEntity::GetOrigin(void) +{ + return GetLocalCoordinates(GetPhysics()->GetOrigin()); +} +// jmarshall end \ No newline at end of file diff --git a/src/game/Entity.h b/src/game/Entity.h index fd858325..d77869b9 100644 --- a/src/game/Entity.h +++ b/src/game/Entity.h @@ -215,6 +215,16 @@ class idEntity : public idClass { void BecomeInactive( int flags ); void UpdatePVSAreas( const idVec3 &pos ); +// jmarshall + idVec3 GetOrigin(void); + float GetFloat(const char* key); + const char* GetKey(const char* key); + int GetInt(const char* key); + bool GetBool(const char* key); + + virtual void InflictedDamageEvent(idEntity* target) { } +// jmarshall end + // RAVEN BEGIN // abahr: bool IsActive( int flags ) const { return (flags & thinkFlags) > 0; } diff --git a/src/game/Game.h b/src/game/Game.h index 1e8572af..19dc77a6 100644 --- a/src/game/Game.h +++ b/src/game/Game.h @@ -164,7 +164,7 @@ class idGame { virtual void CacheDictionaryMedia( const idDict *dict ) = 0; // Spawns the player entity to be used by the client. - virtual void SpawnPlayer( int clientNum ) = 0; + virtual void SpawnPlayer( int clientNum, bool isBot, const char* botName) = 0; // RAVEN BEGIN // Runs a game frame, may return a session command for level changing, etc @@ -202,7 +202,7 @@ class idGame { virtual void ServerClientConnect( int clientNum, const char *guid ) = 0; // Spawns the player entity to be used by the client. - virtual void ServerClientBegin( int clientNum, bool isBot ) = 0; + virtual void ServerClientBegin( int clientNum, bool isBot, const char *botName ) = 0; virtual void GetRandomBotName(int clientNum, idStr& name) = 0; diff --git a/src/game/Game_local.cpp b/src/game/Game_local.cpp index 7a9bb7e7..c7e437fb 100644 --- a/src/game/Game_local.cpp +++ b/src/game/Game_local.cpp @@ -551,6 +551,14 @@ void idGameLocal::Init( void ) { InitGameRenderSystem(); // jmarshall end +// jmarshall + // init all the bot systems. + botCharacterStatsManager.Init(); + botFuzzyWeightManager.Init(); + botWeaponInfoManager.Init(); + botGoalManager.BotSetupGoalAI(); +// jmarshall end + Printf( "...%d aas types\n", aasList.Num() ); Printf( "game initialized.\n" ); Printf( "---------------------------------------------\n" ); @@ -1978,6 +1986,14 @@ void idGameLocal::InitFromNewMap( const char *mapName, idRenderWorld *renderWorl animationLib->FlushUnusedAnims(); // RAVEN END +// jmarshall + if (gameLocal.IsMultiplayer() && gameLocal.isServer) + { + botGoalManager.InitLevelItems(); + } +// jmarshall end + + gamestate = GAMESTATE_ACTIVE; Printf( "---------------------------------------------\n" ); @@ -2910,7 +2926,9 @@ void idGameLocal::InitScriptForMap( void ) { idGameLocal::SpawnPlayer ============ */ -void idGameLocal::SpawnPlayer( int clientNum ) { +// jmarshall - bot support +void idGameLocal::SpawnPlayer(int clientNum, bool isBot, const char* botName) { +// jmarshall end TIME_THIS_SCOPE( __FUNCLINE__); @@ -2928,7 +2946,31 @@ void idGameLocal::SpawnPlayer( int clientNum ) { args.Set( "name", va( "player%d", clientNum + 1 ) ); // RAVEN BEGIN // bdube: changed marine class - args.Set( "classname", idPlayer::GetSpawnClassname() ); +// jmarshall: bot support + if (gameLocal.IsMultiplayer()) + { +// jmarshall + if (isBot) + { + args.Set("classname", va("%s_bot", idPlayer::GetSpawnClassname())); + args.Set("botname", botName); + } + else + { + args.Set("classname", idPlayer::GetSpawnClassname()); + } +// jmarshall end + } + else + { +// jmarshall - bot support + if (isBot) + { + gameLocal.Error("Bots not supported in singleplayer games!\n"); + } +// jmarshall end + args.Set("classname", idPlayer::GetSpawnClassname()); + } // RAVEN END // This takes a really long time. @@ -8400,6 +8442,100 @@ void idGameLocal::GetRandomBotName(int clientNum, idStr& name) { name = "Quake4Bot"; } +/* +=============== +idGameLocal::Trace +=============== +*/ +void idGameLocal::Trace(trace_t& results, const idVec3& start, const idVec3& end, int contentMask, int passEntity) +{ + idMat3 axis; + axis.Identity(); + + if (passEntity == -1) + { + clip[0]->Translation(results, start, end, NULL, axis, CONTENTS_SOLID, NULL); + } + else + { + clip[0]->Translation(results, start, end, NULL, axis, CONTENTS_SOLID, entities[passEntity]); + } +} + + +/* +================ +idGameLocal::TravelTimeToGoal +================ +*/ +int idGameLocal::TravelTimeToGoal( const idVec3& origin, const idVec3& goal ) +{ + idAAS* aas = bot_aas; + + if( aas == NULL ) + { + gameLocal.Error( "idGameLocal::TraveTimeToGoal: No AAS loaded...\n" ); + return NULL; + } + //int originArea = aas->PointAreaNum(origin); + //idVec3 _goal = goal; + //int goalArea = aas->AdjustPositionAndGetArea(_goal); + //return aas->TravelTimeToGoalArea(originArea, origin, goalArea, TFL_WALK); + + idVec3 org = origin; + int curAreaNum = aas->AdjustPositionAndGetArea( org ); + int goalArea = aas->PointAreaNum( goal ); + int travelTime; + idReachability* reach; + if( !aas->RouteToGoalArea( curAreaNum, org, goalArea, TFL_WALK | TFL_AIR, travelTime, &reach ) ) + { + return NULL; + } + + //int goalArea = aas->PointAreaNum(goal); + //aas->ShowWalkPath(origin, goalArea, goal); + + return travelTime; +} + +/* +=============== +idGameLocal::GetBotItemEntry +=============== +*/ +int idGameLocal::GetBotItemEntry( const char* name ) +{ + const idKeyValue* keyvalue = botItemTable->dict.FindKey( name ); + if( !keyvalue ) + { + gameLocal.Warning( "GetBotItemModelIndex: Doesn't have key %s\n", name ); + return 9; + } + + return botItemTable->dict.GetInt( name ); +} + +/* +====================== +idGameLocal::AddBot +====================== +*/ +void idGameLocal::AddBot(const char *botName) { + int clientNum; + + if (aasList.Num() == 0) { + common->Warning("idGameLocal::AddBot: No AAS file loaded for map\n"); + return; + } + + clientNum = networkSystem->AllocateClientSlotForBot(botName, 8); + if (clientNum == -1) { + return; + } + + // idPlayer* newPlayer = gameLocal.GetClient(clientNum); +} + // RAVEN BEGIN // mwhitlock: Dynamic memory consolidation #if defined(_RV_MEM_SYS_SUPPORT) diff --git a/src/game/Game_local.h b/src/game/Game_local.h index 7bba178a..78a3ee3d 100644 --- a/src/game/Game_local.h +++ b/src/game/Game_local.h @@ -46,6 +46,9 @@ class idWorldspawn; class idTestModel; class idAAS; class idAI; +// jmarshall +class rvmBot; +// jmarshall end // RAVEN BEGIN // bdube: not using id effects //class idSmokeParticles; @@ -486,7 +489,7 @@ class idGameLocal : public idGame { // RAVEN END virtual void MapShutdown( void ); virtual void CacheDictionaryMedia( const idDict *dict ); - virtual void SpawnPlayer( int clientNum ); + virtual void SpawnPlayer( int clientNum, bool isBot, const char* botName); // RAVEN BEGIN virtual gameReturn_t RunFrame( const usercmd_t *clientCmds, int activeEditors, bool lastCatchupFrame, int serverGameFrame ); virtual void MenuFrame( void ); @@ -499,16 +502,47 @@ class idGameLocal : public idGame { virtual void HandleMainMenuCommands( const char *menuCommand, idUserInterface *gui ); virtual allowReply_t ServerAllowClient( int clientId, int numClients, const char *IP, const char *guid, const char *password, const char *privatePassword, char reason[MAX_STRING_CHARS] ); virtual void ServerClientConnect( int clientNum, const char *guid ); - virtual void ServerClientBegin( int clientNum, bool isBot); + virtual void ServerClientBegin( int clientNum, bool isBot, const char* botName); virtual void ServerClientDisconnect( int clientNum ); virtual void ServerWriteInitialReliableMessages( int clientNum ); virtual allowReply_t RepeaterAllowClient( int clientId, int numClients, const char *IP, const char *guid, bool repeater, const char *password, const char *privatePassword, char reason[MAX_STRING_CHARS] ) { idStr::Copynz( reason, "#str_107239" /* zinx - FIXME - not banned... */, sizeof(reason) ); return ALLOW_NO; }; virtual void RepeaterClientConnect( int clientNum ) {assert(false);}; virtual void RepeaterClientBegin( int clientNum ) {assert(false);}; virtual void RepeaterClientDisconnect( int clientNum ) {assert(false);}; - virtual void RepeaterWriteInitialReliableMessages( int clientNum ) {assert(false);}; + virtual void RepeaterWriteInitialReliableMessages( int clientNum ) {assert(false);}; +// jmarshall virtual void GetRandomBotName(int clientNum, idStr& name); + virtual int TravelTimeToGoal(const idVec3& origin, const idVec3& goal); + virtual int GetBotItemEntry(const char* name); + + void AddBot(const char* botName); + + idAAS* GetBotAAS(void) + { + return bot_aas; + } + + void RegisterBot(rvmBot* bot) + { + registeredBots.AddUnique(bot); + } + void UnRegisterBot(rvmBot* bot) + { + registeredBots.Remove(bot); + } + + float SysScriptTime(void) const + { + return MS2SEC(realClientTime); + } + float SysScriptFrameTime(void) const + { + return MS2SEC(time - previousTime); + } + + void Trace(trace_t& results, const idVec3& start, const idVec3& end, int contentMask, int passEntity); +// jmarshall end // RAVEN BEGIN // jnewquist: Use dword array to match pvs array so we don't have endianness problems. @@ -925,13 +959,12 @@ class idGameLocal : public idGame { void ServerSetMinSpawnIndex( void ); void ServerSetEntityIndexWatermark( int instanceID ); -private: // RAVEN BEGIN // ddynerman: multiple instance for MP idList clip; // collision detection idList instances; // RAVEN END - +private: // keep watermarks on the high entity index // server transmits this to clients so they use the right entity layout idList instancesEntityIndexWatermarks; @@ -1131,6 +1164,14 @@ class idGameLocal : public idGame { bool banListLoaded; bool banListChanged; // RAVEN END + +// jmarshall + const idDeclEntityDef* botItemTable;; + + idList registeredBots; + + idAAS* bot_aas; +// jmarshall end }; //============================================================================ @@ -1435,4 +1476,6 @@ ID_INLINE idEntityPtr::operator type * ( void ) const { #include "../idlib/containers/ListGame.h" +#include "bots/bot.h" + #endif /* !__GAME_LOCAL_H__ */ diff --git a/src/game/Game_network.cpp b/src/game/Game_network.cpp index 5c4d6a7d..bd9387e4 100644 --- a/src/game/Game_network.cpp +++ b/src/game/Game_network.cpp @@ -190,12 +190,12 @@ void idGameLocal::ServerClientConnect( int clientNum, const char *guid ) { idGameLocal::ServerClientBegin ================ */ -void idGameLocal::ServerClientBegin( int clientNum, bool isBot ) { +void idGameLocal::ServerClientBegin( int clientNum, bool isBot, const char* botName) { idBitMsg outMsg; byte msgBuf[MAX_GAME_MESSAGE_SIZE]; // spawn the player - SpawnPlayer( clientNum ); + SpawnPlayer( clientNum, isBot, botName); if ( clientNum == localClientNum ) { mpGame.EnterGame( clientNum ); } @@ -1781,7 +1781,7 @@ void idGameLocal::ClientProcessReliableMessage( int clientNum, const idBitMsg &m int client = msg.ReadByte(); int spawnId = msg.ReadLong(); if ( !entities[ client ] ) { - SpawnPlayer( client ); + SpawnPlayer( client, false, NULL); entities[ client ]->FreeModelDef(); } // fix up the spawnId to match what the server says @@ -3325,7 +3325,7 @@ void idGameLocal::ReadNetworkInfo( int gameTime, idFile* file, int clientNum ) { int icl, spawnId; file->ReadInt( icl ); file->ReadInt( spawnId ); - SpawnPlayer( icl ); + SpawnPlayer( icl, false, NULL); spawnIds[ icl ] = spawnId; numClients = icl + 1; } diff --git a/src/game/Item.cpp b/src/game/Item.cpp index 6edd06da..e8712175 100644 --- a/src/game/Item.cpp +++ b/src/game/Item.cpp @@ -425,6 +425,10 @@ void idItem::Spawn( void ) { RV_PUSH_HEAP_MEM(this); // RAVEN END +// jmarshall + modelindex = gameLocal.GetBotItemEntry(spawnArgs.GetString("modelindex")); +// jmarshall end + physicsObj.SetClipModel( new idClipModel( GetPhysics()->GetClipModel() ), 1.0f ); // RAVEN BEGIN diff --git a/src/game/Item.h b/src/game/Item.h index e4622633..cd0e66fd 100644 --- a/src/game/Item.h +++ b/src/game/Item.h @@ -44,6 +44,13 @@ class idItem : public idEntity { virtual bool Collide( const trace_t &collision, const idVec3 &velocity ); // RAVEN END +// jmarshall + int GetModelIndex() const + { + return modelindex; + } +// jmarshall end + enum { EVENT_PICKUP = idEntity::EVENT_MAXEVENTS, EVENT_RESPAWNFX, @@ -122,6 +129,10 @@ class idItem : public idEntity { // abahr void Event_SetGravity(); // RAVEN END + +// jmarshall + int modelindex; +// jmarshall end }; /* diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 63f257e1..abb0d89b 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -10197,6 +10197,14 @@ void idPlayer::Damage( idEntity *inflictor, idEntity *attacker, const idVec3 &di // inform the attacker that they hit someone attacker->DamageFeedback( this, inflictor, damage ); +// jmarshall + if (gameLocal.IsMultiplayer() && gameLocal.isServer) { + if (attacker->IsType(rvmBot::GetClassType())) + { + attacker->InflictedDamageEvent(this); + } + } +// jmarshall end //RAVEN BEGIN //asalmon: Xenon needs stats in singleplayer @@ -14084,3 +14092,49 @@ int idPlayer::CanSelectWeapon(const char* weaponName) } // RITUAL END + +// jmarshall +const char* idPlayer::GetNetName(void) { + if (!gameLocal.IsMultiplayer()) { + gameLocal.Error("Can't get net name in singleplayer!"); + return NULL; + } + + return gameLocal.userInfo[entityNumber].GetString("ui_name"); +} + +/* +=============== +idPlayer::IsShooting +============== +*/ +bool idPlayer::IsShooting(void) +{ + return pfl.attackHeld; +} + +/* +=============== +idPlayer::GetViewHeight +============== +*/ +float idPlayer::GetViewHeight(void) { + float newEyeOffset = 0.0f; + if (spectating) { + newEyeOffset = 0.0f; + } + else if (health <= 0) { + newEyeOffset = pm_deadviewheight.GetFloat(); + } + else if (physicsObj.IsCrouching()) { + newEyeOffset = pm_crouchviewheight.GetFloat(); + } + else if (IsInVehicle()) { + newEyeOffset = 0.0f; + } + else { + newEyeOffset = pm_normalviewheight.GetFloat(); + } + return newEyeOffset; +} +// jmarshall end \ No newline at end of file diff --git a/src/game/Player.h b/src/game/Player.h index c499507b..6e2da8d6 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -450,7 +450,7 @@ class idPlayer : public idActor { void SetupWeaponEntity( void ); bool SelectSpawnPoint( idVec3 &origin, idAngles &angles ); void SpawnFromSpawnSpot( void ); - void SpawnToPoint( const idVec3 &spawn_origin, const idAngles &spawn_angles ); + virtual void SpawnToPoint( const idVec3 &spawn_origin, const idAngles &spawn_angles ); void SetClipModel( bool forceSpectatorBBox = false ); // spectator mode uses a different bbox size void SavePersistantInfo( void ); @@ -464,7 +464,10 @@ class idPlayer : public idActor { bool BalanceTeam( void ); // RAVEN END void CacheWeapons( void ); - +// jmarshall + bool IsShooting(void); + float GetViewHeight(void); +// jmarshall end bool HandleESC( void ); void EnterCinematic( void ); void ExitCinematic( void ); @@ -545,6 +548,11 @@ class idPlayer : public idActor { void StartBossBattle ( idEntity* ent ); +// jmarshall + const char* GetNetName(void); + virtual bool IsBot(void) { return false; } +// jmarshall end + // Powerups bool GivePowerUp ( int powerup, int time, bool team = false ); void ClearPowerUps ( void ); diff --git a/src/game/ai/AAS.cpp b/src/game/ai/AAS.cpp index 564a5cc3..adc239d8 100644 --- a/src/game/ai/AAS.cpp +++ b/src/game/ai/AAS.cpp @@ -461,3 +461,18 @@ bool idAASCallback::TestPoint ( class idAAS *aas, const idVec3& pos, const float } // RAVEN END + + +// jmarshall +/* +============ +idAASLocal::AdjustPositionAndGetArea +============ +*/ +int idAASLocal::AdjustPositionAndGetArea(idVec3& origin) +{ + int area = PointReachableAreaNum(origin, DefaultSearchBounds(), AREA_REACHABLE_WALK); + PushPointIntoAreaNum(area, origin); + return area; +} +// jmarshall end \ No newline at end of file diff --git a/src/game/ai/AAS.h b/src/game/ai/AAS.h index cc8dbe69..164c6db5 100644 --- a/src/game/ai/AAS.h +++ b/src/game/ai/AAS.h @@ -158,6 +158,14 @@ class idAAS { virtual void ShowAreas( const idVec3 &origin, bool ShowProblemAreas = false ) const = 0; virtual bool IsValid( void ) const = 0; // RAVEN END + +// jmarshall + virtual int AdjustPositionAndGetArea(idVec3& origin) = 0; + virtual void ShowArea(const idVec3& origin) const = 0; + + virtual idAASFile* GetAASFile(void) = 0; + virtual const idBounds& DefaultSearchBounds(void) const = 0; +// jmarshall end }; #endif /* !__AAS_H__ */ diff --git a/src/game/ai/AASCallback_AvoidLocation.cpp b/src/game/ai/AASCallback_AvoidLocation.cpp new file mode 100644 index 00000000..84c99411 --- /dev/null +++ b/src/game/ai/AASCallback_AvoidLocation.cpp @@ -0,0 +1,126 @@ +// Copyright (C) 2007 Id Software, Inc. +// + +#pragma hdrstop +#include "precompiled.h" + +#include "AAS_local.h" +#include "../Game_local.h" // for print and error +#include "AASCallback_AvoidLocation.h" + +/* +============ +idAASCallback_AvoidLocation::idAASCallback_AvoidLocation +============ +*/ +idAASCallback_AvoidLocation::idAASCallback_AvoidLocation() +{ + avoidLocation.Zero(); + avoidDist = 0.0f; + obstacles = NULL; + numObstacles = 0; +} + +/* +============ +idAASCallback_AvoidLocation::~idAASCallback_AvoidLocation +============ +*/ +idAASCallback_AvoidLocation::~idAASCallback_AvoidLocation() +{ +} + +/* +============ +idAASCallback_AvoidLocation::SetAvoidLocation +============ +*/ +void idAASCallback_AvoidLocation::SetAvoidLocation( const idVec3& start, const idVec3& avoidLocation ) +{ + this->avoidLocation = avoidLocation; + this->avoidDist = ( avoidLocation - start ).Length(); +} + +/* +============ +idAASCallback_AvoidLocation::SetObstacles +============ +*/ +void idAASCallback_AvoidLocation::SetObstacles( const idAAS* aas, const idAASObstacle* obstacles, int numObstacles ) +{ + this->obstacles = obstacles; + this->numObstacles = numObstacles; + + for( int i = 0; i < numObstacles; i++ ) + { + obstacles[i].expAbsBounds[0] = obstacles[i].absBounds[0] - aas->GetSettings()->boundingBoxes[0][1]; + obstacles[i].expAbsBounds[1] = obstacles[i].absBounds[1] - aas->GetSettings()->boundingBoxes[0][0]; + } +} + +/* +============ +idAASCallback_AvoidLocation::PathValid +============ +*/ +bool idAASCallback_AvoidLocation::PathValid( const idAAS* aas, const idVec3& start, const idVec3& end ) +{ + // path may not go through any obstacles + for( int i = 0; i < numObstacles; i++ ) + { + // if the movement vector intersects the expanded obstacle bounds + if( obstacles[i].expAbsBounds.LineIntersection( start, end ) ) + { + return false; + } + } + return true; +} + +/* +============ +idAASCallback_AvoidLocation::AdditionalTravelTimeForPath +============ +*/ +int idAASCallback_AvoidLocation::AdditionalTravelTimeForPath( const idAAS* aas, const idVec3& start, const idVec3& end ) +{ + if( avoidDist <= 0.0f ) + { + return 0; + } + + // project avoidLocation origin onto movement vector + idVec3 v1 = end - start; + v1.Normalize(); + idVec3 v2 = avoidLocation - start; + idVec3 p = start + ( v2 * v1 ) * v1; + + // get the point on the path closest to the avoidLocation + int i; + for( i = 0; i < 3; i++ ) + { + if( ( p[i] > start[i] + 0.1f && p[i] > end[i] + 0.1f ) || + ( p[i] < start[i] - 0.1f && p[i] < end[i] - 0.1f ) ) + { + break; + } + } + + float dist; + if( i >= 3 ) + { + dist = ( avoidLocation - p ).Length(); + } + else + { + dist = ( avoidLocation - end ).Length(); + } + + // avoid moving closer to the avoidLocation + if( dist < avoidDist ) + { + return idMath::Ftoi( ( avoidDist - dist ) * 10.0f ); + } + + return 0; +} diff --git a/src/game/ai/AASCallback_AvoidLocation.h b/src/game/ai/AASCallback_AvoidLocation.h new file mode 100644 index 00000000..4431ee83 --- /dev/null +++ b/src/game/ai/AASCallback_AvoidLocation.h @@ -0,0 +1,41 @@ +// Copyright (C) 2007 Id Software, Inc. +// + +#ifndef __AASCALLBACK_AVOIDLOCATION_H__ +#define __AASCALLBACK_AVOIDLOCATION_H__ + +/* +=============================================================================== + + idAASCallback_AvoidLocation + +=============================================================================== +*/ + +struct idAASObstacle +{ + idBounds absBounds; // absolute bounds of obstacle + mutable idBounds expAbsBounds; // expanded absolute bounds of obstacle +}; + +class idAASCallback_AvoidLocation : public idAASCallback +{ +public: + idAASCallback_AvoidLocation(); + ~idAASCallback_AvoidLocation(); + + void SetAvoidLocation( const idVec3& start, const idVec3& avoidLocation ); + void SetObstacles( const idAAS* aas, const idAASObstacle* obstacles, int numObstacles ); + + virtual bool PathValid( const idAAS* aas, const idVec3& start, const idVec3& end ); + virtual int AdditionalTravelTimeForPath( const idAAS* aas, const idVec3& start, const idVec3& end ); + virtual bool AreaIsGoal( const idAAS* aas, int areaNum ) = 0; + +private: + idVec3 avoidLocation; + float avoidDist; + const idAASObstacle* obstacles; + int numObstacles; +}; + +#endif /* !__AASCALLBACK_AVOIDLOCATION_H__ */ diff --git a/src/game/ai/AASCallback_FindCoverArea.cpp b/src/game/ai/AASCallback_FindCoverArea.cpp new file mode 100644 index 00000000..b6392901 --- /dev/null +++ b/src/game/ai/AASCallback_FindCoverArea.cpp @@ -0,0 +1,58 @@ +// Copyright (C) 2007 Id Software, Inc. +// + +#pragma hdrstop +#include "precompiled.h" + +#include "AAS_local.h" +#include "../Game_local.h" // for print and error + +#include "AASCallback_FindCoverArea.h" + +/* +============ +idAASCallback_FindCoverArea::idAASCallback_FindCoverArea +============ +*/ +idAASCallback_FindCoverArea::idAASCallback_FindCoverArea( const idVec3& hideFromPos ) +{ + int numPVSAreas; + idBounds bounds( hideFromPos - idVec3( 16, 16, 0 ), hideFromPos + idVec3( 16, 16, 64 ) ); + + // setup PVS + numPVSAreas = gameLocal.pvs.GetPVSAreas( bounds, PVSAreas, MAX_PVS_AREAS ); + hidePVS = gameLocal.pvs.SetupCurrentPVS( PVSAreas, numPVSAreas ); +} + +/* +============ +idAASCallback_FindCoverArea::~idAASCallback_FindCoverArea +============ +*/ +idAASCallback_FindCoverArea::~idAASCallback_FindCoverArea() +{ + gameLocal.pvs.FreeCurrentPVS( hidePVS ); +} + +/* +============ +idAASCallback_FindCoverArea::AreaIsGoal +============ +*/ +bool idAASCallback_FindCoverArea::AreaIsGoal( const idAAS* aas, int areaNum ) +{ + idVec3 areaCenter; + int numPVSAreas; + int PVSAreas[ MAX_PVS_AREAS ]; + + areaCenter = aas->AreaCenter( areaNum ); + areaCenter[ 2 ] += 1.0f; + + numPVSAreas = gameLocal.pvs.GetPVSAreas( idBounds( areaCenter ).Expand( 16.0f ), PVSAreas, MAX_PVS_AREAS ); + if( !gameLocal.pvs.InCurrentPVS( hidePVS, PVSAreas, numPVSAreas ) ) + { + return true; + } + + return false; +} diff --git a/src/game/ai/AASCallback_FindCoverArea.h b/src/game/ai/AASCallback_FindCoverArea.h new file mode 100644 index 00000000..d48cf692 --- /dev/null +++ b/src/game/ai/AASCallback_FindCoverArea.h @@ -0,0 +1,32 @@ +// Copyright (C) 2007 Id Software, Inc. +// + +#ifndef __AASCALLBACK_FINDCOVERAREA_H__ +#define __AASCALLBACK_FINDCOVERAREA_H__ + +#include "AASCallback_AvoidLocation.h" + +/* +=============================================================================== + + idAASCallback_FindCoverArea + +=============================================================================== +*/ + +class idAASCallback_FindCoverArea : public idAASCallback_AvoidLocation +{ +public: + idAASCallback_FindCoverArea( const idVec3& hideFromPos ); + ~idAASCallback_FindCoverArea(); + + virtual bool AreaIsGoal( const idAAS* aas, int areaNum ); + +private: + static const int MAX_PVS_AREAS = 4; + + pvsHandle_t hidePVS; + int PVSAreas[ MAX_PVS_AREAS ]; +}; + +#endif /* !__AASCALLBACK_FINDCOVERAREA_H__ */ diff --git a/src/game/ai/AAS_local.h b/src/game/ai/AAS_local.h index 35a7f73b..ac50c5c2 100644 --- a/src/game/ai/AAS_local.h +++ b/src/game/ai/AAS_local.h @@ -110,6 +110,11 @@ class idAASLocal : public idAAS { virtual void ShowAreas( const idVec3 &origin, bool ShowProblemAreas = false ) const; // RAVEN END +// jmarshall + virtual int AdjustPositionAndGetArea(idVec3& origin); + virtual idAASFile* GetAASFile(void) { return file; } + virtual const idBounds& DefaultSearchBounds(void) const; +// jmarshall end private: idAASFile * file; @@ -164,14 +169,17 @@ class idAASLocal : public idAAS { idVec3 SubSampleFlyPath( int areaNum, const idVec3 &origin, const idVec3 &start, const idVec3 &end, int travelFlags, int &endAreaNum ) const; private: // debug - const idBounds & DefaultSearchBounds( void ) const; void DrawCone( const idVec3 &origin, const idVec3 &dir, float radius, const idVec4 &color ) const; void DrawAreaBounds( int areaNum ) const; void DrawArea( int areaNum ) const; void DrawFace( int faceNum, bool side ) const; void DrawEdge( int edgeNum, bool arrow ) const; void DrawReachability( const idReachability *reach ) const; - void ShowArea( const idVec3 &origin ) const; +// jmarshall - exposed function. +public: + virtual void ShowArea( const idVec3 &origin ) const; +private: +// jmarshall end void ShowWallEdges( const idVec3 &origin ) const; void ShowHideArea( const idVec3 &origin, int targerAreaNum ) const; bool PullPlayer( const idVec3 &origin, int toAreaNum ) const; diff --git a/src/game/bots/Bot.cpp b/src/game/bots/Bot.cpp new file mode 100644 index 00000000..6597b125 --- /dev/null +++ b/src/game/bots/Bot.cpp @@ -0,0 +1,416 @@ +// Bot.cpp +// + +#include "precompiled.h" +#include "../Game_local.h" +#include "../weapon.h" + +idCVar bot_pathdebug( "bot_pathdebug", "0", CVAR_BOOL | CVAR_CHEAT, "force the bot to path to player" ); +idCVar bot_goaldist( "bot_goaldist", "20", CVAR_INTEGER | CVAR_CHEAT, "" ); +idCVar bot_debugnav( "bot_debugnav", "0", CVAR_BOOL | CVAR_CHEAT, "draws navmesh paths for the bot" ); +idCVar bot_showstate( "bot_showstate", "0", CVAR_BOOL | CVAR_CHEAT, "draws the bot state above the bot" ); +idCVar bot_debug( "bot_debug", "0", CVAR_BOOL, "shows debug info for the bot" ); +idCVar bot_skill("bot_skill", "3", CVAR_INTEGER, ""); + +CLASS_DECLARATION( idPlayer, rvmBot ) +END_CLASS + +/* +=================== +rvmBot::rvmBot +=================== +*/ +rvmBot::rvmBot() +{ + //bs.action = NULL; + hasSpawned = false; + gameLocal.RegisterBot( this ); +} + +/* +=================== +rvmBot::~rvmBot +=================== +*/ +rvmBot::~rvmBot() +{ + gameLocal.UnRegisterBot( this ); +} + +/* +================== +rvmBot::SetEnemy +================== +*/ +void rvmBot::SetEnemy( idPlayer* player, idVec3 origin) +{ + if(bs.enemy == -1) + { + bs.enemy = player->entityNumber; + bs.aggressiveAttackTime = gameLocal.SysScriptTime() + 2.0f; + bs.lastenemyorigin = origin; + //bs.action = &botAIBattleRetreat; + stateThread.SetState("state_Attacked"); + } +} + +/* +================== +rvmBot::BotUpdateInventory +================== +*/ +void rvmBot::BotUpdateInventory( void ) +{ + bs.inventory[INVENTORY_ARMOR] = inventory.armor; + bs.inventory[INVENTORY_GAUNTLET] = 1; + bs.inventory[INVENTORY_SHOTGUN] = HasWeapon( weapon_shotgun ); + bs.inventory[INVENTORY_MACHINEGUN] = HasWeapon( weapon_machinegun ); + bs.inventory[INVENTORY_GRENADELAUNCHER] = 0; + bs.inventory[INVENTORY_ROCKETLAUNCHER] = HasWeapon( weapon_rocketlauncher ); + bs.inventory[INVENTORY_LIGHTNING] = 0; + bs.inventory[INVENTORY_RAILGUN] = 0; + bs.inventory[INVENTORY_PLASMAGUN] = HasWeapon( weapon_plasmagun ); + bs.inventory[INVENTORY_BFG10K] = 0; + bs.inventory[INVENTORY_GRAPPLINGHOOK] = 0; + bs.inventory[INVENTORY_SHELLS] = inventory.ammo[rvWeapon::GetAmmoIndexForName( "ammo_shells" )]; + bs.inventory[INVENTORY_BULLETS] = inventory.ammo[rvWeapon::GetAmmoIndexForName( "ammo_clip" )]; + bs.inventory[INVENTORY_GRENADES] = 0; + bs.inventory[INVENTORY_CELLS] = inventory.ammo[rvWeapon::GetAmmoIndexForName( "ammo_cells" )]; + bs.inventory[INVENTORY_LIGHTNINGAMMO] = 0; + bs.inventory[INVENTORY_ROCKETS] = inventory.ammo[rvWeapon::GetAmmoIndexForName( "ammo_rockets" )]; + bs.inventory[INVENTORY_SLUGS] = 0; + bs.inventory[INVENTORY_BFGAMMO] = 0; + bs.inventory[INVENTORY_HEALTH] = health; + bs.inventory[INVENTORY_TELEPORTER] = 0; + bs.inventory[INVENTORY_MEDKIT] = 0; + bs.inventory[INVENTORY_QUAD] = 0; + bs.inventory[INVENTORY_ENVIRONMENTSUIT] = 0; + bs.inventory[INVENTORY_HASTE] = 0; + bs.inventory[INVENTORY_INVISIBILITY] = 0; + bs.inventory[INVENTORY_REGEN] = 0; + bs.inventory[INVENTORY_FLIGHT] = 0; + bs.inventory[INVENTORY_REDFLAG] = 0; + bs.inventory[INVENTORY_BLUEFLAG] = 0; +} + + +/* +=================== +rvmBot::Spawn +=================== +*/ +void rvmBot::Spawn( void ) +{ + idStr botName; + char filename[256]; + int errnum; + + stateThread.SetOwner(this); + + idPlayer::Spawn(); + + if( gameLocal.isServer ) + { + weapon_machinegun = SlotForWeapon( "weapon_machinegun" ); + weapon_shotgun = SlotForWeapon( "weapon_shotgun" ); + weapon_plasmagun = SlotForWeapon( "weapon_plasmagun" ); + weapon_rocketlauncher = SlotForWeapon( "weapon_rocketlauncher" ); + + WP_MACHINEGUN = weapon_machinegun; + WP_SHOTGUN = weapon_shotgun; + WP_PLASMAGUN = weapon_plasmagun; + WP_ROCKET_LAUNCHER = weapon_rocketlauncher; + + botName = spawnArgs.GetString( "botname" ); + + aas = gameLocal.GetBotAAS(); + if( aas == NULL ) + { + gameLocal.Error( "Missing AAS\n" ); + return; + } + + // Load in the bot character. + bs.character = botCharacterStatsManager.BotLoadCharacterFromFile( va( "bots/%s_c.c", botName.c_str() ), 1 ); + if( !bs.character ) + { + gameLocal.Error( "Failed to load character file for bot %s\n", botName.c_str() ); + } + + // Allocate the goal state. + bs.gs = botGoalManager.BotAllocGoalState( entityNumber ); + + // Get the bot items weights file name. + botCharacterStatsManager.Characteristic_String( bs.character, CHARACTERISTIC_ITEMWEIGHTS, filename, 256 ); + errnum = botGoalManager.BotLoadItemWeights( bs.gs, filename ); + if( errnum != BLERR_NOERROR ) + { + gameLocal.Error( "Failed to load bot item weights!" ); + botGoalManager.BotFreeGoalState( bs.gs ); + return; + } + + //allocate a weapon state + bs.ws = botWeaponInfoManager.BotAllocWeaponState(); + + //load the weapon weights + botCharacterStatsManager.Characteristic_String( bs.character, CHARACTERISTIC_WEAPONWEIGHTS, filename, 256 ); + errnum = botWeaponInfoManager.BotLoadWeaponWeights( bs.ws, filename ); + if( errnum != BLERR_NOERROR ) + { + // trap_BotFreeGoalState(bs->gs); + botWeaponInfoManager.BotFreeWeaponState( bs.ws ); + return; + } + + bs.client = entityNumber; + bs.entitynum = entityNumber; + bs.setupcount = 4; + bs.entergame_time = Bot_Time(); + + hasSpawned = true; + + bs.botinput.respawn = true; + + stateThread.SetState("state_Respawn"); + } +} + +/* +=================== +rvmBot::Think +=================== +*/ +void rvmBot::BotMoveToGoalOrigin(idVec3 goalOrigin) +{ + bs.botinput.dir = (goalOrigin - firstPersonViewOrigin); + idAngles desiredAngles = bs.botinput.dir.ToAngles(); + if( bs.enemy >= 0 ) + { + idPlayer* enemy = gameLocal.entities[bs.enemy]->Cast(); + if( enemy ) + { + desiredAngles = (enemy->firstPersonViewOrigin - firstPersonViewOrigin).ToAngles(); + } + } + + bs.botinput.viewangles = desiredAngles; + + bs.botinput.speed = pm_speed.GetInteger(); + + bs.botinput.dir.Normalize(); +} + +/* +=================== +rvmBot::SpawnToPoint +=================== +*/ +void rvmBot::SpawnToPoint( const idVec3& spawn_origin, const idAngles& spawn_angles ) +{ + idPlayer::SpawnToPoint( spawn_origin, spawn_angles ); + + if( gameLocal.isServer ) + { + bs.ltg_time = 0; + stateThread.SetState("state_SeekLTG"); + } +} +/* +=================== +rvmBot::StateThreadChanged +=================== +*/ +void rvmBot::StateThreadChanged(void) { + // Ensure if we are switching states, pop the last goal. + bs.ltg_time = 0; +} + +/* +=================== +rvmBot::ServerThink +=================== +*/ +void rvmBot::ServerThink( void ) +{ + bs.origin = GetPhysics()->GetOrigin(); + bs.eye = GetEyePosition(); + bs.thinktime = Bot_Time(); + bs.botinput.actionflags = 0; + + BotInputFrame(); + + BotUpdateInventory(); + + if( bot_pathdebug.IsModified() ) + { + if( bot_pathdebug.GetBool() ) + { + bs.currentGoal.origin = gameLocal.GetLocalPlayer()->GetPhysics()->GetOrigin(); + bs.currentGoal.framenum = gameLocal.framenum; + } + + bot_pathdebug.ClearModified(); + bot_pathdebug.SetBool( false ); + } + + stateThread.Execute(); + + // If we are moving along a set of waypoints, let's move along. + aasPath_t path; + //int myArea = aas->PointAreaNum(GetOrigin()); + int goalArea = aas->PointAreaNum( bs.currentGoal.origin ); + idVec3 org = bs.origin; + int curAreaNum = aas->AdjustPositionAndGetArea( org ); + + if( bot_debug.GetBool() ) + { + if (bs.useRandomPosition) + { + aas->ShowWalkPath(GetOrigin(), goalArea, bs.random_move_position); + } + else + { + aas->ShowWalkPath(GetOrigin(), goalArea, bs.currentGoal.origin); + } + + aas->ShowArea( GetOrigin() ); + } + + if (bs.useRandomPosition) + { + aas->WalkPathToGoal(path, curAreaNum, org, goalArea, bs.random_move_position, TFL_WALK | TFL_AIR); + } + else + { + aas->WalkPathToGoal(path, curAreaNum, org, goalArea, bs.currentGoal.origin, TFL_WALK | TFL_AIR); + } + + idVec3 moveGoal = path.moveGoal; + BotMoveToGoalOrigin(path.moveGoal); + + bs.viewangles = bs.botinput.viewangles; + + bs.useRandomPosition = false; + bs.attackerEntity = NULL; // Has to be consumed immedaitly. + bs.botinput.weapon = bs.weaponnum; +} + +/* +======================= +rvmBot::Damage +======================= +*/ +void rvmBot::Damage( idEntity* inflictor, idEntity* attacker, const idVec3& dir, const char* damageDefName, const float damageScale, const int location ) +{ + idPlayer::Damage( inflictor, attacker, dir, damageDefName, damageScale, location ); + + idPlayer* player = attacker->Cast(); + if (health <= 0) + { + if (player) + { + BotSendChatMessage(DEATH, player->GetNetName()); + } + } + + if (attacker == NULL) { + return; + } + + //bs.attackerEntity = attacker; + SetEnemy(player, attacker->GetOrigin()); +} + +/* +======================= +rvmBot::InflictedDamageEvent +======================= +*/ +void rvmBot::InflictedDamageEvent(idEntity* target) { + idPlayer* player = target->Cast(); + + // Don't flood the chat with death and insults. + if (!player->IsBot() && player->health <= 0) + { + BotSendChatMessage(KILL, player->GetNetName()); + } +} + +/* +======================= +rvmBot::PresenceTypeBoundingBox +======================= +*/ +void rvmBot::PresenceTypeBoundingBox( int presencetype, idVec3& mins, idVec3& maxs ) +{ + int index; + //bounding box size for each presence type + //idVec3 boxmins[3] = { {0, 0, 0}, {-15, -15, -24}, {-15, -15, -24} }; + //idVec3 boxmaxs[3] = { {0, 0, 0}, { 15, 15, 32}, { 15, 15, 8} }; + + idVec3 boxmins[3]; + idVec3 boxmaxs[3]; + + boxmins[0] = idVec3( 0, 0, 0 ); + boxmins[1] = idVec3( -15, -15, -24 ); + boxmins[2] = idVec3( -15, -15, -24 ); + + boxmaxs[0] = idVec3( 0, 0, 0 ); + boxmaxs[1] = idVec3( 15, 15, 32 ); + boxmaxs[2] = idVec3( 15, 15, 8 ); + + + if( presencetype == PRESENCE_NORMAL ) + { + index = 1; + } + else if( presencetype == PRESENCE_CROUCH ) + { + index = 2; + } + else + { + //botimport.Print(PRT_FATAL, "AAS_PresenceTypeBoundingBox: unknown presence type\n"); + index = 2; + } + mins = boxmins[index]; + maxs = boxmaxs[index]; +} + + +/* +=================== +rvmBot::Think +=================== +*/ +void rvmBot::Think( void ) +{ + if( !hasSpawned ) + { + return; + } + + if( gameLocal.isServer ) + { + ServerThink(); + + //if( bot_debug.GetBool() ) + //{ + // idVec4 color; + // color = idVec4(1, 1, 1, 1); + // if (bs.enemy >= 0) + // color = idVec4(1, 0, 0, 1); + // + // idBounds bounds = idBounds( idVec3( -10, -10, -10 ), idVec3( 10, 10, 10 ) ); + // gameRenderWorld->DebugBounds( color, bounds, GetOrigin() ); + // + // idMat3 axis = viewAngles.ToMat3(); + // gameRenderWorld->DrawTextA(stateThread.GetState()->state.c_str(), GetOrigin(), 1.0f, color, axis); + //} + } + + deltaViewAngles.Zero(); + + idPlayer::Think(); +} \ No newline at end of file diff --git a/src/game/bots/Bot.h b/src/game/bots/Bot.h new file mode 100644 index 00000000..5466e074 --- /dev/null +++ b/src/game/bots/Bot.h @@ -0,0 +1,923 @@ +// Bot.h +// + +class rvmBotAIBotActionBase; + +// These need to match items.def +#define INVENTORY_ARMOR 1 +#define INVENTORY_GAUNTLET 4 +#define INVENTORY_SHOTGUN 5 +#define INVENTORY_MACHINEGUN 6 +#define INVENTORY_GRENADELAUNCHER 7 +#define INVENTORY_ROCKETLAUNCHER 8 +#define INVENTORY_LIGHTNING 9 +#define INVENTORY_RAILGUN 10 +#define INVENTORY_PLASMAGUN 11 +#define INVENTORY_BFG10K 13 +#define INVENTORY_GRAPPLINGHOOK 14 +#define INVENTORY_NAILGUN 15 +#define INVENTORY_PROXLAUNCHER 16 +#define INVENTORY_CHAINGUN 17 +#define INVENTORY_SHELLS 18 +#define INVENTORY_BULLETS 19 +#define INVENTORY_GRENADES 20 +#define INVENTORY_CELLS 21 +#define INVENTORY_LIGHTNINGAMMO 22 +#define INVENTORY_ROCKETS 23 +#define INVENTORY_SLUGS 24 +#define INVENTORY_BFGAMMO 25 +#define INVENTORY_NAILS 26 +#define INVENTORY_MINES 27 +#define INVENTORY_BELT 28 +#define INVENTORY_HEALTH 29 +#define INVENTORY_TELEPORTER 30 +#define INVENTORY_MEDKIT 31 +#define INVENTORY_KAMIKAZE 32 +#define INVENTORY_PORTAL 33 +#define INVENTORY_INVULNERABILITY 34 +#define INVENTORY_QUAD 35 +#define INVENTORY_ENVIRONMENTSUIT 36 +#define INVENTORY_HASTE 37 +#define INVENTORY_INVISIBILITY 38 +#define INVENTORY_REGEN 39 +#define INVENTORY_FLIGHT 40 +#define INVENTORY_SCOUT 41 +#define INVENTORY_GUARD 42 +#define INVENTORY_DOUBLER 43 +#define INVENTORY_AMMOREGEN 44 +#define INVENTORY_REDFLAG 45 +#define INVENTORY_BLUEFLAG 46 +#define INVENTORY_NEUTRALFLAG 47 +#define INVENTORY_REDCUBE 48 +#define INVENTORY_BLUECUBE 49 +#define INVENTORY_DOUBLESHOTGUN 50 + +#define MODELINDEX_DEFAULT 0 +#define MODELINDEX_ARMORSHARD 1 +#define MODELINDEX_ARMORCOMBAT 2 +#define MODELINDEX_ARMORBODY 3 +#define MODELINDEX_HEALTHSMALL 4 +#define MODELINDEX_HEALTH 5 +#define MODELINDEX_HEALTHLARGE 6 +#define MODELINDEX_HEALTHMEGA 7 +#define MODELINDEX_GAUNTLET 8 +#define MODELINDEX_SHOTGUN 9 +#define MODELINDEX_MACHINEGUN 10 +#define MODELINDEX_GRENADELAUNCHER 11 +#define MODELINDEX_ROCKETLAUNCHER 12 +#define MODELINDEX_LIGHTNING 13 +#define MODELINDEX_RAILGUN 14 +#define MODELINDEX_PLASMAGUN 15 +#define MODELINDEX_BFG10K 16 +#define MODELINDEX_GRAPPLINGHOOK 17 +#define MODELINDEX_SHELLS 18 +#define MODELINDEX_BULLETS 19 +#define MODELINDEX_GRENADES 20 +#define MODELINDEX_CELLS 21 +#define MODELINDEX_LIGHTNINGAMMO 22 +#define MODELINDEX_ROCKETS 23 +#define MODELINDEX_SLUGS 24 +#define MODELINDEX_BFGAMMO 25 +#define MODELINDEX_TELEPORTER 26 +#define MODELINDEX_MEDKIT 27 +#define MODELINDEX_QUAD 28 +#define MODELINDEX_ENVIRONMENTSUIT 29 +#define MODELINDEX_HASTE 30 +#define MODELINDEX_INVISIBILITY 31 +#define MODELINDEX_REGEN 32 +#define MODELINDEX_FLIGHT 33 +#define MODELINDEX_REDFLAG 34 +#define MODELINDEX_BLUEFLAG 35 +#define MODELINDEX_KAMIKAZE 36 +#define MODELINDEX_PORTAL 37 +#define MODELINDEX_INVULNERABILITY 38 +#define MODELINDEX_NAILS 39 +#define MODELINDEX_MINES 40 +#define MODELINDEX_BELT 41 +#define MODELINDEX_SCOUT 42 +#define MODELINDEX_GUARD 43 +#define MODELINDEX_DOUBLER 44 +#define MODELINDEX_AMMOREGEN 45 +#define MODELINDEX_NEUTRALFLAG 46 +#define MODELINDEX_REDCUBE 47 +#define MODELINDEX_BLUECUBE 48 +#define MODELINDEX_NAILGUN 49 +#define MODELINDEX_PROXLAUNCHER 50 +#define MODELINDEX_CHAINGUN 51 +#define MODELINDEX_POINTABLUE 52 +#define MODELINDEX_POINTBBLUE 53 +#define MODELINDEX_POINTARED 54 +#define MODELINDEX_POINTBRED 55 +#define MODELINDEX_POINTAWHITE 56 +#define MODELINDEX_POINTBWHITE 57 +#define MODELINDEX_POINTWHITE 58 +#define MODELINDEX_POINTRED 59 +#define MODELINDEX_POINTBLUE 60 +#define WEAPONINDEX_GAUNTLET 1 +#define WEAPONINDEX_MACHINEGUN 2 +#define WEAPONINDEX_SHOTGUN 3 +#define WEAPONINDEX_GRENADE_LAUNCHER 4 +#define WEAPONINDEX_ROCKET_LAUNCHER 5 +#define WEAPONINDEX_LIGHTNING 6 +#define WEAPONINDEX_RAILGUN 7 +#define WEAPONINDEX_PLASMAGUN 8 +#define WEAPONINDEX_BFG 9 +#define WEAPONINDEX_GRAPPLING_HOOK 10 +#define WEAPONINDEX_NAILGUN 11 +#define WEAPONINDEX_PROXLAUNCHER 12 +#define WEAPONINDEX_CHAINGUN 13 + +//enemy stuff +#define ENEMY_HORIZONTAL_DIST 200 +#define ENEMY_HEIGHT 201 + +#define MAX_AVOIDGOALS 256 +#define MAX_GOALSTACK 8 + +#define GFL_NONE 0 +#define GFL_ITEM 1 +#define GFL_ROAM 2 +#define GFL_DROPPED 4 + +#define BLERR_NOERROR 0 //no error +#define BLERR_LIBRARYNOTSETUP 1 //library not setup +#define BLERR_INVALIDENTITYNUMBER 2 //invalid entity number +#define BLERR_NOAASFILE 3 //no AAS file available +#define BLERR_CANNOTOPENAASFILE 4 //cannot open AAS file +#define BLERR_WRONGAASFILEID 5 //incorrect AAS file id +#define BLERR_WRONGAASFILEVERSION 6 //incorrect AAS file version +#define BLERR_CANNOTREADAASLUMP 7 //cannot read AAS file lump +#define BLERR_CANNOTLOADICHAT 8 //cannot load initial chats +#define BLERR_CANNOTLOADITEMWEIGHTS 9 //cannot load item weights +#define BLERR_CANNOTLOADITEMCONFIG 10 //cannot load item config +#define BLERR_CANNOTLOADWEAPONWEIGHTS 11 //cannot load weapon weights +#define BLERR_CANNOTLOADWEAPONCONFIG 12 //cannot load weapon config + +#define WT_BALANCE 1 +#define MAX_WEIGHTS 128 + +//fuzzy seperator +struct fuzzyseperator_t +{ + fuzzyseperator_t() + { + Reset(); + } + + void Reset() + { + inUse = false; + index = 0; + value = 0; + type = 0; + weight = 0; + minweight = 0.0f; + maxweight = 0.0f; + child = nullptr; + next = nullptr; + } + + bool inUse; + int index; + int value; + int type; + float weight; + float minweight; + float maxweight; + fuzzyseperator_t* child; + fuzzyseperator_t* next; +}; + +//fuzzy weight +struct weight_t +{ + weight_t() + { + Reset(); + } + + void Reset() + { + name.Clear(); + firstseperator = nullptr; + } + + idStr name; + fuzzyseperator_t* firstseperator; +}; + +//weight configuration +struct weightconfig_t +{ + weightconfig_t() + { + Reset(); + } + + void Reset() + { + inUse = false; + numweights = 0; + filename.Clear(); + + for( int i = 0; i < MAX_WEIGHTS; i++ ) + { + weights[i].Reset(); + } + } + + bool inUse; + int numweights; + weight_t weights[MAX_WEIGHTS]; + idStr filename; +}; + +// ------------------------------------------------------------------------------------ + +#define BOTFILESBASEFOLDER "botfiles" +//debug line colors +#define LINECOLOR_NONE -1 +#define LINECOLOR_RED 1//0xf2f2f0f0L +#define LINECOLOR_GREEN 2//0xd0d1d2d3L +#define LINECOLOR_BLUE 3//0xf3f3f1f1L +#define LINECOLOR_YELLOW 4//0xdcdddedfL +#define LINECOLOR_ORANGE 5//0xe0e1e2e3L + +//Print types +#define PRT_MESSAGE 1 +#define PRT_WARNING 2 +#define PRT_ERROR 3 +#define PRT_FATAL 4 +#define PRT_EXIT 5 + +//console message types +#define CMS_NORMAL 0 +#define CMS_CHAT 1 + +//action flags +#define ACTION_ATTACK 0x0000001 +#define ACTION_USE 0x0000002 +#define ACTION_RESPAWN 0x0000008 +#define ACTION_JUMP 0x0000010 +#define ACTION_MOVEUP 0x0000020 +#define ACTION_CROUCH 0x0000080 +#define ACTION_MOVEDOWN 0x0000100 +#define ACTION_MOVEFORWARD 0x0000200 +#define ACTION_MOVEBACK 0x0000800 +#define ACTION_MOVELEFT 0x0001000 +#define ACTION_MOVERIGHT 0x0002000 +#define ACTION_DELAYEDJUMP 0x0008000 +#define ACTION_TALK 0x0010000 +#define ACTION_GESTURE 0x0020000 +#define ACTION_WALK 0x0080000 +#define ACTION_AFFIRMATIVE 0x0100000 +#define ACTION_NEGATIVE 0x0200000 +#define ACTION_GETFLAG 0x0800000 +#define ACTION_GUARDBASE 0x1000000 +#define ACTION_PATROL 0x2000000 +#define ACTION_FOLLOWME 0x8000000 + + +//#define DEBUG +#define CTF + +#define MAX_ITEMS 256 +//bot flags +#define BFL_STRAFERIGHT 1 //strafe to the right +#define BFL_ATTACKED 2 //bot has attacked last ai frame +#define BFL_ATTACKJUMPED 4 //bot jumped during attack last frame +#define BFL_AIMATENEMY 8 //bot aimed at the enemy this frame +#define BFL_AVOIDRIGHT 16 //avoid obstacles by going to the right +#define BFL_IDEALVIEWSET 32 //bot has ideal view angles set +#define BFL_FIGHTSUICIDAL 64 //bot is in a suicidal fight +//long term goal types +#define LTG_TEAMHELP 1 //help a team mate +#define LTG_TEAMACCOMPANY 2 //accompany a team mate +#define LTG_DEFENDKEYAREA 3 //defend a key area +#define LTG_GETFLAG 4 //get the enemy flag +#define LTG_RUSHBASE 5 //rush to the base +#define LTG_RETURNFLAG 6 //return the flag +#define LTG_CAMP 7 //camp somewhere +#define LTG_CAMPORDER 8 //ordered to camp somewhere +#define LTG_PATROL 9 //patrol +#define LTG_GETITEM 10 //get an item +#define LTG_KILL 11 //kill someone +#define LTG_HARVEST 12 //harvest skulls +#define LTG_ATTACKENEMYBASE 13 //attack the enemy base +#define LTG_MAKELOVE_UNDER 14 +#define LTG_MAKELOVE_ONTOP 15 +//some goal dedication times +#define TEAM_HELP_TIME 60 //1 minute teamplay help time +#define TEAM_ACCOMPANY_TIME 600 //10 minutes teamplay accompany time +#define TEAM_DEFENDKEYAREA_TIME 600 //10 minutes ctf defend base time +#define TEAM_CAMP_TIME 600 //10 minutes camping time +#define TEAM_PATROL_TIME 600 //10 minutes patrolling time +#define TEAM_LEAD_TIME 600 //10 minutes taking the lead +#define TEAM_GETITEM_TIME 60 //1 minute +#define TEAM_KILL_SOMEONE 180 //3 minute to kill someone +#define TEAM_ATTACKENEMYBASE_TIME 600 //10 minutes +#define TEAM_HARVEST_TIME 120 //2 minutes +#define CTF_GETFLAG_TIME 600 //10 minutes ctf get flag time +#define CTF_RUSHBASE_TIME 120 //2 minutes ctf rush base time +#define CTF_RETURNFLAG_TIME 180 //3 minutes to return the flag +#define CTF_ROAM_TIME 60 //1 minute ctf roam time +//patrol flags +#define PATROL_LOOP 1 +#define PATROL_REVERSE 2 +#define PATROL_BACK 4 +//teamplay task preference +#define TEAMTP_DEFENDER 1 +#define TEAMTP_ATTACKER 2 +//CTF strategy +#define CTFS_AGRESSIVE 1 +//copied from the aas file header +#define PRESENCE_NONE 1 +#define PRESENCE_NORMAL 2 +#define PRESENCE_CROUCH 4 +// +#define MAX_PROXMINES 64 + + +#define MAX_CHARACTERISTICS 80 + +#define CT_INTEGER 1 +#define CT_FLOAT 2 +#define CT_STRING 3 + +#define DEFAULT_CHARACTER "bots/default_c.c" + +#define MAX_AVOIDGOALS 256 +#define MAX_GOALSTACK 8 + +#define GFL_NONE 0 +#define GFL_ITEM 1 +#define GFL_ROAM 2 +#define GFL_DROPPED 4 +#define MAX_EPAIRKEY 128 + +//characteristic value +struct cvalue +{ + cvalue() + { + integer = 0; + _float = 0.0f; + string = ""; + } + + int integer; + float _float; + idStr string; +}; + +//a characteristic +struct bot_characteristic_t +{ + bot_characteristic_t() + { + type = 0; + } + + char type; //characteristic type + cvalue value; //characteristic value +}; + +//a bot character +struct bot_character_t +{ + bot_character_t() + { + filename = ""; + inUse = false; + skill = 0.0f; + } + + idStr filename; + bool inUse; + float skill; + bot_characteristic_t c[MAX_CHARACTERISTICS]; +}; + +//the bot input, will be converted to an usercmd_t +//the bot input, will be converted to an usercmd_t +struct bot_input_t +{ + bot_input_t() + { + Reset(); + } + + void Reset() + { + thinktime = 0; + dir.Zero(); + speed = 0; + viewangles.Zero(); + actionflags = 0; + weapon = 0; + lastWeaponNum = 0; + respawn = false; + } + + float thinktime; //time since last output (in seconds) + idVec3 dir; //movement direction + float speed; //speed in the range [0, 400] + idAngles viewangles; //the view angles + int actionflags; //one of the ACTION_? flags + int weapon; //weapon to use + int lastWeaponNum; + bool respawn; +}; + +#if 0 +//entity state +typedef struct bot_entitystate_s +{ + int type; // entity type + int flags; // entity flags + vec3_t origin; // origin of the entity + vec3_t angles; // angles of the model + vec3_t old_origin; // for lerping + vec3_t mins; // bounding box minimums + vec3_t maxs; // bounding box maximums + int groundent; // ground entity + int solid; // solid type + int modelindex; // model used + int modelindex2; // weapons, CTF flags, etc + int frame; // model frame number + int event; // impulse events -- muzzle flashes, footsteps, etc + int eventParm; // even parameter + int powerups; // bit flags + int weapon; // determines weapon and flash model, etc + int legsAnim; // mask off ANIM_TOGGLEBIT + int torsoAnim; // mask off ANIM_TOGGLEBIT +} bot_entitystate_t; + +//check points +typedef struct bot_waypoint_s +{ + int inuse; + char name[32]; + bot_goal_t goal; + struct bot_waypoint_s* next, * prev; +} bot_waypoint_t; + +//bot settings +typedef struct bot_settings_s +{ + char characterfile[MAX_QPATH]; + float skill; + char team[MAX_QPATH]; +} bot_settings_t; + +#define MAX_ACTIVATESTACK 8 +#define MAX_ACTIVATEAREAS 32 + +typedef struct bot_activategoal_s +{ + int inuse; + bot_goal_t goal; //goal to activate (buttons etc.) + float time; //time to activate something + float start_time; //time starting to activate something + float justused_time; //time the goal was used + int shoot; //true if bot has to shoot to activate + int weapon; //weapon to be used for activation + vec3_t target; //target to shoot at to activate something + vec3_t origin; //origin of the blocking entity to activate + int areas[MAX_ACTIVATEAREAS]; //routing areas disabled by blocking entity + int numareas; //number of disabled routing areas + int areasdisabled; //true if the areas are disabled for the routing + struct bot_activategoal_s* next; //next activate goal on stack +} bot_activategoal_t; + +//bot state +typedef struct bot_state_s +{ + int inuse; //true if this state is used by a bot client + int botthink_residual; //residual for the bot thinks + int client; //client number of the bot + int entitynum; //entity number of the bot + playerState_t cur_ps; //current player state + int last_eFlags; //last ps flags + usercmd_t lastucmd; //usercmd from last frame + int entityeventTime[1024]; //last entity event time + // + bot_settings_t settings; //several bot settings + int ( *ainode )( struct bot_state_s* bs ); //current AI node + float thinktime; //time the bot thinks this frame + vec3_t origin; //origin of the bot + vec3_t velocity; //velocity of the bot + int presencetype; //presence type of the bot + vec3_t eye; //eye coordinates of the bot + int areanum; //the number of the area the bot is in + int inventory[MAX_ITEMS]; //string with items amounts the bot has + int tfl; //the travel flags the bot uses + int flags; //several flags + int respawn_wait; //wait until respawned + int lasthealth; //health value previous frame + int lastkilledplayer; //last killed player + int lastkilledby; //player that last killed this bot + int botdeathtype; //the death type of the bot + int enemydeathtype; //the death type of the enemy + int botsuicide; //true when the bot suicides + int enemysuicide; //true when the enemy of the bot suicides + int setupcount; //true when the bot has just been setup + int map_restart; //true when the map is being restarted + int entergamechat; //true when the bot used an enter game chat + int num_deaths; //number of time this bot died + int num_kills; //number of kills of this bot + int revenge_enemy; //the revenge enemy + int revenge_kills; //number of kills the enemy made + int lastframe_health; //health value the last frame + int lasthitcount; //number of hits last frame + int chatto; //chat to all or team + float walker; //walker charactertic + float ltime; //local bot time + float entergame_time; //time the bot entered the game + float ltg_time; //long term goal time + float nbg_time; //nearby goal time + float respawn_time; //time the bot takes to respawn + float respawnchat_time; //time the bot started a chat during respawn + float chase_time; //time the bot will chase the enemy + float enemyvisible_time; //time the enemy was last visible + float check_time; //time to check for nearby items + float stand_time; //time the bot is standing still + float lastchat_time; //time the bot last selected a chat + float kamikaze_time; //time to check for kamikaze usage + float invulnerability_time; //time to check for invulnerability usage + float standfindenemy_time; //time to find enemy while standing + float attackstrafe_time; //time the bot is strafing in one dir + float attackcrouch_time; //time the bot will stop crouching + float attackchase_time; //time the bot chases during actual attack + float attackjump_time; //time the bot jumped during attack + float enemysight_time; //time before reacting to enemy + float enemydeath_time; //time the enemy died + float enemyposition_time; //time the position and velocity of the enemy were stored + float defendaway_time; //time away while defending + float defendaway_range; //max travel time away from defend area + float rushbaseaway_time; //time away from rushing to the base + float attackaway_time; //time away from attacking the enemy base + float harvestaway_time; //time away from harvesting + float ctfroam_time; //time the bot is roaming in ctf + float killedenemy_time; //time the bot killed the enemy + float arrive_time; //time arrived (at companion) + float lastair_time; //last time the bot had air + float teleport_time; //last time the bot teleported + float camp_time; //last time camped + float camp_range; //camp range + float weaponchange_time; //time the bot started changing weapons + float firethrottlewait_time; //amount of time to wait + float firethrottleshoot_time; //amount of time to shoot + float notblocked_time; //last time the bot was not blocked + float blockedbyavoidspot_time; //time blocked by an avoid spot + float predictobstacles_time; //last time the bot predicted obstacles + int predictobstacles_goalareanum; //last goal areanum the bot predicted obstacles for + vec3_t aimtarget; + vec3_t enemyvelocity; //enemy velocity 0.5 secs ago during battle + vec3_t enemyorigin; //enemy origin 0.5 secs ago during battle + // + int kamikazebody; //kamikaze body + int proxmines[MAX_PROXMINES]; + int numproxmines; + // + bot_character_t* character; //the bot character + int ms; //move state of the bot + int gs; //goal state of the bot + int cs; //chat state of the bot + int ws; //weapon state of the bot + // + int enemy; //enemy entity number + int lastenemyareanum; //last reachability area the enemy was in + vec3_t lastenemyorigin; //last origin of the enemy in the reachability area + int weaponnum; //current weapon number + vec3_t viewangles; //current view angles + vec3_t ideal_viewangles; //ideal view angles + vec3_t viewanglespeed; + // + int ltgtype; //long term goal type + // team goals + int teammate; //team mate involved in this team goal + int decisionmaker; //player who decided to go for this goal + int ordered; //true if ordered to do something + float order_time; //time ordered to do something + int owndecision_time; //time the bot made it's own decision + bot_goal_t teamgoal; //the team goal + bot_goal_t altroutegoal; //alternative route goal + float reachedaltroutegoal_time; //time the bot reached the alt route goal + float teammessage_time; //time to message team mates what the bot is doing + float teamgoal_time; //time to stop helping team mate + float teammatevisible_time; //last time the team mate was NOT visible + int teamtaskpreference; //team task preference + // last ordered team goal + int lastgoal_decisionmaker; + int lastgoal_ltgtype; + int lastgoal_teammate; + bot_goal_t lastgoal_teamgoal; + // for leading team mates + int lead_teammate; //team mate the bot is leading + bot_goal_t lead_teamgoal; //team goal while leading + float lead_time; //time leading someone + float leadvisible_time; //last time the team mate was visible + float leadmessage_time; //last time a messaged was sent to the team mate + float leadbackup_time; //time backing up towards team mate + // + char teamleader[32]; //netname of the team leader + float askteamleader_time; //time asked for team leader + float becometeamleader_time; //time the bot will become the team leader + float teamgiveorders_time; //time to give team orders + float lastflagcapture_time; //last time a flag was captured + int numteammates; //number of team mates + int redflagstatus; //0 = at base, 1 = not at base + int blueflagstatus; //0 = at base, 1 = not at base + int neutralflagstatus; //0 = at base, 1 = our team has flag, 2 = enemy team has flag, 3 = enemy team dropped the flag + int flagstatuschanged; //flag status changed + int forceorders; //true if forced to give orders + int flagcarrier; //team mate carrying the enemy flag + int ctfstrategy; //ctf strategy + char subteam[32]; //sub team name + float formation_dist; //formation team mate intervening space + char formation_teammate[16]; //netname of the team mate the bot uses for relative positioning + float formation_angle; //angle relative to the formation team mate + vec3_t formation_dir; //the direction the formation is moving in + vec3_t formation_origin; //origin the bot uses for relative positioning + bot_goal_t formation_goal; //formation goal + + bot_activategoal_t* activatestack; //first activate goal on the stack + bot_activategoal_t activategoalheap[MAX_ACTIVATESTACK]; //activate goal heap + + bot_waypoint_t* checkpoints; //check points + bot_waypoint_t* patrolpoints; //patrol points + bot_waypoint_t* curpatrolpoint; //current patrol point the bot is going for + int patrolflags; //patrol flags + +// jmarshall + bot_goal_t currentgoal; + + vec3_t currentMoveGoal; + vec3_t movement_waypoints[NAV_MAX_PATHSTEPS]; + int numMovementWaypoints; + int currentWaypoint; + + vec3_t last_origin; + vec3_t very_short_term_origin; + + int stuck_time; + + vec3_t last_enemy_visible_position; + vec3_t random_move_position; + // jmarshall end + + bot_input_t input; +} bot_state_t; + +void BotUpdateInput( bot_state_t* bs, int time, int elapsed_time ); +qboolean BotIsDead( bot_state_t* bs ); + +void AIEnter_Respawn( bot_state_t* bs, char* s ); + +extern float floattime; +#define FloatTime() floattime + + +float Characteristic_BFloat( bot_character_t* ch, int index, float min, float max ); +void Characteristic_String( bot_character_t* ch, int index, char* buf, int size ); + +bot_character_t* BotLoadCharacterFromFile( char* charfile, int skill ); + +void BotInitLevelItems( void ); + +void BotChooseWeapon( bot_state_t* bs ); + +inline float AAS_Time() +{ + return floattime; +} + +unsigned short int BotTravelTime( vec3_t start, vec3_t end ); +#endif + +#define MAX_BOT_INVENTORY 256 + +typedef enum +{ + NULLMOVEFLAG = -1, + MOVE_PRONE, + MOVE_CROUCH, + MOVE_WALK, + MOVE_RUN2, + MOVE_SPRINT, + MOVE_JUMP, +} botMoveFlags_t; + +// +// rvmBotUtil +// +class rvmBotUtil +{ +public: + static float random() + { + return ( ( rand() & 0x7fff ) / ( ( float )0x7fff ) ); + } + + static float crandom() + { + return ( 2.0 * ( random() - 0.5 ) ); + } +}; + +#include "Bot_char.h" +#include "Bot_weights.h" +#include "Bot_weapons.h" +#include "Bot_goal.h" + +struct bot_state_t +{ + bot_state_t() + { + character = NULL; + gs = 0; + ws = 0; + Reset(); + } + void Reset() + { + attackerEntity = NULL; + client = 0; + entitynum = 0; + setupcount = 0; + entergame_time = 0; + weaponnum = 0; + lasthealth = 0; + ltg_time = 0; + weaponchange_time = 0; + enemy = 0; + enemyvisible_time = 0; + enemysuicide = 0; + enemysight_time = 0; + check_time = 0; + nbg_time = 0; + enemydeath_time = 0; + teleport_time = 0; + flags = 0; + firethrottlewait_time = 0; + attackchase_time = 0; + attackcrouch_time = 0; + attackstrafe_time = 0; + attackjump_time = 0; + firethrottleshoot_time = 0; + chase_time = 0; + thinktime = 0; + useRandomPosition = false; + aimtarget.Zero(); + lastenemyorigin.Zero(); + origin.Zero(); + enemyorigin.Zero(); + random_move_position.Zero(); + last_enemy_visible_position.Zero(); + viewangles.Zero(); + eye.Zero(); + memset( &inventory[0], 0, sizeof( inventory ) ); + } + + bot_character_t* character; + int gs; + int ws; + int enemy; + int client; + idEntity* attackerEntity; + int lasthealth; + int entitynum; + int setupcount; + int ltg_time; + int flags; + int weaponnum; + bool useRandomPosition; + float thinktime; + float chase_time; + float attackjump_time; + float attackcrouch_time; + float attackstrafe_time; + float attackchase_time; + float firethrottlewait_time; + float firethrottleshoot_time; + float nbg_time; //nearby goal time + float entergame_time; + float weaponchange_time; + float check_time; + float teleport_time; + float enemyvisible_time; //time the enemy was last visible + int enemysuicide; //true when the enemy of the bot suicides + float enemysight_time; //time before reacting to enemy + float enemydeath_time; //time the enemy died + float aggressiveAttackTime; + idVec3 origin; + idVec3 aimtarget; + idVec3 random_move_position; + idVec3 last_enemy_visible_position; + idAngles viewangles; + idVec3 enemyorigin; + idVec3 eye; + idVec3 lastenemyorigin; + int inventory[MAX_BOT_INVENTORY]; + bot_goal_t currentGoal; + bot_input_t botinput; +}; + +#include "Bot_chat.h" + +#define Bot_Time() ((float)gameLocal.time / 1000.0f) + +// +// rvmBot +// +class rvmBot : public idPlayer +{ +public: + friend class rvmBotAI; + + CLASS_PROTOTYPE( rvmBot ); + + rvmBot(); + ~rvmBot(); + + void Spawn( void ); + virtual void Think( void ) override; + virtual void SpawnToPoint( const idVec3& spawn_origin, const idAngles& spawn_angles ) override; + virtual void Damage( idEntity* inflictor, idEntity* attacker, const idVec3& dir, const char* damageDefName, const float damageScale, const int location ) override; + virtual void InflictedDamageEvent(idEntity* target) override; + virtual void StateThreadChanged(void) override; + virtual bool IsBot(void) override { return true; } + + void SetEnemy( idPlayer* player, idVec3 origin ); + + void BotInputFrame( void ); + void Bot_ResetUcmd( usercmd_t& ucmd ); + + + static void PresenceTypeBoundingBox( int presencetype, idVec3& mins, idVec3& maxs ); +private: + void BotSendChatMessage(botChat_t chat, const char *targetName); + + void BotInputToUserCommand( bot_input_t* bi, usercmd_t* ucmd, int time ); + + void BotMoveToGoalOrigin( idVec3 goalOrigin ); + + void ServerThink( void ); + void BotUpdateInventory( void ); + + bool HasWeapon( int index ) + { + return inventory.weapons & ( 1 << index ); + } +private: + bot_state_t bs; + bool hasSpawned; + +private: + int weapon_machinegun; + int weapon_shotgun; + int weapon_plasmagun; + int weapon_rocketlauncher; +protected: + bool BotIsDead(bot_state_t* bs); + bool BotReachedGoal(bot_state_t* bs, bot_goal_t* goal); + int BotGetItemLongTermGoal(bot_state_t* bs, int tfl, bot_goal_t* goal); + void BotChooseWeapon(bot_state_t* bs); + int BotFindEnemy(bot_state_t* bs, int curenemy); + bool EntityIsDead(idEntity* entity); + float BotEntityVisible(int viewer, idVec3 eye, idAngles viewangles, float fov, int ent); + float BotEntityVisibleTest(int viewer, idVec3 eye, idAngles viewangles, float fov, int ent, bool allowHeightTest); + void BotUpdateBattleInventory(bot_state_t* bs, int enemy); + float BotAggression(bot_state_t* bs); + int BotWantsToRetreat(bot_state_t* bs); + void BotBattleUseItems(bot_state_t* bs); + void BotAimAtEnemy(bot_state_t* bs); + void BotCheckAttack(bot_state_t* bs); + bool BotWantsToChase(bot_state_t* bs); + int BotNearbyGoal(bot_state_t* bs, int tfl, bot_goal_t* ltg, float range); + void BotGetRandomPointNearPosition(idVec3 point, idVec3& randomPoint, float radius); + int BotMoveInRandomDirection(bot_state_t* bs); + void BotMoveToGoal(bot_state_t* bs, bot_goal_t* goal); + + void MoveToCoverPoint(void); + + static int WP_MACHINEGUN; + static int WP_SHOTGUN; + static int WP_PLASMAGUN; + static int WP_ROCKET_LAUNCHER; +private: + stateResult_t state_Chase(stateParms_t* parms); + stateResult_t state_BattleFight(stateParms_t* parms); + stateResult_t state_BattleNBG(stateParms_t* parms); + stateResult_t state_Retreat(stateParms_t* parms); + stateResult_t state_Respawn(stateParms_t* parms); + stateResult_t state_SeekNBG(stateParms_t* parms); + stateResult_t state_SeekLTG(stateParms_t* parms); + stateResult_t state_Attacked(stateParms_t* parms); +private: + idAAS* aas; +}; + +extern idCVar bot_skill; + diff --git a/src/game/bots/BotAI.cpp b/src/game/bots/BotAI.cpp new file mode 100644 index 00000000..59a3658c --- /dev/null +++ b/src/game/bots/BotAI.cpp @@ -0,0 +1,1389 @@ +// BotAI.cpp +// + +#pragma hdrstop +#include "precompiled.h" +#include "../Game_local.h" +#include "../ai/AASCallback_FindCoverArea.h" + +#define IDEAL_ATTACKDIST 140 +#define MASK_SHOT MASK_SHOT_BOUNDINGBOX + +int rvmBot::WP_MACHINEGUN = -1; +int rvmBot::WP_SHOTGUN = -1; +int rvmBot::WP_PLASMAGUN = -1; +int rvmBot::WP_ROCKET_LAUNCHER = -1; + +/* +========================= +rvmBot::BotIsDead +========================= +*/ +bool rvmBot::BotIsDead( bot_state_t* bs ) +{ + idPlayer* player = gameLocal.GetClientByNum( bs->client ); + if( player->health <= 0 ) + { + return true; + } + + return false; +} + +/* +================== +rvmBot::BotReachedGoal +================== +*/ +bool rvmBot::BotReachedGoal( bot_state_t* bs, bot_goal_t* goal ) +{ + if( goal->flags & GFL_ITEM ) + { + //if touching the goal + if( botGoalManager.BotTouchingGoal( bs->origin, goal ) ) + { + if( !( goal->flags & GFL_DROPPED ) ) + { + botGoalManager.BotSetAvoidGoalTime( bs->gs, goal->number, -1 ); + } + return true; + } + //if the goal isn't there + if( botGoalManager.BotItemGoalInVisButNotVisible( bs->entitynum, bs->eye, bs->viewangles, goal ) ) + { + return true; + } + } + else + { + //if touching the goal + if( botGoalManager.BotTouchingGoal( bs->origin, goal ) ) + { + return true; + } + } + return false; +} + +/* +================== +rvmBot::BotChooseWeapon +================== +*/ +void rvmBot::BotChooseWeapon( bot_state_t* bs ) +{ + int newweaponnum; + + //if (bs->cur_ps.weaponstate == WEAPON_RAISING || + // bs->cur_ps.weaponstate == WEAPON_DROPPING) { + // //trap_EA_SelectWeapon(bs->client, bs->weaponnum); + // bs->input.weapon = bs->weaponnum; + //} + //else { + newweaponnum = botWeaponInfoManager.BotChooseBestFightWeapon( bs->ws, bs->inventory ); + if( bs->weaponnum != newweaponnum ) + { + bs->weaponchange_time = Bot_Time(); + } + bs->weaponnum = newweaponnum; + //BotAI_Print(PRT_MESSAGE, "bs->weaponnum = %d\n", bs->weaponnum); + //trap_EA_SelectWeapon(bs->client, bs->weaponnum); + bs->botinput.weapon = bs->weaponnum; + //} +} + + +/* +================== +rvmBot::BotGetItemLongTermGoal +================== +*/ +int rvmBot::BotGetItemLongTermGoal( bot_state_t* bs, int tfl, bot_goal_t* goal ) +{ + //if the bot has no goal + if( !botGoalManager.BotGetTopGoal( bs->gs, goal ) ) + { + //BotAI_Print(PRT_MESSAGE, "no ltg on stack\n"); + bs->ltg_time = 0; + } + //if the bot touches the current goal + else if( BotReachedGoal( bs, goal ) ) + { + BotChooseWeapon( bs ); + bs->ltg_time = 0; + } + + // Check to see that we can get to our goal, if not get a new goal. + //if (bs->numMovementWaypoints > 0) + //{ + // trace_t tr; + // gentity_t* ent = &g_entities[bs->client]; + // vec3_t waypoint; + // + // VectorCopy(bs->movement_waypoints[bs->currentWaypoint], waypoint); + // waypoint[2] += 5.0f; + // + // trap_Trace(&tr, ent->r.currentOrigin, NULL, NULL, waypoint, bs->client, CONTENTS_SOLID); + // + // if (tr.fraction <= 0.7f) + // { + // BotChooseWeapon(bs); + // bs->ltg_time = 0; + // } + //} + + //if it is time to find a new long term goal + if( bs->ltg_time == 0 ) + { + //pop the current goal from the stack + botGoalManager.BotPopGoal( bs->gs ); + //BotAI_Print(PRT_MESSAGE, "%s: choosing new ltg\n", ClientName(bs->client, netname, sizeof(netname))); + //choose a new goal + //BotAI_Print(PRT_MESSAGE, "%6.1f client %d: BotChooseLTGItem\n", Bot_Time(), bs->client); + if( botGoalManager.BotChooseLTGItem( bs->gs, bs->origin, bs->inventory, tfl ) ) + { + char buf[128]; + //get the goal at the top of the stack + botGoalManager.BotGetTopGoal( bs->gs, goal ); + botGoalManager.BotGoalName( goal->number, buf, sizeof( buf ) ); + common->Printf( "%1.1f: new long term goal %s\n", Bot_Time(), buf ); + + bs->ltg_time = Bot_Time() + 20; + bs->currentGoal.framenum = gameLocal.framenum; + } + else //the bot gets sorta stuck with all the avoid timings, shouldn't happen though + { + // + //trap_BotDumpAvoidGoals(bs->gs); + //reset the avoid goals and the avoid reach + botGoalManager.BotResetAvoidGoals( bs->gs ); + //BotResetAvoidReach(bs->ms); + } + //get the goal at the top of the stack + if( !botGoalManager.BotGetTopGoal( bs->gs, goal ) ) + { + return false; + } + + bs->currentGoal.framenum = gameLocal.framenum; + + return true; + } + return true; +} + +/* +================== +rvmBot::EntityIsDead +================== +*/ +bool rvmBot::EntityIsDead( idEntity* entity ) +{ + { + idPlayer* player = entity->Cast(); + if( player && player->health <= 0 ) + { + return true; + } + } + return false; +} + +/* +================== +BotEntityVisibleTest + +returns visibility in the range [0, 1] taking fog and water surfaces into account +================== +*/ +float rvmBot::BotEntityVisibleTest( int viewer, idVec3 eye, idAngles viewangles, float fov, int ent, bool allowHeightTest ) +{ + int i, contents_mask, passent, hitent, infog, inwater, otherinfog, pc; + float squaredfogdist, waterfactor, vis, bestvis; + trace_t trace; + idEntity* entinfo; + idVec3 dir, start, end, middle; + idAngles entangles; + idPlayer* viewEnt; + + //calculate middle of bounding box + //BotEntityInfo(ent, &entinfo); + entinfo = gameLocal.entities[ent]; + viewEnt = gameLocal.entities[viewer]->Cast(); + + //VectorAdd(entinfo->r.mins, entinfo->r.maxs, middle); + //VectorScale(middle, 0.5, middle); + //VectorAdd(entinfo->GetOrigin(), middle, middle); + middle = entinfo->GetPhysics()->GetBounds().GetCenter(); + middle += entinfo->GetOrigin(); + + //check if entity is within field of vision + //VectorSubtract(middle, eye, dir); + dir = middle - eye; + entangles = dir.ToAngles(); + + if (!viewEnt->CheckFOV(entinfo->GetOrigin())) + { + return 0; + } + + pc = gameLocal.clip[0]->PointContents( eye ); + infog = ( pc & CONTENTS_FOG ); + inwater = ( pc & ( CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_WATER ) ); + bestvis = 0; + for( i = 0; i < 3; i++ ) + { + //if the point is not in potential visible sight + //if (!AAS_inPVS(eye, middle)) continue; + // + contents_mask = CONTENTS_SOLID | CONTENTS_PLAYERCLIP; + passent = viewer; + hitent = ent; + //VectorCopy(eye, start); + start = eye; + //VectorCopy(middle, end); + end = middle; + //if the entity is in water, lava or slime + if(gameLocal.clip[0]->PointContents( middle ) & ( CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_WATER ) ) + { + contents_mask |= ( CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_WATER ); + } + //if eye is in water, lava or slime + if( inwater ) + { + if( !( contents_mask & ( CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_WATER ) ) ) + { + passent = ent; + hitent = viewer; + VectorCopy( middle, start ); + VectorCopy( eye, end ); + } + contents_mask ^= ( CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_WATER ); + } + + //trace from start to end + gameLocal.Trace( trace, start, end, contents_mask, passent ); + // jmarshall + if( trace.fraction < 0.9f && allowHeightTest ) + { + end[2] += 50.0f; + gameLocal.Trace( trace, start, end, contents_mask, passent ); + } + // jmarshall end + + //if water was hit + waterfactor = 1.0; + if( trace.c.contents & ( CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_WATER ) ) + { + //if the water surface is translucent + if( 1 ) + { + //trace through the water + contents_mask &= ~( CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_WATER ); + //trap_Trace(&trace, trace.endpos, NULL, NULL, end, passent, contents_mask); + gameLocal.Trace( trace, trace.endpos, end, contents_mask, passent ); + waterfactor = 0.5; + } + } + + //if a full trace or the hitent was hit + if( trace.fraction >= 1 || trace.c.entityNum == hitent ) + { + //check for fog, assuming there's only one fog brush where + //either the viewer or the entity is in or both are in + otherinfog = ( gameLocal.clip[0]->PointContents( middle ) & CONTENTS_FOG ); + if( infog && otherinfog ) + { + VectorSubtract( trace.endpos, eye, dir ); + squaredfogdist = dir.LengthSqr(); + } + else if( infog ) + { + VectorCopy( trace.endpos, start ); + //trap_Trace(&trace, start, NULL, NULL, eye, viewer, CONTENTS_FOG); + gameLocal.Trace( trace, start, eye, CONTENTS_FOG, viewer ); + VectorSubtract( eye, trace.endpos, dir ); + squaredfogdist = dir.LengthSqr(); + } + else if( otherinfog ) + { + VectorCopy( trace.endpos, end ); + //trap_Trace(&trace, eye, NULL, NULL, end, viewer, CONTENTS_FOG); + gameLocal.Trace( trace, eye, end, CONTENTS_FOG, viewer ); + VectorSubtract( end, trace.endpos, dir ); + squaredfogdist = dir.LengthSqr(); + } + else + { + //if the entity and the viewer are not in fog assume there's no fog in between + squaredfogdist = 0; + } + //decrease visibility with the view distance through fog + vis = 1 / ( ( squaredfogdist * 0.001 ) < 1 ? 1 : ( squaredfogdist * 0.001 ) ); + + //if entering water visibility is reduced + vis *= waterfactor; + + if( vis > bestvis ) + { + bestvis = vis; + } + + //if pretty much no fog + if( bestvis >= 0.95 ) + { + return bestvis; + } + } + //check bottom and top of bounding box as well + if( i == 0 ) + { + middle[2] += entinfo->GetPhysics()->GetBounds()[0][2]; // r.mins[2]; + } + else if( i == 1 ) + { + middle[2] += entinfo->GetPhysics()->GetBounds()[1][2] - entinfo->GetPhysics()->GetBounds()[0][2]; //entinfo->r.maxs[2] - entinfo->r.mins[2]; + } + } + return bestvis; +} + +/* +================== +rvmBot::BotEntityVisible +================== +*/ +float rvmBot::BotEntityVisible( int viewer, idVec3 eye, idAngles viewangles, float fov, int ent ) +{ + return BotEntityVisibleTest( viewer, eye, viewangles, fov, ent, true ); +} + +/* +================== +rvmBot::BotUpdateBattleInventory +================== +*/ +void rvmBot::BotUpdateBattleInventory( bot_state_t* bs, int enemy ) +{ + idVec3 dir; + idEntity* entinfo; + + entinfo = gameLocal.entities[enemy]; + + VectorSubtract( entinfo->GetOrigin(), bs->origin, dir ); + bs->inventory[ENEMY_HEIGHT] = ( int )dir[2]; + dir[2] = 0; + bs->inventory[ENEMY_HORIZONTAL_DIST] = ( int )dir.Length(); + //FIXME: add num visible enemies and num visible team mates to the inventory +} + +/* +================== +rvmBot::BotAggression +================== +*/ +float rvmBot::BotAggression( bot_state_t* bs ) +{ + //if the bot has quad + if( bs->inventory[INVENTORY_QUAD] ) + { + //if the bot is not holding the gauntlet or the enemy is really nearby + if( bs->weaponnum != 0 || + bs->inventory[ENEMY_HORIZONTAL_DIST] < 80 ) + { + return 70; + } + } + //if the enemy is located way higher than the bot + if( bs->inventory[ENEMY_HEIGHT] > 200 ) + { + return 0; + } + //if the bot is very low on health + if( bs->inventory[INVENTORY_HEALTH] < 60 ) + { + return 0; + } + //if the bot is low on health + if( bs->inventory[INVENTORY_HEALTH] < 80 ) + { + //if the bot has insufficient armor + if( bs->inventory[INVENTORY_ARMOR] < 40 ) + { + return 0; + } + } + //if the bot can use the bfg + if( bs->inventory[INVENTORY_BFG10K] > 0 && + bs->inventory[INVENTORY_BFGAMMO] > 7 ) + { + return 100; + } + //if the bot can use the railgun + if( bs->inventory[INVENTORY_RAILGUN] > 0 && + bs->inventory[INVENTORY_SLUGS] > 5 ) + { + return 95; + } + //if the bot can use the lightning gun + if( bs->inventory[INVENTORY_LIGHTNING] > 0 && + bs->inventory[INVENTORY_LIGHTNINGAMMO] > 50 ) + { + return 90; + } + //if the bot can use the rocketlauncher + if( bs->inventory[INVENTORY_ROCKETLAUNCHER] > 0 && + bs->inventory[INVENTORY_ROCKETS] > 5 ) + { + return 90; + } + //if the bot can use the plasmagun + if( bs->inventory[INVENTORY_PLASMAGUN] > 0 && + bs->inventory[INVENTORY_CELLS] > 40 ) + { + return 85; + } + //if the bot can use the grenade launcher + if( bs->inventory[INVENTORY_GRENADELAUNCHER] > 0 && + bs->inventory[INVENTORY_GRENADES] > 10 ) + { + return 80; + } + //if the bot can use the shotgun + if( bs->inventory[INVENTORY_SHOTGUN] > 0 && + bs->inventory[INVENTORY_SHELLS] > 10 ) + { + return 50; + } + + if( bs->inventory[INVENTORY_BULLETS] > 0 ) + { + return 60; + } + + //otherwise the bot is not feeling too good + return 0; +} + + +/* +================== +rvmBot::BotWantsToRetreat +================== +*/ +int rvmBot::BotWantsToRetreat( bot_state_t* bs ) +{ + if( BotAggression( bs ) < 50 ) + { + return true; + } + return false; +} + +/* +================== +rvmBot::BotBattleUseItems +================== +*/ +void rvmBot::BotBattleUseItems( bot_state_t* bs ) +{ + if( bs->inventory[INVENTORY_HEALTH] < 40 ) + { + if( bs->inventory[INVENTORY_TELEPORTER] > 0 ) + { + bs->botinput.actionflags |= ACTION_USE; + } + } + if( bs->inventory[INVENTORY_HEALTH] < 60 ) + { + if( bs->inventory[INVENTORY_MEDKIT] > 0 ) + { + //trap_EA_Use(bs->client); + bs->botinput.actionflags |= ACTION_USE; + } + } +} + +/* +================== +rvmBot::BotFindEnemy +================== +*/ +int rvmBot::BotFindEnemy( bot_state_t* bs, int curenemy ) +{ + int i, healthdecrease; + float f, alertness, easyfragger, vis; + float squaredist, cursquaredist; + idPlayer* entinfo = NULL; + idPlayer* curenemyinfo = NULL; + idVec3 dir; + idAngles angles; + idPlayer* clientEnt; + + alertness = botCharacterStatsManager.Characteristic_BFloat( bs->character, CHARACTERISTIC_ALERTNESS, 0, 1 ); + easyfragger = botCharacterStatsManager.Characteristic_BFloat( bs->character, CHARACTERISTIC_EASY_FRAGGER, 0, 1 ); + + clientEnt = gameLocal.entities[bs->client]->Cast(); + + //check if the health decreased + healthdecrease = bs->lasthealth > bs->inventory[INVENTORY_HEALTH]; + + //remember the current health value + bs->lasthealth = bs->inventory[INVENTORY_HEALTH]; + // + if( curenemy >= 0 ) + { + //BotEntityInfo(curenemy, &curenemyinfo); + curenemyinfo = gameLocal.entities[curenemy]->Cast(); + // jmarshall - add flag support. + //if (EntityCarriesFlag(&curenemyinfo)) return qfalse; + // jmarshall end + //VectorSubtract(curenemyinfo->r.currentOrigin, bs->origin, dir); + dir = curenemyinfo->GetPhysics()->GetOrigin() - bs->origin; + cursquaredist = dir.LengthSqr();// VectorLengthSquared(dir); + } + else + { + cursquaredist = 0; + } + + for( i = 0; i < MAX_CLIENTS; i++ ) + { + + if( i == bs->client ) + { + continue; + } + + //if it's the current enemy + if( i == curenemy ) + { + continue; + } + + entinfo = gameLocal.entities[i]->Cast(); + if( !entinfo ) + { + continue; + } + + //if the enemy isn't dead and the enemy isn't the bot self + if( EntityIsDead( entinfo ) || i == bs->entitynum ) + { + continue; + } + + if (entinfo->spectating) { + continue; + } + + //if the enemy is invisible and not shooting +// jmarshall - add invis + //if (EntityIsInvisible(&entinfo) && !EntityIsShooting(&entinfo)) { + // continue; + //} +// jmarshall end + +// jmarshall - eval, looks like code to not shoot chatting players or players that just spawned in. +// do we care about this? + //if not an easy fragger don't shoot at chatting players + //if (easyfragger < 0.5 && EntityIsChatting(&entinfo)) + // continue; + + // + //if (lastteleport_time > Bot_Time() - 3) { + // VectorSubtract(entinfo.origin, lastteleport_origin, dir); + // if (VectorLengthSquared(dir) < Square(70)) + // continue; + //} +// jmarshall end + + //calculate the distance towards the enemy + idVec3 potentialTargetOrigin = entinfo->GetPhysics()->GetOrigin(); + dir = potentialTargetOrigin - bs->origin; + squaredist = dir.LengthSqr(); + + // jmarshall + //if this entity is not carrying a flag + //if (!EntityCarriesFlag(&entinfo)) + //{ + //if this enemy is further away than the current one + if( curenemy >= 0 && squaredist > cursquaredist ) + { + continue; + } + //} +// jmarshall end + + //if the bot has no + if( squaredist > Square( 900.0 + alertness * 4000.0 ) ) + { + continue; + } + + // jmarshall - teams! + //if on the same team + //if (BotSameTeam(bs, i)) + // continue; + // jmarshall end + //if the bot's health decreased or the enemy is shooting + if( curenemy < 0 && ( healthdecrease || entinfo->IsShooting() ) ) + { + f = 360; + } + else + { + f = 90 + 90 - ( 90 - ( squaredist > Square( 810 ) ? Square( 810 ) : squaredist ) / ( 810 * 9 ) ); + } + //check if the enemy is visible + + // If we were last hit by someone then assume they are visible. + if( bs->attackerEntity != entinfo ) + { + vis = BotEntityVisible( bs->entitynum, bs->eye, bs->viewangles, f, i ); + if( vis <= 0 ) + { + continue; + } + } + + //if the enemy is quite far away, not shooting and the bot is not damaged + if( curenemy < 0 && squaredist > Square( 100 ) && !healthdecrease && !entinfo->IsShooting() ) + { + //check if we can avoid this enemy + VectorSubtract( bs->origin, entinfo->GetOrigin(), dir ); + angles = dir.ToAngles(); + + //if the bot isn't in the fov of the enemy + if( !clientEnt->CheckFOV( entinfo->GetOrigin() ) ) + { + //update some stuff for this enemy + BotUpdateBattleInventory( bs, i ); + + //if the bot doesn't really want to fight + if( BotWantsToRetreat( bs ) ) + { + continue; + } + } + } + //found an enemy + bs->enemy = i;//entinfo.number; + if( curenemy >= 0 ) + { + bs->enemysight_time = Bot_Time() - 2; + } + else + { + bs->enemysight_time = Bot_Time(); + } + bs->enemysuicide = false; + bs->enemydeath_time = 0; + bs->enemyvisible_time = Bot_Time(); + return true; + } + return false; +} + +/* +================== +rvmBot::BotMoveToGoal +================== +*/ +void rvmBot::BotMoveToGoal( bot_state_t* bs, bot_goal_t* goal ) +{ + bs->currentGoal = *goal; + bs->currentGoal.framenum = gameLocal.framenum; +} + +/* +================== +rvmBot::BotAimAtEnemy +================== +*/ +void rvmBot::BotAimAtEnemy( bot_state_t* bs ) +{ + int i, enemyvisible; + float dist, f, aim_skill, aim_accuracy, speed, reactiontime; + idVec3 dir, bestorigin, end, start, groundtarget, cmdmove, enemyvelocity; + idVec3 mins( -4, -4, -4 ); + idVec3 maxs( 4, 4, 4 ); + weaponinfo_t wi; + //aas_entityinfo_t entinfo; + idPlayer* entinfo; + bot_goal_t goal; + trace_t trace; + idVec3 target; + idPlayer* self; + + //if the bot has no enemy + if( bs->enemy < 0 ) + { + return; + } + + self = gameLocal.entities[bs->entitynum]->Cast(); + + //get the enemy entity information + //BotEntityInfo(bs->enemy, &entinfo); + entinfo = gameLocal.entities[bs->enemy]->Cast(); + + //if this is not a player (should be an obelisk) + if( bs->enemy >= MAX_CLIENTS ) + { + //if the obelisk is visible + VectorCopy( entinfo->GetOrigin(), target ); +#ifdef MISSIONPACK + // if attacking an obelisk + if( bs->enemy == redobelisk.entitynum || + bs->enemy == blueobelisk.entitynum ) + { + target[2] += 32; + } +#endif + //aim at the obelisk + VectorSubtract( target, bs->eye, dir ); + //vectoangles(dir, bs->viewangles); + bs->viewangles = dir.ToAngles(); + + //set the aim target before trying to attack + VectorCopy( target, bs->aimtarget ); + return; + } + + // + //BotAI_Print(PRT_MESSAGE, "client %d: aiming at client %d\n", bs->entitynum, bs->enemy); + // + aim_skill = botCharacterStatsManager.Characteristic_BFloat( bs->character, CHARACTERISTIC_AIM_SKILL, 0, 1 ); + aim_accuracy = botCharacterStatsManager.Characteristic_BFloat( bs->character, CHARACTERISTIC_AIM_ACCURACY, 0, 1 ); + // + if( aim_skill > 0.95 ) + { + //don't aim too early + reactiontime = 0.5 * botCharacterStatsManager.Characteristic_BFloat( bs->character, CHARACTERISTIC_REACTIONTIME, 0, 1 ); + if( bs->enemysight_time > Bot_Time() - reactiontime ) + { + return; + } + if( bs->teleport_time > Bot_Time() - reactiontime ) + { + return; + } + } + + //get the weapon information + botWeaponInfoManager.BotGetWeaponInfo( bs->ws, bs->weaponnum, &wi ); + + //get the weapon specific aim accuracy and or aim skill + if( wi.number == WP_MACHINEGUN ) + { + aim_accuracy = botCharacterStatsManager.Characteristic_BFloat( bs->character, CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN, 0, 1 ); + } + else if( wi.number == WP_SHOTGUN ) + { + aim_accuracy = botCharacterStatsManager.Characteristic_BFloat( bs->character, CHARACTERISTIC_AIM_ACCURACY_SHOTGUN, 0, 1 ); + } + //else if (wi.number == WP_GRENADE_LAUNCHER) { + // aim_accuracy = Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER, 0, 1); + // aim_skill = Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER, 0, 1); + //} + else if( wi.number == WP_ROCKET_LAUNCHER ) + { + aim_accuracy = botCharacterStatsManager.Characteristic_BFloat( bs->character, CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER, 0, 1 ); + aim_skill = botCharacterStatsManager.Characteristic_BFloat( bs->character, CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER, 0, 1 ); + } + //else if (wi.number == WP_LIGHTNING) { + // aim_accuracy = Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_ACCURACY_LIGHTNING, 0, 1); + //} + //else if (wi.number == WP_RAILGUN) { + // aim_accuracy = Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_ACCURACY_RAILGUN, 0, 1); + //} + else if( wi.number == WP_PLASMAGUN ) + { + aim_accuracy = botCharacterStatsManager.Characteristic_BFloat( bs->character, CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN, 0, 1 ); + aim_skill = botCharacterStatsManager.Characteristic_BFloat( bs->character, CHARACTERISTIC_AIM_SKILL_PLASMAGUN, 0, 1 ); + } + //else if (wi.number == WP_BFG) { + // aim_accuracy = Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_ACCURACY_BFG10K, 0, 1); + // aim_skill = Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_SKILL_BFG10K, 0, 1); + //} + // + if( aim_accuracy <= 0 ) + { + aim_accuracy = 0.0001f; + } + //get the enemy entity information + //BotEntityInfo(bs->enemy, &entinfo); + entinfo = gameLocal.entities[bs->enemy]->Cast(); + + //if the enemy is invisible then shoot crappy most of the time + //if (entinfo->IsInvisible()) { + // if (rvmBotUtil::random() > 0.1) + // aim_accuracy *= 0.4f; + //} + // jmarshall - fix aim accuracy. + //VectorSubtract(entinfo->GetOrigin(), entinfo.lastvisorigin, enemyvelocity); + //VectorScale(enemyvelocity, 1 / entinfo.update_time, enemyvelocity); + ////enemy origin and velocity is remembered every 0.5 seconds + //if (bs->enemyposition_time < Bot_Time()) { + // // + // bs->enemyposition_time = Bot_Time() + 0.5; + // VectorCopy(enemyvelocity, bs->enemyvelocity); + // VectorCopy(entinfo.origin, bs->enemyorigin); + //} + ////if not extremely skilled + //if (aim_skill < 0.9) { + // VectorSubtract(entinfo.origin, bs->enemyorigin, dir); + // //if the enemy moved a bit + // if (VectorLengthSquared(dir) > Square(48)) { + // //if the enemy changed direction + // if (DotProduct(bs->enemyvelocity, enemyvelocity) < 0) { + // //aim accuracy should be worse now + // aim_accuracy *= 0.7f; + // } + // } + //} + // jmarshall end + + //check visibility of enemy + enemyvisible = BotEntityVisible( bs->entitynum, bs->eye, bs->viewangles, 360, bs->enemy ); + + //if the enemy is visible + if( enemyvisible ) + { + // + VectorCopy( entinfo->GetOrigin(), bestorigin ); + bestorigin[2] += 8; + //get the start point shooting from + //NOTE: the x and y projectile start offsets are ignored + VectorCopy( bs->origin, start ); + start[2] += self->GetViewHeight();// bs->cur_ps.viewheight; + start[2] += wi.offset[2]; + // + //trap_Trace(&trace, start, mins, maxs, bestorigin, bs->entitynum, MASK_SHOT); + gameLocal.Trace( trace, start, bestorigin, MASK_SHOT, bs->entitynum ); + //if the enemy is NOT hit + if( trace.fraction <= 1 && trace.c.entityNum != bs->enemy ) + { + bestorigin[2] += 16; + } + //if it is not an instant hit weapon the bot might want to predict the enemy + if( wi.speed ) + { + // + VectorSubtract( bestorigin, bs->origin, dir ); + dist = dir.Length(); + VectorSubtract( entinfo->GetOrigin(), bs->enemyorigin, dir ); + //if the enemy is NOT pretty far away and strafing just small steps left and right + if( !( dist > 100 && dir.LengthSqr() < Square( 32 ) ) ) + { + //if skilled anough do exact prediction + if( aim_skill > 0.8 && + //if the weapon is ready to fire + !self->IsShooting() ) + { + //aas_clientmove_t move; + idVec3 origin; + idVec3 last_enemy_visible_position; + VectorCopy( last_enemy_visible_position, bs->last_enemy_visible_position ); + last_enemy_visible_position[2] += 20.0f; + + // + VectorSubtract( entinfo->GetOrigin(), bs->origin, dir ); + + ////distance towards the enemy + //dist = VectorLength(dir); + ////direction the enemy is moving in + VectorSubtract( entinfo->GetOrigin(), last_enemy_visible_position, dir ); + //// + //VectorScale(dir, 1 / entinfo->update_time, dir); + //// + //VectorCopy(entinfo->origin, origin); + //origin[2] += 1; + + //// + //VectorClear(cmdmove); + ////AAS_ClearShownDebugLines(); + //trap_AAS_PredictClientMovement(&move, bs->enemy, origin, + // PRESENCE_CROUCH, qfalse, + // dir, cmdmove, 0, + // dist * 10 / wi.speed, 0.1f, 0, 0, qfalse); + //VectorCopy(move.endpos, bestorigin); + //BotAI_Print(PRT_MESSAGE, "%1.1f predicted speed = %f, frames = %f\n", Bot_Time(), VectorLength(dir), dist * 10 / wi.speed); + + bot_goal_t goal; + VectorMA( entinfo->GetOrigin(), 30, dir, goal.origin ); + BotMoveToGoal( bs, &goal ); + } + //if not that skilled do linear prediction + else if( aim_skill > 0.4 ) + { + // jmarshall - fix linear prediction. + idVec3 last_enemy_visible_position; + VectorCopy( last_enemy_visible_position, bs->last_enemy_visible_position ); + last_enemy_visible_position[2] += 20.0f; + + //VectorSubtract(entinfo->GetOrigin(), bs->origin, dir); + ////distance towards the enemy + //dist = VectorLength(dir); + ////direction the enemy is moving in + VectorSubtract( entinfo->GetOrigin(), last_enemy_visible_position, dir ); + //dir[2] = 0; + //// + //speed = VectorNormalize(dir) / entinfo.update_time; + ////botimport.Print(PRT_MESSAGE, "speed = %f, wi->speed = %f\n", speed, wi->speed); + ////best spot to aim at + //VectorMA(entinfo.origin, (dist / wi.speed) * speed, dir, bestorigin); + bot_goal_t goal; + VectorMA( entinfo->GetOrigin(), 30, dir, goal.origin ); + BotMoveToGoal( bs, &goal ); + // jmarshall end + } + } + } + //if the projectile does radial damage + if( aim_skill > 0.6 && wi.proj.damagetype & DAMAGETYPE_RADIAL ) + { + //if the enemy isn't standing significantly higher than the bot + if( entinfo->GetOrigin()[2] < bs->origin[2] + 16 ) + { + //try to aim at the ground in front of the enemy + VectorCopy( entinfo->GetOrigin(), end ); + end[2] -= 64; + //trap_Trace(&trace, entinfo->GetOrigin(), NULL, NULL, end, bs->enemy, MASK_SHOT); + gameLocal.Trace( trace, entinfo->GetOrigin(), end, MASK_SHOT, bs->enemy ); + // + VectorCopy( bestorigin, groundtarget ); +// jmarshall - add start solid + //if (trace.startsolid) + // groundtarget[2] = entinfo->GetOrigin()[2] - 16; + //else + groundtarget[2] = trace.endpos[2] - 8; +// jmarshall end + //trace a line from projectile start to ground target + //trap_Trace(&trace, start, NULL, NULL, groundtarget, bs->entitynum, MASK_SHOT); + gameLocal.Trace( trace, start, groundtarget, MASK_SHOT, bs->entitynum ); + //if hitpoint is not vertically too far from the ground target + if( idMath::Fabs( trace.endpos[2] - groundtarget[2] ) < 50 ) + { + VectorSubtract( trace.endpos, groundtarget, dir ); + //if the hitpoint is near anough the ground target + if( dir.LengthSqr() < Square( 60 ) ) + { + VectorSubtract( trace.endpos, start, dir ); + //if the hitpoint is far anough from the bot + if( dir.LengthSqr() > Square( 100 ) ) + { + //check if the bot is visible from the ground target + trace.endpos[2] += 1; + //trap_Trace(&trace, trace.endpos, NULL, NULL, entinfo->GetOrigin(), bs->enemy, MASK_SHOT); + gameLocal.Trace( trace, trace.endpos, entinfo->GetOrigin(), MASK_SHOT, bs->enemy ); + if( trace.fraction >= 1 ) + { + //botimport.Print(PRT_MESSAGE, "%1.1f aiming at ground\n", AAS_Time()); + VectorCopy( groundtarget, bestorigin ); + } + } + } + } + } + } + bestorigin[0] += 20 * rvmBotUtil::crandom() * ( 1 - aim_accuracy ); + bestorigin[1] += 20 * rvmBotUtil::crandom() * ( 1 - aim_accuracy ); + bestorigin[2] += 10 * rvmBotUtil::crandom() * ( 1 - aim_accuracy ); + } + else + { + // + VectorCopy( bs->lastenemyorigin, bestorigin ); + bestorigin[2] += 8; + // jmarshall - fix this. + //if the bot is skilled anough + //if (aim_skill > 0.5) { + // //do prediction shots around corners + // if (wi.number == WP_BFG || + // wi.number == WP_ROCKET_LAUNCHER || + // wi.number == WP_GRENADE_LAUNCHER) { + // //create the chase goal + // goal.entitynum = bs->client; + // goal.areanum = bs->areanum; + // VectorCopy(bs->eye, goal.origin); + // VectorSet(goal.mins, -8, -8, -8); + // VectorSet(goal.maxs, 8, 8, 8); + // // + // if (trap_BotPredictVisiblePosition(bs->lastenemyorigin, bs->lastenemyareanum, &goal, TFL_DEFAULT, target)) { + // VectorSubtract(target, bs->eye, dir); + // if (VectorLengthSquared(dir) > Square(80)) { + // VectorCopy(target, bestorigin); + // bestorigin[2] -= 20; + // } + // } + // aim_accuracy = 1; + // } + //} + // jmarshall end + } + // + if( enemyvisible ) + { + //trap_Trace(&trace, bs->eye, NULL, NULL, bestorigin, bs->entitynum, MASK_SHOT); + gameLocal.Trace( trace, bs->eye, bestorigin, MASK_SHOT, bs->entitynum ); + VectorCopy( trace.endpos, bs->aimtarget ); + } + else + { + VectorCopy( bestorigin, bs->aimtarget ); + } + //get aim direction + VectorSubtract( bestorigin, bs->eye, dir ); + // + if( wi.number == WP_MACHINEGUN || + wi.number == WP_SHOTGUN /*|| // jmarshall add lighting railgun. + wi.number == WP_LIGHTNING || + wi.number == WP_RAILGUN*/ ) + { + //distance towards the enemy + dist = dir.Length();// VectorLength(dir); + if( dist > 150 ) + { + dist = 150; + } + f = 0.6 + dist / 150 * 0.4; + aim_accuracy *= f; + } + //add some random stuff to the aim direction depending on the aim accuracy + if( aim_accuracy < 0.8 ) + { + dir.Normalize(); + for( i = 0; i < 3; i++ ) + { + dir[i] += 0.3 * rvmBotUtil::crandom() * ( 1 - aim_accuracy ); + } + } + //set the ideal view angles + //vectoangles(dir, bs->viewangles); + bs->viewangles = dir.ToAngles(); + + //take the weapon spread into account for lower skilled bots + bs->viewangles[PITCH] += 6 * wi.vspread * rvmBotUtil::crandom() * ( 1 - aim_accuracy ); + bs->viewangles[PITCH] = idMath::AngleMod( bs->viewangles[PITCH] ); + bs->viewangles[YAW] += 6 * wi.hspread * rvmBotUtil::crandom() * ( 1 - aim_accuracy ); + bs->viewangles[YAW] = idMath::AngleMod( bs->viewangles[YAW] ); + // jmarshall - add bot_challenge. + //if the bots should be really challenging + //if (bot_challenge.integer) { + // //if the bot is really accurate and has the enemy in view for some time + // if (aim_accuracy > 0.9 && bs->enemysight_time < Bot_Time() - 1) { + // //set the view angles directly + // if (bs->ideal_viewangles[PITCH] > 180) bs->ideal_viewangles[PITCH] -= 360; + // VectorCopy(bs->ideal_viewangles, bs->viewangles); + // trap_EA_View(bs->client, bs->viewangles); + // } + //} + //vectoangles(bi->dir, bi->viewangles); + // jmarshall end +} + + +/* +================== +rvmBot::BotWantsToChase +================== +*/ +bool rvmBot::BotWantsToChase( bot_state_t* bs ) +{ + if( BotAggression( bs ) > 50 ) + { + return true; + } + return false; +} + + + +/* +================== +rvmBot::BotNearbyGoal +================== +*/ +int rvmBot::BotNearbyGoal( bot_state_t* bs, int tfl, bot_goal_t* ltg, float range ) +{ + int ret; + + // jmarshall - check for air. + //check if the bot should go for air + //if (BotGoForAir(bs, tfl, ltg, range)) return qtrue; + ////if the bot is carrying the enemy flag + //if (BotCTFCarryingFlag(bs)) { + // //if the bot is just a few secs away from the base + // if (trap_AAS_AreaTravelTimeToGoalArea(bs->areanum, bs->origin, + // bs->teamgoal.areanum, TFL_DEFAULT) < 300) { + // //make the range really small + // range = 50; + // } + //} + // jmarshall end + + // + ret = botGoalManager.BotChooseNBGItem( bs->gs, bs->origin, bs->inventory, tfl, ltg, range ); + + return ret; +} + + +/* +======================= +rvmBot::BotGetRandomPointNearPosition +======================= +*/ +void rvmBot::BotGetRandomPointNearPosition( idVec3 point, idVec3& randomPoint, float radius ) +{ + idAAS* aas = gameLocal.GetBotAAS(); + idAASFile* file = aas->GetAASFile(); + + int areaNum = aas->PointAreaNum(point); + const aasArea_t& area = file->GetArea(areaNum); + + // justin: I'm changing this from the method I used in Doom 3 to a method that doesn't require me + // to change the AAS format + //int firstEdge = area.firstEdge; + //int i = rvRandom::irand(0, area.numEdges); + + int firstFace = area.firstFace; + int numFaces = area.numFaces; + int faceId = rvRandom::irand(firstFace, numFaces); + + const aasFace_t& face = file->GetFace(faceId); + + int firstEdge = face.firstEdge; + int i = rvRandom::irand(0, face.numEdges); + + const aasEdge_t &edge = file->GetEdge(abs(file->GetEdgeIndex(firstEdge + i))); + + randomPoint = file->GetVertex(edge.vertexNum[0]); +} + +/* +======================= +rvmBot::BotMoveInRandomDirection +======================= +*/ +int rvmBot::BotMoveInRandomDirection( bot_state_t* bs ) +{ + rvmBot* ent = gameLocal.entities[bs->client]->Cast(); + + //ent->ResetPathFinding(); + + float dist = idMath::Distance( ent->GetPhysics()->GetOrigin(), bs->random_move_position ); + + if( !ent->PointVisible( bs->random_move_position ) ) + { + dist = 0; + } + + if( dist < 25 || bs->random_move_position.Length() == 0 ) + { + BotGetRandomPointNearPosition( ent->GetPhysics()->GetOrigin(), bs->random_move_position, 50.0f ); + } + + VectorSubtract( bs->random_move_position, ent->GetPhysics()->GetOrigin(), bs->botinput.dir ); + + idAngles ang( 0, bs->botinput.dir.ToYaw(), 0 ); + bs->botinput.speed = pm_speed.GetInteger(); + bs->botinput.dir.Normalize(); + bs->useRandomPosition = true; + bs->botinput.speed = 400; // 200 = walk, 400 = run. + return 0; +} + +/* +============ +rvmBot::ShowHideArea +============ +*/ +void rvmBot::MoveToCoverPoint(void) +{ + int areaNum, numObstacles; + idVec3 target; + aasGoal_t goal; + aasObstacle_t obstacles[10]; + idVec3 origin = GetOrigin(); + idAAS* aas = gameLocal.GetBotAAS(); + + areaNum = gameLocal.GetBotAAS()->PointReachableAreaNum(origin, aas->DefaultSearchBounds(), (AREA_REACHABLE_WALK | AREA_REACHABLE_FLY)); + target = aas->AreaCenter(aas->PointAreaNum(gameLocal.GetLocalPlayer()->GetOrigin())); + + // consider the target an obstacle + obstacles[0].absBounds = idBounds(target).Expand(16); + numObstacles = 1; + + idAASCallback_FindCoverArea findCover(target); + if (aas->FindNearestGoal(goal, areaNum, origin, target, TFL_WALK | TFL_AIR, 0.0f, 0.0f, obstacles, numObstacles, findCover)) + { + bs.currentGoal.origin = goal.origin; + } +} + +/* +================== +rvmBot::BotCheckAttack +================== +*/ +void rvmBot::BotCheckAttack( bot_state_t* bs ) +{ + float points, reactiontime, fov, firethrottle; + int attackentity; + trace_t bsptrace; + //float selfpreservation; + idVec3 forward, right, start, end, dir; + idAngles angles; + weaponinfo_t wi; + trace_t trace; + //aas_entityinfo_t entinfo; + idEntity* entinfo; + idVec3 mins( -8, -8, -8 ); + idVec3 maxs( 8, 8, 8 ); + idPlayer* self; + + attackentity = bs->enemy; + // + //BotEntityInfo(attackentity, &entinfo); + entinfo = gameLocal.entities[attackentity]; + + self = gameLocal.entities[bs->client]->Cast(); + + // + reactiontime = botCharacterStatsManager.Characteristic_BFloat( bs->character, CHARACTERISTIC_REACTIONTIME, 0, 1 ); + if( bs->enemysight_time > Bot_Time() - reactiontime ) + { + return; + } + if( bs->teleport_time > Bot_Time() - reactiontime ) + { + return; + } + + //if changing weapons + if( bs->weaponchange_time > Bot_Time() - 0.1 ) + { + return; + } + + //check fire throttle characteristic + if( bs->firethrottlewait_time > Bot_Time() ) + { + return; + } + // jmarshall - this wasn't original behaivor, but multiplying it by 40 feels better for gameplay + firethrottle = botCharacterStatsManager.Characteristic_BFloat( bs->character, CHARACTERISTIC_FIRETHROTTLE, 0, 1 ) * 40.0f; + // jmarshall end + if( bs->firethrottleshoot_time < Bot_Time() ) + { + if( rvmBotUtil::random() > firethrottle ) + { + bs->firethrottlewait_time = Bot_Time() + firethrottle; + bs->firethrottleshoot_time = 0; + } + else + { + bs->firethrottleshoot_time = Bot_Time() + 1 - firethrottle; + bs->firethrottlewait_time = 0; + } + } + + VectorSubtract( bs->aimtarget, bs->eye, dir ); + +// jmarshall - add gauntlet + //if (bs->weaponnum == WP_GAUNTLET) { + // if (dir.LengthSqr() > Square(60)) { + // return; + // } + //} +// jmarshall end + if( dir.LengthSqr() < Square( 100 ) ) + { + fov = 120; + } + else + { + fov = 50; + } + + //vectoangles(dir, angles); + angles = dir.ToAngles(); + if( !self->CheckFOV( entinfo->GetPhysics()->GetOrigin() ) ) + { + return; + } + + //trap_Trace(&bsptrace, bs->eye, NULL, NULL, bs->aimtarget, bs->client, CONTENTS_SOLID | CONTENTS_PLAYERCLIP); + gameLocal.Trace( bsptrace, bs->eye, bs->aimtarget, CONTENTS_SOLID | CONTENTS_PLAYERCLIP, bs->client ); + + if( bsptrace.fraction < 1 && bsptrace.c.entityNum != attackentity ) + { + return; + } + + //get the weapon info + botWeaponInfoManager.BotGetWeaponInfo( bs->ws, bs->weaponnum, &wi ); + + //get the start point shooting from + VectorCopy( bs->origin, start ); + start[2] += self->GetViewHeight();// bs->cur_ps.viewheight; + bs->viewangles.ToVectors( &forward, &right, NULL ); + + start[0] += forward[0] * wi.offset[0] + right[0] * wi.offset[1]; + start[1] += forward[1] * wi.offset[0] + right[1] * wi.offset[1]; + start[2] += forward[2] * wi.offset[0] + right[2] * wi.offset[1] + wi.offset[2]; + //end point aiming at + VectorMA( start, 1000, forward, end ); + //a little back to make sure not inside a very close enemy + VectorMA( start, -12, forward, start ); + //trap_Trace(&trace, start, mins, maxs, end, bs->entitynum, MASK_SHOT); + gameLocal.Trace( trace, start, end, MASK_SHOT, bs->entitynum ); + + //if the entity is a client + if( trace.c.entityNum > 0 && trace.c.entityNum <= MAX_CLIENTS ) + { + if( trace.c.entityNum != attackentity ) + { + // jmarshall - teams + //if a teammate is hit + //if (BotSameTeam(bs, trace.entityNum)) + // return; + // jmarshall end + } + } + //if won't hit the enemy or not attacking a player (obelisk) + if( trace.c.entityNum != attackentity || attackentity >= MAX_CLIENTS ) + { + //if the projectile does radial damage + if( wi.proj.damagetype & DAMAGETYPE_RADIAL ) + { + if( trace.fraction * 1000 < wi.proj.radius ) + { + points = ( wi.proj.damage - 0.5 * trace.fraction * 1000 ) * 0.5; + if( points > 0 ) + { + return; + } + } + //FIXME: check if a teammate gets radial damage + } + } + //if fire has to be release to activate weapon + if( wi.flags & WFL_FIRERELEASED ) + { + if( bs->flags & BFL_ATTACKED ) + { + //trap_EA_Attack(bs->client); + bs->botinput.actionflags |= ACTION_ATTACK; + } + } + else + { + //trap_EA_Attack(bs->client); + bs->botinput.actionflags |= ACTION_ATTACK; + } + bs->flags ^= BFL_ATTACKED; +} diff --git a/src/game/bots/BotAI_Battle_Attacked.cpp b/src/game/bots/BotAI_Battle_Attacked.cpp new file mode 100644 index 00000000..b994b9a3 --- /dev/null +++ b/src/game/bots/BotAI_Battle_Attacked.cpp @@ -0,0 +1,50 @@ +// BotAI_Battle_Attacked.cpp +// + +#pragma hdrstop +#include "precompiled.h" +#include "../Game_local.h" + +/* +================== +rvmBot::state_Attacked +================== +*/ +stateResult_t rvmBot::state_Attacked(stateParms_t* parms) { + // respawn if dead. + if (BotIsDead(&bs)) + { + stateThread.SetState("state_Respawn"); + return SRESULT_DONE; + } + + if (gameLocal.SysScriptTime() > bs.aggressiveAttackTime || bs.weaponnum == 0) { + stateThread.SetState("state_Retreat"); + return SRESULT_DONE; + } + + // Ensure the target is a player. + idPlayer *entinfo = gameLocal.entities[bs.enemy]->Cast(); + if (!entinfo) + { + stateThread.SetState("state_SeekLTG"); + return SRESULT_DONE; + } + + // If our enemy is dead, search for another LTG. + if (EntityIsDead(entinfo)) + { + stateThread.SetState("state_SeekLTG"); + return SRESULT_DONE; + } + + bs.currentGoal.origin = bs.lastenemyorigin; + + //aim at the enemy + BotAimAtEnemy(&bs); + + //attack the enemy if possible + BotCheckAttack(&bs); + + return SRESULT_WAIT; +} \ No newline at end of file diff --git a/src/game/bots/BotAI_Battle_Chase.cpp b/src/game/bots/BotAI_Battle_Chase.cpp new file mode 100644 index 00000000..2bed5b9f --- /dev/null +++ b/src/game/bots/BotAI_Battle_Chase.cpp @@ -0,0 +1,208 @@ +// BotAI_Battle_Chase.cpp +// + +#pragma hdrstop +#include "precompiled.h" +#include "../Game_local.h" + + +/* +===================== +rvmBot::state_Chase +===================== +*/ +stateResult_t rvmBot::state_Chase(stateParms_t* parms) +{ + bot_goal_t goal; + idVec3 target, dir; + //bot_moveresult_t moveresult; + float range; + + //if (BotIsObserver(bs)) { + // AIEnter_Observer(bs, "battle chase: observer"); + // return qfalse; + //} + // + ////if in the intermission + //if (BotIntermission(bs)) { + // AIEnter_Intermission(bs, "battle chase: intermission"); + // return qfalse; + //} + + // respawn if dead. + if( BotIsDead( &bs ) ) + { + stateThread.SetState("state_Respawn"); + return SRESULT_DONE; + } + + //if no enemy + if( bs.enemy < 0 ) + { + stateThread.SetState("state_SeekLTG"); + return SRESULT_DONE; + } + + //if the enemy is visible + if( BotEntityVisibleTest( bs.entitynum, bs.eye, bs.viewangles, 360, bs.enemy, false ) ) + { + //AIEnter_Battle_Fight(bs, "battle chase"); + stateThread.SetState("state_BattleFight"); + return SRESULT_DONE; + } + + //if there is another enemy + if( BotFindEnemy( &bs, -1 ) ) + { + //AIEnter_Battle_Fight(bs, "battle chase: better enemy"); + //stateThread.SetState("state_BattleFight"); + stateThread.SetState("state_BattleFight"); + return SRESULT_DONE; + } + ////there is no last enemy area + //if (!bs.lastenemyareanum) { + // AIEnter_Seek_LTG(bs, "battle chase: no enemy area"); + // return qfalse; + //} +// jmarshall + // + //bs.tfl = TFL_DEFAULT; + //if (bot_grapple.integer) bs.tfl |= TFL_GRAPPLEHOOK; + ////if in lava or slime the bot should be able to get out + //if (BotInLavaOrSlime(bs)) bs.tfl |= TFL_LAVA | TFL_SLIME; + //// + //if (BotCanAndWantsToRocketJump(bs)) { + // bs.tfl |= TFL_ROCKETJUMP; + //} + //map specific code + //BotMapScripts(bs); +// jmarshall end + + //create the chase goal + goal.entitynum = bs.enemy; +// goal.areanum = bs.lastenemyareanum; + VectorCopy( bs.lastenemyorigin, goal.origin ); + + goal.mins = idMath::CreateVector( -8, -8, -8 ); + goal.maxs = idMath::CreateVector( 8, 8, 8 ); + + // jmarshall - goal origin is last visible position + { + // Do a trace between the last_enemy_visible_position and the goal origin, + // if for some reason we don't have line of sight to it, switch to LTG. + trace_t trace; + + gameLocal.Trace( trace, bs.last_enemy_visible_position, gameLocal.entities[bs.client]->GetOrigin(), CONTENTS_SOLID, 0 ); + + if( trace.fraction <= 0.9f ) + { + //AIEnter_Seek_LTG(bs, "can't see last enemy position"); + stateThread.SetState("state_SeekLTG"); + return SRESULT_DONE; + } + } + VectorCopy( bs.last_enemy_visible_position, goal.origin ); + // jmarshall end + + //if the last seen enemy spot is reached the enemy could not be found + if( botGoalManager.BotTouchingGoal( bs.origin, &goal ) ) + { + bs.chase_time = 0; + } + + //if there's no chase time left + if( !bs.chase_time || bs.chase_time < Bot_Time() - 10 ) + { + //AIEnter_Seek_LTG(bs, "battle chase: time out"); + stateThread.SetState("state_SeekLTG"); + return SRESULT_DONE; + } + //check for nearby goals periodicly + if( bs.check_time < Bot_Time() ) + { + bs.check_time = Bot_Time() + 1; + range = 150; + // + if( BotNearbyGoal( &bs, 0, &goal, range ) ) + { + //the bot gets 5 seconds to pick up the nearby goal item + bs.nbg_time = Bot_Time() + 0.1 * range + 1; + //BotResetLastAvoidReach(bs.ms); + //AIEnter_Battle_NBG(bs, "battle chase: nbg"); + stateThread.SetState("state_BattleNBG"); + return SRESULT_DONE; + } + } + + BotUpdateBattleInventory( &bs, bs.enemy ); + + ////initialize the movement state + //BotSetupForMovement(bs); + + //move towards the goal + //trap_BotMoveToGoal(&moveresult, bs.ms, &goal, bs.tfl); + + if( idMath::FRandRange( 0.0f, 4.0f ) <= 2.0f ) + { + BotMoveToGoal( &bs, &goal ); + } + else + { + BotMoveInRandomDirection( &bs ); + } + + + //if the movement failed + //if (moveresult.failure) { + // //reset the avoid reach, otherwise bot is stuck in current area + // trap_BotResetAvoidReach(bs.ms); + // //BotAI_Print(PRT_MESSAGE, "movement failure %d\n", moveresult.traveltype); + // bs.ltg_time = 0; + //} + //// + //BotAIBlocked(bs, &moveresult, qfalse); + // + //if (moveresult.flags & (MOVERESULT_MOVEMENTVIEWSET | MOVERESULT_MOVEMENTVIEW | MOVERESULT_SWIMVIEW)) { + // VectorCopy(moveresult.ideal_viewangles, bs.ideal_viewangles); + //} + + if( !( bs.flags & BFL_IDEALVIEWSET ) ) + { + BotAimAtEnemy( &bs ); + // jmarshall + //if (bs.chase_time > FloatTime() - 2) { + // BotAimAtEnemy(bs); + //} + //else { + // if (BotMovementViewTarget(bs.ms, &goal, bs.tfl, 300, target)) { + // VectorSubtract(target, bs.origin, dir); + // vectoangles(dir, bs.viewangles); + // } + // //else { + // // vectoangles(moveresult.movedir, bs.ideal_viewangles); + // //} + //} + // jmarshall end +// bs.ideal_viewangles[2] *= 0.5; // jmarshall <-- view angles! + } + + if (BotEntityVisible(bs.entitynum, bs.eye, bs.viewangles, 360, bs.enemy)) + { + //attack the enemy if possible + BotCheckAttack(&bs); + } + + //if the weapon is used for the bot movement + //if (moveresult.flags & MOVERESULT_MOVEMENTWEAPON) bs.weaponnum = moveresult.weapon; + //if the bot is in the area the enemy was last seen in + //if (bs.areanum == bs.lastenemyareanum) bs.chase_time = 0; + //if the bot wants to retreat (the bot could have been damage during the chase) + if( BotWantsToRetreat( &bs ) ) + { + //AIEnter_Battle_Retreat(bs, "battle chase: wants to retreat"); + stateThread.SetState("state_Retreat"); + return SRESULT_DONE; + } + + return SRESULT_WAIT; +} \ No newline at end of file diff --git a/src/game/bots/BotAI_Battle_Fight.cpp b/src/game/bots/BotAI_Battle_Fight.cpp new file mode 100644 index 00000000..5180244d --- /dev/null +++ b/src/game/bots/BotAI_Battle_Fight.cpp @@ -0,0 +1,168 @@ +// BotAI_Battle_Fight.cpp +// + +#pragma hdrstop +#include "precompiled.h" +#include "../Game_local.h" + +/* +===================== +rvmBot::state_BattleFight +===================== +*/ +stateResult_t rvmBot::state_BattleFight(stateParms_t* parms) +{ + int areanum; + idVec3 target; + idPlayer* entinfo; + + // respawn if dead. + if( BotIsDead( &bs ) ) + { + stateThread.SetState("state_Respawn"); + return SRESULT_DONE; + } + + //if there is another better enemy + if( BotFindEnemy( &bs, bs.enemy ) ) + { + common->DPrintf( "found new better enemy\n" ); + } + + //if no enemy + if( bs.enemy < 0 ) + { + stateThread.SetState("state_SeekLTG"); + return SRESULT_DONE; + } + + //BotEntityInfo(bs.enemy, &entinfo); + entinfo = gameLocal.entities[bs.enemy]->Cast();// &g_entities[bs.enemy]; + + //if the enemy is dead + if( bs.enemydeath_time ) + { + if( bs.enemydeath_time < Bot_Time() - 1.0 ) + { + bs.enemydeath_time = 0; + if( bs.enemysuicide ) + { + // jmarshall - bot chat + //BotChat_EnemySuicide(bs); + // jmarshall end + } + // jmarshall - bot chat stand + // if (bs.lastkilledplayer == bs.enemy && BotChat_Kill(bs)) { + // bs.stand_time = FloatTime() + BotChatTime(bs); + // AIEnter_Stand(bs, "battle fight: enemy dead"); + // } + // else { + bs.ltg_time = 0; + //AIEnter_Seek_LTG(bs, "battle fight: enemy dead"); + stateThread.SetState("state_SeekLTG"); + // } + // jmarshall end + return SRESULT_DONE; + } + } + else + { + if( EntityIsDead( entinfo ) ) + { + bs.enemydeath_time = Bot_Time(); + } + } +// jmarshall - isinvisible + //if the enemy is invisible and not shooting the bot looses track easily + //if (entinfo->IsInvisible() && !entinfo->IsShooting()) { + // if (rvmBotUtil::random() < 0.2) { + // stateThread.SetState("state_SeekLTG"); + // return; + // } + //} + // + target = entinfo->GetOrigin(); + + //update the reachability area and origin if possible + //areanum = BotPointAreaNum(target); + //if (areanum && trap_AAS_AreaReachability(areanum)) { + // VectorCopy(target, bs.lastenemyorigin); + // bs.lastenemyareanum = areanum; + //} +// bs.lastenemyareanum = areanum; + + //update the attack inventory values + BotUpdateBattleInventory( &bs, bs.enemy ); + + //if the bot's health decreased +// jmarshall - bot chat + //if (bs.lastframe_health > bs.inventory[INVENTORY_HEALTH]) { + // if (BotChat_HitNoDeath(bs)) { + // bs.stand_time = FloatTime() + BotChatTime(bs); + // AIEnter_Stand(bs, "battle fight: chat health decreased"); + // return qfalse; + // } + //} + + //if the bot hit someone + //if (bs.cur_ps.persistant[PERS_HITS] > bs.lasthitcount) { + // if (BotChat_HitNoKill(bs)) { + // bs.stand_time = FloatTime() + BotChatTime(bs); + // AIEnter_Stand(bs, "battle fight: chat hit someone"); + // return qfalse; + // } + //} +// jmarshall end + + //if the enemy is not visible + if( !BotEntityVisible( bs.entitynum, bs.eye, bs.viewangles, 360, bs.enemy ) ) + { + if( BotWantsToChase( &bs ) ) + { + //AIEnter_Battle_Chase(bs, "battle fight: enemy out of sight"); + stateThread.SetState("state_Chase"); + return SRESULT_DONE; + } + else + { + //AIEnter_Seek_LTG(bs, "battle fight: enemy out of sight"); + stateThread.SetState("state_SeekLTG"); + return SRESULT_DONE; + } + } + //use holdable items + BotBattleUseItems( &bs ); + // + //bs.tfl = TFL_DEFAULT; + //if (bot_grapple.integer) bs.tfl |= TFL_GRAPPLEHOOK; + ////if in lava or slime the bot should be able to get out + //if (BotInLavaOrSlime(bs)) bs.tfl |= TFL_LAVA | TFL_SLIME; + //// + //if (BotCanAndWantsToRocketJump(bs)) { + // bs.tfl |= TFL_ROCKETJUMP; + //} + //choose the best weapon to fight with + BotChooseWeapon( &bs ); + + // Move randomly around our AAS area. + BotMoveInRandomDirection(&bs); + + //aim at the enemy + BotAimAtEnemy( &bs ); + + //attack the enemy if possible + BotCheckAttack( &bs ); + + //if the bot wants to retreat + if( !( bs.flags & BFL_FIGHTSUICIDAL ) ) + { + if( BotWantsToRetreat( &bs ) ) + { + //AIEnter_Battle_Retreat(bs, "battle fight: wants to retreat"); + stateThread.SetState("state_Retreat"); + return SRESULT_DONE; + } + } + + return SRESULT_WAIT; +} \ No newline at end of file diff --git a/src/game/bots/BotAI_Battle_NBG.cpp b/src/game/bots/BotAI_Battle_NBG.cpp new file mode 100644 index 00000000..9188deb9 --- /dev/null +++ b/src/game/bots/BotAI_Battle_NBG.cpp @@ -0,0 +1,178 @@ +// BotAI_Battle_NBG.cpp +// + +#pragma hdrstop +#include "precompiled.h" +#include "../Game_local.h" + +/* +===================== +rvmBot::state_BattleNBG +===================== +*/ +stateResult_t rvmBot::state_BattleNBG(stateParms_t* parms) +{ + int areanum; + bot_goal_t goal; + //aas_entityinfo_t entinfo; + idEntity* entinfo; + //bot_moveresult_t moveresult; + float attack_skill; + idVec3 target, dir; + + //if (BotIsObserver(bs)) { + // AIEnter_Observer(bs, "battle nbg: observer"); + // return qfalse; + //} + ////if in the intermission + //if (BotIntermission(bs)) { + // AIEnter_Intermission(bs, "battle nbg: intermission"); + // return qfalse; + //} + + // respawn if dead. + if( BotIsDead( &bs ) ) + { + stateThread.SetState("state_Respawn"); + return SRESULT_DONE; + } + + // if no enemy. + if( bs.enemy < 0 ) + { + stateThread.SetState("state_SeekLTG"); + return SRESULT_DONE; + } + + //BotEntityInfo(bs.enemy, &entinfo); + entinfo = gameLocal.entities[bs.enemy]->Cast(); + if( entinfo->health <= 0 ) + { + //AIEnter_Seek_NBG(bs, "battle nbg: enemy dead"); + stateThread.SetState("state_SeekNBG"); + return SRESULT_DONE; + } + + //bs.tfl = TFL_DEFAULT; + //if (bot_grapple.integer) bs.tfl |= TFL_GRAPPLEHOOK; + ////if in lava or slime the bot should be able to get out + //if (BotInLavaOrSlime(bs)) bs.tfl |= TFL_LAVA | TFL_SLIME; + //// + //if (BotCanAndWantsToRocketJump(bs)) { + // bs.tfl |= TFL_ROCKETJUMP; + //} + ////map specific code + //BotMapScripts(bs); + + //update the last time the enemy was visible + if( BotEntityVisible( bs.entitynum, bs.eye, bs.viewangles, 360, bs.enemy ) ) + { + bs.enemyvisible_time = Bot_Time(); + //VectorCopy(entinfo->GetOrigin(), target); + target = entinfo->GetOrigin(); + // if not a player enemy + if( bs.enemy >= MAX_CLIENTS ) + { +#ifdef MISSIONPACK + // if attacking an obelisk + if( bs.enemy == redobelisk.entitynum || + bs.enemy == blueobelisk.entitynum ) + { + target[2] += 16; + } +#endif + } + //update the reachability area and origin if possible + //areanum = BotPointAreaNum(target); + //if (areanum && trap_AAS_AreaReachability(areanum)) { + VectorCopy( target, bs.lastenemyorigin ); + // bs.lastenemyareanum = areanum; + //} + } + + //if the bot has no goal or touches the current goal + if( !botGoalManager.BotGetTopGoal( bs.gs, &goal ) ) + { + bs.nbg_time = 0; + } + else if( BotReachedGoal( &bs, &goal ) ) + { + bs.nbg_time = 0; + } + // + if( bs.nbg_time < Bot_Time() ) + { + //pop the current goal from the stack + botGoalManager.BotPopGoal( bs.gs ); + //if the bot still has a goal + if( botGoalManager.BotGetTopGoal( bs.gs, &goal ) ) + { + //AIEnter_Battle_Retreat(bs, "battle nbg: time out"); + stateThread.SetState("state_Retreat"); + } + else + { + //AIEnter_Battle_Fight(bs, "battle nbg: time out"); + stateThread.SetState("state_BattleFight"); + } + + return SRESULT_DONE; + } + + //move towards the goal + BotMoveToGoal( &bs, &goal ); + + //initialize the movement state + //BotSetupForMovement(bs); + ////move towards the goal + //trap_BotMoveToGoal(&moveresult, bs.ms, &goal, bs.tfl); + ////if the movement failed + //if (moveresult.failure) { + // //reset the avoid reach, otherwise bot is stuck in current area + // trap_BotResetAvoidReach(bs.ms); + // //BotAI_Print(PRT_MESSAGE, "movement failure %d\n", moveresult.traveltype); + // bs.nbg_time = 0; + //} + //// + //BotAIBlocked(bs, &moveresult, qfalse); + + //update the attack inventory values + BotUpdateBattleInventory( &bs, bs.enemy ); + + //choose the best weapon to fight with + BotChooseWeapon( &bs ); + + //if the view is fixed for the movement + //if (moveresult.flags & (MOVERESULT_MOVEMENTVIEW | MOVERESULT_SWIMVIEW)) { + // VectorCopy(moveresult.ideal_viewangles, bs.ideal_viewangles); + //} + //else if (!(moveresult.flags & MOVERESULT_MOVEMENTVIEWSET) + // && !(bs.flags & BFL_IDEALVIEWSET)) { + // attack_skill = trap_Characteristic_BFloat(bs.character, CHARACTERISTIC_ATTACK_SKILL, 0, 1); + // //if the bot is skilled anough and the enemy is visible + // if (attack_skill > 0.3) { + // //&& BotEntityVisible(bs.entitynum, bs.eye, bs.viewangles, 360, bs.enemy) + // BotAimAtEnemy(bs); + // } + // else { + // if (trap_BotMovementViewTarget(bs.ms, &goal, bs.tfl, 300, target)) { + // VectorSubtract(target, bs.origin, dir); + // vectoangles(dir, bs.ideal_viewangles); + // } + // else { + // vectoangles(moveresult.movedir, bs.ideal_viewangles); + // } + // bs.ideal_viewangles[2] *= 0.5; + // } + //} + //if (attack_skill > 0.3) { + //&& BotEntityVisible(bs.entitynum, bs.eye, bs.viewangles, 360, bs.enemy) + BotAimAtEnemy( &bs ); + //} + + //if the weapon is used for the bot movement + //if (moveresult.flags & MOVERESULT_MOVEMENTWEAPON) bs.weaponnum = moveresult.weapon; + //attack the enemy if possible + BotCheckAttack( &bs ); + return SRESULT_WAIT; +} \ No newline at end of file diff --git a/src/game/bots/BotAI_Battle_Retreat.cpp b/src/game/bots/BotAI_Battle_Retreat.cpp new file mode 100644 index 00000000..e8298c12 --- /dev/null +++ b/src/game/bots/BotAI_Battle_Retreat.cpp @@ -0,0 +1,144 @@ +// BotAI_Battle_Retreat.cpp +// + +#pragma hdrstop +#include "precompiled.h" +#include "../Game_local.h" + +/* +===================== +rvmBot::state_Retreat +===================== +*/ +stateResult_t rvmBot::state_Retreat(stateParms_t* parms) +{ + bot_goal_t goal; + idPlayer* entinfo; + rvmBot* owner; + idVec3 target, dir; + float attack_skill, range; + + // respawn if dead. + if( BotIsDead( &bs ) ) + { + stateThread.SetState("state_Respawn"); + return SRESULT_DONE; + } + + // if no enemy. + if( bs.enemy < 0 ) + { + stateThread.SetState("state_SeekLTG"); + return SRESULT_DONE; + } + + // Ensure the target is a player. + entinfo = gameLocal.entities[bs.enemy]->Cast(); + if( !entinfo ) + { + stateThread.SetState("state_SeekLTG"); + return SRESULT_DONE; + } + + owner = gameLocal.entities[bs.entitynum]->Cast(); + + // If our enemy is dead, search for another LTG. + if( EntityIsDead( entinfo ) ) + { + stateThread.SetState("state_SeekLTG"); + return SRESULT_DONE; + } + + //if there is another better enemy + if( BotFindEnemy( &bs, bs.enemy ) ) + { + common->DPrintf( "found new better enemy\n" ); + } + + //update the attack inventory values + BotUpdateBattleInventory( &bs, bs.enemy ); + + //if the bot doesn't want to retreat anymore... probably picked up some nice items + if( BotWantsToChase( &bs ) ) + { + //empty the goal stack, when chasing, only the enemy is the goal + botGoalManager.BotEmptyGoalStack( bs.gs ); + + //go chase the enemy + //AIEnter_Battle_Chase(bs, "battle retreat: wants to chase"); + stateThread.SetState("state_Chase"); + return SRESULT_DONE; + } + + //update the last time the enemy was visible + if( BotEntityVisible( bs.entitynum, bs.eye, bs.viewangles, 360, bs.enemy ) ) + { + bs.enemyvisible_time = Bot_Time(); + target = entinfo->GetOrigin(); + bs.lastenemyorigin = target; + } + + //if the enemy is NOT visible for 4 seconds + if( bs.enemyvisible_time < Bot_Time() - 4 ) + { + stateThread.SetState("state_SeekLTG"); + return SRESULT_DONE; + } + //else if the enemy is NOT visible + else if( bs.enemyvisible_time < Bot_Time() ) + { + //if there is another enemy + if( BotFindEnemy( &bs, -1 ) ) + { + //AIEnter_Battle_Fight(bs, "battle retreat: another enemy"); + stateThread.SetState("state_BattleFight"); + return SRESULT_DONE; + } + } + + //use holdable items + BotBattleUseItems( &bs ); + + //get the current long term goal while retreating + if( !BotGetItemLongTermGoal( &bs, 0, &bs.currentGoal ) ) + { + //AIEnter_Battle_SuicidalFight(bs, "battle retreat: no way out"); + stateThread.SetState("state_BattleFight"); + bs.flags |= BFL_FIGHTSUICIDAL; + return SRESULT_DONE; + } + + //check for nearby goals periodicly + if( bs.check_time < Bot_Time() ) + { + bs.check_time = Bot_Time() + 1; + range = 150; + + // + if( BotNearbyGoal( &bs, 0, &goal, range ) ) + { + //trap_BotResetLastAvoidReach(bs.ms); + //time the bot gets to pick up the nearby goal item + bs.nbg_time = Bot_Time() + range / 100 + 1; + //AIEnter_Battle_NBG(bs, "battle retreat: nbg"); + stateThread.SetState("state_BattleNBG"); + return SRESULT_DONE; + } + } + + MoveToCoverPoint(); + + if (bot_skill.GetInteger() > 1) + { + bs.firethrottlewait_time = 0; + } + + BotChooseWeapon( &bs ); + + BotAimAtEnemy( &bs ); + + //attack the enemy if possible + BotCheckAttack( &bs ); + + return SRESULT_WAIT; +} \ No newline at end of file diff --git a/src/game/bots/BotAI_SeekLTG.cpp b/src/game/bots/BotAI_SeekLTG.cpp new file mode 100644 index 00000000..37faad03 --- /dev/null +++ b/src/game/bots/BotAI_SeekLTG.cpp @@ -0,0 +1,49 @@ +// BotAI_SeekLTG.cpp +// + +#pragma hdrstop +#include "precompiled.h" +#include "../Game_local.h" + +/* +===================== +rvmBot::state_SeekLTG +===================== +*/ +stateResult_t rvmBot::state_SeekLTG(stateParms_t* parms) +{ + if( BotIsDead( &bs ) ) + { + stateThread.SetState("state_Respawn"); + return SRESULT_DONE; + } + + BotGetItemLongTermGoal( &bs, 0, &bs.currentGoal ); + + // No Enemy. + bs.enemy = -1; + + //if there is an enemy + if( BotFindEnemy( &bs, -1 ) ) + { + if( BotWantsToRetreat( &bs ) ) + { + //keep the current long term goal and retreat + //AIEnter_Battle_Retreat(bs, "seek ltg: found enemy"); + stateThread.SetState("state_Retreat"); + return SRESULT_DONE; + } + else + { + //trap_BotResetLastAvoidReach(bs.ms); + //empty the goal stack + botGoalManager.BotEmptyGoalStack( bs.gs ); + + //go fight + stateThread.SetState("state_BattleFight"); + return SRESULT_DONE; + } + } + + return SRESULT_WAIT; +} diff --git a/src/game/bots/BotAI_Seek_NBG.cpp b/src/game/bots/BotAI_Seek_NBG.cpp new file mode 100644 index 00000000..1852975c --- /dev/null +++ b/src/game/bots/BotAI_Seek_NBG.cpp @@ -0,0 +1,142 @@ +// BotAI_Seek_NBG.cpp +// + +#pragma hdrstop +#include "precompiled.h" +#include "../Game_local.h" + +/* +===================== +rvmBot::state_SeekNBG +===================== +*/ +stateResult_t rvmBot::state_SeekNBG(stateParms_t* parms) +{ + bot_goal_t goal; + idVec3 target, dir; + //bot_moveresult_t moveresult; + + //if (BotIsObserver(bs)) { + // AIEnter_Observer(bs, "seek nbg: observer"); + // return qfalse; + //} + ////if in the intermission + //if (BotIntermission(bs)) { + // AIEnter_Intermission(bs, "seek nbg: intermision"); + // return qfalse; + //} + + // respawn if dead. + if( BotIsDead( &bs ) ) + { + stateThread.SetState("state_Respawn"); + return SRESULT_DONE; + } + + //bs.tfl = TFL_DEFAULT; + //if (bot_grapple.integer) bs.tfl |= TFL_GRAPPLEHOOK; + ////if in lava or slime the bot should be able to get out + //if (BotInLavaOrSlime(bs)) bs.tfl |= TFL_LAVA | TFL_SLIME; + //// + //if (BotCanAndWantsToRocketJump(bs)) { + // bs.tfl |= TFL_ROCKETJUMP; + //} + ////map specific code + //BotMapScripts(bs); + //no enemy + bs.enemy = -1; + //if the bot has no goal + if( !botGoalManager.BotGetTopGoal( bs.gs, &goal ) ) + { + bs.nbg_time = 0; + } + //if the bot touches the current goal + else if( BotReachedGoal( &bs, &goal ) ) + { + BotChooseWeapon( &bs ); + bs.nbg_time = 0; + } + + if( bs.nbg_time < Bot_Time() ) + { + //pop the current goal from the stack + botGoalManager.BotPopGoal( bs.gs ); + //check for new nearby items right away + //NOTE: we canNOT reset the check_time to zero because it would create an endless loop of node switches + bs.check_time = Bot_Time() + 0.05; + //go back to seek ltg +// AIEnter_Seek_LTG(bs, "seek nbg: time out"); + stateThread.SetState("state_SeekLTG"); + return SRESULT_DONE; + } + + //predict obstacles + //if (BotAIPredictObstacles(bs, &goal)) + // return qfalse; + ////initialize the movement state + //BotSetupForMovement(bs); + ////move towards the goal + //trap_BotMoveToGoal(&moveresult, bs.ms, &goal, bs.tfl); + ////if the movement failed + //if (moveresult.failure) { + // //reset the avoid reach, otherwise bot is stuck in current area + // trap_BotResetAvoidReach(bs.ms); + // bs.nbg_time = 0; + //} + BotMoveToGoal( &bs, &goal ); + + //check if the bot is blocked + //BotAIBlocked(bs, &moveresult, qtrue); + //// + //BotClearPath(bs, &moveresult); + +// jmarshall - fix look at code. + //if the viewangles are used for the movement + //if (moveresult.flags & (MOVERESULT_MOVEMENTVIEWSET | MOVERESULT_MOVEMENTVIEW | MOVERESULT_SWIMVIEW)) { + // VectorCopy(moveresult.ideal_viewangles, bs.ideal_viewangles); + //} + ////if waiting for something + //else if (moveresult.flags & MOVERESULT_WAITING) { + // if (random() < bs.thinktime * 0.8) { + // BotRoamGoal(bs, target); + // VectorSubtract(target, bs.origin, dir); + // vectoangles(dir, bs.ideal_viewangles); + // bs.ideal_viewangles[2] *= 0.5; + // } + //} + //else if (!(bs.flags & BFL_IDEALVIEWSET)) { + // if (!trap_BotGetSecondGoal(bs.gs, &goal)) trap_BotGetTopGoal(bs.gs, &goal); + // if (trap_BotMovementViewTarget(bs.ms, &goal, bs.tfl, 300, target)) { + // VectorSubtract(target, bs.origin, dir); + // vectoangles(dir, bs.ideal_viewangles); + // } + // //FIXME: look at cluster portals? + // else vectoangles(moveresult.movedir, bs.ideal_viewangles); + // bs.ideal_viewangles[2] *= 0.5; + //} + ////if the weapon is used for the bot movement + //if (moveresult.flags & MOVERESULT_MOVEMENTWEAPON) bs.weaponnum = moveresult.weapon; +// jmarshall end + //if there is an enemy + if( BotFindEnemy( &bs, -1 ) ) + { + if( BotWantsToRetreat( &bs ) ) + { + //keep the current long term goal and retreat + //AIEnter_Battle_NBG(bs, "seek nbg: found enemy"); + stateThread.SetState("state_BattleNBG"); + return SRESULT_DONE; + } + else + { + //trap_BotResetLastAvoidReach(bs.ms); + //empty the goal stack + botGoalManager.BotEmptyGoalStack( bs.gs ); + //go fight + //AIEnter_Battle_Fight(bs, "seek nbg: found enemy"); + stateThread.SetState("state_BattleFight"); + return SRESULT_DONE; + } + } + return SRESULT_WAIT; +} \ No newline at end of file diff --git a/src/game/bots/BotAI_respawn.cpp b/src/game/bots/BotAI_respawn.cpp new file mode 100644 index 00000000..4fef75f6 --- /dev/null +++ b/src/game/bots/BotAI_respawn.cpp @@ -0,0 +1,33 @@ +// BotAI_respawn.cpp +// + +#pragma hdrstop +#include "precompiled.h" +#include "../Game_local.h" + +/* +===================== +rvmBot::state_Respawn +===================== +*/ +stateResult_t rvmBot::state_Respawn(stateParms_t* parms) +{ + if (parms->stage == 0) + { + bs.botinput.respawn = true; + parms->stage = 1; + return SRESULT_WAIT; + } + + if (parms->stage == 1) + { + if (spectating) + { + return SRESULT_WAIT; // Wait until we have moved from spectator back into the game. + } + } + + bs.botinput.respawn = false; + stateThread.SetState("state_SeekLTG"); + return SRESULT_DONE; +} \ No newline at end of file diff --git a/src/game/bots/Bot_Input.cpp b/src/game/bots/Bot_Input.cpp new file mode 100644 index 00000000..fabb7bb9 --- /dev/null +++ b/src/game/bots/Bot_Input.cpp @@ -0,0 +1,165 @@ +// Bot_Input.cpp +// + +#include "precompiled.h" +#pragma hdrstop + +#include "../Game_local.h" + +/* +============== +rvmBot::BotInputToUserCommand +============== +*/ +void rvmBot::BotInputToUserCommand(bot_input_t* bi, usercmd_t* ucmd, int time) +{ + idVec3 forward, right; + + short temp; + int j; + + //clear the whole structure +// memset(ucmd, 0, sizeof(usercmd_t)); + // + //common->Printf("dir = %f %f %f speed = %f\n", bi->dir[0], bi->dir[1], bi->dir[2], bi->speed); + //the duration for the user command in milli seconds + // + if (bi->actionflags & ACTION_DELAYEDJUMP) + { + bi->actionflags |= ACTION_JUMP; + bi->actionflags &= ~ACTION_DELAYEDJUMP; + } + //set the buttons + if (bi->actionflags & ACTION_RESPAWN) + { + ucmd->buttons = BUTTON_ATTACK; + } + if (bi->actionflags & ACTION_ATTACK) + { + ucmd->buttons |= BUTTON_ATTACK; + } + //if (bi->actionflags & ACTION_TALK) ucmd->buttons |= BUTTON_TALK; + //if (bi->actionflags & ACTION_GESTURE) ucmd->buttons |= BUTTON_GESTURE; + //if (bi->actionflags & ACTION_USE) ucmd->buttons |= BUTTON_USE_HOLDABLE; + if (bi->actionflags & ACTION_WALK) + { + ucmd->buttons |= BUTTON_RUN; + } + //if (bi->actionflags & ACTION_AFFIRMATIVE) ucmd->buttons |= BUTTON_AFFIRMATIVE; + //if (bi->actionflags & ACTION_NEGATIVE) ucmd->buttons |= BUTTON_NEGATIVE; + //if (bi->actionflags & ACTION_GETFLAG) ucmd->buttons |= BUTTON_GETFLAG; + //if (bi->actionflags & ACTION_GUARDBASE) ucmd->buttons |= BUTTON_GUARDBASE; + //if (bi->actionflags & ACTION_PATROL) ucmd->buttons |= BUTTON_PATROL; + //if (bi->actionflags & ACTION_FOLLOWME) ucmd->buttons |= BUTTON_FOLLOWME; + // + ucmd->impulse |= bi->weapon; + if (bi->lastWeaponNum != bi->weapon) + { + //ucmd->flags = UCF_IMPULSE_SEQUENCE; + bi->lastWeaponNum = bi->weapon; + } + else + { + //ucmd->flags = 0; + } + + idAngles botViewAngles = viewAngles; + + { + int i; + float move; + float angMod = (1.0f / 12.0f); + + for (i = 0; i < 3; i++) { + move = idMath::AngleDelta(bi->viewangles[i], botViewAngles[i]); + botViewAngles[i] += (move * angMod); + } + } + + //set the view angles + //NOTE: the ucmd->angles are the angles WITHOUT the delta angles + ucmd->angles[0] = ANGLE2SHORT(botViewAngles[0] - deltaViewAngles[0]); + ucmd->angles[1] = ANGLE2SHORT(botViewAngles[1] - deltaViewAngles[1]); + ucmd->angles[2] = ANGLE2SHORT(botViewAngles[2] - deltaViewAngles[2]); + + bi->viewangles.ToVectors(&forward, &right, NULL); + + //bot input speed is in the range [0, 400] + bi->speed = bi->speed * 127 / 400; + //set the view independent movement + ucmd->forwardmove = idMath::ClampChar(DotProduct(forward, bi->dir) * bi->speed); + ucmd->rightmove = idMath::ClampChar(DotProduct(right, bi->dir) * bi->speed); + //ucmd->upmove = abs(forward[2]) * bi->dir[2] * bi->speed; + + //normal keyboard movement + if (bi->actionflags & ACTION_MOVEFORWARD) + { + ucmd->forwardmove += 127; + } + if (bi->actionflags & ACTION_MOVEBACK) + { + ucmd->forwardmove -= 127; + } + if (bi->actionflags & ACTION_MOVELEFT) + { + ucmd->rightmove -= 127; + } + if (bi->actionflags & ACTION_MOVERIGHT) + { + ucmd->rightmove += 127; + } + + //jump/moveup + //if (bi->actionflags & ACTION_JUMP) + // ucmd->buttons |= BUTTON_JUMP; + + // ucmd->upmove += 127; + // + ////crouch/movedown + //if (bi->actionflags & ACTION_CROUCH) + // ucmd->upmove -= 127; + // + //Com_Printf("forward = %d right = %d up = %d\n", ucmd.forwardmove, ucmd.rightmove, ucmd.upmove); + //Com_Printf("ucmd->serverTime = %d\n", ucmd->serverTime); + + if( bi->respawn ) + { + ucmd->buttons |= BUTTON_ATTACK; + } +} + +/* +================ +rvmBot::ResetUcmd +================ +*/ +void rvmBot::Bot_ResetUcmd( usercmd_t& ucmd ) +{ + ucmd.forwardmove = 0; + ucmd.rightmove = 0; + //ucmd.upmove = 0; + ucmd.impulse = 0; + //ucmd.flags = 0; + memset( &ucmd.buttons, 0, sizeof( ucmd.buttons ) ); +} + + +/* +======================== +rvmBot::BotInputFrame +======================== +*/ +void rvmBot::BotInputFrame( void ) +{ + usercmd_t& ucmd = (usercmd_t &)gameLocal.usercmds[entityNumber]; + + ucmd.gameTime = gameLocal.time; + ucmd.gameFrame = gameLocal.framenum; + ucmd.duplicateCount = 0; + + Bot_ResetUcmd(ucmd); + BotInputToUserCommand( &bs.botinput, &ucmd, gameLocal.time ); + + // pass the bot's user cmds off to the engine, so that other clients can predict this bot + networkSystem->ServerSetBotUserCommand(entityNumber, gameLocal.framenum, ucmd); +} \ No newline at end of file diff --git a/src/game/bots/Bot_char.cpp b/src/game/bots/Bot_char.cpp new file mode 100644 index 00000000..7b37901d --- /dev/null +++ b/src/game/bots/Bot_char.cpp @@ -0,0 +1,353 @@ +// Bot_char.cpp +// + +#include "precompiled.h" +#include "../Game_local.h" + +idBotCharacterStatsManager botCharacterStatsManager; + +/* +==================== +idBotCharacterStatsManager::idBotCharacterStatsManager +==================== +*/ +idBotCharacterStatsManager::idBotCharacterStatsManager() +{ + default_char_profile = nullptr; +} + +/* +==================== +idBotCharacterStatsManager::Init +==================== +*/ +void idBotCharacterStatsManager::Init( void ) +{ + default_char_profile = BotLoadCharacterFromFile( "bots/default_c.c", 1 ); + if( default_char_profile == NULL ) + { + common->FatalError( "Failed to load default characteristic def file\n" ); + } +} + +/* +============================ +idBotCharacterStatsManager::AllocBotCharacter +============================ +*/ +bot_character_t* idBotCharacterStatsManager::AllocBotCharacter( void ) +{ + bot_character_t* ch = NULL; + + for( int i = 0; i < MAX_CHAR_STATS; i++ ) + { + if( charStatsList[i].inUse == false ) + { + charStatsList[i].inUse = true; + ch = &charStatsList[i]; + break; + } + } + + if( ch == nullptr ) + { + gameLocal.Error( "idBotCharacterStatsManager::AllocBotCharacter: Too many bot characters!" ); + return nullptr; + } + + if( default_char_profile == NULL ) + { + memset( &ch->c[0], 0, MAX_CHARACTERISTICS * sizeof( bot_characteristic_t ) ); + ch->filename = ""; + ch->inUse = false; + ch->skill = 0; + } + else + { + //memcpy( ch, default_char_profile, sizeof( bot_character_t ) + MAX_CHARACTERISTICS * sizeof( bot_characteristic_t ) ); + *ch = *default_char_profile; + } + + + + return ch; +} + +/* +============================ +idBotCharacterStatsManager::FreeCharacterFile +============================ +*/ +void idBotCharacterStatsManager::FreeCharacterFile( bot_character_t* ch ) +{ + ch->inUse = false; +} + +/* +============================ +idBotCharacterStatsManager::BotLoadCharacterFromFile +============================ +*/ +bot_character_t* idBotCharacterStatsManager::BotLoadCharacterFromFile( const char* charfile, int skill ) +{ + int indent, index; + bool foundcharacter; + bot_character_t* ch; + idParser parser; + idToken token; + + foundcharacter = false; + + // Check to see if we already loaded this bot file. + for( int i = 0; i < MAX_CHAR_STATS; i++ ) + { + if(charStatsList[i].inUse && charStatsList[i].filename == charfile ) + { + return &charStatsList[i]; + } + } + + rvmScopedLexerBaseFolder scopedBaseFolder( BOTFILESBASEFOLDER ); + + //a bot character is parsed in two phases + if( !parser.LoadFile( charfile ) ) + { + common->Warning( "BotLoadCharacterFromFile: counldn't load %s\n", charfile ); + return NULL; + } + + ch = AllocBotCharacter(); + ch->filename = charfile; + + while( parser.ReadToken( &token ) ) + { + if( token == "skill" ) + { + if( !parser.ExpectTokenType( TT_NUMBER, 0, &token ) ) + { + FreeCharacterFile( ch ); + parser.Warning( "Expected token type number\n" ); + return NULL; + } + + if( !parser.ExpectTokenString( "{" ) ) + { + FreeCharacterFile( ch ); + parser.Warning( "Expected token {\n" ); + return NULL; + } + + //if it's the correct skill + if( skill < 0 || token.GetIntValue() == skill ) + { + foundcharacter = true; + ch->skill = token.GetIntValue(); + while( parser.ReadToken( &token ) ) + { + if( token == "}" ) + { + break; + } + + if( token.type != TT_NUMBER || !( token.subtype & TT_INTEGER ) ) + { + FreeCharacterFile( ch ); + parser.Error( "expected integer index, found %s\n", token.c_str() ); + return NULL; + } + + index = token.GetIntValue(); + if( index < 0 || index > MAX_CHARACTERISTICS ) + { + FreeCharacterFile( ch ); + parser.Error( "characteristic index out of range [0, %d]\n", MAX_CHARACTERISTICS ); + return NULL; + } + // jmarshall - not sure what we loose by removing this check, basically duplicate definition check? + //if (ch->c[index].type) + //{ + // G_Error("characteristic %d already initialized\n", index); + // trap_PC_FreeSource(source); + // BotFreeCharacterStrings(ch); + // //FreeMemory(ch); + // return NULL; + //} + // jmarshall end + + if( !parser.ReadToken( &token ) ) + { + FreeCharacterFile( ch ); + parser.Error( "Unexpected EOF during parse characesistic" ); + return NULL; + } + + if( token.type == TT_NUMBER ) + { + if( token.subtype & TT_FLOAT ) + { + ch->c[index].value._float = token.GetFloatValue(); + ch->c[index].type = CT_FLOAT; + } + else + { + ch->c[index].value.integer = token.GetIntValue(); + ch->c[index].type = CT_INTEGER; + } + } + else if( token.type == TT_STRING ) + { + token.StripDoubleQuotes(); + ch->c[index].value.string = token; + ch->c[index].type = CT_STRING; + } + else + { + FreeCharacterFile( ch ); + gameLocal.Error( "expected integer, float or string, found %s\n", token.c_str() ); + return NULL; + } + } + break; + } + else + { + indent = 1; + while( indent ) + { + if( !parser.ReadToken( &token ) ) + { + FreeCharacterFile( ch ); + return NULL; + } + if( token == "{" ) + { + indent++; + } + else if( token == "}" ) + { + indent--; + } + } + } + } + else + { + FreeCharacterFile( ch ); + gameLocal.Error( "unknown definition %s\n", token.c_str() ); + return NULL; + } + } + + if( !foundcharacter ) + { + FreeCharacterFile( ch ); + return NULL; + } + + + return ch; +} + + +/* +============================ +idBotCharacterStatsManager::CheckCharacteristicIndex +============================ +*/ +int idBotCharacterStatsManager::CheckCharacteristicIndex( bot_character_t* ch, int index ) +{ + if( index < 0 || index >= MAX_CHARACTERISTICS ) + { + gameLocal.Error( "characteristic %d does not exist\n", index ); + return false; + } + if( !ch->c[index].type ) + { + gameLocal.Error( "characteristic %d is not initialized\n", index ); + return false; + } + return true; +} + +/* +============================ +idBotCharacterStatsManager::Characteristic_Float +============================ +*/ +float idBotCharacterStatsManager::Characteristic_Float( bot_character_t* ch, int index ) +{ + if( !ch ) + { + return 0; + } + //check if the index is in range + if( !CheckCharacteristicIndex( ch, index ) ) + { + return 0; + } + + if( ch->c[index].type == CT_INTEGER ) + { + //an integer will be converted to a float + return ( float )ch->c[index].value.integer; + } + else if( ch->c[index].type == CT_FLOAT ) + { + //floats are just returned + return ch->c[index].value._float; + } + + //cannot convert a string pointer to a float + gameLocal.Error( "characteristic %d is not a float\n", index ); + return 0; +} + +/* +============================ +Characteristic_String +============================ +*/ +void idBotCharacterStatsManager::Characteristic_String( bot_character_t* ch, int index, char* buf, int size ) +{ + //check if the index is in range + if( !CheckCharacteristicIndex( ch, index ) ) + { + return; + } + + //an integer will be converted to a float + if( ch->c[index].type == CT_STRING ) + { + strcpy( buf, ch->c[index].value.string ); + buf[size - 1] = '\0'; + return; + } + gameLocal.Error( "characteristic %d is not a string\n", index ); +} + +/* +============================ +idBotCharacterStatsManager::Characteristic_BFloat +============================ +*/ +float idBotCharacterStatsManager::Characteristic_BFloat( bot_character_t* ch, int index, float min, float max ) +{ + float value; + + if( min > max ) + { + gameLocal.Error( "cannot bound characteristic %d between %f and %f\n", index, min, max ); + return 0; + } + + value = Characteristic_Float( ch, index ); + if( value < min ) + { + return min; + } + if( value > max ) + { + return max; + } + return value; +} diff --git a/src/game/bots/Bot_char.h b/src/game/bots/Bot_char.h new file mode 100644 index 00000000..e73f29b0 --- /dev/null +++ b/src/game/bots/Bot_char.h @@ -0,0 +1,153 @@ +// Bot_char.h +// + +#define MAX_CHAR_STATS 256 + +//======================================================== +//======================================================== +//name +#define CHARACTERISTIC_NAME 0 //string +//gender of the bot +#define CHARACTERISTIC_GENDER 1 //string ("male", "female", "it") +//attack skill +// > 0.0 && < 0.2 = don't move +// > 0.3 && < 1.0 = aim at enemy during retreat +// > 0.0 && < 0.4 = only move forward/backward +// >= 0.4 && < 1.0 = circle strafing +// > 0.7 && < 1.0 = random strafe direction change +#define CHARACTERISTIC_ATTACK_SKILL 2 //float [0, 1] +//weapon weight file +#define CHARACTERISTIC_WEAPONWEIGHTS 3 //string +//view angle difference to angle change factor +#define CHARACTERISTIC_VIEW_FACTOR 4 //float <0, 1] +//maximum view angle change +#define CHARACTERISTIC_VIEW_MAXCHANGE 5 //float [1, 360] +//reaction time in seconds +#define CHARACTERISTIC_REACTIONTIME 6 //float [0, 5] +//accuracy when aiming +#define CHARACTERISTIC_AIM_ACCURACY 7 //float [0, 1] +//weapon specific aim accuracy +#define CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 8 //float [0, 1] +#define CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 9 //float [0, 1] +#define CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 10 //float [0, 1] +#define CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 11 //float [0, 1] +#define CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 12 +#define CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 13 //float [0, 1] +#define CHARACTERISTIC_AIM_ACCURACY_RAILGUN 14 +#define CHARACTERISTIC_AIM_ACCURACY_BFG10K 15 //float [0, 1] +//skill when aiming +// > 0.0 && < 0.9 = aim is affected by enemy movement +// > 0.4 && <= 0.8 = enemy linear leading +// > 0.8 && <= 1.0 = enemy exact movement leading +// > 0.5 && <= 1.0 = prediction shots when enemy is not visible +// > 0.6 && <= 1.0 = splash damage by shooting nearby geometry +#define CHARACTERISTIC_AIM_SKILL 16 //float [0, 1] +//weapon specific aim skill +#define CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 17 //float [0, 1] +#define CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 18 //float [0, 1] +#define CHARACTERISTIC_AIM_SKILL_PLASMAGUN 19 //float [0, 1] +#define CHARACTERISTIC_AIM_SKILL_BFG10K 20 //float [0, 1] +//======================================================== +//chat +//======================================================== +//file with chats +#define CHARACTERISTIC_CHAT_FILE 21 //string +//name of the chat character +#define CHARACTERISTIC_CHAT_NAME 22 //string +//characters per minute type speed +#define CHARACTERISTIC_CHAT_CPM 23 //integer [1, 4000] +//tendency to insult/praise +#define CHARACTERISTIC_CHAT_INSULT 24 //float [0, 1] +//tendency to chat misc +#define CHARACTERISTIC_CHAT_MISC 25 //float [0, 1] +//tendency to chat at start or end of level +#define CHARACTERISTIC_CHAT_STARTENDLEVEL 26 //float [0, 1] +//tendency to chat entering or exiting the game +#define CHARACTERISTIC_CHAT_ENTEREXITGAME 27 //float [0, 1] +//tendency to chat when killed someone +#define CHARACTERISTIC_CHAT_KILL 28 //float [0, 1] +//tendency to chat when died +#define CHARACTERISTIC_CHAT_DEATH 29 //float [0, 1] +//tendency to chat when enemy suicides +#define CHARACTERISTIC_CHAT_ENEMYSUICIDE 30 //float [0, 1] +//tendency to chat when hit while talking +#define CHARACTERISTIC_CHAT_HITTALKING 31 //float [0, 1] +//tendency to chat when bot was hit but didn't dye +#define CHARACTERISTIC_CHAT_HITNODEATH 32 //float [0, 1] +//tendency to chat when bot hit the enemy but enemy didn't dye +#define CHARACTERISTIC_CHAT_HITNOKILL 33 //float [0, 1] +//tendency to randomly chat +#define CHARACTERISTIC_CHAT_RANDOM 34 //float [0, 1] +//tendency to reply +#define CHARACTERISTIC_CHAT_REPLY 35 //float [0, 1] +//======================================================== +//movement +//======================================================== +//tendency to crouch +#define CHARACTERISTIC_CROUCHER 36 //float [0, 1] +//tendency to jump +#define CHARACTERISTIC_JUMPER 37 //float [0, 1] +//tendency to walk +#define CHARACTERISTIC_WALKER 48 //float [0, 1] +//tendency to jump using a weapon +#define CHARACTERISTIC_WEAPONJUMPING 38 //float [0, 1] +//tendency to use the grapple hook when available +#define CHARACTERISTIC_GRAPPLE_USER 39 //float [0, 1] //use this!! +//======================================================== +//goal +//======================================================== +//item weight file +#define CHARACTERISTIC_ITEMWEIGHTS 40 //string +//the aggression of the bot +#define CHARACTERISTIC_AGGRESSION 41 //float [0, 1] +//the self preservation of the bot (rockets near walls etc.) +#define CHARACTERISTIC_SELFPRESERVATION 42 //float [0, 1] +//how likely the bot is to take revenge +#define CHARACTERISTIC_VENGEFULNESS 43 //float [0, 1] //use this!! +//tendency to camp +#define CHARACTERISTIC_CAMPER 44 //float [0, 1] +//======================================================== +//======================================================== +//tendency to get easy frags +#define CHARACTERISTIC_EASY_FRAGGER 45 //float [0, 1] +//how alert the bot is (view distance) +#define CHARACTERISTIC_ALERTNESS 46 //float [0, 1] +//how much the bot fires it's weapon +#define CHARACTERISTIC_FIRETHROTTLE 47 //float [0, 1] + +// +// idBotCharacterStatsManager +// +class idBotCharacterStatsManager +{ +public: + idBotCharacterStatsManager(); + + // Inits the stats manager. + void Init( void ); + + // Loads a character file. + bot_character_t* BotLoadCharacterFromFile( const char* charfile, int skill ); + + // Free character file. + void FreeCharacterFile( bot_character_t* ch ); + + // Returns the default character stats profile. + bot_character_t* GetDefaultCharProfile( void ) + { + return default_char_profile; + } + + int CheckCharacteristicIndex( bot_character_t* ch, int index ); + float Characteristic_Float( bot_character_t* ch, int index ); + void Characteristic_String( bot_character_t* ch, int index, char* buf, int size ); + float Characteristic_BFloat( bot_character_t* ch, int index, float min, float max ); +private: + bot_character_t* AllocBotCharacter( void ); + + bot_character_t* default_char_profile; + + bot_character_t charStatsList[MAX_CHAR_STATS]; +}; + +extern idBotCharacterStatsManager botCharacterStatsManager; \ No newline at end of file diff --git a/src/game/bots/Bot_chat.cpp b/src/game/bots/Bot_chat.cpp new file mode 100644 index 00000000..22f07b5a --- /dev/null +++ b/src/game/bots/Bot_chat.cpp @@ -0,0 +1,54 @@ +// Bot_Chat.cpp +// + +#include "precompiled.h" +#include "../Game_local.h" + +const char *bot_kill_insult[] = { + "%s: Try aiming next time %s", + "%s: Trust me when I say this %s, you suck.", + "%s: Maybe you should go back to go cart racing %s?", + "%s: Your technique reminds me of a story %s, a very dull one." +}; + +const char* bot_death_insult[] = { + "%s: Mmmmmmm. Was it good for you too %s?", + "%s: Well I guess %s won the lottery.", + "%s: My mother fragged me once %s. Once.", + "%s: I'm gonna pull out your bowels %s", + "%s: Beginners luck %s... Again", + "%s: So %s... you're up to what ... 3 frags an hour?" +}; + +const char* bot_death_praise[] = { + "%s: %s not bad for an amateur.", + "%s: %s alright that was pretty good. Your still a dousche.", + "%s: That was definitely ... um ... pretty good %s", + "%s: I've seen better %s, but not many.", + "%s: Take a moment to reflect on your accomplishment %s", + "%s: Your pretty good for a dousche %s" +}; + +/* +==================== +rvmBot::BotSendChatMessage +==================== +*/ +void rvmBot::BotSendChatMessage(botChat_t chat, const char* targetName) { + switch (chat) + { + case KILL: + gameLocal.mpGame.AddChatLine(bot_kill_insult[rvRandom::irand(0, 3)], GetNetName(), targetName); + break; + case DEATH: + if (rvRandom::irand(0, 10) < 5) + { + gameLocal.mpGame.AddChatLine(bot_death_insult[rvRandom::irand(0, 5)], GetNetName(), targetName); + } + else + { + gameLocal.mpGame.AddChatLine(bot_death_praise[rvRandom::irand(0, 5)], GetNetName(), targetName); + } + break; + } +} \ No newline at end of file diff --git a/src/game/bots/Bot_chat.h b/src/game/bots/Bot_chat.h new file mode 100644 index 00000000..4a58488a --- /dev/null +++ b/src/game/bots/Bot_chat.h @@ -0,0 +1,9 @@ +// Bot_chat.h +// + +#pragma once + +enum botChat_t { + KILL = 0, + DEATH, +}; \ No newline at end of file diff --git a/src/game/bots/Bot_goal.cpp b/src/game/bots/Bot_goal.cpp new file mode 100644 index 00000000..48b780c1 --- /dev/null +++ b/src/game/bots/Bot_goal.cpp @@ -0,0 +1,2065 @@ +// Bot_goal.cpp +// + +#include "precompiled.h" +#include "../Game_local.h" + +idCVar bot_droppedweight( "bot_droppedweight", "1000", CVAR_CHEAT | CVAR_INTEGER, "" ); +idCVar bot_itemsfile( "bot_itemsfile", "items.c", CVAR_CHEAT, "" ); + +idBotGoalManager botGoalManager; + +/* +================== +idBotGoalManager::idBotGoalManager +================== +*/ +idBotGoalManager::idBotGoalManager() +{ + freelevelitems = NULL; + levelitems = NULL; +} + +/* +================== +idBotGoalManager::BotGoalStateFromHandle +================== +*/ +bot_goalstate_t* idBotGoalManager::BotGoalStateFromHandle( int handle ) +{ + if( handle <= 0 || handle > MAX_CLIENTS ) + { + gameLocal.Error( "goal state handle %d out of range\n", handle ); + return NULL; + } + + if( !botgoalstates[handle].InUse() ) + { + gameLocal.Error( "invalid goal state %d\n", handle ); + return NULL; + } + + return &botgoalstates[handle]; +} + +/* +================== +idBotGoalManager::BotInterbreedGoalFuzzyLogic +================== +*/ +void idBotGoalManager::BotInterbreedGoalFuzzyLogic( int parent1, int parent2, int child ) +{ + bot_goalstate_t* p1, * p2, * c; + + p1 = BotGoalStateFromHandle( parent1 ); + p2 = BotGoalStateFromHandle( parent2 ); + c = BotGoalStateFromHandle( child ); + + botFuzzyWeightManager.InterbreedWeightConfigs( p1->itemweightconfig, p2->itemweightconfig, c->itemweightconfig ); +} + +/* +======================== +idBotGoalManager::BotSaveGoalFuzzyLogic +======================== +*/ +void idBotGoalManager::BotSaveGoalFuzzyLogic( int goalstate, char* filename ) +{ + bot_goalstate_t* gs; + + gs = BotGoalStateFromHandle( goalstate ); + + //WriteWeightConfig(filename, gs->itemweightconfig); +} + +/* +======================== +idBotGoalManager::BotMutateGoalFuzzyLogic +======================== +*/ +void idBotGoalManager::BotMutateGoalFuzzyLogic( int goalstate, float range ) +{ + bot_goalstate_t* gs; + + gs = BotGoalStateFromHandle( goalstate ); + + botFuzzyWeightManager.EvolveWeightConfig( gs->itemweightconfig ); +} + +/* +======================== +idBotGoalManager::ParseItemInfo +======================== +*/ +void idBotGoalManager::ParseItemInfo( idParser& parser, iteminfo_t* itemInfo ) +{ + idToken token; + + parser.ExpectTokenString( "{" ); + + while( true ) + { + if( !parser.ReadToken( &token ) ) + { + parser.Error( "Unexpected end of file found while parsing weaponinfo!" ); + } + + if( token == "}" ) + { + break; + } + + if( token == "name" ) + { + idToken valueToken; + if( !parser.ReadToken( &valueToken ) ) + { + parser.Error( "Failed to read value token, encountered EOF parsing weapon info!" ); + } + itemInfo->name = valueToken; + } + else if( token == "model" ) + { + idToken valueToken; + if( !parser.ReadToken( &valueToken ) ) + { + parser.Error( "Failed to read value token, encountered EOF parsing weapon info!" ); + } + itemInfo->model = valueToken; + } + else if( token == "modelindex" ) + { + idToken valueToken; + if( !parser.ReadToken( &valueToken ) ) + { + parser.Error( "Failed to read value token, encountered EOF parsing weapon info!" ); + } + itemInfo->modelindex = valueToken.GetIntValue(); + } + else if( token == "type" ) + { + idToken valueToken; + if( !parser.ReadToken( &valueToken ) ) + { + parser.Error( "Failed to read value token, encountered EOF parsing weapon info!" ); + } + itemInfo->type = valueToken.GetIntValue(); + } + else if( token == "index" ) + { + idToken valueToken; + if( !parser.ReadToken( &valueToken ) ) + { + parser.Error( "Failed to read value token, encountered EOF parsing weapon info!" ); + } + itemInfo->index = valueToken.GetIntValue(); + } + else if( token == "respawntime" ) + { + idToken valueToken; + if( !parser.ReadToken( &valueToken ) ) + { + parser.Error( "Failed to read value token, encountered EOF parsing weapon info!" ); + } + itemInfo->respawntime = valueToken.GetIntValue(); + } + else if( token == "mins" ) + { + float value[3]; + if( !parser.Parse1DMatrixLegacy( 3, &value[0] ) ) + { + parser.Error( "Failed to read value token, encountered EOF parsing weapon info!" ); + } + itemInfo->mins.Set( value[0], value[1], value[2] ); + } + else if( token == "maxs" ) + { + float value[3]; + if( !parser.Parse1DMatrixLegacy( 3, &value[0] ) ) + { + parser.Error( "Failed to read value token, encountered EOF parsing weapon info!" ); + } + itemInfo->maxs.Set( value[0], value[1], value[2] ); + } + else + { + parser.Error( "ParseProjectileInfo: Unexpected token %s\n", token.c_str() ); + } + } +} + +/* +======================== +idBotGoalManager::LoadItemConfig +======================== +*/ +itemconfig_t* idBotGoalManager::LoadItemConfig( char* filename ) +{ + idToken token; + idStr path; + itemconfig_t ic; + iteminfo_t* ii; + idParser source; + + path = filename; + rvmScopedLexerBaseFolder scopedBaseFolder( BOTFILESBASEFOLDER ); + + if( !source.LoadFile( path ) ) + { + gameLocal.Error( "counldn't load %s\n", path.c_str() ); + return NULL; + } + + ic.Reset(); + + //parse the item config file + while( source.ReadToken( &token ) ) + { + if( token == "iteminfo" ) + { + if( ic.numiteminfo >= MAX_BOT_ITEM_INFO ) + { + source.Error( "more than %d item info defined\n", MAX_BOT_ITEM_INFO ); + return NULL; + } + + ii = &ic.iteminfo[ic.numiteminfo]; + if( !source.ExpectTokenType( TT_STRING, 0, &token ) ) + { + return NULL; + } + + token.StripDoubleQuotes(); + ii->classname = token; + + ParseItemInfo( source, ii ); + + ii->number = ic.numiteminfo; + ic.numiteminfo++; + } + else + { + gameLocal.Error( "unknown definition %s\n", token.c_str() ); + return NULL; + } + } + + if( !ic.numiteminfo ) + { + common->Warning( "no item info loaded\n" ); + } + + common->DPrintf( "loaded %s\n", path ); + itemconfiglocal = ic; + itemconfig = &itemconfiglocal; + + return itemconfig; +} + +/* +======================== +idBotGoalManager::ItemWeightIndex +======================== +*/ +int* idBotGoalManager::ItemWeightIndex( weightconfig_t* iwc, itemconfig_t* ic ) +{ + int* index, i; + + //initialize item weight index + index = new int[( sizeof( int ) * ic->numiteminfo )]; // jmarshall: Get this off of the heap! + + for( i = 0; i < ic->numiteminfo; i++ ) + { + index[i] = botFuzzyWeightManager.FindFuzzyWeight( iwc, ( char* )ic->iteminfo[i].classname.c_str() ); + if( index[i] < 0 ) + { + common->Warning( "item info %d \"%s\" has no fuzzy weight\r\n", i, ic->iteminfo[i].classname.c_str() ); + } + } + return index; +} + +/* +======================== +idBotGoalManager::InitLevelItemHeap +======================== +*/ +void idBotGoalManager::InitLevelItemHeap( void ) +{ + for( int i = 0; i < MAX_BOT_LEVEL_ITEMS - 1; i++ ) + { + levelitemheap[i].next = &levelitemheap[i + 1]; + } + + levelitemheap[MAX_BOT_LEVEL_ITEMS - 1].next = NULL; + + freelevelitems = levelitemheap; +} + +/* +======================== +idBotGoalManager::AllocLevelItem +======================== +*/ +levelitem_t* idBotGoalManager::AllocLevelItem( void ) +{ + levelitem_t* li; + + li = freelevelitems; + if( !li ) + { + gameLocal.Error( "out of level items\n" ); + return NULL; + } + + freelevelitems = freelevelitems->next; + //memset(li, 0, sizeof(levelitem_t)); + li->Reset(); + return li; +} + +/* +======================== +idBotGoalManager::FreeLevelItem +======================== +*/ +void idBotGoalManager::FreeLevelItem( levelitem_t* li ) +{ + li->next = freelevelitems; + freelevelitems = li; +} + +/* +======================== +idBotGoalManager::AddLevelItemToList +======================== +*/ +void idBotGoalManager::AddLevelItemToList( levelitem_t* li ) +{ + if( levelitems ) + { + levelitems->prev = li; + } + + li->prev = NULL; + li->next = levelitems; + levelitems = li; +} + +/* +======================== +idBotGoalManager::RemoveLevelItemFromList +======================== +*/ +void idBotGoalManager::RemoveLevelItemFromList( levelitem_t* li ) +{ + if( li->prev ) + { + li->prev->next = li->next; + } + else + { + levelitems = li->next; + } + if( li->next ) + { + li->next->prev = li->prev; + } +} + +/* +======================== +idBotGoalManager::BotFreeInfoEntities +======================== +*/ +void idBotGoalManager::BotFreeInfoEntities( void ) +{ + maplocation_t* ml, * nextml; + campspot_t* cs, * nextcs; + +// for (ml = maplocations; ml; ml = nextml) +// { +// nextml = ml->next; +// // jmarshall +// //FreeMemory(ml); +// // jmarshall end +// } + maplocations.Clear(); + //for (cs = campspots; cs; cs = nextcs) + //{ + // nextcs = cs->next; + // // jmarshall + // //FreeMemory(cs); + // // jmarshall end + //} + campspots.Clear(); +} + +/* +======================== +idBotGoalManager::BotInitInfoEntities +======================== +*/ +void idBotGoalManager::BotInitInfoEntities( void ) +{ + //char classname[MAX_EPAIRKEY]; + idStr classname; + maplocation_t* ml; + campspot_t* cs; + + BotFreeInfoEntities(); + + maplocations.Clear(); + campspots.Clear(); + + for( int i = 0; i < gameLocal.num_entities; i++ ) + { + idEntity* ent = gameLocal.entities[i]; + + if( ent == NULL ) + { + continue; + } + + classname = ent->spawnArgs.GetString( "classname" ); + + //map locations + if( classname == "target_location" ) + { + maplocation_t ml; + ml.origin = ent->GetPhysics()->GetOrigin(); + ml.name = ent->GetKey( "message" ); + maplocations.Append( ml ); + } + //camp spots + else if( classname == "info_camp" ) + { + //cs = (campspot_t*)G_AllocClearedMemory(sizeof(campspot_t)); + campspot_t cs; + cs.origin = ent->GetPhysics()->GetOrigin(); + cs.name = ent->GetKey( "message" ); + cs.range = ent->GetFloat( "range" ); + cs.weight = ent->GetFloat( "weight" ); + cs.wait = ent->GetFloat( "wait" ); + cs.random = ent->GetFloat( "random" ); + campspots.Append( cs ); + } + } + common->Printf( "%d map locations\n", maplocations.Num() ); + common->Printf( "%d camp spots\n", campspots.Num() ); +} + +/* +======================= +idBotGoalManager::InitLevelItems +======================= +*/ +void idBotGoalManager::InitLevelItems( void ) +{ + int i, spawnflags, value; + idStr classname; + idVec3 origin, end; + int ent, goalareanum; + itemconfig_t* ic; + levelitem_t* li; + //bsp_trace_t trace; + + //initialize the map locations and camp spots + BotInitInfoEntities(); + + //initialize the level item heap + InitLevelItemHeap(); + levelitems = NULL; + numlevelitems = 0; + + ic = itemconfig; + if( !ic ) + { + return; + } + + //update the modelindexes of the item info + //for (i = 0; i < ic->numiteminfo; i++) + //{ + // if (!ic->iteminfo[i].modelindex) + // { + // Log_Write("item %s has modelindex 0", ic->iteminfo[i].classname); + // } + //} + + //for (ent = AAS_NextBSPEntity(0); ent; ent = AAS_NextBSPEntity(ent)) + for( int idx = 0; idx < gameLocal.num_entities; idx++ ) + { + idItem* ent = gameLocal.entities[idx]->Cast(); + + if( ent == nullptr ) + { + continue; + } + + spawnflags = ent->GetInt( "spawnflags" ); + classname = ent->spawnArgs.GetString( "classname" ); + + for( i = 0; i < ic->numiteminfo; i++ ) + { + if( !strcmp( classname, ic->iteminfo[i].classname ) ) + { + break; + } + } + if( i >= ic->numiteminfo ) + { + gameLocal.Warning( "entity %s unknown item\r\n", classname.c_str() ); + continue; + } + + //get the origin of the item. + origin = ent->GetPhysics()->GetOrigin(); + goalareanum = 0; + // jmarshall - fix floating items + //if it is a floating item + //if (spawnflags & 1) + //{ + // //if the item is not floating in water + // if (!(AAS_PointContents(origin) & CONTENTS_WATER)) + // { + // VectorCopy(origin, end); + // end[2] -= 32; + // trace = AAS_Trace(origin, ic->iteminfo[i].mins, ic->iteminfo[i].maxs, end, -1, CONTENTS_SOLID | CONTENTS_PLAYERCLIP); + // //if the item not near the ground + // if (trace.fraction >= 1) + // { + // //if the item is not reachable from a jumppad + // goalareanum = AAS_BestReachableFromJumpPadArea(origin, ic->iteminfo[i].mins, ic->iteminfo[i].maxs); + // Log_Write("item %s reachable from jumppad area %d\r\n", ic->iteminfo[i].classname, goalareanum); + // //G_Printf( "item %s reachable from jumppad area %d\r\n", ic->iteminfo[i].classname, goalareanum); + // if (!goalareanum) continue; + // } //end if + // } //end if + //} //end if + // jmarshall end + + li = AllocLevelItem(); + if( !li ) + { + return; + } + + li->number = ++numlevelitems; + li->timeout = 0; + li->item = ent; + li->name = classname; + + li->flags = 0; + if( ent->GetBool( "notfree" ) ) + { + li->flags |= IFL_NOTFREE; + } + if( ent->GetBool( "notteam" ) ) + { + li->flags |= IFL_NOTTEAM; + } + if( ent->GetBool( "notsingle" ) ) + { + li->flags |= IFL_NOTSINGLE; + } + if( ent->GetBool( "notbot" ) ) + { + li->flags |= IFL_NOTBOT; + } + + if( classname == "item_botroam" ) + { + li->flags |= IFL_ROAM; + //AAS_FloatForBSPEpairKey(ent, "weight", &li->weight); + li->weight = ent->GetFloat( "weight" ); + } + + ////if not a stationary item + //if (!(spawnflags & 1)) + //{ + // if (!AAS_DropToFloor(origin, ic->iteminfo[i].mins, ic->iteminfo[i].maxs)) + // { + // G_Printf( "%s in solid at (%1.1f %1.1f %1.1f)\n", + // classname, origin[0], origin[1], origin[2]); + // } //end if + //} //end if + + //item info of the level item + li->iteminfo = i; + + //origin of the item + VectorCopy( origin, li->origin ); + VectorCopy( origin, li->goalorigin ); + + AddLevelItemToList( li ); + } + gameLocal.Printf( "found %d level items\n", numlevelitems ); +} + +/* +======================= +idBotGoalManager::BotGoalName +======================= +*/ +void idBotGoalManager::BotGoalName( int number, char* name, int size ) +{ + levelitem_t* li; + + if( !itemconfig ) + { + return; + } + + for( li = levelitems; li; li = li->next ) + { + if( li->number == number ) + { + name[size - 1] = '\0'; + strcpy( name, itemconfig->iteminfo[li->iteminfo].name ); + return; + } + } +} + +/* +======================= +idBotGoalManager::BotResetAvoidGoals +======================= +*/ +void idBotGoalManager::BotResetAvoidGoals( int goalstate ) +{ + bot_goalstate_t* gs; + + gs = BotGoalStateFromHandle( goalstate ); + if( !gs ) + { + return; + } + memset( gs->avoidgoals, 0, MAX_AVOIDGOALS * sizeof( int ) ); + memset( gs->avoidgoaltimes, 0, MAX_AVOIDGOALS * sizeof( float ) ); +} + +/* +======================= +idBotGoalManager::BotResetAvoidGoals +======================= +*/ +void idBotGoalManager::BotDumpAvoidGoals( int goalstate ) +{ + int i; + bot_goalstate_t* gs; + char name[32]; + + gs = BotGoalStateFromHandle( goalstate ); + if( !gs ) + { + return; + } + for( i = 0; i < MAX_AVOIDGOALS; i++ ) + { + if( gs->avoidgoaltimes[i] >= Bot_Time() ) + { + BotGoalName( gs->avoidgoals[i], name, 32 ); + //Log_Write("avoid goal %s, number %d for %f seconds", name, + // gs->avoidgoals[i], gs->avoidgoaltimes[i] - AAS_Time()); + } + } +} + +/* +======================= +idBotGoalManager::BotAddToAvoidGoals +======================= +*/ +void idBotGoalManager::BotAddToAvoidGoals( bot_goalstate_t* gs, int number, float avoidtime ) +{ + int i; + + for( i = 0; i < MAX_AVOIDGOALS; i++ ) + { + //if the avoid goal is already stored + if( gs->avoidgoals[i] == number ) + { + gs->avoidgoals[i] = number; + gs->avoidgoaltimes[i] = Bot_Time() + avoidtime; + return; + } + } + + for( i = 0; i < MAX_AVOIDGOALS; i++ ) + { + //if this avoid goal has expired + if( gs->avoidgoaltimes[i] < Bot_Time() ) + { + gs->avoidgoals[i] = number; + gs->avoidgoaltimes[i] = Bot_Time() + avoidtime; + return; + } + } +} + +/* +======================= +idBotGoalManager::BotAddToAvoidGoals +======================= +*/ +void idBotGoalManager::BotRemoveFromAvoidGoals( int goalstate, int number ) +{ + int i; + bot_goalstate_t* gs; + + gs = BotGoalStateFromHandle( goalstate ); + if( !gs ) + { + return; + } + + //don't use the goals the bot wants to avoid + for( i = 0; i < MAX_AVOIDGOALS; i++ ) + { + if( gs->avoidgoals[i] == number && gs->avoidgoaltimes[i] >= Bot_Time() ) + { + gs->avoidgoaltimes[i] = 0; + return; + } + } +} + +/* +======================= +idBotGoalManager::BotAvoidGoalTime +======================= +*/ +float idBotGoalManager::BotAvoidGoalTime( int goalstate, int number ) +{ + int i; + bot_goalstate_t* gs; + + gs = BotGoalStateFromHandle( goalstate ); + if( !gs ) + { + return 0; + } + + //don't use the goals the bot wants to avoid + for( i = 0; i < MAX_AVOIDGOALS; i++ ) + { + if( gs->avoidgoals[i] == number && gs->avoidgoaltimes[i] >= Bot_Time() ) + { + return gs->avoidgoaltimes[i] - Bot_Time(); + } + } + return 0; +} + +/* +======================= +idBotGoalManager::BotSetAvoidGoalTime +======================= +*/ +void idBotGoalManager::BotSetAvoidGoalTime( int goalstate, int number, float avoidtime ) +{ + bot_goalstate_t* gs; + levelitem_t* li; + + gs = BotGoalStateFromHandle( goalstate ); + if( !gs ) + { + return; + } + if( avoidtime < 0 ) + { + if( !itemconfig ) + { + return; + } + + for( li = levelitems; li; li = li->next ) + { + if( li->number == number ) + { + avoidtime = itemconfig->iteminfo[li->iteminfo].respawntime; + if( !avoidtime ) + { + avoidtime = AVOID_DEFAULT_TIME; + } + if( avoidtime < AVOID_MINIMUM_TIME ) + { + avoidtime = AVOID_MINIMUM_TIME; + } + BotAddToAvoidGoals( gs, number, avoidtime ); + return; + } + } + return; + } + else + { + BotAddToAvoidGoals( gs, number, avoidtime ); + } +} + +/* +======================= +idBotGoalManager::BotGetLevelItemGoal +======================= +*/ +int idBotGoalManager::BotGetLevelItemGoal( int index, char* name, bot_goal_t* goal ) +{ + levelitem_t* li; + + if( !itemconfig ) + { + return -1; + } + li = levelitems; + if( index >= 0 ) + { + for( ; li; li = li->next ) + { + if( li->number == index ) + { + li = li->next; + break; + } + } + } + + for( ; li; li = li->next ) + { + if( gameLocal.gameType == GAME_SP ) + { + if( li->flags & IFL_NOTSINGLE ) + { + continue; + } + } + else if( gameLocal.gameType >= GAME_TDM ) + { + if( li->flags & IFL_NOTTEAM ) + { + continue; + } + } + else + { + if( li->flags & IFL_NOTFREE ) + { + continue; + } + } + if( li->flags & IFL_NOTBOT ) + { + continue; + } + + if( itemconfig->iteminfo[li->iteminfo].name == name ) + { +// goal->areanum = li->goalareanum; + goal->origin = li->goalorigin; + goal->entitynum = li->item->entityNumber; + goal->mins = itemconfig->iteminfo[li->iteminfo].mins; + goal->maxs = itemconfig->iteminfo[li->iteminfo].maxs; + goal->number = li->number; + goal->flags = GFL_ITEM; + if( li->timeout ) + { + goal->flags |= GFL_DROPPED; + } + //G_Printf( "found li %s\n", itemconfig->iteminfo[li->iteminfo].name); + return li->number; + } + } + return -1; +} + +/* +========================= +idBotGoalManager::BotGetMapLocationGoal +========================= +*/ +int idBotGoalManager::BotGetMapLocationGoal( char* name, bot_goal_t* goal ) +{ + maplocation_t* ml; + idVec3 mins( -8, -8, -8 ); + idVec3 maxs( 8, 8, 8 ); + + for( int i = 0; i < maplocations.Num(); i++ ) + { + ml = &maplocations[i]; + if( ml->name == name ) + { + goal->areanum = ml->areanum; + VectorCopy( ml->origin, goal->origin ); + goal->entitynum = 0; + VectorCopy( mins, goal->mins ); + VectorCopy( maxs, goal->maxs ); + return true; + } + } + return false; +} + +/* +========================= +idBotGoalManager::BotGetNextCampSpotGoal +========================= +*/ +int idBotGoalManager::BotGetNextCampSpotGoal( int num, bot_goal_t* goal ) +{ + int i; + campspot_t* cs; + idVec3 mins( -8, -8, -8 ); + idVec3 maxs( 8, 8, 8 ); + + if( num < 0 ) + { + num = 0; + } + i = num; + for( int d = 0; d < campspots.Num(); d++ ) + { + cs = &campspots[d]; + if( --i < 0 ) + { + goal->areanum = cs->areanum; + VectorCopy( cs->origin, goal->origin ); + goal->entitynum = 0; + VectorCopy( mins, goal->mins ); + VectorCopy( maxs, goal->maxs ); + return num + 1; + } + } + return 0; +} + +/* +============================ +idBotGoalManager::BotFindEntityForLevelItem +============================ +*/ +void idBotGoalManager::BotFindEntityForLevelItem( levelitem_t* li ) +{ + int ent, modelindex; + itemconfig_t* ic; + //aas_entityinfo_t entinfo; + idVec3 dir; + + ic = itemconfig; + if( !itemconfig ) + { + return; + } + for( int idx = 0; idx < gameLocal.num_entities; idx++ ) + { + idItem* ent = gameLocal.entities[idx]->Cast(); + + if( ent == NULL ) + { + continue; + } + + //get the model index of the entity + modelindex = ent->GetModelIndex(); + + if( !modelindex ) + { + continue; + } + + // jmarshall - eval moving objects + //get info about the entity + //AAS_EntityInfo(ent, &entinfo); + //if the entity is still moving + //if (entinfo.origin[0] != entinfo.lastvisorigin[0] || + // entinfo.origin[1] != entinfo.lastvisorigin[1] || + // entinfo.origin[2] != entinfo.lastvisorigin[2]) continue; + // + // jmarshall end + if( ic->iteminfo[li->iteminfo].modelindex == modelindex ) + { + //check if the entity is very close + idVec3 dir = li->origin - ent->GetPhysics()->GetOrigin(); + + if( dir.Length() < 30 ) + { + //found an entity for this level item + li->item = ent; + } + } + } +} + +/* +======================== +UpdateEntityItems +======================== +*/ + +//NOTE: enum entityType_t in bg_public.h +#define ET_ITEM 2 + +void idBotGoalManager::UpdateEntityItems( void ) +{ + int i, modelindex; + idVec3 dir; + levelitem_t* li, * nextli; + itemconfig_t* ic; + + //timeout current entity items if necessary + for( li = levelitems; li; li = nextli ) + { + nextli = li->next; + //if it is a item that will time out + if( li->timeout ) + { + //timeout the item + if( li->timeout < Bot_Time() ) + { + RemoveLevelItemFromList( li ); + FreeLevelItem( li ); + } + } + } + + //find new entity items + ic = itemconfig; + if( !itemconfig ) + { + return; + } + // + for( int idx = 0; idx < gameLocal.num_entities; idx++ ) + { + idItem* ent = gameLocal.entities[idx]->Cast(); + + if( ent == nullptr ) + { + continue; + } + + //get the model index of the entity + modelindex = ent->GetModelIndex(); + + if( !modelindex ) + { + continue; + } + // jmarshall - eval floating items. + ////get info about the entity + //AAS_EntityInfo(ent, &entinfo); + ////FIXME: don't do this + ////skip all floating items for now + ////if (entinfo.groundent != ENTITYNUM_WORLD) continue; + ////if the entity is still moving + //if (entinfo.origin[0] != entinfo.lastvisorigin[0] || + // entinfo.origin[1] != entinfo.lastvisorigin[1] || + // entinfo.origin[2] != entinfo.lastvisorigin[2]) continue; + // jmarshall end + + //check if the entity is already stored as a level item + for( li = levelitems; li; li = li->next ) + { + //if the level item is linked to an entity + if( li->item && li->item == ent ) + { + //the entity is re-used if the models are different + if( ic->iteminfo[li->iteminfo].modelindex != modelindex ) + { + //remove this level item + RemoveLevelItemFromList( li ); + FreeLevelItem( li ); + li = NULL; + break; + } + else + { + //if (entinfo.origin[0] != li->origin[0] || + // entinfo.origin[1] != li->origin[1] || + // entinfo.origin[2] != li->origin[2]) + //{ + // VectorCopy(entinfo.origin, li->origin); + // //also update the goal area number + // li->goalareanum = AAS_BestReachableArea(li->origin, + // ic->iteminfo[li->iteminfo].mins, ic->iteminfo[li->iteminfo].maxs, + // li->goalorigin); + //} //end if + li->origin = ent->GetPhysics()->GetOrigin(); + break; + } + } + } + if( li ) + { + continue; + } + + //try to link the entity to a level item + for( li = levelitems; li; li = li->next ) + { + //if this level item is already linked + if( li->item ) + { + continue; + } + // + if( gameLocal.gameType == GAME_SP ) + { + if( li->flags & IFL_NOTSINGLE ) + { + continue; + } + } + else if( gameLocal.gameType >= GAME_TDM ) + { + if( li->flags & IFL_NOTTEAM ) + { + continue; + } + } + else + { + if( li->flags & IFL_NOTFREE ) + { + continue; + } + } + + //if the model of the level item and the entity are the same + if( ic->iteminfo[li->iteminfo].modelindex == modelindex ) + { + //check if the entity is very close + dir = li->origin - ent->GetPhysics()->GetOrigin(); + if( dir.Length() < 30 ) + { + //found an entity for this level item + li->item = ent; + //if the origin is different + //if (entinfo.origin[0] != li->origin[0] || + // entinfo.origin[1] != li->origin[1] || + // entinfo.origin[2] != li->origin[2]) + //{ + // //update the level item origin + // VectorCopy(ent->r.currentOrigin, li->origin); + // //also update the goal area number + // li->goalareanum = AAS_BestReachableArea(li->origin, + // ic->iteminfo[li->iteminfo].mins, ic->iteminfo[li->iteminfo].maxs, + // li->goalorigin); + //} //end if + + //update the level item origin + //VectorCopy(ent->r.currentOrigin, li->origin); + li->origin = ent->GetPhysics()->GetOrigin(); + break; + } + } + } + + if( li ) + { + continue; + } + //check if the model is from a known item + for( i = 0; i < ic->numiteminfo; i++ ) + { + if( ic->iteminfo[i].modelindex == modelindex ) + { + break; + } + } + + //if the model is not from a known item + if( i >= ic->numiteminfo ) + { + continue; + } + //allocate a new level item + li = AllocLevelItem(); + + if( !li ) + { + continue; + } + + //entity number of the level item + li->item = ent; + + //number for the level item + li->number = ent->entityNumber; + + //set the item info index for the level item + li->iteminfo = i; + + //origin of the item + //VectorCopy(ent->r.currentOrigin, li->origin); + li->origin = ent->GetPhysics()->GetOrigin(); + + // jmarshall - fix this, bots, jump pads, and droppable items, bad combo. + //get the item goal area and goal origin + //li->goalareanum = AAS_BestReachableArea(li->origin, + // ic->iteminfo[i].mins, ic->iteminfo[i].maxs, + // li->goalorigin); + ////never go for items dropped into jumppads + //if (AAS_AreaJumpPad(li->goalareanum)) + //{ + // FreeLevelItem(li); + // continue; + //} //end if + // jmarshall end + //time this item out after 30 seconds + //dropped items disappear after 30 seconds + li->timeout = Bot_Time() + 30; + //add the level item to the list + AddLevelItemToList( li ); + //G_Printf( "found new level item %s\n", ic->iteminfo[i].classname); + } +} + +/* +==================== +idBotGoalManager::BotDumpGoalStack +==================== +*/ +void idBotGoalManager::BotDumpGoalStack( int goalstate ) +{ + int i; + bot_goalstate_t* gs; + char name[32]; + + gs = BotGoalStateFromHandle( goalstate ); + if( !gs ) + { + return; + } + for( i = 1; i <= gs->goalstacktop; i++ ) + { + BotGoalName( gs->goalstack[i].number, name, 32 ); + common->Printf( "%d: %s", i, name ); + } +} + +/* +==================== +BotPushGoal +==================== +*/ +void idBotGoalManager::BotPushGoal( int goalstate, bot_goal_t* goal ) +{ + bot_goalstate_t* gs; + + gs = BotGoalStateFromHandle( goalstate ); + if( !gs ) + { + return; + } + if( gs->goalstacktop >= MAX_GOALSTACK - 1 ) + { + gameLocal.Error( "goal heap overflow\n" ); + BotDumpGoalStack( goalstate ); + return; + } + gs->goalstacktop++; + gs->goalstack[gs->goalstacktop] = *goal; +} + +/* +==================== +idBotGoalManager::BotPopGoal +==================== +*/ +void idBotGoalManager::BotPopGoal( int goalstate ) +{ + bot_goalstate_t* gs; + + gs = BotGoalStateFromHandle( goalstate ); + if( !gs ) + { + return; + } + if( gs->goalstacktop > 0 ) + { + gs->goalstacktop--; + } +} + +/* +==================== +idBotGoalManager::BotEmptyGoalStack +==================== +*/ +void idBotGoalManager::BotEmptyGoalStack( int goalstate ) +{ + bot_goalstate_t* gs; + + gs = BotGoalStateFromHandle( goalstate ); + if( !gs ) + { + return; + } + gs->goalstacktop = 0; +} + +/* +==================== +idBotGoalManager::BotGetTopGoal +==================== +*/ +int idBotGoalManager::BotGetTopGoal( int goalstate, bot_goal_t* goal ) +{ + bot_goalstate_t* gs; + + gs = BotGoalStateFromHandle( goalstate ); + if( !gs ) + { + return false; + } + if( !gs->goalstacktop ) + { + return false; + } + memcpy( goal, &gs->goalstack[gs->goalstacktop], sizeof( bot_goal_t ) ); + return true; +} + +/* +==================== +idBotGoalManager::BotGetSecondGoal +==================== +*/ +int idBotGoalManager::BotGetSecondGoal( int goalstate, bot_goal_t* goal ) +{ + bot_goalstate_t* gs; + + gs = BotGoalStateFromHandle( goalstate ); + if( !gs ) + { + return false; + } + if( gs->goalstacktop <= 1 ) + { + return false; + } + memcpy( goal, &gs->goalstack[gs->goalstacktop - 1], sizeof( bot_goal_t ) ); + return true; +} + +/* +==================== +idBotGoalManager::BotChooseLTGItem +==================== +*/ +int idBotGoalManager::BotChooseLTGItem( int goalstate, idVec3 origin, int* inventory, int travelflags ) +{ + int t, weightnum; + float weight, bestweight, avoidtime; + iteminfo_t* iteminfo; + itemconfig_t* ic; + levelitem_t* li, * bestitem; + bot_goal_t goal; + bot_goalstate_t* gs; + + gs = BotGoalStateFromHandle( goalstate ); + if( !gs ) + { + return false; + } + if( !gs->itemweightconfig ) + { + return false; + } + + //get the area the bot is in + //areanum = BotReachabilityArea(origin, gs->client); + //if the bot is in solid or if the area the bot is in has no reachability links + //if (!areanum || !AAS_AreaReachability(areanum)) + //{ + // //use the last valid area the bot was in + // areanum = gs->lastreachabilityarea; + //} //end if + //remember the last area with reachabilities the bot was in + //gs->lastreachabilityarea = areanum; + //if still in solid + //if (!areanum) + // return qfalse; + //the item configuration + ic = itemconfig; + if( !itemconfig ) + { + return false; + } + //best weight and item so far + bestweight = 0; + bestitem = NULL; + memset( &goal, 0, sizeof( bot_goal_t ) ); + //go through the items in the level + for( li = levelitems; li; li = li->next ) + { + if( gameLocal.gameType == GAME_SP ) + { + if( li->flags & IFL_NOTSINGLE ) + { + continue; + } + } + else if( gameLocal.gameType >= GAME_TDM ) + { + if( li->flags & IFL_NOTTEAM ) + { + continue; + } + } + else + { + if( li->flags & IFL_NOTFREE ) + { + continue; + } + } + if( li->flags & IFL_NOTBOT ) + { + continue; + } + //if the item is not in a possible goal area + //if (!li->goalareanum) + // continue; + //FIXME: is this a good thing? added this for items that never spawned into the game (f.i. CTF flags in obelisk) + if( !li->item && !( li->flags & IFL_ROAM ) ) + { + continue; + } + //get the fuzzy weight function for this item + iteminfo = &ic->iteminfo[li->iteminfo]; + weightnum = gs->itemweightindex[iteminfo->number]; + if( weightnum < 0 ) + { + continue; + } + +#ifdef UNDECIDEDFUZZY + weight = FuzzyWeightUndecided( inventory, gs->itemweightconfig, weightnum ); +#else + weight = botFuzzyWeightManager.FuzzyWeight( inventory, gs->itemweightconfig, weightnum ); +#endif //UNDECIDEDFUZZY +#ifdef DROPPEDWEIGHT + //HACK: to make dropped items more attractive + if( li->timeout ) + { + weight += bot_droppedweight.GetFloat(); //GetValueFromLibVar(droppedweight); + } +#endif //DROPPEDWEIGHT + //use weight scale for item_botroam + if( li->flags & IFL_ROAM ) + { + weight *= li->weight; + } + // + if( weight > 0 ) + { + //get the travel time towards the goal area +// jmarshall + //t = AAS_AreaTravelTimeToGoalArea(areanum, origin, li->goalareanum, travelflags); + t = gameLocal.TravelTimeToGoal( origin, li->goalorigin ); + // jmarshall end + + //if the goal is reachable + if( t > 0 ) + { + //if this item won't respawn before we get there + avoidtime = BotAvoidGoalTime( goalstate, li->number ); + if( avoidtime - t * 0.009 > 0 ) + { + continue; + } + + weight /= ( float )t * TRAVELTIME_SCALE; + + if( weight > bestweight ) + { + bestweight = weight; + bestitem = li; + } + } + } + } + + //if no goal item found + if( !bestitem ) + { + /* + //if not in lava or slime + if (!AAS_AreaLava(areanum) && !AAS_AreaSlime(areanum)) + { + if (AAS_RandomGoalArea(areanum, travelflags, &goal.areanum, goal.origin)) + { + VectorSet(goal.mins, -15, -15, -15); + VectorSet(goal.maxs, 15, 15, 15); + goal.entitynum = 0; + goal.number = 0; + goal.flags = GFL_ROAM; + goal.iteminfo = 0; + //push the goal on the stack + BotPushGoal(goalstate, &goal); + // + #ifdef DEBUG + G_Printf( "chosen roam goal area %d\n", goal.areanum); + #endif //DEBUG + return qtrue; + } //end if + } //end if + */ + return false; + } + + //create a bot goal for this item + iteminfo = &ic->iteminfo[bestitem->iteminfo]; + VectorCopy( bestitem->goalorigin, goal.origin ); + VectorCopy( iteminfo->mins, goal.mins ); + VectorCopy( iteminfo->maxs, goal.maxs ); +// goal.areanum = bestitem->goalareanum; + goal.entitynum = bestitem->item->entityNumber; + goal.number = bestitem->number; + goal.flags = GFL_ITEM; + if( bestitem->timeout ) + { + goal.flags |= GFL_DROPPED; + } + if( bestitem->flags & IFL_ROAM ) + { + goal.flags |= GFL_ROAM; + } + goal.iteminfo = bestitem->iteminfo; + //if it's a dropped item + if( bestitem->timeout ) + { + avoidtime = AVOID_DROPPED_TIME; + } + else + { + avoidtime = iteminfo->respawntime; + if( !avoidtime ) + { + avoidtime = AVOID_DEFAULT_TIME; + } + if( avoidtime < AVOID_MINIMUM_TIME ) + { + avoidtime = AVOID_MINIMUM_TIME; + } + } + + //add the chosen goal to the goals to avoid for a while + BotAddToAvoidGoals( gs, bestitem->number, avoidtime ); + + //push the goal on the stack + BotPushGoal( goalstate, &goal ); + + return true; +} + +/* +==================== +idBotGoalManager::BotChooseNBGItem +==================== +*/ +int idBotGoalManager::BotChooseNBGItem( int goalstate, idVec3 origin, int* inventory, int travelflags, bot_goal_t* ltg, float maxtime ) +{ + int areanum, t, weightnum, ltg_time; + float weight, bestweight, avoidtime; + iteminfo_t* iteminfo; + itemconfig_t* ic; + levelitem_t* li, * bestitem; + bot_goal_t goal; + bot_goalstate_t* gs; + + gs = BotGoalStateFromHandle( goalstate ); + if( !gs ) + { + return false; + } + if( !gs->itemweightconfig ) + { + return false; + } + //get the area the bot is in +// jmarshall + areanum = 1; // BotReachabilityArea(origin, gs->client); +// jmarshall end + //if the bot is in solid or if the area the bot is in has no reachability links + //if (!areanum || !AAS_AreaReachability(areanum)) + //{ + // //use the last valid area the bot was in + // areanum = gs->lastreachabilityarea; + //} //end if + //remember the last area with reachabilities the bot was in + gs->lastreachabilityarea = areanum; + //if still in solid + if( !areanum ) + { + return false; + } + // jmarshall + if( ltg ) + { + //ltg_time = AAS_AreaTravelTimeToGoalArea(areanum, origin, ltg->areanum, travelflags); + ltg_time = gameLocal.TravelTimeToGoal( origin, ltg->origin ); + } + else + { + ltg_time = 99999; + } + // jmarshall end + //the item configuration + ic = itemconfig; + if( !itemconfig ) + { + return false; + } + //best weight and item so far + bestweight = 0; + bestitem = NULL; + memset( &goal, 0, sizeof( bot_goal_t ) ); + //go through the items in the level + for( li = levelitems; li; li = li->next ) + { + if( gameLocal.gameType == GAME_SP ) + { + if( li->flags & IFL_NOTSINGLE ) + { + continue; + } + } + else if( gameLocal.gameType >= GAME_TDM ) + { + if( li->flags & IFL_NOTTEAM ) + { + continue; + } + } + else + { + if( li->flags & IFL_NOTFREE ) + { + continue; + } + } + if( li->flags & IFL_NOTBOT ) + { + continue; + } + //if the item is in a possible goal area +// if (!li->goalareanum) +// continue; + //FIXME: is this a good thing? added this for items that never spawned into the game (f.i. CTF flags in obelisk) + if( !li->item && !( li->flags & IFL_ROAM ) ) + { + continue; + } + //get the fuzzy weight function for this item + iteminfo = &ic->iteminfo[li->iteminfo]; + weightnum = gs->itemweightindex[iteminfo->number]; + if( weightnum < 0 ) + { + continue; + } + // +#ifdef UNDECIDEDFUZZY + weight = FuzzyWeightUndecided( inventory, gs->itemweightconfig, weightnum ); +#else + weight = botFuzzyWeightManager.FuzzyWeight( inventory, gs->itemweightconfig, weightnum ); +#endif //UNDECIDEDFUZZY +#ifdef DROPPEDWEIGHT + //HACK: to make dropped items more attractive + if( li->timeout ) + { + weight += bot_droppedweight.GetFloat(); + } +#endif //DROPPEDWEIGHT + //use weight scale for item_botroam + if( li->flags & IFL_ROAM ) + { + weight *= li->weight; + } + // + if( weight > 0 ) + { + //get the travel time towards the goal area + //t = AAS_AreaTravelTimeToGoalArea(areanum, origin, li->goalareanum, travelflags); + t = gameLocal.TravelTimeToGoal( origin, li->goalorigin ); + + //if the goal is reachable + if( t > 0 && t < maxtime ) + { + //if this item won't respawn before we get there + avoidtime = BotAvoidGoalTime( goalstate, li->number ); + if( avoidtime - t * 0.009 > 0 ) + { + continue; + } + // + weight /= ( float )t * TRAVELTIME_SCALE; + // + if( weight > bestweight ) + { + t = 0; + if( ltg && !li->timeout ) + { + //get the travel time from the goal to the long term goal +// jmarshall + //t = AAS_AreaTravelTimeToGoalArea(li->goalareanum, li->goalorigin, ltg->areanum, travelflags); + t = gameLocal.TravelTimeToGoal( li->goalorigin, ltg->origin ); + // jmarshall end + } //end if + //if the travel back is possible and doesn't take too long + if( t <= ltg_time ) + { + bestweight = weight; + bestitem = li; + } //end if + } //end if + } //end if + } //end if + } //end for + //if no goal item found + if( !bestitem ) + { + return false; + } + //create a bot goal for this item + iteminfo = &ic->iteminfo[bestitem->iteminfo]; + VectorCopy( bestitem->goalorigin, goal.origin ); + VectorCopy( iteminfo->mins, goal.mins ); + VectorCopy( iteminfo->maxs, goal.maxs ); +// goal.areanum = bestitem->goalareanum; + goal.entitynum = bestitem->item->entityNumber; + goal.number = bestitem->number; + goal.flags = GFL_ITEM; + if( bestitem->timeout ) + { + goal.flags |= GFL_DROPPED; + } + if( bestitem->flags & IFL_ROAM ) + { + goal.flags |= GFL_ROAM; + } + goal.iteminfo = bestitem->iteminfo; + //if it's a dropped item + if( bestitem->timeout ) + { + avoidtime = AVOID_DROPPED_TIME; + } //end if + else + { + avoidtime = iteminfo->respawntime; + if( !avoidtime ) + { + avoidtime = AVOID_DEFAULT_TIME; + } + if( avoidtime < AVOID_MINIMUM_TIME ) + { + avoidtime = AVOID_MINIMUM_TIME; + } + } //end else + //add the chosen goal to the goals to avoid for a while + BotAddToAvoidGoals( gs, bestitem->number, avoidtime ); + //push the goal on the stack + BotPushGoal( goalstate, &goal ); + // + return true; +} //end of the function BotChooseNBGItem + + + +/* +==================== +idBotGoalManager::BotTouchingGoal +==================== +*/ +int idBotGoalManager::BotTouchingGoal( idVec3 origin, bot_goal_t* goal ) +{ + int i; + idVec3 boxmins, boxmaxs; + idVec3 absmins, absmaxs; + idVec3 safety_maxs( 0, 0, 0 ); //{4, 4, 10}; + idVec3 safety_mins( 0, 0, 0 ); //{-4, -4, 0}; + + rvmBot::PresenceTypeBoundingBox( PRESENCE_NORMAL, boxmins, boxmaxs ); + VectorSubtract( goal->mins, boxmaxs, absmins ); + VectorSubtract( goal->maxs, boxmins, absmaxs ); + VectorAdd( absmins, goal->origin, absmins ); + VectorAdd( absmaxs, goal->origin, absmaxs ); + + //make the box a little smaller for safety + VectorSubtract( absmaxs, safety_maxs, absmaxs ); + VectorSubtract( absmins, safety_mins, absmins ); + + for( i = 0; i < 3; i++ ) + { + if( origin[i] < absmins[i] || origin[i] > absmaxs[i] ) + { + return false; + } + } + return true; +} + +/* +======================== +idBotGoalManager::BotItemGoalInVisButNotVisible +======================== +*/ +int idBotGoalManager::BotItemGoalInVisButNotVisible( int viewer, idVec3 eye, idAngles viewangles, bot_goal_t* goal ) +{ + //aas_entityinfo_t entinfo; + trace_t trace; + idVec3 middle; + + if( !( goal->flags & GFL_ITEM ) ) + { + return false; + } + + VectorAdd( goal->mins, goal->mins, middle ); + VectorScale( middle, 0.5, middle ); + VectorAdd( goal->origin, middle, middle ); + + //trap_Trace(&trace, eye, NULL, NULL, middle, viewer, CONTENTS_SOLID); + idMat3 axis; + axis.Identity(); + gameLocal.clip[0]->Translation( trace, eye, middle, NULL, axis, CONTENTS_SOLID, NULL ); + + //if the goal middle point is visible + if( trace.fraction >= 1 ) + { + //the goal entity number doesn't have to be valid + //just assume it's valid + if( goal->entitynum <= 0 ) + { + return false; + } + // jmarshall - time delay thing here? + // + //if the entity data isn't valid + //AAS_EntityInfo(goal->entitynum, &entinfo); + //NOTE: for some wacko reason entities are sometimes + // not updated + //if (!entinfo.valid) return qtrue; + //if (entinfo.ltime < AAS_Time() - 0.5) + // return qtrue; + // jmarshall end + } + return false; +} + +/* +======================== +BotResetGoalState +======================== +*/ +void idBotGoalManager::BotResetGoalState( int goalstate ) +{ + bot_goalstate_t* gs; + + gs = BotGoalStateFromHandle( goalstate ); + if( !gs ) + { + return; + } + //memset(gs->goalstack, 0, MAX_GOALSTACK * sizeof(bot_goal_t)); + for( int i = 0; i < MAX_GOALSTACK; i++ ) + { + gs->goalstack[i].Reset(); + } + gs->goalstacktop = 0; + BotResetAvoidGoals( goalstate ); +} + +/* +======================== +idBotGoalManager::BotResetGoalState +======================== +*/ +int idBotGoalManager::BotLoadItemWeights( int goalstate, char* filename ) +{ + bot_goalstate_t* gs; + + gs = BotGoalStateFromHandle( goalstate ); + if( !gs ) + { + return BLERR_CANNOTLOADITEMWEIGHTS; + } + + //load the weight configuration + gs->itemweightconfig = botFuzzyWeightManager.ReadWeightConfig( filename ); + if( !gs->itemweightconfig ) + { + gameLocal.Error( "couldn't load weights\n" ); + return BLERR_CANNOTLOADITEMWEIGHTS; + } + + //if there's no item configuration + if( !itemconfig ) + { + return BLERR_CANNOTLOADITEMWEIGHTS; + } + + //create the item weight index + gs->itemweightindex = ItemWeightIndex( gs->itemweightconfig, itemconfig ); + + //everything went ok + return BLERR_NOERROR; +} + +/* +======================== +idBotGoalManager::BotResetGoalState +======================== +*/ +void idBotGoalManager::BotFreeItemWeights( int goalstate ) +{ + bot_goalstate_t* gs; + + gs = BotGoalStateFromHandle( goalstate ); + if( !gs ) + { + return; + } + if( gs->itemweightconfig ) + { + botFuzzyWeightManager.FreeWeightConfig( gs->itemweightconfig ); + } + // jmarshall - eval + //if (gs->itemweightindex) + // FreeMemory(gs->itemweightindex); + // jmarshall end +} + +/* +======================== +idBotGoalManager::BotAllocGoalState +======================== +*/ +int idBotGoalManager::BotAllocGoalState( int client ) +{ + int i; + + for( i = 1; i <= MAX_CLIENTS; i++ ) + { + if( !botgoalstates[i].InUse() ) + { + botgoalstates[i].Reset(); + botgoalstates[i].client = client; + return i; + } + } + return 0; +} + +/* +======================== +idBotGoalManager::BotFreeGoalState +======================== +*/ +void idBotGoalManager::BotFreeGoalState( int handle ) +{ + if( handle <= 0 || handle > MAX_CLIENTS ) + { + gameLocal.Error( "goal state handle %d out of range\n", handle ); + return; + } + + if( !botgoalstates[handle].InUse() ) + { + gameLocal.Error( "invalid goal state handle %d\n", handle ); + return; + } + + BotFreeItemWeights( handle ); + // jmarshall + //FreeMemory(botgoalstates[handle]); + // jmarshall end + botgoalstates[handle].Reset(); +} + +/* +======================== +idBotGoalManager::BotSetupGoalAI +======================== +*/ +int idBotGoalManager::BotSetupGoalAI( void ) +{ + //load the item configuration + itemconfig = LoadItemConfig( ( char* )bot_itemsfile.GetString() ); + if( !itemconfig ) + { + gameLocal.Error( "couldn't load item config\n" ); + return BLERR_CANNOTLOADITEMCONFIG; + } + + //everything went ok + return BLERR_NOERROR; +} + +/* +======================== +idBotGoalManager::BotSetupGoalAI +======================== +*/ +void idBotGoalManager::BotShutdownGoalAI( void ) +{ + int i; + // jmarshall + //if (itemconfig) + // FreeMemory(itemconfig); + // jmarshall end + itemconfig = NULL; + // jmarshall + //if (levelitemheap) + // FreeMemory(levelitemheap); + // jmarshall end + //levelitemheap = NULL; + for( int i = 0; i < MAX_BOT_LEVEL_ITEMS; i++ ) + { + levelitemheap[i].Reset(); + } + + freelevelitems = NULL; + levelitems = NULL; + numlevelitems = 0; + + BotFreeInfoEntities(); + + for( i = 1; i <= MAX_CLIENTS; i++ ) + { + if( botgoalstates[i].InUse() ) + { + BotFreeGoalState( i ); + } + } +} + + +/* +======================= +idBotGoalManager::BotNearGoal( +======================= +*/ +bool idBotGoalManager::BotNearGoal( idVec3 p1, idVec3 p2 ) +{ + idVec3 p1_z, p2_z; + + p1_z[0] = p1[0]; + p1_z[1] = p1[1]; + p1_z[2] = 0; + + p2_z[0] = p2[0]; + p2_z[1] = p2[1]; + p2_z[2] = 0; + + float distToGoal = idMath::Distance( p1_z, p2_z ); + if( distToGoal <= 50 ) + { + return true; + } + + return false; +} diff --git a/src/game/bots/Bot_goal.h b/src/game/bots/Bot_goal.h new file mode 100644 index 00000000..16263e26 --- /dev/null +++ b/src/game/bots/Bot_goal.h @@ -0,0 +1,342 @@ +// Bot_goal.h +// + +#define MAX_BOT_ITEM_INFOS 2 +#define MAX_BOT_ITEM_INFO 256 +#define MAX_BOT_LEVEL_ITEMS 256 + +//#define DEBUG_AI_GOAL +#ifdef RANDOMIZE + #define UNDECIDEDFUZZY +#endif //RANDOMIZE +#define DROPPEDWEIGHT +//minimum avoid goal time +#define AVOID_MINIMUM_TIME 10 +//default avoid goal time +#define AVOID_DEFAULT_TIME 30 +//avoid dropped goal time +#define AVOID_DROPPED_TIME 10 +// +#define TRAVELTIME_SCALE 0.01 +//item flags +#define IFL_NOTFREE 1 //not in free for all +#define IFL_NOTTEAM 2 //not in team play +#define IFL_NOTSINGLE 4 //not in single player +#define IFL_NOTBOT 8 //bot should never go for this +#define IFL_ROAM 16 //bot roam goal + +//a bot goal +struct bot_goal_t +{ + bot_goal_t() + { + Reset(); + } + + void Reset() + { + origin.Zero(); + areanum = 0; + mins.Zero(); + maxs.Zero(); + entitynum = 0; + number = 0; + flags = 0; + iteminfo = 0; + framenum = -1; + } + + int framenum; + idVec3 origin; //origin of the goal + int areanum; //area number of the goal + idVec3 mins, maxs; //mins and maxs of the goal + int entitynum; //number of the goal entity + int number; //goal number + int flags; //goal flags + int iteminfo; //item information +}; + +//location in the map "target_location" +struct maplocation_t +{ + maplocation_t() + { + Reset(); + } + + void Reset() + { + origin.Zero(); + areanum = 0; + name = ""; + next = nullptr; + } + + idVec3 origin; + int areanum; + idStr name; + maplocation_t* next; +}; + +//camp spots "info_camp" +struct campspot_t +{ + campspot_t() + { + Reset(); + } + + void Reset() + { + origin.Zero(); + areanum = 0; + name = ""; + range = 0; + weight = 0; + random = 0; + } + + idVec3 origin; + int areanum; + idStr name; + float range; + float weight; + float wait; + float random; +}; + +struct levelitem_t +{ + levelitem_t() + { + Reset(); + } + + void Reset() + { + number = 0; + iteminfo = 0; + flags = 0; + weight = 0; + origin.Zero(); + goalorigin.Zero(); + item = nullptr; + timeout = 0; + prev = nullptr; + next = nullptr; + } + + idStr name; + int number; //number of the level item + int iteminfo; //index into the item info + int flags; //item flags + float weight; //fixed roam weight + idVec3 origin; //origin of the item + idVec3 goalorigin; //goal origin within the area + //int entitynum; //entity number + idItem* item; + float timeout; //item is removed after this time + levelitem_t* prev, * next; +}; + +struct iteminfo_t +{ + iteminfo_t() + { + Reset(); + } + + void Reset() + { + classname = ""; + name = ""; + model = ""; + modelindex = 0; + type = 0; + index = 0; + respawntime = 0; + mins.Zero(); + maxs.Zero(); + number = 0; + } + + idStr classname; //classname of the item + idStr name; //name of the item + idStr model; //model of the item + int modelindex; //model index + int type; //item type + int index; //index in the inventory + float respawntime; //respawn time + idVec3 mins; //mins of the item + idVec3 maxs; //maxs of the item + int number; //number of the item info +}; + +// +// itemconfig_t +// +struct itemconfig_t +{ + itemconfig_t() + { + Reset(); + } + + void Reset( void ) + { + numiteminfo = 0; + for( int i = 0; i < MAX_BOT_ITEM_INFO; i++ ) + { + iteminfo[i].Reset(); + } + } + + int numiteminfo; + iteminfo_t iteminfo[MAX_BOT_ITEM_INFO]; +}; + +//goal state +struct bot_goalstate_t +{ + bot_goalstate_t() + { + itemweightindex = NULL; + Reset(); + } + + void Reset() + { + itemweightconfig = NULL; + + if( itemweightindex != NULL ) + { + delete itemweightindex; + } + itemweightindex = NULL; + client = -1; + lastreachabilityarea = 0; + goalstacktop = 0; + + for( int i = 0; i < MAX_AVOIDGOALS; i++ ) + { + avoidgoals[i] = 0; + avoidgoaltimes[i] = 0; + } + } + + ~bot_goalstate_t() + { + if( itemweightindex != NULL ) + { + delete itemweightindex; + } + + itemweightindex = NULL; + } + + bool InUse() + { + return client != -1; + } + + weightconfig_t* itemweightconfig; //weight config + int* itemweightindex; //index from item to weight + + int client; //client using this goal state + int lastreachabilityarea; //last area with reachabilities the bot was in + + bot_goal_t goalstack[MAX_GOALSTACK]; //goal stack + int goalstacktop; //the top of the goal stack + + int avoidgoals[MAX_AVOIDGOALS]; //goals to avoid + float avoidgoaltimes[MAX_AVOIDGOALS]; //times to avoid the goals +}; + +class idBotGoalManager +{ +public: + idBotGoalManager(); + + int BotSetupGoalAI( void ); + + void InitLevelItems( void ); + void UpdateEntityItems( void ); + + void BotPushGoal( int goalstate, bot_goal_t* goal ); + void BotPopGoal( int goalstate ); + void BotEmptyGoalStack( int goalstate ); + + int BotLoadItemWeights( int goalstate, char* filename ); + void BotResetGoalState( int goalstate ); + + int BotItemGoalInVisButNotVisible( int viewer, idVec3 eye, idAngles viewangles, bot_goal_t* goal ); + + int BotChooseLTGItem( int goalstate, idVec3 origin, int* inventory, int travelflags ); + int BotChooseNBGItem( int goalstate, idVec3 origin, int* inventory, int travelflags, bot_goal_t* ltg, float maxtime ); + + int BotTouchingGoal( idVec3 origin, bot_goal_t* goal ); + + int BotAllocGoalState( int client ); + + void BotGoalName( int number, char* name, int size ); + + void BotFreeGoalState( int handle ); + void BotShutdownGoalAI( void ); + void BotFreeItemWeights( int goalstate ); +public: + bool BotNearGoal( idVec3 p1, idVec3 p2 ); + int BotGetTopGoal( int goalstate, bot_goal_t* goal ); + int BotGetSecondGoal( int goalstate, bot_goal_t* goal ); +public: + void BotDumpGoalStack( int goalstate ); +public: + int BotGetLevelItemGoal( int index, char* name, bot_goal_t* goal ); + void BotSetAvoidGoalTime( int goalstate, int number, float avoidtime ); + float BotAvoidGoalTime( int goalstate, int number ); + void BotResetAvoidGoals( int goalstate ); + void BotDumpAvoidGoals( int goalstate ); + void BotAddToAvoidGoals( bot_goalstate_t* gs, int number, float avoidtime ); + void BotRemoveFromAvoidGoals( int goalstate, int number ); + int BotGetMapLocationGoal( char* name, bot_goal_t* goal ); + int BotGetNextCampSpotGoal( int num, bot_goal_t* goal ); + void BotFindEntityForLevelItem( levelitem_t* li ); +private: + + levelitem_t* AllocLevelItem( void ); + void FreeLevelItem( levelitem_t* li ); + + void AddLevelItemToList( levelitem_t* li ); + void RemoveLevelItemFromList( levelitem_t* li ); + + void BotFreeInfoEntities( void ); + + void BotInitInfoEntities( void ); + + void InitLevelItemHeap( void ); + int* ItemWeightIndex( weightconfig_t* iwc, itemconfig_t* ic ); + itemconfig_t* LoadItemConfig( char* filename ); + void BotSaveGoalFuzzyLogic( int goalstate, char* filename ); + void BotMutateGoalFuzzyLogic( int goalstate, float range ); + bot_goalstate_t* BotGoalStateFromHandle( int handle ); + void BotInterbreedGoalFuzzyLogic( int parent1, int parent2, int child ); +private: + void ParseItemInfo( idParser& parser, iteminfo_t* itemInfo ); +private: + bot_goalstate_t botgoalstates[MAX_CLIENTS + 1]; + + //item configuration + itemconfig_t itemconfiglocal; + itemconfig_t* itemconfig; + + //level items + levelitem_t levelitemheap[MAX_BOT_LEVEL_ITEMS]; + levelitem_t* freelevelitems; + levelitem_t* levelitems; + int numlevelitems; + + //map locations + idList maplocations; + idList campspots; +}; + +extern idBotGoalManager botGoalManager; \ No newline at end of file diff --git a/src/game/bots/Bot_weapons.cpp b/src/game/bots/Bot_weapons.cpp new file mode 100644 index 00000000..ab0bb2cb --- /dev/null +++ b/src/game/bots/Bot_weapons.cpp @@ -0,0 +1,492 @@ +// Bot_weapons.cpp +// + +#include "precompiled.h" +#pragma hdrstop + +#include "../Game_local.h" + +idCVar bot_weaponsfile( "bot_weaponsfile", "weapons.c", CVAR_GAME | CVAR_CHEAT, "which file to load the weapons weights from" ); + +idBotWeaponInfoManager botWeaponInfoManager; + +/* +========================= +idBotWeaponInfoManager::BotValidWeaponNumber +========================= +*/ +int idBotWeaponInfoManager::BotValidWeaponNumber( int weaponnum ) +{ + if( weaponnum <= 0 || weaponnum > BOT_MAX_WEAPONS ) + { + gameLocal.Error( "weapon number out of range\n" ); + return false; + } + return true; +} + +/* +========================= +idBotWeaponInfoManager::BotWeaponStateFromHandle +========================= +*/ +bot_weaponstate_t* idBotWeaponInfoManager::BotWeaponStateFromHandle( int handle ) +{ + if( handle <= 0 || handle > MAX_CLIENTS ) + { + gameLocal.Error( "move state handle %d out of range\n", handle ); + } + + return &botweaponstates[handle]; +} + +/* +======================== +idBotWeaponInfoManager::ParseProjectileInfo +======================== +*/ +void idBotWeaponInfoManager::ParseProjectileInfo( idParser& parser, projectileinfo_t& newProjectileInfo ) +{ + idToken token; + idToken valueToken; + + parser.ExpectTokenString( "{" ); + + while( true ) + { + if( !parser.ReadToken( &token ) ) + { + parser.Error( "Unexpected end of file found while parsing weaponinfo!" ); + } + + if( token == "}" ) + { + break; + } + + if( !parser.ReadToken( &valueToken ) ) + { + parser.Error( "Failed to read value token, encountered EOF parsing weapon info!" ); + } + + if( token == "name" ) + { + newProjectileInfo.name = valueToken; // name of the projectile + } + else if( token == "model" ) + { + newProjectileInfo.model = valueToken; // model of the projectile + } + else if( token == "flags" ) + { + newProjectileInfo.flags = valueToken.GetIntValue(); // special flags + } + else if( token == "gravity" ) + { + newProjectileInfo.gravity = valueToken.GetFloatValue(); // amount of gravity applied to the projectile [0,1] + } + else if( token == "damage" ) + { + newProjectileInfo.damage = valueToken.GetIntValue(); // damage of the projectile + } + else if( token == "radius" ) + { + newProjectileInfo.radius = valueToken.GetFloatValue(); // radius of damage + } + else if( token == "visdamage" ) + { + newProjectileInfo.visdamage = valueToken.GetIntValue(); // damage of the projectile to visible entities + } + else if( token == "damagetype" ) + { + newProjectileInfo.damagetype = valueToken.GetIntValue(); // type of damage (combination of the DAMAGETYPE_? flags) + } + else if( token == "healthinc" ) + { + newProjectileInfo.healthinc = valueToken.GetIntValue(); // health increase the owner gets + } + else if( token == "push" ) + { + newProjectileInfo.push = valueToken.GetFloatValue(); // amount a player is pushed away from the projectile impact + } + else if( token == "detonation" ) + { + newProjectileInfo.detonation = valueToken.GetFloatValue(); // time before projectile explodes after fire pressed + } + else if( token == "bounce" ) + { + newProjectileInfo.bounce = valueToken.GetFloatValue(); // amount the projectile bounces + } + else if( token == "bouncefric" ) + { + newProjectileInfo.bouncefric = valueToken.GetFloatValue(); // amount the bounce decreases per bounce + } + else if( token == "bouncestop" ) + { + newProjectileInfo.bouncestop = valueToken.GetFloatValue(); // minimum bounce value before bouncing stops + } + else + { + parser.Error( "ParseProjectileInfo: Unexpected token %s\n", token.c_str() ); + } + } +} + +/* +======================== +idBotWeaponInfoManager::ParseWeaponInfo +======================== +*/ +void idBotWeaponInfoManager::ParseWeaponInfo( idParser& parser, weaponinfo_t& newWeaponInfo ) +{ + idToken token; + idToken valueToken; + + parser.ExpectTokenString( "{" ); + + while( true ) + { + if( !parser.ReadToken( &token ) ) + { + parser.Error( "Unexpected end of file found while parsing weaponinfo!" ); + } + + if( token == "}" ) + { + break; + } + + if( !parser.ReadToken( &valueToken ) ) + { + parser.Error( "Failed to read value token, encountered EOF parsing weapon info!" ); + } + + if( token == "number" ) + { + newWeaponInfo.number = valueToken.GetIntValue(); //weapon number + } + else if( token == "name" ) + { + newWeaponInfo.name = valueToken; //name of the weapon + } + else if( token == "level" ) + { + newWeaponInfo.level = valueToken.GetIntValue(); + } + else if( token == "model" ) + { + newWeaponInfo.model = valueToken; //model of the weapon + } + else if( token == "weaponindex" ) + { + newWeaponInfo.weaponindex = valueToken.GetIntValue(); //index of weapon in inventory + } + else if( token == "flags" ) + { + newWeaponInfo.flags = valueToken.GetIntValue(); //special flags + } + else if( token == "projectile" ) + { + newWeaponInfo.projectile = valueToken; //projectile used by the weapon + } + else if( token == "numprojectiles" ) + { + newWeaponInfo.numprojectiles = valueToken.GetIntValue(); //number of projectiles + } + else if( token == "hspread" ) + { + newWeaponInfo.hspread = valueToken.GetFloatValue(); //horizontal spread of projectiles (degrees from middle) + } + else if( token == "vspread" ) + { + newWeaponInfo.vspread = valueToken.GetFloatValue(); //vertical spread of projectiles (degrees from middle) + } + else if( token == "speed" ) + { + newWeaponInfo.speed = valueToken.GetFloatValue(); //speed of the projectile (0 = instant hit) + } + else + { + parser.Error( "ParseWeaponInfo: Unexpected token %s\n", token.c_str() ); + } + } +} + +/* +======================== +idBotWeaponInfoManager::LoadWeaponConfig +======================== +*/ +void idBotWeaponInfoManager::LoadWeaponConfig( char* filename ) +{ + idParser parser; + idToken token; + int j; + + if( !parser.LoadFile( filename ) ) + { + gameLocal.Error( "Failed to load bot weapon config %s\n", filename ); + } + + while( parser.ReadToken( &token ) ) + { + if( token == "weaponinfo" ) + { + weaponinfo_t newWeaponInfo; + ParseWeaponInfo( parser, newWeaponInfo ); + + if( newWeaponInfo.number < 0 || newWeaponInfo.number >= BOT_MAX_WEAPONS ) + { + parser.Error( "weapon info number %d out of range\n", newWeaponInfo.number ); + return; + } + + weaponinfo[newWeaponInfo.number] = newWeaponInfo; + weaponinfo[newWeaponInfo.number].valid = true; + } + else if( token == "projectileinfo" ) + { + projectileinfo_t newProjectileInfo; + + ParseProjectileInfo( parser, newProjectileInfo ); + + projectileinfo.Append( newProjectileInfo ); + } + else + { + parser.Error( "LoadWeaponConfig: Unknown definintion %s", token.c_str() ); + } + } + + // fix up weapons. + for( int i = 0; i < BOT_MAX_WEAPONS; i++ ) + { + if( !weaponinfo[i].valid ) + { + continue; + } + + if( weaponinfo[i].name.Length() <= 0 ) + { + parser.Error( "weapon %d has no name\n", i ); + return; + } + + if( weaponinfo[i].projectile.Length() <= 0 ) + { + parser.Error( "weapon %s has no projectile\n", weaponinfo[i].name ); + return; + } + + //find the projectile info and copy it to the weapon info + for( j = 0; j < projectileinfo.Num(); j++ ) + { + if( projectileinfo[j].name == weaponinfo[i].projectile ) + { + memcpy( &weaponinfo[i].proj, &projectileinfo[j], sizeof( projectileinfo_t ) ); + break; + } + } + if( j == projectileinfo.Num() ) + { + parser.Error( "weapon %s uses undefined projectile\n", weaponinfo[i].name.c_str() ); + return; + } + } +} + +/* +======================== +idBotWeaponInfoManager::Init +======================== +*/ +void idBotWeaponInfoManager::Init( void ) +{ + rvmScopedLexerBaseFolder scopedBaseFolder( BOTFILESBASEFOLDER ); + + LoadWeaponConfig( ( char* )bot_weaponsfile.GetString() ); +} + +/* +===================== +WeaponWeightIndex +===================== +*/ +void idBotWeaponInfoManager::WeaponWeightIndex( weightconfig_t* wwc, bot_weaponstate_t* weaponState ) +{ + for( int i = 0; i < BOT_MAX_WEAPONS; i++ ) + { + weaponState->weaponweightindex[i] = botFuzzyWeightManager.FindFuzzyWeight( wwc, ( char* )weaponinfo[i].name.c_str() ); + } +} + +/* +===================== +idBotWeaponInfoManager::WeaponWeightIndex +===================== +*/ +void idBotWeaponInfoManager::BotFreeWeaponWeights( int weaponstate ) +{ + bot_weaponstate_t* ws; + + ws = BotWeaponStateFromHandle( weaponstate ); + if( !ws ) + { + return; + } +// if (ws->weaponweightconfig) +// FreeWeightConfig(ws->weaponweightconfig); + // if (ws->weaponweightindex) FreeMemory(ws->weaponweightindex); +} + +/* +===================== +BotLoadWeaponWeights +===================== +*/ +int idBotWeaponInfoManager::BotLoadWeaponWeights( int weaponstate, char* filename ) +{ + bot_weaponstate_t* ws; + + ws = BotWeaponStateFromHandle( weaponstate ); + if( !ws ) + { + return BLERR_CANNOTLOADWEAPONWEIGHTS; + } + + BotFreeWeaponWeights( weaponstate ); + + ws->weaponweightconfig = botFuzzyWeightManager.ReadWeightConfig( filename ); + if( !ws->weaponweightconfig ) + { + gameLocal.Error( "couldn't load weapon config %s\n", filename ); + return BLERR_CANNOTLOADWEAPONWEIGHTS; + } + + WeaponWeightIndex( ws->weaponweightconfig, ws ); + return BLERR_NOERROR; +} + +/* +===================== +idBotWeaponInfoManager::BotGetWeaponInfo +===================== +*/ +void idBotWeaponInfoManager::BotGetWeaponInfo( int weaponstate, int weapon, weaponinfo_t* weaponinfo ) +{ + bot_weaponstate_t* ws; + + if( !BotValidWeaponNumber( weapon ) ) + { + return; + } + ws = BotWeaponStateFromHandle( weaponstate ); + if( !ws ) + { + return; + } + + *weaponinfo = this->weaponinfo[weapon]; +} + +/* +===================== +idBotWeaponInfoManager::BotChooseBestFightWeapon +===================== +*/ +int idBotWeaponInfoManager::BotChooseBestFightWeapon( int weaponstate, int* inventory ) +{ + int i, index, bestweapon; + float weight, bestweight; + bot_weaponstate_t* ws; + + ws = BotWeaponStateFromHandle( weaponstate ); + if( !ws ) + { + return 0; + } + + //if the bot has no weapon weight configuration + if( !ws->weaponweightconfig ) + { + return 0; + } + + bestweight = 0; + bestweapon = 0; + for( i = 0; i < BOT_MAX_WEAPONS; i++ ) + { + if( !weaponinfo[i].valid ) + { + continue; + } + index = ws->weaponweightindex[i]; + if( index < 0 ) + { + continue; + } + weight = botFuzzyWeightManager.FuzzyWeight( inventory, ws->weaponweightconfig, index ); + if( weight > bestweight ) + { + bestweight = weight; + bestweapon = i; + } + } + return bestweapon; +} + +/* +===================== +idBotWeaponInfoManager::BotResetWeaponState +===================== +*/ +void idBotWeaponInfoManager::BotResetWeaponState( int weaponstate ) +{ + weightconfig_t* weaponweightconfig; + int* weaponweightindex; + bot_weaponstate_t* ws; + + ws = BotWeaponStateFromHandle( weaponstate ); + if( !ws ) + { + return; + } + weaponweightconfig = ws->weaponweightconfig; + weaponweightindex = ws->weaponweightindex; + + //Com_Memset(ws, 0, sizeof(bot_weaponstate_t)); + ws->weaponweightconfig = weaponweightconfig; + memcpy( ws->weaponweightindex, weaponweightindex, sizeof( int ) * BOT_MAX_WEAPONS ); +} + +/* +===================== +idBotWeaponInfoManager::BotAllocWeaponState +===================== +*/ +int idBotWeaponInfoManager::BotAllocWeaponState( void ) +{ + int i; + + for( i = 1; i <= MAX_CLIENTS; i++ ) + { + if( !botweaponstates[i].inUse ) + { + botweaponstates[i].Reset(); + botweaponstates[i].inUse = true; + return i; + } + } + return 0; +} + +/* +===================== +idBotWeaponInfoManager::BotAllocWeaponState +===================== +*/ +void idBotWeaponInfoManager::BotFreeWeaponState( int ws ) +{ + botweaponstates[ws].inUse = false; + botweaponstates[ws].Reset(); +} \ No newline at end of file diff --git a/src/game/bots/Bot_weapons.h b/src/game/bots/Bot_weapons.h new file mode 100644 index 00000000..c3b42849 --- /dev/null +++ b/src/game/bots/Bot_weapons.h @@ -0,0 +1,161 @@ +// Bot_weapons.h +// + +#pragma once + +#define BOT_MAX_WEAPONS 32 + +//projectile flags +#define PFL_WINDOWDAMAGE 1 //projectile damages through window +#define PFL_RETURN 2 //set when projectile returns to owner +//weapon flags +#define WFL_FIRERELEASED 1 //set when projectile is fired with key-up event +//damage types +#define DAMAGETYPE_IMPACT 1 //damage on impact +#define DAMAGETYPE_RADIAL 2 //radial damage +#define DAMAGETYPE_VISIBLE 4 //damage to all entities visible to the projectile + +struct projectileinfo_t +{ + projectileinfo_t() + { + name = ""; + model = ""; + flags = 0; + gravity = 0; + damage = 0; + radius = 0; + visdamage = 0; + damagetype = 0; + healthinc = 0; + push = 0; + detonation = 0; + bounce = 0; + bouncefric = 0; + bouncestop = 0; + } + idStr name; + idStr model; + int flags; + float gravity; + int damage; + float radius; + int visdamage; + int damagetype; + int healthinc; + float push; + float detonation; + float bounce; + float bouncefric; + float bouncestop; +}; + +struct weaponinfo_t +{ + weaponinfo_t() + { + valid = 0; + number = 0; + name = ""; + model = ""; + level = 0; + weaponindex = 0; + flags = 0; + projectile = ""; + numprojectiles = 0; + hspread = 0; + vspread = 0; + speed = 0; + acceleration = 0; + recoil.Zero(); + offset.Zero(); + angleoffset.Zero(); + extrazvelocity = 0; + ammoamount = 0; + ammoindex = 0; + activate = 0; + reload = 0; + spinup = 0; + spindown = 0; + } + + int valid; //true if the weapon info is valid + int number; //number of the weapon + idStr name; + idStr model; + int level; + int weaponindex; + int flags; + idStr projectile; + int numprojectiles; + float hspread; + float vspread; + float speed; + float acceleration; + idVec3 recoil; + idVec3 offset; + idVec3 angleoffset; + float extrazvelocity; + int ammoamount; + int ammoindex; + float activate; + float reload; + float spinup; + float spindown; + projectileinfo_t proj; //pointer to the used projectile +}; + +struct bot_weaponstate_t +{ + bot_weaponstate_t() + { + Reset(); + } + + void Reset() + { + inUse = false; + weaponweightconfig = NULL; + for( int i = 0; i < BOT_MAX_WEAPONS; i++ ) + { + weaponweightindex[i] = 0; + } + } + + bool inUse; + weightconfig_t* weaponweightconfig; + int weaponweightindex[BOT_MAX_WEAPONS]; //weapon weight index +}; + +// +// idBotWeaponInfoManager +// +class idBotWeaponInfoManager +{ +public: + void Init( void ); + + int BotLoadWeaponWeights( int weaponstate, char* filename ); + void BotGetWeaponInfo( int weaponstate, int weapon, weaponinfo_t* weaponinfo ); + int BotChooseBestFightWeapon( int weaponstate, int* inventory ); + void BotResetWeaponState( int weaponstate ); + int BotAllocWeaponState( void ); + void BotFreeWeaponState( int ws ); +private: + int BotValidWeaponNumber( int weaponnum ); + bot_weaponstate_t* BotWeaponStateFromHandle( int handle ); + void WeaponWeightIndex( weightconfig_t* wwc, bot_weaponstate_t* weaponState ); + void BotFreeWeaponWeights( int weaponstate ); +private: + void LoadWeaponConfig( char* filename ); + + void ParseWeaponInfo( idParser& parser, weaponinfo_t& newWeaponInfo ); + void ParseProjectileInfo( idParser& parser, projectileinfo_t& newProjectileInfo ); +private: + idList projectileinfo; + bot_weaponstate_t botweaponstates[MAX_CLIENTS + 1]; + + weaponinfo_t weaponinfo[BOT_MAX_WEAPONS]; +}; + +extern idBotWeaponInfoManager botWeaponInfoManager; \ No newline at end of file diff --git a/src/game/bots/Bot_weights.cpp b/src/game/bots/Bot_weights.cpp new file mode 100644 index 00000000..ad27de73 --- /dev/null +++ b/src/game/bots/Bot_weights.cpp @@ -0,0 +1,915 @@ +// Bot_wieghts.cpp +// + +#include "precompiled.h" +#pragma hdrstop + +#include "../Game_local.h" + +idBotFuzzyWeightManager botFuzzyWeightManager; + +/* +======================== +idBotFuzzyWeightManager::Init +======================== +*/ +void idBotFuzzyWeightManager::Init( void ) +{ + memset( &fuzzyseperators[0], 0, sizeof( fuzzyseperators ) ); +} + +/* +======================== +idBotFuzzyWeightManager::AllocFuzzyWeight +======================== +*/ +fuzzyseperator_t* idBotFuzzyWeightManager::AllocFuzzyWeight( void ) +{ + for( int i = 0; i < MAX_FUZZY_OPERATORS; i++ ) + { + if( fuzzyseperators[i].inUse == false ) + { + memset( &fuzzyseperators[i], 0, sizeof( fuzzyseperator_t ) ); + fuzzyseperators[i].inUse = true; + return &fuzzyseperators[i]; + } + } + + gameLocal.Error( "AllocFuzzyWeight: Not enough fuzzy weights\n" ); + return NULL; +} + +/* +======================== +idBotFuzzyWeightManager::ReadValue +======================== +*/ +bool idBotFuzzyWeightManager::ReadValue( idParser& source, float* value ) +{ + idToken token; + + if( !source.ReadToken( &token ) ) + { + return false; + } + + if( token == "-" ) + { + source.Warning( "negative value set to zero\n" ); + if( !source.ExpectTokenType( TT_NUMBER, 0, &token ) ) + { + return false; + } + } + + if( token.type != TT_NUMBER ) + { + source.Error( "invalid return value %s\n", token.c_str() ); + return false; + } + + *value = token.GetFloatValue(); + + return true; +} + +/* +=================== +idBotFuzzyWeightManager::ReadFuzzyWeight +=================== +*/ +int idBotFuzzyWeightManager::ReadFuzzyWeight( idParser& source, fuzzyseperator_t* fs ) +{ + if( source.CheckTokenString( "balance" ) ) + { + fs->type = WT_BALANCE; + + if( !source.ExpectTokenString( "(" ) ) + { + return false; + } + + if( !ReadValue( source, &fs->weight ) ) + { + return false; + } + + if( !source.ExpectTokenString( "," ) ) + { + return false; + } + + if( !ReadValue( source, &fs->minweight ) ) + { + return false; + } + + if( !source.ExpectTokenString( "," ) ) + { + return false; + } + + if( !ReadValue( source, &fs->maxweight ) ) + { + return false; + } + + if( !source.ExpectTokenString( ")" ) ) + { + return false; + } + } + else + { + fs->type = 0; + + if( !ReadValue( source, &fs->weight ) ) + { + return false; + } + fs->minweight = fs->weight; + fs->maxweight = fs->weight; + } + + if( !source.ExpectTokenString( ";" ) ) + { + return false; + } + + return true; +} + +/* +=================== +idBotFuzzyWeightManager::FreeFuzzySeperators_r +=================== +*/ +void idBotFuzzyWeightManager::FreeFuzzySeperators_r( fuzzyseperator_t* fs ) +{ + if( !fs ) + { + return; + } + if( fs->child ) + { + FreeFuzzySeperators_r( fs->child ); + } + if( fs->next ) + { + FreeFuzzySeperators_r( fs->next ); + } + + fs->inUse = false; +} + +/* +=================== +FreeWeightConfig2 +=================== +*/ +void idBotFuzzyWeightManager::FreeWeightConfig2( weightconfig_t* config ) +{ + int i; + + for( i = 0; i < config->numweights; i++ ) + { + FreeFuzzySeperators_r( config->weights[i].firstseperator ); + // jmarshall - todo + //if (config->weights[i].name) + // FreeMemory(config->weights[i].name); + // jmarshall end + } + +} + +/* +=================== +idBotFuzzyWeightManager::FreeWeightConfig +=================== +*/ +void idBotFuzzyWeightManager::FreeWeightConfig( weightconfig_t* config ) +{ + //if (!LibVarGetValue("bot_reloadcharacters")) + // return; + + FreeWeightConfig2( config ); +} + +/* +=================== +idBotFuzzyWeightManager::ReadFuzzySeperators_r +=================== +*/ +fuzzyseperator_t* idBotFuzzyWeightManager::ReadFuzzySeperators_r( idParser& source ) +{ + int newindent, index, founddefault; + bool def; + idToken token; + fuzzyseperator_t* fs, * lastfs, * firstfs; + + founddefault = false; + firstfs = NULL; + lastfs = NULL; + if( !source.ExpectTokenString( "(" ) ) + { + return NULL; + } + + if( !source.ExpectTokenType( TT_NUMBER, TT_INTEGER, &token ) ) + { + return NULL; + } + + index = token.GetIntValue(); + + if( !source.ExpectTokenString( ")" ) ) + { + return NULL; + } + + if( !source.ExpectTokenString( "{" ) ) + { + return NULL; + } + + if( !source.ExpectAnyToken( &token ) ) + { + return NULL; + } + + do + { + def = ( token == "default" ); //!strcmp(token.string, "default"); + if( def || ( token == "case" ) ) + { + fs = AllocFuzzyWeight(); + fs->index = index; + if( lastfs ) + { + lastfs->next = fs; + } + else + { + firstfs = fs; + } + lastfs = fs; + if( def ) + { + if( founddefault ) + { + FreeFuzzySeperators_r( firstfs ); + gameLocal.Error( "switch already has a default\n" ); + return NULL; + } + fs->value = MAX_INVENTORYVALUE; + founddefault = true; + } + else + { + if( !source.ExpectTokenType( TT_NUMBER, TT_INTEGER, &token ) ) + { + FreeFuzzySeperators_r( firstfs ); + return NULL; + } + + fs->value = token.GetIntValue(); + } + + if( !source.ExpectTokenString( ":" ) || !source.ExpectAnyToken( &token ) ) + { + FreeFuzzySeperators_r( firstfs ); + return NULL; + } + + newindent = false; + if( token == "{" ) + { + newindent = true; + if( !source.ExpectAnyToken( &token ) ) + { + FreeFuzzySeperators_r( firstfs ); + return NULL; + } + } + + if( token == "return" ) + { + if( !ReadFuzzyWeight( source, fs ) ) + { + FreeFuzzySeperators_r( firstfs ); + return NULL; + } + } + else if( token == "switch" ) + { + fs->child = ReadFuzzySeperators_r( source ); + if( !fs->child ) + { + FreeFuzzySeperators_r( firstfs ); + return NULL; + } + } + else + { + gameLocal.Error( "invalid name %s\n", token.c_str() ); + return NULL; + } + + if( newindent ) + { + if( !source.ExpectTokenString( "}" ) ) + { + FreeFuzzySeperators_r( firstfs ); + return NULL; + } + } + } + else + { + gameLocal.Error( "invalid name %s\n", token.c_str() ); + FreeFuzzySeperators_r( firstfs ); + return NULL; + } + + if( !source.ExpectAnyToken( &token ) ) + { + FreeFuzzySeperators_r( firstfs ); + return NULL; + } + } + while( token != "}" ); + + if( !founddefault ) + { + source.Warning( "switch without default\n" ); + fs = AllocFuzzyWeight(); + fs->index = index; + fs->value = MAX_INVENTORYVALUE; + fs->weight = 0; + fs->next = NULL; + fs->child = NULL; + if( lastfs ) + { + lastfs->next = fs; + } + else + { + firstfs = fs; + } + lastfs = fs; + } + + return firstfs; +} + +/* +===================== +idBotFuzzyWeightManager::ReadWeightConfig +===================== +*/ +weightconfig_t* idBotFuzzyWeightManager::ReadWeightConfig( char* filename ) +{ + int newindent, avail = 0, n; + idToken token; + idParser source; + fuzzyseperator_t* fs; + weightconfig_t* config = NULL; + + avail = -1; + for( n = 0; n < MAX_WEIGHT_FILES; n++ ) + { + config = &weightFileList[n]; + + if( config->inUse ) + { + continue; + } + + if( config->filename == filename ) + { + return config; + } + + avail = n; + break; + } + + if( avail == -1 ) + { + gameLocal.Error( "weightFileList was full trying to load %s\n", filename ); + return NULL; + } + + rvmScopedLexerBaseFolder scopedBaseFolder( BOTFILESBASEFOLDER ); + + if( !source.LoadFile( filename ) ) + { + gameLocal.Error( "couldn't load %s\n", filename ); + return NULL; + } + + config = &weightFileList[avail]; + config->Reset(); + + config->filename = filename; + + //parse the item config file + while( source.ReadToken( &token ) ) + { + if( token == "weight" ) + { + if( config->numweights >= MAX_WEIGHTS ) + { + gameLocal.Error( "too many fuzzy weights\n" ); + break; + } + + if( !source.ExpectTokenType( TT_STRING, 0, &token ) ) + { + FreeWeightConfig( config ); + return NULL; + } + + token.StripDoubleQuotes(); + config->weights[config->numweights].name = token.c_str(); + + if( !source.ExpectAnyToken( &token ) ) + { + FreeWeightConfig( config ); + return NULL; + } + + newindent = false; + if( token == "{" ) + { + newindent = true; + if( !source.ExpectAnyToken( &token ) ) + { + FreeWeightConfig( config ); + return NULL; + } + } + + if( token == "switch" ) + { + fs = ReadFuzzySeperators_r( source ); + if( !fs ) + { + FreeWeightConfig( config ); + return NULL; + } + + config->weights[config->numweights].firstseperator = fs; + } + else if( token == "return" ) + { + fs = ( fuzzyseperator_t* )AllocFuzzyWeight(); + fs->index = 0; + fs->value = MAX_INVENTORYVALUE; + fs->next = NULL; + fs->child = NULL; + if( !ReadFuzzyWeight( source, fs ) ) + { + FreeWeightConfig( config ); + return NULL; + } + config->weights[config->numweights].firstseperator = fs; + } + else + { + gameLocal.Error( "invalid name %s\n", token.c_str() ); + FreeWeightConfig( config ); + return NULL; + } + + if( newindent ) + { + if( !source.ExpectTokenString( "}" ) ) + { + FreeWeightConfig( config ); + return NULL; + } + } + config->numweights++; + } + else + { + gameLocal.Error( "invalid name %s\n", token.c_str() ); + FreeWeightConfig( config ); + return NULL; + } + } + + //if the file was located in a pak file + common->Printf( "idBotFuzzyWeightManager::ReadWeightConfig: loaded %s\n", filename ); + config->inUse = true; + return config; +} + +/* +================== +idBotFuzzyWeightManager::FindFuzzyWeight +================== +*/ +int idBotFuzzyWeightManager::FindFuzzyWeight( weightconfig_t* wc, char* name ) +{ + int i; + + for( i = 0; i < wc->numweights; i++ ) + { + if( wc->weights[i].name == name ) + { + return i; + } + } + return -1; +} + +/* +================== +idBotFuzzyWeightManager::FuzzyWeight_r +================== +*/ +float idBotFuzzyWeightManager::FuzzyWeight_r( int* inventory, fuzzyseperator_t* fs ) +{ + float scale, w1, w2; + + if( inventory[fs->index] < fs->value ) + { + if( fs->child ) + { + return FuzzyWeight_r( inventory, fs->child ); + } + else + { + return fs->weight; + } + } + else if( fs->next ) + { + if( inventory[fs->index] < fs->next->value ) + { + //first weight + if( fs->child ) + { + w1 = FuzzyWeight_r( inventory, fs->child ); + } + else + { + w1 = fs->weight; + } + + //second weight + if( fs->next->child ) + { + w2 = FuzzyWeight_r( inventory, fs->next->child ); + } + else + { + w2 = fs->next->weight; + } + + //the scale factor + scale = ( inventory[fs->index] - fs->value ) / ( fs->next->value - fs->value ); + + //scale between the two weights + return scale * w1 + ( 1 - scale ) * w2; + } + return FuzzyWeight_r( inventory, fs->next ); + } + return fs->weight; +} + +/* +============================ +idBotFuzzyWeightManager::FuzzyWeightUndecided_r +============================ +*/ +float idBotFuzzyWeightManager::FuzzyWeightUndecided_r( int* inventory, fuzzyseperator_t* fs ) +{ + float scale, w1, w2; + + if( inventory[fs->index] < fs->value ) + { + if( fs->child ) + { + return FuzzyWeightUndecided_r( inventory, fs->child ); + } + else + { + return fs->minweight + rvmBotUtil::random() * ( fs->maxweight - fs->minweight ); + } + } + else if( fs->next ) + { + if( inventory[fs->index] < fs->next->value ) + { + //first weight + if( fs->child ) + { + w1 = FuzzyWeightUndecided_r( inventory, fs->child ); + } + else + { + w1 = fs->minweight + rvmBotUtil::random() * ( fs->maxweight - fs->minweight ); + } + + //second weight + if( fs->next->child ) + { + w2 = FuzzyWeight_r( inventory, fs->next->child ); + } + else + { + w2 = fs->next->minweight + rvmBotUtil::random() * ( fs->next->maxweight - fs->next->minweight ); + } + + //the scale factor + scale = ( inventory[fs->index] - fs->value ) / ( fs->next->value - fs->value ); + + //scale between the two weights + return scale * w1 + ( 1 - scale ) * w2; + } + return FuzzyWeightUndecided_r( inventory, fs->next ); + } + return fs->weight; +} + +/* +================= +idBotFuzzyWeightManager::FuzzyWeight +================= +*/ +float idBotFuzzyWeightManager::FuzzyWeight( int* inventory, weightconfig_t* wc, int weightnum ) +{ + return FuzzyWeight_r( inventory, wc->weights[weightnum].firstseperator ); +} + +/* +================= +idBotFuzzyWeightManager::FuzzyWeightUndecided +================= +*/ +float idBotFuzzyWeightManager::FuzzyWeightUndecided( int* inventory, weightconfig_t* wc, int weightnum ) +{ + return FuzzyWeightUndecided_r( inventory, wc->weights[weightnum].firstseperator ); +} + +/* +==================== +idBotFuzzyWeightManager::EvolveFuzzySeperator_r +==================== +*/ +void idBotFuzzyWeightManager::EvolveFuzzySeperator_r( fuzzyseperator_t* fs ) +{ + if( fs->child ) + { + EvolveFuzzySeperator_r( fs->child ); + } + else if( fs->type == WT_BALANCE ) + { + //every once in a while an evolution leap occurs, mutation + if( rvmBotUtil::random() < 0.01 ) + { + fs->weight += rvmBotUtil::crandom() * ( fs->maxweight - fs->minweight ); + } + else + { + fs->weight += rvmBotUtil::crandom() * ( fs->maxweight - fs->minweight ) * 0.5; + } + + //modify bounds if necesary because of mutation + if( fs->weight < fs->minweight ) + { + fs->minweight = fs->weight; + } + else if( fs->weight > fs->maxweight ) + { + fs->maxweight = fs->weight; + } + } + if( fs->next ) + { + EvolveFuzzySeperator_r( fs->next ); + } +} + +/* +==================== +idBotFuzzyWeightManager::EvolveWeightConfig +==================== +*/ +void idBotFuzzyWeightManager::EvolveWeightConfig( weightconfig_t* config ) +{ + int i; + + for( i = 0; i < config->numweights; i++ ) + { + EvolveFuzzySeperator_r( config->weights[i].firstseperator ); + } +} + +/* +==================== +idBotFuzzyWeightManager::ScaleWeight +==================== +*/ +void idBotFuzzyWeightManager::ScaleFuzzySeperator_r( fuzzyseperator_t* fs, float scale ) +{ + if( fs->child ) + { + ScaleFuzzySeperator_r( fs->child, scale ); + } + else if( fs->type == WT_BALANCE ) + { + fs->weight = ( fs->maxweight + fs->minweight ) * scale; + + //get the weight between bounds + if( fs->weight < fs->minweight ) + { + fs->weight = fs->minweight; + } + else if( fs->weight > fs->maxweight ) + { + fs->weight = fs->maxweight; + } + } + if( fs->next ) + { + ScaleFuzzySeperator_r( fs->next, scale ); + } +} + +/* +==================== +idBotFuzzyWeightManager::ScaleWeight +==================== +*/ +void idBotFuzzyWeightManager::ScaleWeight( weightconfig_t* config, char* name, float scale ) +{ + int i; + + if( scale < 0 ) + { + scale = 0; + } + else if( scale > 1 ) + { + scale = 1; + } + for( i = 0; i < config->numweights; i++ ) + { + if( config->weights[i].name == name ) + { + ScaleFuzzySeperator_r( config->weights[i].firstseperator, scale ); + break; + } + } +} + +/* +==================== +idBotFuzzyWeightManager::ScaleFuzzySeperatorBalanceRange_r +==================== +*/ +void idBotFuzzyWeightManager::ScaleFuzzySeperatorBalanceRange_r( fuzzyseperator_t* fs, float scale ) +{ + if( fs->child ) + { + ScaleFuzzySeperatorBalanceRange_r( fs->child, scale ); + } + else if( fs->type == WT_BALANCE ) + { + float mid = ( fs->minweight + fs->maxweight ) * 0.5; + //get the weight between bounds + fs->maxweight = mid + ( fs->maxweight - mid ) * scale; + fs->minweight = mid + ( fs->minweight - mid ) * scale; + if( fs->maxweight < fs->minweight ) + { + fs->maxweight = fs->minweight; + } + } + if( fs->next ) + { + ScaleFuzzySeperatorBalanceRange_r( fs->next, scale ); + } +} + +/* +==================== +idBotFuzzyWeightManager::ScaleFuzzyBalanceRange +==================== +*/ +void idBotFuzzyWeightManager::ScaleFuzzyBalanceRange( weightconfig_t* config, float scale ) +{ + int i; + + if( scale < 0 ) + { + scale = 0; + } + else if( scale > 100 ) + { + scale = 100; + } + for( i = 0; i < config->numweights; i++ ) + { + ScaleFuzzySeperatorBalanceRange_r( config->weights[i].firstseperator, scale ); + } +} + +/* +==================== +idBotFuzzyWeightManager::InterbreedFuzzySeperator_r +==================== +*/ +int idBotFuzzyWeightManager::InterbreedFuzzySeperator_r( fuzzyseperator_t* fs1, fuzzyseperator_t* fs2, fuzzyseperator_t* fsout ) +{ + if( fs1->child ) + { + if( !fs2->child || !fsout->child ) + { + gameLocal.Error( "cannot interbreed weight configs, unequal child\n" ); + return false; + } + if( !InterbreedFuzzySeperator_r( fs2->child, fs2->child, fsout->child ) ) + { + return false; + } + } + else if( fs1->type == WT_BALANCE ) + { + if( fs2->type != WT_BALANCE || fsout->type != WT_BALANCE ) + { + gameLocal.Error( "cannot interbreed weight configs, unequal balance\n" ); + return false; + } + fsout->weight = ( fs1->weight + fs2->weight ) / 2; + if( fsout->weight > fsout->maxweight ) + { + fsout->maxweight = fsout->weight; + } + if( fsout->weight > fsout->minweight ) + { + fsout->minweight = fsout->weight; + } + } + if( fs1->next ) + { + if( !fs2->next || !fsout->next ) + { + gameLocal.Error( "cannot interbreed weight configs, unequal next\n" ); + return false; + } + if( !InterbreedFuzzySeperator_r( fs1->next, fs2->next, fsout->next ) ) + { + return false; + } + } + return true; +} + +/* +==================== +idBotFuzzyWeightManager::InterbreedWeightConfigs +==================== +*/ +void idBotFuzzyWeightManager::InterbreedWeightConfigs( weightconfig_t* config1, weightconfig_t* config2, weightconfig_t* configout ) +{ + int i; + + if( config1->numweights != config2->numweights || + config1->numweights != configout->numweights ) + { + gameLocal.Error( "cannot interbreed weight configs, unequal numweights\n" ); + return; + } + + for( i = 0; i < config1->numweights; i++ ) + { + InterbreedFuzzySeperator_r( config1->weights[i].firstseperator, + config2->weights[i].firstseperator, + configout->weights[i].firstseperator ); + } +} + + +/* +======================= +idBotFuzzyWeightManager::BotShutdownWeights +======================= +*/ +void idBotFuzzyWeightManager::BotShutdownWeights( void ) +{ + int i; + + for( i = 0; i < MAX_WEIGHT_FILES; i++ ) + { + weightFileList[i].inUse = false; + //if (weightFileList[i]) + //{ + // FreeWeightConfig2(weightFileList[i]); + // weightFileList[i] = NULL; + //} + } +} \ No newline at end of file diff --git a/src/game/bots/Bot_weights.h b/src/game/bots/Bot_weights.h new file mode 100644 index 00000000..20a55029 --- /dev/null +++ b/src/game/bots/Bot_weights.h @@ -0,0 +1,53 @@ +// Bot_weights.h +// + +#define MAX_INVENTORYVALUE 999999 +#define EVALUATERECURSIVELY + +#define MAX_WEIGHT_FILES 128 +#define MAX_FUZZY_OPERATORS 8192 + +class idBotFuzzyWeightManager +{ +public: + // Init the fuzzy weight manager. + void Init( void ); + + // Parses a weight config file. + weightconfig_t* ReadWeightConfig( char* filename ); + + void BotShutdownWeights( void ); + + // Fuzzy Weight simulation functions. + int FindFuzzyWeight( weightconfig_t* wc, char* name ); + float FuzzyWeight( int* inventory, weightconfig_t* wc, int weightnum ); + float FuzzyWeightUndecided( int* inventory, weightconfig_t* wc, int weightnum ); + void EvolveFuzzySeperator_r( fuzzyseperator_t* fs ); + void EvolveWeightConfig( weightconfig_t* config ); + void ScaleWeight( weightconfig_t* config, char* name, float scale ); + void ScaleFuzzyBalanceRange( weightconfig_t* config, float scale ); + void InterbreedWeightConfigs( weightconfig_t* config1, weightconfig_t* config2, weightconfig_t* configout ); + void FreeWeightConfig( weightconfig_t* config ); +private: + fuzzyseperator_t* AllocFuzzyWeight( void ); + bool ReadValue( idParser& source, float* value ); + int ReadFuzzyWeight( idParser& source, fuzzyseperator_t* fs ); + + int InterbreedFuzzySeperator_r( fuzzyseperator_t* fs1, fuzzyseperator_t* fs2, fuzzyseperator_t* fsout ); + + fuzzyseperator_t* ReadFuzzySeperators_r( idParser& source ); + + void FreeWeightConfig2( weightconfig_t* config ); + void FreeFuzzySeperators_r( fuzzyseperator_t* fs ); + + void ScaleFuzzySeperatorBalanceRange_r( fuzzyseperator_t* fs, float scale ); + + void ScaleFuzzySeperator_r( fuzzyseperator_t* fs, float scale ); + float FuzzyWeight_r( int* inventory, fuzzyseperator_t* fs ); + float FuzzyWeightUndecided_r( int* inventory, fuzzyseperator_t* fs ); + + weightconfig_t weightFileList[MAX_WEIGHT_FILES]; + fuzzyseperator_t fuzzyseperators[MAX_FUZZY_OPERATORS]; +}; + +extern idBotFuzzyWeightManager botFuzzyWeightManager; \ No newline at end of file diff --git a/src/game/gamesys/Class.h b/src/game/gamesys/Class.h index 6d9e2fbc..192e0e85 100644 --- a/src/game/gamesys/Class.h +++ b/src/game/gamesys/Class.h @@ -85,7 +85,7 @@ public: \ // RAVEN BEGIN // jnewquist: Use accessor for static class type #define CLASS_PROTOTYPE( nameofclass ) \ -private: \ +public: \ static idTypeInfo *Type; \ public: \ static void RegisterClass( void ); \ @@ -320,6 +320,23 @@ class idClass { // jnewquist: Use accessor for static class type bool IsType( const idTypeInfo *c ) const { return IsType(*c); } // RAVEN END + +// jmarshall + template< typename T > + T* Cast(void) + { + return this ? (IsType(T::Type) ? static_cast(this) : NULL) : NULL; + } + + template< typename T > + const T* Cast(void) const + { + return this ? (IsType(T::Type) ? static_cast(this) : NULL) : NULL; + } + + virtual void StateThreadChanged(void) { }; +// jmarshall end + const char * GetClassname( void ) const; const char * GetSuperclass( void ) const; void FindUninitializedMemory( void ); diff --git a/src/game/gamesys/State.cpp b/src/game/gamesys/State.cpp index ed2bf756..96ede350 100644 --- a/src/game/gamesys/State.cpp +++ b/src/game/gamesys/State.cpp @@ -295,6 +295,10 @@ stateResult_t rvStateThread::Execute ( void ) { return SRESULT_ERROR; } + if (lastResult == SRESULT_DONE) { + owner->StateThreadChanged(); + } + // Dont remove the node if it was interrupted or cleared in the last process if ( !fl.stateCleared && !fl.stateInterrupted ) { if( lastResult >= SRESULT_SETDELAY ) { diff --git a/src/game/gamesys/SysCmds.cpp b/src/game/gamesys/SysCmds.cpp index c2a54a66..fe3a4494 100644 --- a/src/game/gamesys/SysCmds.cpp +++ b/src/game/gamesys/SysCmds.cpp @@ -3037,6 +3037,29 @@ void Cmd_ClientOverflowReliable_f( const idCmdArgs& args ) { } #endif +// jmarshall +void Cmd_AddBot_f(const idCmdArgs& args) +{ + if (args.Argc() < 2) + { + common->Warning("USAGE: addbot e.g. addbot major or addbot dark - see botfiles/bots for more details\n"); + return; + } + gameLocal.AddBot(args.Argv(1)); +} + +void Cmd_FillBots_f(const idCmdArgs& args) +{ + gameLocal.AddBot("dark"); + gameLocal.AddBot("major"); + gameLocal.AddBot("gargoyle"); + gameLocal.AddBot("skelebot"); + gameLocal.AddBot("sly"); + gameLocal.AddBot("neko"); + gameLocal.AddBot("sarge"); +} +// jmarshall end + /* ================= idGameLocal::InitConsoleCommands @@ -3052,6 +3075,12 @@ void idGameLocal::InitConsoleCommands( void ) { // cmdSystem->AddCommand( "writeGameState", WriteGameState_f, CMD_FL_GAME, "write game state" ); // cmdSystem->AddCommand( "testSaveGame", TestSaveGame_f, CMD_FL_GAME|CMD_FL_CHEAT, "test a save game for a level" ); // RAVEN END + +// jmarshall + cmdSystem->AddCommand("addbot", Cmd_AddBot_f, CMD_FL_GAME, "adds a multiplayer bot"); + cmdSystem->AddCommand("fillbots", Cmd_FillBots_f, CMD_FL_GAME, "fill bots"); +// jmarshall end + cmdSystem->AddCommand( "game_memory", idClass::DisplayInfo_f, CMD_FL_GAME, "displays game class info" ); cmdSystem->AddCommand( "listClasses", idClass::ListClasses_f, CMD_FL_GAME, "lists game classes" ); cmdSystem->AddCommand( "listThreads", idThread::ListThreads_f, CMD_FL_GAME|CMD_FL_CHEAT, "lists script threads" ); diff --git a/src/game/physics/Clip.cpp b/src/game/physics/Clip.cpp index 201a8d9f..0ebce916 100644 --- a/src/game/physics/Clip.cpp +++ b/src/game/physics/Clip.cpp @@ -1202,6 +1202,33 @@ void idClip::DrawClipSectors( void ) const { } } +/* +============ +idClip::PointContents +============ +*/ +int idClip::PointContents(const idVec3 p) +{ + int contents = -1; + + contents = collisionModelManager->PointContents(p, world); + if (contents > 0) + { + return contents; + } + + //for (int i = 0; i < collisionModelManager->GetNumInlinedProcClipModels(); i++) + //{ + // idCollisionModel* cm = collisionModelManager->GetCollisionModel(i + 1); + // if (cm == NULL) + // continue; + // + // contents = collisionModelManager->PointContents(p, cm); + //} + + return contents; +} + /* ==================== idClip::GetClipSectorsStaticContents diff --git a/src/game/physics/Clip.h b/src/game/physics/Clip.h index b7bf8371..ea40cad3 100644 --- a/src/game/physics/Clip.h +++ b/src/game/physics/Clip.h @@ -239,6 +239,10 @@ class idClip { void Init( void ); void Shutdown( void ); +// jmarshall + int PointContents(const idVec3 p); +// jmarshall end + // clip versus the rest of the world // RAVEN BEGIN // nmckenzie: we have cases where both a guy and his target need to be ignored by a translation diff --git a/src/idlib/Lexer.cpp b/src/idlib/Lexer.cpp index f18d0879..e7df7bd4 100644 --- a/src/idlib/Lexer.cpp +++ b/src/idlib/Lexer.cpp @@ -3965,3 +3965,13 @@ void Lexer::ParseNumericStructArray( int numStructElements, int tokenSubTypeStru char idLexer::baseFolder[256]; // RAVEN END + +/* +================ +idLexer::SetBaseFolder +================ +*/ +void idLexer::SetBaseFolder(const char* path) +{ + idStr::Copynz(baseFolder, path, sizeof(baseFolder)); +} diff --git a/src/idlib/Lexer.h b/src/idlib/Lexer.h index 2f0b571d..35e35161 100644 --- a/src/idlib/Lexer.h +++ b/src/idlib/Lexer.h @@ -465,5 +465,21 @@ ID_INLINE int idLexer::GetFlags( void ) { return idLexer::flags; } +// jmarshall +class rvmScopedLexerBaseFolder +{ +public: + rvmScopedLexerBaseFolder(const char* baseFolder) + { + idLexer::SetBaseFolder(baseFolder); + } + + ~rvmScopedLexerBaseFolder() + { + idLexer::SetBaseFolder(""); + } +}; +// jmarshall end + #endif /* !__LEXER_H__ */ diff --git a/src/idlib/Parser.cpp b/src/idlib/Parser.cpp index 4686eef1..45d51c5c 100644 --- a/src/idlib/Parser.cpp +++ b/src/idlib/Parser.cpp @@ -3218,3 +3218,38 @@ idParser::~idParser( void ) { idParser::FreeSource( false ); } +/* +================ +idParser::Parse1DMatrixLegacy +================ +*/ +// jmarshall +int idParser::Parse1DMatrixLegacy(int x, float* m) +{ + int i; + + if (!idParser::ExpectTokenString("{")) + { + return false; + } + + for (i = 0; i < x; i++) + { + m[i] = idParser::ParseFloat(); + + if (i < x - 1) + { + if (!idParser::ExpectTokenString(",")) + { + return false; + } + } + } + + if (!idParser::ExpectTokenString("}")) + { + return false; + } + return true; +} +// jmarshall end \ No newline at end of file diff --git a/src/idlib/Parser.h b/src/idlib/Parser.h index 297c4cdf..14220051 100644 --- a/src/idlib/Parser.h +++ b/src/idlib/Parser.h @@ -80,6 +80,9 @@ class idParser { int SkipUntilString( const char *string ); // skip the rest of the current line int SkipRestOfLine( void ); +// jmarshall + int Parse1DMatrixLegacy(int x, float* m); +// jmarshall end // skip the braced section int SkipBracedSection( bool parseFirstBrace = true ); // parse a braced section into a string diff --git a/src/idlib/Str.cpp b/src/idlib/Str.cpp index 1ba1a740..be2462d5 100644 --- a/src/idlib/Str.cpp +++ b/src/idlib/Str.cpp @@ -2257,3 +2257,28 @@ idStr idStr::GetLastColorCode( void ) const { return ""; } + +// jmarshall +/* +=================== +idStr::StripDoubleQuotes +=================== +*/ +void idStr::StripDoubleQuotes(void) +{ + idStr temp = *this; + char* string = (char*)temp.c_str(); + + if (*string == '\"') + { + strcpy(string, string + 1); + } + + if (string[strlen(string) - 1] == '\"') + { + string[strlen(string) - 1] = '\0'; + } + + *this = string; +} +// jmarshall end \ No newline at end of file diff --git a/src/idlib/Str.h b/src/idlib/Str.h index 79f2b8f2..868251f7 100644 --- a/src/idlib/Str.h +++ b/src/idlib/Str.h @@ -202,6 +202,11 @@ class idStr { bool IsNumeric( void ) const; bool HasLower( void ) const; bool HasUpper( void ) const; + +// jmarshall + void StripDoubleQuotes(void); +// jmarshall end + // RAVEN BEGIN // bdube: escapes int IsEscape( int* type = NULL ) const; diff --git a/src/idlib/math/Math.cpp b/src/idlib/math/Math.cpp index 82faf689..78a59dc9 100644 --- a/src/idlib/math/Math.cpp +++ b/src/idlib/math/Math.cpp @@ -271,3 +271,69 @@ float idMath::ScaleToDb( float scale ) { } // RAVEN END + + +// jmarshall +/* +=================== +idMath::Distance +=================== +*/ +float idMath::Distance(idVec3 p1, idVec3 p2) +{ + idVec3 v = p2 - p1; + return v.Length(); +} + +/* +=================== +idMath::DistanceSquared +=================== +*/ +float idMath::DistanceSquared(idVec3 p1, idVec3 p2) +{ + idVec3 v = p2 - p1; + return v.LengthSqr(); +} + +/* +======================== +idMath::CrossProduct +======================== +*/ +idVec3 idMath::CrossProduct(const idVec3& a, const idVec3& b) +{ + return a.Cross(b); +} + +/* +======================== +idMath::CreateVector +======================== +*/ +idVec3 idMath::CreateVector(float x, float y, float z) +{ + return idVec3(x, y, z); +} + +/* +======================== +idMath::CreateVector +======================== +*/ +idVec4 idMath::CreateVector(float x, float y, float z, float w) +{ + return idVec4(x, y, z, w); +} + +/* +======================== +idMath::ReflectVector +======================== +*/ +idVec3 idMath::ReflectVector(idVec3 vector, idVec3 normal) +{ + float n = 2 * DotProduct(vector, normal); + return vector - normal * n; +} +// jmarshall end \ No newline at end of file diff --git a/src/idlib/math/Math.h b/src/idlib/math/Math.h index 08719522..f5c2e4a6 100644 --- a/src/idlib/math/Math.h +++ b/src/idlib/math/Math.h @@ -221,6 +221,29 @@ class idMath { static unsigned long Ftol(float f); // float to long conversion static byte Ftob( float f ); // float to byte conversion, the result is clamped to the range [0-255] +// jmarshall + static float AngleMod(float a); + static idVec3 ReflectVector(idVec3 vector, idVec3 normal); + static idVec4 CreateVector(float x, float y, float z, float w); + static idVec3 CreateVector(float x, float y, float z); + static idVec3 CrossProduct(const idVec3& a, const idVec3& b); + static float DistanceSquared(idVec3 p1, idVec3 p2); + static float Distance(idVec3 p1, idVec3 p2); + + static int Rand() + { + return rand(); + } + static float FRand() + { + return Rand() / (float)RAND_MAX; + } + static float FRandRange(float min, float max) + { + return min + (max - min) * FRand(); + } +// jmarshall end + static signed char ClampChar( int i ); // RAVEN BEGIN static byte ClampByte( int i ); @@ -1024,6 +1047,17 @@ ID_INLINE unsigned long idMath::Ftol(float f) { return (unsigned long)f; } +/* +======================== +idMath::Ftob +======================== +*/ +ID_INLINE float idMath::AngleMod(float a) +{ + a = (360.0 / 65536) * ((int)(a * (65536 / 360.0)) & 65535); + return a; +} + // RAVEN BEGIN // jscott: fast and reliable random routines diff --git a/src/renderer/Material.h b/src/renderer/Material.h index 8b40fdc8..86b6ec46 100644 --- a/src/renderer/Material.h +++ b/src/renderer/Material.h @@ -301,6 +301,11 @@ typedef enum { CONTENTS_PROJECTILECLIP = BIT(24), // unlike contents_projectile, projectiles only NOT hitscans // RAVEN END +// jmarshall - todo + CONTENTS_FOG = BIT(25), + CONTENTS_LAVA = BIT(26), + CONTENTS_SLIME = BIT(27), +// jmarshall end CONTENTS_REMOVE_UTIL = ~(CONTENTS_AREAPORTAL | CONTENTS_NOCSG) } contentsFlags_t; From e065f47bcefaacd840ec66533bb13e96d91d819e Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Mon, 26 Jul 2021 11:51:14 -0700 Subject: [PATCH 21/38] Fixed crash bug caused by rvmBot not being registered using the Q4 codebase method. --- src/game/gamesys/Class.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/game/gamesys/Class.cpp b/src/game/gamesys/Class.cpp index af7f344d..75407dd4 100644 --- a/src/game/gamesys/Class.cpp +++ b/src/game/gamesys/Class.cpp @@ -1427,6 +1427,10 @@ void idClass::RegisterClasses( void ) REGISTER(riDeadZonePowerup); // ..\..\code\game\Item.cpp REGISTER(WeaponNapalmGun); // ..\..\code\game\weapon\WeaponNapalmGun.cpp // RITUAL END + +// jmarshall + REGISTER(rvmBot); +// jmarshall end #undef REGISTER } From 98423164477cda7036c193c9effb079727f3faf2 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Mon, 26 Jul 2021 11:56:03 -0700 Subject: [PATCH 22/38] Added q4dm1 map AAS for bots. --- q4base/maps/mp/q4dm1.aas128 | 51 + q4base/maps/mp/q4dm1.aas250 | 51 + q4base/maps/mp/q4dm1.aas32 | 46195 ++++++++++++++++++++++++++++++++++ q4base/maps/mp/q4dm1.aas48 | 51 + q4base/maps/mp/q4dm1.aas96 | 51 + 5 files changed, 46399 insertions(+) create mode 100644 q4base/maps/mp/q4dm1.aas128 create mode 100644 q4base/maps/mp/q4dm1.aas250 create mode 100644 q4base/maps/mp/q4dm1.aas32 create mode 100644 q4base/maps/mp/q4dm1.aas48 create mode 100644 q4base/maps/mp/q4dm1.aas96 diff --git a/q4base/maps/mp/q4dm1.aas128 b/q4base/maps/mp/q4dm1.aas128 new file mode 100644 index 00000000..eb5442b5 --- /dev/null +++ b/q4base/maps/mp/q4dm1.aas128 @@ -0,0 +1,51 @@ +DewmAAS "1.08" + +1013305419 + +settings +{ + bboxes + { + (-64 -64 -96)-(64 64 40) + } + usePatches = 0 + writeBrushMap = 0 + playerFlood = 0 + allowSwimReachabilities = 0 + allowFlyReachabilities = 0 + generateAllFaces = 0 + generateTacticalFeatures = 0 + fileExtension = "aas128" + gravity = (0 0 -1050) + maxStepHeight = 16 + maxBarrierHeight = 0 + maxWaterJumpHeight = 0 + maxFallHeight = 0 + minFloorCos = 0.3999999762 + tt_barrierJump = 0 + tt_startCrouching = 0 + tt_waterJump = 0 + tt_startWalkOffLedge = 0 +} +planes 0 { +} +vertices 0 { +} +edges 0 { +} +edgeIndex 0 { +} +faces 0 { +} +faceIndex 0 { +} +areas 0 { +} +nodes 0 { +} +portals 0 { +} +portalIndex 0 { +} +clusters 0 { +} diff --git a/q4base/maps/mp/q4dm1.aas250 b/q4base/maps/mp/q4dm1.aas250 new file mode 100644 index 00000000..3ff5f03b --- /dev/null +++ b/q4base/maps/mp/q4dm1.aas250 @@ -0,0 +1,51 @@ +DewmAAS "1.08" + +1013305419 + +settings +{ + bboxes + { + (-124 -124 0)-(124 124 250) + } + usePatches = 0 + writeBrushMap = 0 + playerFlood = 0 + allowSwimReachabilities = 0 + allowFlyReachabilities = 0 + generateAllFaces = 0 + generateTacticalFeatures = 0 + fileExtension = "aas250" + gravity = (0 0 -1050) + maxStepHeight = 16 + maxBarrierHeight = 0 + maxWaterJumpHeight = 0 + maxFallHeight = 0 + minFloorCos = 0.3999999762 + tt_barrierJump = 0 + tt_startCrouching = 0 + tt_waterJump = 0 + tt_startWalkOffLedge = 0 +} +planes 0 { +} +vertices 0 { +} +edges 0 { +} +edgeIndex 0 { +} +faces 0 { +} +faceIndex 0 { +} +areas 0 { +} +nodes 0 { +} +portals 0 { +} +portalIndex 0 { +} +clusters 0 { +} diff --git a/q4base/maps/mp/q4dm1.aas32 b/q4base/maps/mp/q4dm1.aas32 new file mode 100644 index 00000000..79ec8d85 --- /dev/null +++ b/q4base/maps/mp/q4dm1.aas32 @@ -0,0 +1,46195 @@ +DewmAAS "1.08" + +1013305419 + +settings +{ + bboxes + { + (-16 -16 0)-(16 16 80) + } + usePatches = 0 + writeBrushMap = 0 + playerFlood = 1 + allowSwimReachabilities = 0 + allowFlyReachabilities = 1 + generateAllFaces = 0 + generateTacticalFeatures = 1 + fileExtension = "aas32" + gravity = (0 0 -1050) + maxStepHeight = 16 + maxBarrierHeight = 0 + maxWaterJumpHeight = 0 + maxFallHeight = 0 + minFloorCos = 0.6999999881 + tt_barrierJump = 100 + tt_startCrouching = 100 + tt_waterJump = 100 + tt_startWalkOffLedge = 100 +} +planes 1620 { + 0 ( 1 0 0 -4096 ) + 1 ( -1 0 0 4096 ) + 2 ( 0 1 0 4096 ) + 3 ( 0 -1 0 -4096 ) + 4 ( 0 1 0 6144 ) + 5 ( 0 -1 0 -6144 ) + 6 ( 0 0 1 0 ) + 7 ( 0 0 -1 0 ) + 8 ( 0 0 1 2048 ) + 9 ( 0 0 -1 -2048 ) + 10 ( 0 0 1 2352 ) + 11 ( 0 0 -1 -2352 ) + 12 ( 1 0 0 -3600 ) + 13 ( -1 0 0 3600 ) + 14 ( 0 1 0 7280 ) + 15 ( 0 -1 0 -7280 ) + 16 ( 1 0 0 -5168 ) + 17 ( -1 0 0 5168 ) + 18 ( 0 1 0 6512 ) + 19 ( 0 -1 0 -6512 ) + 20 ( 1 0 0 -3088 ) + 21 ( -1 0 0 3088 ) + 22 ( 0 1 0 6192 ) + 23 ( 0 -1 0 -6192 ) + 24 ( 0 0 1 632 ) + 25 ( 0 0 -1 -632 ) + 26 ( 0 0 1 568 ) + 27 ( 0 0 -1 -568 ) + 28 ( 1 0 0 -3616 ) + 29 ( -1 0 0 3616 ) + 30 ( 0 0 1 144 ) + 31 ( 0 0 -1 -144 ) + 32 ( 1 0 0 -3720 ) + 33 ( -1 0 0 3720 ) + 34 ( 0 0 1 192 ) + 35 ( 0 0 -1 -192 ) + 36 ( 0 1 0 6160.0009765625 ) + 37 ( 0 -1 0 -6160.0009765625 ) + 38 ( 1 0 0 -3779.6884765625 ) + 39 ( -1 0 0 3779.6884765625 ) + 40 ( 1 0 0 -3763.6884765625 ) + 41 ( -1 0 0 3763.6884765625 ) + 42 ( 0 0 1 255.9998779297 ) + 43 ( 0 0 -1 -255.9998779297 ) + 44 ( 0 1 0 6176.0009765625 ) + 45 ( 0 -1 0 -6176.0009765625 ) + 46 ( 1 0 0 -3784 ) + 47 ( -1 0 0 3784 ) + 48 ( 0 1 0 6112 ) + 49 ( 0 -1 0 -6112 ) + 50 ( 0 0 1 160 ) + 51 ( 0 0 -1 -160 ) + 52 ( -0.9612616897 0.2756373584 0 5331.0703125 ) + 53 ( 0.9612616897 -0.2756373584 0 -5331.0703125 ) + 54 ( 0 0 1 224 ) + 55 ( 0 0 -1 -224 ) + 56 ( 0 0 1 360 ) + 57 ( 0 0 -1 -360 ) + 58 ( 0 0 1 456 ) + 59 ( 0 0 -1 -456 ) + 60 ( 1 0 0 -3632 ) + 61 ( -1 0 0 3632 ) + 62 ( 0 1 0 5536 ) + 63 ( 0 -1 0 -5536 ) + 64 ( 1 0 0 -3704 ) + 65 ( -1 0 0 3704 ) + 66 ( 0 0 1 63.9923553467 ) + 67 ( 0 0 -1 -63.9923553467 ) + 68 ( 1 0 0 -3672 ) + 69 ( -1 0 0 3672 ) + 70 ( 1 0 0 -3968 ) + 71 ( -1 0 0 3968 ) + 72 ( 1 0 0 -3967.9846191406 ) + 73 ( -1 0 0 3967.9846191406 ) + 74 ( 0 1 0 5760 ) + 75 ( 0 -1 0 -5760 ) + 76 ( 1 0 0 -4079.9968261719 ) + 77 ( -1 0 0 4079.9968261719 ) + 78 ( 0 1 0 6064.0009765625 ) + 79 ( 0 -1 0 -6064.0009765625 ) + 80 ( -0.4472136497 -0.0000000533 0.8944271803 1831.7799072266 ) + 81 ( 0.4472136497 0.0000000533 -0.8944271803 -1831.7799072266 ) + 82 ( 1 0 0 -3536 ) + 83 ( -1 0 0 3536 ) + 84 ( 0 1 0 5520 ) + 85 ( 0 -1 0 -5520 ) + 86 ( 1 0 0 -3439.998046875 ) + 87 ( -1 0 0 3439.998046875 ) + 88 ( 0 1 0 6164.0004882813 ) + 89 ( 0 -1 0 -6164.0004882813 ) + 90 ( 0 1 0 6316.0078125 ) + 91 ( 0 -1 0 -6316.0078125 ) + 92 ( 1 0 0 -3091.9875488281 ) + 93 ( -1 0 0 3091.9875488281 ) + 94 ( 1 0 0 -3124.0021972656 ) + 95 ( -1 0 0 3124.0021972656 ) + 96 ( -0.8944272399 -0.0000003732 -0.4472135007 2540.1730957031 ) + 97 ( 0.8944272399 0.0000003732 0.4472135007 -2540.1730957031 ) + 98 ( 1 0 0 -3344 ) + 99 ( -1 0 0 3344 ) + 100 ( 1 0 0 -3376 ) + 101 ( -1 0 0 3376 ) + 102 ( 0.7071067691 0 -0.7071067691 -2834.0837402344 ) + 103 ( -0.7071067691 0 0.7071067691 2834.0837402344 ) + 104 ( -0.7071067691 0 -0.7071067691 1917.6734619141 ) + 105 ( 0.7071067691 0 0.7071067691 -1917.6734619141 ) + 106 ( 1 0 0 -3563.9987792969 ) + 107 ( -1 0 0 3563.9987792969 ) + 108 ( 0 0 1 728 ) + 109 ( 0 0 -1 -728 ) + 110 ( 0 0 1 743.9992675781 ) + 111 ( 0 0 -1 -743.9992675781 ) + 112 ( 1 0 0 -3696 ) + 113 ( -1 0 0 3696 ) + 114 ( 1 0 0 -3583.9985351563 ) + 115 ( -1 0 0 3583.9985351563 ) + 116 ( 0 1 0 5648 ) + 117 ( 0 -1 0 -5648 ) + 118 ( 0 0 1 920 ) + 119 ( 0 0 -1 -920 ) + 120 ( 0 0 1 759.9986572266 ) + 121 ( 0 0 -1 -759.9986572266 ) + 122 ( 0 -0.7071067691 -0.7071067691 -4915.8061523438 ) + 123 ( 0 0.7071067691 0.7071067691 4915.8061523438 ) + 124 ( -0.7071069479 0.0000001686 0.7071065903 3060.3581542969 ) + 125 ( 0.7071069479 -0.0000001686 -0.7071065903 -3060.3581542969 ) + 126 ( 0 1 0 6352 ) + 127 ( 0 -1 0 -6352 ) + 128 ( 0 1 0 6224 ) + 129 ( 0 -1 0 -6224 ) + 130 ( 1 0 0 -3728 ) + 131 ( -1 0 0 3728 ) + 132 ( -0.7071067691 -0.7071067691 0 -1764.9384765625 ) + 133 ( 0.7071067691 0.7071067691 0 1764.9384765625 ) + 134 ( 0 1 0 6240 ) + 135 ( 0 -1 0 -6240 ) + 136 ( 0.7071067691 0.7071067691 0 1787.5659179688 ) + 137 ( -0.7071067691 -0.7071067691 0 -1787.5659179688 ) + 138 ( 1 0 0 -3680 ) + 139 ( -1 0 0 3680 ) + 140 ( 1 0 0 -3647.9997558594 ) + 141 ( -1 0 0 3647.9997558594 ) + 142 ( 0 1 0 6208 ) + 143 ( 0 -1 0 -6208 ) + 144 ( 1 0 0 -3744 ) + 145 ( -1 0 0 3744 ) + 146 ( 0 1 0 6768.0009765625 ) + 147 ( 0 -1 0 -6768.0009765625 ) + 148 ( 0 1 0 6592.0014648438 ) + 149 ( 0 -1 0 -6592.0014648438 ) + 150 ( -0.7071067691 0 -0.7071067691 2098.6928710938 ) + 151 ( 0.7071067691 0 0.7071067691 -2098.6928710938 ) + 152 ( 1 0 0 -3200.0085449219 ) + 153 ( -1 0 0 3200.0085449219 ) + 154 ( 1 0 0 -3104.0085449219 ) + 155 ( -1 0 0 3104.0085449219 ) + 156 ( 0 1 0 6320.0048828125 ) + 157 ( 0 -1 0 -6320.0048828125 ) + 158 ( 1 0 0 -3328.0085449219 ) + 159 ( -1 0 0 3328.0085449219 ) + 160 ( 1 0 0 -3424.0085449219 ) + 161 ( -1 0 0 3424.0085449219 ) + 162 ( 1 0 0 -3280.0085449219 ) + 163 ( -1 0 0 3280.0085449219 ) + 164 ( 1 0 0 -3248.0085449219 ) + 165 ( -1 0 0 3248.0085449219 ) + 166 ( 0 0 1 544 ) + 167 ( 0 0 -1 -544 ) + 168 ( -0.0000001897 -0.7071069479 0.7071065903 -4016.3720703125 ) + 169 ( 0.0000001897 0.7071069479 -0.7071065903 4016.3720703125 ) + 170 ( 0 1 0 6608.0014648438 ) + 171 ( 0 -1 0 -6608.0014648438 ) + 172 ( 0 1 0 6416.0048828125 ) + 173 ( 0 -1 0 -6416.0048828125 ) + 174 ( 0 0 1 368 ) + 175 ( 0 0 -1 -368 ) + 176 ( 0 1 0 6576 ) + 177 ( 0 -1 0 -6576 ) + 178 ( 1 0 0 -4115.9965820313 ) + 179 ( -1 0 0 4115.9965820313 ) + 180 ( 0 0 1 584 ) + 181 ( 0 0 -1 -584 ) + 182 ( 0 0 1 1584 ) + 183 ( 0 0 -1 -1584 ) + 184 ( 0 1 0 7200.0004882813 ) + 185 ( 0 -1 0 -7200.0004882813 ) + 186 ( 1 0 0 -3808.0002441406 ) + 187 ( -1 0 0 3808.0002441406 ) + 188 ( 0 1 0 7215.9995117188 ) + 189 ( 0 -1 0 -7215.9995117188 ) + 190 ( 1 0 0 -3872.0002441406 ) + 191 ( -1 0 0 3872.0002441406 ) + 192 ( 1 0 0 -3824.0002441406 ) + 193 ( -1 0 0 3824.0002441406 ) + 194 ( 0 1 0 7231.9995117188 ) + 195 ( 0 -1 0 -7231.9995117188 ) + 196 ( 1 0 0 -3856.0002441406 ) + 197 ( -1 0 0 3856.0002441406 ) + 198 ( 0 1 0 7136 ) + 199 ( 0 -1 0 -7136 ) + 200 ( 1 0 0 -3984.0004882813 ) + 201 ( -1 0 0 3984.0004882813 ) + 202 ( 1 0 0 -3791.9995117188 ) + 203 ( -1 0 0 3791.9995117188 ) + 204 ( 0 1 0 7184.0004882813 ) + 205 ( 0 -1 0 -7184.0004882813 ) + 206 ( 0 1 0 7152 ) + 207 ( 0 -1 0 -7152 ) + 208 ( 1 0 0 -3775.9995117188 ) + 209 ( -1 0 0 3775.9995117188 ) + 210 ( 1 0 0 -3712 ) + 211 ( -1 0 0 3712 ) + 212 ( 1 0 0 -3888 ) + 213 ( -1 0 0 3888 ) + 214 ( 1 0 0 -3904 ) + 215 ( -1 0 0 3904 ) + 216 ( 0 1 0 7120.0004882813 ) + 217 ( 0 -1 0 -7120.0004882813 ) + 218 ( 0 1 0 7024 ) + 219 ( 0 -1 0 -7024 ) + 220 ( 0 1 0 7104.0004882813 ) + 221 ( 0 -1 0 -7104.0004882813 ) + 222 ( 0 1 0 7040 ) + 223 ( 0 -1 0 -7040 ) + 224 ( 0 1 0 6816 ) + 225 ( 0 -1 0 -6816 ) + 226 ( 0 0 1 784 ) + 227 ( 0 0 -1 -784 ) + 228 ( 0 1 0 6800 ) + 229 ( 0 -1 0 -6800 ) + 230 ( 0 1 0 6784.0009765625 ) + 231 ( 0 -1 0 -6784.0009765625 ) + 232 ( 1 0 0 -3752 ) + 233 ( -1 0 0 3752 ) + 234 ( 0 1 0 5072 ) + 235 ( 0 -1 0 -5072 ) + 236 ( 1 0 0 -3472 ) + 237 ( -1 0 0 3472 ) + 238 ( 0 1 0 5264 ) + 239 ( 0 -1 0 -5264 ) + 240 ( 0 1 0 4784 ) + 241 ( 0 -1 0 -4784 ) + 242 ( 0 1 0 5488 ) + 243 ( 0 -1 0 -5488 ) + 244 ( 1 0 0 -3503.9997558594 ) + 245 ( -1 0 0 3503.9997558594 ) + 246 ( 0 0 1 648 ) + 247 ( 0 0 -1 -648 ) + 248 ( 0 1 0 4912.0004882813 ) + 249 ( 0 -1 0 -4912.0004882813 ) + 250 ( 0 1 0 4976 ) + 251 ( 0 -1 0 -4976 ) + 252 ( 0 0 1 672 ) + 253 ( 0 0 -1 -672 ) + 254 ( 1 0 0 -3184 ) + 255 ( -1 0 0 3184 ) + 256 ( 1 0 0 -3119.9997558594 ) + 257 ( -1 0 0 3119.9997558594 ) + 258 ( 0 0 1 896 ) + 259 ( 0 0 -1 -896 ) + 260 ( 1 0 0 -3760 ) + 261 ( -1 0 0 3760 ) + 262 ( 0 1 0 5160 ) + 263 ( 0 -1 0 -5160 ) + 264 ( 1 0 0 -3152 ) + 265 ( -1 0 0 3152 ) + 266 ( 1 0 0 -3312.0002441406 ) + 267 ( -1 0 0 3312.0002441406 ) + 268 ( 0 0 1 600 ) + 269 ( 0 0 -1 -600 ) + 270 ( 0 -0.3511226475 0.936329484 -1432.5782470703 ) + 271 ( 0 0.3511226475 -0.936329484 1432.5782470703 ) + 272 ( 0 1 0 5140 ) + 273 ( 0 -1 0 -5140 ) + 274 ( -0.4472135901 0 -0.8944271803 901.5825805664 ) + 275 ( 0.4472135901 0 0.8944271803 -901.5825805664 ) + 276 ( 0.4472135901 0 -0.8944271803 -1989.2059326172 ) + 277 ( -0.4472135901 0 0.8944271803 1989.2059326172 ) + 278 ( 0 1 0 5168 ) + 279 ( 0 -1 0 -5168 ) + 280 ( 1 0 0 -3320 ) + 281 ( -1 0 0 3320 ) + 282 ( 0 0 1 536 ) + 283 ( 0 0 -1 -536 ) + 284 ( 0.9701424837 0 -0.2425356209 -3350.8723144531 ) + 285 ( -0.9701424837 0 0.2425356209 3350.8723144531 ) + 286 ( 0.9701424837 0 0.2425356358 -3094.7546386719 ) + 287 ( -0.9701424837 0 -0.2425356358 3094.7546386719 ) + 288 ( -0.9701424837 0 -0.2425356209 2920.12890625 ) + 289 ( 0.9701424837 0 0.2425356209 -2920.12890625 ) + 290 ( 1 0 0 -3144.00390625 ) + 291 ( -1 0 0 3144.00390625 ) + 292 ( -0.9701424837 0 0.2425356209 3176.2463378906 ) + 293 ( 0.9701424837 0 -0.2425356209 -3176.2463378906 ) + 294 ( 1 0 0 -3080 ) + 295 ( -1 0 0 3080 ) + 296 ( 0 1 0 4944 ) + 297 ( 0 -1 0 -4944 ) + 298 ( 0 1 0 5104 ) + 299 ( 0 -1 0 -5104 ) + 300 ( 0 0 1 384.0065002441 ) + 301 ( 0 0 -1 -384.0065002441 ) + 302 ( 1 0 0 -3351.9997558594 ) + 303 ( -1 0 0 3351.9997558594 ) + 304 ( 0.3511234522 0 0.936329186 -803.3704223633 ) + 305 ( -0.3511234522 0 -0.936329186 803.3704223633 ) + 306 ( -0.0000000267 0.4472136199 -0.8944271803 1702.9897460938 ) + 307 ( 0.0000000267 -0.4472136199 0.8944271803 -1702.9897460938 ) + 308 ( 0 1 0 5008 ) + 309 ( 0 -1 0 -5008 ) + 310 ( 1 0 0 -3136 ) + 311 ( -1 0 0 3136 ) + 312 ( 0 1 0 4880 ) + 313 ( 0 -1 0 -4880 ) + 314 ( 1 0 0 -3295.9997558594 ) + 315 ( -1 0 0 3295.9997558594 ) + 316 ( 1 0 0 -3168 ) + 317 ( -1 0 0 3168 ) + 318 ( -0.7071067691 0 -0.7071067691 1838.4775390625 ) + 319 ( 0.7071067691 0 0.7071067691 -1838.4775390625 ) + 320 ( 0.7071067691 0 -0.7071067691 -2732.2604980469 ) + 321 ( -0.7071067691 0 0.7071067691 2732.2604980469 ) + 322 ( 0 1 0 4904 ) + 323 ( 0 -1 0 -4904 ) + 324 ( 0 -0.3162277639 0.9486833215 -1189.0114746094 ) + 325 ( 0 0.3162277639 -0.9486833215 1189.0114746094 ) + 326 ( 0 1 0 4888 ) + 327 ( 0 -1 0 -4888 ) + 328 ( 0 1 0 5120 ) + 329 ( 0 -1 0 -5120 ) + 330 ( 0 1 0 4928 ) + 331 ( 0 -1 0 -4928 ) + 332 ( 1 0 0 -3499.9997558594 ) + 333 ( -1 0 0 3499.9997558594 ) + 334 ( 0 -0.9701424837 0.2425356209 -4841.01171875 ) + 335 ( 0 0.9701424837 -0.2425356209 4841.01171875 ) + 336 ( 0 0.9701424837 0.2425356209 4906.9809570313 ) + 337 ( 0 -0.9701424837 -0.2425356209 -4906.9809570313 ) + 338 ( 0 -0.4472135901 -0.8944271803 -2790.6130371094 ) + 339 ( 0 0.4472135901 0.8944271803 2790.6130371094 ) + 340 ( -0.8000000119 0 0.6000000238 2771.2001953125 ) + 341 ( 0.8000000119 0 -0.6000000238 -2771.2001953125 ) + 342 ( 0.8000000119 0 0.6000000238 -2399.9968261719 ) + 343 ( -0.8000000119 0 -0.6000000238 2399.9968261719 ) + 344 ( 0 0 1 304 ) + 345 ( 0 0 -1 -304 ) + 346 ( 0 0 1 296 ) + 347 ( 0 0 -1 -296 ) + 348 ( 0 0 1 376 ) + 349 ( 0 0 -1 -376 ) + 350 ( 1 0 0 -3408 ) + 351 ( -1 0 0 3408 ) + 352 ( 0 1 0 5328 ) + 353 ( 0 -1 0 -5328 ) + 354 ( 0 1 0 5424 ) + 355 ( 0 -1 0 -5424 ) + 356 ( 0 1 0 5460 ) + 357 ( 0 -1 0 -5460 ) + 358 ( 0 1 0 5612.0004882813 ) + 359 ( 0 -1 0 -5612.0004882813 ) + 360 ( 0 1 0 5304 ) + 361 ( 0 -1 0 -5304 ) + 362 ( 0 0.8000000119 0.6000000238 4555.1997070313 ) + 363 ( 0 -0.8000000119 -0.6000000238 -4555.1997070313 ) + 364 ( 0 1 0 5292 ) + 365 ( 0 -1 0 -5292 ) + 366 ( 0 1 0 5295.9970703125 ) + 367 ( 0 -1 0 -5295.9970703125 ) + 368 ( 0 0 1 504 ) + 369 ( 0 0 -1 -504 ) + 370 ( 1 0 0 -3475.9990234375 ) + 371 ( -1 0 0 3475.9990234375 ) + 372 ( 1 0 0 -3619.9995117188 ) + 373 ( -1 0 0 3619.9995117188 ) + 374 ( 0 1 0 5232 ) + 375 ( 0 -1 0 -5232 ) + 376 ( 0 1 0 4960 ) + 377 ( 0 -1 0 -4960 ) + 378 ( 0 1 0 5200 ) + 379 ( 0 -1 0 -5200 ) + 380 ( 1 0 0 -3511.9995117188 ) + 381 ( -1 0 0 3511.9995117188 ) + 382 ( 1 0 0 -3536.0187988281 ) + 383 ( -1 0 0 3536.0187988281 ) + 384 ( 0 1 0 5228.0009765625 ) + 385 ( 0 -1 0 -5228.0009765625 ) + 386 ( -0.8000000715 -0.0000000715 0.5999999046 3121.6149902344 ) + 387 ( 0.8000000715 0.0000000715 -0.5999999046 -3121.6149902344 ) + 388 ( 1 0 0 -3568 ) + 389 ( -1 0 0 3568 ) + 390 ( 1 0 0 -3664 ) + 391 ( -1 0 0 3664 ) + 392 ( 0 1 0 4952 ) + 393 ( 0 -1 0 -4952 ) + 394 ( 0 1 0 4848 ) + 395 ( 0 -1 0 -4848 ) + 396 ( 0 1 0 4844.0083007813 ) + 397 ( 0 -1 0 -4844.0083007813 ) + 398 ( 1 0 0 -3920 ) + 399 ( -1 0 0 3920 ) + 400 ( 1 0 0 -4016.0092773438 ) + 401 ( -1 0 0 4016.0092773438 ) + 402 ( 1 0 0 -4048 ) + 403 ( -1 0 0 4048 ) + 404 ( 1 0 0 -3819.9997558594 ) + 405 ( -1 0 0 3819.9997558594 ) + 406 ( 0 0 1 800 ) + 407 ( 0 0 -1 -800 ) + 408 ( 1 0 0 -4000 ) + 409 ( -1 0 0 4000 ) + 410 ( 0 1 0 5216 ) + 411 ( 0 -1 0 -5216 ) + 412 ( 0 0 1 560 ) + 413 ( 0 0 -1 -560 ) + 414 ( 1 0 0 -4192 ) + 415 ( -1 0 0 4192 ) + 416 ( 0 0 1 176 ) + 417 ( 0 0 -1 -176 ) + 418 ( 0 1 0 4816 ) + 419 ( 0 -1 0 -4816 ) + 420 ( 0 0 1 104.0273742676 ) + 421 ( 0 0 -1 -104.0273742676 ) + 422 ( -0.0000001897 0.7071070075 -0.7071065903 3411.0666503906 ) + 423 ( 0.0000001897 -0.7071070075 0.7071065903 -3411.0666503906 ) + 424 ( -0.7071069479 -0.0000001686 -0.7071065903 2732.2509765625 ) + 425 ( 0.7071069479 0.0000001686 0.7071065903 -2732.2509765625 ) + 426 ( 0 1 0 5151.9755859375 ) + 427 ( 0 -1 0 -5151.9755859375 ) + 428 ( -0.0000000666 0.4472136497 0.8944271803 2361.27734375 ) + 429 ( 0.0000000666 -0.4472136497 -0.8944271803 -2361.27734375 ) + 430 ( 1 0 0 -4088 ) + 431 ( -1 0 0 4088 ) + 432 ( 1 0 0 -3976 ) + 433 ( -1 0 0 3976 ) + 434 ( 0 1 0 5360.0004882813 ) + 435 ( 0 -1 0 -5360.0004882813 ) + 436 ( 0 1 0 5280 ) + 437 ( 0 -1 0 -5280 ) + 438 ( 0 1 0 5376.0004882813 ) + 439 ( 0 -1 0 -5376.0004882813 ) + 440 ( 1 0 0 -3839.9997558594 ) + 441 ( -1 0 0 3839.9997558594 ) + 442 ( 0 0 1 688 ) + 443 ( 0 0 -1 -688 ) + 444 ( -0.7071068287 -0.0000000843 -0.7071067095 2240.1137695313 ) + 445 ( 0.7071068287 0.0000000843 0.7071067095 -2240.1137695313 ) + 446 ( 0 1 0 5456 ) + 447 ( 0 -1 0 -5456 ) + 448 ( 0 1 0 5472 ) + 449 ( 0 -1 0 -5472 ) + 450 ( -0.4472136796 -0.0000001333 0.8944271207 1781.6988525391 ) + 451 ( 0.4472136796 0.0000001333 -0.8944271207 -1781.6988525391 ) + 452 ( 0 1 0 5696 ) + 453 ( 0 -1 0 -5696 ) + 454 ( 0.0000001475 0.7071069479 0.7071065903 4265.2622070313 ) + 455 ( -0.0000001475 -0.7071069479 -0.7071065903 -4265.2622070313 ) + 456 ( 0 1 0 5248 ) + 457 ( 0 -1 0 -5248 ) + 458 ( 1 0 0 -4719.9907226563 ) + 459 ( -1 0 0 4719.9907226563 ) + 460 ( 0 0 1 88 ) + 461 ( 0 0 -1 -88 ) + 462 ( 0 0 1 312 ) + 463 ( 0 0 -1 -312 ) + 464 ( 0 0 1 89 ) + 465 ( 0 0 -1 -89 ) + 466 ( 0 1 0 5392 ) + 467 ( 0 -1 0 -5392 ) + 468 ( 0 0 1 72 ) + 469 ( 0 0 -1 -72 ) + 470 ( 0 0 1 80 ) + 471 ( 0 0 -1 -80 ) + 472 ( 1 0 0 -3655.9995117188 ) + 473 ( -1 0 0 3655.9995117188 ) + 474 ( 1 0 0 -3520 ) + 475 ( -1 0 0 3520 ) + 476 ( 0 1 0 5664 ) + 477 ( 0 -1 0 -5664 ) + 478 ( -0.7071067691 -0.7071067691 0 -1527.3505859375 ) + 479 ( 0.7071067691 0.7071067691 0 1527.3505859375 ) + 480 ( -0.7071067691 0.7071067691 0 6550.6372070313 ) + 481 ( 0.7071067691 -0.7071067691 0 -6550.6372070313 ) + 482 ( 0 1 0 5712 ) + 483 ( 0 -1 0 -5712 ) + 484 ( 1 0 0 -3951.9985351563 ) + 485 ( -1 0 0 3951.9985351563 ) + 486 ( -0.9922778606 0 0.1240347326 3588.0766601563 ) + 487 ( 0.9922778606 0 -0.1240347326 -3588.0766601563 ) + 488 ( 0 1 0 5512 ) + 489 ( 0 -1 0 -5512 ) + 490 ( 1 0 0 -3607.9892578125 ) + 491 ( -1 0 0 3607.9892578125 ) + 492 ( -0.9701424837 -0.0000001735 0.242535606 3562.3518066406 ) + 493 ( 0.9701424837 0.0000001735 -0.242535606 -3562.3518066406 ) + 494 ( 0 1 0 6048.0009765625 ) + 495 ( 0 -1 0 -6048.0009765625 ) + 496 ( 1 0 0 -3789.4738769531 ) + 497 ( -1 0 0 3789.4738769531 ) + 498 ( 0 1 0 6114.3149414063 ) + 499 ( 0 -1 0 -6114.3149414063 ) + 500 ( -0.2756412923 -0.9612605572 0 -4848.3305664063 ) + 501 ( 0.2756412923 0.9612605572 0 4848.3305664063 ) + 502 ( 0 1 0 6130.3149414063 ) + 503 ( 0 -1 0 -6130.3149414063 ) + 504 ( 0.2756412923 0.9612605572 0 4868.12109375 ) + 505 ( -0.2756412923 -0.9612605572 0 -4868.12109375 ) + 506 ( 0 1 0 5768 ) + 507 ( 0 -1 0 -5768 ) + 508 ( 0 1 0 5880 ) + 509 ( 0 -1 0 -5880 ) + 510 ( 0 1 0 5784 ) + 511 ( 0 -1 0 -5784 ) + 512 ( 0 1 0 5864 ) + 513 ( 0 -1 0 -5864 ) + 514 ( -0.2756373584 -0.9612616897 0 -4848.3520507813 ) + 515 ( 0.2756373584 0.9612616897 0 4848.3520507813 ) + 516 ( 1 0 0 -3934.5375976563 ) + 517 ( -1 0 0 3934.5375976563 ) + 518 ( 0 1 0 5772.46484375 ) + 519 ( 0 -1 0 -5772.46484375 ) + 520 ( -0.6819989681 -0.7313531637 0 -1578.2614746094 ) + 521 ( 0.6819989681 0.7313531637 0 1578.2614746094 ) + 522 ( 0 1 0 5917.5327148438 ) + 523 ( 0 -1 0 -5917.5327148438 ) + 524 ( -0.7313521504 0.682000041 0 6873.38671875 ) + 525 ( 0.7313521504 -0.682000041 0 -6873.38671875 ) + 526 ( 0.7313529849 -0.6819991469 0 -6748.1611328125 ) + 527 ( -0.7313529849 0.6819991469 0 6748.1611328125 ) + 528 ( 0.6819989681 0.7313531637 0 1703.4848632813 ) + 529 ( -0.6819989681 -0.7313531637 0 -1703.4848632813 ) + 530 ( 1 0 0 -3805.4738769531 ) + 531 ( -1 0 0 3805.4738769531 ) + 532 ( -0.7313529849 0.6819991469 0 6770.7749023438 ) + 533 ( 0.7313529849 -0.6819991469 0 -6770.7749023438 ) + 534 ( 0 1 0 5788.46484375 ) + 535 ( 0 -1 0 -5788.46484375 ) + 536 ( 0.6819989681 0.7313531637 0 1600.8751220703 ) + 537 ( -0.6819989681 -0.7313531637 0 -1600.8751220703 ) + 538 ( 1 0 0 -3918.5375976563 ) + 539 ( -1 0 0 3918.5375976563 ) + 540 ( 0.7313521504 -0.682000041 0 -6850.7729492188 ) + 541 ( -0.7313521504 0.682000041 0 6850.7729492188 ) + 542 ( 0 1 0 5901.5327148438 ) + 543 ( 0 -1 0 -5901.5327148438 ) + 544 ( -0.6819989681 -0.7313531637 0 -1680.8712158203 ) + 545 ( 0.6819989681 0.7313531637 0 1680.8712158203 ) + 546 ( 1 0 0 -3863.9765625 ) + 547 ( -1 0 0 3863.9765625 ) + 548 ( 0 1 0 5843.0234375 ) + 549 ( 0 -1 0 -5843.0234375 ) + 550 ( 1 0 0 -3860.0329589844 ) + 551 ( -1 0 0 3860.0329589844 ) + 552 ( 0 1 0 5920 ) + 553 ( 0 -1 0 -5920 ) + 554 ( 1 0 0 -3960 ) + 555 ( -1 0 0 3960 ) + 556 ( 1 0 0 -3944 ) + 557 ( -1 0 0 3944 ) + 558 ( 0 1 0 5904 ) + 559 ( 0 -1 0 -5904 ) + 560 ( 0 1 0 5823.9990234375 ) + 561 ( 0 -1 0 -5823.9990234375 ) + 562 ( 0 1 0 5807.9990234375 ) + 563 ( 0 -1 0 -5807.9990234375 ) + 564 ( 1 0 0 -3848 ) + 565 ( -1 0 0 3848 ) + 566 ( 0 1 0 6128 ) + 567 ( 0 -1 0 -6128 ) + 568 ( -0.7069125175 0.7073010206 0 6754.7407226563 ) + 569 ( 0.7069125175 -0.7073010206 0 -6754.7407226563 ) + 570 ( -0.7071067691 -0.7071067691 0 -1730.9973144531 ) + 571 ( 0.7071067691 0.7071067691 0 1730.9973144531 ) + 572 ( 0 1 0 5952 ) + 573 ( 0 -1 0 -5952 ) + 574 ( 0 1 0 5552 ) + 575 ( 0 -1 0 -5552 ) + 576 ( 1 0 0 -3087.9892578125 ) + 577 ( -1 0 0 3087.9892578125 ) + 578 ( 0 1 0 5584 ) + 579 ( 0 -1 0 -5584 ) + 580 ( 0 1 0 5776 ) + 581 ( 0 -1 0 -5776 ) + 582 ( -0.8944272399 -0.0000000533 -0.4472135007 2536.5815429688 ) + 583 ( 0.8944272399 0.0000000533 0.4472135007 -2536.5815429688 ) + 584 ( 0 1 0 5967.9990234375 ) + 585 ( 0 -1 0 -5967.9990234375 ) + 586 ( 0 1 0 6015.9990234375 ) + 587 ( 0 -1 0 -6015.9990234375 ) + 588 ( 0 1 0 5504 ) + 589 ( 0 -1 0 -5504 ) + 590 ( -0.0000000421 0.7071068287 -0.7071067691 3416.7407226563 ) + 591 ( 0.0000000421 -0.7071068287 0.7071067691 -3416.7407226563 ) + 592 ( 0.8944271803 0 0.4472135901 -2815.6567382813 ) + 593 ( -0.8944271803 0 -0.4472135901 2815.6567382813 ) + 594 ( 0 0 1 712 ) + 595 ( 0 0 -1 -712 ) + 596 ( 0 1 0 4496 ) + 597 ( 0 -1 0 -4496 ) + 598 ( 0 1 0 4480 ) + 599 ( 0 -1 0 -4480 ) + 600 ( 0 0 1 848 ) + 601 ( 0 0 -1 -848 ) + 602 ( 0 1 0 4432 ) + 603 ( 0 -1 0 -4432 ) + 604 ( 0 0 1 608 ) + 605 ( 0 0 -1 -608 ) + 606 ( 0 1 0 4272.0004882813 ) + 607 ( 0 -1 0 -4272.0004882813 ) + 608 ( 0 1 0 4288.0004882813 ) + 609 ( 0 -1 0 -4288.0004882813 ) + 610 ( 0 1 0 4416 ) + 611 ( 0 -1 0 -4416 ) + 612 ( 0 0 1 488 ) + 613 ( 0 0 -1 -488 ) + 614 ( 0 1 0 4400 ) + 615 ( 0 -1 0 -4400 ) + 616 ( 0 0 1 431.9998474121 ) + 617 ( 0 0 -1 -431.9998474121 ) + 618 ( -0.0000001054 -0.7071070075 0.7071065307 -2703.970703125 ) + 619 ( 0.0000001054 0.7071070075 -0.7071065307 2703.970703125 ) + 620 ( 1 0 0 -4143.9995117188 ) + 621 ( -1 0 0 4143.9995117188 ) + 622 ( -0.7071068287 -0.0000001264 0.7071067095 3088.6423339844 ) + 623 ( 0.7071068287 0.0000001264 -0.7071067095 -3088.6423339844 ) + 624 ( 0 -0.5547001958 0.8320503235 -1819.4208984375 ) + 625 ( 0 0.5547001958 -0.8320503235 1819.4208984375 ) + 626 ( 0 1 0 4528 ) + 627 ( 0 -1 0 -4528 ) + 628 ( 0 1 0 4512 ) + 629 ( 0 -1 0 -4512 ) + 630 ( 0 0 1 831.9996948242 ) + 631 ( 0 0 -1 -831.9996948242 ) + 632 ( 0 1 0 4632 ) + 633 ( 0 -1 0 -4632 ) + 634 ( 1 0 0 -3023.9973144531 ) + 635 ( -1 0 0 3023.9973144531 ) + 636 ( 0 1 0 4720 ) + 637 ( 0 -1 0 -4720 ) + 638 ( 0 1 0 4144 ) + 639 ( 0 -1 0 -4144 ) + 640 ( 0 0 1 336 ) + 641 ( 0 0 -1 -336 ) + 642 ( 1 0 0 -3408.0139160156 ) + 643 ( -1 0 0 3408.0139160156 ) + 644 ( 0 1 0 3735.9951171875 ) + 645 ( 0 -1 0 -3735.9951171875 ) + 646 ( 1 0 0 -3560 ) + 647 ( -1 0 0 3560 ) + 648 ( 0 1 0 4140.0078125 ) + 649 ( 0 -1 0 -4140.0078125 ) + 650 ( 0 1 0 3739.9921875 ) + 651 ( 0 -1 0 -3739.9921875 ) + 652 ( 0.7071067691 0 -0.7071067691 -2613.4665527344 ) + 653 ( -0.7071067691 0 0.7071067691 2613.4665527344 ) + 654 ( 1 0 0 -3984.0124511719 ) + 655 ( -1 0 0 3984.0124511719 ) + 656 ( 0 1 0 4128 ) + 657 ( 0 -1 0 -4128 ) + 658 ( 0 0 1 96 ) + 659 ( 0 0 -1 -96 ) + 660 ( -0.447213769 -0.0000001866 0.8944271207 1838.9477539063 ) + 661 ( 0.447213769 0.0000001866 -0.8944271207 -1838.9477539063 ) + 662 ( 0 1 0 4368 ) + 663 ( 0 -1 0 -4368 ) + 664 ( 0 1 0 4320 ) + 665 ( 0 -1 0 -4320 ) + 666 ( 0 1 0 4336 ) + 667 ( 0 -1 0 -4336 ) + 668 ( 0 1 0 4352 ) + 669 ( 0 -1 0 -4352 ) + 670 ( 0 1 0 4304.0014648438 ) + 671 ( 0 -1 0 -4304.0014648438 ) + 672 ( 0 1 0 4384 ) + 673 ( 0 -1 0 -4384 ) + 674 ( 1 0 0 -3983.9826660156 ) + 675 ( -1 0 0 3983.9826660156 ) + 676 ( 0 1 0 4436.0014648438 ) + 677 ( 0 -1 0 -4436.0014648438 ) + 678 ( 0 0 1 168.0026245117 ) + 679 ( 0 0 -1 -168.0026245117 ) + 680 ( 0 1 0 4560.0004882813 ) + 681 ( 0 -1 0 -4560.0004882813 ) + 682 ( -0.3162277639 0 0.9486833215 1401.5166015625 ) + 683 ( 0.3162277639 0 -0.9486833215 -1401.5166015625 ) + 684 ( 1 0 0 -3627.9990234375 ) + 685 ( -1 0 0 3627.9990234375 ) + 686 ( -0.8944271803 -0.0000000267 0.4472135603 3334.4243164063 ) + 687 ( 0.8944271803 0.0000000267 -0.4472135603 -3334.4243164063 ) + 688 ( -0.8944271803 -0.0000000267 -0.4472135603 3141.2280273438 ) + 689 ( 0.8944271803 0.0000000267 0.4472135603 -3141.2280273438 ) + 690 ( -0.4472136796 -0.0000001066 0.8944271207 1838.9344482422 ) + 691 ( 0.4472136796 0.0000001066 -0.8944271207 -1838.9344482422 ) + 692 ( 0 1 0 4536 ) + 693 ( 0 -1 0 -4536 ) + 694 ( 0.0000001431 0.8000000715 0.5999999046 3859.2006835938 ) + 695 ( -0.0000001431 -0.8000000715 -0.5999999046 -3859.2006835938 ) + 696 ( 0 0 1 319.9981994629 ) + 697 ( 0 0 -1 -319.9981994629 ) + 698 ( 1 0 0 -3347.9990234375 ) + 699 ( -1 0 0 3347.9990234375 ) + 700 ( 0 0 1 240 ) + 701 ( 0 0 -1 -240 ) + 702 ( 1 0 0 -3471.9899902344 ) + 703 ( -1 0 0 3471.9899902344 ) + 704 ( 0 0 1 464 ) + 705 ( 0 0 -1 -464 ) + 706 ( 0 1 0 4744.0004882813 ) + 707 ( 0 -1 0 -4744.0004882813 ) + 708 ( 0.0000001431 -0.8000000715 0.5999999046 -3564.7944335938 ) + 709 ( -0.0000001431 0.8000000715 -0.5999999046 3564.7944335938 ) + 710 ( 0 0 1 512 ) + 711 ( 0 0 -1 -512 ) + 712 ( 0 1 0 4752 ) + 713 ( 0 -1 0 -4752 ) + 714 ( 1 0 0 -3056 ) + 715 ( -1 0 0 3056 ) + 716 ( 0 1 0 4736 ) + 717 ( 0 -1 0 -4736 ) + 718 ( 0 0 1 496 ) + 719 ( 0 0 -1 -496 ) + 720 ( 1 0 0 -3064 ) + 721 ( -1 0 0 3064 ) + 722 ( 1 0 0 -3059.9973144531 ) + 723 ( -1 0 0 3059.9973144531 ) + 724 ( 0 1 0 4756 ) + 725 ( 0 -1 0 -4756 ) + 726 ( -0.7071067691 0 -0.7071067691 2047.7811279297 ) + 727 ( 0.7071067691 0 0.7071067691 -2047.7811279297 ) + 728 ( 0 0 1 232 ) + 729 ( 0 0 -1 -232 ) + 730 ( 0 0.7071067691 -0.7071067691 2907.623046875 ) + 731 ( 0 -0.7071067691 0.7071067691 -2907.623046875 ) + 732 ( 0 1 0 4592 ) + 733 ( 0 -1 0 -4592 ) + 734 ( 0 0 1 520 ) + 735 ( 0 0 -1 -520 ) + 736 ( 0 0.7071067691 -0.7071067691 2913.2800292969 ) + 737 ( 0 -0.7071067691 0.7071067691 -2913.2800292969 ) + 738 ( 0.7071067691 0 -0.7071067691 -2653.064453125 ) + 739 ( -0.7071067691 0 0.7071067691 2653.064453125 ) + 740 ( 0 1 0 4208 ) + 741 ( 0 -1 0 -4208 ) + 742 ( 1 0 0 -2816 ) + 743 ( -1 0 0 2816 ) + 744 ( 1 0 0 -2832 ) + 745 ( -1 0 0 2832 ) + 746 ( 0 1 0 4544 ) + 747 ( 0 -1 0 -4544 ) + 748 ( 0.7071067691 0.7071067691 0 1074.8023681641 ) + 749 ( -0.7071067691 -0.7071067691 0 -1074.8023681641 ) + 750 ( -0.9701424837 0 0.2425356209 2840.5771484375 ) + 751 ( 0.9701424837 0 -0.2425356209 -2840.5771484375 ) + 752 ( 0 1 0 4464 ) + 753 ( 0 -1 0 -4464 ) + 754 ( 1 0 0 -3007.9997558594 ) + 755 ( -1 0 0 3007.9997558594 ) + 756 ( 1 0 0 -2992 ) + 757 ( -1 0 0 2992 ) + 758 ( 0 1 0 4492.001953125 ) + 759 ( 0 -1 0 -4492.001953125 ) + 760 ( 0 1 0 4464.0112304688 ) + 761 ( 0 -1 0 -4464.0112304688 ) + 762 ( 0 -0.3713906705 0.9284766912 -1360.78125 ) + 763 ( 0 0.3713906705 -0.9284766912 1360.78125 ) + 764 ( 0.9701424837 0 0.2425356209 -2809.5327148438 ) + 765 ( -0.9701424837 0 -0.2425356209 2809.5327148438 ) + 766 ( 0.8944271803 0 -0.4472135901 -2883.6333007813 ) + 767 ( -0.8944271803 0 0.4472135901 2883.6333007813 ) + 768 ( -0.8944271803 0 -0.4472135901 2325.5107421875 ) + 769 ( 0.8944271803 0 0.4472135901 -2325.5107421875 ) + 770 ( 0 1 0 3984 ) + 771 ( 0 -1 0 -3984 ) + 772 ( 1 0 0 -2960 ) + 773 ( -1 0 0 2960 ) + 774 ( 1 0 0 -2864 ) + 775 ( -1 0 0 2864 ) + 776 ( 0 1 0 4016 ) + 777 ( 0 -1 0 -4016 ) + 778 ( -0.7071067691 0 -0.7071067691 1753.6247558594 ) + 779 ( 0.7071067691 0 0.7071067691 -1753.6247558594 ) + 780 ( 0 0.7071067691 -0.7071067691 2568.2119140625 ) + 781 ( 0 -0.7071067691 0.7071067691 -2568.2119140625 ) + 782 ( 0.7071067691 0 -0.7071067691 -2364.5649414063 ) + 783 ( -0.7071067691 0 0.7071067691 2364.5649414063 ) + 784 ( 0 1 0 4176.0024414063 ) + 785 ( 0 -1 0 -4176.0024414063 ) + 786 ( 0 1 0 4184 ) + 787 ( 0 -1 0 -4184 ) + 788 ( 0 0 1 103.9999084473 ) + 789 ( 0 0 -1 -103.9999084473 ) + 790 ( 1 0 0 -3032 ) + 791 ( -1 0 0 3032 ) + 792 ( 0 1 0 3415.9985351563 ) + 793 ( 0 -1 0 -3415.9985351563 ) + 794 ( 0 0 1 352 ) + 795 ( 0 0 -1 -352 ) + 796 ( 0 1 0 3320.0009765625 ) + 797 ( 0 -1 0 -3320.0009765625 ) + 798 ( 0 0 1 448 ) + 799 ( 0 0 -1 -448 ) + 800 ( 0 1 0 3412.0004882813 ) + 801 ( 0 -1 0 -3412.0004882813 ) + 802 ( 1 0 0 -4176 ) + 803 ( -1 0 0 4176 ) + 804 ( 0 1 0 3448.0004882813 ) + 805 ( 0 -1 0 -3448.0004882813 ) + 806 ( 0 1 0 3400.0002441406 ) + 807 ( 0 -1 0 -3400.0002441406 ) + 808 ( 0 1 0 3568 ) + 809 ( 0 -1 0 -3568 ) + 810 ( 0 1 0 3464.0004882813 ) + 811 ( 0 -1 0 -3464.0004882813 ) + 812 ( 1 0 0 -4008 ) + 813 ( -1 0 0 4008 ) + 814 ( 0 1 0 3756.0004882813 ) + 815 ( 0 -1 0 -3756.0004882813 ) + 816 ( 0 1 0 3904 ) + 817 ( 0 -1 0 -3904 ) + 818 ( 0 1 0 3616 ) + 819 ( 0 -1 0 -3616 ) + 820 ( 0 1 0 3648 ) + 821 ( 0 -1 0 -3648 ) + 822 ( 1 0 0 -4015.9992675781 ) + 823 ( -1 0 0 4015.9992675781 ) + 824 ( 0 1 0 3604.0009765625 ) + 825 ( 0 -1 0 -3604.0009765625 ) + 826 ( -0.8944272399 -0.0000000533 -0.4472135603 3527.6206054688 ) + 827 ( 0.8944272399 0.0000000533 0.4472135603 -3527.6206054688 ) + 828 ( 0 1 0 3888 ) + 829 ( 0 -1 0 -3888 ) + 830 ( 0 1 0 3664 ) + 831 ( 0 -1 0 -3664 ) + 832 ( 0 0 1 208 ) + 833 ( 0 0 -1 -208 ) + 834 ( 0 1 0 3871.9995117188 ) + 835 ( 0 -1 0 -3871.9995117188 ) + 836 ( 0 1 0 3680 ) + 837 ( 0 -1 0 -3680 ) + 838 ( 1 0 0 -4032 ) + 839 ( -1 0 0 4032 ) + 840 ( 1 0 0 -4224 ) + 841 ( -1 0 0 4224 ) + 842 ( -0.7071068287 -0.0000000632 -0.7071067095 2715.28515625 ) + 843 ( 0.7071068287 0.0000000632 0.7071067095 -2715.28515625 ) + 844 ( 0 0.7071067691 -0.7071067691 2466.3884277344 ) + 845 ( 0 -0.7071067691 0.7071067691 -2466.3884277344 ) + 846 ( 0.0000000421 -0.7071068287 -0.7071067691 -2873.6826171875 ) + 847 ( -0.0000000421 0.7071068287 0.7071067691 2873.6826171875 ) + 848 ( 0.7071068287 -0.0000000421 -0.7071067095 -3122.583984375 ) + 849 ( -0.7071068287 0.0000000421 0.7071067095 3122.583984375 ) + 850 ( 0 1 0 3792.0004882813 ) + 851 ( 0 -1 0 -3792.0004882813 ) + 852 ( 1 0 0 -4255.9995117188 ) + 853 ( -1 0 0 4255.9995117188 ) + 854 ( 0 1 0 3936.0002441406 ) + 855 ( 0 -1 0 -3936.0002441406 ) + 856 ( 0 1 0 3696 ) + 857 ( 0 -1 0 -3696 ) + 858 ( 0 1 0 3728.0004882813 ) + 859 ( 0 -1 0 -3728.0004882813 ) + 860 ( 0 1 0 3856 ) + 861 ( 0 -1 0 -3856 ) + 862 ( 0 1 0 3840 ) + 863 ( 0 -1 0 -3840 ) + 864 ( 0.0000001066 0.8944272399 0.4472135007 3506.1545410156 ) + 865 ( -0.0000001066 -0.8944272399 -0.4472135007 -3506.1545410156 ) + 866 ( 0 1 0 3807.9995117188 ) + 867 ( 0 -1 0 -3807.9995117188 ) + 868 ( 1 0 0 -3987.9992675781 ) + 869 ( -1 0 0 3987.9992675781 ) + 870 ( 0 1 0 3600 ) + 871 ( 0 -1 0 -3600 ) + 872 ( 0 0 1 65 ) + 873 ( 0 0 -1 -65 ) + 874 ( 1 0 0 -3864 ) + 875 ( -1 0 0 3864 ) + 876 ( 1 0 0 -3963.9990234375 ) + 877 ( -1 0 0 3963.9990234375 ) + 878 ( 0 0 1 264 ) + 879 ( 0 0 -1 -264 ) + 880 ( 0 1 0 3584 ) + 881 ( 0 -1 0 -3584 ) + 882 ( 1 0 0 -4248 ) + 883 ( -1 0 0 4248 ) + 884 ( 0.8944271803 0 -0.4472135901 -3856.7700195313 ) + 885 ( -0.8944271803 0 0.4472135901 3856.7700195313 ) + 886 ( 0 1 0 3948.0004882813 ) + 887 ( 0 -1 0 -3948.0004882813 ) + 888 ( 1 0 0 -4207.9995117188 ) + 889 ( -1 0 0 4207.9995117188 ) + 890 ( 0 1 0 3968 ) + 891 ( 0 -1 0 -3968 ) + 892 ( 0 1 0 3940.0002441406 ) + 893 ( 0 -1 0 -3940.0002441406 ) + 894 ( 0 1 0 3924.0002441406 ) + 895 ( 0 -1 0 -3924.0002441406 ) + 896 ( -0.0000001466 0.4472137392 0.8944271207 1788.8662109375 ) + 897 ( 0.0000001466 -0.4472137392 -0.8944271207 -1788.8662109375 ) + 898 ( 0 1 0 4000 ) + 899 ( 0 -1 0 -4000 ) + 900 ( 0 1 0 3920.001953125 ) + 901 ( 0 -1 0 -3920.001953125 ) + 902 ( 0 0 1 48 ) + 903 ( 0 0 -1 -48 ) + 904 ( 0 1 0 3976.0002441406 ) + 905 ( 0 -1 0 -3976.0002441406 ) + 906 ( 0 1 0 3960.0002441406 ) + 907 ( 0 -1 0 -3960.0002441406 ) + 908 ( 0 0 1 640 ) + 909 ( 0 0 -1 -640 ) + 910 ( 0 1 0 3760.0021972656 ) + 911 ( 0 -1 0 -3760.0021972656 ) + 912 ( 0 1 0 3712.0004882813 ) + 913 ( 0 -1 0 -3712.0004882813 ) + 914 ( 0 1 0 3632 ) + 915 ( 0 -1 0 -3632 ) + 916 ( 0 1 0 3951.9931640625 ) + 917 ( 0 -1 0 -3951.9931640625 ) + 918 ( 0.0000002318 0.7071069479 0.7071066499 3269.6564941406 ) + 919 ( -0.0000002318 -0.7071069479 -0.7071066499 -3269.6564941406 ) + 920 ( 1 0 0 -4288 ) + 921 ( -1 0 0 4288 ) + 922 ( 0.8944271803 0 0.4472135901 -3162.6945800781 ) + 923 ( -0.8944271803 0 -0.4472135901 3162.6945800781 ) + 924 ( 0 0.8944271803 0.4472135901 3649.2629394531 ) + 925 ( 0 -0.8944271803 -0.4472135901 -3649.2629394531 ) + 926 ( 0 1 0 3480.0004882813 ) + 927 ( 0 -1 0 -3480.0004882813 ) + 928 ( -0.0000000632 0.7071068287 -0.7071067095 2121.3264160156 ) + 929 ( 0.0000000632 -0.7071068287 0.7071067095 -2121.3264160156 ) + 930 ( -0.7071068287 -0.0000000421 -0.7071067095 2511.6437988281 ) + 931 ( 0.7071068287 0.0000000421 0.7071067095 -2511.6437988281 ) + 932 ( 0.7071068287 -0.0000000421 -0.7071067095 -3326.2302246094 ) + 933 ( -0.7071068287 0.0000000421 0.7071067095 3326.2302246094 ) + 934 ( 0.0000001054 -0.7071068883 -0.7071067095 -3099.9521484375 ) + 935 ( -0.0000001054 0.7071068883 0.7071067095 3099.9521484375 ) + 936 ( 1 0 0 -2987.9973144531 ) + 937 ( -1 0 0 2987.9973144531 ) + 938 ( 1 0 0 -2896 ) + 939 ( -1 0 0 2896 ) + 940 ( 1 0 0 -3024.0102539063 ) + 941 ( -1 0 0 3024.0102539063 ) + 942 ( 1 0 0 -3184.0139160156 ) + 943 ( -1 0 0 3184.0139160156 ) + 944 ( 1 0 0 -4111.9990234375 ) + 945 ( -1 0 0 4111.9990234375 ) + 946 ( 1 0 0 -4203.9970703125 ) + 947 ( -1 0 0 4203.9970703125 ) + 948 ( 1 0 0 -4239.9970703125 ) + 949 ( -1 0 0 4239.9970703125 ) + 950 ( 0.7071067691 -0.7071067691 0 -7783.8315429688 ) + 951 ( -0.7071067691 0.7071067691 0 7783.8315429688 ) + 952 ( -0.7071067691 0.7071067691 0 7806.458984375 ) + 953 ( 0.7071067691 -0.7071067691 0 -7806.458984375 ) + 954 ( 0 1 0 6150 ) + 955 ( 0 -1 0 -6150 ) + 956 ( 0 0.6246950626 0.7808688283 4091.7526855469 ) + 957 ( 0 -0.6246950626 -0.7808688283 -4091.7526855469 ) + 958 ( 0 1 0 6154.0024414063 ) + 959 ( 0 -1 0 -6154.0024414063 ) + 960 ( 0 1 0 6170.0024414063 ) + 961 ( 0 -1 0 -6170.0024414063 ) + 962 ( 0 1 0 6256 ) + 963 ( 0 -1 0 -6256 ) + 964 ( 0 1 0 6639.9926757813 ) + 965 ( 0 -1 0 -6639.9926757813 ) + 966 ( 1 0 0 -4832.0078125 ) + 967 ( -1 0 0 4832.0078125 ) + 968 ( 0 0 1 576 ) + 969 ( 0 0 -1 -576 ) + 970 ( 1 0 0 -4816.017578125 ) + 971 ( -1 0 0 4816.017578125 ) + 972 ( 1 0 0 -4384 ) + 973 ( -1 0 0 4384 ) + 974 ( 1 0 0 -4784.0141601563 ) + 975 ( -1 0 0 4784.0141601563 ) + 976 ( 1 0 0 -4560.0004882813 ) + 977 ( -1 0 0 4560.0004882813 ) + 978 ( 0 0.3162277639 0.9486833215 2231.3029785156 ) + 979 ( 0 -0.3162277639 -0.9486833215 -2231.3029785156 ) + 980 ( 0 1 0 6252.0014648438 ) + 981 ( 0 -1 0 -6252.0014648438 ) + 982 ( 0 1 0 6100.0004882813 ) + 983 ( 0 -1 0 -6100.0004882813 ) + 984 ( 1 0 0 -4784 ) + 985 ( -1 0 0 4784 ) + 986 ( 1 0 0 -4479.9990234375 ) + 987 ( -1 0 0 4479.9990234375 ) + 988 ( 0 1 0 6248.0024414063 ) + 989 ( 0 -1 0 -6248.0024414063 ) + 990 ( 0 0 1 112 ) + 991 ( 0 0 -1 -112 ) + 992 ( 0 0 1 1 ) + 993 ( 0 0 -1 -1 ) + 994 ( 0 0 1 172 ) + 995 ( 0 0 -1 -172 ) + 996 ( 1 0 0 -4432 ) + 997 ( -1 0 0 4432 ) + 998 ( 0 1 0 6288 ) + 999 ( 0 -1 0 -6288 ) + 1000 ( 0 1 0 6636.0170898438 ) + 1001 ( 0 -1 0 -6636.0170898438 ) + 1002 ( 1 0 0 -4780.0126953125 ) + 1003 ( -1 0 0 4780.0126953125 ) + 1004 ( 0 1 0 6464.0004882813 ) + 1005 ( 0 -1 0 -6464.0004882813 ) + 1006 ( 1 0 0 -4768 ) + 1007 ( -1 0 0 4768 ) + 1008 ( 1 0 0 -4448.001953125 ) + 1009 ( -1 0 0 4448.001953125 ) + 1010 ( 1 0 0 -4591.998046875 ) + 1011 ( -1 0 0 4591.998046875 ) + 1012 ( 1 0 0 -4623.998046875 ) + 1013 ( -1 0 0 4623.998046875 ) + 1014 ( 1 0 0 -4671.998046875 ) + 1015 ( -1 0 0 4671.998046875 ) + 1016 ( 1 0 0 -4543.998046875 ) + 1017 ( -1 0 0 4543.998046875 ) + 1018 ( 1 0 0 -4576.0014648438 ) + 1019 ( -1 0 0 4576.0014648438 ) + 1020 ( -0.7071067691 -0.7071067691 0 -1199.2530517578 ) + 1021 ( 0.7071067691 0.7071067691 0 1199.2530517578 ) + 1022 ( 0 0 1 162.6601104736 ) + 1023 ( 0 0 -1 -162.6601104736 ) + 1024 ( 0 1 0 6284.0024414063 ) + 1025 ( 0 -1 0 -6284.0024414063 ) + 1026 ( 1 0 0 -4304 ) + 1027 ( -1 0 0 4304 ) + 1028 ( 0 1 0 6600 ) + 1029 ( 0 -1 0 -6600 ) + 1030 ( 0 1 0 6584 ) + 1031 ( 0 -1 0 -6584 ) + 1032 ( 0 -0.8944271803 0.4472135901 -5760.1108398438 ) + 1033 ( 0 0.8944271803 -0.4472135901 5760.1108398438 ) + 1034 ( 0.7071067691 0 -0.7071067691 -3688.2687988281 ) + 1035 ( -0.7071067691 0 0.7071067691 3688.2687988281 ) + 1036 ( -0.7071067691 0 -0.7071067691 2918.9367675781 ) + 1037 ( 0.7071067691 0 0.7071067691 -2918.9367675781 ) + 1038 ( -0.8944271803 0 0.4472135901 4278.9404296875 ) + 1039 ( 0.8944271803 0 -0.4472135901 -4278.9404296875 ) + 1040 ( 0 1 0 6304.0146484375 ) + 1041 ( 0 -1 0 -6304.0146484375 ) + 1042 ( 0 1 0 6624 ) + 1043 ( 0 -1 0 -6624 ) + 1044 ( 0 0 1 656 ) + 1045 ( 0 0 -1 -656 ) + 1046 ( 1 0 0 -4400 ) + 1047 ( -1 0 0 4400 ) + 1048 ( 1 0 0 -4815.998046875 ) + 1049 ( -1 0 0 4815.998046875 ) + 1050 ( 0 1 0 6672.013671875 ) + 1051 ( 0 -1 0 -6672.013671875 ) + 1052 ( 0.8944271803 0 0.4472135901 -4078.5876464844 ) + 1053 ( -0.8944271803 0 -0.4472135901 4078.5876464844 ) + 1054 ( 0 0 1 1760 ) + 1055 ( 0 0 -1 -1760 ) + 1056 ( 0 1 0 6944 ) + 1057 ( 0 -1 0 -6944 ) + 1058 ( 0 1 0 7008.0009765625 ) + 1059 ( 0 -1 0 -7008.0009765625 ) + 1060 ( 1 0 0 -5088 ) + 1061 ( -1 0 0 5088 ) + 1062 ( 1 0 0 -5023.9995117188 ) + 1063 ( -1 0 0 5023.9995117188 ) + 1064 ( 1 0 0 -5072 ) + 1065 ( -1 0 0 5072 ) + 1066 ( 1 0 0 -5039.9995117188 ) + 1067 ( -1 0 0 5039.9995117188 ) + 1068 ( 1 0 0 -4911.9990234375 ) + 1069 ( -1 0 0 4911.9990234375 ) + 1070 ( 1 0 0 -5104 ) + 1071 ( -1 0 0 5104 ) + 1072 ( 1 0 0 -5007.9995117188 ) + 1073 ( -1 0 0 5007.9995117188 ) + 1074 ( 0 1 0 6960 ) + 1075 ( 0 -1 0 -6960 ) + 1076 ( 1 0 0 -4991.9995117188 ) + 1077 ( -1 0 0 4991.9995117188 ) + 1078 ( 0 1 0 6992.0009765625 ) + 1079 ( 0 -1 0 -6992.0009765625 ) + 1080 ( 1 0 0 -4927.9990234375 ) + 1081 ( -1 0 0 4927.9990234375 ) + 1082 ( 1 0 0 -5120 ) + 1083 ( -1 0 0 5120 ) + 1084 ( 0 1 0 6832 ) + 1085 ( 0 -1 0 -6832 ) + 1086 ( 0 1 0 6928.0004882813 ) + 1087 ( 0 -1 0 -6928.0004882813 ) + 1088 ( 0 1 0 6848 ) + 1089 ( 0 -1 0 -6848 ) + 1090 ( 0 1 0 6912.0004882813 ) + 1091 ( 0 -1 0 -6912.0004882813 ) + 1092 ( 0 1 0 6688.0073242188 ) + 1093 ( 0 -1 0 -6688.0073242188 ) + 1094 ( 0 1 0 4968 ) + 1095 ( 0 -1 0 -4968 ) + 1096 ( 1 0 0 -4527.9990234375 ) + 1097 ( -1 0 0 4527.9990234375 ) + 1098 ( 1 0 0 -4511.998046875 ) + 1099 ( -1 0 0 4511.998046875 ) + 1100 ( 0.8944271803 0 0.4472135901 -3820.9929199219 ) + 1101 ( -0.8944271803 0 -0.4472135901 3820.9929199219 ) + 1102 ( 0.8944271803 0 0.4472135901 -3806.6821289063 ) + 1103 ( -0.8944271803 0 -0.4472135901 3806.6821289063 ) + 1104 ( 0 1 0 5095.9995117188 ) + 1105 ( 0 -1 0 -5095.9995117188 ) + 1106 ( 0 1 0 5000 ) + 1107 ( 0 -1 0 -5000 ) + 1108 ( 1 0 0 -4280 ) + 1109 ( -1 0 0 4280 ) + 1110 ( 1 0 0 -4460 ) + 1111 ( -1 0 0 4460 ) + 1112 ( -0.3060091734 0 0.9520285726 1741.3957519531 ) + 1113 ( 0.3060091734 0 -0.9520285726 -1741.3957519531 ) + 1114 ( 1 0 0 -4496 ) + 1115 ( -1 0 0 4496 ) + 1116 ( 1 0 0 -4271.9985351563 ) + 1117 ( -1 0 0 4271.9985351563 ) + 1118 ( 0 1 0 4940.0004882813 ) + 1119 ( 0 -1 0 -4940.0004882813 ) + 1120 ( 1 0 0 -4847.9995117188 ) + 1121 ( -1 0 0 4847.9995117188 ) + 1122 ( 0.7682212591 0 0.6401844025 -3122.0532226563 ) + 1123 ( -0.7682212591 0 -0.6401844025 3122.0532226563 ) + 1124 ( 0 0 1 768 ) + 1125 ( 0 0 -1 -768 ) + 1126 ( 0 1 0 5676.001953125 ) + 1127 ( 0 -1 0 -5676.001953125 ) + 1128 ( 0 1 0 5616 ) + 1129 ( 0 -1 0 -5616 ) + 1130 ( 0 1 0 5680.0009765625 ) + 1131 ( 0 -1 0 -5680.0009765625 ) + 1132 ( 0.7070851922 -0.707128346 0 -7116.3500976563 ) + 1133 ( -0.7070851922 0.707128346 0 7116.3500976563 ) + 1134 ( 0.7071068883 -0.7071067095 0 -7116.3217773438 ) + 1135 ( -0.7071068883 0.7071067095 0 7116.3217773438 ) + 1136 ( 0.0000000211 -0.7071068287 0.7071067095 -3597.7429199219 ) + 1137 ( -0.0000000211 0.7071068287 -0.7071067095 3597.7429199219 ) + 1138 ( 0 -0.7071067691 0.7071067691 -3597.7592773438 ) + 1139 ( 0 0.7071067691 -0.7071067691 3597.7592773438 ) + 1140 ( 0 -0.7071445584 0.7070689797 -3597.9956054688 ) + 1141 ( 0 0.7071445584 -0.7070689797 3597.9956054688 ) + 1142 ( -0.7070690393 -0.7071445584 0 -871.5383300781 ) + 1143 ( 0.7070690393 0.7071445584 0 871.5383300781 ) + 1144 ( 0.7071067691 0 0.7071067691 -2726.6037597656 ) + 1145 ( -0.7071067691 0 -0.7071067691 2726.6037597656 ) + 1146 ( 0 1 0 5632 ) + 1147 ( 0 -1 0 -5632 ) + 1148 ( 0 1 0 5615.9760742188 ) + 1149 ( 0 -1 0 -5615.9760742188 ) + 1150 ( 1 0 0 -4704.0024414063 ) + 1151 ( -1 0 0 4704.0024414063 ) + 1152 ( 0 0 1 624 ) + 1153 ( 0 0 -1 -624 ) + 1154 ( 1 0 0 -4640.0024414063 ) + 1155 ( -1 0 0 4640.0024414063 ) + 1156 ( 1 0 0 -4688 ) + 1157 ( -1 0 0 4688 ) + 1158 ( 1 0 0 -4863.9975585938 ) + 1159 ( -1 0 0 4863.9975585938 ) + 1160 ( 0 0 1 527.9996948242 ) + 1161 ( 0 0 -1 -527.9996948242 ) + 1162 ( 0 0 1 295.9898986816 ) + 1163 ( 0 0 -1 -295.9898986816 ) + 1164 ( 1 0 0 -4267.9990234375 ) + 1165 ( -1 0 0 4267.9990234375 ) + 1166 ( 1 0 0 -4327.9985351563 ) + 1167 ( -1 0 0 4327.9985351563 ) + 1168 ( 1 0 0 -4368 ) + 1169 ( -1 0 0 4368 ) + 1170 ( 0 0 1 104.0136108398 ) + 1171 ( 0 0 -1 -104.0136108398 ) + 1172 ( 0.0000001475 -0.7071069479 -0.7071065903 -3693.9421386719 ) + 1173 ( -0.0000001475 0.7071069479 0.7071065903 3693.9421386719 ) + 1174 ( 0.7071070075 0.0000002107 -0.7071065307 -3286.654296875 ) + 1175 ( -0.7071070075 -0.0000002107 0.7071065307 3286.654296875 ) + 1176 ( 1 0 0 -4464 ) + 1177 ( -1 0 0 4464 ) + 1178 ( 1 0 0 -4352 ) + 1179 ( -1 0 0 4352 ) + 1180 ( -0.406737268 -0.9135451913 0 -3324.4030761719 ) + 1181 ( 0.406737268 0.9135451913 0 3324.4030761719 ) + 1182 ( 1 0 0 -4412.814453125 ) + 1183 ( -1 0 0 4412.814453125 ) + 1184 ( 0.9135445356 -0.4067386985 0 -6201.3168945313 ) + 1185 ( -0.9135445356 0.4067386985 0 6201.3168945313 ) + 1186 ( 0 1 0 5571.1870117188 ) + 1187 ( 0 -1 0 -5571.1870117188 ) + 1188 ( 0.4067391753 0.9135442972 0 3345.5141601563 ) + 1189 ( -0.4067391753 -0.9135442972 0 -3345.5141601563 ) + 1190 ( -0.9135458469 0.4067357779 0 6222.4306640625 ) + 1191 ( 0.9135458469 -0.4067357779 0 -6222.4306640625 ) + 1192 ( 1 0 0 -4323.7255859375 ) + 1193 ( -1 0 0 4323.7255859375 ) + 1194 ( 1 0 0 -4275.18359375 ) + 1195 ( -1 0 0 4275.18359375 ) + 1196 ( 0.9135479331 -0.4067311287 0 -6201.2890625 ) + 1197 ( -0.9135479331 0.4067311287 0 6201.2890625 ) + 1198 ( 0 1 0 5568 ) + 1199 ( 0 -1 0 -5568 ) + 1200 ( -0.4067363143 -0.9135456085 0 -3425.5395507813 ) + 1201 ( 0.4067363143 0.9135456085 0 3425.5395507813 ) + 1202 ( 0.4067220092 0.9135519862 0 3446.7614746094 ) + 1203 ( -0.4067220092 -0.9135519862 0 -3446.7614746094 ) + 1204 ( 0.4067366719 0.9135454297 0 3446.6613769531 ) + 1205 ( -0.4067366719 -0.9135454297 0 -3446.6613769531 ) + 1206 ( 0.4067350626 0.913546145 0 3446.6723632813 ) + 1207 ( -0.4067350626 -0.913546145 0 -3446.6723632813 ) + 1208 ( 0.4067420661 0.9135430455 0 3446.6245117188 ) + 1209 ( -0.4067420661 -0.9135430455 0 -3446.6245117188 ) + 1210 ( 0.9135519862 -0.4067220092 0 -6302.384765625 ) + 1211 ( -0.9135519862 0.4067220092 0 6302.384765625 ) + 1212 ( 0 1 0 5684.4501953125 ) + 1213 ( 0 -1 0 -5684.4501953125 ) + 1214 ( 1 0 0 -4364.2763671875 ) + 1215 ( -1 0 0 4364.2763671875 ) + 1216 ( -0.9135519862 0.4067220092 0 6323.5092773438 ) + 1217 ( 0.9135519862 -0.4067220092 0 -6323.5092773438 ) + 1218 ( 0 1 0 5708.818359375 ) + 1219 ( 0 -1 0 -5708.818359375 ) + 1220 ( 0 1 0 5736 ) + 1221 ( 0 -1 0 -5736 ) + 1222 ( 1 0 0 -4319.9995117188 ) + 1223 ( -1 0 0 4319.9995117188 ) + 1224 ( 0 1 0 5720 ) + 1225 ( 0 -1 0 -5720 ) + 1226 ( -0.9135454297 0.4067366719 0 6323.5639648438 ) + 1227 ( 0.9135454297 -0.4067366719 0 -6323.5639648438 ) + 1228 ( 0.8944272399 -0.0000000533 -0.4472134709 -4443.53515625 ) + 1229 ( -0.8944272399 0.0000000533 0.4472134709 4443.53515625 ) + 1230 ( 1 0 0 -4747.9970703125 ) + 1231 ( -1 0 0 4747.9970703125 ) + 1232 ( 0 0 1 415.9996643066 ) + 1233 ( 0 0 -1 -415.9996643066 ) + 1234 ( 1 0 0 -4419.9985351563 ) + 1235 ( -1 0 0 4419.9985351563 ) + 1236 ( 0 1 0 6032 ) + 1237 ( 0 -1 0 -6032 ) + 1238 ( -0.7070959806 0.7071175575 0 7138.9633789063 ) + 1239 ( 0.7070959806 -0.7071175575 0 -7138.9633789063 ) + 1240 ( 0 1 0 5727.9985351563 ) + 1241 ( 0 -1 0 -5727.9985351563 ) + 1242 ( 0.8944272399 -0.0000003732 -0.4472135007 -4439.9365234375 ) + 1243 ( -0.8944272399 0.0000003732 0.4472135007 4439.9365234375 ) + 1244 ( 0 1 0 5871.9956054688 ) + 1245 ( 0 -1 0 -5871.9956054688 ) + 1246 ( 0 1 0 6096.0004882813 ) + 1247 ( 0 -1 0 -6096.0004882813 ) + 1248 ( 0 1 0 6040 ) + 1249 ( 0 -1 0 -6040 ) + 1250 ( 1 0 0 -4504 ) + 1251 ( -1 0 0 4504 ) + 1252 ( -0.7071067691 -0.7071067691 0 -848.5280761719 ) + 1253 ( 0.7071067691 0.7071067691 0 848.5280761719 ) + 1254 ( -0.7071067691 0.7071067691 0 7478.361328125 ) + 1255 ( 0.7071067691 -0.7071067691 0 -7478.361328125 ) + 1256 ( 0 1 0 5912 ) + 1257 ( 0 -1 0 -5912 ) + 1258 ( 0 0 1 752 ) + 1259 ( 0 0 -1 -752 ) + 1260 ( 0 1 0 6079.9916992188 ) + 1261 ( 0 -1 0 -6079.9916992188 ) + 1262 ( 0 1 0 4936 ) + 1263 ( 0 -1 0 -4936 ) + 1264 ( 0 1 0 4408 ) + 1265 ( 0 -1 0 -4408 ) + 1266 ( 0 1 0 4296.0009765625 ) + 1267 ( 0 -1 0 -4296.0009765625 ) + 1268 ( 0.9612616897 -0.2756373584 0 -5399.41796875 ) + 1269 ( -0.9612616897 0.2756373584 0 5399.41796875 ) + 1270 ( 1 0 0 -4354.314453125 ) + 1271 ( -1 0 0 4354.314453125 ) + 1272 ( 0.2756358385 0.9612621069 0 2879.830078125 ) + 1273 ( -0.2756358385 -0.9612621069 0 -2879.830078125 ) + 1274 ( 1 0 0 -4402.51953125 ) + 1275 ( -1 0 0 4402.51953125 ) + 1276 ( 0.2756194472 0.9612668157 0 2879.9223632813 ) + 1277 ( -0.2756194472 -0.9612668157 0 -2879.9223632813 ) + 1278 ( 0.9612606168 -0.2756411731 0 -5346.7578125 ) + 1279 ( -0.9612606168 0.2756411731 0 5346.7578125 ) + 1280 ( 0 1 0 4166.310546875 ) + 1281 ( 0 -1 0 -4166.310546875 ) + 1282 ( -0.2756387889 -0.9612612724 0 -2792.2319335938 ) + 1283 ( 0.2756387889 0.9612612724 0 2792.2319335938 ) + 1284 ( -0.2756383419 -0.9612613916 0 -2860.0258789063 ) + 1285 ( 0.2756383419 0.9612613916 0 2860.0258789063 ) + 1286 ( 1 0 0 -4370.314453125 ) + 1287 ( -1 0 0 4370.314453125 ) + 1288 ( -0.9612606168 0.2756411731 0 5366.5483398438 ) + 1289 ( 0.9612606168 -0.2756411731 0 -5366.5483398438 ) + 1290 ( 0 1 0 4182.310546875 ) + 1291 ( 0 -1 0 -4182.310546875 ) + 1292 ( 0.2756387889 0.9612612724 0 2812.0222167969 ) + 1293 ( -0.2756387889 -0.9612612724 0 -2812.0222167969 ) + 1294 ( 0 1 0 4188.353515625 ) + 1295 ( 0 -1 0 -4188.353515625 ) + 1296 ( 1 0 0 -4383.5473632813 ) + 1297 ( -1 0 0 4383.5473632813 ) + 1298 ( 0 1 0 4228.4565429688 ) + 1299 ( 0 -1 0 -4228.4565429688 ) + 1300 ( 0 1 0 4257.69140625 ) + 1301 ( 0 -1 0 -4257.69140625 ) + 1302 ( 0.9612616897 -0.2756373584 0 -5346.7465820313 ) + 1303 ( -0.9612616897 0.2756373584 0 5346.7465820313 ) + 1304 ( 1 0 0 -4533.4697265625 ) + 1305 ( -1 0 0 4533.4697265625 ) + 1306 ( 1 0 0 -4656 ) + 1307 ( -1 0 0 4656 ) + 1308 ( 0 1 0 4289.4711914063 ) + 1309 ( 0 -1 0 -4289.4711914063 ) + 1310 ( 0 1 0 4158.5322265625 ) + 1311 ( 0 -1 0 -4158.5322265625 ) + 1312 ( -0.2756359279 -0.9612621069 0 -2769.0493164063 ) + 1313 ( 0.2756359279 0.9612621069 0 2769.0493164063 ) + 1314 ( -0.9612613916 0.2756385207 0 5518.9990234375 ) + 1315 ( 0.9612613916 -0.2756385207 0 -5518.9990234375 ) + 1316 ( 0.2756352425 0.9612622857 0 2888.6225585938 ) + 1317 ( -0.2756352425 -0.9612622857 0 -2888.6225585938 ) + 1318 ( 0.2756373584 0.9612616897 0 2888.6105957031 ) + 1319 ( -0.2756373584 -0.9612616897 0 -2888.6105957031 ) + 1320 ( 1 0 0 -4517.4697265625 ) + 1321 ( -1 0 0 4517.4697265625 ) + 1322 ( 0.9612613916 -0.2756385207 0 -5499.2084960938 ) + 1323 ( -0.9612613916 0.2756385207 0 5499.2084960938 ) + 1324 ( 0 1 0 4273.4711914063 ) + 1325 ( 0 -1 0 -4273.4711914063 ) + 1326 ( -0.2756352425 -0.9612622857 0 -2868.8322753906 ) + 1327 ( 0.2756352425 0.9612622857 0 2868.8322753906 ) + 1328 ( 1 0 0 -4418.51953125 ) + 1329 ( -1 0 0 4418.51953125 ) + 1330 ( -0.9612602592 0.2756423354 0 5419.2241210938 ) + 1331 ( 0.9612602592 -0.2756423354 0 -5419.2241210938 ) + 1332 ( 0 1 0 4174.5322265625 ) + 1333 ( 0 -1 0 -4174.5322265625 ) + 1334 ( 0.2756359279 0.9612621069 0 2788.8395996094 ) + 1335 ( -0.2756359279 -0.9612621069 0 -2788.8395996094 ) + 1336 ( 1 0 0 -4440.5727539063 ) + 1337 ( -1 0 0 4440.5727539063 ) + 1338 ( 0 1 0 4251.4223632813 ) + 1339 ( 0 -1 0 -4251.4223632813 ) + 1340 ( 1 0 0 -4495.421875 ) + 1341 ( -1 0 0 4495.421875 ) + 1342 ( 0 -0.3939192891 0.9191450477 -1684.9240722656 ) + 1343 ( 0 0.3939192891 -0.9191450477 1684.9240722656 ) + 1344 ( 0.0000001066 -0.8944272399 0.4472135007 -3849.6154785156 ) + 1345 ( -0.0000001066 0.8944272399 -0.4472135007 3849.6154785156 ) + 1346 ( 0 0 1 55.9995117188 ) + 1347 ( 0 0 -1 -55.9995117188 ) + 1348 ( -0.8944271803 -0.0000000267 0.4472135603 3935.4794921875 ) + 1349 ( 0.8944271803 0.0000000267 -0.4472135603 -3935.4794921875 ) + 1350 ( 0 1 0 4672 ) + 1351 ( 0 -1 0 -4672 ) + 1352 ( 0 1 0 4688 ) + 1353 ( 0 -1 0 -4688 ) + 1354 ( 0 1 0 4608 ) + 1355 ( 0 -1 0 -4608 ) + 1356 ( 1 0 0 -4336 ) + 1357 ( -1 0 0 4336 ) + 1358 ( 0 1 0 4656 ) + 1359 ( 0 -1 0 -4656 ) + 1360 ( 0 -0.4472135901 0.8944271803 -2032.1385498047 ) + 1361 ( 0 0.4472135901 -0.8944271803 2032.1385498047 ) + 1362 ( 0 1 0 4624 ) + 1363 ( 0 -1 0 -4624 ) + 1364 ( 0 1 0 4568 ) + 1365 ( 0 -1 0 -4568 ) + 1366 ( 0 1 0 4584 ) + 1367 ( 0 -1 0 -4584 ) + 1368 ( 1 0 0 -4736 ) + 1369 ( -1 0 0 4736 ) + 1370 ( 0 1 0 4440.0004882813 ) + 1371 ( 0 -1 0 -4440.0004882813 ) + 1372 ( 0 1 0 4472 ) + 1373 ( 0 -1 0 -4472 ) + 1374 ( 0 1 0 4520 ) + 1375 ( 0 -1 0 -4520 ) + 1376 ( 0.8480487466 -0.5299181938 0 -6377.5112304688 ) + 1377 ( -0.8480487466 0.5299181938 0 6377.5112304688 ) + 1378 ( 0.5299188495 0.848048389 0 1415.2069091797 ) + 1379 ( -0.5299188495 -0.848048389 0 -1415.2069091797 ) + 1380 ( 0.5299361944 0.8480375409 0 1415.0744628906 ) + 1381 ( -0.5299361944 -0.8480375409 0 -1415.0744628906 ) + 1382 ( 1 0 0 -4672.87109375 ) + 1383 ( -1 0 0 4672.87109375 ) + 1384 ( -0.529919982 -0.8480476737 0 -1393.1507568359 ) + 1385 ( 0.529919982 0.8480476737 0 1393.1507568359 ) + 1386 ( 1 0 0 -4688.87109375 ) + 1387 ( -1 0 0 4688.87109375 ) + 1388 ( -0.8480482697 0.5299189687 0 6399.5600585938 ) + 1389 ( 0.8480482697 -0.5299189687 0 -6399.5600585938 ) + 1390 ( 0 1 0 4572.7114257813 ) + 1391 ( 0 -1 0 -4572.7114257813 ) + 1392 ( 0 1 0 4490.904296875 ) + 1393 ( 0 -1 0 -4490.904296875 ) + 1394 ( 0 1 0 4631.1245117188 ) + 1395 ( 0 -1 0 -4631.1245117188 ) + 1396 ( -0.8480447531 0.5299246311 0 6501.63671875 ) + 1397 ( 0.8480447531 -0.5299246311 0 -6501.63671875 ) + 1398 ( 0 1 0 4488 ) + 1399 ( 0 -1 0 -4488 ) + 1400 ( 0 1 0 4576 ) + 1401 ( 0 -1 0 -4576 ) + 1402 ( 0.8480447531 -0.5299246311 0 -6479.5893554688 ) + 1403 ( -0.8480447531 0.5299246311 0 6479.5893554688 ) + 1404 ( 0 1 0 4597.0913085938 ) + 1405 ( 0 -1 0 -4597.0913085938 ) + 1406 ( 1 0 0 -4648 ) + 1407 ( -1 0 0 4648 ) + 1408 ( 0 1 0 4552 ) + 1409 ( 0 -1 0 -4552 ) + 1410 ( 1 0 0 -4664 ) + 1411 ( -1 0 0 4664 ) + 1412 ( 1 0 0 -4944 ) + 1413 ( -1 0 0 4944 ) + 1414 ( 0 1 0 4324.0009765625 ) + 1415 ( 0 -1 0 -4324.0009765625 ) + 1416 ( 0 -0.4472135901 0.8944271803 -1796.009765625 ) + 1417 ( 0 0.4472135901 -0.8944271803 1796.009765625 ) + 1418 ( 1 0 0 -4976 ) + 1419 ( -1 0 0 4976 ) + 1420 ( 0.0000001066 -0.8944272399 -0.4472135007 -3985.5678710938 ) + 1421 ( -0.0000001066 0.8944272399 0.4472135007 3985.5678710938 ) + 1422 ( 0.7071067691 -0.7071067691 0 -6380.931640625 ) + 1423 ( -0.7071067691 0.7071067691 0 6380.931640625 ) + 1424 ( -0.8944271803 -0.0000000267 -0.4472135603 3799.5266113281 ) + 1425 ( 0.8944271803 0.0000000267 0.4472135603 -3799.5266113281 ) + 1426 ( 1 0 0 -4752 ) + 1427 ( -1 0 0 4752 ) + 1428 ( 0 1 0 4872 ) + 1429 ( 0 -1 0 -4872 ) + 1430 ( 1 0 0 -4899.9975585938 ) + 1431 ( -1 0 0 4899.9975585938 ) + 1432 ( 0 1 0 4524.0024414063 ) + 1433 ( 0 -1 0 -4524.0024414063 ) + 1434 ( 0.0000000632 0.7071069479 -0.7071066499 2918.9313964844 ) + 1435 ( -0.0000000632 -0.7071069479 0.7071066499 -2918.9313964844 ) + 1436 ( -0.7071067691 0 -0.7071067691 3258.353515625 ) + 1437 ( 0.7071067691 0 0.7071067691 -3258.353515625 ) + 1438 ( -0.8944271803 0 0.4472135901 4565.16015625 ) + 1439 ( 0.8944271803 0 -0.4472135901 -4565.16015625 ) + 1440 ( 0 1 0 4472.0102539063 ) + 1441 ( 0 -1 0 -4472.0102539063 ) + 1442 ( 0 1 0 4456 ) + 1443 ( 0 -1 0 -4456 ) + 1444 ( 0 1 0 4504 ) + 1445 ( 0 -1 0 -4504 ) + 1446 ( 0.7071067691 0 0.7071067691 -3292.2890625 ) + 1447 ( -0.7071067691 0 -0.7071067691 3292.2890625 ) + 1448 ( 1 0 0 -5056 ) + 1449 ( -1 0 0 5056 ) + 1450 ( -0.936329186 0 -0.3511234522 4477.5263671875 ) + 1451 ( 0.936329186 0 0.3511234522 -4477.5263671875 ) + 1452 ( 0.9701424837 0 -0.2425356209 -4808.0258789063 ) + 1453 ( -0.9701424837 0 0.2425356209 4808.0258789063 ) + 1454 ( 0 1 0 4920.0004882813 ) + 1455 ( 0 -1 0 -4920.0004882813 ) + 1456 ( 1 0 0 -5136 ) + 1457 ( -1 0 0 5136 ) + 1458 ( 0.8944271803 0 0.4472135901 -4450.6625976563 ) + 1459 ( -0.8944271803 0 -0.4472135901 4450.6625976563 ) + 1460 ( 0.7071067691 0 -0.7071067691 -3869.2880859375 ) + 1461 ( -0.7071067691 0 0.7071067691 3869.2880859375 ) + 1462 ( 1 0 0 -5176.0014648438 ) + 1463 ( -1 0 0 5176.0014648438 ) + 1464 ( 0 1 0 4896.0014648438 ) + 1465 ( 0 -1 0 -4896.0014648438 ) + 1466 ( 0 1 0 4112 ) + 1467 ( 0 -1 0 -4112 ) + 1468 ( 0 1 0 4903.9741210938 ) + 1469 ( 0 -1 0 -4903.9741210938 ) + 1470 ( 1 0 0 -4304.029296875 ) + 1471 ( -1 0 0 4304.029296875 ) + 1472 ( 0 -0.936329186 -0.3511234522 -4765.9174804688 ) + 1473 ( 0 0.936329186 0.3511234522 4765.9174804688 ) + 1474 ( 1 0 0 -4416 ) + 1475 ( -1 0 0 4416 ) + 1476 ( 1 0 0 -4799.9985351563 ) + 1477 ( -1 0 0 4799.9985351563 ) + 1478 ( 0 1 0 4800 ) + 1479 ( 0 -1 0 -4800 ) + 1480 ( -0.7071070671 0.0000000843 0.7071065307 3450.6945800781 ) + 1481 ( 0.7071070671 -0.0000000843 -0.7071065307 -3450.6945800781 ) + 1482 ( 1 0 0 -4288.029296875 ) + 1483 ( -1 0 0 4288.029296875 ) + 1484 ( 0 0 1 704 ) + 1485 ( 0 0 -1 -704 ) + 1486 ( -0.7071067691 0 0.7071067691 3507.2495117188 ) + 1487 ( 0.7071067691 0 -0.7071067691 -3507.2495117188 ) + 1488 ( 0 0 1 680.0256958008 ) + 1489 ( 0 0 -1 -680.0256958008 ) + 1490 ( -0.0000000211 -0.7071070671 0.7071064711 -3009.4299316406 ) + 1491 ( 0.0000000211 0.7071070671 -0.7071064711 3009.4299316406 ) + 1492 ( 0 1 0 4919.9741210938 ) + 1493 ( 0 -1 0 -4919.9741210938 ) + 1494 ( 0 1 0 4160 ) + 1495 ( 0 -1 0 -4160 ) + 1496 ( -0.7071067691 0.7071067691 0 6403.5590820313 ) + 1497 ( 0.7071067691 -0.7071067691 0 -6403.5590820313 ) + 1498 ( 0.5547001958 0 0.8320503235 -2280.931640625 ) + 1499 ( -0.5547001958 0 -0.8320503235 2280.931640625 ) + 1500 ( 1 0 0 -4896 ) + 1501 ( -1 0 0 4896 ) + 1502 ( 1 0 0 -4688.0234375 ) + 1503 ( -1 0 0 4688.0234375 ) + 1504 ( 0.7071067691 0.0000000632 0.7071067691 -2839.7570800781 ) + 1505 ( -0.7071067691 -0.0000000632 -0.7071067691 2839.7570800781 ) + 1506 ( 0 1 0 4424.0004882813 ) + 1507 ( 0 -1 0 -4424.0004882813 ) + 1508 ( 1 0 0 -4672.0234375 ) + 1509 ( -1 0 0 4672.0234375 ) + 1510 ( 0 0 1 736 ) + 1511 ( 0 0 -1 -736 ) + 1512 ( 1 0 0 -4159.9995117188 ) + 1513 ( -1 0 0 4159.9995117188 ) + 1514 ( 0.0000001054 -0.7071068287 0.7071067095 -2522.9624023438 ) + 1515 ( -0.0000001054 0.7071068287 -0.7071067095 2522.9624023438 ) + 1516 ( -0.7071068287 -0.0000000421 0.7071067691 3631.7004394531 ) + 1517 ( 0.7071068287 0.0000000421 -0.7071067691 -3631.7004394531 ) + 1518 ( 1 0 0 -5232 ) + 1519 ( -1 0 0 5232 ) + 1520 ( 1 0 0 -5184 ) + 1521 ( -1 0 0 5184 ) + 1522 ( 0 1 0 3312.0004882813 ) + 1523 ( 0 -1 0 -3312.0004882813 ) + 1524 ( 0 0 1 248 ) + 1525 ( 0 0 -1 -248 ) + 1526 ( 0 1 0 3344 ) + 1527 ( 0 -1 0 -3344 ) + 1528 ( 1 0 0 -4563.9995117188 ) + 1529 ( -1 0 0 4563.9995117188 ) + 1530 ( 0 0 1 400 ) + 1531 ( 0 0 -1 -400 ) + 1532 ( 0 1 0 3744 ) + 1533 ( 0 -1 0 -3744 ) + 1534 ( 0 1 0 3424 ) + 1535 ( 0 -1 0 -3424 ) + 1536 ( 0 1 0 3472.0068359375 ) + 1537 ( 0 -1 0 -3472.0068359375 ) + 1538 ( 0 1 0 3652 ) + 1539 ( 0 -1 0 -3652 ) + 1540 ( -0.0000000933 0.4472136199 0.8944271803 1702.9788818359 ) + 1541 ( 0.0000000933 -0.4472136199 -0.8944271803 -1702.9788818359 ) + 1542 ( -0.0000000267 0.4472136199 0.8944271803 1702.9893798828 ) + 1543 ( 0.0000000267 -0.4472136199 -0.8944271803 -1702.9893798828 ) + 1544 ( 0 1 0 3824 ) + 1545 ( 0 -1 0 -3824 ) + 1546 ( 0.0000001066 0.8944272399 0.4472135007 3434.6008300781 ) + 1547 ( -0.0000001066 -0.8944272399 -0.4472135007 -3434.6008300781 ) + 1548 ( 1 0 0 -4376 ) + 1549 ( -1 0 0 4376 ) + 1550 ( 1 0 0 -4360 ) + 1551 ( -1 0 0 4360 ) + 1552 ( 0 0 1 128 ) + 1553 ( 0 0 -1 -128 ) + 1554 ( 1 0 0 -4584 ) + 1555 ( -1 0 0 4584 ) + 1556 ( 1 0 0 -4600 ) + 1557 ( -1 0 0 4600 ) + 1558 ( 0 1 0 3752 ) + 1559 ( 0 -1 0 -3752 ) + 1560 ( 1 0 0 -4616 ) + 1561 ( -1 0 0 4616 ) + 1562 ( 1 0 0 -4552 ) + 1563 ( -1 0 0 4552 ) + 1564 ( -0.8944271803 0 0.4472135901 4221.6962890625 ) + 1565 ( 0.8944271803 0 -0.4472135901 -4221.6962890625 ) + 1566 ( 0 0.8944271803 0.4472135901 3663.5737304688 ) + 1567 ( 0 -0.8944271803 -0.4472135901 -3663.5737304688 ) + 1568 ( 0 1 0 3776.0002441406 ) + 1569 ( 0 -1 0 -3776.0002441406 ) + 1570 ( -0.7071067691 -0.7071067691 0 656.1951293945 ) + 1571 ( 0.7071067691 0.7071067691 0 -656.1951293945 ) + 1572 ( 0.7071067691 0.7071067691 0 -633.5676879883 ) + 1573 ( -0.7071067691 -0.7071067691 0 633.5676879883 ) + 1574 ( 0 1 0 3820.0017089844 ) + 1575 ( 0 -1 0 -3820.0017089844 ) + 1576 ( 1 0 0 -4879.9990234375 ) + 1577 ( -1 0 0 4879.9990234375 ) + 1578 ( 0 0 1 184 ) + 1579 ( 0 0 -1 -184 ) + 1580 ( 0 1 0 3536 ) + 1581 ( 0 -1 0 -3536 ) + 1582 ( 0 0 1 136 ) + 1583 ( 0 0 -1 -136 ) + 1584 ( 0 0 1 328 ) + 1585 ( 0 0 -1 -328 ) + 1586 ( 0 1 0 3540.0009765625 ) + 1587 ( 0 -1 0 -3540.0009765625 ) + 1588 ( 0 0 1 152 ) + 1589 ( 0 0 -1 -152 ) + 1590 ( 0 1 0 3504 ) + 1591 ( 0 -1 0 -3504 ) + 1592 ( 0 0 1 119.9963760376 ) + 1593 ( 0 0 -1 -119.9963760376 ) + 1594 ( 0 1 0 3760.0314941406 ) + 1595 ( 0 -1 0 -3760.0314941406 ) + 1596 ( 0.9734171629 0 0.2290393263 -4863.8793945313 ) + 1597 ( -0.9734171629 0 -0.2290393263 4863.8793945313 ) + 1598 ( 0 -0.2425356209 0.9701424837 -725.6741943359 ) + 1599 ( 0 0.2425356209 -0.9701424837 725.6741943359 ) + 1600 ( 0 0 1 16 ) + 1601 ( 0 0 -1 -16 ) + 1602 ( -0.9734171629 0 0.2290393263 4792.419921875 ) + 1603 ( 0.9734171629 0 -0.2290393263 -4792.419921875 ) + 1604 ( 0 1 0 3728.0314941406 ) + 1605 ( 0 -1 0 -3728.0314941406 ) + 1606 ( 0 1 0 3360.0014648438 ) + 1607 ( 0 -1 0 -3360.0014648438 ) + 1608 ( 0 1 0 3488.0014648438 ) + 1609 ( 0 -1 0 -3488.0014648438 ) + 1610 ( 1 0 0 -4779.9995117188 ) + 1611 ( -1 0 0 4779.9995117188 ) + 1612 ( 1 0 0 -4843.9990234375 ) + 1613 ( -1 0 0 4843.9990234375 ) + 1614 ( 0.2425356805 0.0000000434 0.9701424837 -1059.3992919922 ) + 1615 ( -0.2425356805 -0.0000000434 -0.9701424837 1059.3992919922 ) + 1616 ( 0 1 0 3520 ) + 1617 ( 0 -1 0 -3520 ) + 1618 ( 0 0 1 -32 ) + 1619 ( 0 0 -1 32 ) +} +vertices 2705 { + 0 ( -3720 6144 192 ) + 1 ( -3720 6160 192 ) + 2 ( -3763.6884765625 6144 192 ) + 3 ( -3763.6884765625 6160 192 ) + 4 ( -3779.6884765625 6144 192 ) + 5 ( -3779.6884765625 6159.5444335938 192 ) + 6 ( -3779.6884765625 6160 192 ) + 7 ( -4096 6192 256 ) + 8 ( -4096 6176 256 ) + 9 ( -4080 6192 256 ) + 10 ( -3720 6192 256 ) + 11 ( -3720 6176 256 ) + 12 ( -3720 6160 256 ) + 13 ( -3763.6884765625 6160 256 ) + 14 ( -3779.6884765625 6160 256 ) + 15 ( -4096 6160 256 ) + 16 ( -3784 6160 144 ) + 17 ( -3779.6884765625 6160 144 ) + 18 ( -3779.6884765625 6159.5444335938 144 ) + 19 ( -3779.6884765625 6127.5463867188 144 ) + 20 ( -3779.6884765625 6114.3149414063 144 ) + 21 ( -3779.6884765625 6112 144 ) + 22 ( -3784 6112 144 ) + 23 ( -3784 6144 144 ) + 24 ( -3784 6192 144 ) + 25 ( -3779.6884765625 6192 144 ) + 26 ( -3770.3820800781 6192 144 ) + 27 ( -3696 6192 256 ) + 28 ( -3616 6192 256 ) + 29 ( -3616 6176 256 ) + 30 ( -3616 6160 256 ) + 31 ( -3704 6160 256 ) + 32 ( -3616 6192 456 ) + 33 ( -3616 5536 456 ) + 34 ( -3632 5536 456 ) + 35 ( -3632 5552 456 ) + 36 ( -3632 6144 456 ) + 37 ( -3632 6192 456 ) + 38 ( -3616 6160 224 ) + 39 ( -3704 6160 224 ) + 40 ( -3616 6144 224 ) + 41 ( -3704 6144 224 ) + 42 ( -3720 6144 224 ) + 43 ( -3720 6160 224 ) + 44 ( -3784 6192 64 ) + 45 ( -3968 6192 64 ) + 46 ( -3967.9846191406 6112 64 ) + 47 ( -3952 6112 64 ) + 48 ( -3784 6112 64 ) + 49 ( -4080 6192 0 ) + 50 ( -4080 6064 0 ) + 51 ( -4096 6064 0 ) + 52 ( -4096 6144 0 ) + 53 ( -4096 6160 0 ) + 54 ( -4096 6192 0 ) + 55 ( -3967.9846191406 6064 64 ) + 56 ( -4080 6064 8 ) + 57 ( -4080 6192 8 ) + 58 ( -3600 6192 456 ) + 59 ( -3600 6128 456 ) + 60 ( -3600 5776 456 ) + 61 ( -3600 5520 456 ) + 62 ( -3616 5520 456 ) + 63 ( -3088 6316 456 ) + 64 ( -3088 6164 456 ) + 65 ( -3440 6164 456 ) + 66 ( -3440 6316 456 ) + 67 ( -3424 6316 456 ) + 68 ( -3328 6316 456 ) + 69 ( -3280 6316 456 ) + 70 ( -3248 6316 456 ) + 71 ( -3200 6316 456 ) + 72 ( -3104 6316 456 ) + 73 ( -3091.9875488281 6160 456 ) + 74 ( -3088 6160 456 ) + 75 ( -3440 6160 456 ) + 76 ( -3091.9875488281 6144 456 ) + 77 ( -3280 6144 456 ) + 78 ( -3440 6144 456 ) + 79 ( -3376 6176 744 ) + 80 ( -3376 6144 744 ) + 81 ( -3376 5648 744 ) + 82 ( -3472 5648 744 ) + 83 ( -3584 5648 744 ) + 84 ( -3584 6144 744 ) + 85 ( -3584 6176 744 ) + 86 ( -3376 6176 920 ) + 87 ( -3088 6176 920 ) + 88 ( -3584 6176 920 ) + 89 ( -3696 6176 920 ) + 90 ( -3696 6192 920 ) + 91 ( -3680 6192 920 ) + 92 ( -3088 6192 920 ) + 93 ( -3376 6192 744 ) + 94 ( -3584 6192 744 ) + 95 ( -3088 6192 728 ) + 96 ( -3088 6144 728 ) + 97 ( -3312 6144 728 ) + 98 ( -3376 6144 728 ) + 99 ( -3376 6192 728 ) + 100 ( -3584 5520 744 ) + 101 ( -3600 5520 728 ) + 102 ( -3600 6144 728 ) + 103 ( -3600 6192 728 ) + 104 ( -3616 6144 712 ) + 105 ( -3616 6192 712 ) + 106 ( -4080 6224 256 ) + 107 ( -3744 6224 256 ) + 108 ( -3728 6224 256 ) + 109 ( -3728 6224 920 ) + 110 ( -3744 6240 920 ) + 111 ( -3728 6240 920 ) + 112 ( -3712 6240 920 ) + 113 ( -3696 6224 920 ) + 114 ( -3680 6208 920 ) + 115 ( -3088 6224 920 ) + 116 ( -3680 6224 920 ) + 117 ( -3744 6592 920 ) + 118 ( -3744 6608 920 ) + 119 ( -3744 6768 920 ) + 120 ( -3728 6768 920 ) + 121 ( -3728 6352 920 ) + 122 ( -3728 6256 920 ) + 123 ( -3744 6224 920 ) + 124 ( -4080 6416 256 ) + 125 ( -4080 6576 256 ) + 126 ( -4080 6592 256 ) + 127 ( -3744 6592 256 ) + 128 ( -3728 6592 256 ) + 129 ( -3696 6352 920 ) + 130 ( -3600 6352 920 ) + 131 ( -3088 6352 920 ) + 132 ( -3104 6320 456 ) + 133 ( -3200 6320 456 ) + 134 ( -3424 6320 456 ) + 135 ( -3328 6320 456 ) + 136 ( -3280 6320 456 ) + 137 ( -3248 6320 456 ) + 138 ( -4096 6768 544 ) + 139 ( -4096 6224 544 ) + 140 ( -4080 6768 544 ) + 141 ( -4080 6608 544 ) + 142 ( -4080 6592 544 ) + 143 ( -4080 6416 544 ) + 144 ( -4080 6224 544 ) + 145 ( -4096 6208 528 ) + 146 ( -4096 6192 512 ) + 147 ( -4080 6192 512 ) + 148 ( -3744 6608 256 ) + 149 ( -4080 6608 256 ) + 150 ( -3728 6608 256 ) + 151 ( -4116 6416 256 ) + 152 ( -4116 6576 256 ) + 153 ( -3728 6768 224 ) + 154 ( -4080 6768 224 ) + 155 ( -3728 6608 224 ) + 156 ( -4080 6608 224 ) + 157 ( -3824 7280 1584 ) + 158 ( -3856 7280 1584 ) + 159 ( -3824 7232 1584 ) + 160 ( -3856 7232 1584 ) + 161 ( -3872 7280 1584 ) + 162 ( -3872 7232 1584 ) + 163 ( -3824 7216 1584 ) + 164 ( -3872 7216 1584 ) + 165 ( -3808 7280 1584 ) + 166 ( -3808 7216 1584 ) + 167 ( -4096 7280 584 ) + 168 ( -4096 7216 584 ) + 169 ( -3872 7280 584 ) + 170 ( -3872 7216 584 ) + 171 ( -4096 7200 584 ) + 172 ( -3808 7216 584 ) + 173 ( -3808 7200 584 ) + 174 ( -3888 7200 584 ) + 175 ( -3984 7200 584 ) + 176 ( -3712 7184 1584 ) + 177 ( -3776 7184 1584 ) + 178 ( -3712 7152 1584 ) + 179 ( -3776 7152 1584 ) + 180 ( -3792 7152 1584 ) + 181 ( -3792 7184 1584 ) + 182 ( -3696 7152 1584 ) + 183 ( -3696 7136 1584 ) + 184 ( -3728 7136 1584 ) + 185 ( -3744 7136 1584 ) + 186 ( -3792 7136 1584 ) + 187 ( -3792 7200 1584 ) + 188 ( -3744 7200 1584 ) + 189 ( -3728 7200 1584 ) + 190 ( -3696 7200 1584 ) + 191 ( -3696 7184 1584 ) + 192 ( -3792 7200 584 ) + 193 ( -3792 7136 584 ) + 194 ( -3888 7136 584 ) + 195 ( -3968 7184 1584 ) + 196 ( -3904 7184 1584 ) + 197 ( -3904 7152 1584 ) + 198 ( -3968 7152 1584 ) + 199 ( -3984 7184 1584 ) + 200 ( -3984 7152 1584 ) + 201 ( -3904 7136 1584 ) + 202 ( -3984 7136 1584 ) + 203 ( -3888 7136 1584 ) + 204 ( -3888 7184 1584 ) + 205 ( -3888 7200 1584 ) + 206 ( -3984 7200 1584 ) + 207 ( -4096 7136 584 ) + 208 ( -3984 7136 584 ) + 209 ( -3856 7104 1584 ) + 210 ( -3824 7104 1584 ) + 211 ( -3824 7040 1584 ) + 212 ( -3856 7040 1584 ) + 213 ( -3872 7104 1584 ) + 214 ( -3872 7040 1584 ) + 215 ( -3824 7024 1584 ) + 216 ( -3872 7024 1584 ) + 217 ( -3808 7104 1584 ) + 218 ( -3808 7024 1584 ) + 219 ( -3872 7120 1584 ) + 220 ( -3808 7120 1584 ) + 221 ( -4096 7120 584 ) + 222 ( -4096 7024 584 ) + 223 ( -3872 7120 584 ) + 224 ( -3872 7024 584 ) + 225 ( -4096 6816 584 ) + 226 ( -3808 7024 584 ) + 227 ( -3728 7024 584 ) + 228 ( -3728 6816 584 ) + 229 ( -3752 6784 784 ) + 230 ( -3752 6800 784 ) + 231 ( -4096 6784 784 ) + 232 ( -4096 6800 784 ) + 233 ( -3752 6768 784 ) + 234 ( -4080 6768 784 ) + 235 ( -4096 6768 784 ) + 236 ( -4096 6816 784 ) + 237 ( -3752 6816 784 ) + 238 ( -3728 7136 584 ) + 239 ( -3728 7120 584 ) + 240 ( -3808 7120 584 ) + 241 ( -3744 6800 784 ) + 242 ( -3744 6784 784 ) + 243 ( -3744 6768 784 ) + 244 ( -3744 6816 784 ) + 245 ( -3744 6784 920 ) + 246 ( -3744 6800 920 ) + 247 ( -3744 6816 920 ) + 248 ( -3744 7024 920 ) + 249 ( -3744 7120 920 ) + 250 ( -3744 7136 920 ) + 251 ( -3728 7136 920 ) + 252 ( -3728 7200 920 ) + 253 ( -3744 7200 920 ) + 254 ( -3744 7280 920 ) + 255 ( -3728 7280 920 ) + 256 ( -3808 7280 584 ) + 257 ( -3744 7280 584 ) + 258 ( -3744 7200 584 ) + 259 ( -3728 7280 584 ) + 260 ( -3728 7200 584 ) + 261 ( -3696 7136 920 ) + 262 ( -3696 7200 920 ) + 263 ( -3696 7280 920 ) + 264 ( -3600 7280 920 ) + 265 ( -3600 6512 920 ) + 266 ( -3088 6512 920 ) + 267 ( -3760 5264 896 ) + 268 ( -3472 5264 896 ) + 269 ( -3760 5376 896 ) + 270 ( -3760 5488 896 ) + 271 ( -3712 5488 896 ) + 272 ( -3472 5488 896 ) + 273 ( -3312 5140 397.496307373 ) + 274 ( -3152 5140 397.496307373 ) + 275 ( -3312 5160 405 ) + 276 ( -3312 5168 408 ) + 277 ( -3312 5264 444 ) + 278 ( -3152 5264 444 ) + 279 ( -3152 5168 408 ) + 280 ( -3152 5160 405 ) + 281 ( -3320 5168 456 ) + 282 ( -3312 5168 456 ) + 283 ( -3320 5264 456 ) + 284 ( -3312 5264 456 ) + 285 ( -3152 5168 456 ) + 286 ( -3144 5168 456 ) + 287 ( -3152 5264 456 ) + 288 ( -3144 5264 456 ) + 289 ( -3152 5104 384 ) + 290 ( -3152 5008 384 ) + 291 ( -3152 4944 384 ) + 292 ( -3312 4944 384 ) + 293 ( -3312 5104 384 ) + 294 ( -3352 5104 399 ) + 295 ( -3352 4944 399 ) + 296 ( -3136 5008 456 ) + 297 ( -3104 5008 456 ) + 298 ( -3136 5104 456 ) + 299 ( -3104 5104 456 ) + 300 ( -3152 5008 456 ) + 301 ( -3152 5104 456 ) + 302 ( -3312 4904 381.3344421387 ) + 303 ( -3312 4880 373.3344421387 ) + 304 ( -3152 4904 381.3344421387 ) + 305 ( -3152 4880 373.3344421387 ) + 306 ( -3376 4944 408 ) + 307 ( -3472 4944 444 ) + 308 ( -3500 4944 454.5009460449 ) + 309 ( -3500 5104 454.5009460449 ) + 310 ( -3472 5104 444 ) + 311 ( -3376 5104 408 ) + 312 ( -3312 4784 341.3385009766 ) + 313 ( -3152 4784 341.3385009766 ) + 314 ( -3312 4912 384 ) + 315 ( -3152 4912 384 ) + 316 ( -3504 4944 456 ) + 317 ( -3504 4960 456 ) + 318 ( -3504 5104 456 ) + 319 ( -3280 5424 456 ) + 320 ( -3440 5424 456 ) + 321 ( -3104 5424 456 ) + 322 ( -3104 5328 456 ) + 323 ( -3152 5328 456 ) + 324 ( -3312 5328 456 ) + 325 ( -3376 5328 456 ) + 326 ( -3408 5328 456 ) + 327 ( -3440 5328 456 ) + 328 ( -3440 5460 456 ) + 329 ( -3280 5460 456 ) + 330 ( -3440 5612 456 ) + 331 ( -3280 5612 456 ) + 332 ( -3312 5292 454.500793457 ) + 333 ( -3152 5292 454.500793457 ) + 334 ( -3312 5296 456 ) + 335 ( -3152 5296 456 ) + 336 ( -3620 5328 456 ) + 337 ( -3476 5328 456 ) + 338 ( -3620 5424 456 ) + 339 ( -3476 5424 456 ) + 340 ( -3536 5228 456 ) + 341 ( -3536 5200 456 ) + 342 ( -3536 5168 456 ) + 343 ( -3536 5104 456 ) + 344 ( -3536 4960 456 ) + 345 ( -3568 4960 456 ) + 346 ( -3664 4960 456 ) + 347 ( -3728 4960 456 ) + 348 ( -3760 4960 456 ) + 349 ( -3760 5104 456 ) + 350 ( -3760 5228 456 ) + 351 ( -3632 5228 456 ) + 352 ( -3536 5232 456 ) + 353 ( -3632 5232 456 ) + 354 ( -3760 5232 456 ) + 355 ( -3664 5232 456 ) + 356 ( -3568 4944 456 ) + 357 ( -3664 4944 456 ) + 358 ( -3760 4952 456 ) + 359 ( -3728 4952 456 ) + 360 ( -4096 4784 256 ) + 361 ( -3792 4784 256 ) + 362 ( -4096 4844 256 ) + 363 ( -4080 4844 256 ) + 364 ( -4016 4844 256 ) + 365 ( -3920 4844 256 ) + 366 ( -3856 4844 256 ) + 367 ( -3792 4844 256 ) + 368 ( -4096 4848 256 ) + 369 ( -4080 4848 256 ) + 370 ( -4016 4848 256 ) + 371 ( -3920 4848 256 ) + 372 ( -3856 4848 256 ) + 373 ( -3792 4848 256 ) + 374 ( -3856 5104 456 ) + 375 ( -4048 5104 456 ) + 376 ( -3856 4952 456 ) + 377 ( -4000 4952 456 ) + 378 ( -4048 4952 456 ) + 379 ( -4048 4960 456 ) + 380 ( -4096 5000 456 ) + 381 ( -4096 4960 456 ) + 382 ( -4096 5104 456 ) + 383 ( -3820 5104 456 ) + 384 ( -3776 4952 456 ) + 385 ( -3820 4952 456 ) + 386 ( -3820 4944 456 ) + 387 ( -3856 4944 456 ) + 388 ( -5168 5232 800 ) + 389 ( -3856 5232 800 ) + 390 ( -3856 5072 800 ) + 391 ( -5168 5072 800 ) + 392 ( -3776 4944 456 ) + 393 ( -4000 4944 456 ) + 394 ( -4096 5216 456 ) + 395 ( -3856 5216 456 ) + 396 ( -4192 5216 456 ) + 397 ( -4192 5228 456 ) + 398 ( -3856 5228 456 ) + 399 ( -4192 5264 456 ) + 400 ( -4096 5264 456 ) + 401 ( -3872 5264 456 ) + 402 ( -3856 5264 456 ) + 403 ( -4080 4944 64 ) + 404 ( -3984 4944 64 ) + 405 ( -4080 5104 64 ) + 406 ( -3984 5104 64 ) + 407 ( -4116 5104 64 ) + 408 ( -4116 4944 64 ) + 409 ( -4080 4928 64 ) + 410 ( -3968 4928 64 ) + 411 ( -3968 4944 64 ) + 412 ( -4116 4928 64 ) + 413 ( -3968 5104 64 ) + 414 ( -3984 5228 25.9851589203 ) + 415 ( -3984 5200 39.9877433777 ) + 416 ( -3984 5168 55.98777771 ) + 417 ( -3984 5151.9755859375 64 ) + 418 ( -4080 5151.9755859375 64 ) + 419 ( -4080 5168 55.9877738953 ) + 420 ( -4080 5200 39.987739563 ) + 421 ( -4080 5228 25.9851493835 ) + 422 ( -4080 5140 64 ) + 423 ( -3984 5140 64 ) + 424 ( -4080 5264 7.9836230278 ) + 425 ( -3984 5264 7.9872231483 ) + 426 ( -4088 5168 55.9877090454 ) + 427 ( -4088 5200 39.9869117737 ) + 428 ( -3976 5200 39.9877166748 ) + 429 ( -3976 5168 55.9877204895 ) + 430 ( -3856 5360 456 ) + 431 ( -3872 5360 456 ) + 432 ( -3872 5280 456 ) + 433 ( -4096 5280 456 ) + 434 ( -3888 5280 456 ) + 435 ( -3888 5296 456 ) + 436 ( -3888 5360 456 ) + 437 ( -4096 5296 456 ) + 438 ( -3872 5376 896 ) + 439 ( -3872 5488 896 ) + 440 ( -3840 5488 896 ) + 441 ( -3840 5376 896 ) + 442 ( -3888 5376 896 ) + 443 ( -3888 5488 896 ) + 444 ( -3888 5520 896 ) + 445 ( -3872 5520 896 ) + 446 ( -3872 5504 896 ) + 447 ( -3840 5360 896 ) + 448 ( -3856 5360 896 ) + 449 ( -3872 5360 896 ) + 450 ( -3888 5360 896 ) + 451 ( -3856 5488 456 ) + 452 ( -3872 5488 456 ) + 453 ( -3888 5488 456 ) + 454 ( -3968 5264 0 ) + 455 ( -3968 5456 0 ) + 456 ( -3984 5264 0 ) + 457 ( -4096 5264 0 ) + 458 ( -4096 5456 0 ) + 459 ( -3984 5456 0 ) + 460 ( -4096 5488 0 ) + 461 ( -3984 5488 0 ) + 462 ( -3984 5472 0 ) + 463 ( -3968 5472 0 ) + 464 ( -3968 5488 0 ) + 465 ( -3968 5696 0 ) + 466 ( -3856 5696 0 ) + 467 ( -3856 5472 0 ) + 468 ( -3968 5456 8 ) + 469 ( -3968 5264 8 ) + 470 ( -3856 5456 64 ) + 471 ( -3856 5328 64 ) + 472 ( -3856 5264 64 ) + 473 ( -3968 5472 8 ) + 474 ( -3856 5472 64 ) + 475 ( -5168 5248 784 ) + 476 ( -4720 5248 784 ) + 477 ( -3856 5248 784 ) + 478 ( -4720 5264 767.9827880859 ) + 479 ( -4704 5264 768 ) + 480 ( -4096 5264 768 ) + 481 ( -3872 5264 768 ) + 482 ( -3856 5264 768 ) + 483 ( -3760 5264 89 ) + 484 ( -3760 5328 89 ) + 485 ( -3760 5392 89 ) + 486 ( -3664 5392 89 ) + 487 ( -3664 5264 89 ) + 488 ( -3760 5248 456 ) + 489 ( -3664 5248 456 ) + 490 ( -3760 5264 456 ) + 491 ( -3664 5264 456 ) + 492 ( -3824 5328 80 ) + 493 ( -3792 5328 80 ) + 494 ( -3824 5488 80 ) + 495 ( -3792 5488 80 ) + 496 ( -3792 5456 80 ) + 497 ( -3840 5488 72 ) + 498 ( -3840 5328 72 ) + 499 ( -3824 5488 72 ) + 500 ( -3824 5328 72 ) + 501 ( -3856 5328 72 ) + 502 ( -3856 5488 72 ) + 503 ( -3664 5456 80 ) + 504 ( -3664 5488 80 ) + 505 ( -3656 5424 456 ) + 506 ( -3664 5424 456 ) + 507 ( -3656 5328 456 ) + 508 ( -3664 5328 456 ) + 509 ( -3792 5392 88 ) + 510 ( -3664 5392 88 ) + 511 ( -3792 5456 88 ) + 512 ( -3664 5456 88 ) + 513 ( -3792 5328 89 ) + 514 ( -3792 5392 89 ) + 515 ( -3648 5424 456 ) + 516 ( -3648 5328 456 ) + 517 ( -3840 5264 896 ) + 518 ( -3856 5264 896 ) + 519 ( -3664 5488 72 ) + 520 ( -3664 5520 72 ) + 521 ( -3840 5520 72 ) + 522 ( -3856 5520 72 ) + 523 ( -3616 5776 64 ) + 524 ( -3600 5760 64 ) + 525 ( -3600 5664 64 ) + 526 ( -3616 5648 64 ) + 527 ( -3616 5760 64 ) + 528 ( -3840 5520 64 ) + 529 ( -3840 5712 64 ) + 530 ( -3840 5760 64 ) + 531 ( -3720 5760 64 ) + 532 ( -3616 5520 64 ) + 533 ( -3856 5712 64 ) + 534 ( -3952 5712 64 ) + 535 ( -3952 5760 64 ) + 536 ( -3872 5760 64 ) + 537 ( -3856 5696 64 ) + 538 ( -3856 5520 64 ) + 539 ( -3968 5760 64 ) + 540 ( -3968 5712 64 ) + 541 ( -3968 5696 64 ) + 542 ( -4096 5536 0 ) + 543 ( -4096 5552 0 ) + 544 ( -4096 5664 0 ) + 545 ( -4096 5680 0 ) + 546 ( -4096 6048 0 ) + 547 ( -4080 6048 0 ) + 548 ( -3968 6048 0 ) + 549 ( -4080 6048 8 ) + 550 ( -3968 6048 64 ) + 551 ( -3720 6131.0209960938 192 ) + 552 ( -3763.6884765625 6143.548828125 192 ) + 553 ( -3763.6884765625 6122.9614257813 192 ) + 554 ( -3720 6114.3149414063 192 ) + 555 ( -3733.5456542969 6114.3149414063 192 ) + 556 ( -3779.6884765625 6127.5463867188 192 ) + 557 ( -3776 5864 144 ) + 558 ( -3789.4738769531 5864 144 ) + 559 ( -3776 5784 144 ) + 560 ( -3789.4738769531 5784 144 ) + 561 ( -3789.4738769531 5830.9721679688 144 ) + 562 ( -3789.4738769531 5862.970703125 144 ) + 563 ( -3760 5880 144 ) + 564 ( -3789.4738769531 5880 144 ) + 565 ( -3760 5864 144 ) + 566 ( -3760 5784 144 ) + 567 ( -3760 5768 144 ) + 568 ( -3789.4738769531 5768 144 ) + 569 ( -3789.4738769531 5772.46484375 144 ) + 570 ( -3720 6112 144 ) + 571 ( -3733.5456542969 6114.3149414063 144 ) + 572 ( -3720 6114.3149414063 144 ) + 573 ( -3720 5768 64 ) + 574 ( -3720 5880 64 ) + 575 ( -3760 5880 64 ) + 576 ( -3760 5768 64 ) + 577 ( -3860.0251464844 5788.46484375 224 ) + 578 ( -3805.4738769531 5846.9809570313 224 ) + 579 ( -3918.5322265625 5843.0234375 224 ) + 580 ( -3863.9765625 5901.546875 224 ) + 581 ( -3807.7355957031 5880 224 ) + 582 ( -3847.984375 5917.5327148438 224 ) + 583 ( -3805.4738769531 5877.8911132813 224 ) + 584 ( -3863.9765625 5917.5327148438 224 ) + 585 ( -3934.5375976563 5859.0239257813 224 ) + 586 ( -3892.5961914063 5904 224 ) + 587 ( -3879.9765625 5917.5327148438 224 ) + 588 ( -3934.5375976563 5843.0234375 224 ) + 589 ( -3876.0334472656 5772.46484375 224 ) + 590 ( -3914.1364746094 5808 224 ) + 591 ( -3931.2944335938 5824 224 ) + 592 ( -3934.5375976563 5827.0209960938 224 ) + 593 ( -3860.0329589844 5772.46484375 224 ) + 594 ( -3872 5772.46484375 224 ) + 595 ( -3805.4738769531 5813.8017578125 224 ) + 596 ( -3833.2761230469 5784 224 ) + 597 ( -3844.0212402344 5772.46484375 224 ) + 598 ( -3790.5776367188 5864 224 ) + 599 ( -3789.4738769531 5862.970703125 224 ) + 600 ( -3789.4738769531 5830.9721679688 224 ) + 601 ( -3944 5904 144 ) + 602 ( -3934.5375976563 5904 144 ) + 603 ( -3934.5375976563 5859.0234375 144 ) + 604 ( -3934.5375976563 5827.0234375 144 ) + 605 ( -3934.5375976563 5824 144 ) + 606 ( -3944 5824 144 ) + 607 ( -3934.5375976563 5917.5327148438 144 ) + 608 ( -3934.5375976563 5920 144 ) + 609 ( -3944 5920 144 ) + 610 ( -3944 5808 144 ) + 611 ( -3952 5808 144 ) + 612 ( -3960 5808 144 ) + 613 ( -3960 5920 144 ) + 614 ( -3952 5920 144 ) + 615 ( -3931.2995605469 5824 144 ) + 616 ( -3914.13671875 5808 144 ) + 617 ( -3934.5375976563 5808 144 ) + 618 ( -3872 5768 144 ) + 619 ( -3872 5772.46484375 144 ) + 620 ( -3844.0329589844 5772.46484375 144 ) + 621 ( -3847.984375 5917.5327148438 144 ) + 622 ( -3879.9765625 5917.5327148438 144 ) + 623 ( -3848 5920 144 ) + 624 ( -3833.2761230469 5784 144 ) + 625 ( -3790.5776367188 5864 144 ) + 626 ( -3807.7355957031 5880 144 ) + 627 ( -3892.5961914063 5904 144 ) + 628 ( -3952 5920 64 ) + 629 ( -3848 5920 64 ) + 630 ( -3720 5920 64 ) + 631 ( -3720 6112 64 ) + 632 ( -3952 6064 64 ) + 633 ( -3968 5920 64 ) + 634 ( -3960 5920 64 ) + 635 ( -3847.9709472656 5917.5327148438 64 ) + 636 ( -3807.7221679688 5880 64 ) + 637 ( -3968 5808 64 ) + 638 ( -3960 5808 64 ) + 639 ( -3872 5768 64 ) + 640 ( -3872 5772.46484375 64 ) + 641 ( -3876.0307617188 5772.46484375 64 ) + 642 ( -3952 5772.46484375 64 ) + 643 ( -3952 5808 64 ) + 644 ( -3914.13671875 5808 64 ) + 645 ( -3616 6128 224 ) + 646 ( -3704 6128 224 ) + 647 ( -3616 6112 224 ) + 648 ( -3704 6112 224 ) + 649 ( -3720 6112 224 ) + 650 ( -3720 6114.3149414063 224 ) + 651 ( -3720 6131.0190429688 224 ) + 652 ( -3616 5936 64 ) + 653 ( -3616 6064 64 ) + 654 ( -3616 6112 64 ) + 655 ( -3600 5952 64 ) + 656 ( -3600 6048 64 ) + 657 ( -3280 5776 456 ) + 658 ( -3280 6128 456 ) + 659 ( -3440 5776 456 ) + 660 ( -3564 5776 456 ) + 661 ( -3564 6128 456 ) + 662 ( -3440 6128 456 ) + 663 ( -3280 5648 456 ) + 664 ( -3440 5648 456 ) + 665 ( -3091.9877929688 6128 456 ) + 666 ( -3091.9877929688 6112 456 ) + 667 ( -3091.9877929688 6016 456 ) + 668 ( -3091.9877929688 5968 456 ) + 669 ( -3091.9877929688 5808 456 ) + 670 ( -3091.9877929688 5760 456 ) + 671 ( -3091.9877929688 5664 456 ) + 672 ( -3091.9877929688 5648 456 ) + 673 ( -3087.9892578125 5760 456 ) + 674 ( -3087.9892578125 5664 456 ) + 675 ( -3087.9892578125 5968 456 ) + 676 ( -3087.9892578125 5808 456 ) + 677 ( -3087.9892578125 6112 456 ) + 678 ( -3087.9892578125 6016 456 ) + 679 ( -3872 5536 456 ) + 680 ( -3856 5520 456 ) + 681 ( -3872 5520 456 ) + 682 ( -3872 5552 456 ) + 683 ( -3888 5552 456 ) + 684 ( -3472 5520 744 ) + 685 ( -3712 5504 896 ) + 686 ( -3712 5536 896 ) + 687 ( -3840 5504 896 ) + 688 ( -3840 5536 896 ) + 689 ( -3696 5536 896 ) + 690 ( -3696 5520 896 ) + 691 ( -3696 5504 896 ) + 692 ( -3840 5552 896 ) + 693 ( -3696 5552 896 ) + 694 ( -3856 5504 896 ) + 695 ( -3856 5520 896 ) + 696 ( -3856 5552 896 ) + 697 ( -3472 5504 896 ) + 698 ( -3584 5520 896 ) + 699 ( -3472 5520 896 ) + 700 ( -3312 5648 712 ) + 701 ( -3088 5648 712 ) + 702 ( -3312 6128 712 ) + 703 ( -3088 6128 712 ) + 704 ( -3312 6128 728 ) + 705 ( -3088 6128 728 ) + 706 ( -3376 5648 728 ) + 707 ( -3312 5648 728 ) + 708 ( -3616 5520 712 ) + 709 ( -3472 4432 608 ) + 710 ( -3728 4432 608 ) + 711 ( -4096 4432 608 ) + 712 ( -4096 4480 608 ) + 713 ( -3920 4480 608 ) + 714 ( -3760 4480 608 ) + 715 ( -3472 4480 608 ) + 716 ( -3472 4288 672 ) + 717 ( -3472 4416 672 ) + 718 ( -3696 4288 672 ) + 719 ( -3696 4416 672 ) + 720 ( -3472 4432 672 ) + 721 ( -3696 4432 672 ) + 722 ( -3472 4272 672 ) + 723 ( -3568 4272 672 ) + 724 ( -3584 4272 672 ) + 725 ( -3648 4272 672 ) + 726 ( -3664 4272 672 ) + 727 ( -3696 4272 672 ) + 728 ( -3568 4096 544 ) + 729 ( -3472 4096 544 ) + 730 ( -3568 4272 544 ) + 731 ( -3472 4272 544 ) + 732 ( -3584 4272 632 ) + 733 ( -3648 4272 632 ) + 734 ( -3584 4096 632 ) + 735 ( -3648 4096 632 ) + 736 ( -3664 4272 632 ) + 737 ( -3664 4096 632 ) + 738 ( -3568 4272 632 ) + 739 ( -3568 4096 632 ) + 740 ( -4144 4416 592 ) + 741 ( -3728 4416 592 ) + 742 ( -4144 4432 608 ) + 743 ( -3728 4400 576 ) + 744 ( -4096 4400 576 ) + 745 ( -4144 4400 576 ) + 746 ( -3712 4416 656 ) + 747 ( -3712 4288 656 ) + 748 ( -3712 4272 656 ) + 749 ( -3728 4272 640 ) + 750 ( -3728 4432 640 ) + 751 ( -3712 4432 656 ) + 752 ( -3760 4496 608 ) + 753 ( -3472 4496 608 ) + 754 ( -3920 4496 608 ) + 755 ( -4096 4496 608 ) + 756 ( -3760 4480 800 ) + 757 ( -3920 4480 800 ) + 758 ( -3920 4496 810.6614990234 ) + 759 ( -3904 4496 810.6614990234 ) + 760 ( -3776 4496 810.6614990234 ) + 761 ( -3760 4496 810.6614990234 ) + 762 ( -3760 4528 704 ) + 763 ( -3472 4528 704 ) + 764 ( -3472 4512 688 ) + 765 ( -3760 4512 688 ) + 766 ( -3472 4496 672 ) + 767 ( -3760 4496 672 ) + 768 ( -4096 4528 704 ) + 769 ( -3920 4528 704 ) + 770 ( -3920 4512 688.0151367188 ) + 771 ( -4096 4512 688 ) + 772 ( -3920 4496 672 ) + 773 ( -4096 4496 672 ) + 774 ( -3904 4528 832 ) + 775 ( -3776 4528 832 ) + 776 ( -3760 4528 832 ) + 777 ( -3760 4512 821.3281860352 ) + 778 ( -3920 4512 821.3281860352 ) + 779 ( -3920 4528 832 ) + 780 ( -3440 4144 192 ) + 781 ( -3536 4144 192 ) + 782 ( -3440 4096 192 ) + 783 ( -3536 4096 192 ) + 784 ( -3408 4144 192 ) + 785 ( -3408 4140 192 ) + 786 ( -3408.0139160156 3740 192 ) + 787 ( -3408.0139160156 3736 192 ) + 788 ( -3440 3736 192 ) + 789 ( -3440 3904 192 ) + 790 ( -3616 4272 192 ) + 791 ( -3616 4096 192 ) + 792 ( -3600 4272 192 ) + 793 ( -3600 4144 192 ) + 794 ( -3600 4096 192 ) + 795 ( -3632 4096 192 ) + 796 ( -3632 4144 192 ) + 797 ( -3632 4272 192 ) + 798 ( -3560 4144 192 ) + 799 ( -3560 4096 192 ) + 800 ( -3560 3904 192 ) + 801 ( -3560 3736 192 ) + 802 ( -3600 3736 192 ) + 803 ( -3600 3904 192 ) + 804 ( -3344 4140 192 ) + 805 ( -3344 4096 192 ) + 806 ( -3344 3740 192 ) + 807 ( -3696 4144 64 ) + 808 ( -3648 4144 64 ) + 809 ( -3632 4144 64 ) + 810 ( -3632 4096 64 ) + 811 ( -3696 4096 64 ) + 812 ( -3712 4144 64 ) + 813 ( -3712 4096 64 ) + 814 ( -3712 4128 64 ) + 815 ( -3968 4144 64 ) + 816 ( -3984.0124511719 4144 64 ) + 817 ( -3760 4144 64 ) + 818 ( -3728 4144 64 ) + 819 ( -3984.0124511719 4128 64 ) + 820 ( -3632 4272 64 ) + 821 ( -3600 4272 64 ) + 822 ( -3600 4096 64 ) + 823 ( -3856 4096 0 ) + 824 ( -3712 4096 0 ) + 825 ( -4096 4096 0 ) + 826 ( -4096 4128 0 ) + 827 ( -3712 4128 0 ) + 828 ( -4096 4128 8 ) + 829 ( -4096 4144 8 ) + 830 ( -3792 4368 144 ) + 831 ( -3824 4368 144 ) + 832 ( -3792 4352 144 ) + 833 ( -3792 4336 144 ) + 834 ( -3824 4336 144 ) + 835 ( -3840 4368 144 ) + 836 ( -3840 4336 144 ) + 837 ( -3744 4336 144 ) + 838 ( -3744 4320 144 ) + 839 ( -3760 4320 144 ) + 840 ( -3840 4320 144 ) + 841 ( -3744 4352 144 ) + 842 ( -3760 4304 144 ) + 843 ( -3744 4304 144 ) + 844 ( -3792 4352 192 ) + 845 ( -3744 4352 192 ) + 846 ( -3792 4368 192 ) + 847 ( -3744 4368 192 ) + 848 ( -3744 4320 224 ) + 849 ( -3744 4336 224 ) + 850 ( -3744 4352 224 ) + 851 ( -3744 4368 224 ) + 852 ( -3728 4368 224 ) + 853 ( -3728 4336 224 ) + 854 ( -3728 4320 224 ) + 855 ( -3664 4320 144 ) + 856 ( -3664 4304 144 ) + 857 ( -3728 4304 144 ) + 858 ( -3792 4400 144 ) + 859 ( -3824 4400 144 ) + 860 ( -3840 4400 144 ) + 861 ( -4096 4400 256 ) + 862 ( -4096 4384 256 ) + 863 ( -3728 4400 256 ) + 864 ( -3728 4384 256 ) + 865 ( -3728 4368 256 ) + 866 ( -3744 4368 256 ) + 867 ( -3792 4368 256 ) + 868 ( -3824 4368 256 ) + 869 ( -3840 4368 256 ) + 870 ( -4096 4368 256 ) + 871 ( -3968 4304 64 ) + 872 ( -3968 4320 64 ) + 873 ( -3840 4320 64 ) + 874 ( -3760 4320 64 ) + 875 ( -3760 4304 64 ) + 876 ( -3983.9826660156 4304 64 ) + 877 ( -3984 4320 64 ) + 878 ( -3984 4400 64 ) + 879 ( -3968 4400 64 ) + 880 ( -3840 4400 64 ) + 881 ( -3728 4304 64 ) + 882 ( -3728 4272 64 ) + 883 ( -4096 4496 256 ) + 884 ( -3728 4496 256 ) + 885 ( -4096 4560 256 ) + 886 ( -4096 4720 256 ) + 887 ( -3728 4720 256 ) + 888 ( -3728 4560 256 ) + 889 ( -4096 4436 256 ) + 890 ( -3728 4436 256 ) + 891 ( -4144 4400 256 ) + 892 ( -4144 4436 256 ) + 893 ( -3648 4272 64 ) + 894 ( -3664 4720 256 ) + 895 ( -3628 4720 268 ) + 896 ( -3628 4560 268 ) + 897 ( -3664 4560 256 ) + 898 ( -3664 4368 224 ) + 899 ( -3664 4336 224 ) + 900 ( -3664 4320 224 ) + 901 ( -3664 4400 256 ) + 902 ( -3664 4384 256 ) + 903 ( -3664 4368 256 ) + 904 ( -3696 4272 64 ) + 905 ( -3680 4272 64 ) + 906 ( -3696 4304 64 ) + 907 ( -3680 4304 64 ) + 908 ( -4096 4368 0 ) + 909 ( -4096 4320 0 ) + 910 ( -4096 4400 0 ) + 911 ( -3984 4400 0 ) + 912 ( -3984 4320 0 ) + 913 ( -4096 4304 8 ) + 914 ( -4096 4320 8 ) + 915 ( -3476 4560 318.6618652344 ) + 916 ( -3568 4560 288 ) + 917 ( -3600 4560 277.3286132813 ) + 918 ( -3600 4720 277.3286132813 ) + 919 ( -3568 4720 288 ) + 920 ( -3476 4720 318.6618652344 ) + 921 ( -3376 4560 320 ) + 922 ( -3348 4560 320 ) + 923 ( -3408 4560 320 ) + 924 ( -3440 4560 320 ) + 925 ( -3440 4720 320 ) + 926 ( -3408 4720 320 ) + 927 ( -3376 4720 320 ) + 928 ( -3348 4720 320 ) + 929 ( -3312 4560 320 ) + 930 ( -3312 4720 320 ) + 931 ( -3471.9899902344 4720 320 ) + 932 ( -3471.9899902344 4560 320 ) + 933 ( -3664 4784 256 ) + 934 ( -3760 4784 256 ) + 935 ( -3056 4096 192 ) + 936 ( -3152 4096 192 ) + 937 ( -3152 4140 192 ) + 938 ( -3152 4144 192 ) + 939 ( -3056 4144 192 ) + 940 ( -3060 4560 320 ) + 941 ( -3088 4560 320 ) + 942 ( -3088 4720 320 ) + 943 ( -3060 4720 320 ) + 944 ( -3024 4720 320 ) + 945 ( -3024 4560 320 ) + 946 ( -3152 4560 320 ) + 947 ( -3152 4720 320 ) + 948 ( -3152 4496 320 ) + 949 ( -3184 4496 320 ) + 950 ( -3184 4720 320 ) + 951 ( -3152 4756 332 ) + 952 ( -3312 4756 332 ) + 953 ( -3312 4496 320 ) + 954 ( -3248 4140 192 ) + 955 ( -3184 4140 192 ) + 956 ( -3344 4144 192 ) + 957 ( -3248 4144 192 ) + 958 ( -3184 4144 192 ) + 959 ( -2992 4528 320 ) + 960 ( -2832 4528 320 ) + 961 ( -3008 4528 320 ) + 962 ( -3024 4544 320 ) + 963 ( -2832 4720 320 ) + 964 ( -2832 4492 320 ) + 965 ( -2992 4492 320 ) + 966 ( -2832 4464.0112304688 320 ) + 967 ( -2848 4464.0112304688 320 ) + 968 ( -2992 4464 320 ) + 969 ( -2873.599609375 4208 217.5937042236 ) + 970 ( -2854.3994140625 4400 294.3937072754 ) + 971 ( -2992 4208 217.5937042236 ) + 972 ( -2992 4400 294.4002380371 ) + 973 ( -2832 4208 217.5950775146 ) + 974 ( -2832 4144 192 ) + 975 ( -2832 3984 192 ) + 976 ( -2992 3984 192 ) + 977 ( -2992 4096 192 ) + 978 ( -2992 4144 192 ) + 979 ( -2992 4184 208 ) + 980 ( -2832 4184 208 ) + 981 ( -2832 4176 204.7946929932 ) + 982 ( -2992 4176 204.7946929932 ) + 983 ( -3032 4144 192 ) + 984 ( -3032 4096 192 ) + 985 ( -3024.0102539063 4096 192 ) + 986 ( -4176 3320 352 ) + 987 ( -4080 3320 352 ) + 988 ( -4176 3412 352 ) + 989 ( -4080 3412 352 ) + 990 ( -4176 3448 352 ) + 991 ( -4096 3448 352 ) + 992 ( -4080 3448 352 ) + 993 ( -4080 3412 64 ) + 994 ( -4176 3412 64 ) + 995 ( -4080 3320 64 ) + 996 ( -4176 3320 64 ) + 997 ( -4176 3448 64 ) + 998 ( -4096 3448 64 ) + 999 ( -4080 3448 64 ) + 1000 ( -4008 3464 64 ) + 1001 ( -4000 3464 64 ) + 1002 ( -4096 3464 64 ) + 1003 ( -4096 3568 64 ) + 1004 ( -4008 3568 64 ) + 1005 ( -4000 3568 64 ) + 1006 ( -4008 3448 64 ) + 1007 ( -4096 3756 352 ) + 1008 ( -4032 3756 352 ) + 1009 ( -4000 3756 352 ) + 1010 ( -4000 3696 352 ) + 1011 ( -4000 3680 352 ) + 1012 ( -4000 3600 352 ) + 1013 ( -4000 3568 352 ) + 1014 ( -4000 3448 352 ) + 1015 ( -4096 3648 64 ) + 1016 ( -4008 3648 64 ) + 1017 ( -4096 3904 64 ) + 1018 ( -4008 3904 64 ) + 1019 ( -4008 3888 64 ) + 1020 ( -4008 3664 64 ) + 1021 ( -4008 3604 64 ) + 1022 ( -4096 3604 64 ) + 1023 ( -4000 3888 64 ) + 1024 ( -4000 3664 64 ) + 1025 ( -4000 3936 352 ) + 1026 ( -4000 3904 352 ) + 1027 ( -4000 3808 352 ) + 1028 ( -4000 3792 352 ) + 1029 ( -4032 3792 352 ) + 1030 ( -4096 3792 352 ) + 1031 ( -4248 3792 352 ) + 1032 ( -4256 3792 352 ) + 1033 ( -4256 3808 352 ) + 1034 ( -4256 3936 352 ) + 1035 ( -4208 3936 352 ) + 1036 ( -4048 3936 352 ) + 1037 ( -3696 3904 64 ) + 1038 ( -3632 3904 64 ) + 1039 ( -3632 3872 64 ) + 1040 ( -3696 3872 64 ) + 1041 ( -3696 3888 64 ) + 1042 ( -3712 3872 64 ) + 1043 ( -3712 3888 64 ) + 1044 ( -3712 3904 64 ) + 1045 ( -3824 3872 64 ) + 1046 ( -3632 3728 64 ) + 1047 ( -3664 3728 64 ) + 1048 ( -3680 3728 64 ) + 1049 ( -3728 3728 64 ) + 1050 ( -3824 3728 64 ) + 1051 ( -3824 3736 64 ) + 1052 ( -3824 3856 64 ) + 1053 ( -3600 3728 192 ) + 1054 ( -3616 3728 192 ) + 1055 ( -3616 3904 192 ) + 1056 ( -3632 3728 192 ) + 1057 ( -3632 3872 192 ) + 1058 ( -3632 3904 192 ) + 1059 ( -3600 3728 64 ) + 1060 ( -3600 3904 64 ) + 1061 ( -3952 3792 320 ) + 1062 ( -3952 3840 320 ) + 1063 ( -3840 3840 320 ) + 1064 ( -3840 3792 320 ) + 1065 ( -3824 3840 320 ) + 1066 ( -3824 3792 320 ) + 1067 ( -3952 3856 320 ) + 1068 ( -3824 3856 320 ) + 1069 ( -3904 3872 96 ) + 1070 ( -3952 3872 96 ) + 1071 ( -3952 3904 96 ) + 1072 ( -3904 3904 96 ) + 1073 ( -3888 3904 96 ) + 1074 ( -3888 3872 96 ) + 1075 ( -3536 3736 192 ) + 1076 ( -3536 3904 192 ) + 1077 ( -4000 3808 368 ) + 1078 ( -3988 3808 368 ) + 1079 ( -4000 3888 368 ) + 1080 ( -3988 3888 368 ) + 1081 ( -3968 3808 368 ) + 1082 ( -3968 3888 368 ) + 1083 ( -3952 3808 368 ) + 1084 ( -3952 3888 368 ) + 1085 ( -3952 3856 368 ) + 1086 ( -3952 3840 368 ) + 1087 ( -3728 3696 64 ) + 1088 ( -3824 3696 64 ) + 1089 ( -3680 3696 64 ) + 1090 ( -3680 3600 64 ) + 1091 ( -3824 3600 64 ) + 1092 ( -3864 3600 65 ) + 1093 ( -3864 3680 65 ) + 1094 ( -3952 3600 65 ) + 1095 ( -3952 3680 65 ) + 1096 ( -3824 3680 65 ) + 1097 ( -3824 3600 65 ) + 1098 ( -3952 3680 352 ) + 1099 ( -3952 3600 352 ) + 1100 ( -3964 3600 352 ) + 1101 ( -3964 3680 352 ) + 1102 ( -3968 3600 352 ) + 1103 ( -3968 3680 352 ) + 1104 ( -3824 3584 64 ) + 1105 ( -3680 3584 64 ) + 1106 ( -4248 3604 64 ) + 1107 ( -4248 3568 64 ) + 1108 ( -4248 3584 64 ) + 1109 ( -4048 3936 80 ) + 1110 ( -4096 3936 80 ) + 1111 ( -4208 3936 80 ) + 1112 ( -4208 3948 80 ) + 1113 ( -4048 3948 80 ) + 1114 ( -4208 3968 80 ) + 1115 ( -4048 3968 80 ) + 1116 ( -4208 3984 80 ) + 1117 ( -4096 3984 80 ) + 1118 ( -4048 3984 80 ) + 1119 ( -4096 3936 64 ) + 1120 ( -4048 3936 64 ) + 1121 ( -4008 3936 64 ) + 1122 ( -4208 3936 368 ) + 1123 ( -4048 3936 368 ) + 1124 ( -4208 3948 368 ) + 1125 ( -4048 3948 368 ) + 1126 ( -4208 3968 368 ) + 1127 ( -4048 3968 368 ) + 1128 ( -4208 3984 368 ) + 1129 ( -4096 3984 368 ) + 1130 ( -4048 3984 368 ) + 1131 ( -3712 3984 64 ) + 1132 ( -3952 3924 96 ) + 1133 ( -3904 3924 96 ) + 1134 ( -3952 3940 96 ) + 1135 ( -3904 3940 96 ) + 1136 ( -3888 3940 96 ) + 1137 ( -3856 3984 0 ) + 1138 ( -3712 3984 0 ) + 1139 ( -3856 4000 0 ) + 1140 ( -3856 3872 64 ) + 1141 ( -3856 3904.021484375 48 ) + 1142 ( -3856 3920 40 ) + 1143 ( -3856 3984 8.0119543076 ) + 1144 ( -3712 3984 8.0119771957 ) + 1145 ( -4096 4000 0 ) + 1146 ( -3872 4000 0 ) + 1147 ( -4096 3984 0 ) + 1148 ( -3872 3984 0 ) + 1149 ( -3888 3984 0 ) + 1150 ( -3904 3984 0 ) + 1151 ( -3952 3984 0 ) + 1152 ( -3872 3920 0 ) + 1153 ( -3888 3920 0 ) + 1154 ( -3888 3940 0 ) + 1155 ( -3888 3872 48 ) + 1156 ( -3888 3904 48 ) + 1157 ( -3872 3904.0239257813 48 ) + 1158 ( -3872 3872 48 ) + 1159 ( -3888 3920 48 ) + 1160 ( -3872 3920 48 ) + 1161 ( -3856 3920 48 ) + 1162 ( -3904 3940 0 ) + 1163 ( -3904 3976 0 ) + 1164 ( -3952 3976 0 ) + 1165 ( -3952 3940 48 ) + 1166 ( -3920 3940 48 ) + 1167 ( -3952 3960 48 ) + 1168 ( -3920 3960 48 ) + 1169 ( -3904 3960 48 ) + 1170 ( -3904 3940 48 ) + 1171 ( -3952 3976 48 ) + 1172 ( -3904 3976 48 ) + 1173 ( -3872 3920 40.0109863281 ) + 1174 ( -3872 3984 8.0119514465 ) + 1175 ( -3872 3872 64 ) + 1176 ( -3472 3600 672 ) + 1177 ( -3472 3712 672 ) + 1178 ( -3696 3600 672 ) + 1179 ( -3696 3712 672 ) + 1180 ( -3472 3728 672 ) + 1181 ( -3696 3728 672 ) + 1182 ( -3952 3600 640 ) + 1183 ( -3856 3600 640 ) + 1184 ( -3952 3632 640 ) + 1185 ( -3856 3632 640 ) + 1186 ( -3840 3600 640 ) + 1187 ( -3856 3712 640 ) + 1188 ( -3840 3712 640 ) + 1189 ( -3824 3600 640 ) + 1190 ( -3824 3712 640 ) + 1191 ( -3856 3728 640 ) + 1192 ( -3824 3728 640 ) + 1193 ( -3712 3712 656 ) + 1194 ( -3712 3600 656 ) + 1195 ( -3728 3600 640 ) + 1196 ( -3728 3728 640 ) + 1197 ( -3712 3728 656 ) + 1198 ( -3968 3760 672 ) + 1199 ( -3984 3760 672 ) + 1200 ( -4096 3760 672 ) + 1201 ( -4096 3952 672 ) + 1202 ( -3968 3952 672 ) + 1203 ( -3952 3952 672 ) + 1204 ( -3952 3760 672 ) + 1205 ( -3984 3600 672 ) + 1206 ( -4096 3600 672 ) + 1207 ( -3984 3632 672 ) + 1208 ( -3968 3600 672 ) + 1209 ( -3968 3632 672 ) + 1210 ( -3952 3600 672 ) + 1211 ( -3952 3632 672 ) + 1212 ( -4224 3952 672 ) + 1213 ( -4256 3952 672 ) + 1214 ( -4288 3952 672 ) + 1215 ( -4288 3968 656 ) + 1216 ( -4224 3968 656 ) + 1217 ( -3968 3968 656 ) + 1218 ( -4224 3984 640 ) + 1219 ( -4096 3984 640 ) + 1220 ( -3952 3984 640 ) + 1221 ( -3952 3968 656 ) + 1222 ( -3472 3728 544 ) + 1223 ( -3568 3728 544 ) + 1224 ( -3648 3728 632 ) + 1225 ( -3584 3728 632 ) + 1226 ( -3664 3728 632 ) + 1227 ( -3568 3728 632 ) + 1228 ( -2988 3792 192 ) + 1229 ( -2896 3792 192 ) + 1230 ( -2988 3888 192 ) + 1231 ( -2896 3888 192 ) + 1232 ( -3024.0102539063 3792 192 ) + 1233 ( -3024.0102539063 3888 192 ) + 1234 ( -3032 3952 192 ) + 1235 ( -3032 3740 192 ) + 1236 ( -3184.0139160156 3740 192 ) + 1237 ( -3248.0139160156 3740 192 ) + 1238 ( -3024.0102539063 3952 192 ) + 1239 ( -3024.0102539063 3740 192 ) + 1240 ( -3024.0102539063 3984 192 ) + 1241 ( -3344 3736 192 ) + 1242 ( -3248.0139160156 3736 192 ) + 1243 ( -3024.0102539063 3736 192 ) + 1244 ( -3184.0139160156 3736 192 ) + 1245 ( -4176 6160 0 ) + 1246 ( -4176 6144 0 ) + 1247 ( -4208 6192 0 ) + 1248 ( -4208 6160 0 ) + 1249 ( -4208 6192 256 ) + 1250 ( -4176 6176 256 ) + 1251 ( -4192 6176 256 ) + 1252 ( -4208 6176 256 ) + 1253 ( -4176 6160 256 ) + 1254 ( -4176 6170 256 ) + 1255 ( -4204 6416 256 ) + 1256 ( -4204 6576 256 ) + 1257 ( -4208 6224 544 ) + 1258 ( -4208 6768 544 ) + 1259 ( -4208 6208 528 ) + 1260 ( -4208 6192 512 ) + 1261 ( -4240 7280 584 ) + 1262 ( -4224 6816 584 ) + 1263 ( -4240 6816 584 ) + 1264 ( -4208 6800 784 ) + 1265 ( -4224 6784 784 ) + 1266 ( -4208 6768 784 ) + 1267 ( -4224 6768 784 ) + 1268 ( -4224 6816 784 ) + 1269 ( -4240 6800 784 ) + 1270 ( -4208 6144 0 ) + 1271 ( -4208 6150 320 ) + 1272 ( -4208 6144 320 ) + 1273 ( -4192 6150 320 ) + 1274 ( -4192 6144 320 ) + 1275 ( -4176 6150 320 ) + 1276 ( -4176 6144 320 ) + 1277 ( -4192 6154 316.7945556641 ) + 1278 ( -4208 6154 316.7945556641 ) + 1279 ( -4208 6160 312 ) + 1280 ( -4192 6160 312 ) + 1281 ( -4176 6160 312 ) + 1282 ( -4208 6170 256 ) + 1283 ( -4192 6170 256 ) + 1284 ( -4208 6170 304 ) + 1285 ( -4192 6170 304 ) + 1286 ( -4176 6170 304 ) + 1287 ( -4240 6416 256 ) + 1288 ( -4240 6576 256 ) + 1289 ( -4208 6576 256 ) + 1290 ( -5168 6144 576 ) + 1291 ( -5168 6640 576 ) + 1292 ( -4832 6640 576 ) + 1293 ( -4832 6240 576 ) + 1294 ( -4832 6144 576 ) + 1295 ( -5168 6112 784 ) + 1296 ( -5168 6784 784 ) + 1297 ( -4224 6112 784 ) + 1298 ( -4464 6112 784 ) + 1299 ( -4848 6112 784 ) + 1300 ( -4832 6240 640 ) + 1301 ( -4832 6640 640 ) + 1302 ( -4816.017578125 6640 640 ) + 1303 ( -4816.017578125 6256 640 ) + 1304 ( -4816.017578125 6240 640 ) + 1305 ( -4384 6240 576 ) + 1306 ( -4384 6144 576 ) + 1307 ( -4784 6100 318.6653442383 ) + 1308 ( -4784 6144 304 ) + 1309 ( -4784.0141601563 6252 268 ) + 1310 ( -4560 6252 268 ) + 1311 ( -4560 6100 318.6653442383 ) + 1312 ( -4780.0126953125 6256 266.6665344238 ) + 1313 ( -4784.0141601563 6256 266.6665344238 ) + 1314 ( -4560 6256 266.6665344238 ) + 1315 ( -4256 6248 256 ) + 1316 ( -4384 6248 256 ) + 1317 ( -4256 6240 256 ) + 1318 ( -4384 6240 256 ) + 1319 ( -4256 6256 256 ) + 1320 ( -4384 6256 256 ) + 1321 ( -4384 6256 1 ) + 1322 ( -4384 6144 1 ) + 1323 ( -4256 6256 1 ) + 1324 ( -4256 6240 1 ) + 1325 ( -4256 6144 1 ) + 1326 ( -4240 6240 1 ) + 1327 ( -4240 6192 1 ) + 1328 ( -4240 6144 1 ) + 1329 ( -4208 6064 0 ) + 1330 ( -4224 6064 0 ) + 1331 ( -4224 6112 0 ) + 1332 ( -4224 6192 0 ) + 1333 ( -4224 6192 1 ) + 1334 ( -4224 6144 1 ) + 1335 ( -4560 6288 256 ) + 1336 ( -4432 6288 256 ) + 1337 ( -4780.0126953125 6288 256 ) + 1338 ( -4780.0126953125 6320 256 ) + 1339 ( -4780.0126953125 6416 256 ) + 1340 ( -4780.0126953125 6512 256 ) + 1341 ( -4780.0126953125 6608 256 ) + 1342 ( -4780.0126953125 6636.0170898438 256 ) + 1343 ( -4768 6636.0170898438 256 ) + 1344 ( -4672 6636.0170898438 256 ) + 1345 ( -4624 6636.0170898438 256 ) + 1346 ( -4592 6636.0170898438 256 ) + 1347 ( -4544 6636.0170898438 256 ) + 1348 ( -4448 6636.0170898438 256 ) + 1349 ( -4432 6636.0170898438 256 ) + 1350 ( -4432 6576 256 ) + 1351 ( -4784.0141601563 6608 256 ) + 1352 ( -4784.0141601563 6512 256 ) + 1353 ( -4784.0141601563 6416 256 ) + 1354 ( -4784.0141601563 6320 256 ) + 1355 ( -4592 6640 256 ) + 1356 ( -4624 6640 256 ) + 1357 ( -4672 6640 256 ) + 1358 ( -4768 6640 256 ) + 1359 ( -4448 6640 256 ) + 1360 ( -4544 6640 256 ) + 1361 ( -4304 6576 256 ) + 1362 ( -4384 6576 256 ) + 1363 ( -4256 6576 256 ) + 1364 ( -4256 6288 256 ) + 1365 ( -4256 6284 256 ) + 1366 ( -4384 6284 256 ) + 1367 ( -4384 6288 256 ) + 1368 ( -4240 6288 256 ) + 1369 ( -4304 6584 256 ) + 1370 ( -4240 6584 256 ) + 1371 ( -4208 6584 256 ) + 1372 ( -4384 6640 576 ) + 1373 ( -4256 6640 576 ) + 1374 ( -4256 6144 576 ) + 1375 ( -4224 6064 784 ) + 1376 ( -4224 6080 784 ) + 1377 ( -4208 6464 784 ) + 1378 ( -4208 6224 784 ) + 1379 ( -4208 6208 784 ) + 1380 ( -4208 6192 784 ) + 1381 ( -4208 6176 784 ) + 1382 ( -4208 6170 784 ) + 1383 ( -4208 6160 784 ) + 1384 ( -4208 6150 784 ) + 1385 ( -4208 6144 784 ) + 1386 ( -4208 6112 784 ) + 1387 ( -4208 6064 784 ) + 1388 ( -4816.017578125 6256 656 ) + 1389 ( -4816.017578125 6640 656 ) + 1390 ( -4816 6672.013671875 656 ) + 1391 ( -4400 6672.013671875 656 ) + 1392 ( -4400 6640 656 ) + 1393 ( -4400 6256 656 ) + 1394 ( -4400 6240 640 ) + 1395 ( -4400 6256 640 ) + 1396 ( -4400 6672.013671875 640 ) + 1397 ( -4384 6672.013671875 640 ) + 1398 ( -4384 6640 640 ) + 1399 ( -4384 6240 640 ) + 1400 ( -4816 6672.013671875 640 ) + 1401 ( -4832 6672.013671875 640 ) + 1402 ( -5168 6672.013671875 576 ) + 1403 ( -4832 6672.013671875 576 ) + 1404 ( -4384 6672.013671875 576 ) + 1405 ( -4256 6672.013671875 576 ) + 1406 ( -5168 7280 584 ) + 1407 ( -4240 6800 584 ) + 1408 ( -4256 6800 584 ) + 1409 ( -5168 6800 584 ) + 1410 ( -5072 7040 1760 ) + 1411 ( -5072 7104 1760 ) + 1412 ( -5040 7104 1760 ) + 1413 ( -5040 7040 1760 ) + 1414 ( -5072 7024 1760 ) + 1415 ( -5040 7024 1760 ) + 1416 ( -5024 7024 1760 ) + 1417 ( -5024 7104 1760 ) + 1418 ( -5024 7120 1760 ) + 1419 ( -5072 7120 1760 ) + 1420 ( -5088 7120 1760 ) + 1421 ( -5088 7024 1760 ) + 1422 ( -4928 6960 1760 ) + 1423 ( -4992 6960 1760 ) + 1424 ( -4992 6992 1760 ) + 1425 ( -4928 6992 1760 ) + 1426 ( -4912 6960 1760 ) + 1427 ( -4912 6992 1760 ) + 1428 ( -4912 7008 1760 ) + 1429 ( -4992 7008 1760 ) + 1430 ( -5008 7008 1760 ) + 1431 ( -5008 6960 1760 ) + 1432 ( -4912 6944 1760 ) + 1433 ( -5008 6944 1760 ) + 1434 ( -5168 6992 1760 ) + 1435 ( -5168 6960 1760 ) + 1436 ( -5120 6992 1760 ) + 1437 ( -5120 6960 1760 ) + 1438 ( -5104 6992 1760 ) + 1439 ( -5104 6960 1760 ) + 1440 ( -5168 7008 1760 ) + 1441 ( -5104 7008 1760 ) + 1442 ( -5104 6944 1760 ) + 1443 ( -5168 6944 1760 ) + 1444 ( -5040 6912 1760 ) + 1445 ( -5040 6848 1760 ) + 1446 ( -5072 6848 1760 ) + 1447 ( -5072 6912 1760 ) + 1448 ( -5040 6928 1760 ) + 1449 ( -5072 6928 1760 ) + 1450 ( -5088 6928 1760 ) + 1451 ( -5088 6848 1760 ) + 1452 ( -5088 6832 1760 ) + 1453 ( -5040 6832 1760 ) + 1454 ( -5024 6832 1760 ) + 1455 ( -5024 6928 1760 ) + 1456 ( -5024 6800 784 ) + 1457 ( -5168 6800 784 ) + 1458 ( -4256 6800 784 ) + 1459 ( -4384 6688 576 ) + 1460 ( -4256 6688 576 ) + 1461 ( -4832 6688 640 ) + 1462 ( -4384 6688 640 ) + 1463 ( -5168 6688 576 ) + 1464 ( -4832 6688 576 ) + 1465 ( -5168 6768 584 ) + 1466 ( -4256 6768 584 ) + 1467 ( -5168 6768 576 ) + 1468 ( -4256 6768 576 ) + 1469 ( -4224 5264 456 ) + 1470 ( -4224 5280 456 ) + 1471 ( -4240 5264 456 ) + 1472 ( -4240 5280 456 ) + 1473 ( -4240 5296 456 ) + 1474 ( -4460 5096 395.5697937012 ) + 1475 ( -4280 5096 453.423248291 ) + 1476 ( -4280 5000 453.423248291 ) + 1477 ( -4460 5000 395.5697937012 ) + 1478 ( -4496 5160 384 ) + 1479 ( -4496 5096 384 ) + 1480 ( -4496 5000 384 ) + 1481 ( -4720 5000 384 ) + 1482 ( -4720 5096 384 ) + 1483 ( -4720 5160 384 ) + 1484 ( -4240 5000 456 ) + 1485 ( -4240 5096 456 ) + 1486 ( -4240 5216 456 ) + 1487 ( -4272 5000 456 ) + 1488 ( -4272 5096 456 ) + 1489 ( -4720 4940 384 ) + 1490 ( -4496 4940 384 ) + 1491 ( -4112 4960 456 ) + 1492 ( -4208 4960 456 ) + 1493 ( -4240 4960 456 ) + 1494 ( -4848 5000 384 ) + 1495 ( -4848 5096 384 ) + 1496 ( -5168 5264 768 ) + 1497 ( -4704 5552 768 ) + 1498 ( -5168 5552 768 ) + 1499 ( -4624 5676 320 ) + 1500 ( -4624 5584 320 ) + 1501 ( -4720 5584 320 ) + 1502 ( -4720 5676 320 ) + 1503 ( -4720 5712 320 ) + 1504 ( -4624 5712 320 ) + 1505 ( -4368 5696 320 ) + 1506 ( -4384 5696 320 ) + 1507 ( -4384 5680 320 ) + 1508 ( -4816 5680 592.0327758789 ) + 1509 ( -4624 5680 592.0327758789 ) + 1510 ( -4624 5648 560.0317993164 ) + 1511 ( -4816 5648 560.0317993164 ) + 1512 ( -4848 5648 560 ) + 1513 ( -4848 5680 592 ) + 1514 ( -4496 5680 592 ) + 1515 ( -4448 5680 592 ) + 1516 ( -4416 5648 560 ) + 1517 ( -4512 5648 560 ) + 1518 ( -4536 5648 560 ) + 1519 ( -4400 5632 544 ) + 1520 ( -4400 5680 544 ) + 1521 ( -4384 5680 528 ) + 1522 ( -4384 5616 528 ) + 1523 ( -4512 5632 544 ) + 1524 ( -4512 5616 528 ) + 1525 ( -4528.01171875 5632 544.0237426758 ) + 1526 ( -4520 5615.9760742188 528 ) + 1527 ( -5168 5632 768 ) + 1528 ( -4704 5632 768 ) + 1529 ( -5168 5648 768 ) + 1530 ( -4864 5648 768 ) + 1531 ( -4848 5648 768 ) + 1532 ( -4816 5648 768 ) + 1533 ( -4704 5648 768 ) + 1534 ( -4496 5680 624 ) + 1535 ( -4496 5696 624 ) + 1536 ( -4640 5680 624 ) + 1537 ( -4640 5696 624 ) + 1538 ( -4816 5680 624 ) + 1539 ( -4688 5680 624 ) + 1540 ( -4816 5696 624 ) + 1541 ( -4688 5696 624 ) + 1542 ( -4448 5680 784 ) + 1543 ( -4816 5680 784 ) + 1544 ( -4848 5680 784 ) + 1545 ( -4864 5680 784 ) + 1546 ( -4864 5696 784 ) + 1547 ( -4848 5696 784 ) + 1548 ( -4464 5696 784 ) + 1549 ( -4448 5696 784 ) + 1550 ( -4448 5728 592 ) + 1551 ( -4448 6048 592 ) + 1552 ( -4448 6064 592 ) + 1553 ( -4400 6064 544 ) + 1554 ( -4384 6064 528 ) + 1555 ( -4384 5696 528 ) + 1556 ( -4864 6064 528 ) + 1557 ( -4864 6048 528 ) + 1558 ( -4864 5728 528 ) + 1559 ( -4864 5696 528 ) + 1560 ( -4864 5680 528 ) + 1561 ( -4864 5648 528 ) + 1562 ( -5168 5648 528 ) + 1563 ( -5168 6064 528 ) + 1564 ( -4864 5648 560 ) + 1565 ( -4864 5680 592 ) + 1566 ( -4268 4944 64 ) + 1567 ( -4268 5104 64 ) + 1568 ( -4144 5104 64 ) + 1569 ( -4240 4944 64 ) + 1570 ( -4368 5104 64 ) + 1571 ( -4528 5104 64 ) + 1572 ( -4304 5104 64 ) + 1573 ( -4304 4944 64 ) + 1574 ( -4304 4940 64 ) + 1575 ( -4528 4940 64 ) + 1576 ( -4528 4968 64 ) + 1577 ( -4368 5120 64 ) + 1578 ( -4544 5120 64 ) + 1579 ( -4544 5104 64 ) + 1580 ( -4268 5120 64 ) + 1581 ( -4144 5120 64 ) + 1582 ( -4304 5120 64 ) + 1583 ( -4544 4968 64 ) + 1584 ( -4352 5536 0 ) + 1585 ( -4352 5552 0 ) + 1586 ( -4256 5552 0 ) + 1587 ( -4464 5536 80 ) + 1588 ( -4464 5552 80 ) + 1589 ( -4448 5552 80 ) + 1590 ( -4368 5552 80 ) + 1591 ( -4352 5552 80 ) + 1592 ( -4352 5536 80 ) + 1593 ( -4512 5264 0 ) + 1594 ( -4512 5328 0 ) + 1595 ( -4512 5536 0 ) + 1596 ( -4464 5536 0 ) + 1597 ( -4384 5616 160 ) + 1598 ( -4388.4404296875 5616 160 ) + 1599 ( -4310.8974609375 5616 160 ) + 1600 ( -4323.7260742188 5587.1938476563 160 ) + 1601 ( -4275.18359375 5644.2788085938 160 ) + 1602 ( -4287.7749023438 5616 160 ) + 1603 ( -4307.7270507813 5571.1870117188 160 ) + 1604 ( -4323.7255859375 5571.1870117188 160 ) + 1605 ( -4291.1865234375 5660.2788085938 160 ) + 1606 ( -4289.5263671875 5664 160 ) + 1607 ( -4275.18359375 5664 160 ) + 1608 ( -4275.18359375 5648 160 ) + 1609 ( -4339.728515625 5571.1870117188 160 ) + 1610 ( -4368 5583.7744140625 160 ) + 1611 ( -4412.814453125 5603.7270507813 160 ) + 1612 ( -4412.814453125 5616 160 ) + 1613 ( -4412.814453125 5603.728515625 80 ) + 1614 ( -4440.376953125 5616 80 ) + 1615 ( -4412.814453125 5616 80 ) + 1616 ( -4448 5616 80 ) + 1617 ( -4368 5583.7783203125 80 ) + 1618 ( -4368 5568 80 ) + 1619 ( -4464 5616 80 ) + 1620 ( -4339.7202148438 5571.1870117188 80 ) + 1621 ( -4332.5673828125 5568 80 ) + 1622 ( -4256 5568 80 ) + 1623 ( -4256 5552 80 ) + 1624 ( -4272 5568 80 ) + 1625 ( -4307.7260742188 5571.1870117188 80 ) + 1626 ( -4272 5571.1870117188 80 ) + 1627 ( -4272 5616 80 ) + 1628 ( -4256 5616 80 ) + 1629 ( -4275.18359375 5616 80 ) + 1630 ( -4287.7739257813 5616 80 ) + 1631 ( -4256 5664 0 ) + 1632 ( -4335.4877929688 5680 160 ) + 1633 ( -4299.5346679688 5664 160 ) + 1634 ( -4384 5680 160 ) + 1635 ( -4369.9794921875 5680 160 ) + 1636 ( -4275.18359375 5664 0 ) + 1637 ( -4275.18359375 5676.275390625 0 ) + 1638 ( -4275.18359375 5680 0 ) + 1639 ( -4283.5458984375 5680 0 ) + 1640 ( -4283.5458984375 5680 160 ) + 1641 ( -4275.18359375 5676.275390625 160 ) + 1642 ( -4275.18359375 5644.2788085938 80 ) + 1643 ( -4275.18359375 5648 80 ) + 1644 ( -4272 5648 80 ) + 1645 ( -4275.18359375 5664 80 ) + 1646 ( -4272 5664 80 ) + 1647 ( -4256 5664 80 ) + 1648 ( -4528 5328 0 ) + 1649 ( -4528 5536 0 ) + 1650 ( -4464 5552 0 ) + 1651 ( -4528 5552 0 ) + 1652 ( -4512 5552 0 ) + 1653 ( -4512 5616 0 ) + 1654 ( -4464 5616 0 ) + 1655 ( -4368 5684.4501953125 160 ) + 1656 ( -4364.26953125 5692.8154296875 160 ) + 1657 ( -4384 5684.4501953125 160 ) + 1658 ( -4380.2729492188 5708.818359375 160 ) + 1659 ( -4364.2763671875 5708.818359375 160 ) + 1660 ( -4384 5700.4506835938 160 ) + 1661 ( -4348.275390625 5708.818359375 160 ) + 1662 ( -4320 5696.228515625 160 ) + 1663 ( -4304 5689.1049804688 160 ) + 1664 ( -4304 5689.1049804688 80 ) + 1665 ( -4320 5696.228515625 80 ) + 1666 ( -4320 5708.818359375 80 ) + 1667 ( -4320 5720 80 ) + 1668 ( -4320 5736 80 ) + 1669 ( -4304 5736 80 ) + 1670 ( -4304 5736 0 ) + 1671 ( -4304 5689.1049804688 0 ) + 1672 ( -4304 6064 0 ) + 1673 ( -4384 5708.818359375 80 ) + 1674 ( -4384 5720 80 ) + 1675 ( -4348.2763671875 5708.818359375 80 ) + 1676 ( -4380.2729492188 5708.818359375 80 ) + 1677 ( -4384 5736 80 ) + 1678 ( -4384 5700.4501953125 80 ) + 1679 ( -4384 6064 0 ) + 1680 ( -4384 5736 0 ) + 1681 ( -4384 6112 0 ) + 1682 ( -4384 6112 1 ) + 1683 ( -4224 6112 1 ) + 1684 ( -4420 5712 320 ) + 1685 ( -4748 5712 320 ) + 1686 ( -4748 5952 320 ) + 1687 ( -4748 6048 320 ) + 1688 ( -4748 6064 320 ) + 1689 ( -4560 6064 320 ) + 1690 ( -4420 6064 320 ) + 1691 ( -4368 6048 320 ) + 1692 ( -4256 6048 320 ) + 1693 ( -4384 6048 320 ) + 1694 ( -4384 6064 320 ) + 1695 ( -4256 6064 320 ) + 1696 ( -4256 6032 320 ) + 1697 ( -4352 6032 320 ) + 1698 ( -4368 6032 320 ) + 1699 ( -4384.0112304688 5712 320 ) + 1700 ( -4368 5728 320 ) + 1701 ( -4352 5728 320 ) + 1702 ( -4352 5712 320 ) + 1703 ( -4780.0126953125 5712 320 ) + 1704 ( -4780.0126953125 5728 320 ) + 1705 ( -4780.0126953125 5824 320 ) + 1706 ( -4780.0126953125 5872 320 ) + 1707 ( -4780.0126953125 5904 320 ) + 1708 ( -4780.0126953125 5952 320 ) + 1709 ( -4784 5728 320 ) + 1710 ( -4784 5824 320 ) + 1711 ( -4784 5872 320 ) + 1712 ( -4784 5904 320 ) + 1713 ( -4784 5952 320 ) + 1714 ( -4784 6048 320 ) + 1715 ( -4780.0126953125 6048 320 ) + 1716 ( -4780.0126953125 6064 320 ) + 1717 ( -4560 6096 320 ) + 1718 ( -4780.0126953125 6096 320 ) + 1719 ( -4784 6096 320 ) + 1720 ( -4208 6048 320 ) + 1721 ( -4208 6064 320 ) + 1722 ( -4192 6048 320 ) + 1723 ( -4192 6032 320 ) + 1724 ( -4176 6032 320 ) + 1725 ( -4256 6112 576 ) + 1726 ( -5168 6112 576 ) + 1727 ( -4848 6040 624 ) + 1728 ( -4840 6040 624 ) + 1729 ( -4504 6040 624 ) + 1730 ( -4504 5736 624 ) + 1731 ( -4840 5736 624 ) + 1732 ( -4848 5736 624 ) + 1733 ( -4848 6048 624 ) + 1734 ( -4848 5728 624 ) + 1735 ( -4864 5728 624 ) + 1736 ( -4864 6048 624 ) + 1737 ( -4448 5728 624 ) + 1738 ( -4464 5728 624 ) + 1739 ( -4464 5864 624 ) + 1740 ( -4448 5864 624 ) + 1741 ( -4464 6048 624 ) + 1742 ( -4464 5912 624 ) + 1743 ( -4448 6048 624 ) + 1744 ( -4448 5912 624 ) + 1745 ( -4848 5712 784 ) + 1746 ( -4832 5712 784 ) + 1747 ( -4480 5712 784 ) + 1748 ( -4464 5712 784 ) + 1749 ( -4832 5728 784 ) + 1750 ( -4816 5728 784 ) + 1751 ( -4504 5728 784 ) + 1752 ( -4496 5728 784 ) + 1753 ( -4480 5728 784 ) + 1754 ( -4496 6048 752 ) + 1755 ( -4496 5728 752 ) + 1756 ( -4504 5728 752 ) + 1757 ( -4504 5736 752 ) + 1758 ( -4504 6040 752 ) + 1759 ( -4504 6048 752 ) + 1760 ( -4816 6048 752 ) + 1761 ( -4816 6040 752 ) + 1762 ( -4816 5728 752 ) + 1763 ( -4816 5736 752 ) + 1764 ( -4848 6064 784 ) + 1765 ( -4832 6064 784 ) + 1766 ( -4816 6064 784 ) + 1767 ( -4816 6048 784 ) + 1768 ( -4816 6040 784 ) + 1769 ( -4816 5736 784 ) + 1770 ( -4864 6048 784 ) + 1771 ( -4864 6064 784 ) + 1772 ( -4864 6080 784 ) + 1773 ( -4848 6080 784 ) + 1774 ( -4480 6064 784 ) + 1775 ( -4464 6064 784 ) + 1776 ( -4496 6048 784 ) + 1777 ( -4496 6064 784 ) + 1778 ( -4464 6080 784 ) + 1779 ( -4448 6080 784 ) + 1780 ( -4448 6064 784 ) + 1781 ( -4504 6048 784 ) + 1782 ( -5168 6080 784 ) + 1783 ( -5168 6064 784 ) + 1784 ( -4528 4936 64 ) + 1785 ( -4304 4936 64 ) + 1786 ( -4272 4096 0 ) + 1787 ( -4304 4096 0 ) + 1788 ( -4354.314453125 4096 0 ) + 1789 ( -4354.314453125 4166.310546875 0 ) + 1790 ( -4354.314453125 4212.4584960938 0 ) + 1791 ( -4354.314453125 4244.4565429688 0 ) + 1792 ( -4354.314453125 4296 0 ) + 1793 ( -4304 4296 0 ) + 1794 ( -4272 4296 0 ) + 1795 ( -4420.609375 4172.3505859375 0 ) + 1796 ( -4422.3413085938 4166.310546875 0 ) + 1797 ( -4399.544921875 4166.310546875 0 ) + 1798 ( -4402.51953125 4235.4223632813 48 ) + 1799 ( -4415.1538085938 4191.3764648438 48 ) + 1800 ( -4401.9184570313 4237.5190429688 48 ) + 1801 ( -4370.314453125 4228.447265625 48 ) + 1802 ( -4383.5473632813 4182.2983398438 48 ) + 1803 ( -4404.6118164063 4188.353515625 48 ) + 1804 ( -4416.0205078125 4188.353515625 48 ) + 1805 ( -4420.609375 4172.3491210938 48 ) + 1806 ( -4383.5473632813 4166.310546875 48 ) + 1807 ( -4399.5502929688 4166.310546875 48 ) + 1808 ( -4367.54296875 4166.310546875 48 ) + 1809 ( -4354.314453125 4228.4565429688 48 ) + 1810 ( -4354.314453125 4212.4580078125 48 ) + 1811 ( -4402.51953125 4237.69140625 48 ) + 1812 ( -4402.51953125 4257.69140625 48 ) + 1813 ( -4400.4624023438 4257.69140625 48 ) + 1814 ( -4396.4677734375 4256.5439453125 48 ) + 1815 ( -4354.314453125 4244.4565429688 48 ) + 1816 ( -4442.5024414063 4096 0 ) + 1817 ( -4424.5673828125 4158.5322265625 0 ) + 1818 ( -4367.5473632813 4166.310546875 0 ) + 1819 ( -4396.4672851563 4256.5434570313 0 ) + 1820 ( -4396.1337890625 4257.69140625 0 ) + 1821 ( -4385.1528320313 4296 0 ) + 1822 ( -4402.51953125 4296 0 ) + 1823 ( -4400.4697265625 4257.69140625 0 ) + 1824 ( -4402.51953125 4257.69140625 0 ) + 1825 ( -4402.51953125 4267.4223632813 0 ) + 1826 ( -4402.51953125 4289.4711914063 0 ) + 1827 ( -4533.4697265625 4289.4711914063 0 ) + 1828 ( -4533.4697265625 4296 0 ) + 1829 ( -4533.4697265625 4212.5815429688 0 ) + 1830 ( -4533.4697265625 4180.5834960938 0 ) + 1831 ( -4533.4697265625 4158.5322265625 0 ) + 1832 ( -4533.4697265625 4096 0 ) + 1833 ( -4656 4096 0 ) + 1834 ( -4656 4296 0 ) + 1835 ( -4479.4135742188 4289.4711914063 0 ) + 1836 ( -4511.421875 4289.4711914063 0 ) + 1837 ( -4512 4296 0 ) + 1838 ( -4456.5673828125 4158.5322265625 0 ) + 1839 ( -4495.396484375 4273.4711914063 80 ) + 1840 ( -4517.4697265625 4196.5830078125 80 ) + 1841 ( -4418.5024414063 4251.4223632813 80 ) + 1842 ( -4440.5727539063 4174.5317382813 80 ) + 1843 ( -4456.5668945313 4158.5322265625 80 ) + 1844 ( -4517.4697265625 4176 80 ) + 1845 ( -4440.5727539063 4158.5322265625 80 ) + 1846 ( -4402.51953125 4235.4223632813 80 ) + 1847 ( -4415.1494140625 4191.3774414063 80 ) + 1848 ( -4416.0166015625 4188.353515625 80 ) + 1849 ( -4420.6040039063 4172.353515625 80 ) + 1850 ( -4422.3369140625 4166.310546875 80 ) + 1851 ( -4424.5673828125 4158.5322265625 80 ) + 1852 ( -4402.51953125 4251.4223632813 80 ) + 1853 ( -4402.51953125 4237.69140625 80 ) + 1854 ( -4479.4140625 4289.4711914063 80 ) + 1855 ( -4402.51953125 4267.4223632813 80 ) + 1856 ( -4402.51953125 4258.279296875 80 ) + 1857 ( -4402.51953125 4257.69140625 80 ) + 1858 ( -4495.421875 4289.4711914063 80 ) + 1859 ( -4511.421875 4289.4711914063 80 ) + 1860 ( -4517.4697265625 4268.3901367188 80 ) + 1861 ( -4533.4697265625 4180.5834960938 80 ) + 1862 ( -4533.4697265625 4212.5810546875 80 ) + 1863 ( -4384 4400 0 ) + 1864 ( -4512 4400 0 ) + 1865 ( -4304 4400 0 ) + 1866 ( -4304 4320 0 ) + 1867 ( -4528 4400 52.5714645386 ) + 1868 ( -4624 4400 52.5714645386 ) + 1869 ( -4528 4296 8 ) + 1870 ( -4533.4697265625 4296 8 ) + 1871 ( -4624 4296 8 ) + 1872 ( -4512 4400 52.5692901611 ) + 1873 ( -4512 4296 8 ) + 1874 ( -4656 4296 8 ) + 1875 ( -4656 4400 52.5714645386 ) + 1876 ( -4272 4320 0 ) + 1877 ( -4656 4408 56 ) + 1878 ( -4624 4408 56 ) + 1879 ( -4528 4408 56 ) + 1880 ( -4512 4408 56 ) + 1881 ( -4512 4408 0 ) + 1882 ( -4384 4408 0 ) + 1883 ( -4528 4788.5639648438 64 ) + 1884 ( -4528 4688 64 ) + 1885 ( -4528 4904 64 ) + 1886 ( -4368 4904 64 ) + 1887 ( -4368 4688 64 ) + 1888 ( -4512 4688 64 ) + 1889 ( -4512 4672 64 ) + 1890 ( -4368 4672 64 ) + 1891 ( -4512 4560 64 ) + 1892 ( -4512 4408 64 ) + 1893 ( -4528 4408 64 ) + 1894 ( -4528 4440 64 ) + 1895 ( -4528 4472 64 ) + 1896 ( -4304 4904 64 ) + 1897 ( -4304 4672 64 ) + 1898 ( -4352 4672 64 ) + 1899 ( -4304 4656 96 ) + 1900 ( -4304 4608 96 ) + 1901 ( -4336 4608 96 ) + 1902 ( -4336 4656 96 ) + 1903 ( -4304 4672 96 ) + 1904 ( -4336 4672 96 ) + 1905 ( -4352 4608 96 ) + 1906 ( -4352 4672 96 ) + 1907 ( -4304 4592 96 ) + 1908 ( -4352 4592 96 ) + 1909 ( -4384 4560 0 ) + 1910 ( -4512 4560 0 ) + 1911 ( -4368 4640 48 ) + 1912 ( -4368 4624 40 ) + 1913 ( -4368 4560 8 ) + 1914 ( -4384 4560 8 ) + 1915 ( -4512 4560 8 ) + 1916 ( -4352 4592 24 ) + 1917 ( -4352 4624 40 ) + 1918 ( -4352 4568 12 ) + 1919 ( -4352 4560 8 ) + 1920 ( -4352 4640 48 ) + 1921 ( -4368 4624 48 ) + 1922 ( -4352 4624 48 ) + 1923 ( -4304 4568 0 ) + 1924 ( -4304 4560 0 ) + 1925 ( -4352 4560 0 ) + 1926 ( -4352 4568 0 ) + 1927 ( -4304 4592 48 ) + 1928 ( -4336 4592 48 ) + 1929 ( -4304 4584 48 ) + 1930 ( -4336 4584 48 ) + 1931 ( -4352 4584 48 ) + 1932 ( -4352 4592 48 ) + 1933 ( -4304 4568 48 ) + 1934 ( -4352 4568 48 ) + 1935 ( -4721.8159179688 4520 144 ) + 1936 ( -4736 4520 144 ) + 1937 ( -4736 4576 144 ) + 1938 ( -4736 4602.1606445313 144 ) + 1939 ( -4688.87109375 4572.72265625 144 ) + 1940 ( -4720 4522.9067382813 144 ) + 1941 ( -4720 4520 144 ) + 1942 ( -4714 4490.904296875 144 ) + 1943 ( -4720 4490.904296875 144 ) + 1944 ( -4672.87109375 4572.7114257813 144 ) + 1945 ( -4672.87109375 4556.716796875 144 ) + 1946 ( -4675.8208007813 4552 144 ) + 1947 ( -4685.818359375 4536 144 ) + 1948 ( -4704 4506.8979492188 144 ) + 1949 ( -4756.74609375 4615.1240234375 144 ) + 1950 ( -4775.4331054688 4626.8012695313 144 ) + 1951 ( -4772.7314453125 4631.1245117188 144 ) + 1952 ( -4740.7470703125 4631.1245117188 144 ) + 1953 ( -4704 4608.1625976563 144 ) + 1954 ( -4672.87109375 4588.69921875 144 ) + 1955 ( -4704 4472 144 ) + 1956 ( -4720 4472 144 ) + 1957 ( -4704 4490.904296875 144 ) + 1958 ( -4704 4488 144 ) + 1959 ( -4784 4631.1245117188 64 ) + 1960 ( -4784 4613.087890625 64 ) + 1961 ( -4772.7294921875 4631.1245117188 64 ) + 1962 ( -4781.1782226563 4576 144 ) + 1963 ( -4768 4597.0913085938 144 ) + 1964 ( -4784 4576 144 ) + 1965 ( -4784 4597.0913085938 144 ) + 1966 ( -4784 4613.087890625 144 ) + 1967 ( -4656 4440 64 ) + 1968 ( -4704 4440 64 ) + 1969 ( -4704 4472 64 ) + 1970 ( -4648 4472 64 ) + 1971 ( -4648 4552 64 ) + 1972 ( -4648 4596.517578125 64 ) + 1973 ( -4675.8203125 4552 64 ) + 1974 ( -4672.87109375 4556.7153320313 64 ) + 1975 ( -4704 4506.904296875 112 ) + 1976 ( -4704 4488 112 ) + 1977 ( -4685.8154296875 4536 112 ) + 1978 ( -4664 4536 112 ) + 1979 ( -4664 4488 112 ) + 1980 ( -4675.8203125 4552 112 ) + 1981 ( -4664 4552 112 ) + 1982 ( -4664 4472 112 ) + 1983 ( -4704 4472 112 ) + 1984 ( -4648 4552 112 ) + 1985 ( -4648 4472 112 ) + 1986 ( -4672.87109375 4588.7114257813 64 ) + 1987 ( -4672.87109375 4904 64 ) + 1988 ( -4704 4608.1567382813 64 ) + 1989 ( -4704 4631.1245117188 64 ) + 1990 ( -4704 4904 64 ) + 1991 ( -4624 4408 64 ) + 1992 ( -4656 4408 64 ) + 1993 ( -4740.74609375 4631.1245117188 64 ) + 1994 ( -4784 4904 64 ) + 1995 ( -5168 4324 192 ) + 1996 ( -4944 4324 192 ) + 1997 ( -5168 4400 192 ) + 1998 ( -5104 4400 192 ) + 1999 ( -4976 4400 192 ) + 2000 ( -4944 4400 192 ) + 2001 ( -5040 4144 192 ) + 2002 ( -5040 4096 192 ) + 2003 ( -5040 4288 192 ) + 2004 ( -4944 4288 192 ) + 2005 ( -4944 4272 192 ) + 2006 ( -4944 4144 192 ) + 2007 ( -4944 4096 192 ) + 2008 ( -5104 4288 192 ) + 2009 ( -5168 4288 192 ) + 2010 ( -4976 4436 210 ) + 2011 ( -5104 4436 210 ) + 2012 ( -4640 4096 192 ) + 2013 ( -4656 4096 192 ) + 2014 ( -4656 4272 192 ) + 2015 ( -4656 4432 192 ) + 2016 ( -4640 4432 192 ) + 2017 ( -4624 4432 192 ) + 2018 ( -4624 4400 192 ) + 2019 ( -4624 4096 192 ) + 2020 ( -4688 4096 192 ) + 2021 ( -4800 4096 192 ) + 2022 ( -4848 4096 192 ) + 2023 ( -4848 4144 192 ) + 2024 ( -4848 4272 192 ) + 2025 ( -5104 4144 192 ) + 2026 ( -5104 4176 192 ) + 2027 ( -4736 4560 192 ) + 2028 ( -4736 4576 192 ) + 2029 ( -4736 4520 192 ) + 2030 ( -4752 4520 192 ) + 2031 ( -4752 4576 192 ) + 2032 ( -4304 4904 256 ) + 2033 ( -4784 4904 256 ) + 2034 ( -4304 4888 256 ) + 2035 ( -4320 4888 256 ) + 2036 ( -4768 4888 256 ) + 2037 ( -4784 4888 256 ) + 2038 ( -4768 4872 256 ) + 2039 ( -4768 4440 256 ) + 2040 ( -4784 4440 256 ) + 2041 ( -4784 4560 256 ) + 2042 ( -4784 4784 256 ) + 2043 ( -4320 4872 256 ) + 2044 ( -4336 4872 256 ) + 2045 ( -4376 4872 256 ) + 2046 ( -4432 4872 256 ) + 2047 ( -4752 4872 256 ) + 2048 ( -4752 4520 256 ) + 2049 ( -4752 4504 256 ) + 2050 ( -4752 4488 256 ) + 2051 ( -4752 4440 256 ) + 2052 ( -4304 4784 256 ) + 2053 ( -4304 4560 256 ) + 2054 ( -4320 4560 256 ) + 2055 ( -4336 4560 256 ) + 2056 ( -4976 4560 256 ) + 2057 ( -4900 4560 256 ) + 2058 ( -5104 4560 256 ) + 2059 ( -5104 4784 256 ) + 2060 ( -4900 4784 256 ) + 2061 ( -4864 4560 256 ) + 2062 ( -4864 4784 256 ) + 2063 ( -4976 4524 254 ) + 2064 ( -5104 4524 254 ) + 2065 ( -4976 4520 252 ) + 2066 ( -5104 4520 252 ) + 2067 ( -5104 4528 256 ) + 2068 ( -4976 4528 256 ) + 2069 ( -4268 4784 256 ) + 2070 ( -4268 4560 256 ) + 2071 ( -4976 4440 212 ) + 2072 ( -5104 4464 224 ) + 2073 ( -4656 4440 192 ) + 2074 ( -4656 4456 192 ) + 2075 ( -4640 4456 192 ) + 2076 ( -4736 4456 192 ) + 2077 ( -4736 4472 192 ) + 2078 ( -4720 4472 192 ) + 2079 ( -4656 4472 192 ) + 2080 ( -4640 4472.0102539063 192 ) + 2081 ( -4624 4472.0102539063 192 ) + 2082 ( -4736 4488 192 ) + 2083 ( -4736 4504 192 ) + 2084 ( -4720 4520 192 ) + 2085 ( -4736 4440 192 ) + 2086 ( -4752 4504 192 ) + 2087 ( -4752 4488 192 ) + 2088 ( -4752 4488 240 ) + 2089 ( -4752 4440 240 ) + 2090 ( -4736 4488 240 ) + 2091 ( -4736 4472 240 ) + 2092 ( -4736 4456 240 ) + 2093 ( -4736 4440 240 ) + 2094 ( -5072 4096 416 ) + 2095 ( -5056 4096 400 ) + 2096 ( -5088 4096 432 ) + 2097 ( -5088 4144 432 ) + 2098 ( -5056 4144 400 ) + 2099 ( -5040 4096 384 ) + 2100 ( -5040 4144 384 ) + 2101 ( -4496 4920 384 ) + 2102 ( -4720 4920 384 ) + 2103 ( -4496 4904 384 ) + 2104 ( -4720 4904 384 ) + 2105 ( -5168 4176 192 ) + 2106 ( -4144 4784 256 ) + 2107 ( -4144 4848 256 ) + 2108 ( -4144 4144 0 ) + 2109 ( -4144 4304 0 ) + 2110 ( -4112 4304 0 ) + 2111 ( -4096 4304 0 ) + 2112 ( -4096 4144 0 ) + 2113 ( -4112 4144 0 ) + 2114 ( -4144 4320 0 ) + 2115 ( -4144 4336 0 ) + 2116 ( -4144 4368 0 ) + 2117 ( -4112 4368 0 ) + 2118 ( -4112 4320 0 ) + 2119 ( -4144 4096 0 ) + 2120 ( -4112 4096 0 ) + 2121 ( -4112 4128 0 ) + 2122 ( -4144 4400 0 ) + 2123 ( -4256 4096 0 ) + 2124 ( -4144 4560 256 ) + 2125 ( -4144 4384 256 ) + 2126 ( -4144 4368 256 ) + 2127 ( -4240 4928 64 ) + 2128 ( -4208 4944 456 ) + 2129 ( -4112 4944 456 ) + 2130 ( -5088 4016 432 ) + 2131 ( -5104 4016 448 ) + 2132 ( -5104 4096 448 ) + 2133 ( -5104 4112 448 ) + 2134 ( -5104 4144 448 ) + 2135 ( -5168 4112 448 ) + 2136 ( -5168 4096 448 ) + 2137 ( -4416 4903.9741210938 640 ) + 2138 ( -4480 4903.9741210938 640 ) + 2139 ( -4416 4896 640 ) + 2140 ( -4480 4896 640 ) + 2141 ( -4496 4903.9741210938 640 ) + 2142 ( -4496 4896 640 ) + 2143 ( -4416 4880 640 ) + 2144 ( -4496 4880 640 ) + 2145 ( -4400 4903.9741210938 640 ) + 2146 ( -4400 4880 640 ) + 2147 ( -4800 4903.9741210938 640 ) + 2148 ( -4736 4903.9741210938 640 ) + 2149 ( -4736 4896 640 ) + 2150 ( -4800 4896 640 ) + 2151 ( -4720 4903.9741210938 640 ) + 2152 ( -4720 4896 640 ) + 2153 ( -4816 4896 640 ) + 2154 ( -4816 4903.9741210938 640 ) + 2155 ( -4784 4880 640 ) + 2156 ( -4720 4880 640 ) + 2157 ( -4800 4880 640 ) + 2158 ( -4816 4880 640 ) + 2159 ( -4816 4880 512 ) + 2160 ( -5104 4880 512 ) + 2161 ( -5104 4903.9741210938 512 ) + 2162 ( -4816 4903.9741210938 512 ) + 2163 ( -4816 4898 512 ) + 2164 ( -4864 4800 512 ) + 2165 ( -4800 4800 512 ) + 2166 ( -4928 4800 512 ) + 2167 ( -4944 4800 512 ) + 2168 ( -5104 4800 512 ) + 2169 ( -4800 4880 512 ) + 2170 ( -4848 4784 512 ) + 2171 ( -4800 4784 512 ) + 2172 ( -4864 4784 512 ) + 2173 ( -4784 4880 512 ) + 2174 ( -4784 4784 512 ) + 2175 ( -4928 4560 512 ) + 2176 ( -4864 4560 512 ) + 2177 ( -4944 4560 512 ) + 2178 ( -4944 4784 512 ) + 2179 ( -4848 4560 512 ) + 2180 ( -5104 4784 512 ) + 2181 ( -4800 4898 512 ) + 2182 ( -4784 4898 512 ) + 2183 ( -4288.029296875 4903.9741210938 591.9876708984 ) + 2184 ( -4272 4903.9741210938 608.0297851563 ) + 2185 ( -4272 4560 608.0298461914 ) + 2186 ( -4288.029296875 4560 591.9876708984 ) + 2187 ( -4304.029296875 4880 575.9876708984 ) + 2188 ( -4304.029296875 4560 575.9876708984 ) + 2189 ( -4304.029296875 4903.9741210938 575.9876708984 ) + 2190 ( -4256 4560 704 ) + 2191 ( -4272 4560 688 ) + 2192 ( -4272 4903.9741210938 688 ) + 2193 ( -4272 4936 688 ) + 2194 ( -4256 4936 704 ) + 2195 ( -4480 4936 680.0256958008 ) + 2196 ( -4416 4936 680.0256958008 ) + 2197 ( -4416 4919.9741210938 664 ) + 2198 ( -4416 4903.9741210938 648 ) + 2199 ( -4480 4903.9741210938 648 ) + 2200 ( -4480 4919.9741210938 664 ) + 2201 ( -5040 4919.9741210938 664 ) + 2202 ( -5040 4936 680.0256958008 ) + 2203 ( -4736 4919.9741210938 664 ) + 2204 ( -4800 4919.9741210938 664 ) + 2205 ( -4736 4903.9741210938 648 ) + 2206 ( -4800 4903.9741210938 648 ) + 2207 ( -4496 4903.9741210938 648 ) + 2208 ( -4720 4903.9741210938 648 ) + 2209 ( -4816 4903.9741210938 648 ) + 2210 ( -5040 4903.9741210938 648 ) + 2211 ( -4272 4936 680.0256958008 ) + 2212 ( -4272 4919.9741210938 664 ) + 2213 ( -4288.029296875 4903.9741210938 648 ) + 2214 ( -4272 4903.9741210938 648 ) + 2215 ( -4304.029296875 4903.9741210938 648 ) + 2216 ( -4400 4903.9741210938 648 ) + 2217 ( -4144 4496 608 ) + 2218 ( -4144 4512 688 ) + 2219 ( -4144 4528 704 ) + 2220 ( -4144 4496 672 ) + 2221 ( -5168 4160 640 ) + 2222 ( -5168 4272 640 ) + 2223 ( -5104 4272 640 ) + 2224 ( -5072 4272 640 ) + 2225 ( -5072 4160 640 ) + 2226 ( -5168 4144 640 ) + 2227 ( -5072 4144 640 ) + 2228 ( -4976 4272 576 ) + 2229 ( -4976 4160 576 ) + 2230 ( -4864 4272 576 ) + 2231 ( -4864 4192 576 ) + 2232 ( -4896 4160 576 ) + 2233 ( -4896 4144 576 ) + 2234 ( -4976 4144 576 ) + 2235 ( -4864 4160 576 ) + 2236 ( -4880 4144 576 ) + 2237 ( -4848 4272 576 ) + 2238 ( -4848 4176 576 ) + 2239 ( -5168 4144 512 ) + 2240 ( -5168 4128 512 ) + 2241 ( -5120 4144 512 ) + 2242 ( -5120 4128 512 ) + 2243 ( -5168 4112 512 ) + 2244 ( -5120 4112 512 ) + 2245 ( -5104 4144 512 ) + 2246 ( -5104 4112 512 ) + 2247 ( -5104 4288 672 ) + 2248 ( -5104 4400 672 ) + 2249 ( -4688.0234375 4400 672 ) + 2250 ( -4688.0234375 4288 672 ) + 2251 ( -5104 4272 672 ) + 2252 ( -4688.0234375 4272 672 ) + 2253 ( -5072 4272 672 ) + 2254 ( -4688.0317382813 4424 672 ) + 2255 ( -4672 4424 655.9765625 ) + 2256 ( -4672 4288 655.9741210938 ) + 2257 ( -4656 4440 639.9682617188 ) + 2258 ( -4656 4400 639.9765625 ) + 2259 ( -4656 4272 639.9765625 ) + 2260 ( -4672.0234375 4272 656 ) + 2261 ( -4672 4440 655.9682617188 ) + 2262 ( -4288 4416 736 ) + 2263 ( -4288 4304 736 ) + 2264 ( -4288 4528 736 ) + 2265 ( -4256 4528 736 ) + 2266 ( -4160 4528 736 ) + 2267 ( -4160 4304 736 ) + 2268 ( -4144 4528 736 ) + 2269 ( -4144 4496 736 ) + 2270 ( -4144 4432 736 ) + 2271 ( -4144 4304 736 ) + 2272 ( -4304 4304 736 ) + 2273 ( -4304 4400 736 ) + 2274 ( -4304 4416 736 ) + 2275 ( -4288 4288 720 ) + 2276 ( -4160 4288 720 ) + 2277 ( -4304 4288 720 ) + 2278 ( -4144 4288 720 ) + 2279 ( -4144 4272 704 ) + 2280 ( -4304 4272 704 ) + 2281 ( -4400 4528 736 ) + 2282 ( -4400 4416 736 ) + 2283 ( -4400 4400 736 ) + 2284 ( -4416 4544 720 ) + 2285 ( -4416 4416 720.0114746094 ) + 2286 ( -4400 4544 736 ) + 2287 ( -4416 4560 720 ) + 2288 ( -4416 4400 720 ) + 2289 ( -4432 4400 704 ) + 2290 ( -4432 4528 704 ) + 2291 ( -4432 4560 704 ) + 2292 ( -5104 4528 512 ) + 2293 ( -4928 4528 512 ) + 2294 ( -4864 4528 512 ) + 2295 ( -4800 4528 512 ) + 2296 ( -4800 4440 512 ) + 2297 ( -5104 4440 512 ) + 2298 ( -4800 4544 512 ) + 2299 ( -4800 4560 512 ) + 2300 ( -4784 4560 512 ) + 2301 ( -4784 4528 512 ) + 2302 ( -4784 4440 512 ) + 2303 ( -5104 4424 672 ) + 2304 ( -5104 4440 672 ) + 2305 ( -4800 4440 672 ) + 2306 ( -4784 4440 672 ) + 2307 ( -4688.0234375 4440 672 ) + 2308 ( -5184 3984 640 ) + 2309 ( -5184 4144 640 ) + 2310 ( -5232 3984 640 ) + 2311 ( -5232 4144 640 ) + 2312 ( -5168 4096 640 ) + 2313 ( -5168 4016 640 ) + 2314 ( -5168 4000 640 ) + 2315 ( -5168 3984 640 ) + 2316 ( -4256 4544 736 ) + 2317 ( -4400 4560 736 ) + 2318 ( -4304.029296875 4560 736 ) + 2319 ( -4288.029296875 4560 736 ) + 2320 ( -4272 4560 736 ) + 2321 ( -4256 4560 736 ) + 2322 ( -4864 4544 512 ) + 2323 ( -4928 4544 512 ) + 2324 ( -5104 4544 512 ) + 2325 ( -5104 4560 512 ) + 2326 ( -4564 3344 72 ) + 2327 ( -4564 3616 72 ) + 2328 ( -4688 3344 72 ) + 2329 ( -4688 3536 72 ) + 2330 ( -4688 3616 72 ) + 2331 ( -4416 3416 72 ) + 2332 ( -4528 3416 72 ) + 2333 ( -4416 3344 72 ) + 2334 ( -4528 3344 72 ) + 2335 ( -4528 3616 72 ) + 2336 ( -4528 3472 72 ) + 2337 ( -4528 3424 72 ) + 2338 ( -4248 3616 64 ) + 2339 ( -4248 3664 64 ) + 2340 ( -4248 3888 64 ) + 2341 ( -4248 3936 64 ) + 2342 ( -4208 3936 64 ) + 2343 ( -4256 3568 64 ) + 2344 ( -4248 3448 64 ) + 2345 ( -4256 3448 64 ) + 2346 ( -4256 3472 64 ) + 2347 ( -4256 3584 64 ) + 2348 ( -4256 3616 64 ) + 2349 ( -4256 3604 64 ) + 2350 ( -4256 3888 64 ) + 2351 ( -4256 3664 64 ) + 2352 ( -4248 3448 352 ) + 2353 ( -4248 3584 352 ) + 2354 ( -4248 3632 352 ) + 2355 ( -4248 3744 352 ) + 2356 ( -4248 3756 352 ) + 2357 ( -4256 3744 352 ) + 2358 ( -4256 3632 352 ) + 2359 ( -4256 3472 352 ) + 2360 ( -4256 3448 352 ) + 2361 ( -4256 3568 352 ) + 2362 ( -4256 3584 352 ) + 2363 ( -4432 3424 72 ) + 2364 ( -4416 3424 72 ) + 2365 ( -4432 3568 64 ) + 2366 ( -4432 3616 64 ) + 2367 ( -4432 3472 64 ) + 2368 ( -4512 3472 64 ) + 2369 ( -4512 3616 64 ) + 2370 ( -4512 3616 72 ) + 2371 ( -4512 3472 72 ) + 2372 ( -4432 3472 72 ) + 2373 ( -4432 3680 64 ) + 2374 ( -4432 3652 64 ) + 2375 ( -4512 3652 64 ) + 2376 ( -4512 3680 64 ) + 2377 ( -4528 3792 0 ) + 2378 ( -4528 3936 0 ) + 2379 ( -4432 3936 0 ) + 2380 ( -4432 3824 0 ) + 2381 ( -4432 3792 0 ) + 2382 ( -4544 3792 8 ) + 2383 ( -4528 3792 7.9874520302 ) + 2384 ( -4528 3680 64 ) + 2385 ( -4544 3680.0151367188 63.9899787903 ) + 2386 ( -4544 3728 40 ) + 2387 ( -4544 3744 32 ) + 2388 ( -4432 3792 7.9874620438 ) + 2389 ( -4304 3472 64 ) + 2390 ( -4304 3568 64 ) + 2391 ( -4268 3472 64 ) + 2392 ( -4268 3568 64 ) + 2393 ( -4368 3808 80 ) + 2394 ( -4304 3808 80 ) + 2395 ( -4368 3888 80 ) + 2396 ( -4304 3888 80 ) + 2397 ( -4368 3904 80 ) + 2398 ( -4304 3904 80 ) + 2399 ( -4384 3808 80 ) + 2400 ( -4384 3904 80 ) + 2401 ( -4384 3936 0 ) + 2402 ( -4384 3904 0 ) + 2403 ( -4384 3824 0 ) + 2404 ( -4376 3936 0 ) + 2405 ( -4376 3904 0 ) + 2406 ( -4304 3904 48 ) + 2407 ( -4360 3904 48 ) + 2408 ( -4360 3936 48 ) + 2409 ( -4304 3936 48 ) + 2410 ( -4376 3904 48 ) + 2411 ( -4376 3936 48 ) + 2412 ( -4416 3472 72 ) + 2413 ( -4584 3680 128 ) + 2414 ( -4560 3680 128 ) + 2415 ( -4584 3712 128 ) + 2416 ( -4560 3712 128 ) + 2417 ( -4584 3728 128 ) + 2418 ( -4576 3728 128 ) + 2419 ( -4560 3728 128 ) + 2420 ( -4544 3728 128 ) + 2421 ( -4544 3680 128 ) + 2422 ( -4552 3728 128 ) + 2423 ( -4624 3728 128 ) + 2424 ( -4624 3736 128 ) + 2425 ( -4616 3736 128 ) + 2426 ( -4616 3728 128 ) + 2427 ( -4600 3736 128 ) + 2428 ( -4600 3728 128 ) + 2429 ( -4624 3752 128 ) + 2430 ( -4600 3752 128 ) + 2431 ( -4544 3936 0 ) + 2432 ( -4544 3792 0 ) + 2433 ( -4544 3808 0 ) + 2434 ( -4576 3936 0 ) + 2435 ( -4560 3936 0 ) + 2436 ( -4560 3808 0 ) + 2437 ( -4560 3792 0 ) + 2438 ( -4560 3744 0 ) + 2439 ( -4576 3744 0 ) + 2440 ( -4576 3824 0 ) + 2441 ( -4560 3792 7.9874486923 ) + 2442 ( -4552 3744 31.9876937866 ) + 2443 ( -4560 3744 31.9876937866 ) + 2444 ( -4600 3936 0 ) + 2445 ( -4600 3824 0 ) + 2446 ( -4592 3728 80 ) + 2447 ( -4592 3808 80 ) + 2448 ( -4600 3728 80 ) + 2449 ( -4600 3752 80 ) + 2450 ( -4600 3808 80 ) + 2451 ( -4576 3808 80 ) + 2452 ( -4576 3744 80 ) + 2453 ( -4576 3728 80 ) + 2454 ( -4600 3824 80 ) + 2455 ( -4576 3824 80 ) + 2456 ( -4552 3728 39.9876937866 ) + 2457 ( -4560 3744 80 ) + 2458 ( -4552 3744 80 ) + 2459 ( -4552 3728 80 ) + 2460 ( -4656 3936 0 ) + 2461 ( -4656 3824 0 ) + 2462 ( -4656 3752 80 ) + 2463 ( -4656 3808 80 ) + 2464 ( -4656 3824 80 ) + 2465 ( -4640 3936 192 ) + 2466 ( -4656 3936 192 ) + 2467 ( -4640 3712 192 ) + 2468 ( -4640 3680 192 ) + 2469 ( -4656 3680 192 ) + 2470 ( -4656 3856 192 ) + 2471 ( -4624 3680 192 ) + 2472 ( -4624 3712 192 ) + 2473 ( -4624 3936 192 ) + 2474 ( -4624 3728 192 ) + 2475 ( -4688 3936 192 ) + 2476 ( -4688 3856 192 ) + 2477 ( -4624 3712 176 ) + 2478 ( -4624 3680 176 ) + 2479 ( -4600 3680 176 ) + 2480 ( -4600 3712 176 ) + 2481 ( -4584 3680 176 ) + 2482 ( -4584 3712 176 ) + 2483 ( -4624 3728 176 ) + 2484 ( -4584 3728 176 ) + 2485 ( -4600 3728 176 ) + 2486 ( -4616 3728 176 ) + 2487 ( -4268 3808 368 ) + 2488 ( -4256 3808 368 ) + 2489 ( -4268 3888 368 ) + 2490 ( -4256 3888 368 ) + 2491 ( -4288 3808 368 ) + 2492 ( -4288 3888 368 ) + 2493 ( -4304 3808 368 ) + 2494 ( -4304 3888 368 ) + 2495 ( -4268 3472 352 ) + 2496 ( -4268 3568 352 ) + 2497 ( -4288 3472 352 ) + 2498 ( -4288 3568 352 ) + 2499 ( -4304 3472 352 ) + 2500 ( -4304 3568 352 ) + 2501 ( -4256 3600 672 ) + 2502 ( -4256 3648 672 ) + 2503 ( -4256 3776 672 ) + 2504 ( -4400 3664 640 ) + 2505 ( -4400 3648 640 ) + 2506 ( -4400 3600 640 ) + 2507 ( -4656 3600 640 ) + 2508 ( -4656 3664 640 ) + 2509 ( -4656 3680 640 ) + 2510 ( -4432 3680 640 ) + 2511 ( -4400 3680 640 ) + 2512 ( -4288 3600 672 ) + 2513 ( -4288 3648 672 ) + 2514 ( -4272 3648 672 ) + 2515 ( -4304 3600 672 ) + 2516 ( -4304 3648 672 ) + 2517 ( -4304 3600 640 ) + 2518 ( -4304 3648 640 ) + 2519 ( -4288 3776 672 ) + 2520 ( -4272 3776 672 ) + 2521 ( -4304 3776 672 ) + 2522 ( -4304 3808 672 ) + 2523 ( -4304 3936 672 ) + 2524 ( -4304 3952 672 ) + 2525 ( -4672 3664 655.9684448242 ) + 2526 ( -4672 3840 655.9741210938 ) + 2527 ( -4688 3664 672 ) + 2528 ( -4688 3840 672 ) + 2529 ( -4656 3840 640 ) + 2530 ( -4688 3856 672 ) + 2531 ( -4656 3856 640 ) + 2532 ( -4256 3984 0 ) + 2533 ( -4304 3968 656 ) + 2534 ( -4304 3984 640 ) + 2535 ( -4304 3984 0 ) + 2536 ( -4304 3952 0 ) + 2537 ( -4376 3952 0 ) + 2538 ( -4656 3952 0 ) + 2539 ( -4624 3984 192 ) + 2540 ( -4376 3952 48 ) + 2541 ( -4304 3952 48 ) + 2542 ( -5040 3984 192 ) + 2543 ( -5088 3984 192 ) + 2544 ( -5040 3856 192 ) + 2545 ( -5088 3856 192 ) + 2546 ( -5088 3952 192 ) + 2547 ( -5104 3952 192 ) + 2548 ( -5104 3856 192 ) + 2549 ( -5072 3984 416 ) + 2550 ( -5088 3984 432 ) + 2551 ( -5104 3984 512 ) + 2552 ( -5104 4000 512 ) + 2553 ( -5104 4016 512 ) + 2554 ( -5088 4016 512 ) + 2555 ( -5088 3984 512 ) + 2556 ( -5072 3968 640 ) + 2557 ( -5072 3856 640 ) + 2558 ( -5104 3856 640 ) + 2559 ( -5168 3856 640 ) + 2560 ( -5168 3968 640 ) + 2561 ( -5104 3984 640 ) + 2562 ( -5088 3984 640 ) + 2563 ( -5072 3984 640 ) + 2564 ( -5104 3840 672 ) + 2565 ( -5104 3664 672 ) + 2566 ( -5104 3856 672 ) + 2567 ( -5072 3856 672 ) + 2568 ( -5024 3856 672 ) + 2569 ( -4864 3856 672 ) + 2570 ( -4848 3856 672 ) + 2571 ( -4800 3856 672 ) + 2572 ( -5168 4016 448 ) + 2573 ( -5168 3984 512 ) + 2574 ( -5168 4000 512 ) + 2575 ( -5168 4016 512 ) + 2576 ( -4976 3968 576 ) + 2577 ( -4976 3856 576 ) + 2578 ( -5024 3856 608 ) + 2579 ( -5024 3968 608 ) + 2580 ( -4896 3968 576 ) + 2581 ( -4864 3936 576 ) + 2582 ( -4864 3856 576 ) + 2583 ( -5024 3984 608 ) + 2584 ( -4976 3984 576 ) + 2585 ( -4880 3984 576 ) + 2586 ( -4864 3968 576 ) + 2587 ( -4800 3856 192 ) + 2588 ( -4880 3856 192 ) + 2589 ( -4880 3820 192 ) + 2590 ( -5024 3820 192 ) + 2591 ( -4880 3792 192 ) + 2592 ( -4880 3760 192 ) + 2593 ( -4896 3760 192 ) + 2594 ( -5024 3760 192 ) + 2595 ( -5024 3792 192 ) + 2596 ( -5040 3820 192 ) + 2597 ( -5024 3664.0314941406 168 ) + 2598 ( -4896 3664.0314941406 168 ) + 2599 ( -5024 3696 168 ) + 2600 ( -4896 3696 168 ) + 2601 ( -5024 3696 176 ) + 2602 ( -4896 3696 176 ) + 2603 ( -5024 3728 176 ) + 2604 ( -4896 3728 176 ) + 2605 ( -5024 3728 184 ) + 2606 ( -4896 3728 184 ) + 2607 ( -5024 3760 184 ) + 2608 ( -4896 3760 184 ) + 2609 ( -5024 3568 136 ) + 2610 ( -5024 3540 136 ) + 2611 ( -4896 3568 136 ) + 2612 ( -4896 3540 136 ) + 2613 ( -5024 3536 136 ) + 2614 ( -4896 3536.0314941406 136 ) + 2615 ( -5024 3568 144 ) + 2616 ( -4896 3568 144 ) + 2617 ( -5024 3600 144 ) + 2618 ( -4896 3600 144 ) + 2619 ( -5024 3600 152 ) + 2620 ( -4896 3600 152 ) + 2621 ( -5024 3632 152 ) + 2622 ( -4896 3632 152 ) + 2623 ( -5024 3632 160 ) + 2624 ( -4896 3632 160 ) + 2625 ( -5024 3664 160 ) + 2626 ( -4896 3664 160 ) + 2627 ( -5040 3344 120 ) + 2628 ( -4880 3344 120 ) + 2629 ( -5040 3504 120 ) + 2630 ( -4880 3504 120 ) + 2631 ( -4896 3504 128 ) + 2632 ( -5024 3504 128 ) + 2633 ( -5024 3536 128 ) + 2634 ( -4896 3536 128 ) + 2635 ( -5040 3760.0314941406 192 ) + 2636 ( -5041.8823242188 3760.0314941406 192 ) + 2637 ( -5041.8823242188 3792 192 ) + 2638 ( -5040 3792 192 ) + 2639 ( -5040 3568 144 ) + 2640 ( -5040 3728.029296875 184 ) + 2641 ( -5040 3540 137 ) + 2642 ( -5024 3540 137 ) + 2643 ( -5040 3536 136 ) + 2644 ( -5040 3504 128 ) + 2645 ( -5056 3984 400 ) + 2646 ( -5040 3984 384 ) + 2647 ( -4784 3536 72 ) + 2648 ( -4784 3616 72 ) + 2649 ( -4878.1186523438 3792 192 ) + 2650 ( -4878.119140625 3760.0314941406 192 ) + 2651 ( -4880 3728.0314941406 184 ) + 2652 ( -4880 3536 136 ) + 2653 ( -4880 3540 137 ) + 2654 ( -4896 3540 137 ) + 2655 ( -4848 3936 576 ) + 2656 ( -4848 3856 576 ) + 2657 ( -4848 3952 576 ) + 2658 ( -4720 3360 80 ) + 2659 ( -4688 3360 80 ) + 2660 ( -4720 3488 80 ) + 2661 ( -4688 3488 80 ) + 2662 ( -4752 3488 88 ) + 2663 ( -4752 3360 88 ) + 2664 ( -4720 3488 88 ) + 2665 ( -4720 3360 88 ) + 2666 ( -4752 3488 96 ) + 2667 ( -4780 3488 96 ) + 2668 ( -4752 3360 96 ) + 2669 ( -4780 3360 96 ) + 2670 ( -4784 3488 96 ) + 2671 ( -4784 3360 96 ) + 2672 ( -4816.0146484375 3488 112 ) + 2673 ( -4844 3488 112 ) + 2674 ( -4816 3360 112 ) + 2675 ( -4844 3360 112 ) + 2676 ( -4848 3488 112 ) + 2677 ( -4848 3360 112 ) + 2678 ( -4784 3488 104 ) + 2679 ( -4816 3488 104 ) + 2680 ( -4784 3360 104 ) + 2681 ( -4816 3360 104 ) + 2682 ( -4848 3504 120 ) + 2683 ( -4848 3488 120 ) + 2684 ( -4848 3360 120 ) + 2685 ( -4848 3344 120 ) + 2686 ( -4780 3504 103 ) + 2687 ( -4780 3488 103 ) + 2688 ( -4780 3520 103 ) + 2689 ( -4688 3520 80 ) + 2690 ( -4844 3488 119 ) + 2691 ( -4844 3504 119 ) + 2692 ( -4816 3504 112 ) + 2693 ( -4784 3504 104 ) + 2694 ( -4880 3504 128 ) + 2695 ( -4780 3536 103 ) + 2696 ( -4688 3536 80 ) + 2697 ( -4784 3520 104 ) + 2698 ( -4784 3536 104 ) + 2699 ( -4688 3344 80 ) + 2700 ( -4780 3344 103 ) + 2701 ( -4780 3360 103 ) + 2702 ( -4844 3344 119 ) + 2703 ( -4816 3344 112 ) + 2704 ( -4844 3360 119 ) +} +edges 3636 { + 0 ( 0 0 ) + 1 ( 0 1 ) + 2 ( 2 0 ) + 3 ( 3 2 ) + 4 ( 3 1 ) + 5 ( 4 2 ) + 6 ( 4 5 ) + 7 ( 5 6 ) + 8 ( 6 3 ) + 9 ( 7 8 ) + 10 ( 7 9 ) + 11 ( 10 9 ) + 12 ( 11 10 ) + 13 ( 8 11 ) + 14 ( 12 13 ) + 15 ( 13 14 ) + 16 ( 14 15 ) + 17 ( 8 15 ) + 18 ( 12 11 ) + 19 ( 16 17 ) + 20 ( 17 18 ) + 21 ( 18 19 ) + 22 ( 20 19 ) + 23 ( 21 20 ) + 24 ( 21 22 ) + 25 ( 22 23 ) + 26 ( 23 16 ) + 27 ( 24 25 ) + 28 ( 17 25 ) + 29 ( 24 16 ) + 30 ( 26 25 ) + 31 ( 26 18 ) + 32 ( 27 10 ) + 33 ( 28 27 ) + 34 ( 29 28 ) + 35 ( 11 29 ) + 36 ( 30 29 ) + 37 ( 30 31 ) + 38 ( 31 12 ) + 39 ( 32 33 ) + 40 ( 33 34 ) + 41 ( 34 35 ) + 42 ( 35 36 ) + 43 ( 36 37 ) + 44 ( 37 32 ) + 45 ( 38 39 ) + 46 ( 38 40 ) + 47 ( 41 40 ) + 48 ( 39 41 ) + 49 ( 42 43 ) + 50 ( 39 43 ) + 51 ( 42 41 ) + 52 ( 44 45 ) + 53 ( 45 46 ) + 54 ( 46 47 ) + 55 ( 47 48 ) + 56 ( 48 44 ) + 57 ( 49 50 ) + 58 ( 50 51 ) + 59 ( 52 51 ) + 60 ( 53 52 ) + 61 ( 54 53 ) + 62 ( 54 49 ) + 63 ( 55 46 ) + 64 ( 55 56 ) + 65 ( 56 57 ) + 66 ( 57 45 ) + 67 ( 58 59 ) + 68 ( 59 60 ) + 69 ( 60 61 ) + 70 ( 62 61 ) + 71 ( 33 62 ) + 72 ( 32 58 ) + 73 ( 63 64 ) + 74 ( 64 65 ) + 75 ( 65 66 ) + 76 ( 66 67 ) + 77 ( 67 68 ) + 78 ( 68 69 ) + 79 ( 69 70 ) + 80 ( 70 71 ) + 81 ( 71 72 ) + 82 ( 72 63 ) + 83 ( 73 74 ) + 84 ( 75 73 ) + 85 ( 65 75 ) + 86 ( 74 64 ) + 87 ( 76 73 ) + 88 ( 77 76 ) + 89 ( 78 77 ) + 90 ( 78 75 ) + 91 ( 79 80 ) + 92 ( 80 81 ) + 93 ( 82 81 ) + 94 ( 82 83 ) + 95 ( 83 84 ) + 96 ( 84 85 ) + 97 ( 85 79 ) + 98 ( 86 87 ) + 99 ( 88 86 ) + 100 ( 88 89 ) + 101 ( 90 89 ) + 102 ( 91 90 ) + 103 ( 92 91 ) + 104 ( 92 87 ) + 105 ( 93 94 ) + 106 ( 93 79 ) + 107 ( 85 94 ) + 108 ( 95 96 ) + 109 ( 97 96 ) + 110 ( 98 97 ) + 111 ( 98 99 ) + 112 ( 95 99 ) + 113 ( 83 100 ) + 114 ( 101 100 ) + 115 ( 101 102 ) + 116 ( 102 103 ) + 117 ( 103 94 ) + 118 ( 102 104 ) + 119 ( 104 105 ) + 120 ( 105 103 ) + 121 ( 106 107 ) + 122 ( 107 108 ) + 123 ( 108 27 ) + 124 ( 9 106 ) + 125 ( 90 109 ) + 126 ( 109 110 ) + 127 ( 110 111 ) + 128 ( 111 112 ) + 129 ( 112 113 ) + 130 ( 113 114 ) + 131 ( 114 91 ) + 132 ( 115 116 ) + 133 ( 115 92 ) + 134 ( 116 114 ) + 135 ( 116 113 ) + 136 ( 117 110 ) + 137 ( 118 117 ) + 138 ( 119 118 ) + 139 ( 120 119 ) + 140 ( 121 120 ) + 141 ( 121 122 ) + 142 ( 122 111 ) + 143 ( 109 123 ) + 144 ( 123 110 ) + 145 ( 124 106 ) + 146 ( 125 124 ) + 147 ( 126 125 ) + 148 ( 126 127 ) + 149 ( 107 127 ) + 150 ( 127 128 ) + 151 ( 128 108 ) + 152 ( 121 129 ) + 153 ( 129 130 ) + 154 ( 130 131 ) + 155 ( 131 115 ) + 156 ( 112 122 ) + 157 ( 132 133 ) + 158 ( 72 132 ) + 159 ( 133 71 ) + 160 ( 134 135 ) + 161 ( 68 135 ) + 162 ( 67 134 ) + 163 ( 69 136 ) + 164 ( 136 137 ) + 165 ( 70 137 ) + 166 ( 138 139 ) + 167 ( 138 140 ) + 168 ( 140 141 ) + 169 ( 141 142 ) + 170 ( 142 143 ) + 171 ( 143 144 ) + 172 ( 144 139 ) + 173 ( 145 146 ) + 174 ( 139 145 ) + 175 ( 144 147 ) + 176 ( 147 146 ) + 177 ( 127 148 ) + 178 ( 126 149 ) + 179 ( 149 148 ) + 180 ( 128 150 ) + 181 ( 148 150 ) + 182 ( 124 151 ) + 183 ( 151 152 ) + 184 ( 125 152 ) + 185 ( 153 154 ) + 186 ( 155 153 ) + 187 ( 155 156 ) + 188 ( 154 156 ) + 189 ( 157 158 ) + 190 ( 159 157 ) + 191 ( 159 160 ) + 192 ( 158 160 ) + 193 ( 158 161 ) + 194 ( 160 162 ) + 195 ( 162 161 ) + 196 ( 159 163 ) + 197 ( 163 164 ) + 198 ( 162 164 ) + 199 ( 165 157 ) + 200 ( 165 166 ) + 201 ( 163 166 ) + 202 ( 167 168 ) + 203 ( 167 169 ) + 204 ( 170 169 ) + 205 ( 170 168 ) + 206 ( 168 171 ) + 207 ( 170 172 ) + 208 ( 172 173 ) + 209 ( 174 173 ) + 210 ( 174 175 ) + 211 ( 171 175 ) + 212 ( 176 177 ) + 213 ( 176 178 ) + 214 ( 179 178 ) + 215 ( 179 177 ) + 216 ( 179 180 ) + 217 ( 180 181 ) + 218 ( 177 181 ) + 219 ( 178 182 ) + 220 ( 182 183 ) + 221 ( 183 184 ) + 222 ( 184 185 ) + 223 ( 185 186 ) + 224 ( 186 180 ) + 225 ( 181 187 ) + 226 ( 187 188 ) + 227 ( 188 189 ) + 228 ( 189 190 ) + 229 ( 190 191 ) + 230 ( 191 176 ) + 231 ( 173 192 ) + 232 ( 193 192 ) + 233 ( 193 194 ) + 234 ( 194 174 ) + 235 ( 195 196 ) + 236 ( 197 196 ) + 237 ( 197 198 ) + 238 ( 195 198 ) + 239 ( 199 200 ) + 240 ( 199 195 ) + 241 ( 198 200 ) + 242 ( 201 202 ) + 243 ( 202 200 ) + 244 ( 197 201 ) + 245 ( 203 204 ) + 246 ( 201 203 ) + 247 ( 196 204 ) + 248 ( 205 206 ) + 249 ( 204 205 ) + 250 ( 199 206 ) + 251 ( 171 207 ) + 252 ( 208 175 ) + 253 ( 208 207 ) + 254 ( 209 210 ) + 255 ( 211 210 ) + 256 ( 211 212 ) + 257 ( 209 212 ) + 258 ( 213 214 ) + 259 ( 213 209 ) + 260 ( 212 214 ) + 261 ( 215 216 ) + 262 ( 216 214 ) + 263 ( 211 215 ) + 264 ( 217 218 ) + 265 ( 215 218 ) + 266 ( 210 217 ) + 267 ( 219 220 ) + 268 ( 220 217 ) + 269 ( 213 219 ) + 270 ( 221 222 ) + 271 ( 221 223 ) + 272 ( 223 224 ) + 273 ( 224 222 ) + 274 ( 222 225 ) + 275 ( 226 224 ) + 276 ( 227 226 ) + 277 ( 228 227 ) + 278 ( 225 228 ) + 279 ( 229 230 ) + 280 ( 231 229 ) + 281 ( 232 231 ) + 282 ( 232 230 ) + 283 ( 233 229 ) + 284 ( 233 234 ) + 285 ( 235 234 ) + 286 ( 231 235 ) + 287 ( 236 237 ) + 288 ( 237 230 ) + 289 ( 236 232 ) + 290 ( 207 221 ) + 291 ( 194 208 ) + 292 ( 238 193 ) + 293 ( 239 238 ) + 294 ( 240 239 ) + 295 ( 223 240 ) + 296 ( 227 239 ) + 297 ( 226 240 ) + 298 ( 230 241 ) + 299 ( 241 242 ) + 300 ( 229 242 ) + 301 ( 242 243 ) + 302 ( 243 233 ) + 303 ( 237 244 ) + 304 ( 241 244 ) + 305 ( 119 245 ) + 306 ( 245 246 ) + 307 ( 247 246 ) + 308 ( 248 247 ) + 309 ( 249 248 ) + 310 ( 250 249 ) + 311 ( 251 250 ) + 312 ( 120 251 ) + 313 ( 252 253 ) + 314 ( 254 253 ) + 315 ( 255 254 ) + 316 ( 255 252 ) + 317 ( 256 257 ) + 318 ( 258 257 ) + 319 ( 258 192 ) + 320 ( 172 256 ) + 321 ( 259 257 ) + 322 ( 260 259 ) + 323 ( 258 260 ) + 324 ( 261 129 ) + 325 ( 262 261 ) + 326 ( 263 262 ) + 327 ( 264 263 ) + 328 ( 265 264 ) + 329 ( 130 265 ) + 330 ( 265 266 ) + 331 ( 131 266 ) + 332 ( 261 251 ) + 333 ( 263 255 ) + 334 ( 252 262 ) + 335 ( 191 182 ) + 336 ( 267 268 ) + 337 ( 267 269 ) + 338 ( 269 270 ) + 339 ( 271 270 ) + 340 ( 271 272 ) + 341 ( 272 268 ) + 342 ( 273 274 ) + 343 ( 273 275 ) + 344 ( 275 276 ) + 345 ( 276 277 ) + 346 ( 278 277 ) + 347 ( 278 279 ) + 348 ( 279 280 ) + 349 ( 280 274 ) + 350 ( 281 282 ) + 351 ( 283 281 ) + 352 ( 284 283 ) + 353 ( 284 282 ) + 354 ( 285 286 ) + 355 ( 287 285 ) + 356 ( 288 287 ) + 357 ( 286 288 ) + 358 ( 289 290 ) + 359 ( 291 290 ) + 360 ( 291 292 ) + 361 ( 293 292 ) + 362 ( 289 293 ) + 363 ( 293 294 ) + 364 ( 295 292 ) + 365 ( 295 294 ) + 366 ( 293 273 ) + 367 ( 274 289 ) + 368 ( 296 297 ) + 369 ( 298 296 ) + 370 ( 299 298 ) + 371 ( 297 299 ) + 372 ( 300 296 ) + 373 ( 300 301 ) + 374 ( 298 301 ) + 375 ( 302 303 ) + 376 ( 304 302 ) + 377 ( 305 304 ) + 378 ( 305 303 ) + 379 ( 306 295 ) + 380 ( 307 306 ) + 381 ( 308 307 ) + 382 ( 309 308 ) + 383 ( 310 309 ) + 384 ( 311 310 ) + 385 ( 294 311 ) + 386 ( 312 313 ) + 387 ( 303 312 ) + 388 ( 313 305 ) + 389 ( 292 314 ) + 390 ( 315 291 ) + 391 ( 314 315 ) + 392 ( 314 302 ) + 393 ( 304 315 ) + 394 ( 316 308 ) + 395 ( 316 317 ) + 396 ( 317 318 ) + 397 ( 309 318 ) + 398 ( 319 320 ) + 399 ( 321 319 ) + 400 ( 322 321 ) + 401 ( 322 323 ) + 402 ( 323 324 ) + 403 ( 324 325 ) + 404 ( 325 326 ) + 405 ( 326 327 ) + 406 ( 327 320 ) + 407 ( 328 329 ) + 408 ( 330 328 ) + 409 ( 331 330 ) + 410 ( 331 329 ) + 411 ( 329 319 ) + 412 ( 320 328 ) + 413 ( 332 277 ) + 414 ( 333 332 ) + 415 ( 278 333 ) + 416 ( 324 334 ) + 417 ( 335 323 ) + 418 ( 334 335 ) + 419 ( 334 332 ) + 420 ( 333 335 ) + 421 ( 336 337 ) + 422 ( 336 338 ) + 423 ( 339 338 ) + 424 ( 339 337 ) + 425 ( 339 320 ) + 426 ( 327 337 ) + 427 ( 340 341 ) + 428 ( 341 342 ) + 429 ( 342 343 ) + 430 ( 343 344 ) + 431 ( 344 345 ) + 432 ( 346 345 ) + 433 ( 346 347 ) + 434 ( 347 348 ) + 435 ( 348 349 ) + 436 ( 349 350 ) + 437 ( 350 351 ) + 438 ( 351 340 ) + 439 ( 344 317 ) + 440 ( 343 318 ) + 441 ( 352 353 ) + 442 ( 352 340 ) + 443 ( 351 353 ) + 444 ( 354 350 ) + 445 ( 355 354 ) + 446 ( 353 355 ) + 447 ( 345 356 ) + 448 ( 357 356 ) + 449 ( 357 346 ) + 450 ( 348 358 ) + 451 ( 359 347 ) + 452 ( 359 358 ) + 453 ( 360 361 ) + 454 ( 362 360 ) + 455 ( 362 363 ) + 456 ( 363 364 ) + 457 ( 364 365 ) + 458 ( 365 366 ) + 459 ( 366 367 ) + 460 ( 367 361 ) + 461 ( 368 362 ) + 462 ( 368 369 ) + 463 ( 369 363 ) + 464 ( 370 371 ) + 465 ( 371 365 ) + 466 ( 364 370 ) + 467 ( 372 373 ) + 468 ( 373 367 ) + 469 ( 366 372 ) + 470 ( 374 375 ) + 471 ( 376 374 ) + 472 ( 377 376 ) + 473 ( 378 377 ) + 474 ( 379 378 ) + 475 ( 375 379 ) + 476 ( 380 381 ) + 477 ( 382 380 ) + 478 ( 375 382 ) + 479 ( 379 381 ) + 480 ( 349 383 ) + 481 ( 384 358 ) + 482 ( 385 384 ) + 483 ( 385 383 ) + 484 ( 385 386 ) + 485 ( 386 387 ) + 486 ( 387 376 ) + 487 ( 374 383 ) + 488 ( 388 389 ) + 489 ( 390 389 ) + 490 ( 391 390 ) + 491 ( 391 388 ) + 492 ( 384 392 ) + 493 ( 386 392 ) + 494 ( 393 377 ) + 495 ( 393 387 ) + 496 ( 394 382 ) + 497 ( 395 394 ) + 498 ( 395 374 ) + 499 ( 394 396 ) + 500 ( 397 396 ) + 501 ( 398 397 ) + 502 ( 398 395 ) + 503 ( 399 397 ) + 504 ( 399 400 ) + 505 ( 400 401 ) + 506 ( 401 402 ) + 507 ( 402 398 ) + 508 ( 403 404 ) + 509 ( 405 403 ) + 510 ( 406 405 ) + 511 ( 404 406 ) + 512 ( 407 405 ) + 513 ( 403 408 ) + 514 ( 408 407 ) + 515 ( 409 410 ) + 516 ( 403 409 ) + 517 ( 404 411 ) + 518 ( 411 410 ) + 519 ( 412 409 ) + 520 ( 412 408 ) + 521 ( 413 411 ) + 522 ( 413 406 ) + 523 ( 414 415 ) + 524 ( 415 416 ) + 525 ( 416 417 ) + 526 ( 417 418 ) + 527 ( 418 419 ) + 528 ( 419 420 ) + 529 ( 420 421 ) + 530 ( 414 421 ) + 531 ( 422 418 ) + 532 ( 417 423 ) + 533 ( 422 423 ) + 534 ( 424 421 ) + 535 ( 424 425 ) + 536 ( 414 425 ) + 537 ( 422 405 ) + 538 ( 406 423 ) + 539 ( 426 419 ) + 540 ( 426 427 ) + 541 ( 420 427 ) + 542 ( 428 415 ) + 543 ( 429 428 ) + 544 ( 416 429 ) + 545 ( 430 431 ) + 546 ( 402 430 ) + 547 ( 432 401 ) + 548 ( 431 432 ) + 549 ( 400 433 ) + 550 ( 433 434 ) + 551 ( 434 432 ) + 552 ( 435 434 ) + 553 ( 436 435 ) + 554 ( 431 436 ) + 555 ( 437 433 ) + 556 ( 435 437 ) + 557 ( 438 439 ) + 558 ( 439 440 ) + 559 ( 270 440 ) + 560 ( 269 441 ) + 561 ( 438 441 ) + 562 ( 438 442 ) + 563 ( 443 442 ) + 564 ( 444 443 ) + 565 ( 444 445 ) + 566 ( 445 446 ) + 567 ( 446 439 ) + 568 ( 441 447 ) + 569 ( 447 448 ) + 570 ( 448 449 ) + 571 ( 449 450 ) + 572 ( 442 450 ) + 573 ( 451 452 ) + 574 ( 451 430 ) + 575 ( 452 431 ) + 576 ( 452 453 ) + 577 ( 453 436 ) + 578 ( 454 455 ) + 579 ( 456 454 ) + 580 ( 457 456 ) + 581 ( 458 457 ) + 582 ( 459 458 ) + 583 ( 455 459 ) + 584 ( 460 458 ) + 585 ( 460 461 ) + 586 ( 462 461 ) + 587 ( 459 462 ) + 588 ( 463 464 ) + 589 ( 462 463 ) + 590 ( 464 461 ) + 591 ( 455 463 ) + 592 ( 464 465 ) + 593 ( 466 465 ) + 594 ( 467 466 ) + 595 ( 467 463 ) + 596 ( 468 469 ) + 597 ( 470 468 ) + 598 ( 470 471 ) + 599 ( 472 471 ) + 600 ( 469 472 ) + 601 ( 473 468 ) + 602 ( 474 473 ) + 603 ( 474 470 ) + 604 ( 475 388 ) + 605 ( 476 475 ) + 606 ( 477 476 ) + 607 ( 477 389 ) + 608 ( 476 478 ) + 609 ( 478 479 ) + 610 ( 479 480 ) + 611 ( 481 480 ) + 612 ( 481 482 ) + 613 ( 482 477 ) + 614 ( 483 484 ) + 615 ( 484 485 ) + 616 ( 485 486 ) + 617 ( 487 486 ) + 618 ( 487 483 ) + 619 ( 354 488 ) + 620 ( 489 488 ) + 621 ( 489 355 ) + 622 ( 488 490 ) + 623 ( 491 490 ) + 624 ( 491 489 ) + 625 ( 492 493 ) + 626 ( 494 492 ) + 627 ( 495 494 ) + 628 ( 495 496 ) + 629 ( 496 493 ) + 630 ( 497 498 ) + 631 ( 497 499 ) + 632 ( 500 499 ) + 633 ( 500 498 ) + 634 ( 501 502 ) + 635 ( 502 497 ) + 636 ( 498 501 ) + 637 ( 503 504 ) + 638 ( 496 503 ) + 639 ( 504 495 ) + 640 ( 505 506 ) + 641 ( 507 505 ) + 642 ( 507 508 ) + 643 ( 506 508 ) + 644 ( 509 510 ) + 645 ( 509 511 ) + 646 ( 511 512 ) + 647 ( 510 512 ) + 648 ( 513 514 ) + 649 ( 514 485 ) + 650 ( 484 513 ) + 651 ( 338 515 ) + 652 ( 516 336 ) + 653 ( 515 516 ) + 654 ( 515 505 ) + 655 ( 507 516 ) + 656 ( 267 517 ) + 657 ( 447 517 ) + 658 ( 518 448 ) + 659 ( 518 517 ) + 660 ( 519 520 ) + 661 ( 519 499 ) + 662 ( 521 497 ) + 663 ( 520 521 ) + 664 ( 502 522 ) + 665 ( 521 522 ) + 666 ( 523 524 ) + 667 ( 525 524 ) + 668 ( 525 526 ) + 669 ( 526 527 ) + 670 ( 527 523 ) + 671 ( 528 529 ) + 672 ( 529 530 ) + 673 ( 530 531 ) + 674 ( 527 531 ) + 675 ( 532 526 ) + 676 ( 528 532 ) + 677 ( 529 533 ) + 678 ( 534 533 ) + 679 ( 534 535 ) + 680 ( 535 536 ) + 681 ( 530 536 ) + 682 ( 537 538 ) + 683 ( 533 537 ) + 684 ( 538 528 ) + 685 ( 535 539 ) + 686 ( 534 540 ) + 687 ( 540 539 ) + 688 ( 541 537 ) + 689 ( 540 541 ) + 690 ( 542 460 ) + 691 ( 543 542 ) + 692 ( 544 543 ) + 693 ( 545 544 ) + 694 ( 546 545 ) + 695 ( 546 547 ) + 696 ( 548 547 ) + 697 ( 465 548 ) + 698 ( 51 546 ) + 699 ( 547 50 ) + 700 ( 56 549 ) + 701 ( 55 550 ) + 702 ( 549 550 ) + 703 ( 551 0 ) + 704 ( 552 551 ) + 705 ( 2 552 ) + 706 ( 553 552 ) + 707 ( 551 554 ) + 708 ( 554 555 ) + 709 ( 553 555 ) + 710 ( 556 553 ) + 711 ( 4 556 ) + 712 ( 557 558 ) + 713 ( 557 559 ) + 714 ( 560 559 ) + 715 ( 560 561 ) + 716 ( 561 562 ) + 717 ( 562 558 ) + 718 ( 563 564 ) + 719 ( 563 565 ) + 720 ( 565 557 ) + 721 ( 558 564 ) + 722 ( 559 566 ) + 723 ( 566 567 ) + 724 ( 568 567 ) + 725 ( 568 569 ) + 726 ( 569 560 ) + 727 ( 21 570 ) + 728 ( 571 20 ) + 729 ( 571 572 ) + 730 ( 572 570 ) + 731 ( 573 574 ) + 732 ( 575 574 ) + 733 ( 575 576 ) + 734 ( 573 576 ) + 735 ( 566 565 ) + 736 ( 19 571 ) + 737 ( 577 578 ) + 738 ( 579 577 ) + 739 ( 580 579 ) + 740 ( 578 580 ) + 741 ( 581 582 ) + 742 ( 581 583 ) + 743 ( 578 583 ) + 744 ( 584 580 ) + 745 ( 584 582 ) + 746 ( 585 586 ) + 747 ( 586 587 ) + 748 ( 587 584 ) + 749 ( 588 579 ) + 750 ( 588 585 ) + 751 ( 589 590 ) + 752 ( 591 590 ) + 753 ( 591 592 ) + 754 ( 588 592 ) + 755 ( 577 593 ) + 756 ( 593 594 ) + 757 ( 594 589 ) + 758 ( 595 596 ) + 759 ( 596 597 ) + 760 ( 593 597 ) + 761 ( 595 578 ) + 762 ( 583 598 ) + 763 ( 598 599 ) + 764 ( 599 600 ) + 765 ( 600 595 ) + 766 ( 601 602 ) + 767 ( 603 602 ) + 768 ( 603 604 ) + 769 ( 604 605 ) + 770 ( 605 606 ) + 771 ( 601 606 ) + 772 ( 607 608 ) + 773 ( 602 607 ) + 774 ( 601 609 ) + 775 ( 608 609 ) + 776 ( 606 610 ) + 777 ( 610 611 ) + 778 ( 611 612 ) + 779 ( 613 612 ) + 780 ( 613 614 ) + 781 ( 609 614 ) + 782 ( 605 615 ) + 783 ( 616 615 ) + 784 ( 617 616 ) + 785 ( 617 610 ) + 786 ( 568 618 ) + 787 ( 619 618 ) + 788 ( 619 620 ) + 789 ( 569 620 ) + 790 ( 621 622 ) + 791 ( 607 622 ) + 792 ( 608 623 ) + 793 ( 621 623 ) + 794 ( 624 560 ) + 795 ( 561 624 ) + 796 ( 624 620 ) + 797 ( 562 625 ) + 798 ( 558 625 ) + 799 ( 625 626 ) + 800 ( 564 626 ) + 801 ( 603 627 ) + 802 ( 627 602 ) + 803 ( 627 622 ) + 804 ( 604 615 ) + 805 ( 628 629 ) + 806 ( 629 630 ) + 807 ( 630 631 ) + 808 ( 631 48 ) + 809 ( 47 632 ) + 810 ( 632 628 ) + 811 ( 55 632 ) + 812 ( 633 634 ) + 813 ( 634 628 ) + 814 ( 633 550 ) + 815 ( 629 635 ) + 816 ( 635 636 ) + 817 ( 636 575 ) + 818 ( 574 630 ) + 819 ( 633 637 ) + 820 ( 638 637 ) + 821 ( 638 634 ) + 822 ( 536 639 ) + 823 ( 639 640 ) + 824 ( 640 641 ) + 825 ( 641 642 ) + 826 ( 642 535 ) + 827 ( 642 643 ) + 828 ( 643 638 ) + 829 ( 637 539 ) + 830 ( 644 643 ) + 831 ( 641 644 ) + 832 ( 531 573 ) + 833 ( 576 639 ) + 834 ( 40 645 ) + 835 ( 646 645 ) + 836 ( 646 41 ) + 837 ( 645 647 ) + 838 ( 648 647 ) + 839 ( 648 646 ) + 840 ( 649 650 ) + 841 ( 651 650 ) + 842 ( 651 42 ) + 843 ( 648 649 ) + 844 ( 523 652 ) + 845 ( 652 653 ) + 846 ( 653 654 ) + 847 ( 654 631 ) + 848 ( 652 655 ) + 849 ( 655 656 ) + 850 ( 656 653 ) + 851 ( 657 658 ) + 852 ( 657 659 ) + 853 ( 659 660 ) + 854 ( 660 661 ) + 855 ( 661 662 ) + 856 ( 658 662 ) + 857 ( 660 60 ) + 858 ( 59 661 ) + 859 ( 77 658 ) + 860 ( 78 662 ) + 861 ( 663 657 ) + 862 ( 663 664 ) + 863 ( 664 659 ) + 864 ( 331 663 ) + 865 ( 330 664 ) + 866 ( 665 658 ) + 867 ( 665 666 ) + 868 ( 666 667 ) + 869 ( 667 668 ) + 870 ( 668 669 ) + 871 ( 669 670 ) + 872 ( 670 671 ) + 873 ( 671 672 ) + 874 ( 663 672 ) + 875 ( 76 665 ) + 876 ( 673 670 ) + 877 ( 674 673 ) + 878 ( 674 671 ) + 879 ( 675 668 ) + 880 ( 676 675 ) + 881 ( 676 669 ) + 882 ( 666 677 ) + 883 ( 677 678 ) + 884 ( 678 667 ) + 885 ( 679 34 ) + 886 ( 62 680 ) + 887 ( 680 681 ) + 888 ( 681 679 ) + 889 ( 35 682 ) + 890 ( 679 682 ) + 891 ( 681 452 ) + 892 ( 683 453 ) + 893 ( 682 683 ) + 894 ( 680 451 ) + 895 ( 684 82 ) + 896 ( 100 684 ) + 897 ( 685 686 ) + 898 ( 685 271 ) + 899 ( 687 440 ) + 900 ( 688 687 ) + 901 ( 688 686 ) + 902 ( 686 689 ) + 903 ( 689 690 ) + 904 ( 690 691 ) + 905 ( 691 685 ) + 906 ( 692 693 ) + 907 ( 693 689 ) + 908 ( 688 692 ) + 909 ( 687 694 ) + 910 ( 694 695 ) + 911 ( 695 696 ) + 912 ( 696 692 ) + 913 ( 272 697 ) + 914 ( 697 691 ) + 915 ( 690 698 ) + 916 ( 698 699 ) + 917 ( 699 697 ) + 918 ( 694 446 ) + 919 ( 445 695 ) + 920 ( 700 701 ) + 921 ( 702 700 ) + 922 ( 703 702 ) + 923 ( 701 703 ) + 924 ( 704 705 ) + 925 ( 97 704 ) + 926 ( 705 96 ) + 927 ( 706 707 ) + 928 ( 98 706 ) + 929 ( 707 704 ) + 930 ( 101 708 ) + 931 ( 708 104 ) + 932 ( 709 710 ) + 933 ( 710 711 ) + 934 ( 711 712 ) + 935 ( 712 713 ) + 936 ( 713 714 ) + 937 ( 714 715 ) + 938 ( 715 709 ) + 939 ( 716 717 ) + 940 ( 716 718 ) + 941 ( 719 718 ) + 942 ( 717 719 ) + 943 ( 717 720 ) + 944 ( 721 719 ) + 945 ( 720 721 ) + 946 ( 716 722 ) + 947 ( 723 722 ) + 948 ( 724 723 ) + 949 ( 725 724 ) + 950 ( 726 725 ) + 951 ( 727 726 ) + 952 ( 727 718 ) + 953 ( 728 729 ) + 954 ( 730 728 ) + 955 ( 731 730 ) + 956 ( 729 731 ) + 957 ( 732 733 ) + 958 ( 732 734 ) + 959 ( 735 734 ) + 960 ( 733 735 ) + 961 ( 733 736 ) + 962 ( 737 735 ) + 963 ( 737 736 ) + 964 ( 732 738 ) + 965 ( 739 738 ) + 966 ( 734 739 ) + 967 ( 740 741 ) + 968 ( 740 742 ) + 969 ( 742 711 ) + 970 ( 710 741 ) + 971 ( 741 743 ) + 972 ( 744 743 ) + 973 ( 745 744 ) + 974 ( 745 740 ) + 975 ( 746 719 ) + 976 ( 747 718 ) + 977 ( 746 747 ) + 978 ( 748 749 ) + 979 ( 749 750 ) + 980 ( 750 751 ) + 981 ( 751 746 ) + 982 ( 747 748 ) + 983 ( 721 751 ) + 984 ( 748 727 ) + 985 ( 752 714 ) + 986 ( 753 752 ) + 987 ( 715 753 ) + 988 ( 754 755 ) + 989 ( 713 754 ) + 990 ( 755 712 ) + 991 ( 756 757 ) + 992 ( 757 758 ) + 993 ( 758 759 ) + 994 ( 759 760 ) + 995 ( 760 761 ) + 996 ( 761 756 ) + 997 ( 762 763 ) + 998 ( 763 764 ) + 999 ( 765 764 ) + 1000 ( 765 762 ) + 1001 ( 764 766 ) + 1002 ( 766 767 ) + 1003 ( 767 765 ) + 1004 ( 768 769 ) + 1005 ( 769 770 ) + 1006 ( 771 770 ) + 1007 ( 768 771 ) + 1008 ( 770 772 ) + 1009 ( 772 773 ) + 1010 ( 771 773 ) + 1011 ( 774 775 ) + 1012 ( 760 775 ) + 1013 ( 759 774 ) + 1014 ( 775 776 ) + 1015 ( 777 776 ) + 1016 ( 761 777 ) + 1017 ( 778 758 ) + 1018 ( 779 778 ) + 1019 ( 779 774 ) + 1020 ( 780 781 ) + 1021 ( 780 782 ) + 1022 ( 783 782 ) + 1023 ( 783 781 ) + 1024 ( 784 785 ) + 1025 ( 786 785 ) + 1026 ( 786 787 ) + 1027 ( 788 787 ) + 1028 ( 788 789 ) + 1029 ( 789 782 ) + 1030 ( 780 784 ) + 1031 ( 790 791 ) + 1032 ( 790 792 ) + 1033 ( 792 793 ) + 1034 ( 793 794 ) + 1035 ( 794 791 ) + 1036 ( 795 796 ) + 1037 ( 796 797 ) + 1038 ( 797 790 ) + 1039 ( 791 795 ) + 1040 ( 781 798 ) + 1041 ( 799 783 ) + 1042 ( 799 798 ) + 1043 ( 799 800 ) + 1044 ( 800 801 ) + 1045 ( 801 802 ) + 1046 ( 802 803 ) + 1047 ( 803 794 ) + 1048 ( 793 798 ) + 1049 ( 785 804 ) + 1050 ( 804 805 ) + 1051 ( 805 806 ) + 1052 ( 806 786 ) + 1053 ( 807 808 ) + 1054 ( 808 809 ) + 1055 ( 810 809 ) + 1056 ( 811 810 ) + 1057 ( 807 811 ) + 1058 ( 812 807 ) + 1059 ( 813 811 ) + 1060 ( 813 814 ) + 1061 ( 814 812 ) + 1062 ( 815 816 ) + 1063 ( 817 815 ) + 1064 ( 817 818 ) + 1065 ( 818 812 ) + 1066 ( 819 814 ) + 1067 ( 816 819 ) + 1068 ( 809 820 ) + 1069 ( 821 820 ) + 1070 ( 821 822 ) + 1071 ( 822 810 ) + 1072 ( 823 824 ) + 1073 ( 825 823 ) + 1074 ( 826 825 ) + 1075 ( 826 827 ) + 1076 ( 827 824 ) + 1077 ( 828 829 ) + 1078 ( 829 816 ) + 1079 ( 819 828 ) + 1080 ( 830 831 ) + 1081 ( 830 832 ) + 1082 ( 832 833 ) + 1083 ( 833 834 ) + 1084 ( 831 834 ) + 1085 ( 831 835 ) + 1086 ( 834 836 ) + 1087 ( 835 836 ) + 1088 ( 833 837 ) + 1089 ( 838 837 ) + 1090 ( 839 838 ) + 1091 ( 840 839 ) + 1092 ( 840 836 ) + 1093 ( 832 841 ) + 1094 ( 841 837 ) + 1095 ( 839 842 ) + 1096 ( 843 838 ) + 1097 ( 842 843 ) + 1098 ( 844 845 ) + 1099 ( 846 844 ) + 1100 ( 847 846 ) + 1101 ( 845 847 ) + 1102 ( 848 849 ) + 1103 ( 850 849 ) + 1104 ( 850 851 ) + 1105 ( 851 852 ) + 1106 ( 853 852 ) + 1107 ( 854 853 ) + 1108 ( 848 854 ) + 1109 ( 838 855 ) + 1110 ( 855 856 ) + 1111 ( 857 856 ) + 1112 ( 843 857 ) + 1113 ( 858 859 ) + 1114 ( 858 830 ) + 1115 ( 859 831 ) + 1116 ( 859 860 ) + 1117 ( 835 860 ) + 1118 ( 861 862 ) + 1119 ( 861 863 ) + 1120 ( 864 863 ) + 1121 ( 862 864 ) + 1122 ( 865 866 ) + 1123 ( 866 867 ) + 1124 ( 867 868 ) + 1125 ( 868 869 ) + 1126 ( 869 870 ) + 1127 ( 862 870 ) + 1128 ( 865 864 ) + 1129 ( 871 815 ) + 1130 ( 872 871 ) + 1131 ( 872 873 ) + 1132 ( 873 874 ) + 1133 ( 874 875 ) + 1134 ( 875 817 ) + 1135 ( 876 816 ) + 1136 ( 871 876 ) + 1137 ( 877 876 ) + 1138 ( 878 877 ) + 1139 ( 879 878 ) + 1140 ( 879 872 ) + 1141 ( 879 880 ) + 1142 ( 880 873 ) + 1143 ( 881 882 ) + 1144 ( 882 818 ) + 1145 ( 875 881 ) + 1146 ( 883 884 ) + 1147 ( 885 883 ) + 1148 ( 886 885 ) + 1149 ( 887 886 ) + 1150 ( 888 887 ) + 1151 ( 884 888 ) + 1152 ( 883 889 ) + 1153 ( 890 884 ) + 1154 ( 890 889 ) + 1155 ( 890 863 ) + 1156 ( 861 891 ) + 1157 ( 892 891 ) + 1158 ( 892 889 ) + 1159 ( 808 893 ) + 1160 ( 893 820 ) + 1161 ( 894 895 ) + 1162 ( 895 896 ) + 1163 ( 896 897 ) + 1164 ( 897 894 ) + 1165 ( 898 852 ) + 1166 ( 899 898 ) + 1167 ( 853 899 ) + 1168 ( 900 899 ) + 1169 ( 854 900 ) + 1170 ( 863 901 ) + 1171 ( 901 902 ) + 1172 ( 864 902 ) + 1173 ( 903 865 ) + 1174 ( 902 903 ) + 1175 ( 888 897 ) + 1176 ( 894 887 ) + 1177 ( 882 904 ) + 1178 ( 904 905 ) + 1179 ( 905 893 ) + 1180 ( 881 906 ) + 1181 ( 906 904 ) + 1182 ( 906 907 ) + 1183 ( 907 905 ) + 1184 ( 908 909 ) + 1185 ( 910 908 ) + 1186 ( 910 911 ) + 1187 ( 911 912 ) + 1188 ( 912 909 ) + 1189 ( 913 829 ) + 1190 ( 876 913 ) + 1191 ( 914 877 ) + 1192 ( 914 913 ) + 1193 ( 915 916 ) + 1194 ( 916 917 ) + 1195 ( 917 896 ) + 1196 ( 918 895 ) + 1197 ( 918 919 ) + 1198 ( 919 920 ) + 1199 ( 915 920 ) + 1200 ( 921 922 ) + 1201 ( 923 921 ) + 1202 ( 924 923 ) + 1203 ( 925 924 ) + 1204 ( 926 925 ) + 1205 ( 927 926 ) + 1206 ( 928 927 ) + 1207 ( 922 928 ) + 1208 ( 929 922 ) + 1209 ( 928 930 ) + 1210 ( 930 929 ) + 1211 ( 931 925 ) + 1212 ( 924 932 ) + 1213 ( 931 932 ) + 1214 ( 920 931 ) + 1215 ( 932 915 ) + 1216 ( 933 894 ) + 1217 ( 360 886 ) + 1218 ( 361 934 ) + 1219 ( 934 933 ) + 1220 ( 935 936 ) + 1221 ( 936 937 ) + 1222 ( 937 938 ) + 1223 ( 939 938 ) + 1224 ( 939 935 ) + 1225 ( 940 941 ) + 1226 ( 942 941 ) + 1227 ( 943 942 ) + 1228 ( 940 943 ) + 1229 ( 943 944 ) + 1230 ( 944 945 ) + 1231 ( 940 945 ) + 1232 ( 946 947 ) + 1233 ( 948 946 ) + 1234 ( 949 948 ) + 1235 ( 949 950 ) + 1236 ( 950 947 ) + 1237 ( 313 951 ) + 1238 ( 952 951 ) + 1239 ( 952 312 ) + 1240 ( 951 947 ) + 1241 ( 950 930 ) + 1242 ( 952 930 ) + 1243 ( 949 953 ) + 1244 ( 953 929 ) + 1245 ( 954 804 ) + 1246 ( 955 954 ) + 1247 ( 937 955 ) + 1248 ( 805 936 ) + 1249 ( 804 956 ) + 1250 ( 956 957 ) + 1251 ( 954 957 ) + 1252 ( 938 958 ) + 1253 ( 955 958 ) + 1254 ( 946 941 ) + 1255 ( 942 947 ) + 1256 ( 959 960 ) + 1257 ( 959 961 ) + 1258 ( 961 962 ) + 1259 ( 962 945 ) + 1260 ( 944 963 ) + 1261 ( 960 963 ) + 1262 ( 964 965 ) + 1263 ( 964 966 ) + 1264 ( 966 967 ) + 1265 ( 967 968 ) + 1266 ( 968 965 ) + 1267 ( 960 964 ) + 1268 ( 965 959 ) + 1269 ( 969 970 ) + 1270 ( 971 969 ) + 1271 ( 972 971 ) + 1272 ( 970 972 ) + 1273 ( 970 967 ) + 1274 ( 968 972 ) + 1275 ( 966 973 ) + 1276 ( 973 969 ) + 1277 ( 974 975 ) + 1278 ( 975 976 ) + 1279 ( 976 977 ) + 1280 ( 977 978 ) + 1281 ( 978 974 ) + 1282 ( 979 980 ) + 1283 ( 971 979 ) + 1284 ( 980 973 ) + 1285 ( 981 980 ) + 1286 ( 982 981 ) + 1287 ( 979 982 ) + 1288 ( 974 981 ) + 1289 ( 982 978 ) + 1290 ( 939 983 ) + 1291 ( 984 983 ) + 1292 ( 935 984 ) + 1293 ( 983 978 ) + 1294 ( 985 977 ) + 1295 ( 984 985 ) + 1296 ( 986 987 ) + 1297 ( 988 986 ) + 1298 ( 989 988 ) + 1299 ( 989 987 ) + 1300 ( 990 991 ) + 1301 ( 991 992 ) + 1302 ( 989 992 ) + 1303 ( 988 990 ) + 1304 ( 993 994 ) + 1305 ( 993 995 ) + 1306 ( 995 996 ) + 1307 ( 996 994 ) + 1308 ( 997 998 ) + 1309 ( 998 999 ) + 1310 ( 999 993 ) + 1311 ( 994 997 ) + 1312 ( 1000 1001 ) + 1313 ( 1002 1000 ) + 1314 ( 1003 1002 ) + 1315 ( 1004 1003 ) + 1316 ( 1005 1004 ) + 1317 ( 1005 1001 ) + 1318 ( 1000 1006 ) + 1319 ( 999 1006 ) + 1320 ( 1002 998 ) + 1321 ( 991 1007 ) + 1322 ( 1007 1008 ) + 1323 ( 1008 1009 ) + 1324 ( 1009 1010 ) + 1325 ( 1010 1011 ) + 1326 ( 1011 1012 ) + 1327 ( 1012 1013 ) + 1328 ( 1013 1014 ) + 1329 ( 1014 992 ) + 1330 ( 1015 1016 ) + 1331 ( 1017 1015 ) + 1332 ( 1018 1017 ) + 1333 ( 1019 1018 ) + 1334 ( 1020 1019 ) + 1335 ( 1016 1020 ) + 1336 ( 1016 1021 ) + 1337 ( 1022 1021 ) + 1338 ( 1022 1015 ) + 1339 ( 1023 1019 ) + 1340 ( 1024 1023 ) + 1341 ( 1020 1024 ) + 1342 ( 1025 1026 ) + 1343 ( 1026 1027 ) + 1344 ( 1027 1028 ) + 1345 ( 1028 1029 ) + 1346 ( 1029 1030 ) + 1347 ( 1031 1030 ) + 1348 ( 1031 1032 ) + 1349 ( 1032 1033 ) + 1350 ( 1033 1034 ) + 1351 ( 1034 1035 ) + 1352 ( 1035 1036 ) + 1353 ( 1036 1025 ) + 1354 ( 1008 1029 ) + 1355 ( 1030 1007 ) + 1356 ( 1009 1028 ) + 1357 ( 1037 1038 ) + 1358 ( 1039 1038 ) + 1359 ( 1040 1039 ) + 1360 ( 1041 1040 ) + 1361 ( 1037 1041 ) + 1362 ( 1040 1042 ) + 1363 ( 1043 1042 ) + 1364 ( 1041 1043 ) + 1365 ( 1037 1044 ) + 1366 ( 1044 1043 ) + 1367 ( 1042 1045 ) + 1368 ( 1046 1039 ) + 1369 ( 1047 1046 ) + 1370 ( 1048 1047 ) + 1371 ( 1049 1048 ) + 1372 ( 1050 1049 ) + 1373 ( 1051 1050 ) + 1374 ( 1051 1052 ) + 1375 ( 1052 1045 ) + 1376 ( 802 1053 ) + 1377 ( 1053 1054 ) + 1378 ( 1055 1054 ) + 1379 ( 1055 803 ) + 1380 ( 1054 1056 ) + 1381 ( 1056 1057 ) + 1382 ( 1058 1057 ) + 1383 ( 1058 1055 ) + 1384 ( 1059 1060 ) + 1385 ( 1046 1059 ) + 1386 ( 1038 1060 ) + 1387 ( 1061 1062 ) + 1388 ( 1062 1063 ) + 1389 ( 1064 1063 ) + 1390 ( 1061 1064 ) + 1391 ( 1063 1065 ) + 1392 ( 1065 1066 ) + 1393 ( 1064 1066 ) + 1394 ( 1067 1062 ) + 1395 ( 1067 1068 ) + 1396 ( 1068 1065 ) + 1397 ( 1069 1070 ) + 1398 ( 1070 1071 ) + 1399 ( 1072 1071 ) + 1400 ( 1069 1072 ) + 1401 ( 1073 1074 ) + 1402 ( 1074 1069 ) + 1403 ( 1073 1072 ) + 1404 ( 1075 788 ) + 1405 ( 1076 1075 ) + 1406 ( 789 1076 ) + 1407 ( 1076 800 ) + 1408 ( 801 1075 ) + 1409 ( 1077 1078 ) + 1410 ( 1077 1079 ) + 1411 ( 1080 1079 ) + 1412 ( 1078 1080 ) + 1413 ( 1081 1078 ) + 1414 ( 1080 1082 ) + 1415 ( 1081 1082 ) + 1416 ( 1083 1081 ) + 1417 ( 1082 1084 ) + 1418 ( 1084 1085 ) + 1419 ( 1085 1086 ) + 1420 ( 1086 1083 ) + 1421 ( 1087 1088 ) + 1422 ( 1088 1050 ) + 1423 ( 1049 1087 ) + 1424 ( 1089 1087 ) + 1425 ( 1048 1089 ) + 1426 ( 1090 1089 ) + 1427 ( 1091 1090 ) + 1428 ( 1088 1091 ) + 1429 ( 1092 1093 ) + 1430 ( 1094 1092 ) + 1431 ( 1094 1095 ) + 1432 ( 1095 1093 ) + 1433 ( 1096 1097 ) + 1434 ( 1092 1097 ) + 1435 ( 1093 1096 ) + 1436 ( 1098 1099 ) + 1437 ( 1099 1100 ) + 1438 ( 1101 1100 ) + 1439 ( 1101 1098 ) + 1440 ( 1102 1103 ) + 1441 ( 1012 1102 ) + 1442 ( 1011 1103 ) + 1443 ( 1102 1100 ) + 1444 ( 1103 1101 ) + 1445 ( 1104 1091 ) + 1446 ( 1090 1105 ) + 1447 ( 1105 1104 ) + 1448 ( 1106 1022 ) + 1449 ( 1004 1021 ) + 1450 ( 1003 1107 ) + 1451 ( 1107 1108 ) + 1452 ( 1106 1108 ) + 1453 ( 1109 1110 ) + 1454 ( 1110 1111 ) + 1455 ( 1111 1112 ) + 1456 ( 1113 1112 ) + 1457 ( 1113 1109 ) + 1458 ( 1114 1112 ) + 1459 ( 1115 1114 ) + 1460 ( 1115 1113 ) + 1461 ( 1116 1114 ) + 1462 ( 1116 1117 ) + 1463 ( 1117 1118 ) + 1464 ( 1118 1115 ) + 1465 ( 1119 1120 ) + 1466 ( 1120 1121 ) + 1467 ( 1018 1121 ) + 1468 ( 1017 1119 ) + 1469 ( 1122 1123 ) + 1470 ( 1124 1122 ) + 1471 ( 1125 1124 ) + 1472 ( 1125 1123 ) + 1473 ( 1124 1126 ) + 1474 ( 1127 1126 ) + 1475 ( 1127 1125 ) + 1476 ( 1126 1128 ) + 1477 ( 1128 1129 ) + 1478 ( 1129 1130 ) + 1479 ( 1130 1127 ) + 1480 ( 822 1060 ) + 1481 ( 811 1037 ) + 1482 ( 1044 1131 ) + 1483 ( 1131 813 ) + 1484 ( 791 1055 ) + 1485 ( 1058 795 ) + 1486 ( 1132 1071 ) + 1487 ( 1072 1133 ) + 1488 ( 1133 1132 ) + 1489 ( 1134 1132 ) + 1490 ( 1133 1135 ) + 1491 ( 1134 1135 ) + 1492 ( 1136 1073 ) + 1493 ( 1135 1136 ) + 1494 ( 1137 1138 ) + 1495 ( 1137 1139 ) + 1496 ( 1139 823 ) + 1497 ( 824 1138 ) + 1498 ( 1045 1140 ) + 1499 ( 1140 1141 ) + 1500 ( 1141 1142 ) + 1501 ( 1142 1143 ) + 1502 ( 1143 1144 ) + 1503 ( 1144 1042 ) + 1504 ( 825 1145 ) + 1505 ( 1146 1139 ) + 1506 ( 1145 1146 ) + 1507 ( 1147 1145 ) + 1508 ( 1148 1146 ) + 1509 ( 1148 1149 ) + 1510 ( 1149 1150 ) + 1511 ( 1150 1151 ) + 1512 ( 1151 1147 ) + 1513 ( 1137 1148 ) + 1514 ( 1152 1148 ) + 1515 ( 1153 1152 ) + 1516 ( 1154 1153 ) + 1517 ( 1149 1154 ) + 1518 ( 1155 1156 ) + 1519 ( 1157 1156 ) + 1520 ( 1157 1158 ) + 1521 ( 1158 1155 ) + 1522 ( 1159 1160 ) + 1523 ( 1160 1161 ) + 1524 ( 1161 1141 ) + 1525 ( 1141 1157 ) + 1526 ( 1156 1159 ) + 1527 ( 1162 1154 ) + 1528 ( 1163 1162 ) + 1529 ( 1150 1163 ) + 1530 ( 1164 1163 ) + 1531 ( 1164 1151 ) + 1532 ( 1165 1166 ) + 1533 ( 1167 1165 ) + 1534 ( 1167 1168 ) + 1535 ( 1166 1168 ) + 1536 ( 1169 1170 ) + 1537 ( 1166 1170 ) + 1538 ( 1168 1169 ) + 1539 ( 1171 1172 ) + 1540 ( 1172 1169 ) + 1541 ( 1167 1171 ) + 1542 ( 1173 1174 ) + 1543 ( 1143 1174 ) + 1544 ( 1173 1142 ) + 1545 ( 1175 1157 ) + 1546 ( 1140 1175 ) + 1547 ( 1176 1177 ) + 1548 ( 1178 1176 ) + 1549 ( 1179 1178 ) + 1550 ( 1177 1179 ) + 1551 ( 1177 1180 ) + 1552 ( 1181 1179 ) + 1553 ( 1180 1181 ) + 1554 ( 1182 1183 ) + 1555 ( 1184 1182 ) + 1556 ( 1185 1184 ) + 1557 ( 1185 1183 ) + 1558 ( 1186 1183 ) + 1559 ( 1185 1187 ) + 1560 ( 1187 1188 ) + 1561 ( 1186 1188 ) + 1562 ( 1189 1186 ) + 1563 ( 1188 1190 ) + 1564 ( 1189 1190 ) + 1565 ( 1191 1187 ) + 1566 ( 1191 1192 ) + 1567 ( 1190 1192 ) + 1568 ( 1193 1179 ) + 1569 ( 1194 1178 ) + 1570 ( 1193 1194 ) + 1571 ( 1194 1195 ) + 1572 ( 1195 1196 ) + 1573 ( 1196 1197 ) + 1574 ( 1197 1193 ) + 1575 ( 1181 1197 ) + 1576 ( 1198 1199 ) + 1577 ( 1199 1200 ) + 1578 ( 1201 1200 ) + 1579 ( 1202 1201 ) + 1580 ( 1198 1202 ) + 1581 ( 1203 1204 ) + 1582 ( 1204 1198 ) + 1583 ( 1203 1202 ) + 1584 ( 1205 1206 ) + 1585 ( 1200 1206 ) + 1586 ( 1199 1207 ) + 1587 ( 1205 1207 ) + 1588 ( 1205 1208 ) + 1589 ( 1209 1207 ) + 1590 ( 1208 1209 ) + 1591 ( 1210 1211 ) + 1592 ( 1208 1210 ) + 1593 ( 1211 1209 ) + 1594 ( 1212 1201 ) + 1595 ( 1212 1213 ) + 1596 ( 1213 1214 ) + 1597 ( 1214 1215 ) + 1598 ( 1215 1216 ) + 1599 ( 1217 1216 ) + 1600 ( 1217 1202 ) + 1601 ( 1216 1218 ) + 1602 ( 1218 1219 ) + 1603 ( 1219 1220 ) + 1604 ( 1220 1221 ) + 1605 ( 1221 1217 ) + 1606 ( 1221 1203 ) + 1607 ( 1222 729 ) + 1608 ( 1223 1222 ) + 1609 ( 728 1223 ) + 1610 ( 1224 1225 ) + 1611 ( 735 1224 ) + 1612 ( 734 1225 ) + 1613 ( 1226 1224 ) + 1614 ( 1226 737 ) + 1615 ( 1227 1225 ) + 1616 ( 1227 739 ) + 1617 ( 1228 1229 ) + 1618 ( 1230 1228 ) + 1619 ( 1231 1230 ) + 1620 ( 1231 1229 ) + 1621 ( 1228 1232 ) + 1622 ( 1232 1233 ) + 1623 ( 1233 1230 ) + 1624 ( 1234 984 ) + 1625 ( 1235 1234 ) + 1626 ( 1236 1235 ) + 1627 ( 1237 1236 ) + 1628 ( 806 1237 ) + 1629 ( 1233 1238 ) + 1630 ( 1239 1232 ) + 1631 ( 1235 1239 ) + 1632 ( 1234 1238 ) + 1633 ( 1240 985 ) + 1634 ( 1238 1240 ) + 1635 ( 806 1241 ) + 1636 ( 1242 1237 ) + 1637 ( 1241 1242 ) + 1638 ( 1243 1239 ) + 1639 ( 1244 1243 ) + 1640 ( 1244 1236 ) + 1641 ( 1240 976 ) + 1642 ( 53 1245 ) + 1643 ( 52 1246 ) + 1644 ( 1246 1245 ) + 1645 ( 1247 54 ) + 1646 ( 1245 1248 ) + 1647 ( 1248 1247 ) + 1648 ( 7 1249 ) + 1649 ( 1250 8 ) + 1650 ( 1250 1251 ) + 1651 ( 1251 1252 ) + 1652 ( 1252 1249 ) + 1653 ( 15 1253 ) + 1654 ( 1253 1254 ) + 1655 ( 1254 1250 ) + 1656 ( 151 1255 ) + 1657 ( 1256 1255 ) + 1658 ( 1256 152 ) + 1659 ( 1257 1258 ) + 1660 ( 1258 138 ) + 1661 ( 1257 139 ) + 1662 ( 1259 145 ) + 1663 ( 1259 1257 ) + 1664 ( 146 1260 ) + 1665 ( 1260 1259 ) + 1666 ( 167 1261 ) + 1667 ( 225 1262 ) + 1668 ( 1263 1262 ) + 1669 ( 1263 1261 ) + 1670 ( 1264 1265 ) + 1671 ( 232 1264 ) + 1672 ( 1265 231 ) + 1673 ( 235 1266 ) + 1674 ( 1266 1267 ) + 1675 ( 1267 1265 ) + 1676 ( 1268 236 ) + 1677 ( 1269 1264 ) + 1678 ( 1269 1268 ) + 1679 ( 1270 1246 ) + 1680 ( 1248 1270 ) + 1681 ( 1271 1272 ) + 1682 ( 1273 1271 ) + 1683 ( 1274 1273 ) + 1684 ( 1272 1274 ) + 1685 ( 1275 1273 ) + 1686 ( 1275 1276 ) + 1687 ( 1274 1276 ) + 1688 ( 1277 1273 ) + 1689 ( 1278 1271 ) + 1690 ( 1277 1278 ) + 1691 ( 1279 1280 ) + 1692 ( 1280 1277 ) + 1693 ( 1279 1278 ) + 1694 ( 1281 1280 ) + 1695 ( 1281 1275 ) + 1696 ( 1252 1282 ) + 1697 ( 1283 1251 ) + 1698 ( 1283 1282 ) + 1699 ( 1254 1283 ) + 1700 ( 1279 1284 ) + 1701 ( 1284 1285 ) + 1702 ( 1285 1286 ) + 1703 ( 1286 1281 ) + 1704 ( 1287 1255 ) + 1705 ( 1287 1288 ) + 1706 ( 1288 1289 ) + 1707 ( 1289 1256 ) + 1708 ( 1290 1291 ) + 1709 ( 1292 1291 ) + 1710 ( 1293 1292 ) + 1711 ( 1294 1293 ) + 1712 ( 1290 1294 ) + 1713 ( 1295 1296 ) + 1714 ( 1296 1265 ) + 1715 ( 1267 1297 ) + 1716 ( 1297 1298 ) + 1717 ( 1299 1298 ) + 1718 ( 1299 1295 ) + 1719 ( 1300 1301 ) + 1720 ( 1302 1301 ) + 1721 ( 1302 1303 ) + 1722 ( 1304 1303 ) + 1723 ( 1300 1304 ) + 1724 ( 1305 1306 ) + 1725 ( 1294 1306 ) + 1726 ( 1293 1305 ) + 1727 ( 1307 1308 ) + 1728 ( 1308 1309 ) + 1729 ( 1309 1310 ) + 1730 ( 1310 1311 ) + 1731 ( 1307 1311 ) + 1732 ( 1312 1313 ) + 1733 ( 1314 1312 ) + 1734 ( 1310 1314 ) + 1735 ( 1313 1309 ) + 1736 ( 1315 1316 ) + 1737 ( 1315 1317 ) + 1738 ( 1318 1317 ) + 1739 ( 1316 1318 ) + 1740 ( 1319 1320 ) + 1741 ( 1315 1319 ) + 1742 ( 1316 1320 ) + 1743 ( 1321 1322 ) + 1744 ( 1323 1321 ) + 1745 ( 1324 1323 ) + 1746 ( 1325 1324 ) + 1747 ( 1322 1325 ) + 1748 ( 1326 1324 ) + 1749 ( 1327 1326 ) + 1750 ( 1328 1327 ) + 1751 ( 1325 1328 ) + 1752 ( 1270 1329 ) + 1753 ( 1329 1330 ) + 1754 ( 1331 1330 ) + 1755 ( 1332 1331 ) + 1756 ( 1332 1247 ) + 1757 ( 1333 1327 ) + 1758 ( 1334 1333 ) + 1759 ( 1328 1334 ) + 1760 ( 1335 1336 ) + 1761 ( 1337 1335 ) + 1762 ( 1338 1337 ) + 1763 ( 1339 1338 ) + 1764 ( 1340 1339 ) + 1765 ( 1341 1340 ) + 1766 ( 1342 1341 ) + 1767 ( 1343 1342 ) + 1768 ( 1344 1343 ) + 1769 ( 1345 1344 ) + 1770 ( 1346 1345 ) + 1771 ( 1347 1346 ) + 1772 ( 1348 1347 ) + 1773 ( 1349 1348 ) + 1774 ( 1350 1349 ) + 1775 ( 1336 1350 ) + 1776 ( 1351 1352 ) + 1777 ( 1351 1341 ) + 1778 ( 1340 1352 ) + 1779 ( 1353 1354 ) + 1780 ( 1353 1339 ) + 1781 ( 1354 1338 ) + 1782 ( 1355 1356 ) + 1783 ( 1346 1355 ) + 1784 ( 1356 1345 ) + 1785 ( 1357 1358 ) + 1786 ( 1357 1344 ) + 1787 ( 1343 1358 ) + 1788 ( 1359 1360 ) + 1789 ( 1359 1348 ) + 1790 ( 1347 1360 ) + 1791 ( 1335 1314 ) + 1792 ( 1312 1337 ) + 1793 ( 1361 1362 ) + 1794 ( 1363 1361 ) + 1795 ( 1364 1363 ) + 1796 ( 1365 1364 ) + 1797 ( 1366 1365 ) + 1798 ( 1367 1366 ) + 1799 ( 1362 1367 ) + 1800 ( 1362 1350 ) + 1801 ( 1367 1336 ) + 1802 ( 1319 1365 ) + 1803 ( 1366 1320 ) + 1804 ( 1364 1368 ) + 1805 ( 1288 1363 ) + 1806 ( 1368 1287 ) + 1807 ( 1361 1369 ) + 1808 ( 1370 1369 ) + 1809 ( 1370 1288 ) + 1810 ( 1371 1370 ) + 1811 ( 1371 1289 ) + 1812 ( 1372 1305 ) + 1813 ( 1373 1372 ) + 1814 ( 1374 1373 ) + 1815 ( 1306 1374 ) + 1816 ( 1375 1376 ) + 1817 ( 1376 1297 ) + 1818 ( 1266 1377 ) + 1819 ( 1377 1378 ) + 1820 ( 1378 1379 ) + 1821 ( 1379 1380 ) + 1822 ( 1380 1381 ) + 1823 ( 1381 1382 ) + 1824 ( 1382 1383 ) + 1825 ( 1383 1384 ) + 1826 ( 1384 1385 ) + 1827 ( 1385 1386 ) + 1828 ( 1386 1387 ) + 1829 ( 1375 1387 ) + 1830 ( 1388 1389 ) + 1831 ( 1389 1390 ) + 1832 ( 1390 1391 ) + 1833 ( 1391 1392 ) + 1834 ( 1392 1393 ) + 1835 ( 1393 1388 ) + 1836 ( 1394 1395 ) + 1837 ( 1395 1396 ) + 1838 ( 1397 1396 ) + 1839 ( 1397 1398 ) + 1840 ( 1398 1399 ) + 1841 ( 1399 1394 ) + 1842 ( 1394 1304 ) + 1843 ( 1395 1303 ) + 1844 ( 1400 1401 ) + 1845 ( 1302 1400 ) + 1846 ( 1401 1301 ) + 1847 ( 1402 1291 ) + 1848 ( 1403 1402 ) + 1849 ( 1403 1292 ) + 1850 ( 1404 1372 ) + 1851 ( 1405 1404 ) + 1852 ( 1405 1373 ) + 1853 ( 1261 1406 ) + 1854 ( 1407 1263 ) + 1855 ( 1408 1407 ) + 1856 ( 1409 1408 ) + 1857 ( 1406 1409 ) + 1858 ( 1410 1411 ) + 1859 ( 1412 1411 ) + 1860 ( 1412 1413 ) + 1861 ( 1410 1413 ) + 1862 ( 1414 1415 ) + 1863 ( 1414 1410 ) + 1864 ( 1413 1415 ) + 1865 ( 1416 1417 ) + 1866 ( 1416 1415 ) + 1867 ( 1412 1417 ) + 1868 ( 1418 1419 ) + 1869 ( 1417 1418 ) + 1870 ( 1411 1419 ) + 1871 ( 1420 1421 ) + 1872 ( 1419 1420 ) + 1873 ( 1414 1421 ) + 1874 ( 1422 1423 ) + 1875 ( 1424 1423 ) + 1876 ( 1424 1425 ) + 1877 ( 1422 1425 ) + 1878 ( 1426 1427 ) + 1879 ( 1426 1422 ) + 1880 ( 1425 1427 ) + 1881 ( 1428 1429 ) + 1882 ( 1427 1428 ) + 1883 ( 1424 1429 ) + 1884 ( 1430 1431 ) + 1885 ( 1429 1430 ) + 1886 ( 1423 1431 ) + 1887 ( 1432 1433 ) + 1888 ( 1433 1431 ) + 1889 ( 1432 1426 ) + 1890 ( 1434 1435 ) + 1891 ( 1434 1436 ) + 1892 ( 1437 1436 ) + 1893 ( 1435 1437 ) + 1894 ( 1436 1438 ) + 1895 ( 1439 1438 ) + 1896 ( 1437 1439 ) + 1897 ( 1434 1440 ) + 1898 ( 1441 1440 ) + 1899 ( 1438 1441 ) + 1900 ( 1442 1443 ) + 1901 ( 1435 1443 ) + 1902 ( 1442 1439 ) + 1903 ( 1444 1445 ) + 1904 ( 1446 1445 ) + 1905 ( 1446 1447 ) + 1906 ( 1444 1447 ) + 1907 ( 1448 1449 ) + 1908 ( 1448 1444 ) + 1909 ( 1447 1449 ) + 1910 ( 1450 1451 ) + 1911 ( 1449 1450 ) + 1912 ( 1446 1451 ) + 1913 ( 1452 1453 ) + 1914 ( 1452 1451 ) + 1915 ( 1445 1453 ) + 1916 ( 1454 1455 ) + 1917 ( 1454 1453 ) + 1918 ( 1455 1448 ) + 1919 ( 1407 1262 ) + 1920 ( 1456 1457 ) + 1921 ( 1456 1458 ) + 1922 ( 1458 1269 ) + 1923 ( 1296 1457 ) + 1924 ( 1459 1404 ) + 1925 ( 1459 1460 ) + 1926 ( 1460 1405 ) + 1927 ( 1396 1400 ) + 1928 ( 1401 1461 ) + 1929 ( 1461 1462 ) + 1930 ( 1462 1397 ) + 1931 ( 1402 1463 ) + 1932 ( 1463 1464 ) + 1933 ( 1464 1403 ) + 1934 ( 1409 1465 ) + 1935 ( 1466 1408 ) + 1936 ( 1465 1466 ) + 1937 ( 1467 1463 ) + 1938 ( 1468 1467 ) + 1939 ( 1468 1460 ) + 1940 ( 1459 1464 ) + 1941 ( 399 1469 ) + 1942 ( 1470 1469 ) + 1943 ( 1470 433 ) + 1944 ( 1469 1471 ) + 1945 ( 1471 1472 ) + 1946 ( 1472 1470 ) + 1947 ( 1472 1473 ) + 1948 ( 437 1473 ) + 1949 ( 1474 1475 ) + 1950 ( 1476 1475 ) + 1951 ( 1476 1477 ) + 1952 ( 1474 1477 ) + 1953 ( 1478 1479 ) + 1954 ( 1480 1479 ) + 1955 ( 1481 1480 ) + 1956 ( 1482 1481 ) + 1957 ( 1482 1483 ) + 1958 ( 1483 1478 ) + 1959 ( 1479 1474 ) + 1960 ( 1477 1480 ) + 1961 ( 380 1484 ) + 1962 ( 1484 1485 ) + 1963 ( 1485 1486 ) + 1964 ( 1486 396 ) + 1965 ( 1484 1487 ) + 1966 ( 1488 1487 ) + 1967 ( 1488 1485 ) + 1968 ( 1475 1488 ) + 1969 ( 1487 1476 ) + 1970 ( 1481 1489 ) + 1971 ( 1490 1480 ) + 1972 ( 1490 1489 ) + 1973 ( 381 1491 ) + 1974 ( 1491 1492 ) + 1975 ( 1492 1493 ) + 1976 ( 1493 1484 ) + 1977 ( 1494 1495 ) + 1978 ( 1495 1482 ) + 1979 ( 1481 1494 ) + 1980 ( 1496 478 ) + 1981 ( 475 1496 ) + 1982 ( 479 1497 ) + 1983 ( 1498 1496 ) + 1984 ( 1497 1498 ) + 1985 ( 1499 1500 ) + 1986 ( 1500 1501 ) + 1987 ( 1501 1502 ) + 1988 ( 1502 1499 ) + 1989 ( 1503 1502 ) + 1990 ( 1503 1504 ) + 1991 ( 1499 1504 ) + 1992 ( 1505 1506 ) + 1993 ( 1507 1505 ) + 1994 ( 1507 1506 ) + 1995 ( 1508 1509 ) + 1996 ( 1509 1510 ) + 1997 ( 1510 1511 ) + 1998 ( 1511 1508 ) + 1999 ( 1511 1512 ) + 2000 ( 1513 1512 ) + 2001 ( 1513 1508 ) + 2002 ( 1514 1509 ) + 2003 ( 1514 1515 ) + 2004 ( 1515 1516 ) + 2005 ( 1516 1517 ) + 2006 ( 1517 1518 ) + 2007 ( 1510 1518 ) + 2008 ( 1519 1520 ) + 2009 ( 1519 1516 ) + 2010 ( 1515 1520 ) + 2011 ( 1520 1521 ) + 2012 ( 1521 1522 ) + 2013 ( 1522 1519 ) + 2014 ( 1523 1519 ) + 2015 ( 1517 1523 ) + 2016 ( 1522 1524 ) + 2017 ( 1524 1523 ) + 2018 ( 1525 1518 ) + 2019 ( 1525 1523 ) + 2020 ( 1524 1526 ) + 2021 ( 1525 1526 ) + 2022 ( 1527 1498 ) + 2023 ( 1528 1527 ) + 2024 ( 1497 1528 ) + 2025 ( 1529 1527 ) + 2026 ( 1529 1530 ) + 2027 ( 1530 1531 ) + 2028 ( 1531 1532 ) + 2029 ( 1532 1533 ) + 2030 ( 1528 1533 ) + 2031 ( 1534 1535 ) + 2032 ( 1536 1534 ) + 2033 ( 1537 1536 ) + 2034 ( 1535 1537 ) + 2035 ( 1538 1539 ) + 2036 ( 1540 1538 ) + 2037 ( 1541 1540 ) + 2038 ( 1541 1539 ) + 2039 ( 1542 1543 ) + 2040 ( 1543 1544 ) + 2041 ( 1544 1545 ) + 2042 ( 1545 1546 ) + 2043 ( 1546 1547 ) + 2044 ( 1548 1547 ) + 2045 ( 1548 1549 ) + 2046 ( 1549 1542 ) + 2047 ( 1550 1515 ) + 2048 ( 1551 1550 ) + 2049 ( 1552 1551 ) + 2050 ( 1553 1552 ) + 2051 ( 1520 1553 ) + 2052 ( 1554 1553 ) + 2053 ( 1554 1555 ) + 2054 ( 1555 1521 ) + 2055 ( 1556 1557 ) + 2056 ( 1557 1558 ) + 2057 ( 1558 1559 ) + 2058 ( 1559 1560 ) + 2059 ( 1560 1561 ) + 2060 ( 1561 1562 ) + 2061 ( 1562 1563 ) + 2062 ( 1563 1556 ) + 2063 ( 1512 1564 ) + 2064 ( 1565 1564 ) + 2065 ( 1565 1513 ) + 2066 ( 1566 1567 ) + 2067 ( 1568 1567 ) + 2068 ( 407 1568 ) + 2069 ( 1569 408 ) + 2070 ( 1569 1566 ) + 2071 ( 1570 1571 ) + 2072 ( 1570 1572 ) + 2073 ( 1573 1572 ) + 2074 ( 1573 1574 ) + 2075 ( 1575 1574 ) + 2076 ( 1576 1575 ) + 2077 ( 1576 1571 ) + 2078 ( 1567 1572 ) + 2079 ( 1566 1573 ) + 2080 ( 1577 1578 ) + 2081 ( 1570 1577 ) + 2082 ( 1571 1579 ) + 2083 ( 1579 1578 ) + 2084 ( 1580 1581 ) + 2085 ( 1568 1581 ) + 2086 ( 1580 1567 ) + 2087 ( 1582 1580 ) + 2088 ( 1572 1582 ) + 2089 ( 1583 1576 ) + 2090 ( 1583 1579 ) + 2091 ( 542 1584 ) + 2092 ( 1585 1584 ) + 2093 ( 1586 1585 ) + 2094 ( 543 1586 ) + 2095 ( 1587 1588 ) + 2096 ( 1588 1589 ) + 2097 ( 1589 1590 ) + 2098 ( 1591 1590 ) + 2099 ( 1591 1592 ) + 2100 ( 1592 1587 ) + 2101 ( 1593 457 ) + 2102 ( 1594 1593 ) + 2103 ( 1595 1594 ) + 2104 ( 1596 1595 ) + 2105 ( 1584 1596 ) + 2106 ( 1597 1598 ) + 2107 ( 1599 1597 ) + 2108 ( 1600 1599 ) + 2109 ( 1600 1598 ) + 2110 ( 1601 1602 ) + 2111 ( 1602 1603 ) + 2112 ( 1603 1604 ) + 2113 ( 1604 1600 ) + 2114 ( 1599 1605 ) + 2115 ( 1605 1606 ) + 2116 ( 1606 1607 ) + 2117 ( 1607 1608 ) + 2118 ( 1608 1601 ) + 2119 ( 1609 1610 ) + 2120 ( 1610 1611 ) + 2121 ( 1612 1611 ) + 2122 ( 1598 1612 ) + 2123 ( 1609 1604 ) + 2124 ( 1613 1614 ) + 2125 ( 1614 1615 ) + 2126 ( 1613 1615 ) + 2127 ( 1616 1589 ) + 2128 ( 1616 1614 ) + 2129 ( 1617 1613 ) + 2130 ( 1617 1618 ) + 2131 ( 1590 1618 ) + 2132 ( 1619 1588 ) + 2133 ( 1619 1616 ) + 2134 ( 1620 1617 ) + 2135 ( 1621 1620 ) + 2136 ( 1618 1621 ) + 2137 ( 1622 1623 ) + 2138 ( 1623 1591 ) + 2139 ( 1621 1624 ) + 2140 ( 1624 1622 ) + 2141 ( 1625 1620 ) + 2142 ( 1626 1625 ) + 2143 ( 1624 1626 ) + 2144 ( 1626 1627 ) + 2145 ( 1627 1628 ) + 2146 ( 1622 1628 ) + 2147 ( 1629 1630 ) + 2148 ( 1627 1629 ) + 2149 ( 1625 1630 ) + 2150 ( 1631 1586 ) + 2151 ( 1631 544 ) + 2152 ( 1632 1633 ) + 2153 ( 1633 1605 ) + 2154 ( 1597 1634 ) + 2155 ( 1634 1635 ) + 2156 ( 1635 1632 ) + 2157 ( 1636 1631 ) + 2158 ( 1637 1636 ) + 2159 ( 1638 1637 ) + 2160 ( 545 1638 ) + 2161 ( 1638 1639 ) + 2162 ( 1639 1637 ) + 2163 ( 1633 1606 ) + 2164 ( 1640 1632 ) + 2165 ( 1641 1640 ) + 2166 ( 1607 1641 ) + 2167 ( 1642 1629 ) + 2168 ( 1642 1643 ) + 2169 ( 1644 1643 ) + 2170 ( 1644 1627 ) + 2171 ( 1643 1645 ) + 2172 ( 1646 1645 ) + 2173 ( 1646 1644 ) + 2174 ( 1647 1646 ) + 2175 ( 1628 1647 ) + 2176 ( 1630 1642 ) + 2177 ( 1648 1649 ) + 2178 ( 1649 1595 ) + 2179 ( 1594 1648 ) + 2180 ( 1650 1596 ) + 2181 ( 1649 1651 ) + 2182 ( 1651 1652 ) + 2183 ( 1652 1650 ) + 2184 ( 1652 1653 ) + 2185 ( 1653 1654 ) + 2186 ( 1654 1650 ) + 2187 ( 1655 1635 ) + 2188 ( 1656 1655 ) + 2189 ( 1656 1632 ) + 2190 ( 1634 1657 ) + 2191 ( 1655 1657 ) + 2192 ( 1658 1659 ) + 2193 ( 1656 1659 ) + 2194 ( 1660 1657 ) + 2195 ( 1660 1658 ) + 2196 ( 1659 1661 ) + 2197 ( 1661 1662 ) + 2198 ( 1663 1662 ) + 2199 ( 1640 1663 ) + 2200 ( 1664 1665 ) + 2201 ( 1665 1666 ) + 2202 ( 1666 1667 ) + 2203 ( 1667 1668 ) + 2204 ( 1668 1669 ) + 2205 ( 1664 1669 ) + 2206 ( 1670 1671 ) + 2207 ( 1672 1670 ) + 2208 ( 1330 1672 ) + 2209 ( 51 1329 ) + 2210 ( 1639 1671 ) + 2211 ( 1673 1674 ) + 2212 ( 1667 1674 ) + 2213 ( 1675 1666 ) + 2214 ( 1675 1676 ) + 2215 ( 1676 1673 ) + 2216 ( 1674 1677 ) + 2217 ( 1677 1668 ) + 2218 ( 1665 1675 ) + 2219 ( 1678 1673 ) + 2220 ( 1676 1678 ) + 2221 ( 1679 1672 ) + 2222 ( 1670 1680 ) + 2223 ( 1680 1679 ) + 2224 ( 1679 1681 ) + 2225 ( 1681 1331 ) + 2226 ( 1682 1683 ) + 2227 ( 1322 1682 ) + 2228 ( 1334 1683 ) + 2229 ( 1684 1504 ) + 2230 ( 1503 1685 ) + 2231 ( 1686 1685 ) + 2232 ( 1686 1687 ) + 2233 ( 1687 1688 ) + 2234 ( 1689 1688 ) + 2235 ( 1689 1690 ) + 2236 ( 1690 1684 ) + 2237 ( 1691 1692 ) + 2238 ( 1691 1693 ) + 2239 ( 1693 1694 ) + 2240 ( 1694 1695 ) + 2241 ( 1695 1692 ) + 2242 ( 1696 1697 ) + 2243 ( 1697 1698 ) + 2244 ( 1698 1691 ) + 2245 ( 1696 1692 ) + 2246 ( 1699 1693 ) + 2247 ( 1700 1698 ) + 2248 ( 1699 1700 ) + 2249 ( 1697 1701 ) + 2250 ( 1701 1700 ) + 2251 ( 1701 1702 ) + 2252 ( 1702 1505 ) + 2253 ( 1506 1699 ) + 2254 ( 1690 1694 ) + 2255 ( 1699 1684 ) + 2256 ( 1703 1704 ) + 2257 ( 1704 1705 ) + 2258 ( 1705 1706 ) + 2259 ( 1706 1707 ) + 2260 ( 1708 1707 ) + 2261 ( 1708 1686 ) + 2262 ( 1685 1703 ) + 2263 ( 1709 1710 ) + 2264 ( 1710 1705 ) + 2265 ( 1704 1709 ) + 2266 ( 1711 1712 ) + 2267 ( 1712 1707 ) + 2268 ( 1706 1711 ) + 2269 ( 1708 1713 ) + 2270 ( 1713 1714 ) + 2271 ( 1714 1715 ) + 2272 ( 1715 1687 ) + 2273 ( 1688 1716 ) + 2274 ( 1715 1716 ) + 2275 ( 1717 1311 ) + 2276 ( 1718 1717 ) + 2277 ( 1718 1719 ) + 2278 ( 1307 1719 ) + 2279 ( 1689 1717 ) + 2280 ( 1718 1716 ) + 2281 ( 1720 1721 ) + 2282 ( 1721 1272 ) + 2283 ( 1274 1722 ) + 2284 ( 1720 1722 ) + 2285 ( 1722 1723 ) + 2286 ( 1696 1723 ) + 2287 ( 1692 1720 ) + 2288 ( 1724 1276 ) + 2289 ( 1723 1724 ) + 2290 ( 1695 1721 ) + 2291 ( 1725 1374 ) + 2292 ( 1725 1726 ) + 2293 ( 1290 1726 ) + 2294 ( 1727 1728 ) + 2295 ( 1728 1729 ) + 2296 ( 1729 1730 ) + 2297 ( 1730 1731 ) + 2298 ( 1731 1732 ) + 2299 ( 1727 1732 ) + 2300 ( 1733 1727 ) + 2301 ( 1732 1734 ) + 2302 ( 1735 1734 ) + 2303 ( 1736 1735 ) + 2304 ( 1736 1733 ) + 2305 ( 1733 1728 ) + 2306 ( 1731 1734 ) + 2307 ( 1737 1738 ) + 2308 ( 1738 1739 ) + 2309 ( 1740 1739 ) + 2310 ( 1740 1737 ) + 2311 ( 1741 1742 ) + 2312 ( 1743 1741 ) + 2313 ( 1743 1744 ) + 2314 ( 1744 1742 ) + 2315 ( 1745 1746 ) + 2316 ( 1747 1746 ) + 2317 ( 1747 1748 ) + 2318 ( 1548 1748 ) + 2319 ( 1547 1745 ) + 2320 ( 1749 1750 ) + 2321 ( 1751 1750 ) + 2322 ( 1752 1751 ) + 2323 ( 1752 1753 ) + 2324 ( 1753 1747 ) + 2325 ( 1746 1749 ) + 2326 ( 1754 1755 ) + 2327 ( 1756 1755 ) + 2328 ( 1756 1757 ) + 2329 ( 1757 1758 ) + 2330 ( 1758 1759 ) + 2331 ( 1759 1754 ) + 2332 ( 1760 1759 ) + 2333 ( 1761 1758 ) + 2334 ( 1760 1761 ) + 2335 ( 1756 1762 ) + 2336 ( 1762 1763 ) + 2337 ( 1757 1763 ) + 2338 ( 1764 1745 ) + 2339 ( 1765 1764 ) + 2340 ( 1749 1765 ) + 2341 ( 1766 1765 ) + 2342 ( 1766 1767 ) + 2343 ( 1767 1768 ) + 2344 ( 1768 1769 ) + 2345 ( 1750 1769 ) + 2346 ( 1770 1546 ) + 2347 ( 1771 1770 ) + 2348 ( 1771 1772 ) + 2349 ( 1772 1773 ) + 2350 ( 1773 1764 ) + 2351 ( 1774 1753 ) + 2352 ( 1774 1775 ) + 2353 ( 1748 1775 ) + 2354 ( 1776 1752 ) + 2355 ( 1776 1777 ) + 2356 ( 1777 1774 ) + 2357 ( 1775 1778 ) + 2358 ( 1778 1779 ) + 2359 ( 1779 1780 ) + 2360 ( 1780 1549 ) + 2361 ( 1777 1766 ) + 2362 ( 1773 1299 ) + 2363 ( 1298 1778 ) + 2364 ( 1779 1376 ) + 2365 ( 1780 1375 ) + 2366 ( 1781 1776 ) + 2367 ( 1781 1767 ) + 2368 ( 1295 1782 ) + 2369 ( 1782 1772 ) + 2370 ( 1771 1783 ) + 2371 ( 1783 1782 ) + 2372 ( 1784 1785 ) + 2373 ( 1784 1575 ) + 2374 ( 1785 1574 ) + 2375 ( 1786 1787 ) + 2376 ( 1787 1788 ) + 2377 ( 1789 1788 ) + 2378 ( 1790 1789 ) + 2379 ( 1791 1790 ) + 2380 ( 1792 1791 ) + 2381 ( 1793 1792 ) + 2382 ( 1794 1793 ) + 2383 ( 1786 1794 ) + 2384 ( 1795 1796 ) + 2385 ( 1797 1795 ) + 2386 ( 1797 1796 ) + 2387 ( 1798 1799 ) + 2388 ( 1800 1798 ) + 2389 ( 1801 1800 ) + 2390 ( 1802 1801 ) + 2391 ( 1803 1802 ) + 2392 ( 1799 1803 ) + 2393 ( 1804 1799 ) + 2394 ( 1804 1803 ) + 2395 ( 1804 1805 ) + 2396 ( 1806 1802 ) + 2397 ( 1806 1807 ) + 2398 ( 1807 1805 ) + 2399 ( 1806 1808 ) + 2400 ( 1801 1809 ) + 2401 ( 1809 1810 ) + 2402 ( 1810 1808 ) + 2403 ( 1800 1811 ) + 2404 ( 1812 1811 ) + 2405 ( 1812 1813 ) + 2406 ( 1813 1814 ) + 2407 ( 1814 1815 ) + 2408 ( 1809 1815 ) + 2409 ( 1816 1788 ) + 2410 ( 1816 1817 ) + 2411 ( 1817 1796 ) + 2412 ( 1797 1818 ) + 2413 ( 1818 1789 ) + 2414 ( 1819 1820 ) + 2415 ( 1820 1821 ) + 2416 ( 1792 1821 ) + 2417 ( 1791 1819 ) + 2418 ( 1818 1790 ) + 2419 ( 1798 1811 ) + 2420 ( 1821 1822 ) + 2421 ( 1820 1823 ) + 2422 ( 1823 1824 ) + 2423 ( 1824 1825 ) + 2424 ( 1826 1825 ) + 2425 ( 1822 1826 ) + 2426 ( 1819 1823 ) + 2427 ( 1827 1828 ) + 2428 ( 1829 1827 ) + 2429 ( 1829 1830 ) + 2430 ( 1831 1830 ) + 2431 ( 1832 1831 ) + 2432 ( 1833 1832 ) + 2433 ( 1833 1834 ) + 2434 ( 1834 1828 ) + 2435 ( 1835 1826 ) + 2436 ( 1836 1835 ) + 2437 ( 1827 1836 ) + 2438 ( 1837 1828 ) + 2439 ( 1822 1837 ) + 2440 ( 1838 1831 ) + 2441 ( 1838 1830 ) + 2442 ( 1829 1836 ) + 2443 ( 1835 1825 ) + 2444 ( 1839 1840 ) + 2445 ( 1841 1839 ) + 2446 ( 1842 1841 ) + 2447 ( 1840 1842 ) + 2448 ( 1843 1844 ) + 2449 ( 1840 1844 ) + 2450 ( 1845 1842 ) + 2451 ( 1845 1843 ) + 2452 ( 1846 1847 ) + 2453 ( 1847 1848 ) + 2454 ( 1848 1849 ) + 2455 ( 1849 1850 ) + 2456 ( 1850 1851 ) + 2457 ( 1851 1845 ) + 2458 ( 1852 1841 ) + 2459 ( 1852 1853 ) + 2460 ( 1853 1846 ) + 2461 ( 1854 1855 ) + 2462 ( 1855 1856 ) + 2463 ( 1856 1857 ) + 2464 ( 1857 1852 ) + 2465 ( 1839 1858 ) + 2466 ( 1858 1854 ) + 2467 ( 1859 1860 ) + 2468 ( 1858 1859 ) + 2469 ( 1860 1840 ) + 2470 ( 1844 1861 ) + 2471 ( 1861 1862 ) + 2472 ( 1862 1860 ) + 2473 ( 1816 1832 ) + 2474 ( 1817 1838 ) + 2475 ( 1863 1864 ) + 2476 ( 1865 1863 ) + 2477 ( 1866 1865 ) + 2478 ( 1793 1866 ) + 2479 ( 1864 1837 ) + 2480 ( 1867 1868 ) + 2481 ( 1869 1867 ) + 2482 ( 1870 1869 ) + 2483 ( 1870 1871 ) + 2484 ( 1871 1868 ) + 2485 ( 1872 1867 ) + 2486 ( 1873 1872 ) + 2487 ( 1869 1873 ) + 2488 ( 1874 1875 ) + 2489 ( 1868 1875 ) + 2490 ( 1874 1871 ) + 2491 ( 1876 1794 ) + 2492 ( 1866 1876 ) + 2493 ( 1875 1877 ) + 2494 ( 1877 1878 ) + 2495 ( 1878 1879 ) + 2496 ( 1867 1879 ) + 2497 ( 1879 1880 ) + 2498 ( 1880 1872 ) + 2499 ( 1881 1882 ) + 2500 ( 1882 1863 ) + 2501 ( 1864 1881 ) + 2502 ( 1883 1884 ) + 2503 ( 1885 1883 ) + 2504 ( 1885 1886 ) + 2505 ( 1886 1887 ) + 2506 ( 1888 1887 ) + 2507 ( 1884 1888 ) + 2508 ( 1889 1890 ) + 2509 ( 1888 1889 ) + 2510 ( 1890 1887 ) + 2511 ( 1889 1891 ) + 2512 ( 1891 1892 ) + 2513 ( 1892 1893 ) + 2514 ( 1894 1893 ) + 2515 ( 1894 1895 ) + 2516 ( 1895 1884 ) + 2517 ( 1885 1784 ) + 2518 ( 1896 1785 ) + 2519 ( 1896 1886 ) + 2520 ( 1897 1896 ) + 2521 ( 1898 1897 ) + 2522 ( 1898 1890 ) + 2523 ( 1899 1900 ) + 2524 ( 1901 1900 ) + 2525 ( 1901 1902 ) + 2526 ( 1899 1902 ) + 2527 ( 1903 1904 ) + 2528 ( 1903 1899 ) + 2529 ( 1902 1904 ) + 2530 ( 1905 1906 ) + 2531 ( 1904 1906 ) + 2532 ( 1901 1905 ) + 2533 ( 1907 1908 ) + 2534 ( 1908 1905 ) + 2535 ( 1900 1907 ) + 2536 ( 1909 1882 ) + 2537 ( 1881 1910 ) + 2538 ( 1910 1909 ) + 2539 ( 1890 1911 ) + 2540 ( 1911 1912 ) + 2541 ( 1912 1913 ) + 2542 ( 1913 1914 ) + 2543 ( 1915 1914 ) + 2544 ( 1915 1889 ) + 2545 ( 1916 1917 ) + 2546 ( 1918 1916 ) + 2547 ( 1919 1918 ) + 2548 ( 1919 1913 ) + 2549 ( 1917 1912 ) + 2550 ( 1920 1898 ) + 2551 ( 1920 1911 ) + 2552 ( 1921 1922 ) + 2553 ( 1921 1911 ) + 2554 ( 1922 1920 ) + 2555 ( 1923 1924 ) + 2556 ( 1924 1925 ) + 2557 ( 1925 1926 ) + 2558 ( 1926 1923 ) + 2559 ( 1927 1928 ) + 2560 ( 1929 1927 ) + 2561 ( 1929 1930 ) + 2562 ( 1928 1930 ) + 2563 ( 1931 1932 ) + 2564 ( 1928 1932 ) + 2565 ( 1930 1931 ) + 2566 ( 1933 1934 ) + 2567 ( 1934 1931 ) + 2568 ( 1929 1933 ) + 2569 ( 1935 1936 ) + 2570 ( 1936 1937 ) + 2571 ( 1938 1937 ) + 2572 ( 1939 1938 ) + 2573 ( 1940 1939 ) + 2574 ( 1935 1940 ) + 2575 ( 1935 1941 ) + 2576 ( 1941 1940 ) + 2577 ( 1942 1943 ) + 2578 ( 1943 1941 ) + 2579 ( 1939 1944 ) + 2580 ( 1944 1945 ) + 2581 ( 1945 1946 ) + 2582 ( 1946 1947 ) + 2583 ( 1947 1948 ) + 2584 ( 1948 1942 ) + 2585 ( 1938 1949 ) + 2586 ( 1949 1950 ) + 2587 ( 1950 1951 ) + 2588 ( 1951 1952 ) + 2589 ( 1952 1953 ) + 2590 ( 1953 1954 ) + 2591 ( 1954 1944 ) + 2592 ( 1955 1956 ) + 2593 ( 1956 1943 ) + 2594 ( 1957 1942 ) + 2595 ( 1957 1958 ) + 2596 ( 1958 1955 ) + 2597 ( 1948 1957 ) + 2598 ( 1959 1960 ) + 2599 ( 1959 1961 ) + 2600 ( 1960 1961 ) + 2601 ( 1962 1937 ) + 2602 ( 1963 1962 ) + 2603 ( 1949 1963 ) + 2604 ( 1962 1964 ) + 2605 ( 1964 1965 ) + 2606 ( 1963 1965 ) + 2607 ( 1965 1966 ) + 2608 ( 1950 1966 ) + 2609 ( 1967 1894 ) + 2610 ( 1968 1967 ) + 2611 ( 1969 1968 ) + 2612 ( 1970 1969 ) + 2613 ( 1895 1970 ) + 2614 ( 1971 1970 ) + 2615 ( 1972 1971 ) + 2616 ( 1883 1972 ) + 2617 ( 1973 1974 ) + 2618 ( 1972 1974 ) + 2619 ( 1973 1971 ) + 2620 ( 1975 1976 ) + 2621 ( 1977 1975 ) + 2622 ( 1978 1977 ) + 2623 ( 1979 1978 ) + 2624 ( 1979 1976 ) + 2625 ( 1980 1977 ) + 2626 ( 1981 1980 ) + 2627 ( 1978 1981 ) + 2628 ( 1982 1983 ) + 2629 ( 1983 1976 ) + 2630 ( 1979 1982 ) + 2631 ( 1984 1985 ) + 2632 ( 1985 1982 ) + 2633 ( 1984 1981 ) + 2634 ( 1974 1986 ) + 2635 ( 1987 1986 ) + 2636 ( 1885 1987 ) + 2637 ( 1988 1989 ) + 2638 ( 1989 1990 ) + 2639 ( 1990 1987 ) + 2640 ( 1988 1986 ) + 2641 ( 1893 1991 ) + 2642 ( 1991 1992 ) + 2643 ( 1992 1967 ) + 2644 ( 1993 1989 ) + 2645 ( 1961 1993 ) + 2646 ( 1994 1959 ) + 2647 ( 1994 1990 ) + 2648 ( 1993 1988 ) + 2649 ( 1995 1996 ) + 2650 ( 1995 1997 ) + 2651 ( 1997 1998 ) + 2652 ( 1999 1998 ) + 2653 ( 1999 2000 ) + 2654 ( 2000 1996 ) + 2655 ( 2001 2002 ) + 2656 ( 2003 2001 ) + 2657 ( 2003 2004 ) + 2658 ( 2005 2004 ) + 2659 ( 2006 2005 ) + 2660 ( 2007 2006 ) + 2661 ( 2002 2007 ) + 2662 ( 2003 2008 ) + 2663 ( 2008 2009 ) + 2664 ( 2009 1995 ) + 2665 ( 1996 2004 ) + 2666 ( 1999 2010 ) + 2667 ( 1998 2011 ) + 2668 ( 2011 2010 ) + 2669 ( 2012 2013 ) + 2670 ( 2013 2014 ) + 2671 ( 2015 2014 ) + 2672 ( 2015 2016 ) + 2673 ( 2012 2016 ) + 2674 ( 2016 2017 ) + 2675 ( 2017 2018 ) + 2676 ( 2018 2019 ) + 2677 ( 2019 2012 ) + 2678 ( 2013 2020 ) + 2679 ( 2021 2020 ) + 2680 ( 2022 2021 ) + 2681 ( 2023 2022 ) + 2682 ( 2023 2024 ) + 2683 ( 2014 2024 ) + 2684 ( 2023 2006 ) + 2685 ( 2007 2022 ) + 2686 ( 2024 2005 ) + 2687 ( 2025 2001 ) + 2688 ( 2026 2025 ) + 2689 ( 2008 2026 ) + 2690 ( 2027 2028 ) + 2691 ( 2027 2029 ) + 2692 ( 2029 2030 ) + 2693 ( 2030 2031 ) + 2694 ( 2028 2031 ) + 2695 ( 2032 2033 ) + 2696 ( 2032 2034 ) + 2697 ( 2034 2035 ) + 2698 ( 2036 2035 ) + 2699 ( 2036 2037 ) + 2700 ( 2037 2033 ) + 2701 ( 2036 2038 ) + 2702 ( 2039 2038 ) + 2703 ( 2040 2039 ) + 2704 ( 2041 2040 ) + 2705 ( 2041 2042 ) + 2706 ( 2042 2037 ) + 2707 ( 2035 2043 ) + 2708 ( 2043 2044 ) + 2709 ( 2044 2045 ) + 2710 ( 2045 2046 ) + 2711 ( 2046 2047 ) + 2712 ( 2047 2038 ) + 2713 ( 2047 2048 ) + 2714 ( 2048 2049 ) + 2715 ( 2050 2049 ) + 2716 ( 2051 2050 ) + 2717 ( 2039 2051 ) + 2718 ( 2052 2034 ) + 2719 ( 2053 2052 ) + 2720 ( 2053 2054 ) + 2721 ( 2054 2043 ) + 2722 ( 2055 2054 ) + 2723 ( 2055 2044 ) + 2724 ( 2056 2057 ) + 2725 ( 2058 2056 ) + 2726 ( 2059 2058 ) + 2727 ( 2060 2059 ) + 2728 ( 2057 2060 ) + 2729 ( 2061 2041 ) + 2730 ( 2061 2062 ) + 2731 ( 2062 2042 ) + 2732 ( 2057 2061 ) + 2733 ( 2060 2062 ) + 2734 ( 2063 2064 ) + 2735 ( 2065 2063 ) + 2736 ( 2066 2065 ) + 2737 ( 2064 2066 ) + 2738 ( 2067 2058 ) + 2739 ( 2068 2056 ) + 2740 ( 2067 2068 ) + 2741 ( 2064 2067 ) + 2742 ( 2068 2063 ) + 2743 ( 2052 2069 ) + 2744 ( 2069 2070 ) + 2745 ( 2070 2053 ) + 2746 ( 2065 2071 ) + 2747 ( 2071 2010 ) + 2748 ( 2072 2011 ) + 2749 ( 2072 2066 ) + 2750 ( 2015 2073 ) + 2751 ( 2074 2073 ) + 2752 ( 2075 2074 ) + 2753 ( 2075 2016 ) + 2754 ( 2074 2076 ) + 2755 ( 2076 2077 ) + 2756 ( 2077 2078 ) + 2757 ( 2078 2079 ) + 2758 ( 2079 2080 ) + 2759 ( 2080 2075 ) + 2760 ( 2080 2081 ) + 2761 ( 2081 2017 ) + 2762 ( 2077 2082 ) + 2763 ( 2083 2082 ) + 2764 ( 2029 2083 ) + 2765 ( 2029 2084 ) + 2766 ( 2084 2078 ) + 2767 ( 2073 2085 ) + 2768 ( 2076 2085 ) + 2769 ( 2086 2087 ) + 2770 ( 2086 2083 ) + 2771 ( 2082 2087 ) + 2772 ( 2086 2030 ) + 2773 ( 2088 2089 ) + 2774 ( 2088 2090 ) + 2775 ( 2090 2091 ) + 2776 ( 2091 2092 ) + 2777 ( 2093 2092 ) + 2778 ( 2093 2089 ) + 2779 ( 2094 2095 ) + 2780 ( 2096 2094 ) + 2781 ( 2096 2097 ) + 2782 ( 2097 2098 ) + 2783 ( 2095 2098 ) + 2784 ( 2099 2100 ) + 2785 ( 2095 2099 ) + 2786 ( 2098 2100 ) + 2787 ( 2101 1490 ) + 2788 ( 2102 2101 ) + 2789 ( 1489 2102 ) + 2790 ( 2103 2101 ) + 2791 ( 2104 2103 ) + 2792 ( 2102 2104 ) + 2793 ( 2105 2026 ) + 2794 ( 2105 2009 ) + 2795 ( 360 2106 ) + 2796 ( 2107 2106 ) + 2797 ( 2107 368 ) + 2798 ( 2108 2109 ) + 2799 ( 2110 2109 ) + 2800 ( 2111 2110 ) + 2801 ( 2111 2112 ) + 2802 ( 2112 2113 ) + 2803 ( 2113 2108 ) + 2804 ( 2114 2109 ) + 2805 ( 2115 2114 ) + 2806 ( 2116 2115 ) + 2807 ( 2117 2116 ) + 2808 ( 2118 2117 ) + 2809 ( 2110 2118 ) + 2810 ( 2117 908 ) + 2811 ( 2118 909 ) + 2812 ( 909 2111 ) + 2813 ( 2119 2120 ) + 2814 ( 2119 2108 ) + 2815 ( 2121 2113 ) + 2816 ( 2120 2121 ) + 2817 ( 825 2120 ) + 2818 ( 826 2121 ) + 2819 ( 2112 826 ) + 2820 ( 2116 2122 ) + 2821 ( 2122 910 ) + 2822 ( 2123 2119 ) + 2823 ( 1786 2123 ) + 2824 ( 1876 2114 ) + 2825 ( 2124 885 ) + 2826 ( 2070 2124 ) + 2827 ( 2106 2069 ) + 2828 ( 892 2124 ) + 2829 ( 2125 891 ) + 2830 ( 2125 862 ) + 2831 ( 2126 2125 ) + 2832 ( 870 2126 ) + 2833 ( 412 2127 ) + 2834 ( 1569 2127 ) + 2835 ( 2128 2129 ) + 2836 ( 1492 2128 ) + 2837 ( 2129 1491 ) + 2838 ( 2096 2130 ) + 2839 ( 2131 2130 ) + 2840 ( 2131 2132 ) + 2841 ( 2132 2133 ) + 2842 ( 2133 2134 ) + 2843 ( 2134 2097 ) + 2844 ( 2135 2136 ) + 2845 ( 2133 2135 ) + 2846 ( 2136 2132 ) + 2847 ( 2137 2138 ) + 2848 ( 2139 2137 ) + 2849 ( 2139 2140 ) + 2850 ( 2138 2140 ) + 2851 ( 2138 2141 ) + 2852 ( 2140 2142 ) + 2853 ( 2142 2141 ) + 2854 ( 2139 2143 ) + 2855 ( 2144 2143 ) + 2856 ( 2142 2144 ) + 2857 ( 2145 2137 ) + 2858 ( 2146 2145 ) + 2859 ( 2146 2143 ) + 2860 ( 2147 2148 ) + 2861 ( 2149 2148 ) + 2862 ( 2150 2149 ) + 2863 ( 2150 2147 ) + 2864 ( 2148 2151 ) + 2865 ( 2152 2151 ) + 2866 ( 2149 2152 ) + 2867 ( 2153 2154 ) + 2868 ( 2147 2154 ) + 2869 ( 2150 2153 ) + 2870 ( 2155 2156 ) + 2871 ( 2157 2155 ) + 2872 ( 2158 2157 ) + 2873 ( 2153 2158 ) + 2874 ( 2156 2152 ) + 2875 ( 2159 2160 ) + 2876 ( 2161 2160 ) + 2877 ( 2161 2162 ) + 2878 ( 2162 2163 ) + 2879 ( 2163 2159 ) + 2880 ( 2164 2165 ) + 2881 ( 2164 2166 ) + 2882 ( 2166 2167 ) + 2883 ( 2167 2168 ) + 2884 ( 2160 2168 ) + 2885 ( 2159 2169 ) + 2886 ( 2169 2165 ) + 2887 ( 2170 2171 ) + 2888 ( 2170 2172 ) + 2889 ( 2172 2164 ) + 2890 ( 2165 2171 ) + 2891 ( 2173 2169 ) + 2892 ( 2174 2173 ) + 2893 ( 2171 2174 ) + 2894 ( 2175 2176 ) + 2895 ( 2166 2175 ) + 2896 ( 2172 2176 ) + 2897 ( 2177 2175 ) + 2898 ( 2178 2177 ) + 2899 ( 2167 2178 ) + 2900 ( 2170 2179 ) + 2901 ( 2176 2179 ) + 2902 ( 2180 2168 ) + 2903 ( 2180 2178 ) + 2904 ( 2181 2163 ) + 2905 ( 2169 2181 ) + 2906 ( 2182 2173 ) + 2907 ( 2182 2181 ) + 2908 ( 2183 2184 ) + 2909 ( 2184 2185 ) + 2910 ( 2185 2186 ) + 2911 ( 2183 2186 ) + 2912 ( 2187 2188 ) + 2913 ( 2189 2187 ) + 2914 ( 2189 2183 ) + 2915 ( 2186 2188 ) + 2916 ( 2190 2191 ) + 2917 ( 2191 2192 ) + 2918 ( 2192 2193 ) + 2919 ( 2193 2194 ) + 2920 ( 2194 2190 ) + 2921 ( 2195 2196 ) + 2922 ( 2196 2197 ) + 2923 ( 2198 2197 ) + 2924 ( 2198 2199 ) + 2925 ( 2200 2199 ) + 2926 ( 2195 2200 ) + 2927 ( 2201 2202 ) + 2928 ( 2202 2195 ) + 2929 ( 2203 2200 ) + 2930 ( 2204 2203 ) + 2931 ( 2201 2204 ) + 2932 ( 2205 2203 ) + 2933 ( 2205 2206 ) + 2934 ( 2204 2206 ) + 2935 ( 2199 2207 ) + 2936 ( 2208 2207 ) + 2937 ( 2208 2205 ) + 2938 ( 2206 2209 ) + 2939 ( 2210 2209 ) + 2940 ( 2210 2201 ) + 2941 ( 2196 2211 ) + 2942 ( 2212 2211 ) + 2943 ( 2197 2212 ) + 2944 ( 2213 2214 ) + 2945 ( 2215 2213 ) + 2946 ( 2216 2215 ) + 2947 ( 2216 2198 ) + 2948 ( 2212 2214 ) + 2949 ( 742 2217 ) + 2950 ( 755 2217 ) + 2951 ( 2218 2219 ) + 2952 ( 2219 768 ) + 2953 ( 2218 771 ) + 2954 ( 773 2220 ) + 2955 ( 2220 2218 ) + 2956 ( 2221 2222 ) + 2957 ( 2222 2223 ) + 2958 ( 2223 2224 ) + 2959 ( 2225 2224 ) + 2960 ( 2221 2225 ) + 2961 ( 2226 2221 ) + 2962 ( 2227 2225 ) + 2963 ( 2226 2227 ) + 2964 ( 2228 2229 ) + 2965 ( 2225 2229 ) + 2966 ( 2228 2224 ) + 2967 ( 2230 2228 ) + 2968 ( 2231 2230 ) + 2969 ( 2231 2232 ) + 2970 ( 2229 2232 ) + 2971 ( 2232 2233 ) + 2972 ( 2233 2234 ) + 2973 ( 2234 2229 ) + 2974 ( 2234 2227 ) + 2975 ( 2235 2231 ) + 2976 ( 2235 2236 ) + 2977 ( 2233 2236 ) + 2978 ( 2230 2237 ) + 2979 ( 2237 2238 ) + 2980 ( 2238 2235 ) + 2981 ( 2239 2240 ) + 2982 ( 2239 2241 ) + 2983 ( 2241 2242 ) + 2984 ( 2240 2242 ) + 2985 ( 2240 2243 ) + 2986 ( 2242 2244 ) + 2987 ( 2243 2244 ) + 2988 ( 2245 2241 ) + 2989 ( 2246 2245 ) + 2990 ( 2244 2246 ) + 2991 ( 2247 2248 ) + 2992 ( 2249 2248 ) + 2993 ( 2250 2249 ) + 2994 ( 2247 2250 ) + 2995 ( 2251 2247 ) + 2996 ( 2252 2250 ) + 2997 ( 2252 2253 ) + 2998 ( 2253 2251 ) + 2999 ( 2249 2254 ) + 3000 ( 2254 2255 ) + 3001 ( 2256 2255 ) + 3002 ( 2256 2250 ) + 3003 ( 2257 2258 ) + 3004 ( 2258 2259 ) + 3005 ( 2259 2260 ) + 3006 ( 2260 2256 ) + 3007 ( 2255 2261 ) + 3008 ( 2261 2257 ) + 3009 ( 2260 2252 ) + 3010 ( 2262 2263 ) + 3011 ( 2264 2262 ) + 3012 ( 2264 2265 ) + 3013 ( 2266 2265 ) + 3014 ( 2267 2266 ) + 3015 ( 2267 2263 ) + 3016 ( 2268 2266 ) + 3017 ( 2268 2269 ) + 3018 ( 2269 2270 ) + 3019 ( 2270 2271 ) + 3020 ( 2271 2267 ) + 3021 ( 2263 2272 ) + 3022 ( 2273 2272 ) + 3023 ( 2273 2274 ) + 3024 ( 2274 2262 ) + 3025 ( 2263 2275 ) + 3026 ( 2267 2276 ) + 3027 ( 2275 2276 ) + 3028 ( 2277 2275 ) + 3029 ( 2276 2278 ) + 3030 ( 2278 2279 ) + 3031 ( 2279 2280 ) + 3032 ( 2280 2277 ) + 3033 ( 2271 2278 ) + 3034 ( 2272 2277 ) + 3035 ( 2264 2281 ) + 3036 ( 2282 2274 ) + 3037 ( 2281 2282 ) + 3038 ( 2283 2273 ) + 3039 ( 2283 2282 ) + 3040 ( 2284 2285 ) + 3041 ( 2284 2286 ) + 3042 ( 2286 2281 ) + 3043 ( 2282 2285 ) + 3044 ( 2287 2284 ) + 3045 ( 2285 2288 ) + 3046 ( 2288 2289 ) + 3047 ( 2289 2290 ) + 3048 ( 2290 2291 ) + 3049 ( 2291 2287 ) + 3050 ( 2288 2283 ) + 3051 ( 2292 2293 ) + 3052 ( 2293 2294 ) + 3053 ( 2295 2294 ) + 3054 ( 2296 2295 ) + 3055 ( 2296 2297 ) + 3056 ( 2297 2292 ) + 3057 ( 2295 2298 ) + 3058 ( 2298 2299 ) + 3059 ( 2299 2300 ) + 3060 ( 2300 2301 ) + 3061 ( 2302 2301 ) + 3062 ( 2302 2296 ) + 3063 ( 2248 2303 ) + 3064 ( 2254 2303 ) + 3065 ( 2303 2304 ) + 3066 ( 2304 2305 ) + 3067 ( 2305 2306 ) + 3068 ( 2307 2306 ) + 3069 ( 2254 2307 ) + 3070 ( 2261 2307 ) + 3071 ( 2308 2309 ) + 3072 ( 2308 2310 ) + 3073 ( 2311 2310 ) + 3074 ( 2311 2309 ) + 3075 ( 2309 2226 ) + 3076 ( 2312 2226 ) + 3077 ( 2312 2313 ) + 3078 ( 2313 2314 ) + 3079 ( 2314 2315 ) + 3080 ( 2315 2308 ) + 3081 ( 2316 2286 ) + 3082 ( 2316 2265 ) + 3083 ( 2317 2286 ) + 3084 ( 2317 2318 ) + 3085 ( 2318 2319 ) + 3086 ( 2319 2320 ) + 3087 ( 2320 2321 ) + 3088 ( 2321 2316 ) + 3089 ( 2287 2317 ) + 3090 ( 2322 2176 ) + 3091 ( 2294 2322 ) + 3092 ( 2323 2293 ) + 3093 ( 2175 2323 ) + 3094 ( 2292 2324 ) + 3095 ( 2323 2324 ) + 3096 ( 2325 2177 ) + 3097 ( 2324 2325 ) + 3098 ( 2298 2322 ) + 3099 ( 2179 2299 ) + 3100 ( 2326 2327 ) + 3101 ( 2328 2326 ) + 3102 ( 2328 2329 ) + 3103 ( 2330 2329 ) + 3104 ( 2330 2327 ) + 3105 ( 2331 2332 ) + 3106 ( 2331 2333 ) + 3107 ( 2333 2334 ) + 3108 ( 2332 2334 ) + 3109 ( 2327 2335 ) + 3110 ( 2335 2336 ) + 3111 ( 2336 2337 ) + 3112 ( 2337 2332 ) + 3113 ( 2326 2334 ) + 3114 ( 2338 1106 ) + 3115 ( 2338 2339 ) + 3116 ( 2339 2340 ) + 3117 ( 2340 2341 ) + 3118 ( 2341 2342 ) + 3119 ( 2342 1119 ) + 3120 ( 2343 1107 ) + 3121 ( 997 2344 ) + 3122 ( 2344 2345 ) + 3123 ( 2345 2346 ) + 3124 ( 2346 2343 ) + 3125 ( 2347 2343 ) + 3126 ( 1108 2347 ) + 3127 ( 2348 2349 ) + 3128 ( 2338 2348 ) + 3129 ( 2349 1106 ) + 3130 ( 2349 2347 ) + 3131 ( 2350 2351 ) + 3132 ( 2340 2350 ) + 3133 ( 2351 2339 ) + 3134 ( 990 2352 ) + 3135 ( 2352 2353 ) + 3136 ( 2353 2354 ) + 3137 ( 2354 2355 ) + 3138 ( 2355 2356 ) + 3139 ( 2356 1007 ) + 3140 ( 1031 2356 ) + 3141 ( 2357 2358 ) + 3142 ( 2355 2357 ) + 3143 ( 2358 2354 ) + 3144 ( 2359 2360 ) + 3145 ( 2361 2359 ) + 3146 ( 2362 2361 ) + 3147 ( 2362 2353 ) + 3148 ( 2352 2360 ) + 3149 ( 2363 2337 ) + 3150 ( 2364 2363 ) + 3151 ( 2331 2364 ) + 3152 ( 2365 2366 ) + 3153 ( 2367 2365 ) + 3154 ( 2367 2368 ) + 3155 ( 2368 2369 ) + 3156 ( 2369 2366 ) + 3157 ( 2370 2335 ) + 3158 ( 2371 2370 ) + 3159 ( 2336 2371 ) + 3160 ( 2372 2371 ) + 3161 ( 2363 2372 ) + 3162 ( 2373 2374 ) + 3163 ( 2375 2374 ) + 3164 ( 2376 2375 ) + 3165 ( 2373 2376 ) + 3166 ( 2366 2374 ) + 3167 ( 2369 2375 ) + 3168 ( 2377 2378 ) + 3169 ( 2378 2379 ) + 3170 ( 2379 2380 ) + 3171 ( 2380 2381 ) + 3172 ( 2381 2377 ) + 3173 ( 2382 2383 ) + 3174 ( 2383 2384 ) + 3175 ( 2384 2385 ) + 3176 ( 2385 2386 ) + 3177 ( 2386 2387 ) + 3178 ( 2387 2382 ) + 3179 ( 2388 2383 ) + 3180 ( 2373 2388 ) + 3181 ( 2384 2376 ) + 3182 ( 2367 2389 ) + 3183 ( 2390 2365 ) + 3184 ( 2390 2389 ) + 3185 ( 2391 2346 ) + 3186 ( 2391 2392 ) + 3187 ( 2392 2343 ) + 3188 ( 2389 2391 ) + 3189 ( 2390 2392 ) + 3190 ( 2393 2394 ) + 3191 ( 2393 2395 ) + 3192 ( 2396 2395 ) + 3193 ( 2394 2396 ) + 3194 ( 2395 2397 ) + 3195 ( 2397 2398 ) + 3196 ( 2396 2398 ) + 3197 ( 2393 2399 ) + 3198 ( 2399 2400 ) + 3199 ( 2400 2397 ) + 3200 ( 2379 2401 ) + 3201 ( 2401 2402 ) + 3202 ( 2402 2403 ) + 3203 ( 2403 2380 ) + 3204 ( 2401 2404 ) + 3205 ( 2404 2405 ) + 3206 ( 2405 2402 ) + 3207 ( 2406 2407 ) + 3208 ( 2408 2407 ) + 3209 ( 2409 2408 ) + 3210 ( 2409 2406 ) + 3211 ( 2407 2410 ) + 3212 ( 2410 2411 ) + 3213 ( 2408 2411 ) + 3214 ( 2372 2412 ) + 3215 ( 2412 2364 ) + 3216 ( 2413 2414 ) + 3217 ( 2413 2415 ) + 3218 ( 2416 2415 ) + 3219 ( 2416 2414 ) + 3220 ( 2415 2417 ) + 3221 ( 2418 2417 ) + 3222 ( 2419 2418 ) + 3223 ( 2419 2416 ) + 3224 ( 2420 2421 ) + 3225 ( 2421 2414 ) + 3226 ( 2422 2419 ) + 3227 ( 2422 2420 ) + 3228 ( 2423 2424 ) + 3229 ( 2424 2425 ) + 3230 ( 2426 2425 ) + 3231 ( 2426 2423 ) + 3232 ( 2425 2427 ) + 3233 ( 2428 2427 ) + 3234 ( 2428 2426 ) + 3235 ( 2429 2424 ) + 3236 ( 2430 2429 ) + 3237 ( 2427 2430 ) + 3238 ( 2431 2378 ) + 3239 ( 2377 2432 ) + 3240 ( 2433 2432 ) + 3241 ( 2431 2433 ) + 3242 ( 2434 2435 ) + 3243 ( 2436 2435 ) + 3244 ( 2437 2436 ) + 3245 ( 2437 2438 ) + 3246 ( 2438 2439 ) + 3247 ( 2439 2440 ) + 3248 ( 2440 2434 ) + 3249 ( 2431 2435 ) + 3250 ( 2436 2433 ) + 3251 ( 2437 2432 ) + 3252 ( 2441 2382 ) + 3253 ( 2442 2387 ) + 3254 ( 2443 2442 ) + 3255 ( 2441 2443 ) + 3256 ( 2444 2434 ) + 3257 ( 2440 2445 ) + 3258 ( 2445 2444 ) + 3259 ( 2446 2447 ) + 3260 ( 2446 2448 ) + 3261 ( 2449 2448 ) + 3262 ( 2449 2450 ) + 3263 ( 2450 2447 ) + 3264 ( 2447 2451 ) + 3265 ( 2451 2452 ) + 3266 ( 2452 2453 ) + 3267 ( 2446 2453 ) + 3268 ( 2454 2455 ) + 3269 ( 2455 2451 ) + 3270 ( 2454 2450 ) + 3271 ( 2442 2456 ) + 3272 ( 2386 2456 ) + 3273 ( 2452 2457 ) + 3274 ( 2457 2458 ) + 3275 ( 2458 2459 ) + 3276 ( 2459 2453 ) + 3277 ( 2460 2444 ) + 3278 ( 2445 2461 ) + 3279 ( 2461 2460 ) + 3280 ( 2449 2462 ) + 3281 ( 2462 2463 ) + 3282 ( 2450 2463 ) + 3283 ( 2463 2464 ) + 3284 ( 2464 2454 ) + 3285 ( 2465 2466 ) + 3286 ( 2467 2465 ) + 3287 ( 2468 2467 ) + 3288 ( 2469 2468 ) + 3289 ( 2469 2470 ) + 3290 ( 2470 2466 ) + 3291 ( 2471 2472 ) + 3292 ( 2471 2468 ) + 3293 ( 2472 2467 ) + 3294 ( 2473 2465 ) + 3295 ( 2473 2474 ) + 3296 ( 2472 2474 ) + 3297 ( 2466 2475 ) + 3298 ( 2476 2470 ) + 3299 ( 2475 2476 ) + 3300 ( 2477 2478 ) + 3301 ( 2478 2479 ) + 3302 ( 2479 2480 ) + 3303 ( 2480 2477 ) + 3304 ( 2479 2481 ) + 3305 ( 2482 2481 ) + 3306 ( 2482 2480 ) + 3307 ( 2483 2477 ) + 3308 ( 2484 2482 ) + 3309 ( 2484 2485 ) + 3310 ( 2486 2485 ) + 3311 ( 2483 2486 ) + 3312 ( 2487 2488 ) + 3313 ( 2489 2487 ) + 3314 ( 2490 2489 ) + 3315 ( 2490 2488 ) + 3316 ( 2487 2491 ) + 3317 ( 2492 2491 ) + 3318 ( 2492 2489 ) + 3319 ( 2491 2493 ) + 3320 ( 2494 2493 ) + 3321 ( 2494 2492 ) + 3322 ( 2495 2359 ) + 3323 ( 2496 2495 ) + 3324 ( 2361 2496 ) + 3325 ( 2495 2497 ) + 3326 ( 2498 2497 ) + 3327 ( 2496 2498 ) + 3328 ( 2497 2499 ) + 3329 ( 2499 2500 ) + 3330 ( 2498 2500 ) + 3331 ( 2501 1206 ) + 3332 ( 2501 2502 ) + 3333 ( 2502 2503 ) + 3334 ( 1213 2503 ) + 3335 ( 2504 2505 ) + 3336 ( 2506 2505 ) + 3337 ( 2507 2506 ) + 3338 ( 2507 2508 ) + 3339 ( 2504 2508 ) + 3340 ( 2509 2508 ) + 3341 ( 2510 2509 ) + 3342 ( 2510 2511 ) + 3343 ( 2511 2504 ) + 3344 ( 2501 2512 ) + 3345 ( 2513 2512 ) + 3346 ( 2514 2513 ) + 3347 ( 2502 2514 ) + 3348 ( 2512 2515 ) + 3349 ( 2515 2516 ) + 3350 ( 2513 2516 ) + 3351 ( 2517 2506 ) + 3352 ( 2505 2518 ) + 3353 ( 2517 2518 ) + 3354 ( 1214 2519 ) + 3355 ( 2503 2520 ) + 3356 ( 2520 2519 ) + 3357 ( 2521 2522 ) + 3358 ( 2522 2523 ) + 3359 ( 2523 2524 ) + 3360 ( 2524 1214 ) + 3361 ( 2519 2521 ) + 3362 ( 2514 2520 ) + 3363 ( 2525 2526 ) + 3364 ( 2527 2525 ) + 3365 ( 2528 2527 ) + 3366 ( 2528 2526 ) + 3367 ( 2509 2529 ) + 3368 ( 2525 2508 ) + 3369 ( 2526 2529 ) + 3370 ( 2530 2528 ) + 3371 ( 2531 2530 ) + 3372 ( 2529 2531 ) + 3373 ( 1147 2532 ) + 3374 ( 2532 2123 ) + 3375 ( 1215 2533 ) + 3376 ( 2533 2534 ) + 3377 ( 2534 1218 ) + 3378 ( 2533 2524 ) + 3379 ( 1787 2535 ) + 3380 ( 2536 2535 ) + 3381 ( 2537 2536 ) + 3382 ( 2538 2537 ) + 3383 ( 1833 2538 ) + 3384 ( 2532 2535 ) + 3385 ( 2465 2012 ) + 3386 ( 2020 2475 ) + 3387 ( 2019 2539 ) + 3388 ( 2539 2473 ) + 3389 ( 2537 2404 ) + 3390 ( 2460 2538 ) + 3391 ( 2411 2540 ) + 3392 ( 2540 2541 ) + 3393 ( 2541 2409 ) + 3394 ( 2542 2543 ) + 3395 ( 2542 2544 ) + 3396 ( 2544 2545 ) + 3397 ( 2545 2546 ) + 3398 ( 2546 2543 ) + 3399 ( 2547 2548 ) + 3400 ( 2547 2546 ) + 3401 ( 2548 2545 ) + 3402 ( 2094 2549 ) + 3403 ( 2549 2550 ) + 3404 ( 2550 2130 ) + 3405 ( 2551 2552 ) + 3406 ( 2552 2553 ) + 3407 ( 2553 2554 ) + 3408 ( 2554 2555 ) + 3409 ( 2555 2551 ) + 3410 ( 2556 2557 ) + 3411 ( 2557 2558 ) + 3412 ( 2559 2558 ) + 3413 ( 2560 2559 ) + 3414 ( 2556 2560 ) + 3415 ( 2315 2560 ) + 3416 ( 2315 2561 ) + 3417 ( 2561 2562 ) + 3418 ( 2563 2562 ) + 3419 ( 2563 2556 ) + 3420 ( 2528 2564 ) + 3421 ( 2565 2527 ) + 3422 ( 2565 2564 ) + 3423 ( 2566 2567 ) + 3424 ( 2567 2568 ) + 3425 ( 2568 2569 ) + 3426 ( 2569 2570 ) + 3427 ( 2570 2571 ) + 3428 ( 2571 2530 ) + 3429 ( 2564 2566 ) + 3430 ( 2136 2572 ) + 3431 ( 2572 2131 ) + 3432 ( 2551 2573 ) + 3433 ( 2573 2574 ) + 3434 ( 2552 2574 ) + 3435 ( 2574 2575 ) + 3436 ( 2575 2553 ) + 3437 ( 2576 2577 ) + 3438 ( 2578 2577 ) + 3439 ( 2579 2578 ) + 3440 ( 2576 2579 ) + 3441 ( 2580 2576 ) + 3442 ( 2581 2580 ) + 3443 ( 2581 2582 ) + 3444 ( 2577 2582 ) + 3445 ( 2579 2583 ) + 3446 ( 2583 2584 ) + 3447 ( 2584 2576 ) + 3448 ( 2584 2585 ) + 3449 ( 2585 2586 ) + 3450 ( 2586 2580 ) + 3451 ( 2587 2588 ) + 3452 ( 2544 2588 ) + 3453 ( 2542 2002 ) + 3454 ( 2021 2587 ) + 3455 ( 2589 2590 ) + 3456 ( 2589 2591 ) + 3457 ( 2591 2592 ) + 3458 ( 2592 2593 ) + 3459 ( 2593 2594 ) + 3460 ( 2594 2595 ) + 3461 ( 2595 2590 ) + 3462 ( 2590 2596 ) + 3463 ( 2596 2544 ) + 3464 ( 2588 2589 ) + 3465 ( 2597 2598 ) + 3466 ( 2599 2597 ) + 3467 ( 2600 2599 ) + 3468 ( 2598 2600 ) + 3469 ( 2601 2602 ) + 3470 ( 2603 2601 ) + 3471 ( 2604 2603 ) + 3472 ( 2602 2604 ) + 3473 ( 2605 2606 ) + 3474 ( 2607 2605 ) + 3475 ( 2608 2607 ) + 3476 ( 2606 2608 ) + 3477 ( 2609 2610 ) + 3478 ( 2611 2609 ) + 3479 ( 2612 2611 ) + 3480 ( 2610 2612 ) + 3481 ( 2613 2614 ) + 3482 ( 2610 2613 ) + 3483 ( 2614 2612 ) + 3484 ( 2615 2616 ) + 3485 ( 2617 2615 ) + 3486 ( 2618 2617 ) + 3487 ( 2616 2618 ) + 3488 ( 2619 2620 ) + 3489 ( 2621 2619 ) + 3490 ( 2622 2621 ) + 3491 ( 2620 2622 ) + 3492 ( 2623 2624 ) + 3493 ( 2625 2623 ) + 3494 ( 2625 2626 ) + 3495 ( 2624 2626 ) + 3496 ( 2627 2628 ) + 3497 ( 2627 2629 ) + 3498 ( 2629 2630 ) + 3499 ( 2628 2630 ) + 3500 ( 2631 2632 ) + 3501 ( 2633 2632 ) + 3502 ( 2633 2634 ) + 3503 ( 2631 2634 ) + 3504 ( 2635 2594 ) + 3505 ( 2636 2635 ) + 3506 ( 2636 2637 ) + 3507 ( 2638 2637 ) + 3508 ( 2638 2595 ) + 3509 ( 2639 2615 ) + 3510 ( 2640 2639 ) + 3511 ( 2635 2640 ) + 3512 ( 2605 2594 ) + 3513 ( 2601 2605 ) + 3514 ( 2597 2601 ) + 3515 ( 2623 2597 ) + 3516 ( 2619 2623 ) + 3517 ( 2615 2619 ) + 3518 ( 2636 2640 ) + 3519 ( 2641 2642 ) + 3520 ( 2641 2639 ) + 3521 ( 2615 2642 ) + 3522 ( 2641 2643 ) + 3523 ( 2642 2613 ) + 3524 ( 2643 2613 ) + 3525 ( 2644 2632 ) + 3526 ( 2644 2643 ) + 3527 ( 2613 2632 ) + 3528 ( 2596 2638 ) + 3529 ( 2578 2557 ) + 3530 ( 2579 2556 ) + 3531 ( 2563 2583 ) + 3532 ( 2645 2549 ) + 3533 ( 2645 2095 ) + 3534 ( 2099 2646 ) + 3535 ( 2646 2645 ) + 3536 ( 2476 2587 ) + 3537 ( 2329 2647 ) + 3538 ( 2647 2648 ) + 3539 ( 2648 2330 ) + 3540 ( 2649 2650 ) + 3541 ( 2592 2650 ) + 3542 ( 2649 2591 ) + 3543 ( 2592 2651 ) + 3544 ( 2606 2651 ) + 3545 ( 2606 2593 ) + 3546 ( 2651 2650 ) + 3547 ( 2652 2653 ) + 3548 ( 2652 2614 ) + 3549 ( 2614 2654 ) + 3550 ( 2654 2653 ) + 3551 ( 2651 2653 ) + 3552 ( 2654 2616 ) + 3553 ( 2616 2620 ) + 3554 ( 2620 2624 ) + 3555 ( 2624 2598 ) + 3556 ( 2598 2602 ) + 3557 ( 2602 2606 ) + 3558 ( 2581 2655 ) + 3559 ( 2655 2656 ) + 3560 ( 2656 2582 ) + 3561 ( 2657 2586 ) + 3562 ( 2657 2655 ) + 3563 ( 2658 2659 ) + 3564 ( 2660 2658 ) + 3565 ( 2661 2660 ) + 3566 ( 2659 2661 ) + 3567 ( 2662 2663 ) + 3568 ( 2664 2662 ) + 3569 ( 2665 2664 ) + 3570 ( 2663 2665 ) + 3571 ( 2666 2667 ) + 3572 ( 2666 2668 ) + 3573 ( 2669 2668 ) + 3574 ( 2669 2667 ) + 3575 ( 2670 2671 ) + 3576 ( 2667 2670 ) + 3577 ( 2671 2669 ) + 3578 ( 2672 2673 ) + 3579 ( 2674 2672 ) + 3580 ( 2675 2674 ) + 3581 ( 2673 2675 ) + 3582 ( 2676 2677 ) + 3583 ( 2673 2676 ) + 3584 ( 2677 2675 ) + 3585 ( 2678 2679 ) + 3586 ( 2678 2680 ) + 3587 ( 2681 2680 ) + 3588 ( 2681 2679 ) + 3589 ( 2682 2630 ) + 3590 ( 2682 2683 ) + 3591 ( 2683 2684 ) + 3592 ( 2684 2685 ) + 3593 ( 2685 2628 ) + 3594 ( 2686 2687 ) + 3595 ( 2686 2688 ) + 3596 ( 2688 2689 ) + 3597 ( 2689 2661 ) + 3598 ( 2661 2664 ) + 3599 ( 2664 2666 ) + 3600 ( 2666 2687 ) + 3601 ( 2672 2690 ) + 3602 ( 2691 2690 ) + 3603 ( 2691 2692 ) + 3604 ( 2672 2692 ) + 3605 ( 2687 2678 ) + 3606 ( 2678 2672 ) + 3607 ( 2692 2693 ) + 3608 ( 2693 2686 ) + 3609 ( 2690 2683 ) + 3610 ( 2682 2691 ) + 3611 ( 2694 2652 ) + 3612 ( 2631 2694 ) + 3613 ( 2614 2631 ) + 3614 ( 2695 2688 ) + 3615 ( 2696 2695 ) + 3616 ( 2689 2696 ) + 3617 ( 2693 2697 ) + 3618 ( 2688 2697 ) + 3619 ( 2697 2698 ) + 3620 ( 2695 2698 ) + 3621 ( 2699 2700 ) + 3622 ( 2701 2700 ) + 3623 ( 2701 2668 ) + 3624 ( 2668 2665 ) + 3625 ( 2665 2659 ) + 3626 ( 2659 2699 ) + 3627 ( 2702 2703 ) + 3628 ( 2704 2702 ) + 3629 ( 2704 2674 ) + 3630 ( 2703 2674 ) + 3631 ( 2703 2700 ) + 3632 ( 2674 2680 ) + 3633 ( 2680 2701 ) + 3634 ( 2685 2702 ) + 3635 ( 2684 2704 ) +} +edgeIndex 5050 { + 0 ( -1 ) + 1 ( -2 ) + 2 ( -3 ) + 3 ( 4 ) + 4 ( -5 ) + 5 ( 6 ) + 6 ( 7 ) + 7 ( 8 ) + 8 ( -3 ) + 9 ( -9 ) + 10 ( 10 ) + 11 ( -11 ) + 12 ( -12 ) + 13 ( -13 ) + 14 ( 14 ) + 15 ( 15 ) + 16 ( 16 ) + 17 ( -17 ) + 18 ( -13 ) + 19 ( -18 ) + 20 ( 19 ) + 21 ( 20 ) + 22 ( 21 ) + 23 ( -22 ) + 24 ( -23 ) + 25 ( 24 ) + 26 ( 25 ) + 27 ( 26 ) + 28 ( 27 ) + 29 ( -28 ) + 30 ( 19 ) + 31 ( -29 ) + 32 ( -30 ) + 33 ( 31 ) + 34 ( 20 ) + 35 ( -28 ) + 36 ( -12 ) + 37 ( -32 ) + 38 ( -33 ) + 39 ( -34 ) + 40 ( -35 ) + 41 ( -18 ) + 42 ( -35 ) + 43 ( -36 ) + 44 ( 37 ) + 45 ( 38 ) + 46 ( 39 ) + 47 ( 40 ) + 48 ( 41 ) + 49 ( 42 ) + 50 ( 43 ) + 51 ( 44 ) + 52 ( -45 ) + 53 ( 46 ) + 54 ( -47 ) + 55 ( -48 ) + 56 ( 49 ) + 57 ( -50 ) + 58 ( -48 ) + 59 ( -51 ) + 60 ( 52 ) + 61 ( 53 ) + 62 ( 54 ) + 63 ( 55 ) + 64 ( 56 ) + 65 ( 57 ) + 66 ( 58 ) + 67 ( -59 ) + 68 ( -60 ) + 69 ( -61 ) + 70 ( 62 ) + 71 ( 53 ) + 72 ( -63 ) + 73 ( 64 ) + 74 ( 65 ) + 75 ( 66 ) + 76 ( 67 ) + 77 ( 68 ) + 78 ( 69 ) + 79 ( -70 ) + 80 ( -71 ) + 81 ( 39 ) + 82 ( 72 ) + 83 ( 73 ) + 84 ( 74 ) + 85 ( 75 ) + 86 ( 76 ) + 87 ( 77 ) + 88 ( 78 ) + 89 ( 79 ) + 90 ( 80 ) + 91 ( 81 ) + 92 ( 82 ) + 93 ( -83 ) + 94 ( -84 ) + 95 ( -85 ) + 96 ( 74 ) + 97 ( -86 ) + 98 ( -84 ) + 99 ( -87 ) + 100 ( -88 ) + 101 ( -89 ) + 102 ( 90 ) + 103 ( 91 ) + 104 ( 92 ) + 105 ( -93 ) + 106 ( 94 ) + 107 ( 95 ) + 108 ( 96 ) + 109 ( 97 ) + 110 ( -98 ) + 111 ( -99 ) + 112 ( 100 ) + 113 ( -101 ) + 114 ( -102 ) + 115 ( -103 ) + 116 ( 104 ) + 117 ( -105 ) + 118 ( 106 ) + 119 ( 97 ) + 120 ( 107 ) + 121 ( 108 ) + 122 ( -109 ) + 123 ( -110 ) + 124 ( 111 ) + 125 ( -112 ) + 126 ( 107 ) + 127 ( 96 ) + 128 ( 95 ) + 129 ( 113 ) + 130 ( -114 ) + 131 ( 115 ) + 132 ( 116 ) + 133 ( 117 ) + 134 ( 116 ) + 135 ( 118 ) + 136 ( 119 ) + 137 ( 120 ) + 138 ( 121 ) + 139 ( 122 ) + 140 ( 123 ) + 141 ( -32 ) + 142 ( -11 ) + 143 ( 124 ) + 144 ( -102 ) + 145 ( 125 ) + 146 ( 126 ) + 147 ( 127 ) + 148 ( 128 ) + 149 ( 129 ) + 150 ( 130 ) + 151 ( 131 ) + 152 ( -132 ) + 153 ( 133 ) + 154 ( -103 ) + 155 ( 131 ) + 156 ( -134 ) + 157 ( -135 ) + 158 ( -134 ) + 159 ( 130 ) + 160 ( -136 ) + 161 ( -137 ) + 162 ( -138 ) + 163 ( -139 ) + 164 ( -140 ) + 165 ( 141 ) + 166 ( 142 ) + 167 ( 127 ) + 168 ( 143 ) + 169 ( 144 ) + 170 ( 126 ) + 171 ( -145 ) + 172 ( -146 ) + 173 ( -147 ) + 174 ( 148 ) + 175 ( -149 ) + 176 ( 121 ) + 177 ( -149 ) + 178 ( 150 ) + 179 ( 151 ) + 180 ( 122 ) + 181 ( 152 ) + 182 ( 153 ) + 183 ( 154 ) + 184 ( 155 ) + 185 ( -132 ) + 186 ( -135 ) + 187 ( 129 ) + 188 ( 156 ) + 189 ( 141 ) + 190 ( 142 ) + 191 ( 156 ) + 192 ( 128 ) + 193 ( -157 ) + 194 ( -158 ) + 195 ( 81 ) + 196 ( -159 ) + 197 ( 160 ) + 198 ( -161 ) + 199 ( 77 ) + 200 ( 162 ) + 201 ( 79 ) + 202 ( 163 ) + 203 ( 164 ) + 204 ( -165 ) + 205 ( -166 ) + 206 ( 167 ) + 207 ( 168 ) + 208 ( 169 ) + 209 ( 170 ) + 210 ( 171 ) + 211 ( 172 ) + 212 ( -173 ) + 213 ( -174 ) + 214 ( 172 ) + 215 ( 175 ) + 216 ( 176 ) + 217 ( -177 ) + 218 ( 148 ) + 219 ( 178 ) + 220 ( 179 ) + 221 ( -180 ) + 222 ( 150 ) + 223 ( -177 ) + 224 ( 181 ) + 225 ( 182 ) + 226 ( 183 ) + 227 ( -184 ) + 228 ( -146 ) + 229 ( -185 ) + 230 ( -186 ) + 231 ( 187 ) + 232 ( -188 ) + 233 ( -189 ) + 234 ( -190 ) + 235 ( 191 ) + 236 ( -192 ) + 237 ( -193 ) + 238 ( -192 ) + 239 ( 194 ) + 240 ( 195 ) + 241 ( 196 ) + 242 ( 197 ) + 243 ( -198 ) + 244 ( 194 ) + 245 ( 191 ) + 246 ( -199 ) + 247 ( 200 ) + 248 ( -201 ) + 249 ( 196 ) + 250 ( -190 ) + 251 ( -202 ) + 252 ( 203 ) + 253 ( -204 ) + 254 ( 205 ) + 255 ( -206 ) + 256 ( 205 ) + 257 ( 207 ) + 258 ( 208 ) + 259 ( -209 ) + 260 ( 210 ) + 261 ( -211 ) + 262 ( -212 ) + 263 ( 213 ) + 264 ( -214 ) + 265 ( 215 ) + 266 ( 216 ) + 267 ( 217 ) + 268 ( -218 ) + 269 ( 215 ) + 270 ( 216 ) + 271 ( -214 ) + 272 ( 219 ) + 273 ( 220 ) + 274 ( 221 ) + 275 ( 222 ) + 276 ( 223 ) + 277 ( 224 ) + 278 ( 225 ) + 279 ( 226 ) + 280 ( 227 ) + 281 ( 228 ) + 282 ( 229 ) + 283 ( 230 ) + 284 ( -212 ) + 285 ( -218 ) + 286 ( -209 ) + 287 ( 231 ) + 288 ( -232 ) + 289 ( 233 ) + 290 ( 234 ) + 291 ( 235 ) + 292 ( -236 ) + 293 ( 237 ) + 294 ( -238 ) + 295 ( -239 ) + 296 ( 240 ) + 297 ( -238 ) + 298 ( 241 ) + 299 ( 242 ) + 300 ( 243 ) + 301 ( 241 ) + 302 ( 237 ) + 303 ( 244 ) + 304 ( -245 ) + 305 ( -246 ) + 306 ( 244 ) + 307 ( -236 ) + 308 ( 247 ) + 309 ( -248 ) + 310 ( -249 ) + 311 ( 247 ) + 312 ( 235 ) + 313 ( 240 ) + 314 ( 250 ) + 315 ( -251 ) + 316 ( -211 ) + 317 ( -252 ) + 318 ( 253 ) + 319 ( 254 ) + 320 ( -255 ) + 321 ( 256 ) + 322 ( -257 ) + 323 ( -258 ) + 324 ( 259 ) + 325 ( -257 ) + 326 ( 260 ) + 327 ( 261 ) + 328 ( 262 ) + 329 ( 260 ) + 330 ( 256 ) + 331 ( 263 ) + 332 ( 264 ) + 333 ( -265 ) + 334 ( 263 ) + 335 ( -255 ) + 336 ( 266 ) + 337 ( 267 ) + 338 ( 268 ) + 339 ( 266 ) + 340 ( 254 ) + 341 ( 259 ) + 342 ( 269 ) + 343 ( -270 ) + 344 ( 271 ) + 345 ( 272 ) + 346 ( 273 ) + 347 ( -274 ) + 348 ( 273 ) + 349 ( -275 ) + 350 ( -276 ) + 351 ( -277 ) + 352 ( -278 ) + 353 ( -279 ) + 354 ( -280 ) + 355 ( -281 ) + 356 ( 282 ) + 357 ( -283 ) + 358 ( 284 ) + 359 ( -285 ) + 360 ( -286 ) + 361 ( -280 ) + 362 ( 287 ) + 363 ( 288 ) + 364 ( 282 ) + 365 ( -289 ) + 366 ( -290 ) + 367 ( 253 ) + 368 ( -291 ) + 369 ( 233 ) + 370 ( -292 ) + 371 ( -293 ) + 372 ( -294 ) + 373 ( -295 ) + 374 ( 271 ) + 375 ( -294 ) + 376 ( -296 ) + 377 ( -276 ) + 378 ( 297 ) + 379 ( -279 ) + 380 ( 298 ) + 381 ( 299 ) + 382 ( -300 ) + 383 ( -283 ) + 384 ( -300 ) + 385 ( 301 ) + 386 ( 302 ) + 387 ( 288 ) + 388 ( 303 ) + 389 ( -304 ) + 390 ( 298 ) + 391 ( -139 ) + 392 ( 305 ) + 393 ( 306 ) + 394 ( -307 ) + 395 ( -308 ) + 396 ( -309 ) + 397 ( -310 ) + 398 ( -311 ) + 399 ( -312 ) + 400 ( 313 ) + 401 ( -314 ) + 402 ( -315 ) + 403 ( 316 ) + 404 ( 317 ) + 405 ( -318 ) + 406 ( 319 ) + 407 ( 231 ) + 408 ( 208 ) + 409 ( 320 ) + 410 ( -321 ) + 411 ( -322 ) + 412 ( -323 ) + 413 ( -318 ) + 414 ( 153 ) + 415 ( -324 ) + 416 ( -325 ) + 417 ( -326 ) + 418 ( -327 ) + 419 ( -328 ) + 420 ( -329 ) + 421 ( 154 ) + 422 ( -329 ) + 423 ( 330 ) + 424 ( -331 ) + 425 ( -140 ) + 426 ( -312 ) + 427 ( -332 ) + 428 ( -324 ) + 429 ( 152 ) + 430 ( 316 ) + 431 ( -333 ) + 432 ( -326 ) + 433 ( -334 ) + 434 ( 230 ) + 435 ( 335 ) + 436 ( 219 ) + 437 ( 213 ) + 438 ( -336 ) + 439 ( 337 ) + 440 ( 338 ) + 441 ( -339 ) + 442 ( 340 ) + 443 ( 341 ) + 444 ( -342 ) + 445 ( 343 ) + 446 ( 344 ) + 447 ( 345 ) + 448 ( -346 ) + 449 ( 347 ) + 450 ( 348 ) + 451 ( 349 ) + 452 ( -350 ) + 453 ( -351 ) + 454 ( -352 ) + 455 ( 353 ) + 456 ( -354 ) + 457 ( -355 ) + 458 ( -356 ) + 459 ( -357 ) + 460 ( 358 ) + 461 ( -359 ) + 462 ( 360 ) + 463 ( -361 ) + 464 ( -362 ) + 465 ( -363 ) + 466 ( -361 ) + 467 ( -364 ) + 468 ( 365 ) + 469 ( -362 ) + 470 ( 366 ) + 471 ( -342 ) + 472 ( 367 ) + 473 ( -368 ) + 474 ( -369 ) + 475 ( -370 ) + 476 ( -371 ) + 477 ( -372 ) + 478 ( 373 ) + 479 ( -374 ) + 480 ( -369 ) + 481 ( -375 ) + 482 ( -376 ) + 483 ( -377 ) + 484 ( 378 ) + 485 ( 365 ) + 486 ( -379 ) + 487 ( -380 ) + 488 ( -381 ) + 489 ( -382 ) + 490 ( -383 ) + 491 ( -384 ) + 492 ( -385 ) + 493 ( -386 ) + 494 ( -387 ) + 495 ( 378 ) + 496 ( -388 ) + 497 ( -389 ) + 498 ( 360 ) + 499 ( -390 ) + 500 ( -391 ) + 501 ( -392 ) + 502 ( -391 ) + 503 ( -393 ) + 504 ( -376 ) + 505 ( -394 ) + 506 ( 395 ) + 507 ( 396 ) + 508 ( -397 ) + 509 ( -382 ) + 510 ( -398 ) + 511 ( -399 ) + 512 ( -400 ) + 513 ( 401 ) + 514 ( 402 ) + 515 ( 403 ) + 516 ( 404 ) + 517 ( 405 ) + 518 ( 406 ) + 519 ( -407 ) + 520 ( -408 ) + 521 ( -409 ) + 522 ( 410 ) + 523 ( 411 ) + 524 ( -398 ) + 525 ( 412 ) + 526 ( -407 ) + 527 ( -413 ) + 528 ( -414 ) + 529 ( -415 ) + 530 ( -346 ) + 531 ( -416 ) + 532 ( 402 ) + 533 ( -417 ) + 534 ( -418 ) + 535 ( -419 ) + 536 ( -418 ) + 537 ( -420 ) + 538 ( -414 ) + 539 ( -421 ) + 540 ( 422 ) + 541 ( -423 ) + 542 ( 424 ) + 543 ( 424 ) + 544 ( 425 ) + 545 ( 406 ) + 546 ( 426 ) + 547 ( 427 ) + 548 ( 428 ) + 549 ( 429 ) + 550 ( 430 ) + 551 ( 431 ) + 552 ( -432 ) + 553 ( 433 ) + 554 ( 434 ) + 555 ( 435 ) + 556 ( 436 ) + 557 ( 437 ) + 558 ( 438 ) + 559 ( -439 ) + 560 ( 430 ) + 561 ( 440 ) + 562 ( 396 ) + 563 ( -441 ) + 564 ( 442 ) + 565 ( 438 ) + 566 ( 443 ) + 567 ( -444 ) + 568 ( -445 ) + 569 ( -446 ) + 570 ( 443 ) + 571 ( 437 ) + 572 ( 447 ) + 573 ( -448 ) + 574 ( 449 ) + 575 ( -432 ) + 576 ( -450 ) + 577 ( 434 ) + 578 ( -451 ) + 579 ( 452 ) + 580 ( -453 ) + 581 ( -454 ) + 582 ( 455 ) + 583 ( 456 ) + 584 ( 457 ) + 585 ( 458 ) + 586 ( 459 ) + 587 ( 460 ) + 588 ( -461 ) + 589 ( 462 ) + 590 ( 463 ) + 591 ( 455 ) + 592 ( 464 ) + 593 ( 465 ) + 594 ( 457 ) + 595 ( 466 ) + 596 ( 467 ) + 597 ( 468 ) + 598 ( 459 ) + 599 ( 469 ) + 600 ( -470 ) + 601 ( -471 ) + 602 ( -472 ) + 603 ( -473 ) + 604 ( -474 ) + 605 ( -475 ) + 606 ( -476 ) + 607 ( -477 ) + 608 ( -478 ) + 609 ( -475 ) + 610 ( 479 ) + 611 ( -480 ) + 612 ( 435 ) + 613 ( -450 ) + 614 ( -481 ) + 615 ( -482 ) + 616 ( 483 ) + 617 ( 483 ) + 618 ( 484 ) + 619 ( 485 ) + 620 ( 486 ) + 621 ( -471 ) + 622 ( 487 ) + 623 ( 488 ) + 624 ( -489 ) + 625 ( -490 ) + 626 ( 491 ) + 627 ( -482 ) + 628 ( 492 ) + 629 ( -493 ) + 630 ( 484 ) + 631 ( 494 ) + 632 ( -472 ) + 633 ( 486 ) + 634 ( -495 ) + 635 ( -470 ) + 636 ( -478 ) + 637 ( -496 ) + 638 ( -497 ) + 639 ( 498 ) + 640 ( -497 ) + 641 ( 499 ) + 642 ( -500 ) + 643 ( -501 ) + 644 ( 502 ) + 645 ( -501 ) + 646 ( -503 ) + 647 ( 504 ) + 648 ( 505 ) + 649 ( 506 ) + 650 ( 507 ) + 651 ( -508 ) + 652 ( -509 ) + 653 ( -510 ) + 654 ( -511 ) + 655 ( 512 ) + 656 ( -509 ) + 657 ( 513 ) + 658 ( 514 ) + 659 ( -515 ) + 660 ( -516 ) + 661 ( -508 ) + 662 ( 517 ) + 663 ( 518 ) + 664 ( 513 ) + 665 ( -516 ) + 666 ( -519 ) + 667 ( 520 ) + 668 ( 521 ) + 669 ( 517 ) + 670 ( -511 ) + 671 ( -522 ) + 672 ( 523 ) + 673 ( 524 ) + 674 ( 525 ) + 675 ( 526 ) + 676 ( 527 ) + 677 ( 528 ) + 678 ( 529 ) + 679 ( -530 ) + 680 ( 531 ) + 681 ( 526 ) + 682 ( 532 ) + 683 ( -533 ) + 684 ( -534 ) + 685 ( 535 ) + 686 ( -536 ) + 687 ( -530 ) + 688 ( -537 ) + 689 ( -533 ) + 690 ( -538 ) + 691 ( -510 ) + 692 ( 528 ) + 693 ( -539 ) + 694 ( 540 ) + 695 ( -541 ) + 696 ( -542 ) + 697 ( -543 ) + 698 ( -544 ) + 699 ( 524 ) + 700 ( -545 ) + 701 ( -546 ) + 702 ( 506 ) + 703 ( -547 ) + 704 ( -548 ) + 705 ( 505 ) + 706 ( 549 ) + 707 ( 550 ) + 708 ( 551 ) + 709 ( -547 ) + 710 ( -552 ) + 711 ( -553 ) + 712 ( -554 ) + 713 ( -548 ) + 714 ( 551 ) + 715 ( -555 ) + 716 ( -556 ) + 717 ( -552 ) + 718 ( 550 ) + 719 ( 557 ) + 720 ( 558 ) + 721 ( -559 ) + 722 ( 338 ) + 723 ( 560 ) + 724 ( -561 ) + 725 ( 562 ) + 726 ( -563 ) + 727 ( -564 ) + 728 ( 565 ) + 729 ( 566 ) + 730 ( 567 ) + 731 ( 557 ) + 732 ( 562 ) + 733 ( -561 ) + 734 ( 568 ) + 735 ( 569 ) + 736 ( 570 ) + 737 ( 571 ) + 738 ( -572 ) + 739 ( -573 ) + 740 ( 574 ) + 741 ( -545 ) + 742 ( -575 ) + 743 ( -576 ) + 744 ( -575 ) + 745 ( -554 ) + 746 ( -577 ) + 747 ( -578 ) + 748 ( -579 ) + 749 ( -580 ) + 750 ( -581 ) + 751 ( -582 ) + 752 ( -583 ) + 753 ( -582 ) + 754 ( -584 ) + 755 ( 585 ) + 756 ( -586 ) + 757 ( -587 ) + 758 ( -588 ) + 759 ( -589 ) + 760 ( -586 ) + 761 ( -590 ) + 762 ( -591 ) + 763 ( -583 ) + 764 ( -587 ) + 765 ( -589 ) + 766 ( -588 ) + 767 ( 592 ) + 768 ( -593 ) + 769 ( -594 ) + 770 ( 595 ) + 771 ( -596 ) + 772 ( -597 ) + 773 ( 598 ) + 774 ( -599 ) + 775 ( -600 ) + 776 ( -601 ) + 777 ( -602 ) + 778 ( 603 ) + 779 ( -597 ) + 780 ( 488 ) + 781 ( -604 ) + 782 ( -605 ) + 783 ( -606 ) + 784 ( 607 ) + 785 ( -606 ) + 786 ( 608 ) + 787 ( 609 ) + 788 ( 610 ) + 789 ( -611 ) + 790 ( 612 ) + 791 ( 613 ) + 792 ( 614 ) + 793 ( 615 ) + 794 ( 616 ) + 795 ( -617 ) + 796 ( 618 ) + 797 ( 619 ) + 798 ( -620 ) + 799 ( 621 ) + 800 ( -445 ) + 801 ( 622 ) + 802 ( -623 ) + 803 ( 624 ) + 804 ( -620 ) + 805 ( -625 ) + 806 ( -626 ) + 807 ( -627 ) + 808 ( 628 ) + 809 ( 629 ) + 810 ( -630 ) + 811 ( 631 ) + 812 ( -632 ) + 813 ( 633 ) + 814 ( 634 ) + 815 ( 635 ) + 816 ( -630 ) + 817 ( 636 ) + 818 ( -637 ) + 819 ( -638 ) + 820 ( 628 ) + 821 ( -639 ) + 822 ( -640 ) + 823 ( -641 ) + 824 ( 642 ) + 825 ( -643 ) + 826 ( -644 ) + 827 ( 645 ) + 828 ( 646 ) + 829 ( -647 ) + 830 ( 648 ) + 831 ( 649 ) + 832 ( 615 ) + 833 ( 650 ) + 834 ( -651 ) + 835 ( 422 ) + 836 ( -652 ) + 837 ( -653 ) + 838 ( -641 ) + 839 ( -654 ) + 840 ( -653 ) + 841 ( -655 ) + 842 ( 560 ) + 843 ( 337 ) + 844 ( 656 ) + 845 ( -657 ) + 846 ( 568 ) + 847 ( 658 ) + 848 ( 569 ) + 849 ( -657 ) + 850 ( -659 ) + 851 ( -660 ) + 852 ( 661 ) + 853 ( 631 ) + 854 ( -662 ) + 855 ( -663 ) + 856 ( 635 ) + 857 ( 664 ) + 858 ( -665 ) + 859 ( -662 ) + 860 ( 666 ) + 861 ( -667 ) + 862 ( 668 ) + 863 ( 669 ) + 864 ( 670 ) + 865 ( 671 ) + 866 ( 672 ) + 867 ( 673 ) + 868 ( -674 ) + 869 ( 669 ) + 870 ( -675 ) + 871 ( -676 ) + 872 ( 677 ) + 873 ( -678 ) + 874 ( 679 ) + 875 ( 680 ) + 876 ( -681 ) + 877 ( 672 ) + 878 ( -682 ) + 879 ( -683 ) + 880 ( 677 ) + 881 ( 671 ) + 882 ( -684 ) + 883 ( -685 ) + 884 ( 679 ) + 885 ( 686 ) + 886 ( 687 ) + 887 ( -683 ) + 888 ( -688 ) + 889 ( -689 ) + 890 ( 686 ) + 891 ( -678 ) + 892 ( -590 ) + 893 ( 585 ) + 894 ( -690 ) + 895 ( -691 ) + 896 ( -692 ) + 897 ( -693 ) + 898 ( -694 ) + 899 ( 695 ) + 900 ( -696 ) + 901 ( -697 ) + 902 ( 592 ) + 903 ( -698 ) + 904 ( 58 ) + 905 ( -699 ) + 906 ( 695 ) + 907 ( -700 ) + 908 ( 64 ) + 909 ( 701 ) + 910 ( -702 ) + 911 ( -2 ) + 912 ( -703 ) + 913 ( -704 ) + 914 ( -705 ) + 915 ( 706 ) + 916 ( -704 ) + 917 ( 707 ) + 918 ( 708 ) + 919 ( -709 ) + 920 ( -5 ) + 921 ( -705 ) + 922 ( 706 ) + 923 ( -710 ) + 924 ( -711 ) + 925 ( -712 ) + 926 ( 713 ) + 927 ( -714 ) + 928 ( 715 ) + 929 ( 716 ) + 930 ( 717 ) + 931 ( -718 ) + 932 ( 719 ) + 933 ( 720 ) + 934 ( -712 ) + 935 ( 721 ) + 936 ( -714 ) + 937 ( 722 ) + 938 ( 723 ) + 939 ( -724 ) + 940 ( 725 ) + 941 ( 726 ) + 942 ( -727 ) + 943 ( -23 ) + 944 ( -728 ) + 945 ( 729 ) + 946 ( 730 ) + 947 ( 731 ) + 948 ( -732 ) + 949 ( 733 ) + 950 ( -734 ) + 951 ( 720 ) + 952 ( -735 ) + 953 ( 722 ) + 954 ( 713 ) + 955 ( -728 ) + 956 ( -22 ) + 957 ( 736 ) + 958 ( -737 ) + 959 ( -738 ) + 960 ( -739 ) + 961 ( -740 ) + 962 ( -741 ) + 963 ( 742 ) + 964 ( -743 ) + 965 ( -740 ) + 966 ( -744 ) + 967 ( 745 ) + 968 ( 746 ) + 969 ( 747 ) + 970 ( 748 ) + 971 ( -744 ) + 972 ( -739 ) + 973 ( -749 ) + 974 ( 750 ) + 975 ( 751 ) + 976 ( -752 ) + 977 ( 753 ) + 978 ( -754 ) + 979 ( -749 ) + 980 ( -738 ) + 981 ( 755 ) + 982 ( 756 ) + 983 ( 757 ) + 984 ( 758 ) + 985 ( 759 ) + 986 ( -760 ) + 987 ( 755 ) + 988 ( -737 ) + 989 ( -761 ) + 990 ( -761 ) + 991 ( -743 ) + 992 ( 762 ) + 993 ( 763 ) + 994 ( 764 ) + 995 ( 765 ) + 996 ( 766 ) + 997 ( -767 ) + 998 ( 768 ) + 999 ( 769 ) + 1000 ( 770 ) + 1001 ( -771 ) + 1002 ( -772 ) + 1003 ( -773 ) + 1004 ( 766 ) + 1005 ( 774 ) + 1006 ( -775 ) + 1007 ( 774 ) + 1008 ( -771 ) + 1009 ( 776 ) + 1010 ( 777 ) + 1011 ( 778 ) + 1012 ( -779 ) + 1013 ( 780 ) + 1014 ( -781 ) + 1015 ( 770 ) + 1016 ( 782 ) + 1017 ( -783 ) + 1018 ( -784 ) + 1019 ( 785 ) + 1020 ( 776 ) + 1021 ( 725 ) + 1022 ( 786 ) + 1023 ( -787 ) + 1024 ( 788 ) + 1025 ( -789 ) + 1026 ( 790 ) + 1027 ( -791 ) + 1028 ( -772 ) + 1029 ( 792 ) + 1030 ( -793 ) + 1031 ( 715 ) + 1032 ( -794 ) + 1033 ( -795 ) + 1034 ( 726 ) + 1035 ( -789 ) + 1036 ( -796 ) + 1037 ( -794 ) + 1038 ( 717 ) + 1039 ( 797 ) + 1040 ( -798 ) + 1041 ( 721 ) + 1042 ( -798 ) + 1043 ( 799 ) + 1044 ( -800 ) + 1045 ( -801 ) + 1046 ( -767 ) + 1047 ( -802 ) + 1048 ( -803 ) + 1049 ( -802 ) + 1050 ( -773 ) + 1051 ( -791 ) + 1052 ( 769 ) + 1053 ( 804 ) + 1054 ( 782 ) + 1055 ( 805 ) + 1056 ( 806 ) + 1057 ( 807 ) + 1058 ( 808 ) + 1059 ( 55 ) + 1060 ( 809 ) + 1061 ( 810 ) + 1062 ( 809 ) + 1063 ( 54 ) + 1064 ( -63 ) + 1065 ( 811 ) + 1066 ( 812 ) + 1067 ( 813 ) + 1068 ( 810 ) + 1069 ( 811 ) + 1070 ( 701 ) + 1071 ( -814 ) + 1072 ( 815 ) + 1073 ( 816 ) + 1074 ( 817 ) + 1075 ( -732 ) + 1076 ( 818 ) + 1077 ( 806 ) + 1078 ( 819 ) + 1079 ( -820 ) + 1080 ( 821 ) + 1081 ( 812 ) + 1082 ( 680 ) + 1083 ( 822 ) + 1084 ( 823 ) + 1085 ( 824 ) + 1086 ( 825 ) + 1087 ( 826 ) + 1088 ( 826 ) + 1089 ( 827 ) + 1090 ( 828 ) + 1091 ( -820 ) + 1092 ( 829 ) + 1093 ( -685 ) + 1094 ( 830 ) + 1095 ( 827 ) + 1096 ( 825 ) + 1097 ( 831 ) + 1098 ( -681 ) + 1099 ( 673 ) + 1100 ( 832 ) + 1101 ( -734 ) + 1102 ( 833 ) + 1103 ( 822 ) + 1104 ( -47 ) + 1105 ( 834 ) + 1106 ( -835 ) + 1107 ( 836 ) + 1108 ( 837 ) + 1109 ( -838 ) + 1110 ( 839 ) + 1111 ( -835 ) + 1112 ( 840 ) + 1113 ( -841 ) + 1114 ( 842 ) + 1115 ( -51 ) + 1116 ( 836 ) + 1117 ( 839 ) + 1118 ( 843 ) + 1119 ( 670 ) + 1120 ( 844 ) + 1121 ( 845 ) + 1122 ( 846 ) + 1123 ( 847 ) + 1124 ( 807 ) + 1125 ( 818 ) + 1126 ( 731 ) + 1127 ( 832 ) + 1128 ( -674 ) + 1129 ( 845 ) + 1130 ( 848 ) + 1131 ( 849 ) + 1132 ( 850 ) + 1133 ( -851 ) + 1134 ( 852 ) + 1135 ( 853 ) + 1136 ( 854 ) + 1137 ( 855 ) + 1138 ( -856 ) + 1139 ( 857 ) + 1140 ( 68 ) + 1141 ( 858 ) + 1142 ( 854 ) + 1143 ( -89 ) + 1144 ( 859 ) + 1145 ( -856 ) + 1146 ( -860 ) + 1147 ( -861 ) + 1148 ( 862 ) + 1149 ( 863 ) + 1150 ( 852 ) + 1151 ( -864 ) + 1152 ( -409 ) + 1153 ( 865 ) + 1154 ( 862 ) + 1155 ( -866 ) + 1156 ( 867 ) + 1157 ( 868 ) + 1158 ( 869 ) + 1159 ( 870 ) + 1160 ( 871 ) + 1161 ( 872 ) + 1162 ( 873 ) + 1163 ( -874 ) + 1164 ( -861 ) + 1165 ( -851 ) + 1166 ( -88 ) + 1167 ( 875 ) + 1168 ( -866 ) + 1169 ( 859 ) + 1170 ( 872 ) + 1171 ( -876 ) + 1172 ( -877 ) + 1173 ( 878 ) + 1174 ( 870 ) + 1175 ( -879 ) + 1176 ( -880 ) + 1177 ( 881 ) + 1178 ( 868 ) + 1179 ( 882 ) + 1180 ( 883 ) + 1181 ( 884 ) + 1182 ( 885 ) + 1183 ( 40 ) + 1184 ( -71 ) + 1185 ( 886 ) + 1186 ( 887 ) + 1187 ( 888 ) + 1188 ( -889 ) + 1189 ( 41 ) + 1190 ( 885 ) + 1191 ( 890 ) + 1192 ( 890 ) + 1193 ( 888 ) + 1194 ( 891 ) + 1195 ( -576 ) + 1196 ( -892 ) + 1197 ( -893 ) + 1198 ( -573 ) + 1199 ( 891 ) + 1200 ( 887 ) + 1201 ( 894 ) + 1202 ( 113 ) + 1203 ( 94 ) + 1204 ( -895 ) + 1205 ( -896 ) + 1206 ( -897 ) + 1207 ( 898 ) + 1208 ( -339 ) + 1209 ( -559 ) + 1210 ( -899 ) + 1211 ( -900 ) + 1212 ( 901 ) + 1213 ( 902 ) + 1214 ( 903 ) + 1215 ( 904 ) + 1216 ( 905 ) + 1217 ( -897 ) + 1218 ( 906 ) + 1219 ( 907 ) + 1220 ( 902 ) + 1221 ( 901 ) + 1222 ( 908 ) + 1223 ( 908 ) + 1224 ( -900 ) + 1225 ( 909 ) + 1226 ( 910 ) + 1227 ( 911 ) + 1228 ( 912 ) + 1229 ( -913 ) + 1230 ( 340 ) + 1231 ( 898 ) + 1232 ( 905 ) + 1233 ( -914 ) + 1234 ( 915 ) + 1235 ( 916 ) + 1236 ( 917 ) + 1237 ( -914 ) + 1238 ( 904 ) + 1239 ( -899 ) + 1240 ( 558 ) + 1241 ( 567 ) + 1242 ( -918 ) + 1243 ( 909 ) + 1244 ( 919 ) + 1245 ( 910 ) + 1246 ( -918 ) + 1247 ( 566 ) + 1248 ( -920 ) + 1249 ( -921 ) + 1250 ( -922 ) + 1251 ( -923 ) + 1252 ( -924 ) + 1253 ( -925 ) + 1254 ( -109 ) + 1255 ( -926 ) + 1256 ( -927 ) + 1257 ( -928 ) + 1258 ( -110 ) + 1259 ( -925 ) + 1260 ( -929 ) + 1261 ( 930 ) + 1262 ( 931 ) + 1263 ( 118 ) + 1264 ( 115 ) + 1265 ( 932 ) + 1266 ( 933 ) + 1267 ( 934 ) + 1268 ( 935 ) + 1269 ( 936 ) + 1270 ( 937 ) + 1271 ( 938 ) + 1272 ( -939 ) + 1273 ( 940 ) + 1274 ( -941 ) + 1275 ( -942 ) + 1276 ( -943 ) + 1277 ( -942 ) + 1278 ( -944 ) + 1279 ( -945 ) + 1280 ( 946 ) + 1281 ( -947 ) + 1282 ( -948 ) + 1283 ( -949 ) + 1284 ( -950 ) + 1285 ( -951 ) + 1286 ( 952 ) + 1287 ( 940 ) + 1288 ( -953 ) + 1289 ( -954 ) + 1290 ( -955 ) + 1291 ( -956 ) + 1292 ( -957 ) + 1293 ( 958 ) + 1294 ( -959 ) + 1295 ( -960 ) + 1296 ( -961 ) + 1297 ( -960 ) + 1298 ( -962 ) + 1299 ( 963 ) + 1300 ( 964 ) + 1301 ( -965 ) + 1302 ( -966 ) + 1303 ( 958 ) + 1304 ( -967 ) + 1305 ( 968 ) + 1306 ( 969 ) + 1307 ( 933 ) + 1308 ( 970 ) + 1309 ( 971 ) + 1310 ( -972 ) + 1311 ( -973 ) + 1312 ( 974 ) + 1313 ( -967 ) + 1314 ( 975 ) + 1315 ( -941 ) + 1316 ( -976 ) + 1317 ( -977 ) + 1318 ( 978 ) + 1319 ( 979 ) + 1320 ( 980 ) + 1321 ( 981 ) + 1322 ( -977 ) + 1323 ( 982 ) + 1324 ( -983 ) + 1325 ( -944 ) + 1326 ( 975 ) + 1327 ( 981 ) + 1328 ( -976 ) + 1329 ( 952 ) + 1330 ( -984 ) + 1331 ( 982 ) + 1332 ( -985 ) + 1333 ( -986 ) + 1334 ( -987 ) + 1335 ( 937 ) + 1336 ( -988 ) + 1337 ( -989 ) + 1338 ( 935 ) + 1339 ( -990 ) + 1340 ( 991 ) + 1341 ( 992 ) + 1342 ( 993 ) + 1343 ( 994 ) + 1344 ( 995 ) + 1345 ( 996 ) + 1346 ( 997 ) + 1347 ( 998 ) + 1348 ( -999 ) + 1349 ( 1000 ) + 1350 ( 1001 ) + 1351 ( 1002 ) + 1352 ( 1003 ) + 1353 ( -999 ) + 1354 ( 1004 ) + 1355 ( 1005 ) + 1356 ( -1006 ) + 1357 ( -1007 ) + 1358 ( 1008 ) + 1359 ( 1009 ) + 1360 ( -1010 ) + 1361 ( -1006 ) + 1362 ( 1011 ) + 1363 ( -1012 ) + 1364 ( 994 ) + 1365 ( 1013 ) + 1366 ( 1014 ) + 1367 ( -1015 ) + 1368 ( -1016 ) + 1369 ( 995 ) + 1370 ( -1012 ) + 1371 ( -1017 ) + 1372 ( -1018 ) + 1373 ( 1019 ) + 1374 ( 1013 ) + 1375 ( 993 ) + 1376 ( -1020 ) + 1377 ( 1021 ) + 1378 ( -1022 ) + 1379 ( 1023 ) + 1380 ( 1024 ) + 1381 ( -1025 ) + 1382 ( 1026 ) + 1383 ( -1027 ) + 1384 ( 1028 ) + 1385 ( 1029 ) + 1386 ( 1021 ) + 1387 ( 1030 ) + 1388 ( -1031 ) + 1389 ( 1032 ) + 1390 ( 1033 ) + 1391 ( 1034 ) + 1392 ( 1035 ) + 1393 ( 1036 ) + 1394 ( 1037 ) + 1395 ( 1038 ) + 1396 ( -1031 ) + 1397 ( 1039 ) + 1398 ( -1040 ) + 1399 ( 1023 ) + 1400 ( -1041 ) + 1401 ( 1042 ) + 1402 ( 1042 ) + 1403 ( 1043 ) + 1404 ( 1044 ) + 1405 ( 1045 ) + 1406 ( 1046 ) + 1407 ( 1047 ) + 1408 ( 1034 ) + 1409 ( 1048 ) + 1410 ( 1049 ) + 1411 ( 1050 ) + 1412 ( 1051 ) + 1413 ( 1052 ) + 1414 ( -1025 ) + 1415 ( 1053 ) + 1416 ( 1054 ) + 1417 ( -1055 ) + 1418 ( -1056 ) + 1419 ( -1057 ) + 1420 ( 1058 ) + 1421 ( -1057 ) + 1422 ( -1059 ) + 1423 ( 1060 ) + 1424 ( 1061 ) + 1425 ( -1062 ) + 1426 ( -1063 ) + 1427 ( 1064 ) + 1428 ( 1065 ) + 1429 ( 1061 ) + 1430 ( -1066 ) + 1431 ( -1067 ) + 1432 ( -1055 ) + 1433 ( 1068 ) + 1434 ( -1069 ) + 1435 ( 1070 ) + 1436 ( 1071 ) + 1437 ( -1072 ) + 1438 ( -1073 ) + 1439 ( -1074 ) + 1440 ( 1075 ) + 1441 ( 1076 ) + 1442 ( 1077 ) + 1443 ( 1078 ) + 1444 ( -1067 ) + 1445 ( 1079 ) + 1446 ( -1080 ) + 1447 ( 1081 ) + 1448 ( 1082 ) + 1449 ( 1083 ) + 1450 ( -1084 ) + 1451 ( -1085 ) + 1452 ( -1084 ) + 1453 ( 1086 ) + 1454 ( -1087 ) + 1455 ( 1086 ) + 1456 ( 1083 ) + 1457 ( 1088 ) + 1458 ( -1089 ) + 1459 ( -1090 ) + 1460 ( -1091 ) + 1461 ( 1092 ) + 1462 ( 1082 ) + 1463 ( 1093 ) + 1464 ( 1094 ) + 1465 ( 1088 ) + 1466 ( -1095 ) + 1467 ( -1090 ) + 1468 ( -1096 ) + 1469 ( -1097 ) + 1470 ( -1098 ) + 1471 ( -1099 ) + 1472 ( -1100 ) + 1473 ( -1101 ) + 1474 ( 1102 ) + 1475 ( -1103 ) + 1476 ( 1104 ) + 1477 ( 1105 ) + 1478 ( -1106 ) + 1479 ( -1107 ) + 1480 ( -1108 ) + 1481 ( 1109 ) + 1482 ( 1110 ) + 1483 ( -1111 ) + 1484 ( -1112 ) + 1485 ( -1096 ) + 1486 ( -1113 ) + 1487 ( 1114 ) + 1488 ( -1080 ) + 1489 ( -1115 ) + 1490 ( -1116 ) + 1491 ( -1115 ) + 1492 ( -1085 ) + 1493 ( 1117 ) + 1494 ( -1118 ) + 1495 ( 1119 ) + 1496 ( -1120 ) + 1497 ( -1121 ) + 1498 ( 1122 ) + 1499 ( 1123 ) + 1500 ( 1124 ) + 1501 ( 1125 ) + 1502 ( 1126 ) + 1503 ( -1127 ) + 1504 ( -1121 ) + 1505 ( -1128 ) + 1506 ( -1063 ) + 1507 ( -1129 ) + 1508 ( -1130 ) + 1509 ( 1131 ) + 1510 ( 1132 ) + 1511 ( 1133 ) + 1512 ( 1134 ) + 1513 ( -1062 ) + 1514 ( -1135 ) + 1515 ( -1136 ) + 1516 ( -1129 ) + 1517 ( -1136 ) + 1518 ( -1137 ) + 1519 ( -1138 ) + 1520 ( -1139 ) + 1521 ( 1140 ) + 1522 ( -1130 ) + 1523 ( 1141 ) + 1524 ( 1142 ) + 1525 ( 1131 ) + 1526 ( 1140 ) + 1527 ( 1143 ) + 1528 ( 1144 ) + 1529 ( 1064 ) + 1530 ( 1134 ) + 1531 ( 1145 ) + 1532 ( -1146 ) + 1533 ( -1147 ) + 1534 ( -1148 ) + 1535 ( -1149 ) + 1536 ( -1150 ) + 1537 ( -1151 ) + 1538 ( -1152 ) + 1539 ( -1146 ) + 1540 ( -1153 ) + 1541 ( 1154 ) + 1542 ( 1155 ) + 1543 ( 1119 ) + 1544 ( 1156 ) + 1545 ( -1157 ) + 1546 ( 1158 ) + 1547 ( 1154 ) + 1548 ( 1068 ) + 1549 ( 1054 ) + 1550 ( 1159 ) + 1551 ( 1160 ) + 1552 ( 1161 ) + 1553 ( 1162 ) + 1554 ( 1163 ) + 1555 ( 1164 ) + 1556 ( -1106 ) + 1557 ( -1165 ) + 1558 ( -1166 ) + 1559 ( -1167 ) + 1560 ( -1107 ) + 1561 ( -1167 ) + 1562 ( -1168 ) + 1563 ( -1169 ) + 1564 ( -1120 ) + 1565 ( 1170 ) + 1566 ( 1171 ) + 1567 ( -1172 ) + 1568 ( 1173 ) + 1569 ( -1128 ) + 1570 ( -1172 ) + 1571 ( 1174 ) + 1572 ( -1175 ) + 1573 ( -1150 ) + 1574 ( -1176 ) + 1575 ( 1164 ) + 1576 ( 1159 ) + 1577 ( 1053 ) + 1578 ( 1058 ) + 1579 ( 1065 ) + 1580 ( 1144 ) + 1581 ( 1177 ) + 1582 ( 1178 ) + 1583 ( 1179 ) + 1584 ( 1177 ) + 1585 ( 1143 ) + 1586 ( 1180 ) + 1587 ( 1181 ) + 1588 ( 1178 ) + 1589 ( 1181 ) + 1590 ( 1182 ) + 1591 ( 1183 ) + 1592 ( -1184 ) + 1593 ( -1185 ) + 1594 ( 1186 ) + 1595 ( 1187 ) + 1596 ( 1188 ) + 1597 ( -1135 ) + 1598 ( 1078 ) + 1599 ( -1189 ) + 1600 ( -1190 ) + 1601 ( 1191 ) + 1602 ( -1137 ) + 1603 ( -1190 ) + 1604 ( -1192 ) + 1605 ( 1193 ) + 1606 ( 1194 ) + 1607 ( 1195 ) + 1608 ( 1162 ) + 1609 ( -1196 ) + 1610 ( 1197 ) + 1611 ( 1198 ) + 1612 ( -1199 ) + 1613 ( -1200 ) + 1614 ( -1201 ) + 1615 ( -1202 ) + 1616 ( -1203 ) + 1617 ( -1204 ) + 1618 ( -1205 ) + 1619 ( -1206 ) + 1620 ( -1207 ) + 1621 ( 1208 ) + 1622 ( -1207 ) + 1623 ( 1209 ) + 1624 ( 1210 ) + 1625 ( 1211 ) + 1626 ( -1203 ) + 1627 ( 1212 ) + 1628 ( -1213 ) + 1629 ( -1199 ) + 1630 ( 1214 ) + 1631 ( -1213 ) + 1632 ( 1215 ) + 1633 ( 1216 ) + 1634 ( -1176 ) + 1635 ( -1149 ) + 1636 ( -1217 ) + 1637 ( -453 ) + 1638 ( 1218 ) + 1639 ( 1219 ) + 1640 ( 1220 ) + 1641 ( 1221 ) + 1642 ( 1222 ) + 1643 ( -1223 ) + 1644 ( 1224 ) + 1645 ( 1225 ) + 1646 ( -1226 ) + 1647 ( -1227 ) + 1648 ( -1228 ) + 1649 ( -1228 ) + 1650 ( 1229 ) + 1651 ( 1230 ) + 1652 ( -1231 ) + 1653 ( -1232 ) + 1654 ( -1233 ) + 1655 ( -1234 ) + 1656 ( 1235 ) + 1657 ( 1236 ) + 1658 ( -386 ) + 1659 ( 1237 ) + 1660 ( -1238 ) + 1661 ( 1239 ) + 1662 ( 1240 ) + 1663 ( 1236 ) + 1664 ( 1241 ) + 1665 ( -1242 ) + 1666 ( -1238 ) + 1667 ( 1241 ) + 1668 ( 1235 ) + 1669 ( 1243 ) + 1670 ( 1244 ) + 1671 ( 1210 ) + 1672 ( 1050 ) + 1673 ( -1245 ) + 1674 ( -1246 ) + 1675 ( -1247 ) + 1676 ( 1221 ) + 1677 ( -1248 ) + 1678 ( 1249 ) + 1679 ( 1250 ) + 1680 ( -1251 ) + 1681 ( -1245 ) + 1682 ( -1252 ) + 1683 ( 1222 ) + 1684 ( -1247 ) + 1685 ( 1253 ) + 1686 ( -1254 ) + 1687 ( -1232 ) + 1688 ( -1255 ) + 1689 ( -1226 ) + 1690 ( -1256 ) + 1691 ( 1257 ) + 1692 ( 1258 ) + 1693 ( 1259 ) + 1694 ( 1230 ) + 1695 ( 1260 ) + 1696 ( -1261 ) + 1697 ( -1262 ) + 1698 ( 1263 ) + 1699 ( 1264 ) + 1700 ( 1265 ) + 1701 ( 1266 ) + 1702 ( -1256 ) + 1703 ( 1267 ) + 1704 ( -1262 ) + 1705 ( 1268 ) + 1706 ( -1269 ) + 1707 ( -1270 ) + 1708 ( -1271 ) + 1709 ( -1272 ) + 1710 ( 1265 ) + 1711 ( -1273 ) + 1712 ( -1272 ) + 1713 ( -1274 ) + 1714 ( -1269 ) + 1715 ( -1273 ) + 1716 ( 1264 ) + 1717 ( 1275 ) + 1718 ( 1276 ) + 1719 ( 1277 ) + 1720 ( 1278 ) + 1721 ( 1279 ) + 1722 ( 1280 ) + 1723 ( 1281 ) + 1724 ( -1282 ) + 1725 ( -1283 ) + 1726 ( -1270 ) + 1727 ( 1276 ) + 1728 ( -1284 ) + 1729 ( -1282 ) + 1730 ( -1285 ) + 1731 ( -1286 ) + 1732 ( -1287 ) + 1733 ( -1286 ) + 1734 ( -1288 ) + 1735 ( 1281 ) + 1736 ( -1289 ) + 1737 ( 1224 ) + 1738 ( 1290 ) + 1739 ( -1291 ) + 1740 ( -1292 ) + 1741 ( -1291 ) + 1742 ( 1293 ) + 1743 ( 1280 ) + 1744 ( -1294 ) + 1745 ( -1295 ) + 1746 ( -1296 ) + 1747 ( -1297 ) + 1748 ( -1298 ) + 1749 ( 1299 ) + 1750 ( 1300 ) + 1751 ( 1301 ) + 1752 ( -1302 ) + 1753 ( -1298 ) + 1754 ( 1303 ) + 1755 ( -1304 ) + 1756 ( 1305 ) + 1757 ( 1306 ) + 1758 ( 1307 ) + 1759 ( 1308 ) + 1760 ( 1309 ) + 1761 ( 1310 ) + 1762 ( -1304 ) + 1763 ( 1311 ) + 1764 ( -1312 ) + 1765 ( -1313 ) + 1766 ( -1314 ) + 1767 ( -1315 ) + 1768 ( -1316 ) + 1769 ( 1317 ) + 1770 ( -1313 ) + 1771 ( 1318 ) + 1772 ( -1319 ) + 1773 ( 1309 ) + 1774 ( -1320 ) + 1775 ( 1321 ) + 1776 ( 1322 ) + 1777 ( 1323 ) + 1778 ( 1324 ) + 1779 ( 1325 ) + 1780 ( 1326 ) + 1781 ( 1327 ) + 1782 ( 1328 ) + 1783 ( 1329 ) + 1784 ( 1301 ) + 1785 ( -1330 ) + 1786 ( -1331 ) + 1787 ( -1332 ) + 1788 ( -1333 ) + 1789 ( -1334 ) + 1790 ( -1335 ) + 1791 ( 1336 ) + 1792 ( -1337 ) + 1793 ( 1338 ) + 1794 ( -1330 ) + 1795 ( -1334 ) + 1796 ( -1339 ) + 1797 ( -1340 ) + 1798 ( -1341 ) + 1799 ( 1342 ) + 1800 ( 1343 ) + 1801 ( 1344 ) + 1802 ( 1345 ) + 1803 ( 1346 ) + 1804 ( -1347 ) + 1805 ( 1348 ) + 1806 ( 1349 ) + 1807 ( 1350 ) + 1808 ( 1351 ) + 1809 ( 1352 ) + 1810 ( 1353 ) + 1811 ( -1354 ) + 1812 ( 1322 ) + 1813 ( -1355 ) + 1814 ( 1346 ) + 1815 ( -1354 ) + 1816 ( 1345 ) + 1817 ( -1356 ) + 1818 ( 1323 ) + 1819 ( 1357 ) + 1820 ( -1358 ) + 1821 ( -1359 ) + 1822 ( -1360 ) + 1823 ( -1361 ) + 1824 ( -1360 ) + 1825 ( 1362 ) + 1826 ( -1363 ) + 1827 ( -1364 ) + 1828 ( -1365 ) + 1829 ( -1361 ) + 1830 ( -1364 ) + 1831 ( -1366 ) + 1832 ( -1367 ) + 1833 ( 1362 ) + 1834 ( -1359 ) + 1835 ( -1368 ) + 1836 ( -1369 ) + 1837 ( -1370 ) + 1838 ( -1371 ) + 1839 ( -1372 ) + 1840 ( -1373 ) + 1841 ( 1374 ) + 1842 ( 1375 ) + 1843 ( 1046 ) + 1844 ( 1376 ) + 1845 ( 1377 ) + 1846 ( -1378 ) + 1847 ( 1379 ) + 1848 ( -1378 ) + 1849 ( 1380 ) + 1850 ( 1381 ) + 1851 ( -1382 ) + 1852 ( 1383 ) + 1853 ( -1384 ) + 1854 ( -1385 ) + 1855 ( -1368 ) + 1856 ( -1358 ) + 1857 ( 1386 ) + 1858 ( 1387 ) + 1859 ( 1388 ) + 1860 ( -1389 ) + 1861 ( -1390 ) + 1862 ( 1391 ) + 1863 ( 1392 ) + 1864 ( -1393 ) + 1865 ( -1389 ) + 1866 ( -1394 ) + 1867 ( 1395 ) + 1868 ( 1396 ) + 1869 ( 1391 ) + 1870 ( 1388 ) + 1871 ( 1397 ) + 1872 ( 1398 ) + 1873 ( -1399 ) + 1874 ( -1400 ) + 1875 ( 1401 ) + 1876 ( 1402 ) + 1877 ( -1400 ) + 1878 ( -1403 ) + 1879 ( -1404 ) + 1880 ( -1405 ) + 1881 ( -1406 ) + 1882 ( 1028 ) + 1883 ( -1407 ) + 1884 ( -1405 ) + 1885 ( -1408 ) + 1886 ( 1044 ) + 1887 ( -1409 ) + 1888 ( 1410 ) + 1889 ( -1411 ) + 1890 ( -1412 ) + 1891 ( 1413 ) + 1892 ( -1412 ) + 1893 ( 1414 ) + 1894 ( -1415 ) + 1895 ( 1416 ) + 1896 ( -1415 ) + 1897 ( 1417 ) + 1898 ( 1418 ) + 1899 ( 1419 ) + 1900 ( 1420 ) + 1901 ( 1421 ) + 1902 ( 1422 ) + 1903 ( -1372 ) + 1904 ( 1423 ) + 1905 ( 1424 ) + 1906 ( 1423 ) + 1907 ( -1371 ) + 1908 ( 1425 ) + 1909 ( -1426 ) + 1910 ( -1427 ) + 1911 ( -1428 ) + 1912 ( 1421 ) + 1913 ( 1424 ) + 1914 ( -1429 ) + 1915 ( -1430 ) + 1916 ( 1431 ) + 1917 ( 1432 ) + 1918 ( 1433 ) + 1919 ( -1434 ) + 1920 ( -1429 ) + 1921 ( 1435 ) + 1922 ( 1436 ) + 1923 ( 1437 ) + 1924 ( -1438 ) + 1925 ( 1439 ) + 1926 ( -1440 ) + 1927 ( -1441 ) + 1928 ( 1326 ) + 1929 ( 1442 ) + 1930 ( -1438 ) + 1931 ( -1443 ) + 1932 ( -1440 ) + 1933 ( 1444 ) + 1934 ( 1445 ) + 1935 ( -1427 ) + 1936 ( 1446 ) + 1937 ( 1447 ) + 1938 ( 1448 ) + 1939 ( -1337 ) + 1940 ( -1449 ) + 1941 ( -1315 ) + 1942 ( 1450 ) + 1943 ( 1451 ) + 1944 ( -1452 ) + 1945 ( 1453 ) + 1946 ( 1454 ) + 1947 ( 1455 ) + 1948 ( -1456 ) + 1949 ( 1457 ) + 1950 ( -1456 ) + 1951 ( -1458 ) + 1952 ( -1459 ) + 1953 ( 1460 ) + 1954 ( -1459 ) + 1955 ( -1461 ) + 1956 ( 1462 ) + 1957 ( 1463 ) + 1958 ( 1464 ) + 1959 ( 1465 ) + 1960 ( 1466 ) + 1961 ( -1467 ) + 1962 ( -1332 ) + 1963 ( 1468 ) + 1964 ( -1469 ) + 1965 ( -1470 ) + 1966 ( -1471 ) + 1967 ( 1472 ) + 1968 ( -1471 ) + 1969 ( 1473 ) + 1970 ( -1474 ) + 1971 ( 1475 ) + 1972 ( -1474 ) + 1973 ( 1476 ) + 1974 ( 1477 ) + 1975 ( 1478 ) + 1976 ( 1479 ) + 1977 ( -1056 ) + 1978 ( 1071 ) + 1979 ( 1480 ) + 1980 ( 1386 ) + 1981 ( 1357 ) + 1982 ( -1481 ) + 1983 ( -1059 ) + 1984 ( -1481 ) + 1985 ( -1365 ) + 1986 ( 1482 ) + 1987 ( 1483 ) + 1988 ( -1406 ) + 1989 ( -1407 ) + 1990 ( 1043 ) + 1991 ( -1041 ) + 1992 ( -1022 ) + 1993 ( 1029 ) + 1994 ( 1379 ) + 1995 ( -1484 ) + 1996 ( 1035 ) + 1997 ( 1047 ) + 1998 ( 1383 ) + 1999 ( 1485 ) + 2000 ( 1039 ) + 2001 ( -1484 ) + 2002 ( 1486 ) + 2003 ( -1399 ) + 2004 ( 1487 ) + 2005 ( 1488 ) + 2006 ( 1489 ) + 2007 ( 1488 ) + 2008 ( 1490 ) + 2009 ( -1491 ) + 2010 ( -1403 ) + 2011 ( -1492 ) + 2012 ( -1493 ) + 2013 ( 1490 ) + 2014 ( 1487 ) + 2015 ( -1494 ) + 2016 ( 1495 ) + 2017 ( 1496 ) + 2018 ( -1072 ) + 2019 ( 1497 ) + 2020 ( -1367 ) + 2021 ( 1498 ) + 2022 ( 1499 ) + 2023 ( 1500 ) + 2024 ( 1501 ) + 2025 ( 1502 ) + 2026 ( 1503 ) + 2027 ( -1504 ) + 2028 ( -1073 ) + 2029 ( 1496 ) + 2030 ( -1505 ) + 2031 ( -1506 ) + 2032 ( 1507 ) + 2033 ( -1506 ) + 2034 ( -1508 ) + 2035 ( 1509 ) + 2036 ( 1510 ) + 2037 ( 1511 ) + 2038 ( 1512 ) + 2039 ( -1505 ) + 2040 ( 1495 ) + 2041 ( 1513 ) + 2042 ( -1508 ) + 2043 ( 1509 ) + 2044 ( -1514 ) + 2045 ( -1515 ) + 2046 ( -1516 ) + 2047 ( -1517 ) + 2048 ( 1518 ) + 2049 ( -1519 ) + 2050 ( 1520 ) + 2051 ( 1521 ) + 2052 ( 1522 ) + 2053 ( 1523 ) + 2054 ( 1524 ) + 2055 ( 1525 ) + 2056 ( -1519 ) + 2057 ( 1526 ) + 2058 ( 1510 ) + 2059 ( -1517 ) + 2060 ( -1527 ) + 2061 ( -1528 ) + 2062 ( -1529 ) + 2063 ( 1511 ) + 2064 ( -1529 ) + 2065 ( -1530 ) + 2066 ( 1531 ) + 2067 ( -1532 ) + 2068 ( -1533 ) + 2069 ( 1534 ) + 2070 ( -1535 ) + 2071 ( 1536 ) + 2072 ( -1537 ) + 2073 ( -1535 ) + 2074 ( 1538 ) + 2075 ( 1539 ) + 2076 ( 1540 ) + 2077 ( 1538 ) + 2078 ( 1534 ) + 2079 ( 1541 ) + 2080 ( 1542 ) + 2081 ( -1543 ) + 2082 ( 1501 ) + 2083 ( -1544 ) + 2084 ( 1545 ) + 2085 ( 1525 ) + 2086 ( 1499 ) + 2087 ( 1546 ) + 2088 ( -1547 ) + 2089 ( -1548 ) + 2090 ( -1549 ) + 2091 ( -1550 ) + 2092 ( -1551 ) + 2093 ( -1550 ) + 2094 ( -1552 ) + 2095 ( -1553 ) + 2096 ( -1554 ) + 2097 ( -1555 ) + 2098 ( -1556 ) + 2099 ( 1557 ) + 2100 ( 1558 ) + 2101 ( 1557 ) + 2102 ( 1559 ) + 2103 ( 1560 ) + 2104 ( -1561 ) + 2105 ( 1562 ) + 2106 ( -1561 ) + 2107 ( 1563 ) + 2108 ( -1564 ) + 2109 ( -1565 ) + 2110 ( 1566 ) + 2111 ( -1567 ) + 2112 ( 1563 ) + 2113 ( 1560 ) + 2114 ( 1568 ) + 2115 ( -1549 ) + 2116 ( -1569 ) + 2117 ( -1570 ) + 2118 ( 1571 ) + 2119 ( 1572 ) + 2120 ( 1573 ) + 2121 ( 1574 ) + 2122 ( -1570 ) + 2123 ( -1575 ) + 2124 ( -1552 ) + 2125 ( 1568 ) + 2126 ( 1574 ) + 2127 ( 1576 ) + 2128 ( 1577 ) + 2129 ( -1578 ) + 2130 ( -1579 ) + 2131 ( -1580 ) + 2132 ( 1581 ) + 2133 ( 1582 ) + 2134 ( -1580 ) + 2135 ( -1583 ) + 2136 ( 1584 ) + 2137 ( -1585 ) + 2138 ( 1577 ) + 2139 ( 1586 ) + 2140 ( -1587 ) + 2141 ( -1588 ) + 2142 ( -1587 ) + 2143 ( -1589 ) + 2144 ( -1590 ) + 2145 ( -1591 ) + 2146 ( -1592 ) + 2147 ( -1590 ) + 2148 ( -1593 ) + 2149 ( -1579 ) + 2150 ( -1594 ) + 2151 ( 1595 ) + 2152 ( 1596 ) + 2153 ( 1597 ) + 2154 ( 1598 ) + 2155 ( -1599 ) + 2156 ( 1600 ) + 2157 ( 1601 ) + 2158 ( 1602 ) + 2159 ( 1603 ) + 2160 ( 1604 ) + 2161 ( 1605 ) + 2162 ( -1599 ) + 2163 ( 1606 ) + 2164 ( -1583 ) + 2165 ( 1600 ) + 2166 ( 1605 ) + 2167 ( -953 ) + 2168 ( -1607 ) + 2169 ( -1608 ) + 2170 ( -1609 ) + 2171 ( -1610 ) + 2172 ( -1611 ) + 2173 ( -959 ) + 2174 ( 1612 ) + 2175 ( -1613 ) + 2176 ( 1614 ) + 2177 ( -962 ) + 2178 ( -1611 ) + 2179 ( 1615 ) + 2180 ( 1612 ) + 2181 ( -966 ) + 2182 ( -1616 ) + 2183 ( -1617 ) + 2184 ( -1618 ) + 2185 ( -1619 ) + 2186 ( 1620 ) + 2187 ( -1618 ) + 2188 ( 1621 ) + 2189 ( 1622 ) + 2190 ( 1623 ) + 2191 ( 1051 ) + 2192 ( -1248 ) + 2193 ( 1220 ) + 2194 ( -1292 ) + 2195 ( -1624 ) + 2196 ( -1625 ) + 2197 ( -1626 ) + 2198 ( -1627 ) + 2199 ( -1628 ) + 2200 ( -1629 ) + 2201 ( 1622 ) + 2202 ( -1630 ) + 2203 ( -1631 ) + 2204 ( -1625 ) + 2205 ( 1632 ) + 2206 ( -1295 ) + 2207 ( -1633 ) + 2208 ( -1634 ) + 2209 ( 1632 ) + 2210 ( -1624 ) + 2211 ( -1635 ) + 2212 ( -1628 ) + 2213 ( -1636 ) + 2214 ( -1637 ) + 2215 ( -1626 ) + 2216 ( -1631 ) + 2217 ( -1638 ) + 2218 ( -1639 ) + 2219 ( 1640 ) + 2220 ( -1633 ) + 2221 ( -1294 ) + 2222 ( 1279 ) + 2223 ( -1641 ) + 2224 ( -1642 ) + 2225 ( -60 ) + 2226 ( 1643 ) + 2227 ( 1644 ) + 2228 ( 1645 ) + 2229 ( -61 ) + 2230 ( -1642 ) + 2231 ( 1646 ) + 2232 ( 1647 ) + 2233 ( -1648 ) + 2234 ( -9 ) + 2235 ( -1649 ) + 2236 ( 1650 ) + 2237 ( 1651 ) + 2238 ( 1652 ) + 2239 ( -1649 ) + 2240 ( -17 ) + 2241 ( 1653 ) + 2242 ( 1654 ) + 2243 ( 1655 ) + 2244 ( 1656 ) + 2245 ( -1657 ) + 2246 ( 1658 ) + 2247 ( 183 ) + 2248 ( 1659 ) + 2249 ( 1660 ) + 2250 ( -166 ) + 2251 ( -1661 ) + 2252 ( -1661 ) + 2253 ( -174 ) + 2254 ( -1662 ) + 2255 ( 1663 ) + 2256 ( -1662 ) + 2257 ( -173 ) + 2258 ( 1664 ) + 2259 ( 1665 ) + 2260 ( -1666 ) + 2261 ( -202 ) + 2262 ( -206 ) + 2263 ( -251 ) + 2264 ( -290 ) + 2265 ( -270 ) + 2266 ( -274 ) + 2267 ( 1667 ) + 2268 ( -1668 ) + 2269 ( 1669 ) + 2270 ( -1670 ) + 2271 ( -1671 ) + 2272 ( -281 ) + 2273 ( -1672 ) + 2274 ( -1672 ) + 2275 ( -286 ) + 2276 ( 1673 ) + 2277 ( 1674 ) + 2278 ( 1675 ) + 2279 ( 1676 ) + 2280 ( -289 ) + 2281 ( -1671 ) + 2282 ( -1677 ) + 2283 ( 1678 ) + 2284 ( -1679 ) + 2285 ( -1680 ) + 2286 ( 1646 ) + 2287 ( 1644 ) + 2288 ( -1681 ) + 2289 ( -1682 ) + 2290 ( -1683 ) + 2291 ( -1684 ) + 2292 ( -1685 ) + 2293 ( 1686 ) + 2294 ( -1687 ) + 2295 ( -1683 ) + 2296 ( 1688 ) + 2297 ( -1682 ) + 2298 ( -1689 ) + 2299 ( -1690 ) + 2300 ( 1691 ) + 2301 ( 1692 ) + 2302 ( -1690 ) + 2303 ( -1693 ) + 2304 ( -1694 ) + 2305 ( 1695 ) + 2306 ( -1685 ) + 2307 ( 1688 ) + 2308 ( 1692 ) + 2309 ( -1696 ) + 2310 ( 1651 ) + 2311 ( -1697 ) + 2312 ( 1698 ) + 2313 ( 1650 ) + 2314 ( 1655 ) + 2315 ( 1699 ) + 2316 ( -1697 ) + 2317 ( 1700 ) + 2318 ( 1701 ) + 2319 ( 1702 ) + 2320 ( 1703 ) + 2321 ( -1694 ) + 2322 ( 1691 ) + 2323 ( -1704 ) + 2324 ( 1705 ) + 2325 ( 1706 ) + 2326 ( 1707 ) + 2327 ( -1657 ) + 2328 ( 1708 ) + 2329 ( -1709 ) + 2330 ( -1710 ) + 2331 ( -1711 ) + 2332 ( -1712 ) + 2333 ( 1713 ) + 2334 ( 1714 ) + 2335 ( 1675 ) + 2336 ( 1715 ) + 2337 ( 1716 ) + 2338 ( -1717 ) + 2339 ( 1718 ) + 2340 ( 1719 ) + 2341 ( -1720 ) + 2342 ( 1721 ) + 2343 ( -1722 ) + 2344 ( -1723 ) + 2345 ( 1724 ) + 2346 ( -1725 ) + 2347 ( -1711 ) + 2348 ( 1726 ) + 2349 ( 1727 ) + 2350 ( 1728 ) + 2351 ( 1729 ) + 2352 ( 1730 ) + 2353 ( -1731 ) + 2354 ( -1732 ) + 2355 ( -1733 ) + 2356 ( -1734 ) + 2357 ( 1729 ) + 2358 ( -1735 ) + 2359 ( -1736 ) + 2360 ( 1737 ) + 2361 ( -1738 ) + 2362 ( -1739 ) + 2363 ( -1740 ) + 2364 ( -1741 ) + 2365 ( -1736 ) + 2366 ( 1742 ) + 2367 ( -1743 ) + 2368 ( -1744 ) + 2369 ( -1745 ) + 2370 ( -1746 ) + 2371 ( -1747 ) + 2372 ( -1746 ) + 2373 ( -1748 ) + 2374 ( -1749 ) + 2375 ( -1750 ) + 2376 ( -1751 ) + 2377 ( 1647 ) + 2378 ( -1680 ) + 2379 ( 1752 ) + 2380 ( 1753 ) + 2381 ( -1754 ) + 2382 ( -1755 ) + 2383 ( 1756 ) + 2384 ( -1750 ) + 2385 ( -1757 ) + 2386 ( -1758 ) + 2387 ( -1759 ) + 2388 ( -1760 ) + 2389 ( -1761 ) + 2390 ( -1762 ) + 2391 ( -1763 ) + 2392 ( -1764 ) + 2393 ( -1765 ) + 2394 ( -1766 ) + 2395 ( -1767 ) + 2396 ( -1768 ) + 2397 ( -1769 ) + 2398 ( -1770 ) + 2399 ( -1771 ) + 2400 ( -1772 ) + 2401 ( -1773 ) + 2402 ( -1774 ) + 2403 ( -1775 ) + 2404 ( -1776 ) + 2405 ( 1777 ) + 2406 ( -1765 ) + 2407 ( 1778 ) + 2408 ( -1779 ) + 2409 ( 1780 ) + 2410 ( -1763 ) + 2411 ( -1781 ) + 2412 ( -1782 ) + 2413 ( -1783 ) + 2414 ( -1770 ) + 2415 ( -1784 ) + 2416 ( -1785 ) + 2417 ( 1786 ) + 2418 ( -1768 ) + 2419 ( 1787 ) + 2420 ( -1788 ) + 2421 ( 1789 ) + 2422 ( -1772 ) + 2423 ( 1790 ) + 2424 ( -1761 ) + 2425 ( 1791 ) + 2426 ( -1733 ) + 2427 ( 1792 ) + 2428 ( -1793 ) + 2429 ( -1794 ) + 2430 ( -1795 ) + 2431 ( -1796 ) + 2432 ( -1797 ) + 2433 ( -1798 ) + 2434 ( -1799 ) + 2435 ( -1775 ) + 2436 ( -1800 ) + 2437 ( -1799 ) + 2438 ( 1801 ) + 2439 ( -1797 ) + 2440 ( -1802 ) + 2441 ( -1740 ) + 2442 ( -1803 ) + 2443 ( -1804 ) + 2444 ( -1795 ) + 2445 ( -1805 ) + 2446 ( 1705 ) + 2447 ( -1806 ) + 2448 ( -1805 ) + 2449 ( -1794 ) + 2450 ( 1807 ) + 2451 ( -1808 ) + 2452 ( 1809 ) + 2453 ( 1706 ) + 2454 ( 1809 ) + 2455 ( -1810 ) + 2456 ( 1811 ) + 2457 ( 1724 ) + 2458 ( -1812 ) + 2459 ( -1813 ) + 2460 ( -1814 ) + 2461 ( -1815 ) + 2462 ( 1816 ) + 2463 ( 1817 ) + 2464 ( 1715 ) + 2465 ( 1674 ) + 2466 ( 1818 ) + 2467 ( 1819 ) + 2468 ( 1820 ) + 2469 ( 1821 ) + 2470 ( 1822 ) + 2471 ( 1823 ) + 2472 ( 1824 ) + 2473 ( 1825 ) + 2474 ( 1826 ) + 2475 ( 1827 ) + 2476 ( 1828 ) + 2477 ( -1829 ) + 2478 ( 1830 ) + 2479 ( 1831 ) + 2480 ( 1832 ) + 2481 ( 1833 ) + 2482 ( 1834 ) + 2483 ( 1835 ) + 2484 ( 1836 ) + 2485 ( 1837 ) + 2486 ( -1838 ) + 2487 ( 1839 ) + 2488 ( 1840 ) + 2489 ( 1841 ) + 2490 ( 1836 ) + 2491 ( 1842 ) + 2492 ( -1722 ) + 2493 ( -1843 ) + 2494 ( -1844 ) + 2495 ( -1845 ) + 2496 ( -1720 ) + 2497 ( -1846 ) + 2498 ( -1709 ) + 2499 ( -1847 ) + 2500 ( -1848 ) + 2501 ( 1849 ) + 2502 ( -1813 ) + 2503 ( -1850 ) + 2504 ( -1851 ) + 2505 ( 1852 ) + 2506 ( -1853 ) + 2507 ( 1669 ) + 2508 ( -1854 ) + 2509 ( -1855 ) + 2510 ( -1856 ) + 2511 ( -1857 ) + 2512 ( 1858 ) + 2513 ( -1859 ) + 2514 ( 1860 ) + 2515 ( -1861 ) + 2516 ( -1862 ) + 2517 ( 1863 ) + 2518 ( -1861 ) + 2519 ( 1864 ) + 2520 ( -1865 ) + 2521 ( 1866 ) + 2522 ( 1864 ) + 2523 ( 1860 ) + 2524 ( 1867 ) + 2525 ( -1868 ) + 2526 ( -1869 ) + 2527 ( 1867 ) + 2528 ( -1859 ) + 2529 ( 1870 ) + 2530 ( -1871 ) + 2531 ( -1872 ) + 2532 ( 1870 ) + 2533 ( 1858 ) + 2534 ( 1863 ) + 2535 ( 1873 ) + 2536 ( 1874 ) + 2537 ( -1875 ) + 2538 ( 1876 ) + 2539 ( -1877 ) + 2540 ( -1878 ) + 2541 ( 1879 ) + 2542 ( -1877 ) + 2543 ( 1880 ) + 2544 ( -1881 ) + 2545 ( -1882 ) + 2546 ( 1880 ) + 2547 ( 1876 ) + 2548 ( 1883 ) + 2549 ( -1884 ) + 2550 ( -1885 ) + 2551 ( 1883 ) + 2552 ( -1875 ) + 2553 ( 1886 ) + 2554 ( 1887 ) + 2555 ( 1888 ) + 2556 ( 1886 ) + 2557 ( 1874 ) + 2558 ( 1879 ) + 2559 ( -1889 ) + 2560 ( -1890 ) + 2561 ( 1891 ) + 2562 ( -1892 ) + 2563 ( -1893 ) + 2564 ( 1894 ) + 2565 ( -1895 ) + 2566 ( -1896 ) + 2567 ( -1892 ) + 2568 ( 1897 ) + 2569 ( -1898 ) + 2570 ( -1899 ) + 2571 ( 1894 ) + 2572 ( 1891 ) + 2573 ( 1900 ) + 2574 ( -1901 ) + 2575 ( -1893 ) + 2576 ( -1896 ) + 2577 ( -1902 ) + 2578 ( 1903 ) + 2579 ( -1904 ) + 2580 ( 1905 ) + 2581 ( -1906 ) + 2582 ( -1907 ) + 2583 ( 1908 ) + 2584 ( -1906 ) + 2585 ( 1909 ) + 2586 ( -1910 ) + 2587 ( -1911 ) + 2588 ( 1909 ) + 2589 ( 1905 ) + 2590 ( 1912 ) + 2591 ( -1913 ) + 2592 ( 1914 ) + 2593 ( 1912 ) + 2594 ( -1904 ) + 2595 ( 1915 ) + 2596 ( -1916 ) + 2597 ( 1917 ) + 2598 ( 1915 ) + 2599 ( 1903 ) + 2600 ( 1908 ) + 2601 ( -1918 ) + 2602 ( -1854 ) + 2603 ( -1668 ) + 2604 ( -1919 ) + 2605 ( -1920 ) + 2606 ( 1921 ) + 2607 ( 1922 ) + 2608 ( -1677 ) + 2609 ( -1670 ) + 2610 ( 1714 ) + 2611 ( 1923 ) + 2612 ( -1851 ) + 2613 ( -1924 ) + 2614 ( 1925 ) + 2615 ( 1926 ) + 2616 ( -1838 ) + 2617 ( 1927 ) + 2618 ( -1844 ) + 2619 ( 1928 ) + 2620 ( 1929 ) + 2621 ( 1930 ) + 2622 ( -1848 ) + 2623 ( 1931 ) + 2624 ( 1932 ) + 2625 ( 1933 ) + 2626 ( -1934 ) + 2627 ( -1856 ) + 2628 ( -1935 ) + 2629 ( -1936 ) + 2630 ( -1937 ) + 2631 ( -1938 ) + 2632 ( 1939 ) + 2633 ( 1925 ) + 2634 ( 1940 ) + 2635 ( 1932 ) + 2636 ( 504 ) + 2637 ( 1941 ) + 2638 ( -1942 ) + 2639 ( 1943 ) + 2640 ( 549 ) + 2641 ( 1944 ) + 2642 ( 1945 ) + 2643 ( 1946 ) + 2644 ( -1942 ) + 2645 ( 1947 ) + 2646 ( -1948 ) + 2647 ( -555 ) + 2648 ( 1943 ) + 2649 ( 1946 ) + 2650 ( 1949 ) + 2651 ( -1950 ) + 2652 ( 1951 ) + 2653 ( -1952 ) + 2654 ( 1953 ) + 2655 ( -1954 ) + 2656 ( -1955 ) + 2657 ( -1956 ) + 2658 ( 1957 ) + 2659 ( 1958 ) + 2660 ( -1954 ) + 2661 ( 1959 ) + 2662 ( -1952 ) + 2663 ( 1960 ) + 2664 ( -496 ) + 2665 ( -477 ) + 2666 ( 1961 ) + 2667 ( 1962 ) + 2668 ( 1963 ) + 2669 ( 1964 ) + 2670 ( 499 ) + 2671 ( 1965 ) + 2672 ( -1966 ) + 2673 ( 1967 ) + 2674 ( 1962 ) + 2675 ( 1968 ) + 2676 ( -1966 ) + 2677 ( 1969 ) + 2678 ( -1950 ) + 2679 ( -1970 ) + 2680 ( -1955 ) + 2681 ( -1971 ) + 2682 ( 1972 ) + 2683 ( -476 ) + 2684 ( 1973 ) + 2685 ( 1974 ) + 2686 ( 1975 ) + 2687 ( 1976 ) + 2688 ( 1961 ) + 2689 ( 1977 ) + 2690 ( 1978 ) + 2691 ( -1956 ) + 2692 ( 1979 ) + 2693 ( 1980 ) + 2694 ( 608 ) + 2695 ( -605 ) + 2696 ( 1981 ) + 2697 ( -1982 ) + 2698 ( 609 ) + 2699 ( 1980 ) + 2700 ( -1983 ) + 2701 ( -1984 ) + 2702 ( 1985 ) + 2703 ( 1986 ) + 2704 ( 1987 ) + 2705 ( 1988 ) + 2706 ( -1989 ) + 2707 ( 1990 ) + 2708 ( -1991 ) + 2709 ( 1988 ) + 2710 ( -1992 ) + 2711 ( -1993 ) + 2712 ( 1994 ) + 2713 ( 1995 ) + 2714 ( 1996 ) + 2715 ( 1997 ) + 2716 ( 1998 ) + 2717 ( 1999 ) + 2718 ( -2000 ) + 2719 ( 2001 ) + 2720 ( 1998 ) + 2721 ( 1996 ) + 2722 ( -2002 ) + 2723 ( 2003 ) + 2724 ( 2004 ) + 2725 ( 2005 ) + 2726 ( 2006 ) + 2727 ( -2007 ) + 2728 ( -2008 ) + 2729 ( 2009 ) + 2730 ( 2004 ) + 2731 ( 2010 ) + 2732 ( 2011 ) + 2733 ( 2012 ) + 2734 ( 2013 ) + 2735 ( -2008 ) + 2736 ( 2009 ) + 2737 ( -2014 ) + 2738 ( -2015 ) + 2739 ( 2005 ) + 2740 ( -2014 ) + 2741 ( 2013 ) + 2742 ( 2016 ) + 2743 ( 2017 ) + 2744 ( 2018 ) + 2745 ( 2006 ) + 2746 ( -2015 ) + 2747 ( -2019 ) + 2748 ( 2020 ) + 2749 ( -2021 ) + 2750 ( -2019 ) + 2751 ( 2017 ) + 2752 ( -1984 ) + 2753 ( -2022 ) + 2754 ( -2023 ) + 2755 ( -2024 ) + 2756 ( -2023 ) + 2757 ( -2025 ) + 2758 ( 2026 ) + 2759 ( 2027 ) + 2760 ( 2028 ) + 2761 ( 2029 ) + 2762 ( -2030 ) + 2763 ( -2031 ) + 2764 ( -2032 ) + 2765 ( -2033 ) + 2766 ( -2034 ) + 2767 ( -2035 ) + 2768 ( -2036 ) + 2769 ( -2037 ) + 2770 ( 2038 ) + 2771 ( 2039 ) + 2772 ( 2040 ) + 2773 ( 2041 ) + 2774 ( 2042 ) + 2775 ( 2043 ) + 2776 ( -2044 ) + 2777 ( 2045 ) + 2778 ( 2046 ) + 2779 ( -2047 ) + 2780 ( -2048 ) + 2781 ( -2049 ) + 2782 ( -2050 ) + 2783 ( -2051 ) + 2784 ( 2010 ) + 2785 ( -2051 ) + 2786 ( -2052 ) + 2787 ( 2053 ) + 2788 ( 2054 ) + 2789 ( 2011 ) + 2790 ( 2055 ) + 2791 ( 2056 ) + 2792 ( 2057 ) + 2793 ( 2058 ) + 2794 ( 2059 ) + 2795 ( 2060 ) + 2796 ( 2061 ) + 2797 ( 2062 ) + 2798 ( 2063 ) + 2799 ( -2064 ) + 2800 ( 2065 ) + 2801 ( -2000 ) + 2802 ( 2066 ) + 2803 ( -2067 ) + 2804 ( -2068 ) + 2805 ( 514 ) + 2806 ( -2069 ) + 2807 ( 2070 ) + 2808 ( -2071 ) + 2809 ( 2072 ) + 2810 ( -2073 ) + 2811 ( 2074 ) + 2812 ( -2075 ) + 2813 ( -2076 ) + 2814 ( 2077 ) + 2815 ( -2073 ) + 2816 ( -2078 ) + 2817 ( 2066 ) + 2818 ( 2079 ) + 2819 ( -2080 ) + 2820 ( -2081 ) + 2821 ( -2071 ) + 2822 ( 2082 ) + 2823 ( 2083 ) + 2824 ( 2084 ) + 2825 ( -2085 ) + 2826 ( -2067 ) + 2827 ( -2086 ) + 2828 ( 2087 ) + 2829 ( -2086 ) + 2830 ( -2078 ) + 2831 ( 2088 ) + 2832 ( -2089 ) + 2833 ( 2090 ) + 2834 ( 2082 ) + 2835 ( 2077 ) + 2836 ( -691 ) + 2837 ( 2091 ) + 2838 ( -2092 ) + 2839 ( -2093 ) + 2840 ( -2094 ) + 2841 ( 2095 ) + 2842 ( 2096 ) + 2843 ( 2097 ) + 2844 ( -2098 ) + 2845 ( 2099 ) + 2846 ( 2100 ) + 2847 ( -690 ) + 2848 ( -584 ) + 2849 ( -581 ) + 2850 ( -2101 ) + 2851 ( -2102 ) + 2852 ( -2103 ) + 2853 ( -2104 ) + 2854 ( -2105 ) + 2855 ( 2091 ) + 2856 ( -2106 ) + 2857 ( -2107 ) + 2858 ( -2108 ) + 2859 ( 2109 ) + 2860 ( 2110 ) + 2861 ( 2111 ) + 2862 ( 2112 ) + 2863 ( 2113 ) + 2864 ( -2108 ) + 2865 ( 2114 ) + 2866 ( 2115 ) + 2867 ( 2116 ) + 2868 ( 2117 ) + 2869 ( 2118 ) + 2870 ( 2119 ) + 2871 ( 2120 ) + 2872 ( -2121 ) + 2873 ( -2122 ) + 2874 ( 2109 ) + 2875 ( 2113 ) + 2876 ( -2123 ) + 2877 ( 2124 ) + 2878 ( 2125 ) + 2879 ( -2126 ) + 2880 ( 2097 ) + 2881 ( -2127 ) + 2882 ( 2128 ) + 2883 ( 2124 ) + 2884 ( -2129 ) + 2885 ( 2130 ) + 2886 ( -2131 ) + 2887 ( 2096 ) + 2888 ( -2132 ) + 2889 ( 2133 ) + 2890 ( -2127 ) + 2891 ( 2130 ) + 2892 ( -2134 ) + 2893 ( -2135 ) + 2894 ( -2136 ) + 2895 ( 2137 ) + 2896 ( 2138 ) + 2897 ( -2098 ) + 2898 ( -2131 ) + 2899 ( -2136 ) + 2900 ( 2139 ) + 2901 ( 2140 ) + 2902 ( -2135 ) + 2903 ( -2141 ) + 2904 ( -2142 ) + 2905 ( -2143 ) + 2906 ( 2139 ) + 2907 ( -2143 ) + 2908 ( 2144 ) + 2909 ( 2145 ) + 2910 ( -2146 ) + 2911 ( 2140 ) + 2912 ( -2147 ) + 2913 ( -2148 ) + 2914 ( 2144 ) + 2915 ( -2142 ) + 2916 ( 2149 ) + 2917 ( -692 ) + 2918 ( -2094 ) + 2919 ( -2150 ) + 2920 ( 2151 ) + 2921 ( 2152 ) + 2922 ( 2153 ) + 2923 ( 2114 ) + 2924 ( -2107 ) + 2925 ( 2154 ) + 2926 ( 2155 ) + 2927 ( 2156 ) + 2928 ( -693 ) + 2929 ( 2151 ) + 2930 ( -2157 ) + 2931 ( -2158 ) + 2932 ( -2159 ) + 2933 ( -2160 ) + 2934 ( -2161 ) + 2935 ( -2159 ) + 2936 ( -2162 ) + 2937 ( 2116 ) + 2938 ( -2163 ) + 2939 ( 2152 ) + 2940 ( -2164 ) + 2941 ( -2165 ) + 2942 ( -2166 ) + 2943 ( -2148 ) + 2944 ( -2167 ) + 2945 ( 2168 ) + 2946 ( -2169 ) + 2947 ( 2170 ) + 2948 ( 2171 ) + 2949 ( -2172 ) + 2950 ( 2173 ) + 2951 ( -2169 ) + 2952 ( 2145 ) + 2953 ( 2170 ) + 2954 ( 2173 ) + 2955 ( -2174 ) + 2956 ( -2175 ) + 2957 ( 2176 ) + 2958 ( -2167 ) + 2959 ( -2147 ) + 2960 ( -2163 ) + 2961 ( 2115 ) + 2962 ( 2153 ) + 2963 ( 2177 ) + 2964 ( 2178 ) + 2965 ( -2103 ) + 2966 ( 2179 ) + 2967 ( 2180 ) + 2968 ( -2104 ) + 2969 ( 2178 ) + 2970 ( 2181 ) + 2971 ( 2182 ) + 2972 ( 2183 ) + 2973 ( 2183 ) + 2974 ( 2184 ) + 2975 ( 2185 ) + 2976 ( 2186 ) + 2977 ( 2156 ) + 2978 ( -2187 ) + 2979 ( -2188 ) + 2980 ( 2189 ) + 2981 ( 2155 ) + 2982 ( 2190 ) + 2983 ( -2191 ) + 2984 ( -2187 ) + 2985 ( 2192 ) + 2986 ( -2193 ) + 2987 ( -2188 ) + 2988 ( -2191 ) + 2989 ( -2194 ) + 2990 ( 2195 ) + 2991 ( -2193 ) + 2992 ( 2196 ) + 2993 ( 2197 ) + 2994 ( -2198 ) + 2995 ( -2199 ) + 2996 ( -2164 ) + 2997 ( 2189 ) + 2998 ( 2200 ) + 2999 ( 2201 ) + 3000 ( 2202 ) + 3001 ( 2203 ) + 3002 ( 2204 ) + 3003 ( -2205 ) + 3004 ( -2206 ) + 3005 ( -2207 ) + 3006 ( -2208 ) + 3007 ( 1753 ) + 3008 ( -2209 ) + 3009 ( -698 ) + 3010 ( -694 ) + 3011 ( -2160 ) + 3012 ( -2161 ) + 3013 ( 2210 ) + 3014 ( 2211 ) + 3015 ( -2212 ) + 3016 ( 2202 ) + 3017 ( -2213 ) + 3018 ( 2214 ) + 3019 ( 2215 ) + 3020 ( 2216 ) + 3021 ( 2217 ) + 3022 ( 2203 ) + 3023 ( -2212 ) + 3024 ( 2218 ) + 3025 ( -2213 ) + 3026 ( 2201 ) + 3027 ( 2219 ) + 3028 ( 2215 ) + 3029 ( 2220 ) + 3030 ( 2221 ) + 3031 ( -2207 ) + 3032 ( 2222 ) + 3033 ( 2223 ) + 3034 ( -1679 ) + 3035 ( 1643 ) + 3036 ( -59 ) + 3037 ( -2209 ) + 3038 ( 1752 ) + 3039 ( -1754 ) + 3040 ( -2208 ) + 3041 ( 2221 ) + 3042 ( 2224 ) + 3043 ( 2225 ) + 3044 ( -2226 ) + 3045 ( -2227 ) + 3046 ( -1747 ) + 3047 ( -1751 ) + 3048 ( -1759 ) + 3049 ( 2228 ) + 3050 ( 2229 ) + 3051 ( 1990 ) + 3052 ( 2230 ) + 3053 ( -2231 ) + 3054 ( 2232 ) + 3055 ( 2233 ) + 3056 ( -2234 ) + 3057 ( 2235 ) + 3058 ( 2236 ) + 3059 ( -2237 ) + 3060 ( 2238 ) + 3061 ( 2239 ) + 3062 ( 2240 ) + 3063 ( 2241 ) + 3064 ( 2242 ) + 3065 ( 2243 ) + 3066 ( 2244 ) + 3067 ( -2237 ) + 3068 ( -2245 ) + 3069 ( 2246 ) + 3070 ( 2238 ) + 3071 ( 2244 ) + 3072 ( -2247 ) + 3073 ( -2248 ) + 3074 ( 2243 ) + 3075 ( 2249 ) + 3076 ( 2250 ) + 3077 ( -2247 ) + 3078 ( 2251 ) + 3079 ( 2252 ) + 3080 ( -1992 ) + 3081 ( 2253 ) + 3082 ( -2248 ) + 3083 ( 2250 ) + 3084 ( 2254 ) + 3085 ( 2239 ) + 3086 ( 2246 ) + 3087 ( 2255 ) + 3088 ( 2236 ) + 3089 ( 2256 ) + 3090 ( 2257 ) + 3091 ( 2258 ) + 3092 ( 2259 ) + 3093 ( -2260 ) + 3094 ( 2261 ) + 3095 ( -2231 ) + 3096 ( 2262 ) + 3097 ( 2263 ) + 3098 ( 2264 ) + 3099 ( 2257 ) + 3100 ( 2265 ) + 3101 ( 2266 ) + 3102 ( 2267 ) + 3103 ( 2259 ) + 3104 ( 2268 ) + 3105 ( 2232 ) + 3106 ( 2261 ) + 3107 ( 2269 ) + 3108 ( 2270 ) + 3109 ( 2271 ) + 3110 ( 2272 ) + 3111 ( -2273 ) + 3112 ( 2233 ) + 3113 ( 2272 ) + 3114 ( 2274 ) + 3115 ( -2275 ) + 3116 ( -2276 ) + 3117 ( 2277 ) + 3118 ( -2278 ) + 3119 ( -1731 ) + 3120 ( -2276 ) + 3121 ( -2279 ) + 3122 ( -2234 ) + 3123 ( -2273 ) + 3124 ( -2280 ) + 3125 ( 2281 ) + 3126 ( 2282 ) + 3127 ( -1684 ) + 3128 ( 2283 ) + 3129 ( -2284 ) + 3130 ( 2285 ) + 3131 ( -2286 ) + 3132 ( -2245 ) + 3133 ( 2287 ) + 3134 ( -2284 ) + 3135 ( -2288 ) + 3136 ( -2289 ) + 3137 ( 2285 ) + 3138 ( 2283 ) + 3139 ( -1687 ) + 3140 ( 2241 ) + 3141 ( 2290 ) + 3142 ( 2281 ) + 3143 ( 2287 ) + 3144 ( -1712 ) + 3145 ( -1725 ) + 3146 ( -1815 ) + 3147 ( -2291 ) + 3148 ( 2292 ) + 3149 ( -2293 ) + 3150 ( 2294 ) + 3151 ( 2295 ) + 3152 ( 2296 ) + 3153 ( 2297 ) + 3154 ( 2298 ) + 3155 ( -2299 ) + 3156 ( 2300 ) + 3157 ( -2299 ) + 3158 ( 2301 ) + 3159 ( -2302 ) + 3160 ( -2303 ) + 3161 ( 2304 ) + 3162 ( 2305 ) + 3163 ( 2294 ) + 3164 ( 2300 ) + 3165 ( 2301 ) + 3166 ( 2298 ) + 3167 ( 2306 ) + 3168 ( 2307 ) + 3169 ( 2308 ) + 3170 ( -2309 ) + 3171 ( 2310 ) + 3172 ( -2311 ) + 3173 ( -2312 ) + 3174 ( 2313 ) + 3175 ( 2314 ) + 3176 ( 2315 ) + 3177 ( -2316 ) + 3178 ( 2317 ) + 3179 ( -2318 ) + 3180 ( -2044 ) + 3181 ( 2319 ) + 3182 ( 2320 ) + 3183 ( -2321 ) + 3184 ( -2322 ) + 3185 ( 2323 ) + 3186 ( 2324 ) + 3187 ( -2316 ) + 3188 ( 2325 ) + 3189 ( 2326 ) + 3190 ( -2327 ) + 3191 ( 2328 ) + 3192 ( 2329 ) + 3193 ( 2330 ) + 3194 ( 2331 ) + 3195 ( 2332 ) + 3196 ( 2330 ) + 3197 ( -2333 ) + 3198 ( -2334 ) + 3199 ( 2335 ) + 3200 ( 2336 ) + 3201 ( -2337 ) + 3202 ( 2328 ) + 3203 ( -2338 ) + 3204 ( -2339 ) + 3205 ( -2340 ) + 3206 ( 2325 ) + 3207 ( 2315 ) + 3208 ( -2340 ) + 3209 ( -2341 ) + 3210 ( 2342 ) + 3211 ( 2343 ) + 3212 ( 2344 ) + 3213 ( -2345 ) + 3214 ( 2320 ) + 3215 ( -2346 ) + 3216 ( -2347 ) + 3217 ( 2348 ) + 3218 ( 2349 ) + 3219 ( 2350 ) + 3220 ( -2338 ) + 3221 ( 2319 ) + 3222 ( 2043 ) + 3223 ( 2324 ) + 3224 ( -2351 ) + 3225 ( 2352 ) + 3226 ( -2353 ) + 3227 ( 2317 ) + 3228 ( 2323 ) + 3229 ( -2354 ) + 3230 ( 2355 ) + 3231 ( 2356 ) + 3232 ( -2351 ) + 3233 ( -2318 ) + 3234 ( -2353 ) + 3235 ( 2357 ) + 3236 ( 2358 ) + 3237 ( 2359 ) + 3238 ( 2360 ) + 3239 ( 2045 ) + 3240 ( 2352 ) + 3241 ( 2356 ) + 3242 ( 2361 ) + 3243 ( -2341 ) + 3244 ( -2339 ) + 3245 ( 2350 ) + 3246 ( 2362 ) + 3247 ( -1717 ) + 3248 ( 2363 ) + 3249 ( 2357 ) + 3250 ( 1716 ) + 3251 ( 1817 ) + 3252 ( -2364 ) + 3253 ( 2358 ) + 3254 ( 2363 ) + 3255 ( 1816 ) + 3256 ( -2365 ) + 3257 ( 2359 ) + 3258 ( -2364 ) + 3259 ( -2366 ) + 3260 ( 2367 ) + 3261 ( 2342 ) + 3262 ( 2361 ) + 3263 ( 2355 ) + 3264 ( -2368 ) + 3265 ( 1718 ) + 3266 ( 2362 ) + 3267 ( 2349 ) + 3268 ( -2369 ) + 3269 ( 2370 ) + 3270 ( 2371 ) + 3271 ( -2369 ) + 3272 ( 2348 ) + 3273 ( -2372 ) + 3274 ( 2373 ) + 3275 ( -2075 ) + 3276 ( -2374 ) + 3277 ( 2375 ) + 3278 ( 2376 ) + 3279 ( -2377 ) + 3280 ( -2378 ) + 3281 ( -2379 ) + 3282 ( -2380 ) + 3283 ( -2381 ) + 3284 ( -2382 ) + 3285 ( -2383 ) + 3286 ( -2384 ) + 3287 ( -2385 ) + 3288 ( 2386 ) + 3289 ( -2387 ) + 3290 ( -2388 ) + 3291 ( -2389 ) + 3292 ( -2390 ) + 3293 ( -2391 ) + 3294 ( -2392 ) + 3295 ( 2393 ) + 3296 ( -2392 ) + 3297 ( -2394 ) + 3298 ( -2395 ) + 3299 ( -2394 ) + 3300 ( -2391 ) + 3301 ( -2396 ) + 3302 ( 2397 ) + 3303 ( 2398 ) + 3304 ( -2399 ) + 3305 ( -2396 ) + 3306 ( -2390 ) + 3307 ( 2400 ) + 3308 ( 2401 ) + 3309 ( 2402 ) + 3310 ( -2389 ) + 3311 ( 2403 ) + 3312 ( -2404 ) + 3313 ( 2405 ) + 3314 ( 2406 ) + 3315 ( 2407 ) + 3316 ( -2408 ) + 3317 ( 2400 ) + 3318 ( -2409 ) + 3319 ( 2410 ) + 3320 ( 2411 ) + 3321 ( 2386 ) + 3322 ( 2412 ) + 3323 ( 2413 ) + 3324 ( -2377 ) + 3325 ( 2414 ) + 3326 ( 2415 ) + 3327 ( -2416 ) + 3328 ( -2380 ) + 3329 ( 2417 ) + 3330 ( -2378 ) + 3331 ( 2413 ) + 3332 ( 2418 ) + 3333 ( 2419 ) + 3334 ( 2403 ) + 3335 ( -2388 ) + 3336 ( -2420 ) + 3337 ( 2415 ) + 3338 ( 2421 ) + 3339 ( 2422 ) + 3340 ( 2423 ) + 3341 ( -2424 ) + 3342 ( -2425 ) + 3343 ( 2414 ) + 3344 ( 2426 ) + 3345 ( 2421 ) + 3346 ( -2427 ) + 3347 ( -2428 ) + 3348 ( 2429 ) + 3349 ( -2430 ) + 3350 ( -2431 ) + 3351 ( -2432 ) + 3352 ( 2433 ) + 3353 ( 2434 ) + 3354 ( -2435 ) + 3355 ( -2436 ) + 3356 ( -2437 ) + 3357 ( -2427 ) + 3358 ( -2438 ) + 3359 ( -2439 ) + 3360 ( -2425 ) + 3361 ( 2440 ) + 3362 ( -2430 ) + 3363 ( -2441 ) + 3364 ( -2442 ) + 3365 ( -2428 ) + 3366 ( -2437 ) + 3367 ( -2435 ) + 3368 ( -2424 ) + 3369 ( -2443 ) + 3370 ( -2444 ) + 3371 ( -2445 ) + 3372 ( -2446 ) + 3373 ( -2447 ) + 3374 ( 2448 ) + 3375 ( -2449 ) + 3376 ( -2447 ) + 3377 ( -2450 ) + 3378 ( 2451 ) + 3379 ( 2452 ) + 3380 ( 2453 ) + 3381 ( 2454 ) + 3382 ( 2455 ) + 3383 ( 2456 ) + 3384 ( 2457 ) + 3385 ( -2450 ) + 3386 ( -2446 ) + 3387 ( -2458 ) + 3388 ( 2459 ) + 3389 ( 2460 ) + 3390 ( 2461 ) + 3391 ( 2462 ) + 3392 ( 2463 ) + 3393 ( 2464 ) + 3394 ( -2458 ) + 3395 ( -2445 ) + 3396 ( 2465 ) + 3397 ( 2466 ) + 3398 ( -2467 ) + 3399 ( -2468 ) + 3400 ( 2465 ) + 3401 ( -2444 ) + 3402 ( -2469 ) + 3403 ( -2469 ) + 3404 ( -2449 ) + 3405 ( 2470 ) + 3406 ( 2471 ) + 3407 ( 2472 ) + 3408 ( 2410 ) + 3409 ( 2473 ) + 3410 ( -2431 ) + 3411 ( 2440 ) + 3412 ( -2474 ) + 3413 ( -2475 ) + 3414 ( -2476 ) + 3415 ( -2477 ) + 3416 ( -2478 ) + 3417 ( -2381 ) + 3418 ( -2416 ) + 3419 ( -2420 ) + 3420 ( -2439 ) + 3421 ( -2479 ) + 3422 ( -2480 ) + 3423 ( -2481 ) + 3424 ( -2482 ) + 3425 ( 2483 ) + 3426 ( 2484 ) + 3427 ( -2485 ) + 3428 ( -2486 ) + 3429 ( -2487 ) + 3430 ( -2481 ) + 3431 ( 2488 ) + 3432 ( -2489 ) + 3433 ( 2484 ) + 3434 ( -2490 ) + 3435 ( 2491 ) + 3436 ( -2382 ) + 3437 ( -2478 ) + 3438 ( 2492 ) + 3439 ( -2480 ) + 3440 ( -2489 ) + 3441 ( 2493 ) + 3442 ( 2494 ) + 3443 ( 2495 ) + 3444 ( -2496 ) + 3445 ( -2485 ) + 3446 ( -2496 ) + 3447 ( 2497 ) + 3448 ( 2498 ) + 3449 ( 2499 ) + 3450 ( 2500 ) + 3451 ( -2475 ) + 3452 ( 2501 ) + 3453 ( -2502 ) + 3454 ( -2503 ) + 3455 ( 2504 ) + 3456 ( 2505 ) + 3457 ( -2506 ) + 3458 ( -2507 ) + 3459 ( -2508 ) + 3460 ( -2509 ) + 3461 ( -2506 ) + 3462 ( -2510 ) + 3463 ( -2509 ) + 3464 ( 2511 ) + 3465 ( 2512 ) + 3466 ( 2513 ) + 3467 ( -2514 ) + 3468 ( 2515 ) + 3469 ( 2516 ) + 3470 ( -2507 ) + 3471 ( 2517 ) + 3472 ( -2372 ) + 3473 ( -2518 ) + 3474 ( 2519 ) + 3475 ( 2504 ) + 3476 ( 2519 ) + 3477 ( -2520 ) + 3478 ( -2521 ) + 3479 ( 2522 ) + 3480 ( -2510 ) + 3481 ( 2505 ) + 3482 ( 2523 ) + 3483 ( -2524 ) + 3484 ( 2525 ) + 3485 ( -2526 ) + 3486 ( -2527 ) + 3487 ( 2528 ) + 3488 ( -2526 ) + 3489 ( 2529 ) + 3490 ( 2530 ) + 3491 ( -2531 ) + 3492 ( 2529 ) + 3493 ( 2525 ) + 3494 ( 2532 ) + 3495 ( 2533 ) + 3496 ( 2534 ) + 3497 ( 2532 ) + 3498 ( -2524 ) + 3499 ( 2535 ) + 3500 ( 2536 ) + 3501 ( 2499 ) + 3502 ( 2537 ) + 3503 ( 2538 ) + 3504 ( -2508 ) + 3505 ( 2539 ) + 3506 ( 2540 ) + 3507 ( 2541 ) + 3508 ( 2542 ) + 3509 ( -2543 ) + 3510 ( 2544 ) + 3511 ( -2545 ) + 3512 ( -2546 ) + 3513 ( -2547 ) + 3514 ( 2548 ) + 3515 ( 2541 ) + 3516 ( -2549 ) + 3517 ( -2550 ) + 3518 ( 2551 ) + 3519 ( 2539 ) + 3520 ( 2522 ) + 3521 ( -2552 ) + 3522 ( 2553 ) + 3523 ( 2551 ) + 3524 ( -2554 ) + 3525 ( 2555 ) + 3526 ( 2556 ) + 3527 ( 2557 ) + 3528 ( 2558 ) + 3529 ( -2559 ) + 3530 ( -2560 ) + 3531 ( 2561 ) + 3532 ( -2562 ) + 3533 ( 2563 ) + 3534 ( -2564 ) + 3535 ( -2562 ) + 3536 ( 2565 ) + 3537 ( 2566 ) + 3538 ( 2567 ) + 3539 ( 2565 ) + 3540 ( 2561 ) + 3541 ( 2568 ) + 3542 ( 2569 ) + 3543 ( 2570 ) + 3544 ( -2571 ) + 3545 ( -2572 ) + 3546 ( -2573 ) + 3547 ( -2574 ) + 3548 ( -2575 ) + 3549 ( -2574 ) + 3550 ( -2576 ) + 3551 ( 2577 ) + 3552 ( 2578 ) + 3553 ( -2576 ) + 3554 ( -2573 ) + 3555 ( 2579 ) + 3556 ( 2580 ) + 3557 ( 2581 ) + 3558 ( 2582 ) + 3559 ( 2583 ) + 3560 ( 2584 ) + 3561 ( -2572 ) + 3562 ( 2585 ) + 3563 ( 2586 ) + 3564 ( 2587 ) + 3565 ( 2588 ) + 3566 ( 2589 ) + 3567 ( 2590 ) + 3568 ( 2591 ) + 3569 ( 2579 ) + 3570 ( 2592 ) + 3571 ( 2593 ) + 3572 ( 2577 ) + 3573 ( -2594 ) + 3574 ( 2595 ) + 3575 ( 2596 ) + 3576 ( 2597 ) + 3577 ( -2594 ) + 3578 ( 2584 ) + 3579 ( -2598 ) + 3580 ( 2599 ) + 3581 ( -2600 ) + 3582 ( -2571 ) + 3583 ( -2601 ) + 3584 ( -2602 ) + 3585 ( -2603 ) + 3586 ( 2585 ) + 3587 ( 2604 ) + 3588 ( 2605 ) + 3589 ( -2606 ) + 3590 ( -2602 ) + 3591 ( 2607 ) + 3592 ( -2608 ) + 3593 ( 2586 ) + 3594 ( -2603 ) + 3595 ( -2606 ) + 3596 ( 2515 ) + 3597 ( -2609 ) + 3598 ( -2610 ) + 3599 ( -2611 ) + 3600 ( -2612 ) + 3601 ( -2613 ) + 3602 ( -2502 ) + 3603 ( 2516 ) + 3604 ( -2613 ) + 3605 ( -2614 ) + 3606 ( -2615 ) + 3607 ( -2616 ) + 3608 ( 2617 ) + 3609 ( -2618 ) + 3610 ( -2615 ) + 3611 ( -2619 ) + 3612 ( -2620 ) + 3613 ( -2621 ) + 3614 ( -2622 ) + 3615 ( -2623 ) + 3616 ( 2624 ) + 3617 ( -2625 ) + 3618 ( -2626 ) + 3619 ( -2627 ) + 3620 ( -2622 ) + 3621 ( 2628 ) + 3622 ( 2629 ) + 3623 ( 2624 ) + 3624 ( 2630 ) + 3625 ( 2631 ) + 3626 ( 2632 ) + 3627 ( 2630 ) + 3628 ( -2623 ) + 3629 ( -2627 ) + 3630 ( -2633 ) + 3631 ( -2503 ) + 3632 ( -2616 ) + 3633 ( -2618 ) + 3634 ( 2634 ) + 3635 ( -2635 ) + 3636 ( -2636 ) + 3637 ( 2637 ) + 3638 ( 2638 ) + 3639 ( 2639 ) + 3640 ( -2635 ) + 3641 ( -2640 ) + 3642 ( -2514 ) + 3643 ( 2641 ) + 3644 ( 2642 ) + 3645 ( 2643 ) + 3646 ( -2609 ) + 3647 ( 2638 ) + 3648 ( -2644 ) + 3649 ( -2645 ) + 3650 ( 2599 ) + 3651 ( -2646 ) + 3652 ( 2647 ) + 3653 ( 2637 ) + 3654 ( -2648 ) + 3655 ( -2644 ) + 3656 ( -2649 ) + 3657 ( 2650 ) + 3658 ( 2651 ) + 3659 ( -2652 ) + 3660 ( 2653 ) + 3661 ( 2654 ) + 3662 ( -2655 ) + 3663 ( -2656 ) + 3664 ( 2657 ) + 3665 ( -2658 ) + 3666 ( -2659 ) + 3667 ( -2660 ) + 3668 ( -2661 ) + 3669 ( 2657 ) + 3670 ( 2662 ) + 3671 ( 2663 ) + 3672 ( 2664 ) + 3673 ( -2649 ) + 3674 ( 2665 ) + 3675 ( -2666 ) + 3676 ( -2652 ) + 3677 ( 2667 ) + 3678 ( 2668 ) + 3679 ( 2669 ) + 3680 ( 2670 ) + 3681 ( -2671 ) + 3682 ( 2672 ) + 3683 ( -2673 ) + 3684 ( -2673 ) + 3685 ( 2674 ) + 3686 ( 2675 ) + 3687 ( 2676 ) + 3688 ( 2677 ) + 3689 ( 2678 ) + 3690 ( -2679 ) + 3691 ( -2680 ) + 3692 ( -2681 ) + 3693 ( 2682 ) + 3694 ( -2683 ) + 3695 ( 2670 ) + 3696 ( -2660 ) + 3697 ( -2684 ) + 3698 ( -2681 ) + 3699 ( -2685 ) + 3700 ( -2659 ) + 3701 ( -2686 ) + 3702 ( 2682 ) + 3703 ( -2684 ) + 3704 ( -2687 ) + 3705 ( -2688 ) + 3706 ( -2689 ) + 3707 ( 2662 ) + 3708 ( -2656 ) + 3709 ( -2690 ) + 3710 ( 2691 ) + 3711 ( 2692 ) + 3712 ( 2693 ) + 3713 ( -2694 ) + 3714 ( -2695 ) + 3715 ( 2696 ) + 3716 ( 2697 ) + 3717 ( -2698 ) + 3718 ( 2699 ) + 3719 ( 2700 ) + 3720 ( 2701 ) + 3721 ( -2702 ) + 3722 ( -2703 ) + 3723 ( -2704 ) + 3724 ( 2705 ) + 3725 ( 2706 ) + 3726 ( 2699 ) + 3727 ( 2701 ) + 3728 ( -2698 ) + 3729 ( 2707 ) + 3730 ( 2708 ) + 3731 ( 2709 ) + 3732 ( 2710 ) + 3733 ( 2711 ) + 3734 ( 2712 ) + 3735 ( 2713 ) + 3736 ( 2714 ) + 3737 ( -2715 ) + 3738 ( -2716 ) + 3739 ( -2717 ) + 3740 ( -2702 ) + 3741 ( 2712 ) + 3742 ( 2697 ) + 3743 ( -2718 ) + 3744 ( -2719 ) + 3745 ( 2720 ) + 3746 ( 2721 ) + 3747 ( 2707 ) + 3748 ( -2722 ) + 3749 ( 2723 ) + 3750 ( 2708 ) + 3751 ( 2721 ) + 3752 ( -2724 ) + 3753 ( -2725 ) + 3754 ( -2726 ) + 3755 ( -2727 ) + 3756 ( -2728 ) + 3757 ( -2729 ) + 3758 ( 2730 ) + 3759 ( 2731 ) + 3760 ( 2705 ) + 3761 ( -2732 ) + 3762 ( -2728 ) + 3763 ( 2733 ) + 3764 ( 2730 ) + 3765 ( -2734 ) + 3766 ( -2735 ) + 3767 ( -2736 ) + 3768 ( -2737 ) + 3769 ( 2738 ) + 3770 ( -2725 ) + 3771 ( -2739 ) + 3772 ( -2740 ) + 3773 ( -2734 ) + 3774 ( 2741 ) + 3775 ( -2740 ) + 3776 ( 2742 ) + 3777 ( 2743 ) + 3778 ( 2744 ) + 3779 ( 2745 ) + 3780 ( -2719 ) + 3781 ( -2736 ) + 3782 ( 2746 ) + 3783 ( 2747 ) + 3784 ( 2668 ) + 3785 ( -2748 ) + 3786 ( 2749 ) + 3787 ( 2750 ) + 3788 ( -2751 ) + 3789 ( -2752 ) + 3790 ( 2753 ) + 3791 ( 2672 ) + 3792 ( -2752 ) + 3793 ( 2754 ) + 3794 ( 2755 ) + 3795 ( 2756 ) + 3796 ( 2757 ) + 3797 ( 2758 ) + 3798 ( 2759 ) + 3799 ( 2760 ) + 3800 ( 2761 ) + 3801 ( 2674 ) + 3802 ( 2753 ) + 3803 ( 2759 ) + 3804 ( 2756 ) + 3805 ( 2762 ) + 3806 ( -2763 ) + 3807 ( -2764 ) + 3808 ( 2765 ) + 3809 ( 2766 ) + 3810 ( 2767 ) + 3811 ( -2768 ) + 3812 ( 2754 ) + 3813 ( -2751 ) + 3814 ( -2769 ) + 3815 ( 2770 ) + 3816 ( -2763 ) + 3817 ( 2771 ) + 3818 ( 2772 ) + 3819 ( 2692 ) + 3820 ( -2764 ) + 3821 ( 2770 ) + 3822 ( -2773 ) + 3823 ( 2774 ) + 3824 ( 2775 ) + 3825 ( 2776 ) + 3826 ( -2777 ) + 3827 ( 2778 ) + 3828 ( -2779 ) + 3829 ( -2780 ) + 3830 ( 2781 ) + 3831 ( 2782 ) + 3832 ( -2783 ) + 3833 ( -2784 ) + 3834 ( -2785 ) + 3835 ( -2783 ) + 3836 ( 2786 ) + 3837 ( -2787 ) + 3838 ( -2788 ) + 3839 ( -2789 ) + 3840 ( 1972 ) + 3841 ( -2790 ) + 3842 ( -2791 ) + 3843 ( -2792 ) + 3844 ( -2788 ) + 3845 ( -2793 ) + 3846 ( 2794 ) + 3847 ( 2663 ) + 3848 ( -2689 ) + 3849 ( -461 ) + 3850 ( -454 ) + 3851 ( 2795 ) + 3852 ( -2796 ) + 3853 ( 2797 ) + 3854 ( 2798 ) + 3855 ( -2799 ) + 3856 ( -2800 ) + 3857 ( 2801 ) + 3858 ( 2802 ) + 3859 ( 2803 ) + 3860 ( -2804 ) + 3861 ( -2805 ) + 3862 ( -2806 ) + 3863 ( -2807 ) + 3864 ( -2808 ) + 3865 ( -2809 ) + 3866 ( -2799 ) + 3867 ( 2810 ) + 3868 ( -1184 ) + 3869 ( -2811 ) + 3870 ( -2808 ) + 3871 ( 2812 ) + 3872 ( -2800 ) + 3873 ( -2809 ) + 3874 ( -2811 ) + 3875 ( -2813 ) + 3876 ( 2814 ) + 3877 ( 2803 ) + 3878 ( -2815 ) + 3879 ( -2816 ) + 3880 ( 2817 ) + 3881 ( -2816 ) + 3882 ( -2818 ) + 3883 ( -1074 ) + 3884 ( -2815 ) + 3885 ( 2802 ) + 3886 ( 2819 ) + 3887 ( -2818 ) + 3888 ( 2820 ) + 3889 ( 2821 ) + 3890 ( -1185 ) + 3891 ( 2810 ) + 3892 ( -2807 ) + 3893 ( -2822 ) + 3894 ( -2823 ) + 3895 ( -2383 ) + 3896 ( 2491 ) + 3897 ( 2824 ) + 3898 ( -2804 ) + 3899 ( 2798 ) + 3900 ( 2814 ) + 3901 ( -2825 ) + 3902 ( -2826 ) + 3903 ( 2744 ) + 3904 ( -2827 ) + 3905 ( 2795 ) + 3906 ( -1217 ) + 3907 ( -1148 ) + 3908 ( 2828 ) + 3909 ( -2825 ) + 3910 ( -1147 ) + 3911 ( -1152 ) + 3912 ( 1158 ) + 3913 ( 2829 ) + 3914 ( 1156 ) + 3915 ( -1118 ) + 3916 ( -2830 ) + 3917 ( 2831 ) + 3918 ( -2830 ) + 3919 ( -1127 ) + 3920 ( 2832 ) + 3921 ( 2833 ) + 3922 ( -2834 ) + 3923 ( -2069 ) + 3924 ( 520 ) + 3925 ( -2835 ) + 3926 ( -2836 ) + 3927 ( 1974 ) + 3928 ( -2837 ) + 3929 ( 2781 ) + 3930 ( 2838 ) + 3931 ( -2839 ) + 3932 ( 2840 ) + 3933 ( 2841 ) + 3934 ( 2842 ) + 3935 ( 2843 ) + 3936 ( -2844 ) + 3937 ( -2845 ) + 3938 ( 2841 ) + 3939 ( -2846 ) + 3940 ( -2847 ) + 3941 ( -2848 ) + 3942 ( 2849 ) + 3943 ( -2850 ) + 3944 ( -2851 ) + 3945 ( -2850 ) + 3946 ( 2852 ) + 3947 ( 2853 ) + 3948 ( 2854 ) + 3949 ( -2855 ) + 3950 ( -2856 ) + 3951 ( 2852 ) + 3952 ( 2849 ) + 3953 ( -2857 ) + 3954 ( -2858 ) + 3955 ( 2859 ) + 3956 ( 2854 ) + 3957 ( -2848 ) + 3958 ( 2860 ) + 3959 ( -2861 ) + 3960 ( -2862 ) + 3961 ( 2863 ) + 3962 ( 2864 ) + 3963 ( -2865 ) + 3964 ( -2866 ) + 3965 ( -2861 ) + 3966 ( 2867 ) + 3967 ( -2868 ) + 3968 ( 2863 ) + 3969 ( 2869 ) + 3970 ( -2870 ) + 3971 ( -2871 ) + 3972 ( -2872 ) + 3973 ( -2873 ) + 3974 ( 2869 ) + 3975 ( -2862 ) + 3976 ( -2866 ) + 3977 ( -2874 ) + 3978 ( 2875 ) + 3979 ( -2876 ) + 3980 ( 2877 ) + 3981 ( 2878 ) + 3982 ( 2879 ) + 3983 ( -2880 ) + 3984 ( 2881 ) + 3985 ( 2882 ) + 3986 ( 2883 ) + 3987 ( -2884 ) + 3988 ( 2875 ) + 3989 ( 2885 ) + 3990 ( 2886 ) + 3991 ( -2887 ) + 3992 ( 2888 ) + 3993 ( 2889 ) + 3994 ( -2880 ) + 3995 ( 2890 ) + 3996 ( -2891 ) + 3997 ( -2892 ) + 3998 ( -2893 ) + 3999 ( 2890 ) + 4000 ( 2886 ) + 4001 ( -2894 ) + 4002 ( -2895 ) + 4003 ( 2881 ) + 4004 ( 2889 ) + 4005 ( 2896 ) + 4006 ( -2897 ) + 4007 ( -2898 ) + 4008 ( -2899 ) + 4009 ( 2882 ) + 4010 ( -2895 ) + 4011 ( 2900 ) + 4012 ( -2901 ) + 4013 ( 2896 ) + 4014 ( 2888 ) + 4015 ( 2902 ) + 4016 ( 2883 ) + 4017 ( -2899 ) + 4018 ( -2903 ) + 4019 ( 2885 ) + 4020 ( 2879 ) + 4021 ( -2904 ) + 4022 ( -2905 ) + 4023 ( 2906 ) + 4024 ( -2891 ) + 4025 ( -2905 ) + 4026 ( -2907 ) + 4027 ( 2908 ) + 4028 ( 2909 ) + 4029 ( 2910 ) + 4030 ( -2911 ) + 4031 ( -2912 ) + 4032 ( -2913 ) + 4033 ( 2914 ) + 4034 ( -2911 ) + 4035 ( 2915 ) + 4036 ( 2916 ) + 4037 ( 2917 ) + 4038 ( 2918 ) + 4039 ( 2919 ) + 4040 ( 2920 ) + 4041 ( 2921 ) + 4042 ( 2922 ) + 4043 ( -2923 ) + 4044 ( 2924 ) + 4045 ( -2925 ) + 4046 ( -2926 ) + 4047 ( 2927 ) + 4048 ( 2928 ) + 4049 ( -2926 ) + 4050 ( -2929 ) + 4051 ( -2930 ) + 4052 ( -2931 ) + 4053 ( -2930 ) + 4054 ( -2932 ) + 4055 ( 2933 ) + 4056 ( -2934 ) + 4057 ( -2932 ) + 4058 ( -2929 ) + 4059 ( -2925 ) + 4060 ( 2935 ) + 4061 ( -2936 ) + 4062 ( 2937 ) + 4063 ( -2931 ) + 4064 ( -2934 ) + 4065 ( 2938 ) + 4066 ( -2939 ) + 4067 ( 2940 ) + 4068 ( 2941 ) + 4069 ( -2942 ) + 4070 ( -2943 ) + 4071 ( 2922 ) + 4072 ( -2944 ) + 4073 ( -2945 ) + 4074 ( -2946 ) + 4075 ( 2947 ) + 4076 ( -2923 ) + 4077 ( -2943 ) + 4078 ( 2948 ) + 4079 ( 2949 ) + 4080 ( -2950 ) + 4081 ( -990 ) + 4082 ( 934 ) + 4083 ( 969 ) + 4084 ( 2951 ) + 4085 ( 2952 ) + 4086 ( -1007 ) + 4087 ( -2953 ) + 4088 ( 2954 ) + 4089 ( 2955 ) + 4090 ( -2953 ) + 4091 ( -1010 ) + 4092 ( 2956 ) + 4093 ( 2957 ) + 4094 ( 2958 ) + 4095 ( -2959 ) + 4096 ( -2960 ) + 4097 ( 2961 ) + 4098 ( -2960 ) + 4099 ( -2962 ) + 4100 ( -2963 ) + 4101 ( 2964 ) + 4102 ( -2965 ) + 4103 ( -2959 ) + 4104 ( -2966 ) + 4105 ( -2967 ) + 4106 ( -2968 ) + 4107 ( 2969 ) + 4108 ( -2970 ) + 4109 ( 2964 ) + 4110 ( -2970 ) + 4111 ( 2971 ) + 4112 ( 2972 ) + 4113 ( 2973 ) + 4114 ( 2974 ) + 4115 ( -2962 ) + 4116 ( -2965 ) + 4117 ( 2973 ) + 4118 ( -2975 ) + 4119 ( 2976 ) + 4120 ( -2977 ) + 4121 ( 2971 ) + 4122 ( 2969 ) + 4123 ( 2978 ) + 4124 ( 2979 ) + 4125 ( 2980 ) + 4126 ( -2975 ) + 4127 ( -2968 ) + 4128 ( -2981 ) + 4129 ( 2982 ) + 4130 ( 2983 ) + 4131 ( -2984 ) + 4132 ( -2985 ) + 4133 ( -2984 ) + 4134 ( 2986 ) + 4135 ( -2987 ) + 4136 ( -2988 ) + 4137 ( -2989 ) + 4138 ( -2990 ) + 4139 ( 2986 ) + 4140 ( 2983 ) + 4141 ( 2991 ) + 4142 ( -2992 ) + 4143 ( -2993 ) + 4144 ( -2994 ) + 4145 ( 2995 ) + 4146 ( -2994 ) + 4147 ( -2996 ) + 4148 ( 2997 ) + 4149 ( 2998 ) + 4150 ( -2993 ) + 4151 ( 2999 ) + 4152 ( 3000 ) + 4153 ( -3001 ) + 4154 ( 3002 ) + 4155 ( 3003 ) + 4156 ( 3004 ) + 4157 ( 3005 ) + 4158 ( 3006 ) + 4159 ( -3001 ) + 4160 ( 3007 ) + 4161 ( 3008 ) + 4162 ( 3009 ) + 4163 ( -2996 ) + 4164 ( 3002 ) + 4165 ( 3006 ) + 4166 ( -3010 ) + 4167 ( -3011 ) + 4168 ( 3012 ) + 4169 ( -3013 ) + 4170 ( -3014 ) + 4171 ( 3015 ) + 4172 ( -3014 ) + 4173 ( -3016 ) + 4174 ( 3017 ) + 4175 ( 3018 ) + 4176 ( 3019 ) + 4177 ( 3020 ) + 4178 ( 3021 ) + 4179 ( -3022 ) + 4180 ( 3023 ) + 4181 ( 3024 ) + 4182 ( -3010 ) + 4183 ( -3025 ) + 4184 ( 3015 ) + 4185 ( 3026 ) + 4186 ( -3027 ) + 4187 ( 3028 ) + 4188 ( -3027 ) + 4189 ( 3029 ) + 4190 ( 3030 ) + 4191 ( 3031 ) + 4192 ( 3032 ) + 4193 ( 3026 ) + 4194 ( 3020 ) + 4195 ( 3033 ) + 4196 ( 3029 ) + 4197 ( -3034 ) + 4198 ( 3021 ) + 4199 ( -3025 ) + 4200 ( 3028 ) + 4201 ( -3035 ) + 4202 ( -3011 ) + 4203 ( 3024 ) + 4204 ( -3036 ) + 4205 ( -3037 ) + 4206 ( -3038 ) + 4207 ( 3039 ) + 4208 ( -3036 ) + 4209 ( 3023 ) + 4210 ( -3040 ) + 4211 ( 3041 ) + 4212 ( 3042 ) + 4213 ( -3037 ) + 4214 ( 3043 ) + 4215 ( 3044 ) + 4216 ( -3040 ) + 4217 ( 3045 ) + 4218 ( 3046 ) + 4219 ( 3047 ) + 4220 ( 3048 ) + 4221 ( 3049 ) + 4222 ( 3043 ) + 4223 ( 3039 ) + 4224 ( -3050 ) + 4225 ( 3045 ) + 4226 ( 3051 ) + 4227 ( 3052 ) + 4228 ( -3053 ) + 4229 ( -3054 ) + 4230 ( 3055 ) + 4231 ( 3056 ) + 4232 ( -3054 ) + 4233 ( 3057 ) + 4234 ( 3058 ) + 4235 ( 3059 ) + 4236 ( 3060 ) + 4237 ( -3061 ) + 4238 ( 3062 ) + 4239 ( 3063 ) + 4240 ( -3064 ) + 4241 ( 2999 ) + 4242 ( -2992 ) + 4243 ( 3065 ) + 4244 ( 3066 ) + 4245 ( 3067 ) + 4246 ( -3068 ) + 4247 ( -3069 ) + 4248 ( -3064 ) + 4249 ( -3069 ) + 4250 ( -3070 ) + 4251 ( 3007 ) + 4252 ( 3000 ) + 4253 ( -3071 ) + 4254 ( 3072 ) + 4255 ( -3073 ) + 4256 ( 3074 ) + 4257 ( 3075 ) + 4258 ( -3076 ) + 4259 ( 3077 ) + 4260 ( 3078 ) + 4261 ( 3079 ) + 4262 ( 3080 ) + 4263 ( -3071 ) + 4264 ( 3012 ) + 4265 ( -3035 ) + 4266 ( 3042 ) + 4267 ( -3081 ) + 4268 ( 3082 ) + 4269 ( -3083 ) + 4270 ( 3084 ) + 4271 ( 3085 ) + 4272 ( 3086 ) + 4273 ( 3087 ) + 4274 ( 3088 ) + 4275 ( -3081 ) + 4276 ( 3089 ) + 4277 ( -3083 ) + 4278 ( 3041 ) + 4279 ( 3044 ) + 4280 ( -2894 ) + 4281 ( -3090 ) + 4282 ( -3091 ) + 4283 ( 3052 ) + 4284 ( -3092 ) + 4285 ( -3093 ) + 4286 ( 3094 ) + 4287 ( -3095 ) + 4288 ( -3092 ) + 4289 ( 3051 ) + 4290 ( 3096 ) + 4291 ( -2897 ) + 4292 ( -3093 ) + 4293 ( -3095 ) + 4294 ( 3097 ) + 4295 ( -3053 ) + 4296 ( -3091 ) + 4297 ( -3098 ) + 4298 ( 3057 ) + 4299 ( -3098 ) + 4300 ( -3090 ) + 4301 ( -2901 ) + 4302 ( 3099 ) + 4303 ( 3058 ) + 4304 ( -3100 ) + 4305 ( -3101 ) + 4306 ( 3102 ) + 4307 ( -3103 ) + 4308 ( 3104 ) + 4309 ( -3105 ) + 4310 ( 3106 ) + 4311 ( 3107 ) + 4312 ( -3108 ) + 4313 ( 3109 ) + 4314 ( 3110 ) + 4315 ( 3111 ) + 4316 ( 3112 ) + 4317 ( -3108 ) + 4318 ( -3113 ) + 4319 ( -3100 ) + 4320 ( 1448 ) + 4321 ( -3114 ) + 4322 ( 3115 ) + 4323 ( 3116 ) + 4324 ( 3117 ) + 4325 ( 3118 ) + 4326 ( 3119 ) + 4327 ( 1468 ) + 4328 ( -1331 ) + 4329 ( 1338 ) + 4330 ( 3120 ) + 4331 ( 1450 ) + 4332 ( -1314 ) + 4333 ( -1320 ) + 4334 ( 1308 ) + 4335 ( 3121 ) + 4336 ( 3122 ) + 4337 ( 3123 ) + 4338 ( 3124 ) + 4339 ( -3125 ) + 4340 ( -3126 ) + 4341 ( 1451 ) + 4342 ( 3120 ) + 4343 ( -3127 ) + 4344 ( -3128 ) + 4345 ( -3114 ) + 4346 ( -3129 ) + 4347 ( -3130 ) + 4348 ( -3129 ) + 4349 ( -1452 ) + 4350 ( -3126 ) + 4351 ( -3131 ) + 4352 ( -3132 ) + 4353 ( 3116 ) + 4354 ( -3133 ) + 4355 ( 1321 ) + 4356 ( 1300 ) + 4357 ( 3134 ) + 4358 ( 3135 ) + 4359 ( 3136 ) + 4360 ( 3137 ) + 4361 ( 3138 ) + 4362 ( 3139 ) + 4363 ( 3139 ) + 4364 ( -3140 ) + 4365 ( -1347 ) + 4366 ( -1355 ) + 4367 ( -3141 ) + 4368 ( -3142 ) + 4369 ( 3137 ) + 4370 ( -3143 ) + 4371 ( -3144 ) + 4372 ( -3145 ) + 4373 ( -3146 ) + 4374 ( 3147 ) + 4375 ( 3135 ) + 4376 ( 3148 ) + 4377 ( 3112 ) + 4378 ( -3149 ) + 4379 ( -3150 ) + 4380 ( -3151 ) + 4381 ( -3105 ) + 4382 ( -3152 ) + 4383 ( -3153 ) + 4384 ( 3154 ) + 4385 ( 3155 ) + 4386 ( 3156 ) + 4387 ( -3157 ) + 4388 ( -3158 ) + 4389 ( -3159 ) + 4390 ( 3110 ) + 4391 ( -3159 ) + 4392 ( -3160 ) + 4393 ( -3161 ) + 4394 ( -3149 ) + 4395 ( 3111 ) + 4396 ( 3162 ) + 4397 ( -3163 ) + 4398 ( -3164 ) + 4399 ( -3165 ) + 4400 ( -3166 ) + 4401 ( 3156 ) + 4402 ( 3167 ) + 4403 ( -3163 ) + 4404 ( 3168 ) + 4405 ( 3169 ) + 4406 ( 3170 ) + 4407 ( 3171 ) + 4408 ( 3172 ) + 4409 ( 3173 ) + 4410 ( 3174 ) + 4411 ( 3175 ) + 4412 ( 3176 ) + 4413 ( 3177 ) + 4414 ( 3178 ) + 4415 ( -3179 ) + 4416 ( -3180 ) + 4417 ( -3165 ) + 4418 ( -3181 ) + 4419 ( 3174 ) + 4420 ( -3182 ) + 4421 ( -3153 ) + 4422 ( -3183 ) + 4423 ( 3184 ) + 4424 ( -3185 ) + 4425 ( 3186 ) + 4426 ( 3187 ) + 4427 ( 3124 ) + 4428 ( -3188 ) + 4429 ( 3184 ) + 4430 ( 3189 ) + 4431 ( 3186 ) + 4432 ( -3190 ) + 4433 ( 3191 ) + 4434 ( -3192 ) + 4435 ( -3193 ) + 4436 ( 3194 ) + 4437 ( 3195 ) + 4438 ( -3196 ) + 4439 ( -3192 ) + 4440 ( 3197 ) + 4441 ( 3198 ) + 4442 ( 3199 ) + 4443 ( 3194 ) + 4444 ( 3191 ) + 4445 ( 3200 ) + 4446 ( 3201 ) + 4447 ( 3202 ) + 4448 ( 3203 ) + 4449 ( 3170 ) + 4450 ( 3204 ) + 4451 ( 3205 ) + 4452 ( 3206 ) + 4453 ( 3201 ) + 4454 ( 3207 ) + 4455 ( -3208 ) + 4456 ( -3209 ) + 4457 ( 3210 ) + 4458 ( 3211 ) + 4459 ( 3212 ) + 4460 ( -3213 ) + 4461 ( -3208 ) + 4462 ( -3161 ) + 4463 ( 3214 ) + 4464 ( 3215 ) + 4465 ( -3150 ) + 4466 ( -3216 ) + 4467 ( 3217 ) + 4468 ( -3218 ) + 4469 ( 3219 ) + 4470 ( 3220 ) + 4471 ( -3221 ) + 4472 ( -3222 ) + 4473 ( 3223 ) + 4474 ( -3218 ) + 4475 ( 3224 ) + 4476 ( 3225 ) + 4477 ( 3219 ) + 4478 ( 3223 ) + 4479 ( -3226 ) + 4480 ( 3227 ) + 4481 ( 3228 ) + 4482 ( 3229 ) + 4483 ( -3230 ) + 4484 ( 3231 ) + 4485 ( 3232 ) + 4486 ( -3233 ) + 4487 ( 3234 ) + 4488 ( -3230 ) + 4489 ( -3235 ) + 4490 ( -3236 ) + 4491 ( -3237 ) + 4492 ( 3232 ) + 4493 ( 3229 ) + 4494 ( 3238 ) + 4495 ( 3168 ) + 4496 ( 3239 ) + 4497 ( -3240 ) + 4498 ( -3241 ) + 4499 ( 3242 ) + 4500 ( -3243 ) + 4501 ( -3244 ) + 4502 ( 3245 ) + 4503 ( 3246 ) + 4504 ( 3247 ) + 4505 ( 3248 ) + 4506 ( -3249 ) + 4507 ( -3241 ) + 4508 ( -3250 ) + 4509 ( -3243 ) + 4510 ( -3240 ) + 4511 ( -3251 ) + 4512 ( -3244 ) + 4513 ( -3250 ) + 4514 ( 3252 ) + 4515 ( 3178 ) + 4516 ( -3253 ) + 4517 ( -3254 ) + 4518 ( -3255 ) + 4519 ( 3256 ) + 4520 ( 3248 ) + 4521 ( 3257 ) + 4522 ( 3258 ) + 4523 ( -3259 ) + 4524 ( 3260 ) + 4525 ( -3261 ) + 4526 ( 3262 ) + 4527 ( 3263 ) + 4528 ( 3264 ) + 4529 ( 3265 ) + 4530 ( 3266 ) + 4531 ( -3267 ) + 4532 ( -3259 ) + 4533 ( 3268 ) + 4534 ( 3269 ) + 4535 ( 3264 ) + 4536 ( 3263 ) + 4537 ( -3270 ) + 4538 ( -3271 ) + 4539 ( -3253 ) + 4540 ( 3177 ) + 4541 ( 3272 ) + 4542 ( 3273 ) + 4543 ( 3274 ) + 4544 ( 3275 ) + 4545 ( 3276 ) + 4546 ( 3266 ) + 4547 ( 3277 ) + 4548 ( 3258 ) + 4549 ( 3278 ) + 4550 ( 3279 ) + 4551 ( 3280 ) + 4552 ( 3281 ) + 4553 ( -3282 ) + 4554 ( 3262 ) + 4555 ( 3283 ) + 4556 ( 3284 ) + 4557 ( -3270 ) + 4558 ( -3282 ) + 4559 ( -3285 ) + 4560 ( -3286 ) + 4561 ( -3287 ) + 4562 ( -3288 ) + 4563 ( 3289 ) + 4564 ( 3290 ) + 4565 ( -3291 ) + 4566 ( 3292 ) + 4567 ( -3287 ) + 4568 ( -3293 ) + 4569 ( -3294 ) + 4570 ( 3295 ) + 4571 ( -3296 ) + 4572 ( -3293 ) + 4573 ( -3286 ) + 4574 ( -3297 ) + 4575 ( 3290 ) + 4576 ( -3298 ) + 4577 ( -3299 ) + 4578 ( 3300 ) + 4579 ( 3301 ) + 4580 ( 3302 ) + 4581 ( 3303 ) + 4582 ( 3304 ) + 4583 ( -3305 ) + 4584 ( 3306 ) + 4585 ( 3302 ) + 4586 ( 3307 ) + 4587 ( 3303 ) + 4588 ( 3306 ) + 4589 ( -3308 ) + 4590 ( 3309 ) + 4591 ( -3310 ) + 4592 ( -3311 ) + 4593 ( -3312 ) + 4594 ( -3313 ) + 4595 ( -3314 ) + 4596 ( 3315 ) + 4597 ( 3316 ) + 4598 ( -3317 ) + 4599 ( 3318 ) + 4600 ( -3313 ) + 4601 ( 3319 ) + 4602 ( -3320 ) + 4603 ( 3321 ) + 4604 ( -3317 ) + 4605 ( -3322 ) + 4606 ( -3323 ) + 4607 ( -3324 ) + 4608 ( -3145 ) + 4609 ( 3325 ) + 4610 ( -3326 ) + 4611 ( -3327 ) + 4612 ( -3323 ) + 4613 ( 3328 ) + 4614 ( 3329 ) + 4615 ( -3330 ) + 4616 ( -3326 ) + 4617 ( 1595 ) + 4618 ( -1594 ) + 4619 ( -1578 ) + 4620 ( -1585 ) + 4621 ( -3331 ) + 4622 ( 3332 ) + 4623 ( 3333 ) + 4624 ( -3334 ) + 4625 ( 3335 ) + 4626 ( -3336 ) + 4627 ( -3337 ) + 4628 ( 3338 ) + 4629 ( -3339 ) + 4630 ( -3339 ) + 4631 ( -3340 ) + 4632 ( -3341 ) + 4633 ( 3342 ) + 4634 ( 3343 ) + 4635 ( 3344 ) + 4636 ( -3345 ) + 4637 ( -3346 ) + 4638 ( -3347 ) + 4639 ( 3332 ) + 4640 ( 3348 ) + 4641 ( 3349 ) + 4642 ( -3350 ) + 4643 ( -3345 ) + 4644 ( 3351 ) + 4645 ( -3336 ) + 4646 ( 3352 ) + 4647 ( -3353 ) + 4648 ( -3354 ) + 4649 ( 1596 ) + 4650 ( -3334 ) + 4651 ( 3355 ) + 4652 ( 3356 ) + 4653 ( 3357 ) + 4654 ( 3358 ) + 4655 ( 3359 ) + 4656 ( 3360 ) + 4657 ( -3354 ) + 4658 ( 3361 ) + 4659 ( -3347 ) + 4660 ( 3362 ) + 4661 ( 3355 ) + 4662 ( 3333 ) + 4663 ( -3363 ) + 4664 ( -3364 ) + 4665 ( -3365 ) + 4666 ( 3366 ) + 4667 ( -3367 ) + 4668 ( -3340 ) + 4669 ( -3368 ) + 4670 ( -3363 ) + 4671 ( 3369 ) + 4672 ( -3370 ) + 4673 ( -3371 ) + 4674 ( -3372 ) + 4675 ( 3369 ) + 4676 ( 3366 ) + 4677 ( -2822 ) + 4678 ( -2813 ) + 4679 ( 2817 ) + 4680 ( -1504 ) + 4681 ( 1507 ) + 4682 ( 3373 ) + 4683 ( 3374 ) + 4684 ( 1598 ) + 4685 ( 3375 ) + 4686 ( 3376 ) + 4687 ( 3377 ) + 4688 ( 1601 ) + 4689 ( 3360 ) + 4690 ( -3378 ) + 4691 ( 3375 ) + 4692 ( 1597 ) + 4693 ( 3379 ) + 4694 ( -3380 ) + 4695 ( -3381 ) + 4696 ( -3382 ) + 4697 ( -3383 ) + 4698 ( -2432 ) + 4699 ( 2473 ) + 4700 ( -2409 ) + 4701 ( 2376 ) + 4702 ( 2375 ) + 4703 ( -2823 ) + 4704 ( 3374 ) + 4705 ( 3384 ) + 4706 ( 3379 ) + 4707 ( -3385 ) + 4708 ( -3285 ) + 4709 ( -3297 ) + 4710 ( -3386 ) + 4711 ( 2678 ) + 4712 ( 2669 ) + 4713 ( 2677 ) + 4714 ( 3387 ) + 4715 ( 3388 ) + 4716 ( -3294 ) + 4717 ( -3385 ) + 4718 ( 3389 ) + 4719 ( 3204 ) + 4720 ( 3200 ) + 4721 ( 3169 ) + 4722 ( 3238 ) + 4723 ( -3249 ) + 4724 ( 3242 ) + 4725 ( 3256 ) + 4726 ( 3277 ) + 4727 ( 3390 ) + 4728 ( -3382 ) + 4729 ( -3209 ) + 4730 ( -3213 ) + 4731 ( 3391 ) + 4732 ( 3392 ) + 4733 ( 3393 ) + 4734 ( -3394 ) + 4735 ( 3395 ) + 4736 ( 3396 ) + 4737 ( 3397 ) + 4738 ( 3398 ) + 4739 ( -3399 ) + 4740 ( 3400 ) + 4741 ( 3397 ) + 4742 ( -3401 ) + 4743 ( 3402 ) + 4744 ( 3403 ) + 4745 ( 3404 ) + 4746 ( 2838 ) + 4747 ( -2780 ) + 4748 ( 3405 ) + 4749 ( 3406 ) + 4750 ( 3407 ) + 4751 ( 3408 ) + 4752 ( 3409 ) + 4753 ( 3410 ) + 4754 ( 3411 ) + 4755 ( -3412 ) + 4756 ( -3413 ) + 4757 ( -3414 ) + 4758 ( -3414 ) + 4759 ( -3415 ) + 4760 ( 3416 ) + 4761 ( 3417 ) + 4762 ( -3418 ) + 4763 ( 3419 ) + 4764 ( -3420 ) + 4765 ( -3365 ) + 4766 ( -3421 ) + 4767 ( 3422 ) + 4768 ( 3423 ) + 4769 ( 3424 ) + 4770 ( 3425 ) + 4771 ( 3426 ) + 4772 ( 3427 ) + 4773 ( 3428 ) + 4774 ( -3370 ) + 4775 ( -3420 ) + 4776 ( 3429 ) + 4777 ( -3430 ) + 4778 ( -2846 ) + 4779 ( 2840 ) + 4780 ( -3431 ) + 4781 ( 3432 ) + 4782 ( 3433 ) + 4783 ( -3434 ) + 4784 ( 3405 ) + 4785 ( 3435 ) + 4786 ( 3436 ) + 4787 ( 3406 ) + 4788 ( -3434 ) + 4789 ( 3437 ) + 4790 ( -3438 ) + 4791 ( -3439 ) + 4792 ( -3440 ) + 4793 ( -3441 ) + 4794 ( -3442 ) + 4795 ( 3443 ) + 4796 ( -3444 ) + 4797 ( 3437 ) + 4798 ( -3440 ) + 4799 ( 3445 ) + 4800 ( 3446 ) + 4801 ( 3447 ) + 4802 ( 3447 ) + 4803 ( 3448 ) + 4804 ( 3449 ) + 4805 ( 3450 ) + 4806 ( -3441 ) + 4807 ( 3451 ) + 4808 ( -3452 ) + 4809 ( 3395 ) + 4810 ( 3453 ) + 4811 ( -2661 ) + 4812 ( -2685 ) + 4813 ( -2680 ) + 4814 ( 3454 ) + 4815 ( -3455 ) + 4816 ( 3456 ) + 4817 ( 3457 ) + 4818 ( 3458 ) + 4819 ( 3459 ) + 4820 ( 3460 ) + 4821 ( 3461 ) + 4822 ( -3455 ) + 4823 ( 3462 ) + 4824 ( 3463 ) + 4825 ( -3452 ) + 4826 ( 3464 ) + 4827 ( -3465 ) + 4828 ( -3466 ) + 4829 ( -3467 ) + 4830 ( -3468 ) + 4831 ( -3469 ) + 4832 ( -3470 ) + 4833 ( -3471 ) + 4834 ( -3472 ) + 4835 ( -3473 ) + 4836 ( -3474 ) + 4837 ( -3475 ) + 4838 ( -3476 ) + 4839 ( -3477 ) + 4840 ( -3478 ) + 4841 ( -3479 ) + 4842 ( -3480 ) + 4843 ( -3481 ) + 4844 ( -3482 ) + 4845 ( -3480 ) + 4846 ( -3483 ) + 4847 ( -3484 ) + 4848 ( -3485 ) + 4849 ( -3486 ) + 4850 ( -3487 ) + 4851 ( -3488 ) + 4852 ( -3489 ) + 4853 ( -3490 ) + 4854 ( -3491 ) + 4855 ( -3492 ) + 4856 ( -3493 ) + 4857 ( 3494 ) + 4858 ( -3495 ) + 4859 ( -3496 ) + 4860 ( 3497 ) + 4861 ( 3498 ) + 4862 ( -3499 ) + 4863 ( 3500 ) + 4864 ( -3501 ) + 4865 ( 3502 ) + 4866 ( -3503 ) + 4867 ( -3504 ) + 4868 ( -3505 ) + 4869 ( 3506 ) + 4870 ( -3507 ) + 4871 ( 3508 ) + 4872 ( 3460 ) + 4873 ( -3509 ) + 4874 ( -3510 ) + 4875 ( -3511 ) + 4876 ( -3504 ) + 4877 ( -3512 ) + 4878 ( -3513 ) + 4879 ( -3514 ) + 4880 ( -3515 ) + 4881 ( -3516 ) + 4882 ( -3517 ) + 4883 ( -3518 ) + 4884 ( -3505 ) + 4885 ( -3511 ) + 4886 ( -3519 ) + 4887 ( 3520 ) + 4888 ( -3509 ) + 4889 ( 3521 ) + 4890 ( -3522 ) + 4891 ( -3519 ) + 4892 ( 3523 ) + 4893 ( -3524 ) + 4894 ( -3525 ) + 4895 ( 3526 ) + 4896 ( -3524 ) + 4897 ( 3527 ) + 4898 ( 3508 ) + 4899 ( -3528 ) + 4900 ( 3462 ) + 4901 ( 3461 ) + 4902 ( 3529 ) + 4903 ( 3410 ) + 4904 ( -3530 ) + 4905 ( -3439 ) + 4906 ( -3530 ) + 4907 ( 3419 ) + 4908 ( 3531 ) + 4909 ( 3445 ) + 4910 ( 3532 ) + 4911 ( 3402 ) + 4912 ( -2779 ) + 4913 ( -3533 ) + 4914 ( 3534 ) + 4915 ( 3535 ) + 4916 ( -3533 ) + 4917 ( -2785 ) + 4918 ( 3536 ) + 4919 ( 3454 ) + 4920 ( -2679 ) + 4921 ( -3386 ) + 4922 ( -3299 ) + 4923 ( 3537 ) + 4924 ( 3538 ) + 4925 ( 3539 ) + 4926 ( -3103 ) + 4927 ( 3540 ) + 4928 ( -3541 ) + 4929 ( 3457 ) + 4930 ( -3542 ) + 4931 ( 3458 ) + 4932 ( 3543 ) + 4933 ( -3544 ) + 4934 ( 3545 ) + 4935 ( 3543 ) + 4936 ( -3541 ) + 4937 ( -3546 ) + 4938 ( -3547 ) + 4939 ( 3548 ) + 4940 ( 3549 ) + 4941 ( 3550 ) + 4942 ( -3544 ) + 4943 ( 3551 ) + 4944 ( 3550 ) + 4945 ( 3552 ) + 4946 ( 3553 ) + 4947 ( 3554 ) + 4948 ( 3555 ) + 4949 ( 3556 ) + 4950 ( 3557 ) + 4951 ( 3443 ) + 4952 ( 3558 ) + 4953 ( 3559 ) + 4954 ( 3560 ) + 4955 ( 3450 ) + 4956 ( -3561 ) + 4957 ( 3562 ) + 4958 ( 3558 ) + 4959 ( -3442 ) + 4960 ( -3563 ) + 4961 ( -3564 ) + 4962 ( -3565 ) + 4963 ( -3566 ) + 4964 ( -3567 ) + 4965 ( -3568 ) + 4966 ( -3569 ) + 4967 ( -3570 ) + 4968 ( -3571 ) + 4969 ( 3572 ) + 4970 ( -3573 ) + 4971 ( 3574 ) + 4972 ( -3575 ) + 4973 ( -3576 ) + 4974 ( 3574 ) + 4975 ( -3577 ) + 4976 ( -3578 ) + 4977 ( -3579 ) + 4978 ( -3580 ) + 4979 ( -3581 ) + 4980 ( -3582 ) + 4981 ( -3583 ) + 4982 ( -3581 ) + 4983 ( -3584 ) + 4984 ( -3585 ) + 4985 ( 3586 ) + 4986 ( -3587 ) + 4987 ( 3588 ) + 4988 ( -3499 ) + 4989 ( -3589 ) + 4990 ( 3590 ) + 4991 ( 3591 ) + 4992 ( 3592 ) + 4993 ( 3593 ) + 4994 ( -3594 ) + 4995 ( 3595 ) + 4996 ( 3596 ) + 4997 ( 3597 ) + 4998 ( 3598 ) + 4999 ( 3599 ) + 5000 ( 3600 ) + 5001 ( 3601 ) + 5002 ( -3602 ) + 5003 ( 3603 ) + 5004 ( -3604 ) + 5005 ( 3605 ) + 5006 ( 3606 ) + 5007 ( -3604 ) + 5008 ( 3607 ) + 5009 ( 3608 ) + 5010 ( -3594 ) + 5011 ( 3609 ) + 5012 ( 3590 ) + 5013 ( 3610 ) + 5014 ( -3602 ) + 5015 ( 3548 ) + 5016 ( -3611 ) + 5017 ( -3612 ) + 5018 ( -3613 ) + 5019 ( -3614 ) + 5020 ( -3615 ) + 5021 ( -3616 ) + 5022 ( 3596 ) + 5023 ( 3608 ) + 5024 ( 3617 ) + 5025 ( -3618 ) + 5026 ( 3595 ) + 5027 ( 3619 ) + 5028 ( -3620 ) + 5029 ( -3614 ) + 5030 ( -3618 ) + 5031 ( 3621 ) + 5032 ( -3622 ) + 5033 ( 3623 ) + 5034 ( 3624 ) + 5035 ( 3625 ) + 5036 ( 3626 ) + 5037 ( -3627 ) + 5038 ( -3628 ) + 5039 ( 3629 ) + 5040 ( -3630 ) + 5041 ( -3631 ) + 5042 ( -3630 ) + 5043 ( 3632 ) + 5044 ( 3633 ) + 5045 ( -3622 ) + 5046 ( -3634 ) + 5047 ( 3592 ) + 5048 ( 3635 ) + 5049 ( -3628 ) +} +faces 8695 { + 0 ( 0 0 0 0 0 0 ) + 1 ( 8 0 1 703 0 0 ) + 2 ( 8 0 1 777 0 0 ) + 3 ( 8 0 1 733 0 0 ) + 4 ( 8 0 1 684 0 0 ) + 5 ( 8 0 1 700 0 0 ) + 6 ( 8 0 1 690 0 0 ) + 7 ( 8 0 1 689 0 0 ) + 8 ( 8 0 1 688 0 0 ) + 9 ( 8 0 1 687 0 0 ) + 10 ( 8 0 1 686 0 0 ) + 11 ( 8 0 1 685 0 0 ) + 12 ( 8 0 1 682 0 0 ) + 13 ( 8 0 1 681 0 0 ) + 14 ( 8 0 1 679 0 0 ) + 15 ( 8 0 1 77 0 0 ) + 16 ( 8 0 1 76 0 0 ) + 17 ( 8 0 1 74 0 0 ) + 18 ( 8 0 1 58 0 0 ) + 19 ( 8 0 1 53 0 0 ) + 20 ( 8 0 1 49 0 0 ) + 21 ( 8 0 1 47 0 0 ) + 22 ( 8 0 1 44 0 0 ) + 23 ( 8 0 1 43 0 0 ) + 24 ( 16 1 1 0 0 0 ) + 25 ( 11 1 1 0 0 0 ) + 26 ( 15 1 1 0 0 0 ) + 27 ( 4 0 1 784 0 0 ) + 28 ( 8 0 1 692 0 0 ) + 29 ( 8 0 1 755 0 0 ) + 30 ( 8 0 1 747 0 0 ) + 31 ( 8 0 1 748 0 0 ) + 32 ( 8 0 1 754 0 0 ) + 33 ( 8 0 1 756 0 0 ) + 34 ( 8 0 1 762 0 0 ) + 35 ( 8 0 1 767 0 0 ) + 36 ( 8 0 1 775 0 0 ) + 37 ( 8 0 1 774 0 0 ) + 38 ( 8 0 1 768 0 0 ) + 39 ( 8 0 1 776 0 0 ) + 40 ( 8 0 1 698 0 0 ) + 41 ( 8 0 1 699 0 0 ) + 42 ( 8 0 1 693 0 0 ) + 43 ( 8 0 1 694 0 0 ) + 44 ( 8 0 1 753 0 0 ) + 45 ( 8 0 1 752 0 0 ) + 46 ( 8 0 1 751 0 0 ) + 47 ( 8 0 1 749 0 0 ) + 48 ( 8 0 1 750 0 0 ) + 49 ( 8 0 1 761 0 0 ) + 50 ( 8 0 1 760 0 0 ) + 51 ( 8 0 1 759 0 0 ) + 52 ( 8 0 1 757 0 0 ) + 53 ( 8 0 1 758 0 0 ) + 54 ( 8 0 1 766 0 0 ) + 55 ( 8 0 1 765 0 0 ) + 56 ( 8 0 1 763 0 0 ) + 57 ( 8 0 1 764 0 0 ) + 58 ( 8 0 1 773 0 0 ) + 59 ( 8 0 1 772 0 0 ) + 60 ( 8 0 1 771 0 0 ) + 61 ( 8 0 1 769 0 0 ) + 62 ( 8 0 1 770 0 0 ) + 63 ( 8 0 1 115 0 0 ) + 64 ( 8 0 1 88 0 0 ) + 65 ( 8 0 1 87 0 0 ) + 66 ( 8 0 1 89 0 0 ) + 67 ( 8 0 1 90 0 0 ) + 68 ( 8 0 1 91 0 0 ) + 69 ( 8 0 1 80 0 0 ) + 70 ( 8 0 1 79 0 0 ) + 71 ( 8 0 1 81 0 0 ) + 72 ( 8 0 1 82 0 0 ) + 73 ( 8 0 1 83 0 0 ) + 74 ( 8 0 1 75 0 0 ) + 75 ( 8 0 1 69 0 0 ) + 76 ( 8 0 1 68 0 0 ) + 77 ( 8 0 1 70 0 0 ) + 78 ( 8 0 1 71 0 0 ) + 79 ( 8 0 1 48 0 0 ) + 80 ( 8 0 1 54 0 0 ) + 81 ( 8 0 1 46 0 0 ) + 82 ( 8 0 1 45 0 0 ) + 83 ( 8 0 1 92 0 0 ) + 84 ( 8 0 1 86 0 0 ) + 85 ( 8 0 1 93 0 0 ) + 86 ( 8 0 1 85 0 0 ) + 87 ( 8 0 1 78 0 0 ) + 88 ( 8 0 1 84 0 0 ) + 89 ( 8 0 1 72 0 0 ) + 90 ( 8 0 1 73 0 0 ) + 91 ( 8 0 1 67 0 0 ) + 92 ( 8 0 1 59 0 0 ) + 93 ( 8 0 1 33 0 0 ) + 94 ( 4 0 1 116 0 0 ) + 95 ( 8 0 1 114 0 0 ) + 96 ( 8 0 1 113 0 0 ) + 97 ( 8 0 1 111 0 0 ) + 98 ( 8 0 1 34 0 0 ) + 99 ( 8 0 1 30 0 0 ) + 100 ( 13 0 1 2 0 0 ) + 101 ( 13 1 1 0 0 0 ) + 102 ( 8 0 2 53 0 0 ) + 103 ( 8 0 2 45 0 0 ) + 104 ( 8 0 2 32 0 0 ) + 105 ( 8 0 2 31 0 0 ) + 106 ( 8 0 2 33 0 0 ) + 107 ( 4 0 2 116 0 0 ) + 108 ( 8 0 2 112 0 0 ) + 109 ( 8 0 2 34 0 0 ) + 110 ( 19 1 2 0 0 0 ) + 111 ( 11 1 2 0 0 0 ) + 112 ( 21 1 2 0 0 0 ) + 113 ( 4 0 3 324 0 0 ) + 114 ( 27 0 3 29 0 0 ) + 115 ( 33 0 3 17 0 0 ) + 116 ( 4 0 3 259 0 0 ) + 117 ( 33 0 3 19 0 0 ) + 118 ( 37 0 3 7 0 0 ) + 119 ( 40 0 3 4 0 0 ) + 120 ( 33 1 3 0 0 0 ) + 121 ( 34 4 3 0 0 4 ) + 122 ( 37 1 3 0 0 0 ) + 123 ( 33 0 3 15 0 0 ) + 124 ( 4 0 4 324 0 0 ) + 125 ( 27 0 4 29 0 0 ) + 126 ( 37 0 4 7 0 0 ) + 127 ( 4 0 4 261 0 0 ) + 128 ( 34 4 4 0 4 5 ) + 129 ( 37 1 4 0 0 0 ) + 130 ( 38 0 4 5 0 0 ) + 131 ( 0 0 5 679 0 0 ) + 132 ( 4 0 5 324 0 0 ) + 133 ( 4 0 5 287 0 0 ) + 134 ( 27 0 5 29 0 0 ) + 135 ( 37 0 5 7 0 0 ) + 136 ( 4 0 5 275 0 0 ) + 137 ( 4 0 5 286 0 0 ) + 138 ( 4 0 5 263 0 0 ) + 139 ( 34 0 5 9 0 0 ) + 140 ( 34 0 5 8 0 0 ) + 141 ( 37 1 5 0 0 0 ) + 142 ( 0 0 6 681 0 0 ) + 143 ( 23 0 6 43 0 0 ) + 144 ( 27 0 6 29 0 0 ) + 145 ( 33 0 6 17 0 0 ) + 146 ( 23 0 6 60 0 0 ) + 147 ( 33 0 6 13 0 0 ) + 148 ( 44 0 6 7 0 0 ) + 149 ( 42 4 6 0 9 5 ) + 150 ( 23 1 6 0 0 0 ) + 151 ( 23 0 6 59 0 0 ) + 152 ( 0 0 7 682 0 0 ) + 153 ( 27 0 7 29 0 0 ) + 154 ( 33 0 7 17 0 0 ) + 155 ( 33 0 7 14 0 0 ) + 156 ( 42 4 7 0 14 6 ) + 157 ( 39 0 8 273 0 0 ) + 158 ( 39 0 8 270 0 0 ) + 159 ( 34 0 263 8 0 0 ) + 160 ( 30 4 8 0 20 8 ) + 161 ( 39 1 8 0 0 0 ) + 162 ( 46 0 8 264 0 0 ) + 163 ( 48 0 8 265 0 0 ) + 164 ( 37 0 8 10 0 0 ) + 165 ( 46 0 8 9 0 0 ) + 166 ( 37 1 8 0 0 0 ) + 167 ( 39 0 8 12 0 0 ) + 168 ( 39 1 8 0 0 0 ) + 169 ( 0 0 9 679 0 0 ) + 170 ( 4 0 9 287 0 0 ) + 171 ( 4 0 9 264 0 0 ) + 172 ( 30 0 9 21 0 0 ) + 173 ( 30 0 9 20 0 0 ) + 174 ( 37 0 9 11 0 0 ) + 175 ( 37 1 9 0 0 0 ) + 176 ( 46 0 10 11 0 0 ) + 177 ( 51 1 10 0 0 0 ) + 178 ( 39 0 10 12 0 0 ) + 179 ( 30 4 10 0 28 4 ) + 180 ( 23 1 10 0 0 0 ) + 181 ( 0 0 11 680 0 0 ) + 182 ( 30 0 11 21 0 0 ) + 183 ( 30 0 11 20 0 0 ) + 184 ( 51 1 11 0 0 0 ) + 185 ( 23 1 11 0 0 0 ) + 186 ( 23 1 12 0 0 0 ) + 187 ( 30 4 12 0 32 4 ) + 188 ( 52 1 12 0 0 0 ) + 189 ( 51 1 12 0 0 0 ) + 190 ( 23 0 13 43 0 0 ) + 191 ( 57 0 13 17 0 0 ) + 192 ( 44 0 13 14 0 0 ) + 193 ( 23 1 13 0 0 0 ) + 194 ( 29 1 13 0 0 0 ) + 195 ( 42 4 13 0 36 5 ) + 196 ( 57 1 13 0 0 0 ) + 197 ( 57 0 14 17 0 0 ) + 198 ( 29 1 14 0 0 0 ) + 199 ( 42 4 14 0 41 5 ) + 200 ( 57 1 14 0 0 0 ) + 201 ( 36 0 14 15 0 0 ) + 202 ( 57 0 15 17 0 0 ) + 203 ( 4 0 15 316 0 0 ) + 204 ( 4 0 15 318 0 0 ) + 205 ( 42 0 15 19 0 0 ) + 206 ( 42 0 15 18 0 0 ) + 207 ( 57 1 15 0 0 0 ) + 208 ( 29 1 15 0 0 0 ) + 209 ( 63 0 338 16 0 0 ) + 210 ( 27 0 16 29 0 0 ) + 211 ( 28 0 24 16 0 0 ) + 212 ( 58 4 16 0 46 6 ) + 213 ( 27 0 16 357 0 0 ) + 214 ( 61 0 339 16 0 0 ) + 215 ( 60 0 16 324 0 0 ) + 216 ( 60 0 16 17 0 0 ) + 217 ( 23 1 16 0 0 0 ) + 218 ( 4 0 17 324 0 0 ) + 219 ( 23 0 17 43 0 0 ) + 220 ( 27 0 17 29 0 0 ) + 221 ( 61 1 17 0 0 0 ) + 222 ( 23 1 17 0 0 0 ) + 223 ( 4 0 18 316 0 0 ) + 224 ( 64 0 18 19 0 0 ) + 225 ( 37 1 18 0 0 0 ) + 226 ( 54 4 18 0 52 4 ) + 227 ( 29 1 18 0 0 0 ) + 228 ( 4 0 19 318 0 0 ) + 229 ( 37 1 19 0 0 0 ) + 230 ( 54 4 19 0 56 4 ) + 231 ( 30 0 287 20 0 0 ) + 232 ( 72 0 20 21 0 0 ) + 233 ( 30 0 264 20 0 0 ) + 234 ( 67 4 0 20 60 5 ) + 235 ( 47 1 20 0 0 0 ) + 236 ( 49 0 307 20 0 0 ) + 237 ( 49 0 308 20 0 0 ) + 238 ( 23 1 20 0 0 0 ) + 239 ( 0 0 21 893 0 0 ) + 240 ( 0 0 21 680 0 0 ) + 241 ( 0 0 21 679 0 0 ) + 242 ( 70 0 313 21 0 0 ) + 243 ( 70 0 311 21 0 0 ) + 244 ( 30 0 291 21 0 0 ) + 245 ( 67 0 255 21 0 0 ) + 246 ( 67 0 23 21 0 0 ) + 247 ( 67 0 22 21 0 0 ) + 248 ( 30 0 293 21 0 0 ) + 249 ( 75 0 247 21 0 0 ) + 250 ( 75 0 236 21 0 0 ) + 251 ( 0 0 21 896 0 0 ) + 252 ( 30 0 287 21 0 0 ) + 253 ( 0 0 21 902 0 0 ) + 254 ( 70 0 308 21 0 0 ) + 255 ( 70 0 309 21 0 0 ) + 256 ( 67 0 257 21 0 0 ) + 257 ( 67 0 256 21 0 0 ) + 258 ( 23 1 21 0 0 0 ) + 259 ( 0 0 22 680 0 0 ) + 260 ( 0 0 22 679 0 0 ) + 261 ( 77 0 22 23 0 0 ) + 262 ( 0 0 22 902 0 0 ) + 263 ( 6 4 22 0 65 6 ) + 264 ( 77 1 22 0 0 0 ) + 265 ( 78 0 22 256 0 0 ) + 266 ( 23 1 22 0 0 0 ) + 267 ( 80 4 23 0 71 5 ) + 268 ( 78 0 23 257 0 0 ) + 269 ( 23 1 23 0 0 0 ) + 270 ( 28 0 24 338 0 0 ) + 271 ( 27 1 24 0 0 0 ) + 272 ( 84 1 24 0 0 0 ) + 273 ( 58 4 24 0 76 7 ) + 274 ( 13 1 24 0 0 0 ) + 275 ( 13 0 24 326 0 0 ) + 276 ( 13 1 24 0 0 0 ) + 277 ( 23 1 24 0 0 0 ) + 278 ( 58 4 25 0 83 10 ) + 279 ( 21 1 25 0 0 0 ) + 280 ( 86 1 25 0 0 0 ) + 281 ( 88 0 25 26 0 0 ) + 282 ( 25 1 25 0 0 0 ) + 283 ( 91 0 25 56 0 0 ) + 284 ( 91 1 25 0 0 0 ) + 285 ( 91 1 25 0 0 0 ) + 286 ( 91 1 25 0 0 0 ) + 287 ( 91 0 25 57 0 0 ) + 288 ( 91 0 25 55 0 0 ) + 289 ( 91 1 25 0 0 0 ) + 290 ( 36 0 26 28 0 0 ) + 291 ( 36 0 26 27 0 0 ) + 292 ( 21 1 26 0 0 0 ) + 293 ( 36 1 26 0 0 0 ) + 294 ( 36 1 26 0 0 0 ) + 295 ( 86 1 26 0 0 0 ) + 296 ( 25 1 26 0 0 0 ) + 297 ( 36 1 26 0 0 0 ) + 298 ( 36 1 26 0 0 0 ) + 299 ( 58 4 26 0 93 5 ) + 300 ( 4 0 27 327 0 0 ) + 301 ( 4 0 27 331 0 0 ) + 302 ( 27 0 27 28 0 0 ) + 303 ( 96 1 27 0 0 0 ) + 304 ( 93 1 27 0 0 0 ) + 305 ( 58 4 27 0 98 5 ) + 306 ( 27 1 27 0 0 0 ) + 307 ( 86 1 27 0 0 0 ) + 308 ( 4 0 28 327 0 0 ) + 309 ( 102 1 28 0 0 0 ) + 310 ( 104 1 28 0 0 0 ) + 311 ( 25 1 28 0 0 0 ) + 312 ( 0 0 29 682 0 0 ) + 313 ( 0 0 29 681 0 0 ) + 314 ( 0 0 29 679 0 0 ) + 315 ( 23 0 29 43 0 0 ) + 316 ( 29 0 29 42 0 0 ) + 317 ( 29 1 29 0 0 0 ) + 318 ( 23 1 29 0 0 0 ) + 319 ( 4 0 29 357 0 0 ) + 320 ( 4 0 29 358 0 0 ) + 321 ( 4 0 29 359 0 0 ) + 322 ( 23 0 29 59 0 0 ) + 323 ( 29 1 29 0 0 0 ) + 324 ( 108 0 41 29 0 0 ) + 325 ( 0 0 30 682 0 0 ) + 326 ( 0 0 30 681 0 0 ) + 327 ( 0 0 30 679 0 0 ) + 328 ( 23 0 30 43 0 0 ) + 329 ( 4 0 30 343 0 0 ) + 330 ( 23 0 30 59 0 0 ) + 331 ( 110 0 30 41 0 0 ) + 332 ( 113 0 30 37 0 0 ) + 333 ( 113 0 30 33 0 0 ) + 334 ( 113 1 30 0 0 0 ) + 335 ( 113 0 30 38 0 0 ) + 336 ( 113 0 30 34 0 0 ) + 337 ( 100 0 31 32 0 0 ) + 338 ( 21 1 31 0 0 0 ) + 339 ( 8 0 116 31 0 0 ) + 340 ( 116 1 31 0 0 0 ) + 341 ( 110 0 31 364 0 0 ) + 342 ( 110 0 31 365 0 0 ) + 343 ( 110 0 31 366 0 0 ) + 344 ( 45 0 31 35 0 0 ) + 345 ( 110 0 31 39 0 0 ) + 346 ( 45 1 31 0 0 0 ) + 347 ( 45 0 31 38 0 0 ) + 348 ( 45 0 31 34 0 0 ) + 349 ( 115 0 343 32 0 0 ) + 350 ( 8 0 116 32 0 0 ) + 351 ( 116 1 32 0 0 0 ) + 352 ( 110 4 32 0 103 7 ) + 353 ( 116 0 32 344 0 0 ) + 354 ( 45 0 32 36 0 0 ) + 355 ( 45 1 32 0 0 0 ) + 356 ( 45 0 32 38 0 0 ) + 357 ( 45 0 32 34 0 0 ) + 358 ( 114 0 32 33 0 0 ) + 359 ( 4 0 33 343 0 0 ) + 360 ( 110 0 33 41 0 0 ) + 361 ( 110 0 33 40 0 0 ) + 362 ( 45 0 33 37 0 0 ) + 363 ( 45 0 33 34 0 0 ) + 364 ( 45 0 33 38 0 0 ) + 365 ( 45 1 33 0 0 0 ) + 366 ( 23 0 34 44 0 0 ) + 367 ( 23 0 34 45 0 0 ) + 368 ( 118 4 34 0 110 7 ) + 369 ( 21 1 34 0 0 0 ) + 370 ( 100 0 35 36 0 0 ) + 371 ( 23 1 35 0 0 0 ) + 372 ( 110 0 35 39 0 0 ) + 373 ( 121 0 35 38 0 0 ) + 374 ( 21 1 35 0 0 0 ) + 375 ( 23 1 36 0 0 0 ) + 376 ( 110 4 36 0 117 4 ) + 377 ( 121 0 36 38 0 0 ) + 378 ( 114 0 36 37 0 0 ) + 379 ( 110 0 37 41 0 0 ) + 380 ( 110 0 37 40 0 0 ) + 381 ( 121 0 37 38 0 0 ) + 382 ( 23 1 37 0 0 0 ) + 383 ( 21 1 38 0 0 0 ) + 384 ( 122 1 38 0 0 0 ) + 385 ( 4 0 39 366 0 0 ) + 386 ( 4 0 39 365 0 0 ) + 387 ( 23 1 39 0 0 0 ) + 388 ( 108 4 39 0 121 5 ) + 389 ( 100 1 39 0 0 0 ) + 390 ( 21 1 39 0 0 0 ) + 391 ( 110 0 345 40 0 0 ) + 392 ( 110 0 343 40 0 0 ) + 393 ( 84 1 40 0 0 0 ) + 394 ( 124 4 40 0 126 8 ) + 395 ( 12 0 40 367 0 0 ) + 396 ( 12 0 40 41 0 0 ) + 397 ( 23 1 40 0 0 0 ) + 398 ( 0 0 41 682 0 0 ) + 399 ( 0 0 41 681 0 0 ) + 400 ( 0 0 41 679 0 0 ) + 401 ( 23 0 41 43 0 0 ) + 402 ( 108 0 41 42 0 0 ) + 403 ( 4 0 41 367 0 0 ) + 404 ( 23 0 41 59 0 0 ) + 405 ( 23 1 41 0 0 0 ) + 406 ( 4 0 41 357 0 0 ) + 407 ( 4 0 41 358 0 0 ) + 408 ( 4 0 41 359 0 0 ) + 409 ( 124 4 42 0 134 4 ) + 410 ( 4 0 42 367 0 0 ) + 411 ( 23 1 42 0 0 0 ) + 412 ( 76 0 43 60 0 0 ) + 413 ( 132 0 43 44 0 0 ) + 414 ( 42 4 43 0 138 6 ) + 415 ( 132 1 43 0 0 0 ) + 416 ( 129 0 43 48 0 0 ) + 417 ( 76 0 43 59 0 0 ) + 418 ( 129 0 43 49 0 0 ) + 419 ( 76 1 43 0 0 0 ) + 420 ( 129 1 43 0 0 0 ) + 421 ( 129 0 43 52 0 0 ) + 422 ( 129 0 43 51 0 0 ) + 423 ( 129 0 43 50 0 0 ) + 424 ( 134 0 47 44 0 0 ) + 425 ( 118 4 44 0 144 8 ) + 426 ( 134 0 54 44 0 0 ) + 427 ( 136 0 53 44 0 0 ) + 428 ( 132 0 48 44 0 0 ) + 429 ( 138 0 45 44 0 0 ) + 430 ( 136 0 46 44 0 0 ) + 431 ( 129 0 45 53 0 0 ) + 432 ( 138 0 45 46 0 0 ) + 433 ( 118 4 45 0 152 5 ) + 434 ( 21 1 45 0 0 0 ) + 435 ( 129 0 46 53 0 0 ) + 436 ( 118 4 46 0 157 3 ) + 437 ( 144 0 47 49 0 0 ) + 438 ( 131 0 47 113 0 0 ) + 439 ( 147 0 47 107 0 0 ) + 440 ( 118 4 47 0 160 8 ) + 441 ( 147 0 47 93 0 0 ) + 442 ( 131 0 47 54 0 0 ) + 443 ( 131 0 47 53 0 0 ) + 444 ( 118 4 48 0 168 3 ) + 445 ( 144 0 48 49 0 0 ) + 446 ( 76 0 49 58 0 0 ) + 447 ( 118 0 49 50 0 0 ) + 448 ( 118 0 49 61 0 0 ) + 449 ( 147 0 49 93 0 0 ) + 450 ( 147 0 49 104 0 0 ) + 451 ( 118 0 49 62 0 0 ) + 452 ( 147 0 49 96 0 0 ) + 453 ( 147 0 49 102 0 0 ) + 454 ( 76 0 50 58 0 0 ) + 455 ( 145 0 50 52 0 0 ) + 456 ( 145 0 50 51 0 0 ) + 457 ( 145 1 50 0 0 0 ) + 458 ( 76 0 50 65 0 0 ) + 459 ( 76 1 50 0 0 0 ) + 460 ( 76 1 50 0 0 0 ) + 461 ( 76 1 50 0 0 0 ) + 462 ( 42 4 50 0 171 6 ) + 463 ( 149 0 50 62 0 0 ) + 464 ( 121 0 51 52 0 0 ) + 465 ( 42 4 51 0 177 4 ) + 466 ( 131 1 51 0 0 0 ) + 467 ( 149 0 51 64 0 0 ) + 468 ( 150 1 52 0 0 0 ) + 469 ( 147 1 52 0 0 0 ) + 470 ( 145 0 61 52 0 0 ) + 471 ( 121 0 63 52 0 0 ) + 472 ( 145 0 62 52 0 0 ) + 473 ( 121 0 64 52 0 0 ) + 474 ( 118 4 53 0 181 9 ) + 475 ( 21 1 53 0 0 0 ) + 476 ( 127 0 53 111 0 0 ) + 477 ( 127 0 53 112 0 0 ) + 478 ( 136 0 53 54 0 0 ) + 479 ( 127 0 53 113 0 0 ) + 480 ( 118 4 54 0 190 3 ) + 481 ( 25 1 55 0 0 0 ) + 482 ( 152 1 55 0 0 0 ) + 483 ( 157 1 55 0 0 0 ) + 484 ( 155 1 55 0 0 0 ) + 485 ( 58 4 55 0 193 4 ) + 486 ( 25 1 56 0 0 0 ) + 487 ( 159 1 56 0 0 0 ) + 488 ( 58 4 56 0 197 4 ) + 489 ( 157 1 56 0 0 0 ) + 490 ( 160 1 56 0 0 0 ) + 491 ( 25 1 57 0 0 0 ) + 492 ( 165 1 57 0 0 0 ) + 493 ( 58 4 57 0 201 4 ) + 494 ( 162 1 57 0 0 0 ) + 495 ( 157 1 57 0 0 0 ) + 496 ( 0 0 58 684 0 0 ) + 497 ( 166 4 58 0 205 7 ) + 498 ( 147 1 58 0 0 0 ) + 499 ( 76 0 61 58 0 0 ) + 500 ( 147 0 58 93 0 0 ) + 501 ( 147 0 58 104 0 0 ) + 502 ( 76 0 62 58 0 0 ) + 503 ( 147 0 58 96 0 0 ) + 504 ( 128 0 58 59 0 0 ) + 505 ( 0 0 59 686 0 0 ) + 506 ( 0 0 59 685 0 0 ) + 507 ( 166 0 59 60 0 0 ) + 508 ( 0 0 60 686 0 0 ) + 509 ( 0 0 60 685 0 0 ) + 510 ( 168 4 60 0 212 5 ) + 511 ( 147 0 61 102 0 0 ) + 512 ( 147 0 61 96 0 0 ) + 513 ( 170 0 61 62 0 0 ) + 514 ( 147 0 61 104 0 0 ) + 515 ( 145 0 61 63 0 0 ) + 516 ( 145 1 61 0 0 0 ) + 517 ( 76 1 61 0 0 0 ) + 518 ( 42 0 61 66 0 0 ) + 519 ( 147 1 61 0 0 0 ) + 520 ( 145 0 62 64 0 0 ) + 521 ( 42 4 62 0 217 4 ) + 522 ( 76 1 62 0 0 0 ) + 523 ( 145 1 62 0 0 0 ) + 524 ( 170 0 63 64 0 0 ) + 525 ( 42 0 63 66 0 0 ) + 526 ( 147 1 63 0 0 0 ) + 527 ( 131 1 63 0 0 0 ) + 528 ( 131 1 64 0 0 0 ) + 529 ( 42 4 64 0 221 4 ) + 530 ( 179 0 683 65 0 0 ) + 531 ( 177 1 65 0 0 0 ) + 532 ( 42 4 65 0 225 4 ) + 533 ( 172 1 65 0 0 0 ) + 534 ( 175 1 65 0 0 0 ) + 535 ( 131 1 66 0 0 0 ) + 536 ( 147 1 66 0 0 0 ) + 537 ( 76 1 66 0 0 0 ) + 538 ( 54 4 66 0 229 4 ) + 539 ( 170 1 66 0 0 0 ) + 540 ( 184 0 67 77 0 0 ) + 541 ( 186 0 67 71 0 0 ) + 542 ( 182 0 67 109 0 0 ) + 543 ( 182 0 67 108 0 0 ) + 544 ( 184 0 67 78 0 0 ) + 545 ( 186 0 67 73 0 0 ) + 546 ( 131 0 67 114 0 0 ) + 547 ( 15 1 67 0 0 0 ) + 548 ( 196 0 68 69 0 0 ) + 549 ( 193 0 68 71 0 0 ) + 550 ( 15 1 68 0 0 0 ) + 551 ( 182 4 68 0 233 4 ) + 552 ( 194 0 68 70 0 0 ) + 553 ( 15 1 69 0 0 0 ) + 554 ( 182 4 69 0 237 4 ) + 555 ( 190 0 69 72 0 0 ) + 556 ( 194 0 69 70 0 0 ) + 557 ( 190 0 70 72 0 0 ) + 558 ( 182 4 70 0 241 5 ) + 559 ( 188 0 70 73 0 0 ) + 560 ( 193 0 70 71 0 0 ) + 561 ( 188 0 71 73 0 0 ) + 562 ( 15 1 71 0 0 0 ) + 563 ( 182 4 71 0 246 5 ) + 564 ( 0 0 72 687 0 0 ) + 565 ( 189 0 73 72 0 0 ) + 566 ( 191 1 72 0 0 0 ) + 567 ( 180 4 72 0 251 4 ) + 568 ( 15 1 72 0 0 0 ) + 569 ( 0 0 73 687 0 0 ) + 570 ( 186 0 109 73 0 0 ) + 571 ( 184 0 73 84 0 0 ) + 572 ( 184 0 73 78 0 0 ) + 573 ( 180 4 73 0 255 7 ) + 574 ( 189 1 73 0 0 0 ) + 575 ( 184 1 73 0 0 0 ) + 576 ( 184 0 73 83 0 0 ) + 577 ( 205 0 74 77 0 0 ) + 578 ( 206 0 74 76 0 0 ) + 579 ( 182 4 74 0 262 4 ) + 580 ( 211 0 74 115 0 0 ) + 581 ( 208 0 74 75 0 0 ) + 582 ( 205 0 75 77 0 0 ) + 583 ( 182 4 75 0 266 4 ) + 584 ( 202 0 75 78 0 0 ) + 585 ( 206 0 75 76 0 0 ) + 586 ( 182 4 76 0 270 8 ) + 587 ( 199 0 113 76 0 0 ) + 588 ( 112 0 111 76 0 0 ) + 589 ( 206 0 115 76 0 0 ) + 590 ( 198 0 76 85 0 0 ) + 591 ( 202 0 76 78 0 0 ) + 592 ( 184 0 114 77 0 0 ) + 593 ( 112 0 111 77 0 0 ) + 594 ( 182 4 77 0 278 8 ) + 595 ( 205 0 115 77 0 0 ) + 596 ( 202 0 77 78 0 0 ) + 597 ( 184 0 109 78 0 0 ) + 598 ( 203 1 78 0 0 0 ) + 599 ( 199 0 105 78 0 0 ) + 600 ( 199 0 98 78 0 0 ) + 601 ( 180 4 78 0 286 5 ) + 602 ( 212 1 78 0 0 0 ) + 603 ( 212 0 78 82 0 0 ) + 604 ( 212 0 78 83 0 0 ) + 605 ( 198 0 78 85 0 0 ) + 606 ( 70 0 79 80 0 0 ) + 607 ( 215 0 79 82 0 0 ) + 608 ( 182 4 79 0 291 4 ) + 609 ( 205 0 79 83 0 0 ) + 610 ( 206 0 79 81 0 0 ) + 611 ( 200 0 80 84 0 0 ) + 612 ( 182 4 80 0 295 4 ) + 613 ( 205 0 80 83 0 0 ) + 614 ( 206 0 80 81 0 0 ) + 615 ( 182 4 81 0 299 5 ) + 616 ( 200 0 81 84 0 0 ) + 617 ( 198 0 81 85 0 0 ) + 618 ( 215 0 81 82 0 0 ) + 619 ( 198 0 82 85 0 0 ) + 620 ( 182 4 82 0 304 5 ) + 621 ( 205 0 82 83 0 0 ) + 622 ( 182 4 83 0 309 6 ) + 623 ( 200 0 83 84 0 0 ) + 624 ( 0 0 84 687 0 0 ) + 625 ( 201 1 84 0 0 0 ) + 626 ( 199 0 105 84 0 0 ) + 627 ( 199 0 98 84 0 0 ) + 628 ( 180 4 84 0 315 4 ) + 629 ( 198 0 84 85 0 0 ) + 630 ( 0 0 85 687 0 0 ) + 631 ( 216 0 85 91 0 0 ) + 632 ( 216 0 85 92 0 0 ) + 633 ( 216 0 85 86 0 0 ) + 634 ( 182 0 85 105 0 0 ) + 635 ( 182 0 85 107 0 0 ) + 636 ( 131 0 85 113 0 0 ) + 637 ( 186 0 86 90 0 0 ) + 638 ( 186 0 86 91 0 0 ) + 639 ( 182 0 86 106 0 0 ) + 640 ( 182 0 86 107 0 0 ) + 641 ( 131 0 86 113 0 0 ) + 642 ( 218 0 86 93 0 0 ) + 643 ( 196 0 87 88 0 0 ) + 644 ( 193 0 87 90 0 0 ) + 645 ( 182 4 87 0 319 4 ) + 646 ( 221 0 87 91 0 0 ) + 647 ( 222 0 87 89 0 0 ) + 648 ( 190 0 88 92 0 0 ) + 649 ( 182 4 88 0 323 4 ) + 650 ( 221 0 88 91 0 0 ) + 651 ( 222 0 88 89 0 0 ) + 652 ( 182 4 89 0 327 5 ) + 653 ( 218 0 89 93 0 0 ) + 654 ( 190 0 89 92 0 0 ) + 655 ( 193 0 89 90 0 0 ) + 656 ( 218 0 90 93 0 0 ) + 657 ( 182 4 90 0 332 5 ) + 658 ( 221 0 90 91 0 0 ) + 659 ( 182 4 91 0 337 6 ) + 660 ( 190 0 91 92 0 0 ) + 661 ( 0 0 92 687 0 0 ) + 662 ( 180 4 92 0 343 4 ) + 663 ( 219 0 94 92 0 0 ) + 664 ( 216 0 98 92 0 0 ) + 665 ( 191 1 92 0 0 0 ) + 666 ( 219 0 100 92 0 0 ) + 667 ( 216 0 105 92 0 0 ) + 668 ( 218 0 92 93 0 0 ) + 669 ( 0 0 93 690 0 0 ) + 670 ( 0 0 93 689 0 0 ) + 671 ( 0 0 93 688 0 0 ) + 672 ( 0 0 93 687 0 0 ) + 673 ( 182 0 93 102 0 0 ) + 674 ( 182 0 93 101 0 0 ) + 675 ( 182 0 93 103 0 0 ) + 676 ( 182 0 93 104 0 0 ) + 677 ( 131 0 93 113 0 0 ) + 678 ( 182 0 93 107 0 0 ) + 679 ( 182 0 93 100 0 0 ) + 680 ( 0 0 94 687 0 0 ) + 681 ( 224 0 94 97 0 0 ) + 682 ( 131 1 94 0 0 0 ) + 683 ( 150 1 94 0 0 0 ) + 684 ( 150 0 94 100 0 0 ) + 685 ( 219 1 94 0 0 0 ) + 686 ( 219 0 94 99 0 0 ) + 687 ( 224 1 94 0 0 0 ) + 688 ( 180 4 94 0 347 6 ) + 689 ( 0 0 95 688 0 0 ) + 690 ( 230 0 95 96 0 0 ) + 691 ( 150 0 95 104 0 0 ) + 692 ( 226 4 95 0 353 4 ) + 693 ( 229 0 95 97 0 0 ) + 694 ( 0 0 96 689 0 0 ) + 695 ( 150 0 96 104 0 0 ) + 696 ( 226 4 96 0 357 5 ) + 697 ( 0 0 97 690 0 0 ) + 698 ( 226 4 97 0 362 4 ) + 699 ( 150 0 97 104 0 0 ) + 700 ( 0 0 98 687 0 0 ) + 701 ( 131 1 98 0 0 0 ) + 702 ( 199 1 98 0 0 0 ) + 703 ( 199 1 98 0 0 0 ) + 704 ( 150 1 98 0 0 0 ) + 705 ( 150 0 98 105 0 0 ) + 706 ( 216 1 98 0 0 0 ) + 707 ( 216 0 98 99 0 0 ) + 708 ( 180 4 98 0 366 9 ) + 709 ( 131 1 99 0 0 0 ) + 710 ( 150 1 99 0 0 0 ) + 711 ( 150 0 99 106 0 0 ) + 712 ( 180 4 99 0 375 4 ) + 713 ( 186 1 99 0 0 0 ) + 714 ( 0 0 100 687 0 0 ) + 715 ( 224 0 100 103 0 0 ) + 716 ( 224 0 100 104 0 0 ) + 717 ( 145 1 100 0 0 0 ) + 718 ( 145 0 100 107 0 0 ) + 719 ( 219 1 100 0 0 0 ) + 720 ( 219 0 100 106 0 0 ) + 721 ( 224 1 100 0 0 0 ) + 722 ( 230 0 101 102 0 0 ) + 723 ( 232 0 101 104 0 0 ) + 724 ( 226 4 101 0 379 4 ) + 725 ( 145 0 101 107 0 0 ) + 726 ( 145 1 101 0 0 0 ) + 727 ( 229 0 101 103 0 0 ) + 728 ( 232 0 102 104 0 0 ) + 729 ( 226 4 102 0 383 4 ) + 730 ( 145 0 102 107 0 0 ) + 731 ( 145 1 102 0 0 0 ) + 732 ( 145 1 103 0 0 0 ) + 733 ( 145 0 103 107 0 0 ) + 734 ( 226 4 103 0 387 4 ) + 735 ( 232 0 103 104 0 0 ) + 736 ( 0 0 104 690 0 0 ) + 737 ( 0 0 104 689 0 0 ) + 738 ( 0 0 104 688 0 0 ) + 739 ( 0 0 105 687 0 0 ) + 740 ( 199 1 105 0 0 0 ) + 741 ( 199 1 105 0 0 0 ) + 742 ( 145 1 105 0 0 0 ) + 743 ( 145 0 105 107 0 0 ) + 744 ( 216 1 105 0 0 0 ) + 745 ( 216 0 105 106 0 0 ) + 746 ( 145 1 106 0 0 0 ) + 747 ( 145 0 106 107 0 0 ) + 748 ( 186 1 106 0 0 0 ) + 749 ( 131 0 107 113 0 0 ) + 750 ( 199 1 107 0 0 0 ) + 751 ( 118 4 107 0 391 9 ) + 752 ( 144 0 108 109 0 0 ) + 753 ( 15 1 108 0 0 0 ) + 754 ( 118 4 108 0 400 4 ) + 755 ( 184 1 108 0 0 0 ) + 756 ( 131 0 108 114 0 0 ) + 757 ( 145 0 109 110 0 0 ) + 758 ( 180 4 109 0 404 6 ) + 759 ( 15 1 109 0 0 0 ) + 760 ( 145 1 109 0 0 0 ) + 761 ( 186 1 109 0 0 0 ) + 762 ( 184 1 109 0 0 0 ) + 763 ( 150 1 110 0 0 0 ) + 764 ( 15 1 110 0 0 0 ) + 765 ( 184 1 110 0 0 0 ) + 766 ( 131 1 110 0 0 0 ) + 767 ( 180 4 110 0 410 4 ) + 768 ( 112 0 111 115 0 0 ) + 769 ( 112 1 111 0 0 0 ) + 770 ( 112 0 111 114 0 0 ) + 771 ( 112 0 111 113 0 0 ) + 772 ( 13 1 111 0 0 0 ) + 773 ( 13 0 111 112 0 0 ) + 774 ( 15 1 111 0 0 0 ) + 775 ( 118 4 111 0 414 7 ) + 776 ( 21 1 112 0 0 0 ) + 777 ( 118 4 112 0 421 4 ) + 778 ( 19 1 112 0 0 0 ) + 779 ( 199 1 113 0 0 0 ) + 780 ( 118 4 113 0 425 5 ) + 781 ( 184 1 114 0 0 0 ) + 782 ( 15 1 114 0 0 0 ) + 783 ( 118 4 114 0 430 4 ) + 784 ( 182 4 115 0 434 4 ) + 785 ( 8 0 116 343 0 0 ) + 786 ( 0 0 116 784 0 0 ) + 787 ( 116 0 116 118 0 0 ) + 788 ( 116 0 116 117 0 0 ) + 789 ( 116 1 116 0 0 0 ) + 790 ( 11 1 116 0 0 0 ) + 791 ( 21 1 116 0 0 0 ) + 792 ( 8 0 117 178 0 0 ) + 793 ( 8 0 117 201 0 0 ) + 794 ( 8 0 117 198 0 0 ) + 795 ( 8 0 117 196 0 0 ) + 796 ( 8 0 117 355 0 0 ) + 797 ( 8 0 117 354 0 0 ) + 798 ( 8 0 117 200 0 0 ) + 799 ( 8 0 117 202 0 0 ) + 800 ( 8 0 117 199 0 0 ) + 801 ( 8 0 117 197 0 0 ) + 802 ( 8 0 117 195 0 0 ) + 803 ( 8 0 117 356 0 0 ) + 804 ( 0 0 117 784 0 0 ) + 805 ( 8 0 117 346 0 0 ) + 806 ( 8 0 117 214 0 0 ) + 807 ( 197 1 117 0 0 0 ) + 808 ( 197 0 117 118 0 0 ) + 809 ( 11 1 117 0 0 0 ) + 810 ( 234 1 117 0 0 0 ) + 811 ( 8 0 118 351 0 0 ) + 812 ( 8 0 118 349 0 0 ) + 813 ( 8 0 118 348 0 0 ) + 814 ( 8 0 118 119 0 0 ) + 815 ( 8 0 118 202 0 0 ) + 816 ( 8 0 118 200 0 0 ) + 817 ( 8 0 118 353 0 0 ) + 818 ( 8 0 118 352 0 0 ) + 819 ( 8 0 118 350 0 0 ) + 820 ( 8 0 118 354 0 0 ) + 821 ( 8 0 118 235 0 0 ) + 822 ( 8 0 118 234 0 0 ) + 823 ( 8 0 118 345 0 0 ) + 824 ( 8 0 118 344 0 0 ) + 825 ( 8 0 118 347 0 0 ) + 826 ( 11 1 118 0 0 0 ) + 827 ( 237 1 118 0 0 0 ) + 828 ( 238 1 118 0 0 0 ) + 829 ( 243 0 119 348 0 0 ) + 830 ( 238 1 119 0 0 0 ) + 831 ( 258 4 119 0 438 6 ) + 832 ( 260 0 119 234 0 0 ) + 833 ( 243 0 119 352 0 0 ) + 834 ( 260 0 119 200 0 0 ) + 835 ( 236 1 0 119 0 0 ) + 836 ( 239 0 120 158 0 0 ) + 837 ( 272 0 120 131 0 0 ) + 838 ( 270 4 120 0 444 8 ) + 839 ( 27 0 120 121 0 0 ) + 840 ( 27 0 120 122 0 0 ) + 841 ( 27 0 120 123 0 0 ) + 842 ( 266 1 120 0 0 0 ) + 843 ( 266 0 120 124 0 0 ) + 844 ( 266 1 120 0 0 0 ) + 845 ( 266 0 120 125 0 0 ) + 846 ( 265 1 120 0 0 0 ) + 847 ( 265 1 120 0 0 0 ) + 848 ( 265 0 120 127 0 0 ) + 849 ( 239 1 120 0 0 0 ) + 850 ( 265 1 120 0 0 0 ) + 851 ( 266 1 120 0 0 0 ) + 852 ( 162 0 121 123 0 0 ) + 853 ( 255 0 121 122 0 0 ) + 854 ( 269 1 121 0 0 0 ) + 855 ( 272 0 121 133 0 0 ) + 856 ( 255 1 121 0 0 0 ) + 857 ( 162 1 121 0 0 0 ) + 858 ( 239 1 121 0 0 0 ) + 859 ( 274 1 122 0 0 0 ) + 860 ( 272 0 122 135 0 0 ) + 861 ( 239 1 122 0 0 0 ) + 862 ( 276 1 123 0 0 0 ) + 863 ( 272 0 123 138 0 0 ) + 864 ( 239 1 123 0 0 0 ) + 865 ( 239 1 124 0 0 0 ) + 866 ( 280 1 124 0 0 0 ) + 867 ( 280 0 124 126 0 0 ) + 868 ( 283 0 124 125 0 0 ) + 869 ( 278 1 124 0 0 0 ) + 870 ( 58 4 124 0 452 4 ) + 871 ( 239 1 125 0 0 0 ) + 872 ( 278 1 125 0 0 0 ) + 873 ( 284 1 125 0 0 0 ) + 874 ( 239 1 126 0 0 0 ) + 875 ( 283 1 126 0 0 0 ) + 876 ( 278 1 126 0 0 0 ) + 877 ( 286 1 126 0 0 0 ) + 878 ( 239 1 127 0 0 0 ) + 879 ( 288 1 127 0 0 0 ) + 880 ( 291 1 127 0 0 0 ) + 881 ( 291 0 127 128 0 0 ) + 882 ( 278 1 127 0 0 0 ) + 883 ( 58 4 127 0 456 4 ) + 884 ( 292 1 128 0 0 0 ) + 885 ( 283 1 128 0 0 0 ) + 886 ( 278 1 128 0 0 0 ) + 887 ( 239 1 128 0 0 0 ) + 888 ( 266 0 129 130 0 0 ) + 889 ( 299 0 129 131 0 0 ) + 890 ( 27 0 129 132 0 0 ) + 891 ( 27 0 129 134 0 0 ) + 892 ( 27 0 129 136 0 0 ) + 893 ( 27 0 129 137 0 0 ) + 894 ( 265 1 129 0 0 0 ) + 895 ( 296 1 129 0 0 0 ) + 896 ( 296 0 129 143 0 0 ) + 897 ( 265 0 129 140 0 0 ) + 898 ( 300 4 129 0 460 5 ) + 899 ( 296 0 129 151 0 0 ) + 900 ( 265 1 129 0 0 0 ) + 901 ( 299 1 130 0 0 0 ) + 902 ( 27 1 130 0 0 0 ) + 903 ( 296 1 130 0 0 0 ) + 904 ( 303 0 144 130 0 0 ) + 905 ( 304 4 130 0 465 4 ) + 906 ( 270 4 131 0 469 4 ) + 907 ( 265 1 131 0 0 0 ) + 908 ( 266 1 131 0 0 0 ) + 909 ( 27 0 131 138 0 0 ) + 910 ( 27 0 131 135 0 0 ) + 911 ( 27 0 131 133 0 0 ) + 912 ( 162 0 132 137 0 0 ) + 913 ( 162 1 132 0 0 0 ) + 914 ( 250 0 132 136 0 0 ) + 915 ( 250 1 132 0 0 0 ) + 916 ( 255 0 132 134 0 0 ) + 917 ( 255 1 132 0 0 0 ) + 918 ( 269 1 132 0 0 0 ) + 919 ( 299 0 132 133 0 0 ) + 920 ( 162 0 133 138 0 0 ) + 921 ( 162 1 133 0 0 0 ) + 922 ( 255 0 133 135 0 0 ) + 923 ( 255 1 133 0 0 0 ) + 924 ( 269 1 133 0 0 0 ) + 925 ( 274 1 134 0 0 0 ) + 926 ( 306 1 134 0 0 0 ) + 927 ( 255 0 136 134 0 0 ) + 928 ( 299 0 134 135 0 0 ) + 929 ( 274 1 135 0 0 0 ) + 930 ( 276 1 136 0 0 0 ) + 931 ( 250 0 137 136 0 0 ) + 932 ( 306 1 136 0 0 0 ) + 933 ( 276 1 137 0 0 0 ) + 934 ( 299 0 137 138 0 0 ) + 935 ( 276 1 138 0 0 0 ) + 936 ( 310 0 139 140 0 0 ) + 937 ( 27 1 139 0 0 0 ) + 938 ( 299 1 139 0 0 0 ) + 939 ( 155 1 139 0 0 0 ) + 940 ( 308 1 139 0 0 0 ) + 941 ( 58 4 139 0 473 4 ) + 942 ( 27 1 140 0 0 0 ) + 943 ( 299 1 140 0 0 0 ) + 944 ( 308 1 140 0 0 0 ) + 945 ( 58 4 140 0 477 4 ) + 946 ( 240 0 141 479 0 0 ) + 947 ( 313 0 141 142 0 0 ) + 948 ( 58 0 141 148 0 0 ) + 949 ( 318 1 141 0 0 0 ) + 950 ( 311 1 141 0 0 0 ) + 951 ( 313 1 141 0 0 0 ) + 952 ( 313 1 141 0 0 0 ) + 953 ( 58 0 141 149 0 0 ) + 954 ( 240 1 141 0 0 0 ) + 955 ( 240 1 141 0 0 0 ) + 956 ( 320 1 141 0 0 0 ) + 957 ( 313 1 141 0 0 0 ) + 958 ( 158 1 141 0 0 0 ) + 959 ( 58 0 141 150 0 0 ) + 960 ( 240 1 141 0 0 0 ) + 961 ( 240 1 141 0 0 0 ) + 962 ( 27 1 141 0 0 0 ) + 963 ( 323 0 142 152 0 0 ) + 964 ( 265 1 142 0 0 0 ) + 965 ( 283 1 142 0 0 0 ) + 966 ( 266 1 142 0 0 0 ) + 967 ( 323 0 142 143 0 0 ) + 968 ( 313 0 148 142 0 0 ) + 969 ( 324 4 142 0 481 4 ) + 970 ( 58 0 143 152 0 0 ) + 971 ( 58 0 143 151 0 0 ) + 972 ( 266 1 143 0 0 0 ) + 973 ( 283 1 143 0 0 0 ) + 974 ( 265 1 143 0 0 0 ) + 975 ( 332 0 144 153 0 0 ) + 976 ( 299 0 144 145 0 0 ) + 977 ( 296 0 144 146 0 0 ) + 978 ( 27 0 144 147 0 0 ) + 979 ( 296 1 144 0 0 0 ) + 980 ( 27 1 144 0 0 0 ) + 981 ( 299 1 144 0 0 0 ) + 982 ( 299 1 144 0 0 0 ) + 983 ( 296 1 144 0 0 0 ) + 984 ( 27 1 144 0 0 0 ) + 985 ( 299 1 144 0 0 0 ) + 986 ( 296 1 144 0 0 0 ) + 987 ( 304 4 144 0 485 8 ) + 988 ( 236 1 145 0 0 0 ) + 989 ( 101 1 145 0 0 0 ) + 990 ( 27 1 145 0 0 0 ) + 991 ( 329 1 145 0 0 0 ) + 992 ( 334 1 145 0 0 0 ) + 993 ( 27 1 146 0 0 0 ) + 994 ( 330 1 146 0 0 0 ) + 995 ( 101 1 146 0 0 0 ) + 996 ( 236 1 146 0 0 0 ) + 997 ( 336 1 146 0 0 0 ) + 998 ( 236 1 147 0 0 0 ) + 999 ( 306 1 147 0 0 0 ) + 1000 ( 101 1 147 0 0 0 ) + 1001 ( 181 1 147 0 0 0 ) + 1002 ( 338 1 147 0 0 0 ) + 1003 ( 240 0 148 479 0 0 ) + 1004 ( 266 1 148 0 0 0 ) + 1005 ( 266 0 148 150 0 0 ) + 1006 ( 265 1 148 0 0 0 ) + 1007 ( 265 0 148 149 0 0 ) + 1008 ( 324 4 148 0 493 4 ) + 1009 ( 240 1 149 0 0 0 ) + 1010 ( 313 1 149 0 0 0 ) + 1011 ( 311 1 149 0 0 0 ) + 1012 ( 340 1 149 0 0 0 ) + 1013 ( 240 1 150 0 0 0 ) + 1014 ( 313 1 150 0 0 0 ) + 1015 ( 158 1 150 0 0 0 ) + 1016 ( 342 1 150 0 0 0 ) + 1017 ( 248 0 151 152 0 0 ) + 1018 ( 265 1 151 0 0 0 ) + 1019 ( 266 1 151 0 0 0 ) + 1020 ( 300 4 151 0 497 4 ) + 1021 ( 266 1 152 0 0 0 ) + 1022 ( 265 1 152 0 0 0 ) + 1023 ( 324 4 152 0 501 4 ) + 1024 ( 296 1 153 0 0 0 ) + 1025 ( 299 1 153 0 0 0 ) + 1026 ( 304 4 153 0 505 5 ) + 1027 ( 244 1 153 0 0 0 ) + 1028 ( 244 0 153 165 0 0 ) + 1029 ( 27 1 153 0 0 0 ) + 1030 ( 355 0 154 156 0 0 ) + 1031 ( 355 1 154 0 0 0 ) + 1032 ( 155 1 154 0 0 0 ) + 1033 ( 27 1 154 0 0 0 ) + 1034 ( 58 4 154 0 510 9 ) + 1035 ( 352 1 154 0 0 0 ) + 1036 ( 352 1 154 0 0 0 ) + 1037 ( 352 0 154 159 0 0 ) + 1038 ( 352 1 154 0 0 0 ) + 1039 ( 86 1 154 0 0 0 ) + 1040 ( 86 0 154 162 0 0 ) + 1041 ( 352 1 154 0 0 0 ) + 1042 ( 352 1 154 0 0 0 ) + 1043 ( 352 0 154 157 0 0 ) + 1044 ( 27 0 155 362 0 0 ) + 1045 ( 356 0 155 156 0 0 ) + 1046 ( 86 1 155 0 0 0 ) + 1047 ( 359 0 155 329 0 0 ) + 1048 ( 58 4 155 0 519 4 ) + 1049 ( 163 1 155 0 0 0 ) + 1050 ( 27 1 155 0 0 0 ) + 1051 ( 27 1 155 0 0 0 ) + 1052 ( 58 4 156 0 523 4 ) + 1053 ( 27 1 156 0 0 0 ) + 1054 ( 86 1 156 0 0 0 ) + 1055 ( 163 1 156 0 0 0 ) + 1056 ( 350 1 157 0 0 0 ) + 1057 ( 101 1 157 0 0 0 ) + 1058 ( 27 1 157 0 0 0 ) + 1059 ( 360 1 157 0 0 0 ) + 1060 ( 362 1 157 0 0 0 ) + 1061 ( 365 0 158 160 0 0 ) + 1062 ( 265 1 158 0 0 0 ) + 1063 ( 266 1 158 0 0 0 ) + 1064 ( 270 4 158 0 527 4 ) + 1065 ( 283 1 158 0 0 0 ) + 1066 ( 366 0 159 160 0 0 ) + 1067 ( 266 1 159 0 0 0 ) + 1068 ( 265 1 159 0 0 0 ) + 1069 ( 283 1 159 0 0 0 ) + 1070 ( 58 4 159 0 531 4 ) + 1071 ( 265 1 160 0 0 0 ) + 1072 ( 266 1 160 0 0 0 ) + 1073 ( 270 4 160 0 535 4 ) + 1074 ( 283 1 160 0 0 0 ) + 1075 ( 352 1 161 0 0 0 ) + 1076 ( 355 1 161 0 0 0 ) + 1077 ( 58 4 161 0 539 4 ) + 1078 ( 369 1 161 0 0 0 ) + 1079 ( 372 0 161 232 0 0 ) + 1080 ( 371 0 161 162 0 0 ) + 1081 ( 58 4 162 0 543 4 ) + 1082 ( 369 1 162 0 0 0 ) + 1083 ( 355 1 162 0 0 0 ) + 1084 ( 352 1 162 0 0 0 ) + 1085 ( 376 0 163 168 0 0 ) + 1086 ( 58 4 163 0 547 12 ) + 1087 ( 27 1 163 0 0 0 ) + 1088 ( 83 0 163 165 0 0 ) + 1089 ( 83 1 163 0 0 0 ) + 1090 ( 376 1 163 0 0 0 ) + 1091 ( 376 0 163 169 0 0 ) + 1092 ( 376 1 163 0 0 0 ) + 1093 ( 260 0 163 176 0 0 ) + 1094 ( 260 1 163 0 0 0 ) + 1095 ( 83 1 163 0 0 0 ) + 1096 ( 385 0 163 166 0 0 ) + 1097 ( 385 0 163 167 0 0 ) + 1098 ( 383 1 163 0 0 0 ) + 1099 ( 383 0 163 164 0 0 ) + 1100 ( 379 1 164 0 0 0 ) + 1101 ( 278 1 164 0 0 0 ) + 1102 ( 27 1 164 0 0 0 ) + 1103 ( 381 1 164 0 0 0 ) + 1104 ( 386 1 164 0 0 0 ) + 1105 ( 376 1 165 0 0 0 ) + 1106 ( 58 4 165 0 559 4 ) + 1107 ( 27 1 165 0 0 0 ) + 1108 ( 299 1 165 0 0 0 ) + 1109 ( 375 1 166 0 0 0 ) + 1110 ( 58 4 166 0 563 4 ) + 1111 ( 27 1 166 0 0 0 ) + 1112 ( 83 1 166 0 0 0 ) + 1113 ( 60 0 166 167 0 0 ) + 1114 ( 375 0 167 222 0 0 ) + 1115 ( 375 1 167 0 0 0 ) + 1116 ( 260 1 167 0 0 0 ) + 1117 ( 58 4 167 0 567 5 ) + 1118 ( 27 1 167 0 0 0 ) + 1119 ( 296 1 168 0 0 0 ) + 1120 ( 27 1 168 0 0 0 ) + 1121 ( 58 4 168 0 572 4 ) + 1122 ( 390 1 168 0 0 0 ) + 1123 ( 389 1 168 0 0 0 ) + 1124 ( 260 0 169 176 0 0 ) + 1125 ( 131 1 169 0 0 0 ) + 1126 ( 27 1 169 0 0 0 ) + 1127 ( 58 4 169 0 576 4 ) + 1128 ( 392 1 169 0 0 0 ) + 1129 ( 0 0 170 1132 0 0 ) + 1130 ( 240 0 170 473 0 0 ) + 1131 ( 42 4 170 0 580 8 ) + 1132 ( 397 1 170 0 0 0 ) + 1133 ( 397 0 170 173 0 0 ) + 1134 ( 397 1 170 0 0 0 ) + 1135 ( 397 0 170 172 0 0 ) + 1136 ( 397 0 170 171 0 0 ) + 1137 ( 203 1 170 0 0 0 ) + 1138 ( 175 1 170 0 0 0 ) + 1139 ( 0 0 171 1132 0 0 ) + 1140 ( 42 4 171 0 588 4 ) + 1141 ( 77 1 171 0 0 0 ) + 1142 ( 395 1 171 0 0 0 ) + 1143 ( 175 1 171 0 0 0 ) + 1144 ( 42 4 172 0 592 4 ) + 1145 ( 399 1 172 0 0 0 ) + 1146 ( 175 1 172 0 0 0 ) + 1147 ( 395 1 172 0 0 0 ) + 1148 ( 400 1 172 0 0 0 ) + 1149 ( 42 4 173 0 596 4 ) + 1150 ( 203 1 173 0 0 0 ) + 1151 ( 395 1 173 0 0 0 ) + 1152 ( 175 1 173 0 0 0 ) + 1153 ( 196 1 173 0 0 0 ) + 1154 ( 299 0 174 181 0 0 ) + 1155 ( 392 0 174 180 0 0 ) + 1156 ( 392 1 174 0 0 0 ) + 1157 ( 27 1 174 0 0 0 ) + 1158 ( 197 0 174 177 0 0 ) + 1159 ( 402 1 174 0 0 0 ) + 1160 ( 402 0 174 175 0 0 ) + 1161 ( 58 4 174 0 600 6 ) + 1162 ( 0 0 175 797 0 0 ) + 1163 ( 0 0 175 801 0 0 ) + 1164 ( 0 0 175 1203 0 0 ) + 1165 ( 0 0 175 802 0 0 ) + 1166 ( 299 0 175 181 0 0 ) + 1167 ( 27 1 175 0 0 0 ) + 1168 ( 58 4 175 0 606 5 ) + 1169 ( 376 1 175 0 0 0 ) + 1170 ( 299 1 176 0 0 0 ) + 1171 ( 392 1 176 0 0 0 ) + 1172 ( 392 0 176 179 0 0 ) + 1173 ( 27 1 176 0 0 0 ) + 1174 ( 58 4 176 0 611 6 ) + 1175 ( 404 0 176 177 0 0 ) + 1176 ( 197 0 180 177 0 0 ) + 1177 ( 404 0 179 177 0 0 ) + 1178 ( 27 1 177 0 0 0 ) + 1179 ( 58 4 177 0 617 6 ) + 1180 ( 296 1 177 0 0 0 ) + 1181 ( 299 1 177 0 0 0 ) + 1182 ( 197 1 178 0 0 0 ) + 1183 ( 234 1 178 0 0 0 ) + 1184 ( 406 4 178 0 623 4 ) + 1185 ( 375 0 178 214 0 0 ) + 1186 ( 16 1 178 0 0 0 ) + 1187 ( 8 0 784 178 0 0 ) + 1188 ( 296 1 179 0 0 0 ) + 1189 ( 58 4 179 0 627 4 ) + 1190 ( 27 1 179 0 0 0 ) + 1191 ( 209 1 179 0 0 0 ) + 1192 ( 296 1 180 0 0 0 ) + 1193 ( 58 4 180 0 631 4 ) + 1194 ( 408 1 180 0 0 0 ) + 1195 ( 27 1 180 0 0 0 ) + 1196 ( 0 0 181 797 0 0 ) + 1197 ( 411 1 181 0 0 0 ) + 1198 ( 411 0 181 182 0 0 ) + 1199 ( 27 1 181 0 0 0 ) + 1200 ( 58 4 181 0 635 5 ) + 1201 ( 197 1 181 0 0 0 ) + 1202 ( 411 0 797 182 0 0 ) + 1203 ( 385 0 182 183 0 0 ) + 1204 ( 414 1 182 0 0 0 ) + 1205 ( 413 1 182 0 0 0 ) + 1206 ( 58 4 182 0 640 5 ) + 1207 ( 197 1 182 0 0 0 ) + 1208 ( 238 0 196 183 0 0 ) + 1209 ( 238 0 792 183 0 0 ) + 1210 ( 414 1 183 0 0 0 ) + 1211 ( 413 1 183 0 0 0 ) + 1212 ( 58 4 183 0 645 6 ) + 1213 ( 238 0 788 183 0 0 ) + 1214 ( 197 1 183 0 0 0 ) + 1215 ( 238 0 195 183 0 0 ) + 1216 ( 76 0 184 185 0 0 ) + 1217 ( 296 0 184 186 0 0 ) + 1218 ( 299 0 184 192 0 0 ) + 1219 ( 201 0 184 188 0 0 ) + 1220 ( 201 1 184 0 0 0 ) + 1221 ( 296 1 184 0 0 0 ) + 1222 ( 66 4 184 0 651 4 ) + 1223 ( 417 1 184 0 0 0 ) + 1224 ( 179 0 843 185 0 0 ) + 1225 ( 417 1 185 0 0 0 ) + 1226 ( 66 4 185 0 655 4 ) + 1227 ( 296 1 185 0 0 0 ) + 1228 ( 296 0 185 187 0 0 ) + 1229 ( 299 1 185 0 0 0 ) + 1230 ( 76 0 186 187 0 0 ) + 1231 ( 330 1 186 0 0 0 ) + 1232 ( 66 4 186 0 659 5 ) + 1233 ( 296 0 188 186 0 0 ) + 1234 ( 71 1 186 0 0 0 ) + 1235 ( 422 1 186 0 0 0 ) + 1236 ( 424 1 186 0 0 0 ) + 1237 ( 179 0 1154 187 0 0 ) + 1238 ( 330 1 187 0 0 0 ) + 1239 ( 66 4 187 0 664 4 ) + 1240 ( 422 1 187 0 0 0 ) + 1241 ( 299 1 188 0 0 0 ) + 1242 ( 66 4 188 0 668 4 ) + 1243 ( 71 1 188 0 0 0 ) + 1244 ( 424 1 188 0 0 0 ) + 1245 ( 385 0 189 191 0 0 ) + 1246 ( 428 4 189 0 672 8 ) + 1247 ( 76 1 189 0 0 0 ) + 1248 ( 76 1 189 0 0 0 ) + 1249 ( 76 0 189 193 0 0 ) + 1250 ( 201 1 189 0 0 0 ) + 1251 ( 201 1 189 0 0 0 ) + 1252 ( 201 0 189 194 0 0 ) + 1253 ( 426 0 189 190 0 0 ) + 1254 ( 417 1 189 0 0 0 ) + 1255 ( 417 1 190 0 0 0 ) + 1256 ( 272 0 190 192 0 0 ) + 1257 ( 66 4 190 0 680 4 ) + 1258 ( 76 1 190 0 0 0 ) + 1259 ( 201 1 190 0 0 0 ) + 1260 ( 238 0 206 191 0 0 ) + 1261 ( 76 1 191 0 0 0 ) + 1262 ( 201 1 191 0 0 0 ) + 1263 ( 428 4 191 0 684 4 ) + 1264 ( 417 1 191 0 0 0 ) + 1265 ( 238 0 207 191 0 0 ) + 1266 ( 201 1 192 0 0 0 ) + 1267 ( 76 1 192 0 0 0 ) + 1268 ( 66 4 192 0 688 4 ) + 1269 ( 417 1 192 0 0 0 ) + 1270 ( 278 1 193 0 0 0 ) + 1271 ( 379 1 193 0 0 0 ) + 1272 ( 428 4 193 0 692 4 ) + 1273 ( 417 1 193 0 0 0 ) + 1274 ( 430 1 193 0 0 0 ) + 1275 ( 278 1 194 0 0 0 ) + 1276 ( 379 1 194 0 0 0 ) + 1277 ( 433 1 194 0 0 0 ) + 1278 ( 417 1 194 0 0 0 ) + 1279 ( 428 4 194 0 696 4 ) + 1280 ( 238 0 195 216 0 0 ) + 1281 ( 197 0 195 235 0 0 ) + 1282 ( 435 0 195 202 0 0 ) + 1283 ( 435 0 195 203 0 0 ) + 1284 ( 190 0 195 197 0 0 ) + 1285 ( 190 0 195 196 0 0 ) + 1286 ( 197 1 195 0 0 0 ) + 1287 ( 238 1 195 0 0 0 ) + 1288 ( 238 0 195 214 0 0 ) + 1289 ( 58 4 195 0 700 5 ) + 1290 ( 435 1 195 0 0 0 ) + 1291 ( 435 0 195 205 0 0 ) + 1292 ( 0 0 196 804 0 0 ) + 1293 ( 0 0 196 792 0 0 ) + 1294 ( 238 1 196 0 0 0 ) + 1295 ( 238 0 196 214 0 0 ) + 1296 ( 58 4 196 0 705 5 ) + 1297 ( 437 0 196 199 0 0 ) + 1298 ( 238 0 196 216 0 0 ) + 1299 ( 0 0 196 788 0 0 ) + 1300 ( 437 0 196 197 0 0 ) + 1301 ( 435 0 197 202 0 0 ) + 1302 ( 212 0 197 199 0 0 ) + 1303 ( 435 0 197 204 0 0 ) + 1304 ( 212 0 197 198 0 0 ) + 1305 ( 435 0 197 205 0 0 ) + 1306 ( 435 1 197 0 0 0 ) + 1307 ( 58 4 197 0 710 5 ) + 1308 ( 0 0 198 787 0 0 ) + 1309 ( 0 0 198 785 0 0 ) + 1310 ( 243 0 198 356 0 0 ) + 1311 ( 243 0 198 341 0 0 ) + 1312 ( 213 1 198 0 0 0 ) + 1313 ( 57 0 206 198 0 0 ) + 1314 ( 366 1 198 0 0 0 ) + 1315 ( 0 0 198 810 0 0 ) + 1316 ( 213 0 198 205 0 0 ) + 1317 ( 213 1 198 0 0 0 ) + 1318 ( 243 0 198 361 0 0 ) + 1319 ( 0 0 198 804 0 0 ) + 1320 ( 213 0 198 204 0 0 ) + 1321 ( 213 0 198 202 0 0 ) + 1322 ( 213 0 198 201 0 0 ) + 1323 ( 366 0 198 199 0 0 ) + 1324 ( 0 0 198 792 0 0 ) + 1325 ( 0 0 199 790 0 0 ) + 1326 ( 58 4 199 0 715 4 ) + 1327 ( 0 0 199 792 0 0 ) + 1328 ( 0 0 199 804 0 0 ) + 1329 ( 243 0 200 348 0 0 ) + 1330 ( 438 0 200 202 0 0 ) + 1331 ( 258 4 200 0 719 6 ) + 1332 ( 438 0 200 234 0 0 ) + 1333 ( 243 0 200 354 0 0 ) + 1334 ( 190 0 200 201 0 0 ) + 1335 ( 212 0 201 356 0 0 ) + 1336 ( 84 0 346 201 0 0 ) + 1337 ( 258 4 201 0 725 7 ) + 1338 ( 190 0 354 201 0 0 ) + 1339 ( 190 0 355 201 0 0 ) + 1340 ( 438 0 201 202 0 0 ) + 1341 ( 440 0 234 202 0 0 ) + 1342 ( 258 4 202 0 732 7 ) + 1343 ( 435 0 235 202 0 0 ) + 1344 ( 243 0 203 342 0 0 ) + 1345 ( 190 0 203 204 0 0 ) + 1346 ( 443 0 203 205 0 0 ) + 1347 ( 58 4 203 0 739 4 ) + 1348 ( 197 1 203 0 0 0 ) + 1349 ( 243 0 203 361 0 0 ) + 1350 ( 243 0 204 340 0 0 ) + 1351 ( 443 0 204 205 0 0 ) + 1352 ( 58 4 204 0 743 4 ) + 1353 ( 243 0 204 361 0 0 ) + 1354 ( 213 0 356 205 0 0 ) + 1355 ( 444 1 205 0 0 0 ) + 1356 ( 443 0 361 205 0 0 ) + 1357 ( 84 0 358 205 0 0 ) + 1358 ( 243 0 206 239 0 0 ) + 1359 ( 197 0 206 227 0 0 ) + 1360 ( 57 1 206 0 0 0 ) + 1361 ( 238 1 206 0 0 0 ) + 1362 ( 238 1 206 0 0 0 ) + 1363 ( 238 1 206 0 0 0 ) + 1364 ( 197 1 206 0 0 0 ) + 1365 ( 0 0 206 809 0 0 ) + 1366 ( 0 0 206 854 0 0 ) + 1367 ( 0 0 206 852 0 0 ) + 1368 ( 66 0 206 212 0 0 ) + 1369 ( 66 0 206 207 0 0 ) + 1370 ( 66 0 206 210 0 0 ) + 1371 ( 66 0 206 209 0 0 ) + 1372 ( 66 0 206 208 0 0 ) + 1373 ( 66 0 206 213 0 0 ) + 1374 ( 197 0 206 225 0 0 ) + 1375 ( 66 0 206 211 0 0 ) + 1376 ( 243 0 206 254 0 0 ) + 1377 ( 243 0 206 253 0 0 ) + 1378 ( 197 1 206 0 0 0 ) + 1379 ( 197 1 206 0 0 0 ) + 1380 ( 57 1 206 0 0 0 ) + 1381 ( 0 0 207 854 0 0 ) + 1382 ( 447 0 207 210 0 0 ) + 1383 ( 447 0 207 208 0 0 ) + 1384 ( 71 1 207 0 0 0 ) + 1385 ( 238 1 207 0 0 0 ) + 1386 ( 238 1 207 0 0 0 ) + 1387 ( 238 1 207 0 0 0 ) + 1388 ( 6 4 207 0 747 6 ) + 1389 ( 71 0 207 212 0 0 ) + 1390 ( 0 0 208 854 0 0 ) + 1391 ( 201 0 208 210 0 0 ) + 1392 ( 201 0 208 209 0 0 ) + 1393 ( 6 4 208 0 753 5 ) + 1394 ( 243 0 208 255 0 0 ) + 1395 ( 71 0 209 211 0 0 ) + 1396 ( 448 0 209 210 0 0 ) + 1397 ( 243 0 209 255 0 0 ) + 1398 ( 6 4 209 0 758 4 ) + 1399 ( 71 1 210 0 0 0 ) + 1400 ( 6 4 210 0 762 4 ) + 1401 ( 71 0 210 213 0 0 ) + 1402 ( 66 0 239 211 0 0 ) + 1403 ( 453 1 211 0 0 0 ) + 1404 ( 197 1 211 0 0 0 ) + 1405 ( 71 0 255 211 0 0 ) + 1406 ( 6 4 211 0 766 5 ) + 1407 ( 66 0 246 211 0 0 ) + 1408 ( 448 1 211 0 0 0 ) + 1409 ( 448 0 211 213 0 0 ) + 1410 ( 447 0 212 213 0 0 ) + 1411 ( 238 1 212 0 0 0 ) + 1412 ( 450 4 212 0 771 5 ) + 1413 ( 450 4 213 0 776 4 ) + 1414 ( 406 0 214 805 0 0 ) + 1415 ( 406 0 214 216 0 0 ) + 1416 ( 406 0 214 215 0 0 ) + 1417 ( 238 0 808 214 0 0 ) + 1418 ( 16 1 214 0 0 0 ) + 1419 ( 238 0 804 214 0 0 ) + 1420 ( 8 0 784 214 0 0 ) + 1421 ( 197 1 214 0 0 0 ) + 1422 ( 457 0 215 805 0 0 ) + 1423 ( 457 0 215 216 0 0 ) + 1424 ( 16 1 215 0 0 0 ) + 1425 ( 454 4 215 0 780 5 ) + 1426 ( 197 1 215 0 0 0 ) + 1427 ( 459 0 805 216 0 0 ) + 1428 ( 454 4 216 0 785 7 ) + 1429 ( 238 0 808 216 0 0 ) + 1430 ( 238 0 804 216 0 0 ) + 1431 ( 197 1 216 0 0 0 ) + 1432 ( 462 0 217 221 0 0 ) + 1433 ( 175 0 217 219 0 0 ) + 1434 ( 260 1 217 0 0 0 ) + 1435 ( 391 1 217 0 0 0 ) + 1436 ( 355 1 217 0 0 0 ) + 1437 ( 238 1 217 0 0 0 ) + 1438 ( 58 0 218 219 0 0 ) + 1439 ( 391 1 218 0 0 0 ) + 1440 ( 260 1 218 0 0 0 ) + 1441 ( 27 1 218 0 0 0 ) + 1442 ( 238 0 218 223 0 0 ) + 1443 ( 355 1 218 0 0 0 ) + 1444 ( 391 1 218 0 0 0 ) + 1445 ( 391 1 218 0 0 0 ) + 1446 ( 391 0 218 229 0 0 ) + 1447 ( 260 1 219 0 0 0 ) + 1448 ( 391 1 219 0 0 0 ) + 1449 ( 355 1 219 0 0 0 ) + 1450 ( 238 1 219 0 0 0 ) + 1451 ( 466 0 230 220 0 0 ) + 1452 ( 55 0 220 221 0 0 ) + 1453 ( 391 1 220 0 0 0 ) + 1454 ( 464 4 220 0 792 5 ) + 1455 ( 260 0 220 231 0 0 ) + 1456 ( 260 1 220 0 0 0 ) + 1457 ( 238 1 220 0 0 0 ) + 1458 ( 55 0 230 221 0 0 ) + 1459 ( 391 1 221 0 0 0 ) + 1460 ( 260 1 221 0 0 0 ) + 1461 ( 355 1 221 0 0 0 ) + 1462 ( 238 1 221 0 0 0 ) + 1463 ( 457 0 222 223 0 0 ) + 1464 ( 58 4 222 0 797 4 ) + 1465 ( 260 1 222 0 0 0 ) + 1466 ( 391 1 222 0 0 0 ) + 1467 ( 27 1 222 0 0 0 ) + 1468 ( 58 4 223 0 801 4 ) + 1469 ( 260 1 223 0 0 0 ) + 1470 ( 391 1 223 0 0 0 ) + 1471 ( 27 1 223 0 0 0 ) + 1472 ( 203 0 224 230 0 0 ) + 1473 ( 243 0 224 237 0 0 ) + 1474 ( 203 0 224 231 0 0 ) + 1475 ( 192 0 224 225 0 0 ) + 1476 ( 55 1 224 0 0 0 ) + 1477 ( 352 1 224 0 0 0 ) + 1478 ( 470 4 224 0 805 5 ) + 1479 ( 203 0 224 228 0 0 ) + 1480 ( 203 1 224 0 0 0 ) + 1481 ( 203 1 224 0 0 0 ) + 1482 ( 243 0 224 253 0 0 ) + 1483 ( 470 0 225 227 0 0 ) + 1484 ( 470 0 225 226 0 0 ) + 1485 ( 243 0 225 238 0 0 ) + 1486 ( 243 0 225 237 0 0 ) + 1487 ( 55 1 225 0 0 0 ) + 1488 ( 352 1 225 0 0 0 ) + 1489 ( 243 0 225 253 0 0 ) + 1490 ( 440 0 226 227 0 0 ) + 1491 ( 193 1 226 0 0 0 ) + 1492 ( 468 4 226 0 810 4 ) + 1493 ( 243 0 226 237 0 0 ) + 1494 ( 352 1 226 0 0 0 ) + 1495 ( 468 4 227 0 814 4 ) + 1496 ( 243 0 227 238 0 0 ) + 1497 ( 352 1 227 0 0 0 ) + 1498 ( 446 0 228 230 0 0 ) + 1499 ( 243 0 228 237 0 0 ) + 1500 ( 243 0 228 253 0 0 ) + 1501 ( 446 1 228 0 0 0 ) + 1502 ( 55 1 228 0 0 0 ) + 1503 ( 391 1 228 0 0 0 ) + 1504 ( 470 4 228 0 818 4 ) + 1505 ( 473 0 229 233 0 0 ) + 1506 ( 369 1 229 0 0 0 ) + 1507 ( 355 1 229 0 0 0 ) + 1508 ( 58 4 229 0 822 4 ) + 1509 ( 352 1 229 0 0 0 ) + 1510 ( 391 1 230 0 0 0 ) + 1511 ( 466 0 230 231 0 0 ) + 1512 ( 55 1 230 0 0 0 ) + 1513 ( 55 1 230 0 0 0 ) + 1514 ( 466 1 230 0 0 0 ) + 1515 ( 460 4 230 0 826 4 ) + 1516 ( 464 4 231 0 830 4 ) + 1517 ( 352 1 231 0 0 0 ) + 1518 ( 55 1 231 0 0 0 ) + 1519 ( 140 0 232 233 0 0 ) + 1520 ( 352 1 232 0 0 0 ) + 1521 ( 355 1 232 0 0 0 ) + 1522 ( 58 4 232 0 834 4 ) + 1523 ( 369 1 232 0 0 0 ) + 1524 ( 352 1 233 0 0 0 ) + 1525 ( 355 1 233 0 0 0 ) + 1526 ( 58 4 233 0 838 4 ) + 1527 ( 369 1 233 0 0 0 ) + 1528 ( 440 0 234 235 0 0 ) + 1529 ( 258 4 234 0 842 5 ) + 1530 ( 238 1 234 0 0 0 ) + 1531 ( 238 1 235 0 0 0 ) + 1532 ( 258 4 235 0 847 4 ) + 1533 ( 0 0 236 930 0 0 ) + 1534 ( 0 0 236 893 0 0 ) + 1535 ( 0 0 236 891 0 0 ) + 1536 ( 0 0 236 886 0 0 ) + 1537 ( 0 0 236 874 0 0 ) + 1538 ( 0 0 236 872 0 0 ) + 1539 ( 0 0 236 868 0 0 ) + 1540 ( 0 0 236 850 0 0 ) + 1541 ( 0 0 236 815 0 0 ) + 1542 ( 0 0 236 816 0 0 ) + 1543 ( 57 0 236 341 0 0 ) + 1544 ( 57 0 236 324 0 0 ) + 1545 ( 75 0 236 319 0 0 ) + 1546 ( 75 0 236 269 0 0 ) + 1547 ( 468 0 236 242 0 0 ) + 1548 ( 468 0 236 241 0 0 ) + 1549 ( 29 0 236 240 0 0 ) + 1550 ( 84 1 236 0 0 0 ) + 1551 ( 84 0 236 249 0 0 ) + 1552 ( 84 0 236 250 0 0 ) + 1553 ( 84 1 236 0 0 0 ) + 1554 ( 29 1 236 0 0 0 ) + 1555 ( 29 0 236 251 0 0 ) + 1556 ( 57 1 236 0 0 0 ) + 1557 ( 57 1 236 0 0 0 ) + 1558 ( 0 0 236 809 0 0 ) + 1559 ( 75 0 236 263 0 0 ) + 1560 ( 75 0 236 262 0 0 ) + 1561 ( 75 0 236 286 0 0 ) + 1562 ( 75 0 236 285 0 0 ) + 1563 ( 75 0 236 293 0 0 ) + 1564 ( 75 0 236 296 0 0 ) + 1565 ( 0 0 236 818 0 0 ) + 1566 ( 0 0 236 852 0 0 ) + 1567 ( 0 0 236 857 0 0 ) + 1568 ( 0 0 236 877 0 0 ) + 1569 ( 75 0 236 313 0 0 ) + 1570 ( 75 0 236 312 0 0 ) + 1571 ( 468 0 236 244 0 0 ) + 1572 ( 468 0 236 245 0 0 ) + 1573 ( 468 0 236 243 0 0 ) + 1574 ( 84 0 236 238 0 0 ) + 1575 ( 84 0 236 237 0 0 ) + 1576 ( 0 0 236 896 0 0 ) + 1577 ( 468 0 236 246 0 0 ) + 1578 ( 468 0 236 247 0 0 ) + 1579 ( 84 0 236 239 0 0 ) + 1580 ( 75 0 236 315 0 0 ) + 1581 ( 0 0 236 854 0 0 ) + 1582 ( 440 0 237 238 0 0 ) + 1583 ( 243 1 0 237 0 0 ) + 1584 ( 391 1 237 0 0 0 ) + 1585 ( 468 4 237 0 851 5 ) + 1586 ( 417 0 237 250 0 0 ) + 1587 ( 417 0 237 253 0 0 ) + 1588 ( 468 4 238 0 856 4 ) + 1589 ( 417 0 238 250 0 0 ) + 1590 ( 417 0 238 253 0 0 ) + 1591 ( 196 0 238 239 0 0 ) + 1592 ( 197 1 239 0 0 0 ) + 1593 ( 66 0 239 255 0 0 ) + 1594 ( 0 0 239 854 0 0 ) + 1595 ( 84 0 247 239 0 0 ) + 1596 ( 84 0 246 239 0 0 ) + 1597 ( 0 0 239 852 0 0 ) + 1598 ( 417 0 239 253 0 0 ) + 1599 ( 417 0 239 249 0 0 ) + 1600 ( 29 0 319 240 0 0 ) + 1601 ( 417 0 240 251 0 0 ) + 1602 ( 29 0 241 240 0 0 ) + 1603 ( 13 0 240 248 0 0 ) + 1604 ( 13 1 240 0 0 0 ) + 1605 ( 417 1 240 0 0 0 ) + 1606 ( 66 4 240 0 860 5 ) + 1607 ( 478 1 240 0 0 0 ) + 1608 ( 480 1 240 0 0 0 ) + 1609 ( 75 0 241 319 0 0 ) + 1610 ( 84 1 241 0 0 0 ) + 1611 ( 29 1 241 0 0 0 ) + 1612 ( 66 4 241 0 865 7 ) + 1613 ( 440 0 241 243 0 0 ) + 1614 ( 440 0 241 242 0 0 ) + 1615 ( 75 0 241 315 0 0 ) + 1616 ( 482 0 242 245 0 0 ) + 1617 ( 75 0 242 315 0 0 ) + 1618 ( 66 4 242 0 872 6 ) + 1619 ( 484 0 242 244 0 0 ) + 1620 ( 75 0 242 312 0 0 ) + 1621 ( 482 0 242 243 0 0 ) + 1622 ( 196 0 243 245 0 0 ) + 1623 ( 196 0 243 246 0 0 ) + 1624 ( 84 1 243 0 0 0 ) + 1625 ( 66 4 243 0 878 5 ) + 1626 ( 75 0 244 313 0 0 ) + 1627 ( 66 4 244 0 883 4 ) + 1628 ( 70 0 244 247 0 0 ) + 1629 ( 482 0 244 245 0 0 ) + 1630 ( 70 0 245 247 0 0 ) + 1631 ( 66 4 245 0 887 5 ) + 1632 ( 452 0 245 246 0 0 ) + 1633 ( 70 0 246 247 0 0 ) + 1634 ( 0 0 247 893 0 0 ) + 1635 ( 0 0 247 874 0 0 ) + 1636 ( 0 0 247 872 0 0 ) + 1637 ( 0 0 247 850 0 0 ) + 1638 ( 0 0 247 854 0 0 ) + 1639 ( 66 0 247 255 0 0 ) + 1640 ( 75 1 248 0 0 0 ) + 1641 ( 417 1 248 0 0 0 ) + 1642 ( 486 1 248 0 0 0 ) + 1643 ( 476 1 248 0 0 0 ) + 1644 ( 57 0 249 341 0 0 ) + 1645 ( 0 0 249 852 0 0 ) + 1646 ( 0 0 249 809 0 0 ) + 1647 ( 57 1 249 0 0 0 ) + 1648 ( 488 0 249 254 0 0 ) + 1649 ( 488 0 249 253 0 0 ) + 1650 ( 197 1 249 0 0 0 ) + 1651 ( 197 0 249 250 0 0 ) + 1652 ( 488 0 250 253 0 0 ) + 1653 ( 391 1 250 0 0 0 ) + 1654 ( 55 1 250 0 0 0 ) + 1655 ( 29 0 319 251 0 0 ) + 1656 ( 491 0 251 252 0 0 ) + 1657 ( 478 1 251 0 0 0 ) + 1658 ( 491 1 251 0 0 0 ) + 1659 ( 57 1 251 0 0 0 ) + 1660 ( 480 1 251 0 0 0 ) + 1661 ( 492 1 252 0 0 0 ) + 1662 ( 478 1 252 0 0 0 ) + 1663 ( 57 1 252 0 0 0 ) + 1664 ( 13 1 252 0 0 0 ) + 1665 ( 480 1 252 0 0 0 ) + 1666 ( 0 0 253 852 0 0 ) + 1667 ( 55 1 253 0 0 0 ) + 1668 ( 55 0 253 254 0 0 ) + 1669 ( 391 1 253 0 0 0 ) + 1670 ( 57 0 254 341 0 0 ) + 1671 ( 0 0 254 852 0 0 ) + 1672 ( 0 0 254 809 0 0 ) + 1673 ( 57 1 254 0 0 0 ) + 1674 ( 197 1 254 0 0 0 ) + 1675 ( 0 0 255 893 0 0 ) + 1676 ( 0 0 255 874 0 0 ) + 1677 ( 0 0 255 872 0 0 ) + 1678 ( 0 0 255 854 0 0 ) + 1679 ( 0 0 255 850 0 0 ) + 1680 ( 71 1 255 0 0 0 ) + 1681 ( 495 1 255 0 0 0 ) + 1682 ( 6 4 255 0 892 11 ) + 1683 ( 495 0 255 257 0 0 ) + 1684 ( 495 0 255 256 0 0 ) + 1685 ( 0 0 256 893 0 0 ) + 1686 ( 77 1 256 0 0 0 ) + 1687 ( 6 4 256 0 903 4 ) + 1688 ( 77 0 256 257 0 0 ) + 1689 ( 80 4 257 0 907 4 ) + 1690 ( 57 0 258 324 0 0 ) + 1691 ( 34 0 258 273 0 0 ) + 1692 ( 500 0 258 260 0 0 ) + 1693 ( 500 0 258 261 0 0 ) + 1694 ( 38 0 258 263 0 0 ) + 1695 ( 498 0 258 262 0 0 ) + 1696 ( 57 0 259 324 0 0 ) + 1697 ( 504 0 259 260 0 0 ) + 1698 ( 33 0 259 318 0 0 ) + 1699 ( 40 0 259 261 0 0 ) + 1700 ( 33 1 259 0 0 0 ) + 1701 ( 34 4 259 0 911 4 ) + 1702 ( 57 0 260 324 0 0 ) + 1703 ( 34 4 260 0 915 5 ) + 1704 ( 33 1 260 0 0 0 ) + 1705 ( 40 0 260 261 0 0 ) + 1706 ( 33 0 260 318 0 0 ) + 1707 ( 498 0 260 262 0 0 ) + 1708 ( 57 0 261 324 0 0 ) + 1709 ( 34 4 261 0 920 5 ) + 1710 ( 38 0 261 263 0 0 ) + 1711 ( 57 0 262 324 0 0 ) + 1712 ( 33 0 262 319 0 0 ) + 1713 ( 34 0 262 270 0 0 ) + 1714 ( 34 0 262 269 0 0 ) + 1715 ( 34 0 262 268 0 0 ) + 1716 ( 34 0 262 267 0 0 ) + 1717 ( 34 0 262 266 0 0 ) + 1718 ( 34 0 262 265 0 0 ) + 1719 ( 34 0 262 272 0 0 ) + 1720 ( 33 0 262 318 0 0 ) + 1721 ( 34 0 262 271 0 0 ) + 1722 ( 33 1 262 0 0 0 ) + 1723 ( 38 0 262 263 0 0 ) + 1724 ( 57 0 263 324 0 0 ) + 1725 ( 496 0 263 297 0 0 ) + 1726 ( 496 0 263 287 0 0 ) + 1727 ( 496 0 263 284 0 0 ) + 1728 ( 496 0 263 302 0 0 ) + 1729 ( 496 0 263 301 0 0 ) + 1730 ( 34 0 263 267 0 0 ) + 1731 ( 34 0 263 266 0 0 ) + 1732 ( 496 0 263 300 0 0 ) + 1733 ( 496 0 263 299 0 0 ) + 1734 ( 34 0 263 268 0 0 ) + 1735 ( 496 0 263 294 0 0 ) + 1736 ( 496 0 263 296 0 0 ) + 1737 ( 496 0 263 278 0 0 ) + 1738 ( 496 0 263 277 0 0 ) + 1739 ( 496 0 263 275 0 0 ) + 1740 ( 496 0 263 285 0 0 ) + 1741 ( 34 0 263 265 0 0 ) + 1742 ( 34 0 263 264 0 0 ) + 1743 ( 34 0 263 269 0 0 ) + 1744 ( 496 1 263 0 0 0 ) + 1745 ( 496 0 264 287 0 0 ) + 1746 ( 48 0 264 265 0 0 ) + 1747 ( 33 0 265 319 0 0 ) + 1748 ( 30 0 265 310 0 0 ) + 1749 ( 496 0 265 297 0 0 ) + 1750 ( 496 0 265 287 0 0 ) + 1751 ( 48 0 270 265 0 0 ) + 1752 ( 508 0 265 267 0 0 ) + 1753 ( 508 0 265 271 0 0 ) + 1754 ( 30 0 265 307 0 0 ) + 1755 ( 510 0 266 268 0 0 ) + 1756 ( 513 0 266 267 0 0 ) + 1757 ( 30 4 266 0 925 6 ) + 1758 ( 209 0 266 272 0 0 ) + 1759 ( 496 0 266 301 0 0 ) + 1760 ( 496 1 266 0 0 0 ) + 1761 ( 496 0 266 299 0 0 ) + 1762 ( 30 4 267 0 931 5 ) + 1763 ( 260 0 271 267 0 0 ) + 1764 ( 513 0 272 267 0 0 ) + 1765 ( 496 0 267 302 0 0 ) + 1766 ( 506 0 268 269 0 0 ) + 1767 ( 260 0 271 268 0 0 ) + 1768 ( 30 4 268 0 936 6 ) + 1769 ( 510 0 272 268 0 0 ) + 1770 ( 496 0 268 300 0 0 ) + 1771 ( 496 0 268 294 0 0 ) + 1772 ( 33 0 269 319 0 0 ) + 1773 ( 30 0 269 315 0 0 ) + 1774 ( 506 0 271 269 0 0 ) + 1775 ( 496 0 269 296 0 0 ) + 1776 ( 499 0 270 273 0 0 ) + 1777 ( 30 4 270 0 942 5 ) + 1778 ( 33 1 270 0 0 0 ) + 1779 ( 499 1 270 0 0 0 ) + 1780 ( 33 0 271 319 0 0 ) + 1781 ( 508 0 310 271 0 0 ) + 1782 ( 260 1 271 0 0 0 ) + 1783 ( 507 0 315 271 0 0 ) + 1784 ( 67 4 0 271 947 4 ) + 1785 ( 260 0 271 272 0 0 ) + 1786 ( 30 4 272 0 951 4 ) + 1787 ( 30 4 273 0 955 3 ) + 1788 ( 514 1 273 0 0 0 ) + 1789 ( 57 0 274 324 0 0 ) + 1790 ( 54 0 274 292 0 0 ) + 1791 ( 520 0 274 282 0 0 ) + 1792 ( 54 0 274 305 0 0 ) + 1793 ( 54 0 274 306 0 0 ) + 1794 ( 516 0 274 286 0 0 ) + 1795 ( 518 0 274 285 0 0 ) + 1796 ( 57 0 275 324 0 0 ) + 1797 ( 54 0 275 287 0 0 ) + 1798 ( 522 0 275 281 0 0 ) + 1799 ( 522 0 275 280 0 0 ) + 1800 ( 54 0 275 298 0 0 ) + 1801 ( 54 0 275 297 0 0 ) + 1802 ( 522 0 275 278 0 0 ) + 1803 ( 522 0 275 276 0 0 ) + 1804 ( 516 0 275 286 0 0 ) + 1805 ( 57 0 276 324 0 0 ) + 1806 ( 524 0 276 281 0 0 ) + 1807 ( 54 0 276 304 0 0 ) + 1808 ( 54 0 276 303 0 0 ) + 1809 ( 516 0 276 286 0 0 ) + 1810 ( 57 0 277 324 0 0 ) + 1811 ( 526 0 277 284 0 0 ) + 1812 ( 526 0 277 283 0 0 ) + 1813 ( 54 0 277 300 0 0 ) + 1814 ( 54 0 277 299 0 0 ) + 1815 ( 518 0 277 285 0 0 ) + 1816 ( 57 0 278 324 0 0 ) + 1817 ( 54 0 278 297 0 0 ) + 1818 ( 528 0 278 284 0 0 ) + 1819 ( 528 0 278 280 0 0 ) + 1820 ( 54 0 278 302 0 0 ) + 1821 ( 54 0 278 301 0 0 ) + 1822 ( 57 0 279 324 0 0 ) + 1823 ( 536 0 279 282 0 0 ) + 1824 ( 540 0 279 281 0 0 ) + 1825 ( 544 0 279 280 0 0 ) + 1826 ( 532 0 279 283 0 0 ) + 1827 ( 54 4 279 0 958 4 ) + 1828 ( 57 0 280 324 0 0 ) + 1829 ( 531 0 280 284 0 0 ) + 1830 ( 546 0 280 281 0 0 ) + 1831 ( 54 4 280 0 962 6 ) + 1832 ( 57 0 281 324 0 0 ) + 1833 ( 548 0 281 282 0 0 ) + 1834 ( 54 4 281 0 968 7 ) + 1835 ( 516 0 281 286 0 0 ) + 1836 ( 57 0 282 324 0 0 ) + 1837 ( 516 0 282 286 0 0 ) + 1838 ( 54 4 282 0 975 9 ) + 1839 ( 518 0 282 285 0 0 ) + 1840 ( 551 0 282 283 0 0 ) + 1841 ( 57 0 283 324 0 0 ) + 1842 ( 531 0 283 284 0 0 ) + 1843 ( 518 0 283 285 0 0 ) + 1844 ( 54 4 283 0 984 6 ) + 1845 ( 57 0 284 324 0 0 ) + 1846 ( 54 4 284 0 990 6 ) + 1847 ( 57 0 285 324 0 0 ) + 1848 ( 54 0 285 295 0 0 ) + 1849 ( 54 0 285 294 0 0 ) + 1850 ( 54 0 285 296 0 0 ) + 1851 ( 516 0 285 286 0 0 ) + 1852 ( 0 0 286 930 0 0 ) + 1853 ( 57 0 286 324 0 0 ) + 1854 ( 54 0 286 291 0 0 ) + 1855 ( 54 0 286 290 0 0 ) + 1856 ( 54 0 286 288 0 0 ) + 1857 ( 54 0 286 292 0 0 ) + 1858 ( 54 0 286 289 0 0 ) + 1859 ( 54 0 286 293 0 0 ) + 1860 ( 54 0 286 287 0 0 ) + 1861 ( 0 0 287 886 0 0 ) + 1862 ( 552 0 287 297 0 0 ) + 1863 ( 552 0 287 298 0 0 ) + 1864 ( 30 0 287 307 0 0 ) + 1865 ( 552 0 287 289 0 0 ) + 1866 ( 552 0 287 290 0 0 ) + 1867 ( 30 0 287 309 0 0 ) + 1868 ( 30 0 287 308 0 0 ) + 1869 ( 0 0 287 896 0 0 ) + 1870 ( 552 0 287 291 0 0 ) + 1871 ( 0 0 287 902 0 0 ) + 1872 ( 556 0 288 290 0 0 ) + 1873 ( 517 0 288 303 0 0 ) + 1874 ( 30 4 288 0 996 6 ) + 1875 ( 517 1 288 0 0 0 ) + 1876 ( 560 0 288 292 0 0 ) + 1877 ( 517 0 288 305 0 0 ) + 1878 ( 559 0 288 289 0 0 ) + 1879 ( 517 0 289 304 0 0 ) + 1880 ( 517 0 289 298 0 0 ) + 1881 ( 30 4 289 0 1002 5 ) + 1882 ( 556 0 289 290 0 0 ) + 1883 ( 554 0 290 291 0 0 ) + 1884 ( 30 4 290 0 1007 8 ) + 1885 ( 562 0 290 293 0 0 ) + 1886 ( 556 0 292 290 0 0 ) + 1887 ( 0 0 291 886 0 0 ) + 1888 ( 30 0 291 311 0 0 ) + 1889 ( 562 0 291 293 0 0 ) + 1890 ( 0 0 291 896 0 0 ) + 1891 ( 562 0 292 306 0 0 ) + 1892 ( 520 1 292 0 0 0 ) + 1893 ( 30 4 292 0 1015 6 ) + 1894 ( 560 0 305 292 0 0 ) + 1895 ( 562 0 292 293 0 0 ) + 1896 ( 0 0 293 886 0 0 ) + 1897 ( 30 0 293 313 0 0 ) + 1898 ( 30 0 293 314 0 0 ) + 1899 ( 30 0 293 312 0 0 ) + 1900 ( 0 0 293 896 0 0 ) + 1901 ( 517 0 293 306 0 0 ) + 1902 ( 517 0 293 295 0 0 ) + 1903 ( 517 0 293 296 0 0 ) + 1904 ( 519 0 294 300 0 0 ) + 1905 ( 190 0 294 295 0 0 ) + 1906 ( 30 4 294 0 1021 5 ) + 1907 ( 519 1 294 0 0 0 ) + 1908 ( 506 0 294 296 0 0 ) + 1909 ( 30 0 295 312 0 0 ) + 1910 ( 519 0 295 306 0 0 ) + 1911 ( 519 1 295 0 0 0 ) + 1912 ( 506 0 295 296 0 0 ) + 1913 ( 30 0 296 312 0 0 ) + 1914 ( 30 0 296 315 0 0 ) + 1915 ( 30 0 297 310 0 0 ) + 1916 ( 528 1 297 0 0 0 ) + 1917 ( 508 0 297 302 0 0 ) + 1918 ( 564 0 297 298 0 0 ) + 1919 ( 522 0 298 304 0 0 ) + 1920 ( 30 4 298 0 1026 5 ) + 1921 ( 522 1 298 0 0 0 ) + 1922 ( 510 0 299 300 0 0 ) + 1923 ( 526 1 299 0 0 0 ) + 1924 ( 30 4 299 0 1031 3 ) + 1925 ( 526 1 300 0 0 0 ) + 1926 ( 30 4 300 0 1034 4 ) + 1927 ( 513 0 301 302 0 0 ) + 1928 ( 30 4 301 0 1038 3 ) + 1929 ( 528 1 301 0 0 0 ) + 1930 ( 30 4 302 0 1041 4 ) + 1931 ( 528 1 302 0 0 0 ) + 1932 ( 559 0 303 304 0 0 ) + 1933 ( 524 1 303 0 0 0 ) + 1934 ( 30 4 303 0 1045 3 ) + 1935 ( 524 1 304 0 0 0 ) + 1936 ( 30 4 304 0 1048 4 ) + 1937 ( 30 4 305 0 1052 3 ) + 1938 ( 520 1 305 0 0 0 ) + 1939 ( 30 0 306 314 0 0 ) + 1940 ( 520 1 306 0 0 0 ) + 1941 ( 33 0 307 319 0 0 ) + 1942 ( 484 0 307 309 0 0 ) + 1943 ( 484 0 307 308 0 0 ) + 1944 ( 552 1 307 0 0 0 ) + 1945 ( 552 0 307 310 0 0 ) + 1946 ( 49 1 307 0 0 0 ) + 1947 ( 67 4 0 307 1055 7 ) + 1948 ( 78 0 308 309 0 0 ) + 1949 ( 67 4 0 308 1062 4 ) + 1950 ( 552 0 309 311 0 0 ) + 1951 ( 67 4 0 309 1066 6 ) + 1952 ( 552 1 309 0 0 0 ) + 1953 ( 33 0 310 319 0 0 ) + 1954 ( 528 1 310 0 0 0 ) + 1955 ( 67 4 0 310 1072 6 ) + 1956 ( 508 1 310 0 0 0 ) + 1957 ( 564 1 310 0 0 0 ) + 1958 ( 563 0 313 311 0 0 ) + 1959 ( 67 4 0 311 1078 4 ) + 1960 ( 555 1 311 0 0 0 ) + 1961 ( 519 0 312 314 0 0 ) + 1962 ( 484 0 312 313 0 0 ) + 1963 ( 191 1 312 0 0 0 ) + 1964 ( 191 0 312 315 0 0 ) + 1965 ( 519 1 312 0 0 0 ) + 1966 ( 67 4 0 312 1082 6 ) + 1967 ( 67 4 0 313 1088 6 ) + 1968 ( 563 1 313 0 0 0 ) + 1969 ( 484 0 314 313 0 0 ) + 1970 ( 563 1 314 0 0 0 ) + 1971 ( 67 4 0 314 1094 4 ) + 1972 ( 520 1 314 0 0 0 ) + 1973 ( 33 0 315 319 0 0 ) + 1974 ( 507 1 315 0 0 0 ) + 1975 ( 67 4 0 315 1098 6 ) + 1976 ( 57 0 316 324 0 0 ) + 1977 ( 566 0 316 317 0 0 ) + 1978 ( 54 4 316 0 1104 4 ) + 1979 ( 29 1 316 0 0 0 ) + 1980 ( 57 1 316 0 0 0 ) + 1981 ( 64 0 316 318 0 0 ) + 1982 ( 57 0 317 324 0 0 ) + 1983 ( 48 0 317 319 0 0 ) + 1984 ( 54 4 317 0 1108 4 ) + 1985 ( 29 1 317 0 0 0 ) + 1986 ( 57 1 317 0 0 0 ) + 1987 ( 64 0 317 318 0 0 ) + 1988 ( 57 0 318 324 0 0 ) + 1989 ( 54 4 318 0 1112 7 ) + 1990 ( 48 0 318 319 0 0 ) + 1991 ( 57 0 319 324 0 0 ) + 1992 ( 49 1 319 0 0 0 ) + 1993 ( 67 4 0 319 1119 10 ) + 1994 ( 29 1 319 0 0 0 ) + 1995 ( 29 0 319 320 0 0 ) + 1996 ( 29 0 319 321 0 0 ) + 1997 ( 29 1 319 0 0 0 ) + 1998 ( 57 1 319 0 0 0 ) + 1999 ( 13 1 320 0 0 0 ) + 2000 ( 13 0 320 323 0 0 ) + 2001 ( 568 1 320 0 0 0 ) + 2002 ( 417 1 320 0 0 0 ) + 2003 ( 417 0 320 321 0 0 ) + 2004 ( 570 1 320 0 0 0 ) + 2005 ( 67 4 0 320 1129 4 ) + 2006 ( 57 1 321 0 0 0 ) + 2007 ( 568 1 321 0 0 0 ) + 2008 ( 491 1 321 0 0 0 ) + 2009 ( 491 0 321 322 0 0 ) + 2010 ( 570 1 321 0 0 0 ) + 2011 ( 57 1 322 0 0 0 ) + 2012 ( 13 1 322 0 0 0 ) + 2013 ( 568 1 322 0 0 0 ) + 2014 ( 570 1 322 0 0 0 ) + 2015 ( 492 1 322 0 0 0 ) + 2016 ( 417 1 323 0 0 0 ) + 2017 ( 495 1 323 0 0 0 ) + 2018 ( 486 1 323 0 0 0 ) + 2019 ( 572 1 323 0 0 0 ) + 2020 ( 0 0 324 939 0 0 ) + 2021 ( 0 0 324 820 0 0 ) + 2022 ( 0 0 324 815 0 0 ) + 2023 ( 0 0 324 818 0 0 ) + 2024 ( 574 0 324 341 0 0 ) + 2025 ( 61 1 324 0 0 0 ) + 2026 ( 574 1 324 0 0 0 ) + 2027 ( 0 0 324 837 0 0 ) + 2028 ( 0 0 324 936 0 0 ) + 2029 ( 0 0 324 944 0 0 ) + 2030 ( 0 0 324 816 0 0 ) + 2031 ( 0 0 324 930 0 0 ) + 2032 ( 574 0 324 339 0 0 ) + 2033 ( 574 0 324 340 0 0 ) + 2034 ( 27 0 324 357 0 0 ) + 2035 ( 27 0 324 358 0 0 ) + 2036 ( 27 0 324 359 0 0 ) + 2037 ( 567 0 325 327 0 0 ) + 2038 ( 27 0 325 363 0 0 ) + 2039 ( 27 1 325 0 0 0 ) + 2040 ( 163 0 325 330 0 0 ) + 2041 ( 58 4 325 0 1133 6 ) + 2042 ( 580 1 325 0 0 0 ) + 2043 ( 580 0 325 328 0 0 ) + 2044 ( 567 1 325 0 0 0 ) + 2045 ( 106 0 325 326 0 0 ) + 2046 ( 27 1 326 0 0 0 ) + 2047 ( 58 4 326 0 1139 4 ) + 2048 ( 580 1 326 0 0 0 ) + 2049 ( 567 1 326 0 0 0 ) + 2050 ( 86 1 327 0 0 0 ) + 2051 ( 58 4 327 0 1143 4 ) + 2052 ( 163 0 327 331 0 0 ) + 2053 ( 104 1 327 0 0 0 ) + 2054 ( 102 1 327 0 0 0 ) + 2055 ( 567 0 363 327 0 0 ) + 2056 ( 25 1 327 0 0 0 ) + 2057 ( 27 0 328 363 0 0 ) + 2058 ( 163 0 328 330 0 0 ) + 2059 ( 58 4 328 0 1147 4 ) + 2060 ( 116 0 328 329 0 0 ) + 2061 ( 86 1 328 0 0 0 ) + 2062 ( 27 1 329 0 0 0 ) + 2063 ( 163 1 329 0 0 0 ) + 2064 ( 58 4 329 0 1151 4 ) + 2065 ( 86 1 329 0 0 0 ) + 2066 ( 567 0 330 331 0 0 ) + 2067 ( 116 1 330 0 0 0 ) + 2068 ( 58 4 330 0 1155 11 ) + 2069 ( 96 1 330 0 0 0 ) + 2070 ( 96 1 330 0 0 0 ) + 2071 ( 96 0 330 332 0 0 ) + 2072 ( 96 0 330 333 0 0 ) + 2073 ( 96 1 330 0 0 0 ) + 2074 ( 96 0 330 334 0 0 ) + 2075 ( 96 1 330 0 0 0 ) + 2076 ( 93 1 330 0 0 0 ) + 2077 ( 93 0 330 335 0 0 ) + 2078 ( 93 1 330 0 0 0 ) + 2079 ( 93 0 330 336 0 0 ) + 2080 ( 93 1 330 0 0 0 ) + 2081 ( 93 0 330 337 0 0 ) + 2082 ( 93 1 330 0 0 0 ) + 2083 ( 27 1 330 0 0 0 ) + 2084 ( 58 4 331 0 1166 4 ) + 2085 ( 96 1 331 0 0 0 ) + 2086 ( 93 1 331 0 0 0 ) + 2087 ( 27 1 331 0 0 0 ) + 2088 ( 27 1 332 0 0 0 ) + 2089 ( 93 0 332 335 0 0 ) + 2090 ( 75 1 332 0 0 0 ) + 2091 ( 582 1 332 0 0 0 ) + 2092 ( 476 1 332 0 0 0 ) + 2093 ( 27 1 333 0 0 0 ) + 2094 ( 93 0 333 336 0 0 ) + 2095 ( 585 1 333 0 0 0 ) + 2096 ( 582 1 333 0 0 0 ) + 2097 ( 562 1 333 0 0 0 ) + 2098 ( 27 1 334 0 0 0 ) + 2099 ( 93 0 334 337 0 0 ) + 2100 ( 49 1 334 0 0 0 ) + 2101 ( 582 1 334 0 0 0 ) + 2102 ( 586 1 334 0 0 0 ) + 2103 ( 75 1 335 0 0 0 ) + 2104 ( 582 1 335 0 0 0 ) + 2105 ( 577 1 335 0 0 0 ) + 2106 ( 58 4 335 0 1170 4 ) + 2107 ( 476 1 335 0 0 0 ) + 2108 ( 585 1 336 0 0 0 ) + 2109 ( 582 1 336 0 0 0 ) + 2110 ( 577 1 336 0 0 0 ) + 2111 ( 58 4 336 0 1174 4 ) + 2112 ( 562 1 336 0 0 0 ) + 2113 ( 58 4 337 0 1178 4 ) + 2114 ( 577 1 337 0 0 0 ) + 2115 ( 582 1 337 0 0 0 ) + 2116 ( 49 1 337 0 0 0 ) + 2117 ( 586 1 337 0 0 0 ) + 2118 ( 58 4 338 0 1182 6 ) + 2119 ( 84 1 338 0 0 0 ) + 2120 ( 27 0 338 357 0 0 ) + 2121 ( 63 0 338 339 0 0 ) + 2122 ( 84 0 338 342 0 0 ) + 2123 ( 27 0 338 358 0 0 ) + 2124 ( 27 0 338 360 0 0 ) + 2125 ( 190 0 338 340 0 0 ) + 2126 ( 58 4 339 0 1188 4 ) + 2127 ( 27 0 339 357 0 0 ) + 2128 ( 27 0 339 358 0 0 ) + 2129 ( 27 0 339 360 0 0 ) + 2130 ( 190 0 339 340 0 0 ) + 2131 ( 212 0 340 341 0 0 ) + 2132 ( 58 4 340 0 1192 6 ) + 2133 ( 27 0 340 361 0 0 ) + 2134 ( 190 0 342 340 0 0 ) + 2135 ( 27 0 340 358 0 0 ) + 2136 ( 0 0 341 785 0 0 ) + 2137 ( 213 1 341 0 0 0 ) + 2138 ( 0 0 341 810 0 0 ) + 2139 ( 27 0 341 361 0 0 ) + 2140 ( 27 0 341 358 0 0 ) + 2141 ( 27 0 342 361 0 0 ) + 2142 ( 58 4 342 0 1198 4 ) + 2143 ( 197 1 342 0 0 0 ) + 2144 ( 0 0 343 957 0 0 ) + 2145 ( 0 0 343 939 0 0 ) + 2146 ( 110 0 343 367 0 0 ) + 2147 ( 116 0 343 345 0 0 ) + 2148 ( 116 0 343 346 0 0 ) + 2149 ( 116 0 343 347 0 0 ) + 2150 ( 110 0 343 357 0 0 ) + 2151 ( 110 0 343 358 0 0 ) + 2152 ( 110 0 343 359 0 0 ) + 2153 ( 0 0 343 820 0 0 ) + 2154 ( 0 0 343 837 0 0 ) + 2155 ( 84 0 344 353 0 0 ) + 2156 ( 114 0 344 345 0 0 ) + 2157 ( 237 1 344 0 0 0 ) + 2158 ( 84 1 344 0 0 0 ) + 2159 ( 110 4 344 0 1202 4 ) + 2160 ( 84 0 345 353 0 0 ) + 2161 ( 112 0 345 349 0 0 ) + 2162 ( 112 0 345 350 0 0 ) + 2163 ( 110 0 345 367 0 0 ) + 2164 ( 112 0 345 347 0 0 ) + 2165 ( 112 1 345 0 0 0 ) + 2166 ( 84 1 345 0 0 0 ) + 2167 ( 110 0 345 357 0 0 ) + 2168 ( 0 0 346 820 0 0 ) + 2169 ( 84 0 346 356 0 0 ) + 2170 ( 84 0 346 355 0 0 ) + 2171 ( 197 0 346 351 0 0 ) + 2172 ( 0 0 346 804 0 0 ) + 2173 ( 110 0 346 358 0 0 ) + 2174 ( 84 1 346 0 0 0 ) + 2175 ( 197 1 346 0 0 0 ) + 2176 ( 197 0 346 347 0 0 ) + 2177 ( 574 0 347 350 0 0 ) + 2178 ( 574 0 347 351 0 0 ) + 2179 ( 110 0 347 359 0 0 ) + 2180 ( 574 1 347 0 0 0 ) + 2181 ( 440 0 348 351 0 0 ) + 2182 ( 211 0 348 349 0 0 ) + 2183 ( 440 0 348 354 0 0 ) + 2184 ( 258 4 348 0 1206 7 ) + 2185 ( 211 0 348 352 0 0 ) + 2186 ( 63 0 348 350 0 0 ) + 2187 ( 589 0 352 349 0 0 ) + 2188 ( 258 4 349 0 1213 5 ) + 2189 ( 112 0 353 349 0 0 ) + 2190 ( 63 0 349 350 0 0 ) + 2191 ( 258 4 350 0 1218 5 ) + 2192 ( 440 0 350 351 0 0 ) + 2193 ( 589 0 354 351 0 0 ) + 2194 ( 258 4 351 0 1223 6 ) + 2195 ( 197 0 355 351 0 0 ) + 2196 ( 589 0 352 353 0 0 ) + 2197 ( 237 1 352 0 0 0 ) + 2198 ( 258 4 352 0 1229 5 ) + 2199 ( 258 4 353 0 1234 5 ) + 2200 ( 237 1 353 0 0 0 ) + 2201 ( 589 0 354 355 0 0 ) + 2202 ( 258 4 354 0 1239 5 ) + 2203 ( 258 4 355 0 1244 4 ) + 2204 ( 84 0 358 356 0 0 ) + 2205 ( 443 0 361 356 0 0 ) + 2206 ( 213 1 356 0 0 0 ) + 2207 ( 0 0 356 804 0 0 ) + 2208 ( 29 0 357 367 0 0 ) + 2209 ( 29 1 357 0 0 0 ) + 2210 ( 84 1 357 0 0 0 ) + 2211 ( 112 1 357 0 0 0 ) + 2212 ( 112 0 357 360 0 0 ) + 2213 ( 112 0 357 359 0 0 ) + 2214 ( 0 0 358 957 0 0 ) + 2215 ( 0 0 358 939 0 0 ) + 2216 ( 0 0 358 820 0 0 ) + 2217 ( 0 0 358 944 0 0 ) + 2218 ( 0 0 358 837 0 0 ) + 2219 ( 0 0 358 804 0 0 ) + 2220 ( 84 1 358 0 0 0 ) + 2221 ( 84 0 358 361 0 0 ) + 2222 ( 197 1 358 0 0 0 ) + 2223 ( 197 0 358 360 0 0 ) + 2224 ( 197 0 358 359 0 0 ) + 2225 ( 574 1 359 0 0 0 ) + 2226 ( 574 0 359 360 0 0 ) + 2227 ( 84 1 360 0 0 0 ) + 2228 ( 590 1 360 0 0 0 ) + 2229 ( 0 0 361 804 0 0 ) + 2230 ( 197 1 361 0 0 0 ) + 2231 ( 102 1 362 0 0 0 ) + 2232 ( 243 1 0 362 0 0 ) + 2233 ( 579 1 362 0 0 0 ) + 2234 ( 269 1 362 0 0 0 ) + 2235 ( 104 1 362 0 0 0 ) + 2236 ( 102 1 363 0 0 0 ) + 2237 ( 116 1 363 0 0 0 ) + 2238 ( 104 1 363 0 0 0 ) + 2239 ( 25 1 363 0 0 0 ) + 2240 ( 266 1 364 0 0 0 ) + 2241 ( 266 0 364 366 0 0 ) + 2242 ( 567 1 364 0 0 0 ) + 2243 ( 567 0 364 365 0 0 ) + 2244 ( 116 1 364 0 0 0 ) + 2245 ( 21 1 364 0 0 0 ) + 2246 ( 594 4 364 0 1248 4 ) + 2247 ( 266 0 365 366 0 0 ) + 2248 ( 21 1 365 0 0 0 ) + 2249 ( 108 4 365 0 1252 4 ) + 2250 ( 100 1 366 0 0 0 ) + 2251 ( 116 1 366 0 0 0 ) + 2252 ( 108 4 366 0 1256 5 ) + 2253 ( 124 4 367 0 1261 4 ) + 2254 ( 84 1 367 0 0 0 ) + 2255 ( 599 0 368 389 0 0 ) + 2256 ( 602 0 368 384 0 0 ) + 2257 ( 604 4 368 0 1265 7 ) + 2258 ( 237 1 368 0 0 0 ) + 2259 ( 602 0 368 379 0 0 ) + 2260 ( 602 1 368 0 0 0 ) + 2261 ( 599 0 368 387 0 0 ) + 2262 ( 599 0 368 388 0 0 ) + 2263 ( 599 1 368 0 0 0 ) + 2264 ( 0 0 368 1205 0 0 ) + 2265 ( 602 0 368 385 0 0 ) + 2266 ( 602 0 368 370 0 0 ) + 2267 ( 602 0 368 372 0 0 ) + 2268 ( 601 1 368 0 0 0 ) + 2269 ( 611 0 369 370 0 0 ) + 2270 ( 112 0 369 372 0 0 ) + 2271 ( 601 1 369 0 0 0 ) + 2272 ( 237 1 369 0 0 0 ) + 2273 ( 252 4 369 0 1272 4 ) + 2274 ( 608 0 369 371 0 0 ) + 2275 ( 112 0 370 372 0 0 ) + 2276 ( 601 1 370 0 0 0 ) + 2277 ( 237 1 370 0 0 0 ) + 2278 ( 252 4 370 0 1276 4 ) + 2279 ( 606 0 371 373 0 0 ) + 2280 ( 252 4 371 0 1280 8 ) + 2281 ( 237 1 371 0 0 0 ) + 2282 ( 601 1 371 0 0 0 ) + 2283 ( 112 0 371 372 0 0 ) + 2284 ( 252 0 372 384 0 0 ) + 2285 ( 252 0 372 383 0 0 ) + 2286 ( 252 0 372 385 0 0 ) + 2287 ( 252 0 372 386 0 0 ) + 2288 ( 0 0 372 1206 0 0 ) + 2289 ( 601 1 372 0 0 0 ) + 2290 ( 252 0 372 379 0 0 ) + 2291 ( 606 0 372 373 0 0 ) + 2292 ( 252 0 373 376 0 0 ) + 2293 ( 252 0 373 375 0 0 ) + 2294 ( 252 0 373 377 0 0 ) + 2295 ( 0 0 373 1206 0 0 ) + 2296 ( 2 0 373 642 0 0 ) + 2297 ( 252 0 373 374 0 0 ) + 2298 ( 252 0 373 378 0 0 ) + 2299 ( 2 0 373 626 0 0 ) + 2300 ( 237 1 373 0 0 0 ) + 2301 ( 601 1 373 0 0 0 ) + 2302 ( 2 0 374 652 0 0 ) + 2303 ( 2 0 374 638 0 0 ) + 2304 ( 237 1 374 0 0 0 ) + 2305 ( 388 1 374 0 0 0 ) + 2306 ( 607 1 374 0 0 0 ) + 2307 ( 166 4 374 0 1288 4 ) + 2308 ( 388 0 374 377 0 0 ) + 2309 ( 2 0 375 638 0 0 ) + 2310 ( 2 0 375 653 0 0 ) + 2311 ( 140 0 375 376 0 0 ) + 2312 ( 607 1 375 0 0 0 ) + 2313 ( 24 4 375 0 1292 4 ) + 2314 ( 115 0 375 377 0 0 ) + 2315 ( 2 0 376 638 0 0 ) + 2316 ( 2 0 376 654 0 0 ) + 2317 ( 607 1 376 0 0 0 ) + 2318 ( 24 4 376 0 1296 4 ) + 2319 ( 390 0 376 378 0 0 ) + 2320 ( 2 0 377 638 0 0 ) + 2321 ( 2 0 377 655 0 0 ) + 2322 ( 24 4 377 0 1300 4 ) + 2323 ( 607 1 377 0 0 0 ) + 2324 ( 0 0 378 1153 0 0 ) + 2325 ( 2 0 378 658 0 0 ) + 2326 ( 2 0 378 656 0 0 ) + 2327 ( 2 0 378 648 0 0 ) + 2328 ( 2 0 378 638 0 0 ) + 2329 ( 607 0 378 384 0 0 ) + 2330 ( 607 0 378 380 0 0 ) + 2331 ( 391 1 378 0 0 0 ) + 2332 ( 613 0 470 378 0 0 ) + 2333 ( 607 1 378 0 0 0 ) + 2334 ( 607 0 378 379 0 0 ) + 2335 ( 2 0 378 657 0 0 ) + 2336 ( 0 0 378 1206 0 0 ) + 2337 ( 607 0 378 386 0 0 ) + 2338 ( 2 0 378 632 0 0 ) + 2339 ( 131 0 379 384 0 0 ) + 2340 ( 604 0 379 382 0 0 ) + 2341 ( 604 0 379 381 0 0 ) + 2342 ( 0 0 379 1206 0 0 ) + 2343 ( 131 1 379 0 0 0 ) + 2344 ( 604 0 379 380 0 0 ) + 2345 ( 0 0 380 1153 0 0 ) + 2346 ( 617 0 419 380 0 0 ) + 2347 ( 617 0 417 380 0 0 ) + 2348 ( 131 1 380 0 0 0 ) + 2349 ( 617 0 423 380 0 0 ) + 2350 ( 607 0 470 380 0 0 ) + 2351 ( 615 1 380 0 0 0 ) + 2352 ( 617 0 418 380 0 0 ) + 2353 ( 617 0 421 380 0 0 ) + 2354 ( 617 0 422 380 0 0 ) + 2355 ( 617 0 424 380 0 0 ) + 2356 ( 617 0 425 380 0 0 ) + 2357 ( 617 0 420 380 0 0 ) + 2358 ( 617 0 415 380 0 0 ) + 2359 ( 617 0 416 380 0 0 ) + 2360 ( 617 0 431 380 0 0 ) + 2361 ( 617 0 432 380 0 0 ) + 2362 ( 615 0 380 382 0 0 ) + 2363 ( 610 0 381 382 0 0 ) + 2364 ( 618 4 381 0 1304 5 ) + 2365 ( 620 1 381 0 0 0 ) + 2366 ( 604 0 1206 381 0 0 ) + 2367 ( 131 1 381 0 0 0 ) + 2368 ( 614 0 382 1153 0 0 ) + 2369 ( 618 4 382 0 1309 5 ) + 2370 ( 620 1 382 0 0 0 ) + 2371 ( 604 0 1206 382 0 0 ) + 2372 ( 131 1 382 0 0 0 ) + 2373 ( 210 0 383 384 0 0 ) + 2374 ( 608 0 383 386 0 0 ) + 2375 ( 622 4 383 0 1314 4 ) + 2376 ( 611 0 383 385 0 0 ) + 2377 ( 622 4 384 0 1318 6 ) + 2378 ( 211 0 384 385 0 0 ) + 2379 ( 211 0 384 386 0 0 ) + 2380 ( 622 4 385 0 1324 4 ) + 2381 ( 622 4 386 0 1328 4 ) + 2382 ( 260 0 387 389 0 0 ) + 2383 ( 597 0 387 391 0 0 ) + 2384 ( 597 1 387 0 0 0 ) + 2385 ( 260 1 387 0 0 0 ) + 2386 ( 237 1 387 0 0 0 ) + 2387 ( 601 1 387 0 0 0 ) + 2388 ( 604 4 387 0 1332 4 ) + 2389 ( 399 0 388 389 0 0 ) + 2390 ( 597 0 388 393 0 0 ) + 2391 ( 0 0 388 1205 0 0 ) + 2392 ( 597 1 388 0 0 0 ) + 2393 ( 399 1 388 0 0 0 ) + 2394 ( 604 4 388 0 1336 4 ) + 2395 ( 601 1 388 0 0 0 ) + 2396 ( 597 0 389 394 0 0 ) + 2397 ( 601 1 389 0 0 0 ) + 2398 ( 624 4 389 0 1340 6 ) + 2399 ( 597 0 389 397 0 0 ) + 2400 ( 597 0 389 396 0 0 ) + 2401 ( 597 0 389 395 0 0 ) + 2402 ( 628 0 390 391 0 0 ) + 2403 ( 618 4 390 0 1346 4 ) + 2404 ( 601 1 390 0 0 0 ) + 2405 ( 260 0 390 394 0 0 ) + 2406 ( 260 1 390 0 0 0 ) + 2407 ( 627 1 390 0 0 0 ) + 2408 ( 237 1 390 0 0 0 ) + 2409 ( 260 0 390 396 0 0 ) + 2410 ( 618 4 391 0 1350 4 ) + 2411 ( 601 1 391 0 0 0 ) + 2412 ( 260 0 391 394 0 0 ) + 2413 ( 260 1 391 0 0 0 ) + 2414 ( 237 1 391 0 0 0 ) + 2415 ( 260 0 391 396 0 0 ) + 2416 ( 0 0 392 1208 0 0 ) + 2417 ( 628 0 392 393 0 0 ) + 2418 ( 601 1 392 0 0 0 ) + 2419 ( 618 4 392 0 1354 4 ) + 2420 ( 399 0 392 394 0 0 ) + 2421 ( 399 1 392 0 0 0 ) + 2422 ( 627 1 392 0 0 0 ) + 2423 ( 0 0 392 1207 0 0 ) + 2424 ( 399 0 392 397 0 0 ) + 2425 ( 0 0 393 1209 0 0 ) + 2426 ( 601 1 393 0 0 0 ) + 2427 ( 618 4 393 0 1358 4 ) + 2428 ( 399 0 393 394 0 0 ) + 2429 ( 399 1 393 0 0 0 ) + 2430 ( 0 0 393 1207 0 0 ) + 2431 ( 399 0 393 397 0 0 ) + 2432 ( 630 0 394 396 0 0 ) + 2433 ( 630 0 394 395 0 0 ) + 2434 ( 630 0 394 397 0 0 ) + 2435 ( 627 1 394 0 0 0 ) + 2436 ( 601 1 394 0 0 0 ) + 2437 ( 209 0 395 396 0 0 ) + 2438 ( 624 4 395 0 1362 4 ) + 2439 ( 214 0 395 397 0 0 ) + 2440 ( 624 4 396 0 1366 5 ) + 2441 ( 624 4 397 0 1371 5 ) + 2442 ( 2 0 398 596 0 0 ) + 2443 ( 2 0 398 601 0 0 ) + 2444 ( 639 1 398 0 0 0 ) + 2445 ( 34 4 398 0 1376 4 ) + 2446 ( 82 0 398 403 0 0 ) + 2447 ( 82 1 398 0 0 0 ) + 2448 ( 87 1 398 0 0 0 ) + 2449 ( 87 0 398 399 0 0 ) + 2450 ( 175 1 398 0 0 0 ) + 2451 ( 643 0 399 405 0 0 ) + 2452 ( 644 1 399 0 0 0 ) + 2453 ( 34 4 399 0 1380 8 ) + 2454 ( 87 0 601 399 0 0 ) + 2455 ( 87 0 561 399 0 0 ) + 2456 ( 641 1 399 0 0 0 ) + 2457 ( 643 1 399 0 0 0 ) + 2458 ( 639 1 399 0 0 0 ) + 2459 ( 351 1 399 0 0 0 ) + 2460 ( 28 0 400 401 0 0 ) + 2461 ( 617 0 400 470 0 0 ) + 2462 ( 34 4 400 0 1388 5 ) + 2463 ( 607 1 400 0 0 0 ) + 2464 ( 13 1 400 0 0 0 ) + 2465 ( 2 0 400 602 0 0 ) + 2466 ( 2 0 400 605 0 0 ) + 2467 ( 2 0 400 594 0 0 ) + 2468 ( 13 0 400 404 0 0 ) + 2469 ( 13 1 400 0 0 0 ) + 2470 ( 617 0 401 470 0 0 ) + 2471 ( 34 4 401 0 1393 5 ) + 2472 ( 607 1 401 0 0 0 ) + 2473 ( 61 0 442 401 0 0 ) + 2474 ( 61 0 455 401 0 0 ) + 2475 ( 2 0 401 603 0 0 ) + 2476 ( 2 0 401 605 0 0 ) + 2477 ( 2 0 401 594 0 0 ) + 2478 ( 60 0 401 402 0 0 ) + 2479 ( 0 0 402 1153 0 0 ) + 2480 ( 0 0 402 1148 0 0 ) + 2481 ( 639 0 402 427 0 0 ) + 2482 ( 639 0 402 419 0 0 ) + 2483 ( 0 0 402 1139 0 0 ) + 2484 ( 0 0 402 1138 0 0 ) + 2485 ( 34 0 402 408 0 0 ) + 2486 ( 34 0 402 407 0 0 ) + 2487 ( 2 0 402 604 0 0 ) + 2488 ( 639 0 402 446 0 0 ) + 2489 ( 639 0 402 425 0 0 ) + 2490 ( 639 0 402 422 0 0 ) + 2491 ( 34 0 402 410 0 0 ) + 2492 ( 34 0 402 409 0 0 ) + 2493 ( 34 0 402 411 0 0 ) + 2494 ( 639 0 402 442 0 0 ) + 2495 ( 639 0 402 450 0 0 ) + 2496 ( 639 0 402 454 0 0 ) + 2497 ( 639 0 402 455 0 0 ) + 2498 ( 617 0 402 470 0 0 ) + 2499 ( 2 0 402 585 0 0 ) + 2500 ( 2 0 402 594 0 0 ) + 2501 ( 2 0 402 605 0 0 ) + 2502 ( 2 0 402 610 0 0 ) + 2503 ( 2 0 403 601 0 0 ) + 2504 ( 639 1 403 0 0 0 ) + 2505 ( 34 4 403 0 1398 4 ) + 2506 ( 641 1 403 0 0 0 ) + 2507 ( 646 0 403 404 0 0 ) + 2508 ( 646 0 562 404 0 0 ) + 2509 ( 34 4 404 0 1402 8 ) + 2510 ( 641 1 404 0 0 0 ) + 2511 ( 644 1 404 0 0 0 ) + 2512 ( 13 0 550 404 0 0 ) + 2513 ( 646 0 601 404 0 0 ) + 2514 ( 13 0 602 404 0 0 ) + 2515 ( 639 1 404 0 0 0 ) + 2516 ( 641 0 405 406 0 0 ) + 2517 ( 34 4 405 0 1410 5 ) + 2518 ( 98 0 671 405 0 0 ) + 2519 ( 650 1 405 0 0 0 ) + 2520 ( 641 1 405 0 0 0 ) + 2521 ( 99 0 405 485 0 0 ) + 2522 ( 99 0 405 481 0 0 ) + 2523 ( 649 1 405 0 0 0 ) + 2524 ( 652 1 406 0 0 0 ) + 2525 ( 650 1 406 0 0 0 ) + 2526 ( 98 0 677 406 0 0 ) + 2527 ( 99 0 406 481 0 0 ) + 2528 ( 649 1 406 0 0 0 ) + 2529 ( 639 0 407 427 0 0 ) + 2530 ( 2 0 407 597 0 0 ) + 2531 ( 112 0 407 408 0 0 ) + 2532 ( 61 0 407 412 0 0 ) + 2533 ( 61 1 407 0 0 0 ) + 2534 ( 66 4 407 0 1415 5 ) + 2535 ( 639 0 407 442 0 0 ) + 2536 ( 639 0 407 450 0 0 ) + 2537 ( 639 0 407 451 0 0 ) + 2538 ( 2 0 407 606 0 0 ) + 2539 ( 639 0 408 427 0 0 ) + 2540 ( 2 0 408 598 0 0 ) + 2541 ( 66 4 408 0 1420 5 ) + 2542 ( 639 0 408 451 0 0 ) + 2543 ( 210 0 408 409 0 0 ) + 2544 ( 210 0 408 410 0 0 ) + 2545 ( 2 0 408 606 0 0 ) + 2546 ( 639 0 409 427 0 0 ) + 2547 ( 639 0 409 419 0 0 ) + 2548 ( 639 0 409 434 0 0 ) + 2549 ( 639 0 409 433 0 0 ) + 2550 ( 639 0 409 422 0 0 ) + 2551 ( 656 0 409 410 0 0 ) + 2552 ( 654 0 409 411 0 0 ) + 2553 ( 66 4 409 0 1425 7 ) + 2554 ( 639 0 409 438 0 0 ) + 2555 ( 639 0 409 451 0 0 ) + 2556 ( 2 0 410 600 0 0 ) + 2557 ( 2 0 410 606 0 0 ) + 2558 ( 2 0 410 599 0 0 ) + 2559 ( 654 0 410 411 0 0 ) + 2560 ( 66 0 410 413 0 0 ) + 2561 ( 2 0 410 610 0 0 ) + 2562 ( 66 0 411 414 0 0 ) + 2563 ( 0 0 411 1139 0 0 ) + 2564 ( 0 0 411 1138 0 0 ) + 2565 ( 639 0 411 436 0 0 ) + 2566 ( 639 0 411 419 0 0 ) + 2567 ( 66 0 411 413 0 0 ) + 2568 ( 2 0 411 585 0 0 ) + 2569 ( 2 0 411 610 0 0 ) + 2570 ( 659 1 412 0 0 0 ) + 2571 ( 607 1 412 0 0 0 ) + 2572 ( 61 0 442 412 0 0 ) + 2573 ( 66 4 412 0 1432 5 ) + 2574 ( 13 1 412 0 0 0 ) + 2575 ( 2 0 412 597 0 0 ) + 2576 ( 2 0 413 611 0 0 ) + 2577 ( 657 0 413 414 0 0 ) + 2578 ( 2 0 413 613 0 0 ) + 2579 ( 0 0 413 1138 0 0 ) + 2580 ( 6 4 413 0 1437 5 ) + 2581 ( 657 1 413 0 0 0 ) + 2582 ( 211 1 413 0 0 0 ) + 2583 ( 660 4 414 0 1442 4 ) + 2584 ( 639 0 414 457 0 0 ) + 2585 ( 0 0 414 1139 0 0 ) + 2586 ( 663 0 415 432 0 0 ) + 2587 ( 663 0 415 428 0 0 ) + 2588 ( 192 0 415 416 0 0 ) + 2589 ( 30 4 415 0 1446 5 ) + 2590 ( 663 1 415 0 0 0 ) + 2591 ( 203 1 415 0 0 0 ) + 2592 ( 203 0 415 423 0 0 ) + 2593 ( 666 0 415 417 0 0 ) + 2594 ( 203 0 415 420 0 0 ) + 2595 ( 663 0 416 432 0 0 ) + 2596 ( 663 0 416 429 0 0 ) + 2597 ( 440 0 416 418 0 0 ) + 2598 ( 30 4 416 0 1451 4 ) + 2599 ( 663 1 416 0 0 0 ) + 2600 ( 666 0 416 417 0 0 ) + 2601 ( 664 0 417 419 0 0 ) + 2602 ( 145 0 417 424 0 0 ) + 2603 ( 664 0 417 421 0 0 ) + 2604 ( 145 1 417 0 0 0 ) + 2605 ( 30 4 417 0 1455 7 ) + 2606 ( 666 0 420 417 0 0 ) + 2607 ( 440 0 417 418 0 0 ) + 2608 ( 0 0 418 1153 0 0 ) + 2609 ( 0 0 418 1148 0 0 ) + 2610 ( 30 0 418 436 0 0 ) + 2611 ( 30 0 418 435 0 0 ) + 2612 ( 0 0 418 1135 0 0 ) + 2613 ( 30 0 418 437 0 0 ) + 2614 ( 663 0 418 432 0 0 ) + 2615 ( 663 0 418 430 0 0 ) + 2616 ( 663 1 418 0 0 0 ) + 2617 ( 664 0 418 419 0 0 ) + 2618 ( 0 0 419 1153 0 0 ) + 2619 ( 0 0 419 1148 0 0 ) + 2620 ( 617 0 419 470 0 0 ) + 2621 ( 260 0 421 419 0 0 ) + 2622 ( 260 0 422 419 0 0 ) + 2623 ( 30 0 419 433 0 0 ) + 2624 ( 0 0 419 1136 0 0 ) + 2625 ( 0 0 419 1133 0 0 ) + 2626 ( 30 0 419 435 0 0 ) + 2627 ( 30 0 419 434 0 0 ) + 2628 ( 30 0 419 436 0 0 ) + 2629 ( 30 4 420 0 1462 4 ) + 2630 ( 145 1 420 0 0 0 ) + 2631 ( 669 1 420 0 0 0 ) + 2632 ( 669 0 420 423 0 0 ) + 2633 ( 145 0 420 424 0 0 ) + 2634 ( 145 0 421 426 0 0 ) + 2635 ( 145 0 421 425 0 0 ) + 2636 ( 670 0 421 422 0 0 ) + 2637 ( 30 4 421 0 1466 4 ) + 2638 ( 145 0 422 427 0 0 ) + 2639 ( 145 0 422 425 0 0 ) + 2640 ( 30 0 422 438 0 0 ) + 2641 ( 617 0 422 470 0 0 ) + 2642 ( 663 0 423 432 0 0 ) + 2643 ( 145 0 423 424 0 0 ) + 2644 ( 663 1 423 0 0 0 ) + 2645 ( 145 1 423 0 0 0 ) + 2646 ( 34 4 423 0 1470 4 ) + 2647 ( 663 0 424 432 0 0 ) + 2648 ( 131 0 424 445 0 0 ) + 2649 ( 131 0 424 444 0 0 ) + 2650 ( 664 0 424 425 0 0 ) + 2651 ( 54 4 424 0 1474 7 ) + 2652 ( 663 1 424 0 0 0 ) + 2653 ( 131 1 424 0 0 0 ) + 2654 ( 131 0 425 446 0 0 ) + 2655 ( 54 0 425 427 0 0 ) + 2656 ( 54 0 425 426 0 0 ) + 2657 ( 131 0 425 454 0 0 ) + 2658 ( 131 1 425 0 0 0 ) + 2659 ( 617 0 425 470 0 0 ) + 2660 ( 670 0 426 427 0 0 ) + 2661 ( 54 0 446 426 0 0 ) + 2662 ( 30 4 426 0 1481 5 ) + 2663 ( 391 1 426 0 0 0 ) + 2664 ( 665 1 426 0 0 0 ) + 2665 ( 54 0 446 427 0 0 ) + 2666 ( 30 0 427 452 0 0 ) + 2667 ( 30 0 427 451 0 0 ) + 2668 ( 391 1 427 0 0 0 ) + 2669 ( 391 0 427 450 0 0 ) + 2670 ( 30 0 427 438 0 0 ) + 2671 ( 192 0 428 429 0 0 ) + 2672 ( 615 1 428 0 0 0 ) + 2673 ( 30 4 428 0 1486 4 ) + 2674 ( 51 1 428 0 0 0 ) + 2675 ( 203 1 428 0 0 0 ) + 2676 ( 615 1 429 0 0 0 ) + 2677 ( 30 4 429 0 1490 4 ) + 2678 ( 51 1 429 0 0 0 ) + 2679 ( 440 0 429 430 0 0 ) + 2680 ( 30 0 430 436 0 0 ) + 2681 ( 30 0 430 435 0 0 ) + 2682 ( 30 0 430 437 0 0 ) + 2683 ( 51 1 430 0 0 0 ) + 2684 ( 615 1 430 0 0 0 ) + 2685 ( 0 0 430 1140 0 0 ) + 2686 ( 0 0 431 1153 0 0 ) + 2687 ( 0 0 431 1146 0 0 ) + 2688 ( 131 0 431 447 0 0 ) + 2689 ( 672 0 431 432 0 0 ) + 2690 ( 42 4 431 0 1494 4 ) + 2691 ( 615 1 431 0 0 0 ) + 2692 ( 615 0 431 441 0 0 ) + 2693 ( 131 1 431 0 0 0 ) + 2694 ( 0 0 432 1153 0 0 ) + 2695 ( 0 0 432 1147 0 0 ) + 2696 ( 131 0 432 448 0 0 ) + 2697 ( 42 4 432 0 1498 8 ) + 2698 ( 131 1 432 0 0 0 ) + 2699 ( 70 0 433 435 0 0 ) + 2700 ( 70 0 433 434 0 0 ) + 2701 ( 66 4 433 0 1506 7 ) + 2702 ( 261 1 433 0 0 0 ) + 2703 ( 261 0 433 438 0 0 ) + 2704 ( 665 1 433 0 0 0 ) + 2705 ( 665 0 433 437 0 0 ) + 2706 ( 671 0 434 435 0 0 ) + 2707 ( 674 0 434 436 0 0 ) + 2708 ( 66 4 434 0 1513 4 ) + 2709 ( 200 0 435 436 0 0 ) + 2710 ( 615 1 435 0 0 0 ) + 2711 ( 66 4 435 0 1517 6 ) + 2712 ( 70 0 437 435 0 0 ) + 2713 ( 0 0 436 1140 0 0 ) + 2714 ( 66 0 436 456 0 0 ) + 2715 ( 615 1 436 0 0 0 ) + 2716 ( 0 0 436 1135 0 0 ) + 2717 ( 0 0 436 1136 0 0 ) + 2718 ( 0 0 436 1133 0 0 ) + 2719 ( 66 0 436 458 0 0 ) + 2720 ( 66 0 436 457 0 0 ) + 2721 ( 66 4 437 0 1523 4 ) + 2722 ( 615 1 437 0 0 0 ) + 2723 ( 441 1 437 0 0 0 ) + 2724 ( 66 4 438 0 1527 5 ) + 2725 ( 131 0 438 452 0 0 ) + 2726 ( 131 0 438 451 0 0 ) + 2727 ( 671 1 438 0 0 0 ) + 2728 ( 0 0 439 1144 0 0 ) + 2729 ( 131 0 439 449 0 0 ) + 2730 ( 0 0 439 1145 0 0 ) + 2731 ( 0 0 439 1143 0 0 ) + 2732 ( 637 0 439 473 0 0 ) + 2733 ( 617 1 439 0 0 0 ) + 2734 ( 131 1 439 0 0 0 ) + 2735 ( 596 0 439 440 0 0 ) + 2736 ( 596 1 439 0 0 0 ) + 2737 ( 42 4 439 0 1532 6 ) + 2738 ( 0 0 440 1145 0 0 ) + 2739 ( 131 1 440 0 0 0 ) + 2740 ( 175 1 440 0 0 0 ) + 2741 ( 42 4 440 0 1538 4 ) + 2742 ( 676 0 440 441 0 0 ) + 2743 ( 676 0 1145 441 0 0 ) + 2744 ( 620 1 441 0 0 0 ) + 2745 ( 42 4 441 0 1542 6 ) + 2746 ( 175 1 441 0 0 0 ) + 2747 ( 615 0 1146 441 0 0 ) + 2748 ( 131 1 441 0 0 0 ) + 2749 ( 61 1 442 0 0 0 ) + 2750 ( 66 4 442 0 1548 4 ) + 2751 ( 345 0 442 455 0 0 ) + 2752 ( 140 0 442 451 0 0 ) + 2753 ( 140 0 442 450 0 0 ) + 2754 ( 607 1 442 0 0 0 ) + 2755 ( 684 0 459 443 0 0 ) + 2756 ( 391 0 449 443 0 0 ) + 2757 ( 682 4 443 0 1552 4 ) + 2758 ( 680 1 443 0 0 0 ) + 2759 ( 617 0 443 467 0 0 ) + 2760 ( 637 1 443 0 0 0 ) + 2761 ( 617 1 443 0 0 0 ) + 2762 ( 663 0 444 448 0 0 ) + 2763 ( 666 0 444 445 0 0 ) + 2764 ( 345 1 444 0 0 0 ) + 2765 ( 391 1 444 0 0 0 ) + 2766 ( 663 1 444 0 0 0 ) + 2767 ( 54 4 444 0 1556 4 ) + 2768 ( 345 1 445 0 0 0 ) + 2769 ( 391 1 445 0 0 0 ) + 2770 ( 54 4 445 0 1560 4 ) + 2771 ( 664 0 445 446 0 0 ) + 2772 ( 391 0 446 450 0 0 ) + 2773 ( 391 1 446 0 0 0 ) + 2774 ( 345 0 446 454 0 0 ) + 2775 ( 345 1 446 0 0 0 ) + 2776 ( 672 0 447 448 0 0 ) + 2777 ( 42 4 447 0 1564 4 ) + 2778 ( 615 1 447 0 0 0 ) + 2779 ( 391 1 447 0 0 0 ) + 2780 ( 345 1 447 0 0 0 ) + 2781 ( 42 4 448 0 1568 4 ) + 2782 ( 391 1 448 0 0 0 ) + 2783 ( 345 1 448 0 0 0 ) + 2784 ( 680 1 449 0 0 0 ) + 2785 ( 617 1 449 0 0 0 ) + 2786 ( 637 0 449 473 0 0 ) + 2787 ( 42 4 449 0 1572 4 ) + 2788 ( 345 0 450 455 0 0 ) + 2789 ( 30 0 450 451 0 0 ) + 2790 ( 607 1 450 0 0 0 ) + 2791 ( 66 4 451 0 1576 8 ) + 2792 ( 607 1 451 0 0 0 ) + 2793 ( 607 0 451 453 0 0 ) + 2794 ( 607 1 451 0 0 0 ) + 2795 ( 607 0 451 452 0 0 ) + 2796 ( 66 4 452 0 1584 4 ) + 2797 ( 686 1 452 0 0 0 ) + 2798 ( 686 0 452 453 0 0 ) + 2799 ( 671 1 452 0 0 0 ) + 2800 ( 391 1 452 0 0 0 ) + 2801 ( 66 4 453 0 1588 4 ) + 2802 ( 671 1 453 0 0 0 ) + 2803 ( 139 1 453 0 0 0 ) + 2804 ( 688 1 454 0 0 0 ) + 2805 ( 688 0 454 455 0 0 ) + 2806 ( 671 1 454 0 0 0 ) + 2807 ( 617 0 455 470 0 0 ) + 2808 ( 607 1 455 0 0 0 ) + 2809 ( 0 0 456 1135 0 0 ) + 2810 ( 664 0 456 458 0 0 ) + 2811 ( 0 0 456 1140 0 0 ) + 2812 ( 6 4 456 0 1592 5 ) + 2813 ( 664 1 456 0 0 0 ) + 2814 ( 615 1 456 0 0 0 ) + 2815 ( 201 1 456 0 0 0 ) + 2816 ( 0 0 457 1133 0 0 ) + 2817 ( 671 0 457 458 0 0 ) + 2818 ( 690 4 457 0 1597 4 ) + 2819 ( 0 0 458 1136 0 0 ) + 2820 ( 690 4 458 0 1601 4 ) + 2821 ( 371 0 459 464 0 0 ) + 2822 ( 371 0 459 466 0 0 ) + 2823 ( 684 0 459 467 0 0 ) + 2824 ( 680 1 459 0 0 0 ) + 2825 ( 59 0 459 468 0 0 ) + 2826 ( 59 1 459 0 0 0 ) + 2827 ( 637 1 459 0 0 0 ) + 2828 ( 682 4 459 0 1605 8 ) + 2829 ( 680 1 459 0 0 0 ) + 2830 ( 680 1 459 0 0 0 ) + 2831 ( 637 1 459 0 0 0 ) + 2832 ( 637 1 459 0 0 0 ) + 2833 ( 637 0 459 472 0 0 ) + 2834 ( 680 1 459 0 0 0 ) + 2835 ( 680 0 459 460 0 0 ) + 2836 ( 617 1 460 0 0 0 ) + 2837 ( 389 1 460 0 0 0 ) + 2838 ( 12 1 460 0 0 0 ) + 2839 ( 692 1 460 0 0 0 ) + 2840 ( 694 1 460 0 0 0 ) + 2841 ( 699 0 461 462 0 0 ) + 2842 ( 680 1 461 0 0 0 ) + 2843 ( 86 0 461 466 0 0 ) + 2844 ( 59 0 461 469 0 0 ) + 2845 ( 59 1 461 0 0 0 ) + 2846 ( 637 1 461 0 0 0 ) + 2847 ( 86 0 461 463 0 0 ) + 2848 ( 637 1 461 0 0 0 ) + 2849 ( 637 1 461 0 0 0 ) + 2850 ( 637 0 461 471 0 0 ) + 2851 ( 637 1 461 0 0 0 ) + 2852 ( 680 1 461 0 0 0 ) + 2853 ( 680 0 461 465 0 0 ) + 2854 ( 680 1 461 0 0 0 ) + 2855 ( 680 1 461 0 0 0 ) + 2856 ( 696 4 461 0 1613 8 ) + 2857 ( 696 4 462 0 1621 4 ) + 2858 ( 680 1 462 0 0 0 ) + 2859 ( 637 1 462 0 0 0 ) + 2860 ( 59 1 462 0 0 0 ) + 2861 ( 266 0 484 462 0 0 ) + 2862 ( 266 0 498 462 0 0 ) + 2863 ( 266 0 496 462 0 0 ) + 2864 ( 702 0 463 464 0 0 ) + 2865 ( 696 4 463 0 1625 4 ) + 2866 ( 680 1 463 0 0 0 ) + 2867 ( 617 0 463 466 0 0 ) + 2868 ( 637 1 463 0 0 0 ) + 2869 ( 682 4 464 0 1629 4 ) + 2870 ( 680 1 464 0 0 0 ) + 2871 ( 637 1 464 0 0 0 ) + 2872 ( 617 0 464 466 0 0 ) + 2873 ( 617 1 465 0 0 0 ) + 2874 ( 692 1 465 0 0 0 ) + 2875 ( 350 1 465 0 0 0 ) + 2876 ( 101 1 465 0 0 0 ) + 2877 ( 694 1 465 0 0 0 ) + 2878 ( 680 1 466 0 0 0 ) + 2879 ( 705 1 466 0 0 0 ) + 2880 ( 371 0 468 466 0 0 ) + 2881 ( 86 0 469 466 0 0 ) + 2882 ( 637 1 466 0 0 0 ) + 2883 ( 637 1 467 0 0 0 ) + 2884 ( 59 1 467 0 0 0 ) + 2885 ( 60 1 467 0 0 0 ) + 2886 ( 680 1 467 0 0 0 ) + 2887 ( 637 1 468 0 0 0 ) + 2888 ( 705 1 468 0 0 0 ) + 2889 ( 680 1 468 0 0 0 ) + 2890 ( 12 1 468 0 0 0 ) + 2891 ( 637 1 469 0 0 0 ) + 2892 ( 680 1 469 0 0 0 ) + 2893 ( 705 1 469 0 0 0 ) + 2894 ( 101 1 469 0 0 0 ) + 2895 ( 0 0 470 1153 0 0 ) + 2896 ( 2 0 470 658 0 0 ) + 2897 ( 2 0 470 648 0 0 ) + 2898 ( 2 0 470 660 0 0 ) + 2899 ( 2 0 470 594 0 0 ) + 2900 ( 2 0 470 585 0 0 ) + 2901 ( 607 1 470 0 0 0 ) + 2902 ( 613 1 470 0 0 0 ) + 2903 ( 13 1 470 0 0 0 ) + 2904 ( 350 1 471 0 0 0 ) + 2905 ( 617 1 471 0 0 0 ) + 2906 ( 101 1 471 0 0 0 ) + 2907 ( 707 1 471 0 0 0 ) + 2908 ( 708 1 471 0 0 0 ) + 2909 ( 12 1 472 0 0 0 ) + 2910 ( 389 1 472 0 0 0 ) + 2911 ( 707 1 472 0 0 0 ) + 2912 ( 617 1 472 0 0 0 ) + 2913 ( 708 1 472 0 0 0 ) + 2914 ( 0 0 473 1144 0 0 ) + 2915 ( 0 0 473 1143 0 0 ) + 2916 ( 42 4 473 0 1633 7 ) + 2917 ( 617 1 473 0 0 0 ) + 2918 ( 240 1 0 473 0 0 ) + 2919 ( 240 1 0 473 0 0 ) + 2920 ( 240 1 0 473 0 0 ) + 2921 ( 391 1 473 0 0 0 ) + 2922 ( 639 1 474 0 0 0 ) + 2923 ( 265 0 487 474 0 0 ) + 2924 ( 265 0 485 474 0 0 ) + 2925 ( 265 1 0 474 0 0 ) + 2926 ( 265 0 477 474 0 0 ) + 2927 ( 34 4 474 0 1640 5 ) + 2928 ( 175 1 474 0 0 0 ) + 2929 ( 2 0 474 671 0 0 ) + 2930 ( 2 0 474 676 0 0 ) + 2931 ( 715 0 474 524 0 0 ) + 2932 ( 715 1 474 0 0 0 ) + 2933 ( 20 0 475 488 0 0 ) + 2934 ( 723 0 475 476 0 0 ) + 2935 ( 637 1 475 0 0 0 ) + 2936 ( 696 4 475 0 1645 4 ) + 2937 ( 680 1 475 0 0 0 ) + 2938 ( 719 1 475 0 0 0 ) + 2939 ( 20 1 475 0 0 0 ) + 2940 ( 634 0 506 476 0 0 ) + 2941 ( 680 1 476 0 0 0 ) + 2942 ( 719 1 476 0 0 0 ) + 2943 ( 636 1 0 476 0 0 ) + 2944 ( 696 4 476 0 1649 4 ) + 2945 ( 2 0 477 671 0 0 ) + 2946 ( 696 0 477 487 0 0 ) + 2947 ( 696 0 477 485 0 0 ) + 2948 ( 254 1 477 0 0 0 ) + 2949 ( 254 0 477 482 0 0 ) + 2950 ( 639 1 477 0 0 0 ) + 2951 ( 641 1 477 0 0 0 ) + 2952 ( 254 0 478 500 0 0 ) + 2953 ( 265 0 478 488 0 0 ) + 2954 ( 596 1 478 0 0 0 ) + 2955 ( 617 0 478 489 0 0 ) + 2956 ( 617 0 478 490 0 0 ) + 2957 ( 617 1 478 0 0 0 ) + 2958 ( 265 1 478 0 0 0 ) + 2959 ( 637 0 478 493 0 0 ) + 2960 ( 254 0 478 495 0 0 ) + 2961 ( 254 0 478 498 0 0 ) + 2962 ( 696 4 478 0 1653 5 ) + 2963 ( 254 0 478 484 0 0 ) + 2964 ( 637 0 478 480 0 0 ) + 2965 ( 724 0 479 480 0 0 ) + 2966 ( 324 4 479 0 1658 4 ) + 2967 ( 265 1 479 0 0 0 ) + 2968 ( 724 0 479 492 0 0 ) + 2969 ( 283 1 479 0 0 0 ) + 2970 ( 266 1 479 0 0 0 ) + 2971 ( 724 0 479 503 0 0 ) + 2972 ( 724 0 479 502 0 0 ) + 2973 ( 724 0 479 501 0 0 ) + 2974 ( 266 1 480 0 0 0 ) + 2975 ( 637 0 484 480 0 0 ) + 2976 ( 324 4 480 0 1662 5 ) + 2977 ( 175 0 480 501 0 0 ) + 2978 ( 175 0 480 503 0 0 ) + 2979 ( 175 0 480 504 0 0 ) + 2980 ( 175 0 480 493 0 0 ) + 2981 ( 175 0 480 492 0 0 ) + 2982 ( 265 1 480 0 0 0 ) + 2983 ( 165 1 481 0 0 0 ) + 2984 ( 99 1 0 481 0 0 ) + 2985 ( 639 1 481 0 0 0 ) + 2986 ( 696 0 481 486 0 0 ) + 2987 ( 175 1 481 0 0 0 ) + 2988 ( 2 0 481 677 0 0 ) + 2989 ( 2 0 481 671 0 0 ) + 2990 ( 696 0 481 485 0 0 ) + 2991 ( 165 1 481 0 0 0 ) + 2992 ( 165 0 481 483 0 0 ) + 2993 ( 165 0 481 482 0 0 ) + 2994 ( 99 1 0 481 0 0 ) + 2995 ( 2 0 482 671 0 0 ) + 2996 ( 696 0 482 485 0 0 ) + 2997 ( 649 1 482 0 0 0 ) + 2998 ( 641 1 482 0 0 0 ) + 2999 ( 641 0 482 483 0 0 ) + 3000 ( 726 1 483 0 0 0 ) + 3001 ( 165 0 677 483 0 0 ) + 3002 ( 641 0 671 483 0 0 ) + 3003 ( 650 1 483 0 0 0 ) + 3004 ( 649 1 483 0 0 0 ) + 3005 ( 175 0 484 500 0 0 ) + 3006 ( 175 0 484 498 0 0 ) + 3007 ( 175 0 484 496 0 0 ) + 3008 ( 175 0 484 495 0 0 ) + 3009 ( 696 4 484 0 1667 5 ) + 3010 ( 266 1 484 0 0 0 ) + 3011 ( 596 1 484 0 0 0 ) + 3012 ( 2 0 485 671 0 0 ) + 3013 ( 649 1 485 0 0 0 ) + 3014 ( 649 0 485 487 0 0 ) + 3015 ( 649 0 485 486 0 0 ) + 3016 ( 34 4 485 0 1672 6 ) + 3017 ( 165 1 486 0 0 0 ) + 3018 ( 34 4 486 0 1678 4 ) + 3019 ( 99 1 0 486 0 0 ) + 3020 ( 639 1 486 0 0 0 ) + 3021 ( 639 1 487 0 0 0 ) + 3022 ( 34 4 487 0 1682 4 ) + 3023 ( 254 1 487 0 0 0 ) + 3024 ( 59 1 488 0 0 0 ) + 3025 ( 265 0 489 488 0 0 ) + 3026 ( 680 1 488 0 0 0 ) + 3027 ( 637 1 488 0 0 0 ) + 3028 ( 696 4 488 0 1686 4 ) + 3029 ( 59 0 489 491 0 0 ) + 3030 ( 254 0 489 498 0 0 ) + 3031 ( 254 0 489 495 0 0 ) + 3032 ( 637 0 489 493 0 0 ) + 3033 ( 59 1 489 0 0 0 ) + 3034 ( 59 1 489 0 0 0 ) + 3035 ( 680 1 489 0 0 0 ) + 3036 ( 680 0 489 490 0 0 ) + 3037 ( 617 0 500 490 0 0 ) + 3038 ( 730 1 490 0 0 0 ) + 3039 ( 266 1 490 0 0 0 ) + 3040 ( 680 0 498 490 0 0 ) + 3041 ( 265 1 490 0 0 0 ) + 3042 ( 104 1 491 0 0 0 ) + 3043 ( 736 1 491 0 0 0 ) + 3044 ( 254 0 491 499 0 0 ) + 3045 ( 254 0 491 495 0 0 ) + 3046 ( 637 0 491 494 0 0 ) + 3047 ( 283 1 492 0 0 0 ) + 3048 ( 265 1 492 0 0 0 ) + 3049 ( 712 1 492 0 0 0 ) + 3050 ( 254 0 492 502 0 0 ) + 3051 ( 254 0 492 501 0 0 ) + 3052 ( 712 0 492 494 0 0 ) + 3053 ( 712 0 492 493 0 0 ) + 3054 ( 254 0 493 501 0 0 ) + 3055 ( 59 1 493 0 0 0 ) + 3056 ( 59 0 493 494 0 0 ) + 3057 ( 265 1 493 0 0 0 ) + 3058 ( 254 0 494 501 0 0 ) + 3059 ( 104 1 494 0 0 0 ) + 3060 ( 637 0 495 501 0 0 ) + 3061 ( 732 0 495 499 0 0 ) + 3062 ( 732 1 495 0 0 0 ) + 3063 ( 732 0 495 498 0 0 ) + 3064 ( 162 1 495 0 0 0 ) + 3065 ( 162 0 495 497 0 0 ) + 3066 ( 162 0 495 496 0 0 ) + 3067 ( 254 1 0 495 0 0 ) + 3068 ( 735 1 495 0 0 0 ) + 3069 ( 637 0 496 504 0 0 ) + 3070 ( 732 0 496 498 0 0 ) + 3071 ( 59 1 496 0 0 0 ) + 3072 ( 59 0 496 497 0 0 ) + 3073 ( 738 1 497 0 0 0 ) + 3074 ( 59 0 498 497 0 0 ) + 3075 ( 736 1 497 0 0 0 ) + 3076 ( 162 0 499 497 0 0 ) + 3077 ( 637 0 497 505 0 0 ) + 3078 ( 680 0 498 500 0 0 ) + 3079 ( 680 1 498 0 0 0 ) + 3080 ( 59 1 498 0 0 0 ) + 3081 ( 59 0 498 499 0 0 ) + 3082 ( 59 1 498 0 0 0 ) + 3083 ( 736 1 499 0 0 0 ) + 3084 ( 266 1 500 0 0 0 ) + 3085 ( 617 1 500 0 0 0 ) + 3086 ( 596 1 500 0 0 0 ) + 3087 ( 162 1 501 0 0 0 ) + 3088 ( 162 0 501 505 0 0 ) + 3089 ( 162 0 501 504 0 0 ) + 3090 ( 162 0 501 503 0 0 ) + 3091 ( 735 0 501 502 0 0 ) + 3092 ( 735 1 501 0 0 0 ) + 3093 ( 254 1 0 501 0 0 ) + 3094 ( 162 0 502 503 0 0 ) + 3095 ( 712 1 502 0 0 0 ) + 3096 ( 283 1 502 0 0 0 ) + 3097 ( 712 1 503 0 0 0 ) + 3098 ( 712 0 503 505 0 0 ) + 3099 ( 712 0 503 504 0 0 ) + 3100 ( 283 1 503 0 0 0 ) + 3101 ( 266 1 503 0 0 0 ) + 3102 ( 59 1 504 0 0 0 ) + 3103 ( 59 0 504 505 0 0 ) + 3104 ( 266 1 504 0 0 0 ) + 3105 ( 738 1 505 0 0 0 ) + 3106 ( 626 0 506 508 0 0 ) + 3107 ( 745 1 506 0 0 0 ) + 3108 ( 719 1 506 0 0 0 ) + 3109 ( 636 1 0 506 0 0 ) + 3110 ( 696 4 506 0 1690 7 ) + 3111 ( 634 1 506 0 0 0 ) + 3112 ( 748 1 506 0 0 0 ) + 3113 ( 626 1 506 0 0 0 ) + 3114 ( 759 0 507 508 0 0 ) + 3115 ( 696 4 507 0 1697 5 ) + 3116 ( 745 1 507 0 0 0 ) + 3117 ( 760 0 507 513 0 0 ) + 3118 ( 752 1 507 0 0 0 ) + 3119 ( 752 0 507 512 0 0 ) + 3120 ( 756 1 507 0 0 0 ) + 3121 ( 719 1 507 0 0 0 ) + 3122 ( 696 4 508 0 1702 4 ) + 3123 ( 745 1 508 0 0 0 ) + 3124 ( 756 1 508 0 0 0 ) + 3125 ( 719 1 508 0 0 0 ) + 3126 ( 750 0 509 513 0 0 ) + 3127 ( 617 0 509 511 0 0 ) + 3128 ( 740 0 509 518 0 0 ) + 3129 ( 740 1 509 0 0 0 ) + 3130 ( 750 1 509 0 0 0 ) + 3131 ( 615 0 509 512 0 0 ) + 3132 ( 615 1 509 0 0 0 ) + 3133 ( 756 1 509 0 0 0 ) + 3134 ( 756 0 509 510 0 0 ) + 3135 ( 762 4 509 0 1706 4 ) + 3136 ( 740 1 510 0 0 0 ) + 3137 ( 615 1 510 0 0 0 ) + 3138 ( 617 0 510 511 0 0 ) + 3139 ( 764 1 510 0 0 0 ) + 3140 ( 768 1 511 0 0 0 ) + 3141 ( 615 1 511 0 0 0 ) + 3142 ( 750 1 511 0 0 0 ) + 3143 ( 740 1 511 0 0 0 ) + 3144 ( 705 1 511 0 0 0 ) + 3145 ( 766 1 511 0 0 0 ) + 3146 ( 764 1 511 0 0 0 ) + 3147 ( 750 0 512 513 0 0 ) + 3148 ( 756 1 512 0 0 0 ) + 3149 ( 762 4 512 0 1710 4 ) + 3150 ( 745 1 512 0 0 0 ) + 3151 ( 617 1 512 0 0 0 ) + 3152 ( 762 4 513 0 1714 5 ) + 3153 ( 745 1 513 0 0 0 ) + 3154 ( 740 0 513 518 0 0 ) + 3155 ( 175 0 514 517 0 0 ) + 3156 ( 175 0 514 516 0 0 ) + 3157 ( 175 0 514 515 0 0 ) + 3158 ( 34 4 514 0 1719 5 ) + 3159 ( 770 1 514 0 0 0 ) + 3160 ( 745 1 514 0 0 0 ) + 3161 ( 175 1 514 0 0 0 ) + 3162 ( 175 0 514 670 0 0 ) + 3163 ( 175 1 514 0 0 0 ) + 3164 ( 175 1 514 0 0 0 ) + 3165 ( 756 0 514 678 0 0 ) + 3166 ( 756 1 514 0 0 0 ) + 3167 ( 756 0 514 525 0 0 ) + 3168 ( 639 0 514 520 0 0 ) + 3169 ( 772 0 515 517 0 0 ) + 3170 ( 775 0 515 516 0 0 ) + 3171 ( 617 1 515 0 0 0 ) + 3172 ( 772 1 515 0 0 0 ) + 3173 ( 775 1 515 0 0 0 ) + 3174 ( 776 1 515 0 0 0 ) + 3175 ( 776 0 515 670 0 0 ) + 3176 ( 639 0 515 521 0 0 ) + 3177 ( 778 1 516 0 0 0 ) + 3178 ( 775 0 670 516 0 0 ) + 3179 ( 780 1 516 0 0 0 ) + 3180 ( 639 0 516 522 0 0 ) + 3181 ( 782 1 517 0 0 0 ) + 3182 ( 780 1 517 0 0 0 ) + 3183 ( 772 0 670 517 0 0 ) + 3184 ( 639 0 517 523 0 0 ) + 3185 ( 756 1 518 0 0 0 ) + 3186 ( 786 0 518 519 0 0 ) + 3187 ( 617 1 518 0 0 0 ) + 3188 ( 745 1 518 0 0 0 ) + 3189 ( 762 4 518 0 1724 5 ) + 3190 ( 756 1 519 0 0 0 ) + 3191 ( 784 1 519 0 0 0 ) + 3192 ( 784 0 519 523 0 0 ) + 3193 ( 784 1 519 0 0 0 ) + 3194 ( 784 0 519 522 0 0 ) + 3195 ( 784 0 519 521 0 0 ) + 3196 ( 784 0 519 520 0 0 ) + 3197 ( 617 1 519 0 0 0 ) + 3198 ( 745 1 519 0 0 0 ) + 3199 ( 762 4 519 0 1729 4 ) + 3200 ( 756 1 520 0 0 0 ) + 3201 ( 175 1 520 0 0 0 ) + 3202 ( 175 0 520 523 0 0 ) + 3203 ( 175 1 520 0 0 0 ) + 3204 ( 175 0 520 522 0 0 ) + 3205 ( 175 0 520 521 0 0 ) + 3206 ( 745 1 520 0 0 0 ) + 3207 ( 762 4 520 0 1733 4 ) + 3208 ( 772 1 521 0 0 0 ) + 3209 ( 772 0 521 523 0 0 ) + 3210 ( 775 1 521 0 0 0 ) + 3211 ( 775 0 521 522 0 0 ) + 3212 ( 617 1 521 0 0 0 ) + 3213 ( 778 1 522 0 0 0 ) + 3214 ( 782 1 523 0 0 0 ) + 3215 ( 2 0 524 671 0 0 ) + 3216 ( 791 0 524 525 0 0 ) + 3217 ( 34 4 524 0 1737 4 ) + 3218 ( 641 1 524 0 0 0 ) + 3219 ( 639 1 524 0 0 0 ) + 3220 ( 2 0 525 678 0 0 ) + 3221 ( 2 0 525 673 0 0 ) + 3222 ( 34 4 525 0 1741 5 ) + 3223 ( 641 1 525 0 0 0 ) + 3224 ( 639 1 525 0 0 0 ) + 3225 ( 801 0 526 527 0 0 ) + 3226 ( 799 0 526 528 0 0 ) + 3227 ( 796 1 526 0 0 0 ) + 3228 ( 802 1 526 0 0 0 ) + 3229 ( 799 1 526 0 0 0 ) + 3230 ( 794 4 526 0 1746 4 ) + 3231 ( 77 1 526 0 0 0 ) + 3232 ( 77 1 527 0 0 0 ) + 3233 ( 799 1 527 0 0 0 ) + 3234 ( 794 4 527 0 1750 5 ) + 3235 ( 802 1 527 0 0 0 ) + 3236 ( 804 0 534 527 0 0 ) + 3237 ( 804 0 1353 527 0 0 ) + 3238 ( 804 0 1276 527 0 0 ) + 3239 ( 807 1 528 0 0 0 ) + 3240 ( 802 1 528 0 0 0 ) + 3241 ( 705 1 528 0 0 0 ) + 3242 ( 796 1 528 0 0 0 ) + 3243 ( 77 1 528 0 0 0 ) + 3244 ( 801 0 529 530 0 0 ) + 3245 ( 66 4 529 0 1755 4 ) + 3246 ( 796 1 529 0 0 0 ) + 3247 ( 77 1 529 0 0 0 ) + 3248 ( 51 0 529 531 0 0 ) + 3249 ( 51 1 529 0 0 0 ) + 3250 ( 802 1 529 0 0 0 ) + 3251 ( 804 0 1268 530 0 0 ) + 3252 ( 66 4 530 0 1759 5 ) + 3253 ( 77 1 530 0 0 0 ) + 3254 ( 51 1 530 0 0 0 ) + 3255 ( 804 0 533 530 0 0 ) + 3256 ( 802 1 530 0 0 0 ) + 3257 ( 807 1 531 0 0 0 ) + 3258 ( 802 1 531 0 0 0 ) + 3259 ( 796 1 531 0 0 0 ) + 3260 ( 417 1 531 0 0 0 ) + 3261 ( 77 1 531 0 0 0 ) + 3262 ( 0 0 532 1268 0 0 ) + 3263 ( 809 0 532 583 0 0 ) + 3264 ( 809 0 532 582 0 0 ) + 3265 ( 809 1 532 0 0 0 ) + 3266 ( 809 0 532 584 0 0 ) + 3267 ( 417 1 532 0 0 0 ) + 3268 ( 810 0 532 533 0 0 ) + 3269 ( 810 1 532 0 0 0 ) + 3270 ( 66 4 532 0 1764 6 ) + 3271 ( 409 1 532 0 0 0 ) + 3272 ( 0 0 533 1268 0 0 ) + 3273 ( 417 1 533 0 0 0 ) + 3274 ( 804 1 533 0 0 0 ) + 3275 ( 804 1 533 0 0 0 ) + 3276 ( 66 4 533 0 1770 5 ) + 3277 ( 813 1 533 0 0 0 ) + 3278 ( 705 0 534 661 0 0 ) + 3279 ( 705 0 534 662 0 0 ) + 3280 ( 794 4 534 0 1775 10 ) + 3281 ( 815 0 534 543 0 0 ) + 3282 ( 0 0 534 1276 0 0 ) + 3283 ( 0 0 534 1357 0 0 ) + 3284 ( 409 0 534 576 0 0 ) + 3285 ( 705 0 534 664 0 0 ) + 3286 ( 705 1 534 0 0 0 ) + 3287 ( 409 1 534 0 0 0 ) + 3288 ( 409 1 534 0 0 0 ) + 3289 ( 409 1 534 0 0 0 ) + 3290 ( 815 0 534 544 0 0 ) + 3291 ( 409 1 534 0 0 0 ) + 3292 ( 804 1 534 0 0 0 ) + 3293 ( 804 1 534 0 0 0 ) + 3294 ( 705 1 534 0 0 0 ) + 3295 ( 0 0 534 1353 0 0 ) + 3296 ( 409 1 534 0 0 0 ) + 3297 ( 817 0 535 589 0 0 ) + 3298 ( 417 0 535 539 0 0 ) + 3299 ( 813 0 535 537 0 0 ) + 3300 ( 820 0 535 536 0 0 ) + 3301 ( 820 1 535 0 0 0 ) + 3302 ( 813 1 535 0 0 0 ) + 3303 ( 813 1 535 0 0 0 ) + 3304 ( 417 0 535 538 0 0 ) + 3305 ( 417 1 535 0 0 0 ) + 3306 ( 417 0 535 540 0 0 ) + 3307 ( 417 1 535 0 0 0 ) + 3308 ( 417 0 535 541 0 0 ) + 3309 ( 417 1 535 0 0 0 ) + 3310 ( 817 1 535 0 0 0 ) + 3311 ( 0 0 535 1275 0 0 ) + 3312 ( 0 0 535 1267 0 0 ) + 3313 ( 66 4 535 0 1785 6 ) + 3314 ( 817 1 535 0 0 0 ) + 3315 ( 820 1 535 0 0 0 ) + 3316 ( 824 0 536 582 0 0 ) + 3317 ( 31 1 536 0 0 0 ) + 3318 ( 66 4 536 0 1791 4 ) + 3319 ( 0 0 536 1267 0 0 ) + 3320 ( 826 1 536 0 0 0 ) + 3321 ( 813 1 536 0 0 0 ) + 3322 ( 830 1 537 0 0 0 ) + 3323 ( 829 1 537 0 0 0 ) + 3324 ( 417 1 537 0 0 0 ) + 3325 ( 409 1 537 0 0 0 ) + 3326 ( 66 4 537 0 1795 4 ) + 3327 ( 835 0 538 541 0 0 ) + 3328 ( 836 0 538 540 0 0 ) + 3329 ( 833 1 538 0 0 0 ) + 3330 ( 417 0 1275 538 0 0 ) + 3331 ( 836 1 538 0 0 0 ) + 3332 ( 840 1 538 0 0 0 ) + 3333 ( 840 0 538 1280 0 0 ) + 3334 ( 835 1 538 0 0 0 ) + 3335 ( 839 1 538 0 0 0 ) + 3336 ( 839 0 538 539 0 0 ) + 3337 ( 842 1 539 0 0 0 ) + 3338 ( 844 1 539 0 0 0 ) + 3339 ( 839 0 540 539 0 0 ) + 3340 ( 846 1 539 0 0 0 ) + 3341 ( 839 0 541 539 0 0 ) + 3342 ( 844 1 540 0 0 0 ) + 3343 ( 848 1 540 0 0 0 ) + 3344 ( 417 0 1275 540 0 0 ) + 3345 ( 836 0 1280 540 0 0 ) + 3346 ( 848 1 541 0 0 0 ) + 3347 ( 846 1 541 0 0 0 ) + 3348 ( 835 0 1280 541 0 0 ) + 3349 ( 417 0 1275 541 0 0 ) + 3350 ( 852 0 542 1340 0 0 ) + 3351 ( 850 0 542 1277 0 0 ) + 3352 ( 794 4 542 0 1799 12 ) + 3353 ( 855 1 542 0 0 0 ) + 3354 ( 855 1 542 0 0 0 ) + 3355 ( 855 0 542 591 0 0 ) + 3356 ( 705 0 542 667 0 0 ) + 3357 ( 705 0 542 663 0 0 ) + 3358 ( 855 1 542 0 0 0 ) + 3359 ( 705 1 542 0 0 0 ) + 3360 ( 705 1 542 0 0 0 ) + 3361 ( 705 0 542 1361 0 0 ) + 3362 ( 705 0 542 665 0 0 ) + 3363 ( 850 0 542 543 0 0 ) + 3364 ( 705 1 542 0 0 0 ) + 3365 ( 409 0 542 563 0 0 ) + 3366 ( 409 1 542 0 0 0 ) + 3367 ( 409 1 542 0 0 0 ) + 3368 ( 409 1 542 0 0 0 ) + 3369 ( 850 0 542 544 0 0 ) + 3370 ( 409 1 542 0 0 0 ) + 3371 ( 855 1 542 0 0 0 ) + 3372 ( 409 1 542 0 0 0 ) + 3373 ( 850 1 542 0 0 0 ) + 3374 ( 852 1 542 0 0 0 ) + 3375 ( 852 1 542 0 0 0 ) + 3376 ( 852 1 542 0 0 0 ) + 3377 ( 852 1 542 0 0 0 ) + 3378 ( 815 0 661 543 0 0 ) + 3379 ( 0 0 543 1277 0 0 ) + 3380 ( 850 0 663 543 0 0 ) + 3381 ( 719 1 543 0 0 0 ) + 3382 ( 839 1 543 0 0 0 ) + 3383 ( 839 0 543 666 0 0 ) + 3384 ( 0 0 543 1360 0 0 ) + 3385 ( 839 0 543 544 0 0 ) + 3386 ( 794 4 543 0 1811 4 ) + 3387 ( 705 0 544 666 0 0 ) + 3388 ( 705 1 544 0 0 0 ) + 3389 ( 409 1 544 0 0 0 ) + 3390 ( 794 4 544 0 1815 4 ) + 3391 ( 112 0 545 547 0 0 ) + 3392 ( 112 0 545 546 0 0 ) + 3393 ( 834 0 545 549 0 0 ) + 3394 ( 61 0 545 552 0 0 ) + 3395 ( 61 1 545 0 0 0 ) + 3396 ( 817 0 545 595 0 0 ) + 3397 ( 817 0 545 605 0 0 ) + 3398 ( 66 4 545 0 1819 5 ) + 3399 ( 705 0 545 660 0 0 ) + 3400 ( 817 0 545 604 0 0 ) + 3401 ( 817 0 545 606 0 0 ) + 3402 ( 61 0 545 551 0 0 ) + 3403 ( 817 0 545 597 0 0 ) + 3404 ( 829 0 546 547 0 0 ) + 3405 ( 210 0 546 548 0 0 ) + 3406 ( 705 0 546 660 0 0 ) + 3407 ( 66 4 546 0 1824 4 ) + 3408 ( 834 0 546 549 0 0 ) + 3409 ( 817 0 547 598 0 0 ) + 3410 ( 817 0 547 606 0 0 ) + 3411 ( 817 0 547 604 0 0 ) + 3412 ( 210 0 547 548 0 0 ) + 3413 ( 705 0 547 660 0 0 ) + 3414 ( 66 4 547 0 1828 4 ) + 3415 ( 817 0 547 605 0 0 ) + 3416 ( 817 0 547 595 0 0 ) + 3417 ( 817 0 548 606 0 0 ) + 3418 ( 817 0 548 604 0 0 ) + 3419 ( 817 0 548 599 0 0 ) + 3420 ( 192 0 548 553 0 0 ) + 3421 ( 705 0 548 660 0 0 ) + 3422 ( 66 0 548 612 0 0 ) + 3423 ( 817 0 548 605 0 0 ) + 3424 ( 817 0 548 595 0 0 ) + 3425 ( 192 0 548 557 0 0 ) + 3426 ( 834 0 548 549 0 0 ) + 3427 ( 61 0 549 552 0 0 ) + 3428 ( 61 0 549 551 0 0 ) + 3429 ( 192 1 549 0 0 0 ) + 3430 ( 858 1 549 0 0 0 ) + 3431 ( 858 0 549 566 0 0 ) + 3432 ( 858 1 549 0 0 0 ) + 3433 ( 858 0 549 567 0 0 ) + 3434 ( 858 0 549 568 0 0 ) + 3435 ( 858 1 549 0 0 0 ) + 3436 ( 61 1 549 0 0 0 ) + 3437 ( 66 4 549 0 1832 11 ) + 3438 ( 705 0 549 660 0 0 ) + 3439 ( 192 0 549 555 0 0 ) + 3440 ( 192 0 549 556 0 0 ) + 3441 ( 192 0 549 553 0 0 ) + 3442 ( 192 1 549 0 0 0 ) + 3443 ( 192 1 549 0 0 0 ) + 3444 ( 192 0 549 560 0 0 ) + 3445 ( 192 1 549 0 0 0 ) + 3446 ( 28 0 550 551 0 0 ) + 3447 ( 705 0 550 660 0 0 ) + 3448 ( 34 4 550 0 1843 5 ) + 3449 ( 858 1 550 0 0 0 ) + 3450 ( 13 1 550 0 0 0 ) + 3451 ( 13 1 550 0 0 0 ) + 3452 ( 817 0 550 595 0 0 ) + 3453 ( 817 0 550 605 0 0 ) + 3454 ( 817 0 550 602 0 0 ) + 3455 ( 705 0 551 660 0 0 ) + 3456 ( 34 4 551 0 1848 5 ) + 3457 ( 858 1 551 0 0 0 ) + 3458 ( 817 0 551 595 0 0 ) + 3459 ( 817 0 551 605 0 0 ) + 3460 ( 817 0 551 603 0 0 ) + 3461 ( 13 1 552 0 0 0 ) + 3462 ( 858 1 552 0 0 0 ) + 3463 ( 659 1 552 0 0 0 ) + 3464 ( 66 4 552 0 1853 5 ) + 3465 ( 817 0 552 597 0 0 ) + 3466 ( 705 0 553 658 0 0 ) + 3467 ( 484 0 553 565 0 0 ) + 3468 ( 696 0 553 559 0 0 ) + 3469 ( 696 0 553 558 0 0 ) + 3470 ( 860 0 553 556 0 0 ) + 3471 ( 817 0 553 604 0 0 ) + 3472 ( 696 0 553 557 0 0 ) + 3473 ( 696 0 553 560 0 0 ) + 3474 ( 484 1 553 0 0 0 ) + 3475 ( 484 1 553 0 0 0 ) + 3476 ( 484 1 553 0 0 0 ) + 3477 ( 817 0 553 595 0 0 ) + 3478 ( 817 0 553 605 0 0 ) + 3479 ( 705 0 554 658 0 0 ) + 3480 ( 484 0 554 565 0 0 ) + 3481 ( 441 0 554 555 0 0 ) + 3482 ( 850 1 554 0 0 0 ) + 3483 ( 696 4 554 0 1858 4 ) + 3484 ( 484 1 554 0 0 0 ) + 3485 ( 484 1 554 0 0 0 ) + 3486 ( 484 1 554 0 0 0 ) + 3487 ( 484 1 554 0 0 0 ) + 3488 ( 863 0 554 556 0 0 ) + 3489 ( 705 0 555 658 0 0 ) + 3490 ( 850 1 555 0 0 0 ) + 3491 ( 696 4 555 0 1862 4 ) + 3492 ( 863 0 555 556 0 0 ) + 3493 ( 705 0 556 658 0 0 ) + 3494 ( 484 0 556 565 0 0 ) + 3495 ( 484 1 556 0 0 0 ) + 3496 ( 484 1 556 0 0 0 ) + 3497 ( 696 4 556 0 1866 5 ) + 3498 ( 66 0 557 612 0 0 ) + 3499 ( 66 0 557 625 0 0 ) + 3500 ( 66 0 557 617 0 0 ) + 3501 ( 212 0 557 559 0 0 ) + 3502 ( 817 0 557 606 0 0 ) + 3503 ( 817 0 557 604 0 0 ) + 3504 ( 817 0 557 599 0 0 ) + 3505 ( 834 1 557 0 0 0 ) + 3506 ( 834 0 557 560 0 0 ) + 3507 ( 212 1 557 0 0 0 ) + 3508 ( 817 0 558 607 0 0 ) + 3509 ( 215 0 558 559 0 0 ) + 3510 ( 658 4 558 0 1871 4 ) + 3511 ( 834 0 558 560 0 0 ) + 3512 ( 484 1 558 0 0 0 ) + 3513 ( 817 0 558 604 0 0 ) + 3514 ( 817 0 559 609 0 0 ) + 3515 ( 658 4 559 0 1875 4 ) + 3516 ( 834 0 559 560 0 0 ) + 3517 ( 817 0 559 604 0 0 ) + 3518 ( 484 1 560 0 0 0 ) + 3519 ( 860 1 560 0 0 0 ) + 3520 ( 864 1 560 0 0 0 ) + 3521 ( 817 0 561 596 0 0 ) + 3522 ( 87 1 561 0 0 0 ) + 3523 ( 817 0 561 601 0 0 ) + 3524 ( 644 1 561 0 0 0 ) + 3525 ( 82 0 561 562 0 0 ) + 3526 ( 82 1 561 0 0 0 ) + 3527 ( 34 4 561 0 1879 4 ) + 3528 ( 175 1 561 0 0 0 ) + 3529 ( 817 0 562 601 0 0 ) + 3530 ( 644 1 562 0 0 0 ) + 3531 ( 641 1 562 0 0 0 ) + 3532 ( 34 4 562 0 1883 4 ) + 3533 ( 869 0 563 564 0 0 ) + 3534 ( 829 1 563 0 0 0 ) + 3535 ( 866 1 563 0 0 0 ) + 3536 ( 799 1 563 0 0 0 ) + 3537 ( 174 4 563 0 1887 4 ) + 3538 ( 71 0 564 565 0 0 ) + 3539 ( 174 4 564 0 1891 4 ) + 3540 ( 799 1 564 0 0 0 ) + 3541 ( 866 1 564 0 0 0 ) + 3542 ( 829 1 564 0 0 0 ) + 3543 ( 174 4 565 0 1895 6 ) + 3544 ( 799 1 565 0 0 0 ) + 3545 ( 866 1 565 0 0 0 ) + 3546 ( 829 1 565 0 0 0 ) + 3547 ( 705 0 566 634 0 0 ) + 3548 ( 856 0 566 571 0 0 ) + 3549 ( 66 4 566 0 1901 4 ) + 3550 ( 856 0 566 569 0 0 ) + 3551 ( 131 0 566 567 0 0 ) + 3552 ( 131 1 566 0 0 0 ) + 3553 ( 192 1 566 0 0 0 ) + 3554 ( 66 4 567 0 1905 4 ) + 3555 ( 856 1 567 0 0 0 ) + 3556 ( 856 0 567 569 0 0 ) + 3557 ( 139 1 567 0 0 0 ) + 3558 ( 139 0 567 568 0 0 ) + 3559 ( 688 1 567 0 0 0 ) + 3560 ( 856 1 568 0 0 0 ) + 3561 ( 856 0 568 570 0 0 ) + 3562 ( 391 1 568 0 0 0 ) + 3563 ( 688 1 568 0 0 0 ) + 3564 ( 686 1 568 0 0 0 ) + 3565 ( 345 0 569 571 0 0 ) + 3566 ( 192 0 569 573 0 0 ) + 3567 ( 139 0 569 570 0 0 ) + 3568 ( 139 1 569 0 0 0 ) + 3569 ( 345 1 569 0 0 0 ) + 3570 ( 870 1 569 0 0 0 ) + 3571 ( 870 0 569 580 0 0 ) + 3572 ( 192 1 569 0 0 0 ) + 3573 ( 192 1 569 0 0 0 ) + 3574 ( 66 4 569 0 1909 5 ) + 3575 ( 192 1 569 0 0 0 ) + 3576 ( 686 1 570 0 0 0 ) + 3577 ( 391 1 570 0 0 0 ) + 3578 ( 345 1 570 0 0 0 ) + 3579 ( 870 1 570 0 0 0 ) + 3580 ( 870 0 570 581 0 0 ) + 3581 ( 705 0 571 634 0 0 ) + 3582 ( 131 1 571 0 0 0 ) + 3583 ( 192 1 571 0 0 0 ) + 3584 ( 870 1 571 0 0 0 ) + 3585 ( 51 0 572 579 0 0 ) + 3586 ( 875 0 572 573 0 0 ) + 3587 ( 870 1 572 0 0 0 ) + 3588 ( 872 4 572 0 1914 4 ) + 3589 ( 51 1 572 0 0 0 ) + 3590 ( 484 1 572 0 0 0 ) + 3591 ( 837 1 572 0 0 0 ) + 3592 ( 870 1 573 0 0 0 ) + 3593 ( 872 4 573 0 1918 4 ) + 3594 ( 51 1 573 0 0 0 ) + 3595 ( 837 1 573 0 0 0 ) + 3596 ( 837 1 574 0 0 0 ) + 3597 ( 191 1 574 0 0 0 ) + 3598 ( 484 0 574 575 0 0 ) + 3599 ( 484 1 574 0 0 0 ) + 3600 ( 799 1 574 0 0 0 ) + 3601 ( 794 0 574 578 0 0 ) + 3602 ( 870 1 574 0 0 0 ) + 3603 ( 876 0 575 577 0 0 ) + 3604 ( 794 4 575 0 1922 4 ) + 3605 ( 870 1 575 0 0 0 ) + 3606 ( 617 1 575 0 0 0 ) + 3607 ( 837 1 575 0 0 0 ) + 3608 ( 71 0 576 577 0 0 ) + 3609 ( 617 1 576 0 0 0 ) + 3610 ( 870 1 576 0 0 0 ) + 3611 ( 794 4 576 0 1926 4 ) + 3612 ( 837 1 576 0 0 0 ) + 3613 ( 617 1 577 0 0 0 ) + 3614 ( 870 1 577 0 0 0 ) + 3615 ( 794 4 577 0 1930 4 ) + 3616 ( 837 1 577 0 0 0 ) + 3617 ( 837 1 578 0 0 0 ) + 3618 ( 191 1 578 0 0 0 ) + 3619 ( 484 1 578 0 0 0 ) + 3620 ( 870 1 578 0 0 0 ) + 3621 ( 417 0 579 578 0 0 ) + 3622 ( 191 1 579 0 0 0 ) + 3623 ( 870 1 579 0 0 0 ) + 3624 ( 484 1 579 0 0 0 ) + 3625 ( 837 1 579 0 0 0 ) + 3626 ( 66 4 580 0 1934 4 ) + 3627 ( 192 1 580 0 0 0 ) + 3628 ( 139 1 580 0 0 0 ) + 3629 ( 139 0 580 581 0 0 ) + 3630 ( 417 1 580 0 0 0 ) + 3631 ( 880 1 580 0 0 0 ) + 3632 ( 880 1 581 0 0 0 ) + 3633 ( 391 1 581 0 0 0 ) + 3634 ( 417 1 581 0 0 0 ) + 3635 ( 686 1 581 0 0 0 ) + 3636 ( 809 0 1268 582 0 0 ) + 3637 ( 882 0 582 1273 0 0 ) + 3638 ( 824 0 1267 582 0 0 ) + 3639 ( 31 0 582 583 0 0 ) + 3640 ( 826 0 582 584 0 0 ) + 3641 ( 826 1 582 0 0 0 ) + 3642 ( 813 1 582 0 0 0 ) + 3643 ( 66 4 582 0 1938 7 ) + 3644 ( 884 1 582 0 0 0 ) + 3645 ( 884 0 582 1270 0 0 ) + 3646 ( 882 0 582 1271 0 0 ) + 3647 ( 31 1 582 0 0 0 ) + 3648 ( 809 0 1268 583 0 0 ) + 3649 ( 881 1 583 0 0 0 ) + 3650 ( 31 0 584 583 0 0 ) + 3651 ( 417 1 583 0 0 0 ) + 3652 ( 813 1 583 0 0 0 ) + 3653 ( 31 0 1271 583 0 0 ) + 3654 ( 852 1 583 0 0 0 ) + 3655 ( 31 0 1270 583 0 0 ) + 3656 ( 813 1 584 0 0 0 ) + 3657 ( 881 1 584 0 0 0 ) + 3658 ( 705 0 585 648 0 0 ) + 3659 ( 66 0 585 614 0 0 ) + 3660 ( 66 0 585 613 0 0 ) + 3661 ( 770 0 585 593 0 0 ) + 3662 ( 770 0 585 588 0 0 ) + 3663 ( 0 0 585 1384 0 0 ) + 3664 ( 409 0 585 610 0 0 ) + 3665 ( 409 0 585 594 0 0 ) + 3666 ( 770 1 585 0 0 0 ) + 3667 ( 770 1 585 0 0 0 ) + 3668 ( 770 1 585 0 0 0 ) + 3669 ( 770 1 585 0 0 0 ) + 3670 ( 770 1 585 0 0 0 ) + 3671 ( 770 0 585 590 0 0 ) + 3672 ( 770 1 585 0 0 0 ) + 3673 ( 770 1 585 0 0 0 ) + 3674 ( 887 0 586 587 0 0 ) + 3675 ( 470 4 586 0 1945 5 ) + 3676 ( 888 1 586 0 0 0 ) + 3677 ( 855 0 1267 586 0 0 ) + 3678 ( 31 1 586 0 0 0 ) + 3679 ( 854 0 586 589 0 0 ) + 3680 ( 403 1 586 0 0 0 ) + 3681 ( 891 0 587 588 0 0 ) + 3682 ( 31 1 587 0 0 0 ) + 3683 ( 888 1 587 0 0 0 ) + 3684 ( 470 4 587 0 1950 4 ) + 3685 ( 403 1 587 0 0 0 ) + 3686 ( 31 0 588 590 0 0 ) + 3687 ( 770 0 1384 588 0 0 ) + 3688 ( 888 1 588 0 0 0 ) + 3689 ( 470 4 588 0 1954 5 ) + 3690 ( 403 1 588 0 0 0 ) + 3691 ( 826 1 589 0 0 0 ) + 3692 ( 813 1 589 0 0 0 ) + 3693 ( 854 1 0 589 0 0 ) + 3694 ( 66 4 589 0 1959 5 ) + 3695 ( 0 0 589 1267 0 0 ) + 3696 ( 31 1 589 0 0 0 ) + 3697 ( 854 1 0 589 0 0 ) + 3698 ( 890 1 590 0 0 0 ) + 3699 ( 679 1 590 0 0 0 ) + 3700 ( 770 0 1384 590 0 0 ) + 3701 ( 888 1 590 0 0 0 ) + 3702 ( 403 1 590 0 0 0 ) + 3703 ( 887 0 591 592 0 0 ) + 3704 ( 799 1 591 0 0 0 ) + 3705 ( 888 1 591 0 0 0 ) + 3706 ( 174 4 591 0 1964 4 ) + 3707 ( 403 1 591 0 0 0 ) + 3708 ( 891 0 592 593 0 0 ) + 3709 ( 174 4 592 0 1968 4 ) + 3710 ( 888 1 592 0 0 0 ) + 3711 ( 799 1 592 0 0 0 ) + 3712 ( 403 1 592 0 0 0 ) + 3713 ( 174 4 593 0 1972 5 ) + 3714 ( 888 1 593 0 0 0 ) + 3715 ( 770 0 1384 593 0 0 ) + 3716 ( 799 1 593 0 0 0 ) + 3717 ( 403 1 593 0 0 0 ) + 3718 ( 705 0 594 658 0 0 ) + 3719 ( 705 0 594 648 0 0 ) + 3720 ( 705 0 594 660 0 0 ) + 3721 ( 794 0 594 610 0 0 ) + 3722 ( 794 0 594 605 0 0 ) + 3723 ( 13 1 594 0 0 0 ) + 3724 ( 770 1 594 0 0 0 ) + 3725 ( 770 0 594 595 0 0 ) + 3726 ( 705 0 595 658 0 0 ) + 3727 ( 705 0 595 660 0 0 ) + 3728 ( 794 0 595 605 0 0 ) + 3729 ( 13 1 595 0 0 0 ) + 3730 ( 484 1 595 0 0 0 ) + 3731 ( 82 1 596 0 0 0 ) + 3732 ( 641 0 601 596 0 0 ) + 3733 ( 87 1 596 0 0 0 ) + 3734 ( 175 1 596 0 0 0 ) + 3735 ( 112 0 597 598 0 0 ) + 3736 ( 66 4 597 0 1977 6 ) + 3737 ( 659 1 597 0 0 0 ) + 3738 ( 13 1 597 0 0 0 ) + 3739 ( 659 0 597 606 0 0 ) + 3740 ( 66 4 598 0 1983 5 ) + 3741 ( 210 0 598 599 0 0 ) + 3742 ( 659 0 598 606 0 0 ) + 3743 ( 66 0 599 618 0 0 ) + 3744 ( 66 0 599 612 0 0 ) + 3745 ( 66 0 599 611 0 0 ) + 3746 ( 66 0 599 615 0 0 ) + 3747 ( 66 0 599 614 0 0 ) + 3748 ( 66 0 599 613 0 0 ) + 3749 ( 659 0 599 606 0 0 ) + 3750 ( 212 0 599 600 0 0 ) + 3751 ( 212 1 599 0 0 0 ) + 3752 ( 66 0 599 616 0 0 ) + 3753 ( 66 0 599 624 0 0 ) + 3754 ( 212 0 606 600 0 0 ) + 3755 ( 484 0 600 610 0 0 ) + 3756 ( 484 1 600 0 0 0 ) + 3757 ( 34 0 604 600 0 0 ) + 3758 ( 892 0 600 609 0 0 ) + 3759 ( 892 0 600 608 0 0 ) + 3760 ( 66 0 600 614 0 0 ) + 3761 ( 66 0 600 613 0 0 ) + 3762 ( 66 0 600 622 0 0 ) + 3763 ( 66 0 600 621 0 0 ) + 3764 ( 66 0 600 623 0 0 ) + 3765 ( 66 0 600 620 0 0 ) + 3766 ( 66 0 600 619 0 0 ) + 3767 ( 892 1 600 0 0 0 ) + 3768 ( 34 4 601 0 1988 6 ) + 3769 ( 641 1 601 0 0 0 ) + 3770 ( 28 0 602 603 0 0 ) + 3771 ( 34 4 602 0 1994 4 ) + 3772 ( 641 0 602 605 0 0 ) + 3773 ( 34 4 603 0 1998 4 ) + 3774 ( 641 0 603 605 0 0 ) + 3775 ( 60 0 603 604 0 0 ) + 3776 ( 34 0 604 608 0 0 ) + 3777 ( 34 0 604 607 0 0 ) + 3778 ( 34 0 604 609 0 0 ) + 3779 ( 34 0 604 606 0 0 ) + 3780 ( 641 0 604 605 0 0 ) + 3781 ( 484 0 604 610 0 0 ) + 3782 ( 484 1 604 0 0 0 ) + 3783 ( 484 1 605 0 0 0 ) + 3784 ( 484 0 605 610 0 0 ) + 3785 ( 13 1 605 0 0 0 ) + 3786 ( 212 0 606 609 0 0 ) + 3787 ( 61 1 606 0 0 0 ) + 3788 ( 895 0 607 608 0 0 ) + 3789 ( 484 1 607 0 0 0 ) + 3790 ( 659 4 0 607 2002 4 ) + 3791 ( 215 0 607 609 0 0 ) + 3792 ( 484 1 608 0 0 0 ) + 3793 ( 659 4 0 608 2006 4 ) + 3794 ( 215 0 608 609 0 0 ) + 3795 ( 659 4 0 609 2010 5 ) + 3796 ( 66 0 610 614 0 0 ) + 3797 ( 66 0 610 613 0 0 ) + 3798 ( 770 1 610 0 0 0 ) + 3799 ( 770 0 611 612 0 0 ) + 3800 ( 770 1 611 0 0 0 ) + 3801 ( 6 4 611 0 2015 5 ) + 3802 ( 196 0 611 613 0 0 ) + 3803 ( 196 0 611 615 0 0 ) + 3804 ( 211 1 611 0 0 0 ) + 3805 ( 196 0 612 618 0 0 ) + 3806 ( 896 4 612 0 2020 7 ) + 3807 ( 196 0 612 624 0 0 ) + 3808 ( 196 1 612 0 0 0 ) + 3809 ( 196 0 612 625 0 0 ) + 3810 ( 211 1 612 0 0 0 ) + 3811 ( 898 0 613 615 0 0 ) + 3812 ( 898 0 613 614 0 0 ) + 3813 ( 0 0 613 1384 0 0 ) + 3814 ( 6 4 613 0 2027 5 ) + 3815 ( 191 0 614 615 0 0 ) + 3816 ( 6 4 614 0 2032 7 ) + 3817 ( 770 1 614 0 0 0 ) + 3818 ( 770 0 614 616 0 0 ) + 3819 ( 770 0 614 619 0 0 ) + 3820 ( 770 0 614 620 0 0 ) + 3821 ( 0 0 614 1384 0 0 ) + 3822 ( 6 4 615 0 2039 4 ) + 3823 ( 770 1 615 0 0 0 ) + 3824 ( 770 0 615 624 0 0 ) + 3825 ( 900 0 616 618 0 0 ) + 3826 ( 191 0 616 624 0 0 ) + 3827 ( 191 1 616 0 0 0 ) + 3828 ( 212 0 616 619 0 0 ) + 3829 ( 212 1 616 0 0 0 ) + 3830 ( 900 1 616 0 0 0 ) + 3831 ( 6 4 616 0 2043 5 ) + 3832 ( 191 0 617 625 0 0 ) + 3833 ( 817 0 617 618 0 0 ) + 3834 ( 902 4 617 0 2048 4 ) + 3835 ( 834 1 617 0 0 0 ) + 3836 ( 212 1 617 0 0 0 ) + 3837 ( 191 1 617 0 0 0 ) + 3838 ( 900 0 624 618 0 0 ) + 3839 ( 902 4 618 0 2052 6 ) + 3840 ( 817 0 625 618 0 0 ) + 3841 ( 212 1 618 0 0 0 ) + 3842 ( 214 0 619 622 0 0 ) + 3843 ( 214 0 619 623 0 0 ) + 3844 ( 214 1 619 0 0 0 ) + 3845 ( 214 0 619 620 0 0 ) + 3846 ( 892 1 619 0 0 0 ) + 3847 ( 6 4 619 0 2058 5 ) + 3848 ( 904 0 620 623 0 0 ) + 3849 ( 904 1 620 0 0 0 ) + 3850 ( 6 4 620 0 2063 4 ) + 3851 ( 484 1 620 0 0 0 ) + 3852 ( 399 0 621 622 0 0 ) + 3853 ( 892 1 621 0 0 0 ) + 3854 ( 484 1 621 0 0 0 ) + 3855 ( 902 4 621 0 2067 4 ) + 3856 ( 907 0 621 623 0 0 ) + 3857 ( 892 1 622 0 0 0 ) + 3858 ( 902 4 622 0 2071 4 ) + 3859 ( 907 0 622 623 0 0 ) + 3860 ( 902 4 623 0 2075 5 ) + 3861 ( 484 1 623 0 0 0 ) + 3862 ( 900 1 624 0 0 0 ) + 3863 ( 896 4 624 0 2080 4 ) + 3864 ( 896 4 625 0 2084 4 ) + 3865 ( 252 0 626 638 0 0 ) + 3866 ( 484 0 626 644 0 0 ) + 3867 ( 484 0 626 642 0 0 ) + 3868 ( 910 0 626 627 0 0 ) + 3869 ( 910 0 626 630 0 0 ) + 3870 ( 252 0 626 632 0 0 ) + 3871 ( 910 1 626 0 0 0 ) + 3872 ( 601 1 626 0 0 0 ) + 3873 ( 237 1 626 0 0 0 ) + 3874 ( 252 0 627 638 0 0 ) + 3875 ( 858 0 627 629 0 0 ) + 3876 ( 237 1 627 0 0 0 ) + 3877 ( 601 1 627 0 0 0 ) + 3878 ( 112 0 627 630 0 0 ) + 3879 ( 913 0 628 629 0 0 ) + 3880 ( 112 0 628 630 0 0 ) + 3881 ( 870 1 628 0 0 0 ) + 3882 ( 601 1 628 0 0 0 ) + 3883 ( 237 1 628 0 0 0 ) + 3884 ( 252 4 628 0 2088 4 ) + 3885 ( 112 0 629 630 0 0 ) + 3886 ( 601 1 629 0 0 0 ) + 3887 ( 237 1 629 0 0 0 ) + 3888 ( 252 4 629 0 2092 4 ) + 3889 ( 252 0 630 640 0 0 ) + 3890 ( 252 0 630 639 0 0 ) + 3891 ( 252 0 630 636 0 0 ) + 3892 ( 252 0 630 635 0 0 ) + 3893 ( 252 0 630 637 0 0 ) + 3894 ( 252 0 630 641 0 0 ) + 3895 ( 252 0 630 638 0 0 ) + 3896 ( 252 0 630 634 0 0 ) + 3897 ( 252 0 630 633 0 0 ) + 3898 ( 870 1 630 0 0 0 ) + 3899 ( 601 1 630 0 0 0 ) + 3900 ( 196 0 630 631 0 0 ) + 3901 ( 196 1 630 0 0 0 ) + 3902 ( 915 1 631 0 0 0 ) + 3903 ( 870 1 631 0 0 0 ) + 3904 ( 484 1 631 0 0 0 ) + 3905 ( 908 4 631 0 2096 4 ) + 3906 ( 196 0 635 631 0 0 ) + 3907 ( 484 0 631 647 0 0 ) + 3908 ( 601 1 631 0 0 0 ) + 3909 ( 484 0 632 650 0 0 ) + 3910 ( 484 0 632 651 0 0 ) + 3911 ( 908 0 632 656 0 0 ) + 3912 ( 131 0 632 638 0 0 ) + 3913 ( 910 0 632 633 0 0 ) + 3914 ( 908 0 632 659 0 0 ) + 3915 ( 908 0 632 658 0 0 ) + 3916 ( 908 0 632 657 0 0 ) + 3917 ( 484 1 632 0 0 0 ) + 3918 ( 484 0 632 648 0 0 ) + 3919 ( 910 1 632 0 0 0 ) + 3920 ( 858 0 633 637 0 0 ) + 3921 ( 908 0 633 656 0 0 ) + 3922 ( 131 0 633 638 0 0 ) + 3923 ( 858 0 633 634 0 0 ) + 3924 ( 196 1 633 0 0 0 ) + 3925 ( 908 0 633 657 0 0 ) + 3926 ( 858 0 656 634 0 0 ) + 3927 ( 131 0 634 640 0 0 ) + 3928 ( 870 1 634 0 0 0 ) + 3929 ( 858 0 660 634 0 0 ) + 3930 ( 131 1 634 0 0 0 ) + 3931 ( 192 1 634 0 0 0 ) + 3932 ( 192 0 634 636 0 0 ) + 3933 ( 192 0 634 637 0 0 ) + 3934 ( 441 0 635 636 0 0 ) + 3935 ( 908 4 635 0 2100 5 ) + 3936 ( 196 1 635 0 0 0 ) + 3937 ( 870 1 635 0 0 0 ) + 3938 ( 913 0 635 637 0 0 ) + 3939 ( 908 4 636 0 2105 4 ) + 3940 ( 870 1 636 0 0 0 ) + 3941 ( 913 0 636 637 0 0 ) + 3942 ( 196 1 637 0 0 0 ) + 3943 ( 908 4 637 0 2109 5 ) + 3944 ( 858 0 638 640 0 0 ) + 3945 ( 858 1 638 0 0 0 ) + 3946 ( 237 1 638 0 0 0 ) + 3947 ( 908 0 638 656 0 0 ) + 3948 ( 908 0 638 652 0 0 ) + 3949 ( 908 0 638 655 0 0 ) + 3950 ( 908 0 638 653 0 0 ) + 3951 ( 908 0 638 654 0 0 ) + 3952 ( 858 0 638 641 0 0 ) + 3953 ( 210 0 639 640 0 0 ) + 3954 ( 870 1 639 0 0 0 ) + 3955 ( 622 4 639 0 2114 4 ) + 3956 ( 913 0 639 641 0 0 ) + 3957 ( 622 4 640 0 2118 5 ) + 3958 ( 211 0 640 641 0 0 ) + 3959 ( 870 1 640 0 0 0 ) + 3960 ( 622 4 641 0 2123 4 ) + 3961 ( 916 0 642 1359 0 0 ) + 3962 ( 252 0 642 650 0 0 ) + 3963 ( 252 0 642 649 0 0 ) + 3964 ( 252 0 642 648 0 0 ) + 3965 ( 2 0 1213 642 0 0 ) + 3966 ( 2 0 1206 642 0 0 ) + 3967 ( 840 0 642 1386 0 0 ) + 3968 ( 840 0 642 1385 0 0 ) + 3969 ( 601 1 642 0 0 0 ) + 3970 ( 840 0 642 1387 0 0 ) + 3971 ( 252 0 642 651 0 0 ) + 3972 ( 916 0 642 644 0 0 ) + 3973 ( 916 0 642 643 0 0 ) + 3974 ( 0 0 643 1359 0 0 ) + 3975 ( 71 0 643 644 0 0 ) + 3976 ( 252 4 643 0 2127 5 ) + 3977 ( 910 1 643 0 0 0 ) + 3978 ( 910 0 643 645 0 0 ) + 3979 ( 601 1 643 0 0 0 ) + 3980 ( 252 4 644 0 2132 4 ) + 3981 ( 910 1 644 0 0 0 ) + 3982 ( 601 1 644 0 0 0 ) + 3983 ( 0 0 645 1359 0 0 ) + 3984 ( 201 0 645 646 0 0 ) + 3985 ( 252 4 645 0 2136 5 ) + 3986 ( 201 1 645 0 0 0 ) + 3987 ( 601 1 645 0 0 0 ) + 3988 ( 870 1 645 0 0 0 ) + 3989 ( 71 0 646 647 0 0 ) + 3990 ( 915 1 646 0 0 0 ) + 3991 ( 601 1 646 0 0 0 ) + 3992 ( 870 1 646 0 0 0 ) + 3993 ( 252 4 646 0 2141 4 ) + 3994 ( 915 1 647 0 0 0 ) + 3995 ( 601 1 647 0 0 0 ) + 3996 ( 870 1 647 0 0 0 ) + 3997 ( 252 4 647 0 2145 4 ) + 3998 ( 2 0 1213 648 0 0 ) + 3999 ( 2 0 1153 648 0 0 ) + 4000 ( 2 0 1166 648 0 0 ) + 4001 ( 484 0 658 648 0 0 ) + 4002 ( 770 0 648 650 0 0 ) + 4003 ( 705 0 1384 648 0 0 ) + 4004 ( 2 0 1219 648 0 0 ) + 4005 ( 770 1 648 0 0 0 ) + 4006 ( 840 0 648 1385 0 0 ) + 4007 ( 2 0 1206 648 0 0 ) + 4008 ( 770 1 648 0 0 0 ) + 4009 ( 252 0 1387 649 0 0 ) + 4010 ( 890 0 1386 649 0 0 ) + 4011 ( 891 0 649 650 0 0 ) + 4012 ( 918 4 649 0 2149 8 ) + 4013 ( 920 0 649 1391 0 0 ) + 4014 ( 71 0 649 651 0 0 ) + 4015 ( 918 4 650 0 2157 6 ) + 4016 ( 890 0 650 651 0 0 ) + 4017 ( 840 0 650 1386 0 0 ) + 4018 ( 918 4 651 0 2163 4 ) + 4019 ( 237 1 652 0 0 0 ) + 4020 ( 388 1 652 0 0 0 ) + 4021 ( 858 1 652 0 0 0 ) + 4022 ( 166 4 652 0 2167 4 ) + 4023 ( 388 0 652 655 0 0 ) + 4024 ( 140 0 653 654 0 0 ) + 4025 ( 858 1 653 0 0 0 ) + 4026 ( 24 4 653 0 2171 4 ) + 4027 ( 115 0 653 655 0 0 ) + 4028 ( 858 1 654 0 0 0 ) + 4029 ( 24 4 654 0 2175 4 ) + 4030 ( 390 0 654 656 0 0 ) + 4031 ( 24 4 655 0 2179 4 ) + 4032 ( 858 1 655 0 0 0 ) + 4033 ( 192 0 656 658 0 0 ) + 4034 ( 391 1 656 0 0 0 ) + 4035 ( 613 0 660 656 0 0 ) + 4036 ( 858 1 656 0 0 0 ) + 4037 ( 192 1 656 0 0 0 ) + 4038 ( 192 0 656 657 0 0 ) + 4039 ( 922 1 657 0 0 0 ) + 4040 ( 922 0 657 659 0 0 ) + 4041 ( 922 0 657 658 0 0 ) + 4042 ( 858 1 657 0 0 0 ) + 4043 ( 850 1 658 0 0 0 ) + 4044 ( 192 0 660 658 0 0 ) + 4045 ( 484 1 658 0 0 0 ) + 4046 ( 850 0 658 659 0 0 ) + 4047 ( 484 1 659 0 0 0 ) + 4048 ( 924 1 659 0 0 0 ) + 4049 ( 192 1 660 0 0 0 ) + 4050 ( 858 1 660 0 0 0 ) + 4051 ( 613 1 660 0 0 0 ) + 4052 ( 13 1 660 0 0 0 ) + 4053 ( 840 0 661 1356 0 0 ) + 4054 ( 719 1 661 0 0 0 ) + 4055 ( 926 0 661 662 0 0 ) + 4056 ( 926 1 661 0 0 0 ) + 4057 ( 839 1 661 0 0 0 ) + 4058 ( 839 0 661 664 0 0 ) + 4059 ( 705 0 1357 661 0 0 ) + 4060 ( 815 0 661 1360 0 0 ) + 4061 ( 840 1 661 0 0 0 ) + 4062 ( 705 0 1353 661 0 0 ) + 4063 ( 928 1 662 0 0 0 ) + 4064 ( 930 1 662 0 0 0 ) + 4065 ( 926 0 664 662 0 0 ) + 4066 ( 932 1 662 0 0 0 ) + 4067 ( 705 0 1353 662 0 0 ) + 4068 ( 926 0 1356 662 0 0 ) + 4069 ( 817 0 663 667 0 0 ) + 4070 ( 850 0 663 1360 0 0 ) + 4071 ( 719 1 663 0 0 0 ) + 4072 ( 840 1 663 0 0 0 ) + 4073 ( 840 0 663 1361 0 0 ) + 4074 ( 817 1 663 0 0 0 ) + 4075 ( 839 0 663 665 0 0 ) + 4076 ( 839 1 663 0 0 0 ) + 4077 ( 815 0 664 666 0 0 ) + 4078 ( 930 1 664 0 0 0 ) + 4079 ( 930 1 665 0 0 0 ) + 4080 ( 934 1 665 0 0 0 ) + 4081 ( 839 0 667 665 0 0 ) + 4082 ( 850 0 665 666 0 0 ) + 4083 ( 930 1 666 0 0 0 ) + 4084 ( 934 1 667 0 0 0 ) + 4085 ( 817 0 1361 667 0 0 ) + 4086 ( 932 1 667 0 0 0 ) + 4087 ( 936 0 668 669 0 0 ) + 4088 ( 850 1 668 0 0 0 ) + 4089 ( 829 1 668 0 0 0 ) + 4090 ( 345 1 668 0 0 0 ) + 4091 ( 34 4 668 0 2183 4 ) + 4092 ( 939 1 668 0 0 0 ) + 4093 ( 34 4 669 0 2187 4 ) + 4094 ( 345 1 669 0 0 0 ) + 4095 ( 941 0 672 669 0 0 ) + 4096 ( 829 1 669 0 0 0 ) + 4097 ( 850 1 669 0 0 0 ) + 4098 ( 780 1 670 0 0 0 ) + 4099 ( 641 1 671 0 0 0 ) + 4100 ( 641 0 671 677 0 0 ) + 4101 ( 641 0 671 676 0 0 ) + 4102 ( 641 1 671 0 0 0 ) + 4103 ( 650 1 671 0 0 0 ) + 4104 ( 650 0 671 675 0 0 ) + 4105 ( 650 0 671 674 0 0 ) + 4106 ( 791 0 671 673 0 0 ) + 4107 ( 791 0 671 672 0 0 ) + 4108 ( 34 4 671 0 2191 9 ) + 4109 ( 941 1 672 0 0 0 ) + 4110 ( 941 1 672 0 0 0 ) + 4111 ( 941 1 672 0 0 0 ) + 4112 ( 641 1 672 0 0 0 ) + 4113 ( 650 0 672 675 0 0 ) + 4114 ( 34 4 672 0 2200 6 ) + 4115 ( 917 0 672 673 0 0 ) + 4116 ( 941 0 673 678 0 0 ) + 4117 ( 941 1 673 0 0 0 ) + 4118 ( 641 1 673 0 0 0 ) + 4119 ( 34 4 673 0 2206 5 ) + 4120 ( 165 1 674 0 0 0 ) + 4121 ( 175 1 674 0 0 0 ) + 4122 ( 650 0 677 674 0 0 ) + 4123 ( 644 1 674 0 0 0 ) + 4124 ( 98 1 674 0 0 0 ) + 4125 ( 34 4 674 0 2211 4 ) + 4126 ( 941 1 675 0 0 0 ) + 4127 ( 641 1 675 0 0 0 ) + 4128 ( 641 0 675 676 0 0 ) + 4129 ( 641 1 675 0 0 0 ) + 4130 ( 644 1 675 0 0 0 ) + 4131 ( 34 4 675 0 2215 5 ) + 4132 ( 942 1 675 0 0 0 ) + 4133 ( 264 1 676 0 0 0 ) + 4134 ( 175 1 676 0 0 0 ) + 4135 ( 715 1 676 0 0 0 ) + 4136 ( 644 1 676 0 0 0 ) + 4137 ( 98 1 677 0 0 0 ) + 4138 ( 165 1 677 0 0 0 ) + 4139 ( 175 1 677 0 0 0 ) + 4140 ( 770 1 678 0 0 0 ) + 4141 ( 34 4 678 0 2220 4 ) + 4142 ( 641 1 678 0 0 0 ) + 4143 ( 4 0 679 939 0 0 ) + 4144 ( 4 0 679 930 0 0 ) + 4145 ( 37 0 679 682 0 0 ) + 4146 ( 37 0 679 680 0 0 ) + 4147 ( 6 4 679 0 2224 4 ) + 4148 ( 37 1 679 0 0 0 ) + 4149 ( 4 0 679 902 0 0 ) + 4150 ( 4 0 679 936 0 0 ) + 4151 ( 802 0 679 697 0 0 ) + 4152 ( 802 0 679 694 0 0 ) + 4153 ( 802 0 679 692 0 0 ) + 4154 ( 802 1 679 0 0 0 ) + 4155 ( 802 0 679 691 0 0 ) + 4156 ( 6 4 680 0 2228 5 ) + 4157 ( 51 1 680 0 0 0 ) + 4158 ( 23 1 680 0 0 0 ) + 4159 ( 37 0 691 680 0 0 ) + 4160 ( 888 0 680 715 0 0 ) + 4161 ( 888 1 680 0 0 0 ) + 4162 ( 888 0 681 733 0 0 ) + 4163 ( 23 0 681 686 0 0 ) + 4164 ( 44 0 681 682 0 0 ) + 4165 ( 23 1 681 0 0 0 ) + 4166 ( 42 4 681 0 2233 6 ) + 4167 ( 888 1 681 0 0 0 ) + 4168 ( 44 0 681 698 0 0 ) + 4169 ( 44 0 681 699 0 0 ) + 4170 ( 802 0 682 700 0 0 ) + 4171 ( 42 4 682 0 2239 5 ) + 4172 ( 802 0 682 699 0 0 ) + 4173 ( 802 1 682 0 0 0 ) + 4174 ( 946 0 683 701 0 0 ) + 4175 ( 42 4 683 0 2244 4 ) + 4176 ( 172 1 683 0 0 0 ) + 4177 ( 177 1 683 0 0 0 ) + 4178 ( 175 1 683 0 0 0 ) + 4179 ( 888 0 684 733 0 0 ) + 4180 ( 128 0 684 685 0 0 ) + 4181 ( 147 0 684 689 0 0 ) + 4182 ( 888 1 684 0 0 0 ) + 4183 ( 166 4 684 0 2248 4 ) + 4184 ( 147 1 684 0 0 0 ) + 4185 ( 888 1 684 0 0 0 ) + 4186 ( 888 0 685 733 0 0 ) + 4187 ( 142 0 685 686 0 0 ) + 4188 ( 168 4 685 0 2252 4 ) + 4189 ( 888 1 685 0 0 0 ) + 4190 ( 888 0 686 733 0 0 ) + 4191 ( 168 4 686 0 2256 4 ) + 4192 ( 888 1 686 0 0 0 ) + 4193 ( 224 0 687 776 0 0 ) + 4194 ( 949 0 767 687 0 0 ) + 4195 ( 949 0 756 687 0 0 ) + 4196 ( 949 0 748 687 0 0 ) + 4197 ( 949 0 747 687 0 0 ) + 4198 ( 224 0 687 690 0 0 ) + 4199 ( 15 1 687 0 0 0 ) + 4200 ( 180 4 687 0 2260 10 ) + 4201 ( 224 1 687 0 0 0 ) + 4202 ( 949 0 746 687 0 0 ) + 4203 ( 950 0 688 777 0 0 ) + 4204 ( 229 0 688 690 0 0 ) + 4205 ( 230 0 688 689 0 0 ) + 4206 ( 226 4 688 0 2270 4 ) + 4207 ( 841 0 703 689 0 0 ) + 4208 ( 147 0 733 689 0 0 ) + 4209 ( 226 4 689 0 2274 5 ) + 4210 ( 228 0 690 777 0 0 ) + 4211 ( 226 4 690 0 2279 5 ) + 4212 ( 952 0 776 690 0 0 ) + 4213 ( 4 0 691 902 0 0 ) + 4214 ( 888 1 691 0 0 0 ) + 4215 ( 888 0 691 715 0 0 ) + 4216 ( 37 1 691 0 0 0 ) + 4217 ( 55 1 691 0 0 0 ) + 4218 ( 6 4 691 0 2284 4 ) + 4219 ( 888 0 692 733 0 0 ) + 4220 ( 37 0 692 700 0 0 ) + 4221 ( 696 0 692 696 0 0 ) + 4222 ( 696 0 692 695 0 0 ) + 4223 ( 696 0 692 697 0 0 ) + 4224 ( 954 0 692 694 0 0 ) + 4225 ( 954 0 692 693 0 0 ) + 4226 ( 888 1 692 0 0 0 ) + 4227 ( 4 0 693 939 0 0 ) + 4228 ( 888 0 693 733 0 0 ) + 4229 ( 4 0 693 931 0 0 ) + 4230 ( 415 0 693 694 0 0 ) + 4231 ( 4 0 693 936 0 0 ) + 4232 ( 888 1 693 0 0 0 ) + 4233 ( 696 4 693 0 2288 4 ) + 4234 ( 4 0 694 939 0 0 ) + 4235 ( 4 0 694 933 0 0 ) + 4236 ( 4 0 694 936 0 0 ) + 4237 ( 696 4 694 0 2292 4 ) + 4238 ( 959 0 695 696 0 0 ) + 4239 ( 888 1 695 0 0 0 ) + 4240 ( 956 4 695 0 2296 4 ) + 4241 ( 415 0 695 697 0 0 ) + 4242 ( 888 1 696 0 0 0 ) + 4243 ( 956 4 696 0 2300 4 ) + 4244 ( 415 0 696 697 0 0 ) + 4245 ( 37 0 696 700 0 0 ) + 4246 ( 37 0 697 700 0 0 ) + 4247 ( 956 4 697 0 2304 5 ) + 4248 ( 888 0 698 733 0 0 ) + 4249 ( 960 0 698 700 0 0 ) + 4250 ( 415 0 698 699 0 0 ) + 4251 ( 888 1 698 0 0 0 ) + 4252 ( 42 4 698 0 2309 4 ) + 4253 ( 960 1 698 0 0 0 ) + 4254 ( 960 0 699 700 0 0 ) + 4255 ( 42 4 699 0 2313 4 ) + 4256 ( 960 1 699 0 0 0 ) + 4257 ( 888 0 700 733 0 0 ) + 4258 ( 956 4 700 0 2317 6 ) + 4259 ( 888 1 700 0 0 0 ) + 4260 ( 172 1 701 0 0 0 ) + 4261 ( 175 1 701 0 0 0 ) + 4262 ( 42 4 701 0 2323 5 ) + 4263 ( 949 0 727 701 0 0 ) + 4264 ( 177 0 701 729 0 0 ) + 4265 ( 177 1 701 0 0 0 ) + 4266 ( 4 0 702 938 0 0 ) + 4267 ( 965 0 702 744 0 0 ) + 4268 ( 967 0 702 705 0 0 ) + 4269 ( 965 0 702 742 0 0 ) + 4270 ( 967 0 702 704 0 0 ) + 4271 ( 967 1 702 0 0 0 ) + 4272 ( 443 1 702 0 0 0 ) + 4273 ( 968 4 702 0 2328 5 ) + 4274 ( 16 1 702 0 0 0 ) + 4275 ( 48 0 703 961 0 0 ) + 4276 ( 226 4 703 0 2333 7 ) + 4277 ( 8 0 784 703 0 0 ) + 4278 ( 841 0 703 733 0 0 ) + 4279 ( 16 1 703 0 0 0 ) + 4280 ( 230 0 777 703 0 0 ) + 4281 ( 48 0 703 962 0 0 ) + 4282 ( 48 0 703 965 0 0 ) + 4283 ( 971 0 704 737 0 0 ) + 4284 ( 971 0 704 740 0 0 ) + 4285 ( 971 0 704 738 0 0 ) + 4286 ( 134 0 704 705 0 0 ) + 4287 ( 965 0 704 743 0 0 ) + 4288 ( 965 0 704 742 0 0 ) + 4289 ( 443 1 704 0 0 0 ) + 4290 ( 908 4 704 0 2340 5 ) + 4291 ( 971 1 704 0 0 0 ) + 4292 ( 4 0 705 938 0 0 ) + 4293 ( 135 0 705 740 0 0 ) + 4294 ( 135 0 705 739 0 0 ) + 4295 ( 135 0 705 738 0 0 ) + 4296 ( 443 1 705 0 0 0 ) + 4297 ( 968 4 705 0 2345 4 ) + 4298 ( 135 1 705 0 0 0 ) + 4299 ( 972 0 732 705 0 0 ) + 4300 ( 135 0 705 736 0 0 ) + 4301 ( 982 0 706 926 0 0 ) + 4302 ( 978 4 706 0 2349 5 ) + 4303 ( 984 1 706 0 0 0 ) + 4304 ( 977 1 706 0 0 0 ) + 4305 ( 617 0 706 734 0 0 ) + 4306 ( 617 1 706 0 0 0 ) + 4307 ( 974 1 706 0 0 0 ) + 4308 ( 617 1 706 0 0 0 ) + 4309 ( 981 0 706 707 0 0 ) + 4310 ( 974 1 707 0 0 0 ) + 4311 ( 617 1 707 0 0 0 ) + 4312 ( 963 1 707 0 0 0 ) + 4313 ( 963 0 707 723 0 0 ) + 4314 ( 977 1 707 0 0 0 ) + 4315 ( 978 4 707 0 2354 5 ) + 4316 ( 134 0 708 709 0 0 ) + 4317 ( 972 1 708 0 0 0 ) + 4318 ( 175 1 708 0 0 0 ) + 4319 ( 989 0 708 710 0 0 ) + 4320 ( 42 4 708 0 2359 4 ) + 4321 ( 853 1 708 0 0 0 ) + 4322 ( 42 0 709 906 0 0 ) + 4323 ( 42 0 709 713 0 0 ) + 4324 ( 972 1 709 0 0 0 ) + 4325 ( 175 1 709 0 0 0 ) + 4326 ( 48 1 709 0 0 0 ) + 4327 ( 853 1 709 0 0 0 ) + 4328 ( 963 0 710 726 0 0 ) + 4329 ( 853 1 710 0 0 0 ) + 4330 ( 42 4 710 0 2363 4 ) + 4331 ( 175 1 710 0 0 0 ) + 4332 ( 972 1 710 0 0 0 ) + 4333 ( 4 0 711 905 0 0 ) + 4334 ( 4 0 711 904 0 0 ) + 4335 ( 963 1 711 0 0 0 ) + 4336 ( 853 0 711 714 0 0 ) + 4337 ( 853 1 711 0 0 0 ) + 4338 ( 853 1 711 0 0 0 ) + 4339 ( 991 0 711 712 0 0 ) + 4340 ( 972 1 711 0 0 0 ) + 4341 ( 992 4 711 0 2367 5 ) + 4342 ( 4 0 712 906 0 0 ) + 4343 ( 963 1 712 0 0 0 ) + 4344 ( 853 1 712 0 0 0 ) + 4345 ( 51 0 712 713 0 0 ) + 4346 ( 51 1 712 0 0 0 ) + 4347 ( 972 1 712 0 0 0 ) + 4348 ( 4 0 713 906 0 0 ) + 4349 ( 972 1 713 0 0 0 ) + 4350 ( 135 1 713 0 0 0 ) + 4351 ( 853 1 713 0 0 0 ) + 4352 ( 4 0 714 904 0 0 ) + 4353 ( 949 0 714 716 0 0 ) + 4354 ( 949 1 714 0 0 0 ) + 4355 ( 461 1 714 0 0 0 ) + 4356 ( 135 1 714 0 0 0 ) + 4357 ( 992 4 714 0 2372 5 ) + 4358 ( 79 0 893 715 0 0 ) + 4359 ( 461 1 715 0 0 0 ) + 4360 ( 888 0 902 715 0 0 ) + 4361 ( 840 0 715 903 0 0 ) + 4362 ( 840 0 715 904 0 0 ) + 4363 ( 840 1 715 0 0 0 ) + 4364 ( 6 4 715 0 2377 7 ) + 4365 ( 79 0 896 715 0 0 ) + 4366 ( 840 0 715 716 0 0 ) + 4367 ( 23 1 715 0 0 0 ) + 4368 ( 4 0 716 904 0 0 ) + 4369 ( 461 1 716 0 0 0 ) + 4370 ( 23 1 716 0 0 0 ) + 4371 ( 992 4 716 0 2384 4 ) + 4372 ( 617 1 717 0 0 0 ) + 4373 ( 617 0 717 735 0 0 ) + 4374 ( 617 1 717 0 0 0 ) + 4375 ( 617 1 717 0 0 0 ) + 4376 ( 617 1 717 0 0 0 ) + 4377 ( 997 1 717 0 0 0 ) + 4378 ( 997 0 717 725 0 0 ) + 4379 ( 997 1 717 0 0 0 ) + 4380 ( 998 0 717 723 0 0 ) + 4381 ( 998 1 717 0 0 0 ) + 4382 ( 1001 1 717 0 0 0 ) + 4383 ( 1001 0 717 722 0 0 ) + 4384 ( 1001 1 717 0 0 0 ) + 4385 ( 1001 0 717 721 0 0 ) + 4386 ( 1001 0 717 720 0 0 ) + 4387 ( 1001 1 717 0 0 0 ) + 4388 ( 1001 1 717 0 0 0 ) + 4389 ( 1002 1 717 0 0 0 ) + 4390 ( 1002 0 717 719 0 0 ) + 4391 ( 1002 1 717 0 0 0 ) + 4392 ( 1002 0 717 718 0 0 ) + 4393 ( 1002 1 717 0 0 0 ) + 4394 ( 42 4 717 0 2388 16 ) + 4395 ( 974 1 718 0 0 0 ) + 4396 ( 617 1 718 0 0 0 ) + 4397 ( 42 4 718 0 2404 4 ) + 4398 ( 171 1 718 0 0 0 ) + 4399 ( 18 1 718 0 0 0 ) + 4400 ( 974 1 719 0 0 0 ) + 4401 ( 617 1 719 0 0 0 ) + 4402 ( 156 1 719 0 0 0 ) + 4403 ( 42 4 719 0 2408 4 ) + 4404 ( 173 1 719 0 0 0 ) + 4405 ( 965 1 720 0 0 0 ) + 4406 ( 617 1 720 0 0 0 ) + 4407 ( 1011 1 720 0 0 0 ) + 4408 ( 1012 1 720 0 0 0 ) + 4409 ( 42 4 720 0 2412 4 ) + 4410 ( 965 1 721 0 0 0 ) + 4411 ( 617 1 721 0 0 0 ) + 4412 ( 42 4 721 0 2416 4 ) + 4413 ( 1006 1 721 0 0 0 ) + 4414 ( 1015 1 721 0 0 0 ) + 4415 ( 965 1 722 0 0 0 ) + 4416 ( 617 1 722 0 0 0 ) + 4417 ( 42 4 722 0 2420 4 ) + 4418 ( 1009 1 722 0 0 0 ) + 4419 ( 1016 1 722 0 0 0 ) + 4420 ( 617 1 723 0 0 0 ) + 4421 ( 978 4 723 0 2424 4 ) + 4422 ( 977 1 723 0 0 0 ) + 4423 ( 1002 1 723 0 0 0 ) + 4424 ( 177 0 724 728 0 0 ) + 4425 ( 177 1 724 0 0 0 ) + 4426 ( 853 0 724 727 0 0 ) + 4427 ( 853 1 724 0 0 0 ) + 4428 ( 1024 0 724 726 0 0 ) + 4429 ( 972 1 724 0 0 0 ) + 4430 ( 972 0 724 725 0 0 ) + 4431 ( 175 1 724 0 0 0 ) + 4432 ( 42 4 724 0 2428 7 ) + 4433 ( 177 1 725 0 0 0 ) + 4434 ( 42 4 725 0 2435 4 ) + 4435 ( 175 1 725 0 0 0 ) + 4436 ( 998 1 725 0 0 0 ) + 4437 ( 853 1 726 0 0 0 ) + 4438 ( 972 1 726 0 0 0 ) + 4439 ( 42 4 726 0 2439 4 ) + 4440 ( 175 1 726 0 0 0 ) + 4441 ( 177 0 727 728 0 0 ) + 4442 ( 949 1 727 0 0 0 ) + 4443 ( 175 1 727 0 0 0 ) + 4444 ( 998 1 727 0 0 0 ) + 4445 ( 42 4 727 0 2443 5 ) + 4446 ( 1031 0 728 730 0 0 ) + 4447 ( 1031 1 728 0 0 0 ) + 4448 ( 42 4 728 0 2448 5 ) + 4449 ( 1026 1 728 0 0 0 ) + 4450 ( 175 1 728 0 0 0 ) + 4451 ( 949 0 728 729 0 0 ) + 4452 ( 1031 0 729 731 0 0 ) + 4453 ( 1031 1 729 0 0 0 ) + 4454 ( 42 4 729 0 2453 4 ) + 4455 ( 888 1 0 729 0 0 ) + 4456 ( 175 1 729 0 0 0 ) + 4457 ( 1032 1 730 0 0 0 ) + 4458 ( 1029 1 730 0 0 0 ) + 4459 ( 175 1 730 0 0 0 ) + 4460 ( 1026 1 730 0 0 0 ) + 4461 ( 949 0 730 731 0 0 ) + 4462 ( 1032 1 731 0 0 0 ) + 4463 ( 1029 1 731 0 0 0 ) + 4464 ( 175 1 731 0 0 0 ) + 4465 ( 888 1 0 731 0 0 ) + 4466 ( 4 0 732 938 0 0 ) + 4467 ( 965 0 732 745 0 0 ) + 4468 ( 972 0 732 739 0 0 ) + 4469 ( 965 0 732 741 0 0 ) + 4470 ( 972 0 732 736 0 0 ) + 4471 ( 972 1 732 0 0 0 ) + 4472 ( 853 1 732 0 0 0 ) + 4473 ( 443 1 732 0 0 0 ) + 4474 ( 968 4 732 0 2457 5 ) + 4475 ( 78 0 733 957 0 0 ) + 4476 ( 888 0 939 733 0 0 ) + 4477 ( 226 4 733 0 2462 16 ) + 4478 ( 8 0 784 733 0 0 ) + 4479 ( 841 0 962 733 0 0 ) + 4480 ( 841 0 963 733 0 0 ) + 4481 ( 1034 1 734 0 0 0 ) + 4482 ( 1036 1 734 0 0 0 ) + 4483 ( 705 1 734 0 0 0 ) + 4484 ( 566 1 734 0 0 0 ) + 4485 ( 129 1 734 0 0 0 ) + 4486 ( 705 1 735 0 0 0 ) + 4487 ( 1009 1 735 0 0 0 ) + 4488 ( 1040 1 735 0 0 0 ) + 4489 ( 1043 1 735 0 0 0 ) + 4490 ( 1006 1 735 0 0 0 ) + 4491 ( 1046 0 736 737 0 0 ) + 4492 ( 1044 0 736 739 0 0 ) + 4493 ( 965 0 736 741 0 0 ) + 4494 ( 1046 0 736 738 0 0 ) + 4495 ( 443 1 736 0 0 0 ) + 4496 ( 1046 0 741 737 0 0 ) + 4497 ( 443 1 737 0 0 0 ) + 4498 ( 1044 4 737 0 2478 6 ) + 4499 ( 1048 0 737 742 0 0 ) + 4500 ( 1051 0 737 780 0 0 ) + 4501 ( 962 0 737 738 0 0 ) + 4502 ( 1044 0 738 740 0 0 ) + 4503 ( 443 1 738 0 0 0 ) + 4504 ( 1051 0 739 780 0 0 ) + 4505 ( 1044 0 741 739 0 0 ) + 4506 ( 908 4 739 0 2484 6 ) + 4507 ( 1046 1 739 0 0 0 ) + 4508 ( 972 0 745 739 0 0 ) + 4509 ( 1046 0 739 740 0 0 ) + 4510 ( 963 1 740 0 0 0 ) + 4511 ( 908 4 740 0 2490 4 ) + 4512 ( 1051 0 741 780 0 0 ) + 4513 ( 1051 0 741 779 0 0 ) + 4514 ( 1044 0 741 745 0 0 ) + 4515 ( 443 1 741 0 0 0 ) + 4516 ( 853 1 741 0 0 0 ) + 4517 ( 1051 0 742 780 0 0 ) + 4518 ( 1051 0 742 781 0 0 ) + 4519 ( 1044 0 742 744 0 0 ) + 4520 ( 1044 0 742 743 0 0 ) + 4521 ( 443 1 742 0 0 0 ) + 4522 ( 16 1 742 0 0 0 ) + 4523 ( 1051 0 743 780 0 0 ) + 4524 ( 966 0 743 744 0 0 ) + 4525 ( 1049 1 743 0 0 0 ) + 4526 ( 908 4 743 0 2494 4 ) + 4527 ( 1051 0 744 781 0 0 ) + 4528 ( 16 1 744 0 0 0 ) + 4529 ( 968 4 744 0 2498 4 ) + 4530 ( 967 1 744 0 0 0 ) + 4531 ( 1051 0 745 779 0 0 ) + 4532 ( 972 1 745 0 0 0 ) + 4533 ( 968 4 745 0 2502 4 ) + 4534 ( 853 1 745 0 0 0 ) + 4535 ( 949 0 746 776 0 0 ) + 4536 ( 1045 0 746 775 0 0 ) + 4537 ( 1045 0 746 774 0 0 ) + 4538 ( 1045 0 746 768 0 0 ) + 4539 ( 1045 0 746 767 0 0 ) + 4540 ( 1045 0 746 762 0 0 ) + 4541 ( 1045 0 746 756 0 0 ) + 4542 ( 1045 0 746 755 0 0 ) + 4543 ( 1045 0 746 754 0 0 ) + 4544 ( 1045 0 746 748 0 0 ) + 4545 ( 1045 0 746 747 0 0 ) + 4546 ( 228 0 746 782 0 0 ) + 4547 ( 228 0 746 778 0 0 ) + 4548 ( 228 1 746 0 0 0 ) + 4549 ( 1045 1 746 0 0 0 ) + 4550 ( 1045 1 746 0 0 0 ) + 4551 ( 1045 1 746 0 0 0 ) + 4552 ( 1045 1 746 0 0 0 ) + 4553 ( 15 1 746 0 0 0 ) + 4554 ( 16 1 746 0 0 0 ) + 4555 ( 180 4 746 0 2506 6 ) + 4556 ( 1061 0 755 747 0 0 ) + 4557 ( 216 0 747 748 0 0 ) + 4558 ( 15 1 747 0 0 0 ) + 4559 ( 216 1 747 0 0 0 ) + 4560 ( 216 0 747 752 0 0 ) + 4561 ( 216 0 747 753 0 0 ) + 4562 ( 1058 0 748 762 0 0 ) + 4563 ( 1058 0 748 756 0 0 ) + 4564 ( 1062 0 748 754 0 0 ) + 4565 ( 1062 1 748 0 0 0 ) + 4566 ( 1058 1 748 0 0 0 ) + 4567 ( 1058 0 748 759 0 0 ) + 4568 ( 1058 0 748 760 0 0 ) + 4569 ( 1062 0 748 751 0 0 ) + 4570 ( 1062 0 748 752 0 0 ) + 4571 ( 222 0 749 750 0 0 ) + 4572 ( 221 0 749 752 0 0 ) + 4573 ( 1054 4 749 0 2512 4 ) + 4574 ( 1064 0 749 753 0 0 ) + 4575 ( 1067 0 749 751 0 0 ) + 4576 ( 218 0 750 754 0 0 ) + 4577 ( 1054 4 750 0 2516 4 ) + 4578 ( 1064 0 750 753 0 0 ) + 4579 ( 1067 0 750 751 0 0 ) + 4580 ( 1054 4 751 0 2520 5 ) + 4581 ( 218 0 751 754 0 0 ) + 4582 ( 221 0 751 752 0 0 ) + 4583 ( 1054 4 752 0 2525 5 ) + 4584 ( 1064 0 752 753 0 0 ) + 4585 ( 1060 0 753 755 0 0 ) + 4586 ( 1054 4 753 0 2530 6 ) + 4587 ( 218 0 753 754 0 0 ) + 4588 ( 1058 0 754 762 0 0 ) + 4589 ( 1061 0 755 754 0 0 ) + 4590 ( 219 1 754 0 0 0 ) + 4591 ( 1058 0 755 762 0 0 ) + 4592 ( 16 1 755 0 0 0 ) + 4593 ( 15 1 755 0 0 0 ) + 4594 ( 1061 1 755 0 0 0 ) + 4595 ( 1058 1 755 0 0 0 ) + 4596 ( 1058 0 755 765 0 0 ) + 4597 ( 1057 0 767 756 0 0 ) + 4598 ( 1068 1 756 0 0 0 ) + 4599 ( 1068 0 756 758 0 0 ) + 4600 ( 1068 0 756 759 0 0 ) + 4601 ( 1068 0 756 761 0 0 ) + 4602 ( 1081 0 757 758 0 0 ) + 4603 ( 1076 0 757 760 0 0 ) + 4604 ( 1054 4 757 0 2536 4 ) + 4605 ( 1074 0 757 761 0 0 ) + 4606 ( 1079 0 757 759 0 0 ) + 4607 ( 1054 4 758 0 2540 4 ) + 4608 ( 1074 0 758 761 0 0 ) + 4609 ( 1079 0 758 759 0 0 ) + 4610 ( 1054 4 759 0 2544 5 ) + 4611 ( 1076 0 759 760 0 0 ) + 4612 ( 1072 0 760 762 0 0 ) + 4613 ( 1054 4 760 0 2549 5 ) + 4614 ( 1074 0 760 761 0 0 ) + 4615 ( 1054 4 761 0 2554 6 ) + 4616 ( 1072 0 761 762 0 0 ) + 4617 ( 1056 0 761 767 0 0 ) + 4618 ( 1057 0 774 762 0 0 ) + 4619 ( 1057 0 768 762 0 0 ) + 4620 ( 1057 0 767 762 0 0 ) + 4621 ( 1070 1 762 0 0 0 ) + 4622 ( 1073 1 762 0 0 0 ) + 4623 ( 1070 0 762 764 0 0 ) + 4624 ( 1070 0 762 765 0 0 ) + 4625 ( 1070 0 762 766 0 0 ) + 4626 ( 1083 0 763 764 0 0 ) + 4627 ( 1074 0 763 766 0 0 ) + 4628 ( 16 1 763 0 0 0 ) + 4629 ( 1054 4 763 0 2560 4 ) + 4630 ( 1079 0 763 765 0 0 ) + 4631 ( 1074 0 764 766 0 0 ) + 4632 ( 1054 4 764 0 2564 4 ) + 4633 ( 1079 0 764 765 0 0 ) + 4634 ( 1054 4 765 0 2568 5 ) + 4635 ( 16 1 765 0 0 0 ) + 4636 ( 16 1 766 0 0 0 ) + 4637 ( 1054 4 766 0 2573 5 ) + 4638 ( 1056 0 766 774 0 0 ) + 4639 ( 228 0 767 777 0 0 ) + 4640 ( 949 0 767 776 0 0 ) + 4641 ( 1062 0 767 775 0 0 ) + 4642 ( 1062 0 767 768 0 0 ) + 4643 ( 1062 1 767 0 0 0 ) + 4644 ( 1057 1 767 0 0 0 ) + 4645 ( 228 1 767 0 0 0 ) + 4646 ( 228 1 767 0 0 0 ) + 4647 ( 228 0 767 778 0 0 ) + 4648 ( 1062 0 767 773 0 0 ) + 4649 ( 1061 0 774 768 0 0 ) + 4650 ( 1086 1 768 0 0 0 ) + 4651 ( 1086 0 768 770 0 0 ) + 4652 ( 1086 0 768 771 0 0 ) + 4653 ( 1086 0 768 773 0 0 ) + 4654 ( 1091 0 769 770 0 0 ) + 4655 ( 1088 0 769 772 0 0 ) + 4656 ( 1054 4 769 0 2578 4 ) + 4657 ( 1067 0 769 773 0 0 ) + 4658 ( 1064 0 769 771 0 0 ) + 4659 ( 1054 4 770 0 2582 4 ) + 4660 ( 1067 0 770 773 0 0 ) + 4661 ( 1064 0 770 771 0 0 ) + 4662 ( 1060 0 771 774 0 0 ) + 4663 ( 1054 4 771 0 2586 5 ) + 4664 ( 1088 0 771 772 0 0 ) + 4665 ( 1084 0 772 775 0 0 ) + 4666 ( 1054 4 772 0 2591 5 ) + 4667 ( 1060 0 772 774 0 0 ) + 4668 ( 1067 0 772 773 0 0 ) + 4669 ( 1054 4 773 0 2596 6 ) + 4670 ( 1084 0 773 775 0 0 ) + 4671 ( 1085 0 775 774 0 0 ) + 4672 ( 16 1 774 0 0 0 ) + 4673 ( 1061 1 774 0 0 0 ) + 4674 ( 1057 1 774 0 0 0 ) + 4675 ( 16 1 775 0 0 0 ) + 4676 ( 1085 1 775 0 0 0 ) + 4677 ( 228 1 775 0 0 0 ) + 4678 ( 228 0 775 778 0 0 ) + 4679 ( 228 0 775 777 0 0 ) + 4680 ( 952 1 776 0 0 0 ) + 4681 ( 180 4 776 0 2602 3 ) + 4682 ( 226 4 777 0 2605 7 ) + 4683 ( 16 1 777 0 0 0 ) + 4684 ( 1092 0 778 780 0 0 ) + 4685 ( 908 0 778 783 0 0 ) + 4686 ( 908 0 778 782 0 0 ) + 4687 ( 1092 0 778 779 0 0 ) + 4688 ( 1092 0 778 781 0 0 ) + 4689 ( 443 1 778 0 0 0 ) + 4690 ( 853 1 778 0 0 0 ) + 4691 ( 16 1 778 0 0 0 ) + 4692 ( 1092 0 783 779 0 0 ) + 4693 ( 972 0 779 780 0 0 ) + 4694 ( 972 1 779 0 0 0 ) + 4695 ( 968 4 779 0 2612 4 ) + 4696 ( 853 1 779 0 0 0 ) + 4697 ( 443 1 779 0 0 0 ) + 4698 ( 443 1 780 0 0 0 ) + 4699 ( 908 4 780 0 2616 6 ) + 4700 ( 966 0 780 781 0 0 ) + 4701 ( 1051 1 0 780 0 0 ) + 4702 ( 1092 0 783 781 0 0 ) + 4703 ( 968 4 781 0 2622 4 ) + 4704 ( 16 1 781 0 0 0 ) + 4705 ( 967 1 781 0 0 0 ) + 4706 ( 443 1 781 0 0 0 ) + 4707 ( 146 0 782 783 0 0 ) + 4708 ( 853 1 782 0 0 0 ) + 4709 ( 16 1 782 0 0 0 ) + 4710 ( 180 4 782 0 2626 4 ) + 4711 ( 147 1 783 0 0 0 ) + 4712 ( 16 1 783 0 0 0 ) + 4713 ( 968 4 783 0 2630 6 ) + 4714 ( 853 1 783 0 0 0 ) + 4715 ( 1092 1 783 0 0 0 ) + 4716 ( 8 0 784 961 0 0 ) + 4717 ( 8 0 784 957 0 0 ) + 4718 ( 8 0 784 960 0 0 ) + 4719 ( 8 0 784 959 0 0 ) + 4720 ( 8 0 784 958 0 0 ) + 4721 ( 8 0 784 841 0 0 ) + 4722 ( 8 0 784 956 0 0 ) + 4723 ( 8 0 784 955 0 0 ) + 4724 ( 8 0 784 954 0 0 ) + 4725 ( 8 0 784 949 0 0 ) + 4726 ( 8 0 784 948 0 0 ) + 4727 ( 8 0 784 939 0 0 ) + 4728 ( 8 0 784 836 0 0 ) + 4729 ( 8 0 784 833 0 0 ) + 4730 ( 8 0 784 832 0 0 ) + 4731 ( 8 0 784 822 0 0 ) + 4732 ( 8 0 784 821 0 0 ) + 4733 ( 8 0 784 819 0 0 ) + 4734 ( 8 0 784 820 0 0 ) + 4735 ( 8 0 784 964 0 0 ) + 4736 ( 8 0 784 966 0 0 ) + 4737 ( 8 0 784 965 0 0 ) + 4738 ( 8 0 784 842 0 0 ) + 4739 ( 8 0 784 963 0 0 ) + 4740 ( 8 0 784 962 0 0 ) + 4741 ( 8 0 784 830 0 0 ) + 4742 ( 8 0 784 829 0 0 ) + 4743 ( 8 0 784 828 0 0 ) + 4744 ( 8 0 784 947 0 0 ) + 4745 ( 8 0 784 840 0 0 ) + 4746 ( 8 0 784 831 0 0 ) + 4747 ( 8 0 784 824 0 0 ) + 4748 ( 8 0 784 837 0 0 ) + 4749 ( 8 0 784 827 0 0 ) + 4750 ( 8 0 784 823 0 0 ) + 4751 ( 8 0 784 804 0 0 ) + 4752 ( 234 1 784 0 0 0 ) + 4753 ( 11 1 784 0 0 0 ) + 4754 ( 16 1 784 0 0 0 ) + 4755 ( 575 0 785 820 0 0 ) + 4756 ( 575 0 785 815 0 0 ) + 4757 ( 352 0 785 787 0 0 ) + 4758 ( 1096 0 785 791 0 0 ) + 4759 ( 1096 1 785 0 0 0 ) + 4760 ( 352 0 785 792 0 0 ) + 4761 ( 352 0 785 793 0 0 ) + 4762 ( 352 1 785 0 0 0 ) + 4763 ( 27 0 785 804 0 0 ) + 4764 ( 575 0 785 823 0 0 ) + 4765 ( 575 1 785 0 0 0 ) + 4766 ( 575 0 785 827 0 0 ) + 4767 ( 300 0 785 812 0 0 ) + 4768 ( 300 0 785 811 0 0 ) + 4769 ( 300 0 785 810 0 0 ) + 4770 ( 352 0 785 786 0 0 ) + 4771 ( 949 0 786 787 0 0 ) + 4772 ( 949 0 786 789 0 0 ) + 4773 ( 949 0 786 790 0 0 ) + 4774 ( 300 0 786 811 0 0 ) + 4775 ( 238 1 786 0 0 0 ) + 4776 ( 719 0 786 792 0 0 ) + 4777 ( 949 1 786 0 0 0 ) + 4778 ( 1098 1 786 0 0 0 ) + 4779 ( 366 1 787 0 0 0 ) + 4780 ( 300 0 787 810 0 0 ) + 4781 ( 366 0 787 790 0 0 ) + 4782 ( 719 0 787 792 0 0 ) + 4783 ( 840 0 788 789 0 0 ) + 4784 ( 58 4 788 0 2636 5 ) + 4785 ( 719 0 788 792 0 0 ) + 4786 ( 238 1 788 0 0 0 ) + 4787 ( 437 0 788 790 0 0 ) + 4788 ( 58 4 789 0 2641 4 ) + 4789 ( 719 0 789 792 0 0 ) + 4790 ( 238 1 789 0 0 0 ) + 4791 ( 437 0 789 790 0 0 ) + 4792 ( 719 0 790 792 0 0 ) + 4793 ( 58 4 790 0 2645 5 ) + 4794 ( 575 0 791 827 0 0 ) + 4795 ( 575 1 791 0 0 0 ) + 4796 ( 27 0 791 806 0 0 ) + 4797 ( 27 0 791 804 0 0 ) + 4798 ( 352 1 791 0 0 0 ) + 4799 ( 352 0 791 793 0 0 ) + 4800 ( 1016 1 791 0 0 0 ) + 4801 ( 1100 1 791 0 0 0 ) + 4802 ( 27 0 792 804 0 0 ) + 4803 ( 238 1 792 0 0 0 ) + 4804 ( 238 1 792 0 0 0 ) + 4805 ( 1098 1 792 0 0 0 ) + 4806 ( 1098 0 792 793 0 0 ) + 4807 ( 27 0 793 807 0 0 ) + 4808 ( 27 0 793 804 0 0 ) + 4809 ( 238 1 793 0 0 0 ) + 4810 ( 1102 1 793 0 0 0 ) + 4811 ( 1109 0 794 799 0 0 ) + 4812 ( 1110 0 794 796 0 0 ) + 4813 ( 1112 4 794 0 2650 4 ) + 4814 ( 1106 1 794 0 0 0 ) + 4815 ( 1105 1 794 0 0 0 ) + 4816 ( 27 1 794 0 0 0 ) + 4817 ( 1106 0 795 800 0 0 ) + 4818 ( 1115 0 795 796 0 0 ) + 4819 ( 1106 1 795 0 0 0 ) + 4820 ( 458 1 795 0 0 0 ) + 4821 ( 458 0 795 803 0 0 ) + 4822 ( 27 1 795 0 0 0 ) + 4823 ( 300 4 795 0 2654 6 ) + 4824 ( 1115 1 795 0 0 0 ) + 4825 ( 263 1 795 0 0 0 ) + 4826 ( 458 1 795 0 0 0 ) + 4827 ( 1112 4 796 0 2660 4 ) + 4828 ( 1106 1 796 0 0 0 ) + 4829 ( 1105 1 796 0 0 0 ) + 4830 ( 27 1 796 0 0 0 ) + 4831 ( 58 4 797 0 2664 7 ) + 4832 ( 1106 0 797 801 0 0 ) + 4833 ( 1106 0 797 802 0 0 ) + 4834 ( 27 1 797 0 0 0 ) + 4835 ( 948 0 797 798 0 0 ) + 4836 ( 411 1 797 0 0 0 ) + 4837 ( 948 1 797 0 0 0 ) + 4838 ( 948 1 797 0 0 0 ) + 4839 ( 411 1 797 0 0 0 ) + 4840 ( 1116 0 798 799 0 0 ) + 4841 ( 58 4 798 0 2671 4 ) + 4842 ( 1106 1 798 0 0 0 ) + 4843 ( 1105 1 798 0 0 0 ) + 4844 ( 27 1 798 0 0 0 ) + 4845 ( 1112 4 799 0 2675 4 ) + 4846 ( 1106 1 799 0 0 0 ) + 4847 ( 1105 1 799 0 0 0 ) + 4848 ( 27 1 799 0 0 0 ) + 4849 ( 1115 1 800 0 0 0 ) + 4850 ( 719 1 800 0 0 0 ) + 4851 ( 458 1 800 0 0 0 ) + 4852 ( 300 4 800 0 2679 4 ) + 4853 ( 1118 0 800 1121 0 0 ) + 4854 ( 1118 0 800 1158 0 0 ) + 4855 ( 58 4 801 0 2683 6 ) + 4856 ( 376 1 801 0 0 0 ) + 4857 ( 376 0 801 1155 0 0 ) + 4858 ( 376 1 801 0 0 0 ) + 4859 ( 948 1 801 0 0 0 ) + 4860 ( 719 0 801 1203 0 0 ) + 4861 ( 719 0 801 1204 0 0 ) + 4862 ( 719 0 801 802 0 0 ) + 4863 ( 1094 0 802 1204 0 0 ) + 4864 ( 1094 1 802 0 0 0 ) + 4865 ( 1094 0 802 1203 0 0 ) + 4866 ( 27 1 802 0 0 0 ) + 4867 ( 948 1 802 0 0 0 ) + 4868 ( 300 4 803 0 2689 4 ) + 4869 ( 719 1 803 0 0 0 ) + 4870 ( 1120 1 803 0 0 0 ) + 4871 ( 1105 1 803 0 0 0 ) + 4872 ( 1106 1 803 0 0 0 ) + 4873 ( 575 0 804 832 0 0 ) + 4874 ( 575 0 804 831 0 0 ) + 4875 ( 575 0 804 820 0 0 ) + 4876 ( 238 0 804 805 0 0 ) + 4877 ( 575 0 804 827 0 0 ) + 4878 ( 575 0 804 823 0 0 ) + 4879 ( 1122 1 804 0 0 0 ) + 4880 ( 1122 0 804 808 0 0 ) + 4881 ( 1122 0 804 807 0 0 ) + 4882 ( 1122 0 804 806 0 0 ) + 4883 ( 238 1 804 0 0 0 ) + 4884 ( 16 1 804 0 0 0 ) + 4885 ( 454 4 805 0 2693 4 ) + 4886 ( 238 0 808 805 0 0 ) + 4887 ( 16 1 805 0 0 0 ) + 4888 ( 575 0 806 827 0 0 ) + 4889 ( 575 1 806 0 0 0 ) + 4890 ( 1016 1 806 0 0 0 ) + 4891 ( 352 1 806 0 0 0 ) + 4892 ( 352 0 806 807 0 0 ) + 4893 ( 238 1 807 0 0 0 ) + 4894 ( 1102 1 807 0 0 0 ) + 4895 ( 575 0 808 832 0 0 ) + 4896 ( 16 1 808 0 0 0 ) + 4897 ( 1124 4 808 0 2697 5 ) + 4898 ( 575 0 809 815 0 0 ) + 4899 ( 696 0 809 850 0 0 ) + 4900 ( 696 0 809 852 0 0 ) + 4901 ( 948 0 809 811 0 0 ) + 4902 ( 57 1 809 0 0 0 ) + 4903 ( 57 0 809 810 0 0 ) + 4904 ( 238 1 809 0 0 0 ) + 4905 ( 575 0 810 815 0 0 ) + 4906 ( 948 0 810 811 0 0 ) + 4907 ( 366 1 810 0 0 0 ) + 4908 ( 696 0 811 851 0 0 ) + 4909 ( 575 0 811 815 0 0 ) + 4910 ( 696 0 811 850 0 0 ) + 4911 ( 696 0 811 852 0 0 ) + 4912 ( 696 0 811 853 0 0 ) + 4913 ( 1098 0 811 812 0 0 ) + 4914 ( 1098 1 811 0 0 0 ) + 4915 ( 948 1 0 811 0 0 ) + 4916 ( 238 1 811 0 0 0 ) + 4917 ( 575 1 812 0 0 0 ) + 4918 ( 352 1 812 0 0 0 ) + 4919 ( 1098 0 855 812 0 0 ) + 4920 ( 1098 0 854 812 0 0 ) + 4921 ( 1096 1 812 0 0 0 ) + 4922 ( 66 0 812 883 0 0 ) + 4923 ( 66 0 812 884 0 0 ) + 4924 ( 1098 0 853 812 0 0 ) + 4925 ( 696 4 813 0 2702 4 ) + 4926 ( 617 1 813 0 0 0 ) + 4927 ( 458 1 813 0 0 0 ) + 4928 ( 578 1 813 0 0 0 ) + 4929 ( 1013 1 813 0 0 0 ) + 4930 ( 1127 0 813 814 0 0 ) + 4931 ( 1013 1 814 0 0 0 ) + 4932 ( 482 0 917 814 0 0 ) + 4933 ( 482 0 907 814 0 0 ) + 4934 ( 458 1 814 0 0 0 ) + 4935 ( 696 4 814 0 2706 4 ) + 4936 ( 617 1 814 0 0 0 ) + 4937 ( 696 0 815 859 0 0 ) + 4938 ( 719 0 815 820 0 0 ) + 4939 ( 1098 1 815 0 0 0 ) + 4940 ( 1129 1 815 0 0 0 ) + 4941 ( 1129 0 815 818 0 0 ) + 4942 ( 696 0 815 856 0 0 ) + 4943 ( 696 0 815 862 0 0 ) + 4944 ( 696 0 815 857 0 0 ) + 4945 ( 696 0 815 861 0 0 ) + 4946 ( 696 0 815 860 0 0 ) + 4947 ( 696 0 815 858 0 0 ) + 4948 ( 719 0 815 823 0 0 ) + 4949 ( 453 0 816 934 0 0 ) + 4950 ( 453 0 816 930 0 0 ) + 4951 ( 453 0 816 928 0 0 ) + 4952 ( 453 0 816 915 0 0 ) + 4953 ( 55 0 889 816 0 0 ) + 4954 ( 1131 0 873 816 0 0 ) + 4955 ( 1134 1 816 0 0 0 ) + 4956 ( 453 0 816 929 0 0 ) + 4957 ( 1131 0 874 816 0 0 ) + 4958 ( 1131 0 875 816 0 0 ) + 4959 ( 55 0 886 816 0 0 ) + 4960 ( 1131 0 876 816 0 0 ) + 4961 ( 55 0 890 816 0 0 ) + 4962 ( 55 0 887 816 0 0 ) + 4963 ( 55 0 888 816 0 0 ) + 4964 ( 453 0 816 925 0 0 ) + 4965 ( 1132 0 816 817 0 0 ) + 4966 ( 453 0 816 937 0 0 ) + 4967 ( 453 0 816 936 0 0 ) + 4968 ( 617 0 816 837 0 0 ) + 4969 ( 1130 0 816 818 0 0 ) + 4970 ( 453 0 817 915 0 0 ) + 4971 ( 453 0 817 913 0 0 ) + 4972 ( 696 4 817 0 2710 3 ) + 4973 ( 617 0 817 837 0 0 ) + 4974 ( 972 1 817 0 0 0 ) + 4975 ( 696 0 818 873 0 0 ) + 4976 ( 696 0 818 859 0 0 ) + 4977 ( 719 0 818 820 0 0 ) + 4978 ( 972 1 818 0 0 0 ) + 4979 ( 1131 0 818 837 0 0 ) + 4980 ( 696 0 818 879 0 0 ) + 4981 ( 696 0 818 878 0 0 ) + 4982 ( 696 0 818 882 0 0 ) + 4983 ( 696 0 818 876 0 0 ) + 4984 ( 696 0 818 880 0 0 ) + 4985 ( 696 0 818 881 0 0 ) + 4986 ( 696 0 818 877 0 0 ) + 4987 ( 696 0 818 875 0 0 ) + 4988 ( 696 0 818 874 0 0 ) + 4989 ( 1131 0 819 836 0 0 ) + 4990 ( 116 0 819 833 0 0 ) + 4991 ( 116 0 819 831 0 0 ) + 4992 ( 1136 4 819 0 2713 4 ) + 4993 ( 116 1 819 0 0 0 ) + 4994 ( 1131 1 819 0 0 0 ) + 4995 ( 1131 0 819 834 0 0 ) + 4996 ( 1131 0 819 835 0 0 ) + 4997 ( 1131 1 819 0 0 0 ) + 4998 ( 1131 1 819 0 0 0 ) + 4999 ( 1120 0 819 842 0 0 ) + 5000 ( 1138 4 819 0 2717 4 ) + 5001 ( 116 1 819 0 0 0 ) + 5002 ( 1131 1 819 0 0 0 ) + 5003 ( 1140 4 819 0 2721 7 ) + 5004 ( 1131 1 819 0 0 0 ) + 5005 ( 116 0 819 825 0 0 ) + 5006 ( 116 0 819 828 0 0 ) + 5007 ( 1142 0 819 821 0 0 ) + 5008 ( 116 0 819 824 0 0 ) + 5009 ( 972 0 820 822 0 0 ) + 5010 ( 972 0 820 823 0 0 ) + 5011 ( 972 1 820 0 0 0 ) + 5012 ( 1131 0 820 837 0 0 ) + 5013 ( 1131 0 821 840 0 0 ) + 5014 ( 1047 0 821 822 0 0 ) + 5015 ( 1142 0 824 821 0 0 ) + 5016 ( 1144 4 821 0 2728 4 ) + 5017 ( 1131 0 821 838 0 0 ) + 5018 ( 1131 0 822 840 0 0 ) + 5019 ( 1142 0 824 822 0 0 ) + 5020 ( 1144 4 822 0 2732 4 ) + 5021 ( 1131 0 822 839 0 0 ) + 5022 ( 1129 0 823 826 0 0 ) + 5023 ( 1129 0 823 824 0 0 ) + 5024 ( 1098 0 823 827 0 0 ) + 5025 ( 1098 1 823 0 0 0 ) + 5026 ( 1129 1 823 0 0 0 ) + 5027 ( 1144 0 824 826 0 0 ) + 5028 ( 1098 0 824 830 0 0 ) + 5029 ( 1098 0 824 828 0 0 ) + 5030 ( 1144 0 824 825 0 0 ) + 5031 ( 1098 0 825 828 0 0 ) + 5032 ( 1146 0 825 826 0 0 ) + 5033 ( 1140 4 825 0 2736 4 ) + 5034 ( 1140 4 826 0 2740 4 ) + 5035 ( 1098 0 826 830 0 0 ) + 5036 ( 1016 0 827 831 0 0 ) + 5037 ( 1149 0 827 830 0 0 ) + 5038 ( 1149 0 827 829 0 0 ) + 5039 ( 1149 1 827 0 0 0 ) + 5040 ( 1102 1 827 0 0 0 ) + 5041 ( 1016 0 828 831 0 0 ) + 5042 ( 1146 0 828 830 0 0 ) + 5043 ( 1146 0 828 829 0 0 ) + 5044 ( 1136 4 828 0 2744 4 ) + 5045 ( 1102 1 828 0 0 0 ) + 5046 ( 1016 0 829 831 0 0 ) + 5047 ( 1097 0 829 830 0 0 ) + 5048 ( 1102 1 829 0 0 0 ) + 5049 ( 1102 1 830 0 0 0 ) + 5050 ( 1136 4 830 0 2748 4 ) + 5051 ( 1122 1 831 0 0 0 ) + 5052 ( 1150 0 831 833 0 0 ) + 5053 ( 1150 0 831 832 0 0 ) + 5054 ( 1147 0 832 833 0 0 ) + 5055 ( 16 1 832 0 0 0 ) + 5056 ( 1124 4 832 0 2752 4 ) + 5057 ( 116 0 841 833 0 0 ) + 5058 ( 16 1 833 0 0 0 ) + 5059 ( 1124 4 833 0 2756 7 ) + 5060 ( 116 0 842 833 0 0 ) + 5061 ( 453 1 834 0 0 0 ) + 5062 ( 1115 1 834 0 0 0 ) + 5063 ( 253 1 834 0 0 0 ) + 5064 ( 1154 1 834 0 0 0 ) + 5065 ( 1152 4 834 0 2763 4 ) + 5066 ( 453 1 835 0 0 0 ) + 5067 ( 1048 1 835 0 0 0 ) + 5068 ( 253 1 835 0 0 0 ) + 5069 ( 1152 4 835 0 2767 4 ) + 5070 ( 1157 1 835 0 0 0 ) + 5071 ( 1159 0 841 836 0 0 ) + 5072 ( 453 0 836 948 0 0 ) + 5073 ( 226 4 836 0 2771 8 ) + 5074 ( 1131 0 842 836 0 0 ) + 5075 ( 453 0 836 956 0 0 ) + 5076 ( 1008 0 840 836 0 0 ) + 5077 ( 453 0 836 960 0 0 ) + 5078 ( 453 0 837 957 0 0 ) + 5079 ( 972 0 837 840 0 0 ) + 5080 ( 972 0 837 839 0 0 ) + 5081 ( 453 0 837 944 0 0 ) + 5082 ( 972 1 837 0 0 0 ) + 5083 ( 253 0 838 957 0 0 ) + 5084 ( 253 0 838 840 0 0 ) + 5085 ( 1047 0 838 839 0 0 ) + 5086 ( 79 1 838 0 0 0 ) + 5087 ( 1008 1 838 0 0 0 ) + 5088 ( 1008 0 838 946 0 0 ) + 5089 ( 1008 0 838 945 0 0 ) + 5090 ( 1008 1 838 0 0 0 ) + 5091 ( 1008 1 838 0 0 0 ) + 5092 ( 1008 1 838 0 0 0 ) + 5093 ( 1144 4 838 0 2779 6 ) + 5094 ( 253 0 839 957 0 0 ) + 5095 ( 253 0 839 840 0 0 ) + 5096 ( 79 1 839 0 0 0 ) + 5097 ( 972 0 944 839 0 0 ) + 5098 ( 1144 4 839 0 2785 5 ) + 5099 ( 453 0 840 957 0 0 ) + 5100 ( 1008 1 840 0 0 0 ) + 5101 ( 1160 4 841 0 2790 8 ) + 5102 ( 16 1 841 0 0 0 ) + 5103 ( 116 1 841 0 0 0 ) + 5104 ( 1159 1 841 0 0 0 ) + 5105 ( 1159 1 841 0 0 0 ) + 5106 ( 1159 0 841 842 0 0 ) + 5107 ( 1158 0 956 841 0 0 ) + 5108 ( 79 0 841 966 0 0 ) + 5109 ( 79 1 841 0 0 0 ) + 5110 ( 1159 1 841 0 0 0 ) + 5111 ( 1159 1 841 0 0 0 ) + 5112 ( 1159 1 841 0 0 0 ) + 5113 ( 1159 0 841 941 0 0 ) + 5114 ( 1159 1 841 0 0 0 ) + 5115 ( 1138 4 842 0 2798 4 ) + 5116 ( 116 1 842 0 0 0 ) + 5117 ( 1131 1 842 0 0 0 ) + 5118 ( 296 0 843 1154 0 0 ) + 5119 ( 417 1 843 0 0 0 ) + 5120 ( 299 1 843 0 0 0 ) + 5121 ( 299 0 843 847 0 0 ) + 5122 ( 299 1 843 0 0 0 ) + 5123 ( 66 4 843 0 2802 6 ) + 5124 ( 1164 0 843 845 0 0 ) + 5125 ( 296 1 843 0 0 0 ) + 5126 ( 296 1 843 0 0 0 ) + 5127 ( 1027 0 844 845 0 0 ) + 5128 ( 299 0 844 846 0 0 ) + 5129 ( 1118 0 844 967 0 0 ) + 5130 ( 1096 1 844 0 0 0 ) + 5131 ( 66 4 844 0 2808 7 ) + 5132 ( 417 1 844 0 0 0 ) + 5133 ( 1027 1 844 0 0 0 ) + 5134 ( 1096 1 844 0 0 0 ) + 5135 ( 1096 0 844 849 0 0 ) + 5136 ( 299 1 844 0 0 0 ) + 5137 ( 299 1 844 0 0 0 ) + 5138 ( 417 1 845 0 0 0 ) + 5139 ( 299 0 845 848 0 0 ) + 5140 ( 299 1 845 0 0 0 ) + 5141 ( 66 4 845 0 2815 4 ) + 5142 ( 296 1 845 0 0 0 ) + 5143 ( 1169 1 846 0 0 0 ) + 5144 ( 329 1 846 0 0 0 ) + 5145 ( 66 4 846 0 2819 5 ) + 5146 ( 299 0 849 846 0 0 ) + 5147 ( 1016 1 846 0 0 0 ) + 5148 ( 1172 1 846 0 0 0 ) + 5149 ( 1174 1 846 0 0 0 ) + 5150 ( 1164 0 847 848 0 0 ) + 5151 ( 621 1 847 0 0 0 ) + 5152 ( 1172 1 847 0 0 0 ) + 5153 ( 66 4 847 0 2824 4 ) + 5154 ( 329 1 847 0 0 0 ) + 5155 ( 1027 1 0 848 0 0 ) + 5156 ( 1172 1 848 0 0 0 ) + 5157 ( 66 4 848 0 2828 4 ) + 5158 ( 329 1 848 0 0 0 ) + 5159 ( 1094 1 849 0 0 0 ) + 5160 ( 66 4 849 0 2832 4 ) + 5161 ( 1174 1 849 0 0 0 ) + 5162 ( 1016 1 849 0 0 0 ) + 5163 ( 575 0 850 872 0 0 ) + 5164 ( 575 0 850 866 0 0 ) + 5165 ( 63 0 854 850 0 0 ) + 5166 ( 1178 0 850 851 0 0 ) + 5167 ( 1178 1 850 0 0 0 ) + 5168 ( 575 1 850 0 0 0 ) + 5169 ( 6 4 850 0 2836 5 ) + 5170 ( 575 0 850 868 0 0 ) + 5171 ( 575 0 850 857 0 0 ) + 5172 ( 575 0 850 856 0 0 ) + 5173 ( 62 0 850 852 0 0 ) + 5174 ( 575 0 851 866 0 0 ) + 5175 ( 575 0 851 856 0 0 ) + 5176 ( 470 4 851 0 2841 6 ) + 5177 ( 62 0 851 852 0 0 ) + 5178 ( 575 0 851 864 0 0 ) + 5179 ( 575 0 851 863 0 0 ) + 5180 ( 1176 0 851 853 0 0 ) + 5181 ( 470 0 852 854 0 0 ) + 5182 ( 238 1 852 0 0 0 ) + 5183 ( 1176 0 852 853 0 0 ) + 5184 ( 575 0 853 867 0 0 ) + 5185 ( 575 0 853 856 0 0 ) + 5186 ( 238 1 853 0 0 0 ) + 5187 ( 470 0 853 854 0 0 ) + 5188 ( 470 0 853 855 0 0 ) + 5189 ( 1098 1 853 0 0 0 ) + 5190 ( 238 1 854 0 0 0 ) + 5191 ( 1098 0 854 883 0 0 ) + 5192 ( 1098 1 854 0 0 0 ) + 5193 ( 63 0 854 884 0 0 ) + 5194 ( 63 1 854 0 0 0 ) + 5195 ( 6 4 854 0 2847 9 ) + 5196 ( 63 0 854 855 0 0 ) + 5197 ( 1177 1 855 0 0 0 ) + 5198 ( 1098 1 855 0 0 0 ) + 5199 ( 1129 1 855 0 0 0 ) + 5200 ( 66 0 855 885 0 0 ) + 5201 ( 470 0 867 855 0 0 ) + 5202 ( 66 0 855 884 0 0 ) + 5203 ( 50 0 856 866 0 0 ) + 5204 ( 1180 0 856 860 0 0 ) + 5205 ( 50 0 856 864 0 0 ) + 5206 ( 50 0 856 863 0 0 ) + 5207 ( 50 0 856 865 0 0 ) + 5208 ( 50 0 856 867 0 0 ) + 5209 ( 1180 0 856 861 0 0 ) + 5210 ( 1180 0 856 857 0 0 ) + 5211 ( 1180 0 856 862 0 0 ) + 5212 ( 1098 1 856 0 0 0 ) + 5213 ( 1129 1 856 0 0 0 ) + 5214 ( 50 0 857 870 0 0 ) + 5215 ( 50 0 857 868 0 0 ) + 5216 ( 50 0 857 866 0 0 ) + 5217 ( 1184 0 857 859 0 0 ) + 5218 ( 1129 0 857 878 0 0 ) + 5219 ( 1129 0 857 880 0 0 ) + 5220 ( 50 0 857 871 0 0 ) + 5221 ( 50 0 857 869 0 0 ) + 5222 ( 1129 0 857 881 0 0 ) + 5223 ( 1129 0 857 877 0 0 ) + 5224 ( 1184 0 857 861 0 0 ) + 5225 ( 1129 0 858 873 0 0 ) + 5226 ( 1190 0 858 859 0 0 ) + 5227 ( 1129 1 858 0 0 0 ) + 5228 ( 50 4 858 0 2856 4 ) + 5229 ( 1188 0 858 860 0 0 ) + 5230 ( 1190 0 873 859 0 0 ) + 5231 ( 50 4 859 0 2860 10 ) + 5232 ( 1186 0 859 861 0 0 ) + 5233 ( 1192 0 859 860 0 0 ) + 5234 ( 476 0 876 859 0 0 ) + 5235 ( 1190 0 882 859 0 0 ) + 5236 ( 1194 0 879 859 0 0 ) + 5237 ( 1196 0 881 859 0 0 ) + 5238 ( 1194 0 878 859 0 0 ) + 5239 ( 1186 0 860 861 0 0 ) + 5240 ( 1182 0 860 862 0 0 ) + 5241 ( 1129 1 860 0 0 0 ) + 5242 ( 50 4 860 0 2870 7 ) + 5243 ( 50 0 861 866 0 0 ) + 5244 ( 50 0 861 869 0 0 ) + 5245 ( 1183 1 862 0 0 0 ) + 5246 ( 470 4 862 0 2877 3 ) + 5247 ( 1129 1 862 0 0 0 ) + 5248 ( 1180 0 863 862 0 0 ) + 5249 ( 1169 0 863 866 0 0 ) + 5250 ( 1008 0 863 864 0 0 ) + 5251 ( 1180 1 863 0 0 0 ) + 5252 ( 470 4 863 0 2880 7 ) + 5253 ( 1129 1 863 0 0 0 ) + 5254 ( 1169 0 863 865 0 0 ) + 5255 ( 1176 0 864 867 0 0 ) + 5256 ( 470 4 864 0 2887 4 ) + 5257 ( 1129 1 864 0 0 0 ) + 5258 ( 1198 0 865 866 0 0 ) + 5259 ( 1180 0 865 869 0 0 ) + 5260 ( 1180 1 865 0 0 0 ) + 5261 ( 470 4 865 0 2891 4 ) + 5262 ( 470 4 866 0 2895 7 ) + 5263 ( 852 0 868 866 0 0 ) + 5264 ( 1198 0 869 866 0 0 ) + 5265 ( 1198 0 870 866 0 0 ) + 5266 ( 1098 1 867 0 0 0 ) + 5267 ( 1129 1 867 0 0 0 ) + 5268 ( 470 0 868 872 0 0 ) + 5269 ( 852 0 868 870 0 0 ) + 5270 ( 1129 0 868 877 0 0 ) + 5271 ( 1187 0 869 871 0 0 ) + 5272 ( 1117 0 869 870 0 0 ) + 5273 ( 1187 1 869 0 0 0 ) + 5274 ( 470 4 869 0 2902 5 ) + 5275 ( 470 4 870 0 2907 5 ) + 5276 ( 1117 0 871 870 0 0 ) + 5277 ( 1129 0 870 880 0 0 ) + 5278 ( 1129 0 871 881 0 0 ) + 5279 ( 1129 0 871 878 0 0 ) + 5280 ( 470 4 871 0 2912 5 ) + 5281 ( 1184 1 871 0 0 0 ) + 5282 ( 476 0 874 872 0 0 ) + 5283 ( 852 1 872 0 0 0 ) + 5284 ( 6 4 872 0 2917 4 ) + 5285 ( 470 0 877 872 0 0 ) + 5286 ( 50 4 873 0 2921 7 ) + 5287 ( 972 1 873 0 0 0 ) + 5288 ( 1131 0 873 887 0 0 ) + 5289 ( 1131 0 873 888 0 0 ) + 5290 ( 1200 0 873 882 0 0 ) + 5291 ( 1200 0 873 876 0 0 ) + 5292 ( 1194 0 874 875 0 0 ) + 5293 ( 1194 1 874 0 0 0 ) + 5294 ( 476 1 874 0 0 0 ) + 5295 ( 1131 0 874 893 0 0 ) + 5296 ( 6 4 874 0 2928 6 ) + 5297 ( 476 0 874 877 0 0 ) + 5298 ( 1131 0 874 891 0 0 ) + 5299 ( 476 0 874 880 0 0 ) + 5300 ( 476 0 874 879 0 0 ) + 5301 ( 1194 0 874 876 0 0 ) + 5302 ( 1131 0 874 886 0 0 ) + 5303 ( 1204 1 875 0 0 0 ) + 5304 ( 1131 0 875 893 0 0 ) + 5305 ( 6 4 875 0 2934 3 ) + 5306 ( 1131 0 875 891 0 0 ) + 5307 ( 1202 0 875 876 0 0 ) + 5308 ( 1131 0 875 886 0 0 ) + 5309 ( 1131 0 876 890 0 0 ) + 5310 ( 476 0 876 882 0 0 ) + 5311 ( 50 4 876 0 2937 6 ) + 5312 ( 852 0 877 880 0 0 ) + 5313 ( 1194 0 878 881 0 0 ) + 5314 ( 117 0 878 879 0 0 ) + 5315 ( 470 4 878 0 2943 5 ) + 5316 ( 1194 1 878 0 0 0 ) + 5317 ( 1117 0 878 880 0 0 ) + 5318 ( 470 4 879 0 2948 4 ) + 5319 ( 1194 1 879 0 0 0 ) + 5320 ( 1117 0 879 880 0 0 ) + 5321 ( 470 4 880 0 2952 5 ) + 5322 ( 470 4 881 0 2957 3 ) + 5323 ( 1184 1 881 0 0 0 ) + 5324 ( 50 4 882 0 2960 3 ) + 5325 ( 6 4 883 0 2963 4 ) + 5326 ( 63 0 883 884 0 0 ) + 5327 ( 1096 1 883 0 0 0 ) + 5328 ( 352 1 883 0 0 0 ) + 5329 ( 6 4 884 0 2967 6 ) + 5330 ( 575 0 884 885 0 0 ) + 5331 ( 575 1 884 0 0 0 ) + 5332 ( 1096 1 884 0 0 0 ) + 5333 ( 1177 1 884 0 0 0 ) + 5334 ( 6 4 885 0 2973 4 ) + 5335 ( 1177 1 885 0 0 0 ) + 5336 ( 1098 1 885 0 0 0 ) + 5337 ( 1129 1 885 0 0 0 ) + 5338 ( 55 0 886 930 0 0 ) + 5339 ( 55 0 886 928 0 0 ) + 5340 ( 50 0 886 892 0 0 ) + 5341 ( 50 0 886 891 0 0 ) + 5342 ( 1208 0 886 890 0 0 ) + 5343 ( 55 1 886 0 0 0 ) + 5344 ( 55 0 886 929 0 0 ) + 5345 ( 55 1 886 0 0 0 ) + 5346 ( 79 1 886 0 0 0 ) + 5347 ( 79 0 886 902 0 0 ) + 5348 ( 972 1 886 0 0 0 ) + 5349 ( 1208 0 886 894 0 0 ) + 5350 ( 1208 0 886 895 0 0 ) + 5351 ( 50 0 886 896 0 0 ) + 5352 ( 50 0 886 899 0 0 ) + 5353 ( 50 0 886 897 0 0 ) + 5354 ( 50 0 886 898 0 0 ) + 5355 ( 1210 0 887 889 0 0 ) + 5356 ( 1210 0 887 888 0 0 ) + 5357 ( 50 4 887 0 2977 4 ) + 5358 ( 1200 0 887 890 0 0 ) + 5359 ( 1213 0 888 889 0 0 ) + 5360 ( 50 4 888 0 2981 4 ) + 5361 ( 55 1 888 0 0 0 ) + 5362 ( 972 1 888 0 0 0 ) + 5363 ( 1215 0 889 890 0 0 ) + 5364 ( 972 1 889 0 0 0 ) + 5365 ( 55 1 889 0 0 0 ) + 5366 ( 50 4 889 0 2985 6 ) + 5367 ( 1216 0 894 889 0 0 ) + 5368 ( 55 0 889 929 0 0 ) + 5369 ( 1218 0 895 889 0 0 ) + 5370 ( 55 1 890 0 0 0 ) + 5371 ( 55 0 890 929 0 0 ) + 5372 ( 55 0 890 928 0 0 ) + 5373 ( 50 4 890 0 2991 7 ) + 5374 ( 1218 0 895 890 0 0 ) + 5375 ( 470 0 891 893 0 0 ) + 5376 ( 1026 0 891 892 0 0 ) + 5377 ( 1220 0 896 891 0 0 ) + 5378 ( 1204 1 891 0 0 0 ) + 5379 ( 470 4 892 0 2998 6 ) + 5380 ( 1220 0 896 892 0 0 ) + 5381 ( 1223 0 897 892 0 0 ) + 5382 ( 1223 0 898 892 0 0 ) + 5383 ( 1204 1 892 0 0 0 ) + 5384 ( 1223 0 899 892 0 0 ) + 5385 ( 1026 0 893 901 0 0 ) + 5386 ( 1026 1 893 0 0 0 ) + 5387 ( 79 0 893 902 0 0 ) + 5388 ( 79 0 893 903 0 0 ) + 5389 ( 6 4 893 0 3004 10 ) + 5390 ( 470 0 896 893 0 0 ) + 5391 ( 1204 1 893 0 0 0 ) + 5392 ( 50 0 894 898 0 0 ) + 5393 ( 50 0 894 897 0 0 ) + 5394 ( 1216 0 894 895 0 0 ) + 5395 ( 55 1 894 0 0 0 ) + 5396 ( 50 0 894 900 0 0 ) + 5397 ( 972 1 894 0 0 0 ) + 5398 ( 50 0 895 898 0 0 ) + 5399 ( 50 0 895 897 0 0 ) + 5400 ( 55 0 895 928 0 0 ) + 5401 ( 55 0 895 929 0 0 ) + 5402 ( 55 1 895 0 0 0 ) + 5403 ( 1220 0 896 898 0 0 ) + 5404 ( 972 1 896 0 0 0 ) + 5405 ( 470 0 896 901 0 0 ) + 5406 ( 79 0 896 902 0 0 ) + 5407 ( 79 1 896 0 0 0 ) + 5408 ( 79 0 896 903 0 0 ) + 5409 ( 1225 0 897 898 0 0 ) + 5410 ( 1218 0 897 899 0 0 ) + 5411 ( 470 4 897 0 3014 6 ) + 5412 ( 1218 1 897 0 0 0 ) + 5413 ( 1218 0 897 900 0 0 ) + 5414 ( 972 1 897 0 0 0 ) + 5415 ( 470 4 898 0 3020 4 ) + 5416 ( 972 1 898 0 0 0 ) + 5417 ( 470 4 899 0 3024 3 ) + 5418 ( 1204 1 899 0 0 0 ) + 5419 ( 470 4 900 0 3027 3 ) + 5420 ( 972 1 900 0 0 0 ) + 5421 ( 1226 1 900 0 0 0 ) + 5422 ( 6 4 901 0 3030 4 ) + 5423 ( 79 0 901 903 0 0 ) + 5424 ( 972 1 901 0 0 0 ) + 5425 ( 1220 1 901 0 0 0 ) + 5426 ( 55 0 902 930 0 0 ) + 5427 ( 6 4 902 0 3034 5 ) + 5428 ( 55 1 902 0 0 0 ) + 5429 ( 888 1 902 0 0 0 ) + 5430 ( 6 4 903 0 3039 5 ) + 5431 ( 49 1 903 0 0 0 ) + 5432 ( 49 0 903 904 0 0 ) + 5433 ( 972 1 903 0 0 0 ) + 5434 ( 461 1 903 0 0 0 ) + 5435 ( 461 1 904 0 0 0 ) + 5436 ( 461 0 904 905 0 0 ) + 5437 ( 972 1 904 0 0 0 ) + 5438 ( 992 4 904 0 3044 6 ) + 5439 ( 991 0 905 906 0 0 ) + 5440 ( 49 1 0 905 0 0 ) + 5441 ( 972 1 905 0 0 0 ) + 5442 ( 853 1 905 0 0 0 ) + 5443 ( 972 1 906 0 0 0 ) + 5444 ( 48 1 906 0 0 0 ) + 5445 ( 853 1 906 0 0 0 ) + 5446 ( 79 0 907 927 0 0 ) + 5447 ( 1230 0 907 918 0 0 ) + 5448 ( 696 4 907 0 3050 9 ) + 5449 ( 79 1 907 0 0 0 ) + 5450 ( 482 1 907 0 0 0 ) + 5451 ( 482 1 907 0 0 0 ) + 5452 ( 1230 0 907 924 0 0 ) + 5453 ( 1230 0 907 923 0 0 ) + 5454 ( 1233 1 907 0 0 0 ) + 5455 ( 1233 0 907 917 0 0 ) + 5456 ( 1233 1 907 0 0 0 ) + 5457 ( 1233 0 907 916 0 0 ) + 5458 ( 1235 0 907 914 0 0 ) + 5459 ( 494 0 908 909 0 0 ) + 5460 ( 696 4 908 0 3059 5 ) + 5461 ( 79 1 908 0 0 0 ) + 5462 ( 1233 0 908 915 0 0 ) + 5463 ( 972 0 908 914 0 0 ) + 5464 ( 494 0 908 911 0 0 ) + 5465 ( 853 0 908 935 0 0 ) + 5466 ( 853 0 908 937 0 0 ) + 5467 ( 853 0 909 932 0 0 ) + 5468 ( 1169 0 911 909 0 0 ) + 5469 ( 696 4 909 0 3064 5 ) + 5470 ( 1233 0 909 915 0 0 ) + 5471 ( 1237 0 912 909 0 0 ) + 5472 ( 853 0 909 937 0 0 ) + 5473 ( 1236 0 909 910 0 0 ) + 5474 ( 853 0 910 934 0 0 ) + 5475 ( 1178 0 910 912 0 0 ) + 5476 ( 1178 0 910 913 0 0 ) + 5477 ( 482 0 910 925 0 0 ) + 5478 ( 853 0 910 937 0 0 ) + 5479 ( 696 0 910 928 0 0 ) + 5480 ( 1233 0 910 915 0 0 ) + 5481 ( 1169 0 911 912 0 0 ) + 5482 ( 1238 0 911 913 0 0 ) + 5483 ( 696 4 911 0 3069 5 ) + 5484 ( 1233 0 911 915 0 0 ) + 5485 ( 972 0 911 914 0 0 ) + 5486 ( 696 4 912 0 3074 4 ) + 5487 ( 1233 0 912 915 0 0 ) + 5488 ( 1240 0 912 913 0 0 ) + 5489 ( 1233 0 913 915 0 0 ) + 5490 ( 696 4 913 0 3078 6 ) + 5491 ( 972 1 913 0 0 0 ) + 5492 ( 1134 0 925 913 0 0 ) + 5493 ( 696 4 914 0 3084 5 ) + 5494 ( 79 1 914 0 0 0 ) + 5495 ( 482 1 914 0 0 0 ) + 5496 ( 1233 1 914 0 0 0 ) + 5497 ( 972 1 915 0 0 0 ) + 5498 ( 853 0 915 937 0 0 ) + 5499 ( 617 0 915 944 0 0 ) + 5500 ( 1233 0 925 915 0 0 ) + 5501 ( 79 1 915 0 0 0 ) + 5502 ( 617 1 916 0 0 0 ) + 5503 ( 79 1 916 0 0 0 ) + 5504 ( 482 1 916 0 0 0 ) + 5505 ( 1114 1 916 0 0 0 ) + 5506 ( 1009 1 916 0 0 0 ) + 5507 ( 1230 0 917 918 0 0 ) + 5508 ( 617 1 917 0 0 0 ) + 5509 ( 79 0 917 927 0 0 ) + 5510 ( 482 1 917 0 0 0 ) + 5511 ( 482 1 917 0 0 0 ) + 5512 ( 1230 0 917 924 0 0 ) + 5513 ( 1230 0 917 923 0 0 ) + 5514 ( 977 1 917 0 0 0 ) + 5515 ( 1242 1 918 0 0 0 ) + 5516 ( 572 0 923 918 0 0 ) + 5517 ( 1002 1 918 0 0 0 ) + 5518 ( 696 4 918 0 3089 8 ) + 5519 ( 482 1 918 0 0 0 ) + 5520 ( 1002 1 918 0 0 0 ) + 5521 ( 1002 0 918 922 0 0 ) + 5522 ( 1002 1 918 0 0 0 ) + 5523 ( 1002 0 918 921 0 0 ) + 5524 ( 1242 1 918 0 0 0 ) + 5525 ( 1242 0 918 920 0 0 ) + 5526 ( 1242 1 918 0 0 0 ) + 5527 ( 1242 0 918 919 0 0 ) + 5528 ( 617 1 919 0 0 0 ) + 5529 ( 1002 0 919 921 0 0 ) + 5530 ( 561 1 919 0 0 0 ) + 5531 ( 1228 1 919 0 0 0 ) + 5532 ( 1240 1 919 0 0 0 ) + 5533 ( 617 1 920 0 0 0 ) + 5534 ( 559 1 920 0 0 0 ) + 5535 ( 1002 0 920 922 0 0 ) + 5536 ( 1228 1 920 0 0 0 ) + 5537 ( 1244 1 920 0 0 0 ) + 5538 ( 696 4 921 0 3097 4 ) + 5539 ( 561 1 921 0 0 0 ) + 5540 ( 984 1 921 0 0 0 ) + 5541 ( 1228 1 921 0 0 0 ) + 5542 ( 1240 1 921 0 0 0 ) + 5543 ( 696 4 922 0 3101 4 ) + 5544 ( 559 1 922 0 0 0 ) + 5545 ( 984 1 922 0 0 0 ) + 5546 ( 1228 1 922 0 0 0 ) + 5547 ( 1244 1 922 0 0 0 ) + 5548 ( 617 1 923 0 0 0 ) + 5549 ( 696 4 923 0 3105 6 ) + 5550 ( 495 1 923 0 0 0 ) + 5551 ( 495 0 923 924 0 0 ) + 5552 ( 495 1 923 0 0 0 ) + 5553 ( 572 1 923 0 0 0 ) + 5554 ( 572 1 923 0 0 0 ) + 5555 ( 1228 1 923 0 0 0 ) + 5556 ( 984 1 923 0 0 0 ) + 5557 ( 79 0 924 927 0 0 ) + 5558 ( 696 4 924 0 3111 4 ) + 5559 ( 1002 1 924 0 0 0 ) + 5560 ( 1242 1 924 0 0 0 ) + 5561 ( 853 0 925 934 0 0 ) + 5562 ( 696 0 925 928 0 0 ) + 5563 ( 696 0 925 929 0 0 ) + 5564 ( 853 0 925 937 0 0 ) + 5565 ( 1246 0 926 927 0 0 ) + 5566 ( 984 1 926 0 0 0 ) + 5567 ( 977 1 926 0 0 0 ) + 5568 ( 978 4 926 0 3115 5 ) + 5569 ( 617 1 926 0 0 0 ) + 5570 ( 1246 1 926 0 0 0 ) + 5571 ( 1246 1 926 0 0 0 ) + 5572 ( 1246 1 926 0 0 0 ) + 5573 ( 1242 1 927 0 0 0 ) + 5574 ( 977 1 927 0 0 0 ) + 5575 ( 1002 1 927 0 0 0 ) + 5576 ( 696 4 927 0 3120 5 ) + 5577 ( 617 1 927 0 0 0 ) + 5578 ( 696 0 934 928 0 0 ) + 5579 ( 802 0 930 928 0 0 ) + 5580 ( 1237 1 928 0 0 0 ) + 5581 ( 1178 1 928 0 0 0 ) + 5582 ( 1178 0 928 929 0 0 ) + 5583 ( 1134 1 929 0 0 0 ) + 5584 ( 802 1 930 0 0 0 ) + 5585 ( 802 0 930 933 0 0 ) + 5586 ( 802 0 930 934 0 0 ) + 5587 ( 175 0 930 936 0 0 ) + 5588 ( 494 0 931 932 0 0 ) + 5589 ( 696 4 931 0 3125 5 ) + 5590 ( 175 0 931 936 0 0 ) + 5591 ( 888 1 931 0 0 0 ) + 5592 ( 415 0 931 933 0 0 ) + 5593 ( 888 0 931 935 0 0 ) + 5594 ( 1236 0 932 934 0 0 ) + 5595 ( 175 0 932 937 0 0 ) + 5596 ( 696 4 932 0 3130 5 ) + 5597 ( 494 0 935 932 0 0 ) + 5598 ( 175 0 932 936 0 0 ) + 5599 ( 415 0 932 933 0 0 ) + 5600 ( 175 0 933 936 0 0 ) + 5601 ( 696 4 933 0 3135 5 ) + 5602 ( 1236 0 933 934 0 0 ) + 5603 ( 175 0 934 937 0 0 ) + 5604 ( 175 0 934 936 0 0 ) + 5605 ( 696 4 935 0 3140 4 ) + 5606 ( 175 0 935 937 0 0 ) + 5607 ( 79 1 935 0 0 0 ) + 5608 ( 617 0 936 939 0 0 ) + 5609 ( 617 0 936 944 0 0 ) + 5610 ( 888 1 936 0 0 0 ) + 5611 ( 888 0 936 937 0 0 ) + 5612 ( 617 0 937 944 0 0 ) + 5613 ( 79 1 937 0 0 0 ) + 5614 ( 16 1 938 0 0 0 ) + 5615 ( 443 1 938 0 0 0 ) + 5616 ( 853 1 938 0 0 0 ) + 5617 ( 968 4 938 0 3144 6 ) + 5618 ( 48 1 938 0 0 0 ) + 5619 ( 78 0 939 957 0 0 ) + 5620 ( 888 1 939 0 0 0 ) + 5621 ( 888 1 939 0 0 0 ) + 5622 ( 79 0 944 939 0 0 ) + 5623 ( 253 0 940 952 0 0 ) + 5624 ( 1120 0 940 941 0 0 ) + 5625 ( 1152 4 940 0 3150 6 ) + 5626 ( 1251 1 940 0 0 0 ) + 5627 ( 1249 0 940 942 0 0 ) + 5628 ( 1249 1 940 0 0 0 ) + 5629 ( 1220 0 940 943 0 0 ) + 5630 ( 1220 1 940 0 0 0 ) + 5631 ( 253 1 940 0 0 0 ) + 5632 ( 1240 1 941 0 0 0 ) + 5633 ( 1152 4 941 0 3156 6 ) + 5634 ( 1121 0 941 943 0 0 ) + 5635 ( 253 1 941 0 0 0 ) + 5636 ( 495 1 941 0 0 0 ) + 5637 ( 1121 0 941 942 0 0 ) + 5638 ( 253 1 942 0 0 0 ) + 5639 ( 1152 4 942 0 3162 3 ) + 5640 ( 1252 1 942 0 0 0 ) + 5641 ( 253 1 943 0 0 0 ) + 5642 ( 1152 4 943 0 3165 3 ) + 5643 ( 1254 1 943 0 0 0 ) + 5644 ( 253 0 944 957 0 0 ) + 5645 ( 79 1 944 0 0 0 ) + 5646 ( 972 1 944 0 0 0 ) + 5647 ( 253 1 945 0 0 0 ) + 5648 ( 513 1 945 0 0 0 ) + 5649 ( 1152 4 945 0 3168 4 ) + 5650 ( 1240 1 945 0 0 0 ) + 5651 ( 1176 1 945 0 0 0 ) + 5652 ( 253 1 946 0 0 0 ) + 5653 ( 1176 1 946 0 0 0 ) + 5654 ( 495 1 946 0 0 0 ) + 5655 ( 1152 4 946 0 3172 4 ) + 5656 ( 1256 1 946 0 0 0 ) + 5657 ( 226 0 947 950 0 0 ) + 5658 ( 495 0 947 964 0 0 ) + 5659 ( 226 0 947 953 0 0 ) + 5660 ( 1048 0 947 955 0 0 ) + 5661 ( 1115 0 947 959 0 0 ) + 5662 ( 1240 0 947 949 0 0 ) + 5663 ( 226 0 947 952 0 0 ) + 5664 ( 226 0 947 951 0 0 ) + 5665 ( 483 0 948 949 0 0 ) + 5666 ( 1177 0 948 960 0 0 ) + 5667 ( 226 4 948 0 3176 6 ) + 5668 ( 483 0 948 958 0 0 ) + 5669 ( 1120 0 948 956 0 0 ) + 5670 ( 483 0 948 954 0 0 ) + 5671 ( 986 0 958 949 0 0 ) + 5672 ( 226 4 949 0 3182 7 ) + 5673 ( 1240 0 959 949 0 0 ) + 5674 ( 967 0 954 949 0 0 ) + 5675 ( 1240 0 955 949 0 0 ) + 5676 ( 1240 1 950 0 0 0 ) + 5677 ( 1258 4 950 0 3189 6 ) + 5678 ( 1115 1 950 0 0 0 ) + 5679 ( 1251 0 953 950 0 0 ) + 5680 ( 1250 0 950 952 0 0 ) + 5681 ( 1250 0 950 951 0 0 ) + 5682 ( 495 1 950 0 0 0 ) + 5683 ( 1248 0 951 952 0 0 ) + 5684 ( 1048 1 951 0 0 0 ) + 5685 ( 1258 4 951 0 3195 4 ) + 5686 ( 495 1 951 0 0 0 ) + 5687 ( 1249 1 952 0 0 0 ) + 5688 ( 1220 1 952 0 0 0 ) + 5689 ( 1251 1 952 0 0 0 ) + 5690 ( 1048 1 952 0 0 0 ) + 5691 ( 1220 0 952 953 0 0 ) + 5692 ( 1258 4 953 0 3199 4 ) + 5693 ( 1048 1 953 0 0 0 ) + 5694 ( 1240 1 953 0 0 0 ) + 5695 ( 79 0 954 961 0 0 ) + 5696 ( 1120 0 954 956 0 0 ) + 5697 ( 967 0 954 955 0 0 ) + 5698 ( 226 4 954 0 3203 5 ) + 5699 ( 79 0 955 961 0 0 ) + 5700 ( 226 4 955 0 3208 7 ) + 5701 ( 1048 0 964 955 0 0 ) + 5702 ( 1120 0 961 956 0 0 ) + 5703 ( 1260 0 965 956 0 0 ) + 5704 ( 226 4 956 0 3215 8 ) + 5705 ( 1159 0 966 956 0 0 ) + 5706 ( 1008 0 957 960 0 0 ) + 5707 ( 78 0 963 957 0 0 ) + 5708 ( 1008 1 957 0 0 0 ) + 5709 ( 79 1 957 0 0 0 ) + 5710 ( 1177 0 958 960 0 0 ) + 5711 ( 986 0 958 959 0 0 ) + 5712 ( 78 0 961 958 0 0 ) + 5713 ( 226 4 958 0 3223 5 ) + 5714 ( 226 4 959 0 3228 5 ) + 5715 ( 78 0 961 959 0 0 ) + 5716 ( 1115 0 964 959 0 0 ) + 5717 ( 1260 0 962 960 0 0 ) + 5718 ( 226 4 960 0 3233 7 ) + 5719 ( 1177 0 961 960 0 0 ) + 5720 ( 1008 0 963 960 0 0 ) + 5721 ( 226 4 961 0 3240 10 ) + 5722 ( 1120 0 961 965 0 0 ) + 5723 ( 78 0 961 964 0 0 ) + 5724 ( 1177 0 961 962 0 0 ) + 5725 ( 1260 0 962 963 0 0 ) + 5726 ( 226 4 962 0 3250 5 ) + 5727 ( 226 4 963 0 3255 4 ) + 5728 ( 226 4 964 0 3259 5 ) + 5729 ( 1260 0 965 966 0 0 ) + 5730 ( 16 1 965 0 0 0 ) + 5731 ( 226 4 965 0 3264 5 ) + 5732 ( 226 4 966 0 3269 4 ) + 5733 ( 16 1 966 0 0 0 ) + 5734 ( 1262 0 967 1015 0 0 ) + 5735 ( 1262 1 967 0 0 0 ) + 5736 ( 1027 1 967 0 0 0 ) + 5737 ( 417 1 967 0 0 0 ) + 5738 ( 66 4 967 0 3273 4 ) + 5739 ( 1096 1 967 0 0 0 ) + 5740 ( 1267 0 968 998 0 0 ) + 5741 ( 1270 0 968 975 0 0 ) + 5742 ( 1270 0 968 978 0 0 ) + 5743 ( 1270 0 968 979 0 0 ) + 5744 ( 1270 0 968 980 0 0 ) + 5745 ( 1270 1 968 0 0 0 ) + 5746 ( 1267 0 968 1002 0 0 ) + 5747 ( 1117 0 968 1141 0 0 ) + 5748 ( 6 4 968 0 3277 9 ) + 5749 ( 2 0 968 1392 0 0 ) + 5750 ( 2 0 968 1393 0 0 ) + 5751 ( 1270 0 968 976 0 0 ) + 5752 ( 1270 0 968 970 0 0 ) + 5753 ( 1270 0 968 969 0 0 ) + 5754 ( 659 0 968 997 0 0 ) + 5755 ( 1274 0 969 993 0 0 ) + 5756 ( 1274 0 969 989 0 0 ) + 5757 ( 1274 0 969 986 0 0 ) + 5758 ( 1276 0 969 976 0 0 ) + 5759 ( 659 0 969 997 0 0 ) + 5760 ( 1274 1 969 0 0 0 ) + 5761 ( 902 0 969 984 0 0 ) + 5762 ( 902 0 969 983 0 0 ) + 5763 ( 1276 0 969 981 0 0 ) + 5764 ( 1267 0 969 998 0 0 ) + 5765 ( 902 0 969 979 0 0 ) + 5766 ( 1278 0 970 975 0 0 ) + 5767 ( 1278 0 970 977 0 0 ) + 5768 ( 902 0 970 978 0 0 ) + 5769 ( 902 0 970 980 0 0 ) + 5770 ( 659 0 970 997 0 0 ) + 5771 ( 2 0 970 1392 0 0 ) + 5772 ( 1268 0 971 992 0 0 ) + 5773 ( 1282 0 971 974 0 0 ) + 5774 ( 1282 1 971 0 0 0 ) + 5775 ( 1281 0 978 971 0 0 ) + 5776 ( 1268 1 971 0 0 0 ) + 5777 ( 6 4 971 0 3286 3 ) + 5778 ( 659 0 971 997 0 0 ) + 5779 ( 1280 0 971 977 0 0 ) + 5780 ( 1268 0 972 992 0 0 ) + 5781 ( 1288 0 972 975 0 0 ) + 5782 ( 1292 0 972 974 0 0 ) + 5783 ( 1292 0 972 973 0 0 ) + 5784 ( 1268 0 972 982 0 0 ) + 5785 ( 1284 0 972 976 0 0 ) + 5786 ( 659 0 972 997 0 0 ) + 5787 ( 1268 1 972 0 0 0 ) + 5788 ( 902 4 972 0 3289 6 ) + 5789 ( 1294 0 973 974 0 0 ) + 5790 ( 1268 0 973 992 0 0 ) + 5791 ( 902 4 973 0 3295 3 ) + 5792 ( 1268 1 973 0 0 0 ) + 5793 ( 659 0 973 997 0 0 ) + 5794 ( 1268 0 974 992 0 0 ) + 5795 ( 1297 0 974 975 0 0 ) + 5796 ( 659 0 974 997 0 0 ) + 5797 ( 1268 1 974 0 0 0 ) + 5798 ( 902 4 974 0 3298 6 ) + 5799 ( 1280 0 974 977 0 0 ) + 5800 ( 1280 0 975 977 0 0 ) + 5801 ( 659 0 975 997 0 0 ) + 5802 ( 902 4 975 0 3304 6 ) + 5803 ( 1299 0 975 976 0 0 ) + 5804 ( 1274 0 976 993 0 0 ) + 5805 ( 1274 0 976 992 0 0 ) + 5806 ( 1300 0 981 976 0 0 ) + 5807 ( 659 0 976 997 0 0 ) + 5808 ( 1274 1 976 0 0 0 ) + 5809 ( 902 4 976 0 3310 8 ) + 5810 ( 1284 0 982 976 0 0 ) + 5811 ( 1268 0 977 996 0 0 ) + 5812 ( 1268 0 977 992 0 0 ) + 5813 ( 2 0 977 1392 0 0 ) + 5814 ( 659 0 977 997 0 0 ) + 5815 ( 1268 1 977 0 0 0 ) + 5816 ( 902 0 977 978 0 0 ) + 5817 ( 1268 0 978 996 0 0 ) + 5818 ( 2 0 978 1392 0 0 ) + 5819 ( 6 4 978 0 3318 7 ) + 5820 ( 1268 1 978 0 0 0 ) + 5821 ( 1281 1 978 0 0 0 ) + 5822 ( 1281 0 978 980 0 0 ) + 5823 ( 1267 0 979 998 0 0 ) + 5824 ( 6 4 979 0 3325 5 ) + 5825 ( 1268 0 979 984 0 0 ) + 5826 ( 1268 0 979 983 0 0 ) + 5827 ( 1272 1 979 0 0 0 ) + 5828 ( 6 4 980 0 3330 3 ) + 5829 ( 1302 1 980 0 0 0 ) + 5830 ( 1274 0 981 993 0 0 ) + 5831 ( 659 0 981 997 0 0 ) + 5832 ( 1274 1 981 0 0 0 ) + 5833 ( 902 0 981 983 0 0 ) + 5834 ( 1274 0 982 992 0 0 ) + 5835 ( 902 4 982 0 3333 3 ) + 5836 ( 1274 1 982 0 0 0 ) + 5837 ( 659 0 982 997 0 0 ) + 5838 ( 1267 0 983 998 0 0 ) + 5839 ( 1274 0 983 989 0 0 ) + 5840 ( 1274 0 983 986 0 0 ) + 5841 ( 6 4 983 0 3336 7 ) + 5842 ( 1274 1 983 0 0 0 ) + 5843 ( 1300 1 983 0 0 0 ) + 5844 ( 1300 0 983 984 0 0 ) + 5845 ( 6 4 984 0 3343 3 ) + 5846 ( 1272 1 984 0 0 0 ) + 5847 ( 1305 0 985 996 0 0 ) + 5848 ( 1305 0 985 995 0 0 ) + 5849 ( 1305 0 985 988 0 0 ) + 5850 ( 1305 0 985 987 0 0 ) + 5851 ( 1305 0 985 986 0 0 ) + 5852 ( 1267 0 985 999 0 0 ) + 5853 ( 2 0 985 1392 0 0 ) + 5854 ( 6 4 985 0 3346 8 ) + 5855 ( 1267 1 985 0 0 0 ) + 5856 ( 1267 0 985 1001 0 0 ) + 5857 ( 659 1 985 0 0 0 ) + 5858 ( 659 0 985 997 0 0 ) + 5859 ( 1305 1 985 0 0 0 ) + 5860 ( 1306 1 985 0 0 0 ) + 5861 ( 1267 0 986 998 0 0 ) + 5862 ( 1308 0 986 993 0 0 ) + 5863 ( 1308 0 986 989 0 0 ) + 5864 ( 1308 0 986 988 0 0 ) + 5865 ( 1308 1 986 0 0 0 ) + 5866 ( 1267 1 986 0 0 0 ) + 5867 ( 6 4 986 0 3354 7 ) + 5868 ( 1267 0 986 999 0 0 ) + 5869 ( 1267 0 986 1000 0 0 ) + 5870 ( 1308 0 986 994 0 0 ) + 5871 ( 659 0 986 997 0 0 ) + 5872 ( 1311 0 996 987 0 0 ) + 5873 ( 1312 0 987 995 0 0 ) + 5874 ( 1312 0 987 991 0 0 ) + 5875 ( 1312 1 987 0 0 0 ) + 5876 ( 6 4 987 0 3361 3 ) + 5877 ( 659 0 987 997 0 0 ) + 5878 ( 1314 0 988 995 0 0 ) + 5879 ( 1314 1 988 0 0 0 ) + 5880 ( 6 4 988 0 3364 3 ) + 5881 ( 1314 0 988 994 0 0 ) + 5882 ( 659 0 988 997 0 0 ) + 5883 ( 1316 0 989 993 0 0 ) + 5884 ( 1318 1 989 0 0 0 ) + 5885 ( 6 4 989 0 3367 3 ) + 5886 ( 659 0 989 997 0 0 ) + 5887 ( 1326 0 990 993 0 0 ) + 5888 ( 1330 0 990 992 0 0 ) + 5889 ( 1334 0 990 991 0 0 ) + 5890 ( 1322 0 990 994 0 0 ) + 5891 ( 470 4 990 0 3370 4 ) + 5892 ( 659 0 990 997 0 0 ) + 5893 ( 1320 0 991 995 0 0 ) + 5894 ( 1337 0 991 992 0 0 ) + 5895 ( 659 0 991 997 0 0 ) + 5896 ( 470 4 991 0 3374 5 ) + 5897 ( 1310 0 991 996 0 0 ) + 5898 ( 1339 0 992 993 0 0 ) + 5899 ( 470 4 992 0 3379 11 ) + 5900 ( 659 0 992 997 0 0 ) + 5901 ( 1310 0 992 996 0 0 ) + 5902 ( 470 4 993 0 3390 8 ) + 5903 ( 659 0 993 997 0 0 ) + 5904 ( 1340 0 993 994 0 0 ) + 5905 ( 1320 0 994 995 0 0 ) + 5906 ( 659 0 994 997 0 0 ) + 5907 ( 470 4 994 0 3398 5 ) + 5908 ( 659 0 995 997 0 0 ) + 5909 ( 470 4 995 0 3403 5 ) + 5910 ( 1311 1 996 0 0 0 ) + 5911 ( 6 4 996 0 3408 5 ) + 5912 ( 2 0 996 1392 0 0 ) + 5913 ( 659 0 996 997 0 0 ) + 5914 ( 1267 0 997 1000 0 0 ) + 5915 ( 1267 0 997 999 0 0 ) + 5916 ( 1267 0 997 998 0 0 ) + 5917 ( 2 0 997 1394 0 0 ) + 5918 ( 1117 0 997 1141 0 0 ) + 5919 ( 51 0 997 1068 0 0 ) + 5920 ( 51 0 997 1067 0 0 ) + 5921 ( 51 0 997 1064 0 0 ) + 5922 ( 1267 0 997 1002 0 0 ) + 5923 ( 1012 1 997 0 0 0 ) + 5924 ( 1098 1 998 0 0 0 ) + 5925 ( 1027 0 998 1002 0 0 ) + 5926 ( 1027 1 998 0 0 0 ) + 5927 ( 615 0 998 1009 0 0 ) + 5928 ( 615 0 998 1010 0 0 ) + 5929 ( 615 1 998 0 0 0 ) + 5930 ( 6 4 998 0 3413 9 ) + 5931 ( 1098 0 998 1000 0 0 ) + 5932 ( 615 0 998 1006 0 0 ) + 5933 ( 1027 1 998 0 0 0 ) + 5934 ( 1027 0 998 1003 0 0 ) + 5935 ( 615 0 998 1004 0 0 ) + 5936 ( 615 1 998 0 0 0 ) + 5937 ( 51 0 998 1064 0 0 ) + 5938 ( 615 0 999 1007 0 0 ) + 5939 ( 1097 0 999 1000 0 0 ) + 5940 ( 51 0 999 1064 0 0 ) + 5941 ( 615 0 999 1004 0 0 ) + 5942 ( 1342 4 999 0 3422 5 ) + 5943 ( 1012 1 999 0 0 0 ) + 5944 ( 1012 0 999 1001 0 0 ) + 5945 ( 615 0 1000 1008 0 0 ) + 5946 ( 51 0 1000 1064 0 0 ) + 5947 ( 615 0 1000 1004 0 0 ) + 5948 ( 1342 4 1000 0 3427 4 ) + 5949 ( 615 0 1001 1007 0 0 ) + 5950 ( 615 0 1001 1005 0 0 ) + 5951 ( 1342 4 1001 0 3431 4 ) + 5952 ( 1306 1 1001 0 0 0 ) + 5953 ( 659 1 1001 0 0 0 ) + 5954 ( 6 4 1002 0 3435 4 ) + 5955 ( 1117 0 1002 1141 0 0 ) + 5956 ( 51 0 1002 1068 0 0 ) + 5957 ( 665 1 1002 0 0 0 ) + 5958 ( 665 0 1002 1003 0 0 ) + 5959 ( 1117 0 1003 1142 0 0 ) + 5960 ( 51 0 1003 1068 0 0 ) + 5961 ( 667 1 1003 0 0 0 ) + 5962 ( 1344 1 1003 0 0 0 ) + 5963 ( 51 0 1004 1073 0 0 ) + 5964 ( 1265 0 1004 1041 0 0 ) + 5965 ( 1265 0 1004 1013 0 0 ) + 5966 ( 1346 0 1004 1008 0 0 ) + 5967 ( 1346 0 1004 1007 0 0 ) + 5968 ( 1265 0 1004 1014 0 0 ) + 5969 ( 1346 0 1004 1006 0 0 ) + 5970 ( 1265 0 1004 1056 0 0 ) + 5971 ( 1265 1 1004 0 0 0 ) + 5972 ( 1265 0 1004 1025 0 0 ) + 5973 ( 1265 0 1004 1023 0 0 ) + 5974 ( 1012 1 1004 0 0 0 ) + 5975 ( 1012 0 1004 1005 0 0 ) + 5976 ( 1348 1 1004 0 0 0 ) + 5977 ( 1169 1 1004 0 0 0 ) + 5978 ( 1346 0 1005 1007 0 0 ) + 5979 ( 1265 0 1005 1056 0 0 ) + 5980 ( 1265 1 1005 0 0 0 ) + 5981 ( 1306 1 1005 0 0 0 ) + 5982 ( 659 1 1005 0 0 0 ) + 5983 ( 1098 0 1006 1008 0 0 ) + 5984 ( 1348 1 1006 0 0 0 ) + 5985 ( 1342 0 1006 1009 0 0 ) + 5986 ( 1342 0 1006 1010 0 0 ) + 5987 ( 1097 0 1007 1008 0 0 ) + 5988 ( 1342 4 1007 0 3439 6 ) + 5989 ( 1306 1 1007 0 0 0 ) + 5990 ( 1342 4 1008 0 3445 4 ) + 5991 ( 6 4 1009 0 3449 4 ) + 5992 ( 1265 0 1009 1023 0 0 ) + 5993 ( 973 1 1009 0 0 0 ) + 5994 ( 973 0 1009 1010 0 0 ) + 5995 ( 1098 1 1009 0 0 0 ) + 5996 ( 1265 0 1010 1025 0 0 ) + 5997 ( 1348 1 1010 0 0 0 ) + 5998 ( 1096 0 1011 1054 0 0 ) + 5999 ( 1352 0 1011 1013 0 0 ) + 6000 ( 1352 0 1011 1012 0 0 ) + 6001 ( 51 0 1011 1075 0 0 ) + 6002 ( 51 1 1011 0 0 0 ) + 6003 ( 1096 0 1011 1048 0 0 ) + 6004 ( 66 4 1011 0 3453 6 ) + 6005 ( 323 0 1011 1015 0 0 ) + 6006 ( 1169 0 1011 1016 0 0 ) + 6007 ( 1096 0 1011 1032 0 0 ) + 6008 ( 1096 0 1011 1033 0 0 ) + 6009 ( 1098 0 1012 1013 0 0 ) + 6010 ( 1169 0 1012 1016 0 0 ) + 6011 ( 1350 0 1012 1014 0 0 ) + 6012 ( 66 4 1012 0 3459 4 ) + 6013 ( 51 0 1012 1075 0 0 ) + 6014 ( 1096 0 1013 1041 0 0 ) + 6015 ( 1096 0 1013 1032 0 0 ) + 6016 ( 1098 0 1014 1013 0 0 ) + 6017 ( 51 0 1013 1073 0 0 ) + 6018 ( 1096 0 1013 1056 0 0 ) + 6019 ( 66 4 1013 0 3463 8 ) + 6020 ( 51 0 1013 1102 0 0 ) + 6021 ( 51 0 1013 1078 0 0 ) + 6022 ( 51 0 1013 1076 0 0 ) + 6023 ( 51 0 1013 1075 0 0 ) + 6024 ( 1096 0 1013 1048 0 0 ) + 6025 ( 1096 0 1013 1047 0 0 ) + 6026 ( 51 0 1014 1073 0 0 ) + 6027 ( 66 0 1014 1024 0 0 ) + 6028 ( 1169 0 1014 1017 0 0 ) + 6029 ( 51 0 1014 1102 0 0 ) + 6030 ( 51 0 1014 1078 0 0 ) + 6031 ( 51 0 1014 1076 0 0 ) + 6032 ( 51 0 1014 1075 0 0 ) + 6033 ( 66 0 1014 1025 0 0 ) + 6034 ( 66 0 1014 1023 0 0 ) + 6035 ( 1169 1 1014 0 0 0 ) + 6036 ( 323 0 1016 1015 0 0 ) + 6037 ( 1027 1 1015 0 0 0 ) + 6038 ( 66 4 1015 0 3471 5 ) + 6039 ( 51 1 1015 0 0 0 ) + 6040 ( 1096 1 1015 0 0 0 ) + 6041 ( 1027 1 1016 0 0 0 ) + 6042 ( 1350 1 1016 0 0 0 ) + 6043 ( 66 4 1016 0 3476 6 ) + 6044 ( 51 1 1016 0 0 0 ) + 6045 ( 51 1 1016 0 0 0 ) + 6046 ( 51 0 1016 1075 0 0 ) + 6047 ( 1350 0 1016 1021 0 0 ) + 6048 ( 1350 0 1016 1020 0 0 ) + 6049 ( 1350 0 1016 1017 0 0 ) + 6050 ( 1179 0 1017 1021 0 0 ) + 6051 ( 1179 0 1017 1022 0 0 ) + 6052 ( 680 1 1017 0 0 0 ) + 6053 ( 1179 0 1017 1018 0 0 ) + 6054 ( 1179 1 1017 0 0 0 ) + 6055 ( 66 0 1017 1026 0 0 ) + 6056 ( 66 0 1017 1027 0 0 ) + 6057 ( 51 0 1017 1075 0 0 ) + 6058 ( 51 0 1017 1076 0 0 ) + 6059 ( 66 0 1018 1030 0 0 ) + 6060 ( 66 0 1018 1029 0 0 ) + 6061 ( 66 0 1018 1031 0 0 ) + 6062 ( 733 0 1018 1022 0 0 ) + 6063 ( 51 0 1018 1076 0 0 ) + 6064 ( 51 0 1018 1075 0 0 ) + 6065 ( 51 1 1018 0 0 0 ) + 6066 ( 66 0 1018 1028 0 0 ) + 6067 ( 733 1 1018 0 0 0 ) + 6068 ( 1027 1 1018 0 0 0 ) + 6069 ( 680 1 1018 0 0 0 ) + 6070 ( 1359 0 1019 1020 0 0 ) + 6071 ( 1354 0 1019 1022 0 0 ) + 6072 ( 658 4 1019 0 3482 4 ) + 6073 ( 1027 1 1019 0 0 0 ) + 6074 ( 51 1 1019 0 0 0 ) + 6075 ( 1356 0 1019 1021 0 0 ) + 6076 ( 658 4 1020 0 3486 4 ) + 6077 ( 1027 1 1020 0 0 0 ) + 6078 ( 51 1 1020 0 0 0 ) + 6079 ( 1356 0 1020 1021 0 0 ) + 6080 ( 51 0 1021 1075 0 0 ) + 6081 ( 658 4 1021 0 3490 5 ) + 6082 ( 1354 0 1021 1022 0 0 ) + 6083 ( 658 4 1022 0 3495 5 ) + 6084 ( 1027 1 1022 0 0 0 ) + 6085 ( 51 1 1022 0 0 0 ) + 6086 ( 51 0 1022 1075 0 0 ) + 6087 ( 6 4 1023 0 3500 4 ) + 6088 ( 973 1 1023 0 0 0 ) + 6089 ( 973 0 1023 1025 0 0 ) + 6090 ( 681 1 1023 0 0 0 ) + 6091 ( 681 0 1023 1024 0 0 ) + 6092 ( 1098 1 1023 0 0 0 ) + 6093 ( 1360 4 1024 0 3504 7 ) + 6094 ( 681 0 1025 1024 0 0 ) + 6095 ( 681 1 0 1024 0 0 ) + 6096 ( 1169 0 1024 1026 0 0 ) + 6097 ( 1169 0 1024 1027 0 0 ) + 6098 ( 1169 1 1024 0 0 0 ) + 6099 ( 1098 1 1024 0 0 0 ) + 6100 ( 1348 1 1025 0 0 0 ) + 6101 ( 1179 0 1026 1030 0 0 ) + 6102 ( 1179 0 1026 1031 0 0 ) + 6103 ( 1179 1 1026 0 0 0 ) + 6104 ( 1179 0 1026 1028 0 0 ) + 6105 ( 1179 1 1026 0 0 0 ) + 6106 ( 1363 1 1026 0 0 0 ) + 6107 ( 1363 0 1026 1027 0 0 ) + 6108 ( 1360 4 1026 0 3511 6 ) + 6109 ( 681 1 0 1026 0 0 ) + 6110 ( 1179 1 1027 0 0 0 ) + 6111 ( 1360 4 1027 0 3517 4 ) + 6112 ( 902 4 1027 0 3521 4 ) + 6113 ( 1365 0 1028 1031 0 0 ) + 6114 ( 6 4 1028 0 3525 4 ) + 6115 ( 1365 1 1028 0 0 0 ) + 6116 ( 1027 1 1028 0 0 0 ) + 6117 ( 1179 1 0 1028 0 0 ) + 6118 ( 681 1 0 1028 0 0 ) + 6119 ( 1356 0 1029 1030 0 0 ) + 6120 ( 1027 1 1029 0 0 0 ) + 6121 ( 733 1 1029 0 0 0 ) + 6122 ( 902 4 1029 0 3529 4 ) + 6123 ( 1366 0 1029 1031 0 0 ) + 6124 ( 733 1 1030 0 0 0 ) + 6125 ( 902 4 1030 0 3533 4 ) + 6126 ( 1366 0 1030 1031 0 0 ) + 6127 ( 902 4 1031 0 3537 5 ) + 6128 ( 1027 1 1031 0 0 0 ) + 6129 ( 51 0 1032 1103 0 0 ) + 6130 ( 1372 0 1032 1041 0 0 ) + 6131 ( 1376 0 1032 1037 0 0 ) + 6132 ( 1372 1 1032 0 0 0 ) + 6133 ( 30 0 1032 1048 0 0 ) + 6134 ( 51 0 1032 1102 0 0 ) + 6135 ( 1150 0 1032 1039 0 0 ) + 6136 ( 1150 0 1032 1040 0 0 ) + 6137 ( 30 0 1032 1053 0 0 ) + 6138 ( 30 0 1032 1052 0 0 ) + 6139 ( 30 0 1032 1050 0 0 ) + 6140 ( 30 0 1032 1051 0 0 ) + 6141 ( 30 0 1032 1049 0 0 ) + 6142 ( 1376 0 1032 1034 0 0 ) + 6143 ( 1376 0 1032 1033 0 0 ) + 6144 ( 51 0 1032 1075 0 0 ) + 6145 ( 51 0 1032 1076 0 0 ) + 6146 ( 51 0 1032 1078 0 0 ) + 6147 ( 1380 0 1033 1038 0 0 ) + 6148 ( 51 0 1033 1075 0 0 ) + 6149 ( 51 1 1033 0 0 0 ) + 6150 ( 51 1 1033 0 0 0 ) + 6151 ( 30 0 1033 1058 0 0 ) + 6152 ( 30 0 1033 1057 0 0 ) + 6153 ( 984 1 1033 0 0 0 ) + 6154 ( 323 1 1033 0 0 0 ) + 6155 ( 1380 0 1033 1042 0 0 ) + 6156 ( 1378 0 1033 1034 0 0 ) + 6157 ( 30 0 1033 1055 0 0 ) + 6158 ( 30 0 1033 1054 0 0 ) + 6159 ( 1382 0 1034 1037 0 0 ) + 6160 ( 1382 0 1034 1038 0 0 ) + 6161 ( 30 0 1034 1054 0 0 ) + 6162 ( 51 0 1034 1075 0 0 ) + 6163 ( 51 0 1034 1076 0 0 ) + 6164 ( 51 0 1034 1078 0 0 ) + 6165 ( 1388 0 1035 1037 0 0 ) + 6166 ( 1368 0 1035 1044 0 0 ) + 6167 ( 1388 0 1035 1036 0 0 ) + 6168 ( 1384 0 1035 1038 0 0 ) + 6169 ( 51 0 1035 1078 0 0 ) + 6170 ( 51 0 1035 1076 0 0 ) + 6171 ( 51 0 1035 1075 0 0 ) + 6172 ( 30 4 1035 0 3542 6 ) + 6173 ( 1368 1 1035 0 0 0 ) + 6174 ( 1374 1 1035 0 0 0 ) + 6175 ( 459 0 1036 1037 0 0 ) + 6176 ( 1374 1 1036 0 0 0 ) + 6177 ( 30 4 1036 0 3548 3 ) + 6178 ( 51 0 1036 1078 0 0 ) + 6179 ( 51 0 1037 1103 0 0 ) + 6180 ( 30 4 1037 0 3551 10 ) + 6181 ( 51 0 1037 1078 0 0 ) + 6182 ( 51 0 1037 1076 0 0 ) + 6183 ( 1391 0 1037 1038 0 0 ) + 6184 ( 1393 0 1039 1037 0 0 ) + 6185 ( 458 1 1037 0 0 0 ) + 6186 ( 1376 0 1040 1037 0 0 ) + 6187 ( 1394 0 1042 1038 0 0 ) + 6188 ( 51 1 1038 0 0 0 ) + 6189 ( 30 4 1038 0 3561 9 ) + 6190 ( 1396 0 1043 1038 0 0 ) + 6191 ( 1384 0 1046 1038 0 0 ) + 6192 ( 51 0 1038 1075 0 0 ) + 6193 ( 1384 0 1044 1038 0 0 ) + 6194 ( 51 0 1038 1076 0 0 ) + 6195 ( 51 0 1039 1103 0 0 ) + 6196 ( 1393 0 1039 1040 0 0 ) + 6197 ( 30 4 1039 0 3570 6 ) + 6198 ( 1372 1 1039 0 0 0 ) + 6199 ( 458 1 1039 0 0 0 ) + 6200 ( 51 0 1040 1103 0 0 ) + 6201 ( 30 4 1040 0 3576 3 ) + 6202 ( 1012 1 1041 0 0 0 ) + 6203 ( 51 0 1041 1102 0 0 ) + 6204 ( 1373 0 1041 1048 0 0 ) + 6205 ( 659 0 1047 1041 0 0 ) + 6206 ( 659 0 1056 1041 0 0 ) + 6207 ( 51 0 1041 1073 0 0 ) + 6208 ( 1394 0 1042 1043 0 0 ) + 6209 ( 51 0 1042 1075 0 0 ) + 6210 ( 51 1 1042 0 0 0 ) + 6211 ( 30 0 1042 1057 0 0 ) + 6212 ( 984 1 1042 0 0 0 ) + 6213 ( 1396 1 1043 0 0 0 ) + 6214 ( 984 1 1043 0 0 0 ) + 6215 ( 66 4 1043 0 3579 3 ) + 6216 ( 1394 0 1057 1043 0 0 ) + 6217 ( 1396 0 1043 1046 0 0 ) + 6218 ( 51 1 1043 0 0 0 ) + 6219 ( 1402 0 1044 1046 0 0 ) + 6220 ( 1402 0 1044 1045 0 0 ) + 6221 ( 1400 1 1044 0 0 0 ) + 6222 ( 30 4 1044 0 3582 5 ) + 6223 ( 51 1 1044 0 0 0 ) + 6224 ( 51 0 1044 1075 0 0 ) + 6225 ( 1405 0 1045 1046 0 0 ) + 6226 ( 51 1 1045 0 0 0 ) + 6227 ( 30 4 1045 0 3587 4 ) + 6228 ( 984 1 1045 0 0 0 ) + 6229 ( 1400 1 1045 0 0 0 ) + 6230 ( 51 1 1046 0 0 0 ) + 6231 ( 30 4 1046 0 3591 5 ) + 6232 ( 984 1 1046 0 0 0 ) + 6233 ( 1150 1 1047 0 0 0 ) + 6234 ( 1370 1 1047 0 0 0 ) + 6235 ( 1370 0 1047 1056 0 0 ) + 6236 ( 1373 1 1047 0 0 0 ) + 6237 ( 1373 0 1047 1048 0 0 ) + 6238 ( 659 1 1047 0 0 0 ) + 6239 ( 66 4 1047 0 3596 6 ) + 6240 ( 1376 0 1048 1054 0 0 ) + 6241 ( 1406 0 1048 1049 0 0 ) + 6242 ( 1406 0 1048 1053 0 0 ) + 6243 ( 1406 1 1048 0 0 0 ) + 6244 ( 66 4 1048 0 3602 6 ) + 6245 ( 1373 1 0 1048 0 0 ) + 6246 ( 1376 0 1049 1054 0 0 ) + 6247 ( 1408 1 1049 0 0 0 ) + 6248 ( 66 4 1049 0 3608 4 ) + 6249 ( 1376 1 1049 0 0 0 ) + 6250 ( 1408 0 1049 1051 0 0 ) + 6251 ( 1408 0 1049 1053 0 0 ) + 6252 ( 693 0 1050 1051 0 0 ) + 6253 ( 1411 0 1050 1053 0 0 ) + 6254 ( 1150 1 1050 0 0 0 ) + 6255 ( 1376 1 1050 0 0 0 ) + 6256 ( 990 4 1050 0 3612 5 ) + 6257 ( 1398 0 1050 1052 0 0 ) + 6258 ( 1411 0 1051 1053 0 0 ) + 6259 ( 1376 1 1051 0 0 0 ) + 6260 ( 990 4 1051 0 3617 4 ) + 6261 ( 1373 1 0 1052 0 0 ) + 6262 ( 990 4 1052 0 3621 4 ) + 6263 ( 1150 1 1052 0 0 0 ) + 6264 ( 1411 0 1052 1053 0 0 ) + 6265 ( 990 4 1053 0 3625 6 ) + 6266 ( 1373 1 0 1053 0 0 ) + 6267 ( 1382 0 1054 1055 0 0 ) + 6268 ( 323 1 1054 0 0 0 ) + 6269 ( 66 4 1054 0 3631 6 ) + 6270 ( 1382 1 1054 0 0 0 ) + 6271 ( 1378 1 1055 0 0 0 ) + 6272 ( 66 4 1055 0 3637 5 ) + 6273 ( 323 1 1055 0 0 0 ) + 6274 ( 1150 0 1055 1057 0 0 ) + 6275 ( 1150 0 1055 1058 0 0 ) + 6276 ( 659 1 1056 0 0 0 ) + 6277 ( 66 4 1056 0 3642 5 ) + 6278 ( 1306 1 1056 0 0 0 ) + 6279 ( 1394 1 1057 0 0 0 ) + 6280 ( 1394 0 1057 1058 0 0 ) + 6281 ( 984 1 1057 0 0 0 ) + 6282 ( 66 4 1057 0 3647 6 ) + 6283 ( 323 1 1057 0 0 0 ) + 6284 ( 1378 1 1058 0 0 0 ) + 6285 ( 66 4 1058 0 3653 3 ) + 6286 ( 615 0 1059 1062 0 0 ) + 6287 ( 1414 0 1059 1061 0 0 ) + 6288 ( 345 1 1059 0 0 0 ) + 6289 ( 34 4 1059 0 3656 6 ) + 6290 ( 16 1 1059 0 0 0 ) + 6291 ( 615 1 1059 0 0 0 ) + 6292 ( 1413 1 1059 0 0 0 ) + 6293 ( 615 1 1059 0 0 0 ) + 6294 ( 2 0 1060 1415 0 0 ) + 6295 ( 1066 0 1060 1074 0 0 ) + 6296 ( 1066 1 1060 0 0 0 ) + 6297 ( 1413 0 1060 1071 0 0 ) + 6298 ( 1413 0 1060 1070 0 0 ) + 6299 ( 1413 1 1060 0 0 0 ) + 6300 ( 345 1 1060 0 0 0 ) + 6301 ( 345 0 1060 1063 0 0 ) + 6302 ( 34 4 1060 0 3662 7 ) + 6303 ( 609 0 1060 1061 0 0 ) + 6304 ( 609 0 1131 1061 0 0 ) + 6305 ( 345 1 1061 0 0 0 ) + 6306 ( 34 4 1061 0 3669 6 ) + 6307 ( 16 1 1061 0 0 0 ) + 6308 ( 609 0 1074 1061 0 0 ) + 6309 ( 1413 1 1061 0 0 0 ) + 6310 ( 676 0 1096 1062 0 0 ) + 6311 ( 1419 1 1062 0 0 0 ) + 6312 ( 1416 4 1062 0 3675 4 ) + 6313 ( 345 1 1062 0 0 0 ) + 6314 ( 1070 1 1062 0 0 0 ) + 6315 ( 345 0 1062 1099 0 0 ) + 6316 ( 2 0 1063 1412 0 0 ) + 6317 ( 1413 0 1063 1070 0 0 ) + 6318 ( 639 1 1063 0 0 0 ) + 6319 ( 1066 1 1063 0 0 0 ) + 6320 ( 2 0 1063 1441 0 0 ) + 6321 ( 617 0 1063 1160 0 0 ) + 6322 ( 1066 0 1063 1115 0 0 ) + 6323 ( 175 0 1064 1123 0 0 ) + 6324 ( 615 0 1064 1073 0 0 ) + 6325 ( 1012 0 1064 1066 0 0 ) + 6326 ( 2 0 1064 1394 0 0 ) + 6327 ( 2 0 1064 1388 0 0 ) + 6328 ( 615 1 1064 0 0 0 ) + 6329 ( 615 1 1064 0 0 0 ) + 6330 ( 1027 1 1064 0 0 0 ) + 6331 ( 1027 0 1064 1068 0 0 ) + 6332 ( 1027 0 1064 1067 0 0 ) + 6333 ( 1027 1 1064 0 0 0 ) + 6334 ( 1012 1 1064 0 0 0 ) + 6335 ( 175 0 1065 1125 0 0 ) + 6336 ( 175 0 1065 1123 0 0 ) + 6337 ( 1155 0 1065 1066 0 0 ) + 6338 ( 603 0 1065 1109 0 0 ) + 6339 ( 603 0 1065 1101 0 0 ) + 6340 ( 1306 1 1065 0 0 0 ) + 6341 ( 34 4 1065 0 3679 5 ) + 6342 ( 603 0 1065 1104 0 0 ) + 6343 ( 2 0 1065 1395 0 0 ) + 6344 ( 1306 0 1065 1069 0 0 ) + 6345 ( 2 0 1065 1388 0 0 ) + 6346 ( 175 0 1066 1125 0 0 ) + 6347 ( 175 0 1066 1123 0 0 ) + 6348 ( 603 0 1066 1109 0 0 ) + 6349 ( 603 0 1066 1101 0 0 ) + 6350 ( 1012 0 1073 1066 0 0 ) + 6351 ( 34 4 1066 0 3684 5 ) + 6352 ( 603 0 1066 1106 0 0 ) + 6353 ( 2 0 1066 1396 0 0 ) + 6354 ( 2 0 1066 1388 0 0 ) + 6355 ( 1117 0 1067 1149 0 0 ) + 6356 ( 1027 0 1123 1067 0 0 ) + 6357 ( 607 1 1067 0 0 0 ) + 6358 ( 617 0 1067 1166 0 0 ) + 6359 ( 2 0 1067 1389 0 0 ) + 6360 ( 2 0 1067 1394 0 0 ) + 6361 ( 1117 0 1067 1152 0 0 ) + 6362 ( 1117 0 1067 1141 0 0 ) + 6363 ( 607 0 1067 1068 0 0 ) + 6364 ( 1117 1 1068 0 0 0 ) + 6365 ( 1117 0 1068 1142 0 0 ) + 6366 ( 1117 0 1068 1141 0 0 ) + 6367 ( 667 1 1068 0 0 0 ) + 6368 ( 1420 1 1068 0 0 0 ) + 6369 ( 2 0 1069 1444 0 0 ) + 6370 ( 2 0 1069 1415 0 0 ) + 6371 ( 1306 0 1123 1069 0 0 ) + 6372 ( 1120 0 1069 1072 0 0 ) + 6373 ( 1120 0 1069 1070 0 0 ) + 6374 ( 607 1 1069 0 0 0 ) + 6375 ( 1120 1 1069 0 0 0 ) + 6376 ( 617 0 1069 1162 0 0 ) + 6377 ( 2 0 1069 1388 0 0 ) + 6378 ( 2 0 1069 1454 0 0 ) + 6379 ( 617 0 1069 1160 0 0 ) + 6380 ( 34 4 1069 0 3689 7 ) + 6381 ( 1120 0 1069 1071 0 0 ) + 6382 ( 2 0 1069 1395 0 0 ) + 6383 ( 2 0 1070 1415 0 0 ) + 6384 ( 2 0 1070 1412 0 0 ) + 6385 ( 639 0 1070 1072 0 0 ) + 6386 ( 639 1 1070 0 0 0 ) + 6387 ( 617 0 1070 1160 0 0 ) + 6388 ( 639 0 1070 1071 0 0 ) + 6389 ( 34 4 1070 0 3696 4 ) + 6390 ( 345 1 1071 0 0 0 ) + 6391 ( 345 0 1071 1072 0 0 ) + 6392 ( 607 1 1071 0 0 0 ) + 6393 ( 34 4 1071 0 3700 4 ) + 6394 ( 639 0 1220 1072 0 0 ) + 6395 ( 639 0 1213 1072 0 0 ) + 6396 ( 1120 0 1214 1072 0 0 ) + 6397 ( 908 0 1210 1072 0 0 ) + 6398 ( 1422 0 1072 1218 0 0 ) + 6399 ( 1422 0 1072 1217 0 0 ) + 6400 ( 1422 1 1072 0 0 0 ) + 6401 ( 1120 0 1219 1072 0 0 ) + 6402 ( 1120 0 1252 1072 0 0 ) + 6403 ( 639 0 1159 1072 0 0 ) + 6404 ( 1120 0 1162 1072 0 0 ) + 6405 ( 639 0 1160 1072 0 0 ) + 6406 ( 175 0 1073 1125 0 0 ) + 6407 ( 1424 1 1073 0 0 0 ) + 6408 ( 1169 1 1073 0 0 0 ) + 6409 ( 603 0 1073 1102 0 0 ) + 6410 ( 603 1 1073 0 0 0 ) + 6411 ( 603 0 1073 1109 0 0 ) + 6412 ( 603 0 1073 1101 0 0 ) + 6413 ( 1012 1 1073 0 0 0 ) + 6414 ( 1070 1 1074 0 0 0 ) + 6415 ( 1070 0 1074 1131 0 0 ) + 6416 ( 345 1 1074 0 0 0 ) + 6417 ( 638 1 1074 0 0 0 ) + 6418 ( 34 4 1074 0 3704 5 ) + 6419 ( 701 0 1075 1087 0 0 ) + 6420 ( 701 0 1075 1084 0 0 ) + 6421 ( 701 0 1075 1088 0 0 ) + 6422 ( 1400 1 1075 0 0 0 ) + 6423 ( 1400 0 1075 1077 0 0 ) + 6424 ( 1400 0 1075 1076 0 0 ) + 6425 ( 1429 1 1075 0 0 0 ) + 6426 ( 1426 1 1075 0 0 0 ) + 6427 ( 1357 1 1075 0 0 0 ) + 6428 ( 701 0 1076 1087 0 0 ) + 6429 ( 701 0 1076 1084 0 0 ) + 6430 ( 701 0 1076 1088 0 0 ) + 6431 ( 680 0 1076 1078 0 0 ) + 6432 ( 680 1 1076 0 0 0 ) + 6433 ( 1368 1 1076 0 0 0 ) + 6434 ( 1368 0 1076 1077 0 0 ) + 6435 ( 1357 1 1076 0 0 0 ) + 6436 ( 34 4 1077 0 3709 5 ) + 6437 ( 1426 1 1077 0 0 0 ) + 6438 ( 1368 0 1078 1077 0 0 ) + 6439 ( 701 0 1077 1088 0 0 ) + 6440 ( 1374 0 1077 1112 0 0 ) + 6441 ( 1374 0 1078 1107 0 0 ) + 6442 ( 1374 0 1078 1103 0 0 ) + 6443 ( 701 0 1078 1084 0 0 ) + 6444 ( 1374 1 1078 0 0 0 ) + 6445 ( 1374 0 1078 1102 0 0 ) + 6446 ( 701 1 1078 0 0 0 ) + 6447 ( 701 0 1078 1088 0 0 ) + 6448 ( 1368 1 1078 0 0 0 ) + 6449 ( 1169 1 1078 0 0 0 ) + 6450 ( 326 0 1079 1081 0 0 ) + 6451 ( 323 1 1079 0 0 0 ) + 6452 ( 42 4 1079 0 3714 6 ) + 6453 ( 1027 1 1079 0 0 0 ) + 6454 ( 175 0 1079 1126 0 0 ) + 6455 ( 326 0 1079 1085 0 0 ) + 6456 ( 326 0 1079 1080 0 0 ) + 6457 ( 984 1 1079 0 0 0 ) + 6458 ( 175 0 1080 1124 0 0 ) + 6459 ( 1007 0 1080 1083 0 0 ) + 6460 ( 984 1 1080 0 0 0 ) + 6461 ( 1370 1 1080 0 0 0 ) + 6462 ( 42 4 1080 0 3720 7 ) + 6463 ( 175 0 1080 1126 0 0 ) + 6464 ( 984 0 1080 1090 0 0 ) + 6465 ( 984 1 1080 0 0 0 ) + 6466 ( 1007 0 1080 1081 0 0 ) + 6467 ( 175 0 1081 1126 0 0 ) + 6468 ( 42 4 1081 0 3727 8 ) + 6469 ( 1428 0 1081 1087 0 0 ) + 6470 ( 1222 0 1085 1081 0 0 ) + 6471 ( 1428 0 1081 1086 0 0 ) + 6472 ( 1428 0 1081 1084 0 0 ) + 6473 ( 1428 0 1081 1083 0 0 ) + 6474 ( 1428 0 1081 1082 0 0 ) + 6475 ( 175 0 1082 1124 0 0 ) + 6476 ( 42 0 1082 1113 0 0 ) + 6477 ( 42 0 1082 1111 0 0 ) + 6478 ( 1426 0 1082 1083 0 0 ) + 6479 ( 42 0 1082 1110 0 0 ) + 6480 ( 42 0 1082 1109 0 0 ) + 6481 ( 1370 1 1082 0 0 0 ) + 6482 ( 1370 0 1082 1101 0 0 ) + 6483 ( 997 1 1082 0 0 0 ) + 6484 ( 42 0 1082 1112 0 0 ) + 6485 ( 997 0 1082 1084 0 0 ) + 6486 ( 175 0 1082 1126 0 0 ) + 6487 ( 42 0 1082 1088 0 0 ) + 6488 ( 175 0 1083 1124 0 0 ) + 6489 ( 1370 1 1083 0 0 0 ) + 6490 ( 42 4 1083 0 3735 7 ) + 6491 ( 175 0 1083 1126 0 0 ) + 6492 ( 1424 0 1084 1087 0 0 ) + 6493 ( 626 1 1084 0 0 0 ) + 6494 ( 997 0 1088 1084 0 0 ) + 6495 ( 1429 1 1084 0 0 0 ) + 6496 ( 1424 1 1084 0 0 0 ) + 6497 ( 175 0 1085 1126 0 0 ) + 6498 ( 1027 1 1085 0 0 0 ) + 6499 ( 1027 0 1085 1095 0 0 ) + 6500 ( 42 4 1085 0 3742 6 ) + 6501 ( 680 1 1085 0 0 0 ) + 6502 ( 1222 0 1085 1086 0 0 ) + 6503 ( 680 1 1086 0 0 0 ) + 6504 ( 42 4 1086 0 3748 4 ) + 6505 ( 175 0 1086 1126 0 0 ) + 6506 ( 1356 0 1086 1087 0 0 ) + 6507 ( 1357 1 1087 0 0 0 ) + 6508 ( 1429 1 1087 0 0 0 ) + 6509 ( 680 1 1087 0 0 0 ) + 6510 ( 175 0 1087 1126 0 0 ) + 6511 ( 1374 0 1088 1112 0 0 ) + 6512 ( 1374 0 1088 1110 0 0 ) + 6513 ( 1374 0 1088 1109 0 0 ) + 6514 ( 997 1 1088 0 0 0 ) + 6515 ( 1429 1 1088 0 0 0 ) + 6516 ( 1426 1 1088 0 0 0 ) + 6517 ( 175 0 1089 1118 0 0 ) + 6518 ( 680 0 1089 1093 0 0 ) + 6519 ( 1070 1 1089 0 0 0 ) + 6520 ( 175 1 1089 0 0 0 ) + 6521 ( 175 1 1089 0 0 0 ) + 6522 ( 175 1 1089 0 0 0 ) + 6523 ( 175 0 1089 1116 0 0 ) + 6524 ( 680 1 1089 0 0 0 ) + 6525 ( 1431 0 1089 1091 0 0 ) + 6526 ( 241 1 1089 0 0 0 ) + 6527 ( 42 4 1089 0 3752 5 ) + 6528 ( 175 1 1090 0 0 0 ) + 6529 ( 175 0 1090 1129 0 0 ) + 6530 ( 175 1 1090 0 0 0 ) + 6531 ( 175 0 1090 1128 0 0 ) + 6532 ( 175 0 1090 1127 0 0 ) + 6533 ( 680 1 1090 0 0 0 ) + 6534 ( 42 4 1090 0 3757 4 ) + 6535 ( 241 1 1090 0 0 0 ) + 6536 ( 1158 0 1090 1091 0 0 ) + 6537 ( 175 1 1091 0 0 0 ) + 6538 ( 680 1 1091 0 0 0 ) + 6539 ( 42 4 1091 0 3761 4 ) + 6540 ( 241 1 1091 0 0 0 ) + 6541 ( 1374 0 1092 1096 0 0 ) + 6542 ( 1433 0 1092 1094 0 0 ) + 6543 ( 1070 1 1092 0 0 0 ) + 6544 ( 175 1 1092 0 0 0 ) + 6545 ( 1374 0 1092 1097 0 0 ) + 6546 ( 1419 1 1092 0 0 0 ) + 6547 ( 1416 4 1092 0 3765 4 ) + 6548 ( 626 0 1093 1094 0 0 ) + 6549 ( 1419 1 1093 0 0 0 ) + 6550 ( 42 4 1093 0 3769 4 ) + 6551 ( 175 1 1093 0 0 0 ) + 6552 ( 1070 1 1093 0 0 0 ) + 6553 ( 1416 4 1094 0 3773 4 ) + 6554 ( 1419 1 1094 0 0 0 ) + 6555 ( 1070 1 1094 0 0 0 ) + 6556 ( 175 1 1094 0 0 0 ) + 6557 ( 1164 0 1143 1095 0 0 ) + 6558 ( 42 4 1095 0 3777 4 ) + 6559 ( 175 1 1095 0 0 0 ) + 6560 ( 680 1 1095 0 0 0 ) + 6561 ( 241 1 1095 0 0 0 ) + 6562 ( 345 0 1096 1097 0 0 ) + 6563 ( 345 0 1096 1098 0 0 ) + 6564 ( 1419 1 1096 0 0 0 ) + 6565 ( 1419 0 1096 1100 0 0 ) + 6566 ( 1419 1 1096 0 0 0 ) + 6567 ( 1070 1 1096 0 0 0 ) + 6568 ( 1070 0 1096 1130 0 0 ) + 6569 ( 1070 1 1096 0 0 0 ) + 6570 ( 1416 4 1096 0 3781 6 ) + 6571 ( 1419 1 1096 0 0 0 ) + 6572 ( 1070 1 1096 0 0 0 ) + 6573 ( 1070 1 1097 0 0 0 ) + 6574 ( 1070 0 1097 1130 0 0 ) + 6575 ( 1070 1 1097 0 0 0 ) + 6576 ( 175 1 1097 0 0 0 ) + 6577 ( 1419 0 1097 1100 0 0 ) + 6578 ( 1419 1 1097 0 0 0 ) + 6579 ( 1419 1 1097 0 0 0 ) + 6580 ( 1370 0 1097 1098 0 0 ) + 6581 ( 1370 1 1097 0 0 0 ) + 6582 ( 1070 1 1098 0 0 0 ) + 6583 ( 1419 1 1098 0 0 0 ) + 6584 ( 1434 1 1098 0 0 0 ) + 6585 ( 676 0 1098 1099 0 0 ) + 6586 ( 1070 1 1099 0 0 0 ) + 6587 ( 1419 1 1099 0 0 0 ) + 6588 ( 1434 1 1099 0 0 0 ) + 6589 ( 1436 1 1100 0 0 0 ) + 6590 ( 1413 1 1100 0 0 0 ) + 6591 ( 597 1 1100 0 0 0 ) + 6592 ( 752 1 1100 0 0 0 ) + 6593 ( 1438 1 1100 0 0 0 ) + 6594 ( 175 0 1101 1125 0 0 ) + 6595 ( 42 0 1101 1109 0 0 ) + 6596 ( 997 1 1101 0 0 0 ) + 6597 ( 1306 1 1101 0 0 0 ) + 6598 ( 1012 0 1102 1103 0 0 ) + 6599 ( 1012 0 1102 1106 0 0 ) + 6600 ( 701 1 1102 0 0 0 ) + 6601 ( 701 0 1102 1109 0 0 ) + 6602 ( 1012 1 1102 0 0 0 ) + 6603 ( 1169 1 1102 0 0 0 ) + 6604 ( 458 0 1103 1107 0 0 ) + 6605 ( 701 0 1103 1109 0 0 ) + 6606 ( 1440 0 1103 1106 0 0 ) + 6607 ( 1440 0 1103 1105 0 0 ) + 6608 ( 701 0 1103 1110 0 0 ) + 6609 ( 458 1 1103 0 0 0 ) + 6610 ( 1372 1 1103 0 0 0 ) + 6611 ( 1440 1 1103 0 0 0 ) + 6612 ( 1306 0 1104 1108 0 0 ) + 6613 ( 1443 0 1104 1105 0 0 ) + 6614 ( 34 4 1104 0 3787 5 ) + 6615 ( 1306 1 1104 0 0 0 ) + 6616 ( 701 0 1104 1109 0 0 ) + 6617 ( 1155 0 1104 1106 0 0 ) + 6618 ( 34 4 1105 0 3792 7 ) + 6619 ( 701 0 1105 1110 0 0 ) + 6620 ( 1368 1 1105 0 0 0 ) + 6621 ( 1443 0 1108 1105 0 0 ) + 6622 ( 1372 0 1107 1105 0 0 ) + 6623 ( 701 0 1105 1109 0 0 ) + 6624 ( 1155 0 1105 1106 0 0 ) + 6625 ( 701 0 1106 1109 0 0 ) + 6626 ( 34 4 1106 0 3799 5 ) + 6627 ( 1368 0 1107 1111 0 0 ) + 6628 ( 1368 0 1107 1112 0 0 ) + 6629 ( 701 0 1107 1110 0 0 ) + 6630 ( 34 4 1107 0 3804 6 ) + 6631 ( 1368 1 1107 0 0 0 ) + 6632 ( 1368 1 1108 0 0 0 ) + 6633 ( 701 0 1108 1110 0 0 ) + 6634 ( 34 4 1108 0 3810 4 ) + 6635 ( 1370 1 1108 0 0 0 ) + 6636 ( 1306 1 1109 0 0 0 ) + 6637 ( 1306 0 1109 1110 0 0 ) + 6638 ( 997 1 1109 0 0 0 ) + 6639 ( 1368 0 1110 1113 0 0 ) + 6640 ( 1368 0 1110 1111 0 0 ) + 6641 ( 1368 0 1110 1112 0 0 ) + 6642 ( 1370 1 1110 0 0 0 ) + 6643 ( 1398 0 1111 1113 0 0 ) + 6644 ( 1426 1 1111 0 0 0 ) + 6645 ( 34 4 1111 0 3814 4 ) + 6646 ( 1445 0 1111 1112 0 0 ) + 6647 ( 1398 1 1111 0 0 0 ) + 6648 ( 34 4 1112 0 3818 4 ) + 6649 ( 1426 1 1112 0 0 0 ) + 6650 ( 1426 1 1113 0 0 0 ) + 6651 ( 700 4 1113 0 3822 6 ) + 6652 ( 1370 1 1113 0 0 0 ) + 6653 ( 2 0 1114 1402 0 0 ) + 6654 ( 2 0 1114 1442 0 0 ) + 6655 ( 1449 0 1114 1115 0 0 ) + 6656 ( 1446 4 1114 0 3828 5 ) + 6657 ( 639 1 1114 0 0 0 ) + 6658 ( 617 0 1114 1160 0 0 ) + 6659 ( 2 0 1115 1443 0 0 ) + 6660 ( 1446 4 1115 0 3833 4 ) + 6661 ( 639 1 1115 0 0 0 ) + 6662 ( 617 0 1115 1160 0 0 ) + 6663 ( 1413 0 1116 1118 0 0 ) + 6664 ( 908 0 1179 1116 0 0 ) + 6665 ( 1070 1 1116 0 0 0 ) + 6666 ( 1412 0 1185 1116 0 0 ) + 6667 ( 680 0 1116 1261 0 0 ) + 6668 ( 240 0 1187 1116 0 0 ) + 6669 ( 241 1 1116 0 0 0 ) + 6670 ( 1413 1 1116 0 0 0 ) + 6671 ( 680 1 1116 0 0 0 ) + 6672 ( 1413 1 1116 0 0 0 ) + 6673 ( 1413 1 1116 0 0 0 ) + 6674 ( 617 0 1117 1156 0 0 ) + 6675 ( 241 0 1117 1120 0 0 ) + 6676 ( 617 0 1117 1157 0 0 ) + 6677 ( 300 0 1117 1129 0 0 ) + 6678 ( 300 0 1117 1128 0 0 ) + 6679 ( 300 0 1117 1127 0 0 ) + 6680 ( 300 0 1117 1126 0 0 ) + 6681 ( 680 1 1117 0 0 0 ) + 6682 ( 680 0 1117 1124 0 0 ) + 6683 ( 680 1 1117 0 0 0 ) + 6684 ( 241 1 1117 0 0 0 ) + 6685 ( 1120 0 1117 1119 0 0 ) + 6686 ( 1120 1 1117 0 0 0 ) + 6687 ( 1120 1 1117 0 0 0 ) + 6688 ( 1027 1 1117 0 0 0 ) + 6689 ( 1450 1 1118 0 0 0 ) + 6690 ( 637 1 1118 0 0 0 ) + 6691 ( 1362 1 1118 0 0 0 ) + 6692 ( 300 0 1119 1127 0 0 ) + 6693 ( 637 1 1119 0 0 0 ) + 6694 ( 1362 1 1119 0 0 0 ) + 6695 ( 1452 1 1119 0 0 0 ) + 6696 ( 617 0 1120 1156 0 0 ) + 6697 ( 323 1 1120 0 0 0 ) + 6698 ( 984 1 1120 0 0 0 ) + 6699 ( 300 0 1120 1126 0 0 ) + 6700 ( 1027 1 1120 0 0 0 ) + 6701 ( 323 1 1120 0 0 0 ) + 6702 ( 323 0 1120 1122 0 0 ) + 6703 ( 1454 0 1121 1122 0 0 ) + 6704 ( 458 1 1121 0 0 0 ) + 6705 ( 1115 1 1121 0 0 0 ) + 6706 ( 300 4 1121 0 3837 4 ) + 6707 ( 617 0 1121 1158 0 0 ) + 6708 ( 458 1 1122 0 0 0 ) + 6709 ( 1115 1 1122 0 0 0 ) + 6710 ( 300 4 1122 0 3841 4 ) + 6711 ( 617 0 1122 1158 0 0 ) + 6712 ( 615 0 1123 1125 0 0 ) + 6713 ( 1306 1 1123 0 0 0 ) + 6714 ( 615 1 1123 0 0 0 ) + 6715 ( 1027 1 1123 0 0 0 ) + 6716 ( 2 0 1123 1388 0 0 ) + 6717 ( 617 0 1123 1160 0 0 ) + 6718 ( 617 0 1123 1163 0 0 ) + 6719 ( 617 0 1123 1162 0 0 ) + 6720 ( 1370 0 1124 1125 0 0 ) + 6721 ( 997 1 1124 0 0 0 ) + 6722 ( 680 0 1126 1124 0 0 ) + 6723 ( 1370 1 1124 0 0 0 ) + 6724 ( 984 1 1124 0 0 0 ) + 6725 ( 617 0 1124 1165 0 0 ) + 6726 ( 617 0 1124 1164 0 0 ) + 6727 ( 1306 1 1125 0 0 0 ) + 6728 ( 997 1 1125 0 0 0 ) + 6729 ( 617 0 1125 1164 0 0 ) + 6730 ( 1027 1 1126 0 0 0 ) + 6731 ( 984 0 1126 1129 0 0 ) + 6732 ( 984 0 1126 1128 0 0 ) + 6733 ( 984 0 1126 1127 0 0 ) + 6734 ( 984 1 1126 0 0 0 ) + 6735 ( 680 1 1126 0 0 0 ) + 6736 ( 323 1 1126 0 0 0 ) + 6737 ( 1362 1 1127 0 0 0 ) + 6738 ( 1362 0 1127 1129 0 0 ) + 6739 ( 637 1 1127 0 0 0 ) + 6740 ( 637 0 1127 1128 0 0 ) + 6741 ( 1452 1 1127 0 0 0 ) + 6742 ( 241 1 1128 0 0 0 ) + 6743 ( 1120 1 1128 0 0 0 ) + 6744 ( 680 1 1129 0 0 0 ) + 6745 ( 1120 1 1129 0 0 0 ) + 6746 ( 1456 1 1130 0 0 0 ) + 6747 ( 752 1 1130 0 0 0 ) + 6748 ( 1458 1 1130 0 0 0 ) + 6749 ( 597 1 1130 0 0 0 ) + 6750 ( 1460 1 1130 0 0 0 ) + 6751 ( 784 1 1131 0 0 0 ) + 6752 ( 345 1 1131 0 0 0 ) + 6753 ( 34 4 1131 0 3845 4 ) + 6754 ( 16 1 1131 0 0 0 ) + 6755 ( 620 1 1132 0 0 0 ) + 6756 ( 42 4 1132 0 3849 5 ) + 6757 ( 241 0 1143 1132 0 0 ) + 6758 ( 175 1 1132 0 0 0 ) + 6759 ( 395 1 1132 0 0 0 ) + 6760 ( 701 0 1133 1148 0 0 ) + 6761 ( 671 0 1133 1136 0 0 ) + 6762 ( 671 0 1133 1134 0 0 ) + 6763 ( 6 4 1133 0 3854 6 ) + 6764 ( 620 0 1133 1141 0 0 ) + 6765 ( 0 1 0 1133 0 0 ) + 6766 ( 638 0 1133 1137 0 0 ) + 6767 ( 638 0 1133 1139 0 0 ) + 6768 ( 701 0 1134 1148 0 0 ) + 6769 ( 945 0 1134 1136 0 0 ) + 6770 ( 945 0 1134 1135 0 0 ) + 6771 ( 663 0 1134 1140 0 0 ) + 6772 ( 663 1 1134 0 0 0 ) + 6773 ( 620 1 1134 0 0 0 ) + 6774 ( 620 0 1134 1141 0 0 ) + 6775 ( 620 0 1134 1142 0 0 ) + 6776 ( 620 1 1134 0 0 0 ) + 6777 ( 6 4 1134 0 3860 7 ) + 6778 ( 701 0 1135 1148 0 0 ) + 6779 ( 664 0 1135 1136 0 0 ) + 6780 ( 6 4 1135 0 3867 4 ) + 6781 ( 663 1 1135 0 0 0 ) + 6782 ( 663 0 1135 1140 0 0 ) + 6783 ( 701 0 1136 1148 0 0 ) + 6784 ( 6 4 1136 0 3871 4 ) + 6785 ( 0 1 0 1136 0 0 ) + 6786 ( 701 0 1137 1148 0 0 ) + 6787 ( 945 0 1137 1139 0 0 ) + 6788 ( 945 0 1137 1138 0 0 ) + 6789 ( 2 0 1137 1384 0 0 ) + 6790 ( 6 4 1137 0 3875 5 ) + 6791 ( 620 0 1137 1141 0 0 ) + 6792 ( 701 0 1138 1148 0 0 ) + 6793 ( 657 0 1138 1139 0 0 ) + 6794 ( 6 4 1138 0 3880 4 ) + 6795 ( 2 0 1138 1384 0 0 ) + 6796 ( 701 0 1139 1148 0 0 ) + 6797 ( 0 1 0 1139 0 0 ) + 6798 ( 6 4 1139 0 3884 4 ) + 6799 ( 6 4 1140 0 3888 5 ) + 6800 ( 620 1 1140 0 0 0 ) + 6801 ( 615 1 1140 0 0 0 ) + 6802 ( 51 1 1140 0 0 0 ) + 6803 ( 2 0 1141 1394 0 0 ) + 6804 ( 2 0 1141 1393 0 0 ) + 6805 ( 2 0 1141 1384 0 0 ) + 6806 ( 6 4 1141 0 3893 8 ) + 6807 ( 701 1 1141 0 0 0 ) + 6808 ( 701 0 1141 1152 0 0 ) + 6809 ( 701 0 1141 1151 0 0 ) + 6810 ( 665 1 1141 0 0 0 ) + 6811 ( 665 0 1141 1142 0 0 ) + 6812 ( 701 1 1142 0 0 0 ) + 6813 ( 701 0 1142 1151 0 0 ) + 6814 ( 667 1 1142 0 0 0 ) + 6815 ( 1344 1 1142 0 0 0 ) + 6816 ( 241 1 1143 0 0 0 ) + 6817 ( 680 1 1143 0 0 0 ) + 6818 ( 680 0 1143 1145 0 0 ) + 6819 ( 175 1 1143 0 0 0 ) + 6820 ( 175 0 1143 1144 0 0 ) + 6821 ( 42 4 1143 0 3901 7 ) + 6822 ( 596 1 1144 0 0 0 ) + 6823 ( 175 0 1145 1144 0 0 ) + 6824 ( 620 1 1144 0 0 0 ) + 6825 ( 617 1 1144 0 0 0 ) + 6826 ( 241 1 1144 0 0 0 ) + 6827 ( 175 1 1145 0 0 0 ) + 6828 ( 42 4 1145 0 3908 5 ) + 6829 ( 620 1 1145 0 0 0 ) + 6830 ( 175 0 1146 1153 0 0 ) + 6831 ( 672 0 1146 1147 0 0 ) + 6832 ( 42 4 1146 0 3913 4 ) + 6833 ( 620 1 1146 0 0 0 ) + 6834 ( 175 0 1147 1153 0 0 ) + 6835 ( 42 4 1147 0 3917 4 ) + 6836 ( 620 1 1147 0 0 0 ) + 6837 ( 662 0 1147 1148 0 0 ) + 6838 ( 175 0 1148 1153 0 0 ) + 6839 ( 663 1 1148 0 0 0 ) + 6840 ( 620 0 1148 1151 0 0 ) + 6841 ( 620 1 1148 0 0 0 ) + 6842 ( 2 0 1148 1384 0 0 ) + 6843 ( 620 0 1148 1149 0 0 ) + 6844 ( 620 0 1148 1150 0 0 ) + 6845 ( 620 0 1153 1149 0 0 ) + 6846 ( 607 1 1149 0 0 0 ) + 6847 ( 617 0 1149 1166 0 0 ) + 6848 ( 2 0 1149 1384 0 0 ) + 6849 ( 2 0 1149 1389 0 0 ) + 6850 ( 607 1 1149 0 0 0 ) + 6851 ( 42 0 1149 1152 0 0 ) + 6852 ( 2 0 1149 1394 0 0 ) + 6853 ( 42 0 1149 1151 0 0 ) + 6854 ( 607 0 1149 1150 0 0 ) + 6855 ( 802 1 1150 0 0 0 ) + 6856 ( 42 0 1150 1151 0 0 ) + 6857 ( 1420 1 1150 0 0 0 ) + 6858 ( 2 0 1151 1384 0 0 ) + 6859 ( 802 1 1151 0 0 0 ) + 6860 ( 802 0 1151 1152 0 0 ) + 6861 ( 1420 1 1151 0 0 0 ) + 6862 ( 2 0 1152 1394 0 0 ) + 6863 ( 2 0 1152 1384 0 0 ) + 6864 ( 607 1 1152 0 0 0 ) + 6865 ( 620 0 1153 1213 0 0 ) + 6866 ( 615 1 1153 0 0 0 ) + 6867 ( 620 1 1153 0 0 0 ) + 6868 ( 2 0 1153 1384 0 0 ) + 6869 ( 620 0 1153 1166 0 0 ) + 6870 ( 620 1 1153 0 0 0 ) + 6871 ( 620 0 1153 1214 0 0 ) + 6872 ( 620 0 1153 1219 0 0 ) + 6873 ( 604 0 1206 1153 0 0 ) + 6874 ( 422 1 1154 0 0 0 ) + 6875 ( 948 1 1154 0 0 0 ) + 6876 ( 66 4 1154 0 3921 4 ) + 6877 ( 330 1 1154 0 0 0 ) + 6878 ( 888 1 1155 0 0 0 ) + 6879 ( 376 0 1203 1155 0 0 ) + 6880 ( 296 1 1155 0 0 0 ) + 6881 ( 27 1 1155 0 0 0 ) + 6882 ( 945 1 1155 0 0 0 ) + 6883 ( 58 4 1155 0 3925 4 ) + 6884 ( 719 0 1156 1180 0 0 ) + 6885 ( 1027 1 1156 0 0 0 ) + 6886 ( 984 0 1156 1157 0 0 ) + 6887 ( 984 1 1156 0 0 0 ) + 6888 ( 680 0 1156 1164 0 0 ) + 6889 ( 680 1 1156 0 0 0 ) + 6890 ( 680 0 1156 1165 0 0 ) + 6891 ( 719 0 1156 1188 0 0 ) + 6892 ( 323 1 1156 0 0 0 ) + 6893 ( 323 0 1156 1158 0 0 ) + 6894 ( 323 1 1156 0 0 0 ) + 6895 ( 680 0 1157 1247 0 0 ) + 6896 ( 984 0 1180 1157 0 0 ) + 6897 ( 908 0 1179 1157 0 0 ) + 6898 ( 240 0 1183 1157 0 0 ) + 6899 ( 240 0 1182 1157 0 0 ) + 6900 ( 1120 0 1157 1186 0 0 ) + 6901 ( 680 0 1157 1263 0 0 ) + 6902 ( 241 1 1157 0 0 0 ) + 6903 ( 1120 1 1157 0 0 0 ) + 6904 ( 680 1 1157 0 0 0 ) + 6905 ( 719 1 1158 0 0 0 ) + 6906 ( 458 1 1158 0 0 0 ) + 6907 ( 1115 1 1158 0 0 0 ) + 6908 ( 2 0 1159 1444 0 0 ) + 6909 ( 2 0 1159 1412 0 0 ) + 6910 ( 2 0 1159 1385 0 0 ) + 6911 ( 719 0 1159 1220 0 0 ) + 6912 ( 2 0 1159 1443 0 0 ) + 6913 ( 2 0 1159 1442 0 0 ) + 6914 ( 798 0 1159 1161 0 0 ) + 6915 ( 798 0 1159 1160 0 0 ) + 6916 ( 2 0 1159 1454 0 0 ) + 6917 ( 2 0 1159 1441 0 0 ) + 6918 ( 2 0 1159 1403 0 0 ) + 6919 ( 2 0 1159 1402 0 0 ) + 6920 ( 2 0 1159 1388 0 0 ) + 6921 ( 719 0 1159 1252 0 0 ) + 6922 ( 1070 1 1159 0 0 0 ) + 6923 ( 1070 0 1159 1167 0 0 ) + 6924 ( 1027 0 1159 1166 0 0 ) + 6925 ( 639 1 1159 0 0 0 ) + 6926 ( 639 0 1159 1162 0 0 ) + 6927 ( 2 0 1160 1444 0 0 ) + 6928 ( 2 0 1160 1412 0 0 ) + 6929 ( 2 0 1160 1402 0 0 ) + 6930 ( 2 0 1160 1443 0 0 ) + 6931 ( 2 0 1160 1442 0 0 ) + 6932 ( 1060 0 1160 1161 0 0 ) + 6933 ( 639 0 1160 1162 0 0 ) + 6934 ( 639 1 1160 0 0 0 ) + 6935 ( 1027 0 1160 1166 0 0 ) + 6936 ( 2 0 1160 1388 0 0 ) + 6937 ( 2 0 1160 1441 0 0 ) + 6938 ( 2 0 1160 1454 0 0 ) + 6939 ( 1060 0 1402 1161 0 0 ) + 6940 ( 776 1 1161 0 0 0 ) + 6941 ( 1446 4 1161 0 3929 7 ) + 6942 ( 798 0 1403 1161 0 0 ) + 6943 ( 639 1 1161 0 0 0 ) + 6944 ( 719 0 1162 1252 0 0 ) + 6945 ( 1027 0 1162 1166 0 0 ) + 6946 ( 607 1 1162 0 0 0 ) + 6947 ( 607 0 1162 1163 0 0 ) + 6948 ( 1120 1 1162 0 0 0 ) + 6949 ( 615 0 1163 1243 0 0 ) + 6950 ( 615 0 1163 1241 0 0 ) + 6951 ( 1027 0 1163 1235 0 0 ) + 6952 ( 1306 0 1163 1228 0 0 ) + 6953 ( 607 0 1219 1163 0 0 ) + 6954 ( 601 1 1163 0 0 0 ) + 6955 ( 1306 1 1163 0 0 0 ) + 6956 ( 1027 1 1163 0 0 0 ) + 6957 ( 615 1 1163 0 0 0 ) + 6958 ( 607 0 1210 1163 0 0 ) + 6959 ( 607 0 1214 1163 0 0 ) + 6960 ( 1306 0 1163 1224 0 0 ) + 6961 ( 1027 0 1163 1233 0 0 ) + 6962 ( 615 0 1163 1240 0 0 ) + 6963 ( 1027 0 1163 1232 0 0 ) + 6964 ( 1027 0 1163 1237 0 0 ) + 6965 ( 615 0 1163 1239 0 0 ) + 6966 ( 615 0 1163 1244 0 0 ) + 6967 ( 607 0 1252 1163 0 0 ) + 6968 ( 615 0 1163 1164 0 0 ) + 6969 ( 719 0 1164 1241 0 0 ) + 6970 ( 719 0 1164 1257 0 0 ) + 6971 ( 1306 1 1164 0 0 0 ) + 6972 ( 1306 0 1164 1165 0 0 ) + 6973 ( 997 1 1164 0 0 0 ) + 6974 ( 719 0 1165 1245 0 0 ) + 6975 ( 719 0 1165 1257 0 0 ) + 6976 ( 984 1 1165 0 0 0 ) + 6977 ( 1370 1 1165 0 0 0 ) + 6978 ( 2 0 1166 1385 0 0 ) + 6979 ( 607 1 1166 0 0 0 ) + 6980 ( 1027 0 1252 1166 0 0 ) + 6981 ( 710 0 1219 1166 0 0 ) + 6982 ( 2 0 1166 1389 0 0 ) + 6983 ( 2 0 1166 1384 0 0 ) + 6984 ( 1070 0 1220 1167 0 0 ) + 6985 ( 968 0 1213 1167 0 0 ) + 6986 ( 16 1 1167 0 0 0 ) + 6987 ( 2 0 1167 1409 0 0 ) + 6988 ( 1466 0 1223 1167 0 0 ) + 6989 ( 1466 0 1222 1167 0 0 ) + 6990 ( 1467 1 1167 0 0 0 ) + 6991 ( 798 4 1167 0 3936 4 ) + 6992 ( 1046 1 1168 0 0 0 ) + 6993 ( 1472 0 1188 1168 0 0 ) + 6994 ( 1471 1 1168 0 0 0 ) + 6995 ( 1469 1 1168 0 0 0 ) + 6996 ( 313 0 1180 1168 0 0 ) + 6997 ( 1471 0 1168 1192 0 0 ) + 6998 ( 1469 0 1168 1202 0 0 ) + 6999 ( 1046 0 1168 1172 0 0 ) + 7000 ( 312 0 1168 1179 0 0 ) + 7001 ( 601 1 1168 0 0 0 ) + 7002 ( 1469 0 1168 1195 0 0 ) + 7003 ( 1469 0 1169 1196 0 0 ) + 7004 ( 986 0 1169 1170 0 0 ) + 7005 ( 1475 0 1169 1172 0 0 ) + 7006 ( 1469 1 1169 0 0 0 ) + 7007 ( 1469 0 1169 1195 0 0 ) + 7008 ( 908 4 1169 0 3940 4 ) + 7009 ( 601 1 1169 0 0 0 ) + 7010 ( 1464 0 1169 1171 0 0 ) + 7011 ( 1469 0 1170 1199 0 0 ) + 7012 ( 1469 1 1170 0 0 0 ) + 7013 ( 1469 0 1170 1195 0 0 ) + 7014 ( 908 4 1170 0 3944 4 ) + 7015 ( 601 1 1170 0 0 0 ) + 7016 ( 1114 0 1170 1173 0 0 ) + 7017 ( 1464 0 1170 1171 0 0 ) + 7018 ( 1114 0 1171 1173 0 0 ) + 7019 ( 312 0 1171 1179 0 0 ) + 7020 ( 601 1 1171 0 0 0 ) + 7021 ( 908 4 1171 0 3948 5 ) + 7022 ( 1475 0 1171 1172 0 0 ) + 7023 ( 1469 0 1172 1202 0 0 ) + 7024 ( 1469 1 1172 0 0 0 ) + 7025 ( 1469 0 1172 1195 0 0 ) + 7026 ( 908 4 1172 0 3953 5 ) + 7027 ( 601 1 1172 0 0 0 ) + 7028 ( 312 0 1172 1179 0 0 ) + 7029 ( 458 1 1173 0 0 0 ) + 7030 ( 1472 0 1188 1173 0 0 ) + 7031 ( 1115 1 1173 0 0 0 ) + 7032 ( 1469 1 1173 0 0 0 ) + 7033 ( 313 0 1180 1173 0 0 ) + 7034 ( 1469 0 1173 1199 0 0 ) + 7035 ( 458 0 1173 1175 0 0 ) + 7036 ( 458 0 1173 1177 0 0 ) + 7037 ( 1469 0 1173 1195 0 0 ) + 7038 ( 601 1 1173 0 0 0 ) + 7039 ( 312 0 1173 1179 0 0 ) + 7040 ( 1469 0 1174 1198 0 0 ) + 7041 ( 1369 0 1174 1175 0 0 ) + 7042 ( 1464 0 1174 1177 0 0 ) + 7043 ( 601 1 1174 0 0 0 ) + 7044 ( 908 4 1174 0 3958 4 ) + 7045 ( 1469 0 1174 1195 0 0 ) + 7046 ( 1469 1 1174 0 0 0 ) + 7047 ( 1476 0 1174 1176 0 0 ) + 7048 ( 1469 0 1175 1199 0 0 ) + 7049 ( 1464 0 1175 1177 0 0 ) + 7050 ( 601 1 1175 0 0 0 ) + 7051 ( 908 4 1175 0 3962 4 ) + 7052 ( 1469 0 1175 1195 0 0 ) + 7053 ( 1469 1 1175 0 0 0 ) + 7054 ( 1469 0 1176 1200 0 0 ) + 7055 ( 1469 1 1176 0 0 0 ) + 7056 ( 1469 0 1176 1195 0 0 ) + 7057 ( 908 4 1176 0 3966 4 ) + 7058 ( 601 1 1176 0 0 0 ) + 7059 ( 1048 0 1176 1178 0 0 ) + 7060 ( 1464 0 1176 1177 0 0 ) + 7061 ( 1048 0 1177 1178 0 0 ) + 7062 ( 312 0 1177 1179 0 0 ) + 7063 ( 601 1 1177 0 0 0 ) + 7064 ( 908 4 1177 0 3970 8 ) + 7065 ( 313 0 1181 1178 0 0 ) + 7066 ( 1070 1 1178 0 0 0 ) + 7067 ( 710 4 1178 0 3978 5 ) + 7068 ( 1049 1 1178 0 0 0 ) + 7069 ( 1469 1 1178 0 0 0 ) + 7070 ( 1049 0 1178 1189 0 0 ) + 7071 ( 1469 0 1178 1200 0 0 ) + 7072 ( 312 0 1178 1179 0 0 ) + 7073 ( 601 1 1178 0 0 0 ) + 7074 ( 1469 1 1178 0 0 0 ) + 7075 ( 1469 0 1178 1195 0 0 ) + 7076 ( 680 0 1179 1263 0 0 ) + 7077 ( 680 0 1179 1261 0 0 ) + 7078 ( 680 0 1179 1247 0 0 ) + 7079 ( 680 0 1179 1243 0 0 ) + 7080 ( 680 0 1179 1240 0 0 ) + 7081 ( 908 0 1179 1182 0 0 ) + 7082 ( 908 0 1179 1181 0 0 ) + 7083 ( 680 0 1179 1258 0 0 ) + 7084 ( 680 0 1179 1256 0 0 ) + 7085 ( 1471 0 1179 1192 0 0 ) + 7086 ( 908 0 1179 1187 0 0 ) + 7087 ( 680 0 1179 1259 0 0 ) + 7088 ( 908 0 1179 1185 0 0 ) + 7089 ( 908 0 1179 1184 0 0 ) + 7090 ( 908 0 1179 1186 0 0 ) + 7091 ( 908 0 1179 1183 0 0 ) + 7092 ( 908 0 1179 1180 0 0 ) + 7093 ( 601 1 1179 0 0 0 ) + 7094 ( 1070 1 1179 0 0 0 ) + 7095 ( 680 0 1179 1257 0 0 ) + 7096 ( 680 1 1179 0 0 0 ) + 7097 ( 984 1 1180 0 0 0 ) + 7098 ( 313 0 1180 1188 0 0 ) + 7099 ( 1471 1 1180 0 0 0 ) + 7100 ( 680 0 1180 1257 0 0 ) + 7101 ( 680 1 1180 0 0 0 ) + 7102 ( 1471 0 1180 1192 0 0 ) + 7103 ( 984 0 1180 1183 0 0 ) + 7104 ( 313 1 1180 0 0 0 ) + 7105 ( 313 1 1180 0 0 0 ) + 7106 ( 1478 0 1181 1182 0 0 ) + 7107 ( 1070 1 1181 0 0 0 ) + 7108 ( 710 4 1181 0 3983 8 ) + 7109 ( 1478 0 1181 1187 0 0 ) + 7110 ( 1478 0 1181 1184 0 0 ) + 7111 ( 1478 0 1181 1185 0 0 ) + 7112 ( 313 1 1181 0 0 0 ) + 7113 ( 1477 0 1181 1183 0 0 ) + 7114 ( 313 0 1181 1189 0 0 ) + 7115 ( 710 4 1182 0 3991 5 ) + 7116 ( 241 0 1186 1182 0 0 ) + 7117 ( 1159 0 1184 1182 0 0 ) + 7118 ( 1477 0 1182 1183 0 0 ) + 7119 ( 313 0 1183 1190 0 0 ) + 7120 ( 710 4 1183 0 3996 5 ) + 7121 ( 313 1 1183 0 0 0 ) + 7122 ( 680 0 1184 1259 0 0 ) + 7123 ( 1080 0 1184 1185 0 0 ) + 7124 ( 710 4 1184 0 4001 5 ) + 7125 ( 1159 0 1184 1186 0 0 ) + 7126 ( 680 0 1185 1261 0 0 ) + 7127 ( 1412 0 1185 1187 0 0 ) + 7128 ( 710 4 1185 0 4006 5 ) + 7129 ( 680 0 1186 1263 0 0 ) + 7130 ( 710 4 1186 0 4011 4 ) + 7131 ( 710 4 1187 0 4015 4 ) + 7132 ( 1070 1 1187 0 0 0 ) + 7133 ( 984 0 1188 1190 0 0 ) + 7134 ( 1471 1 1188 0 0 0 ) + 7135 ( 984 1 1188 0 0 0 ) + 7136 ( 1472 1 1188 0 0 0 ) + 7137 ( 1472 1 1188 0 0 0 ) + 7138 ( 1477 0 1189 1190 0 0 ) + 7139 ( 1472 1 1189 0 0 0 ) + 7140 ( 710 4 1189 0 4019 4 ) + 7141 ( 1472 1 1190 0 0 0 ) + 7142 ( 710 4 1190 0 4023 4 ) + 7143 ( 680 0 1191 1256 0 0 ) + 7144 ( 1482 0 1191 1192 0 0 ) + 7145 ( 1480 4 1191 0 4027 4 ) + 7146 ( 601 1 1191 0 0 0 ) + 7147 ( 1117 0 1191 1193 0 0 ) + 7148 ( 1117 0 1191 1194 0 0 ) + 7149 ( 1117 1 1191 0 0 0 ) + 7150 ( 1469 0 1191 1195 0 0 ) + 7151 ( 1469 1 1191 0 0 0 ) + 7152 ( 680 1 1191 0 0 0 ) + 7153 ( 1469 0 1191 1202 0 0 ) + 7154 ( 680 0 1192 1256 0 0 ) + 7155 ( 1480 4 1192 0 4031 5 ) + 7156 ( 601 1 1192 0 0 0 ) + 7157 ( 1469 0 1192 1195 0 0 ) + 7158 ( 1469 1 1192 0 0 0 ) + 7159 ( 680 1 1192 0 0 0 ) + 7160 ( 1469 0 1192 1202 0 0 ) + 7161 ( 1484 0 1193 1194 0 0 ) + 7162 ( 853 1 1193 0 0 0 ) + 7163 ( 1117 0 1195 1193 0 0 ) + 7164 ( 601 1 1193 0 0 0 ) + 7165 ( 1263 1 1193 0 0 0 ) + 7166 ( 680 0 1193 1256 0 0 ) + 7167 ( 680 1 1193 0 0 0 ) + 7168 ( 1486 4 1194 0 4036 5 ) + 7169 ( 1117 0 1195 1194 0 0 ) + 7170 ( 1263 1 1194 0 0 0 ) + 7171 ( 680 1 1194 0 0 0 ) + 7172 ( 1488 0 1195 1202 0 0 ) + 7173 ( 1488 0 1195 1200 0 0 ) + 7174 ( 1488 0 1195 1199 0 0 ) + 7175 ( 1488 0 1195 1198 0 0 ) + 7176 ( 1488 0 1195 1197 0 0 ) + 7177 ( 1488 0 1195 1196 0 0 ) + 7178 ( 1488 0 1195 1201 0 0 ) + 7179 ( 1263 1 1195 0 0 0 ) + 7180 ( 1117 1 1195 0 0 0 ) + 7181 ( 1066 1 1195 0 0 0 ) + 7182 ( 601 1 1195 0 0 0 ) + 7183 ( 1475 0 1196 1202 0 0 ) + 7184 ( 986 0 1196 1199 0 0 ) + 7185 ( 986 0 1196 1197 0 0 ) + 7186 ( 1490 4 1196 0 4041 6 ) + 7187 ( 1475 0 1196 1201 0 0 ) + 7188 ( 1492 0 1197 1200 0 0 ) + 7189 ( 1492 0 1197 1199 0 0 ) + 7190 ( 1492 0 1197 1198 0 0 ) + 7191 ( 1490 4 1197 0 4047 6 ) + 7192 ( 1066 1 1197 0 0 0 ) + 7193 ( 1476 0 1198 1200 0 0 ) + 7194 ( 1369 0 1198 1199 0 0 ) + 7195 ( 1490 4 1198 0 4053 4 ) + 7196 ( 1490 4 1199 0 4057 6 ) + 7197 ( 1490 4 1200 0 4063 5 ) + 7198 ( 1066 1 1200 0 0 0 ) + 7199 ( 1492 0 1201 1202 0 0 ) + 7200 ( 1117 1 1201 0 0 0 ) + 7201 ( 1490 4 1201 0 4068 4 ) + 7202 ( 1490 4 1202 0 4072 7 ) + 7203 ( 1117 1 1202 0 0 0 ) + 7204 ( 840 0 1203 1204 0 0 ) + 7205 ( 840 1 1203 0 0 0 ) + 7206 ( 376 1 1203 0 0 0 ) + 7207 ( 376 1 1203 0 0 0 ) + 7208 ( 27 1 1203 0 0 0 ) + 7209 ( 1161 1 1204 0 0 0 ) + 7210 ( 948 1 1204 0 0 0 ) + 7211 ( 376 1 1204 0 0 0 ) + 7212 ( 620 0 1205 1231 0 0 ) + 7213 ( 597 0 1205 1209 0 0 ) + 7214 ( 602 0 1205 1206 0 0 ) + 7215 ( 601 1 1205 0 0 0 ) + 7216 ( 597 0 1205 1207 0 0 ) + 7217 ( 597 1 1205 0 0 0 ) + 7218 ( 604 4 1205 0 4079 5 ) + 7219 ( 620 1 1205 0 0 0 ) + 7220 ( 620 0 1206 1235 0 0 ) + 7221 ( 620 0 1206 1231 0 0 ) + 7222 ( 620 0 1206 1213 0 0 ) + 7223 ( 620 0 1206 1236 0 0 ) + 7224 ( 620 0 1206 1233 0 0 ) + 7225 ( 620 0 1206 1214 0 0 ) + 7226 ( 620 0 1206 1210 0 0 ) + 7227 ( 601 1 1206 0 0 0 ) + 7228 ( 620 1 1206 0 0 0 ) + 7229 ( 620 0 1207 1231 0 0 ) + 7230 ( 1484 0 1207 1209 0 0 ) + 7231 ( 1484 0 1207 1208 0 0 ) + 7232 ( 627 1 1207 0 0 0 ) + 7233 ( 620 1 1207 0 0 0 ) + 7234 ( 601 1 1207 0 0 0 ) + 7235 ( 628 0 1208 1209 0 0 ) + 7236 ( 618 4 1208 0 4084 4 ) + 7237 ( 620 1 1208 0 0 0 ) + 7238 ( 618 4 1209 0 4088 4 ) + 7239 ( 620 1 1209 0 0 0 ) + 7240 ( 607 0 1210 1235 0 0 ) + 7241 ( 607 0 1210 1228 0 0 ) + 7242 ( 908 0 1210 1216 0 0 ) + 7243 ( 908 0 1210 1215 0 0 ) + 7244 ( 607 0 1210 1229 0 0 ) + 7245 ( 607 0 1210 1226 0 0 ) + 7246 ( 908 0 1210 1217 0 0 ) + 7247 ( 908 0 1210 1218 0 0 ) + 7248 ( 1064 0 1210 1212 0 0 ) + 7249 ( 1064 0 1210 1211 0 0 ) + 7250 ( 607 0 1210 1233 0 0 ) + 7251 ( 607 0 1210 1224 0 0 ) + 7252 ( 908 0 1210 1214 0 0 ) + 7253 ( 607 1 1210 0 0 0 ) + 7254 ( 607 1 1210 0 0 0 ) + 7255 ( 601 1 1210 0 0 0 ) + 7256 ( 638 0 1210 1213 0 0 ) + 7257 ( 607 0 1211 1226 0 0 ) + 7258 ( 1494 0 1211 1212 0 0 ) + 7259 ( 601 1 1211 0 0 0 ) + 7260 ( 908 4 1211 0 4092 5 ) + 7261 ( 607 1 1211 0 0 0 ) + 7262 ( 607 1 1211 0 0 0 ) + 7263 ( 16 1 1211 0 0 0 ) + 7264 ( 638 0 1212 1213 0 0 ) + 7265 ( 601 1 1212 0 0 0 ) + 7266 ( 908 4 1212 0 4097 4 ) + 7267 ( 16 1 1212 0 0 0 ) + 7268 ( 2 0 1213 1444 0 0 ) + 7269 ( 2 0 1213 1412 0 0 ) + 7270 ( 2 0 1213 1385 0 0 ) + 7271 ( 639 0 1213 1216 0 0 ) + 7272 ( 639 1 1213 0 0 0 ) + 7273 ( 968 0 1213 1219 0 0 ) + 7274 ( 16 1 1213 0 0 0 ) + 7275 ( 2 0 1213 1402 0 0 ) + 7276 ( 2 0 1213 1403 0 0 ) + 7277 ( 2 0 1213 1409 0 0 ) + 7278 ( 2 0 1213 1438 0 0 ) + 7279 ( 2 0 1213 1454 0 0 ) + 7280 ( 639 0 1213 1214 0 0 ) + 7281 ( 968 0 1213 1220 0 0 ) + 7282 ( 639 0 1213 1217 0 0 ) + 7283 ( 968 0 1213 1223 0 0 ) + 7284 ( 968 0 1213 1221 0 0 ) + 7285 ( 968 0 1213 1222 0 0 ) + 7286 ( 16 0 1213 1254 0 0 ) + 7287 ( 601 1 1213 0 0 0 ) + 7288 ( 2 0 1213 1437 0 0 ) + 7289 ( 1120 0 1214 1218 0 0 ) + 7290 ( 968 0 1214 1219 0 0 ) + 7291 ( 607 1 1214 0 0 0 ) + 7292 ( 607 1 1214 0 0 0 ) + 7293 ( 1494 0 1215 1216 0 0 ) + 7294 ( 607 1 1215 0 0 0 ) + 7295 ( 1498 4 1215 0 4101 4 ) + 7296 ( 1159 0 1215 1218 0 0 ) + 7297 ( 968 4 1215 0 4105 5 ) + 7298 ( 1496 0 1215 1217 0 0 ) + 7299 ( 968 4 1216 0 4110 4 ) + 7300 ( 1501 0 1216 1217 0 0 ) + 7301 ( 1498 4 1216 0 4114 4 ) + 7302 ( 1159 0 1217 1218 0 0 ) + 7303 ( 968 4 1217 0 4118 5 ) + 7304 ( 968 4 1218 0 4123 5 ) + 7305 ( 607 1 1218 0 0 0 ) + 7306 ( 2 0 1219 1444 0 0 ) + 7307 ( 2 0 1219 1385 0 0 ) + 7308 ( 1120 0 1219 1220 0 0 ) + 7309 ( 2 0 1219 1454 0 0 ) + 7310 ( 710 0 1219 1252 0 0 ) + 7311 ( 607 1 1219 0 0 0 ) + 7312 ( 607 1 1219 0 0 0 ) + 7313 ( 1120 1 1219 0 0 0 ) + 7314 ( 2 0 1220 1412 0 0 ) + 7315 ( 1120 0 1252 1220 0 0 ) + 7316 ( 639 1 1220 0 0 0 ) + 7317 ( 1070 1 1220 0 0 0 ) + 7318 ( 2 0 1220 1402 0 0 ) + 7319 ( 2 0 1220 1403 0 0 ) + 7320 ( 2 0 1220 1441 0 0 ) + 7321 ( 2 0 1220 1442 0 0 ) + 7322 ( 2 0 1220 1443 0 0 ) + 7323 ( 1070 0 1220 1223 0 0 ) + 7324 ( 656 0 1221 1222 0 0 ) + 7325 ( 16 1 1221 0 0 0 ) + 7326 ( 710 4 1221 0 4128 4 ) + 7327 ( 639 1 1221 0 0 0 ) + 7328 ( 1083 0 1221 1223 0 0 ) + 7329 ( 16 1 1222 0 0 0 ) + 7330 ( 710 4 1222 0 4132 4 ) + 7331 ( 1083 0 1222 1223 0 0 ) + 7332 ( 639 1 1223 0 0 0 ) + 7333 ( 710 4 1223 0 4136 5 ) + 7334 ( 252 0 1224 1228 0 0 ) + 7335 ( 252 0 1224 1227 0 0 ) + 7336 ( 252 0 1224 1229 0 0 ) + 7337 ( 1502 0 1224 1226 0 0 ) + 7338 ( 1502 0 1224 1225 0 0 ) + 7339 ( 615 0 1224 1248 0 0 ) + 7340 ( 615 0 1224 1240 0 0 ) + 7341 ( 601 1 1224 0 0 0 ) + 7342 ( 615 0 1225 1249 0 0 ) + 7343 ( 608 0 1225 1226 0 0 ) + 7344 ( 252 4 1225 0 4141 4 ) + 7345 ( 601 1 1225 0 0 0 ) + 7346 ( 1070 1 1225 0 0 0 ) + 7347 ( 615 0 1225 1240 0 0 ) + 7348 ( 252 4 1226 0 4145 5 ) + 7349 ( 601 1 1226 0 0 0 ) + 7350 ( 1070 1 1226 0 0 0 ) + 7351 ( 1015 0 1227 1228 0 0 ) + 7352 ( 1504 4 1227 0 4150 5 ) + 7353 ( 252 0 1248 1227 0 0 ) + 7354 ( 1507 0 1227 1251 0 0 ) + 7355 ( 608 0 1227 1229 0 0 ) + 7356 ( 1504 4 1228 0 4155 7 ) + 7357 ( 1508 0 1228 1229 0 0 ) + 7358 ( 252 0 1248 1228 0 0 ) + 7359 ( 1370 0 1245 1228 0 0 ) + 7360 ( 1306 0 1241 1228 0 0 ) + 7361 ( 1015 0 1251 1228 0 0 ) + 7362 ( 1504 4 1229 0 4162 4 ) + 7363 ( 920 0 1230 1232 0 0 ) + 7364 ( 1513 0 1230 1231 0 0 ) + 7365 ( 920 0 1230 1238 0 0 ) + 7366 ( 627 1 1230 0 0 0 ) + 7367 ( 1510 4 1230 0 4166 6 ) + 7368 ( 601 1 1230 0 0 0 ) + 7369 ( 627 0 1230 1255 0 0 ) + 7370 ( 670 0 1230 1233 0 0 ) + 7371 ( 627 1 1231 0 0 0 ) + 7372 ( 1510 4 1231 0 4172 6 ) + 7373 ( 601 1 1231 0 0 0 ) + 7374 ( 670 0 1231 1233 0 0 ) + 7375 ( 610 0 1238 1232 0 0 ) + 7376 ( 601 1 1232 0 0 0 ) + 7377 ( 1510 4 1232 0 4178 5 ) + 7378 ( 1027 0 1239 1232 0 0 ) + 7379 ( 670 0 1232 1233 0 0 ) + 7380 ( 1510 0 1233 1235 0 0 ) + 7381 ( 1510 0 1233 1234 0 0 ) + 7382 ( 1510 0 1233 1236 0 0 ) + 7383 ( 1510 0 1233 1237 0 0 ) + 7384 ( 601 1 1233 0 0 0 ) + 7385 ( 608 0 1234 1235 0 0 ) + 7386 ( 920 0 1234 1237 0 0 ) + 7387 ( 1514 4 1234 0 4183 4 ) + 7388 ( 1513 0 1234 1236 0 0 ) + 7389 ( 1514 4 1235 0 4187 6 ) + 7390 ( 609 0 1235 1236 0 0 ) + 7391 ( 609 0 1235 1237 0 0 ) + 7392 ( 1514 4 1236 0 4193 4 ) + 7393 ( 1514 4 1237 0 4197 4 ) + 7394 ( 627 0 1238 1255 0 0 ) + 7395 ( 610 0 1238 1239 0 0 ) + 7396 ( 1046 0 1238 1240 0 0 ) + 7397 ( 601 1 1238 0 0 0 ) + 7398 ( 1510 4 1238 0 4201 5 ) + 7399 ( 1510 4 1239 0 4206 4 ) + 7400 ( 601 1 1239 0 0 0 ) + 7401 ( 1046 0 1239 1240 0 0 ) + 7402 ( 1510 0 1240 1263 0 0 ) + 7403 ( 1510 0 1240 1261 0 0 ) + 7404 ( 1510 0 1240 1247 0 0 ) + 7405 ( 1510 0 1240 1243 0 0 ) + 7406 ( 1510 0 1240 1242 0 0 ) + 7407 ( 1510 0 1240 1257 0 0 ) + 7408 ( 1070 1 1240 0 0 0 ) + 7409 ( 601 1 1240 0 0 0 ) + 7410 ( 1510 0 1240 1259 0 0 ) + 7411 ( 1510 0 1240 1260 0 0 ) + 7412 ( 1510 0 1240 1262 0 0 ) + 7413 ( 1046 0 1255 1240 0 0 ) + 7414 ( 1046 0 1256 1240 0 0 ) + 7415 ( 1510 0 1240 1258 0 0 ) + 7416 ( 1510 0 1240 1250 0 0 ) + 7417 ( 1510 0 1240 1249 0 0 ) + 7418 ( 1510 0 1240 1246 0 0 ) + 7419 ( 1510 0 1240 1244 0 0 ) + 7420 ( 1510 0 1240 1248 0 0 ) + 7421 ( 1510 0 1240 1245 0 0 ) + 7422 ( 1510 0 1240 1241 0 0 ) + 7423 ( 1306 0 1241 1245 0 0 ) + 7424 ( 997 0 1241 1243 0 0 ) + 7425 ( 997 1 1241 0 0 0 ) + 7426 ( 1306 1 1241 0 0 0 ) + 7427 ( 627 0 1241 1257 0 0 ) + 7428 ( 1306 0 1241 1248 0 0 ) + 7429 ( 1474 0 1242 1243 0 0 ) + 7430 ( 1516 4 1242 0 4210 5 ) + 7431 ( 747 0 1242 1258 0 0 ) + 7432 ( 610 0 1242 1244 0 0 ) + 7433 ( 1516 4 1243 0 4215 7 ) + 7434 ( 1475 0 1243 1244 0 0 ) + 7435 ( 997 0 1257 1243 0 0 ) + 7436 ( 1474 0 1258 1243 0 0 ) + 7437 ( 1516 4 1244 0 4222 4 ) + 7438 ( 1370 1 1245 0 0 0 ) + 7439 ( 984 1 1245 0 0 0 ) + 7440 ( 627 0 1245 1257 0 0 ) + 7441 ( 1370 0 1245 1251 0 0 ) + 7442 ( 1370 0 1245 1250 0 0 ) + 7443 ( 984 0 1245 1247 0 0 ) + 7444 ( 1370 0 1245 1248 0 0 ) + 7445 ( 1370 0 1246 1250 0 0 ) + 7446 ( 627 0 1246 1262 0 0 ) + 7447 ( 1477 0 1246 1247 0 0 ) + 7448 ( 710 4 1246 0 4226 6 ) + 7449 ( 1370 1 1246 0 0 0 ) + 7450 ( 1070 1 1246 0 0 0 ) + 7451 ( 627 0 1246 1259 0 0 ) + 7452 ( 627 0 1246 1260 0 0 ) + 7453 ( 710 4 1247 0 4232 7 ) + 7454 ( 984 0 1257 1247 0 0 ) + 7455 ( 1477 0 1263 1247 0 0 ) + 7456 ( 1477 0 1262 1247 0 0 ) + 7457 ( 1370 0 1247 1250 0 0 ) + 7458 ( 1370 1 1247 0 0 0 ) + 7459 ( 252 0 1248 1251 0 0 ) + 7460 ( 1502 0 1248 1250 0 0 ) + 7461 ( 1502 0 1248 1249 0 0 ) + 7462 ( 1507 0 1249 1250 0 0 ) + 7463 ( 252 4 1249 0 4239 4 ) + 7464 ( 1070 1 1249 0 0 0 ) + 7465 ( 252 4 1250 0 4243 6 ) + 7466 ( 1070 1 1250 0 0 0 ) + 7467 ( 1504 4 1251 0 4249 4 ) + 7468 ( 2 0 1252 1444 0 0 ) + 7469 ( 2 0 1252 1385 0 0 ) + 7470 ( 2 0 1252 1454 0 0 ) + 7471 ( 607 1 1252 0 0 0 ) + 7472 ( 1120 1 1252 0 0 0 ) + 7473 ( 1521 0 1253 1254 0 0 ) + 7474 ( 1518 1 1253 0 0 0 ) + 7475 ( 601 1 1253 0 0 0 ) + 7476 ( 908 4 1253 0 4253 4 ) + 7477 ( 770 1 1253 0 0 0 ) + 7478 ( 639 1 1253 0 0 0 ) + 7479 ( 601 1 1254 0 0 0 ) + 7480 ( 16 0 1409 1254 0 0 ) + 7481 ( 908 4 1254 0 4257 7 ) + 7482 ( 770 1 1254 0 0 0 ) + 7483 ( 16 0 1410 1254 0 0 ) + 7484 ( 16 0 1411 1254 0 0 ) + 7485 ( 639 1 1254 0 0 0 ) + 7486 ( 747 0 1255 1256 0 0 ) + 7487 ( 1510 4 1255 0 4264 5 ) + 7488 ( 601 1 1255 0 0 0 ) + 7489 ( 853 1 1255 0 0 0 ) + 7490 ( 1510 4 1256 0 4269 7 ) + 7491 ( 601 1 1256 0 0 0 ) + 7492 ( 853 1 1256 0 0 0 ) + 7493 ( 984 1 1257 0 0 0 ) + 7494 ( 997 1 1257 0 0 0 ) + 7495 ( 1516 4 1258 0 4276 4 ) + 7496 ( 1159 0 1259 1263 0 0 ) + 7497 ( 1080 0 1259 1261 0 0 ) + 7498 ( 1159 0 1259 1262 0 0 ) + 7499 ( 1080 0 1259 1260 0 0 ) + 7500 ( 710 4 1259 0 4280 6 ) + 7501 ( 747 0 1260 1261 0 0 ) + 7502 ( 710 4 1260 0 4286 4 ) + 7503 ( 1070 1 1260 0 0 0 ) + 7504 ( 710 4 1261 0 4290 5 ) + 7505 ( 1070 1 1261 0 0 0 ) + 7506 ( 747 0 1262 1263 0 0 ) + 7507 ( 710 4 1262 0 4295 4 ) + 7508 ( 710 4 1263 0 4299 5 ) + 7509 ( 1156 0 1264 1474 0 0 ) + 7510 ( 1156 0 1264 1466 0 0 ) + 7511 ( 1156 0 1264 1445 0 0 ) + 7512 ( 1529 0 1264 1266 0 0 ) + 7513 ( 1526 1 1264 0 0 0 ) + 7514 ( 1525 1 1264 0 0 0 ) + 7515 ( 468 4 1264 0 4304 5 ) + 7516 ( 1156 1 1264 0 0 0 ) + 7517 ( 1156 0 1264 1458 0 0 ) + 7518 ( 819 1 1264 0 0 0 ) + 7519 ( 1156 0 1264 1471 0 0 ) + 7520 ( 1096 0 1265 1266 0 0 ) + 7521 ( 793 0 1265 1346 0 0 ) + 7522 ( 793 0 1265 1352 0 0 ) + 7523 ( 793 0 1265 1281 0 0 ) + 7524 ( 468 4 1265 0 4309 4 ) + 7525 ( 1526 1 1265 0 0 0 ) + 7526 ( 1525 1 1265 0 0 0 ) + 7527 ( 1475 1 1265 0 0 0 ) + 7528 ( 1526 1 1266 0 0 0 ) + 7529 ( 1525 1 1266 0 0 0 ) + 7530 ( 468 4 1266 0 4313 7 ) + 7531 ( 1096 0 1288 1266 0 0 ) + 7532 ( 1096 0 1284 1266 0 0 ) + 7533 ( 1096 0 1283 1266 0 0 ) + 7534 ( 1096 0 1281 1266 0 0 ) + 7535 ( 819 1 1266 0 0 0 ) + 7536 ( 1096 0 1346 1266 0 0 ) + 7537 ( 882 0 1267 1272 0 0 ) + 7538 ( 66 4 1267 0 4320 10 ) + 7539 ( 884 1 1267 0 0 0 ) + 7540 ( 884 0 1267 1269 0 0 ) + 7541 ( 884 1 1267 0 0 0 ) + 7542 ( 882 1 1267 0 0 0 ) + 7543 ( 882 0 1267 1274 0 0 ) + 7544 ( 882 1 1267 0 0 0 ) + 7545 ( 855 1 1267 0 0 0 ) + 7546 ( 855 1 1267 0 0 0 ) + 7547 ( 31 1 1267 0 0 0 ) + 7548 ( 31 0 1267 1275 0 0 ) + 7549 ( 31 1 1267 0 0 0 ) + 7550 ( 66 4 1268 0 4330 9 ) + 7551 ( 804 1 1268 0 0 0 ) + 7552 ( 809 0 1268 1270 0 0 ) + 7553 ( 852 1 1268 0 0 0 ) + 7554 ( 852 0 1268 1292 0 0 ) + 7555 ( 809 0 1268 1271 0 0 ) + 7556 ( 804 1 1268 0 0 0 ) + 7557 ( 804 1 1268 0 0 0 ) + 7558 ( 417 1 1268 0 0 0 ) + 7559 ( 852 1 1268 0 0 0 ) + 7560 ( 804 1 1268 0 0 0 ) + 7561 ( 31 0 1269 1275 0 0 ) + 7562 ( 882 1 1269 0 0 0 ) + 7563 ( 882 0 1269 1274 0 0 ) + 7564 ( 882 1 1269 0 0 0 ) + 7565 ( 817 1 1269 0 0 0 ) + 7566 ( 820 1 1269 0 0 0 ) + 7567 ( 882 0 1270 1271 0 0 ) + 7568 ( 881 1 1270 0 0 0 ) + 7569 ( 881 0 1271 1273 0 0 ) + 7570 ( 852 1 1271 0 0 0 ) + 7571 ( 881 1 1271 0 0 0 ) + 7572 ( 66 4 1271 0 4339 4 ) + 7573 ( 824 0 1272 1273 0 0 ) + 7574 ( 884 1 1272 0 0 0 ) + 7575 ( 819 1 1272 0 0 0 ) + 7576 ( 852 1 1272 0 0 0 ) + 7577 ( 66 4 1272 0 4343 4 ) + 7578 ( 884 1 1273 0 0 0 ) + 7579 ( 852 1 1273 0 0 0 ) + 7580 ( 66 4 1273 0 4347 4 ) + 7581 ( 830 1 1274 0 0 0 ) + 7582 ( 882 0 1275 1274 0 0 ) + 7583 ( 829 1 1274 0 0 0 ) + 7584 ( 417 1 1274 0 0 0 ) + 7585 ( 852 1 1274 0 0 0 ) + 7586 ( 66 4 1274 0 4351 4 ) + 7587 ( 417 1 1275 0 0 0 ) + 7588 ( 417 1 1275 0 0 0 ) + 7589 ( 417 1 1275 0 0 0 ) + 7590 ( 417 0 1275 1280 0 0 ) + 7591 ( 882 1 1275 0 0 0 ) + 7592 ( 882 1 1275 0 0 0 ) + 7593 ( 817 1 1275 0 0 0 ) + 7594 ( 820 1 1275 0 0 0 ) + 7595 ( 1531 0 1276 1357 0 0 ) + 7596 ( 1531 0 1276 1353 0 0 ) + 7597 ( 794 4 1276 0 4355 8 ) + 7598 ( 804 1 1276 0 0 0 ) + 7599 ( 882 1 1276 0 0 0 ) + 7600 ( 882 0 1276 1279 0 0 ) + 7601 ( 882 1 1276 0 0 0 ) + 7602 ( 882 0 1276 1278 0 0 ) + 7603 ( 815 0 1276 1277 0 0 ) + 7604 ( 815 0 1357 1277 0 0 ) + 7605 ( 882 1 1277 0 0 0 ) + 7606 ( 705 0 1277 1360 0 0 ) + 7607 ( 705 1 1277 0 0 0 ) + 7608 ( 705 0 1277 1362 0 0 ) + 7609 ( 794 4 1277 0 4363 4 ) + 7610 ( 1533 1 1278 0 0 0 ) + 7611 ( 882 0 1357 1278 0 0 ) + 7612 ( 914 1 1278 0 0 0 ) + 7613 ( 705 1 1278 0 0 0 ) + 7614 ( 852 1 1278 0 0 0 ) + 7615 ( 794 4 1278 0 4367 4 ) + 7616 ( 1531 0 1279 1358 0 0 ) + 7617 ( 1531 0 1279 1353 0 0 ) + 7618 ( 852 1 1279 0 0 0 ) + 7619 ( 852 0 1279 1349 0 0 ) + 7620 ( 852 1 1279 0 0 0 ) + 7621 ( 794 4 1279 0 4371 6 ) + 7622 ( 804 1 1279 0 0 0 ) + 7623 ( 881 1 1279 0 0 0 ) + 7624 ( 848 1 1280 0 0 0 ) + 7625 ( 417 0 1281 1346 0 0 ) + 7626 ( 417 0 1281 1352 0 0 ) + 7627 ( 1535 0 1281 1304 0 0 ) + 7628 ( 1535 0 1281 1288 0 0 ) + 7629 ( 1535 0 1281 1284 0 0 ) + 7630 ( 1475 1 1281 0 0 0 ) + 7631 ( 468 4 1281 0 4377 5 ) + 7632 ( 997 1 1282 0 0 0 ) + 7633 ( 997 0 1282 1291 0 0 ) + 7634 ( 66 4 1282 0 4382 5 ) + 7635 ( 51 0 1282 1288 0 0 ) + 7636 ( 819 0 1282 1287 0 0 ) + 7637 ( 1536 1 1282 0 0 0 ) + 7638 ( 1536 0 1282 1284 0 0 ) + 7639 ( 1098 1 1282 0 0 0 ) + 7640 ( 1098 0 1282 1283 0 0 ) + 7641 ( 51 0 1283 1288 0 0 ) + 7642 ( 819 1 1283 0 0 0 ) + 7643 ( 1536 0 1283 1284 0 0 ) + 7644 ( 468 4 1283 0 4387 4 ) + 7645 ( 997 0 1284 1304 0 0 ) + 7646 ( 51 0 1284 1288 0 0 ) + 7647 ( 468 4 1284 0 4391 5 ) + 7648 ( 855 0 1285 1397 0 0 ) + 7649 ( 836 1 1285 0 0 0 ) + 7650 ( 997 1 1285 0 0 0 ) + 7651 ( 997 0 1285 1294 0 0 ) + 7652 ( 1096 0 1285 1305 0 0 ) + 7653 ( 417 0 1285 1335 0 0 ) + 7654 ( 836 1 1285 0 0 0 ) + 7655 ( 66 0 1285 1289 0 0 ) + 7656 ( 66 0 1285 1290 0 0 ) + 7657 ( 1096 0 1285 1314 0 0 ) + 7658 ( 1096 0 1285 1315 0 0 ) + 7659 ( 855 0 1285 1398 0 0 ) + 7660 ( 836 0 1285 1286 0 0 ) + 7661 ( 1538 0 1286 1287 0 0 ) + 7662 ( 1098 1 1286 0 0 0 ) + 7663 ( 51 1 1286 0 0 0 ) + 7664 ( 66 4 1286 0 4396 4 ) + 7665 ( 997 1 1286 0 0 0 ) + 7666 ( 997 1 1287 0 0 0 ) + 7667 ( 66 4 1287 0 4400 4 ) + 7668 ( 51 1 1287 0 0 0 ) + 7669 ( 1098 1 1287 0 0 0 ) + 7670 ( 417 0 1288 1346 0 0 ) + 7671 ( 997 0 1288 1291 0 0 ) + 7672 ( 417 0 1288 1352 0 0 ) + 7673 ( 417 0 1288 1344 0 0 ) + 7674 ( 997 0 1288 1304 0 0 ) + 7675 ( 997 1 1288 0 0 0 ) + 7676 ( 819 1 1288 0 0 0 ) + 7677 ( 6 4 1289 0 4404 5 ) + 7678 ( 855 0 1289 1398 0 0 ) + 7679 ( 1096 0 1289 1314 0 0 ) + 7680 ( 997 1 1289 0 0 0 ) + 7681 ( 997 0 1289 1300 0 0 ) + 7682 ( 997 0 1289 1299 0 0 ) + 7683 ( 850 1 1289 0 0 0 ) + 7684 ( 850 0 1289 1290 0 0 ) + 7685 ( 1542 4 1290 0 4409 6 ) + 7686 ( 850 0 1314 1290 0 0 ) + 7687 ( 66 0 1315 1290 0 0 ) + 7688 ( 1016 0 1290 1319 0 0 ) + 7689 ( 1016 0 1290 1324 0 0 ) + 7690 ( 1016 1 1290 0 0 0 ) + 7691 ( 997 1 1290 0 0 0 ) + 7692 ( 1540 4 1290 0 4415 5 ) + 7693 ( 879 0 1291 1348 0 0 ) + 7694 ( 809 1 1291 0 0 0 ) + 7695 ( 997 0 1344 1291 0 0 ) + 7696 ( 1027 1 1291 0 0 0 ) + 7697 ( 1536 1 1291 0 0 0 ) + 7698 ( 1536 0 1291 1352 0 0 ) + 7699 ( 1536 1 1291 0 0 0 ) + 7700 ( 1536 0 1291 1304 0 0 ) + 7701 ( 1536 1 1291 0 0 0 ) + 7702 ( 66 4 1291 0 4420 4 ) + 7703 ( 1027 0 1291 1293 0 0 ) + 7704 ( 1536 1 1292 0 0 0 ) + 7705 ( 66 4 1292 0 4424 4 ) + 7706 ( 51 1 1292 0 0 0 ) + 7707 ( 809 1 1292 0 0 0 ) + 7708 ( 1164 0 1292 1293 0 0 ) + 7709 ( 1536 1 1293 0 0 0 ) + 7710 ( 66 4 1293 0 4428 4 ) + 7711 ( 51 1 1293 0 0 0 ) + 7712 ( 809 1 1293 0 0 0 ) + 7713 ( 855 0 1294 1397 0 0 ) + 7714 ( 417 0 1294 1334 0 0 ) + 7715 ( 973 0 1294 1298 0 0 ) + 7716 ( 855 0 1294 1398 0 0 ) + 7717 ( 66 0 1294 1300 0 0 ) + 7718 ( 66 0 1294 1299 0 0 ) + 7719 ( 973 1 1294 0 0 0 ) + 7720 ( 973 0 1294 1295 0 0 ) + 7721 ( 866 1 1294 0 0 0 ) + 7722 ( 855 0 1295 1399 0 0 ) + 7723 ( 855 0 1295 1397 0 0 ) + 7724 ( 417 0 1295 1334 0 0 ) + 7725 ( 66 0 1295 1303 0 0 ) + 7726 ( 66 0 1295 1302 0 0 ) + 7727 ( 816 0 1295 1297 0 0 ) + 7728 ( 816 0 1295 1298 0 0 ) + 7729 ( 855 0 1295 1398 0 0 ) + 7730 ( 66 0 1295 1301 0 0 ) + 7731 ( 816 1 1295 0 0 0 ) + 7732 ( 1027 1 1295 0 0 0 ) + 7733 ( 417 0 1296 1334 0 0 ) + 7734 ( 829 0 1296 1297 0 0 ) + 7735 ( 866 1 1296 0 0 0 ) + 7736 ( 1027 1 1296 0 0 0 ) + 7737 ( 470 4 1296 0 4432 4 ) + 7738 ( 1168 0 1296 1298 0 0 ) + 7739 ( 417 0 1297 1334 0 0 ) + 7740 ( 1027 1 1297 0 0 0 ) + 7741 ( 470 4 1297 0 4436 4 ) + 7742 ( 1168 0 1297 1298 0 0 ) + 7743 ( 417 0 1298 1334 0 0 ) + 7744 ( 470 4 1298 0 4440 5 ) + 7745 ( 866 1 1298 0 0 0 ) + 7746 ( 6 4 1299 0 4445 5 ) + 7747 ( 855 0 1299 1398 0 0 ) + 7748 ( 973 0 1299 1301 0 0 ) + 7749 ( 973 1 1299 0 0 0 ) + 7750 ( 1544 1 1299 0 0 0 ) + 7751 ( 1544 0 1299 1300 0 0 ) + 7752 ( 973 1 1300 0 0 0 ) + 7753 ( 1546 1 1300 0 0 0 ) + 7754 ( 1549 0 1301 1303 0 0 ) + 7755 ( 6 4 1301 0 4450 4 ) + 7756 ( 855 0 1301 1398 0 0 ) + 7757 ( 1549 1 1301 0 0 0 ) + 7758 ( 816 1 1301 0 0 0 ) + 7759 ( 855 0 1302 1399 0 0 ) + 7760 ( 1550 0 1302 1303 0 0 ) + 7761 ( 902 4 1302 0 4454 4 ) + 7762 ( 816 1 1302 0 0 0 ) + 7763 ( 1027 1 1302 0 0 0 ) + 7764 ( 855 0 1303 1399 0 0 ) + 7765 ( 902 4 1303 0 4458 4 ) + 7766 ( 816 1 1303 0 0 0 ) + 7767 ( 417 0 1304 1352 0 0 ) + 7768 ( 468 4 1304 0 4462 4 ) + 7769 ( 1475 1 1304 0 0 0 ) + 7770 ( 855 0 1305 1397 0 0 ) + 7771 ( 1016 0 1305 1309 0 0 ) + 7772 ( 417 0 1305 1335 0 0 ) + 7773 ( 1016 0 1305 1306 0 0 ) + 7774 ( 1552 0 1305 1314 0 0 ) + 7775 ( 1552 0 1305 1315 0 0 ) + 7776 ( 836 1 1305 0 0 0 ) + 7777 ( 855 0 1306 1397 0 0 ) + 7778 ( 1552 0 1306 1322 0 0 ) + 7779 ( 1552 0 1306 1321 0 0 ) + 7780 ( 1552 0 1306 1320 0 0 ) + 7781 ( 858 1 1306 0 0 0 ) + 7782 ( 1556 0 1306 1310 0 0 ) + 7783 ( 417 0 1306 1336 0 0 ) + 7784 ( 1556 0 1306 1313 0 0 ) + 7785 ( 1556 0 1306 1312 0 0 ) + 7786 ( 1552 0 1306 1323 0 0 ) + 7787 ( 1552 0 1306 1325 0 0 ) + 7788 ( 1552 0 1306 1318 0 0 ) + 7789 ( 1552 0 1306 1317 0 0 ) + 7790 ( 858 0 1306 1308 0 0 ) + 7791 ( 858 0 1306 1309 0 0 ) + 7792 ( 417 0 1306 1335 0 0 ) + 7793 ( 1552 0 1306 1324 0 0 ) + 7794 ( 1552 0 1306 1319 0 0 ) + 7795 ( 1552 0 1306 1316 0 0 ) + 7796 ( 913 0 1307 1308 0 0 ) + 7797 ( 417 0 1307 1335 0 0 ) + 7798 ( 836 1 1307 0 0 0 ) + 7799 ( 1552 4 1307 0 4466 4 ) + 7800 ( 1554 1 1307 0 0 0 ) + 7801 ( 977 0 1307 1309 0 0 ) + 7802 ( 417 0 1308 1335 0 0 ) + 7803 ( 1552 4 1308 0 4470 5 ) + 7804 ( 1554 1 1308 0 0 0 ) + 7805 ( 977 0 1308 1309 0 0 ) + 7806 ( 1552 4 1309 0 4475 6 ) + 7807 ( 836 1 1309 0 0 0 ) + 7808 ( 417 0 1309 1335 0 0 ) + 7809 ( 855 0 1310 1397 0 0 ) + 7810 ( 1012 1 1310 0 0 0 ) + 7811 ( 659 0 1326 1310 0 0 ) + 7812 ( 1558 1 1310 0 0 0 ) + 7813 ( 1556 0 1320 1310 0 0 ) + 7814 ( 1556 0 1323 1310 0 0 ) + 7815 ( 659 0 1327 1310 0 0 ) + 7816 ( 659 0 1328 1310 0 0 ) + 7817 ( 1556 0 1321 1310 0 0 ) + 7818 ( 1558 0 1310 1313 0 0 ) + 7819 ( 417 0 1310 1336 0 0 ) + 7820 ( 1561 0 1311 1312 0 0 ) + 7821 ( 417 0 1311 1336 0 0 ) + 7822 ( 1552 4 1311 0 4481 4 ) + 7823 ( 1012 1 1311 0 0 0 ) + 7824 ( 858 1 1311 0 0 0 ) + 7825 ( 645 0 1311 1313 0 0 ) + 7826 ( 417 0 1312 1336 0 0 ) + 7827 ( 1552 4 1312 0 4485 4 ) + 7828 ( 858 1 1312 0 0 0 ) + 7829 ( 645 0 1312 1313 0 0 ) + 7830 ( 1012 1 1313 0 0 0 ) + 7831 ( 1552 4 1313 0 4489 5 ) + 7832 ( 417 0 1313 1336 0 0 ) + 7833 ( 855 0 1314 1397 0 0 ) + 7834 ( 1016 0 1314 1318 0 0 ) + 7835 ( 1016 0 1314 1317 0 0 ) + 7836 ( 6 4 1314 0 4494 5 ) + 7837 ( 855 0 1314 1398 0 0 ) + 7838 ( 850 1 1314 0 0 0 ) + 7839 ( 850 0 1314 1315 0 0 ) + 7840 ( 836 1 1315 0 0 0 ) + 7841 ( 1016 1 1315 0 0 0 ) + 7842 ( 1016 0 1315 1324 0 0 ) + 7843 ( 1016 0 1315 1319 0 0 ) + 7844 ( 855 0 1316 1397 0 0 ) + 7845 ( 1532 0 1316 1325 0 0 ) + 7846 ( 1018 0 1316 1322 0 0 ) + 7847 ( 1018 0 1316 1323 0 0 ) + 7848 ( 977 0 1316 1318 0 0 ) + 7849 ( 977 0 1316 1317 0 0 ) + 7850 ( 6 4 1316 0 4499 7 ) + 7851 ( 855 0 1316 1398 0 0 ) + 7852 ( 1532 1 1316 0 0 0 ) + 7853 ( 1018 1 1316 0 0 0 ) + 7854 ( 1018 0 1316 1320 0 0 ) + 7855 ( 977 1 1316 0 0 0 ) + 7856 ( 977 0 1316 1319 0 0 ) + 7857 ( 855 0 1317 1397 0 0 ) + 7858 ( 866 0 1317 1318 0 0 ) + 7859 ( 855 0 1317 1398 0 0 ) + 7860 ( 6 4 1317 0 4506 4 ) + 7861 ( 850 0 1318 1319 0 0 ) + 7862 ( 850 1 1318 0 0 0 ) + 7863 ( 6 4 1318 0 4510 4 ) + 7864 ( 1532 0 1319 1325 0 0 ) + 7865 ( 1532 1 1319 0 0 0 ) + 7866 ( 1532 0 1319 1324 0 0 ) + 7867 ( 1540 4 1319 0 4514 5 ) + 7868 ( 855 0 1320 1397 0 0 ) + 7869 ( 1544 0 1320 1323 0 0 ) + 7870 ( 6 4 1320 0 4519 4 ) + 7871 ( 855 0 1320 1398 0 0 ) + 7872 ( 1556 0 1320 1326 0 0 ) + 7873 ( 1544 1 1320 0 0 0 ) + 7874 ( 1011 0 1321 1322 0 0 ) + 7875 ( 1556 1 1321 0 0 0 ) + 7876 ( 470 4 1321 0 4523 5 ) + 7877 ( 858 1 1321 0 0 0 ) + 7878 ( 867 0 1321 1323 0 0 ) + 7879 ( 1556 0 1321 1327 0 0 ) + 7880 ( 858 1 1322 0 0 0 ) + 7881 ( 470 4 1322 0 4528 5 ) + 7882 ( 1018 0 1325 1322 0 0 ) + 7883 ( 867 0 1322 1323 0 0 ) + 7884 ( 1556 0 1323 1328 0 0 ) + 7885 ( 470 4 1323 0 4533 5 ) + 7886 ( 1562 0 1324 1325 0 0 ) + 7887 ( 1562 1 1324 0 0 0 ) + 7888 ( 1540 4 1324 0 4538 4 ) + 7889 ( 858 1 1324 0 0 0 ) + 7890 ( 470 4 1325 0 4542 5 ) + 7891 ( 858 1 1325 0 0 0 ) + 7892 ( 1544 0 1326 1328 0 0 ) + 7893 ( 6 4 1326 0 4547 4 ) + 7894 ( 855 0 1326 1398 0 0 ) + 7895 ( 659 1 1326 0 0 0 ) + 7896 ( 1544 1 1326 0 0 0 ) + 7897 ( 1306 1 1326 0 0 0 ) + 7898 ( 867 0 1327 1328 0 0 ) + 7899 ( 470 4 1327 0 4551 4 ) + 7900 ( 1306 1 1327 0 0 0 ) + 7901 ( 1558 1 1327 0 0 0 ) + 7902 ( 659 1 1327 0 0 0 ) + 7903 ( 470 4 1328 0 4555 4 ) + 7904 ( 1306 1 1328 0 0 0 ) + 7905 ( 659 1 1328 0 0 0 ) + 7906 ( 855 0 1329 1397 0 0 ) + 7907 ( 1531 0 1329 1363 0 0 ) + 7908 ( 34 0 1329 1338 0 0 ) + 7909 ( 34 0 1329 1337 0 0 ) + 7910 ( 34 0 1329 1339 0 0 ) + 7911 ( 1012 0 1329 1332 0 0 ) + 7912 ( 1012 0 1329 1331 0 0 ) + 7913 ( 34 0 1329 1336 0 0 ) + 7914 ( 34 0 1329 1335 0 0 ) + 7915 ( 997 0 1329 1334 0 0 ) + 7916 ( 997 1 1329 0 0 0 ) + 7917 ( 836 1 1329 0 0 0 ) + 7918 ( 855 0 1329 1388 0 0 ) + 7919 ( 855 0 1330 1395 0 0 ) + 7920 ( 1531 0 1330 1363 0 0 ) + 7921 ( 1155 0 1330 1332 0 0 ) + 7922 ( 1155 0 1330 1331 0 0 ) + 7923 ( 855 0 1330 1388 0 0 ) + 7924 ( 836 1 1330 0 0 0 ) + 7925 ( 34 4 1330 0 4559 6 ) + 7926 ( 1306 1 1330 0 0 0 ) + 7927 ( 1306 0 1330 1333 0 0 ) + 7928 ( 1531 0 1331 1363 0 0 ) + 7929 ( 913 0 1331 1332 0 0 ) + 7930 ( 34 4 1331 0 4565 4 ) + 7931 ( 836 1 1331 0 0 0 ) + 7932 ( 855 0 1332 1396 0 0 ) + 7933 ( 1531 0 1332 1363 0 0 ) + 7934 ( 34 4 1332 0 4569 5 ) + 7935 ( 855 0 1332 1388 0 0 ) + 7936 ( 855 0 1333 1395 0 0 ) + 7937 ( 855 0 1333 1390 0 0 ) + 7938 ( 1306 0 1365 1333 0 0 ) + 7939 ( 1306 0 1363 1333 0 0 ) + 7940 ( 601 1 1333 0 0 0 ) + 7941 ( 860 0 1333 1380 0 0 ) + 7942 ( 860 1 1333 0 0 0 ) + 7943 ( 855 0 1333 1388 0 0 ) + 7944 ( 1156 0 1333 1444 0 0 ) + 7945 ( 860 0 1333 1383 0 0 ) + 7946 ( 34 4 1333 0 4574 4 ) + 7947 ( 855 0 1334 1397 0 0 ) + 7948 ( 866 1 1334 0 0 0 ) + 7949 ( 1027 1 1334 0 0 0 ) + 7950 ( 997 0 1335 1334 0 0 ) + 7951 ( 997 0 1363 1334 0 0 ) + 7952 ( 1027 1 1334 0 0 0 ) + 7953 ( 1027 1 1334 0 0 0 ) + 7954 ( 1027 0 1334 1364 0 0 ) + 7955 ( 705 0 1334 1368 0 0 ) + 7956 ( 705 0 1334 1378 0 0 ) + 7957 ( 855 0 1334 1388 0 0 ) + 7958 ( 1027 0 1334 1342 0 0 ) + 7959 ( 855 0 1335 1397 0 0 ) + 7960 ( 1554 0 1335 1338 0 0 ) + 7961 ( 1554 0 1335 1339 0 0 ) + 7962 ( 1554 0 1335 1336 0 0 ) + 7963 ( 997 1 1335 0 0 0 ) + 7964 ( 836 1 1335 0 0 0 ) + 7965 ( 855 0 1336 1397 0 0 ) + 7966 ( 858 0 1336 1339 0 0 ) + 7967 ( 1012 1 1336 0 0 0 ) + 7968 ( 1557 0 1337 1338 0 0 ) + 7969 ( 836 1 1337 0 0 0 ) + 7970 ( 417 4 0 1337 4578 4 ) + 7971 ( 1012 1 1337 0 0 0 ) + 7972 ( 913 0 1337 1339 0 0 ) + 7973 ( 836 1 1338 0 0 0 ) + 7974 ( 417 4 0 1338 4582 4 ) + 7975 ( 913 0 1338 1339 0 0 ) + 7976 ( 1012 1 1339 0 0 0 ) + 7977 ( 417 4 0 1339 4586 7 ) + 7978 ( 1164 0 1340 1364 0 0 ) + 7979 ( 799 1 1340 0 0 0 ) + 7980 ( 866 1 1340 0 0 0 ) + 7981 ( 829 1 1340 0 0 0 ) + 7982 ( 1164 0 1340 1341 0 0 ) + 7983 ( 174 4 1340 0 4593 4 ) + 7984 ( 920 0 1341 1342 0 0 ) + 7985 ( 174 4 1341 0 4597 4 ) + 7986 ( 866 1 1341 0 0 0 ) + 7987 ( 829 1 1341 0 0 0 ) + 7988 ( 1531 0 1341 1364 0 0 ) + 7989 ( 174 4 1342 0 4601 4 ) + 7990 ( 866 1 1342 0 0 0 ) + 7991 ( 829 1 1342 0 0 0 ) + 7992 ( 1531 0 1342 1364 0 0 ) + 7993 ( 1531 1 1343 0 0 0 ) + 7994 ( 1531 0 1343 1354 0 0 ) + 7995 ( 1536 1 1343 0 0 0 ) + 7996 ( 997 0 1343 1347 0 0 ) + 7997 ( 997 1 1343 0 0 0 ) + 7998 ( 1098 1 1343 0 0 0 ) + 7999 ( 794 0 1343 1345 0 0 ) + 8000 ( 819 1 1343 0 0 0 ) + 8001 ( 1536 1 1344 0 0 0 ) + 8002 ( 1536 0 1344 1352 0 0 ) + 8003 ( 997 1 1344 0 0 0 ) + 8004 ( 1098 0 1344 1346 0 0 ) + 8005 ( 1098 1 1344 0 0 0 ) + 8006 ( 819 1 1344 0 0 0 ) + 8007 ( 879 0 1344 1345 0 0 ) + 8008 ( 1536 1 1345 0 0 0 ) + 8009 ( 997 0 1345 1348 0 0 ) + 8010 ( 997 1 1345 0 0 0 ) + 8011 ( 1098 1 1345 0 0 0 ) + 8012 ( 819 1 1345 0 0 0 ) + 8013 ( 1098 0 1352 1346 0 0 ) + 8014 ( 1525 1 1346 0 0 0 ) + 8015 ( 819 1 1346 0 0 0 ) + 8016 ( 1027 0 1347 1351 0 0 ) + 8017 ( 1531 0 1347 1354 0 0 ) + 8018 ( 1536 1 1347 0 0 0 ) + 8019 ( 794 0 1347 1348 0 0 ) + 8020 ( 809 1 1347 0 0 0 ) + 8021 ( 1536 1 1348 0 0 0 ) + 8022 ( 1027 1 1348 0 0 0 ) + 8023 ( 809 1 1348 0 0 0 ) + 8024 ( 1164 0 1349 1355 0 0 ) + 8025 ( 852 0 1353 1349 0 0 ) + 8026 ( 1536 1 1349 0 0 0 ) + 8027 ( 799 1 1349 0 0 0 ) + 8028 ( 809 1 1349 0 0 0 ) + 8029 ( 1164 0 1349 1350 0 0 ) + 8030 ( 794 4 1349 0 4605 4 ) + 8031 ( 920 0 1350 1351 0 0 ) + 8032 ( 809 1 1350 0 0 0 ) + 8033 ( 794 4 1350 0 4609 4 ) + 8034 ( 1536 1 1350 0 0 0 ) + 8035 ( 1531 0 1350 1355 0 0 ) + 8036 ( 809 1 1351 0 0 0 ) + 8037 ( 794 4 1351 0 4613 4 ) + 8038 ( 1536 1 1351 0 0 0 ) + 8039 ( 1531 0 1351 1355 0 0 ) + 8040 ( 1475 1 1352 0 0 0 ) + 8041 ( 1525 1 1352 0 0 0 ) + 8042 ( 809 0 1353 1358 0 0 ) + 8043 ( 809 0 1353 1357 0 0 ) + 8044 ( 705 1 1353 0 0 0 ) + 8045 ( 705 0 1353 1356 0 0 ) + 8046 ( 705 1 1353 0 0 0 ) + 8047 ( 852 1 1353 0 0 0 ) + 8048 ( 852 1 1353 0 0 0 ) + 8049 ( 804 1 1353 0 0 0 ) + 8050 ( 804 1 1353 0 0 0 ) + 8051 ( 1098 1 1354 0 0 0 ) + 8052 ( 809 1 1354 0 0 0 ) + 8053 ( 705 1 1354 0 0 0 ) + 8054 ( 1027 0 1354 1355 0 0 ) + 8055 ( 1027 1 1354 0 0 0 ) + 8056 ( 1536 1 1354 0 0 0 ) + 8057 ( 809 1 1355 0 0 0 ) + 8058 ( 799 1 1355 0 0 0 ) + 8059 ( 1536 1 1355 0 0 0 ) + 8060 ( 705 0 1357 1356 0 0 ) + 8061 ( 932 1 1356 0 0 0 ) + 8062 ( 815 0 1356 1362 0 0 ) + 8063 ( 705 1 1357 0 0 0 ) + 8064 ( 882 1 1357 0 0 0 ) + 8065 ( 882 0 1357 1358 0 0 ) + 8066 ( 882 1 1357 0 0 0 ) + 8067 ( 852 1 1358 0 0 0 ) + 8068 ( 705 1 1358 0 0 0 ) + 8069 ( 881 1 1358 0 0 0 ) + 8070 ( 852 0 1359 1374 0 0 ) + 8071 ( 870 1 1359 0 0 0 ) + 8072 ( 601 1 1359 0 0 0 ) + 8073 ( 252 4 1359 0 4617 8 ) + 8074 ( 852 0 1359 1377 0 0 ) + 8075 ( 852 0 1359 1371 0 0 ) + 8076 ( 916 0 1387 1359 0 0 ) + 8077 ( 840 0 1360 1362 0 0 ) + 8078 ( 840 1 1360 0 0 0 ) + 8079 ( 719 1 1360 0 0 0 ) + 8080 ( 932 1 1361 0 0 0 ) + 8081 ( 850 0 1361 1362 0 0 ) + 8082 ( 932 1 1362 0 0 0 ) + 8083 ( 855 0 1363 1390 0 0 ) + 8084 ( 908 0 1365 1363 0 0 ) + 8085 ( 836 1 1363 0 0 0 ) + 8086 ( 1306 1 1363 0 0 0 ) + 8087 ( 855 0 1363 1388 0 0 ) + 8088 ( 997 0 1363 1368 0 0 ) + 8089 ( 997 0 1363 1369 0 0 ) + 8090 ( 997 1 1363 0 0 0 ) + 8091 ( 829 1 1364 0 0 0 ) + 8092 ( 866 1 1364 0 0 0 ) + 8093 ( 799 1 1364 0 0 0 ) + 8094 ( 855 0 1365 1390 0 0 ) + 8095 ( 836 0 1365 1367 0 0 ) + 8096 ( 1306 0 1365 1380 0 0 ) + 8097 ( 601 1 1365 0 0 0 ) + 8098 ( 1306 0 1365 1383 0 0 ) + 8099 ( 1306 0 1365 1382 0 0 ) + 8100 ( 1047 0 1365 1376 0 0 ) + 8101 ( 908 0 1365 1368 0 0 ) + 8102 ( 908 0 1365 1369 0 0 ) + 8103 ( 1047 1 1365 0 0 0 ) + 8104 ( 1047 0 1365 1378 0 0 ) + 8105 ( 1047 0 1365 1379 0 0 ) + 8106 ( 1047 0 1366 1373 0 0 ) + 8107 ( 831 0 1366 1367 0 0 ) + 8108 ( 601 1 1366 0 0 0 ) + 8109 ( 870 1 1366 0 0 0 ) + 8110 ( 908 4 1366 0 4625 5 ) + 8111 ( 1306 1 1366 0 0 0 ) + 8112 ( 1047 1 1366 0 0 0 ) + 8113 ( 1306 0 1367 1382 0 0 ) + 8114 ( 1306 0 1367 1380 0 0 ) + 8115 ( 601 1 1367 0 0 0 ) + 8116 ( 908 4 1367 0 4630 5 ) + 8117 ( 1047 1 1367 0 0 0 ) + 8118 ( 855 0 1368 1390 0 0 ) + 8119 ( 1047 0 1368 1378 0 0 ) + 8120 ( 866 1 1368 0 0 0 ) + 8121 ( 866 0 1368 1370 0 0 ) + 8122 ( 866 0 1368 1369 0 0 ) + 8123 ( 1564 1 1369 0 0 0 ) + 8124 ( 1564 0 1369 1370 0 0 ) + 8125 ( 836 1 1369 0 0 0 ) + 8126 ( 1047 0 1370 1379 0 0 ) + 8127 ( 1566 1 1370 0 0 0 ) + 8128 ( 920 0 1371 1372 0 0 ) + 8129 ( 821 1 1371 0 0 0 ) + 8130 ( 821 0 1371 1377 0 0 ) + 8131 ( 252 4 1371 0 4635 5 ) + 8132 ( 870 1 1371 0 0 0 ) + 8133 ( 601 1 1371 0 0 0 ) + 8134 ( 821 1 1372 0 0 0 ) + 8135 ( 252 4 1372 0 4640 4 ) + 8136 ( 870 1 1372 0 0 0 ) + 8137 ( 601 1 1372 0 0 0 ) + 8138 ( 1026 0 1372 1373 0 0 ) + 8139 ( 1027 1 1373 0 0 0 ) + 8140 ( 908 4 1373 0 4644 4 ) + 8141 ( 870 1 1373 0 0 0 ) + 8142 ( 821 1 1373 0 0 0 ) + 8143 ( 601 1 1373 0 0 0 ) + 8144 ( 916 0 1387 1374 0 0 ) + 8145 ( 920 0 1374 1375 0 0 ) + 8146 ( 252 4 1374 0 4648 5 ) + 8147 ( 601 1 1374 0 0 0 ) + 8148 ( 1568 1 1374 0 0 0 ) + 8149 ( 1568 0 1374 1377 0 0 ) + 8150 ( 916 0 1387 1375 0 0 ) + 8151 ( 252 4 1375 0 4653 6 ) + 8152 ( 601 1 1375 0 0 0 ) + 8153 ( 1026 0 1375 1390 0 0 ) + 8154 ( 1568 1 1375 0 0 0 ) + 8155 ( 1026 0 1375 1376 0 0 ) + 8156 ( 855 0 1376 1390 0 0 ) + 8157 ( 601 1 1376 0 0 0 ) + 8158 ( 1568 1 1376 0 0 0 ) + 8159 ( 252 0 1376 1378 0 0 ) + 8160 ( 252 0 1376 1379 0 0 ) + 8161 ( 252 4 1377 0 4659 4 ) + 8162 ( 601 1 1377 0 0 0 ) + 8163 ( 1116 1 1377 0 0 0 ) + 8164 ( 855 0 1378 1390 0 0 ) + 8165 ( 866 0 1378 1379 0 0 ) + 8166 ( 866 1 1378 0 0 0 ) + 8167 ( 1027 1 1378 0 0 0 ) + 8168 ( 1566 1 1379 0 0 0 ) + 8169 ( 1027 1 1379 0 0 0 ) + 8170 ( 1568 1 1379 0 0 0 ) + 8171 ( 1156 0 1380 1408 0 0 ) + 8172 ( 1156 0 1380 1407 0 0 ) + 8173 ( 252 0 1380 1382 0 0 ) + 8174 ( 252 0 1380 1381 0 0 ) + 8175 ( 601 1 1380 0 0 0 ) + 8176 ( 830 1 1380 0 0 0 ) + 8177 ( 252 0 1380 1383 0 0 ) + 8178 ( 1015 0 1381 1382 0 0 ) + 8179 ( 830 1 1381 0 0 0 ) + 8180 ( 1504 4 1381 0 4663 4 ) + 8181 ( 863 0 1381 1383 0 0 ) + 8182 ( 830 1 1382 0 0 0 ) + 8183 ( 1504 4 1382 0 4667 5 ) + 8184 ( 863 0 1382 1383 0 0 ) + 8185 ( 1504 4 1383 0 4672 5 ) + 8186 ( 6 4 1384 0 4677 7 ) + 8187 ( 852 0 1384 1394 0 0 ) + 8188 ( 852 0 1384 1393 0 0 ) + 8189 ( 852 0 1384 1389 0 0 ) + 8190 ( 705 0 1384 1385 0 0 ) + 8191 ( 770 1 1384 0 0 0 ) + 8192 ( 770 1 1384 0 0 0 ) + 8193 ( 770 1 1384 0 0 0 ) + 8194 ( 770 1 1384 0 0 0 ) + 8195 ( 770 1 1384 0 0 0 ) + 8196 ( 770 0 1385 1390 0 0 ) + 8197 ( 770 0 1385 1386 0 0 ) + 8198 ( 705 0 1389 1385 0 0 ) + 8199 ( 705 0 1388 1385 0 0 ) + 8200 ( 601 1 1385 0 0 0 ) + 8201 ( 770 1 1385 0 0 0 ) + 8202 ( 1156 0 1385 1444 0 0 ) + 8203 ( 1027 0 1390 1386 0 0 ) + 8204 ( 890 0 1386 1387 0 0 ) + 8205 ( 918 4 1386 0 4684 5 ) + 8206 ( 601 1 1386 0 0 0 ) + 8207 ( 890 0 1386 1391 0 0 ) + 8208 ( 1026 0 1387 1390 0 0 ) + 8209 ( 601 1 1387 0 0 0 ) + 8210 ( 252 0 1387 1391 0 0 ) + 8211 ( 794 0 1388 1397 0 0 ) + 8212 ( 794 0 1388 1396 0 0 ) + 8213 ( 794 0 1388 1395 0 0 ) + 8214 ( 705 0 1388 1390 0 0 ) + 8215 ( 1156 0 1388 1444 0 0 ) + 8216 ( 794 0 1388 1394 0 0 ) + 8217 ( 1027 1 1388 0 0 0 ) + 8218 ( 1027 0 1388 1389 0 0 ) + 8219 ( 794 0 1389 1394 0 0 ) + 8220 ( 770 1 1389 0 0 0 ) + 8221 ( 601 1 1390 0 0 0 ) + 8222 ( 1027 1 1390 0 0 0 ) + 8223 ( 1156 0 1390 1444 0 0 ) + 8224 ( 1027 0 1390 1391 0 0 ) + 8225 ( 918 4 1391 0 4689 4 ) + 8226 ( 916 0 1392 1399 0 0 ) + 8227 ( 659 0 1392 1397 0 0 ) + 8228 ( 1306 1 1392 0 0 0 ) + 8229 ( 1027 1 1392 0 0 0 ) + 8230 ( 659 1 1392 0 0 0 ) + 8231 ( 916 0 1392 1398 0 0 ) + 8232 ( 916 1 1392 0 0 0 ) + 8233 ( 6 4 1392 0 4693 9 ) + 8234 ( 659 0 1392 1394 0 0 ) + 8235 ( 1027 0 1392 1393 0 0 ) + 8236 ( 6 4 1393 0 4702 5 ) + 8237 ( 659 0 1393 1394 0 0 ) + 8238 ( 770 1 1393 0 0 0 ) + 8239 ( 1012 0 1394 1396 0 0 ) + 8240 ( 770 0 1394 1397 0 0 ) + 8241 ( 770 1 1394 0 0 0 ) + 8242 ( 1012 1 1394 0 0 0 ) + 8243 ( 1155 0 1395 1396 0 0 ) + 8244 ( 1156 0 1395 1444 0 0 ) + 8245 ( 34 4 1395 0 4707 6 ) + 8246 ( 1012 0 1397 1396 0 0 ) + 8247 ( 34 4 1396 0 4713 5 ) + 8248 ( 659 0 1399 1397 0 0 ) + 8249 ( 659 0 1398 1397 0 0 ) + 8250 ( 1027 1 1397 0 0 0 ) + 8251 ( 1012 1 1397 0 0 0 ) + 8252 ( 1549 0 1398 1399 0 0 ) + 8253 ( 6 4 1398 0 4718 11 ) + 8254 ( 659 1 1398 0 0 0 ) + 8255 ( 1549 1 1398 0 0 0 ) + 8256 ( 1306 1 1398 0 0 0 ) + 8257 ( 902 4 1399 0 4729 5 ) + 8258 ( 1027 1 1399 0 0 0 ) + 8259 ( 1066 0 1415 1400 0 0 ) + 8260 ( 771 1 1400 0 0 0 ) + 8261 ( 34 4 1400 0 4734 5 ) + 8262 ( 860 1 1400 0 0 0 ) + 8263 ( 345 1 1400 0 0 0 ) + 8264 ( 1060 1 1400 0 0 0 ) + 8265 ( 1060 0 1400 1401 0 0 ) + 8266 ( 345 1 1401 0 0 0 ) + 8267 ( 860 1 1401 0 0 0 ) + 8268 ( 1070 1 1401 0 0 0 ) + 8269 ( 34 4 1401 0 4739 4 ) + 8270 ( 917 1 1401 0 0 0 ) + 8271 ( 1060 0 1402 1404 0 0 ) + 8272 ( 1446 4 1402 0 4743 5 ) + 8273 ( 1060 1 1402 0 0 0 ) + 8274 ( 770 1 1402 0 0 0 ) + 8275 ( 1065 0 1402 1442 0 0 ) + 8276 ( 770 0 1402 1406 0 0 ) + 8277 ( 1065 0 1402 1438 0 0 ) + 8278 ( 1065 0 1402 1437 0 0 ) + 8279 ( 1060 0 1402 1403 0 0 ) + 8280 ( 601 1 1402 0 0 0 ) + 8281 ( 776 0 1403 1404 0 0 ) + 8282 ( 1070 0 1403 1409 0 0 ) + 8283 ( 776 1 1403 0 0 0 ) + 8284 ( 601 1 1403 0 0 0 ) + 8285 ( 601 1 1404 0 0 0 ) + 8286 ( 710 4 1404 0 4748 5 ) + 8287 ( 1070 0 1404 1411 0 0 ) + 8288 ( 770 0 1404 1406 0 0 ) + 8289 ( 1070 0 1404 1410 0 0 ) + 8290 ( 770 1 1404 0 0 0 ) + 8291 ( 891 0 1405 1406 0 0 ) + 8292 ( 16 1 1405 0 0 0 ) + 8293 ( 860 1 1405 0 0 0 ) + 8294 ( 601 1 1405 0 0 0 ) + 8295 ( 908 4 1405 0 4753 5 ) + 8296 ( 860 0 1405 1408 0 0 ) + 8297 ( 860 1 1405 0 0 0 ) + 8298 ( 1065 0 1405 1437 0 0 ) + 8299 ( 770 0 1410 1406 0 0 ) + 8300 ( 16 1 1406 0 0 0 ) + 8301 ( 601 1 1406 0 0 0 ) + 8302 ( 908 4 1406 0 4758 6 ) + 8303 ( 1065 0 1406 1437 0 0 ) + 8304 ( 863 0 1407 1408 0 0 ) + 8305 ( 830 1 1407 0 0 0 ) + 8306 ( 601 1 1407 0 0 0 ) + 8307 ( 252 4 1407 0 4764 4 ) + 8308 ( 1070 1 1407 0 0 0 ) + 8309 ( 860 0 1444 1408 0 0 ) + 8310 ( 860 0 1413 1408 0 0 ) + 8311 ( 252 4 1408 0 4768 9 ) + 8312 ( 601 1 1408 0 0 0 ) + 8313 ( 860 0 1454 1408 0 0 ) + 8314 ( 860 0 1456 1408 0 0 ) + 8315 ( 860 0 1437 1408 0 0 ) + 8316 ( 1070 1 1408 0 0 0 ) + 8317 ( 776 0 1409 1411 0 0 ) + 8318 ( 16 1 1409 0 0 0 ) + 8319 ( 776 1 1409 0 0 0 ) + 8320 ( 798 4 1409 0 4777 4 ) + 8321 ( 601 1 1409 0 0 0 ) + 8322 ( 899 0 1410 1411 0 0 ) + 8323 ( 710 4 1410 0 4781 4 ) + 8324 ( 601 1 1410 0 0 0 ) + 8325 ( 770 1 1410 0 0 0 ) + 8326 ( 16 1 1410 0 0 0 ) + 8327 ( 710 4 1411 0 4785 4 ) + 8328 ( 601 1 1411 0 0 0 ) + 8329 ( 16 1 1411 0 0 0 ) + 8330 ( 770 0 1412 1455 0 0 ) + 8331 ( 345 0 1415 1412 0 0 ) + 8332 ( 770 0 1412 1414 0 0 ) + 8333 ( 601 1 1412 0 0 0 ) + 8334 ( 1120 0 1454 1412 0 0 ) + 8335 ( 770 1 1412 0 0 0 ) + 8336 ( 1062 0 1412 1441 0 0 ) + 8337 ( 1062 0 1412 1438 0 0 ) + 8338 ( 1062 0 1412 1437 0 0 ) + 8339 ( 770 1 1412 0 0 0 ) + 8340 ( 891 0 1413 1414 0 0 ) + 8341 ( 1062 0 1413 1439 0 0 ) + 8342 ( 1062 0 1413 1437 0 0 ) + 8343 ( 860 1 1413 0 0 0 ) + 8344 ( 601 1 1413 0 0 0 ) + 8345 ( 1498 4 1413 0 4789 4 ) + 8346 ( 1570 0 1413 1457 0 0 ) + 8347 ( 968 4 1413 0 4793 5 ) + 8348 ( 1159 0 1413 1456 0 0 ) + 8349 ( 1498 4 1414 0 4798 4 ) + 8350 ( 601 1 1414 0 0 0 ) + 8351 ( 1062 0 1414 1437 0 0 ) + 8352 ( 1062 0 1414 1440 0 0 ) + 8353 ( 1572 0 1455 1414 0 0 ) + 8354 ( 968 4 1414 0 4802 5 ) + 8355 ( 891 0 1457 1414 0 0 ) + 8356 ( 345 0 1415 1455 0 0 ) + 8357 ( 1476 0 1444 1415 0 0 ) + 8358 ( 860 0 1415 1418 0 0 ) + 8359 ( 34 4 1415 0 4807 8 ) + 8360 ( 1066 1 1415 0 0 0 ) + 8361 ( 345 1 1415 0 0 0 ) + 8362 ( 345 0 1415 1441 0 0 ) + 8363 ( 860 1 1415 0 0 0 ) + 8364 ( 345 0 1415 1454 0 0 ) + 8365 ( 1575 0 1416 1418 0 0 ) + 8366 ( 345 1 1416 0 0 0 ) + 8367 ( 34 4 1416 0 4815 7 ) + 8368 ( 1577 1 1416 0 0 0 ) + 8369 ( 910 0 1416 1446 0 0 ) + 8370 ( 1577 0 1416 1447 0 0 ) + 8371 ( 1062 0 1416 1429 0 0 ) + 8372 ( 910 0 1416 1417 0 0 ) + 8373 ( 1062 0 1416 1436 0 0 ) + 8374 ( 1501 0 1417 1446 0 0 ) + 8375 ( 1062 0 1417 1430 0 0 ) + 8376 ( 345 1 1417 0 0 0 ) + 8377 ( 34 0 1417 1419 0 0 ) + 8378 ( 34 0 1417 1420 0 0 ) + 8379 ( 34 0 1417 1421 0 0 ) + 8380 ( 830 0 1417 1426 0 0 ) + 8381 ( 1575 0 1436 1418 0 0 ) + 8382 ( 34 4 1418 0 4822 5 ) + 8383 ( 1066 1 1418 0 0 0 ) + 8384 ( 345 1 1418 0 0 0 ) + 8385 ( 1577 1 1418 0 0 0 ) + 8386 ( 1501 0 1419 1449 0 0 ) + 8387 ( 1501 0 1419 1453 0 0 ) + 8388 ( 1501 1 1419 0 0 0 ) + 8389 ( 1062 1 1419 0 0 0 ) + 8390 ( 1062 0 1419 1431 0 0 ) + 8391 ( 830 0 1419 1426 0 0 ) + 8392 ( 857 1 1419 0 0 0 ) + 8393 ( 857 0 1419 1420 0 0 ) + 8394 ( 678 4 1419 0 4827 4 ) + 8395 ( 1501 0 1420 1449 0 0 ) + 8396 ( 1501 0 1420 1453 0 0 ) + 8397 ( 1501 1 1420 0 0 0 ) + 8398 ( 1062 1 1420 0 0 0 ) + 8399 ( 1062 0 1420 1431 0 0 ) + 8400 ( 859 1 1420 0 0 0 ) + 8401 ( 859 0 1420 1421 0 0 ) + 8402 ( 416 4 1420 0 4831 4 ) + 8403 ( 1501 0 1421 1448 0 0 ) + 8404 ( 1501 1 1421 0 0 0 ) + 8405 ( 1062 1 1421 0 0 0 ) + 8406 ( 1062 0 1421 1431 0 0 ) + 8407 ( 911 1 1421 0 0 0 ) + 8408 ( 1578 4 1421 0 4835 4 ) + 8409 ( 1501 0 1422 1453 0 0 ) + 8410 ( 1501 1 1422 0 0 0 ) + 8411 ( 1501 0 1422 1451 0 0 ) + 8412 ( 1062 0 1422 1433 0 0 ) + 8413 ( 1062 1 1422 0 0 0 ) + 8414 ( 809 1 1422 0 0 0 ) + 8415 ( 809 0 1422 1424 0 0 ) + 8416 ( 1586 0 1422 1423 0 0 ) + 8417 ( 1582 4 1422 0 4839 4 ) + 8418 ( 345 1 1422 0 0 0 ) + 8419 ( 1501 0 1423 1452 0 0 ) + 8420 ( 1501 1 1423 0 0 0 ) + 8421 ( 1062 0 1423 1434 0 0 ) + 8422 ( 1062 1 1423 0 0 0 ) + 8423 ( 1580 0 1423 1428 0 0 ) + 8424 ( 1580 1 1423 0 0 0 ) + 8425 ( 1582 4 1423 0 4843 4 ) + 8426 ( 345 1 1423 0 0 0 ) + 8427 ( 1501 0 1424 1449 0 0 ) + 8428 ( 1501 0 1424 1446 0 0 ) + 8429 ( 1062 0 1424 1430 0 0 ) + 8430 ( 1501 0 1424 1453 0 0 ) + 8431 ( 1501 1 1424 0 0 0 ) + 8432 ( 1062 1 1424 0 0 0 ) + 8433 ( 1062 0 1424 1431 0 0 ) + 8434 ( 871 1 1424 0 0 0 ) + 8435 ( 871 0 1424 1425 0 0 ) + 8436 ( 345 1 1424 0 0 0 ) + 8437 ( 30 4 1424 0 4847 4 ) + 8438 ( 1501 0 1425 1449 0 0 ) + 8439 ( 1501 0 1425 1446 0 0 ) + 8440 ( 1062 0 1425 1430 0 0 ) + 8441 ( 1501 0 1425 1453 0 0 ) + 8442 ( 1501 1 1425 0 0 0 ) + 8443 ( 1062 1 1425 0 0 0 ) + 8444 ( 1062 0 1425 1431 0 0 ) + 8445 ( 915 1 1425 0 0 0 ) + 8446 ( 915 0 1425 1426 0 0 ) + 8447 ( 345 1 1425 0 0 0 ) + 8448 ( 1588 4 1425 0 4851 4 ) + 8449 ( 1501 0 1426 1449 0 0 ) + 8450 ( 1501 0 1426 1446 0 0 ) + 8451 ( 1062 0 1426 1430 0 0 ) + 8452 ( 1501 0 1426 1453 0 0 ) + 8453 ( 1501 1 1426 0 0 0 ) + 8454 ( 1062 1 1426 0 0 0 ) + 8455 ( 1062 0 1426 1431 0 0 ) + 8456 ( 345 1 1426 0 0 0 ) + 8457 ( 830 1 0 1426 0 0 ) + 8458 ( 50 4 1426 0 4855 4 ) + 8459 ( 1577 0 1427 1465 0 0 ) + 8460 ( 1526 1 1427 0 0 0 ) + 8461 ( 1592 4 1427 0 4859 4 ) + 8462 ( 1525 1 1427 0 0 0 ) + 8463 ( 1591 0 1427 1428 0 0 ) + 8464 ( 1591 1 1427 0 0 0 ) + 8465 ( 1591 0 1427 1435 0 0 ) + 8466 ( 1066 1 1427 0 0 0 ) + 8467 ( 1591 0 1427 1470 0 0 ) + 8468 ( 1501 1 1428 0 0 0 ) + 8469 ( 1501 0 1428 1470 0 0 ) + 8470 ( 1062 0 1428 1435 0 0 ) + 8471 ( 1062 1 1428 0 0 0 ) + 8472 ( 1525 1 1428 0 0 0 ) + 8473 ( 1580 1 0 1428 0 0 ) + 8474 ( 1552 4 1428 0 4863 4 ) + 8475 ( 1594 0 1429 1430 0 0 ) + 8476 ( 345 1 1429 0 0 0 ) + 8477 ( 851 1 1429 0 0 0 ) + 8478 ( 34 4 1429 0 4867 6 ) + 8479 ( 1596 1 1429 0 0 0 ) + 8480 ( 851 0 1429 1436 0 0 ) + 8481 ( 345 1 1430 0 0 0 ) + 8482 ( 808 1 1430 0 0 0 ) + 8483 ( 34 0 1430 1432 0 0 ) + 8484 ( 1596 1 1430 0 0 0 ) + 8485 ( 34 0 1430 1431 0 0 ) + 8486 ( 808 0 1430 1433 0 0 ) + 8487 ( 808 0 1431 1433 0 0 ) + 8488 ( 1066 0 1431 1432 0 0 ) + 8489 ( 1066 1 1431 0 0 0 ) + 8490 ( 1598 4 1431 0 4873 10 ) + 8491 ( 808 1 1432 0 0 0 ) + 8492 ( 1596 1 1432 0 0 0 ) + 8493 ( 1598 4 1432 0 4883 3 ) + 8494 ( 345 1 1433 0 0 0 ) + 8495 ( 1586 0 1433 1434 0 0 ) + 8496 ( 1598 4 1433 0 4886 4 ) + 8497 ( 1066 1 1433 0 0 0 ) + 8498 ( 345 1 1434 0 0 0 ) + 8499 ( 1580 1 1434 0 0 0 ) + 8500 ( 1580 0 1434 1435 0 0 ) + 8501 ( 1066 1 1434 0 0 0 ) + 8502 ( 1598 4 1434 0 4890 4 ) + 8503 ( 1598 4 1435 0 4894 4 ) + 8504 ( 1066 1 1435 0 0 0 ) + 8505 ( 1525 1 1435 0 0 0 ) + 8506 ( 345 1 1436 0 0 0 ) + 8507 ( 1066 1 1436 0 0 0 ) + 8508 ( 34 4 1436 0 4898 4 ) + 8509 ( 908 0 1437 1440 0 0 ) + 8510 ( 908 0 1437 1439 0 0 ) + 8511 ( 860 1 1437 0 0 0 ) + 8512 ( 908 0 1437 1438 0 0 ) + 8513 ( 601 1 1437 0 0 0 ) + 8514 ( 770 0 1438 1440 0 0 ) + 8515 ( 968 0 1438 1443 0 0 ) + 8516 ( 968 0 1438 1442 0 0 ) + 8517 ( 968 0 1438 1441 0 0 ) + 8518 ( 770 1 1438 0 0 0 ) + 8519 ( 891 0 1439 1440 0 0 ) + 8520 ( 1498 4 1439 0 4902 4 ) + 8521 ( 860 1 1439 0 0 0 ) + 8522 ( 1498 4 1440 0 4906 4 ) + 8523 ( 1066 0 1441 1443 0 0 ) + 8524 ( 1066 1 1441 0 0 0 ) + 8525 ( 770 1 1441 0 0 0 ) + 8526 ( 1449 0 1442 1443 0 0 ) + 8527 ( 1446 4 1442 0 4910 4 ) + 8528 ( 770 1 1442 0 0 0 ) + 8529 ( 1446 4 1443 0 4914 4 ) + 8530 ( 770 1 1443 0 0 0 ) + 8531 ( 601 1 1444 0 0 0 ) + 8532 ( 34 4 1444 0 4918 5 ) + 8533 ( 860 1 1444 0 0 0 ) + 8534 ( 1476 0 1444 1454 0 0 ) + 8535 ( 468 4 1445 0 4923 4 ) + 8536 ( 819 1 1445 0 0 0 ) + 8537 ( 984 1 1445 0 0 0 ) + 8538 ( 1580 1 1445 0 0 0 ) + 8539 ( 1580 0 1445 1471 0 0 ) + 8540 ( 1580 0 1445 1473 0 0 ) + 8541 ( 1525 1 1445 0 0 0 ) + 8542 ( 345 1 1446 0 0 0 ) + 8543 ( 808 1 1446 0 0 0 ) + 8544 ( 1602 1 1446 0 0 0 ) + 8545 ( 34 0 1446 1450 0 0 ) + 8546 ( 1594 0 1447 1446 0 0 ) + 8547 ( 34 0 1446 1449 0 0 ) + 8548 ( 34 0 1446 1448 0 0 ) + 8549 ( 808 0 1446 1451 0 0 ) + 8550 ( 851 1 1447 0 0 0 ) + 8551 ( 34 4 1447 0 4927 4 ) + 8552 ( 1602 1 1447 0 0 0 ) + 8553 ( 345 1 1447 0 0 0 ) + 8554 ( 1604 0 1448 1449 0 0 ) + 8555 ( 1598 4 1448 0 4931 4 ) + 8556 ( 1577 0 1448 1450 0 0 ) + 8557 ( 1577 0 1449 1450 0 0 ) + 8558 ( 808 0 1449 1451 0 0 ) + 8559 ( 1578 0 1449 1453 0 0 ) + 8560 ( 808 1 1450 0 0 0 ) + 8561 ( 1602 1 1450 0 0 0 ) + 8562 ( 1598 4 1450 0 4935 3 ) + 8563 ( 345 1 1451 0 0 0 ) + 8564 ( 1578 0 1451 1453 0 0 ) + 8565 ( 1577 1 1451 0 0 0 ) + 8566 ( 1586 0 1451 1452 0 0 ) + 8567 ( 1586 0 1453 1452 0 0 ) + 8568 ( 1577 1 1452 0 0 0 ) + 8569 ( 1598 4 1452 0 4938 4 ) + 8570 ( 1580 0 1452 1470 0 0 ) + 8571 ( 1580 1 1452 0 0 0 ) + 8572 ( 345 1 1452 0 0 0 ) + 8573 ( 1598 4 1453 0 4942 9 ) + 8574 ( 1577 1 1453 0 0 0 ) + 8575 ( 1120 0 1454 1456 0 0 ) + 8576 ( 1120 0 1454 1455 0 0 ) + 8577 ( 1120 0 1454 1457 0 0 ) + 8578 ( 1120 1 1454 0 0 0 ) + 8579 ( 860 1 1454 0 0 0 ) + 8580 ( 601 1 1454 0 0 0 ) + 8581 ( 1572 1 1455 0 0 0 ) + 8582 ( 1572 0 1455 1457 0 0 ) + 8583 ( 601 1 1455 0 0 0 ) + 8584 ( 601 1 1456 0 0 0 ) + 8585 ( 968 4 1456 0 4951 4 ) + 8586 ( 855 0 1456 1457 0 0 ) + 8587 ( 860 1 1456 0 0 0 ) + 8588 ( 968 4 1457 0 4955 5 ) + 8589 ( 601 1 1457 0 0 0 ) + 8590 ( 1606 0 1458 1474 0 0 ) + 8591 ( 1609 0 1458 1466 0 0 ) + 8592 ( 1606 1 1458 0 0 0 ) + 8593 ( 1609 1 1458 0 0 0 ) + 8594 ( 458 1 1458 0 0 0 ) + 8595 ( 458 0 1458 1459 0 0 ) + 8596 ( 1525 1 1458 0 0 0 ) + 8597 ( 470 4 1458 0 4960 4 ) + 8598 ( 1606 0 1459 1474 0 0 ) + 8599 ( 1609 0 1459 1466 0 0 ) + 8600 ( 1606 1 1459 0 0 0 ) + 8601 ( 1609 1 1459 0 0 0 ) + 8602 ( 1426 0 1459 1460 0 0 ) + 8603 ( 1426 1 1459 0 0 0 ) + 8604 ( 1525 1 1459 0 0 0 ) + 8605 ( 460 4 1459 0 4964 4 ) + 8606 ( 1606 0 1460 1474 0 0 ) + 8607 ( 1609 0 1460 1466 0 0 ) + 8608 ( 1606 1 1460 0 0 0 ) + 8609 ( 1609 1 1460 0 0 0 ) + 8610 ( 658 4 1460 0 4968 4 ) + 8611 ( 1525 1 1460 0 0 0 ) + 8612 ( 1610 0 1460 1461 0 0 ) + 8613 ( 1606 0 1461 1476 0 0 ) + 8614 ( 1609 0 1461 1468 0 0 ) + 8615 ( 1606 1 1461 0 0 0 ) + 8616 ( 1609 1 1461 0 0 0 ) + 8617 ( 984 0 1461 1464 0 0 ) + 8618 ( 984 1 1461 0 0 0 ) + 8619 ( 658 4 1461 0 4972 4 ) + 8620 ( 1525 1 1461 0 0 0 ) + 8621 ( 1606 0 1462 1475 0 0 ) + 8622 ( 1609 0 1462 1467 0 0 ) + 8623 ( 1606 1 1462 0 0 0 ) + 8624 ( 1609 1 1462 0 0 0 ) + 8625 ( 1049 0 1462 1464 0 0 ) + 8626 ( 1612 0 1462 1463 0 0 ) + 8627 ( 990 4 1462 0 4976 4 ) + 8628 ( 1525 1 1462 0 0 0 ) + 8629 ( 1606 0 1463 1477 0 0 ) + 8630 ( 1609 0 1463 1469 0 0 ) + 8631 ( 1606 1 1463 0 0 0 ) + 8632 ( 1609 1 1463 0 0 0 ) + 8633 ( 1120 0 1463 1465 0 0 ) + 8634 ( 1120 1 1463 0 0 0 ) + 8635 ( 990 4 1463 0 4980 4 ) + 8636 ( 1525 1 1463 0 0 0 ) + 8637 ( 1606 0 1464 1476 0 0 ) + 8638 ( 1609 0 1464 1468 0 0 ) + 8639 ( 1606 1 1464 0 0 0 ) + 8640 ( 1609 1 1464 0 0 0 ) + 8641 ( 788 4 1464 0 4984 4 ) + 8642 ( 1049 1 0 1464 0 0 ) + 8643 ( 1525 1 1464 0 0 0 ) + 8644 ( 1591 1 1465 0 0 0 ) + 8645 ( 1592 4 1465 0 4988 6 ) + 8646 ( 1525 1 1465 0 0 0 ) + 8647 ( 1120 0 1469 1465 0 0 ) + 8648 ( 1526 1 1465 0 0 0 ) + 8649 ( 1120 0 1477 1465 0 0 ) + 8650 ( 1610 0 1466 1468 0 0 ) + 8651 ( 1525 1 1466 0 0 0 ) + 8652 ( 1614 4 1466 0 4994 7 ) + 8653 ( 1617 0 1466 1471 0 0 ) + 8654 ( 1610 0 1466 1472 0 0 ) + 8655 ( 1612 0 1467 1469 0 0 ) + 8656 ( 1049 0 1467 1468 0 0 ) + 8657 ( 1614 4 1467 0 5001 4 ) + 8658 ( 1591 1 1467 0 0 0 ) + 8659 ( 1525 1 1467 0 0 0 ) + 8660 ( 1614 4 1468 0 5005 6 ) + 8661 ( 1591 1 1468 0 0 0 ) + 8662 ( 1591 0 1468 1472 0 0 ) + 8663 ( 1525 1 1468 0 0 0 ) + 8664 ( 1614 4 1469 0 5011 4 ) + 8665 ( 1591 1 1469 0 0 0 ) + 8666 ( 1525 1 1469 0 0 0 ) + 8667 ( 1577 1 1470 0 0 0 ) + 8668 ( 1525 1 1470 0 0 0 ) + 8669 ( 1598 4 1470 0 5015 4 ) + 8670 ( 1610 0 1471 1473 0 0 ) + 8671 ( 1614 4 1471 0 5019 4 ) + 8672 ( 1525 1 1471 0 0 0 ) + 8673 ( 1617 0 1472 1473 0 0 ) + 8674 ( 1614 4 1472 0 5023 4 ) + 8675 ( 984 1 1472 0 0 0 ) + 8676 ( 1525 1 1472 0 0 0 ) + 8677 ( 1614 4 1473 0 5027 4 ) + 8678 ( 984 1 1473 0 0 0 ) + 8679 ( 1525 1 1473 0 0 0 ) + 8680 ( 1610 0 1474 1476 0 0 ) + 8681 ( 1614 4 1474 0 5031 6 ) + 8682 ( 1526 1 1474 0 0 0 ) + 8683 ( 1525 1 1474 0 0 0 ) + 8684 ( 1612 0 1475 1477 0 0 ) + 8685 ( 1049 0 1475 1476 0 0 ) + 8686 ( 1526 1 1475 0 0 0 ) + 8687 ( 1614 4 1475 0 5037 4 ) + 8688 ( 1525 1 1475 0 0 0 ) + 8689 ( 1526 1 1476 0 0 0 ) + 8690 ( 1614 4 1476 0 5041 5 ) + 8691 ( 1525 1 1476 0 0 0 ) + 8692 ( 1526 1 1477 0 0 0 ) + 8693 ( 1614 4 1477 0 5046 4 ) + 8694 ( 1525 1 1477 0 0 0 ) +} +faceIndex 13227 { + 0 ( 1 ) + 1 ( 2 ) + 2 ( 3 ) + 3 ( 4 ) + 4 ( 5 ) + 5 ( 6 ) + 6 ( 7 ) + 7 ( 8 ) + 8 ( 9 ) + 9 ( 10 ) + 10 ( 11 ) + 11 ( 12 ) + 12 ( 13 ) + 13 ( 14 ) + 14 ( 15 ) + 15 ( 16 ) + 16 ( 17 ) + 17 ( 18 ) + 18 ( 19 ) + 19 ( 20 ) + 20 ( 21 ) + 21 ( 22 ) + 22 ( 23 ) + 23 ( 24 ) + 24 ( 25 ) + 25 ( 26 ) + 26 ( 27 ) + 27 ( 28 ) + 28 ( 29 ) + 29 ( 30 ) + 30 ( 31 ) + 31 ( 32 ) + 32 ( 33 ) + 33 ( 34 ) + 34 ( 35 ) + 35 ( 36 ) + 36 ( 37 ) + 37 ( 38 ) + 38 ( 39 ) + 39 ( 40 ) + 40 ( 41 ) + 41 ( 42 ) + 42 ( 43 ) + 43 ( 44 ) + 44 ( 45 ) + 45 ( 46 ) + 46 ( 47 ) + 47 ( 48 ) + 48 ( 49 ) + 49 ( 50 ) + 50 ( 51 ) + 51 ( 52 ) + 52 ( 53 ) + 53 ( 54 ) + 54 ( 55 ) + 55 ( 56 ) + 56 ( 57 ) + 57 ( 58 ) + 58 ( 59 ) + 59 ( 60 ) + 60 ( 61 ) + 61 ( 62 ) + 62 ( 63 ) + 63 ( 64 ) + 64 ( 65 ) + 65 ( 66 ) + 66 ( 67 ) + 67 ( 68 ) + 68 ( 69 ) + 69 ( 70 ) + 70 ( 71 ) + 71 ( 72 ) + 72 ( 73 ) + 73 ( 74 ) + 74 ( 75 ) + 75 ( 76 ) + 76 ( 77 ) + 77 ( 78 ) + 78 ( 79 ) + 79 ( 80 ) + 80 ( 81 ) + 81 ( 82 ) + 82 ( 83 ) + 83 ( 84 ) + 84 ( 85 ) + 85 ( 86 ) + 86 ( 87 ) + 87 ( 88 ) + 88 ( 89 ) + 89 ( 90 ) + 90 ( 91 ) + 91 ( 92 ) + 92 ( 93 ) + 93 ( 94 ) + 94 ( 95 ) + 95 ( 96 ) + 96 ( 97 ) + 97 ( 98 ) + 98 ( 99 ) + 99 ( 100 ) + 100 ( 101 ) + 101 ( 102 ) + 102 ( 103 ) + 103 ( 104 ) + 104 ( 105 ) + 105 ( 106 ) + 106 ( 107 ) + 107 ( 108 ) + 108 ( 109 ) + 109 ( 110 ) + 110 ( -100 ) + 111 ( 111 ) + 112 ( 112 ) + 113 ( 113 ) + 114 ( 114 ) + 115 ( 115 ) + 116 ( 116 ) + 117 ( 117 ) + 118 ( 118 ) + 119 ( 119 ) + 120 ( 120 ) + 121 ( 121 ) + 122 ( 122 ) + 123 ( 123 ) + 124 ( 124 ) + 125 ( 125 ) + 126 ( 126 ) + 127 ( 127 ) + 128 ( -119 ) + 129 ( 128 ) + 130 ( 129 ) + 131 ( 130 ) + 132 ( 131 ) + 133 ( 132 ) + 134 ( 133 ) + 135 ( 134 ) + 136 ( 135 ) + 137 ( -130 ) + 138 ( 136 ) + 139 ( 137 ) + 140 ( 138 ) + 141 ( 139 ) + 142 ( 140 ) + 143 ( 141 ) + 144 ( 142 ) + 145 ( 143 ) + 146 ( 144 ) + 147 ( 145 ) + 148 ( 146 ) + 149 ( 147 ) + 150 ( 148 ) + 151 ( 149 ) + 152 ( 150 ) + 153 ( 151 ) + 154 ( 152 ) + 155 ( 153 ) + 156 ( 154 ) + 157 ( 155 ) + 158 ( -148 ) + 159 ( 156 ) + 160 ( -135 ) + 161 ( -118 ) + 162 ( -126 ) + 163 ( 157 ) + 164 ( 158 ) + 165 ( -159 ) + 166 ( 160 ) + 167 ( 161 ) + 168 ( 162 ) + 169 ( 163 ) + 170 ( 164 ) + 171 ( 165 ) + 172 ( 166 ) + 173 ( 167 ) + 174 ( 168 ) + 175 ( -140 ) + 176 ( 169 ) + 177 ( 170 ) + 178 ( 171 ) + 179 ( 172 ) + 180 ( 173 ) + 181 ( 174 ) + 182 ( -165 ) + 183 ( 175 ) + 184 ( -139 ) + 185 ( 176 ) + 186 ( 177 ) + 187 ( 178 ) + 188 ( 179 ) + 189 ( 180 ) + 190 ( -164 ) + 191 ( 181 ) + 192 ( 182 ) + 193 ( 183 ) + 194 ( -176 ) + 195 ( 184 ) + 196 ( 185 ) + 197 ( -174 ) + 198 ( -178 ) + 199 ( -167 ) + 200 ( 186 ) + 201 ( 187 ) + 202 ( 188 ) + 203 ( 189 ) + 204 ( 190 ) + 205 ( 191 ) + 206 ( 192 ) + 207 ( 193 ) + 208 ( 194 ) + 209 ( 195 ) + 210 ( 196 ) + 211 ( -147 ) + 212 ( 197 ) + 213 ( -192 ) + 214 ( 198 ) + 215 ( 199 ) + 216 ( 200 ) + 217 ( 201 ) + 218 ( -155 ) + 219 ( 202 ) + 220 ( 203 ) + 221 ( 204 ) + 222 ( 205 ) + 223 ( 206 ) + 224 ( -201 ) + 225 ( -123 ) + 226 ( 207 ) + 227 ( 208 ) + 228 ( -209 ) + 229 ( 210 ) + 230 ( -211 ) + 231 ( 212 ) + 232 ( 213 ) + 233 ( -214 ) + 234 ( 215 ) + 235 ( 216 ) + 236 ( 217 ) + 237 ( 218 ) + 238 ( 219 ) + 239 ( 220 ) + 240 ( 221 ) + 241 ( 222 ) + 242 ( -202 ) + 243 ( -115 ) + 244 ( -145 ) + 245 ( -154 ) + 246 ( -191 ) + 247 ( -197 ) + 248 ( -216 ) + 249 ( 223 ) + 250 ( 224 ) + 251 ( 225 ) + 252 ( 226 ) + 253 ( 227 ) + 254 ( -206 ) + 255 ( 228 ) + 256 ( -224 ) + 257 ( 229 ) + 258 ( 230 ) + 259 ( -205 ) + 260 ( -117 ) + 261 ( -231 ) + 262 ( 232 ) + 263 ( -233 ) + 264 ( -234 ) + 265 ( 235 ) + 266 ( -236 ) + 267 ( -237 ) + 268 ( 238 ) + 269 ( -173 ) + 270 ( -183 ) + 271 ( 239 ) + 272 ( 240 ) + 273 ( 241 ) + 274 ( -242 ) + 275 ( -243 ) + 276 ( -244 ) + 277 ( -245 ) + 278 ( -246 ) + 279 ( -247 ) + 280 ( -248 ) + 281 ( -249 ) + 282 ( -250 ) + 283 ( 251 ) + 284 ( -252 ) + 285 ( 253 ) + 286 ( -254 ) + 287 ( -255 ) + 288 ( -256 ) + 289 ( -257 ) + 290 ( -232 ) + 291 ( 258 ) + 292 ( -172 ) + 293 ( -182 ) + 294 ( 259 ) + 295 ( 260 ) + 296 ( 261 ) + 297 ( 262 ) + 298 ( 263 ) + 299 ( 264 ) + 300 ( 265 ) + 301 ( 247 ) + 302 ( 266 ) + 303 ( 267 ) + 304 ( 268 ) + 305 ( 246 ) + 306 ( -261 ) + 307 ( 269 ) + 308 ( 270 ) + 309 ( 271 ) + 310 ( 272 ) + 311 ( 273 ) + 312 ( 274 ) + 313 ( 211 ) + 314 ( 275 ) + 315 ( 276 ) + 316 ( 277 ) + 317 ( 278 ) + 318 ( 279 ) + 319 ( 280 ) + 320 ( 281 ) + 321 ( 282 ) + 322 ( 283 ) + 323 ( 284 ) + 324 ( 285 ) + 325 ( 286 ) + 326 ( 287 ) + 327 ( 288 ) + 328 ( 289 ) + 329 ( -281 ) + 330 ( 290 ) + 331 ( 291 ) + 332 ( 292 ) + 333 ( 293 ) + 334 ( 294 ) + 335 ( 295 ) + 336 ( 296 ) + 337 ( 297 ) + 338 ( 298 ) + 339 ( 299 ) + 340 ( 300 ) + 341 ( 301 ) + 342 ( 302 ) + 343 ( 303 ) + 344 ( 304 ) + 345 ( -291 ) + 346 ( 305 ) + 347 ( 306 ) + 348 ( 307 ) + 349 ( 308 ) + 350 ( 309 ) + 351 ( -302 ) + 352 ( -290 ) + 353 ( 310 ) + 354 ( 311 ) + 355 ( 312 ) + 356 ( 313 ) + 357 ( 314 ) + 358 ( 315 ) + 359 ( 316 ) + 360 ( 317 ) + 361 ( 318 ) + 362 ( 319 ) + 363 ( 320 ) + 364 ( 321 ) + 365 ( -134 ) + 366 ( -210 ) + 367 ( -220 ) + 368 ( 322 ) + 369 ( -114 ) + 370 ( -125 ) + 371 ( -144 ) + 372 ( -153 ) + 373 ( 323 ) + 374 ( -324 ) + 375 ( 325 ) + 376 ( 326 ) + 377 ( 327 ) + 378 ( 328 ) + 379 ( 329 ) + 380 ( 330 ) + 381 ( 331 ) + 382 ( 332 ) + 383 ( 333 ) + 384 ( 334 ) + 385 ( 335 ) + 386 ( 336 ) + 387 ( -99 ) + 388 ( 337 ) + 389 ( 338 ) + 390 ( -339 ) + 391 ( 340 ) + 392 ( 341 ) + 393 ( 342 ) + 394 ( 343 ) + 395 ( 344 ) + 396 ( 345 ) + 397 ( 346 ) + 398 ( 347 ) + 399 ( 348 ) + 400 ( -105 ) + 401 ( -349 ) + 402 ( -350 ) + 403 ( 351 ) + 404 ( 352 ) + 405 ( 353 ) + 406 ( -337 ) + 407 ( 354 ) + 408 ( 355 ) + 409 ( 356 ) + 410 ( 357 ) + 411 ( -104 ) + 412 ( 358 ) + 413 ( 359 ) + 414 ( 360 ) + 415 ( 361 ) + 416 ( 362 ) + 417 ( -358 ) + 418 ( -106 ) + 419 ( -93 ) + 420 ( -333 ) + 421 ( 363 ) + 422 ( 364 ) + 423 ( 365 ) + 424 ( 366 ) + 425 ( 367 ) + 426 ( -357 ) + 427 ( -348 ) + 428 ( -363 ) + 429 ( 368 ) + 430 ( -109 ) + 431 ( -98 ) + 432 ( 369 ) + 433 ( -336 ) + 434 ( 370 ) + 435 ( -344 ) + 436 ( 371 ) + 437 ( 372 ) + 438 ( 373 ) + 439 ( 374 ) + 440 ( -370 ) + 441 ( -354 ) + 442 ( 375 ) + 443 ( 376 ) + 444 ( 377 ) + 445 ( 378 ) + 446 ( 379 ) + 447 ( 380 ) + 448 ( -378 ) + 449 ( -332 ) + 450 ( 381 ) + 451 ( 382 ) + 452 ( -362 ) + 453 ( -377 ) + 454 ( -373 ) + 455 ( -381 ) + 456 ( -356 ) + 457 ( -347 ) + 458 ( -364 ) + 459 ( 383 ) + 460 ( -335 ) + 461 ( 384 ) + 462 ( -372 ) + 463 ( -345 ) + 464 ( 385 ) + 465 ( 386 ) + 466 ( 387 ) + 467 ( 388 ) + 468 ( 389 ) + 469 ( 390 ) + 470 ( -391 ) + 471 ( -392 ) + 472 ( 393 ) + 473 ( 394 ) + 474 ( 395 ) + 475 ( 396 ) + 476 ( 397 ) + 477 ( -361 ) + 478 ( -380 ) + 479 ( 398 ) + 480 ( 399 ) + 481 ( 400 ) + 482 ( 401 ) + 483 ( 402 ) + 484 ( 324 ) + 485 ( 403 ) + 486 ( 404 ) + 487 ( -396 ) + 488 ( -331 ) + 489 ( 405 ) + 490 ( 406 ) + 491 ( 407 ) + 492 ( 408 ) + 493 ( -360 ) + 494 ( -379 ) + 495 ( 409 ) + 496 ( -402 ) + 497 ( 410 ) + 498 ( -316 ) + 499 ( 411 ) + 500 ( 412 ) + 501 ( 413 ) + 502 ( -23 ) + 503 ( -328 ) + 504 ( -315 ) + 505 ( 414 ) + 506 ( 415 ) + 507 ( -219 ) + 508 ( -401 ) + 509 ( -143 ) + 510 ( -190 ) + 511 ( 416 ) + 512 ( 417 ) + 513 ( 418 ) + 514 ( 419 ) + 515 ( 420 ) + 516 ( 421 ) + 517 ( 422 ) + 518 ( 423 ) + 519 ( -424 ) + 520 ( 425 ) + 521 ( -22 ) + 522 ( -413 ) + 523 ( -426 ) + 524 ( -427 ) + 525 ( -428 ) + 526 ( -429 ) + 527 ( -366 ) + 528 ( -430 ) + 529 ( 431 ) + 530 ( 429 ) + 531 ( 432 ) + 532 ( 433 ) + 533 ( 434 ) + 534 ( -103 ) + 535 ( -82 ) + 536 ( -367 ) + 537 ( 435 ) + 538 ( 430 ) + 539 ( -432 ) + 540 ( 436 ) + 541 ( -81 ) + 542 ( 437 ) + 543 ( 438 ) + 544 ( 439 ) + 545 ( 440 ) + 546 ( -21 ) + 547 ( 441 ) + 548 ( 442 ) + 549 ( 424 ) + 550 ( 443 ) + 551 ( 428 ) + 552 ( 444 ) + 553 ( -416 ) + 554 ( -79 ) + 555 ( 445 ) + 556 ( 446 ) + 557 ( 447 ) + 558 ( -20 ) + 559 ( 448 ) + 560 ( 449 ) + 561 ( 450 ) + 562 ( 451 ) + 563 ( 452 ) + 564 ( 453 ) + 565 ( -437 ) + 566 ( -445 ) + 567 ( -418 ) + 568 ( 454 ) + 569 ( 455 ) + 570 ( 456 ) + 571 ( 457 ) + 572 ( 458 ) + 573 ( 459 ) + 574 ( 460 ) + 575 ( 461 ) + 576 ( 462 ) + 577 ( 463 ) + 578 ( -447 ) + 579 ( -423 ) + 580 ( 464 ) + 581 ( 465 ) + 582 ( 466 ) + 583 ( 467 ) + 584 ( -456 ) + 585 ( -422 ) + 586 ( 468 ) + 587 ( 469 ) + 588 ( -470 ) + 589 ( -471 ) + 590 ( -472 ) + 591 ( -473 ) + 592 ( -455 ) + 593 ( -464 ) + 594 ( -421 ) + 595 ( 474 ) + 596 ( 475 ) + 597 ( -102 ) + 598 ( -19 ) + 599 ( 476 ) + 600 ( 477 ) + 601 ( -431 ) + 602 ( -435 ) + 603 ( 427 ) + 604 ( -443 ) + 605 ( 478 ) + 606 ( 479 ) + 607 ( -442 ) + 608 ( 426 ) + 609 ( -80 ) + 610 ( 480 ) + 611 ( -478 ) + 612 ( 481 ) + 613 ( 482 ) + 614 ( 483 ) + 615 ( -288 ) + 616 ( 484 ) + 617 ( 485 ) + 618 ( -283 ) + 619 ( 486 ) + 620 ( 487 ) + 621 ( 488 ) + 622 ( 489 ) + 623 ( 490 ) + 624 ( -287 ) + 625 ( 491 ) + 626 ( 492 ) + 627 ( 493 ) + 628 ( 494 ) + 629 ( 495 ) + 630 ( 496 ) + 631 ( 497 ) + 632 ( -18 ) + 633 ( 498 ) + 634 ( -499 ) + 635 ( 500 ) + 636 ( 501 ) + 637 ( -502 ) + 638 ( 503 ) + 639 ( -446 ) + 640 ( -454 ) + 641 ( 504 ) + 642 ( 505 ) + 643 ( 506 ) + 644 ( 507 ) + 645 ( -322 ) + 646 ( -151 ) + 647 ( -504 ) + 648 ( -92 ) + 649 ( -330 ) + 650 ( -417 ) + 651 ( -404 ) + 652 ( 508 ) + 653 ( 509 ) + 654 ( -507 ) + 655 ( -412 ) + 656 ( 510 ) + 657 ( -146 ) + 658 ( 499 ) + 659 ( 470 ) + 660 ( -448 ) + 661 ( 511 ) + 662 ( 512 ) + 663 ( 513 ) + 664 ( 514 ) + 665 ( 515 ) + 666 ( 516 ) + 667 ( 517 ) + 668 ( 518 ) + 669 ( 519 ) + 670 ( 502 ) + 671 ( 472 ) + 672 ( -463 ) + 673 ( -451 ) + 674 ( 520 ) + 675 ( 521 ) + 676 ( 522 ) + 677 ( 523 ) + 678 ( -513 ) + 679 ( 471 ) + 680 ( 524 ) + 681 ( 525 ) + 682 ( 526 ) + 683 ( 527 ) + 684 ( -515 ) + 685 ( 473 ) + 686 ( -467 ) + 687 ( 528 ) + 688 ( 529 ) + 689 ( -524 ) + 690 ( -520 ) + 691 ( -530 ) + 692 ( 531 ) + 693 ( 532 ) + 694 ( 533 ) + 695 ( 534 ) + 696 ( -458 ) + 697 ( -525 ) + 698 ( -518 ) + 699 ( 535 ) + 700 ( 536 ) + 701 ( 537 ) + 702 ( 538 ) + 703 ( 539 ) + 704 ( 540 ) + 705 ( 541 ) + 706 ( 542 ) + 707 ( 543 ) + 708 ( 544 ) + 709 ( 545 ) + 710 ( 546 ) + 711 ( -91 ) + 712 ( 547 ) + 713 ( 548 ) + 714 ( 549 ) + 715 ( 550 ) + 716 ( -76 ) + 717 ( 551 ) + 718 ( 552 ) + 719 ( -548 ) + 720 ( 553 ) + 721 ( -75 ) + 722 ( 554 ) + 723 ( 555 ) + 724 ( 556 ) + 725 ( -556 ) + 726 ( -552 ) + 727 ( 557 ) + 728 ( 558 ) + 729 ( -77 ) + 730 ( 559 ) + 731 ( 560 ) + 732 ( -549 ) + 733 ( -560 ) + 734 ( 561 ) + 735 ( 562 ) + 736 ( -78 ) + 737 ( 563 ) + 738 ( -541 ) + 739 ( 564 ) + 740 ( -565 ) + 741 ( 566 ) + 742 ( 567 ) + 743 ( 568 ) + 744 ( -555 ) + 745 ( -557 ) + 746 ( -89 ) + 747 ( 569 ) + 748 ( -570 ) + 749 ( 571 ) + 750 ( 572 ) + 751 ( 573 ) + 752 ( 574 ) + 753 ( 575 ) + 754 ( 565 ) + 755 ( 576 ) + 756 ( -559 ) + 757 ( -561 ) + 758 ( -90 ) + 759 ( -545 ) + 760 ( 577 ) + 761 ( 578 ) + 762 ( -17 ) + 763 ( 579 ) + 764 ( 580 ) + 765 ( 581 ) + 766 ( -581 ) + 767 ( 582 ) + 768 ( -74 ) + 769 ( 583 ) + 770 ( 584 ) + 771 ( 585 ) + 772 ( 586 ) + 773 ( -587 ) + 774 ( -588 ) + 775 ( -16 ) + 776 ( -589 ) + 777 ( -578 ) + 778 ( -585 ) + 779 ( 590 ) + 780 ( 591 ) + 781 ( -592 ) + 782 ( -15 ) + 783 ( -593 ) + 784 ( 594 ) + 785 ( -595 ) + 786 ( -577 ) + 787 ( -582 ) + 788 ( -540 ) + 789 ( 596 ) + 790 ( -597 ) + 791 ( 598 ) + 792 ( -599 ) + 793 ( -600 ) + 794 ( 601 ) + 795 ( 602 ) + 796 ( -572 ) + 797 ( 603 ) + 798 ( 604 ) + 799 ( -584 ) + 800 ( -591 ) + 801 ( -596 ) + 802 ( 605 ) + 803 ( -544 ) + 804 ( -87 ) + 805 ( 606 ) + 806 ( 607 ) + 807 ( -70 ) + 808 ( 608 ) + 809 ( 609 ) + 810 ( 610 ) + 811 ( -606 ) + 812 ( 611 ) + 813 ( -69 ) + 814 ( 612 ) + 815 ( 613 ) + 816 ( 614 ) + 817 ( -614 ) + 818 ( -610 ) + 819 ( 615 ) + 820 ( -71 ) + 821 ( 616 ) + 822 ( 617 ) + 823 ( 618 ) + 824 ( -607 ) + 825 ( -618 ) + 826 ( 619 ) + 827 ( -603 ) + 828 ( -72 ) + 829 ( 620 ) + 830 ( 621 ) + 831 ( -613 ) + 832 ( -609 ) + 833 ( -621 ) + 834 ( 622 ) + 835 ( -73 ) + 836 ( -576 ) + 837 ( 623 ) + 838 ( -604 ) + 839 ( 624 ) + 840 ( 625 ) + 841 ( -626 ) + 842 ( -627 ) + 843 ( 628 ) + 844 ( -571 ) + 845 ( -611 ) + 846 ( -616 ) + 847 ( -623 ) + 848 ( 629 ) + 849 ( -88 ) + 850 ( 630 ) + 851 ( 631 ) + 852 ( -617 ) + 853 ( -619 ) + 854 ( -590 ) + 855 ( 632 ) + 856 ( 633 ) + 857 ( -86 ) + 858 ( 634 ) + 859 ( 635 ) + 860 ( 636 ) + 861 ( -629 ) + 862 ( -605 ) + 863 ( 637 ) + 864 ( 638 ) + 865 ( -633 ) + 866 ( -84 ) + 867 ( 639 ) + 868 ( 640 ) + 869 ( 641 ) + 870 ( 642 ) + 871 ( 643 ) + 872 ( 644 ) + 873 ( 645 ) + 874 ( -65 ) + 875 ( 646 ) + 876 ( 647 ) + 877 ( -643 ) + 878 ( 648 ) + 879 ( 649 ) + 880 ( -64 ) + 881 ( 650 ) + 882 ( 651 ) + 883 ( -651 ) + 884 ( -647 ) + 885 ( -66 ) + 886 ( 652 ) + 887 ( 653 ) + 888 ( 654 ) + 889 ( 655 ) + 890 ( -644 ) + 891 ( -655 ) + 892 ( 656 ) + 893 ( 657 ) + 894 ( -67 ) + 895 ( -637 ) + 896 ( 658 ) + 897 ( -650 ) + 898 ( -646 ) + 899 ( -658 ) + 900 ( -638 ) + 901 ( -631 ) + 902 ( -68 ) + 903 ( 659 ) + 904 ( 660 ) + 905 ( 661 ) + 906 ( 662 ) + 907 ( -663 ) + 908 ( -664 ) + 909 ( 665 ) + 910 ( -666 ) + 911 ( -667 ) + 912 ( -648 ) + 913 ( -654 ) + 914 ( -660 ) + 915 ( 668 ) + 916 ( -83 ) + 917 ( -632 ) + 918 ( 669 ) + 919 ( 670 ) + 920 ( 671 ) + 921 ( 672 ) + 922 ( -500 ) + 923 ( -449 ) + 924 ( -441 ) + 925 ( 673 ) + 926 ( 674 ) + 927 ( 675 ) + 928 ( -653 ) + 929 ( -656 ) + 930 ( 676 ) + 931 ( -668 ) + 932 ( -642 ) + 933 ( 677 ) + 934 ( 678 ) + 935 ( 679 ) + 936 ( -85 ) + 937 ( 680 ) + 938 ( 663 ) + 939 ( 681 ) + 940 ( 682 ) + 941 ( 683 ) + 942 ( 684 ) + 943 ( 685 ) + 944 ( 686 ) + 945 ( 687 ) + 946 ( 688 ) + 947 ( 689 ) + 948 ( 690 ) + 949 ( 691 ) + 950 ( 692 ) + 951 ( 693 ) + 952 ( 694 ) + 953 ( -503 ) + 954 ( -452 ) + 955 ( -690 ) + 956 ( 695 ) + 957 ( -512 ) + 958 ( 696 ) + 959 ( 697 ) + 960 ( -693 ) + 961 ( 698 ) + 962 ( -681 ) + 963 ( 699 ) + 964 ( 700 ) + 965 ( 664 ) + 966 ( 627 ) + 967 ( 600 ) + 968 ( 701 ) + 969 ( 702 ) + 970 ( 703 ) + 971 ( 704 ) + 972 ( 705 ) + 973 ( 706 ) + 974 ( 707 ) + 975 ( 708 ) + 976 ( 709 ) + 977 ( 710 ) + 978 ( 711 ) + 979 ( 712 ) + 980 ( -686 ) + 981 ( -707 ) + 982 ( 713 ) + 983 ( 714 ) + 984 ( 666 ) + 985 ( 715 ) + 986 ( 716 ) + 987 ( -679 ) + 988 ( 717 ) + 989 ( 718 ) + 990 ( 719 ) + 991 ( 720 ) + 992 ( 721 ) + 993 ( -684 ) + 994 ( 722 ) + 995 ( 723 ) + 996 ( 724 ) + 997 ( 725 ) + 998 ( 726 ) + 999 ( -674 ) + 1000 ( 727 ) + 1001 ( -453 ) + 1002 ( -722 ) + 1003 ( 728 ) + 1004 ( 729 ) + 1005 ( 730 ) + 1006 ( 731 ) + 1007 ( -511 ) + 1008 ( -673 ) + 1009 ( -727 ) + 1010 ( -675 ) + 1011 ( 732 ) + 1012 ( 733 ) + 1013 ( -715 ) + 1014 ( 734 ) + 1015 ( 735 ) + 1016 ( 736 ) + 1017 ( 737 ) + 1018 ( 738 ) + 1019 ( -501 ) + 1020 ( -450 ) + 1021 ( -728 ) + 1022 ( -723 ) + 1023 ( -695 ) + 1024 ( -691 ) + 1025 ( -735 ) + 1026 ( -699 ) + 1027 ( -716 ) + 1028 ( -514 ) + 1029 ( -676 ) + 1030 ( 739 ) + 1031 ( 667 ) + 1032 ( 626 ) + 1033 ( 599 ) + 1034 ( -634 ) + 1035 ( 740 ) + 1036 ( 741 ) + 1037 ( 742 ) + 1038 ( 743 ) + 1039 ( 744 ) + 1040 ( 745 ) + 1041 ( -705 ) + 1042 ( -639 ) + 1043 ( 746 ) + 1044 ( 747 ) + 1045 ( -711 ) + 1046 ( -720 ) + 1047 ( -745 ) + 1048 ( 748 ) + 1049 ( -439 ) + 1050 ( -730 ) + 1051 ( -725 ) + 1052 ( -733 ) + 1053 ( -640 ) + 1054 ( -678 ) + 1055 ( -635 ) + 1056 ( 749 ) + 1057 ( 750 ) + 1058 ( -718 ) + 1059 ( -743 ) + 1060 ( -747 ) + 1061 ( 751 ) + 1062 ( 752 ) + 1063 ( 753 ) + 1064 ( 754 ) + 1065 ( 755 ) + 1066 ( 756 ) + 1067 ( -543 ) + 1068 ( 757 ) + 1069 ( 758 ) + 1070 ( 759 ) + 1071 ( 760 ) + 1072 ( 761 ) + 1073 ( 762 ) + 1074 ( 570 ) + 1075 ( 597 ) + 1076 ( -752 ) + 1077 ( -542 ) + 1078 ( 763 ) + 1079 ( 764 ) + 1080 ( 765 ) + 1081 ( -757 ) + 1082 ( 766 ) + 1083 ( 767 ) + 1084 ( 593 ) + 1085 ( 588 ) + 1086 ( -476 ) + 1087 ( 768 ) + 1088 ( 769 ) + 1089 ( 770 ) + 1090 ( 771 ) + 1091 ( 772 ) + 1092 ( 773 ) + 1093 ( 774 ) + 1094 ( 775 ) + 1095 ( -97 ) + 1096 ( -477 ) + 1097 ( -773 ) + 1098 ( 776 ) + 1099 ( -108 ) + 1100 ( 777 ) + 1101 ( 778 ) + 1102 ( 587 ) + 1103 ( -438 ) + 1104 ( -479 ) + 1105 ( -641 ) + 1106 ( -677 ) + 1107 ( -636 ) + 1108 ( 779 ) + 1109 ( 780 ) + 1110 ( -749 ) + 1111 ( -96 ) + 1112 ( -771 ) + 1113 ( 592 ) + 1114 ( -756 ) + 1115 ( -546 ) + 1116 ( 781 ) + 1117 ( 782 ) + 1118 ( -770 ) + 1119 ( -95 ) + 1120 ( 783 ) + 1121 ( 595 ) + 1122 ( 589 ) + 1123 ( -580 ) + 1124 ( 784 ) + 1125 ( -768 ) + 1126 ( -63 ) + 1127 ( 350 ) + 1128 ( 339 ) + 1129 ( 785 ) + 1130 ( 786 ) + 1131 ( 787 ) + 1132 ( 788 ) + 1133 ( 789 ) + 1134 ( -94 ) + 1135 ( -107 ) + 1136 ( 790 ) + 1137 ( 791 ) + 1138 ( 792 ) + 1139 ( 793 ) + 1140 ( 794 ) + 1141 ( 795 ) + 1142 ( 796 ) + 1143 ( 797 ) + 1144 ( 798 ) + 1145 ( 799 ) + 1146 ( 800 ) + 1147 ( 801 ) + 1148 ( 802 ) + 1149 ( 803 ) + 1150 ( 804 ) + 1151 ( 805 ) + 1152 ( 806 ) + 1153 ( 807 ) + 1154 ( 808 ) + 1155 ( 809 ) + 1156 ( -788 ) + 1157 ( 810 ) + 1158 ( 811 ) + 1159 ( 812 ) + 1160 ( 813 ) + 1161 ( 814 ) + 1162 ( 815 ) + 1163 ( 816 ) + 1164 ( 817 ) + 1165 ( 818 ) + 1166 ( 819 ) + 1167 ( 820 ) + 1168 ( 821 ) + 1169 ( 822 ) + 1170 ( 823 ) + 1171 ( 824 ) + 1172 ( 825 ) + 1173 ( -808 ) + 1174 ( -787 ) + 1175 ( 826 ) + 1176 ( 827 ) + 1177 ( 828 ) + 1178 ( 829 ) + 1179 ( 830 ) + 1180 ( -814 ) + 1181 ( 831 ) + 1182 ( 832 ) + 1183 ( 833 ) + 1184 ( 834 ) + 1185 ( -835 ) + 1186 ( 836 ) + 1187 ( 837 ) + 1188 ( 838 ) + 1189 ( 839 ) + 1190 ( 840 ) + 1191 ( 841 ) + 1192 ( 842 ) + 1193 ( 843 ) + 1194 ( 844 ) + 1195 ( 845 ) + 1196 ( 846 ) + 1197 ( 847 ) + 1198 ( 848 ) + 1199 ( 849 ) + 1200 ( 850 ) + 1201 ( 851 ) + 1202 ( -839 ) + 1203 ( 852 ) + 1204 ( 853 ) + 1205 ( 854 ) + 1206 ( 855 ) + 1207 ( 856 ) + 1208 ( 857 ) + 1209 ( 858 ) + 1210 ( -840 ) + 1211 ( 859 ) + 1212 ( 860 ) + 1213 ( -853 ) + 1214 ( 861 ) + 1215 ( -841 ) + 1216 ( 862 ) + 1217 ( 863 ) + 1218 ( -852 ) + 1219 ( 864 ) + 1220 ( -843 ) + 1221 ( 865 ) + 1222 ( 866 ) + 1223 ( 867 ) + 1224 ( 868 ) + 1225 ( 869 ) + 1226 ( 870 ) + 1227 ( -845 ) + 1228 ( 871 ) + 1229 ( 872 ) + 1230 ( -868 ) + 1231 ( 873 ) + 1232 ( 874 ) + 1233 ( 875 ) + 1234 ( -867 ) + 1235 ( 876 ) + 1236 ( 877 ) + 1237 ( -848 ) + 1238 ( 878 ) + 1239 ( 879 ) + 1240 ( 880 ) + 1241 ( 881 ) + 1242 ( 882 ) + 1243 ( 883 ) + 1244 ( 884 ) + 1245 ( 885 ) + 1246 ( 886 ) + 1247 ( 887 ) + 1248 ( -881 ) + 1249 ( 888 ) + 1250 ( 889 ) + 1251 ( 890 ) + 1252 ( 891 ) + 1253 ( 892 ) + 1254 ( 893 ) + 1255 ( 894 ) + 1256 ( 895 ) + 1257 ( 896 ) + 1258 ( 897 ) + 1259 ( 898 ) + 1260 ( 899 ) + 1261 ( 900 ) + 1262 ( 901 ) + 1263 ( 902 ) + 1264 ( 903 ) + 1265 ( -888 ) + 1266 ( -904 ) + 1267 ( 905 ) + 1268 ( -889 ) + 1269 ( 906 ) + 1270 ( 907 ) + 1271 ( 908 ) + 1272 ( -837 ) + 1273 ( 909 ) + 1274 ( 910 ) + 1275 ( 911 ) + 1276 ( -890 ) + 1277 ( 912 ) + 1278 ( 913 ) + 1279 ( 914 ) + 1280 ( 915 ) + 1281 ( 916 ) + 1282 ( 917 ) + 1283 ( 918 ) + 1284 ( 919 ) + 1285 ( -855 ) + 1286 ( 920 ) + 1287 ( 921 ) + 1288 ( 922 ) + 1289 ( 923 ) + 1290 ( -911 ) + 1291 ( 924 ) + 1292 ( -919 ) + 1293 ( -891 ) + 1294 ( 925 ) + 1295 ( 926 ) + 1296 ( -927 ) + 1297 ( -916 ) + 1298 ( 928 ) + 1299 ( -860 ) + 1300 ( -910 ) + 1301 ( -922 ) + 1302 ( 929 ) + 1303 ( -928 ) + 1304 ( -892 ) + 1305 ( 930 ) + 1306 ( -931 ) + 1307 ( 932 ) + 1308 ( 927 ) + 1309 ( -914 ) + 1310 ( -893 ) + 1311 ( 931 ) + 1312 ( -912 ) + 1313 ( 933 ) + 1314 ( 934 ) + 1315 ( -863 ) + 1316 ( -920 ) + 1317 ( -909 ) + 1318 ( 935 ) + 1319 ( -934 ) + 1320 ( 936 ) + 1321 ( 937 ) + 1322 ( 938 ) + 1323 ( 939 ) + 1324 ( 940 ) + 1325 ( 941 ) + 1326 ( -897 ) + 1327 ( -936 ) + 1328 ( 942 ) + 1329 ( 943 ) + 1330 ( 944 ) + 1331 ( 945 ) + 1332 ( 946 ) + 1333 ( 947 ) + 1334 ( 948 ) + 1335 ( 949 ) + 1336 ( 950 ) + 1337 ( 951 ) + 1338 ( 952 ) + 1339 ( 953 ) + 1340 ( 954 ) + 1341 ( 955 ) + 1342 ( 956 ) + 1343 ( 957 ) + 1344 ( 958 ) + 1345 ( 959 ) + 1346 ( 960 ) + 1347 ( 961 ) + 1348 ( 962 ) + 1349 ( 963 ) + 1350 ( 964 ) + 1351 ( -947 ) + 1352 ( 965 ) + 1353 ( 966 ) + 1354 ( 967 ) + 1355 ( -968 ) + 1356 ( 969 ) + 1357 ( 970 ) + 1358 ( -967 ) + 1359 ( -896 ) + 1360 ( 971 ) + 1361 ( 972 ) + 1362 ( 973 ) + 1363 ( 974 ) + 1364 ( 975 ) + 1365 ( 904 ) + 1366 ( 976 ) + 1367 ( 977 ) + 1368 ( 978 ) + 1369 ( 979 ) + 1370 ( 980 ) + 1371 ( 981 ) + 1372 ( 982 ) + 1373 ( 983 ) + 1374 ( 984 ) + 1375 ( 985 ) + 1376 ( 986 ) + 1377 ( 987 ) + 1378 ( -976 ) + 1379 ( 988 ) + 1380 ( 989 ) + 1381 ( 990 ) + 1382 ( 991 ) + 1383 ( 992 ) + 1384 ( -977 ) + 1385 ( 993 ) + 1386 ( 994 ) + 1387 ( 995 ) + 1388 ( 996 ) + 1389 ( 997 ) + 1390 ( -978 ) + 1391 ( 998 ) + 1392 ( 999 ) + 1393 ( 1000 ) + 1394 ( 1001 ) + 1395 ( 1002 ) + 1396 ( 1003 ) + 1397 ( 968 ) + 1398 ( 1004 ) + 1399 ( 1005 ) + 1400 ( 1006 ) + 1401 ( 1007 ) + 1402 ( -948 ) + 1403 ( 1008 ) + 1404 ( -1007 ) + 1405 ( -953 ) + 1406 ( 1009 ) + 1407 ( 1010 ) + 1408 ( 1011 ) + 1409 ( 1012 ) + 1410 ( -1005 ) + 1411 ( -959 ) + 1412 ( 1013 ) + 1413 ( 1014 ) + 1414 ( 1015 ) + 1415 ( 1016 ) + 1416 ( 1017 ) + 1417 ( -899 ) + 1418 ( 1018 ) + 1419 ( -971 ) + 1420 ( 1019 ) + 1421 ( 1020 ) + 1422 ( 1021 ) + 1423 ( -970 ) + 1424 ( 1022 ) + 1425 ( -1017 ) + 1426 ( -963 ) + 1427 ( 1023 ) + 1428 ( 1024 ) + 1429 ( 1025 ) + 1430 ( 1026 ) + 1431 ( -975 ) + 1432 ( 1027 ) + 1433 ( 1028 ) + 1434 ( 1029 ) + 1435 ( 1030 ) + 1436 ( 1031 ) + 1437 ( 1032 ) + 1438 ( 1033 ) + 1439 ( 1034 ) + 1440 ( 1035 ) + 1441 ( 1036 ) + 1442 ( 1037 ) + 1443 ( 1038 ) + 1444 ( 1039 ) + 1445 ( 1040 ) + 1446 ( 1041 ) + 1447 ( 1042 ) + 1448 ( 1043 ) + 1449 ( 1044 ) + 1450 ( 1045 ) + 1451 ( 1046 ) + 1452 ( 1047 ) + 1453 ( 1048 ) + 1454 ( 1049 ) + 1455 ( 1050 ) + 1456 ( 1051 ) + 1457 ( 1052 ) + 1458 ( 1053 ) + 1459 ( 1054 ) + 1460 ( -1030 ) + 1461 ( -1045 ) + 1462 ( 1055 ) + 1463 ( 1056 ) + 1464 ( 1057 ) + 1465 ( 1058 ) + 1466 ( -1043 ) + 1467 ( 1059 ) + 1468 ( 1060 ) + 1469 ( 1061 ) + 1470 ( 1062 ) + 1471 ( 1063 ) + 1472 ( 1064 ) + 1473 ( -836 ) + 1474 ( 1065 ) + 1475 ( -1037 ) + 1476 ( 1066 ) + 1477 ( 1067 ) + 1478 ( 1068 ) + 1479 ( 1069 ) + 1480 ( 1070 ) + 1481 ( 1071 ) + 1482 ( 1072 ) + 1483 ( 1073 ) + 1484 ( -1061 ) + 1485 ( -1066 ) + 1486 ( 1074 ) + 1487 ( 1075 ) + 1488 ( 1076 ) + 1489 ( 1077 ) + 1490 ( 1078 ) + 1491 ( 1079 ) + 1492 ( 1080 ) + 1493 ( -1040 ) + 1494 ( 1081 ) + 1495 ( 1082 ) + 1496 ( -1080 ) + 1497 ( 1083 ) + 1498 ( 1084 ) + 1499 ( 1085 ) + 1500 ( 1086 ) + 1501 ( 1087 ) + 1502 ( 1088 ) + 1503 ( 1089 ) + 1504 ( 1090 ) + 1505 ( 1091 ) + 1506 ( 1092 ) + 1507 ( 1093 ) + 1508 ( 1094 ) + 1509 ( 1095 ) + 1510 ( 1096 ) + 1511 ( 1097 ) + 1512 ( 1098 ) + 1513 ( 1099 ) + 1514 ( 1100 ) + 1515 ( 1101 ) + 1516 ( -1099 ) + 1517 ( 1102 ) + 1518 ( 1103 ) + 1519 ( 1104 ) + 1520 ( -1088 ) + 1521 ( 1105 ) + 1522 ( 1106 ) + 1523 ( -1028 ) + 1524 ( 1107 ) + 1525 ( 1108 ) + 1526 ( -1096 ) + 1527 ( 1109 ) + 1528 ( 1110 ) + 1529 ( 1111 ) + 1530 ( 1112 ) + 1531 ( 1113 ) + 1532 ( -1097 ) + 1533 ( 1114 ) + 1534 ( 1115 ) + 1535 ( 1116 ) + 1536 ( 1117 ) + 1537 ( 1118 ) + 1538 ( -1113 ) + 1539 ( 1119 ) + 1540 ( 1120 ) + 1541 ( 1121 ) + 1542 ( 1122 ) + 1543 ( -1085 ) + 1544 ( 1123 ) + 1545 ( -1091 ) + 1546 ( 1124 ) + 1547 ( 1125 ) + 1548 ( 1126 ) + 1549 ( 1127 ) + 1550 ( 1128 ) + 1551 ( 1129 ) + 1552 ( 1130 ) + 1553 ( 1131 ) + 1554 ( 1132 ) + 1555 ( 1133 ) + 1556 ( 1134 ) + 1557 ( 1135 ) + 1558 ( 1136 ) + 1559 ( 1137 ) + 1560 ( 1138 ) + 1561 ( 1139 ) + 1562 ( 1140 ) + 1563 ( 1141 ) + 1564 ( 1142 ) + 1565 ( 1143 ) + 1566 ( -1136 ) + 1567 ( 1144 ) + 1568 ( 1145 ) + 1569 ( -1135 ) + 1570 ( 1146 ) + 1571 ( 1147 ) + 1572 ( 1148 ) + 1573 ( 1149 ) + 1574 ( 1150 ) + 1575 ( 1151 ) + 1576 ( 1152 ) + 1577 ( -1133 ) + 1578 ( 1153 ) + 1579 ( 1154 ) + 1580 ( 1155 ) + 1581 ( 1156 ) + 1582 ( 1157 ) + 1583 ( 1158 ) + 1584 ( 1159 ) + 1585 ( 1160 ) + 1586 ( 1161 ) + 1587 ( 1162 ) + 1588 ( 1163 ) + 1589 ( 1164 ) + 1590 ( 1165 ) + 1591 ( 1166 ) + 1592 ( 1167 ) + 1593 ( -1160 ) + 1594 ( 1168 ) + 1595 ( 1169 ) + 1596 ( -1093 ) + 1597 ( 1170 ) + 1598 ( 1171 ) + 1599 ( 1172 ) + 1600 ( 1173 ) + 1601 ( -1124 ) + 1602 ( 1174 ) + 1603 ( 1175 ) + 1604 ( -1176 ) + 1605 ( -1177 ) + 1606 ( 1178 ) + 1607 ( 1179 ) + 1608 ( 1180 ) + 1609 ( 1181 ) + 1610 ( -1158 ) + 1611 ( -1175 ) + 1612 ( 1182 ) + 1613 ( 1183 ) + 1614 ( -792 ) + 1615 ( 1184 ) + 1616 ( 1185 ) + 1617 ( 1186 ) + 1618 ( -1187 ) + 1619 ( 1177 ) + 1620 ( 1188 ) + 1621 ( 1189 ) + 1622 ( -1172 ) + 1623 ( 1190 ) + 1624 ( 1191 ) + 1625 ( 1176 ) + 1626 ( 1192 ) + 1627 ( 1193 ) + 1628 ( -1155 ) + 1629 ( 1194 ) + 1630 ( 1195 ) + 1631 ( 1196 ) + 1632 ( 1197 ) + 1633 ( 1198 ) + 1634 ( 1199 ) + 1635 ( -1154 ) + 1636 ( -1166 ) + 1637 ( 1200 ) + 1638 ( 1201 ) + 1639 ( -1202 ) + 1640 ( 1203 ) + 1641 ( 1204 ) + 1642 ( 1205 ) + 1643 ( 1206 ) + 1644 ( -1198 ) + 1645 ( 1207 ) + 1646 ( -1208 ) + 1647 ( -1209 ) + 1648 ( 1210 ) + 1649 ( 1211 ) + 1650 ( 1212 ) + 1651 ( -1213 ) + 1652 ( -1203 ) + 1653 ( 1214 ) + 1654 ( -1215 ) + 1655 ( 1216 ) + 1656 ( 1217 ) + 1657 ( 1218 ) + 1658 ( 1219 ) + 1659 ( 1220 ) + 1660 ( 1221 ) + 1661 ( 1222 ) + 1662 ( 1223 ) + 1663 ( -1224 ) + 1664 ( -1216 ) + 1665 ( 1225 ) + 1666 ( 1226 ) + 1667 ( 1227 ) + 1668 ( 1228 ) + 1669 ( 1229 ) + 1670 ( 1230 ) + 1671 ( 1231 ) + 1672 ( -1217 ) + 1673 ( 1232 ) + 1674 ( -1233 ) + 1675 ( 1234 ) + 1676 ( 1235 ) + 1677 ( 1236 ) + 1678 ( -1237 ) + 1679 ( -1228 ) + 1680 ( 1238 ) + 1681 ( 1239 ) + 1682 ( -1230 ) + 1683 ( 1240 ) + 1684 ( 1233 ) + 1685 ( 1241 ) + 1686 ( 1242 ) + 1687 ( 1243 ) + 1688 ( -1219 ) + 1689 ( 1244 ) + 1690 ( 1245 ) + 1691 ( 1246 ) + 1692 ( 1247 ) + 1693 ( 1248 ) + 1694 ( 1249 ) + 1695 ( 1250 ) + 1696 ( 1251 ) + 1697 ( 1252 ) + 1698 ( 1253 ) + 1699 ( 1254 ) + 1700 ( -1253 ) + 1701 ( 1255 ) + 1702 ( 1256 ) + 1703 ( 1257 ) + 1704 ( 1258 ) + 1705 ( 1259 ) + 1706 ( -1260 ) + 1707 ( 1261 ) + 1708 ( 1262 ) + 1709 ( 1263 ) + 1710 ( 1264 ) + 1711 ( -1265 ) + 1712 ( -1245 ) + 1713 ( -1256 ) + 1714 ( 1266 ) + 1715 ( 1267 ) + 1716 ( 1268 ) + 1717 ( -1218 ) + 1718 ( 1269 ) + 1719 ( -1249 ) + 1720 ( 1270 ) + 1721 ( 1271 ) + 1722 ( 1272 ) + 1723 ( 1273 ) + 1724 ( 1274 ) + 1725 ( -1252 ) + 1726 ( 1275 ) + 1727 ( 1276 ) + 1728 ( 1277 ) + 1729 ( 1278 ) + 1730 ( 1279 ) + 1731 ( 1215 ) + 1732 ( 1280 ) + 1733 ( 1281 ) + 1734 ( 1282 ) + 1735 ( 1283 ) + 1736 ( 1284 ) + 1737 ( 1285 ) + 1738 ( 1286 ) + 1739 ( 1287 ) + 1740 ( 1288 ) + 1741 ( 1289 ) + 1742 ( 1290 ) + 1743 ( 1291 ) + 1744 ( -802 ) + 1745 ( 1292 ) + 1746 ( 1293 ) + 1747 ( 1294 ) + 1748 ( 1295 ) + 1749 ( 1296 ) + 1750 ( -795 ) + 1751 ( 1297 ) + 1752 ( 1298 ) + 1753 ( 1299 ) + 1754 ( 1208 ) + 1755 ( 1300 ) + 1756 ( -1285 ) + 1757 ( 1301 ) + 1758 ( 1302 ) + 1759 ( 1303 ) + 1760 ( -1300 ) + 1761 ( 1304 ) + 1762 ( -801 ) + 1763 ( 1305 ) + 1764 ( 1306 ) + 1765 ( 1307 ) + 1766 ( -1284 ) + 1767 ( 1308 ) + 1768 ( 1309 ) + 1769 ( 1310 ) + 1770 ( 1311 ) + 1771 ( 1312 ) + 1772 ( -1313 ) + 1773 ( 1314 ) + 1774 ( 1315 ) + 1775 ( -794 ) + 1776 ( 1316 ) + 1777 ( 1317 ) + 1778 ( 1318 ) + 1779 ( 1319 ) + 1780 ( 1320 ) + 1781 ( 1321 ) + 1782 ( 1322 ) + 1783 ( 1323 ) + 1784 ( -1304 ) + 1785 ( 1324 ) + 1786 ( -1297 ) + 1787 ( 1325 ) + 1788 ( -800 ) + 1789 ( 1326 ) + 1790 ( 1327 ) + 1791 ( 1328 ) + 1792 ( -1323 ) + 1793 ( -1302 ) + 1794 ( 1329 ) + 1795 ( -834 ) + 1796 ( 1330 ) + 1797 ( 1331 ) + 1798 ( -816 ) + 1799 ( 1332 ) + 1800 ( 1333 ) + 1801 ( 1334 ) + 1802 ( -798 ) + 1803 ( 1335 ) + 1804 ( -1336 ) + 1805 ( -793 ) + 1806 ( 1337 ) + 1807 ( -1338 ) + 1808 ( -1339 ) + 1809 ( -1322 ) + 1810 ( -1334 ) + 1811 ( 1340 ) + 1812 ( -1341 ) + 1813 ( 1342 ) + 1814 ( -815 ) + 1815 ( -1343 ) + 1816 ( -1330 ) + 1817 ( -1321 ) + 1818 ( -1340 ) + 1819 ( -799 ) + 1820 ( -1282 ) + 1821 ( -1301 ) + 1822 ( 1344 ) + 1823 ( 1345 ) + 1824 ( 1346 ) + 1825 ( 1347 ) + 1826 ( 1348 ) + 1827 ( 1349 ) + 1828 ( -1283 ) + 1829 ( 1350 ) + 1830 ( -1320 ) + 1831 ( -1345 ) + 1832 ( 1351 ) + 1833 ( 1352 ) + 1834 ( 1353 ) + 1835 ( -1303 ) + 1836 ( -1354 ) + 1837 ( 1355 ) + 1838 ( -1356 ) + 1839 ( -1357 ) + 1840 ( -1316 ) + 1841 ( -1351 ) + 1842 ( -1346 ) + 1843 ( -1305 ) + 1844 ( -1291 ) + 1845 ( 1358 ) + 1846 ( 1359 ) + 1847 ( 1360 ) + 1848 ( 1361 ) + 1849 ( 1362 ) + 1850 ( 1363 ) + 1851 ( 1364 ) + 1852 ( 1365 ) + 1853 ( 1366 ) + 1854 ( 1367 ) + 1855 ( 1368 ) + 1856 ( 1369 ) + 1857 ( 1260 ) + 1858 ( 1313 ) + 1859 ( 1370 ) + 1860 ( 1371 ) + 1861 ( 1372 ) + 1862 ( 1373 ) + 1863 ( 1374 ) + 1864 ( 1375 ) + 1865 ( 1376 ) + 1866 ( 1377 ) + 1867 ( 1378 ) + 1868 ( 1379 ) + 1869 ( 1380 ) + 1870 ( 1381 ) + 1871 ( -1369 ) + 1872 ( 1265 ) + 1873 ( 1382 ) + 1874 ( 1383 ) + 1875 ( 1384 ) + 1876 ( 1385 ) + 1877 ( 1386 ) + 1878 ( 1387 ) + 1879 ( 1388 ) + 1880 ( 1389 ) + 1881 ( 1390 ) + 1882 ( 1391 ) + 1883 ( 1392 ) + 1884 ( 1393 ) + 1885 ( 1394 ) + 1886 ( -1372 ) + 1887 ( -1383 ) + 1888 ( 1395 ) + 1889 ( 1396 ) + 1890 ( -1371 ) + 1891 ( 1397 ) + 1892 ( 1398 ) + 1893 ( -1392 ) + 1894 ( -1396 ) + 1895 ( -1382 ) + 1896 ( -1370 ) + 1897 ( 1399 ) + 1898 ( 1400 ) + 1899 ( 1401 ) + 1900 ( -1391 ) + 1901 ( -1402 ) + 1902 ( 1403 ) + 1903 ( 1404 ) + 1904 ( -1405 ) + 1905 ( 1406 ) + 1906 ( -1407 ) + 1907 ( 1408 ) + 1908 ( -1395 ) + 1909 ( 1409 ) + 1910 ( -1375 ) + 1911 ( -1368 ) + 1912 ( -1389 ) + 1913 ( 1410 ) + 1914 ( 1411 ) + 1915 ( 1412 ) + 1916 ( -1401 ) + 1917 ( -1410 ) + 1918 ( 1413 ) + 1919 ( -1373 ) + 1920 ( -1409 ) + 1921 ( 1414 ) + 1922 ( -1185 ) + 1923 ( 1415 ) + 1924 ( 1416 ) + 1925 ( -1417 ) + 1926 ( 1418 ) + 1927 ( -1419 ) + 1928 ( -1420 ) + 1929 ( -1295 ) + 1930 ( -1288 ) + 1931 ( 1421 ) + 1932 ( -806 ) + 1933 ( 1422 ) + 1934 ( 1423 ) + 1935 ( 1424 ) + 1936 ( 1425 ) + 1937 ( -1416 ) + 1938 ( 1426 ) + 1939 ( -1427 ) + 1940 ( 1428 ) + 1941 ( -1429 ) + 1942 ( -1423 ) + 1943 ( -1430 ) + 1944 ( -1415 ) + 1945 ( -1298 ) + 1946 ( 1431 ) + 1947 ( -1280 ) + 1948 ( 1432 ) + 1949 ( 1433 ) + 1950 ( 1434 ) + 1951 ( 1435 ) + 1952 ( 1436 ) + 1953 ( 1437 ) + 1954 ( 1438 ) + 1955 ( 1439 ) + 1956 ( 1440 ) + 1957 ( 1441 ) + 1958 ( 1442 ) + 1959 ( 1443 ) + 1960 ( 1444 ) + 1961 ( 1445 ) + 1962 ( 1446 ) + 1963 ( -1438 ) + 1964 ( 1447 ) + 1965 ( 1448 ) + 1966 ( 1449 ) + 1967 ( -1433 ) + 1968 ( 1450 ) + 1969 ( -1451 ) + 1970 ( 1452 ) + 1971 ( 1453 ) + 1972 ( 1454 ) + 1973 ( 1455 ) + 1974 ( 1456 ) + 1975 ( 1457 ) + 1976 ( -1458 ) + 1977 ( 1459 ) + 1978 ( 1460 ) + 1979 ( 1461 ) + 1980 ( -1432 ) + 1981 ( -1452 ) + 1982 ( 1462 ) + 1983 ( 1463 ) + 1984 ( 1464 ) + 1985 ( 1465 ) + 1986 ( -1114 ) + 1987 ( 1466 ) + 1988 ( 1467 ) + 1989 ( -1442 ) + 1990 ( -1463 ) + 1991 ( 1468 ) + 1992 ( 1469 ) + 1993 ( 1470 ) + 1994 ( 1471 ) + 1995 ( 1472 ) + 1996 ( 1473 ) + 1997 ( 1474 ) + 1998 ( 1475 ) + 1999 ( 1476 ) + 2000 ( 1477 ) + 2001 ( 1478 ) + 2002 ( 1479 ) + 2003 ( 1480 ) + 2004 ( 1481 ) + 2005 ( 1482 ) + 2006 ( 1483 ) + 2007 ( 1484 ) + 2008 ( 1485 ) + 2009 ( 1486 ) + 2010 ( -1475 ) + 2011 ( 1487 ) + 2012 ( -1374 ) + 2013 ( 1488 ) + 2014 ( 1489 ) + 2015 ( 1490 ) + 2016 ( 1491 ) + 2017 ( 1492 ) + 2018 ( -1484 ) + 2019 ( 1493 ) + 2020 ( 1494 ) + 2021 ( -1483 ) + 2022 ( -1359 ) + 2023 ( 1495 ) + 2024 ( 1496 ) + 2025 ( -1490 ) + 2026 ( 1497 ) + 2027 ( 1498 ) + 2028 ( 1499 ) + 2029 ( -1479 ) + 2030 ( 1500 ) + 2031 ( 1501 ) + 2032 ( 1502 ) + 2033 ( 1503 ) + 2034 ( 1504 ) + 2035 ( 1505 ) + 2036 ( 1506 ) + 2037 ( 1507 ) + 2038 ( 1508 ) + 2039 ( -1446 ) + 2040 ( 1509 ) + 2041 ( 1510 ) + 2042 ( 1451 ) + 2043 ( 1458 ) + 2044 ( 1511 ) + 2045 ( -1472 ) + 2046 ( 1512 ) + 2047 ( -1498 ) + 2048 ( 1513 ) + 2049 ( 1514 ) + 2050 ( 1515 ) + 2051 ( -1511 ) + 2052 ( -1455 ) + 2053 ( -1474 ) + 2054 ( 1516 ) + 2055 ( 1517 ) + 2056 ( 1518 ) + 2057 ( -1079 ) + 2058 ( 1519 ) + 2059 ( 1520 ) + 2060 ( 1521 ) + 2061 ( 1522 ) + 2062 ( 1523 ) + 2063 ( -1519 ) + 2064 ( 1524 ) + 2065 ( 1525 ) + 2066 ( -1505 ) + 2067 ( 1526 ) + 2068 ( 1527 ) + 2069 ( -832 ) + 2070 ( 1341 ) + 2071 ( -1332 ) + 2072 ( 1528 ) + 2073 ( 1529 ) + 2074 ( -822 ) + 2075 ( 1530 ) + 2076 ( 1343 ) + 2077 ( 1531 ) + 2078 ( -821 ) + 2079 ( 1532 ) + 2080 ( -1281 ) + 2081 ( -1528 ) + 2082 ( 1533 ) + 2083 ( 1534 ) + 2084 ( 1535 ) + 2085 ( 1536 ) + 2086 ( 1537 ) + 2087 ( 1538 ) + 2088 ( 1539 ) + 2089 ( 1540 ) + 2090 ( 1541 ) + 2091 ( 1542 ) + 2092 ( 1543 ) + 2093 ( 1544 ) + 2094 ( 1545 ) + 2095 ( 1546 ) + 2096 ( 1547 ) + 2097 ( 1548 ) + 2098 ( 1549 ) + 2099 ( 1550 ) + 2100 ( 1551 ) + 2101 ( 1552 ) + 2102 ( 1553 ) + 2103 ( 1554 ) + 2104 ( 1555 ) + 2105 ( 1556 ) + 2106 ( 1557 ) + 2107 ( 1558 ) + 2108 ( 1559 ) + 2109 ( 1560 ) + 2110 ( 1561 ) + 2111 ( 1562 ) + 2112 ( 1563 ) + 2113 ( 1564 ) + 2114 ( 1565 ) + 2115 ( 1566 ) + 2116 ( 1567 ) + 2117 ( 1568 ) + 2118 ( 250 ) + 2119 ( 1569 ) + 2120 ( 1570 ) + 2121 ( 1571 ) + 2122 ( 1572 ) + 2123 ( 1573 ) + 2124 ( 1574 ) + 2125 ( 1575 ) + 2126 ( 1576 ) + 2127 ( 1577 ) + 2128 ( 1578 ) + 2129 ( 1579 ) + 2130 ( 1580 ) + 2131 ( 1581 ) + 2132 ( -1493 ) + 2133 ( 1582 ) + 2134 ( -1575 ) + 2135 ( -1499 ) + 2136 ( -1583 ) + 2137 ( 1584 ) + 2138 ( 1585 ) + 2139 ( 1586 ) + 2140 ( 1587 ) + 2141 ( -1473 ) + 2142 ( -1486 ) + 2143 ( -1496 ) + 2144 ( -1582 ) + 2145 ( -1574 ) + 2146 ( 1588 ) + 2147 ( 1589 ) + 2148 ( 1590 ) + 2149 ( -1485 ) + 2150 ( 1591 ) + 2151 ( 1592 ) + 2152 ( -1358 ) + 2153 ( 1593 ) + 2154 ( 1594 ) + 2155 ( -1595 ) + 2156 ( -1596 ) + 2157 ( 1402 ) + 2158 ( -1591 ) + 2159 ( 1597 ) + 2160 ( 1598 ) + 2161 ( 1599 ) + 2162 ( -1579 ) + 2163 ( -1600 ) + 2164 ( 1601 ) + 2165 ( -1602 ) + 2166 ( 1603 ) + 2167 ( 1604 ) + 2168 ( 1605 ) + 2169 ( -1549 ) + 2170 ( 1606 ) + 2171 ( 1607 ) + 2172 ( 1608 ) + 2173 ( 1609 ) + 2174 ( 1610 ) + 2175 ( 1611 ) + 2176 ( 1612 ) + 2177 ( -1548 ) + 2178 ( 1602 ) + 2179 ( 1613 ) + 2180 ( 1614 ) + 2181 ( 1615 ) + 2182 ( 1616 ) + 2183 ( -1547 ) + 2184 ( 1617 ) + 2185 ( 1618 ) + 2186 ( 1619 ) + 2187 ( 1620 ) + 2188 ( 1621 ) + 2189 ( -1614 ) + 2190 ( 1622 ) + 2191 ( -1621 ) + 2192 ( 1623 ) + 2193 ( 1624 ) + 2194 ( 1625 ) + 2195 ( -1573 ) + 2196 ( -1613 ) + 2197 ( -1619 ) + 2198 ( 1626 ) + 2199 ( 1627 ) + 2200 ( -1571 ) + 2201 ( 1628 ) + 2202 ( 1629 ) + 2203 ( -1616 ) + 2204 ( -1629 ) + 2205 ( 1630 ) + 2206 ( -1572 ) + 2207 ( 1631 ) + 2208 ( 1632 ) + 2209 ( -1622 ) + 2210 ( 1596 ) + 2211 ( 1407 ) + 2212 ( -1632 ) + 2213 ( -1623 ) + 2214 ( -1577 ) + 2215 ( 1633 ) + 2216 ( 1634 ) + 2217 ( 1635 ) + 2218 ( 1636 ) + 2219 ( 1637 ) + 2220 ( 1595 ) + 2221 ( 249 ) + 2222 ( -1628 ) + 2223 ( -1630 ) + 2224 ( -1633 ) + 2225 ( -1578 ) + 2226 ( 1638 ) + 2227 ( 1639 ) + 2228 ( -1603 ) + 2229 ( 1640 ) + 2230 ( 1641 ) + 2231 ( 1642 ) + 2232 ( 1643 ) + 2233 ( 1644 ) + 2234 ( -1551 ) + 2235 ( 1645 ) + 2236 ( -1599 ) + 2237 ( 1646 ) + 2238 ( 1647 ) + 2239 ( 1648 ) + 2240 ( 1649 ) + 2241 ( 1650 ) + 2242 ( 1651 ) + 2243 ( -1552 ) + 2244 ( -1589 ) + 2245 ( -1586 ) + 2246 ( 1652 ) + 2247 ( -1651 ) + 2248 ( 1653 ) + 2249 ( 1654 ) + 2250 ( -1655 ) + 2251 ( 1656 ) + 2252 ( 1657 ) + 2253 ( 1658 ) + 2254 ( 1659 ) + 2255 ( -1601 ) + 2256 ( -1555 ) + 2257 ( 1660 ) + 2258 ( 1661 ) + 2259 ( 1662 ) + 2260 ( 1663 ) + 2261 ( -1656 ) + 2262 ( 1664 ) + 2263 ( 1665 ) + 2264 ( -1590 ) + 2265 ( -1587 ) + 2266 ( 1666 ) + 2267 ( -1598 ) + 2268 ( -1489 ) + 2269 ( -1482 ) + 2270 ( 1667 ) + 2271 ( 1668 ) + 2272 ( 1669 ) + 2273 ( -1652 ) + 2274 ( -1649 ) + 2275 ( -1377 ) + 2276 ( -1500 ) + 2277 ( 1670 ) + 2278 ( 1671 ) + 2279 ( 1672 ) + 2280 ( 1673 ) + 2281 ( -1668 ) + 2282 ( -1376 ) + 2283 ( -1648 ) + 2284 ( 1674 ) + 2285 ( 1675 ) + 2286 ( 1676 ) + 2287 ( 1677 ) + 2288 ( 1678 ) + 2289 ( 1679 ) + 2290 ( 1680 ) + 2291 ( 1681 ) + 2292 ( 1682 ) + 2293 ( 1683 ) + 2294 ( 1684 ) + 2295 ( 245 ) + 2296 ( -1593 ) + 2297 ( 1405 ) + 2298 ( -1397 ) + 2299 ( -1394 ) + 2300 ( -1639 ) + 2301 ( 1685 ) + 2302 ( -1684 ) + 2303 ( -265 ) + 2304 ( 257 ) + 2305 ( 1686 ) + 2306 ( 1687 ) + 2307 ( 1688 ) + 2308 ( -1683 ) + 2309 ( -268 ) + 2310 ( 256 ) + 2311 ( -1688 ) + 2312 ( 1689 ) + 2313 ( 1690 ) + 2314 ( 1691 ) + 2315 ( 1692 ) + 2316 ( 1693 ) + 2317 ( 1694 ) + 2318 ( 1695 ) + 2319 ( 1696 ) + 2320 ( 1697 ) + 2321 ( 1698 ) + 2322 ( 1699 ) + 2323 ( 1700 ) + 2324 ( 1701 ) + 2325 ( -116 ) + 2326 ( 1702 ) + 2327 ( 1703 ) + 2328 ( 1704 ) + 2329 ( 1705 ) + 2330 ( 1706 ) + 2331 ( -1697 ) + 2332 ( -1692 ) + 2333 ( 1707 ) + 2334 ( 1708 ) + 2335 ( -1705 ) + 2336 ( -1699 ) + 2337 ( 1709 ) + 2338 ( 1710 ) + 2339 ( -1693 ) + 2340 ( -127 ) + 2341 ( 1711 ) + 2342 ( 1712 ) + 2343 ( 1713 ) + 2344 ( 1714 ) + 2345 ( 1715 ) + 2346 ( 1716 ) + 2347 ( 1717 ) + 2348 ( 1718 ) + 2349 ( -1707 ) + 2350 ( -1560 ) + 2351 ( 1719 ) + 2352 ( 1720 ) + 2353 ( 1721 ) + 2354 ( -1695 ) + 2355 ( 1722 ) + 2356 ( 1723 ) + 2357 ( 1724 ) + 2358 ( 1725 ) + 2359 ( 1726 ) + 2360 ( 1727 ) + 2361 ( -1559 ) + 2362 ( 159 ) + 2363 ( 1728 ) + 2364 ( 1729 ) + 2365 ( 1730 ) + 2366 ( 1731 ) + 2367 ( 1732 ) + 2368 ( 1733 ) + 2369 ( 1734 ) + 2370 ( -1710 ) + 2371 ( 1735 ) + 2372 ( 1736 ) + 2373 ( 1737 ) + 2374 ( 1738 ) + 2375 ( 1739 ) + 2376 ( 1740 ) + 2377 ( 1741 ) + 2378 ( 1742 ) + 2379 ( 1743 ) + 2380 ( -1694 ) + 2381 ( -1723 ) + 2382 ( 1744 ) + 2383 ( -138 ) + 2384 ( 1745 ) + 2385 ( 233 ) + 2386 ( -162 ) + 2387 ( 1746 ) + 2388 ( -171 ) + 2389 ( -1742 ) + 2390 ( 1747 ) + 2391 ( 1748 ) + 2392 ( 1749 ) + 2393 ( 1750 ) + 2394 ( -1751 ) + 2395 ( 1752 ) + 2396 ( -1718 ) + 2397 ( 1753 ) + 2398 ( 1754 ) + 2399 ( -163 ) + 2400 ( -1741 ) + 2401 ( -1746 ) + 2402 ( 1755 ) + 2403 ( 1756 ) + 2404 ( -1717 ) + 2405 ( 1757 ) + 2406 ( 1758 ) + 2407 ( 1759 ) + 2408 ( 1760 ) + 2409 ( -1731 ) + 2410 ( 1761 ) + 2411 ( 1762 ) + 2412 ( -1716 ) + 2413 ( -1763 ) + 2414 ( -1764 ) + 2415 ( -1752 ) + 2416 ( -1756 ) + 2417 ( 1765 ) + 2418 ( -1730 ) + 2419 ( 1766 ) + 2420 ( -1767 ) + 2421 ( -1715 ) + 2422 ( 1768 ) + 2423 ( -1769 ) + 2424 ( -1755 ) + 2425 ( 1770 ) + 2426 ( -1734 ) + 2427 ( 1771 ) + 2428 ( 1772 ) + 2429 ( -1714 ) + 2430 ( -1546 ) + 2431 ( 1773 ) + 2432 ( -1774 ) + 2433 ( -1766 ) + 2434 ( 1775 ) + 2435 ( -1743 ) + 2436 ( 1776 ) + 2437 ( 1777 ) + 2438 ( -1713 ) + 2439 ( -158 ) + 2440 ( 1751 ) + 2441 ( 1778 ) + 2442 ( 1779 ) + 2443 ( 1780 ) + 2444 ( -1781 ) + 2445 ( 1782 ) + 2446 ( -1783 ) + 2447 ( -1784 ) + 2448 ( 1774 ) + 2449 ( 1767 ) + 2450 ( 1763 ) + 2451 ( -1753 ) + 2452 ( 1785 ) + 2453 ( -1721 ) + 2454 ( 1769 ) + 2455 ( 1764 ) + 2456 ( -1758 ) + 2457 ( 1786 ) + 2458 ( -1719 ) + 2459 ( -1785 ) + 2460 ( -1691 ) + 2461 ( 1787 ) + 2462 ( 1788 ) + 2463 ( -157 ) + 2464 ( -1776 ) + 2465 ( 1789 ) + 2466 ( 1790 ) + 2467 ( 1791 ) + 2468 ( 1792 ) + 2469 ( 1793 ) + 2470 ( 1794 ) + 2471 ( 1795 ) + 2472 ( 1796 ) + 2473 ( 1797 ) + 2474 ( 1798 ) + 2475 ( 1799 ) + 2476 ( 1800 ) + 2477 ( 1801 ) + 2478 ( 1802 ) + 2479 ( 1803 ) + 2480 ( -1739 ) + 2481 ( -136 ) + 2482 ( 1804 ) + 2483 ( 1805 ) + 2484 ( 1806 ) + 2485 ( 1807 ) + 2486 ( 1808 ) + 2487 ( 1809 ) + 2488 ( -1803 ) + 2489 ( 1810 ) + 2490 ( 1811 ) + 2491 ( 1812 ) + 2492 ( 1813 ) + 2493 ( 1814 ) + 2494 ( 1815 ) + 2495 ( -1738 ) + 2496 ( 1816 ) + 2497 ( 1817 ) + 2498 ( 1818 ) + 2499 ( 1819 ) + 2500 ( 1820 ) + 2501 ( 1821 ) + 2502 ( -1737 ) + 2503 ( -1802 ) + 2504 ( 1822 ) + 2505 ( 1823 ) + 2506 ( 1824 ) + 2507 ( 1825 ) + 2508 ( 1826 ) + 2509 ( 1827 ) + 2510 ( 1828 ) + 2511 ( 1829 ) + 2512 ( 1830 ) + 2513 ( 1831 ) + 2514 ( -1819 ) + 2515 ( -1825 ) + 2516 ( -1799 ) + 2517 ( 1832 ) + 2518 ( 1833 ) + 2519 ( -1806 ) + 2520 ( 1834 ) + 2521 ( -1798 ) + 2522 ( -1824 ) + 2523 ( -1830 ) + 2524 ( 1835 ) + 2525 ( 1836 ) + 2526 ( -1791 ) + 2527 ( 1837 ) + 2528 ( 1838 ) + 2529 ( -1823 ) + 2530 ( -1833 ) + 2531 ( 1839 ) + 2532 ( 1840 ) + 2533 ( 1841 ) + 2534 ( 1842 ) + 2535 ( -1840 ) + 2536 ( -1826 ) + 2537 ( -1812 ) + 2538 ( 1843 ) + 2539 ( 1844 ) + 2540 ( 1845 ) + 2541 ( -1811 ) + 2542 ( -1727 ) + 2543 ( 1846 ) + 2544 ( -1818 ) + 2545 ( -1842 ) + 2546 ( -1829 ) + 2547 ( 1847 ) + 2548 ( -1839 ) + 2549 ( -1562 ) + 2550 ( -1843 ) + 2551 ( 1848 ) + 2552 ( 1849 ) + 2553 ( 1850 ) + 2554 ( -1815 ) + 2555 ( -1795 ) + 2556 ( -1740 ) + 2557 ( 1851 ) + 2558 ( 1852 ) + 2559 ( 1853 ) + 2560 ( 1854 ) + 2561 ( 1855 ) + 2562 ( 1856 ) + 2563 ( -1837 ) + 2564 ( -1835 ) + 2565 ( -1561 ) + 2566 ( 1857 ) + 2567 ( 1858 ) + 2568 ( 1859 ) + 2569 ( 1860 ) + 2570 ( -1809 ) + 2571 ( -1804 ) + 2572 ( -1794 ) + 2573 ( -1851 ) + 2574 ( -137 ) + 2575 ( 1861 ) + 2576 ( -1797 ) + 2577 ( -1750 ) + 2578 ( -1745 ) + 2579 ( -1726 ) + 2580 ( -170 ) + 2581 ( -133 ) + 2582 ( 1862 ) + 2583 ( 1863 ) + 2584 ( 1864 ) + 2585 ( 231 ) + 2586 ( 252 ) + 2587 ( 1865 ) + 2588 ( 1866 ) + 2589 ( 1867 ) + 2590 ( 1868 ) + 2591 ( 1869 ) + 2592 ( 1870 ) + 2593 ( -1860 ) + 2594 ( 1871 ) + 2595 ( 1872 ) + 2596 ( 1873 ) + 2597 ( -1856 ) + 2598 ( 1874 ) + 2599 ( 1875 ) + 2600 ( 1876 ) + 2601 ( 1877 ) + 2602 ( 1878 ) + 2603 ( 1879 ) + 2604 ( -1878 ) + 2605 ( 1880 ) + 2606 ( 1881 ) + 2607 ( -1858 ) + 2608 ( -1865 ) + 2609 ( 1882 ) + 2610 ( 1883 ) + 2611 ( 1884 ) + 2612 ( -1855 ) + 2613 ( 1885 ) + 2614 ( -1886 ) + 2615 ( -1872 ) + 2616 ( -1882 ) + 2617 ( -1866 ) + 2618 ( 1887 ) + 2619 ( 1888 ) + 2620 ( 1889 ) + 2621 ( -1854 ) + 2622 ( 1890 ) + 2623 ( 244 ) + 2624 ( -1883 ) + 2625 ( -1870 ) + 2626 ( 1891 ) + 2627 ( 1892 ) + 2628 ( 1893 ) + 2629 ( -1790 ) + 2630 ( -1894 ) + 2631 ( 1886 ) + 2632 ( -1876 ) + 2633 ( -1857 ) + 2634 ( 1895 ) + 2635 ( 1896 ) + 2636 ( 1897 ) + 2637 ( -1889 ) + 2638 ( -1885 ) + 2639 ( -1563 ) + 2640 ( 248 ) + 2641 ( -1895 ) + 2642 ( 1898 ) + 2643 ( 1899 ) + 2644 ( 1900 ) + 2645 ( 1901 ) + 2646 ( 1902 ) + 2647 ( 1903 ) + 2648 ( -1859 ) + 2649 ( 1904 ) + 2650 ( -1771 ) + 2651 ( 1905 ) + 2652 ( -1849 ) + 2653 ( -1735 ) + 2654 ( 1906 ) + 2655 ( 1907 ) + 2656 ( 1908 ) + 2657 ( 1909 ) + 2658 ( 1910 ) + 2659 ( -1905 ) + 2660 ( -1902 ) + 2661 ( -1848 ) + 2662 ( 1911 ) + 2663 ( 1912 ) + 2664 ( -1564 ) + 2665 ( 1913 ) + 2666 ( -1912 ) + 2667 ( -1908 ) + 2668 ( 1914 ) + 2669 ( -1736 ) + 2670 ( -1775 ) + 2671 ( -1850 ) + 2672 ( -1903 ) + 2673 ( 1915 ) + 2674 ( -1817 ) + 2675 ( -1749 ) + 2676 ( -1725 ) + 2677 ( 1916 ) + 2678 ( 1917 ) + 2679 ( -1862 ) + 2680 ( 1918 ) + 2681 ( -1801 ) + 2682 ( -1863 ) + 2683 ( 1919 ) + 2684 ( -1880 ) + 2685 ( -1918 ) + 2686 ( -1800 ) + 2687 ( 1920 ) + 2688 ( 1921 ) + 2689 ( -1761 ) + 2690 ( 1922 ) + 2691 ( 1923 ) + 2692 ( 1924 ) + 2693 ( -1733 ) + 2694 ( -1814 ) + 2695 ( -1922 ) + 2696 ( 1925 ) + 2697 ( 1926 ) + 2698 ( -1732 ) + 2699 ( -1813 ) + 2700 ( -1904 ) + 2701 ( -1770 ) + 2702 ( 1927 ) + 2703 ( -1821 ) + 2704 ( -1729 ) + 2705 ( 1928 ) + 2706 ( 1929 ) + 2707 ( -1759 ) + 2708 ( -1917 ) + 2709 ( -1927 ) + 2710 ( -1820 ) + 2711 ( -1728 ) + 2712 ( 1930 ) + 2713 ( 1931 ) + 2714 ( -1765 ) + 2715 ( -1873 ) + 2716 ( 1932 ) + 2717 ( 1933 ) + 2718 ( 1934 ) + 2719 ( -1808 ) + 2720 ( -1932 ) + 2721 ( 1935 ) + 2722 ( 1936 ) + 2723 ( -1807 ) + 2724 ( -1919 ) + 2725 ( -1879 ) + 2726 ( 1894 ) + 2727 ( -1877 ) + 2728 ( -1792 ) + 2729 ( 1937 ) + 2730 ( 1938 ) + 2731 ( -1891 ) + 2732 ( 1939 ) + 2733 ( 1940 ) + 2734 ( -1793 ) + 2735 ( -1901 ) + 2736 ( -1910 ) + 2737 ( 1941 ) + 2738 ( -1864 ) + 2739 ( -1754 ) + 2740 ( 236 ) + 2741 ( 1942 ) + 2742 ( 1943 ) + 2743 ( 1944 ) + 2744 ( 1945 ) + 2745 ( 1946 ) + 2746 ( -1947 ) + 2747 ( 254 ) + 2748 ( 237 ) + 2749 ( 1948 ) + 2750 ( -1949 ) + 2751 ( -1868 ) + 2752 ( -1943 ) + 2753 ( 255 ) + 2754 ( -1948 ) + 2755 ( 1950 ) + 2756 ( -1951 ) + 2757 ( 1952 ) + 2758 ( -1867 ) + 2759 ( -1942 ) + 2760 ( 1953 ) + 2761 ( 1954 ) + 2762 ( -1955 ) + 2763 ( 1956 ) + 2764 ( -1748 ) + 2765 ( 1781 ) + 2766 ( -1915 ) + 2767 ( -1945 ) + 2768 ( 1957 ) + 2769 ( -1958 ) + 2770 ( -1959 ) + 2771 ( 1960 ) + 2772 ( 243 ) + 2773 ( -1888 ) + 2774 ( -1950 ) + 2775 ( -1620 ) + 2776 ( 1961 ) + 2777 ( 1962 ) + 2778 ( -1909 ) + 2779 ( -1913 ) + 2780 ( -1899 ) + 2781 ( -1570 ) + 2782 ( 1963 ) + 2783 ( 1964 ) + 2784 ( 1965 ) + 2785 ( -1966 ) + 2786 ( -1967 ) + 2787 ( 1968 ) + 2788 ( -1897 ) + 2789 ( -1969 ) + 2790 ( 242 ) + 2791 ( 1958 ) + 2792 ( -1962 ) + 2793 ( -1569 ) + 2794 ( -1626 ) + 2795 ( 1969 ) + 2796 ( -1939 ) + 2797 ( -1898 ) + 2798 ( 1970 ) + 2799 ( -1971 ) + 2800 ( 1972 ) + 2801 ( -1961 ) + 2802 ( 1973 ) + 2803 ( 1783 ) + 2804 ( -1773 ) + 2805 ( -1617 ) + 2806 ( -1964 ) + 2807 ( -1615 ) + 2808 ( -1914 ) + 2809 ( -1580 ) + 2810 ( 1974 ) + 2811 ( -1975 ) + 2812 ( 1976 ) + 2813 ( 1977 ) + 2814 ( -223 ) + 2815 ( 1978 ) + 2816 ( 1979 ) + 2817 ( 1980 ) + 2818 ( -203 ) + 2819 ( 1981 ) + 2820 ( 1982 ) + 2821 ( -1977 ) + 2822 ( 1983 ) + 2823 ( 1984 ) + 2824 ( 1985 ) + 2825 ( 1986 ) + 2826 ( 1987 ) + 2827 ( 1988 ) + 2828 ( -1706 ) + 2829 ( -1987 ) + 2830 ( -1981 ) + 2831 ( -1698 ) + 2832 ( -1720 ) + 2833 ( -204 ) + 2834 ( 1989 ) + 2835 ( 1990 ) + 2836 ( -228 ) + 2837 ( 1991 ) + 2838 ( 1992 ) + 2839 ( -1973 ) + 2840 ( -1953 ) + 2841 ( -1993 ) + 2842 ( 1994 ) + 2843 ( 1995 ) + 2844 ( 1996 ) + 2845 ( 1997 ) + 2846 ( -1545 ) + 2847 ( -1712 ) + 2848 ( -1780 ) + 2849 ( -1609 ) + 2850 ( -1941 ) + 2851 ( 1600 ) + 2852 ( 1655 ) + 2853 ( -1747 ) + 2854 ( -1772 ) + 2855 ( -1983 ) + 2856 ( -1990 ) + 2857 ( 1998 ) + 2858 ( -1995 ) + 2859 ( 1999 ) + 2860 ( 2000 ) + 2861 ( 2001 ) + 2862 ( 2002 ) + 2863 ( 2003 ) + 2864 ( 2004 ) + 2865 ( -2005 ) + 2866 ( -1996 ) + 2867 ( 2006 ) + 2868 ( 2007 ) + 2869 ( 2008 ) + 2870 ( 2009 ) + 2871 ( -2003 ) + 2872 ( 2010 ) + 2873 ( 2011 ) + 2874 ( 2012 ) + 2875 ( 2013 ) + 2876 ( -2009 ) + 2877 ( 2014 ) + 2878 ( 2015 ) + 2879 ( 2016 ) + 2880 ( 2017 ) + 2881 ( 2018 ) + 2882 ( 2019 ) + 2883 ( -2000 ) + 2884 ( 2020 ) + 2885 ( 2021 ) + 2886 ( 2022 ) + 2887 ( 2023 ) + 2888 ( 2024 ) + 2889 ( 2025 ) + 2890 ( 2026 ) + 2891 ( 2027 ) + 2892 ( 2028 ) + 2893 ( 2029 ) + 2894 ( -132 ) + 2895 ( -1724 ) + 2896 ( -1711 ) + 2897 ( -1690 ) + 2898 ( -1853 ) + 2899 ( -1847 ) + 2900 ( -1789 ) + 2901 ( -1796 ) + 2902 ( -1805 ) + 2903 ( -1810 ) + 2904 ( -1816 ) + 2905 ( -1991 ) + 2906 ( 2030 ) + 2907 ( 2031 ) + 2908 ( -113 ) + 2909 ( -124 ) + 2910 ( -1708 ) + 2911 ( -1988 ) + 2912 ( -1702 ) + 2913 ( -1696 ) + 2914 ( -1845 ) + 2915 ( -1841 ) + 2916 ( -1836 ) + 2917 ( -1832 ) + 2918 ( -1828 ) + 2919 ( -1822 ) + 2920 ( -1976 ) + 2921 ( -1982 ) + 2922 ( -218 ) + 2923 ( -1544 ) + 2924 ( -215 ) + 2925 ( 2032 ) + 2926 ( 2033 ) + 2927 ( 2034 ) + 2928 ( 2035 ) + 2929 ( 2036 ) + 2930 ( 2037 ) + 2931 ( 2038 ) + 2932 ( 2039 ) + 2933 ( 2040 ) + 2934 ( 2041 ) + 2935 ( 2042 ) + 2936 ( 2043 ) + 2937 ( 2044 ) + 2938 ( 2045 ) + 2939 ( -275 ) + 2940 ( 2046 ) + 2941 ( 2047 ) + 2942 ( 2048 ) + 2943 ( 2049 ) + 2944 ( -2045 ) + 2945 ( 2050 ) + 2946 ( -300 ) + 2947 ( -2037 ) + 2948 ( 2051 ) + 2949 ( 2052 ) + 2950 ( -308 ) + 2951 ( 2053 ) + 2952 ( 2054 ) + 2953 ( -2055 ) + 2954 ( 2056 ) + 2955 ( 2057 ) + 2956 ( 2058 ) + 2957 ( 2059 ) + 2958 ( 2060 ) + 2959 ( -2043 ) + 2960 ( 2061 ) + 2961 ( -1047 ) + 2962 ( 2062 ) + 2963 ( 2063 ) + 2964 ( 2064 ) + 2965 ( -2060 ) + 2966 ( 2065 ) + 2967 ( 2066 ) + 2968 ( 2067 ) + 2969 ( 2068 ) + 2970 ( 2069 ) + 2971 ( 2070 ) + 2972 ( 2071 ) + 2973 ( 2072 ) + 2974 ( 2073 ) + 2975 ( 2074 ) + 2976 ( 2075 ) + 2977 ( 2076 ) + 2978 ( 2077 ) + 2979 ( 2078 ) + 2980 ( 2079 ) + 2981 ( 2080 ) + 2982 ( 2081 ) + 2983 ( 2082 ) + 2984 ( 2083 ) + 2985 ( -2040 ) + 2986 ( -2058 ) + 2987 ( -2052 ) + 2988 ( 2084 ) + 2989 ( 2085 ) + 2990 ( 2086 ) + 2991 ( -301 ) + 2992 ( -2066 ) + 2993 ( 2087 ) + 2994 ( -2071 ) + 2995 ( 2088 ) + 2996 ( 2089 ) + 2997 ( 2090 ) + 2998 ( 2091 ) + 2999 ( 2092 ) + 3000 ( -2072 ) + 3001 ( 2093 ) + 3002 ( 2094 ) + 3003 ( 2095 ) + 3004 ( 2096 ) + 3005 ( 2097 ) + 3006 ( -2074 ) + 3007 ( 2098 ) + 3008 ( 2099 ) + 3009 ( 2100 ) + 3010 ( 2101 ) + 3011 ( 2102 ) + 3012 ( -2077 ) + 3013 ( 2103 ) + 3014 ( -2089 ) + 3015 ( 2104 ) + 3016 ( 2105 ) + 3017 ( 2106 ) + 3018 ( 2107 ) + 3019 ( -2079 ) + 3020 ( 2108 ) + 3021 ( -2094 ) + 3022 ( 2109 ) + 3023 ( 2110 ) + 3024 ( 2111 ) + 3025 ( 2112 ) + 3026 ( -2081 ) + 3027 ( 2113 ) + 3028 ( 2114 ) + 3029 ( 2115 ) + 3030 ( -2099 ) + 3031 ( 2116 ) + 3032 ( 2117 ) + 3033 ( 2118 ) + 3034 ( 2119 ) + 3035 ( 2120 ) + 3036 ( 209 ) + 3037 ( -270 ) + 3038 ( 2121 ) + 3039 ( 2122 ) + 3040 ( 2123 ) + 3041 ( 2124 ) + 3042 ( 2125 ) + 3043 ( 214 ) + 3044 ( -2121 ) + 3045 ( 2126 ) + 3046 ( 2127 ) + 3047 ( 2128 ) + 3048 ( 2129 ) + 3049 ( -2032 ) + 3050 ( 2130 ) + 3051 ( 2131 ) + 3052 ( -1350 ) + 3053 ( 2132 ) + 3054 ( 2133 ) + 3055 ( -2134 ) + 3056 ( -2130 ) + 3057 ( -2125 ) + 3058 ( -2033 ) + 3059 ( 2135 ) + 3060 ( 2136 ) + 3061 ( 2137 ) + 3062 ( -1644 ) + 3063 ( -1670 ) + 3064 ( 2138 ) + 3065 ( -1311 ) + 3066 ( -1543 ) + 3067 ( -2024 ) + 3068 ( 2139 ) + 3069 ( -2131 ) + 3070 ( 2140 ) + 3071 ( 2134 ) + 3072 ( -2122 ) + 3073 ( 2141 ) + 3074 ( 2142 ) + 3075 ( 2143 ) + 3076 ( -1344 ) + 3077 ( 2144 ) + 3078 ( 2145 ) + 3079 ( 392 ) + 3080 ( 349 ) + 3081 ( 2146 ) + 3082 ( 2147 ) + 3083 ( -329 ) + 3084 ( -785 ) + 3085 ( 2148 ) + 3086 ( 2149 ) + 3087 ( 2150 ) + 3088 ( 2151 ) + 3089 ( 2152 ) + 3090 ( 2153 ) + 3091 ( 2154 ) + 3092 ( -359 ) + 3093 ( -353 ) + 3094 ( 2155 ) + 3095 ( 2156 ) + 3096 ( 2157 ) + 3097 ( -824 ) + 3098 ( 2158 ) + 3099 ( 2159 ) + 3100 ( 391 ) + 3101 ( 2160 ) + 3102 ( 2161 ) + 3103 ( 2162 ) + 3104 ( 2163 ) + 3105 ( -2156 ) + 3106 ( -823 ) + 3107 ( 2164 ) + 3108 ( 2165 ) + 3109 ( 2166 ) + 3110 ( 2167 ) + 3111 ( -2147 ) + 3112 ( 2168 ) + 3113 ( 2169 ) + 3114 ( 1336 ) + 3115 ( 2170 ) + 3116 ( 2171 ) + 3117 ( -2148 ) + 3118 ( 2172 ) + 3119 ( 2173 ) + 3120 ( 2174 ) + 3121 ( 2175 ) + 3122 ( 2176 ) + 3123 ( -805 ) + 3124 ( 2177 ) + 3125 ( 2178 ) + 3126 ( -2164 ) + 3127 ( -2149 ) + 3128 ( 2179 ) + 3129 ( 2180 ) + 3130 ( -2176 ) + 3131 ( -825 ) + 3132 ( 2181 ) + 3133 ( 2182 ) + 3134 ( 2183 ) + 3135 ( -813 ) + 3136 ( 2184 ) + 3137 ( 2185 ) + 3138 ( -1329 ) + 3139 ( -829 ) + 3140 ( 2186 ) + 3141 ( -2187 ) + 3142 ( -812 ) + 3143 ( 2188 ) + 3144 ( -2189 ) + 3145 ( -2182 ) + 3146 ( -2161 ) + 3147 ( 2190 ) + 3148 ( -2190 ) + 3149 ( -2186 ) + 3150 ( -2162 ) + 3151 ( -2177 ) + 3152 ( -819 ) + 3153 ( 2191 ) + 3154 ( 2192 ) + 3155 ( -2193 ) + 3156 ( 2194 ) + 3157 ( -811 ) + 3158 ( -2195 ) + 3159 ( -2181 ) + 3160 ( -2192 ) + 3161 ( -2171 ) + 3162 ( -2178 ) + 3163 ( 2187 ) + 3164 ( -2185 ) + 3165 ( -833 ) + 3166 ( 2196 ) + 3167 ( 2197 ) + 3168 ( -818 ) + 3169 ( 2198 ) + 3170 ( 2189 ) + 3171 ( -2160 ) + 3172 ( -2155 ) + 3173 ( 2199 ) + 3174 ( -817 ) + 3175 ( 2200 ) + 3176 ( -2196 ) + 3177 ( 2193 ) + 3178 ( -2183 ) + 3179 ( 1338 ) + 3180 ( -1333 ) + 3181 ( 2201 ) + 3182 ( 2202 ) + 3183 ( -820 ) + 3184 ( -797 ) + 3185 ( 2195 ) + 3186 ( 1339 ) + 3187 ( -2170 ) + 3188 ( -796 ) + 3189 ( 2203 ) + 3190 ( -2201 ) + 3191 ( -2204 ) + 3192 ( -2205 ) + 3193 ( 2206 ) + 3194 ( 2207 ) + 3195 ( -1310 ) + 3196 ( 1354 ) + 3197 ( -2169 ) + 3198 ( -1335 ) + 3199 ( -803 ) + 3200 ( -2120 ) + 3201 ( -319 ) + 3202 ( -213 ) + 3203 ( -2127 ) + 3204 ( 2208 ) + 3205 ( -2167 ) + 3206 ( -2150 ) + 3207 ( -2034 ) + 3208 ( -406 ) + 3209 ( 2209 ) + 3210 ( 2210 ) + 3211 ( 2211 ) + 3212 ( 2212 ) + 3213 ( 2213 ) + 3214 ( 2214 ) + 3215 ( 2215 ) + 3216 ( 2216 ) + 3217 ( 2204 ) + 3218 ( 1357 ) + 3219 ( -320 ) + 3220 ( -2128 ) + 3221 ( -2123 ) + 3222 ( -2135 ) + 3223 ( -2151 ) + 3224 ( -2140 ) + 3225 ( -2035 ) + 3226 ( -407 ) + 3227 ( 2217 ) + 3228 ( 2218 ) + 3229 ( 2219 ) + 3230 ( 2220 ) + 3231 ( 2221 ) + 3232 ( 2222 ) + 3233 ( 2223 ) + 3234 ( 2224 ) + 3235 ( -2173 ) + 3236 ( -321 ) + 3237 ( -2152 ) + 3238 ( -2036 ) + 3239 ( -408 ) + 3240 ( 2225 ) + 3241 ( 2226 ) + 3242 ( -2224 ) + 3243 ( -2179 ) + 3244 ( -2213 ) + 3245 ( -2129 ) + 3246 ( -2124 ) + 3247 ( 2227 ) + 3248 ( -2226 ) + 3249 ( -2212 ) + 3250 ( -2223 ) + 3251 ( 2228 ) + 3252 ( 2205 ) + 3253 ( -2139 ) + 3254 ( -2133 ) + 3255 ( 1356 ) + 3256 ( -1318 ) + 3257 ( -2141 ) + 3258 ( -1353 ) + 3259 ( -1349 ) + 3260 ( 2229 ) + 3261 ( -2221 ) + 3262 ( 2230 ) + 3263 ( 2231 ) + 3264 ( -2232 ) + 3265 ( 2233 ) + 3266 ( -1044 ) + 3267 ( 2234 ) + 3268 ( 2235 ) + 3269 ( 2055 ) + 3270 ( 2236 ) + 3271 ( 2237 ) + 3272 ( -2038 ) + 3273 ( -2057 ) + 3274 ( 2238 ) + 3275 ( 2239 ) + 3276 ( -341 ) + 3277 ( 2240 ) + 3278 ( 2241 ) + 3279 ( 2242 ) + 3280 ( 2243 ) + 3281 ( 2244 ) + 3282 ( 2245 ) + 3283 ( 2246 ) + 3284 ( -342 ) + 3285 ( 2247 ) + 3286 ( -386 ) + 3287 ( 2248 ) + 3288 ( -2243 ) + 3289 ( 2249 ) + 3290 ( -343 ) + 3291 ( 2250 ) + 3292 ( 2251 ) + 3293 ( -2247 ) + 3294 ( -2241 ) + 3295 ( -385 ) + 3296 ( 2252 ) + 3297 ( -410 ) + 3298 ( -395 ) + 3299 ( 2253 ) + 3300 ( 2254 ) + 3301 ( -2208 ) + 3302 ( -403 ) + 3303 ( -2146 ) + 3304 ( -2163 ) + 3305 ( 2255 ) + 3306 ( 2256 ) + 3307 ( 2257 ) + 3308 ( 2258 ) + 3309 ( 2259 ) + 3310 ( 2260 ) + 3311 ( 2261 ) + 3312 ( 2262 ) + 3313 ( 2263 ) + 3314 ( 2264 ) + 3315 ( 2265 ) + 3316 ( 2266 ) + 3317 ( 2267 ) + 3318 ( 2268 ) + 3319 ( 2269 ) + 3320 ( 2270 ) + 3321 ( 2271 ) + 3322 ( 2272 ) + 3323 ( 2273 ) + 3324 ( 2274 ) + 3325 ( -2269 ) + 3326 ( 2275 ) + 3327 ( -2266 ) + 3328 ( 2276 ) + 3329 ( 2277 ) + 3330 ( 2278 ) + 3331 ( -2274 ) + 3332 ( 2279 ) + 3333 ( 2280 ) + 3334 ( 2281 ) + 3335 ( 2282 ) + 3336 ( 2283 ) + 3337 ( 2284 ) + 3338 ( 2285 ) + 3339 ( 2286 ) + 3340 ( -2275 ) + 3341 ( -2270 ) + 3342 ( 2287 ) + 3343 ( -2283 ) + 3344 ( 2288 ) + 3345 ( -2267 ) + 3346 ( 2289 ) + 3347 ( 2290 ) + 3348 ( 2291 ) + 3349 ( 2292 ) + 3350 ( 2293 ) + 3351 ( 2294 ) + 3352 ( -2279 ) + 3353 ( 2295 ) + 3354 ( 2296 ) + 3355 ( 2297 ) + 3356 ( 2298 ) + 3357 ( -2291 ) + 3358 ( 2299 ) + 3359 ( 2300 ) + 3360 ( 2301 ) + 3361 ( 2302 ) + 3362 ( 2303 ) + 3363 ( 2304 ) + 3364 ( 2305 ) + 3365 ( 2306 ) + 3366 ( 2307 ) + 3367 ( 2308 ) + 3368 ( -2297 ) + 3369 ( 2309 ) + 3370 ( 2310 ) + 3371 ( 2311 ) + 3372 ( -2293 ) + 3373 ( 2312 ) + 3374 ( 2313 ) + 3375 ( 2314 ) + 3376 ( 2315 ) + 3377 ( 2316 ) + 3378 ( -2311 ) + 3379 ( -2292 ) + 3380 ( 2317 ) + 3381 ( 2318 ) + 3382 ( 2319 ) + 3383 ( 2320 ) + 3384 ( -2314 ) + 3385 ( 2321 ) + 3386 ( 2322 ) + 3387 ( 2323 ) + 3388 ( -2294 ) + 3389 ( -2308 ) + 3390 ( 2324 ) + 3391 ( 2325 ) + 3392 ( 2326 ) + 3393 ( 2327 ) + 3394 ( 2328 ) + 3395 ( 2329 ) + 3396 ( 2330 ) + 3397 ( 2331 ) + 3398 ( -2332 ) + 3399 ( 2333 ) + 3400 ( 2334 ) + 3401 ( 2335 ) + 3402 ( 2336 ) + 3403 ( -2319 ) + 3404 ( 2337 ) + 3405 ( 2338 ) + 3406 ( -2298 ) + 3407 ( 2339 ) + 3408 ( -2334 ) + 3409 ( -2259 ) + 3410 ( 2340 ) + 3411 ( 2341 ) + 3412 ( 2342 ) + 3413 ( -2290 ) + 3414 ( 2343 ) + 3415 ( 2344 ) + 3416 ( 2345 ) + 3417 ( -2346 ) + 3418 ( -2347 ) + 3419 ( 2348 ) + 3420 ( -2349 ) + 3421 ( -2350 ) + 3422 ( 2351 ) + 3423 ( -2352 ) + 3424 ( -2353 ) + 3425 ( -2354 ) + 3426 ( -2355 ) + 3427 ( -2356 ) + 3428 ( -2357 ) + 3429 ( -2358 ) + 3430 ( -2359 ) + 3431 ( -2360 ) + 3432 ( -2361 ) + 3433 ( -2330 ) + 3434 ( 2362 ) + 3435 ( -2344 ) + 3436 ( 2363 ) + 3437 ( 2364 ) + 3438 ( 2365 ) + 3439 ( -2366 ) + 3440 ( -2341 ) + 3441 ( 2367 ) + 3442 ( 2368 ) + 3443 ( 2369 ) + 3444 ( 2370 ) + 3445 ( -2371 ) + 3446 ( -2363 ) + 3447 ( -2340 ) + 3448 ( -2362 ) + 3449 ( 2372 ) + 3450 ( 2373 ) + 3451 ( 2374 ) + 3452 ( 2375 ) + 3453 ( -2285 ) + 3454 ( 2376 ) + 3455 ( -2284 ) + 3456 ( -2339 ) + 3457 ( 2377 ) + 3458 ( 2378 ) + 3459 ( -2256 ) + 3460 ( -2329 ) + 3461 ( 2379 ) + 3462 ( -2373 ) + 3463 ( -2378 ) + 3464 ( -2265 ) + 3465 ( -2376 ) + 3466 ( 2380 ) + 3467 ( -2286 ) + 3468 ( -2379 ) + 3469 ( -2374 ) + 3470 ( -2337 ) + 3471 ( -2287 ) + 3472 ( 2381 ) + 3473 ( 2382 ) + 3474 ( -2261 ) + 3475 ( 2383 ) + 3476 ( 2384 ) + 3477 ( 2385 ) + 3478 ( 2386 ) + 3479 ( 2387 ) + 3480 ( 2388 ) + 3481 ( 2389 ) + 3482 ( -2262 ) + 3483 ( 2390 ) + 3484 ( 2391 ) + 3485 ( 2392 ) + 3486 ( 2393 ) + 3487 ( 2394 ) + 3488 ( 2395 ) + 3489 ( -2255 ) + 3490 ( 2396 ) + 3491 ( 2397 ) + 3492 ( -2389 ) + 3493 ( 2398 ) + 3494 ( 2399 ) + 3495 ( -2382 ) + 3496 ( 2400 ) + 3497 ( 2401 ) + 3498 ( 2402 ) + 3499 ( 2403 ) + 3500 ( 2404 ) + 3501 ( 2405 ) + 3502 ( 2406 ) + 3503 ( 2407 ) + 3504 ( 2408 ) + 3505 ( 2409 ) + 3506 ( -2402 ) + 3507 ( 2410 ) + 3508 ( -2383 ) + 3509 ( 2411 ) + 3510 ( 2412 ) + 3511 ( 2413 ) + 3512 ( 2414 ) + 3513 ( 2415 ) + 3514 ( 2416 ) + 3515 ( 2417 ) + 3516 ( 2418 ) + 3517 ( 2419 ) + 3518 ( 2420 ) + 3519 ( 2421 ) + 3520 ( 2422 ) + 3521 ( 2423 ) + 3522 ( 2424 ) + 3523 ( 2425 ) + 3524 ( -2417 ) + 3525 ( 2426 ) + 3526 ( -2390 ) + 3527 ( 2427 ) + 3528 ( 2428 ) + 3529 ( 2429 ) + 3530 ( 2430 ) + 3531 ( 2431 ) + 3532 ( -2396 ) + 3533 ( -2428 ) + 3534 ( -2420 ) + 3535 ( -2412 ) + 3536 ( -2405 ) + 3537 ( 2432 ) + 3538 ( 2433 ) + 3539 ( 2434 ) + 3540 ( 2435 ) + 3541 ( 2436 ) + 3542 ( 2437 ) + 3543 ( -2433 ) + 3544 ( 2438 ) + 3545 ( 2439 ) + 3546 ( -2401 ) + 3547 ( -2400 ) + 3548 ( -2415 ) + 3549 ( -2409 ) + 3550 ( -2437 ) + 3551 ( -2432 ) + 3552 ( 2440 ) + 3553 ( -2399 ) + 3554 ( -2431 ) + 3555 ( -2424 ) + 3556 ( -2439 ) + 3557 ( 2441 ) + 3558 ( -2434 ) + 3559 ( 2442 ) + 3560 ( 2443 ) + 3561 ( 2444 ) + 3562 ( 2445 ) + 3563 ( 2446 ) + 3564 ( 2447 ) + 3565 ( 2448 ) + 3566 ( 2449 ) + 3567 ( 2450 ) + 3568 ( 2451 ) + 3569 ( 2452 ) + 3570 ( 2453 ) + 3571 ( -2454 ) + 3572 ( -2455 ) + 3573 ( 2456 ) + 3574 ( 2457 ) + 3575 ( 2458 ) + 3576 ( 2459 ) + 3577 ( -2449 ) + 3578 ( 2460 ) + 3579 ( 2461 ) + 3580 ( 2462 ) + 3581 ( 2463 ) + 3582 ( 2464 ) + 3583 ( 2465 ) + 3584 ( 2466 ) + 3585 ( 2467 ) + 3586 ( 2468 ) + 3587 ( 2469 ) + 3588 ( 2470 ) + 3589 ( 2471 ) + 3590 ( 2472 ) + 3591 ( -2473 ) + 3592 ( -2474 ) + 3593 ( -2460 ) + 3594 ( 2475 ) + 3595 ( 2476 ) + 3596 ( 2477 ) + 3597 ( 2478 ) + 3598 ( 2479 ) + 3599 ( 2480 ) + 3600 ( 2481 ) + 3601 ( 2482 ) + 3602 ( 2483 ) + 3603 ( 2484 ) + 3604 ( 2485 ) + 3605 ( 2486 ) + 3606 ( -2478 ) + 3607 ( 2487 ) + 3608 ( 2488 ) + 3609 ( 2489 ) + 3610 ( 2490 ) + 3611 ( 2491 ) + 3612 ( 2492 ) + 3613 ( 2493 ) + 3614 ( 2494 ) + 3615 ( 2495 ) + 3616 ( 2496 ) + 3617 ( 2497 ) + 3618 ( 2498 ) + 3619 ( 2499 ) + 3620 ( 2500 ) + 3621 ( 2501 ) + 3622 ( 2502 ) + 3623 ( 2503 ) + 3624 ( 2504 ) + 3625 ( 2505 ) + 3626 ( 2506 ) + 3627 ( -2446 ) + 3628 ( 2507 ) + 3629 ( -2508 ) + 3630 ( 2509 ) + 3631 ( 2510 ) + 3632 ( 2511 ) + 3633 ( -2512 ) + 3634 ( -2513 ) + 3635 ( -2514 ) + 3636 ( -2468 ) + 3637 ( 2515 ) + 3638 ( -2507 ) + 3639 ( 2516 ) + 3640 ( 2517 ) + 3641 ( -2518 ) + 3642 ( 2519 ) + 3643 ( 2520 ) + 3644 ( -2451 ) + 3645 ( 2521 ) + 3646 ( 2522 ) + 3647 ( 2523 ) + 3648 ( 2524 ) + 3649 ( 2525 ) + 3650 ( -2526 ) + 3651 ( -2516 ) + 3652 ( 2527 ) + 3653 ( 2528 ) + 3654 ( 2529 ) + 3655 ( 2530 ) + 3656 ( 2531 ) + 3657 ( 2532 ) + 3658 ( 2533 ) + 3659 ( 2534 ) + 3660 ( 2535 ) + 3661 ( 2536 ) + 3662 ( 2537 ) + 3663 ( -2486 ) + 3664 ( 2538 ) + 3665 ( 2539 ) + 3666 ( 2540 ) + 3667 ( -2531 ) + 3668 ( 2541 ) + 3669 ( 2542 ) + 3670 ( -2485 ) + 3671 ( 2543 ) + 3672 ( 2544 ) + 3673 ( 2545 ) + 3674 ( 2546 ) + 3675 ( 2547 ) + 3676 ( 2548 ) + 3677 ( 2549 ) + 3678 ( -2543 ) + 3679 ( 2550 ) + 3680 ( 2551 ) + 3681 ( 2552 ) + 3682 ( 2553 ) + 3683 ( 2554 ) + 3684 ( 2555 ) + 3685 ( -2492 ) + 3686 ( 2556 ) + 3687 ( -2544 ) + 3688 ( 2557 ) + 3689 ( 2558 ) + 3690 ( -2551 ) + 3691 ( 2559 ) + 3692 ( 2560 ) + 3693 ( 2561 ) + 3694 ( -2491 ) + 3695 ( 2562 ) + 3696 ( 2563 ) + 3697 ( 2564 ) + 3698 ( 2565 ) + 3699 ( 2566 ) + 3700 ( -2559 ) + 3701 ( -2552 ) + 3702 ( 2567 ) + 3703 ( 2568 ) + 3704 ( 2569 ) + 3705 ( -2493 ) + 3706 ( 2570 ) + 3707 ( 2571 ) + 3708 ( -2572 ) + 3709 ( 2573 ) + 3710 ( 2574 ) + 3711 ( 2575 ) + 3712 ( -2532 ) + 3713 ( 2576 ) + 3714 ( 2577 ) + 3715 ( 2578 ) + 3716 ( 2579 ) + 3717 ( -2560 ) + 3718 ( -2567 ) + 3719 ( 2580 ) + 3720 ( 2581 ) + 3721 ( 2582 ) + 3722 ( -2562 ) + 3723 ( -2577 ) + 3724 ( 2583 ) + 3725 ( 2584 ) + 3726 ( 2585 ) + 3727 ( 2358 ) + 3728 ( 2586 ) + 3729 ( 2587 ) + 3730 ( 2588 ) + 3731 ( 2589 ) + 3732 ( 2590 ) + 3733 ( 2591 ) + 3734 ( 2592 ) + 3735 ( 2593 ) + 3736 ( 2594 ) + 3737 ( 2359 ) + 3738 ( 2595 ) + 3739 ( 2596 ) + 3740 ( -2588 ) + 3741 ( 2597 ) + 3742 ( 2598 ) + 3743 ( 2599 ) + 3744 ( 2600 ) + 3745 ( 2601 ) + 3746 ( 2602 ) + 3747 ( 2603 ) + 3748 ( 2604 ) + 3749 ( 2605 ) + 3750 ( -2606 ) + 3751 ( 2347 ) + 3752 ( -2600 ) + 3753 ( -2593 ) + 3754 ( 2607 ) + 3755 ( 2608 ) + 3756 ( 2609 ) + 3757 ( 2610 ) + 3758 ( 2611 ) + 3759 ( 2352 ) + 3760 ( 2612 ) + 3761 ( 2613 ) + 3762 ( 2614 ) + 3763 ( -2597 ) + 3764 ( -2607 ) + 3765 ( 2615 ) + 3766 ( 2616 ) + 3767 ( 2617 ) + 3768 ( 2618 ) + 3769 ( 2619 ) + 3770 ( 2620 ) + 3771 ( -2482 ) + 3772 ( -2547 ) + 3773 ( -2621 ) + 3774 ( -2622 ) + 3775 ( 2623 ) + 3776 ( 2346 ) + 3777 ( -2601 ) + 3778 ( 2624 ) + 3779 ( 2625 ) + 3780 ( 2626 ) + 3781 ( 2627 ) + 3782 ( 2628 ) + 3783 ( -2617 ) + 3784 ( -2566 ) + 3785 ( 2606 ) + 3786 ( 2357 ) + 3787 ( -2594 ) + 3788 ( 2629 ) + 3789 ( 2630 ) + 3790 ( 2631 ) + 3791 ( 2632 ) + 3792 ( 2633 ) + 3793 ( 2621 ) + 3794 ( -2603 ) + 3795 ( 2353 ) + 3796 ( 2634 ) + 3797 ( 2635 ) + 3798 ( 2636 ) + 3799 ( 2637 ) + 3800 ( 2622 ) + 3801 ( 2354 ) + 3802 ( 2638 ) + 3803 ( 2639 ) + 3804 ( -2636 ) + 3805 ( 2640 ) + 3806 ( 2641 ) + 3807 ( -2490 ) + 3808 ( -2550 ) + 3809 ( 2349 ) + 3810 ( 2642 ) + 3811 ( -2592 ) + 3812 ( -2632 ) + 3813 ( 2643 ) + 3814 ( 2644 ) + 3815 ( 2645 ) + 3816 ( 2646 ) + 3817 ( -2602 ) + 3818 ( 2355 ) + 3819 ( 2647 ) + 3820 ( 2648 ) + 3821 ( 2649 ) + 3822 ( -2633 ) + 3823 ( 2650 ) + 3824 ( -2643 ) + 3825 ( 2651 ) + 3826 ( 2652 ) + 3827 ( 2653 ) + 3828 ( 2356 ) + 3829 ( 2654 ) + 3830 ( 2655 ) + 3831 ( 2656 ) + 3832 ( -2650 ) + 3833 ( 2657 ) + 3834 ( 2658 ) + 3835 ( 2659 ) + 3836 ( -2489 ) + 3837 ( -2635 ) + 3838 ( -2639 ) + 3839 ( 2660 ) + 3840 ( -2661 ) + 3841 ( 2662 ) + 3842 ( 2663 ) + 3843 ( 2664 ) + 3844 ( -2634 ) + 3845 ( -2656 ) + 3846 ( -2665 ) + 3847 ( -2546 ) + 3848 ( -2481 ) + 3849 ( 2666 ) + 3850 ( 2667 ) + 3851 ( 2668 ) + 3852 ( 2669 ) + 3853 ( -2529 ) + 3854 ( -2539 ) + 3855 ( -2660 ) + 3856 ( 2670 ) + 3857 ( -2638 ) + 3858 ( -2655 ) + 3859 ( 2671 ) + 3860 ( 2672 ) + 3861 ( 2673 ) + 3862 ( 2674 ) + 3863 ( 2675 ) + 3864 ( -2587 ) + 3865 ( -2671 ) + 3866 ( 2676 ) + 3867 ( 2677 ) + 3868 ( 2678 ) + 3869 ( 2679 ) + 3870 ( -2596 ) + 3871 ( 2680 ) + 3872 ( 2681 ) + 3873 ( 2682 ) + 3874 ( -2679 ) + 3875 ( 2683 ) + 3876 ( 2684 ) + 3877 ( 2685 ) + 3878 ( -2615 ) + 3879 ( 2686 ) + 3880 ( 2360 ) + 3881 ( 2687 ) + 3882 ( 2688 ) + 3883 ( 2689 ) + 3884 ( 2690 ) + 3885 ( 2691 ) + 3886 ( 2692 ) + 3887 ( 2693 ) + 3888 ( 2694 ) + 3889 ( 2361 ) + 3890 ( 2695 ) + 3891 ( 2696 ) + 3892 ( -2689 ) + 3893 ( 2697 ) + 3894 ( -2642 ) + 3895 ( 2698 ) + 3896 ( -2614 ) + 3897 ( -2647 ) + 3898 ( -2586 ) + 3899 ( -2595 ) + 3900 ( -2623 ) + 3901 ( 2699 ) + 3902 ( 2700 ) + 3903 ( -2549 ) + 3904 ( 2701 ) + 3905 ( 2702 ) + 3906 ( 2703 ) + 3907 ( 2704 ) + 3908 ( 2705 ) + 3909 ( 2706 ) + 3910 ( 2707 ) + 3911 ( 2708 ) + 3912 ( -2548 ) + 3913 ( -2627 ) + 3914 ( -2700 ) + 3915 ( 2709 ) + 3916 ( 2710 ) + 3917 ( 2711 ) + 3918 ( -2611 ) + 3919 ( -2681 ) + 3920 ( -2712 ) + 3921 ( -2706 ) + 3922 ( -2626 ) + 3923 ( -2699 ) + 3924 ( -2680 ) + 3925 ( -2610 ) + 3926 ( 2713 ) + 3927 ( 2714 ) + 3928 ( 2715 ) + 3929 ( 2716 ) + 3930 ( -2709 ) + 3931 ( 2717 ) + 3932 ( 2718 ) + 3933 ( 2719 ) + 3934 ( 2720 ) + 3935 ( -2707 ) + 3936 ( -2565 ) + 3937 ( -2628 ) + 3938 ( 2712 ) + 3939 ( -2705 ) + 3940 ( -2682 ) + 3941 ( -2613 ) + 3942 ( 2721 ) + 3943 ( 2722 ) + 3944 ( 2723 ) + 3945 ( -2703 ) + 3946 ( -2670 ) + 3947 ( -2640 ) + 3948 ( -2554 ) + 3949 ( 2724 ) + 3950 ( 2725 ) + 3951 ( 2726 ) + 3952 ( 2727 ) + 3953 ( 2728 ) + 3954 ( 2729 ) + 3955 ( 2730 ) + 3956 ( 2731 ) + 3957 ( 2732 ) + 3958 ( 2733 ) + 3959 ( 2734 ) + 3960 ( 2735 ) + 3961 ( 2736 ) + 3962 ( 2737 ) + 3963 ( 2738 ) + 3964 ( 2739 ) + 3965 ( 2740 ) + 3966 ( -2735 ) + 3967 ( 2741 ) + 3968 ( 2742 ) + 3969 ( -2743 ) + 3970 ( 2744 ) + 3971 ( 2745 ) + 3972 ( 2746 ) + 3973 ( -2747 ) + 3974 ( -2692 ) + 3975 ( 2748 ) + 3976 ( -2742 ) + 3977 ( 2572 ) + 3978 ( 2473 ) + 3979 ( -2535 ) + 3980 ( -2494 ) + 3981 ( 2749 ) + 3982 ( 2750 ) + 3983 ( 2751 ) + 3984 ( 2752 ) + 3985 ( 2753 ) + 3986 ( 2754 ) + 3987 ( -2755 ) + 3988 ( -2756 ) + 3989 ( 2757 ) + 3990 ( 2758 ) + 3991 ( 2759 ) + 3992 ( 2760 ) + 3993 ( 2761 ) + 3994 ( 2762 ) + 3995 ( 2763 ) + 3996 ( -2649 ) + 3997 ( 2764 ) + 3998 ( 2765 ) + 3999 ( 2766 ) + 4000 ( 2767 ) + 4001 ( -2763 ) + 4002 ( -2648 ) + 4003 ( 2768 ) + 4004 ( 2769 ) + 4005 ( 2770 ) + 4006 ( 2771 ) + 4007 ( 2665 ) + 4008 ( 2661 ) + 4009 ( -2771 ) + 4010 ( 2772 ) + 4011 ( 2773 ) + 4012 ( 2774 ) + 4013 ( 2775 ) + 4014 ( -2488 ) + 4015 ( -2654 ) + 4016 ( 2776 ) + 4017 ( 2777 ) + 4018 ( 2778 ) + 4019 ( 2779 ) + 4020 ( 2780 ) + 4021 ( -2688 ) + 4022 ( -2776 ) + 4023 ( 2781 ) + 4024 ( 2782 ) + 4025 ( 2783 ) + 4026 ( -2762 ) + 4027 ( -2696 ) + 4028 ( 2784 ) + 4029 ( -2729 ) + 4030 ( 2785 ) + 4031 ( 2786 ) + 4032 ( 2756 ) + 4033 ( 2787 ) + 4034 ( -2669 ) + 4035 ( -2536 ) + 4036 ( -2772 ) + 4037 ( -2495 ) + 4038 ( 2788 ) + 4039 ( 2789 ) + 4040 ( -2753 ) + 4041 ( 2790 ) + 4042 ( -2667 ) + 4043 ( -2542 ) + 4044 ( -2537 ) + 4045 ( -2555 ) + 4046 ( 2791 ) + 4047 ( 2792 ) + 4048 ( 2793 ) + 4049 ( 2794 ) + 4050 ( 2795 ) + 4051 ( -2789 ) + 4052 ( -2726 ) + 4053 ( -2752 ) + 4054 ( -2666 ) + 4055 ( 2796 ) + 4056 ( 2797 ) + 4057 ( 2798 ) + 4058 ( 2799 ) + 4059 ( -2725 ) + 4060 ( -2795 ) + 4061 ( 2800 ) + 4062 ( 2801 ) + 4063 ( -2798 ) + 4064 ( -2793 ) + 4065 ( 2802 ) + 4066 ( 2803 ) + 4067 ( -2774 ) + 4068 ( -2657 ) + 4069 ( -2496 ) + 4070 ( 2804 ) + 4071 ( 2805 ) + 4072 ( 2806 ) + 4073 ( 2474 ) + 4074 ( -2497 ) + 4075 ( 2807 ) + 4076 ( -2788 ) + 4077 ( -2751 ) + 4078 ( -2805 ) + 4079 ( 2808 ) + 4080 ( -2714 ) + 4081 ( 2809 ) + 4082 ( 2810 ) + 4083 ( 2811 ) + 4084 ( 2812 ) + 4085 ( 2813 ) + 4086 ( 2814 ) + 4087 ( 2815 ) + 4088 ( -2584 ) + 4089 ( 2816 ) + 4090 ( 2817 ) + 4091 ( 2818 ) + 4092 ( -2720 ) + 4093 ( 2819 ) + 4094 ( -2817 ) + 4095 ( 2820 ) + 4096 ( -2810 ) + 4097 ( -2719 ) + 4098 ( 2821 ) + 4099 ( 2822 ) + 4100 ( 2823 ) + 4101 ( 2824 ) + 4102 ( 2825 ) + 4103 ( 2826 ) + 4104 ( 2827 ) + 4105 ( 2828 ) + 4106 ( 2829 ) + 4107 ( 2755 ) + 4108 ( 2830 ) + 4109 ( 2831 ) + 4110 ( 2832 ) + 4111 ( 2833 ) + 4112 ( 2834 ) + 4113 ( 2835 ) + 4114 ( 2836 ) + 4115 ( 2837 ) + 4116 ( 2838 ) + 4117 ( -2835 ) + 4118 ( 2839 ) + 4119 ( 2840 ) + 4120 ( 2841 ) + 4121 ( 2842 ) + 4122 ( 2843 ) + 4123 ( 2844 ) + 4124 ( 2845 ) + 4125 ( 2846 ) + 4126 ( 2847 ) + 4127 ( 2848 ) + 4128 ( 2849 ) + 4129 ( 2850 ) + 4130 ( 2851 ) + 4131 ( 2852 ) + 4132 ( 2853 ) + 4133 ( 2854 ) + 4134 ( 2855 ) + 4135 ( 2856 ) + 4136 ( -2841 ) + 4137 ( 2857 ) + 4138 ( 2858 ) + 4139 ( 2859 ) + 4140 ( 2860 ) + 4141 ( -2861 ) + 4142 ( -2862 ) + 4143 ( -2863 ) + 4144 ( 2864 ) + 4145 ( -2847 ) + 4146 ( 2865 ) + 4147 ( 2866 ) + 4148 ( 2867 ) + 4149 ( 2868 ) + 4150 ( 2869 ) + 4151 ( 2870 ) + 4152 ( 2871 ) + 4153 ( -2821 ) + 4154 ( -2864 ) + 4155 ( 2872 ) + 4156 ( 2873 ) + 4157 ( 2874 ) + 4158 ( 2875 ) + 4159 ( -2853 ) + 4160 ( 2876 ) + 4161 ( 2877 ) + 4162 ( 2878 ) + 4163 ( 2879 ) + 4164 ( -2880 ) + 4165 ( -2881 ) + 4166 ( 2882 ) + 4167 ( -2843 ) + 4168 ( -2822 ) + 4169 ( -2872 ) + 4170 ( -2867 ) + 4171 ( -2823 ) + 4172 ( -2759 ) + 4173 ( 2883 ) + 4174 ( 2884 ) + 4175 ( 2885 ) + 4176 ( 2886 ) + 4177 ( 2880 ) + 4178 ( -2825 ) + 4179 ( 2887 ) + 4180 ( 2888 ) + 4181 ( 2889 ) + 4182 ( 2890 ) + 4183 ( 2881 ) + 4184 ( -2844 ) + 4185 ( 2891 ) + 4186 ( 2892 ) + 4187 ( 2893 ) + 4188 ( 2894 ) + 4189 ( 2895 ) + 4190 ( 2896 ) + 4191 ( 2897 ) + 4192 ( -2620 ) + 4193 ( -2470 ) + 4194 ( -2461 ) + 4195 ( 2350 ) + 4196 ( 2332 ) + 4197 ( -2659 ) + 4198 ( -2641 ) + 4199 ( -2498 ) + 4200 ( 2898 ) + 4201 ( 2899 ) + 4202 ( 2900 ) + 4203 ( 2901 ) + 4204 ( 2902 ) + 4205 ( -2807 ) + 4206 ( 2903 ) + 4207 ( 2904 ) + 4208 ( 2905 ) + 4209 ( 2906 ) + 4210 ( -2850 ) + 4211 ( 2907 ) + 4212 ( 2908 ) + 4213 ( 2909 ) + 4214 ( 2910 ) + 4215 ( 2911 ) + 4216 ( -2833 ) + 4217 ( 2912 ) + 4218 ( 2913 ) + 4219 ( -2786 ) + 4220 ( 2914 ) + 4221 ( 2915 ) + 4222 ( 2916 ) + 4223 ( 2917 ) + 4224 ( -1130 ) + 4225 ( -2918 ) + 4226 ( -2919 ) + 4227 ( -2920 ) + 4228 ( -2732 ) + 4229 ( 2921 ) + 4230 ( 2922 ) + 4231 ( -2923 ) + 4232 ( -2924 ) + 4233 ( -2925 ) + 4234 ( -2926 ) + 4235 ( 2927 ) + 4236 ( 2928 ) + 4237 ( 2929 ) + 4238 ( 2930 ) + 4239 ( 2931 ) + 4240 ( 2932 ) + 4241 ( 2933 ) + 4242 ( 2934 ) + 4243 ( 2935 ) + 4244 ( 2936 ) + 4245 ( 2937 ) + 4246 ( 2938 ) + 4247 ( 2939 ) + 4248 ( -2940 ) + 4249 ( 2941 ) + 4250 ( 2942 ) + 4251 ( -2943 ) + 4252 ( 2944 ) + 4253 ( -2934 ) + 4254 ( 2926 ) + 4255 ( 2945 ) + 4256 ( 2946 ) + 4257 ( 2947 ) + 4258 ( 2948 ) + 4259 ( 2949 ) + 4260 ( 2950 ) + 4261 ( 2951 ) + 4262 ( 2952 ) + 4263 ( 2953 ) + 4264 ( 2954 ) + 4265 ( 2955 ) + 4266 ( 2956 ) + 4267 ( 2957 ) + 4268 ( 2958 ) + 4269 ( 2959 ) + 4270 ( 2960 ) + 4271 ( 2961 ) + 4272 ( 2962 ) + 4273 ( 2963 ) + 4274 ( 2964 ) + 4275 ( 2965 ) + 4276 ( -1003 ) + 4277 ( 2966 ) + 4278 ( 2967 ) + 4279 ( -946 ) + 4280 ( 2968 ) + 4281 ( 2969 ) + 4282 ( 2970 ) + 4283 ( 2971 ) + 4284 ( 2972 ) + 4285 ( 2973 ) + 4286 ( -2965 ) + 4287 ( 2974 ) + 4288 ( -2975 ) + 4289 ( 2976 ) + 4290 ( 2977 ) + 4291 ( 2978 ) + 4292 ( 2979 ) + 4293 ( 2980 ) + 4294 ( 2981 ) + 4295 ( 2982 ) + 4296 ( -2964 ) + 4297 ( 2983 ) + 4298 ( -2984 ) + 4299 ( 2985 ) + 4300 ( 2986 ) + 4301 ( 2987 ) + 4302 ( 2988 ) + 4303 ( 2989 ) + 4304 ( 2990 ) + 4305 ( 2991 ) + 4306 ( 2992 ) + 4307 ( 2993 ) + 4308 ( -2994 ) + 4309 ( -2527 ) + 4310 ( -2522 ) + 4311 ( 2995 ) + 4312 ( 2996 ) + 4313 ( 2997 ) + 4314 ( 2998 ) + 4315 ( 2999 ) + 4316 ( -2993 ) + 4317 ( -2949 ) + 4318 ( 3000 ) + 4319 ( -3001 ) + 4320 ( -3002 ) + 4321 ( 3003 ) + 4322 ( 3004 ) + 4323 ( -2999 ) + 4324 ( -2992 ) + 4325 ( 3005 ) + 4326 ( 2861 ) + 4327 ( 2975 ) + 4328 ( 3006 ) + 4329 ( 3007 ) + 4330 ( 3008 ) + 4331 ( 3009 ) + 4332 ( 3010 ) + 4333 ( 3011 ) + 4334 ( -2963 ) + 4335 ( 2924 ) + 4336 ( 3012 ) + 4337 ( 3013 ) + 4338 ( 3014 ) + 4339 ( 3015 ) + 4340 ( -2521 ) + 4341 ( -2947 ) + 4342 ( -2990 ) + 4343 ( -2996 ) + 4344 ( 3016 ) + 4345 ( -2986 ) + 4346 ( 3017 ) + 4347 ( -3015 ) + 4348 ( 3018 ) + 4349 ( -3019 ) + 4350 ( 3020 ) + 4351 ( 2923 ) + 4352 ( 3021 ) + 4353 ( -2946 ) + 4354 ( 3022 ) + 4355 ( -3014 ) + 4356 ( 3023 ) + 4357 ( 3024 ) + 4358 ( -3025 ) + 4359 ( -2933 ) + 4360 ( 3026 ) + 4361 ( 3027 ) + 4362 ( -2953 ) + 4363 ( 3028 ) + 4364 ( 3029 ) + 4365 ( 3025 ) + 4366 ( -2955 ) + 4367 ( 3030 ) + 4368 ( 3031 ) + 4369 ( 3032 ) + 4370 ( 3033 ) + 4371 ( 3034 ) + 4372 ( 3035 ) + 4373 ( 3036 ) + 4374 ( -3037 ) + 4375 ( 3038 ) + 4376 ( 3039 ) + 4377 ( -3040 ) + 4378 ( -2956 ) + 4379 ( 3041 ) + 4380 ( -3036 ) + 4381 ( 3042 ) + 4382 ( -3029 ) + 4383 ( 3043 ) + 4384 ( 3044 ) + 4385 ( 3045 ) + 4386 ( 3046 ) + 4387 ( -2968 ) + 4388 ( 3047 ) + 4389 ( 3048 ) + 4390 ( 3049 ) + 4391 ( 3050 ) + 4392 ( 3051 ) + 4393 ( 3052 ) + 4394 ( 3053 ) + 4395 ( -2981 ) + 4396 ( -2959 ) + 4397 ( 3054 ) + 4398 ( 3055 ) + 4399 ( 3056 ) + 4400 ( 3057 ) + 4401 ( -2980 ) + 4402 ( -3032 ) + 4403 ( -3053 ) + 4404 ( 3058 ) + 4405 ( -3056 ) + 4406 ( -3052 ) + 4407 ( -3046 ) + 4408 ( 3059 ) + 4409 ( -2960 ) + 4410 ( 3060 ) + 4411 ( 3061 ) + 4412 ( 3062 ) + 4413 ( 3063 ) + 4414 ( 3064 ) + 4415 ( 3065 ) + 4416 ( 3066 ) + 4417 ( -3067 ) + 4418 ( -3045 ) + 4419 ( -3031 ) + 4420 ( -3008 ) + 4421 ( 3068 ) + 4422 ( 3069 ) + 4423 ( 3070 ) + 4424 ( 3071 ) + 4425 ( 3072 ) + 4426 ( -3066 ) + 4427 ( -3007 ) + 4428 ( 2863 ) + 4429 ( 3073 ) + 4430 ( -3074 ) + 4431 ( 3075 ) + 4432 ( -3076 ) + 4433 ( 3077 ) + 4434 ( -3072 ) + 4435 ( -3065 ) + 4436 ( 3078 ) + 4437 ( 3074 ) + 4438 ( 2862 ) + 4439 ( 3040 ) + 4440 ( -2961 ) + 4441 ( 3079 ) + 4442 ( 3080 ) + 4443 ( 3081 ) + 4444 ( 3082 ) + 4445 ( -3070 ) + 4446 ( -3063 ) + 4447 ( -3030 ) + 4448 ( -3006 ) + 4449 ( 3076 ) + 4450 ( -3044 ) + 4451 ( -3061 ) + 4452 ( -3081 ) + 4453 ( 3083 ) + 4454 ( -3005 ) + 4455 ( -3078 ) + 4456 ( 3084 ) + 4457 ( 3085 ) + 4458 ( -2952 ) + 4459 ( 3037 ) + 4460 ( 3086 ) + 4461 ( -2977 ) + 4462 ( 3087 ) + 4463 ( 3088 ) + 4464 ( 3089 ) + 4465 ( 3090 ) + 4466 ( 3091 ) + 4467 ( 3092 ) + 4468 ( -3093 ) + 4469 ( -3058 ) + 4470 ( -3054 ) + 4471 ( -3051 ) + 4472 ( -3060 ) + 4473 ( -2973 ) + 4474 ( -2972 ) + 4475 ( -3050 ) + 4476 ( 3094 ) + 4477 ( 3095 ) + 4478 ( -3091 ) + 4479 ( 3096 ) + 4480 ( -2971 ) + 4481 ( -2978 ) + 4482 ( 3097 ) + 4483 ( 3098 ) + 4484 ( 3099 ) + 4485 ( -3094 ) + 4486 ( -3090 ) + 4487 ( 3100 ) + 4488 ( 3101 ) + 4489 ( -2979 ) + 4490 ( 3102 ) + 4491 ( 3103 ) + 4492 ( -3089 ) + 4493 ( -3069 ) + 4494 ( 3104 ) + 4495 ( -3099 ) + 4496 ( -3103 ) + 4497 ( -3098 ) + 4498 ( -3077 ) + 4499 ( -3088 ) + 4500 ( 3105 ) + 4501 ( 3106 ) + 4502 ( 3107 ) + 4503 ( 3108 ) + 4504 ( -3109 ) + 4505 ( 3110 ) + 4506 ( 3111 ) + 4507 ( 2940 ) + 4508 ( 3112 ) + 4509 ( 3113 ) + 4510 ( 3114 ) + 4511 ( 3115 ) + 4512 ( 3116 ) + 4513 ( 3117 ) + 4514 ( 3118 ) + 4515 ( 3119 ) + 4516 ( 3120 ) + 4517 ( 3121 ) + 4518 ( 3122 ) + 4519 ( 3123 ) + 4520 ( -3114 ) + 4521 ( -3106 ) + 4522 ( 3124 ) + 4523 ( 3125 ) + 4524 ( 3126 ) + 4525 ( 3127 ) + 4526 ( 3128 ) + 4527 ( 3129 ) + 4528 ( 3130 ) + 4529 ( 3131 ) + 4530 ( 3132 ) + 4531 ( 3133 ) + 4532 ( 3134 ) + 4533 ( 3135 ) + 4534 ( 3136 ) + 4535 ( 3137 ) + 4536 ( 3138 ) + 4537 ( -3134 ) + 4538 ( 3139 ) + 4539 ( 3140 ) + 4540 ( -3127 ) + 4541 ( 3141 ) + 4542 ( 3142 ) + 4543 ( 3143 ) + 4544 ( 3144 ) + 4545 ( -3138 ) + 4546 ( 3145 ) + 4547 ( 3146 ) + 4548 ( 3147 ) + 4549 ( 3148 ) + 4550 ( -3119 ) + 4551 ( 3149 ) + 4552 ( -3131 ) + 4553 ( 3150 ) + 4554 ( 3151 ) + 4555 ( 3152 ) + 4556 ( 3153 ) + 4557 ( -3147 ) + 4558 ( -3126 ) + 4559 ( 3154 ) + 4560 ( -3117 ) + 4561 ( 3155 ) + 4562 ( 3156 ) + 4563 ( 3157 ) + 4564 ( 3158 ) + 4565 ( 3159 ) + 4566 ( 3160 ) + 4567 ( 3161 ) + 4568 ( 3162 ) + 4569 ( 3163 ) + 4570 ( 3164 ) + 4571 ( 3165 ) + 4572 ( 3166 ) + 4573 ( 3167 ) + 4574 ( 3168 ) + 4575 ( 3169 ) + 4576 ( 3170 ) + 4577 ( 3171 ) + 4578 ( 3172 ) + 4579 ( 3173 ) + 4580 ( 3174 ) + 4581 ( 3175 ) + 4582 ( -3157 ) + 4583 ( 3176 ) + 4584 ( 3177 ) + 4585 ( -3178 ) + 4586 ( 3179 ) + 4587 ( -3156 ) + 4588 ( -3170 ) + 4589 ( 3180 ) + 4590 ( 3181 ) + 4591 ( 3182 ) + 4592 ( -3183 ) + 4593 ( -3155 ) + 4594 ( -3169 ) + 4595 ( 3184 ) + 4596 ( -3154 ) + 4597 ( 3185 ) + 4598 ( 3186 ) + 4599 ( 3187 ) + 4600 ( -3128 ) + 4601 ( 3188 ) + 4602 ( 3189 ) + 4603 ( 3190 ) + 4604 ( 3191 ) + 4605 ( 3192 ) + 4606 ( 3193 ) + 4607 ( 3194 ) + 4608 ( 3195 ) + 4609 ( 3196 ) + 4610 ( 3197 ) + 4611 ( 3198 ) + 4612 ( -3186 ) + 4613 ( 3199 ) + 4614 ( 3200 ) + 4615 ( 3201 ) + 4616 ( 3202 ) + 4617 ( 3203 ) + 4618 ( 3204 ) + 4619 ( 3205 ) + 4620 ( -3168 ) + 4621 ( -3196 ) + 4622 ( 3206 ) + 4623 ( 3207 ) + 4624 ( 3208 ) + 4625 ( 3209 ) + 4626 ( 3210 ) + 4627 ( 3211 ) + 4628 ( -3205 ) + 4629 ( -3195 ) + 4630 ( 3212 ) + 4631 ( -3176 ) + 4632 ( -3211 ) + 4633 ( -3180 ) + 4634 ( -3194 ) + 4635 ( -3204 ) + 4636 ( 3213 ) + 4637 ( -3202 ) + 4638 ( -3192 ) + 4639 ( -3184 ) + 4640 ( -3209 ) + 4641 ( 3214 ) + 4642 ( 3215 ) + 4643 ( 3216 ) + 4644 ( 3217 ) + 4645 ( 3218 ) + 4646 ( -2931 ) + 4647 ( 3219 ) + 4648 ( 3220 ) + 4649 ( 3221 ) + 4650 ( 3222 ) + 4651 ( -3216 ) + 4652 ( 3223 ) + 4653 ( -3167 ) + 4654 ( 3224 ) + 4655 ( 3225 ) + 4656 ( 3226 ) + 4657 ( 3227 ) + 4658 ( 3228 ) + 4659 ( 3229 ) + 4660 ( 3230 ) + 4661 ( 3231 ) + 4662 ( -3225 ) + 4663 ( 3232 ) + 4664 ( 3233 ) + 4665 ( 3234 ) + 4666 ( 3235 ) + 4667 ( -3236 ) + 4668 ( -3237 ) + 4669 ( -3238 ) + 4670 ( 3239 ) + 4671 ( 3240 ) + 4672 ( 3241 ) + 4673 ( 3242 ) + 4674 ( -3226 ) + 4675 ( 3243 ) + 4676 ( 3244 ) + 4677 ( 3245 ) + 4678 ( 3246 ) + 4679 ( 3247 ) + 4680 ( 3248 ) + 4681 ( 3249 ) + 4682 ( 3250 ) + 4683 ( -3251 ) + 4684 ( 3252 ) + 4685 ( 3253 ) + 4686 ( 3254 ) + 4687 ( -3255 ) + 4688 ( -3244 ) + 4689 ( 3256 ) + 4690 ( -3248 ) + 4691 ( 3257 ) + 4692 ( 3258 ) + 4693 ( 3259 ) + 4694 ( 3260 ) + 4695 ( 3261 ) + 4696 ( 3262 ) + 4697 ( 3263 ) + 4698 ( 3264 ) + 4699 ( 3265 ) + 4700 ( 3266 ) + 4701 ( 3267 ) + 4702 ( 3268 ) + 4703 ( 3269 ) + 4704 ( 3270 ) + 4705 ( 3271 ) + 4706 ( 3272 ) + 4707 ( 3255 ) + 4708 ( 3273 ) + 4709 ( 3274 ) + 4710 ( 3275 ) + 4711 ( 3276 ) + 4712 ( -3268 ) + 4713 ( 3277 ) + 4714 ( 3278 ) + 4715 ( 3236 ) + 4716 ( 3279 ) + 4717 ( 3280 ) + 4718 ( 3281 ) + 4719 ( 3282 ) + 4720 ( 3283 ) + 4721 ( 3284 ) + 4722 ( 3285 ) + 4723 ( 3286 ) + 4724 ( 3287 ) + 4725 ( 3288 ) + 4726 ( 3289 ) + 4727 ( 3290 ) + 4728 ( 3291 ) + 4729 ( 3292 ) + 4730 ( 3293 ) + 4731 ( 3294 ) + 4732 ( 3295 ) + 4733 ( 3296 ) + 4734 ( 3297 ) + 4735 ( 3298 ) + 4736 ( 3299 ) + 4737 ( 3300 ) + 4738 ( 3301 ) + 4739 ( 3302 ) + 4740 ( 3303 ) + 4741 ( 3304 ) + 4742 ( 3305 ) + 4743 ( 3306 ) + 4744 ( 3307 ) + 4745 ( 3308 ) + 4746 ( 3309 ) + 4747 ( 3310 ) + 4748 ( 3311 ) + 4749 ( 3312 ) + 4750 ( 3313 ) + 4751 ( 3314 ) + 4752 ( 3315 ) + 4753 ( 3316 ) + 4754 ( -3300 ) + 4755 ( 3317 ) + 4756 ( 3318 ) + 4757 ( 3319 ) + 4758 ( 3320 ) + 4759 ( 3321 ) + 4760 ( 3322 ) + 4761 ( 3323 ) + 4762 ( 3324 ) + 4763 ( 3325 ) + 4764 ( -3299 ) + 4765 ( 3326 ) + 4766 ( 3327 ) + 4767 ( 3328 ) + 4768 ( 3329 ) + 4769 ( -3330 ) + 4770 ( 3331 ) + 4771 ( 3332 ) + 4772 ( 3333 ) + 4773 ( 3334 ) + 4774 ( -3304 ) + 4775 ( 3335 ) + 4776 ( 3336 ) + 4777 ( 3337 ) + 4778 ( 3338 ) + 4779 ( -3339 ) + 4780 ( -3298 ) + 4781 ( 3340 ) + 4782 ( -3341 ) + 4783 ( -3336 ) + 4784 ( 3342 ) + 4785 ( 3343 ) + 4786 ( -3344 ) + 4787 ( -3345 ) + 4788 ( -3328 ) + 4789 ( 3339 ) + 4790 ( -3306 ) + 4791 ( 3346 ) + 4792 ( 3347 ) + 4793 ( -3348 ) + 4794 ( -3349 ) + 4795 ( -3327 ) + 4796 ( 3341 ) + 4797 ( -3308 ) + 4798 ( 3350 ) + 4799 ( 3351 ) + 4800 ( 3352 ) + 4801 ( 3353 ) + 4802 ( 3354 ) + 4803 ( 3355 ) + 4804 ( 3356 ) + 4805 ( 3357 ) + 4806 ( 3358 ) + 4807 ( 3359 ) + 4808 ( 3360 ) + 4809 ( 3361 ) + 4810 ( 3362 ) + 4811 ( 3363 ) + 4812 ( 3364 ) + 4813 ( 3365 ) + 4814 ( 3366 ) + 4815 ( 3367 ) + 4816 ( 3368 ) + 4817 ( 3369 ) + 4818 ( 3370 ) + 4819 ( 3371 ) + 4820 ( 3372 ) + 4821 ( 3373 ) + 4822 ( 3374 ) + 4823 ( 3375 ) + 4824 ( 3376 ) + 4825 ( 3377 ) + 4826 ( -3378 ) + 4827 ( -3363 ) + 4828 ( 3379 ) + 4829 ( -3281 ) + 4830 ( -3380 ) + 4831 ( 3381 ) + 4832 ( 3382 ) + 4833 ( 3383 ) + 4834 ( 3384 ) + 4835 ( 3385 ) + 4836 ( 3386 ) + 4837 ( -3369 ) + 4838 ( -3290 ) + 4839 ( 3387 ) + 4840 ( 3388 ) + 4841 ( 3389 ) + 4842 ( -3385 ) + 4843 ( 3390 ) + 4844 ( 3391 ) + 4845 ( 3392 ) + 4846 ( 3393 ) + 4847 ( 3394 ) + 4848 ( 3395 ) + 4849 ( 3396 ) + 4850 ( 3397 ) + 4851 ( 3398 ) + 4852 ( 3399 ) + 4853 ( 3400 ) + 4854 ( 3401 ) + 4855 ( 3402 ) + 4856 ( 3403 ) + 4857 ( 3404 ) + 4858 ( 3405 ) + 4859 ( 3406 ) + 4860 ( 3407 ) + 4861 ( 3408 ) + 4862 ( -3392 ) + 4863 ( -3404 ) + 4864 ( 3409 ) + 4865 ( 3410 ) + 4866 ( 3411 ) + 4867 ( 3412 ) + 4868 ( 3413 ) + 4869 ( 3414 ) + 4870 ( 3415 ) + 4871 ( 3416 ) + 4872 ( -3391 ) + 4873 ( -3412 ) + 4874 ( -3405 ) + 4875 ( 3417 ) + 4876 ( 3418 ) + 4877 ( 3419 ) + 4878 ( 3420 ) + 4879 ( 3421 ) + 4880 ( 3422 ) + 4881 ( 3423 ) + 4882 ( 3424 ) + 4883 ( 3425 ) + 4884 ( 3426 ) + 4885 ( 3427 ) + 4886 ( 3428 ) + 4887 ( 3429 ) + 4888 ( 3430 ) + 4889 ( 3431 ) + 4890 ( 3432 ) + 4891 ( 3433 ) + 4892 ( 3434 ) + 4893 ( 3435 ) + 4894 ( 3436 ) + 4895 ( 3437 ) + 4896 ( 3438 ) + 4897 ( 3439 ) + 4898 ( 3440 ) + 4899 ( -3408 ) + 4900 ( -3393 ) + 4901 ( 3441 ) + 4902 ( -3426 ) + 4903 ( 3442 ) + 4904 ( 3443 ) + 4905 ( 3444 ) + 4906 ( 3445 ) + 4907 ( 3446 ) + 4908 ( 3447 ) + 4909 ( 3448 ) + 4910 ( 3449 ) + 4911 ( 3450 ) + 4912 ( 2512 ) + 4913 ( 3451 ) + 4914 ( 3452 ) + 4915 ( 3453 ) + 4916 ( 3454 ) + 4917 ( 3455 ) + 4918 ( 3456 ) + 4919 ( 3457 ) + 4920 ( -3428 ) + 4921 ( -3446 ) + 4922 ( -3402 ) + 4923 ( 3458 ) + 4924 ( 3459 ) + 4925 ( 3460 ) + 4926 ( 3461 ) + 4927 ( 3462 ) + 4928 ( 3463 ) + 4929 ( 3464 ) + 4930 ( -3427 ) + 4931 ( -3394 ) + 4932 ( 3465 ) + 4933 ( 3466 ) + 4934 ( 3467 ) + 4935 ( 3468 ) + 4936 ( 3469 ) + 4937 ( 3470 ) + 4938 ( 3471 ) + 4939 ( 3472 ) + 4940 ( 3473 ) + 4941 ( 3474 ) + 4942 ( 3475 ) + 4943 ( 3476 ) + 4944 ( 3477 ) + 4945 ( 3478 ) + 4946 ( -3441 ) + 4947 ( -3420 ) + 4948 ( 3479 ) + 4949 ( 3480 ) + 4950 ( 3481 ) + 4951 ( 3482 ) + 4952 ( 3483 ) + 4953 ( 3484 ) + 4954 ( 3485 ) + 4955 ( 3486 ) + 4956 ( 3487 ) + 4957 ( 3488 ) + 4958 ( 3489 ) + 4959 ( -3481 ) + 4960 ( 3490 ) + 4961 ( 3491 ) + 4962 ( -3439 ) + 4963 ( 3492 ) + 4964 ( 3493 ) + 4965 ( 3494 ) + 4966 ( -3492 ) + 4967 ( -3488 ) + 4968 ( -3440 ) + 4969 ( 3495 ) + 4970 ( 3496 ) + 4971 ( 3497 ) + 4972 ( -3470 ) + 4973 ( 3498 ) + 4974 ( 3499 ) + 4975 ( 3500 ) + 4976 ( 3501 ) + 4977 ( 3502 ) + 4978 ( 3503 ) + 4979 ( 3504 ) + 4980 ( -3472 ) + 4981 ( -3425 ) + 4982 ( 3505 ) + 4983 ( 3506 ) + 4984 ( 3507 ) + 4985 ( 3508 ) + 4986 ( 3509 ) + 4987 ( 3510 ) + 4988 ( 3511 ) + 4989 ( 3512 ) + 4990 ( -3469 ) + 4991 ( 3513 ) + 4992 ( 3514 ) + 4993 ( -3509 ) + 4994 ( 3515 ) + 4995 ( -3501 ) + 4996 ( 3516 ) + 4997 ( -3468 ) + 4998 ( 3517 ) + 4999 ( -3516 ) + 5000 ( -3511 ) + 5001 ( -3473 ) + 5002 ( -3444 ) + 5003 ( 3518 ) + 5004 ( 3519 ) + 5005 ( -3506 ) + 5006 ( 3520 ) + 5007 ( 3521 ) + 5008 ( 2455 ) + 5009 ( 3522 ) + 5010 ( 3523 ) + 5011 ( 3524 ) + 5012 ( 3525 ) + 5013 ( 3526 ) + 5014 ( 3527 ) + 5015 ( 3528 ) + 5016 ( 2508 ) + 5017 ( 3529 ) + 5018 ( 3530 ) + 5019 ( 3531 ) + 5020 ( -3525 ) + 5021 ( 3532 ) + 5022 ( -3365 ) + 5023 ( 3533 ) + 5024 ( 3534 ) + 5025 ( 3535 ) + 5026 ( 3536 ) + 5027 ( 3537 ) + 5028 ( 3538 ) + 5029 ( -3533 ) + 5030 ( 3539 ) + 5031 ( 3540 ) + 5032 ( 3541 ) + 5033 ( 3542 ) + 5034 ( -3538 ) + 5035 ( 3543 ) + 5036 ( 3544 ) + 5037 ( 3545 ) + 5038 ( 3546 ) + 5039 ( -3467 ) + 5040 ( -3494 ) + 5041 ( -3480 ) + 5042 ( 3547 ) + 5043 ( 3548 ) + 5044 ( -3431 ) + 5045 ( 3549 ) + 5046 ( 3550 ) + 5047 ( 3551 ) + 5048 ( 3552 ) + 5049 ( 3553 ) + 5050 ( -3433 ) + 5051 ( 3554 ) + 5052 ( 3555 ) + 5053 ( 3556 ) + 5054 ( 3557 ) + 5055 ( 3558 ) + 5056 ( 3559 ) + 5057 ( -3551 ) + 5058 ( -3434 ) + 5059 ( 3560 ) + 5060 ( 3561 ) + 5061 ( -3558 ) + 5062 ( 3562 ) + 5063 ( 3563 ) + 5064 ( 3564 ) + 5065 ( 3565 ) + 5066 ( 3566 ) + 5067 ( 3567 ) + 5068 ( 3568 ) + 5069 ( 3569 ) + 5070 ( 3570 ) + 5071 ( 3571 ) + 5072 ( 3572 ) + 5073 ( 3573 ) + 5074 ( 3574 ) + 5075 ( 3575 ) + 5076 ( -3550 ) + 5077 ( -3556 ) + 5078 ( 3576 ) + 5079 ( 3577 ) + 5080 ( 3578 ) + 5081 ( 3579 ) + 5082 ( 3580 ) + 5083 ( -3567 ) + 5084 ( -3561 ) + 5085 ( 3581 ) + 5086 ( 3582 ) + 5087 ( -3565 ) + 5088 ( -3548 ) + 5089 ( 3583 ) + 5090 ( 3584 ) + 5091 ( 3585 ) + 5092 ( 3586 ) + 5093 ( 3587 ) + 5094 ( 3588 ) + 5095 ( 3589 ) + 5096 ( 3590 ) + 5097 ( 3591 ) + 5098 ( 3592 ) + 5099 ( 3593 ) + 5100 ( 3594 ) + 5101 ( -3566 ) + 5102 ( -3586 ) + 5103 ( 3595 ) + 5104 ( 3596 ) + 5105 ( 3597 ) + 5106 ( 3598 ) + 5107 ( 3599 ) + 5108 ( 3600 ) + 5109 ( 3601 ) + 5110 ( 3602 ) + 5111 ( -3598 ) + 5112 ( 3603 ) + 5113 ( 3604 ) + 5114 ( 3605 ) + 5115 ( 3606 ) + 5116 ( 3607 ) + 5117 ( -3284 ) + 5118 ( 3608 ) + 5119 ( 3609 ) + 5120 ( 3610 ) + 5121 ( 3611 ) + 5122 ( 3612 ) + 5123 ( 3613 ) + 5124 ( 3614 ) + 5125 ( 3615 ) + 5126 ( -3603 ) + 5127 ( -3608 ) + 5128 ( 3616 ) + 5129 ( -3601 ) + 5130 ( 3617 ) + 5131 ( 3618 ) + 5132 ( 3619 ) + 5133 ( 3620 ) + 5134 ( -3621 ) + 5135 ( 3621 ) + 5136 ( 3622 ) + 5137 ( 3623 ) + 5138 ( 3624 ) + 5139 ( -3585 ) + 5140 ( 3625 ) + 5141 ( -3571 ) + 5142 ( 3626 ) + 5143 ( 3627 ) + 5144 ( 3628 ) + 5145 ( 3629 ) + 5146 ( 3630 ) + 5147 ( 3631 ) + 5148 ( -3580 ) + 5149 ( -3629 ) + 5150 ( 3632 ) + 5151 ( 3633 ) + 5152 ( 3634 ) + 5153 ( 3635 ) + 5154 ( -3636 ) + 5155 ( 3637 ) + 5156 ( -3638 ) + 5157 ( 3639 ) + 5158 ( -3264 ) + 5159 ( 3640 ) + 5160 ( 3641 ) + 5161 ( 3642 ) + 5162 ( 3643 ) + 5163 ( -3316 ) + 5164 ( 3644 ) + 5165 ( 3645 ) + 5166 ( 3646 ) + 5167 ( 3647 ) + 5168 ( -3648 ) + 5169 ( 3649 ) + 5170 ( -3263 ) + 5171 ( -3650 ) + 5172 ( 3651 ) + 5173 ( 3652 ) + 5174 ( -3653 ) + 5175 ( 3654 ) + 5176 ( -3655 ) + 5177 ( -3639 ) + 5178 ( 3650 ) + 5179 ( -3640 ) + 5180 ( 3656 ) + 5181 ( -3266 ) + 5182 ( 3657 ) + 5183 ( 3658 ) + 5184 ( 3659 ) + 5185 ( 3660 ) + 5186 ( 3661 ) + 5187 ( 3662 ) + 5188 ( -2568 ) + 5189 ( -2499 ) + 5190 ( 3663 ) + 5191 ( 3664 ) + 5192 ( 3665 ) + 5193 ( 3666 ) + 5194 ( 3667 ) + 5195 ( 3668 ) + 5196 ( 3669 ) + 5197 ( 3670 ) + 5198 ( 3671 ) + 5199 ( 3672 ) + 5200 ( 3673 ) + 5201 ( -2900 ) + 5202 ( 3674 ) + 5203 ( 3675 ) + 5204 ( 3676 ) + 5205 ( -3677 ) + 5206 ( 3678 ) + 5207 ( 3679 ) + 5208 ( 3680 ) + 5209 ( 3681 ) + 5210 ( 3682 ) + 5211 ( 3683 ) + 5212 ( 3684 ) + 5213 ( -3674 ) + 5214 ( 3685 ) + 5215 ( 3686 ) + 5216 ( -3687 ) + 5217 ( 3688 ) + 5218 ( 3689 ) + 5219 ( -3681 ) + 5220 ( 3690 ) + 5221 ( -3662 ) + 5222 ( 3691 ) + 5223 ( 3692 ) + 5224 ( -3693 ) + 5225 ( -3297 ) + 5226 ( 3694 ) + 5227 ( 3695 ) + 5228 ( 3696 ) + 5229 ( -3679 ) + 5230 ( -3697 ) + 5231 ( 3698 ) + 5232 ( 3699 ) + 5233 ( -3700 ) + 5234 ( 3701 ) + 5235 ( -3686 ) + 5236 ( -3671 ) + 5237 ( 3702 ) + 5238 ( -3355 ) + 5239 ( 3703 ) + 5240 ( 3704 ) + 5241 ( 3705 ) + 5242 ( 3706 ) + 5243 ( 3707 ) + 5244 ( 3708 ) + 5245 ( 3709 ) + 5246 ( 3710 ) + 5247 ( 3711 ) + 5248 ( -3703 ) + 5249 ( 3712 ) + 5250 ( 3713 ) + 5251 ( 3714 ) + 5252 ( -3715 ) + 5253 ( 3716 ) + 5254 ( -3708 ) + 5255 ( -3661 ) + 5256 ( 3717 ) + 5257 ( 3718 ) + 5258 ( 3719 ) + 5259 ( -2477 ) + 5260 ( -2467 ) + 5261 ( -2500 ) + 5262 ( 3720 ) + 5263 ( 3721 ) + 5264 ( 3722 ) + 5265 ( 3723 ) + 5266 ( 3724 ) + 5267 ( 3725 ) + 5268 ( -2899 ) + 5269 ( -3665 ) + 5270 ( 3726 ) + 5271 ( -3416 ) + 5272 ( -3396 ) + 5273 ( -3458 ) + 5274 ( -3452 ) + 5275 ( -3477 ) + 5276 ( -3424 ) + 5277 ( 3727 ) + 5278 ( 3728 ) + 5279 ( 3729 ) + 5280 ( -3725 ) + 5281 ( 3730 ) + 5282 ( 3731 ) + 5283 ( -3732 ) + 5284 ( -3521 ) + 5285 ( -2442 ) + 5286 ( 3733 ) + 5287 ( 3734 ) + 5288 ( -3403 ) + 5289 ( 3735 ) + 5290 ( 3736 ) + 5291 ( 3737 ) + 5292 ( -3465 ) + 5293 ( -2575 ) + 5294 ( 3738 ) + 5295 ( 3739 ) + 5296 ( -2530 ) + 5297 ( -3409 ) + 5298 ( -3735 ) + 5299 ( 3740 ) + 5300 ( 3741 ) + 5301 ( 3742 ) + 5302 ( -2540 ) + 5303 ( 3743 ) + 5304 ( 3744 ) + 5305 ( 3745 ) + 5306 ( 3746 ) + 5307 ( 3747 ) + 5308 ( 3748 ) + 5309 ( -3741 ) + 5310 ( 3749 ) + 5311 ( -3504 ) + 5312 ( 3750 ) + 5313 ( 3751 ) + 5314 ( 3752 ) + 5315 ( 3753 ) + 5316 ( -2558 ) + 5317 ( -3419 ) + 5318 ( -3754 ) + 5319 ( 3755 ) + 5320 ( 3756 ) + 5321 ( -2556 ) + 5322 ( -3757 ) + 5323 ( 3758 ) + 5324 ( 3759 ) + 5325 ( 3760 ) + 5326 ( 3761 ) + 5327 ( 3762 ) + 5328 ( 3763 ) + 5329 ( 3764 ) + 5330 ( -3750 ) + 5331 ( 3765 ) + 5332 ( 3766 ) + 5333 ( 3767 ) + 5334 ( 3732 ) + 5335 ( 2513 ) + 5336 ( 2454 ) + 5337 ( 3768 ) + 5338 ( 3769 ) + 5339 ( -2443 ) + 5340 ( -2503 ) + 5341 ( -3523 ) + 5342 ( -3529 ) + 5343 ( 2514 ) + 5344 ( -3454 ) + 5345 ( 3770 ) + 5346 ( 3771 ) + 5347 ( 3772 ) + 5348 ( -2465 ) + 5349 ( -3460 ) + 5350 ( -3770 ) + 5351 ( 3773 ) + 5352 ( 3774 ) + 5353 ( 3775 ) + 5354 ( -2475 ) + 5355 ( 3757 ) + 5356 ( 3776 ) + 5357 ( 3777 ) + 5358 ( 3778 ) + 5359 ( -3517 ) + 5360 ( -3513 ) + 5361 ( -3411 ) + 5362 ( -3400 ) + 5363 ( -3775 ) + 5364 ( 3779 ) + 5365 ( -3503 ) + 5366 ( 3780 ) + 5367 ( 3781 ) + 5368 ( 3782 ) + 5369 ( -2487 ) + 5370 ( -3418 ) + 5371 ( -3471 ) + 5372 ( -3415 ) + 5373 ( -3397 ) + 5374 ( -3459 ) + 5375 ( -3453 ) + 5376 ( -3774 ) + 5377 ( -3772 ) + 5378 ( -2476 ) + 5379 ( -2466 ) + 5380 ( -3780 ) + 5381 ( -3478 ) + 5382 ( -3423 ) + 5383 ( -2501 ) + 5384 ( 3783 ) + 5385 ( 3784 ) + 5386 ( 3785 ) + 5387 ( -3722 ) + 5388 ( -3728 ) + 5389 ( 3754 ) + 5390 ( 3786 ) + 5391 ( -3410 ) + 5392 ( -3401 ) + 5393 ( -3742 ) + 5394 ( -3739 ) + 5395 ( -2545 ) + 5396 ( -2538 ) + 5397 ( 3787 ) + 5398 ( -3502 ) + 5399 ( -2557 ) + 5400 ( -3417 ) + 5401 ( -3749 ) + 5402 ( -3779 ) + 5403 ( 3788 ) + 5404 ( -3508 ) + 5405 ( -3777 ) + 5406 ( 3789 ) + 5407 ( -3790 ) + 5408 ( 3791 ) + 5409 ( -3759 ) + 5410 ( -3788 ) + 5411 ( -3776 ) + 5412 ( 3792 ) + 5413 ( -3793 ) + 5414 ( 3794 ) + 5415 ( -3758 ) + 5416 ( -3794 ) + 5417 ( -3791 ) + 5418 ( -3786 ) + 5419 ( -3795 ) + 5420 ( -3778 ) + 5421 ( -3514 ) + 5422 ( -3755 ) + 5423 ( 3796 ) + 5424 ( 3797 ) + 5425 ( -3781 ) + 5426 ( -2561 ) + 5427 ( -2569 ) + 5428 ( -2502 ) + 5429 ( -3721 ) + 5430 ( -3664 ) + 5431 ( -3784 ) + 5432 ( 3798 ) + 5433 ( 3799 ) + 5434 ( -3745 ) + 5435 ( 3800 ) + 5436 ( 3801 ) + 5437 ( -2576 ) + 5438 ( 3802 ) + 5439 ( 3803 ) + 5440 ( 3804 ) + 5441 ( 3805 ) + 5442 ( -3498 ) + 5443 ( 3806 ) + 5444 ( 3807 ) + 5445 ( 3808 ) + 5446 ( -3744 ) + 5447 ( 3809 ) + 5448 ( -3799 ) + 5449 ( -3422 ) + 5450 ( 3810 ) + 5451 ( -3802 ) + 5452 ( 3811 ) + 5453 ( 3812 ) + 5454 ( -3748 ) + 5455 ( 3813 ) + 5456 ( 3814 ) + 5457 ( -2578 ) + 5458 ( -3660 ) + 5459 ( -3761 ) + 5460 ( -3797 ) + 5461 ( 3815 ) + 5462 ( -3796 ) + 5463 ( -3760 ) + 5464 ( -3659 ) + 5465 ( 3816 ) + 5466 ( 3817 ) + 5467 ( 3818 ) + 5468 ( 3819 ) + 5469 ( 3820 ) + 5470 ( 3821 ) + 5471 ( -3747 ) + 5472 ( -3812 ) + 5473 ( -3803 ) + 5474 ( -3815 ) + 5475 ( 3822 ) + 5476 ( 3823 ) + 5477 ( 3824 ) + 5478 ( -3746 ) + 5479 ( -3811 ) + 5480 ( -3818 ) + 5481 ( 3825 ) + 5482 ( -3752 ) + 5483 ( 3826 ) + 5484 ( 3827 ) + 5485 ( 3828 ) + 5486 ( 3829 ) + 5487 ( 3830 ) + 5488 ( 3831 ) + 5489 ( 3832 ) + 5490 ( 3833 ) + 5491 ( 3834 ) + 5492 ( 3835 ) + 5493 ( -3500 ) + 5494 ( 3836 ) + 5495 ( 3837 ) + 5496 ( -3743 ) + 5497 ( -3838 ) + 5498 ( 3839 ) + 5499 ( -3840 ) + 5500 ( -3805 ) + 5501 ( -3833 ) + 5502 ( -3825 ) + 5503 ( 3841 ) + 5504 ( -3819 ) + 5505 ( 3842 ) + 5506 ( 3843 ) + 5507 ( 3844 ) + 5508 ( 3845 ) + 5509 ( 3846 ) + 5510 ( -3828 ) + 5511 ( 3847 ) + 5512 ( -3766 ) + 5513 ( -3820 ) + 5514 ( 3848 ) + 5515 ( 3849 ) + 5516 ( -3845 ) + 5517 ( -3765 ) + 5518 ( 3850 ) + 5519 ( 3851 ) + 5520 ( 3852 ) + 5521 ( 3853 ) + 5522 ( 3854 ) + 5523 ( -3763 ) + 5524 ( 3855 ) + 5525 ( 3856 ) + 5526 ( -3852 ) + 5527 ( 3857 ) + 5528 ( -3762 ) + 5529 ( -3842 ) + 5530 ( 3858 ) + 5531 ( 3859 ) + 5532 ( -3859 ) + 5533 ( -3856 ) + 5534 ( 3860 ) + 5535 ( -3843 ) + 5536 ( -3764 ) + 5537 ( 3861 ) + 5538 ( -3848 ) + 5539 ( 3838 ) + 5540 ( -3807 ) + 5541 ( -3824 ) + 5542 ( -3753 ) + 5543 ( 3862 ) + 5544 ( -3826 ) + 5545 ( 3863 ) + 5546 ( 3840 ) + 5547 ( -3809 ) + 5548 ( -3499 ) + 5549 ( 3864 ) + 5550 ( -3832 ) + 5551 ( 3865 ) + 5552 ( 3866 ) + 5553 ( 3867 ) + 5554 ( 3868 ) + 5555 ( 3869 ) + 5556 ( -2299 ) + 5557 ( 3870 ) + 5558 ( 3871 ) + 5559 ( 3872 ) + 5560 ( 3873 ) + 5561 ( 3874 ) + 5562 ( 3875 ) + 5563 ( -3868 ) + 5564 ( 3876 ) + 5565 ( 3877 ) + 5566 ( 3878 ) + 5567 ( 3879 ) + 5568 ( 3880 ) + 5569 ( 3881 ) + 5570 ( 3882 ) + 5571 ( 3883 ) + 5572 ( 3884 ) + 5573 ( -3879 ) + 5574 ( 3885 ) + 5575 ( 3886 ) + 5576 ( 3887 ) + 5577 ( 3888 ) + 5578 ( -3875 ) + 5579 ( 3889 ) + 5580 ( 3890 ) + 5581 ( 3891 ) + 5582 ( 3892 ) + 5583 ( 3893 ) + 5584 ( 3894 ) + 5585 ( -3885 ) + 5586 ( -3880 ) + 5587 ( 3895 ) + 5588 ( 3896 ) + 5589 ( 3897 ) + 5590 ( -3878 ) + 5591 ( 3898 ) + 5592 ( 3899 ) + 5593 ( -3869 ) + 5594 ( 3900 ) + 5595 ( 3901 ) + 5596 ( 3902 ) + 5597 ( 3903 ) + 5598 ( 3904 ) + 5599 ( 3905 ) + 5600 ( -3906 ) + 5601 ( 3907 ) + 5602 ( -3900 ) + 5603 ( 3908 ) + 5604 ( 3909 ) + 5605 ( 3910 ) + 5606 ( 3911 ) + 5607 ( 3912 ) + 5608 ( 3913 ) + 5609 ( -2338 ) + 5610 ( 3914 ) + 5611 ( 3915 ) + 5612 ( 3916 ) + 5613 ( 3917 ) + 5614 ( 3918 ) + 5615 ( 3919 ) + 5616 ( -3870 ) + 5617 ( 3920 ) + 5618 ( 3921 ) + 5619 ( 3922 ) + 5620 ( 3923 ) + 5621 ( -3913 ) + 5622 ( 3924 ) + 5623 ( 3925 ) + 5624 ( -3897 ) + 5625 ( -3926 ) + 5626 ( 3927 ) + 5627 ( 3928 ) + 5628 ( -3581 ) + 5629 ( -3547 ) + 5630 ( -3929 ) + 5631 ( 3930 ) + 5632 ( 3931 ) + 5633 ( 3932 ) + 5634 ( 3933 ) + 5635 ( -3896 ) + 5636 ( -3923 ) + 5637 ( 3906 ) + 5638 ( 3934 ) + 5639 ( -3892 ) + 5640 ( 3935 ) + 5641 ( 3936 ) + 5642 ( 3937 ) + 5643 ( 3938 ) + 5644 ( -3934 ) + 5645 ( -3932 ) + 5646 ( -3891 ) + 5647 ( 3939 ) + 5648 ( 3940 ) + 5649 ( 3941 ) + 5650 ( -3941 ) + 5651 ( -3938 ) + 5652 ( -3920 ) + 5653 ( 3942 ) + 5654 ( 3943 ) + 5655 ( -3893 ) + 5656 ( -3933 ) + 5657 ( 3944 ) + 5658 ( 3945 ) + 5659 ( -3865 ) + 5660 ( 3946 ) + 5661 ( -2328 ) + 5662 ( -2303 ) + 5663 ( -3874 ) + 5664 ( 3947 ) + 5665 ( 3948 ) + 5666 ( -2320 ) + 5667 ( 3949 ) + 5668 ( -2309 ) + 5669 ( -2315 ) + 5670 ( 3950 ) + 5671 ( 3951 ) + 5672 ( 3952 ) + 5673 ( -3912 ) + 5674 ( -3895 ) + 5675 ( -3922 ) + 5676 ( 3953 ) + 5677 ( 3954 ) + 5678 ( 3955 ) + 5679 ( -3890 ) + 5680 ( 3956 ) + 5681 ( -3927 ) + 5682 ( -3889 ) + 5683 ( 3957 ) + 5684 ( -3944 ) + 5685 ( 3958 ) + 5686 ( -3953 ) + 5687 ( 3959 ) + 5688 ( -3958 ) + 5689 ( -3956 ) + 5690 ( -3952 ) + 5691 ( 3960 ) + 5692 ( -3894 ) + 5693 ( 3961 ) + 5694 ( 3962 ) + 5695 ( 3963 ) + 5696 ( 3964 ) + 5697 ( -3965 ) + 5698 ( -3966 ) + 5699 ( 3967 ) + 5700 ( 3968 ) + 5701 ( 3969 ) + 5702 ( 3970 ) + 5703 ( 3971 ) + 5704 ( 3972 ) + 5705 ( 3973 ) + 5706 ( -3867 ) + 5707 ( -2296 ) + 5708 ( 3974 ) + 5709 ( 3975 ) + 5710 ( 3976 ) + 5711 ( 3977 ) + 5712 ( 3978 ) + 5713 ( 3979 ) + 5714 ( -3973 ) + 5715 ( -3975 ) + 5716 ( 3980 ) + 5717 ( 3981 ) + 5718 ( 3982 ) + 5719 ( -3866 ) + 5720 ( -3972 ) + 5721 ( 3983 ) + 5722 ( 3984 ) + 5723 ( -3978 ) + 5724 ( 3985 ) + 5725 ( 3986 ) + 5726 ( 3987 ) + 5727 ( 3988 ) + 5728 ( 3989 ) + 5729 ( 3990 ) + 5730 ( 3991 ) + 5731 ( 3992 ) + 5732 ( -3984 ) + 5733 ( 3993 ) + 5734 ( -3989 ) + 5735 ( 3994 ) + 5736 ( -3907 ) + 5737 ( 3995 ) + 5738 ( 3996 ) + 5739 ( 3997 ) + 5740 ( -3998 ) + 5741 ( -3999 ) + 5742 ( -4000 ) + 5743 ( -4001 ) + 5744 ( 4002 ) + 5745 ( -4003 ) + 5746 ( -4004 ) + 5747 ( 4005 ) + 5748 ( 4006 ) + 5749 ( -4007 ) + 5750 ( -3964 ) + 5751 ( -3719 ) + 5752 ( -3658 ) + 5753 ( -2897 ) + 5754 ( 4008 ) + 5755 ( -2327 ) + 5756 ( -3918 ) + 5757 ( -4009 ) + 5758 ( -4010 ) + 5759 ( 4011 ) + 5760 ( 4012 ) + 5761 ( 4013 ) + 5762 ( -3963 ) + 5763 ( 4014 ) + 5764 ( 4015 ) + 5765 ( -3909 ) + 5766 ( -4002 ) + 5767 ( -3962 ) + 5768 ( 4016 ) + 5769 ( 4017 ) + 5770 ( -4011 ) + 5771 ( -4016 ) + 5772 ( -4014 ) + 5773 ( -3971 ) + 5774 ( -3910 ) + 5775 ( 4018 ) + 5776 ( 4019 ) + 5777 ( 4020 ) + 5778 ( 4021 ) + 5779 ( 4022 ) + 5780 ( -2302 ) + 5781 ( -3948 ) + 5782 ( 4023 ) + 5783 ( -3950 ) + 5784 ( 4024 ) + 5785 ( 4025 ) + 5786 ( 4026 ) + 5787 ( 4027 ) + 5788 ( -2310 ) + 5789 ( -3951 ) + 5790 ( -4024 ) + 5791 ( 4028 ) + 5792 ( 4029 ) + 5793 ( 4030 ) + 5794 ( -2316 ) + 5795 ( -3949 ) + 5796 ( -4027 ) + 5797 ( 4031 ) + 5798 ( 4032 ) + 5799 ( -4023 ) + 5800 ( -2321 ) + 5801 ( 4033 ) + 5802 ( 4034 ) + 5803 ( -4035 ) + 5804 ( 4036 ) + 5805 ( 4037 ) + 5806 ( -2326 ) + 5807 ( 3926 ) + 5808 ( 4038 ) + 5809 ( -3947 ) + 5810 ( -4030 ) + 5811 ( -3911 ) + 5812 ( -3921 ) + 5813 ( -4038 ) + 5814 ( -2335 ) + 5815 ( -3925 ) + 5816 ( 4039 ) + 5817 ( 4040 ) + 5818 ( 4041 ) + 5819 ( -3916 ) + 5820 ( 4042 ) + 5821 ( 4043 ) + 5822 ( -3726 ) + 5823 ( -3718 ) + 5824 ( -2896 ) + 5825 ( -4044 ) + 5826 ( 4045 ) + 5827 ( -3466 ) + 5828 ( -3493 ) + 5829 ( -3479 ) + 5830 ( -3489 ) + 5831 ( -2325 ) + 5832 ( 4001 ) + 5833 ( -4033 ) + 5834 ( 4046 ) + 5835 ( -3915 ) + 5836 ( -4041 ) + 5837 ( 4047 ) + 5838 ( -4046 ) + 5839 ( -4040 ) + 5840 ( -3914 ) + 5841 ( 4048 ) + 5842 ( 4044 ) + 5843 ( 4035 ) + 5844 ( 3929 ) + 5845 ( -3455 ) + 5846 ( -3447 ) + 5847 ( -3438 ) + 5848 ( -3413 ) + 5849 ( -3406 ) + 5850 ( -3399 ) + 5851 ( -3421 ) + 5852 ( 4049 ) + 5853 ( 4050 ) + 5854 ( 4051 ) + 5855 ( -3727 ) + 5856 ( -3720 ) + 5857 ( -2898 ) + 5858 ( 4052 ) + 5859 ( 4053 ) + 5860 ( 4054 ) + 5861 ( 4055 ) + 5862 ( 4056 ) + 5863 ( 4057 ) + 5864 ( 4058 ) + 5865 ( 3378 ) + 5866 ( -3278 ) + 5867 ( -4059 ) + 5868 ( 4060 ) + 5869 ( 4061 ) + 5870 ( -4062 ) + 5871 ( -4055 ) + 5872 ( 4063 ) + 5873 ( 4064 ) + 5874 ( -4065 ) + 5875 ( -3279 ) + 5876 ( 4066 ) + 5877 ( -4067 ) + 5878 ( -4068 ) + 5879 ( -3357 ) + 5880 ( 4069 ) + 5881 ( 4070 ) + 5882 ( 4071 ) + 5883 ( 4072 ) + 5884 ( 4073 ) + 5885 ( 4074 ) + 5886 ( 3380 ) + 5887 ( 4075 ) + 5888 ( 4076 ) + 5889 ( -4058 ) + 5890 ( 4065 ) + 5891 ( -3285 ) + 5892 ( 4077 ) + 5893 ( 4078 ) + 5894 ( -3362 ) + 5895 ( 4079 ) + 5896 ( 4080 ) + 5897 ( -4081 ) + 5898 ( -4075 ) + 5899 ( 4082 ) + 5900 ( -3383 ) + 5901 ( -3387 ) + 5902 ( 4083 ) + 5903 ( -4077 ) + 5904 ( -4082 ) + 5905 ( -3356 ) + 5906 ( 4084 ) + 5907 ( -4085 ) + 5908 ( 4086 ) + 5909 ( -4069 ) + 5910 ( 4081 ) + 5911 ( 4087 ) + 5912 ( 4088 ) + 5913 ( 4089 ) + 5914 ( 4090 ) + 5915 ( 4091 ) + 5916 ( 4092 ) + 5917 ( 4093 ) + 5918 ( 4094 ) + 5919 ( -4095 ) + 5920 ( 4096 ) + 5921 ( 4097 ) + 5922 ( -4087 ) + 5923 ( 3183 ) + 5924 ( 3178 ) + 5925 ( -3175 ) + 5926 ( -3162 ) + 5927 ( 4098 ) + 5928 ( 3002 ) + 5929 ( -2929 ) + 5930 ( 2518 ) + 5931 ( 4099 ) + 5932 ( 4100 ) + 5933 ( 4101 ) + 5934 ( 4102 ) + 5935 ( 4103 ) + 5936 ( 4104 ) + 5937 ( 4105 ) + 5938 ( 4106 ) + 5939 ( 4107 ) + 5940 ( -3215 ) + 5941 ( -3012 ) + 5942 ( -2995 ) + 5943 ( -2989 ) + 5944 ( -2945 ) + 5945 ( 4108 ) + 5946 ( 4095 ) + 5947 ( 4109 ) + 5948 ( 4110 ) + 5949 ( 4111 ) + 5950 ( 4112 ) + 5951 ( 4113 ) + 5952 ( -4107 ) + 5953 ( 4114 ) + 5954 ( 4115 ) + 5955 ( 4116 ) + 5956 ( 4117 ) + 5957 ( 4118 ) + 5958 ( -4106 ) + 5959 ( 4119 ) + 5960 ( -3221 ) + 5961 ( -4115 ) + 5962 ( 4120 ) + 5963 ( 4121 ) + 5964 ( -4122 ) + 5965 ( 4123 ) + 5966 ( 4124 ) + 5967 ( 4125 ) + 5968 ( -4105 ) + 5969 ( 4126 ) + 5970 ( 4127 ) + 5971 ( 4128 ) + 5972 ( 4129 ) + 5973 ( -4113 ) + 5974 ( -4104 ) + 5975 ( 4130 ) + 5976 ( 4131 ) + 5977 ( 4132 ) + 5978 ( -2930 ) + 5979 ( 4133 ) + 5980 ( 4134 ) + 5981 ( -4101 ) + 5982 ( -4128 ) + 5983 ( 4135 ) + 5984 ( 4136 ) + 5985 ( 4122 ) + 5986 ( 3001 ) + 5987 ( 2526 ) + 5988 ( 4137 ) + 5989 ( 4138 ) + 5990 ( -4100 ) + 5991 ( -2988 ) + 5992 ( 4139 ) + 5993 ( -3165 ) + 5994 ( 4140 ) + 5995 ( -4116 ) + 5996 ( -3220 ) + 5997 ( 4141 ) + 5998 ( 4142 ) + 5999 ( 4143 ) + 6000 ( 4144 ) + 6001 ( 4145 ) + 6002 ( 4146 ) + 6003 ( 4147 ) + 6004 ( -327 ) + 6005 ( -260 ) + 6006 ( 4148 ) + 6007 ( 4149 ) + 6008 ( 4150 ) + 6009 ( -131 ) + 6010 ( -169 ) + 6011 ( -241 ) + 6012 ( -400 ) + 6013 ( -14 ) + 6014 ( -314 ) + 6015 ( 4151 ) + 6016 ( 4152 ) + 6017 ( 4153 ) + 6018 ( 4154 ) + 6019 ( 4155 ) + 6020 ( -259 ) + 6021 ( 4156 ) + 6022 ( 4157 ) + 6023 ( 4158 ) + 6024 ( -181 ) + 6025 ( -240 ) + 6026 ( -4146 ) + 6027 ( -4159 ) + 6028 ( 4160 ) + 6029 ( 4161 ) + 6030 ( 4162 ) + 6031 ( 4163 ) + 6032 ( 4164 ) + 6033 ( -142 ) + 6034 ( -399 ) + 6035 ( 4165 ) + 6036 ( -326 ) + 6037 ( -313 ) + 6038 ( 4166 ) + 6039 ( -13 ) + 6040 ( 4167 ) + 6041 ( 4168 ) + 6042 ( 4169 ) + 6043 ( 4170 ) + 6044 ( -152 ) + 6045 ( -398 ) + 6046 ( -325 ) + 6047 ( -312 ) + 6048 ( 4171 ) + 6049 ( -12 ) + 6050 ( -4145 ) + 6051 ( -4164 ) + 6052 ( 4172 ) + 6053 ( 4173 ) + 6054 ( 4174 ) + 6055 ( 4175 ) + 6056 ( 4176 ) + 6057 ( 4177 ) + 6058 ( 4178 ) + 6059 ( 530 ) + 6060 ( 4179 ) + 6061 ( 4180 ) + 6062 ( 4181 ) + 6063 ( -4 ) + 6064 ( 4182 ) + 6065 ( -496 ) + 6066 ( 4183 ) + 6067 ( 4184 ) + 6068 ( 4185 ) + 6069 ( 4186 ) + 6070 ( -4180 ) + 6071 ( 4187 ) + 6072 ( 4188 ) + 6073 ( -506 ) + 6074 ( -11 ) + 6075 ( -509 ) + 6076 ( 4189 ) + 6077 ( 4190 ) + 6078 ( -508 ) + 6079 ( 4191 ) + 6080 ( -505 ) + 6081 ( -10 ) + 6082 ( -4163 ) + 6083 ( -4187 ) + 6084 ( 4192 ) + 6085 ( 4193 ) + 6086 ( -4194 ) + 6087 ( -4195 ) + 6088 ( -4196 ) + 6089 ( -4197 ) + 6090 ( 4198 ) + 6091 ( -739 ) + 6092 ( -714 ) + 6093 ( -700 ) + 6094 ( -680 ) + 6095 ( 4199 ) + 6096 ( 4200 ) + 6097 ( 4201 ) + 6098 ( -569 ) + 6099 ( -564 ) + 6100 ( -624 ) + 6101 ( -630 ) + 6102 ( -672 ) + 6103 ( -661 ) + 6104 ( -9 ) + 6105 ( -4202 ) + 6106 ( 4203 ) + 6107 ( 4204 ) + 6108 ( 4205 ) + 6109 ( -689 ) + 6110 ( 4206 ) + 6111 ( -671 ) + 6112 ( -738 ) + 6113 ( -8 ) + 6114 ( -4207 ) + 6115 ( -4208 ) + 6116 ( -4181 ) + 6117 ( -694 ) + 6118 ( 4209 ) + 6119 ( -670 ) + 6120 ( -737 ) + 6121 ( -7 ) + 6122 ( -4205 ) + 6123 ( 4210 ) + 6124 ( -697 ) + 6125 ( -736 ) + 6126 ( -669 ) + 6127 ( 4211 ) + 6128 ( -6 ) + 6129 ( -4198 ) + 6130 ( -4204 ) + 6131 ( -4212 ) + 6132 ( 4159 ) + 6133 ( 4213 ) + 6134 ( 4214 ) + 6135 ( 4215 ) + 6136 ( 4216 ) + 6137 ( 4217 ) + 6138 ( 4218 ) + 6139 ( -4155 ) + 6140 ( 4219 ) + 6141 ( 4220 ) + 6142 ( -28 ) + 6143 ( 4221 ) + 6144 ( 4222 ) + 6145 ( 4223 ) + 6146 ( 4224 ) + 6147 ( 4225 ) + 6148 ( -4153 ) + 6149 ( 4226 ) + 6150 ( 4227 ) + 6151 ( 4228 ) + 6152 ( -42 ) + 6153 ( 4229 ) + 6154 ( 4230 ) + 6155 ( 4231 ) + 6156 ( 4232 ) + 6157 ( 4233 ) + 6158 ( -4225 ) + 6159 ( 4234 ) + 6160 ( -43 ) + 6161 ( 4235 ) + 6162 ( -4230 ) + 6163 ( 4236 ) + 6164 ( 4237 ) + 6165 ( -4152 ) + 6166 ( -4224 ) + 6167 ( 4238 ) + 6168 ( -4222 ) + 6169 ( 4239 ) + 6170 ( 4240 ) + 6171 ( 4241 ) + 6172 ( -4238 ) + 6173 ( -4221 ) + 6174 ( 4242 ) + 6175 ( 4243 ) + 6176 ( 4244 ) + 6177 ( 4245 ) + 6178 ( 4246 ) + 6179 ( -4244 ) + 6180 ( -4241 ) + 6181 ( 4247 ) + 6182 ( -4151 ) + 6183 ( -4223 ) + 6184 ( 4248 ) + 6185 ( -4168 ) + 6186 ( -40 ) + 6187 ( 4249 ) + 6188 ( 4250 ) + 6189 ( 4251 ) + 6190 ( 4252 ) + 6191 ( 4253 ) + 6192 ( 4254 ) + 6193 ( -4169 ) + 6194 ( -41 ) + 6195 ( -4250 ) + 6196 ( -4172 ) + 6197 ( 4255 ) + 6198 ( 4256 ) + 6199 ( 4257 ) + 6200 ( -4246 ) + 6201 ( -4254 ) + 6202 ( -4170 ) + 6203 ( -4220 ) + 6204 ( 4258 ) + 6205 ( -5 ) + 6206 ( -4245 ) + 6207 ( 4259 ) + 6208 ( -4249 ) + 6209 ( 4260 ) + 6210 ( 4261 ) + 6211 ( 4262 ) + 6212 ( -4263 ) + 6213 ( 4264 ) + 6214 ( -4174 ) + 6215 ( 4265 ) + 6216 ( 4266 ) + 6217 ( 4267 ) + 6218 ( 4268 ) + 6219 ( 4269 ) + 6220 ( 4270 ) + 6221 ( 4271 ) + 6222 ( 4272 ) + 6223 ( 4273 ) + 6224 ( 4274 ) + 6225 ( 4275 ) + 6226 ( 4276 ) + 6227 ( -4277 ) + 6228 ( 4278 ) + 6229 ( 4279 ) + 6230 ( -4280 ) + 6231 ( -1 ) + 6232 ( 4207 ) + 6233 ( 4281 ) + 6234 ( 4282 ) + 6235 ( 4283 ) + 6236 ( 4284 ) + 6237 ( 4285 ) + 6238 ( 4286 ) + 6239 ( 4287 ) + 6240 ( 4288 ) + 6241 ( -4270 ) + 6242 ( 4289 ) + 6243 ( 4290 ) + 6244 ( 4291 ) + 6245 ( 4292 ) + 6246 ( 4293 ) + 6247 ( 4294 ) + 6248 ( 4295 ) + 6249 ( 4296 ) + 6250 ( -4268 ) + 6251 ( -4286 ) + 6252 ( 4297 ) + 6253 ( 4298 ) + 6254 ( -4299 ) + 6255 ( 4300 ) + 6256 ( 4301 ) + 6257 ( 4302 ) + 6258 ( 4303 ) + 6259 ( 4304 ) + 6260 ( 4305 ) + 6261 ( 4306 ) + 6262 ( 4307 ) + 6263 ( 4308 ) + 6264 ( 4309 ) + 6265 ( -4309 ) + 6266 ( 4310 ) + 6267 ( 4311 ) + 6268 ( 4312 ) + 6269 ( 4313 ) + 6270 ( 4314 ) + 6271 ( 4315 ) + 6272 ( 4316 ) + 6273 ( 4317 ) + 6274 ( 4318 ) + 6275 ( 4319 ) + 6276 ( 4320 ) + 6277 ( 4321 ) + 6278 ( 4322 ) + 6279 ( 4323 ) + 6280 ( 4324 ) + 6281 ( 4325 ) + 6282 ( 4326 ) + 6283 ( 4327 ) + 6284 ( -4316 ) + 6285 ( -4319 ) + 6286 ( 4328 ) + 6287 ( 4329 ) + 6288 ( 4330 ) + 6289 ( 4331 ) + 6290 ( 4332 ) + 6291 ( 4333 ) + 6292 ( 4334 ) + 6293 ( 4335 ) + 6294 ( 4336 ) + 6295 ( 4337 ) + 6296 ( 4338 ) + 6297 ( 4339 ) + 6298 ( 4340 ) + 6299 ( 4341 ) + 6300 ( 4342 ) + 6301 ( 4343 ) + 6302 ( 4344 ) + 6303 ( 4345 ) + 6304 ( 4346 ) + 6305 ( -4339 ) + 6306 ( 4347 ) + 6307 ( 4348 ) + 6308 ( 4349 ) + 6309 ( 4350 ) + 6310 ( 4351 ) + 6311 ( -4323 ) + 6312 ( -4345 ) + 6313 ( 4352 ) + 6314 ( 4353 ) + 6315 ( 4354 ) + 6316 ( 4355 ) + 6317 ( 4356 ) + 6318 ( -4336 ) + 6319 ( 4357 ) + 6320 ( -4358 ) + 6321 ( 4359 ) + 6322 ( -4360 ) + 6323 ( 4361 ) + 6324 ( 4362 ) + 6325 ( 4363 ) + 6326 ( 4364 ) + 6327 ( -4365 ) + 6328 ( -4160 ) + 6329 ( 4366 ) + 6330 ( -4215 ) + 6331 ( 4367 ) + 6332 ( 4368 ) + 6333 ( 4369 ) + 6334 ( -4366 ) + 6335 ( 4370 ) + 6336 ( -4353 ) + 6337 ( 4371 ) + 6338 ( 4372 ) + 6339 ( 4373 ) + 6340 ( 4374 ) + 6341 ( 4375 ) + 6342 ( 4376 ) + 6343 ( 4377 ) + 6344 ( 4378 ) + 6345 ( 4379 ) + 6346 ( 4380 ) + 6347 ( 4381 ) + 6348 ( 4382 ) + 6349 ( 4383 ) + 6350 ( 4384 ) + 6351 ( 4385 ) + 6352 ( 4386 ) + 6353 ( 4387 ) + 6354 ( 4388 ) + 6355 ( 4389 ) + 6356 ( 4390 ) + 6357 ( 4391 ) + 6358 ( 4392 ) + 6359 ( 4393 ) + 6360 ( 4394 ) + 6361 ( 4395 ) + 6362 ( 4396 ) + 6363 ( -4392 ) + 6364 ( 4397 ) + 6365 ( 4398 ) + 6366 ( 4399 ) + 6367 ( 4400 ) + 6368 ( 4401 ) + 6369 ( 4402 ) + 6370 ( 4403 ) + 6371 ( -4390 ) + 6372 ( 4404 ) + 6373 ( 4405 ) + 6374 ( 4406 ) + 6375 ( 4407 ) + 6376 ( 4408 ) + 6377 ( -4386 ) + 6378 ( 4409 ) + 6379 ( 4410 ) + 6380 ( 4411 ) + 6381 ( 4412 ) + 6382 ( -4385 ) + 6383 ( 4413 ) + 6384 ( 4414 ) + 6385 ( 4415 ) + 6386 ( 4416 ) + 6387 ( -4383 ) + 6388 ( 4417 ) + 6389 ( 4418 ) + 6390 ( 4419 ) + 6391 ( 4420 ) + 6392 ( 4421 ) + 6393 ( 4422 ) + 6394 ( -4380 ) + 6395 ( -4313 ) + 6396 ( 4423 ) + 6397 ( 4424 ) + 6398 ( 4425 ) + 6399 ( 4426 ) + 6400 ( 4427 ) + 6401 ( 4428 ) + 6402 ( 4429 ) + 6403 ( 4430 ) + 6404 ( 4431 ) + 6405 ( 4432 ) + 6406 ( 4433 ) + 6407 ( -4430 ) + 6408 ( -4378 ) + 6409 ( 4434 ) + 6410 ( 4435 ) + 6411 ( 4436 ) + 6412 ( 4437 ) + 6413 ( 4438 ) + 6414 ( -4428 ) + 6415 ( 4439 ) + 6416 ( -4328 ) + 6417 ( 4440 ) + 6418 ( 4263 ) + 6419 ( 4441 ) + 6420 ( 4442 ) + 6421 ( 4443 ) + 6422 ( 4444 ) + 6423 ( -4426 ) + 6424 ( 4445 ) + 6425 ( 4446 ) + 6426 ( 4447 ) + 6427 ( 4448 ) + 6428 ( -4424 ) + 6429 ( -4441 ) + 6430 ( 4449 ) + 6431 ( 4450 ) + 6432 ( 4451 ) + 6433 ( -4264 ) + 6434 ( 4452 ) + 6435 ( 4453 ) + 6436 ( 4454 ) + 6437 ( -4455 ) + 6438 ( 4456 ) + 6439 ( -4451 ) + 6440 ( 4457 ) + 6441 ( -4446 ) + 6442 ( 4458 ) + 6443 ( 4459 ) + 6444 ( 4460 ) + 6445 ( 4461 ) + 6446 ( 4462 ) + 6447 ( -4452 ) + 6448 ( 4463 ) + 6449 ( 4464 ) + 6450 ( -4465 ) + 6451 ( -4461 ) + 6452 ( 4466 ) + 6453 ( 4467 ) + 6454 ( 4468 ) + 6455 ( 4299 ) + 6456 ( 4469 ) + 6457 ( 4470 ) + 6458 ( 4471 ) + 6459 ( 4472 ) + 6460 ( 4473 ) + 6461 ( 4474 ) + 6462 ( 4475 ) + 6463 ( -4476 ) + 6464 ( -4278 ) + 6465 ( 4477 ) + 6466 ( -3 ) + 6467 ( 4208 ) + 6468 ( -4179 ) + 6469 ( -4478 ) + 6470 ( -4479 ) + 6471 ( -4480 ) + 6472 ( -4257 ) + 6473 ( -4228 ) + 6474 ( -4248 ) + 6475 ( -4219 ) + 6476 ( -4162 ) + 6477 ( -4186 ) + 6478 ( -4190 ) + 6479 ( -4305 ) + 6480 ( 4481 ) + 6481 ( 4482 ) + 6482 ( 4483 ) + 6483 ( 4484 ) + 6484 ( 4485 ) + 6485 ( 4486 ) + 6486 ( 4487 ) + 6487 ( 4488 ) + 6488 ( -4373 ) + 6489 ( 4489 ) + 6490 ( 4490 ) + 6491 ( 4491 ) + 6492 ( 4492 ) + 6493 ( 4493 ) + 6494 ( 4494 ) + 6495 ( -4300 ) + 6496 ( -4470 ) + 6497 ( 4495 ) + 6498 ( -4496 ) + 6499 ( 4497 ) + 6500 ( 4498 ) + 6501 ( 4499 ) + 6502 ( 4500 ) + 6503 ( -4491 ) + 6504 ( 4501 ) + 6505 ( -4283 ) + 6506 ( -4501 ) + 6507 ( 4502 ) + 6508 ( -4285 ) + 6509 ( 4503 ) + 6510 ( -4295 ) + 6511 ( -4494 ) + 6512 ( 4504 ) + 6513 ( -4505 ) + 6514 ( 4506 ) + 6515 ( 4507 ) + 6516 ( -4508 ) + 6517 ( -4492 ) + 6518 ( 4509 ) + 6519 ( -4468 ) + 6520 ( -4294 ) + 6521 ( 4510 ) + 6522 ( 4511 ) + 6523 ( -4284 ) + 6524 ( -4293 ) + 6525 ( -4502 ) + 6526 ( -4509 ) + 6527 ( 4512 ) + 6528 ( 4496 ) + 6529 ( 4505 ) + 6530 ( 4513 ) + 6531 ( 4514 ) + 6532 ( -4469 ) + 6533 ( 4515 ) + 6534 ( 4516 ) + 6535 ( -4493 ) + 6536 ( 4517 ) + 6537 ( -4499 ) + 6538 ( 4518 ) + 6539 ( 4519 ) + 6540 ( 4520 ) + 6541 ( -4288 ) + 6542 ( 4521 ) + 6543 ( 4522 ) + 6544 ( -4269 ) + 6545 ( 4523 ) + 6546 ( 4524 ) + 6547 ( 4525 ) + 6548 ( 4526 ) + 6549 ( -4287 ) + 6550 ( -4520 ) + 6551 ( 4527 ) + 6552 ( 4528 ) + 6553 ( 4529 ) + 6554 ( -4267 ) + 6555 ( 4530 ) + 6556 ( -4524 ) + 6557 ( -4519 ) + 6558 ( 4531 ) + 6559 ( 4532 ) + 6560 ( -4467 ) + 6561 ( 4533 ) + 6562 ( 4534 ) + 6563 ( 4508 ) + 6564 ( -4514 ) + 6565 ( 4535 ) + 6566 ( 4536 ) + 6567 ( 4537 ) + 6568 ( 4538 ) + 6569 ( 4539 ) + 6570 ( 4540 ) + 6571 ( 4541 ) + 6572 ( 4542 ) + 6573 ( 4543 ) + 6574 ( 4544 ) + 6575 ( 4545 ) + 6576 ( 4202 ) + 6577 ( 4546 ) + 6578 ( 4547 ) + 6579 ( 4548 ) + 6580 ( 4549 ) + 6581 ( 4550 ) + 6582 ( 4551 ) + 6583 ( 4552 ) + 6584 ( 4553 ) + 6585 ( 4554 ) + 6586 ( 4555 ) + 6587 ( -4556 ) + 6588 ( 4557 ) + 6589 ( 4558 ) + 6590 ( -4545 ) + 6591 ( 4559 ) + 6592 ( 4197 ) + 6593 ( -30 ) + 6594 ( 4560 ) + 6595 ( 4561 ) + 6596 ( 4562 ) + 6597 ( 4563 ) + 6598 ( 4564 ) + 6599 ( -4544 ) + 6600 ( 4565 ) + 6601 ( 4566 ) + 6602 ( 4196 ) + 6603 ( -4557 ) + 6604 ( -31 ) + 6605 ( 4567 ) + 6606 ( 4568 ) + 6607 ( 4569 ) + 6608 ( 4570 ) + 6609 ( -47 ) + 6610 ( 4571 ) + 6611 ( 4572 ) + 6612 ( 4573 ) + 6613 ( 4574 ) + 6614 ( 4575 ) + 6615 ( -48 ) + 6616 ( -4571 ) + 6617 ( 4576 ) + 6618 ( 4577 ) + 6619 ( 4578 ) + 6620 ( 4579 ) + 6621 ( -46 ) + 6622 ( -4579 ) + 6623 ( -4575 ) + 6624 ( -4569 ) + 6625 ( 4580 ) + 6626 ( 4581 ) + 6627 ( 4582 ) + 6628 ( -45 ) + 6629 ( -4572 ) + 6630 ( -4582 ) + 6631 ( -4560 ) + 6632 ( 4583 ) + 6633 ( -4570 ) + 6634 ( 4584 ) + 6635 ( -44 ) + 6636 ( -4578 ) + 6637 ( -4574 ) + 6638 ( -4584 ) + 6639 ( 4585 ) + 6640 ( 4586 ) + 6641 ( -4561 ) + 6642 ( 4587 ) + 6643 ( 4588 ) + 6644 ( -4589 ) + 6645 ( 4590 ) + 6646 ( -4543 ) + 6647 ( -4564 ) + 6648 ( -32 ) + 6649 ( -4576 ) + 6650 ( -4581 ) + 6651 ( -4587 ) + 6652 ( 4591 ) + 6653 ( 4592 ) + 6654 ( -4542 ) + 6655 ( 4593 ) + 6656 ( 4594 ) + 6657 ( 4595 ) + 6658 ( 4556 ) + 6659 ( 4589 ) + 6660 ( -29 ) + 6661 ( 4596 ) + 6662 ( -4585 ) + 6663 ( -4597 ) + 6664 ( 4598 ) + 6665 ( -4541 ) + 6666 ( 4195 ) + 6667 ( -4563 ) + 6668 ( -33 ) + 6669 ( 4599 ) + 6670 ( 4600 ) + 6671 ( 4601 ) + 6672 ( -52 ) + 6673 ( 4602 ) + 6674 ( 4603 ) + 6675 ( 4604 ) + 6676 ( 4605 ) + 6677 ( 4606 ) + 6678 ( -53 ) + 6679 ( -4602 ) + 6680 ( -4599 ) + 6681 ( 4607 ) + 6682 ( 4608 ) + 6683 ( 4609 ) + 6684 ( -51 ) + 6685 ( -4609 ) + 6686 ( -4606 ) + 6687 ( -4567 ) + 6688 ( 4610 ) + 6689 ( -4600 ) + 6690 ( 4611 ) + 6691 ( -50 ) + 6692 ( -4603 ) + 6693 ( -4611 ) + 6694 ( 4612 ) + 6695 ( 4613 ) + 6696 ( -4568 ) + 6697 ( 4614 ) + 6698 ( -49 ) + 6699 ( -4608 ) + 6700 ( -4605 ) + 6701 ( -4614 ) + 6702 ( 4615 ) + 6703 ( -4601 ) + 6704 ( 4616 ) + 6705 ( 4617 ) + 6706 ( -4618 ) + 6707 ( -4619 ) + 6708 ( -4620 ) + 6709 ( 4621 ) + 6710 ( -4540 ) + 6711 ( 4622 ) + 6712 ( -4562 ) + 6713 ( -4588 ) + 6714 ( -4591 ) + 6715 ( -34 ) + 6716 ( 4623 ) + 6717 ( 4624 ) + 6718 ( 4625 ) + 6719 ( -4612 ) + 6720 ( -4616 ) + 6721 ( -56 ) + 6722 ( 4626 ) + 6723 ( 4627 ) + 6724 ( 4628 ) + 6725 ( 4629 ) + 6726 ( 4630 ) + 6727 ( -57 ) + 6728 ( -4626 ) + 6729 ( 4631 ) + 6730 ( 4632 ) + 6731 ( -4623 ) + 6732 ( 4633 ) + 6733 ( -55 ) + 6734 ( -4633 ) + 6735 ( -4630 ) + 6736 ( -4624 ) + 6737 ( -4596 ) + 6738 ( 4634 ) + 6739 ( 4635 ) + 6740 ( -54 ) + 6741 ( -4631 ) + 6742 ( -4627 ) + 6743 ( 4636 ) + 6744 ( 4637 ) + 6745 ( -4625 ) + 6746 ( 4638 ) + 6747 ( 4639 ) + 6748 ( 4640 ) + 6749 ( 4641 ) + 6750 ( 4642 ) + 6751 ( -4539 ) + 6752 ( 4643 ) + 6753 ( 4644 ) + 6754 ( 4645 ) + 6755 ( 4646 ) + 6756 ( 4647 ) + 6757 ( 4194 ) + 6758 ( 4597 ) + 6759 ( 4620 ) + 6760 ( -35 ) + 6761 ( 4648 ) + 6762 ( -4617 ) + 6763 ( -4649 ) + 6764 ( 4650 ) + 6765 ( -4538 ) + 6766 ( 4619 ) + 6767 ( -4642 ) + 6768 ( -38 ) + 6769 ( 4651 ) + 6770 ( 4652 ) + 6771 ( 4653 ) + 6772 ( -61 ) + 6773 ( 4654 ) + 6774 ( 4655 ) + 6775 ( 4656 ) + 6776 ( 4657 ) + 6777 ( 4658 ) + 6778 ( -62 ) + 6779 ( -4654 ) + 6780 ( -4651 ) + 6781 ( 4659 ) + 6782 ( 4660 ) + 6783 ( 4661 ) + 6784 ( -60 ) + 6785 ( -4661 ) + 6786 ( -4658 ) + 6787 ( 4662 ) + 6788 ( 4663 ) + 6789 ( -4652 ) + 6790 ( 4664 ) + 6791 ( -59 ) + 6792 ( -4655 ) + 6793 ( -4664 ) + 6794 ( 4665 ) + 6795 ( 4666 ) + 6796 ( 4667 ) + 6797 ( 4668 ) + 6798 ( -58 ) + 6799 ( -4660 ) + 6800 ( -4657 ) + 6801 ( -4668 ) + 6802 ( -4648 ) + 6803 ( 4669 ) + 6804 ( 4670 ) + 6805 ( -4653 ) + 6806 ( -4671 ) + 6807 ( 4672 ) + 6808 ( -4537 ) + 6809 ( 4673 ) + 6810 ( 4674 ) + 6811 ( 4618 ) + 6812 ( 4649 ) + 6813 ( -37 ) + 6814 ( -4662 ) + 6815 ( -4667 ) + 6816 ( -4638 ) + 6817 ( -4536 ) + 6818 ( 4675 ) + 6819 ( 4676 ) + 6820 ( 4677 ) + 6821 ( 4678 ) + 6822 ( 4679 ) + 6823 ( -4641 ) + 6824 ( 4671 ) + 6825 ( -36 ) + 6826 ( -4665 ) + 6827 ( -4670 ) + 6828 ( 4680 ) + 6829 ( -4535 ) + 6830 ( 4681 ) + 6831 ( -4193 ) + 6832 ( -4640 ) + 6833 ( 4212 ) + 6834 ( -39 ) + 6835 ( 4280 ) + 6836 ( 4682 ) + 6837 ( -2 ) + 6838 ( -4203 ) + 6839 ( -4210 ) + 6840 ( -4639 ) + 6841 ( -4679 ) + 6842 ( 4683 ) + 6843 ( 4684 ) + 6844 ( -4678 ) + 6845 ( -4647 ) + 6846 ( 4685 ) + 6847 ( 4686 ) + 6848 ( 4687 ) + 6849 ( 4688 ) + 6850 ( 4689 ) + 6851 ( 4690 ) + 6852 ( 4691 ) + 6853 ( -4547 ) + 6854 ( -4692 ) + 6855 ( 4693 ) + 6856 ( 4694 ) + 6857 ( 4695 ) + 6858 ( 4696 ) + 6859 ( -4531 ) + 6860 ( -4687 ) + 6861 ( 4697 ) + 6862 ( -4513 ) + 6863 ( -4684 ) + 6864 ( 4698 ) + 6865 ( 4699 ) + 6866 ( -4517 ) + 6867 ( -4523 ) + 6868 ( 4700 ) + 6869 ( -4512 ) + 6870 ( -4693 ) + 6871 ( -4504 ) + 6872 ( -4500 ) + 6873 ( -4701 ) + 6874 ( -4702 ) + 6875 ( 4703 ) + 6876 ( 4704 ) + 6877 ( 4705 ) + 6878 ( -4527 ) + 6879 ( -4700 ) + 6880 ( -4518 ) + 6881 ( 4706 ) + 6882 ( -4688 ) + 6883 ( 4707 ) + 6884 ( 4708 ) + 6885 ( 4709 ) + 6886 ( -4546 ) + 6887 ( 4710 ) + 6888 ( -4686 ) + 6889 ( 4711 ) + 6890 ( 4712 ) + 6891 ( 4713 ) + 6892 ( 4714 ) + 6893 ( 4715 ) + 6894 ( 4692 ) + 6895 ( 4702 ) + 6896 ( -4707 ) + 6897 ( -4685 ) + 6898 ( 4716 ) + 6899 ( 4717 ) + 6900 ( 4718 ) + 6901 ( 4719 ) + 6902 ( 4720 ) + 6903 ( 4721 ) + 6904 ( 4722 ) + 6905 ( 4723 ) + 6906 ( 4724 ) + 6907 ( 4725 ) + 6908 ( 4726 ) + 6909 ( 4727 ) + 6910 ( 4277 ) + 6911 ( 4728 ) + 6912 ( 4729 ) + 6913 ( 4730 ) + 6914 ( 4731 ) + 6915 ( 4732 ) + 6916 ( 4733 ) + 6917 ( 4734 ) + 6918 ( 1187 ) + 6919 ( 4478 ) + 6920 ( 1420 ) + 6921 ( -27 ) + 6922 ( 4735 ) + 6923 ( 4736 ) + 6924 ( 4737 ) + 6925 ( 4738 ) + 6926 ( 4739 ) + 6927 ( 4740 ) + 6928 ( 4741 ) + 6929 ( 4742 ) + 6930 ( 4743 ) + 6931 ( 4744 ) + 6932 ( 4745 ) + 6933 ( 4746 ) + 6934 ( 4747 ) + 6935 ( 4748 ) + 6936 ( 4749 ) + 6937 ( 4750 ) + 6938 ( 4751 ) + 6939 ( 4752 ) + 6940 ( -786 ) + 6941 ( -804 ) + 6942 ( 4753 ) + 6943 ( 4754 ) + 6944 ( 4755 ) + 6945 ( 4756 ) + 6946 ( 4757 ) + 6947 ( 4758 ) + 6948 ( 4759 ) + 6949 ( 4760 ) + 6950 ( 4761 ) + 6951 ( 4762 ) + 6952 ( 4763 ) + 6953 ( 4764 ) + 6954 ( 4765 ) + 6955 ( 4766 ) + 6956 ( -1309 ) + 6957 ( -2136 ) + 6958 ( 4767 ) + 6959 ( 4768 ) + 6960 ( 4769 ) + 6961 ( 4770 ) + 6962 ( 4771 ) + 6963 ( 4772 ) + 6964 ( 4773 ) + 6965 ( 4774 ) + 6966 ( 4775 ) + 6967 ( 4776 ) + 6968 ( 4777 ) + 6969 ( -4770 ) + 6970 ( 4778 ) + 6971 ( 4779 ) + 6972 ( -4757 ) + 6973 ( -4771 ) + 6974 ( 4780 ) + 6975 ( -1308 ) + 6976 ( 4781 ) + 6977 ( 4782 ) + 6978 ( -1299 ) + 6979 ( 1213 ) + 6980 ( 4783 ) + 6981 ( 4784 ) + 6982 ( 4785 ) + 6983 ( 4786 ) + 6984 ( 4787 ) + 6985 ( -4783 ) + 6986 ( -4772 ) + 6987 ( 4788 ) + 6988 ( 4789 ) + 6989 ( 4790 ) + 6990 ( 4791 ) + 6991 ( -4791 ) + 6992 ( -4787 ) + 6993 ( 4792 ) + 6994 ( 4793 ) + 6995 ( -4773 ) + 6996 ( -4781 ) + 6997 ( -1325 ) + 6998 ( -4758 ) + 6999 ( 4794 ) + 7000 ( 4795 ) + 7001 ( 4796 ) + 7002 ( 4797 ) + 7003 ( 4798 ) + 7004 ( 4799 ) + 7005 ( 4800 ) + 7006 ( 4801 ) + 7007 ( -4760 ) + 7008 ( -1293 ) + 7009 ( 1209 ) + 7010 ( -4789 ) + 7011 ( -4785 ) + 7012 ( -4792 ) + 7013 ( -1327 ) + 7014 ( -4782 ) + 7015 ( -1324 ) + 7016 ( 4802 ) + 7017 ( 4803 ) + 7018 ( 4804 ) + 7019 ( 4805 ) + 7020 ( 4806 ) + 7021 ( -4776 ) + 7022 ( -4761 ) + 7023 ( 4807 ) + 7024 ( 4808 ) + 7025 ( 4809 ) + 7026 ( -4806 ) + 7027 ( -4799 ) + 7028 ( 4810 ) + 7029 ( 4811 ) + 7030 ( 4812 ) + 7031 ( 4813 ) + 7032 ( 4814 ) + 7033 ( 4815 ) + 7034 ( 4816 ) + 7035 ( 4817 ) + 7036 ( 4818 ) + 7037 ( 4819 ) + 7038 ( 4820 ) + 7039 ( 4821 ) + 7040 ( 4822 ) + 7041 ( 4823 ) + 7042 ( 4824 ) + 7043 ( 4825 ) + 7044 ( 4826 ) + 7045 ( -4818 ) + 7046 ( 4827 ) + 7047 ( 4828 ) + 7048 ( 4829 ) + 7049 ( -4812 ) + 7050 ( 4830 ) + 7051 ( -1162 ) + 7052 ( 4831 ) + 7053 ( 4832 ) + 7054 ( 4833 ) + 7055 ( 4834 ) + 7056 ( 4835 ) + 7057 ( -1196 ) + 7058 ( 4836 ) + 7059 ( 4837 ) + 7060 ( 1202 ) + 7061 ( 4838 ) + 7062 ( 4839 ) + 7063 ( -4835 ) + 7064 ( 4840 ) + 7065 ( 4841 ) + 7066 ( 4842 ) + 7067 ( 4843 ) + 7068 ( 4844 ) + 7069 ( 4845 ) + 7070 ( 4846 ) + 7071 ( 4847 ) + 7072 ( -4811 ) + 7073 ( -4840 ) + 7074 ( 4848 ) + 7075 ( 4849 ) + 7076 ( 4850 ) + 7077 ( 4851 ) + 7078 ( 4852 ) + 7079 ( -4817 ) + 7080 ( 4853 ) + 7081 ( 4854 ) + 7082 ( -4832 ) + 7083 ( -1163 ) + 7084 ( 4855 ) + 7085 ( 4856 ) + 7086 ( 4857 ) + 7087 ( 4858 ) + 7088 ( 4859 ) + 7089 ( 4860 ) + 7090 ( 4861 ) + 7091 ( 4862 ) + 7092 ( -4833 ) + 7093 ( 4863 ) + 7094 ( 4864 ) + 7095 ( 4865 ) + 7096 ( 4866 ) + 7097 ( -4862 ) + 7098 ( -1165 ) + 7099 ( 4867 ) + 7100 ( -4821 ) + 7101 ( 4868 ) + 7102 ( 4869 ) + 7103 ( 4870 ) + 7104 ( 4871 ) + 7105 ( 4872 ) + 7106 ( 4873 ) + 7107 ( 4874 ) + 7108 ( 4875 ) + 7109 ( -4763 ) + 7110 ( -2207 ) + 7111 ( 1430 ) + 7112 ( 1419 ) + 7113 ( -1319 ) + 7114 ( -1292 ) + 7115 ( 4876 ) + 7116 ( -1328 ) + 7117 ( 4877 ) + 7118 ( 4878 ) + 7119 ( 4879 ) + 7120 ( 4880 ) + 7121 ( 4881 ) + 7122 ( 4882 ) + 7123 ( 4883 ) + 7124 ( -2172 ) + 7125 ( -2219 ) + 7126 ( -2229 ) + 7127 ( -4751 ) + 7128 ( -4797 ) + 7129 ( -4802 ) + 7130 ( -4808 ) + 7131 ( 4884 ) + 7132 ( 4885 ) + 7133 ( -4886 ) + 7134 ( 4887 ) + 7135 ( -1414 ) + 7136 ( -1422 ) + 7137 ( 1427 ) + 7138 ( -4876 ) + 7139 ( 4888 ) + 7140 ( 4889 ) + 7141 ( 4890 ) + 7142 ( 4891 ) + 7143 ( 4892 ) + 7144 ( -4796 ) + 7145 ( -4882 ) + 7146 ( 4893 ) + 7147 ( -4892 ) + 7148 ( -4881 ) + 7149 ( -4807 ) + 7150 ( 4894 ) + 7151 ( 4895 ) + 7152 ( 4886 ) + 7153 ( 1429 ) + 7154 ( 1417 ) + 7155 ( 4896 ) + 7156 ( -4880 ) + 7157 ( 4897 ) + 7158 ( 4898 ) + 7159 ( -1558 ) + 7160 ( -1365 ) + 7161 ( 4899 ) + 7162 ( 4900 ) + 7163 ( 4901 ) + 7164 ( 4902 ) + 7165 ( 4903 ) + 7166 ( 4904 ) + 7167 ( -1646 ) + 7168 ( -1672 ) + 7169 ( 4905 ) + 7170 ( -4780 ) + 7171 ( -2138 ) + 7172 ( -1315 ) + 7173 ( 4906 ) + 7174 ( -4903 ) + 7175 ( -4769 ) + 7176 ( 4907 ) + 7177 ( 4908 ) + 7178 ( 4909 ) + 7179 ( 4910 ) + 7180 ( 4911 ) + 7181 ( 4912 ) + 7182 ( 4913 ) + 7183 ( 4914 ) + 7184 ( -4768 ) + 7185 ( -4774 ) + 7186 ( -4901 ) + 7187 ( -4906 ) + 7188 ( -4915 ) + 7189 ( 4916 ) + 7190 ( 4917 ) + 7191 ( 4918 ) + 7192 ( -4919 ) + 7193 ( -4920 ) + 7194 ( 4921 ) + 7195 ( 4922 ) + 7196 ( 4923 ) + 7197 ( -4924 ) + 7198 ( -4767 ) + 7199 ( -4913 ) + 7200 ( 4925 ) + 7201 ( 4926 ) + 7202 ( 4927 ) + 7203 ( 4928 ) + 7204 ( 4929 ) + 7205 ( 4930 ) + 7206 ( 4931 ) + 7207 ( -4932 ) + 7208 ( -4933 ) + 7209 ( 4934 ) + 7210 ( 4935 ) + 7211 ( 4936 ) + 7212 ( -4930 ) + 7213 ( 4937 ) + 7214 ( 4938 ) + 7215 ( 4939 ) + 7216 ( -4909 ) + 7217 ( -4905 ) + 7218 ( -4898 ) + 7219 ( -4756 ) + 7220 ( 4940 ) + 7221 ( 4941 ) + 7222 ( 4942 ) + 7223 ( 4943 ) + 7224 ( 4944 ) + 7225 ( 4945 ) + 7226 ( 4946 ) + 7227 ( 4947 ) + 7228 ( -1541 ) + 7229 ( -2022 ) + 7230 ( 4948 ) + 7231 ( 4949 ) + 7232 ( 4950 ) + 7233 ( 4951 ) + 7234 ( 4952 ) + 7235 ( -4953 ) + 7236 ( -4954 ) + 7237 ( 4955 ) + 7238 ( 4956 ) + 7239 ( -4957 ) + 7240 ( -4958 ) + 7241 ( -4959 ) + 7242 ( -4960 ) + 7243 ( -4961 ) + 7244 ( -4962 ) + 7245 ( -4963 ) + 7246 ( -1542 ) + 7247 ( -2030 ) + 7248 ( 4964 ) + 7249 ( 4965 ) + 7250 ( 4966 ) + 7251 ( 4967 ) + 7252 ( 4968 ) + 7253 ( 4969 ) + 7254 ( 4970 ) + 7255 ( 4971 ) + 7256 ( -4965 ) + 7257 ( 4972 ) + 7258 ( 4973 ) + 7259 ( 4974 ) + 7260 ( 4975 ) + 7261 ( 4976 ) + 7262 ( 4977 ) + 7263 ( -4941 ) + 7264 ( 4978 ) + 7265 ( 4979 ) + 7266 ( -2023 ) + 7267 ( -1565 ) + 7268 ( 4980 ) + 7269 ( 4981 ) + 7270 ( 4982 ) + 7271 ( 4983 ) + 7272 ( 4984 ) + 7273 ( 4985 ) + 7274 ( 4986 ) + 7275 ( 4987 ) + 7276 ( 4988 ) + 7277 ( -4969 ) + 7278 ( 4989 ) + 7279 ( 4990 ) + 7280 ( 4991 ) + 7281 ( 4992 ) + 7282 ( -4733 ) + 7283 ( 4993 ) + 7284 ( 4994 ) + 7285 ( 4995 ) + 7286 ( 4996 ) + 7287 ( 4997 ) + 7288 ( 4998 ) + 7289 ( 4999 ) + 7290 ( 5000 ) + 7291 ( 5001 ) + 7292 ( 5002 ) + 7293 ( 5003 ) + 7294 ( 5004 ) + 7295 ( 5005 ) + 7296 ( 5006 ) + 7297 ( 5007 ) + 7298 ( 5008 ) + 7299 ( 5009 ) + 7300 ( -2168 ) + 7301 ( -2216 ) + 7302 ( -4734 ) + 7303 ( -4875 ) + 7304 ( -4938 ) + 7305 ( 5010 ) + 7306 ( 5011 ) + 7307 ( -2021 ) + 7308 ( -4755 ) + 7309 ( -4977 ) + 7310 ( -2153 ) + 7311 ( 5012 ) + 7312 ( 5013 ) + 7313 ( 5014 ) + 7314 ( -5015 ) + 7315 ( -4732 ) + 7316 ( 5016 ) + 7317 ( 5017 ) + 7318 ( -5007 ) + 7319 ( 5018 ) + 7320 ( -5019 ) + 7321 ( -4731 ) + 7322 ( 5020 ) + 7323 ( -5009 ) + 7324 ( -5014 ) + 7325 ( 5021 ) + 7326 ( 5022 ) + 7327 ( -5010 ) + 7328 ( -4948 ) + 7329 ( -4764 ) + 7330 ( 5023 ) + 7331 ( 5024 ) + 7332 ( 5025 ) + 7333 ( 5026 ) + 7334 ( -4750 ) + 7335 ( -4878 ) + 7336 ( 5027 ) + 7337 ( 5019 ) + 7338 ( 5015 ) + 7339 ( 5028 ) + 7340 ( 5029 ) + 7341 ( 5030 ) + 7342 ( -4747 ) + 7343 ( -5023 ) + 7344 ( -5008 ) + 7345 ( -5005 ) + 7346 ( 5031 ) + 7347 ( 5032 ) + 7348 ( -5030 ) + 7349 ( 5033 ) + 7350 ( -5027 ) + 7351 ( -5022 ) + 7352 ( 5034 ) + 7353 ( 5035 ) + 7354 ( -5032 ) + 7355 ( 5036 ) + 7356 ( -4766 ) + 7357 ( 5037 ) + 7358 ( 5038 ) + 7359 ( 5039 ) + 7360 ( 5040 ) + 7361 ( -5024 ) + 7362 ( -4749 ) + 7363 ( -4794 ) + 7364 ( -4877 ) + 7365 ( -4888 ) + 7366 ( 5041 ) + 7367 ( -5006 ) + 7368 ( 5042 ) + 7369 ( 5043 ) + 7370 ( 5044 ) + 7371 ( 5045 ) + 7372 ( -4743 ) + 7373 ( -5029 ) + 7374 ( -5031 ) + 7375 ( 5046 ) + 7376 ( 5047 ) + 7377 ( -5038 ) + 7378 ( -4742 ) + 7379 ( 5048 ) + 7380 ( -5043 ) + 7381 ( -5047 ) + 7382 ( -5035 ) + 7383 ( -5028 ) + 7384 ( -5037 ) + 7385 ( -4741 ) + 7386 ( 5049 ) + 7387 ( 5050 ) + 7388 ( -5042 ) + 7389 ( 5051 ) + 7390 ( -5036 ) + 7391 ( -4874 ) + 7392 ( -4991 ) + 7393 ( -5041 ) + 7394 ( -5046 ) + 7395 ( 5052 ) + 7396 ( 5053 ) + 7397 ( -4746 ) + 7398 ( 5054 ) + 7399 ( -4895 ) + 7400 ( -4873 ) + 7401 ( -4730 ) + 7402 ( 5055 ) + 7403 ( 5056 ) + 7404 ( -5053 ) + 7405 ( -5057 ) + 7406 ( -4729 ) + 7407 ( 5058 ) + 7408 ( 5059 ) + 7409 ( -5054 ) + 7410 ( -5060 ) + 7411 ( -4990 ) + 7412 ( -5052 ) + 7413 ( -4995 ) + 7414 ( 5061 ) + 7415 ( 5062 ) + 7416 ( 5063 ) + 7417 ( 5064 ) + 7418 ( 5065 ) + 7419 ( -4996 ) + 7420 ( 5066 ) + 7421 ( 5067 ) + 7422 ( 5068 ) + 7423 ( 5069 ) + 7424 ( 5070 ) + 7425 ( -5071 ) + 7426 ( 5072 ) + 7427 ( 5073 ) + 7428 ( -4728 ) + 7429 ( -5074 ) + 7430 ( 5075 ) + 7431 ( -4989 ) + 7432 ( -5076 ) + 7433 ( 5077 ) + 7434 ( 5078 ) + 7435 ( 5079 ) + 7436 ( -4979 ) + 7437 ( -2027 ) + 7438 ( 5080 ) + 7439 ( -4973 ) + 7440 ( -4968 ) + 7441 ( -2154 ) + 7442 ( 5081 ) + 7443 ( 5082 ) + 7444 ( -5012 ) + 7445 ( -2218 ) + 7446 ( -4748 ) + 7447 ( 5083 ) + 7448 ( 5084 ) + 7449 ( 5085 ) + 7450 ( 5086 ) + 7451 ( 5087 ) + 7452 ( 5088 ) + 7453 ( 5089 ) + 7454 ( 5090 ) + 7455 ( 5091 ) + 7456 ( 5092 ) + 7457 ( 5093 ) + 7458 ( -5017 ) + 7459 ( 5094 ) + 7460 ( 5095 ) + 7461 ( 5096 ) + 7462 ( -5097 ) + 7463 ( 5098 ) + 7464 ( -5085 ) + 7465 ( -5080 ) + 7466 ( -5021 ) + 7467 ( 5099 ) + 7468 ( 5100 ) + 7469 ( -5079 ) + 7470 ( -5013 ) + 7471 ( -5018 ) + 7472 ( -5084 ) + 7473 ( -5095 ) + 7474 ( 5076 ) + 7475 ( -4745 ) + 7476 ( 5101 ) + 7477 ( 5102 ) + 7478 ( -4721 ) + 7479 ( 5103 ) + 7480 ( 5104 ) + 7481 ( 5105 ) + 7482 ( 5106 ) + 7483 ( 5057 ) + 7484 ( 5071 ) + 7485 ( -5107 ) + 7486 ( 5108 ) + 7487 ( 5109 ) + 7488 ( 5110 ) + 7489 ( 5111 ) + 7490 ( 5112 ) + 7491 ( 5113 ) + 7492 ( 5114 ) + 7493 ( -5106 ) + 7494 ( 5074 ) + 7495 ( 5060 ) + 7496 ( -4999 ) + 7497 ( 5115 ) + 7498 ( -4738 ) + 7499 ( 5116 ) + 7500 ( 5117 ) + 7501 ( 5118 ) + 7502 ( 1224 ) + 7503 ( 5119 ) + 7504 ( 5120 ) + 7505 ( 5121 ) + 7506 ( 5122 ) + 7507 ( 5123 ) + 7508 ( 5124 ) + 7509 ( 5125 ) + 7510 ( 5126 ) + 7511 ( 5127 ) + 7512 ( 5128 ) + 7513 ( 5129 ) + 7514 ( 5130 ) + 7515 ( 5131 ) + 7516 ( 5132 ) + 7517 ( 5133 ) + 7518 ( 5134 ) + 7519 ( 5135 ) + 7520 ( 5136 ) + 7521 ( 5137 ) + 7522 ( -5124 ) + 7523 ( 5138 ) + 7524 ( -5127 ) + 7525 ( 5139 ) + 7526 ( 5140 ) + 7527 ( 5141 ) + 7528 ( 5142 ) + 7529 ( -5128 ) + 7530 ( 5143 ) + 7531 ( 5144 ) + 7532 ( 5145 ) + 7533 ( -5146 ) + 7534 ( 5147 ) + 7535 ( 5148 ) + 7536 ( 5149 ) + 7537 ( -5121 ) + 7538 ( 5150 ) + 7539 ( 5151 ) + 7540 ( 5152 ) + 7541 ( 5153 ) + 7542 ( 5154 ) + 7543 ( -5139 ) + 7544 ( -5155 ) + 7545 ( 5156 ) + 7546 ( -5150 ) + 7547 ( 5157 ) + 7548 ( 5158 ) + 7549 ( 5146 ) + 7550 ( -5135 ) + 7551 ( 5159 ) + 7552 ( 5160 ) + 7553 ( 5161 ) + 7554 ( 5162 ) + 7555 ( 5163 ) + 7556 ( 5164 ) + 7557 ( -5165 ) + 7558 ( 5166 ) + 7559 ( -1679 ) + 7560 ( 5167 ) + 7561 ( 5168 ) + 7562 ( 5169 ) + 7563 ( -1540 ) + 7564 ( -1637 ) + 7565 ( 5170 ) + 7566 ( 5171 ) + 7567 ( 5172 ) + 7568 ( -4910 ) + 7569 ( -4899 ) + 7570 ( 5173 ) + 7571 ( 5174 ) + 7572 ( 5175 ) + 7573 ( -5166 ) + 7574 ( -4908 ) + 7575 ( 5176 ) + 7576 ( 5177 ) + 7577 ( 5178 ) + 7578 ( 5179 ) + 7579 ( 5180 ) + 7580 ( -5177 ) + 7581 ( -1566 ) + 7582 ( -1367 ) + 7583 ( -5173 ) + 7584 ( -1597 ) + 7585 ( 5181 ) + 7586 ( -1671 ) + 7587 ( -1666 ) + 7588 ( -1645 ) + 7589 ( -4900 ) + 7590 ( -4911 ) + 7591 ( 5182 ) + 7592 ( 5183 ) + 7593 ( 4924 ) + 7594 ( -5180 ) + 7595 ( 5184 ) + 7596 ( 5185 ) + 7597 ( -5183 ) + 7598 ( 5186 ) + 7599 ( -4912 ) + 7600 ( 5187 ) + 7601 ( 5188 ) + 7602 ( 5189 ) + 7603 ( 5190 ) + 7604 ( -1678 ) + 7605 ( 5191 ) + 7606 ( 5192 ) + 7607 ( 5193 ) + 7608 ( 5194 ) + 7609 ( 5195 ) + 7610 ( -1381 ) + 7611 ( -1390 ) + 7612 ( 5165 ) + 7613 ( 4920 ) + 7614 ( -1594 ) + 7615 ( -1366 ) + 7616 ( -5181 ) + 7617 ( -5187 ) + 7618 ( -1638 ) + 7619 ( -1581 ) + 7620 ( 5196 ) + 7621 ( 5197 ) + 7622 ( 5198 ) + 7623 ( 5199 ) + 7624 ( 5200 ) + 7625 ( -5201 ) + 7626 ( 4919 ) + 7627 ( -5188 ) + 7628 ( 5202 ) + 7629 ( -5196 ) + 7630 ( 5203 ) + 7631 ( -5175 ) + 7632 ( -4942 ) + 7633 ( 5204 ) + 7634 ( 5205 ) + 7635 ( 5206 ) + 7636 ( 5207 ) + 7637 ( 5208 ) + 7638 ( 5209 ) + 7639 ( 5210 ) + 7640 ( 5211 ) + 7641 ( 5212 ) + 7642 ( 5213 ) + 7643 ( -5185 ) + 7644 ( -5172 ) + 7645 ( 5214 ) + 7646 ( 5215 ) + 7647 ( 5216 ) + 7648 ( 5217 ) + 7649 ( -4944 ) + 7650 ( -1567 ) + 7651 ( 5218 ) + 7652 ( 5219 ) + 7653 ( 5220 ) + 7654 ( 5221 ) + 7655 ( 5222 ) + 7656 ( 5223 ) + 7657 ( 5224 ) + 7658 ( -5210 ) + 7659 ( -5171 ) + 7660 ( 5225 ) + 7661 ( -4947 ) + 7662 ( 5226 ) + 7663 ( 5227 ) + 7664 ( 5228 ) + 7665 ( 5229 ) + 7666 ( -5230 ) + 7667 ( -5217 ) + 7668 ( 5231 ) + 7669 ( 5232 ) + 7670 ( 5233 ) + 7671 ( -4937 ) + 7672 ( -4976 ) + 7673 ( -5234 ) + 7674 ( -5235 ) + 7675 ( -5236 ) + 7676 ( -5237 ) + 7677 ( -5238 ) + 7678 ( -5226 ) + 7679 ( -5233 ) + 7680 ( -4946 ) + 7681 ( -5229 ) + 7682 ( 5239 ) + 7683 ( 5240 ) + 7684 ( 5241 ) + 7685 ( 5242 ) + 7686 ( -5204 ) + 7687 ( 5243 ) + 7688 ( -5232 ) + 7689 ( -4945 ) + 7690 ( 5244 ) + 7691 ( -5239 ) + 7692 ( -5209 ) + 7693 ( -5224 ) + 7694 ( 5245 ) + 7695 ( 5246 ) + 7696 ( 5247 ) + 7697 ( -5248 ) + 7698 ( -4943 ) + 7699 ( -5240 ) + 7700 ( -5211 ) + 7701 ( 5249 ) + 7702 ( 5248 ) + 7703 ( 5250 ) + 7704 ( -5179 ) + 7705 ( 5251 ) + 7706 ( 5252 ) + 7707 ( 5253 ) + 7708 ( -5206 ) + 7709 ( 5254 ) + 7710 ( -5250 ) + 7711 ( -5178 ) + 7712 ( 5255 ) + 7713 ( 5256 ) + 7714 ( 5257 ) + 7715 ( -5205 ) + 7716 ( 5258 ) + 7717 ( 5259 ) + 7718 ( -5254 ) + 7719 ( 5260 ) + 7720 ( 5261 ) + 7721 ( -5207 ) + 7722 ( -5258 ) + 7723 ( 5262 ) + 7724 ( -5203 ) + 7725 ( -5249 ) + 7726 ( -5174 ) + 7727 ( -5263 ) + 7728 ( -5164 ) + 7729 ( -5216 ) + 7730 ( -5243 ) + 7731 ( -5264 ) + 7732 ( -5265 ) + 7733 ( 5201 ) + 7734 ( -5255 ) + 7735 ( 5266 ) + 7736 ( 5267 ) + 7737 ( -5184 ) + 7738 ( -5208 ) + 7739 ( 5268 ) + 7740 ( 5269 ) + 7741 ( -5215 ) + 7742 ( -1539 ) + 7743 ( 5270 ) + 7744 ( 5263 ) + 7745 ( -5170 ) + 7746 ( 5264 ) + 7747 ( 5271 ) + 7748 ( 5272 ) + 7749 ( -5259 ) + 7750 ( 5273 ) + 7751 ( 5274 ) + 7752 ( -5221 ) + 7753 ( -5244 ) + 7754 ( 5275 ) + 7755 ( -5214 ) + 7756 ( -5276 ) + 7757 ( 5277 ) + 7758 ( -5269 ) + 7759 ( 5265 ) + 7760 ( -5272 ) + 7761 ( 5278 ) + 7762 ( 5276 ) + 7763 ( 5279 ) + 7764 ( -5220 ) + 7765 ( 5280 ) + 7766 ( 5281 ) + 7767 ( -5271 ) + 7768 ( -5282 ) + 7769 ( 5283 ) + 7770 ( -1677 ) + 7771 ( 5284 ) + 7772 ( -5163 ) + 7773 ( -1538 ) + 7774 ( -1636 ) + 7775 ( -5285 ) + 7776 ( -5268 ) + 7777 ( 5286 ) + 7778 ( 5287 ) + 7779 ( -4975 ) + 7780 ( -5225 ) + 7781 ( 5288 ) + 7782 ( 5289 ) + 7783 ( 4954 ) + 7784 ( 5290 ) + 7785 ( 5230 ) + 7786 ( 5291 ) + 7787 ( 5292 ) + 7788 ( -1676 ) + 7789 ( 5293 ) + 7790 ( 5294 ) + 7791 ( 5295 ) + 7792 ( 5296 ) + 7793 ( 5282 ) + 7794 ( -1537 ) + 7795 ( -1635 ) + 7796 ( 5297 ) + 7797 ( 5298 ) + 7798 ( 5299 ) + 7799 ( 5300 ) + 7800 ( 4957 ) + 7801 ( 5301 ) + 7802 ( 5302 ) + 7803 ( -4988 ) + 7804 ( 5303 ) + 7805 ( 5304 ) + 7806 ( 5305 ) + 7807 ( -5292 ) + 7808 ( 5306 ) + 7809 ( 4958 ) + 7810 ( 5307 ) + 7811 ( 5308 ) + 7812 ( -4987 ) + 7813 ( 5234 ) + 7814 ( 4960 ) + 7815 ( 5309 ) + 7816 ( 5310 ) + 7817 ( -5291 ) + 7818 ( -5301 ) + 7819 ( 5311 ) + 7820 ( -4983 ) + 7821 ( -5307 ) + 7822 ( -5297 ) + 7823 ( 5285 ) + 7824 ( -5270 ) + 7825 ( -1568 ) + 7826 ( 5312 ) + 7827 ( -4986 ) + 7828 ( -5223 ) + 7829 ( 5313 ) + 7830 ( 5238 ) + 7831 ( 5314 ) + 7832 ( -5279 ) + 7833 ( 5315 ) + 7834 ( 5316 ) + 7835 ( -4981 ) + 7836 ( -5218 ) + 7837 ( 5317 ) + 7838 ( -5300 ) + 7839 ( 5236 ) + 7840 ( -5314 ) + 7841 ( 5318 ) + 7842 ( 5319 ) + 7843 ( -4980 ) + 7844 ( 5320 ) + 7845 ( -5299 ) + 7846 ( -5277 ) + 7847 ( -5320 ) + 7848 ( -5317 ) + 7849 ( -5219 ) + 7850 ( -4984 ) + 7851 ( 5321 ) + 7852 ( -5312 ) + 7853 ( 5322 ) + 7854 ( 5323 ) + 7855 ( -5278 ) + 7856 ( -5313 ) + 7857 ( 5237 ) + 7858 ( -4985 ) + 7859 ( -5222 ) + 7860 ( -5290 ) + 7861 ( 5235 ) + 7862 ( 5324 ) + 7863 ( -4982 ) + 7864 ( -5310 ) + 7865 ( -5191 ) + 7866 ( -4922 ) + 7867 ( 5325 ) + 7868 ( 5326 ) + 7869 ( 5327 ) + 7870 ( 5328 ) + 7871 ( -5193 ) + 7872 ( -4923 ) + 7873 ( 5329 ) + 7874 ( 5330 ) + 7875 ( 5331 ) + 7876 ( -5326 ) + 7877 ( -5202 ) + 7878 ( 5332 ) + 7879 ( 5333 ) + 7880 ( -5200 ) + 7881 ( 5334 ) + 7882 ( 5335 ) + 7883 ( 5336 ) + 7884 ( -5330 ) + 7885 ( 5337 ) + 7886 ( 5338 ) + 7887 ( 5339 ) + 7888 ( 5340 ) + 7889 ( 5341 ) + 7890 ( 5342 ) + 7891 ( -1896 ) + 7892 ( -1887 ) + 7893 ( -1861 ) + 7894 ( -1536 ) + 7895 ( 5343 ) + 7896 ( 5344 ) + 7897 ( 5345 ) + 7898 ( 5346 ) + 7899 ( 5347 ) + 7900 ( 5348 ) + 7901 ( 5349 ) + 7902 ( 5350 ) + 7903 ( 5351 ) + 7904 ( 5352 ) + 7905 ( 5353 ) + 7906 ( 5354 ) + 7907 ( 4959 ) + 7908 ( -5302 ) + 7909 ( -5308 ) + 7910 ( 5355 ) + 7911 ( -5288 ) + 7912 ( 4962 ) + 7913 ( 5356 ) + 7914 ( 5357 ) + 7915 ( 5358 ) + 7916 ( 5359 ) + 7917 ( -5289 ) + 7918 ( 4963 ) + 7919 ( 5360 ) + 7920 ( 5361 ) + 7921 ( 5362 ) + 7922 ( -5356 ) + 7923 ( 5363 ) + 7924 ( -5355 ) + 7925 ( 5364 ) + 7926 ( 5365 ) + 7927 ( 5366 ) + 7928 ( -5359 ) + 7929 ( 4953 ) + 7930 ( -5367 ) + 7931 ( 5368 ) + 7932 ( -5369 ) + 7933 ( 5370 ) + 7934 ( 5371 ) + 7935 ( 5372 ) + 7936 ( 5373 ) + 7937 ( -5374 ) + 7938 ( -5342 ) + 7939 ( -5363 ) + 7940 ( 4961 ) + 7941 ( -5358 ) + 7942 ( -5309 ) + 7943 ( 5375 ) + 7944 ( 5376 ) + 7945 ( -5377 ) + 7946 ( -1535 ) + 7947 ( -5341 ) + 7948 ( -5306 ) + 7949 ( -5298 ) + 7950 ( 5378 ) + 7951 ( 5379 ) + 7952 ( -5380 ) + 7953 ( -5381 ) + 7954 ( -5382 ) + 7955 ( -5340 ) + 7956 ( -5376 ) + 7957 ( 5383 ) + 7958 ( -5384 ) + 7959 ( -1675 ) + 7960 ( 5385 ) + 7961 ( 5386 ) + 7962 ( 5387 ) + 7963 ( 5388 ) + 7964 ( 5389 ) + 7965 ( -1534 ) + 7966 ( -1634 ) + 7967 ( -5390 ) + 7968 ( -1685 ) + 7969 ( -239 ) + 7970 ( 4358 ) + 7971 ( -5375 ) + 7972 ( -5304 ) + 7973 ( -5295 ) + 7974 ( 5391 ) + 7975 ( 5367 ) + 7976 ( -5349 ) + 7977 ( 5392 ) + 7978 ( 5393 ) + 7979 ( 5394 ) + 7980 ( 5395 ) + 7981 ( 5396 ) + 7982 ( 5397 ) + 7983 ( 5374 ) + 7984 ( 5369 ) + 7985 ( -5350 ) + 7986 ( 5398 ) + 7987 ( 5399 ) + 7988 ( 5400 ) + 7989 ( 5401 ) + 7990 ( 5402 ) + 7991 ( -5394 ) + 7992 ( 5390 ) + 7993 ( 5380 ) + 7994 ( 5377 ) + 7995 ( -5351 ) + 7996 ( 4365 ) + 7997 ( -1890 ) + 7998 ( -251 ) + 7999 ( 5403 ) + 8000 ( 5404 ) + 8001 ( 5405 ) + 8002 ( 5406 ) + 8003 ( 5407 ) + 8004 ( 5408 ) + 8005 ( -1576 ) + 8006 ( -1869 ) + 8007 ( -1900 ) + 8008 ( 5381 ) + 8009 ( -5353 ) + 8010 ( 5409 ) + 8011 ( 5410 ) + 8012 ( -5399 ) + 8013 ( -5393 ) + 8014 ( 5411 ) + 8015 ( 5412 ) + 8016 ( 5413 ) + 8017 ( 5414 ) + 8018 ( 5382 ) + 8019 ( -5354 ) + 8020 ( -5409 ) + 8021 ( -5398 ) + 8022 ( -5392 ) + 8023 ( 5415 ) + 8024 ( 5416 ) + 8025 ( -5403 ) + 8026 ( 5384 ) + 8027 ( -5352 ) + 8028 ( -5410 ) + 8029 ( 5417 ) + 8030 ( 5418 ) + 8031 ( -5413 ) + 8032 ( -5396 ) + 8033 ( 5419 ) + 8034 ( 5420 ) + 8035 ( 5421 ) + 8036 ( -5385 ) + 8037 ( -5405 ) + 8038 ( 5422 ) + 8039 ( 5423 ) + 8040 ( 5424 ) + 8041 ( 5425 ) + 8042 ( 5426 ) + 8043 ( -5387 ) + 8044 ( -5347 ) + 8045 ( 4360 ) + 8046 ( -4149 ) + 8047 ( -262 ) + 8048 ( -253 ) + 8049 ( -5406 ) + 8050 ( -1871 ) + 8051 ( 5427 ) + 8052 ( 5428 ) + 8053 ( 5429 ) + 8054 ( -4213 ) + 8055 ( -5388 ) + 8056 ( -4361 ) + 8057 ( -5408 ) + 8058 ( 5430 ) + 8059 ( 5431 ) + 8060 ( 5432 ) + 8061 ( -5423 ) + 8062 ( 5433 ) + 8063 ( 5434 ) + 8064 ( -4362 ) + 8065 ( 5435 ) + 8066 ( 5436 ) + 8067 ( -5432 ) + 8068 ( 5437 ) + 8069 ( -4334 ) + 8070 ( -4352 ) + 8071 ( -4368 ) + 8072 ( 5438 ) + 8073 ( 5439 ) + 8074 ( -5440 ) + 8075 ( 5441 ) + 8076 ( -4333 ) + 8077 ( -5436 ) + 8078 ( 5442 ) + 8079 ( 5443 ) + 8080 ( 5444 ) + 8081 ( 5445 ) + 8082 ( -4322 ) + 8083 ( -4348 ) + 8084 ( -5439 ) + 8085 ( -4342 ) + 8086 ( 5446 ) + 8087 ( 5447 ) + 8088 ( 4933 ) + 8089 ( 5448 ) + 8090 ( 5449 ) + 8091 ( 5450 ) + 8092 ( 5451 ) + 8093 ( 5452 ) + 8094 ( 5453 ) + 8095 ( 5454 ) + 8096 ( 5455 ) + 8097 ( 5456 ) + 8098 ( 5457 ) + 8099 ( 5458 ) + 8100 ( 5459 ) + 8101 ( 5460 ) + 8102 ( 5461 ) + 8103 ( 5462 ) + 8104 ( 5463 ) + 8105 ( 5464 ) + 8106 ( 5465 ) + 8107 ( 5466 ) + 8108 ( 5467 ) + 8109 ( -5468 ) + 8110 ( 5469 ) + 8111 ( 5470 ) + 8112 ( -5471 ) + 8113 ( -5459 ) + 8114 ( 5472 ) + 8115 ( 5473 ) + 8116 ( 5474 ) + 8117 ( 5475 ) + 8118 ( -5473 ) + 8119 ( 5476 ) + 8120 ( 5477 ) + 8121 ( 5478 ) + 8122 ( 5479 ) + 8123 ( 5480 ) + 8124 ( 5468 ) + 8125 ( -5464 ) + 8126 ( 5481 ) + 8127 ( 5482 ) + 8128 ( 5483 ) + 8129 ( 5484 ) + 8130 ( 5485 ) + 8131 ( 5486 ) + 8132 ( 5487 ) + 8133 ( -5475 ) + 8134 ( 5488 ) + 8135 ( 5471 ) + 8136 ( -5481 ) + 8137 ( 5489 ) + 8138 ( -4971 ) + 8139 ( 5490 ) + 8140 ( 5491 ) + 8141 ( -5492 ) + 8142 ( -5488 ) + 8143 ( -5482 ) + 8144 ( -5476 ) + 8145 ( -5463 ) + 8146 ( -5485 ) + 8147 ( 5493 ) + 8148 ( 5494 ) + 8149 ( 5495 ) + 8150 ( 5496 ) + 8151 ( -5458 ) + 8152 ( 5497 ) + 8153 ( 5498 ) + 8154 ( 5499 ) + 8155 ( -4952 ) + 8156 ( -4970 ) + 8157 ( -5500 ) + 8158 ( -5489 ) + 8159 ( -5487 ) + 8160 ( -5470 ) + 8161 ( -5462 ) + 8162 ( -5484 ) + 8163 ( -5480 ) + 8164 ( 5501 ) + 8165 ( 5502 ) + 8166 ( 5503 ) + 8167 ( 5504 ) + 8168 ( 5505 ) + 8169 ( -5457 ) + 8170 ( 5506 ) + 8171 ( 5507 ) + 8172 ( 4932 ) + 8173 ( 5508 ) + 8174 ( 5509 ) + 8175 ( 5510 ) + 8176 ( 5511 ) + 8177 ( 5512 ) + 8178 ( 5513 ) + 8179 ( -5455 ) + 8180 ( 5514 ) + 8181 ( 5515 ) + 8182 ( -5516 ) + 8183 ( -5507 ) + 8184 ( -5447 ) + 8185 ( 5517 ) + 8186 ( 5518 ) + 8187 ( 5519 ) + 8188 ( 5520 ) + 8189 ( 5521 ) + 8190 ( 5522 ) + 8191 ( 5523 ) + 8192 ( 5524 ) + 8193 ( 5525 ) + 8194 ( 5526 ) + 8195 ( 5527 ) + 8196 ( 5528 ) + 8197 ( 5529 ) + 8198 ( 5530 ) + 8199 ( 5531 ) + 8200 ( -5527 ) + 8201 ( 5532 ) + 8202 ( 5533 ) + 8203 ( 5534 ) + 8204 ( 5535 ) + 8205 ( 5536 ) + 8206 ( -5525 ) + 8207 ( 5537 ) + 8208 ( 5538 ) + 8209 ( 5539 ) + 8210 ( -5529 ) + 8211 ( -5523 ) + 8212 ( 5540 ) + 8213 ( 5541 ) + 8214 ( 5542 ) + 8215 ( 5543 ) + 8216 ( 5544 ) + 8217 ( -5535 ) + 8218 ( -5521 ) + 8219 ( 5545 ) + 8220 ( 5546 ) + 8221 ( 5547 ) + 8222 ( 5516 ) + 8223 ( 5548 ) + 8224 ( 5549 ) + 8225 ( 5550 ) + 8226 ( 5551 ) + 8227 ( 5552 ) + 8228 ( 5553 ) + 8229 ( 5554 ) + 8230 ( 5555 ) + 8231 ( 5556 ) + 8232 ( -5453 ) + 8233 ( -5513 ) + 8234 ( 5557 ) + 8235 ( 5558 ) + 8236 ( 5559 ) + 8237 ( -5551 ) + 8238 ( -5512 ) + 8239 ( -5452 ) + 8240 ( 5560 ) + 8241 ( 5561 ) + 8242 ( 5500 ) + 8243 ( 5492 ) + 8244 ( 5562 ) + 8245 ( 5563 ) + 8246 ( 5564 ) + 8247 ( -4964 ) + 8248 ( -5477 ) + 8249 ( 5565 ) + 8250 ( 5566 ) + 8251 ( 5567 ) + 8252 ( 5568 ) + 8253 ( -4301 ) + 8254 ( 5569 ) + 8255 ( 5570 ) + 8256 ( 5571 ) + 8257 ( 5572 ) + 8258 ( 5573 ) + 8259 ( 5574 ) + 8260 ( -5557 ) + 8261 ( -5446 ) + 8262 ( -5565 ) + 8263 ( 5575 ) + 8264 ( 5576 ) + 8265 ( 5577 ) + 8266 ( -5509 ) + 8267 ( -5578 ) + 8268 ( -5579 ) + 8269 ( 5580 ) + 8270 ( -4951 ) + 8271 ( -5339 ) + 8272 ( -5372 ) + 8273 ( -5562 ) + 8274 ( -5479 ) + 8275 ( -5400 ) + 8276 ( 5581 ) + 8277 ( 5582 ) + 8278 ( -5371 ) + 8279 ( -5368 ) + 8280 ( -5344 ) + 8281 ( -4956 ) + 8282 ( -5563 ) + 8283 ( -5401 ) + 8284 ( -5582 ) + 8285 ( 5583 ) + 8286 ( -4144 ) + 8287 ( -5426 ) + 8288 ( 5584 ) + 8289 ( -1852 ) + 8290 ( -1533 ) + 8291 ( -4950 ) + 8292 ( -5338 ) + 8293 ( 5579 ) + 8294 ( -2031 ) + 8295 ( 5585 ) + 8296 ( 5586 ) + 8297 ( 5587 ) + 8298 ( 5588 ) + 8299 ( -4229 ) + 8300 ( 5589 ) + 8301 ( 5590 ) + 8302 ( 5591 ) + 8303 ( 5592 ) + 8304 ( 5593 ) + 8305 ( 5594 ) + 8306 ( -5467 ) + 8307 ( 5595 ) + 8308 ( 5596 ) + 8309 ( -5597 ) + 8310 ( -5588 ) + 8311 ( 5598 ) + 8312 ( 5599 ) + 8313 ( -5599 ) + 8314 ( -5592 ) + 8315 ( -5585 ) + 8316 ( 5600 ) + 8317 ( 5601 ) + 8318 ( 5602 ) + 8319 ( -4235 ) + 8320 ( -5561 ) + 8321 ( -5474 ) + 8322 ( -4949 ) + 8323 ( 5603 ) + 8324 ( 5578 ) + 8325 ( -5594 ) + 8326 ( -5602 ) + 8327 ( 5604 ) + 8328 ( -5586 ) + 8329 ( 5597 ) + 8330 ( -5593 ) + 8331 ( 5605 ) + 8332 ( 5606 ) + 8333 ( 5607 ) + 8334 ( -5465 ) + 8335 ( 5608 ) + 8336 ( -4150 ) + 8337 ( -2028 ) + 8338 ( -5598 ) + 8339 ( -5590 ) + 8340 ( -5600 ) + 8341 ( -4236 ) + 8342 ( -4231 ) + 8343 ( -5604 ) + 8344 ( -5587 ) + 8345 ( -4967 ) + 8346 ( 5609 ) + 8347 ( 5610 ) + 8348 ( 5611 ) + 8349 ( -5603 ) + 8350 ( -5595 ) + 8351 ( -5498 ) + 8352 ( -5606 ) + 8353 ( -5472 ) + 8354 ( -5466 ) + 8355 ( -5564 ) + 8356 ( -5478 ) + 8357 ( -4966 ) + 8358 ( 5612 ) + 8359 ( -5611 ) + 8360 ( 5613 ) + 8361 ( 5614 ) + 8362 ( 5615 ) + 8363 ( 5616 ) + 8364 ( 5617 ) + 8365 ( 5618 ) + 8366 ( -4292 ) + 8367 ( -4266 ) + 8368 ( -4466 ) + 8369 ( 5619 ) + 8370 ( -2215 ) + 8371 ( -4727 ) + 8372 ( 5620 ) + 8373 ( -2145 ) + 8374 ( 4476 ) + 8375 ( -2020 ) + 8376 ( -5608 ) + 8377 ( -4143 ) + 8378 ( -4227 ) + 8379 ( -4234 ) + 8380 ( 5621 ) + 8381 ( -5622 ) + 8382 ( 5623 ) + 8383 ( 5624 ) + 8384 ( 5625 ) + 8385 ( 5626 ) + 8386 ( 5627 ) + 8387 ( 5628 ) + 8388 ( 5629 ) + 8389 ( 5630 ) + 8390 ( 5631 ) + 8391 ( -5113 ) + 8392 ( 5632 ) + 8393 ( 5633 ) + 8394 ( 5634 ) + 8395 ( 5635 ) + 8396 ( 5636 ) + 8397 ( 5637 ) + 8398 ( -5624 ) + 8399 ( -5637 ) + 8400 ( -5627 ) + 8401 ( 5638 ) + 8402 ( 5639 ) + 8403 ( 5640 ) + 8404 ( -5634 ) + 8405 ( -5629 ) + 8406 ( 5641 ) + 8407 ( 5642 ) + 8408 ( 5643 ) + 8409 ( 5644 ) + 8410 ( -5499 ) + 8411 ( 5097 ) + 8412 ( -2029 ) + 8413 ( 5645 ) + 8414 ( 5622 ) + 8415 ( 5646 ) + 8416 ( -5612 ) + 8417 ( -5609 ) + 8418 ( -2217 ) + 8419 ( -5081 ) + 8420 ( -5089 ) + 8421 ( 5647 ) + 8422 ( 5648 ) + 8423 ( 5649 ) + 8424 ( 5650 ) + 8425 ( 5651 ) + 8426 ( -5088 ) + 8427 ( 5652 ) + 8428 ( 5653 ) + 8429 ( 5654 ) + 8430 ( 5655 ) + 8431 ( 5656 ) + 8432 ( 5657 ) + 8433 ( 5658 ) + 8434 ( 5659 ) + 8435 ( 5660 ) + 8436 ( 5661 ) + 8437 ( 5662 ) + 8438 ( 5663 ) + 8439 ( 5664 ) + 8440 ( -4744 ) + 8441 ( 5665 ) + 8442 ( 5666 ) + 8443 ( 5667 ) + 8444 ( -4726 ) + 8445 ( 5668 ) + 8446 ( -5072 ) + 8447 ( 5669 ) + 8448 ( 5670 ) + 8449 ( -5671 ) + 8450 ( 5672 ) + 8451 ( -4725 ) + 8452 ( -5673 ) + 8453 ( -5665 ) + 8454 ( -5674 ) + 8455 ( -5675 ) + 8456 ( -5662 ) + 8457 ( 5676 ) + 8458 ( 5677 ) + 8459 ( 5678 ) + 8460 ( -5657 ) + 8461 ( -5679 ) + 8462 ( 5680 ) + 8463 ( 5681 ) + 8464 ( 5682 ) + 8465 ( 5683 ) + 8466 ( 5684 ) + 8467 ( 5685 ) + 8468 ( 5686 ) + 8469 ( -5664 ) + 8470 ( -5681 ) + 8471 ( 5687 ) + 8472 ( 5688 ) + 8473 ( 5689 ) + 8474 ( 5690 ) + 8475 ( -5623 ) + 8476 ( 5691 ) + 8477 ( -5683 ) + 8478 ( -5663 ) + 8479 ( -5680 ) + 8480 ( 5679 ) + 8481 ( -5659 ) + 8482 ( 5692 ) + 8483 ( 5693 ) + 8484 ( 5694 ) + 8485 ( -5691 ) + 8486 ( 5695 ) + 8487 ( 5696 ) + 8488 ( 5697 ) + 8489 ( 5698 ) + 8490 ( -4724 ) + 8491 ( 5674 ) + 8492 ( -5670 ) + 8493 ( 5699 ) + 8494 ( 5700 ) + 8495 ( -4723 ) + 8496 ( -5701 ) + 8497 ( -5697 ) + 8498 ( 5675 ) + 8499 ( -5660 ) + 8500 ( -5702 ) + 8501 ( 5107 ) + 8502 ( -5703 ) + 8503 ( -4722 ) + 8504 ( 5704 ) + 8505 ( -5705 ) + 8506 ( -5696 ) + 8507 ( -5669 ) + 8508 ( -5075 ) + 8509 ( -5099 ) + 8510 ( -2144 ) + 8511 ( -5078 ) + 8512 ( -4717 ) + 8513 ( 5706 ) + 8514 ( -5619 ) + 8515 ( -4475 ) + 8516 ( -5707 ) + 8517 ( 5708 ) + 8518 ( -5644 ) + 8519 ( -2214 ) + 8520 ( 5709 ) + 8521 ( -5083 ) + 8522 ( -5094 ) + 8523 ( 5710 ) + 8524 ( 5711 ) + 8525 ( -5712 ) + 8526 ( -4720 ) + 8527 ( 5713 ) + 8528 ( 5671 ) + 8529 ( -5668 ) + 8530 ( 5714 ) + 8531 ( -4719 ) + 8532 ( -5715 ) + 8533 ( -5716 ) + 8534 ( -5711 ) + 8535 ( 5673 ) + 8536 ( -5661 ) + 8537 ( -5706 ) + 8538 ( -5717 ) + 8539 ( -4718 ) + 8540 ( 5718 ) + 8541 ( -5719 ) + 8542 ( -5720 ) + 8543 ( -5710 ) + 8544 ( -5666 ) + 8545 ( -5077 ) + 8546 ( -4275 ) + 8547 ( -4716 ) + 8548 ( 5721 ) + 8549 ( 5722 ) + 8550 ( -5695 ) + 8551 ( -5699 ) + 8552 ( 5702 ) + 8553 ( 5719 ) + 8554 ( 5715 ) + 8555 ( 5712 ) + 8556 ( 5723 ) + 8557 ( 5724 ) + 8558 ( 5717 ) + 8559 ( -4281 ) + 8560 ( 4479 ) + 8561 ( 5725 ) + 8562 ( -4740 ) + 8563 ( 5726 ) + 8564 ( -5724 ) + 8565 ( 5707 ) + 8566 ( 5720 ) + 8567 ( 4480 ) + 8568 ( 5727 ) + 8569 ( -4739 ) + 8570 ( -5725 ) + 8571 ( 5716 ) + 8572 ( 5701 ) + 8573 ( -5723 ) + 8574 ( -4735 ) + 8575 ( 5728 ) + 8576 ( -5658 ) + 8577 ( -5722 ) + 8578 ( 5703 ) + 8579 ( 5729 ) + 8580 ( 5730 ) + 8581 ( -4282 ) + 8582 ( -4737 ) + 8583 ( 5731 ) + 8584 ( -5108 ) + 8585 ( 5705 ) + 8586 ( 5732 ) + 8587 ( -4736 ) + 8588 ( 5733 ) + 8589 ( -5729 ) + 8590 ( 5734 ) + 8591 ( -5129 ) + 8592 ( 5735 ) + 8593 ( 5736 ) + 8594 ( 5737 ) + 8595 ( 5738 ) + 8596 ( 5739 ) + 8597 ( 5740 ) + 8598 ( 5741 ) + 8599 ( 5742 ) + 8600 ( 5743 ) + 8601 ( 5744 ) + 8602 ( 5745 ) + 8603 ( 5746 ) + 8604 ( 5747 ) + 8605 ( 5748 ) + 8606 ( 5749 ) + 8607 ( 5750 ) + 8608 ( 5751 ) + 8609 ( 5752 ) + 8610 ( 5753 ) + 8611 ( 5754 ) + 8612 ( 5755 ) + 8613 ( 5756 ) + 8614 ( 5757 ) + 8615 ( 5758 ) + 8616 ( 5759 ) + 8617 ( 5760 ) + 8618 ( 5761 ) + 8619 ( 5762 ) + 8620 ( 5763 ) + 8621 ( 5764 ) + 8622 ( 5765 ) + 8623 ( -5753 ) + 8624 ( 5766 ) + 8625 ( 5767 ) + 8626 ( -5752 ) + 8627 ( 5768 ) + 8628 ( 5769 ) + 8629 ( 5770 ) + 8630 ( 5771 ) + 8631 ( 5772 ) + 8632 ( 5773 ) + 8633 ( 5774 ) + 8634 ( -5775 ) + 8635 ( 5776 ) + 8636 ( 5777 ) + 8637 ( 5778 ) + 8638 ( 5779 ) + 8639 ( 5780 ) + 8640 ( 5781 ) + 8641 ( 5782 ) + 8642 ( 5783 ) + 8643 ( 5784 ) + 8644 ( 5785 ) + 8645 ( 5786 ) + 8646 ( 5787 ) + 8647 ( 5788 ) + 8648 ( 5789 ) + 8649 ( 5790 ) + 8650 ( 5791 ) + 8651 ( 5792 ) + 8652 ( 5793 ) + 8653 ( -5783 ) + 8654 ( 5794 ) + 8655 ( 5795 ) + 8656 ( -5782 ) + 8657 ( 5796 ) + 8658 ( 5797 ) + 8659 ( 5798 ) + 8660 ( -5789 ) + 8661 ( 5799 ) + 8662 ( -5773 ) + 8663 ( 5800 ) + 8664 ( 5801 ) + 8665 ( 5802 ) + 8666 ( -5781 ) + 8667 ( -5795 ) + 8668 ( -5741 ) + 8669 ( 5803 ) + 8670 ( -5766 ) + 8671 ( 5804 ) + 8672 ( 5805 ) + 8673 ( -5806 ) + 8674 ( 5807 ) + 8675 ( 5808 ) + 8676 ( 5809 ) + 8677 ( -5810 ) + 8678 ( -5758 ) + 8679 ( -5803 ) + 8680 ( -5785 ) + 8681 ( -5751 ) + 8682 ( 5811 ) + 8683 ( 5812 ) + 8684 ( -5800 ) + 8685 ( -5799 ) + 8686 ( -5779 ) + 8687 ( 5813 ) + 8688 ( 5814 ) + 8689 ( 5815 ) + 8690 ( 5816 ) + 8691 ( -5767 ) + 8692 ( 5817 ) + 8693 ( 5775 ) + 8694 ( -5742 ) + 8695 ( -5816 ) + 8696 ( -5768 ) + 8697 ( 5818 ) + 8698 ( 5819 ) + 8699 ( 5820 ) + 8700 ( 5821 ) + 8701 ( 5822 ) + 8702 ( 5823 ) + 8703 ( -5743 ) + 8704 ( -5765 ) + 8705 ( 5824 ) + 8706 ( 5825 ) + 8707 ( 5826 ) + 8708 ( 5827 ) + 8709 ( -5744 ) + 8710 ( -5769 ) + 8711 ( 5828 ) + 8712 ( 5829 ) + 8713 ( -5822 ) + 8714 ( 5830 ) + 8715 ( 5806 ) + 8716 ( -5763 ) + 8717 ( 5831 ) + 8718 ( 5832 ) + 8719 ( 5833 ) + 8720 ( 5834 ) + 8721 ( 5810 ) + 8722 ( -5784 ) + 8723 ( 5835 ) + 8724 ( 5836 ) + 8725 ( 5837 ) + 8726 ( 5838 ) + 8727 ( 5839 ) + 8728 ( 5840 ) + 8729 ( -5762 ) + 8730 ( -5833 ) + 8731 ( 5841 ) + 8732 ( 5842 ) + 8733 ( 5843 ) + 8734 ( 5844 ) + 8735 ( -5826 ) + 8736 ( -5761 ) + 8737 ( 5845 ) + 8738 ( -5844 ) + 8739 ( -5825 ) + 8740 ( 5846 ) + 8741 ( 5847 ) + 8742 ( 5848 ) + 8743 ( 5849 ) + 8744 ( 5850 ) + 8745 ( 5851 ) + 8746 ( 5852 ) + 8747 ( 5853 ) + 8748 ( 5854 ) + 8749 ( 5855 ) + 8750 ( 5856 ) + 8751 ( 5857 ) + 8752 ( 5858 ) + 8753 ( 5859 ) + 8754 ( 5860 ) + 8755 ( 5861 ) + 8756 ( 5862 ) + 8757 ( 5863 ) + 8758 ( 5864 ) + 8759 ( -5851 ) + 8760 ( -5840 ) + 8761 ( 5865 ) + 8762 ( 5866 ) + 8763 ( 5867 ) + 8764 ( 5868 ) + 8765 ( 5869 ) + 8766 ( -5757 ) + 8767 ( 5870 ) + 8768 ( 5871 ) + 8769 ( -5872 ) + 8770 ( 5873 ) + 8771 ( 5874 ) + 8772 ( 5875 ) + 8773 ( -5850 ) + 8774 ( 5876 ) + 8775 ( 5877 ) + 8776 ( 5878 ) + 8777 ( -5849 ) + 8778 ( 5879 ) + 8779 ( 5880 ) + 8780 ( -5864 ) + 8781 ( 5881 ) + 8782 ( 5882 ) + 8783 ( 5883 ) + 8784 ( -5839 ) + 8785 ( 5884 ) + 8786 ( 5885 ) + 8787 ( -5756 ) + 8788 ( -5863 ) + 8789 ( 5886 ) + 8790 ( 5887 ) + 8791 ( 5888 ) + 8792 ( 5889 ) + 8793 ( 5890 ) + 8794 ( 5891 ) + 8795 ( 5892 ) + 8796 ( 5893 ) + 8797 ( 5894 ) + 8798 ( 5895 ) + 8799 ( 5896 ) + 8800 ( -5874 ) + 8801 ( -5889 ) + 8802 ( 5897 ) + 8803 ( 5898 ) + 8804 ( -5794 ) + 8805 ( 5899 ) + 8806 ( 5900 ) + 8807 ( -5812 ) + 8808 ( -5772 ) + 8809 ( 5901 ) + 8810 ( -5888 ) + 8811 ( -5894 ) + 8812 ( -5805 ) + 8813 ( -5834 ) + 8814 ( -5780 ) + 8815 ( -5790 ) + 8816 ( -5883 ) + 8817 ( 5902 ) + 8818 ( 5903 ) + 8819 ( -5830 ) + 8820 ( -5887 ) + 8821 ( -5755 ) + 8822 ( -5804 ) + 8823 ( -5898 ) + 8824 ( -5862 ) + 8825 ( 5904 ) + 8826 ( 5905 ) + 8827 ( -5904 ) + 8828 ( -5890 ) + 8829 ( -5881 ) + 8830 ( 5906 ) + 8831 ( 5907 ) + 8832 ( -5870 ) + 8833 ( -5878 ) + 8834 ( 5908 ) + 8835 ( 5909 ) + 8836 ( -5848 ) + 8837 ( -5873 ) + 8838 ( -5905 ) + 8839 ( -5893 ) + 8840 ( -5817 ) + 8841 ( -5847 ) + 8842 ( 5910 ) + 8843 ( 5911 ) + 8844 ( 5912 ) + 8845 ( -5811 ) + 8846 ( 5872 ) + 8847 ( -5901 ) + 8848 ( -5897 ) + 8849 ( 5913 ) + 8850 ( -5908 ) + 8851 ( -5903 ) + 8852 ( -5900 ) + 8853 ( -5895 ) + 8854 ( -5807 ) + 8855 ( -5801 ) + 8856 ( -5796 ) + 8857 ( -5759 ) + 8858 ( 5914 ) + 8859 ( 5915 ) + 8860 ( -5892 ) + 8861 ( -5906 ) + 8862 ( -5793 ) + 8863 ( -5786 ) + 8864 ( -5837 ) + 8865 ( 5916 ) + 8866 ( -5886 ) + 8867 ( -5882 ) + 8868 ( -5877 ) + 8869 ( -5913 ) + 8870 ( -5871 ) + 8871 ( -5831 ) + 8872 ( -5778 ) + 8873 ( -5814 ) + 8874 ( -5770 ) + 8875 ( -5754 ) + 8876 ( 5917 ) + 8877 ( 5918 ) + 8878 ( 5919 ) + 8879 ( 5920 ) + 8880 ( 5921 ) + 8881 ( 5922 ) + 8882 ( -5858 ) + 8883 ( 5923 ) + 8884 ( 5924 ) + 8885 ( -5823 ) + 8886 ( -5838 ) + 8887 ( 5925 ) + 8888 ( 5926 ) + 8889 ( 5927 ) + 8890 ( 5928 ) + 8891 ( 5929 ) + 8892 ( 5930 ) + 8893 ( -5740 ) + 8894 ( -5861 ) + 8895 ( -5764 ) + 8896 ( 5931 ) + 8897 ( 5932 ) + 8898 ( -5916 ) + 8899 ( 5933 ) + 8900 ( 5934 ) + 8901 ( 5935 ) + 8902 ( 5936 ) + 8903 ( 5937 ) + 8904 ( -5868 ) + 8905 ( 5938 ) + 8906 ( 5939 ) + 8907 ( 5940 ) + 8908 ( 5941 ) + 8909 ( 5942 ) + 8910 ( 5943 ) + 8911 ( 5944 ) + 8912 ( -5915 ) + 8913 ( -5852 ) + 8914 ( -5869 ) + 8915 ( 5945 ) + 8916 ( -5939 ) + 8917 ( 5946 ) + 8918 ( 5947 ) + 8919 ( 5948 ) + 8920 ( -5914 ) + 8921 ( -5931 ) + 8922 ( 5949 ) + 8923 ( -5944 ) + 8924 ( 5950 ) + 8925 ( 5951 ) + 8926 ( -5856 ) + 8927 ( 5952 ) + 8928 ( 5953 ) + 8929 ( -5925 ) + 8930 ( -5746 ) + 8931 ( 5954 ) + 8932 ( 5955 ) + 8933 ( 5956 ) + 8934 ( 5957 ) + 8935 ( 5958 ) + 8936 ( -5922 ) + 8937 ( -5934 ) + 8938 ( 5959 ) + 8939 ( 5960 ) + 8940 ( -5958 ) + 8941 ( 5961 ) + 8942 ( 5962 ) + 8943 ( 5963 ) + 8944 ( 5964 ) + 8945 ( 5965 ) + 8946 ( 5966 ) + 8947 ( 5967 ) + 8948 ( -5947 ) + 8949 ( -5941 ) + 8950 ( 5968 ) + 8951 ( 5969 ) + 8952 ( -5935 ) + 8953 ( 5970 ) + 8954 ( 5971 ) + 8955 ( 5972 ) + 8956 ( 5973 ) + 8957 ( 5974 ) + 8958 ( 5975 ) + 8959 ( 5976 ) + 8960 ( 5977 ) + 8961 ( 5978 ) + 8962 ( 5979 ) + 8963 ( 5980 ) + 8964 ( -5950 ) + 8965 ( 5981 ) + 8966 ( -5975 ) + 8967 ( 5982 ) + 8968 ( 5983 ) + 8969 ( 5984 ) + 8970 ( -5969 ) + 8971 ( 5985 ) + 8972 ( 5986 ) + 8973 ( -5932 ) + 8974 ( 5987 ) + 8975 ( 5988 ) + 8976 ( -5949 ) + 8977 ( 5989 ) + 8978 ( -5967 ) + 8979 ( -5978 ) + 8980 ( -5938 ) + 8981 ( -5987 ) + 8982 ( 5990 ) + 8983 ( -5966 ) + 8984 ( -5983 ) + 8985 ( -5945 ) + 8986 ( -5927 ) + 8987 ( -5985 ) + 8988 ( 5991 ) + 8989 ( 5992 ) + 8990 ( 5993 ) + 8991 ( 5994 ) + 8992 ( 5995 ) + 8993 ( -5928 ) + 8994 ( -5986 ) + 8995 ( 5996 ) + 8996 ( -5994 ) + 8997 ( 5997 ) + 8998 ( 5998 ) + 8999 ( 5999 ) + 9000 ( 6000 ) + 9001 ( 6001 ) + 9002 ( 6002 ) + 9003 ( 6003 ) + 9004 ( 6004 ) + 9005 ( 6005 ) + 9006 ( 6006 ) + 9007 ( 6007 ) + 9008 ( 6008 ) + 9009 ( 6009 ) + 9010 ( 6010 ) + 9011 ( 6011 ) + 9012 ( 6012 ) + 9013 ( 6013 ) + 9014 ( -6000 ) + 9015 ( 6014 ) + 9016 ( 6015 ) + 9017 ( -6016 ) + 9018 ( 6017 ) + 9019 ( 6018 ) + 9020 ( 6019 ) + 9021 ( -5965 ) + 9022 ( 6020 ) + 9023 ( 6021 ) + 9024 ( 6022 ) + 9025 ( 6023 ) + 9026 ( 6024 ) + 9027 ( 6025 ) + 9028 ( -6009 ) + 9029 ( -5999 ) + 9030 ( 6026 ) + 9031 ( 6027 ) + 9032 ( 6016 ) + 9033 ( -6011 ) + 9034 ( 6028 ) + 9035 ( 6029 ) + 9036 ( 6030 ) + 9037 ( 6031 ) + 9038 ( 6032 ) + 9039 ( 6033 ) + 9040 ( 6034 ) + 9041 ( 6035 ) + 9042 ( -5968 ) + 9043 ( -6036 ) + 9044 ( -5734 ) + 9045 ( 6037 ) + 9046 ( 6038 ) + 9047 ( 6039 ) + 9048 ( -6005 ) + 9049 ( 6040 ) + 9050 ( 6041 ) + 9051 ( 6042 ) + 9052 ( 6043 ) + 9053 ( 6044 ) + 9054 ( 6045 ) + 9055 ( 6046 ) + 9056 ( 6047 ) + 9057 ( 6048 ) + 9058 ( 6036 ) + 9059 ( -6010 ) + 9060 ( -6006 ) + 9061 ( 6049 ) + 9062 ( 6050 ) + 9063 ( 6051 ) + 9064 ( -6049 ) + 9065 ( 6052 ) + 9066 ( 6053 ) + 9067 ( 6054 ) + 9068 ( 6055 ) + 9069 ( 6056 ) + 9070 ( 6057 ) + 9071 ( 6058 ) + 9072 ( -6028 ) + 9073 ( 6059 ) + 9074 ( 6060 ) + 9075 ( 6061 ) + 9076 ( 6062 ) + 9077 ( -6053 ) + 9078 ( 6063 ) + 9079 ( 6064 ) + 9080 ( 6065 ) + 9081 ( 6066 ) + 9082 ( 6067 ) + 9083 ( 6068 ) + 9084 ( 6069 ) + 9085 ( 6070 ) + 9086 ( 6071 ) + 9087 ( 6072 ) + 9088 ( 6073 ) + 9089 ( 6074 ) + 9090 ( 6075 ) + 9091 ( -6048 ) + 9092 ( -6070 ) + 9093 ( 6076 ) + 9094 ( 6077 ) + 9095 ( 6078 ) + 9096 ( 6079 ) + 9097 ( -6047 ) + 9098 ( -6079 ) + 9099 ( -6075 ) + 9100 ( -6050 ) + 9101 ( 6080 ) + 9102 ( 6081 ) + 9103 ( 6082 ) + 9104 ( -6071 ) + 9105 ( -6082 ) + 9106 ( 6083 ) + 9107 ( 6084 ) + 9108 ( -6062 ) + 9109 ( 6085 ) + 9110 ( 6086 ) + 9111 ( -6051 ) + 9112 ( -6034 ) + 9113 ( 6087 ) + 9114 ( 6088 ) + 9115 ( 6089 ) + 9116 ( 6090 ) + 9117 ( 6091 ) + 9118 ( -5973 ) + 9119 ( -5992 ) + 9120 ( 6092 ) + 9121 ( 6093 ) + 9122 ( -6094 ) + 9123 ( -6095 ) + 9124 ( 6096 ) + 9125 ( 6097 ) + 9126 ( 6098 ) + 9127 ( -6027 ) + 9128 ( -6091 ) + 9129 ( 6099 ) + 9130 ( 6094 ) + 9131 ( -6033 ) + 9132 ( -6089 ) + 9133 ( -5996 ) + 9134 ( -5972 ) + 9135 ( 6100 ) + 9136 ( -6096 ) + 9137 ( 6101 ) + 9138 ( 6102 ) + 9139 ( -6055 ) + 9140 ( 6103 ) + 9141 ( 6104 ) + 9142 ( 6105 ) + 9143 ( 6106 ) + 9144 ( 6107 ) + 9145 ( 6108 ) + 9146 ( -6109 ) + 9147 ( -6097 ) + 9148 ( -6056 ) + 9149 ( 6110 ) + 9150 ( -6107 ) + 9151 ( 6111 ) + 9152 ( 6112 ) + 9153 ( 6113 ) + 9154 ( 6114 ) + 9155 ( 6115 ) + 9156 ( 6116 ) + 9157 ( -6104 ) + 9158 ( -6117 ) + 9159 ( -6118 ) + 9160 ( -6066 ) + 9161 ( 6119 ) + 9162 ( -6060 ) + 9163 ( 6120 ) + 9164 ( 6121 ) + 9165 ( 6122 ) + 9166 ( 6123 ) + 9167 ( -6119 ) + 9168 ( -6059 ) + 9169 ( -6101 ) + 9170 ( 6124 ) + 9171 ( 6125 ) + 9172 ( 6126 ) + 9173 ( -6126 ) + 9174 ( -6123 ) + 9175 ( 6127 ) + 9176 ( 6128 ) + 9177 ( -6102 ) + 9178 ( -6061 ) + 9179 ( -6113 ) + 9180 ( 6129 ) + 9181 ( 6130 ) + 9182 ( 6131 ) + 9183 ( 6132 ) + 9184 ( 6133 ) + 9185 ( 6134 ) + 9186 ( 6135 ) + 9187 ( 6136 ) + 9188 ( 6137 ) + 9189 ( 6138 ) + 9190 ( 6139 ) + 9191 ( -6015 ) + 9192 ( 6140 ) + 9193 ( -6007 ) + 9194 ( 6141 ) + 9195 ( 6142 ) + 9196 ( 6143 ) + 9197 ( 6144 ) + 9198 ( 6145 ) + 9199 ( 6146 ) + 9200 ( 6147 ) + 9201 ( 6148 ) + 9202 ( 6149 ) + 9203 ( 6150 ) + 9204 ( 6151 ) + 9205 ( 6152 ) + 9206 ( 6153 ) + 9207 ( 6154 ) + 9208 ( 6155 ) + 9209 ( -6008 ) + 9210 ( 6156 ) + 9211 ( 6157 ) + 9212 ( 6158 ) + 9213 ( -6143 ) + 9214 ( 6159 ) + 9215 ( 6160 ) + 9216 ( -6142 ) + 9217 ( 6161 ) + 9218 ( 6162 ) + 9219 ( 6163 ) + 9220 ( 6164 ) + 9221 ( -6156 ) + 9222 ( 6165 ) + 9223 ( 6166 ) + 9224 ( 6167 ) + 9225 ( 6168 ) + 9226 ( 6169 ) + 9227 ( 6170 ) + 9228 ( 6171 ) + 9229 ( 6172 ) + 9230 ( 6173 ) + 9231 ( 6174 ) + 9232 ( 6175 ) + 9233 ( 6176 ) + 9234 ( 6177 ) + 9235 ( 6178 ) + 9236 ( -6167 ) + 9237 ( 6179 ) + 9238 ( -6131 ) + 9239 ( 6180 ) + 9240 ( 6181 ) + 9241 ( 6182 ) + 9242 ( -6159 ) + 9243 ( 6183 ) + 9244 ( -6175 ) + 9245 ( -6165 ) + 9246 ( -6184 ) + 9247 ( 6185 ) + 9248 ( -6186 ) + 9249 ( -6183 ) + 9250 ( -6187 ) + 9251 ( 6188 ) + 9252 ( 6189 ) + 9253 ( -6190 ) + 9254 ( -6191 ) + 9255 ( 6192 ) + 9256 ( -6193 ) + 9257 ( -6147 ) + 9258 ( -6168 ) + 9259 ( -6160 ) + 9260 ( 6194 ) + 9261 ( 6195 ) + 9262 ( 6184 ) + 9263 ( -6135 ) + 9264 ( 6196 ) + 9265 ( 6197 ) + 9266 ( 6198 ) + 9267 ( 6199 ) + 9268 ( 6200 ) + 9269 ( 6186 ) + 9270 ( -6136 ) + 9271 ( 6201 ) + 9272 ( -6196 ) + 9273 ( 6202 ) + 9274 ( 6203 ) + 9275 ( -6014 ) + 9276 ( -6130 ) + 9277 ( 6204 ) + 9278 ( -6205 ) + 9279 ( -5964 ) + 9280 ( -6206 ) + 9281 ( 6207 ) + 9282 ( 6187 ) + 9283 ( -6155 ) + 9284 ( 6208 ) + 9285 ( 6209 ) + 9286 ( 6210 ) + 9287 ( 6211 ) + 9288 ( 6212 ) + 9289 ( 6213 ) + 9290 ( 6214 ) + 9291 ( 6215 ) + 9292 ( -6216 ) + 9293 ( 6190 ) + 9294 ( 6217 ) + 9295 ( 6218 ) + 9296 ( -6208 ) + 9297 ( 6193 ) + 9298 ( 6219 ) + 9299 ( 6220 ) + 9300 ( 6221 ) + 9301 ( 6222 ) + 9302 ( 6223 ) + 9303 ( 6224 ) + 9304 ( -6166 ) + 9305 ( 6225 ) + 9306 ( 6226 ) + 9307 ( 6227 ) + 9308 ( 6228 ) + 9309 ( 6229 ) + 9310 ( -6220 ) + 9311 ( 6191 ) + 9312 ( -6225 ) + 9313 ( 6230 ) + 9314 ( 6231 ) + 9315 ( 6232 ) + 9316 ( -6217 ) + 9317 ( -6219 ) + 9318 ( 6205 ) + 9319 ( -6025 ) + 9320 ( 6233 ) + 9321 ( 6234 ) + 9322 ( 6235 ) + 9323 ( 6236 ) + 9324 ( 6237 ) + 9325 ( 6238 ) + 9326 ( 6239 ) + 9327 ( 6240 ) + 9328 ( 6241 ) + 9329 ( -6204 ) + 9330 ( -6133 ) + 9331 ( -6024 ) + 9332 ( 6242 ) + 9333 ( -6003 ) + 9334 ( 6243 ) + 9335 ( 6244 ) + 9336 ( -6237 ) + 9337 ( -6245 ) + 9338 ( 6246 ) + 9339 ( 6247 ) + 9340 ( -6241 ) + 9341 ( 6248 ) + 9342 ( 6249 ) + 9343 ( 6250 ) + 9344 ( 6251 ) + 9345 ( -6141 ) + 9346 ( -6139 ) + 9347 ( 6252 ) + 9348 ( 6253 ) + 9349 ( 6254 ) + 9350 ( 6255 ) + 9351 ( 6256 ) + 9352 ( 6257 ) + 9353 ( -6252 ) + 9354 ( 6258 ) + 9355 ( -6140 ) + 9356 ( 6259 ) + 9357 ( 6260 ) + 9358 ( -6250 ) + 9359 ( -6138 ) + 9360 ( -6257 ) + 9361 ( -6261 ) + 9362 ( 6262 ) + 9363 ( 6263 ) + 9364 ( 6264 ) + 9365 ( -6137 ) + 9366 ( -6258 ) + 9367 ( -6253 ) + 9368 ( -6264 ) + 9369 ( 6265 ) + 9370 ( -6242 ) + 9371 ( -6266 ) + 9372 ( -6251 ) + 9373 ( 6267 ) + 9374 ( 6268 ) + 9375 ( 6269 ) + 9376 ( -6240 ) + 9377 ( 6270 ) + 9378 ( -5998 ) + 9379 ( -6246 ) + 9380 ( -6161 ) + 9381 ( -6158 ) + 9382 ( 6271 ) + 9383 ( 6272 ) + 9384 ( 6273 ) + 9385 ( 6274 ) + 9386 ( 6275 ) + 9387 ( -6267 ) + 9388 ( -6157 ) + 9389 ( 6206 ) + 9390 ( -6018 ) + 9391 ( 6276 ) + 9392 ( -6235 ) + 9393 ( -5979 ) + 9394 ( -5970 ) + 9395 ( 6277 ) + 9396 ( 6278 ) + 9397 ( -6274 ) + 9398 ( 6216 ) + 9399 ( -6152 ) + 9400 ( -6211 ) + 9401 ( 6279 ) + 9402 ( 6280 ) + 9403 ( 6281 ) + 9404 ( 6282 ) + 9405 ( 6283 ) + 9406 ( -6275 ) + 9407 ( -6151 ) + 9408 ( 6284 ) + 9409 ( 6285 ) + 9410 ( -6280 ) + 9411 ( 6286 ) + 9412 ( 6287 ) + 9413 ( 6288 ) + 9414 ( 6289 ) + 9415 ( 6290 ) + 9416 ( 6291 ) + 9417 ( 6292 ) + 9418 ( 6293 ) + 9419 ( 6294 ) + 9420 ( 6295 ) + 9421 ( 6296 ) + 9422 ( 6297 ) + 9423 ( 6298 ) + 9424 ( 6299 ) + 9425 ( 6300 ) + 9426 ( 6301 ) + 9427 ( 6302 ) + 9428 ( 6303 ) + 9429 ( -6304 ) + 9430 ( 6305 ) + 9431 ( 6306 ) + 9432 ( 6307 ) + 9433 ( -6287 ) + 9434 ( -6308 ) + 9435 ( 6309 ) + 9436 ( -6303 ) + 9437 ( -6310 ) + 9438 ( 6311 ) + 9439 ( -6286 ) + 9440 ( 6312 ) + 9441 ( 6313 ) + 9442 ( 6314 ) + 9443 ( 6315 ) + 9444 ( 6316 ) + 9445 ( 6317 ) + 9446 ( 6318 ) + 9447 ( 6319 ) + 9448 ( 6320 ) + 9449 ( 6321 ) + 9450 ( 6322 ) + 9451 ( -6301 ) + 9452 ( 6323 ) + 9453 ( 6324 ) + 9454 ( 6325 ) + 9455 ( -5946 ) + 9456 ( -5940 ) + 9457 ( -5937 ) + 9458 ( 6326 ) + 9459 ( 6327 ) + 9460 ( 6328 ) + 9461 ( 6329 ) + 9462 ( 6330 ) + 9463 ( 6331 ) + 9464 ( 6332 ) + 9465 ( 6333 ) + 9466 ( 6334 ) + 9467 ( -5921 ) + 9468 ( 6335 ) + 9469 ( 6336 ) + 9470 ( 6337 ) + 9471 ( 6338 ) + 9472 ( 6339 ) + 9473 ( 6340 ) + 9474 ( 6341 ) + 9475 ( 6342 ) + 9476 ( 6343 ) + 9477 ( 6344 ) + 9478 ( 6345 ) + 9479 ( 6346 ) + 9480 ( 6347 ) + 9481 ( 6348 ) + 9482 ( 6349 ) + 9483 ( -6350 ) + 9484 ( 6351 ) + 9485 ( 6352 ) + 9486 ( -6337 ) + 9487 ( 6353 ) + 9488 ( -6325 ) + 9489 ( 6354 ) + 9490 ( 6355 ) + 9491 ( -6356 ) + 9492 ( 6357 ) + 9493 ( 6358 ) + 9494 ( 6359 ) + 9495 ( 6360 ) + 9496 ( 6361 ) + 9497 ( 6362 ) + 9498 ( 6363 ) + 9499 ( -6332 ) + 9500 ( -5920 ) + 9501 ( 6364 ) + 9502 ( 6365 ) + 9503 ( 6366 ) + 9504 ( -6363 ) + 9505 ( -5960 ) + 9506 ( -5956 ) + 9507 ( -5919 ) + 9508 ( -6331 ) + 9509 ( 6367 ) + 9510 ( 6368 ) + 9511 ( 6369 ) + 9512 ( 6370 ) + 9513 ( -6371 ) + 9514 ( 6372 ) + 9515 ( 6373 ) + 9516 ( 6374 ) + 9517 ( 6375 ) + 9518 ( 6376 ) + 9519 ( 6377 ) + 9520 ( 6378 ) + 9521 ( 6379 ) + 9522 ( 6380 ) + 9523 ( 6381 ) + 9524 ( 6382 ) + 9525 ( -6344 ) + 9526 ( 6383 ) + 9527 ( 6384 ) + 9528 ( 6385 ) + 9529 ( 6386 ) + 9530 ( 6387 ) + 9531 ( -6317 ) + 9532 ( -6373 ) + 9533 ( 6388 ) + 9534 ( 6389 ) + 9535 ( -6298 ) + 9536 ( -6381 ) + 9537 ( 6390 ) + 9538 ( 6391 ) + 9539 ( -6388 ) + 9540 ( 6392 ) + 9541 ( -6297 ) + 9542 ( 6393 ) + 9543 ( -6394 ) + 9544 ( -6395 ) + 9545 ( -6396 ) + 9546 ( -6397 ) + 9547 ( 6398 ) + 9548 ( 6399 ) + 9549 ( 6400 ) + 9550 ( -6401 ) + 9551 ( -6402 ) + 9552 ( -6403 ) + 9553 ( -6404 ) + 9554 ( -6405 ) + 9555 ( -6372 ) + 9556 ( -6385 ) + 9557 ( -6391 ) + 9558 ( 6406 ) + 9559 ( 6407 ) + 9560 ( -5963 ) + 9561 ( -6324 ) + 9562 ( 6408 ) + 9563 ( 6409 ) + 9564 ( 6410 ) + 9565 ( -6026 ) + 9566 ( 6350 ) + 9567 ( -6017 ) + 9568 ( 6411 ) + 9569 ( 6412 ) + 9570 ( 6413 ) + 9571 ( -6207 ) + 9572 ( 6308 ) + 9573 ( 6414 ) + 9574 ( 6415 ) + 9575 ( 6416 ) + 9576 ( -6295 ) + 9577 ( 6417 ) + 9578 ( 6418 ) + 9579 ( 6419 ) + 9580 ( 6420 ) + 9581 ( -6192 ) + 9582 ( -6148 ) + 9583 ( -6046 ) + 9584 ( -6023 ) + 9585 ( -6224 ) + 9586 ( -6171 ) + 9587 ( -6080 ) + 9588 ( -6086 ) + 9589 ( -6013 ) + 9590 ( -6001 ) + 9591 ( -6209 ) + 9592 ( -6162 ) + 9593 ( -6144 ) + 9594 ( -6057 ) + 9595 ( -6032 ) + 9596 ( 6421 ) + 9597 ( 6422 ) + 9598 ( 6423 ) + 9599 ( 6424 ) + 9600 ( 6425 ) + 9601 ( 6426 ) + 9602 ( -6064 ) + 9603 ( 6427 ) + 9604 ( 6428 ) + 9605 ( 6429 ) + 9606 ( -6182 ) + 9607 ( -6022 ) + 9608 ( -6170 ) + 9609 ( -6194 ) + 9610 ( -6163 ) + 9611 ( -6145 ) + 9612 ( -6058 ) + 9613 ( -6031 ) + 9614 ( 6430 ) + 9615 ( 6431 ) + 9616 ( 6432 ) + 9617 ( 6433 ) + 9618 ( 6434 ) + 9619 ( -6424 ) + 9620 ( 6435 ) + 9621 ( -6063 ) + 9622 ( 6436 ) + 9623 ( 6437 ) + 9624 ( -6438 ) + 9625 ( 6439 ) + 9626 ( 6440 ) + 9627 ( -6434 ) + 9628 ( -6423 ) + 9629 ( 6441 ) + 9630 ( 6442 ) + 9631 ( 6443 ) + 9632 ( 6438 ) + 9633 ( -6181 ) + 9634 ( -6021 ) + 9635 ( -6178 ) + 9636 ( -6169 ) + 9637 ( -6164 ) + 9638 ( -6146 ) + 9639 ( -6030 ) + 9640 ( 6444 ) + 9641 ( 6445 ) + 9642 ( 6446 ) + 9643 ( 6447 ) + 9644 ( 6448 ) + 9645 ( 6449 ) + 9646 ( -6431 ) + 9647 ( 6450 ) + 9648 ( 6451 ) + 9649 ( 6452 ) + 9650 ( 6453 ) + 9651 ( 6454 ) + 9652 ( 6455 ) + 9653 ( 6456 ) + 9654 ( 6457 ) + 9655 ( 6458 ) + 9656 ( 6459 ) + 9657 ( 6460 ) + 9658 ( 6461 ) + 9659 ( 6462 ) + 9660 ( 6463 ) + 9661 ( 6464 ) + 9662 ( 6465 ) + 9663 ( 6466 ) + 9664 ( -6456 ) + 9665 ( 6467 ) + 9666 ( 6468 ) + 9667 ( 6469 ) + 9668 ( -6470 ) + 9669 ( 6471 ) + 9670 ( -6450 ) + 9671 ( 6472 ) + 9672 ( 6473 ) + 9673 ( -6466 ) + 9674 ( 6474 ) + 9675 ( 6475 ) + 9676 ( 6476 ) + 9677 ( 6477 ) + 9678 ( 6478 ) + 9679 ( 6479 ) + 9680 ( 6480 ) + 9681 ( 6481 ) + 9682 ( 6482 ) + 9683 ( 6483 ) + 9684 ( 6484 ) + 9685 ( -6474 ) + 9686 ( 6485 ) + 9687 ( 6486 ) + 9688 ( 6487 ) + 9689 ( 6488 ) + 9690 ( 6489 ) + 9691 ( 6490 ) + 9692 ( -6459 ) + 9693 ( -6478 ) + 9694 ( 6491 ) + 9695 ( -6473 ) + 9696 ( 6492 ) + 9697 ( 6493 ) + 9698 ( -6494 ) + 9699 ( -6443 ) + 9700 ( -6429 ) + 9701 ( -6420 ) + 9702 ( 6495 ) + 9703 ( 6496 ) + 9704 ( -6472 ) + 9705 ( -6485 ) + 9706 ( 6497 ) + 9707 ( 6498 ) + 9708 ( 6499 ) + 9709 ( 6500 ) + 9710 ( 6501 ) + 9711 ( 6502 ) + 9712 ( 6470 ) + 9713 ( -6455 ) + 9714 ( -6502 ) + 9715 ( -6471 ) + 9716 ( 6503 ) + 9717 ( 6504 ) + 9718 ( 6505 ) + 9719 ( 6506 ) + 9720 ( 6507 ) + 9721 ( -6428 ) + 9722 ( -6419 ) + 9723 ( 6508 ) + 9724 ( 6509 ) + 9725 ( -6492 ) + 9726 ( -6469 ) + 9727 ( -6506 ) + 9728 ( 6510 ) + 9729 ( 6494 ) + 9730 ( -6439 ) + 9731 ( 6511 ) + 9732 ( -6487 ) + 9733 ( 6512 ) + 9734 ( 6513 ) + 9735 ( 6514 ) + 9736 ( 6515 ) + 9737 ( -6421 ) + 9738 ( -6430 ) + 9739 ( -6447 ) + 9740 ( 6516 ) + 9741 ( 6517 ) + 9742 ( 6518 ) + 9743 ( 6519 ) + 9744 ( 6520 ) + 9745 ( 6521 ) + 9746 ( 6522 ) + 9747 ( 6523 ) + 9748 ( 6524 ) + 9749 ( 6525 ) + 9750 ( 6526 ) + 9751 ( 6527 ) + 9752 ( -6464 ) + 9753 ( 6528 ) + 9754 ( 6529 ) + 9755 ( 6530 ) + 9756 ( 6531 ) + 9757 ( 6532 ) + 9758 ( 6533 ) + 9759 ( 6534 ) + 9760 ( 6535 ) + 9761 ( 6536 ) + 9762 ( 6537 ) + 9763 ( 6538 ) + 9764 ( -6525 ) + 9765 ( 6539 ) + 9766 ( 6540 ) + 9767 ( -6536 ) + 9768 ( 6541 ) + 9769 ( 6542 ) + 9770 ( 6543 ) + 9771 ( 6544 ) + 9772 ( 6545 ) + 9773 ( 6546 ) + 9774 ( 6547 ) + 9775 ( 6548 ) + 9776 ( 6549 ) + 9777 ( -6518 ) + 9778 ( 6550 ) + 9779 ( 6551 ) + 9780 ( 6552 ) + 9781 ( 6553 ) + 9782 ( 6554 ) + 9783 ( -6542 ) + 9784 ( 6555 ) + 9785 ( -6548 ) + 9786 ( 6556 ) + 9787 ( -6557 ) + 9788 ( 6558 ) + 9789 ( 6559 ) + 9790 ( 6560 ) + 9791 ( 6561 ) + 9792 ( -6499 ) + 9793 ( 6310 ) + 9794 ( -6541 ) + 9795 ( 6562 ) + 9796 ( 6563 ) + 9797 ( 6564 ) + 9798 ( 6565 ) + 9799 ( 6566 ) + 9800 ( 6567 ) + 9801 ( 6568 ) + 9802 ( 6569 ) + 9803 ( 6570 ) + 9804 ( 6571 ) + 9805 ( 6572 ) + 9806 ( -6562 ) + 9807 ( 6573 ) + 9808 ( 6574 ) + 9809 ( 6575 ) + 9810 ( 6576 ) + 9811 ( 6577 ) + 9812 ( 6578 ) + 9813 ( 6579 ) + 9814 ( 6580 ) + 9815 ( 6581 ) + 9816 ( -6545 ) + 9817 ( -6563 ) + 9818 ( 6582 ) + 9819 ( 6583 ) + 9820 ( 6584 ) + 9821 ( -6580 ) + 9822 ( 6585 ) + 9823 ( 6586 ) + 9824 ( 6587 ) + 9825 ( 6588 ) + 9826 ( -6315 ) + 9827 ( -6585 ) + 9828 ( -6565 ) + 9829 ( 6589 ) + 9830 ( 6590 ) + 9831 ( 6591 ) + 9832 ( -6577 ) + 9833 ( 6592 ) + 9834 ( 6593 ) + 9835 ( 6594 ) + 9836 ( -6482 ) + 9837 ( -6349 ) + 9838 ( -6339 ) + 9839 ( 6595 ) + 9840 ( -6412 ) + 9841 ( 6596 ) + 9842 ( 6597 ) + 9843 ( 6598 ) + 9844 ( -6409 ) + 9845 ( -6203 ) + 9846 ( -6134 ) + 9847 ( -6020 ) + 9848 ( 6599 ) + 9849 ( -6029 ) + 9850 ( 6600 ) + 9851 ( 6601 ) + 9852 ( 6602 ) + 9853 ( -6445 ) + 9854 ( 6603 ) + 9855 ( 6604 ) + 9856 ( 6605 ) + 9857 ( -6442 ) + 9858 ( -6598 ) + 9859 ( 6606 ) + 9860 ( 6607 ) + 9861 ( 6608 ) + 9862 ( 6609 ) + 9863 ( 6610 ) + 9864 ( -6179 ) + 9865 ( -6195 ) + 9866 ( -6200 ) + 9867 ( -6129 ) + 9868 ( 6611 ) + 9869 ( -6342 ) + 9870 ( 6612 ) + 9871 ( 6613 ) + 9872 ( 6614 ) + 9873 ( 6615 ) + 9874 ( 6616 ) + 9875 ( 6617 ) + 9876 ( -6607 ) + 9877 ( 6618 ) + 9878 ( 6619 ) + 9879 ( 6620 ) + 9880 ( -6621 ) + 9881 ( -6622 ) + 9882 ( -6613 ) + 9883 ( 6623 ) + 9884 ( 6624 ) + 9885 ( -6606 ) + 9886 ( -6352 ) + 9887 ( -6624 ) + 9888 ( -6617 ) + 9889 ( 6625 ) + 9890 ( 6626 ) + 9891 ( -6599 ) + 9892 ( 6627 ) + 9893 ( 6628 ) + 9894 ( 6629 ) + 9895 ( 6630 ) + 9896 ( -6441 ) + 9897 ( -6604 ) + 9898 ( 6622 ) + 9899 ( 6631 ) + 9900 ( 6621 ) + 9901 ( 6632 ) + 9902 ( 6633 ) + 9903 ( 6634 ) + 9904 ( 6635 ) + 9905 ( -6612 ) + 9906 ( -6605 ) + 9907 ( -6480 ) + 9908 ( -6348 ) + 9909 ( -6338 ) + 9910 ( -6623 ) + 9911 ( -6616 ) + 9912 ( -6625 ) + 9913 ( 6636 ) + 9914 ( 6637 ) + 9915 ( -6513 ) + 9916 ( -6411 ) + 9917 ( -6595 ) + 9918 ( -6601 ) + 9919 ( 6638 ) + 9920 ( 6639 ) + 9921 ( 6640 ) + 9922 ( -6629 ) + 9923 ( -6608 ) + 9924 ( -6619 ) + 9925 ( -6479 ) + 9926 ( -6633 ) + 9927 ( 6641 ) + 9928 ( -6512 ) + 9929 ( -6637 ) + 9930 ( 6642 ) + 9931 ( 6643 ) + 9932 ( 6644 ) + 9933 ( -6640 ) + 9934 ( 6645 ) + 9935 ( 6646 ) + 9936 ( -6627 ) + 9937 ( -6477 ) + 9938 ( 6647 ) + 9939 ( -6646 ) + 9940 ( -6628 ) + 9941 ( -6484 ) + 9942 ( -6440 ) + 9943 ( 6648 ) + 9944 ( -6641 ) + 9945 ( -6511 ) + 9946 ( 6649 ) + 9947 ( 6650 ) + 9948 ( -6639 ) + 9949 ( -6643 ) + 9950 ( 6651 ) + 9951 ( -6476 ) + 9952 ( 6652 ) + 9953 ( 6653 ) + 9954 ( 6654 ) + 9955 ( 6655 ) + 9956 ( 6656 ) + 9957 ( 6657 ) + 9958 ( 6658 ) + 9959 ( -6322 ) + 9960 ( 6659 ) + 9961 ( -6655 ) + 9962 ( 6660 ) + 9963 ( 6661 ) + 9964 ( 6662 ) + 9965 ( 6663 ) + 9966 ( -6664 ) + 9967 ( 6665 ) + 9968 ( -6666 ) + 9969 ( 6667 ) + 9970 ( -6668 ) + 9971 ( 6669 ) + 9972 ( 6670 ) + 9973 ( 6671 ) + 9974 ( 6672 ) + 9975 ( 6673 ) + 9976 ( -6523 ) + 9977 ( 6674 ) + 9978 ( 6675 ) + 9979 ( 6676 ) + 9980 ( 6677 ) + 9981 ( 6678 ) + 9982 ( 6679 ) + 9983 ( 6680 ) + 9984 ( 6681 ) + 9985 ( 6682 ) + 9986 ( 6683 ) + 9987 ( 6684 ) + 9988 ( 6685 ) + 9989 ( 6686 ) + 9990 ( 6687 ) + 9991 ( 6688 ) + 9992 ( 6689 ) + 9993 ( -6663 ) + 9994 ( -6517 ) + 9995 ( 6690 ) + 9996 ( 6691 ) + 9997 ( 6692 ) + 9998 ( 6693 ) + 9999 ( -6685 ) + 10000 ( 6694 ) + 10001 ( 6695 ) + 10002 ( 6696 ) + 10003 ( 6697 ) + 10004 ( -6675 ) + 10005 ( 6698 ) + 10006 ( 6699 ) + 10007 ( 6700 ) + 10008 ( 6701 ) + 10009 ( 6702 ) + 10010 ( -4853 ) + 10011 ( 6703 ) + 10012 ( 6704 ) + 10013 ( 6705 ) + 10014 ( 6706 ) + 10015 ( 6707 ) + 10016 ( -6703 ) + 10017 ( -6702 ) + 10018 ( 6708 ) + 10019 ( 6709 ) + 10020 ( 6710 ) + 10021 ( 6711 ) + 10022 ( 6712 ) + 10023 ( -6323 ) + 10024 ( 6713 ) + 10025 ( 6714 ) + 10026 ( 6715 ) + 10027 ( 6716 ) + 10028 ( -6336 ) + 10029 ( -6347 ) + 10030 ( 6356 ) + 10031 ( 6371 ) + 10032 ( 6717 ) + 10033 ( 6718 ) + 10034 ( 6719 ) + 10035 ( 6720 ) + 10036 ( 6721 ) + 10037 ( -6722 ) + 10038 ( 6723 ) + 10039 ( 6724 ) + 10040 ( -6475 ) + 10041 ( -6488 ) + 10042 ( -6458 ) + 10043 ( 6725 ) + 10044 ( 6726 ) + 10045 ( -6682 ) + 10046 ( 6727 ) + 10047 ( -6594 ) + 10048 ( -6406 ) + 10049 ( 6728 ) + 10050 ( -6335 ) + 10051 ( -6346 ) + 10052 ( -6712 ) + 10053 ( -6720 ) + 10054 ( 6729 ) + 10055 ( 6722 ) + 10056 ( -6699 ) + 10057 ( -6497 ) + 10058 ( -6467 ) + 10059 ( -6463 ) + 10060 ( -6454 ) + 10061 ( -6505 ) + 10062 ( -6491 ) + 10063 ( -6510 ) + 10064 ( -6486 ) + 10065 ( 6730 ) + 10066 ( 6731 ) + 10067 ( 6732 ) + 10068 ( 6733 ) + 10069 ( 6734 ) + 10070 ( 6735 ) + 10071 ( -6680 ) + 10072 ( 6736 ) + 10073 ( 6737 ) + 10074 ( 6738 ) + 10075 ( 6739 ) + 10076 ( 6740 ) + 10077 ( -6733 ) + 10078 ( -6532 ) + 10079 ( -6679 ) + 10080 ( -6692 ) + 10081 ( 6741 ) + 10082 ( 6742 ) + 10083 ( -6732 ) + 10084 ( -6531 ) + 10085 ( -6678 ) + 10086 ( -6740 ) + 10087 ( 6743 ) + 10088 ( 6744 ) + 10089 ( -6738 ) + 10090 ( -6731 ) + 10091 ( -6529 ) + 10092 ( -6677 ) + 10093 ( 6745 ) + 10094 ( -6568 ) + 10095 ( 6746 ) + 10096 ( 6747 ) + 10097 ( 6748 ) + 10098 ( 6749 ) + 10099 ( -6574 ) + 10100 ( 6750 ) + 10101 ( 6751 ) + 10102 ( 6752 ) + 10103 ( 6753 ) + 10104 ( 6754 ) + 10105 ( 6304 ) + 10106 ( -6415 ) + 10107 ( 6755 ) + 10108 ( 6756 ) + 10109 ( -1129 ) + 10110 ( -6757 ) + 10111 ( 6758 ) + 10112 ( -1139 ) + 10113 ( 6759 ) + 10114 ( 6760 ) + 10115 ( 6761 ) + 10116 ( 6762 ) + 10117 ( -2718 ) + 10118 ( -2625 ) + 10119 ( 6763 ) + 10120 ( 6764 ) + 10121 ( -6765 ) + 10122 ( 6766 ) + 10123 ( 6767 ) + 10124 ( -2816 ) + 10125 ( 6768 ) + 10126 ( 6769 ) + 10127 ( 6770 ) + 10128 ( 6771 ) + 10129 ( 6772 ) + 10130 ( 6773 ) + 10131 ( 6774 ) + 10132 ( 6775 ) + 10133 ( 6776 ) + 10134 ( 6777 ) + 10135 ( -6762 ) + 10136 ( 6778 ) + 10137 ( -2716 ) + 10138 ( 6779 ) + 10139 ( -2612 ) + 10140 ( 6780 ) + 10141 ( 6781 ) + 10142 ( 6782 ) + 10143 ( -2809 ) + 10144 ( -6770 ) + 10145 ( 6783 ) + 10146 ( -6779 ) + 10147 ( -6761 ) + 10148 ( -2717 ) + 10149 ( -2624 ) + 10150 ( 6784 ) + 10151 ( -6785 ) + 10152 ( -2819 ) + 10153 ( -6769 ) + 10154 ( 6786 ) + 10155 ( -6766 ) + 10156 ( 6787 ) + 10157 ( 6788 ) + 10158 ( 6789 ) + 10159 ( 6790 ) + 10160 ( 6791 ) + 10161 ( 6792 ) + 10162 ( 6793 ) + 10163 ( -2579 ) + 10164 ( 6794 ) + 10165 ( 6795 ) + 10166 ( -2484 ) + 10167 ( -2564 ) + 10168 ( -6788 ) + 10169 ( 6796 ) + 10170 ( -6767 ) + 10171 ( -6793 ) + 10172 ( -6797 ) + 10173 ( 6798 ) + 10174 ( -2483 ) + 10175 ( -2563 ) + 10176 ( -2585 ) + 10177 ( -6787 ) + 10178 ( -2713 ) + 10179 ( -6782 ) + 10180 ( -6771 ) + 10181 ( -2685 ) + 10182 ( 6799 ) + 10183 ( 6800 ) + 10184 ( -2811 ) + 10185 ( 6801 ) + 10186 ( 6802 ) + 10187 ( -5747 ) + 10188 ( -6774 ) + 10189 ( -6764 ) + 10190 ( -6791 ) + 10191 ( 6803 ) + 10192 ( 6804 ) + 10193 ( 6805 ) + 10194 ( 6806 ) + 10195 ( 6807 ) + 10196 ( 6808 ) + 10197 ( 6809 ) + 10198 ( 6810 ) + 10199 ( 6811 ) + 10200 ( -5918 ) + 10201 ( -5955 ) + 10202 ( -6362 ) + 10203 ( -6366 ) + 10204 ( -6775 ) + 10205 ( 6812 ) + 10206 ( 6813 ) + 10207 ( -6811 ) + 10208 ( -6365 ) + 10209 ( -5959 ) + 10210 ( 6814 ) + 10211 ( 6815 ) + 10212 ( 6757 ) + 10213 ( 6557 ) + 10214 ( 6816 ) + 10215 ( 6817 ) + 10216 ( 6818 ) + 10217 ( 6819 ) + 10218 ( 6820 ) + 10219 ( -2731 ) + 10220 ( -2915 ) + 10221 ( 6821 ) + 10222 ( 6822 ) + 10223 ( -2728 ) + 10224 ( -6823 ) + 10225 ( 6824 ) + 10226 ( 6825 ) + 10227 ( 6826 ) + 10228 ( -6820 ) + 10229 ( -2914 ) + 10230 ( 6823 ) + 10231 ( 2743 ) + 10232 ( 6827 ) + 10233 ( 6828 ) + 10234 ( 6829 ) + 10235 ( -2730 ) + 10236 ( -2738 ) + 10237 ( -6818 ) + 10238 ( 6830 ) + 10239 ( 2747 ) + 10240 ( 6831 ) + 10241 ( 6832 ) + 10242 ( 6833 ) + 10243 ( -2687 ) + 10244 ( 6834 ) + 10245 ( -6831 ) + 10246 ( 6835 ) + 10247 ( 6836 ) + 10248 ( 6837 ) + 10249 ( -2695 ) + 10250 ( 6838 ) + 10251 ( 6839 ) + 10252 ( 6840 ) + 10253 ( 6841 ) + 10254 ( 6842 ) + 10255 ( -2480 ) + 10256 ( -2619 ) + 10257 ( -2609 ) + 10258 ( -6786 ) + 10259 ( -6792 ) + 10260 ( -6796 ) + 10261 ( -6760 ) + 10262 ( -6768 ) + 10263 ( -6778 ) + 10264 ( -6783 ) + 10265 ( -6837 ) + 10266 ( 6843 ) + 10267 ( 6844 ) + 10268 ( -6845 ) + 10269 ( 6846 ) + 10270 ( 6847 ) + 10271 ( 6848 ) + 10272 ( 6849 ) + 10273 ( -6355 ) + 10274 ( 6850 ) + 10275 ( 6851 ) + 10276 ( 6852 ) + 10277 ( -6843 ) + 10278 ( 6853 ) + 10279 ( 6854 ) + 10280 ( -6844 ) + 10281 ( 6855 ) + 10282 ( 6856 ) + 10283 ( -6854 ) + 10284 ( 6857 ) + 10285 ( -6840 ) + 10286 ( 6858 ) + 10287 ( 6859 ) + 10288 ( 6860 ) + 10289 ( -6813 ) + 10290 ( -6809 ) + 10291 ( -6853 ) + 10292 ( -6856 ) + 10293 ( 6861 ) + 10294 ( -6851 ) + 10295 ( 6862 ) + 10296 ( 6863 ) + 10297 ( -6361 ) + 10298 ( -6808 ) + 10299 ( -6860 ) + 10300 ( 6864 ) + 10301 ( 6865 ) + 10302 ( 6866 ) + 10303 ( 6867 ) + 10304 ( 6868 ) + 10305 ( -2479 ) + 10306 ( -2618 ) + 10307 ( -2608 ) + 10308 ( -6838 ) + 10309 ( -2686 ) + 10310 ( -2694 ) + 10311 ( -6830 ) + 10312 ( -6834 ) + 10313 ( 6845 ) + 10314 ( 3999 ) + 10315 ( -2345 ) + 10316 ( -2324 ) + 10317 ( 6869 ) + 10318 ( -2895 ) + 10319 ( 6870 ) + 10320 ( -2368 ) + 10321 ( 6871 ) + 10322 ( 6872 ) + 10323 ( -6873 ) + 10324 ( -5118 ) + 10325 ( 6874 ) + 10326 ( 6875 ) + 10327 ( 1237 ) + 10328 ( 6876 ) + 10329 ( 6877 ) + 10330 ( 6878 ) + 10331 ( -6879 ) + 10332 ( 6880 ) + 10333 ( 6881 ) + 10334 ( 6882 ) + 10335 ( -4857 ) + 10336 ( 6883 ) + 10337 ( 6884 ) + 10338 ( -6696 ) + 10339 ( -6674 ) + 10340 ( 6885 ) + 10341 ( 6886 ) + 10342 ( 6887 ) + 10343 ( 6888 ) + 10344 ( 6889 ) + 10345 ( 6890 ) + 10346 ( 6891 ) + 10347 ( 6892 ) + 10348 ( 6893 ) + 10349 ( 6894 ) + 10350 ( 6895 ) + 10351 ( -6896 ) + 10352 ( -6886 ) + 10353 ( -6897 ) + 10354 ( -6898 ) + 10355 ( -6899 ) + 10356 ( 6900 ) + 10357 ( 6901 ) + 10358 ( 6902 ) + 10359 ( 6903 ) + 10360 ( 6904 ) + 10361 ( -6676 ) + 10362 ( -4854 ) + 10363 ( -6711 ) + 10364 ( -6707 ) + 10365 ( 6905 ) + 10366 ( 6906 ) + 10367 ( 6907 ) + 10368 ( -6893 ) + 10369 ( 6908 ) + 10370 ( 6909 ) + 10371 ( 6910 ) + 10372 ( 6911 ) + 10373 ( 6403 ) + 10374 ( 6912 ) + 10375 ( 6913 ) + 10376 ( 6914 ) + 10377 ( 6915 ) + 10378 ( 6916 ) + 10379 ( 6917 ) + 10380 ( 6918 ) + 10381 ( 6919 ) + 10382 ( 6920 ) + 10383 ( 6921 ) + 10384 ( 6922 ) + 10385 ( 6923 ) + 10386 ( 6924 ) + 10387 ( 6925 ) + 10388 ( 6926 ) + 10389 ( 6927 ) + 10390 ( 6928 ) + 10391 ( 6929 ) + 10392 ( 6405 ) + 10393 ( -6387 ) + 10394 ( -6379 ) + 10395 ( -6321 ) + 10396 ( 6930 ) + 10397 ( 6931 ) + 10398 ( -6662 ) + 10399 ( -6658 ) + 10400 ( 6932 ) + 10401 ( -6717 ) + 10402 ( -6915 ) + 10403 ( 6933 ) + 10404 ( 6934 ) + 10405 ( 6935 ) + 10406 ( 6936 ) + 10407 ( 6937 ) + 10408 ( 6938 ) + 10409 ( -6939 ) + 10410 ( 6940 ) + 10411 ( 6941 ) + 10412 ( -6942 ) + 10413 ( -6932 ) + 10414 ( -6914 ) + 10415 ( 6943 ) + 10416 ( 6404 ) + 10417 ( -6376 ) + 10418 ( -6933 ) + 10419 ( 6944 ) + 10420 ( 6945 ) + 10421 ( 6946 ) + 10422 ( 6947 ) + 10423 ( 6948 ) + 10424 ( -6926 ) + 10425 ( -6719 ) + 10426 ( 6949 ) + 10427 ( 6950 ) + 10428 ( 6951 ) + 10429 ( 6952 ) + 10430 ( -6953 ) + 10431 ( 6954 ) + 10432 ( 6955 ) + 10433 ( 6956 ) + 10434 ( 6957 ) + 10435 ( -6958 ) + 10436 ( -6959 ) + 10437 ( 6960 ) + 10438 ( 6961 ) + 10439 ( 6962 ) + 10440 ( 6963 ) + 10441 ( 6964 ) + 10442 ( 6965 ) + 10443 ( 6966 ) + 10444 ( -6967 ) + 10445 ( 6968 ) + 10446 ( -6947 ) + 10447 ( -6718 ) + 10448 ( 6969 ) + 10449 ( -6888 ) + 10450 ( 6970 ) + 10451 ( 6971 ) + 10452 ( 6972 ) + 10453 ( -6726 ) + 10454 ( -6729 ) + 10455 ( -6968 ) + 10456 ( 6973 ) + 10457 ( 6974 ) + 10458 ( -6890 ) + 10459 ( 6975 ) + 10460 ( -6725 ) + 10461 ( 6976 ) + 10462 ( -6972 ) + 10463 ( 6977 ) + 10464 ( 6978 ) + 10465 ( -6869 ) + 10466 ( 6979 ) + 10467 ( -6980 ) + 10468 ( -6981 ) + 10469 ( 4000 ) + 10470 ( -6847 ) + 10471 ( -6358 ) + 10472 ( -6935 ) + 10473 ( 6982 ) + 10474 ( 6983 ) + 10475 ( -6945 ) + 10476 ( -6924 ) + 10477 ( -6984 ) + 10478 ( -6985 ) + 10479 ( 6986 ) + 10480 ( 6987 ) + 10481 ( -6988 ) + 10482 ( -6989 ) + 10483 ( 6990 ) + 10484 ( -6923 ) + 10485 ( 6991 ) + 10486 ( 6992 ) + 10487 ( -6993 ) + 10488 ( 6994 ) + 10489 ( 6995 ) + 10490 ( -6996 ) + 10491 ( 6997 ) + 10492 ( 6998 ) + 10493 ( 6999 ) + 10494 ( 7000 ) + 10495 ( 7001 ) + 10496 ( 7002 ) + 10497 ( 7003 ) + 10498 ( 7004 ) + 10499 ( 7005 ) + 10500 ( 7006 ) + 10501 ( 7007 ) + 10502 ( 7008 ) + 10503 ( 7009 ) + 10504 ( 7010 ) + 10505 ( 7011 ) + 10506 ( -7004 ) + 10507 ( 7012 ) + 10508 ( 7013 ) + 10509 ( 7014 ) + 10510 ( 7015 ) + 10511 ( 7016 ) + 10512 ( 7017 ) + 10513 ( -7017 ) + 10514 ( -7010 ) + 10515 ( 7018 ) + 10516 ( 7019 ) + 10517 ( 7020 ) + 10518 ( 7021 ) + 10519 ( 7022 ) + 10520 ( 7023 ) + 10521 ( -7005 ) + 10522 ( -7022 ) + 10523 ( 7024 ) + 10524 ( 7025 ) + 10525 ( 7026 ) + 10526 ( 7027 ) + 10527 ( 7028 ) + 10528 ( -6999 ) + 10529 ( 7029 ) + 10530 ( -7030 ) + 10531 ( 7031 ) + 10532 ( 7032 ) + 10533 ( -7033 ) + 10534 ( 7034 ) + 10535 ( 7035 ) + 10536 ( 7036 ) + 10537 ( -7016 ) + 10538 ( -7018 ) + 10539 ( 7037 ) + 10540 ( 7038 ) + 10541 ( 7039 ) + 10542 ( 7040 ) + 10543 ( 7041 ) + 10544 ( 7042 ) + 10545 ( 7043 ) + 10546 ( 7044 ) + 10547 ( 7045 ) + 10548 ( 7046 ) + 10549 ( 7047 ) + 10550 ( 7048 ) + 10551 ( -7041 ) + 10552 ( 7049 ) + 10553 ( 7050 ) + 10554 ( 7051 ) + 10555 ( 7052 ) + 10556 ( 7053 ) + 10557 ( -7035 ) + 10558 ( 7054 ) + 10559 ( -7047 ) + 10560 ( 7055 ) + 10561 ( 7056 ) + 10562 ( 7057 ) + 10563 ( 7058 ) + 10564 ( 7059 ) + 10565 ( 7060 ) + 10566 ( -7049 ) + 10567 ( -7042 ) + 10568 ( -7060 ) + 10569 ( 7061 ) + 10570 ( 7062 ) + 10571 ( 7063 ) + 10572 ( 7064 ) + 10573 ( -7036 ) + 10574 ( -7065 ) + 10575 ( 7066 ) + 10576 ( 7067 ) + 10577 ( 7068 ) + 10578 ( 7069 ) + 10579 ( 7070 ) + 10580 ( 7071 ) + 10581 ( -7059 ) + 10582 ( -7061 ) + 10583 ( 7072 ) + 10584 ( 7073 ) + 10585 ( 7074 ) + 10586 ( 7075 ) + 10587 ( 7076 ) + 10588 ( 7077 ) + 10589 ( 7078 ) + 10590 ( 7079 ) + 10591 ( 7080 ) + 10592 ( 7081 ) + 10593 ( 7082 ) + 10594 ( 6897 ) + 10595 ( 6664 ) + 10596 ( 7083 ) + 10597 ( 7084 ) + 10598 ( 7085 ) + 10599 ( 7086 ) + 10600 ( 7087 ) + 10601 ( 7088 ) + 10602 ( 7089 ) + 10603 ( 7090 ) + 10604 ( 7091 ) + 10605 ( -7062 ) + 10606 ( -7019 ) + 10607 ( -7028 ) + 10608 ( 7092 ) + 10609 ( -7039 ) + 10610 ( -7072 ) + 10611 ( -7000 ) + 10612 ( 7093 ) + 10613 ( 7094 ) + 10614 ( 7095 ) + 10615 ( 7096 ) + 10616 ( 7097 ) + 10617 ( 7098 ) + 10618 ( 7099 ) + 10619 ( 7100 ) + 10620 ( 7101 ) + 10621 ( 6896 ) + 10622 ( -6884 ) + 10623 ( 7033 ) + 10624 ( 6996 ) + 10625 ( 7102 ) + 10626 ( 7103 ) + 10627 ( 7104 ) + 10628 ( 7105 ) + 10629 ( -7092 ) + 10630 ( 7106 ) + 10631 ( 7107 ) + 10632 ( 7108 ) + 10633 ( -7082 ) + 10634 ( 7109 ) + 10635 ( 7065 ) + 10636 ( 7110 ) + 10637 ( 7111 ) + 10638 ( 7112 ) + 10639 ( 7113 ) + 10640 ( 7114 ) + 10641 ( 7115 ) + 10642 ( -7081 ) + 10643 ( -7116 ) + 10644 ( -7117 ) + 10645 ( -7106 ) + 10646 ( 6899 ) + 10647 ( 7118 ) + 10648 ( 6898 ) + 10649 ( -7118 ) + 10650 ( -7113 ) + 10651 ( 7119 ) + 10652 ( -7103 ) + 10653 ( 7120 ) + 10654 ( 7121 ) + 10655 ( -7091 ) + 10656 ( 7117 ) + 10657 ( -7110 ) + 10658 ( 7122 ) + 10659 ( 7123 ) + 10660 ( -7089 ) + 10661 ( 7124 ) + 10662 ( 7125 ) + 10663 ( 7126 ) + 10664 ( -7111 ) + 10665 ( 6666 ) + 10666 ( 7127 ) + 10667 ( -7123 ) + 10668 ( -7088 ) + 10669 ( 7128 ) + 10670 ( 7129 ) + 10671 ( 7116 ) + 10672 ( -6900 ) + 10673 ( -7125 ) + 10674 ( -7090 ) + 10675 ( 7130 ) + 10676 ( -7109 ) + 10677 ( 6668 ) + 10678 ( -7086 ) + 10679 ( 7131 ) + 10680 ( 7132 ) + 10681 ( -7127 ) + 10682 ( -7098 ) + 10683 ( 7030 ) + 10684 ( 6993 ) + 10685 ( -6891 ) + 10686 ( 7133 ) + 10687 ( 7134 ) + 10688 ( 7135 ) + 10689 ( 7136 ) + 10690 ( 7137 ) + 10691 ( -7070 ) + 10692 ( -7114 ) + 10693 ( 7138 ) + 10694 ( 7139 ) + 10695 ( 7140 ) + 10696 ( -7138 ) + 10697 ( 7141 ) + 10698 ( 7142 ) + 10699 ( -7133 ) + 10700 ( -7119 ) + 10701 ( 7143 ) + 10702 ( 7144 ) + 10703 ( 7145 ) + 10704 ( 7146 ) + 10705 ( 7147 ) + 10706 ( 7148 ) + 10707 ( 7149 ) + 10708 ( 7150 ) + 10709 ( 7151 ) + 10710 ( 7152 ) + 10711 ( 7153 ) + 10712 ( -6997 ) + 10713 ( 7154 ) + 10714 ( -7144 ) + 10715 ( 7155 ) + 10716 ( 7156 ) + 10717 ( 7157 ) + 10718 ( 7158 ) + 10719 ( 7159 ) + 10720 ( -7085 ) + 10721 ( -7102 ) + 10722 ( 7160 ) + 10723 ( 7161 ) + 10724 ( 7162 ) + 10725 ( -7163 ) + 10726 ( 7164 ) + 10727 ( 7165 ) + 10728 ( 7166 ) + 10729 ( -7147 ) + 10730 ( 7167 ) + 10731 ( 7168 ) + 10732 ( -7169 ) + 10733 ( 7170 ) + 10734 ( -7161 ) + 10735 ( -7148 ) + 10736 ( 7171 ) + 10737 ( 7172 ) + 10738 ( 7173 ) + 10739 ( 7174 ) + 10740 ( 7169 ) + 10741 ( 7163 ) + 10742 ( -7157 ) + 10743 ( -7150 ) + 10744 ( 7175 ) + 10745 ( -7052 ) + 10746 ( -7045 ) + 10747 ( -7056 ) + 10748 ( 7176 ) + 10749 ( 7177 ) + 10750 ( -7013 ) + 10751 ( -7007 ) + 10752 ( 7178 ) + 10753 ( -7025 ) + 10754 ( -7037 ) + 10755 ( -7075 ) + 10756 ( -7002 ) + 10757 ( 7179 ) + 10758 ( 7180 ) + 10759 ( 7181 ) + 10760 ( 7182 ) + 10761 ( 7183 ) + 10762 ( 7184 ) + 10763 ( 7185 ) + 10764 ( -7177 ) + 10765 ( 7186 ) + 10766 ( 7187 ) + 10767 ( -7003 ) + 10768 ( 7188 ) + 10769 ( 7189 ) + 10770 ( 7190 ) + 10771 ( 7191 ) + 10772 ( -7176 ) + 10773 ( 7192 ) + 10774 ( -7185 ) + 10775 ( 7193 ) + 10776 ( 7194 ) + 10777 ( -7175 ) + 10778 ( 7195 ) + 10779 ( -7190 ) + 10780 ( -7040 ) + 10781 ( -7189 ) + 10782 ( -7011 ) + 10783 ( 7196 ) + 10784 ( -7174 ) + 10785 ( -7184 ) + 10786 ( -7194 ) + 10787 ( -7048 ) + 10788 ( -7034 ) + 10789 ( -7188 ) + 10790 ( 7197 ) + 10791 ( -7173 ) + 10792 ( -7054 ) + 10793 ( -7193 ) + 10794 ( -7071 ) + 10795 ( 7198 ) + 10796 ( 7199 ) + 10797 ( -7187 ) + 10798 ( 7200 ) + 10799 ( -7178 ) + 10800 ( 7201 ) + 10801 ( -7199 ) + 10802 ( -7023 ) + 10803 ( -7172 ) + 10804 ( 7202 ) + 10805 ( -7183 ) + 10806 ( -7160 ) + 10807 ( -7153 ) + 10808 ( 7203 ) + 10809 ( -6998 ) + 10810 ( 6879 ) + 10811 ( -4860 ) + 10812 ( 7204 ) + 10813 ( 7205 ) + 10814 ( 7206 ) + 10815 ( 7207 ) + 10816 ( 7208 ) + 10817 ( -4865 ) + 10818 ( -1164 ) + 10819 ( -4861 ) + 10820 ( 7209 ) + 10821 ( 7210 ) + 10822 ( -4863 ) + 10823 ( -7204 ) + 10824 ( 7211 ) + 10825 ( 7212 ) + 10826 ( -2264 ) + 10827 ( 7213 ) + 10828 ( 7214 ) + 10829 ( -2391 ) + 10830 ( 7215 ) + 10831 ( 7216 ) + 10832 ( 7217 ) + 10833 ( 7218 ) + 10834 ( 7219 ) + 10835 ( 7220 ) + 10836 ( 7221 ) + 10837 ( 7222 ) + 10838 ( 4007 ) + 10839 ( 3966 ) + 10840 ( 2371 ) + 10841 ( 2366 ) + 10842 ( -2336 ) + 10843 ( 7223 ) + 10844 ( 7224 ) + 10845 ( 7225 ) + 10846 ( 7226 ) + 10847 ( 6873 ) + 10848 ( -7214 ) + 10849 ( -2342 ) + 10850 ( 7227 ) + 10851 ( 7228 ) + 10852 ( -2295 ) + 10853 ( -2288 ) + 10854 ( 7229 ) + 10855 ( 7230 ) + 10856 ( 7231 ) + 10857 ( -2430 ) + 10858 ( -2423 ) + 10859 ( -7216 ) + 10860 ( 7232 ) + 10861 ( 7233 ) + 10862 ( 7234 ) + 10863 ( 7235 ) + 10864 ( 7236 ) + 10865 ( -7231 ) + 10866 ( 7237 ) + 10867 ( -2416 ) + 10868 ( -7235 ) + 10869 ( 7238 ) + 10870 ( -7230 ) + 10871 ( 7239 ) + 10872 ( -7213 ) + 10873 ( -2425 ) + 10874 ( 7240 ) + 10875 ( 7241 ) + 10876 ( 7242 ) + 10877 ( 7243 ) + 10878 ( 6958 ) + 10879 ( 6397 ) + 10880 ( 7244 ) + 10881 ( 7245 ) + 10882 ( 7246 ) + 10883 ( 7247 ) + 10884 ( 7248 ) + 10885 ( 7249 ) + 10886 ( 7250 ) + 10887 ( 7251 ) + 10888 ( 7252 ) + 10889 ( -7226 ) + 10890 ( 7253 ) + 10891 ( 7254 ) + 10892 ( 7255 ) + 10893 ( 7256 ) + 10894 ( 7257 ) + 10895 ( 7258 ) + 10896 ( 7259 ) + 10897 ( 7260 ) + 10898 ( 7261 ) + 10899 ( 7262 ) + 10900 ( 7263 ) + 10901 ( -7249 ) + 10902 ( -7258 ) + 10903 ( 7264 ) + 10904 ( 7265 ) + 10905 ( 7266 ) + 10906 ( 7267 ) + 10907 ( -7248 ) + 10908 ( 7268 ) + 10909 ( 7269 ) + 10910 ( 7270 ) + 10911 ( 7271 ) + 10912 ( 7272 ) + 10913 ( 7273 ) + 10914 ( 7274 ) + 10915 ( 7275 ) + 10916 ( 7276 ) + 10917 ( 7277 ) + 10918 ( 7278 ) + 10919 ( 7279 ) + 10920 ( -7222 ) + 10921 ( -6865 ) + 10922 ( 7280 ) + 10923 ( 7281 ) + 10924 ( 7282 ) + 10925 ( 7283 ) + 10926 ( 7284 ) + 10927 ( 7285 ) + 10928 ( 3998 ) + 10929 ( 6395 ) + 10930 ( 6985 ) + 10931 ( 3965 ) + 10932 ( 7286 ) + 10933 ( -7264 ) + 10934 ( -7256 ) + 10935 ( 7287 ) + 10936 ( 7288 ) + 10937 ( -7280 ) + 10938 ( 6959 ) + 10939 ( 6396 ) + 10940 ( 7289 ) + 10941 ( 7290 ) + 10942 ( 7291 ) + 10943 ( 7292 ) + 10944 ( -7225 ) + 10945 ( -6871 ) + 10946 ( -7252 ) + 10947 ( 7293 ) + 10948 ( -7243 ) + 10949 ( 7294 ) + 10950 ( 7295 ) + 10951 ( 7296 ) + 10952 ( 7297 ) + 10953 ( 7298 ) + 10954 ( -7242 ) + 10955 ( 7299 ) + 10956 ( 7300 ) + 10957 ( -7271 ) + 10958 ( 7301 ) + 10959 ( -7293 ) + 10960 ( -7300 ) + 10961 ( -7282 ) + 10962 ( -6399 ) + 10963 ( -7298 ) + 10964 ( 7302 ) + 10965 ( 7303 ) + 10966 ( -7246 ) + 10967 ( -6398 ) + 10968 ( -7296 ) + 10969 ( -7302 ) + 10970 ( -7289 ) + 10971 ( 7304 ) + 10972 ( 7305 ) + 10973 ( -7247 ) + 10974 ( 7306 ) + 10975 ( 7307 ) + 10976 ( -7273 ) + 10977 ( 6981 ) + 10978 ( 6953 ) + 10979 ( 6401 ) + 10980 ( 4004 ) + 10981 ( 7308 ) + 10982 ( -7290 ) + 10983 ( -6872 ) + 10984 ( 7309 ) + 10985 ( 7310 ) + 10986 ( 7311 ) + 10987 ( 7312 ) + 10988 ( 7313 ) + 10989 ( 7314 ) + 10990 ( -6911 ) + 10991 ( -7315 ) + 10992 ( 7316 ) + 10993 ( 7317 ) + 10994 ( 7318 ) + 10995 ( 7319 ) + 10996 ( 7320 ) + 10997 ( 7321 ) + 10998 ( 7322 ) + 10999 ( 6394 ) + 11000 ( 6984 ) + 11001 ( -7281 ) + 11002 ( 7323 ) + 11003 ( -7308 ) + 11004 ( -7284 ) + 11005 ( 7324 ) + 11006 ( 7325 ) + 11007 ( 7326 ) + 11008 ( 7327 ) + 11009 ( 7328 ) + 11010 ( -7285 ) + 11011 ( 6989 ) + 11012 ( -7324 ) + 11013 ( 7329 ) + 11014 ( 7330 ) + 11015 ( 7331 ) + 11016 ( -7283 ) + 11017 ( 6988 ) + 11018 ( -7331 ) + 11019 ( -7328 ) + 11020 ( -7323 ) + 11021 ( 7332 ) + 11022 ( 7333 ) + 11023 ( 7334 ) + 11024 ( -6960 ) + 11025 ( 7335 ) + 11026 ( 7336 ) + 11027 ( 7337 ) + 11028 ( 7338 ) + 11029 ( 7339 ) + 11030 ( 7340 ) + 11031 ( 7341 ) + 11032 ( -7251 ) + 11033 ( 7342 ) + 11034 ( 7343 ) + 11035 ( 7344 ) + 11036 ( 7345 ) + 11037 ( 7346 ) + 11038 ( -7338 ) + 11039 ( 7347 ) + 11040 ( -7343 ) + 11041 ( -7245 ) + 11042 ( 7348 ) + 11043 ( 7349 ) + 11044 ( 7350 ) + 11045 ( -7337 ) + 11046 ( -7257 ) + 11047 ( 7351 ) + 11048 ( 7352 ) + 11049 ( -7353 ) + 11050 ( 7354 ) + 11051 ( -7335 ) + 11052 ( 7355 ) + 11053 ( 7356 ) + 11054 ( -7241 ) + 11055 ( -7334 ) + 11056 ( 7357 ) + 11057 ( -6952 ) + 11058 ( -7358 ) + 11059 ( -7359 ) + 11060 ( -7360 ) + 11061 ( -7361 ) + 11062 ( -7351 ) + 11063 ( -7357 ) + 11064 ( -7355 ) + 11065 ( -7336 ) + 11066 ( -7244 ) + 11067 ( 7362 ) + 11068 ( 7363 ) + 11069 ( 7364 ) + 11070 ( 7365 ) + 11071 ( 7366 ) + 11072 ( 7367 ) + 11073 ( 7368 ) + 11074 ( 7369 ) + 11075 ( 7370 ) + 11076 ( -7221 ) + 11077 ( -7212 ) + 11078 ( 7371 ) + 11079 ( 7372 ) + 11080 ( -7229 ) + 11081 ( 7373 ) + 11082 ( -7364 ) + 11083 ( 7374 ) + 11084 ( -7375 ) + 11085 ( 7376 ) + 11086 ( 7377 ) + 11087 ( -7378 ) + 11088 ( -7363 ) + 11089 ( -6963 ) + 11090 ( 7379 ) + 11091 ( 7380 ) + 11092 ( -6961 ) + 11093 ( 7381 ) + 11094 ( 7382 ) + 11095 ( -7374 ) + 11096 ( -7370 ) + 11097 ( 7383 ) + 11098 ( -7379 ) + 11099 ( 7384 ) + 11100 ( -7224 ) + 11101 ( -7250 ) + 11102 ( 7385 ) + 11103 ( 7386 ) + 11104 ( 7387 ) + 11105 ( -7381 ) + 11106 ( 7388 ) + 11107 ( -7380 ) + 11108 ( -7240 ) + 11109 ( -7220 ) + 11110 ( 7389 ) + 11111 ( 7390 ) + 11112 ( 7391 ) + 11113 ( -6951 ) + 11114 ( -7385 ) + 11115 ( -7390 ) + 11116 ( -7388 ) + 11117 ( 7392 ) + 11118 ( -7223 ) + 11119 ( -7382 ) + 11120 ( -7391 ) + 11121 ( -6964 ) + 11122 ( -7386 ) + 11123 ( -7383 ) + 11124 ( 7393 ) + 11125 ( 7375 ) + 11126 ( -7365 ) + 11127 ( 7394 ) + 11128 ( 7395 ) + 11129 ( 7396 ) + 11130 ( 7397 ) + 11131 ( 7398 ) + 11132 ( 7378 ) + 11133 ( -6965 ) + 11134 ( 7399 ) + 11135 ( 7400 ) + 11136 ( 7401 ) + 11137 ( -7395 ) + 11138 ( 7402 ) + 11139 ( 7403 ) + 11140 ( 7404 ) + 11141 ( 7405 ) + 11142 ( 7406 ) + 11143 ( -7080 ) + 11144 ( 7407 ) + 11145 ( 7408 ) + 11146 ( 7409 ) + 11147 ( 7410 ) + 11148 ( 7411 ) + 11149 ( 7412 ) + 11150 ( -7413 ) + 11151 ( -7414 ) + 11152 ( 7415 ) + 11153 ( -6962 ) + 11154 ( 7416 ) + 11155 ( 7417 ) + 11156 ( 7418 ) + 11157 ( 7419 ) + 11158 ( -7401 ) + 11159 ( -7396 ) + 11160 ( -7347 ) + 11161 ( 7420 ) + 11162 ( 7421 ) + 11163 ( 7422 ) + 11164 ( -7340 ) + 11165 ( 7423 ) + 11166 ( 7424 ) + 11167 ( 7425 ) + 11168 ( -6969 ) + 11169 ( 7426 ) + 11170 ( 7427 ) + 11171 ( -6950 ) + 11172 ( 7360 ) + 11173 ( 7428 ) + 11174 ( -7422 ) + 11175 ( 7429 ) + 11176 ( 7430 ) + 11177 ( 7431 ) + 11178 ( -7406 ) + 11179 ( 7432 ) + 11180 ( 7433 ) + 11181 ( -7424 ) + 11182 ( -7405 ) + 11183 ( 7434 ) + 11184 ( -6949 ) + 11185 ( -7079 ) + 11186 ( -7435 ) + 11187 ( -7436 ) + 11188 ( -7429 ) + 11189 ( -7434 ) + 11190 ( -6966 ) + 11191 ( -7432 ) + 11192 ( -7419 ) + 11193 ( 7437 ) + 11194 ( 7438 ) + 11195 ( 7439 ) + 11196 ( -6974 ) + 11197 ( 7440 ) + 11198 ( -7423 ) + 11199 ( 7359 ) + 11200 ( 7441 ) + 11201 ( 7442 ) + 11202 ( 7443 ) + 11203 ( 7444 ) + 11204 ( -7421 ) + 11205 ( 7445 ) + 11206 ( 7446 ) + 11207 ( 7447 ) + 11208 ( -7418 ) + 11209 ( 7448 ) + 11210 ( 7449 ) + 11211 ( 7450 ) + 11212 ( 7451 ) + 11213 ( 7452 ) + 11214 ( 7453 ) + 11215 ( -7454 ) + 11216 ( -7078 ) + 11217 ( -7455 ) + 11218 ( -6895 ) + 11219 ( -7404 ) + 11220 ( -7456 ) + 11221 ( 7457 ) + 11222 ( -7447 ) + 11223 ( 7458 ) + 11224 ( -7443 ) + 11225 ( 7358 ) + 11226 ( 7353 ) + 11227 ( 7459 ) + 11228 ( 7460 ) + 11229 ( 7461 ) + 11230 ( -7428 ) + 11231 ( -7339 ) + 11232 ( -7420 ) + 11233 ( -7444 ) + 11234 ( 7462 ) + 11235 ( -7417 ) + 11236 ( 7463 ) + 11237 ( 7464 ) + 11238 ( -7461 ) + 11239 ( -7342 ) + 11240 ( -7462 ) + 11241 ( -7442 ) + 11242 ( -7416 ) + 11243 ( 7465 ) + 11244 ( 7466 ) + 11245 ( -7460 ) + 11246 ( -7445 ) + 11247 ( -7457 ) + 11248 ( 7361 ) + 11249 ( -7354 ) + 11250 ( -7459 ) + 11251 ( -7441 ) + 11252 ( 7467 ) + 11253 ( 7468 ) + 11254 ( 7469 ) + 11255 ( 7315 ) + 11256 ( 6980 ) + 11257 ( 6967 ) + 11258 ( 6402 ) + 11259 ( 7470 ) + 11260 ( 7471 ) + 11261 ( 7472 ) + 11262 ( -6921 ) + 11263 ( -6944 ) + 11264 ( -7310 ) + 11265 ( 7473 ) + 11266 ( 7474 ) + 11267 ( 7475 ) + 11268 ( 7476 ) + 11269 ( 7477 ) + 11270 ( 7478 ) + 11271 ( 7479 ) + 11272 ( -7480 ) + 11273 ( 7481 ) + 11274 ( 7482 ) + 11275 ( -7483 ) + 11276 ( -7484 ) + 11277 ( -7473 ) + 11278 ( 7485 ) + 11279 ( -7286 ) + 11280 ( 7413 ) + 11281 ( -7369 ) + 11282 ( 7486 ) + 11283 ( 7487 ) + 11284 ( 7488 ) + 11285 ( 7489 ) + 11286 ( -7394 ) + 11287 ( 7414 ) + 11288 ( -7486 ) + 11289 ( -7084 ) + 11290 ( 7490 ) + 11291 ( -7166 ) + 11292 ( 7491 ) + 11293 ( 7492 ) + 11294 ( -7143 ) + 11295 ( -7154 ) + 11296 ( 7454 ) + 11297 ( -7440 ) + 11298 ( 7435 ) + 11299 ( -7427 ) + 11300 ( -7407 ) + 11301 ( -7100 ) + 11302 ( -7095 ) + 11303 ( 7493 ) + 11304 ( 7494 ) + 11305 ( -6970 ) + 11306 ( -6975 ) + 11307 ( 7436 ) + 11308 ( -7431 ) + 11309 ( -7415 ) + 11310 ( -7083 ) + 11311 ( 7495 ) + 11312 ( 7496 ) + 11313 ( 7497 ) + 11314 ( -7410 ) + 11315 ( 7498 ) + 11316 ( -7451 ) + 11317 ( 7499 ) + 11318 ( -7087 ) + 11319 ( 7500 ) + 11320 ( -7122 ) + 11321 ( 7501 ) + 11322 ( -7411 ) + 11323 ( -7452 ) + 11324 ( 7502 ) + 11325 ( 7503 ) + 11326 ( -7499 ) + 11327 ( -7501 ) + 11328 ( -7126 ) + 11329 ( 7504 ) + 11330 ( -7077 ) + 11331 ( -7497 ) + 11332 ( -7403 ) + 11333 ( -6667 ) + 11334 ( 7505 ) + 11335 ( 7506 ) + 11336 ( 7456 ) + 11337 ( -7412 ) + 11338 ( 7507 ) + 11339 ( -7498 ) + 11340 ( -7446 ) + 11341 ( -7129 ) + 11342 ( -7076 ) + 11343 ( 7508 ) + 11344 ( -7496 ) + 11345 ( -7506 ) + 11346 ( -7402 ) + 11347 ( 7455 ) + 11348 ( -6901 ) + 11349 ( 7509 ) + 11350 ( 7510 ) + 11351 ( 7511 ) + 11352 ( 7512 ) + 11353 ( 7513 ) + 11354 ( 7514 ) + 11355 ( 7515 ) + 11356 ( 7516 ) + 11357 ( 7517 ) + 11358 ( 7518 ) + 11359 ( 7519 ) + 11360 ( 7520 ) + 11361 ( 7521 ) + 11362 ( 7522 ) + 11363 ( 7523 ) + 11364 ( 7524 ) + 11365 ( 7525 ) + 11366 ( 7526 ) + 11367 ( 7527 ) + 11368 ( 7528 ) + 11369 ( 7529 ) + 11370 ( -7520 ) + 11371 ( 7530 ) + 11372 ( -7512 ) + 11373 ( -7531 ) + 11374 ( -7532 ) + 11375 ( -7533 ) + 11376 ( -7534 ) + 11377 ( 7535 ) + 11378 ( -7536 ) + 11379 ( 7537 ) + 11380 ( 7538 ) + 11381 ( 7539 ) + 11382 ( 7540 ) + 11383 ( 7541 ) + 11384 ( 7542 ) + 11385 ( 7543 ) + 11386 ( 7544 ) + 11387 ( 7545 ) + 11388 ( 3638 ) + 11389 ( 3677 ) + 11390 ( -3319 ) + 11391 ( 7546 ) + 11392 ( 7547 ) + 11393 ( 7548 ) + 11394 ( 7549 ) + 11395 ( -3312 ) + 11396 ( -3695 ) + 11397 ( 7550 ) + 11398 ( -3262 ) + 11399 ( -3272 ) + 11400 ( 3251 ) + 11401 ( 7551 ) + 11402 ( 3636 ) + 11403 ( 7552 ) + 11404 ( 7553 ) + 11405 ( 7554 ) + 11406 ( 7555 ) + 11407 ( 7556 ) + 11408 ( 7557 ) + 11409 ( 7558 ) + 11410 ( 7559 ) + 11411 ( 3648 ) + 11412 ( 7560 ) + 11413 ( -7540 ) + 11414 ( 7561 ) + 11415 ( 7562 ) + 11416 ( 7563 ) + 11417 ( 7564 ) + 11418 ( 7565 ) + 11419 ( 7566 ) + 11420 ( -7552 ) + 11421 ( 3655 ) + 11422 ( -3645 ) + 11423 ( 7567 ) + 11424 ( 7568 ) + 11425 ( -7555 ) + 11426 ( 7569 ) + 11427 ( 3653 ) + 11428 ( -3646 ) + 11429 ( 7570 ) + 11430 ( 7571 ) + 11431 ( 7572 ) + 11432 ( -7567 ) + 11433 ( 7573 ) + 11434 ( 7574 ) + 11435 ( 7575 ) + 11436 ( -7537 ) + 11437 ( 7576 ) + 11438 ( 7577 ) + 11439 ( -7569 ) + 11440 ( 7578 ) + 11441 ( -3637 ) + 11442 ( -7573 ) + 11443 ( 7579 ) + 11444 ( 7580 ) + 11445 ( 7581 ) + 11446 ( -7582 ) + 11447 ( 7583 ) + 11448 ( 7584 ) + 11449 ( 7585 ) + 11450 ( -7543 ) + 11451 ( 7586 ) + 11452 ( -7563 ) + 11453 ( 7582 ) + 11454 ( 3349 ) + 11455 ( 3344 ) + 11456 ( 3330 ) + 11457 ( -3311 ) + 11458 ( 7587 ) + 11459 ( 7588 ) + 11460 ( 7589 ) + 11461 ( 7590 ) + 11462 ( 7591 ) + 11463 ( 7592 ) + 11464 ( -7548 ) + 11465 ( -7561 ) + 11466 ( 7593 ) + 11467 ( 7594 ) + 11468 ( -3282 ) + 11469 ( 7595 ) + 11470 ( 7596 ) + 11471 ( 7597 ) + 11472 ( 7598 ) + 11473 ( 3238 ) + 11474 ( 7599 ) + 11475 ( 7600 ) + 11476 ( 7601 ) + 11477 ( 7602 ) + 11478 ( 7603 ) + 11479 ( -3351 ) + 11480 ( -3379 ) + 11481 ( -7604 ) + 11482 ( 7605 ) + 11483 ( 7606 ) + 11484 ( 7607 ) + 11485 ( 7608 ) + 11486 ( 7609 ) + 11487 ( -7603 ) + 11488 ( 7610 ) + 11489 ( -7611 ) + 11490 ( 7612 ) + 11491 ( 7613 ) + 11492 ( 7614 ) + 11493 ( 7615 ) + 11494 ( -7602 ) + 11495 ( 7616 ) + 11496 ( 7617 ) + 11497 ( 7618 ) + 11498 ( 7619 ) + 11499 ( 7620 ) + 11500 ( 7621 ) + 11501 ( 7622 ) + 11502 ( -7600 ) + 11503 ( 7623 ) + 11504 ( 3348 ) + 11505 ( 3345 ) + 11506 ( -3333 ) + 11507 ( 7624 ) + 11508 ( -7590 ) + 11509 ( 7534 ) + 11510 ( 7625 ) + 11511 ( 7626 ) + 11512 ( 7627 ) + 11513 ( 7628 ) + 11514 ( 7629 ) + 11515 ( 7630 ) + 11516 ( -7523 ) + 11517 ( 7631 ) + 11518 ( 7632 ) + 11519 ( 7633 ) + 11520 ( 7634 ) + 11521 ( 7635 ) + 11522 ( 7636 ) + 11523 ( 7637 ) + 11524 ( 7638 ) + 11525 ( 7639 ) + 11526 ( 7640 ) + 11527 ( 7533 ) + 11528 ( 7641 ) + 11529 ( 7642 ) + 11530 ( 7643 ) + 11531 ( -7640 ) + 11532 ( 7644 ) + 11533 ( 7532 ) + 11534 ( 7645 ) + 11535 ( 7646 ) + 11536 ( -7629 ) + 11537 ( -7638 ) + 11538 ( -7643 ) + 11539 ( 7647 ) + 11540 ( 7648 ) + 11541 ( 7649 ) + 11542 ( 7650 ) + 11543 ( 7651 ) + 11544 ( 7652 ) + 11545 ( 7653 ) + 11546 ( 7654 ) + 11547 ( 7655 ) + 11548 ( 7656 ) + 11549 ( 7657 ) + 11550 ( 7658 ) + 11551 ( 7659 ) + 11552 ( 7660 ) + 11553 ( -7660 ) + 11554 ( 7661 ) + 11555 ( 7662 ) + 11556 ( 7663 ) + 11557 ( 7664 ) + 11558 ( 7665 ) + 11559 ( -7661 ) + 11560 ( 7666 ) + 11561 ( 7667 ) + 11562 ( 7668 ) + 11563 ( 7669 ) + 11564 ( -7636 ) + 11565 ( 7531 ) + 11566 ( 7670 ) + 11567 ( 7671 ) + 11568 ( 7672 ) + 11569 ( 7673 ) + 11570 ( 7674 ) + 11571 ( 7675 ) + 11572 ( 7676 ) + 11573 ( -7628 ) + 11574 ( -7635 ) + 11575 ( -7641 ) + 11576 ( -7646 ) + 11577 ( -7655 ) + 11578 ( 7677 ) + 11579 ( 7678 ) + 11580 ( 7679 ) + 11581 ( 7680 ) + 11582 ( 7681 ) + 11583 ( 7682 ) + 11584 ( 7683 ) + 11585 ( 7684 ) + 11586 ( 7685 ) + 11587 ( -7686 ) + 11588 ( -7687 ) + 11589 ( 7688 ) + 11590 ( 7689 ) + 11591 ( 7690 ) + 11592 ( -7656 ) + 11593 ( 7691 ) + 11594 ( -7684 ) + 11595 ( 7692 ) + 11596 ( 7693 ) + 11597 ( 7694 ) + 11598 ( -7695 ) + 11599 ( 7696 ) + 11600 ( 7697 ) + 11601 ( 7698 ) + 11602 ( 7699 ) + 11603 ( -7671 ) + 11604 ( 7700 ) + 11605 ( 7701 ) + 11606 ( 7702 ) + 11607 ( 7703 ) + 11608 ( -7633 ) + 11609 ( -7554 ) + 11610 ( 7704 ) + 11611 ( 7705 ) + 11612 ( 7706 ) + 11613 ( 7707 ) + 11614 ( 7708 ) + 11615 ( 7709 ) + 11616 ( 7710 ) + 11617 ( 7711 ) + 11618 ( 7712 ) + 11619 ( -7703 ) + 11620 ( -7708 ) + 11621 ( 7713 ) + 11622 ( 7714 ) + 11623 ( -7651 ) + 11624 ( 7715 ) + 11625 ( 7716 ) + 11626 ( 7717 ) + 11627 ( 7718 ) + 11628 ( 7719 ) + 11629 ( 7720 ) + 11630 ( 7721 ) + 11631 ( 7722 ) + 11632 ( 7723 ) + 11633 ( 7724 ) + 11634 ( 7725 ) + 11635 ( 7726 ) + 11636 ( 7727 ) + 11637 ( 7728 ) + 11638 ( 7729 ) + 11639 ( 7730 ) + 11640 ( 7731 ) + 11641 ( -7720 ) + 11642 ( 7732 ) + 11643 ( 7733 ) + 11644 ( 7734 ) + 11645 ( 7735 ) + 11646 ( 7736 ) + 11647 ( 7737 ) + 11648 ( 7738 ) + 11649 ( 7739 ) + 11650 ( -7734 ) + 11651 ( -7727 ) + 11652 ( 7740 ) + 11653 ( 7741 ) + 11654 ( 7742 ) + 11655 ( 7743 ) + 11656 ( -7742 ) + 11657 ( -7738 ) + 11658 ( 7744 ) + 11659 ( -7715 ) + 11660 ( 7745 ) + 11661 ( -7728 ) + 11662 ( 7746 ) + 11663 ( 7747 ) + 11664 ( 7748 ) + 11665 ( 7749 ) + 11666 ( 7750 ) + 11667 ( 7751 ) + 11668 ( -7682 ) + 11669 ( -7718 ) + 11670 ( 7752 ) + 11671 ( -7751 ) + 11672 ( -7717 ) + 11673 ( -7681 ) + 11674 ( 7753 ) + 11675 ( 7754 ) + 11676 ( 7755 ) + 11677 ( 7756 ) + 11678 ( 7757 ) + 11679 ( 7758 ) + 11680 ( -7748 ) + 11681 ( -7730 ) + 11682 ( 7759 ) + 11683 ( 7760 ) + 11684 ( 7761 ) + 11685 ( 7762 ) + 11686 ( -7726 ) + 11687 ( 7763 ) + 11688 ( 7764 ) + 11689 ( -7760 ) + 11690 ( 7765 ) + 11691 ( 7766 ) + 11692 ( -7725 ) + 11693 ( -7754 ) + 11694 ( -7700 ) + 11695 ( 7767 ) + 11696 ( 7768 ) + 11697 ( -7627 ) + 11698 ( -7645 ) + 11699 ( -7674 ) + 11700 ( 7769 ) + 11701 ( 7770 ) + 11702 ( -7652 ) + 11703 ( 7771 ) + 11704 ( 7772 ) + 11705 ( 7773 ) + 11706 ( 7774 ) + 11707 ( 7775 ) + 11708 ( 7776 ) + 11709 ( 7777 ) + 11710 ( 7778 ) + 11711 ( 7779 ) + 11712 ( 7780 ) + 11713 ( 7781 ) + 11714 ( 7782 ) + 11715 ( 7783 ) + 11716 ( 7784 ) + 11717 ( 7785 ) + 11718 ( 7786 ) + 11719 ( 7787 ) + 11720 ( 7788 ) + 11721 ( 7789 ) + 11722 ( 7790 ) + 11723 ( 7791 ) + 11724 ( 7792 ) + 11725 ( 7793 ) + 11726 ( 7794 ) + 11727 ( 7795 ) + 11728 ( -7773 ) + 11729 ( 7796 ) + 11730 ( 7797 ) + 11731 ( 7798 ) + 11732 ( 7799 ) + 11733 ( 7800 ) + 11734 ( 7801 ) + 11735 ( -7796 ) + 11736 ( 7802 ) + 11737 ( -7790 ) + 11738 ( 7803 ) + 11739 ( 7804 ) + 11740 ( 7805 ) + 11741 ( -7805 ) + 11742 ( -7801 ) + 11743 ( -7771 ) + 11744 ( 7806 ) + 11745 ( 7807 ) + 11746 ( -7791 ) + 11747 ( 7808 ) + 11748 ( 7809 ) + 11749 ( 7810 ) + 11750 ( -7811 ) + 11751 ( 7812 ) + 11752 ( -7813 ) + 11753 ( -7814 ) + 11754 ( -7815 ) + 11755 ( -7816 ) + 11756 ( -7817 ) + 11757 ( -7782 ) + 11758 ( 7818 ) + 11759 ( 7819 ) + 11760 ( 7820 ) + 11761 ( 7821 ) + 11762 ( 7822 ) + 11763 ( 7823 ) + 11764 ( 7824 ) + 11765 ( 7825 ) + 11766 ( -7785 ) + 11767 ( -7820 ) + 11768 ( 7826 ) + 11769 ( 7827 ) + 11770 ( 7828 ) + 11771 ( 7829 ) + 11772 ( -7784 ) + 11773 ( -7829 ) + 11774 ( -7825 ) + 11775 ( 7830 ) + 11776 ( 7831 ) + 11777 ( -7818 ) + 11778 ( 7832 ) + 11779 ( 7833 ) + 11780 ( 7686 ) + 11781 ( -7657 ) + 11782 ( 7834 ) + 11783 ( 7835 ) + 11784 ( -7774 ) + 11785 ( 7836 ) + 11786 ( 7837 ) + 11787 ( 7838 ) + 11788 ( 7839 ) + 11789 ( -7679 ) + 11790 ( 7687 ) + 11791 ( -7658 ) + 11792 ( -7775 ) + 11793 ( 7840 ) + 11794 ( 7841 ) + 11795 ( 7842 ) + 11796 ( 7843 ) + 11797 ( -7839 ) + 11798 ( 7844 ) + 11799 ( 7845 ) + 11800 ( 7846 ) + 11801 ( 7847 ) + 11802 ( 7848 ) + 11803 ( 7849 ) + 11804 ( -7795 ) + 11805 ( 7850 ) + 11806 ( 7851 ) + 11807 ( 7852 ) + 11808 ( 7853 ) + 11809 ( 7854 ) + 11810 ( 7855 ) + 11811 ( 7856 ) + 11812 ( 7857 ) + 11813 ( 7858 ) + 11814 ( -7835 ) + 11815 ( -7849 ) + 11816 ( 7859 ) + 11817 ( 7860 ) + 11818 ( -7789 ) + 11819 ( -7858 ) + 11820 ( -7834 ) + 11821 ( -7848 ) + 11822 ( 7861 ) + 11823 ( 7862 ) + 11824 ( 7863 ) + 11825 ( -7788 ) + 11826 ( -7688 ) + 11827 ( 7864 ) + 11828 ( -7861 ) + 11829 ( -7794 ) + 11830 ( 7865 ) + 11831 ( 7866 ) + 11832 ( -7843 ) + 11833 ( -7856 ) + 11834 ( 7867 ) + 11835 ( 7868 ) + 11836 ( 7813 ) + 11837 ( -7780 ) + 11838 ( 7869 ) + 11839 ( 7870 ) + 11840 ( 7871 ) + 11841 ( 7872 ) + 11842 ( 7873 ) + 11843 ( -7854 ) + 11844 ( 7874 ) + 11845 ( 7875 ) + 11846 ( 7876 ) + 11847 ( 7877 ) + 11848 ( -7779 ) + 11849 ( 7817 ) + 11850 ( 7878 ) + 11851 ( 7879 ) + 11852 ( 7880 ) + 11853 ( 7881 ) + 11854 ( -7778 ) + 11855 ( -7882 ) + 11856 ( -7874 ) + 11857 ( -7846 ) + 11858 ( 7883 ) + 11859 ( 7814 ) + 11860 ( -7786 ) + 11861 ( -7883 ) + 11862 ( -7878 ) + 11863 ( 7884 ) + 11864 ( 7885 ) + 11865 ( -7847 ) + 11866 ( -7869 ) + 11867 ( -7689 ) + 11868 ( 7886 ) + 11869 ( -7793 ) + 11870 ( 7887 ) + 11871 ( 7888 ) + 11872 ( -7842 ) + 11873 ( -7866 ) + 11874 ( 7889 ) + 11875 ( 7882 ) + 11876 ( -7787 ) + 11877 ( 7890 ) + 11878 ( -7886 ) + 11879 ( -7845 ) + 11880 ( -7864 ) + 11881 ( 7891 ) + 11882 ( 7811 ) + 11883 ( 7892 ) + 11884 ( 7893 ) + 11885 ( 7894 ) + 11886 ( 7895 ) + 11887 ( 7896 ) + 11888 ( 7897 ) + 11889 ( -7872 ) + 11890 ( 7815 ) + 11891 ( -7879 ) + 11892 ( 7898 ) + 11893 ( 7899 ) + 11894 ( 7900 ) + 11895 ( 7901 ) + 11896 ( 7902 ) + 11897 ( 7816 ) + 11898 ( -7898 ) + 11899 ( 7903 ) + 11900 ( 7904 ) + 11901 ( -7892 ) + 11902 ( 7905 ) + 11903 ( -7884 ) + 11904 ( 7906 ) + 11905 ( 7907 ) + 11906 ( 7908 ) + 11907 ( 7909 ) + 11908 ( 7910 ) + 11909 ( 7911 ) + 11910 ( 7912 ) + 11911 ( 7913 ) + 11912 ( 7914 ) + 11913 ( 7915 ) + 11914 ( 7916 ) + 11915 ( 7917 ) + 11916 ( 7918 ) + 11917 ( 7919 ) + 11918 ( 7920 ) + 11919 ( 7921 ) + 11920 ( 7922 ) + 11921 ( 7923 ) + 11922 ( 7924 ) + 11923 ( 7925 ) + 11924 ( 7926 ) + 11925 ( 7927 ) + 11926 ( 7928 ) + 11927 ( 7929 ) + 11928 ( -7912 ) + 11929 ( 7930 ) + 11930 ( 7931 ) + 11931 ( -7922 ) + 11932 ( 7932 ) + 11933 ( 7933 ) + 11934 ( -7929 ) + 11935 ( -7911 ) + 11936 ( 7934 ) + 11937 ( 7935 ) + 11938 ( -7921 ) + 11939 ( 7936 ) + 11940 ( 7937 ) + 11941 ( -7938 ) + 11942 ( -7939 ) + 11943 ( 7940 ) + 11944 ( 7941 ) + 11945 ( 7942 ) + 11946 ( 7943 ) + 11947 ( 7944 ) + 11948 ( 7945 ) + 11949 ( -7927 ) + 11950 ( 7946 ) + 11951 ( 7947 ) + 11952 ( 7948 ) + 11953 ( -7714 ) + 11954 ( -7724 ) + 11955 ( 7949 ) + 11956 ( -7950 ) + 11957 ( -7743 ) + 11958 ( -7733 ) + 11959 ( -7739 ) + 11960 ( -7951 ) + 11961 ( 7952 ) + 11962 ( 7953 ) + 11963 ( 7954 ) + 11964 ( 7955 ) + 11965 ( 7956 ) + 11966 ( 7957 ) + 11967 ( 7958 ) + 11968 ( -7915 ) + 11969 ( 7959 ) + 11970 ( 7950 ) + 11971 ( -7653 ) + 11972 ( 7960 ) + 11973 ( 7961 ) + 11974 ( -7802 ) + 11975 ( -7797 ) + 11976 ( -7808 ) + 11977 ( 7962 ) + 11978 ( 7963 ) + 11979 ( 7964 ) + 11980 ( -7772 ) + 11981 ( -7792 ) + 11982 ( -7914 ) + 11983 ( 7965 ) + 11984 ( -7783 ) + 11985 ( 7966 ) + 11986 ( -7826 ) + 11987 ( -7821 ) + 11988 ( -7832 ) + 11989 ( -7913 ) + 11990 ( -7819 ) + 11991 ( 7967 ) + 11992 ( -7962 ) + 11993 ( 7968 ) + 11994 ( -7909 ) + 11995 ( 7969 ) + 11996 ( -7970 ) + 11997 ( 7971 ) + 11998 ( 7972 ) + 11999 ( -7968 ) + 12000 ( -7908 ) + 12001 ( 7973 ) + 12002 ( -7974 ) + 12003 ( -7960 ) + 12004 ( 7975 ) + 12005 ( -7975 ) + 12006 ( -7972 ) + 12007 ( -7961 ) + 12008 ( 7976 ) + 12009 ( -7977 ) + 12010 ( -7910 ) + 12011 ( -7966 ) + 12012 ( 7978 ) + 12013 ( 7979 ) + 12014 ( 7980 ) + 12015 ( 7981 ) + 12016 ( -3350 ) + 12017 ( 7982 ) + 12018 ( 7983 ) + 12019 ( 7984 ) + 12020 ( -7982 ) + 12021 ( 7985 ) + 12022 ( 7986 ) + 12023 ( 7987 ) + 12024 ( 7988 ) + 12025 ( -7984 ) + 12026 ( 7989 ) + 12027 ( -7958 ) + 12028 ( 7990 ) + 12029 ( 7991 ) + 12030 ( 7992 ) + 12031 ( 7993 ) + 12032 ( 7994 ) + 12033 ( 7995 ) + 12034 ( 7996 ) + 12035 ( 7997 ) + 12036 ( 7998 ) + 12037 ( 7999 ) + 12038 ( 8000 ) + 12039 ( 7695 ) + 12040 ( 8001 ) + 12041 ( 8002 ) + 12042 ( 8003 ) + 12043 ( 8004 ) + 12044 ( 8005 ) + 12045 ( 8006 ) + 12046 ( -7673 ) + 12047 ( 8007 ) + 12048 ( 8008 ) + 12049 ( 8009 ) + 12050 ( 8010 ) + 12051 ( 8011 ) + 12052 ( 8012 ) + 12053 ( -7999 ) + 12054 ( -8007 ) + 12055 ( 7536 ) + 12056 ( -7670 ) + 12057 ( -7625 ) + 12058 ( -7521 ) + 12059 ( -8013 ) + 12060 ( 8014 ) + 12061 ( -8004 ) + 12062 ( 8015 ) + 12063 ( 8016 ) + 12064 ( 8017 ) + 12065 ( 8018 ) + 12066 ( 8019 ) + 12067 ( 8020 ) + 12068 ( -7996 ) + 12069 ( -7693 ) + 12070 ( 8021 ) + 12071 ( 8022 ) + 12072 ( -8019 ) + 12073 ( -8009 ) + 12074 ( 8023 ) + 12075 ( 8024 ) + 12076 ( -8025 ) + 12077 ( 8026 ) + 12078 ( 8027 ) + 12079 ( 8028 ) + 12080 ( 8029 ) + 12081 ( 8030 ) + 12082 ( -7619 ) + 12083 ( 8031 ) + 12084 ( -8029 ) + 12085 ( 8032 ) + 12086 ( 8033 ) + 12087 ( 8034 ) + 12088 ( 8035 ) + 12089 ( -8031 ) + 12090 ( 8036 ) + 12091 ( -8016 ) + 12092 ( 8037 ) + 12093 ( 8038 ) + 12094 ( 8039 ) + 12095 ( 8013 ) + 12096 ( -7698 ) + 12097 ( 8040 ) + 12098 ( -8002 ) + 12099 ( -7522 ) + 12100 ( -7626 ) + 12101 ( -7672 ) + 12102 ( -7767 ) + 12103 ( 8041 ) + 12104 ( 8025 ) + 12105 ( 3237 ) + 12106 ( 4067 ) + 12107 ( -3295 ) + 12108 ( 8042 ) + 12109 ( 8043 ) + 12110 ( 8044 ) + 12111 ( 8045 ) + 12112 ( 8046 ) + 12113 ( 4062 ) + 12114 ( 8047 ) + 12115 ( 8048 ) + 12116 ( 8049 ) + 12117 ( 8050 ) + 12118 ( -7596 ) + 12119 ( -7617 ) + 12120 ( 8051 ) + 12121 ( 8052 ) + 12122 ( 8053 ) + 12123 ( 8054 ) + 12124 ( 8055 ) + 12125 ( 8056 ) + 12126 ( -8017 ) + 12127 ( -7994 ) + 12128 ( -8024 ) + 12129 ( -8039 ) + 12130 ( -8035 ) + 12131 ( 8057 ) + 12132 ( 8058 ) + 12133 ( 8059 ) + 12134 ( -8054 ) + 12135 ( -8060 ) + 12136 ( 8061 ) + 12137 ( 8062 ) + 12138 ( -4053 ) + 12139 ( 4068 ) + 12140 ( -8045 ) + 12141 ( 8060 ) + 12142 ( 4059 ) + 12143 ( 7611 ) + 12144 ( 7604 ) + 12145 ( -3283 ) + 12146 ( 8063 ) + 12147 ( 8064 ) + 12148 ( 8065 ) + 12149 ( 8066 ) + 12150 ( -8043 ) + 12151 ( -7595 ) + 12152 ( 8067 ) + 12153 ( 8068 ) + 12154 ( -8065 ) + 12155 ( -7616 ) + 12156 ( -8042 ) + 12157 ( 8069 ) + 12158 ( 8070 ) + 12159 ( 8071 ) + 12160 ( -3983 ) + 12161 ( 8072 ) + 12162 ( 8073 ) + 12163 ( 8074 ) + 12164 ( -3974 ) + 12165 ( 8075 ) + 12166 ( -3961 ) + 12167 ( -8076 ) + 12168 ( -4060 ) + 12169 ( -7606 ) + 12170 ( -4070 ) + 12171 ( -3384 ) + 12172 ( 8077 ) + 12173 ( 8078 ) + 12174 ( 8079 ) + 12175 ( -3361 ) + 12176 ( 4085 ) + 12177 ( -4073 ) + 12178 ( 8080 ) + 12179 ( 8081 ) + 12180 ( -8062 ) + 12181 ( -7608 ) + 12182 ( -8077 ) + 12183 ( 8082 ) + 12184 ( -8081 ) + 12185 ( 8083 ) + 12186 ( -8084 ) + 12187 ( 8085 ) + 12188 ( 8086 ) + 12189 ( 8087 ) + 12190 ( -7907 ) + 12191 ( -7920 ) + 12192 ( -7928 ) + 12193 ( -7933 ) + 12194 ( 7939 ) + 12195 ( 8088 ) + 12196 ( 8089 ) + 12197 ( 8090 ) + 12198 ( 7951 ) + 12199 ( -7978 ) + 12200 ( -7954 ) + 12201 ( -7992 ) + 12202 ( -7988 ) + 12203 ( 8091 ) + 12204 ( 8092 ) + 12205 ( 8093 ) + 12206 ( 8094 ) + 12207 ( 8095 ) + 12208 ( 8096 ) + 12209 ( 8097 ) + 12210 ( 8098 ) + 12211 ( 8099 ) + 12212 ( 7938 ) + 12213 ( 8084 ) + 12214 ( 8100 ) + 12215 ( 8101 ) + 12216 ( 8102 ) + 12217 ( 8103 ) + 12218 ( 8104 ) + 12219 ( 8105 ) + 12220 ( 8106 ) + 12221 ( 8107 ) + 12222 ( 8108 ) + 12223 ( 8109 ) + 12224 ( 8110 ) + 12225 ( 8111 ) + 12226 ( 8112 ) + 12227 ( 8113 ) + 12228 ( 8114 ) + 12229 ( 8115 ) + 12230 ( 8116 ) + 12231 ( -8095 ) + 12232 ( -8107 ) + 12233 ( 8117 ) + 12234 ( 8118 ) + 12235 ( -8088 ) + 12236 ( -7955 ) + 12237 ( -8101 ) + 12238 ( 8119 ) + 12239 ( 8120 ) + 12240 ( 8121 ) + 12241 ( 8122 ) + 12242 ( -8089 ) + 12243 ( -8102 ) + 12244 ( 8123 ) + 12245 ( 8124 ) + 12246 ( -8122 ) + 12247 ( 8125 ) + 12248 ( 8126 ) + 12249 ( -8124 ) + 12250 ( -8121 ) + 12251 ( 8127 ) + 12252 ( -8075 ) + 12253 ( 8128 ) + 12254 ( 8129 ) + 12255 ( 8130 ) + 12256 ( 8131 ) + 12257 ( 8132 ) + 12258 ( 8133 ) + 12259 ( -8128 ) + 12260 ( 8134 ) + 12261 ( 8135 ) + 12262 ( 8136 ) + 12263 ( 8137 ) + 12264 ( 8138 ) + 12265 ( 8139 ) + 12266 ( 8140 ) + 12267 ( 8141 ) + 12268 ( 8142 ) + 12269 ( -8106 ) + 12270 ( -8138 ) + 12271 ( 8143 ) + 12272 ( -8144 ) + 12273 ( 8145 ) + 12274 ( 8146 ) + 12275 ( 8147 ) + 12276 ( -8070 ) + 12277 ( 8148 ) + 12278 ( 8149 ) + 12279 ( -8150 ) + 12280 ( 8151 ) + 12281 ( 8152 ) + 12282 ( 8153 ) + 12283 ( -8145 ) + 12284 ( 8154 ) + 12285 ( 8155 ) + 12286 ( -8155 ) + 12287 ( 8156 ) + 12288 ( 8157 ) + 12289 ( 8158 ) + 12290 ( 8159 ) + 12291 ( 8160 ) + 12292 ( -8100 ) + 12293 ( -8074 ) + 12294 ( -8149 ) + 12295 ( -8130 ) + 12296 ( 8161 ) + 12297 ( 8162 ) + 12298 ( 8163 ) + 12299 ( 8164 ) + 12300 ( -7956 ) + 12301 ( -8159 ) + 12302 ( -8104 ) + 12303 ( 8165 ) + 12304 ( 8166 ) + 12305 ( 8167 ) + 12306 ( -8119 ) + 12307 ( -8160 ) + 12308 ( -8105 ) + 12309 ( 8168 ) + 12310 ( 8169 ) + 12311 ( -8126 ) + 12312 ( -8165 ) + 12313 ( 8170 ) + 12314 ( 8171 ) + 12315 ( 8172 ) + 12316 ( 8173 ) + 12317 ( 8174 ) + 12318 ( 8175 ) + 12319 ( 8176 ) + 12320 ( -8114 ) + 12321 ( -8096 ) + 12322 ( -7941 ) + 12323 ( 8177 ) + 12324 ( 8178 ) + 12325 ( 8179 ) + 12326 ( 8180 ) + 12327 ( -8174 ) + 12328 ( 8181 ) + 12329 ( 8182 ) + 12330 ( 8183 ) + 12331 ( -8113 ) + 12332 ( -8173 ) + 12333 ( -8178 ) + 12334 ( -8099 ) + 12335 ( 8184 ) + 12336 ( -8098 ) + 12337 ( -7945 ) + 12338 ( -8184 ) + 12339 ( -8181 ) + 12340 ( 8185 ) + 12341 ( -8177 ) + 12342 ( -6868 ) + 12343 ( -6848 ) + 12344 ( -6842 ) + 12345 ( 4003 ) + 12346 ( 3715 ) + 12347 ( 3700 ) + 12348 ( 3687 ) + 12349 ( -3821 ) + 12350 ( -3813 ) + 12351 ( -6795 ) + 12352 ( -6789 ) + 12353 ( 8186 ) + 12354 ( 8187 ) + 12355 ( 8188 ) + 12356 ( 8189 ) + 12357 ( 8190 ) + 12358 ( 8191 ) + 12359 ( 8192 ) + 12360 ( 8193 ) + 12361 ( 8194 ) + 12362 ( 8195 ) + 12363 ( -6983 ) + 12364 ( -6863 ) + 12365 ( -6858 ) + 12366 ( -6805 ) + 12367 ( -3663 ) + 12368 ( 8196 ) + 12369 ( 8197 ) + 12370 ( -8198 ) + 12371 ( -8199 ) + 12372 ( -7469 ) + 12373 ( -7307 ) + 12374 ( -6978 ) + 12375 ( -6910 ) + 12376 ( 8200 ) + 12377 ( 8201 ) + 12378 ( 8202 ) + 12379 ( -7270 ) + 12380 ( -4006 ) + 12381 ( -3968 ) + 12382 ( -8190 ) + 12383 ( -8203 ) + 12384 ( 8204 ) + 12385 ( 8205 ) + 12386 ( 8206 ) + 12387 ( 8207 ) + 12388 ( 4010 ) + 12389 ( -8197 ) + 12390 ( -4017 ) + 12391 ( -3967 ) + 12392 ( 8208 ) + 12393 ( 8209 ) + 12394 ( 8210 ) + 12395 ( 4009 ) + 12396 ( 8144 ) + 12397 ( 8150 ) + 12398 ( -8204 ) + 12399 ( 8076 ) + 12400 ( -3970 ) + 12401 ( 8211 ) + 12402 ( 8212 ) + 12403 ( 8213 ) + 12404 ( 8214 ) + 12405 ( 8199 ) + 12406 ( -8087 ) + 12407 ( -7957 ) + 12408 ( -7943 ) + 12409 ( -6716 ) + 12410 ( -6377 ) + 12411 ( -7935 ) + 12412 ( -7923 ) + 12413 ( -6354 ) + 12414 ( -6345 ) + 12415 ( -7918 ) + 12416 ( -6936 ) + 12417 ( 8215 ) + 12418 ( 8216 ) + 12419 ( 8217 ) + 12420 ( 8218 ) + 12421 ( -6327 ) + 12422 ( -6920 ) + 12423 ( 8198 ) + 12424 ( -6849 ) + 12425 ( -6359 ) + 12426 ( 8219 ) + 12427 ( -8218 ) + 12428 ( -8189 ) + 12429 ( -6982 ) + 12430 ( 8220 ) + 12431 ( 8221 ) + 12432 ( -8214 ) + 12433 ( 8222 ) + 12434 ( 8223 ) + 12435 ( -8196 ) + 12436 ( 8203 ) + 12437 ( -8118 ) + 12438 ( -8164 ) + 12439 ( -8094 ) + 12440 ( 8224 ) + 12441 ( -7937 ) + 12442 ( -8083 ) + 12443 ( -8208 ) + 12444 ( -8153 ) + 12445 ( -8156 ) + 12446 ( -8224 ) + 12447 ( -8210 ) + 12448 ( -8207 ) + 12449 ( -4013 ) + 12450 ( 8225 ) + 12451 ( 8226 ) + 12452 ( 8227 ) + 12453 ( 8228 ) + 12454 ( 8229 ) + 12455 ( 8230 ) + 12456 ( 8231 ) + 12457 ( 8232 ) + 12458 ( 8233 ) + 12459 ( -5912 ) + 12460 ( -5749 ) + 12461 ( -5813 ) + 12462 ( -5771 ) + 12463 ( 8234 ) + 12464 ( 8235 ) + 12465 ( -5853 ) + 12466 ( -5818 ) + 12467 ( -5750 ) + 12468 ( 8236 ) + 12469 ( 8237 ) + 12470 ( -8188 ) + 12471 ( -6804 ) + 12472 ( -8235 ) + 12473 ( 8238 ) + 12474 ( -6852 ) + 12475 ( 8239 ) + 12476 ( 8240 ) + 12477 ( 8241 ) + 12478 ( 8242 ) + 12479 ( -8237 ) + 12480 ( -8234 ) + 12481 ( -8187 ) + 12482 ( -6862 ) + 12483 ( -6803 ) + 12484 ( -6360 ) + 12485 ( -6326 ) + 12486 ( -5917 ) + 12487 ( -8216 ) + 12488 ( -8219 ) + 12489 ( 8243 ) + 12490 ( 8244 ) + 12491 ( -7936 ) + 12492 ( -8213 ) + 12493 ( 8245 ) + 12494 ( -7919 ) + 12495 ( -6382 ) + 12496 ( -6343 ) + 12497 ( -8246 ) + 12498 ( -8212 ) + 12499 ( 8247 ) + 12500 ( -7932 ) + 12501 ( -8243 ) + 12502 ( -8239 ) + 12503 ( -6353 ) + 12504 ( -8248 ) + 12505 ( -8249 ) + 12506 ( 8250 ) + 12507 ( -7713 ) + 12508 ( -7723 ) + 12509 ( -7833 ) + 12510 ( -7844 ) + 12511 ( -7868 ) + 12512 ( -7947 ) + 12513 ( -8211 ) + 12514 ( 8251 ) + 12515 ( -7648 ) + 12516 ( -7770 ) + 12517 ( -7777 ) + 12518 ( -7809 ) + 12519 ( -7906 ) + 12520 ( -7959 ) + 12521 ( -7965 ) + 12522 ( -7857 ) + 12523 ( 8246 ) + 12524 ( -8227 ) + 12525 ( -8240 ) + 12526 ( 8252 ) + 12527 ( 8249 ) + 12528 ( -8231 ) + 12529 ( -7659 ) + 12530 ( -7859 ) + 12531 ( 8253 ) + 12532 ( 8254 ) + 12533 ( 8255 ) + 12534 ( 8256 ) + 12535 ( -7678 ) + 12536 ( -7716 ) + 12537 ( -7729 ) + 12538 ( -7747 ) + 12539 ( -7756 ) + 12540 ( -7837 ) + 12541 ( -7851 ) + 12542 ( -7871 ) + 12543 ( -7894 ) + 12544 ( -7764 ) + 12545 ( -8252 ) + 12546 ( -7722 ) + 12547 ( 8257 ) + 12548 ( -8226 ) + 12549 ( 8248 ) + 12550 ( 8258 ) + 12551 ( -7759 ) + 12552 ( -8259 ) + 12553 ( 8260 ) + 12554 ( 8261 ) + 12555 ( 8262 ) + 12556 ( 8263 ) + 12557 ( 8264 ) + 12558 ( 8265 ) + 12559 ( 8266 ) + 12560 ( 8267 ) + 12561 ( 8268 ) + 12562 ( -8265 ) + 12563 ( 8269 ) + 12564 ( 8270 ) + 12565 ( 8271 ) + 12566 ( 8272 ) + 12567 ( 8273 ) + 12568 ( 8274 ) + 12569 ( -6929 ) + 12570 ( -6653 ) + 12571 ( 8275 ) + 12572 ( 6939 ) + 12573 ( -7318 ) + 12574 ( -7275 ) + 12575 ( 8276 ) + 12576 ( 8277 ) + 12577 ( 8278 ) + 12578 ( 8279 ) + 12579 ( 8280 ) + 12580 ( -6919 ) + 12581 ( 8281 ) + 12582 ( -7319 ) + 12583 ( -7276 ) + 12584 ( 6942 ) + 12585 ( 8282 ) + 12586 ( 8283 ) + 12587 ( -8279 ) + 12588 ( -6918 ) + 12589 ( 8284 ) + 12590 ( -8281 ) + 12591 ( 8285 ) + 12592 ( -8271 ) + 12593 ( 8286 ) + 12594 ( 8287 ) + 12595 ( 8288 ) + 12596 ( 8289 ) + 12597 ( 8290 ) + 12598 ( 8291 ) + 12599 ( 8292 ) + 12600 ( 8293 ) + 12601 ( 8294 ) + 12602 ( 8295 ) + 12603 ( 8296 ) + 12604 ( 8297 ) + 12605 ( 8298 ) + 12606 ( -8299 ) + 12607 ( 8300 ) + 12608 ( 8301 ) + 12609 ( 8302 ) + 12610 ( -8291 ) + 12611 ( -8276 ) + 12612 ( 8303 ) + 12613 ( -8288 ) + 12614 ( 8304 ) + 12615 ( 8305 ) + 12616 ( 8306 ) + 12617 ( -8172 ) + 12618 ( 8307 ) + 12619 ( 8308 ) + 12620 ( -8309 ) + 12621 ( -8310 ) + 12622 ( 8311 ) + 12623 ( -8171 ) + 12624 ( 8312 ) + 12625 ( -8304 ) + 12626 ( -8313 ) + 12627 ( -8314 ) + 12628 ( -8315 ) + 12629 ( 8316 ) + 12630 ( -8296 ) + 12631 ( 7480 ) + 12632 ( -7277 ) + 12633 ( -6987 ) + 12634 ( 8317 ) + 12635 ( 8318 ) + 12636 ( 8319 ) + 12637 ( 8320 ) + 12638 ( -8282 ) + 12639 ( 8321 ) + 12640 ( 8299 ) + 12641 ( 7483 ) + 12642 ( 8322 ) + 12643 ( 8323 ) + 12644 ( 8324 ) + 12645 ( 8325 ) + 12646 ( 8326 ) + 12647 ( -8289 ) + 12648 ( -8287 ) + 12649 ( 7484 ) + 12650 ( -8322 ) + 12651 ( 8327 ) + 12652 ( 8328 ) + 12653 ( -8317 ) + 12654 ( 8329 ) + 12655 ( 8330 ) + 12656 ( -8331 ) + 12657 ( 8332 ) + 12658 ( -6384 ) + 12659 ( -6909 ) + 12660 ( 8333 ) + 12661 ( -8334 ) + 12662 ( 8335 ) + 12663 ( -6928 ) + 12664 ( -7269 ) + 12665 ( -7314 ) + 12666 ( -6316 ) + 12667 ( 8336 ) + 12668 ( 8337 ) + 12669 ( 8338 ) + 12670 ( 8339 ) + 12671 ( 8340 ) + 12672 ( 8341 ) + 12673 ( 8342 ) + 12674 ( 8343 ) + 12675 ( 8344 ) + 12676 ( 8345 ) + 12677 ( 8310 ) + 12678 ( 8346 ) + 12679 ( 8347 ) + 12680 ( 8348 ) + 12681 ( 8349 ) + 12682 ( -8332 ) + 12683 ( 8350 ) + 12684 ( 8351 ) + 12685 ( 8352 ) + 12686 ( -8340 ) + 12687 ( -8353 ) + 12688 ( 8354 ) + 12689 ( -8355 ) + 12690 ( 8356 ) + 12691 ( -8357 ) + 12692 ( 8358 ) + 12693 ( 8359 ) + 12694 ( -6294 ) + 12695 ( 8360 ) + 12696 ( 8361 ) + 12697 ( 8362 ) + 12698 ( 8259 ) + 12699 ( 8363 ) + 12700 ( 8364 ) + 12701 ( -6370 ) + 12702 ( -6383 ) + 12703 ( 8331 ) + 12704 ( 8365 ) + 12705 ( 8366 ) + 12706 ( 8367 ) + 12707 ( 8368 ) + 12708 ( 8369 ) + 12709 ( 8370 ) + 12710 ( 8371 ) + 12711 ( 8372 ) + 12712 ( 8373 ) + 12713 ( 8374 ) + 12714 ( 8375 ) + 12715 ( -8372 ) + 12716 ( 8376 ) + 12717 ( 8377 ) + 12718 ( 8378 ) + 12719 ( 8379 ) + 12720 ( 8380 ) + 12721 ( -8381 ) + 12722 ( 8382 ) + 12723 ( 8383 ) + 12724 ( 8384 ) + 12725 ( -8358 ) + 12726 ( 8385 ) + 12727 ( -8365 ) + 12728 ( 8386 ) + 12729 ( -8377 ) + 12730 ( 8387 ) + 12731 ( 8388 ) + 12732 ( 8389 ) + 12733 ( 8390 ) + 12734 ( 8391 ) + 12735 ( 8392 ) + 12736 ( 8393 ) + 12737 ( 8394 ) + 12738 ( 8395 ) + 12739 ( -8378 ) + 12740 ( 8396 ) + 12741 ( 8397 ) + 12742 ( 8398 ) + 12743 ( 8399 ) + 12744 ( 8400 ) + 12745 ( 8401 ) + 12746 ( -8393 ) + 12747 ( 8402 ) + 12748 ( 8403 ) + 12749 ( -8379 ) + 12750 ( 8404 ) + 12751 ( 8405 ) + 12752 ( 8406 ) + 12753 ( 8407 ) + 12754 ( -8401 ) + 12755 ( 8408 ) + 12756 ( 8409 ) + 12757 ( 8410 ) + 12758 ( 8411 ) + 12759 ( 8412 ) + 12760 ( 8413 ) + 12761 ( 8414 ) + 12762 ( 8415 ) + 12763 ( 8416 ) + 12764 ( 8417 ) + 12765 ( 8418 ) + 12766 ( 8419 ) + 12767 ( 8420 ) + 12768 ( 8421 ) + 12769 ( 8422 ) + 12770 ( 8423 ) + 12771 ( 8424 ) + 12772 ( 8425 ) + 12773 ( -8416 ) + 12774 ( 8426 ) + 12775 ( 8427 ) + 12776 ( 8428 ) + 12777 ( 8429 ) + 12778 ( 8430 ) + 12779 ( 8431 ) + 12780 ( 8432 ) + 12781 ( 8433 ) + 12782 ( 8434 ) + 12783 ( 8435 ) + 12784 ( 8436 ) + 12785 ( -8415 ) + 12786 ( 8437 ) + 12787 ( 8438 ) + 12788 ( 8439 ) + 12789 ( 8440 ) + 12790 ( 8441 ) + 12791 ( 8442 ) + 12792 ( 8443 ) + 12793 ( 8444 ) + 12794 ( 8445 ) + 12795 ( 8446 ) + 12796 ( 8447 ) + 12797 ( -8435 ) + 12798 ( 8448 ) + 12799 ( 8449 ) + 12800 ( 8450 ) + 12801 ( 8451 ) + 12802 ( -8380 ) + 12803 ( 8452 ) + 12804 ( 8453 ) + 12805 ( 8454 ) + 12806 ( 8455 ) + 12807 ( 8456 ) + 12808 ( -8457 ) + 12809 ( -8391 ) + 12810 ( -8446 ) + 12811 ( 8458 ) + 12812 ( 8459 ) + 12813 ( 8460 ) + 12814 ( 8461 ) + 12815 ( 8462 ) + 12816 ( 8463 ) + 12817 ( 8464 ) + 12818 ( 8465 ) + 12819 ( 8466 ) + 12820 ( 8467 ) + 12821 ( -8463 ) + 12822 ( 8468 ) + 12823 ( 8469 ) + 12824 ( 8470 ) + 12825 ( 8471 ) + 12826 ( 8472 ) + 12827 ( -8423 ) + 12828 ( -8473 ) + 12829 ( 8474 ) + 12830 ( 8475 ) + 12831 ( 8476 ) + 12832 ( 8477 ) + 12833 ( 8478 ) + 12834 ( 8479 ) + 12835 ( 8480 ) + 12836 ( -8371 ) + 12837 ( 8481 ) + 12838 ( 8482 ) + 12839 ( 8483 ) + 12840 ( 8484 ) + 12841 ( -8475 ) + 12842 ( -8429 ) + 12843 ( -8440 ) + 12844 ( -8451 ) + 12845 ( 8485 ) + 12846 ( 8486 ) + 12847 ( -8375 ) + 12848 ( -8485 ) + 12849 ( 8487 ) + 12850 ( 8488 ) + 12851 ( 8489 ) + 12852 ( -8390 ) + 12853 ( -8399 ) + 12854 ( -8406 ) + 12855 ( -8433 ) + 12856 ( -8444 ) + 12857 ( -8455 ) + 12858 ( 8490 ) + 12859 ( -8483 ) + 12860 ( 8491 ) + 12861 ( -8488 ) + 12862 ( 8492 ) + 12863 ( 8493 ) + 12864 ( -8486 ) + 12865 ( 8494 ) + 12866 ( 8495 ) + 12867 ( 8496 ) + 12868 ( -8487 ) + 12869 ( -8412 ) + 12870 ( 8497 ) + 12871 ( 8498 ) + 12872 ( 8499 ) + 12873 ( 8500 ) + 12874 ( 8501 ) + 12875 ( -8421 ) + 12876 ( -8495 ) + 12877 ( 8502 ) + 12878 ( -8465 ) + 12879 ( -8500 ) + 12880 ( 8503 ) + 12881 ( -8470 ) + 12882 ( 8504 ) + 12883 ( 8505 ) + 12884 ( 8381 ) + 12885 ( -8480 ) + 12886 ( -8373 ) + 12887 ( 8506 ) + 12888 ( 8507 ) + 12889 ( 8508 ) + 12890 ( 8509 ) + 12891 ( -8351 ) + 12892 ( -8342 ) + 12893 ( 8315 ) + 12894 ( 8510 ) + 12895 ( -8303 ) + 12896 ( -8298 ) + 12897 ( -7288 ) + 12898 ( 8511 ) + 12899 ( 8512 ) + 12900 ( 8513 ) + 12901 ( -8338 ) + 12902 ( -8278 ) + 12903 ( 8514 ) + 12904 ( -7278 ) + 12905 ( 8515 ) + 12906 ( 8516 ) + 12907 ( 8517 ) + 12908 ( 8518 ) + 12909 ( -8512 ) + 12910 ( -8277 ) + 12911 ( -8337 ) + 12912 ( 8519 ) + 12913 ( -8341 ) + 12914 ( 8520 ) + 12915 ( -8510 ) + 12916 ( 8521 ) + 12917 ( -8519 ) + 12918 ( 8522 ) + 12919 ( -8509 ) + 12920 ( -8514 ) + 12921 ( -8352 ) + 12922 ( -8362 ) + 12923 ( -8336 ) + 12924 ( -7320 ) + 12925 ( -6320 ) + 12926 ( 8523 ) + 12927 ( -6937 ) + 12928 ( 8524 ) + 12929 ( 8525 ) + 12930 ( -6917 ) + 12931 ( -8517 ) + 12932 ( -8275 ) + 12933 ( -7321 ) + 12934 ( 8526 ) + 12935 ( 8527 ) + 12936 ( 8528 ) + 12937 ( -6913 ) + 12938 ( -8516 ) + 12939 ( -6931 ) + 12940 ( -6654 ) + 12941 ( -7322 ) + 12942 ( -8526 ) + 12943 ( 8529 ) + 12944 ( 8530 ) + 12945 ( -6912 ) + 12946 ( -8515 ) + 12947 ( -8523 ) + 12948 ( -6930 ) + 12949 ( -6659 ) + 12950 ( 8531 ) + 12951 ( -7468 ) + 12952 ( -7306 ) + 12953 ( -6908 ) + 12954 ( 8532 ) + 12955 ( 8533 ) + 12956 ( 8534 ) + 12957 ( -6927 ) + 12958 ( -7268 ) + 12959 ( -6369 ) + 12960 ( 8309 ) + 12961 ( 8357 ) + 12962 ( -8244 ) + 12963 ( -8223 ) + 12964 ( -8202 ) + 12965 ( -7944 ) + 12966 ( -8215 ) + 12967 ( 8535 ) + 12968 ( -7511 ) + 12969 ( 8536 ) + 12970 ( 8537 ) + 12971 ( 8538 ) + 12972 ( 8539 ) + 12973 ( 8540 ) + 12974 ( 8541 ) + 12975 ( 8542 ) + 12976 ( 8543 ) + 12977 ( 8544 ) + 12978 ( 8545 ) + 12979 ( -8546 ) + 12980 ( -8369 ) + 12981 ( 8547 ) + 12982 ( 8548 ) + 12983 ( -8450 ) + 12984 ( -8439 ) + 12985 ( -8428 ) + 12986 ( 8549 ) + 12987 ( -8374 ) + 12988 ( 8546 ) + 12989 ( -8370 ) + 12990 ( 8550 ) + 12991 ( 8551 ) + 12992 ( 8552 ) + 12993 ( 8553 ) + 12994 ( 8554 ) + 12995 ( 8555 ) + 12996 ( -8403 ) + 12997 ( 8556 ) + 12998 ( -8548 ) + 12999 ( -8554 ) + 13000 ( -8449 ) + 13001 ( -8438 ) + 13002 ( -8427 ) + 13003 ( -8395 ) + 13004 ( -8386 ) + 13005 ( 8557 ) + 13006 ( 8558 ) + 13007 ( 8559 ) + 13008 ( -8547 ) + 13009 ( -8545 ) + 13010 ( -8557 ) + 13011 ( -8556 ) + 13012 ( 8560 ) + 13013 ( 8561 ) + 13014 ( 8562 ) + 13015 ( -8558 ) + 13016 ( -8549 ) + 13017 ( 8563 ) + 13018 ( 8564 ) + 13019 ( 8565 ) + 13020 ( -8411 ) + 13021 ( 8566 ) + 13022 ( -8567 ) + 13023 ( 8568 ) + 13024 ( -8419 ) + 13025 ( 8569 ) + 13026 ( 8570 ) + 13027 ( 8571 ) + 13028 ( 8572 ) + 13029 ( -8566 ) + 13030 ( 8567 ) + 13031 ( -8559 ) + 13032 ( 8573 ) + 13033 ( -8564 ) + 13034 ( -8387 ) + 13035 ( -8396 ) + 13036 ( -8409 ) + 13037 ( -8430 ) + 13038 ( -8441 ) + 13039 ( -8452 ) + 13040 ( 8574 ) + 13041 ( 8575 ) + 13042 ( 8576 ) + 13043 ( -8534 ) + 13044 ( -8364 ) + 13045 ( 8334 ) + 13046 ( 8313 ) + 13047 ( -7279 ) + 13048 ( -6378 ) + 13049 ( 8577 ) + 13050 ( -6938 ) + 13051 ( 8578 ) + 13052 ( 8579 ) + 13053 ( -6916 ) + 13054 ( -7309 ) + 13055 ( -7470 ) + 13056 ( 8580 ) + 13057 ( 8581 ) + 13058 ( -8576 ) + 13059 ( -8330 ) + 13060 ( -8356 ) + 13061 ( 8353 ) + 13062 ( 8582 ) + 13063 ( 8583 ) + 13064 ( -8575 ) + 13065 ( 8584 ) + 13066 ( 8585 ) + 13067 ( 8586 ) + 13068 ( -8348 ) + 13069 ( 8314 ) + 13070 ( 8587 ) + 13071 ( -8586 ) + 13072 ( 8355 ) + 13073 ( -8346 ) + 13074 ( 8588 ) + 13075 ( 8589 ) + 13076 ( -8577 ) + 13077 ( -8582 ) + 13078 ( 8590 ) + 13079 ( 8591 ) + 13080 ( -7517 ) + 13081 ( 8592 ) + 13082 ( 8593 ) + 13083 ( 8594 ) + 13084 ( 8595 ) + 13085 ( 8596 ) + 13086 ( 8597 ) + 13087 ( 8598 ) + 13088 ( 8599 ) + 13089 ( 8600 ) + 13090 ( 8601 ) + 13091 ( 8602 ) + 13092 ( 8603 ) + 13093 ( 8604 ) + 13094 ( -8595 ) + 13095 ( 8605 ) + 13096 ( 8606 ) + 13097 ( 8607 ) + 13098 ( 8608 ) + 13099 ( 8609 ) + 13100 ( 8610 ) + 13101 ( -8602 ) + 13102 ( 8611 ) + 13103 ( 8612 ) + 13104 ( 8613 ) + 13105 ( 8614 ) + 13106 ( 8615 ) + 13107 ( 8616 ) + 13108 ( 8617 ) + 13109 ( 8618 ) + 13110 ( 8619 ) + 13111 ( 8620 ) + 13112 ( -8612 ) + 13113 ( 8621 ) + 13114 ( 8622 ) + 13115 ( 8623 ) + 13116 ( 8624 ) + 13117 ( 8625 ) + 13118 ( 8626 ) + 13119 ( 8627 ) + 13120 ( 8628 ) + 13121 ( 8629 ) + 13122 ( 8630 ) + 13123 ( 8631 ) + 13124 ( 8632 ) + 13125 ( 8633 ) + 13126 ( 8634 ) + 13127 ( 8635 ) + 13128 ( -8626 ) + 13129 ( 8636 ) + 13130 ( 8637 ) + 13131 ( 8638 ) + 13132 ( 8639 ) + 13133 ( 8640 ) + 13134 ( -8617 ) + 13135 ( 8641 ) + 13136 ( -8642 ) + 13137 ( -8625 ) + 13138 ( 8643 ) + 13139 ( 8644 ) + 13140 ( 8645 ) + 13141 ( 8646 ) + 13142 ( -8647 ) + 13143 ( -8459 ) + 13144 ( 8648 ) + 13145 ( -8649 ) + 13146 ( -8633 ) + 13147 ( 8650 ) + 13148 ( 8651 ) + 13149 ( -7510 ) + 13150 ( 8652 ) + 13151 ( 8653 ) + 13152 ( 8654 ) + 13153 ( -8607 ) + 13154 ( -8599 ) + 13155 ( -8591 ) + 13156 ( 8655 ) + 13157 ( 8656 ) + 13158 ( -8622 ) + 13159 ( 8657 ) + 13160 ( 8658 ) + 13161 ( 8659 ) + 13162 ( -8614 ) + 13163 ( -8638 ) + 13164 ( 8660 ) + 13165 ( 8661 ) + 13166 ( 8662 ) + 13167 ( -8650 ) + 13168 ( -8656 ) + 13169 ( 8663 ) + 13170 ( -8630 ) + 13171 ( 8664 ) + 13172 ( 8665 ) + 13173 ( -8655 ) + 13174 ( 8647 ) + 13175 ( 8666 ) + 13176 ( -8467 ) + 13177 ( -8570 ) + 13178 ( 8667 ) + 13179 ( 8668 ) + 13180 ( -8469 ) + 13181 ( 8669 ) + 13182 ( -8653 ) + 13183 ( -8539 ) + 13184 ( -7519 ) + 13185 ( 8670 ) + 13186 ( 8671 ) + 13187 ( 8672 ) + 13188 ( -8662 ) + 13189 ( -8654 ) + 13190 ( 8673 ) + 13191 ( 8674 ) + 13192 ( 8675 ) + 13193 ( 8676 ) + 13194 ( -8540 ) + 13195 ( -8673 ) + 13196 ( 8677 ) + 13197 ( 8678 ) + 13198 ( 8679 ) + 13199 ( -8670 ) + 13200 ( 8680 ) + 13201 ( 8681 ) + 13202 ( -8590 ) + 13203 ( -8598 ) + 13204 ( -8606 ) + 13205 ( 8682 ) + 13206 ( -7509 ) + 13207 ( 8683 ) + 13208 ( 8684 ) + 13209 ( 8685 ) + 13210 ( 8686 ) + 13211 ( -8621 ) + 13212 ( 8687 ) + 13213 ( 8688 ) + 13214 ( 8689 ) + 13215 ( -8637 ) + 13216 ( -8613 ) + 13217 ( 8690 ) + 13218 ( -8680 ) + 13219 ( -8685 ) + 13220 ( 8691 ) + 13221 ( 8692 ) + 13222 ( -8629 ) + 13223 ( 8693 ) + 13224 ( -8684 ) + 13225 ( 8649 ) + 13226 ( 8694 ) +} +areas 1478 { + 0 ( 0 0 0 0 0 0 0 0 ) 0 { + } + 1 ( 2 0 0 101 0 0 0 0 ) 0 { + } + 2 ( 2 0 101 12 0 0 0 0 ) 0 { + } + 3 ( 65 0 113 11 1 0 0 0 ) 2 { + 2 4 (-3763.6884765625 6152 192) (-3764.1884765625 6152 192) 3 1 + 2 259 (-3741.8442382813 6144 192) (-3741.8442382813 6143.5 192) 2 1 + } + 4 ( 69 0 124 8 1 1 0 0 ) 3 { + 8 8 (-3779.6884765625 6151.7724609375 192) (-3781.6884765625 6151.7724609375 144) 6 102 + 2 3 (-3763.6884765625 6152 192) (-3763.1884765625 6152 192) 3 1 + 2 261 (-3771.6884765625 6144 192) (-3771.6884765625 6143.5 192) 5 1 + } + 5 ( 2 0 132 12 0 0 0 0 ) 0 { + } + 6 ( 65 0 144 10 1 2 0 0 ) 4 { + 2 7 (-3908 6176 256) (-3908 6175.5 256) 13 1 + 2 13 (-3720 6184 256) (-3719.5 6184 256) 12 1 + 2 43 (-3900 6192 256) (-3900 6192.5 256) 11 1 + 2 681 (-4096 6184 256) (-4096.5 6184 256) 9 1 + } + 7 ( 69 0 154 9 1 3 0 0 ) 6 { + 8 8 (-3781.8442382813 6160 256) (-3781.8442382813 6158 144) 16 105 + 8 4 (-3771.6884765625 6160 256) (-3771.6884765625 6158 192) 15 103 + 8 3 (-3741.8442382813 6160 256) (-3741.8442382813 6158 192) 14 103 + 2 6 (-3908 6176 256) (-3908 6176.5 256) 13 1 + 2 14 (-3720 6168 256) (-3719.5 6168 256) 18 1 + 2 682 (-4096 6168 256) (-4096.5 6168 256) 17 1 + } + 8 ( 69 0 163 13 1 4 0 0 ) 6 { + 8 307 (-3781.8442382813 6112 144) (-3781.8442382813 6110 64) 24 103 + 8 20 (-3784 6128 144) (-3786 6128 64) 25 103 + 2 12 (-3779.6884765625 6159.7724609375 144) (-3779.1884765625 6159.7724609375 144) 20 1 + 2 10 (-3781.8442382813 6160 144) (-3781.8442382813 6160.5 144) 19 1 + 2 270 (-3779.6884765625 6113.1572265625 144) (-3779.1884765625 6113.1572265625 144) 23 1 + 2 273 (-3779.6884765625 6120.9306640625 144) (-3779.1884765625 6120.9306640625 144) 22 1 + } + 9 ( 2 0 176 9 0 0 0 0 ) 0 { + } + 10 ( 69 0 185 6 1 5 0 0 ) 3 { + 8 20 (-3784 6176 144) (-3786 6176 64) 29 103 + 2 8 (-3781.8442382813 6160 144) (-3781.8442382813 6159.5 144) 19 1 + 2 12 (-3779.6884765625 6176 144) (-3779.1884765625 6176 144) 28 1 + } + 11 ( 2 0 191 7 0 0 0 0 ) 0 { + } + 12 ( 69 0 198 6 1 6 0 0 ) 2 { + 2 8 (-3779.6884765625 6159.7724609375 144) (-3780.1884765625 6159.7724609375 144) 20 1 + 2 10 (-3779.6884765625 6176 144) (-3780.1884765625 6176 144) 28 1 + } + 13 ( 65 0 204 8 1 7 0 0 ) 3 { + 2 6 (-3720 6184 256) (-3720.5 6184 256) 12 1 + 2 14 (-3668 6176 256) (-3668 6175.5 256) 35 1 + 2 43 (-3708 6192 256) (-3708 6192.5 256) 32 1 + } + 14 ( 69 0 212 7 1 8 0 0 ) 4 { + 8 19 (-3712 6160 256) (-3712 6158 224) 38 101 + 8 18 (-3660 6160 256) (-3660 6158 224) 37 101 + 2 7 (-3720 6168 256) (-3720.5 6168 256) 18 1 + 2 13 (-3668 6176 256) (-3668 6176.5 256) 35 1 + } + 15 ( 2 0 219 9 0 0 0 0 ) 0 { + } + 16 ( 69 0 228 9 1 9 0 0 ) 3 { + 2 339 (-3632 5544 456) (-3632.5 5544 456) 41 1 + 2 24 (-3616 5864 456) (-3615.5 5864 456) 39 1 + 2 338 (-3624 5536 456) (-3624 5535.5 456) 40 1 + } + 17 ( 2 0 237 12 0 0 0 0 ) 0 { + } + 18 ( 65 0 249 6 1 10 0 0 ) 2 { + 2 19 (-3704 6152 224) (-3704.5 6152 224) 48 1 + 2 316 (-3660 6144 224) (-3660 6143.5 224) 47 1 + } + 19 ( 69 0 255 6 1 11 0 0 ) 3 { + 8 3 (-3720 6152 224) (-3722 6152 192) 49 101 + 2 18 (-3704 6152 224) (-3703.5 6152 224) 48 1 + 2 318 (-3712 6144 224) (-3712 6143.5 224) 51 1 + } + 20 ( 65 0 261 10 1 12 0 0 ) 3 { + 2 23 (-3967.8920898438 6152 64) (-3967.4921875 6152 64) 53 0 + 2 308 (-3959.9921875 6112 64) (-3959.9921875 6111.5 64) 54 1 + 2 307 (-3868 6112 64) (-3868 6111.5 64) 55 1 + } + 21 ( 2 0 271 23 0 0 0 0 ) 0 { + } + 22 ( 65 0 294 9 1 13 0 0 ) 5 { + 2 23 (-4079.8999023438 6128 0) (-4079.5 6128 8) 57 0 + 2 256 (-4088 6064 0) (-4088 6063.5 0) 58 1 + 2 902 (-4096 6104 0) (-4096.5 6104 0) 59 1 + 2 679 (-4096 6152 0) (-4096.5 6152 0) 60 1 + 2 680 (-4096 6176 0) (-4096.5 6176 0) 61 1 + } + 23 ( 65 0 303 5 1 14 0 0 ) 4 { + 2 308 (-3967.8845214844 6088 64) (-3967.4846191406 6088 64) 63 0 + 2 22 (-4080.1000976563 6128 8) (-4080.5 6128 0) 65 1 + 2 20 (-3967.8920898438 6152 64) (-3967.4921875 6152 64) 53 0 + 2 257 (-4023.9921875 6064 36) (-4023.9921875 6063.5 36) 64 1 + } + 24 ( 65 0 308 9 1 15 0 0 ) 3 { + 2 326 (-3600 5952 456) (-3599.5 5952 456) 68 1 + 2 16 (-3616 5864 456) (-3616.5 5864 456) 39 1 + 2 338 (-3616 5528 456) (-3616.5 5528 456) 71 1 + } + 25 ( 65 0 317 12 2 0 0 0 ) 4 { + 2 55 (-3152 6316 456) (-3152 6316.5 456) 81 1 + 2 57 (-3264 6316 456) (-3264 6316.5 456) 79 1 + 2 56 (-3376 6316 456) (-3376 6316.5 456) 77 1 + 2 26 (-3264 6164 456) (-3264 6163.5 456) 74 1 + } + 26 ( 65 0 329 11 2 1 0 0 ) 2 { + 2 27 (-3265.9936523438 6160 456) (-3265.9936523438 6159.5 456) 84 1 + 2 25 (-3264 6164 456) (-3264 6164.5 456) 74 1 + } + 27 ( 65 4 340 9 -1 0 0 0 ) 3 { + 2 26 (-3265.9936523438 6160 456) (-3265.9936523438 6160.5 456) 84 1 + 2 331 (-3185.9936523438 6144 456) (-3185.9936523438 6143.5 456) 88 1 + 2 327 (-3360 6144 456) (-3360 6143.5 456) 89 1 + } + 28 ( 2 0 349 6 0 0 0 0 ) 0 { + } + 29 ( 2 0 355 20 0 0 0 0 ) 0 { + } + 30 ( 2 0 375 13 0 0 0 0 ) 0 { + } + 31 ( 2 0 388 13 0 0 0 0 ) 0 { + } + 32 ( 65 0 401 12 1 16 0 0 ) 5 { + 8 366 (-3376 5896 744) (-3374 5896 728) 92 100 + 2 40 (-3584.1000976563 5896 744) (-3584.5 5896 744) 95 0 + 8 39 (-3376 6160 744) (-3374 6160 728) 91 100 + 2 36 (-3480 6176 744) (-3480 6176.5 744) 97 1 + 2 344 (-3528 5648 744) (-3528 5647.5 744) 94 1 + } + 33 ( 2 0 413 11 0 0 0 0 ) 0 { + } + 34 ( 69 0 424 10 1 17 0 0 ) 4 { + 8 32 (-3480 6176 920) (-3480 6174 744) 99 108 + 8 14 (-3656 6176 920) (-3656 6174 256) 100 131 + 2 45 (-3384 6192 920) (-3384 6192.5 920) 103 1 + 2 44 (-3688 6192 920) (-3688 6192.5 920) 102 1 + } + 35 ( 2 0 434 6 0 0 0 0 ) 0 { + } + 36 ( 65 0 440 6 1 18 0 0 ) 3 { + 2 40 (-3584.1000976563 6184 744) (-3584.5 6184 744) 107 0 + 8 39 (-3376 6184 744) (-3374 6184 728) 106 100 + 2 32 (-3480 6176 744) (-3480 6175.5 744) 97 1 + } + 37 ( 2 0 446 7 0 0 0 0 ) 0 { + } + 38 ( 2 0 453 9 0 0 0 0 ) 0 { + } + 39 ( 65 0 462 8 1 19 0 0 ) 2 { + 2 365 (-3200 6144 728) (-3200 6143.5 728) 109 1 + 2 366 (-3344 6144 728) (-3344 6143.5 728) 110 1 + } + 40 ( 65 0 470 9 1 20 0 0 ) 5 { + 2 344 (-3583.8999023438 5584 744) (-3583.5 5584 744) 113 0 + 2 42 (-3600.1000976563 6168 728) (-3600.5 6168 728) 116 0 + 2 36 (-3583.8999023438 6184 744) (-3583.5 6184 744) 107 0 + 2 32 (-3583.8999023438 5896 744) (-3583.5 5896 744) 95 0 + 2 367 (-3600 5832 728) (-3600.5 5832 728) 115 1 + } + 41 ( 2 0 479 16 0 0 0 0 ) 0 { + } + 42 ( 69 0 495 5 1 21 0 0 ) 3 { + 2 40 (-3599.8999023438 6168 728) (-3599.5 6168 728) 116 0 + 8 16 (-3616 6168 712) (-3618 6168 456) 119 112 + 2 367 (-3608 6144 720) (-3608 6143.5 720) 118 1 + } + 43 ( 65 0 500 19 1 22 0 0 ) 4 { + 2 50 (-3912 6224 256) (-3912 6224.5 256) 121 1 + 2 51 (-3736 6224 256) (-3736 6224.5 256) 122 1 + 2 13 (-3708 6192 256) (-3708 6191.5 256) 32 1 + 2 6 (-3900 6192 256) (-3900 6191.5 256) 11 1 + } + 44 ( 69 0 519 10 1 23 0 0 ) 8 { + 8 43 (-3712 6208 920) (-3713.4143066406 6206.5859375 256) 125 131 + 2 46 (-3688 6216 920) (-3687.646484375 6216.353515625 920) 130 1 + 2 34 (-3688 6192 920) (-3688 6191.5 920) 102 1 + 2 45 (-3680 6200 920) (-3679.5 6200 920) 131 1 + 2 48 (-3736 6232 920) (-3736.353515625 6231.646484375 920) 126 1 + 2 53 (-3704 6232 920) (-3703.646484375 6232.353515625 920) 129 1 + 2 54 (-3720 6240 920) (-3720 6240.5 920) 128 1 + 2 47 (-3736 6240 920) (-3736 6240.5 920) 127 1 + } + 45 ( 65 0 529 8 1 24 0 0 ) 4 { + 2 34 (-3384 6192 920) (-3384 6191.5 920) 103 1 + 2 46 (-3680 6216 920) (-3680.5 6216 920) 134 1 + 2 44 (-3680 6200 920) (-3680.5 6200 920) 131 1 + 2 53 (-3384 6224 920) (-3384 6224.5 920) 132 1 + } + 46 ( 65 0 537 5 1 25 0 0 ) 3 { + 2 45 (-3680 6216 920) (-3679.5 6216 920) 134 1 + 2 44 (-3688 6216 920) (-3688.353515625 6215.646484375 920) 130 1 + 2 53 (-3688 6224 920) (-3688 6224.5 920) 135 1 + } + 47 ( 69 0 542 9 1 26 0 0 ) 7 { + 8 62 (-3744 6600 920) (-3746 6600 256) 137 131 + 8 50 (-3744 6416 920) (-3746 6416 256) 136 131 + 2 53 (-3728 6304 920) (-3727.5 6304 920) 141 1 + 2 44 (-3736 6240 920) (-3736 6239.5 920) 127 1 + 2 54 (-3728 6248 920) (-3727.5 6248 920) 142 1 + 2 107 (-3736 6768 920) (-3736 6768.5 920) 139 1 + 2 113 (-3728 6560 920) (-3727.5 6560 920) 140 1 + } + 48 ( 69 0 551 5 1 27 0 0 ) 3 { + 8 50 (-3744 6232 920) (-3746 6232 256) 144 131 + 8 43 (-3736 6224 920) (-3736 6222 256) 143 131 + 2 44 (-3736 6232 920) (-3735.646484375 6232.353515625 920) 126 1 + } + 49 ( 2 0 556 12 0 0 0 0 ) 0 { + } + 50 ( 65 0 568 12 1 28 0 0 ) 4 { + 2 43 (-3912 6224 256) (-3912 6223.5 256) 121 1 + 2 62 (-3912 6592 256) (-3912 6592.5 256) 148 1 + 2 65 (-4080 6496 256) (-4080.5 6496 256) 146 1 + 2 51 (-3744 6408 256) (-3743.5 6408 256) 149 1 + } + 51 ( 65 0 580 6 1 29 0 0 ) 3 { + 2 43 (-3736 6224 256) (-3736 6223.5 256) 122 1 + 2 50 (-3744 6408 256) (-3744.5 6408 256) 149 1 + 2 64 (-3736 6592 256) (-3736 6592.5 256) 150 1 + } + 52 ( 2 0 586 9 0 0 0 0 ) 0 { + } + 53 ( 65 0 595 12 1 30 0 0 ) 8 { + 2 113 (-3712 6352 920) (-3712 6352.5 920) 152 1 + 2 54 (-3720 6248 920) (-3720.353515625 6247.646484375 920) 156 1 + 2 47 (-3728 6304 920) (-3728.5 6304 920) 141 1 + 2 44 (-3704 6232 920) (-3704.353515625 6231.646484375 920) 129 1 + 2 46 (-3688 6224 920) (-3688 6223.5 920) 135 1 + 2 45 (-3384 6224 920) (-3384 6223.5 920) 132 1 + 2 112 (-3344 6352 920) (-3344 6352.5 920) 154 1 + 2 111 (-3648 6352 920) (-3648 6352.5 920) 153 1 + } + 54 ( 65 0 607 5 1 31 0 0 ) 3 { + 2 53 (-3720 6248 920) (-3719.646484375 6248.353515625 920) 156 1 + 2 44 (-3720 6240 920) (-3720 6239.5 920) 128 1 + 2 47 (-3728 6248 920) (-3728.5 6248 920) 142 1 + } + 55 ( 65 0 612 6 2 2 0 0 ) 1 { + 2 25 (-3152 6316 456) (-3152 6315.5 456) 81 1 + } + 56 ( 65 0 618 6 2 3 0 0 ) 1 { + 2 25 (-3376 6316 456) (-3376 6315.5 456) 77 1 + } + 57 ( 65 0 624 6 2 4 0 0 ) 1 { + 2 25 (-3264 6316 456) (-3264 6315.5 456) 79 1 + } + 58 ( 69 0 630 12 1 32 0 0 ) 5 { + 8 66 (-4080 6688 544) (-4078 6688 224) 168 115 + 8 62 (-4080 6600 544) (-4078 6600 256) 169 113 + 2 60 (-4088 6223.8999023438 544) (-4088 6223.5 544) 172 0 + 8 50 (-4080 6320 544) (-4078 6320 256) 171 113 + 2 684 (-4096 6496 544) (-4096.5 6496 544) 166 1 + } + 59 ( 2 0 642 10 0 0 0 0 ) 0 { + } + 60 ( 69 0 652 6 1 33 0 0 ) 5 { + 2 58 (-4088 6224.1000976563 544) (-4088 6224.5 544) 172 0 + 8 43 (-4080 6224 544) (-4078 6224 256) 175 113 + 8 6 (-4088 6192 512) (-4088 6190 256) 176 112 + 2 685 (-4096 6216 536) (-4096.5 6216 536) 174 1 + 2 686 (-4096 6200 520) (-4096.5 6200 520) 173 1 + } + 61 ( 2 0 658 12 0 0 0 0 ) 0 { + } + 62 ( 69 0 670 9 1 34 0 0 ) 3 { + 8 66 (-3912 6608 256) (-3912 6610 224) 179 101 + 2 64 (-3744 6600 256) (-3743.5 6600 256) 177 1 + 2 50 (-3912 6592 256) (-3912 6591.5 256) 148 1 + } + 63 ( 2 0 679 6 0 0 0 0 ) 0 { + } + 64 ( 69 0 685 6 1 35 0 0 ) 3 { + 8 66 (-3736 6608 256) (-3736 6610 224) 181 101 + 2 62 (-3744 6600 256) (-3744.5 6600 256) 177 1 + 2 51 (-3736 6592 256) (-3736 6591.5 256) 150 1 + } + 65 ( 65 4 691 6 -2 0 0 0 ) 2 { + 2 50 (-4080 6496 256) (-4079.5 6496 256) 146 1 + 2 683 (-4116 6496 256) (-4116.5 6496 256) 183 1 + } + 66 ( 65 0 697 7 1 36 0 0 ) 0 { + } + 67 ( 2 0 704 9 0 0 0 0 ) 0 { + } + 68 ( 65 0 713 6 1 37 0 0 ) 3 { + 2 70 (-3840 7232 1584) (-3840 7231.5 1584) 191 1 + 2 71 (-3824 7256 1584) (-3823.5 7256 1584) 190 1 + 2 69 (-3856 7256 1584) (-3856.5 7256 1584) 192 1 + } + 69 ( 69 0 719 6 1 38 0 0 ) 3 { + 8 72 (-3872 7256 1584) (-3874 7256 584) 195 147 + 2 70 (-3864 7232 1584) (-3864 7231.5 1584) 194 1 + 2 68 (-3856 7256 1584) (-3855.5 7256 1584) 192 1 + } + 70 ( 69 0 725 7 1 39 0 0 ) 5 { + 8 73 (-3848 7216 1584) (-3848 7214 584) 197 147 + 8 72 (-3872 7224 1584) (-3874 7224 584) 198 147 + 2 71 (-3824 7224 1584) (-3823.5 7224 1584) 196 1 + 2 68 (-3840 7232 1584) (-3840 7232.5 1584) 191 1 + 2 69 (-3864 7232 1584) (-3864 7232.5 1584) 194 1 + } + 71 ( 69 0 732 7 1 40 0 0 ) 4 { + 8 109 (-3808 7248 1584) (-3806 7248 584) 200 147 + 8 73 (-3816 7216 1584) (-3816 7214 584) 201 147 + 2 70 (-3824 7224 1584) (-3824.5 7224 1584) 196 1 + 2 68 (-3824 7256 1584) (-3824.5 7256 1584) 190 1 + } + 72 ( 65 0 739 8 1 41 0 0 ) 2 { + 2 73 (-3984 7216 584) (-3984 7215.5 584) 205 1 + 2 687 (-4096 7248 584) (-4096.5 7248 584) 202 1 + } + 73 ( 65 0 747 13 1 42 0 0 ) 5 { + 2 72 (-3984 7216 584) (-3984 7216.5 584) 205 1 + 2 78 (-3848 7200 584) (-3848 7199.5 584) 209 1 + 2 84 (-4040 7200 584) (-4040 7199.5 584) 211 1 + 2 109 (-3808 7208 584) (-3807.5 7208 584) 208 1 + 2 687 (-4096 7208 584) (-4096.5 7208 584) 206 1 + } + 74 ( 65 0 760 6 1 43 0 0 ) 4 { + 2 75 (-3776 7168 1584) (-3776.5 7168 1584) 215 1 + 2 115 (-3712 7168 1584) (-3711.5 7168 1584) 213 1 + 2 76 (-3744 7152 1584) (-3744 7151.5 1584) 214 1 + 2 77 (-3744 7184 1584) (-3744 7184.5 1584) 212 1 + } + 75 ( 69 0 766 6 1 44 0 0 ) 4 { + 8 78 (-3792 7168 1584) (-3794 7168 584) 217 147 + 2 76 (-3784 7152 1584) (-3784 7151.5 1584) 216 1 + 2 77 (-3784 7184 1584) (-3784 7184.5 1584) 218 1 + 2 74 (-3776 7168 1584) (-3775.5 7168 1584) 215 1 + } + 76 ( 69 0 772 9 1 45 0 0 ) 8 { + 8 113 (-3712 7136 1584) (-3712 7134 920) 221 131 + 8 111 (-3696 7144 1584) (-3694 7144 920) 220 131 + 8 107 (-3736 7136 1584) (-3736 7134 920) 222 131 + 8 98 (-3768 7136 1584) (-3768 7134 584) 223 147 + 8 78 (-3792 7144 1584) (-3794 7144 584) 224 147 + 2 75 (-3784 7152 1584) (-3784 7152.5 1584) 216 1 + 2 74 (-3744 7152 1584) (-3744 7152.5 1584) 214 1 + 2 115 (-3704 7152 1584) (-3704 7152.5 1584) 219 1 + } + 77 ( 69 0 781 9 1 46 0 0 ) 8 { + 8 114 (-3712 7200 1584) (-3712 7202 920) 228 131 + 8 111 (-3696 7192 1584) (-3694 7192 920) 229 131 + 8 109 (-3768 7200 1584) (-3768 7202 584) 226 147 + 8 108 (-3736 7200 1584) (-3736 7202 920) 227 131 + 8 78 (-3792 7192 1584) (-3794 7192 584) 225 147 + 2 75 (-3784 7184 1584) (-3784 7183.5 1584) 218 1 + 2 74 (-3744 7184 1584) (-3744 7183.5 1584) 212 1 + 2 115 (-3704 7184 1584) (-3704 7183.5 1584) 230 1 + } + 78 ( 65 0 790 15 1 47 0 0 ) 3 { + 2 73 (-3848 7200 584) (-3848 7200.5 584) 209 1 + 2 98 (-3840 7136 584) (-3840 7135.5 584) 233 1 + 2 109 (-3800 7200 584) (-3800 7200.5 584) 231 1 + } + 79 ( 65 0 805 6 1 48 0 0 ) 4 { + 2 81 (-3936 7152 1584) (-3936 7151.5 1584) 237 1 + 2 83 (-3936 7184 1584) (-3936 7184.5 1584) 235 1 + 2 82 (-3904 7168 1584) (-3903.5 7168 1584) 236 1 + 2 80 (-3968 7168 1584) (-3968.5 7168 1584) 238 1 + } + 80 ( 69 0 811 6 1 49 0 0 ) 4 { + 8 84 (-3984 7168 1584) (-3986 7168 584) 239 147 + 2 81 (-3976 7152 1584) (-3976 7151.5 1584) 241 1 + 2 83 (-3976 7184 1584) (-3976 7184.5 1584) 240 1 + 2 79 (-3968 7168 1584) (-3967.5 7168 1584) 238 1 + } + 81 ( 69 0 817 7 1 50 0 0 ) 5 { + 8 98 (-3944 7136 1584) (-3944 7134 584) 242 147 + 8 84 (-3984 7144 1584) (-3986 7144 584) 243 147 + 2 82 (-3904 7144 1584) (-3903.5 7144 1584) 244 1 + 2 79 (-3936 7152 1584) (-3936 7152.5 1584) 237 1 + 2 80 (-3976 7152 1584) (-3976 7152.5 1584) 241 1 + } + 82 ( 69 0 824 7 1 51 0 0 ) 5 { + 8 98 (-3896 7136 1584) (-3896 7134 584) 246 147 + 8 78 (-3888 7160 1584) (-3886 7160 584) 245 147 + 2 83 (-3896 7184 1584) (-3896 7184.5 1584) 247 1 + 2 81 (-3904 7144 1584) (-3904.5 7144 1584) 244 1 + 2 79 (-3904 7168 1584) (-3904.5 7168 1584) 236 1 + } + 83 ( 69 0 831 8 1 52 0 0 ) 6 { + 8 84 (-3984 7192 1584) (-3986 7192 584) 250 147 + 8 78 (-3888 7192 1584) (-3886 7192 584) 249 147 + 8 73 (-3936 7200 1584) (-3936 7202 584) 248 147 + 2 82 (-3896 7184 1584) (-3896 7183.5 1584) 247 1 + 2 79 (-3936 7184 1584) (-3936 7183.5 1584) 235 1 + 2 80 (-3976 7184 1584) (-3976 7183.5 1584) 240 1 + } + 84 ( 65 0 839 11 1 53 0 0 ) 3 { + 2 73 (-4040 7200 584) (-4040 7200.5 584) 211 1 + 2 98 (-4040 7136 584) (-4040 7135.5 584) 253 1 + 2 687 (-4096 7168 584) (-4096.5 7168 584) 251 1 + } + 85 ( 2 0 850 13 0 0 0 0 ) 0 { + } + 86 ( 2 0 863 8 0 0 0 0 ) 0 { + } + 87 ( 65 0 871 6 1 54 0 0 ) 4 { + 2 89 (-3840 7040 1584) (-3840 7039.5 1584) 256 1 + 2 91 (-3840 7104 1584) (-3840 7104.5 1584) 254 1 + 2 90 (-3824 7072 1584) (-3823.5 7072 1584) 255 1 + 2 88 (-3856 7072 1584) (-3856.5 7072 1584) 257 1 + } + 88 ( 69 0 877 6 1 55 0 0 ) 4 { + 8 92 (-3872 7072 1584) (-3874 7072 584) 258 147 + 2 89 (-3864 7040 1584) (-3864 7039.5 1584) 260 1 + 2 91 (-3864 7104 1584) (-3864 7104.5 1584) 259 1 + 2 87 (-3856 7072 1584) (-3855.5 7072 1584) 257 1 + } + 89 ( 69 0 883 7 1 56 0 0 ) 5 { + 8 94 (-3848 7024 1584) (-3848 7022 584) 261 147 + 8 92 (-3872 7032 1584) (-3874 7032 584) 262 147 + 2 90 (-3824 7032 1584) (-3823.5 7032 1584) 263 1 + 2 87 (-3840 7040 1584) (-3840 7040.5 1584) 256 1 + 2 88 (-3864 7040 1584) (-3864 7040.5 1584) 260 1 + } + 90 ( 69 0 890 7 1 57 0 0 ) 5 { + 8 99 (-3808 7064 1584) (-3806 7064 584) 264 147 + 8 94 (-3816 7024 1584) (-3816 7022 584) 265 147 + 2 91 (-3816 7104 1584) (-3816 7104.5 1584) 266 1 + 2 89 (-3824 7032 1584) (-3824.5 7032 1584) 263 1 + 2 87 (-3824 7072 1584) (-3824.5 7072 1584) 255 1 + } + 91 ( 69 0 897 8 1 58 0 0 ) 6 { + 8 99 (-3808 7112 1584) (-3806 7112 584) 268 147 + 8 98 (-3840 7120 1584) (-3840 7122 584) 267 147 + 8 92 (-3872 7112 1584) (-3874 7112 584) 269 147 + 2 90 (-3816 7104 1584) (-3816 7103.5 1584) 266 1 + 2 87 (-3840 7104 1584) (-3840 7103.5 1584) 254 1 + 2 88 (-3864 7104 1584) (-3864 7103.5 1584) 259 1 + } + 92 ( 65 0 905 13 1 59 0 0 ) 3 { + 2 98 (-3984 7120 584) (-3984 7120.5 584) 271 1 + 2 94 (-3984 7024 584) (-3984 7023.5 584) 273 1 + 2 687 (-4096 7072 584) (-4096.5 7072 584) 270 1 + } + 93 ( 2 0 918 19 0 0 0 0 ) 0 { + } + 94 ( 65 0 937 10 1 60 0 0 ) 3 { + 2 99 (-3768 7024 584) (-3768 7024.5 584) 276 1 + 2 92 (-3984 7024 584) (-3984 7024.5 584) 273 1 + 2 687 (-4096 6920 584) (-4096.5 6920 584) 274 1 + } + 95 ( 65 0 947 5 1 61 0 0 ) 4 { + 2 101 (-3751.8999023438 6792 784) (-3751.5 6792 784) 279 0 + 2 97 (-3924 6800 784) (-3924 6800.5 784) 282 1 + 2 96 (-3924 6784 784) (-3924 6783.5 784) 280 1 + 2 688 (-4096 6792 784) (-4096.5 6792 784) 281 1 + } + 96 ( 69 0 952 7 1 62 0 0 ) 5 { + 2 102 (-3751.8999023438 6776 784) (-3751.5 6776 784) 283 0 + 8 66 (-3916 6768 784) (-3916 6766 224) 284 126 + 8 58 (-4088 6768 784) (-4088 6766 544) 285 111 + 2 95 (-3924 6784 784) (-3924 6784.5 784) 280 1 + 2 689 (-4096 6776 784) (-4096.5 6776 784) 286 1 + } + 97 ( 69 0 959 5 1 63 0 0 ) 4 { + 2 103 (-3751.8999023438 6808 784) (-3751.5 6808 784) 288 0 + 8 94 (-3924 6816 784) (-3924 6818 584) 287 109 + 2 95 (-3924 6800 784) (-3924 6799.5 784) 282 1 + 2 690 (-4096 6808 784) (-4096.5 6808 784) 289 1 + } + 98 ( 65 0 964 12 1 64 0 0 ) 5 { + 2 99 (-3768 7120 584) (-3768 7119.5 584) 294 1 + 2 78 (-3840 7136 584) (-3840 7136.5 584) 233 1 + 2 84 (-4040 7136 584) (-4040 7136.5 584) 253 1 + 2 92 (-3984 7120 584) (-3984 7119.5 584) 271 1 + 2 687 (-4096 7128 584) (-4096.5 7128 584) 290 1 + } + 99 ( 65 0 976 7 1 65 0 0 ) 2 { + 2 98 (-3768 7120 584) (-3768 7120.5 584) 294 1 + 2 94 (-3768 7024 584) (-3768 7023.5 584) 276 1 + } + 100 ( 2 0 983 11 0 0 0 0 ) 0 { + } + 101 ( 65 0 994 7 1 66 0 0 ) 3 { + 2 95 (-3752.1000976563 6792 784) (-3752.5 6792 784) 279 0 + 2 103 (-3748 6800 784) (-3748 6800.5 784) 298 1 + 2 102 (-3748 6784 784) (-3748 6783.5 784) 300 1 + } + 102 ( 69 0 1001 8 1 67 0 0 ) 3 { + 2 96 (-3752.1000976563 6776 784) (-3752.5 6776 784) 283 0 + 8 66 (-3748 6768 784) (-3748 6766 224) 302 126 + 2 101 (-3748 6784 784) (-3748 6784.5 784) 300 1 + } + 103 ( 69 0 1009 7 1 68 0 0 ) 3 { + 2 97 (-3752.1000976563 6808 784) (-3752.5 6808 784) 288 0 + 8 94 (-3748 6816 784) (-3748 6818 584) 303 109 + 2 101 (-3748 6800 784) (-3748 6799.5 784) 298 1 + } + 104 ( 2 0 1016 14 0 0 0 0 ) 0 { + } + 105 ( 2 0 1030 12 0 0 0 0 ) 0 { + } + 106 ( 2 0 1042 7 0 0 0 0 ) 0 { + } + 107 ( 69 0 1049 13 1 69 0 0 ) 5 { + 8 103 (-3744 6808 920) (-3746 6808 784) 307 106 + 8 102 (-3744 6776 920) (-3746 6776 784) 305 106 + 8 101 (-3744 6792 920) (-3746 6792 784) 306 106 + 2 113 (-3728 6952 920) (-3727.5 6952 920) 312 1 + 2 47 (-3736 6768 920) (-3736 6767.5 920) 139 1 + } + 108 ( 69 0 1062 6 1 70 0 0 ) 2 { + 8 109 (-3744 7240 920) (-3746 7240 584) 314 116 + 2 114 (-3728 7240 920) (-3727.5 7240 920) 316 1 + } + 109 ( 65 0 1068 10 1 71 0 0 ) 3 { + 2 78 (-3800 7200 584) (-3800 7199.5 584) 231 1 + 2 73 (-3808 7208 584) (-3808.5 7208 584) 208 1 + 2 110 (-3744 7240 584) (-3743.5 7240 584) 318 1 + } + 110 ( 65 0 1078 6 1 72 0 0 ) 1 { + 2 109 (-3744 7240 584) (-3744.5 7240 584) 318 1 + } + 111 ( 65 0 1084 12 1 73 0 0 ) 4 { + 2 112 (-3600 6432 920) (-3599.5 6432 920) 329 1 + 2 113 (-3696 6744 920) (-3696.5 6744 920) 324 1 + 2 114 (-3696 7240 920) (-3696.5 7240 920) 326 1 + 2 53 (-3648 6352 920) (-3648 6351.5 920) 153 1 + } + 112 ( 65 0 1096 6 1 74 0 0 ) 2 { + 2 111 (-3600 6432 920) (-3600.5 6432 920) 329 1 + 2 53 (-3344 6352 920) (-3344 6351.5 920) 154 1 + } + 113 ( 65 0 1102 11 1 75 0 0 ) 4 { + 2 111 (-3696 6744 920) (-3695.5 6744 920) 324 1 + 2 107 (-3728 6952 920) (-3728.5 6952 920) 312 1 + 2 53 (-3712 6352 920) (-3712 6351.5 920) 152 1 + 2 47 (-3728 6560 920) (-3728.5 6560 920) 140 1 + } + 114 ( 65 0 1113 8 1 76 0 0 ) 2 { + 2 111 (-3696 7240 920) (-3695.5 7240 920) 326 1 + 2 108 (-3728 7240 920) (-3728.5 7240 920) 316 1 + } + 115 ( 69 0 1121 6 1 77 0 0 ) 4 { + 8 111 (-3696 7168 1584) (-3694 7168 920) 335 131 + 2 74 (-3712 7168 1584) (-3712.5 7168 1584) 213 1 + 2 76 (-3704 7152 1584) (-3704 7151.5 1584) 219 1 + 2 77 (-3704 7184 1584) (-3704 7184.5 1584) 230 1 + } + 116 ( 2 0 1127 11 0 0 0 0 ) 0 { + } + 117 ( 2 0 1138 20 0 0 0 0 ) 0 { + } + 118 ( 2 0 1158 20 0 0 0 0 ) 0 { + } + 119 ( 65 0 1178 8 1 78 0 0 ) 4 { + 2 200 (-3760 5432 896) (-3760.5 5432 896) 338 1 + 2 352 (-3592 5488 896) (-3592 5488.5 896) 340 1 + 2 234 (-3760 5320 896) (-3760.5 5320 896) 337 1 + 2 348 (-3736 5488 896) (-3736 5488.5 896) 339 1 + } + 120 ( 65 0 1186 16 3 0 0 0 ) 4 { + 2 127 (-3151.8999023438 5264 444) (-3151.5 5264 456) 347 0 + 2 124 (-3312.1000976563 5264 444) (-3312.5 5264 456) 345 0 + 2 131 (-3232 5140 397.496307373) (-3232 5139.5 397.496307373) 342 1 + 2 158 (-3232 5264 444) (-3232 5264.5 444) 346 1 + } + 121 ( 2 0 1202 8 0 0 0 0 ) 0 { + } + 122 ( 2 0 1210 5 0 0 0 0 ) 0 { + } + 123 ( 2 0 1215 5 0 0 0 0 ) 0 { + } + 124 ( 69 0 1220 7 3 1 0 0 ) 1 { + 8 120 (-3312 5168 456) (-3310 5168 408) 353 102 + } + 125 ( 2 0 1227 5 0 0 0 0 ) 0 { + } + 126 ( 0 0 1232 5 0 0 0 0 ) 0 { + } + 127 ( 69 0 1237 7 3 2 0 0 ) 1 { + 8 120 (-3152 5168 456) (-3154 5168 408) 355 102 + } + 128 ( 0 0 1244 5 0 0 0 0 ) 0 { + } + 129 ( 65 0 1249 13 4 0 0 0 ) 3 { + 2 151 (-3232 4944 384) (-3232 4943.5 384) 360 1 + 2 131 (-3232 5104 384) (-3232 5104.5 384) 362 1 + 2 130 (-3312 5024 384) (-3312.5 5024 384) 361 1 + } + 130 ( 65 4 1262 6 -3 0 0 0 ) 2 { + 2 144 (-3352 5024 399) (-3352.5 5024 399) 365 1 + 2 129 (-3312 5024 384) (-3311.5 5024 384) 361 1 + } + 131 ( 65 4 1268 8 -4 0 0 0 ) 2 { + 2 120 (-3232 5140 397.496307373) (-3232 5140.5 397.496307373) 342 1 + 2 129 (-3232 5104 384) (-3232 5103.5 384) 362 1 + } + 132 ( 2 0 1276 9 0 0 0 0 ) 0 { + } + 133 ( 2 0 1285 8 0 0 0 0 ) 0 { + } + 134 ( 2 0 1293 6 0 0 0 0 ) 0 { + } + 135 ( 2 0 1299 5 0 0 0 0 ) 0 { + } + 136 ( 2 0 1304 6 0 0 0 0 ) 0 { + } + 137 ( 2 0 1310 5 0 0 0 0 ) 0 { + } + 138 ( 2 0 1315 5 0 0 0 0 ) 0 { + } + 139 ( 65 0 1320 6 4 1 0 0 ) 1 { + 2 140 (-3136 5056 456) (-3136.5 5056 456) 369 1 + } + 140 ( 69 0 1326 6 4 2 0 0 ) 2 { + 8 129 (-3152 5056 456) (-3154 5056 384) 373 103 + 2 139 (-3136 5056 456) (-3135.5 5056 456) 369 1 + } + 141 ( 2 0 1332 17 0 0 0 0 ) 0 { + } + 142 ( 65 0 1349 8 5 0 0 0 ) 2 { + 2 148 (-3232 4880 373.3344421387) (-3232 4879.5 373.3344421387) 378 1 + 2 152 (-3232 4904 381.3344421387) (-3232 4904.5 381.3344421387) 376 1 + } + 143 ( 2 0 1357 7 0 0 0 0 ) 0 { + } + 144 ( 65 0 1364 14 6 0 0 0 ) 2 { + 2 130 (-3352 5024 399) (-3351.5 5024 399) 365 1 + 2 153 (-3500 5024 454.5009460449) (-3500.5 5024 454.5009460449) 382 1 + } + 145 ( 0 0 1378 6 0 0 0 0 ) 0 { + } + 146 ( 2 0 1384 6 0 0 0 0 ) 0 { + } + 147 ( 2 0 1390 6 0 0 0 0 ) 0 { + } + 148 ( 65 0 1396 8 5 1 0 0 ) 2 { + 2 142 (-3232 4880 373.3344421387) (-3232 4880.5 373.3344421387) 378 1 + 2 479 (-3232 4784 341.3385009766) (-3232 4783.5 341.3385009766) 386 1 + } + 149 ( 0 0 1404 6 0 0 0 0 ) 0 { + } + 150 ( 0 0 1410 6 0 0 0 0 ) 0 { + } + 151 ( 65 0 1416 6 4 3 0 0 ) 2 { + 2 129 (-3232 4944 384) (-3232 4944.5 384) 360 1 + 2 152 (-3232 4912 384) (-3232 4911.5 384) 391 1 + } + 152 ( 65 4 1422 6 -5 0 0 0 ) 2 { + 2 142 (-3232 4904 381.3344421387) (-3232 4903.5 381.3344421387) 376 1 + 2 151 (-3232 4912 384) (-3232 4912.5 384) 391 1 + } + 153 ( 65 0 1428 7 6 1 0 0 ) 2 { + 2 165 (-3504 5032 456) (-3504.5 5032 456) 396 1 + 2 144 (-3500 5024 454.5009460449) (-3499.5 5024 454.5009460449) 382 1 + } + 154 ( 65 0 1435 14 7 0 0 0 ) 3 { + 2 162 (-3440 5376 456) (-3440.5 5376 456) 406 1 + 2 159 (-3232 5328 456) (-3232 5327.5 456) 402 1 + 2 156 (-3360 5424 456) (-3360 5424.5 456) 398 1 + } + 155 ( 65 0 1449 8 8 0 0 0 ) 2 { + 2 329 (-3360 5612 456) (-3360 5612.5 456) 409 1 + 2 156 (-3360 5460 456) (-3360 5459.5 456) 407 1 + } + 156 ( 65 4 1457 6 -6 0 0 0 ) 2 { + 2 155 (-3360 5460 456) (-3360 5460.5 456) 407 1 + 2 154 (-3360 5424 456) (-3360 5423.5 456) 398 1 + } + 157 ( 0 0 1463 6 0 0 0 0 ) 0 { + } + 158 ( 65 0 1469 6 3 3 0 0 ) 2 { + 2 120 (-3232 5264 444) (-3232 5263.5 444) 346 1 + 2 160 (-3232 5292 454.500793457) (-3232 5292.5 454.500793457) 414 1 + } + 159 ( 65 0 1475 6 7 1 0 0 ) 2 { + 2 160 (-3232 5296 456) (-3232 5295.5 456) 418 1 + 2 154 (-3232 5328 456) (-3232 5328.5 456) 402 1 + } + 160 ( 65 4 1481 6 -7 0 0 0 ) 2 { + 2 159 (-3232 5296 456) (-3232 5296.5 456) 418 1 + 2 158 (-3232 5292 454.500793457) (-3232 5291.5 454.500793457) 414 1 + } + 161 ( 65 0 1487 6 9 0 0 0 ) 2 { + 2 162 (-3476 5376 456) (-3475.5 5376 456) 424 1 + 2 232 (-3620 5376 456) (-3620.5 5376 456) 422 1 + } + 162 ( 65 4 1493 6 -8 0 0 0 ) 2 { + 2 161 (-3476 5376 456) (-3476.5 5376 456) 424 1 + 2 154 (-3440 5376 456) (-3439.5 5376 456) 406 1 + } + 163 ( 65 0 1499 15 10 0 0 0 ) 6 { + 2 167 (-3696 5228 456) (-3696 5228.5 456) 437 1 + 2 166 (-3584 5228 456) (-3584 5228.5 456) 438 1 + 2 176 (-3760 5032 456) (-3760.5 5032 456) 435 1 + 2 169 (-3744 4960 456) (-3744 4959.5 456) 434 1 + 2 165 (-3536 5032 456) (-3535.5 5032 456) 430 1 + 2 168 (-3616 4960 456) (-3616 4959.5 456) 432 1 + } + 164 ( 0 0 1514 6 0 0 0 0 ) 0 { + } + 165 ( 65 4 1520 6 -9 0 0 0 ) 2 { + 2 153 (-3504 5032 456) (-3503.5 5032 456) 396 1 + 2 163 (-3536 5032 456) (-3536.5 5032 456) 430 1 + } + 166 ( 65 0 1526 6 10 1 0 0 ) 2 { + 2 167 (-3632 5230 456) (-3632.5 5230 456) 443 1 + 2 163 (-3584 5228 456) (-3584 5227.5 456) 438 1 + } + 167 ( 65 0 1532 7 10 2 0 0 ) 3 { + 2 166 (-3632 5230 456) (-3631.5 5230 456) 443 1 + 2 222 (-3712 5232 456) (-3712 5232.5 456) 445 1 + 2 163 (-3696 5228 456) (-3696 5227.5 456) 437 1 + } + 168 ( 65 0 1539 6 10 3 0 0 ) 1 { + 2 163 (-3616 4960 456) (-3616 4960.5 456) 432 1 + } + 169 ( 65 0 1545 6 10 4 0 0 ) 2 { + 2 176 (-3760 4956 456) (-3760.5 4956 456) 450 1 + 2 163 (-3744 4960 456) (-3744 4960.5 456) 434 1 + } + 170 ( 65 0 1551 10 11 0 0 0 ) 5 { + 2 171 (-4088 4844 256) (-4088 4844.5 256) 455 1 + 2 172 (-3968 4844 256) (-3968 4844.5 256) 457 1 + 2 173 (-3824 4844 256) (-3824 4844.5 256) 459 1 + 2 473 (-3944 4784 256) (-3944 4783.5 256) 453 1 + 2 1132 (-4096 4814 256) (-4096.5 4814 256) 454 1 + } + 171 ( 65 0 1561 6 11 1 0 0 ) 2 { + 2 170 (-4088 4844 256) (-4088 4843.5 256) 455 1 + 2 1132 (-4096 4846 256) (-4096.5 4846 256) 461 1 + } + 172 ( 65 0 1567 6 11 2 0 0 ) 1 { + 2 170 (-3968 4844 256) (-3968 4843.5 256) 457 1 + } + 173 ( 65 0 1573 6 11 3 0 0 ) 1 { + 2 170 (-3824 4844 256) (-3824 4843.5 256) 459 1 + } + 174 ( 65 0 1579 8 12 0 0 0 ) 4 { + 2 175 (-4048 5032 456) (-4048.5 5032 456) 475 1 + 2 177 (-3856 5028 456) (-3855.5 5028 456) 471 1 + 2 180 (-3928 4952 456) (-3928 4951.5 456) 472 1 + 2 181 (-3952 5104 456) (-3952 5104.5 456) 470 1 + } + 175 ( 65 0 1587 9 12 1 0 0 ) 4 { + 2 174 (-4048 5032 456) (-4047.5 5032 456) 475 1 + 2 181 (-4072 5104 456) (-4072 5104.5 456) 478 1 + 2 801 (-4096 4980 456) (-4096.5 4980 456) 476 1 + 2 797 (-4096 5052 456) (-4096.5 5052 456) 477 1 + } + 176 ( 65 0 1596 8 10 5 0 0 ) 4 { + 2 177 (-3820 5028 456) (-3820.5 5028 456) 483 1 + 2 169 (-3760 4956 456) (-3759.5 4956 456) 450 1 + 2 179 (-3798 4952 456) (-3798 4951.5 456) 482 1 + 2 163 (-3760 5032 456) (-3759.5 5032 456) 435 1 + } + 177 ( 65 4 1604 8 -10 0 0 0 ) 4 { + 2 176 (-3820 5028 456) (-3819.5 5028 456) 483 1 + 2 174 (-3856 5028 456) (-3856.5 5028 456) 471 1 + 2 179 (-3820 4948 456) (-3819.5 4948 456) 484 1 + 2 180 (-3856 4948 456) (-3856.5 4948 456) 486 1 + } + 178 ( 65 0 1612 7 1 79 0 0 ) 1 { + 2 215 (-4512 5232.1000976563 800) (-4512 5232.5 800) 488 0 + } + 179 ( 65 0 1619 6 10 6 0 0 ) 2 { + 2 176 (-3798 4952 456) (-3798 4952.5 456) 482 1 + 2 177 (-3820 4948 456) (-3820.5 4948 456) 484 1 + } + 180 ( 65 0 1625 6 12 2 0 0 ) 2 { + 2 174 (-3928 4952 456) (-3928 4952.5 456) 472 1 + 2 177 (-3856 4948 456) (-3855.5 4948 456) 486 1 + } + 181 ( 65 0 1631 8 12 3 0 0 ) 4 { + 2 175 (-4072 5104 456) (-4072 5103.5 456) 478 1 + 2 174 (-3952 5104 456) (-3952 5103.5 456) 470 1 + 2 182 (-3976 5216 456) (-3976 5216.5 456) 497 1 + 2 797 (-4096 5160 456) (-4096.5 5160 456) 496 1 + } + 182 ( 65 0 1639 7 12 4 0 0 ) 3 { + 2 181 (-3976 5216 456) (-3976 5215.5 456) 497 1 + 2 183 (-4024 5228 456) (-4024 5228.5 456) 501 1 + 2 797 (-4144 5216 456) (-4144 5215.5 456) 499 1 + } + 183 ( 65 4 1646 9 -11 0 0 0 ) 4 { + 2 195 (-3864 5264 456) (-3864 5264.5 456) 506 1 + 2 182 (-4024 5228 456) (-4024 5227.5 456) 501 1 + 2 788 (-4144 5264 456) (-4144 5264.5 456) 504 1 + 2 196 (-3984 5264 456) (-3984 5264.5 456) 505 1 + } + 184 ( 65 0 1655 8 13 0 0 0 ) 4 { + 2 188 (-3984 5024 64) (-3983.5 5024 64) 511 1 + 2 192 (-4032 5104 64) (-4032 5104.5 64) 510 1 + 2 186 (-4032 4944 64) (-4032 4943.5 64) 508 1 + 2 185 (-4080 5024 64) (-4080.5 5024 64) 509 1 + } + 185 ( 65 4 1663 7 -12 0 0 0 ) 3 { + 2 187 (-4098 4944 64) (-4098 4943.5 64) 513 1 + 2 184 (-4080 5024 64) (-4079.5 5024 64) 509 1 + 2 843 (-4116 5024 64) (-4116.5 5024 64) 514 1 + } + 186 ( 65 0 1670 8 13 1 0 0 ) 3 { + 2 188 (-3976 4944 64) (-3976 4944.5 64) 517 1 + 2 184 (-4032 4944 64) (-4032 4944.5 64) 508 1 + 2 187 (-4080 4936 64) (-4080.5 4936 64) 516 1 + } + 187 ( 65 4 1678 6 -13 0 0 0 ) 3 { + 2 186 (-4080 4936 64) (-4079.5 4936 64) 516 1 + 2 185 (-4098 4944 64) (-4098 4944.5 64) 513 1 + 2 1154 (-4116 4936 64) (-4116.5 4936 64) 520 1 + } + 188 ( 65 0 1684 6 13 2 0 0 ) 2 { + 2 184 (-3984 5024 64) (-3984.5 5024 64) 511 1 + 2 186 (-3976 4944 64) (-3976 4943.5 64) 517 1 + } + 189 ( 65 0 1690 10 14 0 0 0 ) 4 { + 2 190 (-4032 5151.9755859375 64) (-4032 5151.4755859375 64) 526 1 + 2 194 (-3984 5184 47.9877624512) (-3983.5 5184 47.9877624512) 524 1 + 2 193 (-4080 5184 47.9877548218) (-4080.5 5184 47.9877548218) 528 1 + 2 191 (-4032 5228 25.9851531982) (-4032 5228.5 25.9851531982) 530 1 + } + 190 ( 65 0 1700 6 14 1 0 0 ) 2 { + 2 192 (-4032 5140 64) (-4032 5139.5 64) 533 1 + 2 189 (-4032 5151.9755859375 64) (-4032 5152.4755859375 64) 526 1 + } + 191 ( 65 4 1706 7 -14 0 0 0 ) 2 { + 2 207 (-4032 5264.1000976563 7.9854230881) (-4032 5264.5 0) 535 1 + 2 189 (-4032 5228 25.9851531982) (-4032 5227.5 25.9851531982) 530 1 + } + 192 ( 65 4 1713 6 -15 0 0 0 ) 2 { + 2 184 (-4032 5104 64) (-4032 5103.5 64) 510 1 + 2 190 (-4032 5140 64) (-4032 5140.5 64) 533 1 + } + 193 ( 65 0 1719 6 14 2 0 0 ) 1 { + 2 189 (-4080 5184 47.9877548218) (-4079.5 5184 47.9877548218) 528 1 + } + 194 ( 65 0 1725 6 14 3 0 0 ) 1 { + 2 189 (-3984 5184 47.9877624512) (-3984.5 5184 47.9877624512) 524 1 + } + 195 ( 65 0 1731 14 1 80 0 0 ) 4 { + 2 196 (-3872 5272 456) (-3872.5 5272 456) 547 1 + 2 197 (-3872 5320 456) (-3872.5 5320 456) 548 1 + 2 203 (-3864 5360 456) (-3864 5360.5 456) 545 1 + 2 183 (-3864 5264 456) (-3864 5263.5 456) 506 1 + } + 196 ( 65 0 1745 12 1 81 0 0 ) 5 { + 2 195 (-3872 5272 456) (-3871.5 5272 456) 547 1 + 2 197 (-3880 5280 456) (-3880 5280.5 456) 551 1 + 2 183 (-3984 5264 456) (-3984 5263.5 456) 505 1 + 2 788 (-4096 5272 456) (-4096.5 5272 456) 549 1 + 2 199 (-3992 5280 456) (-3992 5280.5 456) 550 1 + } + 197 ( 69 0 1757 10 1 82 0 0 ) 4 { + 2 195 (-3872 5320 456) (-3871.5 5320 456) 548 1 + 2 196 (-3880 5280 456) (-3880 5279.5 456) 551 1 + 2 204 (-3880 5360 456) (-3880 5360.5 456) 554 1 + 2 199 (-3888 5288 456) (-3888.5 5288 456) 552 1 + } + 198 ( 2 0 1767 19 0 0 0 0 ) 0 { + } + 199 ( 69 0 1786 8 1 83 0 0 ) 3 { + 2 197 (-3888 5288 456) (-3887.5 5288 456) 552 1 + 2 790 (-4096 5288 456) (-4096.5 5288 456) 555 1 + 2 196 (-3992 5280 456) (-3992 5279.5 456) 550 1 + } + 200 ( 65 0 1794 9 1 84 0 0 ) 6 { + 2 201 (-3872 5432 896) (-3872.5 5432 896) 557 1 + 2 354 (-3856 5488 896) (-3856 5488.5 896) 558 1 + 2 234 (-3800 5376 896) (-3800 5375.5 896) 560 1 + 2 202 (-3856 5376 896) (-3856 5375.5 896) 561 1 + 2 119 (-3760 5432 896) (-3759.5 5432 896) 338 1 + 2 348 (-3800 5488 896) (-3800 5488.5 896) 559 1 + } + 201 ( 69 0 1803 9 1 85 0 0 ) 4 { + 2 202 (-3880 5376 896) (-3880 5375.5 896) 562 1 + 2 200 (-3872 5432 896) (-3871.5 5432 896) 557 1 + 2 355 (-3872 5512 896) (-3871.5 5512 896) 566 1 + 2 354 (-3872 5496 896) (-3871.5 5496 896) 567 1 + } + 202 ( 69 0 1812 10 1 86 0 0 ) 6 { + 8 197 (-3880 5360 896) (-3880 5358 456) 571 120 + 8 195 (-3864 5360 896) (-3864 5358 456) 570 120 + 2 201 (-3880 5376 896) (-3880 5376.5 896) 562 1 + 2 200 (-3856 5376 896) (-3856 5376.5 896) 561 1 + 2 235 (-3848 5360 896) (-3848 5359.5 896) 569 1 + 2 234 (-3840 5368 896) (-3839.5 5368 896) 568 1 + } + 203 ( 65 0 1822 7 1 87 0 0 ) 3 { + 2 195 (-3864 5360 456) (-3864 5359.5 456) 545 1 + 2 204 (-3872 5424 456) (-3872.5 5424 456) 575 1 + 2 342 (-3864 5488 456) (-3864 5488.5 456) 573 1 + } + 204 ( 69 0 1829 7 1 88 0 0 ) 3 { + 2 197 (-3880 5360 456) (-3880 5359.5 456) 554 1 + 2 203 (-3872 5424 456) (-3871.5 5424 456) 575 1 + 2 340 (-3880 5488 456) (-3880 5488.5 456) 576 1 + } + 205 ( 2 0 1836 9 0 0 0 0 ) 0 { + } + 206 ( 2 0 1845 25 0 0 0 0 ) 0 { + } + 207 ( 65 0 1870 11 1 89 0 0 ) 5 { + 2 212 (-3967.8999023438 5360 0) (-3967.5 5360 8) 578 0 + 2 191 (-4032 5263.8999023438 0) (-4032 5263.5 7.9854230881) 580 0 + 2 208 (-4040 5456 0) (-4040 5456.5 0) 582 1 + 2 210 (-3976 5456 0) (-3976 5456.5 0) 583 1 + 2 854 (-4096 5360 0) (-4096.5 5360 0) 581 1 + } + 208 ( 65 0 1881 7 1 90 0 0 ) 5 { + 2 207 (-4040 5456 0) (-4040 5455.5 0) 582 1 + 2 255 (-4040 5488 0) (-4040 5488.5 0) 585 1 + 2 209 (-3984 5480 0) (-3983.5 5480 0) 586 1 + 2 210 (-3984 5464 0) (-3983.5 5464 0) 587 1 + 2 854 (-4096 5472 0) (-4096.5 5472 0) 584 1 + } + 209 ( 65 0 1888 6 1 91 0 0 ) 4 { + 2 208 (-3984 5480 0) (-3984.5 5480 0) 586 1 + 2 255 (-3976 5488 0) (-3976 5488.5 0) 590 1 + 2 210 (-3976 5472 0) (-3976 5471.5 0) 589 1 + 2 211 (-3968 5480 0) (-3967.5 5480 0) 588 1 + } + 210 ( 69 0 1894 7 1 92 0 0 ) 4 { + 2 213 (-3967.8999023438 5464 0) (-3967.5 5464 8) 591 0 + 2 208 (-3984 5464 0) (-3984.5 5464 0) 587 1 + 2 207 (-3976 5456 0) (-3976 5455.5 0) 583 1 + 2 209 (-3976 5472 0) (-3976 5472.5 0) 589 1 + } + 211 ( 65 0 1901 10 1 93 0 0 ) 3 { + 2 213 (-3968 5471.8999023438 0) (-3968 5471.5 8) 595 0 + 2 209 (-3968 5480 0) (-3968.5 5480 0) 588 1 + 2 255 (-3968 5592 0) (-3968.5 5592 0) 592 1 + } + 212 ( 65 0 1911 5 1 94 0 0 ) 3 { + 2 227 (-3855.8999023438 5392 64) (-3855.5 5392 72) 598 0 + 2 207 (-3968.1000976563 5360 8) (-3968.5 5360 0) 596 1 + 2 213 (-3912 5456 36) (-3912 5456.5 36) 597 1 + } + 213 ( 69 0 1916 5 1 95 0 0 ) 4 { + 2 227 (-3855.8999023438 5464 64) (-3855.5 5464 72) 603 0 + 8 211 (-3856 5472 64) (-3856 5474 0) 602 103 + 2 210 (-3968.1000976563 5464 8) (-3968.5 5464 0) 601 1 + 2 212 (-3912 5456 36) (-3912 5455.5 36) 597 1 + } + 214 ( 2 0 1921 12 0 0 0 0 ) 0 { + } + 215 ( 65 0 1933 6 1 96 0 0 ) 3 { + 2 178 (-4512 5231.8999023438 800) (-4512 5231.5 800) 488 0 + 2 216 (-4288 5248 784) (-4288 5248.5 784) 606 1 + 2 805 (-4944 5248 784) (-4944 5248.5 784) 605 1 + } + 216 ( 69 0 1939 9 1 97 0 0 ) 8 { + 8 854 (-4304 5264 768) (-4304 5266 0) 610 136 + 8 789 (-4232 5264 768) (-4232 5266 456) 610 114 + 8 788 (-4144 5264 768) (-4144 5266 456) 610 114 + 8 196 (-3984 5264 768) (-3984 5266 456) 611 114 + 8 195 (-3864 5264 768) (-3864 5266 456) 612 114 + 2 215 (-4288 5248 784) (-4288 5247.5 784) 606 1 + 2 808 (-4712 5264 767.991394043) (-4712 5264.5 767.991394043) 609 1 + 2 805 (-4720 5256 775.991394043) (-4720.5 5256 775.991394043) 608 1 + } + 217 ( 2 0 1948 6 0 0 0 0 ) 0 { + } + 218 ( 2 0 1954 9 0 0 0 0 ) 0 { + } + 219 ( 2 0 1963 6 0 0 0 0 ) 0 { + } + 220 ( 65 0 1969 7 1 98 0 0 ) 2 { + 2 230 (-3712 5392.1000976563 89) (-3712 5392.5 88) 616 1 + 2 231 (-3760 5360 89) (-3760.5 5360 89) 615 1 + } + 221 ( 2 0 1976 7 0 0 0 0 ) 0 { + } + 222 ( 65 4 1983 6 -16 0 0 0 ) 2 { + 2 167 (-3712 5232 456) (-3712 5231.5 456) 445 1 + 2 223 (-3712 5248 456) (-3712 5248.5 456) 620 1 + } + 223 ( 69 0 1989 6 15 0 0 0 ) 1 { + 2 222 (-3712 5248 456) (-3712 5247.5 456) 620 1 + } + 224 ( 65 0 1995 11 1 99 0 0 ) 5 { + 2 237 (-3808 5488.1000976563 80) (-3808 5488.5 72) 627 1 + 2 231 (-3791.8999023438 5360 80) (-3791.5 5360 89) 629 0 + 2 230 (-3791.8999023438 5424 80) (-3791.5 5424 88) 629 0 + 2 226 (-3824.1000976563 5408 80) (-3824.5 5408 72) 626 1 + 2 228 (-3792 5472 80) (-3791.5 5472 80) 628 1 + } + 225 ( 2 0 2006 9 0 0 0 0 ) 0 { + } + 226 ( 65 0 2015 6 1 100 0 0 ) 3 { + 2 224 (-3823.8999023438 5408 72) (-3823.5 5408 80) 632 0 + 2 237 (-3832 5488 72) (-3832 5488.5 72) 631 1 + 2 227 (-3840 5408 72) (-3840.5 5408 72) 630 1 + } + 227 ( 69 0 2021 6 1 101 0 0 ) 5 { + 2 213 (-3856.1000976563 5464 72) (-3856.5 5464 64) 634 1 + 2 212 (-3856.1000976563 5392 72) (-3856.5 5392 64) 634 1 + 8 211 (-3856 5480 72) (-3858 5480 0) 634 103 + 2 226 (-3840 5408 72) (-3839.5 5408 72) 630 1 + 2 238 (-3848 5488 72) (-3848 5488.5 72) 635 1 + } + 228 ( 65 0 2027 8 1 102 0 0 ) 3 { + 2 237 (-3728 5488.1000976563 80) (-3728 5488.5 72) 639 1 + 2 230 (-3728 5455.8999023438 80) (-3728 5455.5 88) 638 0 + 2 224 (-3792 5472 80) (-3792.5 5472 80) 628 1 + } + 229 ( 69 0 2035 6 16 0 0 0 ) 1 { + 2 233 (-3656 5376 456) (-3655.5 5376 456) 641 1 + } + 230 ( 65 0 2041 10 1 103 0 0 ) 4 { + 2 231 (-3776 5391.8999023438 88) (-3776 5391.5 89) 644 0 + 2 228 (-3728 5456.1000976563 88) (-3728 5456.5 80) 646 1 + 2 224 (-3792.1000976563 5424 88) (-3792.5 5424 80) 645 1 + 2 220 (-3712 5391.8999023438 88) (-3712 5391.5 89) 644 0 + } + 231 ( 65 0 2051 6 1 104 0 0 ) 3 { + 2 230 (-3776 5392.1000976563 89) (-3776 5392.5 88) 649 1 + 2 224 (-3792.1000976563 5360 89) (-3792.5 5360 80) 648 1 + 2 220 (-3760 5360 89) (-3759.5 5360 89) 615 1 + } + 232 ( 65 0 2057 6 9 1 0 0 ) 2 { + 2 233 (-3648 5376 456) (-3648.5 5376 456) 653 1 + 2 161 (-3620 5376 456) (-3619.5 5376 456) 422 1 + } + 233 ( 69 4 2063 6 -17 0 0 0 ) 2 { + 2 229 (-3656 5376 456) (-3656.5 5376 456) 641 1 + 2 232 (-3648 5376 456) (-3647.5 5376 456) 653 1 + } + 234 ( 65 0 2069 7 1 105 0 0 ) 4 { + 2 235 (-3840 5312 896) (-3840.5 5312 896) 657 1 + 2 200 (-3800 5376 896) (-3800 5376.5 896) 560 1 + 2 202 (-3840 5368 896) (-3840.5 5368 896) 568 1 + 2 119 (-3760 5320 896) (-3759.5 5320 896) 337 1 + } + 235 ( 69 0 2076 6 1 106 0 0 ) 3 { + 8 195 (-3856 5312 896) (-3858 5312 456) 658 120 + 2 234 (-3840 5312 896) (-3839.5 5312 896) 657 1 + 2 202 (-3848 5360 896) (-3848 5360.5 896) 569 1 + } + 236 ( 2 0 2082 50 0 0 0 0 ) 0 { + } + 237 ( 65 0 2132 11 1 107 0 0 ) 5 { + 2 241 (-3752 5520.1000976563 72) (-3752 5520.5 64) 663 1 + 2 228 (-3728 5487.8999023438 72) (-3728 5487.5 80) 661 0 + 2 224 (-3808 5487.8999023438 72) (-3808 5487.5 80) 661 0 + 2 238 (-3840 5504 72) (-3840.5 5504 72) 662 1 + 2 226 (-3832 5488 72) (-3832 5487.5 72) 631 1 + } + 238 ( 69 0 2143 8 1 108 0 0 ) 4 { + 2 243 (-3848 5520.1000976563 72) (-3848 5520.5 64) 665 1 + 8 211 (-3856 5504 72) (-3858 5504 0) 664 103 + 2 237 (-3840 5504 72) (-3839.5 5504 72) 662 1 + 2 227 (-3848 5488 72) (-3848 5487.5 72) 635 1 + } + 239 ( 2 0 2151 12 0 0 0 0 ) 0 { + } + 240 ( 65 0 2163 10 1 109 0 0 ) 2 { + 2 241 (-3616 5704 64) (-3616.5 5704 64) 669 1 + 2 319 (-3616 5768 64) (-3616.5 5768 64) 670 1 + } + 241 ( 65 0 2173 9 1 110 0 0 ) 6 { + 2 237 (-3752 5519.8999023438 64) (-3752 5519.5 72) 676 0 + 2 315 (-3780 5760 64) (-3780 5760.5 64) 673 1 + 2 242 (-3840 5736 64) (-3840.5 5736 64) 672 1 + 2 243 (-3840 5616 64) (-3840.5 5616 64) 671 1 + 2 240 (-3616 5704 64) (-3615.5 5704 64) 669 1 + 2 319 (-3668 5760 64) (-3668 5760.5 64) 674 1 + } + 242 ( 65 0 2182 8 1 111 0 0 ) 6 { + 2 241 (-3840 5736 64) (-3839.5 5736 64) 672 1 + 2 243 (-3848 5712 64) (-3848 5711.5 64) 677 1 + 2 312 (-3912 5760 64) (-3912 5760.5 64) 680 1 + 2 244 (-3952 5736 64) (-3952.5 5736 64) 679 1 + 2 315 (-3856 5760 64) (-3856 5760.5 64) 681 1 + 2 245 (-3904 5712 64) (-3904 5711.5 64) 678 1 + } + 243 ( 69 0 2190 7 1 112 0 0 ) 5 { + 2 238 (-3848 5519.8999023438 64) (-3848 5519.5 72) 684 0 + 8 211 (-3856 5608 64) (-3858 5608 0) 682 103 + 2 241 (-3840 5616 64) (-3839.5 5616 64) 671 1 + 2 242 (-3848 5712 64) (-3848 5712.5 64) 677 1 + 2 245 (-3856 5704 64) (-3856.5 5704 64) 683 1 + } + 244 ( 69 0 2197 6 1 113 0 0 ) 4 { + 8 255 (-3968 5736 64) (-3970 5736 0) 687 103 + 2 245 (-3960 5712 64) (-3960 5711.5 64) 686 1 + 2 313 (-3960 5760 64) (-3960 5760.5 64) 685 1 + 2 242 (-3952 5736 64) (-3951.5 5736 64) 679 1 + } + 245 ( 69 0 2203 7 1 114 0 0 ) 5 { + 8 255 (-3968 5704 64) (-3970 5704 0) 689 103 + 8 211 (-3912 5696 64) (-3912 5694 0) 688 103 + 2 243 (-3856 5704 64) (-3855.5 5704 64) 683 1 + 2 244 (-3960 5712 64) (-3960 5712.5 64) 686 1 + 2 242 (-3904 5712 64) (-3904 5712.5 64) 678 1 + } + 246 ( 2 0 2210 6 0 0 0 0 ) 0 { + } + 247 ( 2 0 2216 12 0 0 0 0 ) 0 { + } + 248 ( 0 0 2228 5 0 0 0 0 ) 0 { + } + 249 ( 2 0 2233 10 0 0 0 0 ) 0 { + } + 250 ( 2 0 2243 7 0 0 0 0 ) 0 { + } + 251 ( 2 0 2250 8 0 0 0 0 ) 0 { + } + 252 ( 0 0 2258 6 0 0 0 0 ) 0 { + } + 253 ( 2 0 2264 13 0 0 0 0 ) 0 { + } + 254 ( 2 0 2277 8 0 0 0 0 ) 0 { + } + 255 ( 65 0 2285 16 1 115 0 0 ) 10 { + 2 257 (-4080 6048.1000976563 0) (-4080 6048.5 8) 696 0 + 2 208 (-4040 5488 0) (-4040 5487.5 0) 585 1 + 2 209 (-3976 5488 0) (-3976 5487.5 0) 590 1 + 2 211 (-3968 5592 0) (-3967.5 5592 0) 592 1 + 2 256 (-4088 6048 0) (-4088 6048.5 0) 695 1 + 2 850 (-4096 5544 0) (-4096.5 5544 0) 691 1 + 2 854 (-4096 5512 0) (-4096.5 5512 0) 690 1 + 2 872 (-4096 5608 0) (-4096.5 5608 0) 692 1 + 2 874 (-4096 5672 0) (-4096.5 5672 0) 693 1 + 2 893 (-4096 5864 0) (-4096.5 5864 0) 694 1 + } + 256 ( 69 0 2301 7 1 116 0 0 ) 4 { + 2 257 (-4079.8999023438 6056 0) (-4079.5 6056 8) 699 0 + 2 22 (-4088 6064 0) (-4088 6064.5 0) 58 1 + 2 255 (-4088 6048 0) (-4088 6047.5 0) 695 1 + 2 893 (-4096 6056 0) (-4096.5 6056 0) 698 1 + } + 257 ( 69 0 2308 5 1 117 0 0 ) 4 { + 2 309 (-3967.8920898438 6056 64) (-3967.4921875 6055.9995117188 64) 701 0 + 2 256 (-4080.1000976563 6056 8) (-4080.5 6056 0) 700 1 + 8 255 (-3968 6048 64) (-3968 6046 0) 702 103 + 2 23 (-4023.9921875 6064 36) (-4023.9921875 6064.5 36) 64 1 + } + 258 ( 2 0 2313 6 0 0 0 0 ) 0 { + } + 259 ( 65 0 2319 7 1 118 0 0 ) 3 { + 2 3 (-3741.8442382813 6144 192) (-3741.8442382813 6144.5 192) 2 1 + 2 261 (-3763.6884765625 6143.7744140625 192) (-3764.1884765625 6143.7744140625 192) 705 1 + 2 260 (-3741.8442382813 6137.28515625 192) (-3741.9821777344 6136.8046875 192) 704 1 + } + 260 ( 69 0 2326 8 1 119 0 0 ) 4 { + 8 273 (-3748.6171875 6118.6381835938 192) (-3749.1687011719 6116.7158203125 144) 709 102 + 8 270 (-3726.7729492188 6114.3149414063 192) (-3726.7729492188 6112.3149414063 144) 708 102 + 2 259 (-3741.8442382813 6137.28515625 192) (-3741.7062988281 6137.765625 192) 704 1 + 2 261 (-3763.6884765625 6133.2548828125 192) (-3764.1884765625 6133.2548828125 192) 706 1 + } + 261 ( 69 0 2334 7 1 120 0 0 ) 5 { + 8 273 (-3771.6884765625 6125.25390625 192) (-3772.2395019531 6123.3310546875 144) 710 102 + 8 8 (-3779.6884765625 6135.7734375 192) (-3781.6884765625 6135.7734375 144) 711 102 + 2 4 (-3771.6884765625 6144 192) (-3771.6884765625 6144.5 192) 5 1 + 2 259 (-3763.6884765625 6143.7744140625 192) (-3763.1884765625 6143.7744140625 192) 705 1 + 2 260 (-3763.6884765625 6133.2548828125 192) (-3763.1884765625 6133.2548828125 192) 706 1 + } + 262 ( 2 0 2341 16 0 0 0 0 ) 0 { + } + 263 ( 2 0 2357 27 0 0 0 0 ) 0 { + } + 264 ( 2 0 2384 6 0 0 0 0 ) 0 { + } + 265 ( 2 0 2390 12 0 0 0 0 ) 0 { + } + 266 ( 65 0 2402 9 1 121 0 0 ) 5 { + 2 299 (-3789.4738769531 5807.486328125 144) (-3789.9738769531 5807.486328125 144) 715 1 + 2 301 (-3789.4738769531 5863.4853515625 144) (-3789.9738769531 5863.4853515625 144) 717 1 + 2 272 (-3776 5824 144) (-3775.5 5824 144) 713 1 + 2 267 (-3782.7368164063 5864 144) (-3782.7368164063 5864.5 144) 712 1 + 2 268 (-3782.7368164063 5784 144) (-3782.7368164063 5783.5 144) 714 1 + } + 267 ( 69 0 2411 8 1 122 0 0 ) 5 { + 8 310 (-3774.7368164063 5880 144) (-3774.7368164063 5882 64) 718 103 + 8 271 (-3760 5872 144) (-3758 5872 64) 719 103 + 2 302 (-3789.4738769531 5872 144) (-3789.9738769531 5872 144) 721 1 + 2 266 (-3782.7368164063 5864 144) (-3782.7368164063 5863.5 144) 712 1 + 2 272 (-3768 5864 144) (-3768 5863.5 144) 720 1 + } + 268 ( 69 0 2419 9 1 123 0 0 ) 6 { + 8 315 (-3774.7368164063 5768 144) (-3774.7368164063 5766 64) 724 103 + 8 271 (-3760 5776 144) (-3758 5776 64) 723 103 + 2 294 (-3789.4738769531 5770.232421875 144) (-3789.9738769531 5770.232421875 144) 725 1 + 2 300 (-3789.4738769531 5778.232421875 144) (-3789.9738769531 5778.232421875 144) 726 1 + 2 266 (-3782.7368164063 5784 144) (-3782.7368164063 5784.5 144) 714 1 + 2 272 (-3768 5784 144) (-3768 5784.5 144) 722 1 + } + 269 ( 2 0 2428 8 0 0 0 0 ) 0 { + } + 270 ( 69 0 2436 7 1 124 0 0 ) 3 { + 8 307 (-3749.8442382813 6112 144) (-3749.8442382813 6110 64) 727 103 + 2 8 (-3779.6884765625 6113.1572265625 144) (-3780.1884765625 6113.1572265625 144) 23 1 + 2 273 (-3756.6171875 6114.3149414063 144) (-3756.6171875 6114.8149414063 144) 728 1 + } + 271 ( 65 0 2443 11 1 125 0 0 ) 3 { + 2 315 (-3740 5768 64) (-3740 5767.5 64) 734 1 + 2 310 (-3740 5880 64) (-3740 5880.5 64) 732 1 + 2 319 (-3720 5824 64) (-3719.5 5824 64) 731 1 + } + 272 ( 69 0 2454 6 1 126 0 0 ) 4 { + 8 271 (-3760 5824 144) (-3758 5824 64) 735 103 + 2 266 (-3776 5824 144) (-3776.5 5824 144) 713 1 + 2 267 (-3768 5864 144) (-3768 5864.5 144) 720 1 + 2 268 (-3768 5784 144) (-3768 5783.5 144) 722 1 + } + 273 ( 69 0 2460 5 1 127 0 0 ) 2 { + 2 270 (-3756.6171875 6114.3149414063 144) (-3756.6171875 6113.8149414063 144) 728 1 + 2 8 (-3779.6884765625 6120.9306640625 144) (-3780.1884765625 6120.9306640625 144) 22 1 + } + 274 ( 2 0 2465 7 0 0 0 0 ) 0 { + } + 275 ( 2 0 2472 11 0 0 0 0 ) 0 { + } + 276 ( 2 0 2483 6 0 0 0 0 ) 0 { + } + 277 ( 2 0 2489 7 0 0 0 0 ) 0 { + } + 278 ( 2 0 2496 8 0 0 0 0 ) 0 { + } + 279 ( 65 0 2504 6 1 128 0 0 ) 4 { + 2 283 (-3832.7495117188 5817.72265625 224) (-3832.3837890625 5817.3818359375 224) 737 1 + 2 280 (-3834.7250976563 5874.263671875 224) (-3834.3840332031 5874.6293945313 224) 740 1 + 2 281 (-3891.2543945313 5872.28515625 224) (-3891.6201171875 5872.6259765625 224) 739 1 + 2 282 (-3889.2788085938 5815.744140625 224) (-3889.6198730469 5815.3784179688 224) 738 1 + } + 280 ( 69 0 2510 7 1 129 0 0 ) 5 { + 8 310 (-3827.8598632813 5898.7666015625 224) (-3826.4826660156 5900.2294921875 64) 741 107 + 8 298 (-3855.98046875 5917.5327148438 224) (-3855.98046875 5919.5327148438 144) 745 103 + 2 279 (-3834.7250976563 5874.263671875 224) (-3835.0661621094 5873.8979492188 224) 740 1 + 2 281 (-3863.9765625 5909.5400390625 224) (-3864.4765625 5909.5400390625 224) 744 1 + 2 284 (-3805.4738769531 5862.4360351563 224) (-3804.9738769531 5862.4360351563 224) 743 1 + } + 281 ( 69 0 2517 8 1 130 0 0 ) 7 { + 8 304 (-3886.2863769531 5910.7666015625 224) (-3887.7490234375 5912.1303710938 144) 747 103 + 8 303 (-3913.5668945313 5881.51171875 224) (-3915.0295410156 5882.8754882813 144) 746 103 + 8 298 (-3871.9765625 5917.5327148438 224) (-3871.9765625 5919.5327148438 144) 748 103 + 8 288 (-3934.5375976563 5859.0234375 224) (-3936.5375976563 5859.0234375 144) 750 103 + 2 280 (-3863.9765625 5909.5400390625 224) (-3863.4765625 5909.5400390625 224) 744 1 + 2 279 (-3891.2543945313 5872.28515625 224) (-3890.888671875 5871.9443359375 224) 739 1 + 2 282 (-3926.5349121094 5843.0234375 224) (-3926.5349121094 5842.5234375 224) 749 1 + } + 282 ( 69 0 2525 8 1 131 0 0 ) 9 { + 8 314 (-3895.0849609375 5790.232421875 224) (-3896.4477539063 5788.7700195313 64) 751 107 + 8 312 (-3874.0166015625 5772.46484375 224) (-3874.0153808594 5770.46484375 64) 757 107 + 8 305 (-3932.916015625 5825.5107421875 224) (-3934.2817382813 5824.0483398438 144) 753 103 + 8 294 (-3866.0166015625 5772.46484375 224) (-3866.0166015625 5770.46484375 144) 756 103 + 8 292 (-3922.7153320313 5816 224) (-3924.0822753906 5814.537109375 144) 752 103 + 8 288 (-3934.5375976563 5835.0224609375 224) (-3936.5375976563 5835.0234375 144) 754 103 + 2 283 (-3860.0290527344 5780.46484375 224) (-3859.5290527344 5780.46484375 224) 755 1 + 2 281 (-3926.5349121094 5843.0234375 224) (-3926.5349121094 5843.5234375 224) 749 1 + 2 279 (-3889.2788085938 5815.744140625 224) (-3888.9377441406 5816.1098632813 224) 738 1 + } + 283 ( 69 0 2533 7 1 132 0 0 ) 6 { + 8 300 (-3838.6486816406 5778.232421875 224) (-3837.1911621094 5776.869140625 144) 759 103 + 8 299 (-3819.375 5798.9008789063 224) (-3817.9125976563 5797.5366210938 144) 758 103 + 8 294 (-3852.0270996094 5772.46484375 224) (-3852.0329589844 5770.46484375 144) 760 103 + 2 279 (-3832.7495117188 5817.72265625 224) (-3833.115234375 5818.0634765625 224) 737 1 + 2 282 (-3860.0290527344 5780.46484375 224) (-3860.5290527344 5780.46484375 224) 755 1 + 2 284 (-3805.4738769531 5830.3916015625 224) (-3804.9738769531 5830.3916015625 224) 761 1 + } + 284 ( 69 0 2540 7 1 133 0 0 ) 5 { + 8 302 (-3798.0258789063 5870.9453125 224) (-3796.6618652344 5872.408203125 144) 762 103 + 8 299 (-3797.4738769531 5822.38671875 224) (-3796.0107421875 5821.0234375 144) 765 103 + 8 266 (-3789.4738769531 5846.9716796875 224) (-3787.4738769531 5846.9716796875 144) 764 103 + 2 280 (-3805.4738769531 5862.4360351563 224) (-3805.9738769531 5862.4360351563 224) 743 1 + 2 283 (-3805.4738769531 5830.3916015625 224) (-3805.9738769531 5830.3916015625 224) 761 1 + } + 285 ( 2 0 2547 11 0 0 0 0 ) 0 { + } + 286 ( 2 0 2558 17 0 0 0 0 ) 0 { + } + 287 ( 2 0 2575 20 0 0 0 0 ) 0 { + } + 288 ( 65 0 2595 8 1 134 0 0 ) 5 { + 2 289 (-3939.2687988281 5904 144) (-3939.2687988281 5904.5 144) 766 1 + 2 305 (-3934.5375976563 5825.51171875 144) (-3934.0375976563 5825.51171875 144) 769 1 + 2 292 (-3939.2687988281 5824 144) (-3939.2687988281 5823.5 144) 770 1 + 2 303 (-3934.5375976563 5881.51171875 144) (-3934.0375976563 5881.51171875 144) 767 1 + 2 290 (-3944 5864 144) (-3944.5 5864 144) 771 1 + } + 289 ( 69 0 2603 7 1 135 0 0 ) 5 { + 8 307 (-3939.2687988281 5920 144) (-3939.2687988281 5922 64) 775 103 + 2 290 (-3944 5912 144) (-3944.5 5912 144) 774 1 + 2 298 (-3934.5375976563 5918.7666015625 144) (-3934.0375976563 5918.7666015625 144) 772 1 + 2 288 (-3939.2687988281 5904 144) (-3939.2687988281 5903.5 144) 766 1 + 2 304 (-3934.5375976563 5910.7666015625 144) (-3934.0375976563 5910.7666015625 144) 773 1 + } + 290 ( 69 0 2610 8 1 136 0 0 ) 8 { + 8 314 (-3948 5808 144) (-3948 5806 64) 777 103 + 8 313 (-3956 5808 144) (-3956 5806 64) 778 103 + 8 311 (-3960 5864 144) (-3962 5864 64) 779 103 + 8 309 (-3956 5920 144) (-3956 5922 64) 780 103 + 8 307 (-3948 5920 144) (-3948 5922 64) 781 103 + 2 289 (-3944 5912 144) (-3943.5 5912 144) 774 1 + 2 288 (-3944 5864 144) (-3943.5 5864 144) 771 1 + 2 292 (-3944 5816 144) (-3943.5 5816 144) 776 1 + } + 291 ( 2 0 2618 8 0 0 0 0 ) 0 { + } + 292 ( 69 0 2626 9 1 137 0 0 ) 4 { + 8 314 (-3924.3371582031 5808 144) (-3924.3371582031 5806 64) 784 103 + 2 288 (-3939.2687988281 5824 144) (-3939.2687988281 5824.5 144) 770 1 + 2 290 (-3944 5816 144) (-3944.5 5816 144) 776 1 + 2 305 (-3932.9184570313 5824 144) (-3932.9184570313 5824.5 144) 782 1 + } + 293 ( 2 0 2635 14 0 0 0 0 ) 0 { + } + 294 ( 69 0 2649 8 1 138 0 0 ) 4 { + 8 315 (-3830.7368164063 5768 144) (-3830.7368164063 5766 64) 786 103 + 8 312 (-3872 5770.232421875 144) (-3874 5770.232421875 64) 787 103 + 2 268 (-3789.4738769531 5770.232421875 144) (-3788.9738769531 5770.232421875 144) 725 1 + 2 300 (-3816.7534179688 5772.46484375 144) (-3816.7534179688 5772.96484375 144) 789 1 + } + 295 ( 2 0 2657 7 0 0 0 0 ) 0 { + } + 296 ( 2 0 2664 9 0 0 0 0 ) 0 { + } + 297 ( 2 0 2673 9 0 0 0 0 ) 0 { + } + 298 ( 69 0 2682 7 1 139 0 0 ) 4 { + 8 310 (-3847.9921875 5918.7666015625 144) (-3845.9853515625 5918.779296875 64) 793 103 + 8 307 (-3891.2687988281 5920 144) (-3891.2687988281 5922 64) 792 103 + 2 289 (-3934.5375976563 5918.7666015625 144) (-3935.0375976563 5918.7666015625 144) 772 1 + 2 304 (-3907.2570800781 5917.5327148438 144) (-3907.2570800781 5917.0327148438 144) 791 1 + } + 299 ( 65 0 2689 6 1 140 0 0 ) 2 { + 2 300 (-3811.375 5784 144) (-3811.375 5783.5 144) 794 1 + 2 266 (-3789.4738769531 5807.486328125 144) (-3788.9738769531 5807.486328125 144) 715 1 + } + 300 ( 69 0 2695 7 1 141 0 0 ) 3 { + 2 268 (-3789.4738769531 5778.232421875 144) (-3788.9738769531 5778.232421875 144) 726 1 + 2 294 (-3816.7534179688 5772.46484375 144) (-3816.7534179688 5771.96484375 144) 789 1 + 2 299 (-3811.375 5784 144) (-3811.375 5784.5 144) 794 1 + } + 301 ( 65 0 2702 6 1 142 0 0 ) 2 { + 2 266 (-3789.4738769531 5863.4853515625 144) (-3788.9738769531 5863.4853515625 144) 717 1 + 2 302 (-3790.0258789063 5864 144) (-3790.0258789063 5864.5 144) 798 1 + } + 302 ( 69 0 2708 7 1 143 0 0 ) 3 { + 8 310 (-3798.6047363281 5880 144) (-3798.5981445313 5882 64) 800 103 + 2 267 (-3789.4738769531 5872 144) (-3788.9738769531 5872 144) 721 1 + 2 301 (-3790.0258789063 5864 144) (-3790.0258789063 5863.5 144) 798 1 + } + 303 ( 65 0 2715 5 1 144 0 0 ) 2 { + 2 304 (-3913.5668945313 5904 144) (-3913.5668945313 5904.5 144) 802 1 + 2 288 (-3934.5375976563 5881.51171875 144) (-3935.0375976563 5881.51171875 144) 767 1 + } + 304 ( 69 0 2720 6 1 145 0 0 ) 3 { + 2 289 (-3934.5375976563 5910.7666015625 144) (-3935.0375976563 5910.7666015625 144) 773 1 + 2 298 (-3907.2570800781 5917.5327148438 144) (-3907.2570800781 5918.0327148438 144) 791 1 + 2 303 (-3913.5668945313 5904 144) (-3913.5668945313 5903.5 144) 802 1 + } + 305 ( 65 0 2726 5 1 146 0 0 ) 2 { + 2 288 (-3934.5375976563 5825.51171875 144) (-3935.0375976563 5825.51171875 144) 769 1 + 2 292 (-3932.9184570313 5824 144) (-3932.9184570313 5823.5 144) 782 1 + } + 306 ( 2 0 2731 6 0 0 0 0 ) 0 { + } + 307 ( 65 0 2737 10 1 147 0 0 ) 5 { + 2 310 (-3784 5920 64) (-3784 5919.5 64) 806 1 + 2 308 (-3952 6088 64) (-3952.5 6088 64) 809 1 + 2 309 (-3952 5992 64) (-3952.5 5992 64) 810 1 + 2 20 (-3868 6112 64) (-3868 6112.5 64) 55 1 + 2 319 (-3720 6016 64) (-3719.5 6016 64) 807 1 + } + 308 ( 65 0 2747 6 1 148 0 0 ) 4 { + 2 23 (-3967.8845214844 6088 64) (-3967.4846191406 6088 64) 63 0 + 2 307 (-3952 6088 64) (-3951.5 6088 64) 809 1 + 2 309 (-3959.9921875 6064 64) (-3959.9921875 6063.5 64) 811 1 + 2 20 (-3959.9921875 6112 64) (-3959.9921875 6112.5 64) 54 1 + } + 309 ( 69 0 2753 7 1 149 0 0 ) 4 { + 2 257 (-3967.8920898438 6056 64) (-3967.4921875 6055.9995117188 64) 701 0 + 2 307 (-3952 5992 64) (-3951.5 5992 64) 810 1 + 2 311 (-3964 5920 64) (-3964 5919.5 64) 812 1 + 2 308 (-3959.9921875 6064 64) (-3959.9921875 6064.5 64) 811 1 + } + 310 ( 65 0 2760 9 1 150 0 0 ) 3 { + 2 307 (-3784 5920 64) (-3784 5920.5 64) 806 1 + 2 271 (-3740 5880 64) (-3740 5879.5 64) 732 1 + 2 319 (-3720 5900 64) (-3719.5 5900 64) 818 1 + } + 311 ( 69 0 2769 6 1 151 0 0 ) 2 { + 2 309 (-3964 5920 64) (-3964 5920.5 64) 812 1 + 2 313 (-3964 5808 64) (-3964 5807.5 64) 820 1 + } + 312 ( 65 0 2775 11 1 152 0 0 ) 4 { + 2 315 (-3872 5764 64) (-3871.5 5764 64) 822 1 + 2 313 (-3952 5766.232421875 64) (-3952.5 5766.232421875 64) 826 1 + 2 314 (-3914.0153808594 5772.46484375 64) (-3914.0153808594 5772.96484375 64) 825 1 + 2 242 (-3912 5760 64) (-3912 5759.5 64) 680 1 + } + 313 ( 69 0 2786 9 1 153 0 0 ) 4 { + 2 244 (-3960 5760 64) (-3960 5759.5 64) 685 1 + 2 312 (-3952 5766.232421875 64) (-3951.5 5766.232421875 64) 826 1 + 2 311 (-3964 5808 64) (-3964 5808.5 64) 820 1 + 2 314 (-3952 5790.232421875 64) (-3951.5 5790.232421875 64) 827 1 + } + 314 ( 65 0 2795 7 1 154 0 0 ) 2 { + 2 312 (-3914.0153808594 5772.46484375 64) (-3914.0153808594 5771.96484375 64) 825 1 + 2 313 (-3952 5790.232421875 64) (-3952.5 5790.232421875 64) 827 1 + } + 315 ( 65 0 2802 10 1 155 0 0 ) 5 { + 2 241 (-3780 5760 64) (-3780 5759.5 64) 673 1 + 2 312 (-3872 5764 64) (-3872.5 5764 64) 822 1 + 2 242 (-3856 5760 64) (-3856 5759.5 64) 681 1 + 2 271 (-3740 5768 64) (-3740 5768.5 64) 734 1 + 2 319 (-3720 5764 64) (-3719.5 5764 64) 832 1 + } + 316 ( 65 0 2812 8 1 156 0 0 ) 3 { + 2 318 (-3704 6136 224) (-3704.5 6136 224) 836 1 + 2 18 (-3660 6144 224) (-3660 6144.5 224) 47 1 + 2 317 (-3660 6128 224) (-3660 6127.5 224) 835 1 + } + 317 ( 69 0 2820 7 1 157 0 0 ) 3 { + 8 319 (-3660 6112 224) (-3660 6110 64) 838 107 + 2 318 (-3704 6120 224) (-3704.5 6120 224) 839 1 + 2 316 (-3660 6128 224) (-3660 6128.5 224) 835 1 + } + 318 ( 69 0 2827 10 1 158 0 0 ) 7 { + 8 319 (-3712 6112 224) (-3712 6110 64) 843 107 + 8 270 (-3720 6113.1572265625 224) (-3722 6113.1572265625 144) 840 103 + 8 260 (-3720 6122.6669921875 224) (-3722 6122.66796875 192) 841 101 + 8 259 (-3720 6137.509765625 224) (-3722 6137.5107421875 192) 842 101 + 2 19 (-3712 6144 224) (-3712 6144.5 224) 51 1 + 2 316 (-3704 6136 224) (-3703.5 6136 224) 836 1 + 2 317 (-3704 6120 224) (-3703.5 6120 224) 839 1 + } + 319 ( 65 0 2837 21 1 159 0 0 ) 7 { + 2 240 (-3616 5768 64) (-3615.5 5768 64) 670 1 + 2 307 (-3720 6016 64) (-3720.5 6016 64) 807 1 + 2 241 (-3668 5760 64) (-3668 5759.5 64) 674 1 + 2 271 (-3720 5824 64) (-3720.5 5824 64) 731 1 + 2 320 (-3616 6000 64) (-3615.5 6000 64) 845 1 + 2 310 (-3720 5900 64) (-3720.5 5900 64) 818 1 + 2 315 (-3720 5764 64) (-3720.5 5764 64) 832 1 + } + 320 ( 65 0 2858 8 1 160 0 0 ) 1 { + 2 319 (-3616 6000 64) (-3616.5 6000 64) 845 1 + } + 321 ( 2 0 2866 7 0 0 0 0 ) 0 { + } + 322 ( 0 0 2873 6 0 0 0 0 ) 0 { + } + 323 ( 0 0 2879 5 0 0 0 0 ) 0 { + } + 324 ( 2 0 2884 46 0 0 0 0 ) 0 { + } + 325 ( 65 0 2930 9 17 0 0 0 ) 4 { + 2 326 (-3564 5952 456) (-3564.5 5952 456) 854 1 + 2 328 (-3360 5776 456) (-3360 5775.5 456) 852 1 + 2 330 (-3280 5952 456) (-3279.5 5952 456) 851 1 + 2 327 (-3360 6128 456) (-3360 6128.5 456) 856 1 + } + 326 ( 65 4 2939 6 -18 0 0 0 ) 2 { + 2 325 (-3564 5952 456) (-3563.5 5952 456) 854 1 + 2 24 (-3600 5952 456) (-3600.5 5952 456) 68 1 + } + 327 ( 65 0 2945 10 17 1 0 0 ) 3 { + 2 331 (-3280 6136 456) (-3279.5 6136 456) 859 1 + 2 325 (-3360 6128 456) (-3360 6127.5 456) 856 1 + 2 27 (-3360 6144 456) (-3360 6144.5 456) 89 1 + } + 328 ( 65 0 2955 6 17 2 0 0 ) 3 { + 2 325 (-3360 5776 456) (-3360 5776.5 456) 852 1 + 2 329 (-3360 5648 456) (-3360 5647.5 456) 862 1 + 2 330 (-3280 5712 456) (-3279.5 5712 456) 861 1 + } + 329 ( 65 4 2961 6 -19 0 0 0 ) 2 { + 2 328 (-3360 5648 456) (-3360 5648.5 456) 862 1 + 2 155 (-3360 5612 456) (-3360 5611.5 456) 409 1 + } + 330 ( 65 0 2967 20 17 3 0 0 ) 6 { + 2 328 (-3280 5712 456) (-3280.5 5712 456) 861 1 + 2 325 (-3280 5952 456) (-3280.5 5952 456) 851 1 + 2 337 (-3091.9877929688 6064 456) (-3091.4877929688 6064 456) 868 1 + 2 336 (-3091.9877929688 5888 456) (-3091.4877929688 5888 456) 870 1 + 2 335 (-3091.9877929688 5712 456) (-3091.4877929688 5712 456) 872 1 + 2 331 (-3185.9938964844 6128 456) (-3185.9938964844 6128.5 456) 866 1 + } + 331 ( 65 0 2987 7 17 4 0 0 ) 3 { + 2 330 (-3185.9938964844 6128 456) (-3185.9938964844 6127.5 456) 866 1 + 2 27 (-3185.9936523438 6144 456) (-3185.9936523438 6144.5 456) 88 1 + 2 327 (-3280 6136 456) (-3280.5 6136 456) 859 1 + } + 332 ( 0 0 2994 6 0 0 0 0 ) 0 { + } + 333 ( 0 0 3000 6 0 0 0 0 ) 0 { + } + 334 ( 0 0 3006 6 0 0 0 0 ) 0 { + } + 335 ( 65 0 3012 7 17 5 0 0 ) 1 { + 2 330 (-3091.9877929688 5712 456) (-3092.4877929688 5712 456) 872 1 + } + 336 ( 65 0 3019 7 17 6 0 0 ) 1 { + 2 330 (-3091.9877929688 5888 456) (-3092.4877929688 5888 456) 870 1 + } + 337 ( 65 0 3026 7 17 7 0 0 ) 1 { + 2 330 (-3091.9877929688 6064 456) (-3092.4877929688 6064 456) 868 1 + } + 338 ( 65 0 3033 10 1 161 0 0 ) 5 { + 2 340 (-3872 5528 456) (-3872.5 5528 456) 888 1 + 2 342 (-3864 5520 456) (-3864 5519.5 456) 887 1 + 2 339 (-3752 5536 456) (-3752 5536.5 456) 885 1 + 2 24 (-3616 5528 456) (-3615.5 5528 456) 71 1 + 2 16 (-3624 5536 456) (-3624 5536.5 456) 40 1 + } + 339 ( 69 0 3043 8 1 162 0 0 ) 3 { + 2 340 (-3872 5544 456) (-3872.5 5544 456) 890 1 + 2 338 (-3752 5536 456) (-3752 5535.5 456) 885 1 + 2 16 (-3632 5544 456) (-3631.5 5544 456) 41 1 + } + 340 ( 69 0 3051 9 1 163 0 0 ) 4 { + 2 338 (-3872 5528 456) (-3871.5 5528 456) 888 1 + 2 339 (-3872 5544 456) (-3871.5 5544 456) 890 1 + 2 342 (-3872 5504 456) (-3871.5 5504 456) 891 1 + 2 204 (-3880 5488 456) (-3880 5487.5 456) 576 1 + } + 341 ( 2 0 3060 11 0 0 0 0 ) 0 { + } + 342 ( 65 0 3071 6 1 164 0 0 ) 3 { + 2 203 (-3864 5488 456) (-3864 5487.5 456) 573 1 + 2 338 (-3864 5520 456) (-3864 5520.5 456) 887 1 + 2 340 (-3872 5504 456) (-3872.5 5504 456) 891 1 + } + 343 ( 2 0 3077 16 0 0 0 0 ) 0 { + } + 344 ( 65 0 3093 7 1 165 0 0 ) 2 { + 2 40 (-3584.1000976563 5584 744) (-3584.5 5584 744) 113 0 + 2 32 (-3528 5648 744) (-3528 5648.5 744) 94 1 + } + 345 ( 2 0 3100 12 0 0 0 0 ) 0 { + } + 346 ( 2 0 3112 12 0 0 0 0 ) 0 { + } + 347 ( 2 0 3124 8 0 0 0 0 ) 0 { + } + 348 ( 65 0 3132 9 1 166 0 0 ) 7 { + 2 350 (-3776 5536 896) (-3776 5536.5 896) 901 1 + 2 119 (-3736 5488 896) (-3736 5487.5 896) 339 1 + 2 200 (-3800 5488 896) (-3800 5487.5 896) 559 1 + 2 352 (-3712 5496 896) (-3711.5 5496 896) 898 1 + 2 354 (-3840 5496 896) (-3840.5 5496 896) 899 1 + 2 349 (-3712 5520 896) (-3711.5 5520 896) 897 1 + 2 351 (-3840 5520 896) (-3840.5 5520 896) 900 1 + } + 349 ( 69 0 3141 7 1 167 0 0 ) 4 { + 2 350 (-3704 5536 896) (-3704 5536.5 896) 902 1 + 2 348 (-3712 5520 896) (-3712.5 5520 896) 897 1 + 2 353 (-3696 5512 896) (-3695.5 5512 896) 904 1 + 2 352 (-3704 5504 896) (-3704 5503.5 896) 905 1 + } + 350 ( 69 0 3148 7 1 168 0 0 ) 3 { + 2 351 (-3840 5544 896) (-3840.5 5544 896) 908 1 + 2 348 (-3776 5536 896) (-3776 5535.5 896) 901 1 + 2 349 (-3704 5536 896) (-3704 5535.5 896) 902 1 + } + 351 ( 69 0 3155 8 1 169 0 0 ) 4 { + 2 350 (-3840 5544 896) (-3839.5 5544 896) 908 1 + 2 348 (-3840 5520 896) (-3839.5 5520 896) 900 1 + 2 355 (-3856 5512 896) (-3856.5 5512 896) 910 1 + 2 354 (-3848 5504 896) (-3848 5503.5 896) 909 1 + } + 352 ( 65 0 3163 7 1 170 0 0 ) 4 { + 2 353 (-3584 5504 896) (-3584 5504.5 896) 914 1 + 2 119 (-3592 5488 896) (-3592 5487.5 896) 340 1 + 2 348 (-3712 5496 896) (-3712.5 5496 896) 898 1 + 2 349 (-3704 5504 896) (-3704 5504.5 896) 905 1 + } + 353 ( 69 0 3170 7 1 171 0 0 ) 5 { + 8 344 (-3528 5520 896) (-3528 5522 744) 916 107 + 8 338 (-3656 5520 896) (-3656 5522 456) 915 120 + 8 40 (-3600 5520 896) (-3600 5522 728) 915 108 + 2 352 (-3584 5504 896) (-3584 5503.5 896) 914 1 + 2 349 (-3696 5512 896) (-3696.5 5512 896) 904 1 + } + 354 ( 65 0 3177 8 1 172 0 0 ) 5 { + 2 355 (-3864 5504 896) (-3864 5504.5 896) 918 1 + 2 200 (-3856 5488 896) (-3856 5487.5 896) 558 1 + 2 201 (-3872 5496 896) (-3872.5 5496 896) 567 1 + 2 348 (-3840 5496 896) (-3839.5 5496 896) 899 1 + 2 351 (-3848 5504 896) (-3848 5504.5 896) 909 1 + } + 355 ( 69 0 3185 6 1 173 0 0 ) 4 { + 8 338 (-3864 5520 896) (-3864 5522 456) 919 120 + 2 354 (-3864 5504 896) (-3864 5503.5 896) 918 1 + 2 201 (-3872 5512 896) (-3872.5 5512 896) 566 1 + 2 351 (-3856 5512 896) (-3855.5 5512 896) 910 1 + } + 356 ( 2 0 3191 9 0 0 0 0 ) 0 { + } + 357 ( 2 0 3200 14 0 0 0 0 ) 0 { + } + 358 ( 2 0 3214 22 0 0 0 0 ) 0 { + } + 359 ( 2 0 3236 9 0 0 0 0 ) 0 { + } + 360 ( 2 0 3245 7 0 0 0 0 ) 0 { + } + 361 ( 2 0 3252 11 0 0 0 0 ) 0 { + } + 362 ( 2 0 3263 6 0 0 0 0 ) 0 { + } + 363 ( 2 0 3269 7 0 0 0 0 ) 0 { + } + 364 ( 65 0 3276 8 1 174 0 0 ) 0 { + } + 365 ( 65 0 3284 6 1 175 0 0 ) 3 { + 8 364 (-3200 6128 728) (-3200 6126 712) 924 100 + 2 39 (-3200 6144 728) (-3200 6144.5 728) 109 1 + 2 366 (-3312 6136 728) (-3312.5 6136 728) 925 1 + } + 366 ( 65 0 3290 7 1 176 0 0 ) 3 { + 8 364 (-3312 5888 728) (-3310 5888 712) 929 100 + 2 39 (-3344 6144 728) (-3344 6144.5 728) 110 1 + 2 365 (-3312 6136 728) (-3311.5 6136 728) 925 1 + } + 367 ( 69 0 3297 8 1 177 0 0 ) 4 { + 8 338 (-3616 5528 712) (-3618 5528 456) 931 112 + 8 16 (-3616 5840 712) (-3618 5840 456) 931 112 + 2 40 (-3600 5832 728) (-3599.5 5832 728) 115 1 + 2 42 (-3608 6144 720) (-3608 6144.5 720) 118 1 + } + 368 ( 65 0 3305 14 18 0 0 0 ) 4 { + 2 381 (-3912 4431.8999023438 608) (-3912 4431.5 608) 933 0 + 2 1205 (-4096 4456 608) (-4096.5 4456 608) 934 1 + 2 388 (-4008 4480 608) (-4008 4480.5 608) 935 1 + 2 387 (-3616 4480 608) (-3616 4480.5 608) 937 1 + } + 369 ( 65 0 3319 6 18 1 0 0 ) 3 { + 2 383 (-3696.1000976563 4352 672) (-3696.5 4352 672) 941 0 + 2 371 (-3584 4288 672) (-3584 4287.5 672) 940 1 + 2 370 (-3584 4416 672) (-3584 4416.5 672) 942 1 + } + 370 ( 69 0 3325 6 18 2 0 0 ) 3 { + 2 385 (-3696.1000976563 4424 672) (-3696.5 4424 672) 944 0 + 8 368 (-3584 4432 672) (-3584 4434 608) 945 103 + 2 369 (-3584 4416 672) (-3584 4415.5 672) 942 1 + } + 371 ( 69 0 3331 6 18 3 0 0 ) 6 { + 2 386 (-3696.1000976563 4280 672) (-3696.5 4280 672) 952 0 + 8 377 (-3576 4272 672) (-3576 4270 632) 948 101 + 8 376 (-3656 4272 672) (-3656 4270 632) 950 101 + 8 375 (-3616 4272 672) (-3616 4270 632) 949 101 + 8 374 (-3520 4272 672) (-3520 4270 544) 947 106 + 2 369 (-3584 4288 672) (-3584 4288.5 672) 940 1 + } + 372 ( 2 0 3337 12 0 0 0 0 ) 0 { + } + 373 ( 2 0 3349 12 0 0 0 0 ) 0 { + } + 374 ( 65 0 3361 8 18 4 0 0 ) 1 { + 2 652 (-3520 4096 544) (-3520 4095.5 544) 953 1 + } + 375 ( 65 0 3369 7 18 5 0 0 ) 3 { + 2 377 (-3584 4184 632) (-3583.5 4184 632) 958 1 + 2 376 (-3648 4184 632) (-3648.5 4184 632) 960 1 + 2 653 (-3616 4096 632) (-3616 4095.5 632) 959 1 + } + 376 ( 69 0 3376 7 18 6 0 0 ) 2 { + 2 375 (-3648 4184 632) (-3647.5 4184 632) 960 1 + 2 654 (-3656 4096 632) (-3656 4095.5 632) 962 1 + } + 377 ( 69 0 3383 7 18 7 0 0 ) 3 { + 8 374 (-3568 4184 632) (-3566 4184 544) 965 104 + 2 655 (-3576 4096 632) (-3576 4095.5 632) 966 1 + 2 375 (-3584 4184 632) (-3584.5 4184 632) 958 1 + } + 378 ( 2 0 3390 17 0 0 0 0 ) 0 { + } + 379 ( 2 0 3407 9 0 0 0 0 ) 0 { + } + 380 ( 2 0 3416 20 0 0 0 0 ) 0 { + } + 381 ( 65 0 3436 6 18 8 0 0 ) 3 { + 2 1205 (-4120 4432.1000976563 608) (-4120 4432.5 608) 969 0 + 2 368 (-3912 4432.1000976563 608) (-3912 4432.5 608) 933 0 + 2 382 (-3936 4416 592) (-3936 4415.5 592) 967 1 + } + 382 ( 69 0 3442 8 18 9 0 0 ) 3 { + 8 1146 (-4120 4400 576) (-4120 4398 256) 973 115 + 8 431 (-3912 4400 576) (-3912 4398 256) 972 115 + 2 381 (-3936 4416 592) (-3936 4416.5 592) 967 1 + } + 383 ( 65 0 3450 5 18 10 0 0 ) 4 { + 2 369 (-3695.8999023438 4352 672) (-3695.5 4352 672) 941 0 + 2 385 (-3704 4416 664) (-3704 4416.5 664) 975 1 + 2 386 (-3704 4288 664) (-3704 4287.5 664) 976 1 + 2 384 (-3712 4352 656) (-3712.5 4352 656) 977 1 + } + 384 ( 69 0 3455 8 18 11 0 0 ) 10 { + 8 451 (-3712 4272 656) (-3712 4270 64) 978 128 + 8 438 (-3728 4288 640) (-3730 4288 64) 979 127 + 8 432 (-3728 4376 640) (-3730 4376 256) 979 118 + 8 431 (-3728 4392 640) (-3730 4392 256) 979 118 + 8 424 (-3728 4352 640) (-3730 4352 224) 979 119 + 8 381 (-3728 4416 640) (-3730 4416 592) 979 102 + 8 368 (-3712 4432 656) (-3712 4434 608) 980 102 + 2 383 (-3712 4352 656) (-3711.5 4352 656) 977 1 + 2 386 (-3712 4280 656) (-3711.5 4280 656) 982 1 + 2 385 (-3712 4424 656) (-3711.5 4424 656) 981 1 + } + 385 ( 69 0 3463 5 18 12 0 0 ) 4 { + 2 370 (-3695.8999023438 4424 672) (-3695.5 4424 672) 944 0 + 8 368 (-3696 4432 672) (-3696 4434 608) 983 103 + 2 383 (-3704 4416 664) (-3704 4415.5 664) 975 1 + 2 384 (-3712 4424 656) (-3712.5 4424 656) 981 1 + } + 386 ( 69 0 3468 5 18 13 0 0 ) 4 { + 8 451 (-3696 4272 672) (-3696 4270 64) 984 128 + 2 371 (-3695.8999023438 4280 672) (-3695.5 4280 672) 952 0 + 2 383 (-3704 4288 664) (-3704 4288.5 664) 976 1 + 2 384 (-3712 4280 656) (-3712.5 4280 656) 982 1 + } + 387 ( 65 0 3473 8 18 14 0 0 ) 1 { + 2 368 (-3616 4480 608) (-3616 4479.5 608) 937 1 + } + 388 ( 65 0 3481 8 18 15 0 0 ) 2 { + 2 1205 (-4096 4488 608) (-4096.5 4488 608) 990 1 + 2 368 (-4008 4480 608) (-4008 4479.5 608) 935 1 + } + 389 ( 69 0 3489 9 18 16 0 0 ) 6 { + 8 388 (-3920 4496 810.6614990234) (-3922 4496 608) 992 109 + 8 387 (-3760 4496 810.6614990234) (-3758 4496 608) 996 109 + 8 368 (-3840 4480 800) (-3840 4478 608) 991 109 + 2 395 (-3840 4496 810.6614990234) (-3840 4496.5 810.6614990234) 994 1 + 2 396 (-3768 4496 810.6614990234) (-3768 4496.5 810.6614990234) 995 1 + 2 397 (-3912 4496 810.6614990234) (-3912 4496.5 810.6614990234) 993 1 + } + 390 ( 65 0 3498 8 18 17 0 0 ) 1 { + 2 391 (-3616 4512 688) (-3616 4511.5 688) 999 1 + } + 391 ( 69 0 3506 8 18 18 0 0 ) 2 { + 8 387 (-3616 4496 672) (-3616 4494 608) 1002 103 + 2 390 (-3616 4512 688) (-3616 4512.5 688) 999 1 + } + 392 ( 65 0 3514 9 18 19 0 0 ) 2 { + 2 393 (-4008 4512 688.0075683594) (-4008 4511.5 688.0075683594) 1006 1 + 2 1208 (-4096 4520 696) (-4096.5 4520 696) 1007 1 + } + 393 ( 69 0 3523 9 18 20 0 0 ) 3 { + 8 388 (-4008 4496 672) (-4008 4494 608) 1009 103 + 2 392 (-4008 4512 688.0075683594) (-4008 4512.5 688.0075683594) 1006 1 + 2 1209 (-4096 4504 680) (-4096.5 4504 680) 1010 1 + } + 394 ( 2 0 3532 10 0 0 0 0 ) 0 { + } + 395 ( 65 0 3542 5 18 21 0 0 ) 3 { + 2 389 (-3840 4496 810.6614990234) (-3840 4495.5 810.6614990234) 994 1 + 2 397 (-3904 4512 821.3307495117) (-3904.5 4512 821.3307495117) 1013 1 + 2 396 (-3776 4512 821.3307495117) (-3775.5 4512 821.3307495117) 1012 1 + } + 396 ( 69 0 3547 6 18 22 0 0 ) 3 { + 8 390 (-3760 4512 821.3281860352) (-3758 4512 688) 1015 106 + 2 395 (-3776 4512 821.3307495117) (-3776.5 4512 821.3307495117) 1012 1 + 2 389 (-3768 4496 810.6614990234) (-3768 4495.5 810.6614990234) 995 1 + } + 397 ( 69 0 3553 6 18 23 0 0 ) 3 { + 8 392 (-3920 4512 821.3281860352) (-3922 4512 688.0151367188) 1018 106 + 2 395 (-3904 4512 821.3307495117) (-3903.5 4512 821.3307495117) 1013 1 + 2 389 (-3912 4496 810.6614990234) (-3912 4495.5 810.6614990234) 993 1 + } + 398 ( 65 0 3559 9 19 0 0 0 ) 3 { + 2 399 (-3440 4120 192) (-3439.5 4120 192) 1021 1 + 2 403 (-3536 4120 192) (-3536.5 4120 192) 1023 1 + 2 601 (-3488 4096 192) (-3488 4095.5 192) 1022 1 + } + 399 ( 65 0 3568 10 19 1 0 0 ) 4 { + 2 398 (-3440 4120 192) (-3440.5 4120 192) 1021 1 + 2 561 (-3440 3820 192) (-3440.5 3820 192) 1028 1 + 2 601 (-3440 4000 192) (-3440.5 4000 192) 1029 1 + 2 405 (-3408.0068359375 3940 192) (-3407.5068359375 3940 192) 1025 1 + } + 400 ( 65 0 3578 10 18 24 0 0 ) 3 { + 2 404 (-3600 4120 192) (-3599.5 4120 192) 1034 1 + 2 602 (-3608 4096 192) (-3608 4095.5 192) 1035 1 + 2 401 (-3616 4184 192) (-3616.5 4184 192) 1031 1 + } + 401 ( 69 0 3588 10 18 25 0 0 ) 4 { + 8 442 (-3632 4208 192) (-3634 4208 64) 1037 106 + 8 407 (-3632 4120 192) (-3634 4120 64) 1036 106 + 2 603 (-3624 4096 192) (-3624 4095.5 192) 1039 1 + 2 400 (-3616 4184 192) (-3615.5 4184 192) 1031 1 + } + 402 ( 2 0 3598 25 0 0 0 0 ) 0 { + } + 403 ( 65 0 3623 6 19 2 0 0 ) 3 { + 2 404 (-3560 4120 192) (-3560.5 4120 192) 1042 1 + 2 398 (-3536 4120 192) (-3535.5 4120 192) 1023 1 + 2 601 (-3548 4096 192) (-3548 4095.5 192) 1041 1 + } + 404 ( 65 4 3629 10 -20 0 0 0 ) 6 { + 2 403 (-3560 4120 192) (-3559.5 4120 192) 1042 1 + 2 400 (-3600 4120 192) (-3600.5 4120 192) 1034 1 + 2 602 (-3600 4000 192) (-3600.5 4000 192) 1047 1 + 2 601 (-3560 4000 192) (-3559.5 4000 192) 1043 1 + 2 550 (-3600 3820 192) (-3600.5 3820 192) 1046 1 + 2 562 (-3560 3820 192) (-3559.5 3820 192) 1044 1 + } + 405 ( 65 0 3639 9 19 3 0 0 ) 3 { + 2 485 (-3344 4118 192) (-3343.5 4118 192) 1050 1 + 2 399 (-3408.0068359375 3940 192) (-3408.5068359375 3940 192) 1025 1 + 2 671 (-3344 3918 192) (-3343.5 3918 192) 1051 1 + } + 406 ( 2 0 3648 6 0 0 0 0 ) 0 { + } + 407 ( 65 0 3654 11 18 26 0 0 ) 5 { + 2 451 (-3672 4144 64) (-3672 4144.5 64) 1053 1 + 2 442 (-3640 4144 64) (-3640 4144.5 64) 1054 1 + 2 412 (-3632 4120 64) (-3631.5 4120 64) 1055 1 + 2 408 (-3696 4120 64) (-3696.5 4120 64) 1057 1 + 2 597 (-3664 4096 64) (-3664 4095.5 64) 1056 1 + } + 408 ( 69 0 3665 9 18 27 0 0 ) 5 { + 8 413 (-3712 4112 64) (-3714 4112 0) 1060 103 + 2 409 (-3712 4136 64) (-3712.5 4136 64) 1061 1 + 2 451 (-3704 4144 64) (-3704 4144.5 64) 1058 1 + 2 407 (-3696 4120 64) (-3695.5 4120 64) 1057 1 + 2 598 (-3704 4096 64) (-3704 4095.5 64) 1059 1 + } + 409 ( 69 0 3674 12 18 28 0 0 ) 7 { + 2 414 (-3984.1125488281 4136 64) (-3984.5124511719 4136 64) 1067 0 + 8 413 (-3848.0063476563 4128 64) (-3848.0063476563 4126 0) 1066 103 + 2 451 (-3720 4144 64) (-3720 4144.5 64) 1065 1 + 2 438 (-3744 4144 64) (-3744 4144.5 64) 1064 1 + 2 408 (-3712 4136 64) (-3711.5 4136 64) 1061 1 + 2 433 (-3864 4144 64) (-3864 4144.5 64) 1063 1 + 2 434 (-3976.0063476563 4144 64) (-3976.0063476563 4144.5 64) 1062 1 + } + 410 ( 2 0 3686 9 0 0 0 0 ) 0 { + } + 411 ( 2 0 3695 11 0 0 0 0 ) 0 { + } + 412 ( 65 0 3706 7 18 29 0 0 ) 3 { + 2 407 (-3632 4120 64) (-3632.5 4120 64) 1055 1 + 2 597 (-3616 4096 64) (-3616 4095.5 64) 1071 1 + 2 442 (-3632 4208 64) (-3632.5 4208 64) 1068 1 + } + 413 ( 65 0 3713 9 18 30 0 0 ) 4 { + 2 414 (-4096 4128.1000976563 0) (-4096 4128.5 8) 1075 0 + 2 1138 (-4096 4112 0) (-4096.5 4112 0) 1074 1 + 2 613 (-3976 4096 0) (-3976 4095.5 0) 1073 1 + 2 611 (-3784 4096 0) (-3784 4095.5 0) 1072 1 + } + 414 ( 69 0 3722 5 18 31 0 0 ) 4 { + 2 1139 (-4096.1000976563 4136 8) (-4096.5 4136 0) 1077 1 + 8 413 (-3984.0124511719 4128 64) (-3984.0124511719 4126 0) 1079 103 + 2 409 (-3983.9123535156 4136 64) (-3983.5124511719 4136 64) 1067 0 + 2 457 (-4040.0063476563 4144 36) (-4040.0063476563 4144.5 36) 1078 1 + } + 415 ( 65 0 3727 10 18 32 0 0 ) 4 { + 2 420 (-3792 4344 144) (-3791.5 4344 144) 1082 1 + 2 417 (-3808 4336 144) (-3808 4335.5 144) 1083 1 + 2 416 (-3824 4352 144) (-3824.5 4352 144) 1084 1 + 2 428 (-3808 4368 144) (-3808 4368.5 144) 1080 1 + } + 416 ( 69 0 3737 8 18 33 0 0 ) 4 { + 8 437 (-3840 4352 144) (-3842 4352 64) 1087 103 + 2 417 (-3832 4336 144) (-3832 4335.5 144) 1086 1 + 2 415 (-3824 4352 144) (-3823.5 4352 144) 1084 1 + 2 429 (-3832 4368 144) (-3832 4368.5 144) 1085 1 + } + 417 ( 69 0 3745 10 18 34 0 0 ) 6 { + 8 437 (-3840 4328 144) (-3842 4328 64) 1092 103 + 8 433 (-3800 4320 144) (-3800 4318 64) 1091 103 + 2 415 (-3808 4336 144) (-3808 4336.5 144) 1083 1 + 2 416 (-3832 4336 144) (-3832 4336.5 144) 1086 1 + 2 420 (-3768 4336 144) (-3768 4336.5 144) 1088 1 + 2 421 (-3752 4320 144) (-3752 4319.5 144) 1090 1 + } + 418 ( 2 0 3755 13 0 0 0 0 ) 0 { + } + 419 ( 2 0 3768 17 0 0 0 0 ) 0 { + } + 420 ( 65 0 3785 8 18 35 0 0 ) 2 { + 2 415 (-3792 4344 144) (-3792.5 4344 144) 1082 1 + 2 417 (-3768 4336 144) (-3768 4335.5 144) 1088 1 + } + 421 ( 69 0 3793 7 18 36 0 0 ) 4 { + 8 438 (-3752 4304 144) (-3752 4302 64) 1097 103 + 8 433 (-3760 4312 144) (-3762 4312 64) 1095 103 + 2 426 (-3744 4312 144) (-3743.5 4312 144) 1096 1 + 2 417 (-3752 4320 144) (-3752 4320.5 144) 1090 1 + } + 422 ( 2 0 3800 9 0 0 0 0 ) 0 { + } + 423 ( 69 0 3809 8 18 37 0 0 ) 2 { + 8 420 (-3768 4352 192) (-3768 4350 144) 1098 102 + 8 415 (-3792 4360 192) (-3794 4360 144) 1099 102 + } + 424 ( 69 0 3817 11 18 38 0 0 ) 6 { + 8 426 (-3736 4320 224) (-3736 4318 144) 1108 103 + 8 423 (-3744 4360 224) (-3746 4360 192) 1104 101 + 8 420 (-3744 4344 224) (-3746 4344 144) 1103 103 + 8 417 (-3744 4328 224) (-3746 4328 144) 1102 103 + 2 444 (-3728 4352 224) (-3727.5 4352 224) 1106 1 + 2 445 (-3728 4328 224) (-3727.5 4328 224) 1107 1 + } + 425 ( 2 0 3828 11 0 0 0 0 ) 0 { + } + 426 ( 69 0 3839 7 18 39 0 0 ) 4 { + 8 453 (-3688 4304 144) (-3688 4302 64) 1111 103 + 8 452 (-3712 4304 144) (-3712 4302 64) 1111 103 + 8 438 (-3736 4304 144) (-3736 4302 64) 1112 103 + 2 421 (-3744 4312 144) (-3744.5 4312 144) 1096 1 + } + 427 ( 2 0 3846 13 0 0 0 0 ) 0 { + } + 428 ( 65 0 3859 6 18 40 0 0 ) 2 { + 2 415 (-3808 4368 144) (-3808 4367.5 144) 1080 1 + 2 429 (-3824 4384 144) (-3824.5 4384 144) 1115 1 + } + 429 ( 69 0 3865 6 18 41 0 0 ) 3 { + 8 437 (-3840 4384 144) (-3842 4384 64) 1117 103 + 2 416 (-3832 4368 144) (-3832 4367.5 144) 1085 1 + 2 428 (-3824 4384 144) (-3823.5 4384 144) 1115 1 + } + 430 ( 2 0 3871 8 0 0 0 0 ) 0 { + } + 431 ( 65 0 3879 9 18 42 0 0 ) 4 { + 2 441 (-3912 4400 256) (-3912 4400.5 256) 1119 1 + 2 432 (-3912 4384 256) (-3912 4383.5 256) 1121 1 + 2 447 (-3728 4392 256) (-3727.5 4392 256) 1120 1 + 2 1146 (-4096 4392 256) (-4096.5 4392 256) 1118 1 + } + 432 ( 69 0 3888 12 18 43 0 0 ) 7 { + 8 424 (-3736 4368 256) (-3736 4366 224) 1122 101 + 8 423 (-3768 4368 256) (-3768 4366 192) 1123 103 + 8 416 (-3832 4368 256) (-3832 4366 144) 1125 105 + 8 415 (-3808 4368 256) (-3808 4366 144) 1124 105 + 2 431 (-3912 4384 256) (-3912 4384.5 256) 1121 1 + 2 448 (-3728 4376 256) (-3727.5 4376 256) 1128 1 + 2 1147 (-4096 4376 256) (-4096.5 4376 256) 1127 1 + } + 433 ( 65 0 3900 9 18 44 0 0 ) 5 { + 2 437 (-3904 4320 64) (-3904 4320.5 64) 1131 1 + 2 438 (-3760 4224 64) (-3759.5 4224 64) 1134 1 + 2 409 (-3864 4144 64) (-3864 4143.5 64) 1063 1 + 2 434 (-3968 4224 64) (-3968.5 4224 64) 1129 1 + 2 435 (-3968 4312 64) (-3968.5 4312 64) 1130 1 + } + 434 ( 65 0 3909 6 18 45 0 0 ) 4 { + 2 457 (-3984.09765625 4224 64) (-3984.4975585938 4224 64) 1135 0 + 2 433 (-3968 4224 64) (-3967.5 4224 64) 1129 1 + 2 409 (-3976.0063476563 4144 64) (-3976.0063476563 4143.5 64) 1062 1 + 2 435 (-3975.9912109375 4304 64) (-3975.9912109375 4304.5 64) 1136 1 + } + 435 ( 69 0 3915 9 18 46 0 0 ) 5 { + 2 458 (-3984.0913085938 4312 64) (-3984.4912109375 4311.9995117188 64) 1137 0 + 8 456 (-3984 4360 64) (-3986 4360 0) 1138 103 + 2 433 (-3968 4312 64) (-3967.5 4312 64) 1130 1 + 2 434 (-3975.9912109375 4304 64) (-3975.9912109375 4303.5 64) 1136 1 + 2 437 (-3968 4360 64) (-3967.5 4360 64) 1140 1 + } + 436 ( 2 0 3924 14 0 0 0 0 ) 0 { + } + 437 ( 65 0 3938 7 18 47 0 0 ) 2 { + 2 433 (-3904 4320 64) (-3904 4319.5 64) 1131 1 + 2 435 (-3968 4360 64) (-3968.5 4360 64) 1140 1 + } + 438 ( 65 0 3945 8 18 48 0 0 ) 4 { + 2 451 (-3728 4208 64) (-3727.5 4208 64) 1144 1 + 2 452 (-3728 4288 64) (-3727.5 4288 64) 1143 1 + 2 409 (-3744 4144 64) (-3744 4143.5 64) 1064 1 + 2 433 (-3760 4224 64) (-3760.5 4224 64) 1134 1 + } + 439 ( 65 0 3953 10 11 4 0 0 ) 5 { + 2 440 (-3912 4496 256) (-3912 4495.5 256) 1146 1 + 2 473 (-3912 4720 256) (-3912 4720.5 256) 1149 1 + 2 1143 (-4096 4640 256) (-4096.5 4640 256) 1148 1 + 2 1145 (-4096 4528 256) (-4096.5 4528 256) 1147 1 + 2 449 (-3728 4640 256) (-3727.5 4640 256) 1150 1 + } + 440 ( 65 0 3963 6 11 5 0 0 ) 3 { + 2 441 (-3912 4436 256) (-3912 4435.5 256) 1154 1 + 2 439 (-3912 4496 256) (-3912 4496.5 256) 1146 1 + 2 1145 (-4096 4466 256) (-4096.5 4466 256) 1152 1 + } + 441 ( 65 4 3969 8 -21 0 0 0 ) 4 { + 2 440 (-3912 4436 256) (-3912 4436.5 256) 1154 1 + 2 431 (-3912 4400 256) (-3912 4399.5 256) 1119 1 + 2 1146 (-4120 4400 256) (-4120 4399.5 256) 1156 1 + 2 1145 (-4120 4436 256) (-4120 4436.5 256) 1158 1 + } + 442 ( 65 0 3977 10 18 49 0 0 ) 3 { + 2 451 (-3648 4208 64) (-3648.5 4208 64) 1159 1 + 2 407 (-3640 4144 64) (-3640 4143.5 64) 1054 1 + 2 412 (-3632 4208 64) (-3631.5 4208 64) 1068 1 + } + 443 ( 65 4 3987 7 -22 0 0 0 ) 2 { + 2 449 (-3664 4640 256) (-3664.5 4640 256) 1164 1 + 2 459 (-3628 4640 268) (-3627.5 4640 268) 1162 1 + } + 444 ( 65 0 3994 7 18 50 0 0 ) 2 { + 2 424 (-3728 4352 224) (-3728.5 4352 224) 1106 1 + 2 445 (-3696 4336 224) (-3696 4335.5 224) 1167 1 + } + 445 ( 69 0 4001 6 18 51 0 0 ) 3 { + 8 426 (-3696 4320 224) (-3696 4318 144) 1169 103 + 2 424 (-3728 4328 224) (-3728.5 4328 224) 1107 1 + 2 444 (-3696 4336 224) (-3696 4336.5 224) 1167 1 + } + 446 ( 2 0 4007 9 0 0 0 0 ) 0 { + } + 447 ( 65 0 4016 6 18 52 0 0 ) 2 { + 2 431 (-3728 4392 256) (-3728.5 4392 256) 1120 1 + 2 448 (-3696 4384 256) (-3696 4383.5 256) 1172 1 + } + 448 ( 69 0 4022 6 18 53 0 0 ) 3 { + 8 444 (-3696 4368 256) (-3696 4366 224) 1173 101 + 2 432 (-3728 4376 256) (-3728.5 4376 256) 1128 1 + 2 447 (-3696 4384 256) (-3696 4384.5 256) 1172 1 + } + 449 ( 65 0 4028 6 11 6 0 0 ) 3 { + 2 443 (-3664 4640 256) (-3663.5 4640 256) 1164 1 + 2 473 (-3696 4720 256) (-3696 4720.5 256) 1176 1 + 2 439 (-3728 4640 256) (-3728.5 4640 256) 1150 1 + } + 450 ( 2 0 4034 8 0 0 0 0 ) 0 { + } + 451 ( 65 0 4042 12 18 54 0 0 ) 7 { + 2 442 (-3648 4208 64) (-3647.5 4208 64) 1159 1 + 2 438 (-3728 4208 64) (-3728.5 4208 64) 1144 1 + 2 452 (-3712 4272 64) (-3712 4272.5 64) 1177 1 + 2 453 (-3688 4272 64) (-3688 4272.5 64) 1178 1 + 2 409 (-3720 4144 64) (-3720 4143.5 64) 1065 1 + 2 407 (-3672 4144 64) (-3672 4143.5 64) 1053 1 + 2 408 (-3704 4144 64) (-3704 4143.5 64) 1058 1 + } + 452 ( 65 0 4054 8 18 55 0 0 ) 3 { + 2 451 (-3712 4272 64) (-3712 4271.5 64) 1177 1 + 2 438 (-3728 4288 64) (-3728.5 4288 64) 1143 1 + 2 453 (-3696 4288 64) (-3695.552734375 4288 63.7763938904) 1181 1 + } + 453 ( 65 0 4062 5 18 56 0 0 ) 2 { + 2 451 (-3688 4272 64) (-3688 4271.5 64) 1178 1 + 2 452 (-3696 4288 64) (-3696.447265625 4288 64.2236099243) 1181 1 + } + 454 ( 2 0 4067 6 0 0 0 0 ) 0 { + } + 455 ( 2 0 4073 7 0 0 0 0 ) 0 { + } + 456 ( 65 0 4080 8 18 57 0 0 ) 3 { + 2 458 (-4096 4319.8999023438 0) (-4096 4319.5 8) 1188 0 + 2 1140 (-4096 4384 0) (-4096.5 4384 0) 1185 1 + 2 1135 (-4096 4344 0) (-4096.5 4344 0) 1184 1 + } + 457 ( 65 0 4088 5 18 58 0 0 ) 4 { + 2 1133 (-4096.1000976563 4224 8) (-4096.5 4224 0) 1189 1 + 2 434 (-3983.8974609375 4224 64) (-3983.4975585938 4224 64) 1135 0 + 2 458 (-4039.9912109375 4304 36) (-4039.9912109375 4304.5 36) 1190 1 + 2 414 (-4040.0063476563 4144 36) (-4040.0063476563 4143.5 36) 1078 1 + } + 458 ( 69 0 4093 5 18 59 0 0 ) 4 { + 2 1136 (-4096.1000976563 4312 8) (-4096.5 4312 0) 1192 1 + 8 456 (-3984 4320 64) (-3984 4322 0) 1191 103 + 2 435 (-3983.8911132813 4312 64) (-3983.4912109375 4312.0004882813 64) 1137 0 + 2 457 (-4039.9912109375 4304 36) (-4039.9912109375 4303.5 36) 1190 1 + } + 459 ( 65 0 4098 16 20 0 0 0 ) 2 { + 2 443 (-3628 4640 268) (-3628.5 4640 268) 1162 1 + 2 464 (-3476 4640 318.6618652344) (-3475.5 4640 318.6618652344) 1199 1 + } + 460 ( 0 0 4114 6 0 0 0 0 ) 0 { + } + 461 ( 65 0 4120 16 21 0 0 0 ) 2 { + 2 463 (-3440 4640 320) (-3440.5 4640 320) 1203 1 + 2 462 (-3348 4640 320) (-3347.5 4640 320) 1207 1 + } + 462 ( 65 4 4136 8 -23 0 0 0 ) 2 { + 2 484 (-3312 4640 320) (-3311.5 4640 320) 1210 1 + 2 461 (-3348 4640 320) (-3348.5 4640 320) 1207 1 + } + 463 ( 65 0 4144 6 21 1 0 0 ) 2 { + 2 461 (-3440 4640 320) (-3439.5 4640 320) 1203 1 + 2 464 (-3471.9899902344 4640 320) (-3472.4899902344 4640 320) 1213 1 + } + 464 ( 65 4 4150 6 -24 0 0 0 ) 2 { + 2 463 (-3471.9899902344 4640 320) (-3471.4899902344 4640 320) 1213 1 + 2 459 (-3476 4640 318.6618652344) (-3476.5 4640 318.6618652344) 1199 1 + } + 465 ( 0 0 4156 6 0 0 0 0 ) 0 { + } + 466 ( 2 0 4162 9 0 0 0 0 ) 0 { + } + 467 ( 2 0 4171 6 0 0 0 0 ) 0 { + } + 468 ( 2 0 4177 6 0 0 0 0 ) 0 { + } + 469 ( 2 0 4183 6 0 0 0 0 ) 0 { + } + 470 ( 2 0 4189 18 0 0 0 0 ) 0 { + } + 471 ( 0 0 4207 6 0 0 0 0 ) 0 { + } + 472 ( 0 0 4213 6 0 0 0 0 ) 0 { + } + 473 ( 65 0 4219 11 11 7 0 0 ) 4 { + 2 439 (-3912 4720 256) (-3912 4719.5 256) 1149 1 + 2 170 (-3944 4784 256) (-3944 4784.5 256) 453 1 + 2 1143 (-4096 4752 256) (-4096.5 4752 256) 1217 1 + 2 449 (-3696 4720 256) (-3696 4719.5 256) 1176 1 + } + 474 ( 65 0 4230 11 19 4 0 0 ) 4 { + 2 524 (-3056 4120 192) (-3055.5 4120 192) 1224 1 + 2 671 (-3104 4096 192) (-3104 4095.5 192) 1220 1 + 2 485 (-3152 4118 192) (-3152.5 4118 192) 1221 1 + 2 487 (-3152 4142 192) (-3152.5 4142 192) 1222 1 + } + 475 ( 65 0 4241 7 22 0 0 0 ) 2 { + 2 476 (-3060 4640 320) (-3059.5 4640 320) 1228 1 + 2 488 (-3088 4640 320) (-3088.5 4640 320) 1226 1 + } + 476 ( 65 4 4248 6 -25 0 0 0 ) 2 { + 2 475 (-3060 4640 320) (-3060.5 4640 320) 1228 1 + 2 506 (-3024 4640 320) (-3023.5 4640 320) 1230 1 + } + 477 ( 2 0 4254 8 0 0 0 0 ) 0 { + } + 478 ( 65 0 4262 13 22 1 0 0 ) 3 { + 2 480 (-3168 4720 320) (-3168 4720.5 320) 1236 1 + 2 484 (-3184 4608 320) (-3184.5 4608 320) 1235 1 + 2 488 (-3152 4640 320) (-3151.5 4640 320) 1232 1 + } + 479 ( 65 0 4275 11 5 2 0 0 ) 2 { + 2 148 (-3232 4784 341.3385009766) (-3232 4784.5 341.3385009766) 386 1 + 2 480 (-3232 4756 332) (-3232 4755.5 332) 1238 1 + } + 480 ( 65 4 4286 11 -26 0 0 0 ) 3 { + 2 478 (-3168 4720 320) (-3168 4719.5 320) 1236 1 + 2 484 (-3248 4720 320) (-3248 4719.5 320) 1241 1 + 2 479 (-3232 4756 332) (-3232 4756.5 332) 1238 1 + } + 481 ( 2 0 4297 14 0 0 0 0 ) 0 { + } + 482 ( 2 0 4311 7 0 0 0 0 ) 0 { + } + 483 ( 2 0 4318 7 0 0 0 0 ) 0 { + } + 484 ( 65 0 4325 10 22 2 0 0 ) 3 { + 2 478 (-3184 4608 320) (-3183.5 4608 320) 1235 1 + 2 480 (-3248 4720 320) (-3248 4720.5 320) 1241 1 + 2 462 (-3312 4640 320) (-3312.5 4640 320) 1210 1 + } + 485 ( 65 0 4335 10 19 5 0 0 ) 5 { + 2 405 (-3344 4118 192) (-3344.5 4118 192) 1050 1 + 2 486 (-3296 4140 192) (-3296 4140.5 192) 1245 1 + 2 487 (-3168 4140 192) (-3168 4140.5 192) 1247 1 + 2 671 (-3248 4096 192) (-3248 4095.5 192) 1248 1 + 2 474 (-3152 4118 192) (-3151.5 4118 192) 1221 1 + } + 486 ( 65 0 4345 6 19 6 0 0 ) 1 { + 2 485 (-3296 4140 192) (-3296 4139.5 192) 1245 1 + } + 487 ( 65 0 4351 6 19 7 0 0 ) 2 { + 2 485 (-3168 4140 192) (-3168 4139.5 192) 1247 1 + 2 474 (-3152 4142 192) (-3151.5 4142 192) 1222 1 + } + 488 ( 65 0 4357 7 22 3 0 0 ) 2 { + 2 478 (-3152 4640 320) (-3152.5 4640 320) 1232 1 + 2 475 (-3088 4640 320) (-3087.5 4640 320) 1226 1 + } + 489 ( 2 0 4364 10 0 0 0 0 ) 0 { + } + 490 ( 2 0 4374 7 0 0 0 0 ) 0 { + } + 491 ( 2 0 4381 6 0 0 0 0 ) 0 { + } + 492 ( 2 0 4387 9 0 0 0 0 ) 0 { + } + 493 ( 2 0 4396 8 0 0 0 0 ) 0 { + } + 494 ( 2 0 4404 5 0 0 0 0 ) 0 { + } + 495 ( 2 0 4409 13 0 0 0 0 ) 0 { + } + 496 ( 2 0 4422 7 0 0 0 0 ) 0 { + } + 497 ( 2 0 4429 7 0 0 0 0 ) 0 { + } + 498 ( 2 0 4436 13 0 0 0 0 ) 0 { + } + 499 ( 2 0 4449 5 0 0 0 0 ) 0 { + } + 500 ( 2 0 4454 7 0 0 0 0 ) 0 { + } + 501 ( 2 0 4461 13 0 0 0 0 ) 0 { + } + 502 ( 2 0 4474 6 0 0 0 0 ) 0 { + } + 503 ( 2 0 4480 9 0 0 0 0 ) 0 { + } + 504 ( 2 0 4489 7 0 0 0 0 ) 0 { + } + 505 ( 2 0 4496 5 0 0 0 0 ) 0 { + } + 506 ( 65 0 4501 9 23 0 0 0 ) 2 { + 2 476 (-3024 4640 320) (-3024.5 4640 320) 1230 1 + 2 508 (-2912 4528 320) (-2912 4527.5 320) 1256 1 + } + 507 ( 65 0 4510 8 24 0 0 0 ) 3 { + 2 512 (-2920 4464.005859375 320) (-2920 4463.505859375 320) 1265 1 + 2 513 (-2840 4464.0112304688 320) (-2840 4463.5112304688 320) 1264 1 + 2 508 (-2912 4492 320) (-2912 4492.5 320) 1262 1 + } + 508 ( 65 4 4518 6 -27 0 0 0 ) 2 { + 2 506 (-2912 4528 320) (-2912 4528.5 320) 1256 1 + 2 507 (-2912 4492 320) (-2912 4491.5 320) 1262 1 + } + 509 ( 65 0 4524 10 24 1 0 0 ) 3 { + 2 512 (-2923.1997070313 4400 294.3969726563) (-2923.1997070313 4400.5 294.3969726563) 1272 1 + 2 518 (-2932.7998046875 4208 217.5937042236) (-2932.7998046875 4207.5 217.5937042236) 1270 1 + 2 513 (-2863.9995117188 4304 255.9937133789) (-2863.5144042969 4304 255.8724517822) 1269 1 + } + 510 ( 0 0 4534 5 0 0 0 0 ) 0 { + } + 511 ( 2 0 4539 9 0 0 0 0 ) 0 { + } + 512 ( 65 0 4548 7 24 2 0 0 ) 3 { + 2 509 (-2923.1997070313 4400 294.3969726563) (-2923.1997070313 4399.5 294.3969726563) 1272 1 + 2 507 (-2920 4464.005859375 320) (-2920 4464.505859375 320) 1265 1 + 2 513 (-2851.1997070313 4432.005859375 307.1968383789) (-2850.7145996094 4432.005859375 307.0755615234) 1273 1 + } + 513 ( 65 0 4555 6 24 3 0 0 ) 4 { + 2 507 (-2840 4464.0112304688 320) (-2840 4464.5112304688 320) 1264 1 + 2 518 (-2852.7998046875 4208 217.5943908691) (-2852.7998046875 4207.5 217.5943908691) 1276 1 + 2 509 (-2863.9995117188 4304 255.9937133789) (-2864.4846191406 4304 256.1149902344) 1269 1 + 2 512 (-2851.1997070313 4432.005859375 307.1968383789) (-2851.6848144531 4432.005859375 307.3181152344) 1273 1 + } + 514 ( 65 0 4561 14 19 8 0 0 ) 3 { + 2 520 (-2912 4144 192) (-2912 4144.5 192) 1281 1 + 2 525 (-2992 4120 192) (-2992.5 4120 192) 1280 1 + 2 678 (-2992 4040 192) (-2992.5 4040 192) 1279 1 + } + 515 ( 2 0 4575 9 0 0 0 0 ) 0 { + } + 516 ( 2 0 4584 6 0 0 0 0 ) 0 { + } + 517 ( 2 0 4590 6 0 0 0 0 ) 0 { + } + 518 ( 65 0 4596 7 24 4 0 0 ) 3 { + 2 509 (-2932.7998046875 4208 217.5937042236) (-2932.7998046875 4208.5 217.5937042236) 1270 1 + 2 519 (-2912 4184 208) (-2912 4183.5 208) 1282 1 + 2 513 (-2852.7998046875 4208 217.5943908691) (-2852.7998046875 4208.5 217.5943908691) 1276 1 + } + 519 ( 65 0 4603 11 24 5 0 0 ) 2 { + 2 518 (-2912 4184 208) (-2912 4184.5 208) 1282 1 + 2 520 (-2912 4176 204.7946929932) (-2912 4175.5 204.7946929932) 1286 1 + } + 520 ( 65 4 4614 10 -28 0 0 0 ) 2 { + 2 519 (-2912 4176 204.7946929932) (-2912 4176.5 204.7946929932) 1286 1 + 2 514 (-2912 4144 192) (-2912 4143.5 192) 1281 1 + } + 521 ( 2 0 4624 8 0 0 0 0 ) 0 { + } + 522 ( 2 0 4632 5 0 0 0 0 ) 0 { + } + 523 ( 2 0 4637 5 0 0 0 0 ) 0 { + } + 524 ( 65 0 4642 6 19 9 0 0 ) 3 { + 2 474 (-3056 4120 192) (-3056.5 4120 192) 1224 1 + 2 525 (-3032 4120 192) (-3031.5 4120 192) 1291 1 + 2 671 (-3044 4096 192) (-3044 4095.5 192) 1292 1 + } + 525 ( 65 0 4648 7 19 10 0 0 ) 4 { + 2 514 (-2992 4120 192) (-2991.5 4120 192) 1280 1 + 2 524 (-3032 4120 192) (-3032.5 4120 192) 1291 1 + 2 673 (-3028.0051269531 4096 192) (-3028.0051269531 4095.5 192) 1295 1 + 2 678 (-3008.0051269531 4096 192) (-3008.0051269531 4095.5 192) 1294 1 + } + 526 ( 65 0 4655 7 25 0 0 0 ) 1 { + 2 527 (-4128 3412 352) (-4128 3412.5 352) 1298 1 + } + 527 ( 65 4 4662 8 -29 0 0 0 ) 3 { + 2 1276 (-4136 3448 352) (-4136 3448.5 352) 1300 1 + 2 534 (-4088 3448 352) (-4088 3448.5 352) 1301 1 + 2 526 (-4128 3412 352) (-4128 3411.5 352) 1298 1 + } + 528 ( 2 0 4670 6 0 0 0 0 ) 0 { + } + 529 ( 65 0 4676 7 26 0 0 0 ) 1 { + 2 530 (-4128 3412 64) (-4128 3412.5 64) 1304 1 + } + 530 ( 65 4 4683 7 -30 0 0 0 ) 3 { + 2 529 (-4128 3412 64) (-4128 3411.5 64) 1304 1 + 2 533 (-4088 3448 64) (-4088 3448.5 64) 1309 1 + 2 1268 (-4136 3448 64) (-4136 3448.5 64) 1308 1 + } + 531 ( 2 0 4690 6 0 0 0 0 ) 0 { + } + 532 ( 65 0 4696 10 27 0 0 0 ) 3 { + 2 533 (-4052 3464 64) (-4052 3463.5 64) 1313 1 + 2 582 (-4052 3568 64) (-4052 3568.5 64) 1315 1 + 2 1268 (-4096 3516 64) (-4096.5 3516 64) 1314 1 + } + 533 ( 65 0 4706 8 27 1 0 0 ) 3 { + 2 532 (-4052 3464 64) (-4052 3464.5 64) 1313 1 + 2 530 (-4088 3448 64) (-4088 3447.5 64) 1309 1 + 2 1268 (-4096 3456 64) (-4096.5 3456 64) 1320 1 + } + 534 ( 65 0 4714 20 28 0 0 0 ) 5 { + 2 544 (-4016 3756 352) (-4016 3756.5 352) 1323 1 + 2 576 (-4000 3640 352) (-3999.5 3640 352) 1326 1 + 2 1276 (-4096 3602 352) (-4096.5 3602 352) 1321 1 + 2 543 (-4064 3756 352) (-4064 3756.5 352) 1322 1 + 2 527 (-4088 3448 352) (-4088 3447.5 352) 1301 1 + } + 535 ( 65 0 4734 19 27 2 0 0 ) 4 { + 2 1267 (-4096 3776 64) (-4096.5 3776 64) 1331 1 + 2 536 (-4052 3648 64) (-4052 3647.5 64) 1330 1 + 2 537 (-4008 3776 64) (-4007.5 3776 64) 1334 1 + 2 589 (-4052 3904 64) (-4052 3904.5 64) 1332 1 + } + 536 ( 65 0 4753 7 27 3 0 0 ) 3 { + 2 1267 (-4096 3626 64) (-4096.5 3626 64) 1338 1 + 2 535 (-4052 3648 64) (-4052 3648.5 64) 1330 1 + 2 582 (-4052 3604 64) (-4052 3603.5 64) 1337 1 + } + 537 ( 65 0 4760 6 27 4 0 0 ) 1 { + 2 535 (-4008 3776 64) (-4008.5 3776 64) 1334 1 + } + 538 ( 2 0 4766 11 0 0 0 0 ) 0 { + } + 539 ( 2 0 4777 7 0 0 0 0 ) 0 { + } + 540 ( 2 0 4784 7 0 0 0 0 ) 0 { + } + 541 ( 2 0 4791 7 0 0 0 0 ) 0 { + } + 542 ( 65 0 4798 28 29 0 0 0 ) 3 { + 2 544 (-4016 3792 352) (-4016 3791.5 352) 1345 1 + 2 543 (-4064 3792 352) (-4064 3791.5 352) 1346 1 + 2 1277 (-4172 3792 352) (-4172 3791.5 352) 1347 1 + } + 543 ( 65 4 4826 11 -31 0 0 0 ) 4 { + 2 544 (-4032 3774 352) (-4031.5 3774 352) 1354 1 + 2 534 (-4064 3756 352) (-4064 3755.5 352) 1322 1 + 2 1277 (-4096 3774 352) (-4096.5 3774 352) 1355 1 + 2 542 (-4064 3792 352) (-4064 3792.5 352) 1346 1 + } + 544 ( 65 4 4837 7 -32 0 0 0 ) 3 { + 2 543 (-4032 3774 352) (-4032.5 3774 352) 1354 1 + 2 534 (-4016 3756 352) (-4016 3755.5 352) 1323 1 + 2 542 (-4016 3792 352) (-4016 3792.5 352) 1345 1 + } + 545 ( 65 0 4844 13 18 60 0 0 ) 5 { + 2 597 (-3664 3904 64) (-3664 3904.5 64) 1357 1 + 2 552 (-3632 3888 64) (-3631.5 3888 64) 1358 1 + 2 549 (-3664 3872 64) (-3664 3871.5 64) 1359 1 + 2 546 (-3696 3880 64) (-3696.5 3880 64) 1360 1 + 2 547 (-3696 3896 64) (-3696.5 3896 64) 1361 1 + } + 546 ( 65 0 4857 6 18 61 0 0 ) 4 { + 2 612 (-3712.1000976563 3888 64) (-3712.5 3888 56.0017127991) 1363 1 + 2 545 (-3696 3880 64) (-3695.5 3880 64) 1360 1 + 2 549 (-3704 3872 64) (-3704 3871.5 64) 1362 1 + 2 547 (-3704 3888 64) (-3704 3888.5 64) 1364 1 + } + 547 ( 69 0 4863 10 18 62 0 0 ) 4 { + 2 612 (-3712.1000976563 3904 64) (-3712.5 3904 48.0034217834) 1366 1 + 2 545 (-3696 3896 64) (-3695.5 3896 64) 1361 1 + 2 598 (-3704 3904 64) (-3704 3904.5 64) 1365 1 + 2 546 (-3704 3888 64) (-3704 3887.5 64) 1364 1 + } + 548 ( 2 0 4873 12 0 0 0 0 ) 0 { + } + 549 ( 65 0 4885 22 18 63 0 0 ) 6 { + 2 612 (-3768 3872.1000976563 64) (-3768 3872.5 64) 1367 0 + 2 545 (-3664 3872 64) (-3664 3872.5 64) 1359 1 + 2 546 (-3704 3872 64) (-3704 3872.5 64) 1362 1 + 2 567 (-3704 3728 64) (-3704 3727.5 64) 1371 1 + 2 566 (-3776 3728 64) (-3776 3727.5 64) 1372 1 + 2 552 (-3632 3800 64) (-3631.5 3800 64) 1368 1 + } + 550 ( 65 0 4907 10 18 64 0 0 ) 3 { + 2 602 (-3608 3904 192) (-3608 3904.5 192) 1379 1 + 2 404 (-3600 3820 192) (-3599.5 3820 192) 1046 1 + 2 551 (-3616 3816 192) (-3616.5 3816 192) 1378 1 + } + 551 ( 69 0 4917 9 18 65 0 0 ) 4 { + 8 549 (-3632 3800 192) (-3634 3800 64) 1381 106 + 8 545 (-3632 3888 192) (-3634 3888 64) 1382 106 + 2 603 (-3624 3904 192) (-3624 3904.5 192) 1383 1 + 2 550 (-3616 3816 192) (-3615.5 3816 192) 1378 1 + } + 552 ( 65 0 4926 7 18 66 0 0 ) 3 { + 2 597 (-3616 3904 64) (-3616 3904.5 64) 1386 1 + 2 545 (-3632 3888 64) (-3632.5 3888 64) 1358 1 + 2 549 (-3632 3800 64) (-3632.5 3800 64) 1368 1 + } + 553 ( 2 0 4933 15 0 0 0 0 ) 0 { + } + 554 ( 65 0 4948 10 18 67 0 0 ) 2 { + 2 556 (-3896 3840 320) (-3896 3840.5 320) 1388 1 + 2 555 (-3840 3816 320) (-3839.5 3816 320) 1389 1 + } + 555 ( 69 0 4958 6 18 68 0 0 ) 3 { + 8 549 (-3824 3816 320) (-3822 3816 64) 1392 112 + 2 556 (-3832 3840 320) (-3832 3840.5 320) 1391 1 + 2 554 (-3840 3816 320) (-3840.5 3816 320) 1389 1 + } + 556 ( 69 0 4964 9 18 69 0 0 ) 3 { + 8 549 (-3824 3848 320) (-3822 3848 64) 1396 112 + 2 554 (-3896 3840 320) (-3896 3839.5 320) 1388 1 + 2 555 (-3832 3840 320) (-3832 3839.5 320) 1391 1 + } + 557 ( 2 0 4973 12 0 0 0 0 ) 0 { + } + 558 ( 65 0 4985 7 18 70 0 0 ) 2 { + 2 559 (-3904 3888 96) (-3903.5 3888 96) 1400 1 + 2 607 (-3928 3904 96) (-3928 3904.5 96) 1399 1 + } + 559 ( 69 0 4992 7 18 71 0 0 ) 3 { + 8 617 (-3888 3888 96) (-3886 3888 48) 1401 102 + 2 558 (-3904 3888 96) (-3904.5 3888 96) 1400 1 + 2 609 (-3896 3904 96) (-3896 3904.5 96) 1403 1 + } + 560 ( 0 0 4999 8 0 0 0 0 ) 0 { + } + 561 ( 65 0 5007 9 19 11 0 0 ) 3 { + 2 562 (-3536 3820 192) (-3536.5 3820 192) 1405 1 + 2 601 (-3488 3904 192) (-3488 3904.5 192) 1406 1 + 2 399 (-3440 3820 192) (-3439.5 3820 192) 1028 1 + } + 562 ( 65 0 5016 6 19 12 0 0 ) 3 { + 2 561 (-3536 3820 192) (-3535.5 3820 192) 1405 1 + 2 601 (-3548 3904 192) (-3548 3904.5 192) 1407 1 + 2 404 (-3560 3820 192) (-3560.5 3820 192) 1044 1 + } + 563 ( 65 0 5022 6 29 1 0 0 ) 2 { + 8 542 (-4000 3848 368) (-4002 3848 352) 1410 100 + 2 564 (-3988 3848 368) (-3987.5 3848 368) 1412 1 + } + 564 ( 65 0 5028 6 29 2 0 0 ) 2 { + 2 563 (-3988 3848 368) (-3988.5 3848 368) 1412 1 + 2 565 (-3968 3848 368) (-3967.5 3848 368) 1415 1 + } + 565 ( 69 4 5034 8 -33 0 0 0 ) 4 { + 8 558 (-3952 3880 368) (-3950 3880 96) 1418 112 + 8 556 (-3952 3848 368) (-3950 3848 320) 1419 102 + 8 554 (-3952 3824 368) (-3950 3824 320) 1420 102 + 2 564 (-3968 3848 368) (-3968.5 3848 368) 1415 1 + } + 566 ( 65 0 5042 8 18 72 0 0 ) 3 { + 2 567 (-3728 3712 64) (-3727.5 3712 64) 1423 1 + 2 569 (-3776 3696 64) (-3776 3695.5 64) 1421 1 + 2 549 (-3776 3728 64) (-3776 3728.5 64) 1372 1 + } + 567 ( 65 0 5050 8 18 73 0 0 ) 3 { + 2 566 (-3728 3712 64) (-3728.5 3712 64) 1423 1 + 2 569 (-3704 3696 64) (-3704 3695.5 64) 1424 1 + 2 549 (-3704 3728 64) (-3704 3728.5 64) 1371 1 + } + 568 ( 0 0 5058 7 0 0 0 0 ) 0 { + } + 569 ( 65 0 5065 13 18 74 0 0 ) 4 { + 2 573 (-3824.1000976563 3640 64) (-3824.5 3640 65) 1428 0 + 2 567 (-3704 3696 64) (-3704 3696.5 64) 1424 1 + 2 566 (-3776 3696 64) (-3776 3696.5 64) 1421 1 + 2 580 (-3752 3600 64) (-3752 3599.5 64) 1427 1 + } + 570 ( 0 0 5078 7 0 0 0 0 ) 0 { + } + 571 ( 2 0 5085 6 0 0 0 0 ) 0 { + } + 572 ( 65 0 5091 7 30 0 0 0 ) 1 { + 2 573 (-3864 3640 65) (-3863.5 3640 65) 1429 1 + } + 573 ( 65 4 5098 6 -34 0 0 0 ) 2 { + 2 569 (-3823.8999023438 3640 65) (-3823.5 3640 64) 1433 1 + 2 572 (-3864 3640 65) (-3864.5 3640 65) 1429 1 + } + 574 ( 2 0 5104 7 0 0 0 0 ) 0 { + } + 575 ( 69 0 5111 6 31 0 0 0 ) 1 { + 2 577 (-3964 3640 352) (-3964.5 3640 352) 1438 1 + } + 576 ( 65 0 5117 6 28 1 0 0 ) 2 { + 2 577 (-3968 3640 352) (-3967.5 3640 352) 1440 1 + 2 534 (-4000 3640 352) (-4000.5 3640 352) 1326 1 + } + 577 ( 69 4 5123 6 -35 0 0 0 ) 2 { + 2 576 (-3968 3640 352) (-3968.5 3640 352) 1440 1 + 2 575 (-3964 3640 352) (-3963.5 3640 352) 1438 1 + } + 578 ( 2 0 5129 6 0 0 0 0 ) 0 { + } + 579 ( 2 0 5135 6 0 0 0 0 ) 0 { + } + 580 ( 65 0 5141 7 18 75 0 0 ) 1 { + 2 569 (-3752 3600 64) (-3752 3600.5 64) 1427 1 + } + 581 ( 0 0 5148 6 0 0 0 0 ) 0 { + } + 582 ( 65 0 5154 14 27 5 0 0 ) 6 { + 2 1271 (-4248 3576 64) (-4248.5 3576 64) 1451 1 + 2 536 (-4052 3604 64) (-4052 3604.5 64) 1337 1 + 2 532 (-4052 3568 64) (-4052 3567.5 64) 1315 1 + 2 1267 (-4172 3604 64) (-4172 3604.5 64) 1448 1 + 2 1273 (-4248 3594 64) (-4248.5 3594 64) 1452 1 + 2 1268 (-4172 3568 64) (-4172 3567.5 64) 1450 1 + } + 583 ( 2 0 5168 10 0 0 0 0 ) 0 { + } + 584 ( 0 0 5178 5 0 0 0 0 ) 0 { + } + 585 ( 2 0 5183 19 0 0 0 0 ) 0 { + } + 586 ( 65 0 5202 7 27 6 0 0 ) 3 { + 8 1267 (-4152 3936 80) (-4152 3934 64) 1454 100 + 8 589 (-4072 3936 80) (-4072 3934 64) 1453 100 + 2 587 (-4128 3948 80) (-4128 3948.5 80) 1456 1 + } + 587 ( 65 0 5209 6 27 7 0 0 ) 2 { + 2 586 (-4128 3948 80) (-4128 3947.5 80) 1456 1 + 2 588 (-4128 3968 80) (-4128 3968.5 80) 1459 1 + } + 588 ( 69 4 5215 7 -36 0 0 0 ) 3 { + 8 1384 (-4152 3984 80) (-4152 3986 0) 1462 103 + 8 614 (-4072 3984 80) (-4072 3986 0) 1463 103 + 2 587 (-4128 3968 80) (-4128 3967.5 80) 1459 1 + } + 589 ( 65 0 5222 9 27 8 0 0 ) 2 { + 2 1267 (-4096 3920 64) (-4096.5 3920 64) 1468 1 + 2 535 (-4052 3904 64) (-4052 3903.5 64) 1332 1 + } + 590 ( 2 0 5231 7 0 0 0 0 ) 0 { + } + 591 ( 65 0 5238 6 29 3 0 0 ) 2 { + 8 542 (-4128 3936 368) (-4128 3934 352) 1469 100 + 2 592 (-4128 3948 368) (-4128 3948.5 368) 1471 1 + } + 592 ( 65 0 5244 6 29 4 0 0 ) 2 { + 2 591 (-4128 3948 368) (-4128 3947.5 368) 1471 1 + 2 593 (-4128 3968 368) (-4128 3968.5 368) 1474 1 + } + 593 ( 69 4 5250 7 -37 0 0 0 ) 3 { + 8 1384 (-4152 3984 368) (-4152 3986 0) 1477 117 + 8 614 (-4072 3984 368) (-4072 3986 0) 1478 117 + 2 592 (-4128 3968 368) (-4128 3967.5 368) 1474 1 + } + 594 ( 2 0 5257 13 0 0 0 0 ) 0 { + } + 595 ( 2 0 5270 12 0 0 0 0 ) 0 { + } + 596 ( 2 0 5282 6 0 0 0 0 ) 0 { + } + 597 ( 65 0 5288 9 18 76 0 0 ) 5 { + 2 407 (-3664 4096 64) (-3664 4096.5 64) 1056 1 + 2 412 (-3616 4096 64) (-3616 4096.5 64) 1071 1 + 2 552 (-3616 3904 64) (-3616 3903.5 64) 1386 1 + 2 598 (-3696 4000 64) (-3696.5 4000 64) 1481 1 + 2 545 (-3664 3904 64) (-3664 3903.5 64) 1357 1 + } + 598 ( 69 0 5297 6 18 77 0 0 ) 4 { + 8 611 (-3712 4040 64) (-3714 4040 0) 1483 103 + 2 408 (-3704 4096 64) (-3704 4096.5 64) 1059 1 + 2 597 (-3696 4000 64) (-3695.5 4000 64) 1481 1 + 2 547 (-3704 3904 64) (-3704 3903.5 64) 1365 1 + } + 599 ( 2 0 5303 15 0 0 0 0 ) 0 { + } + 600 ( 2 0 5318 16 0 0 0 0 ) 0 { + } + 601 ( 65 0 5334 9 19 13 0 0 ) 6 { + 2 562 (-3548 3904 192) (-3548 3903.5 192) 1407 1 + 2 561 (-3488 3904 192) (-3488 3903.5 192) 1406 1 + 2 403 (-3548 4096 192) (-3548 4096.5 192) 1041 1 + 2 398 (-3488 4096 192) (-3488 4096.5 192) 1022 1 + 2 399 (-3440 4000 192) (-3439.5 4000 192) 1029 1 + 2 404 (-3560 4000 192) (-3560.5 4000 192) 1043 1 + } + 602 ( 65 0 5343 6 18 78 0 0 ) 4 { + 2 400 (-3608 4096 192) (-3608 4096.5 192) 1035 1 + 2 603 (-3616 4000 192) (-3616.5 4000 192) 1484 1 + 2 550 (-3608 3904 192) (-3608 3903.5 192) 1379 1 + 2 404 (-3600 4000 192) (-3599.5 4000 192) 1047 1 + } + 603 ( 69 0 5349 6 18 79 0 0 ) 3 { + 2 401 (-3624 4096 192) (-3624 4096.5 192) 1039 1 + 2 602 (-3616 4000 192) (-3615.5 4000 192) 1484 1 + 2 551 (-3624 3904 192) (-3624 3903.5 192) 1383 1 + } + 604 ( 2 0 5355 17 0 0 0 0 ) 0 { + } + 605 ( 2 0 5372 17 0 0 0 0 ) 0 { + } + 606 ( 2 0 5389 14 0 0 0 0 ) 0 { + } + 607 ( 65 0 5403 6 18 80 0 0 ) 3 { + 2 609 (-3904 3914 96) (-3903.5 3914 96) 1487 1 + 2 558 (-3928 3904 96) (-3928 3903.5 96) 1399 1 + 2 608 (-3928 3924 96) (-3928 3924.5 96) 1488 1 + } + 608 ( 69 0 5409 6 18 81 0 0 ) 2 { + 2 609 (-3904 3932 96) (-3903.5 3932 96) 1490 1 + 2 607 (-3928 3924 96) (-3928 3923.5 96) 1488 1 + } + 609 ( 69 0 5415 7 18 82 0 0 ) 3 { + 2 559 (-3896 3904 96) (-3896 3903.5 96) 1403 1 + 2 607 (-3904 3914 96) (-3904.5 3914 96) 1487 1 + 2 608 (-3904 3932 96) (-3904.5 3932 96) 1490 1 + } + 610 ( 2 0 5422 11 0 0 0 0 ) 0 { + } + 611 ( 65 0 5433 8 18 83 0 0 ) 4 { + 2 612 (-3784 3983.8999023438 0) (-3784 3983.5 8.0119657516) 1494 0 + 2 615 (-3856 3992 0) (-3856.5 3992 0) 1495 1 + 2 613 (-3856 4048 0) (-3856.5 4048 0) 1496 1 + 2 413 (-3784 4096 0) (-3784 4096.5 0) 1072 1 + } + 612 ( 65 0 5441 10 18 84 0 0 ) 8 { + 2 618 (-3856.1000976563 3904.021484375 48) (-3856.5 3904.021484375 48) 1500 0 + 2 611 (-3784 3984.1000976563 8.0119657516) (-3784 3984.5 0) 1502 1 + 2 598 (-3711.8999023438 3904 48.0034217834) (-3711.5 3904 64) 1503 0 + 2 549 (-3768 3871.8999023438 64) (-3768 3871.5 64) 1367 0 + 2 547 (-3711.8999023438 3888 56.0017127991) (-3711.5 3888 64) 1503 0 + 2 546 (-3711.8999023438 3872 64) (-3711.5 3872 64) 1503 0 + 2 625 (-3856 3888.0107421875 56) (-3856.5 3888.0107421875 56) 1499 1 + 2 624 (-3856 3952 24.0059776306) (-3856.5 3952 24.0059776306) 1501 1 + } + 613 ( 65 0 5451 10 18 85 0 0 ) 5 { + 2 413 (-3976 4096 0) (-3976 4096.5 0) 1073 1 + 2 1384 (-4096 4048 0) (-4096.5 4048 0) 1504 1 + 2 614 (-3984 4000 0) (-3984 3999.5 0) 1506 1 + 2 615 (-3864 4000 0) (-3864 3999.5 0) 1505 1 + 2 611 (-3856 4048 0) (-3855.5 4048 0) 1496 1 + } + 614 ( 65 0 5461 12 18 86 0 0 ) 6 { + 2 613 (-3984 4000 0) (-3984 4000.5 0) 1506 1 + 2 1384 (-4096 3992 0) (-4096.5 3992 0) 1507 1 + 2 620 (-3928 3984 0) (-3928 3983.5 0) 1511 1 + 2 619 (-3896 3984 0) (-3896 3983.5 0) 1510 1 + 2 616 (-3880 3984 0) (-3880 3983.5 0) 1509 1 + 2 615 (-3872 3992 0) (-3871.5 3992 0) 1508 1 + } + 615 ( 69 0 5473 7 18 87 0 0 ) 4 { + 2 624 (-3864 3983.8999023438 0) (-3864 3983.5 8.0119533539) 1513 0 + 2 613 (-3864 4000 0) (-3864 4000.5 0) 1505 1 + 2 614 (-3872 3992 0) (-3872.5 3992 0) 1508 1 + 2 611 (-3856 3992 0) (-3855.5 3992 0) 1495 1 + } + 616 ( 65 0 5480 9 18 88 0 0 ) 3 { + 2 624 (-3871.8999023438 3984 0) (-3871.5 3984 8.0119514465) 1514 0 + 2 619 (-3888 3962 0) (-3888.5 3962 0) 1517 1 + 2 614 (-3880 3984 0) (-3880 3984.5 0) 1509 1 + } + 617 ( 65 0 5489 7 18 89 0 0 ) 2 { + 2 625 (-3871.8999023438 3904.0239257813 48) (-3871.5 3904.0239257813 48) 1520 0 + 2 618 (-3880 3904.0119628906 48) (-3880 3904.5119628906 48) 1519 1 + } + 618 ( 69 0 5496 8 18 90 0 0 ) 5 { + 2 624 (-3864 3920.1000976563 48) (-3864 3920.5 40.0054931641) 1523 1 + 8 616 (-3880 3920 48) (-3880 3922 0) 1522 102 + 2 612 (-3855.8999023438 3920 48) (-3855.5 3920 40) 1524 1 + 2 617 (-3880 3904.0119628906 48) (-3880 3903.5119628906 48) 1519 1 + 2 625 (-3864 3904.0227050781 48) (-3864 3903.5227050781 48) 1525 1 + } + 619 ( 65 0 5504 9 18 91 0 0 ) 3 { + 2 616 (-3888 3962 0) (-3887.5 3962 0) 1517 1 + 2 620 (-3904 3980 0) (-3904.5 3980 0) 1529 1 + 2 614 (-3896 3984 0) (-3896 3984.5 0) 1510 1 + } + 620 ( 65 0 5513 7 18 92 0 0 ) 2 { + 2 619 (-3904 3980 0) (-3903.5 3980 0) 1529 1 + 2 614 (-3928 3984 0) (-3928 3984.5 0) 1511 1 + } + 621 ( 65 0 5520 6 18 93 0 0 ) 2 { + 2 623 (-3936 3960 48) (-3936 3960.5 48) 1534 1 + 2 622 (-3920 3950 48) (-3919.5 3950 48) 1535 1 + } + 622 ( 69 0 5526 6 18 94 0 0 ) 3 { + 8 619 (-3904 3950 48) (-3902 3950 0) 1536 102 + 2 623 (-3912 3960 48) (-3912 3960.5 48) 1538 1 + 2 621 (-3920 3950 48) (-3920.5 3950 48) 1535 1 + } + 623 ( 69 0 5532 7 18 95 0 0 ) 4 { + 8 620 (-3928 3976 48) (-3928 3978 0) 1539 102 + 8 619 (-3904 3968 48) (-3902 3968 0) 1540 102 + 2 621 (-3936 3960 48) (-3936 3959.5 48) 1534 1 + 2 622 (-3912 3960 48) (-3912 3959.5 48) 1538 1 + } + 624 ( 69 0 5539 7 18 96 0 0 ) 4 { + 2 618 (-3864 3919.8999023438 40.0054931641) (-3864 3919.5 48) 1544 0 + 8 616 (-3872 3920 40.0109863281) (-3874 3920 0) 1542 101 + 2 615 (-3864 3984.1000976563 8.0119533539) (-3864 3984.5 0) 1543 1 + 2 612 (-3856 3952 24.0059776306) (-3855.5 3952 24.0059776306) 1501 1 + } + 625 ( 69 0 5546 5 18 97 0 0 ) 3 { + 8 617 (-3872 3872 64) (-3874 3872 48) 1545 100 + 2 612 (-3856 3888.0107421875 56) (-3855.5 3888.0107421875 56) 1499 1 + 2 618 (-3864 3904.0227050781 48) (-3864 3904.5227050781 48) 1525 1 + } + 626 ( 2 0 5551 10 0 0 0 0 ) 0 { + } + 627 ( 2 0 5561 6 0 0 0 0 ) 0 { + } + 628 ( 65 0 5567 6 18 98 0 0 ) 2 { + 2 639 (-3696.1000976563 3656 672) (-3696.5 3656 672) 1549 0 + 2 629 (-3584 3712 672) (-3584 3712.5 672) 1550 1 + } + 629 ( 69 0 5573 6 18 99 0 0 ) 6 { + 8 655 (-3576 3728 672) (-3576 3730 632) 1553 101 + 8 654 (-3656 3728 672) (-3656 3730 632) 1553 101 + 8 653 (-3616 3728 672) (-3616 3730 632) 1553 101 + 8 652 (-3520 3728 672) (-3520 3730 544) 1553 106 + 2 641 (-3696.1000976563 3720 672) (-3696.5 3720 672) 1552 0 + 2 628 (-3584 3712 672) (-3584 3711.5 672) 1550 1 + } + 630 ( 2 0 5579 17 0 0 0 0 ) 0 { + } + 631 ( 65 0 5596 8 18 100 0 0 ) 1 { + 2 635 (-3856 3616 640) (-3855.5 3616 640) 1557 1 + } + 632 ( 2 0 5604 13 0 0 0 0 ) 0 { + } + 633 ( 2 0 5617 8 0 0 0 0 ) 0 { + } + 634 ( 2 0 5625 12 0 0 0 0 ) 0 { + } + 635 ( 65 0 5637 7 18 101 0 0 ) 3 { + 2 637 (-3848 3712 640) (-3848 3712.5 640) 1560 1 + 2 636 (-3840 3656 640) (-3839.5 3656 640) 1561 1 + 2 631 (-3856 3616 640) (-3856.5 3616 640) 1557 1 + } + 636 ( 69 0 5644 6 18 102 0 0 ) 4 { + 8 569 (-3824 3648 640) (-3822 3648 64) 1564 127 + 8 566 (-3824 3704 640) (-3822 3704 64) 1564 127 + 2 637 (-3832 3712 640) (-3832 3712.5 640) 1563 1 + 2 635 (-3840 3656 640) (-3840.5 3656 640) 1561 1 + } + 637 ( 69 0 5650 7 18 103 0 0 ) 3 { + 8 566 (-3824 3720 640) (-3822 3720 64) 1567 127 + 2 635 (-3848 3712 640) (-3848 3711.5 640) 1560 1 + 2 636 (-3832 3712 640) (-3832 3711.5 640) 1563 1 + } + 638 ( 2 0 5657 19 0 0 0 0 ) 0 { + } + 639 ( 65 0 5676 5 18 104 0 0 ) 3 { + 2 628 (-3695.8999023438 3656 672) (-3695.5 3656 672) 1549 0 + 2 641 (-3704 3712 664) (-3704 3712.5 664) 1568 1 + 2 640 (-3712 3656 656) (-3712.5 3656 656) 1570 1 + } + 640 ( 69 0 5681 7 18 105 0 0 ) 4 { + 8 566 (-3728 3712 640) (-3730 3712 64) 1572 127 + 8 549 (-3712 3728 656) (-3712 3730 64) 1573 128 + 2 639 (-3712 3656 656) (-3711.5 3656 656) 1570 1 + 2 641 (-3712 3720 656) (-3711.5 3720 656) 1574 1 + } + 641 ( 69 0 5688 5 18 106 0 0 ) 4 { + 2 629 (-3695.8999023438 3720 672) (-3695.5 3720 672) 1552 0 + 8 549 (-3696 3728 672) (-3696 3730 64) 1575 128 + 2 639 (-3704 3712 664) (-3704 3711.5 664) 1568 1 + 2 640 (-3712 3720 656) (-3712.5 3720 656) 1574 1 + } + 642 ( 2 0 5693 15 0 0 0 0 ) 0 { + } + 643 ( 65 0 5708 7 18 107 0 0 ) 4 { + 2 649 (-4032 3952.1000976563 672) (-4032 3952.5 672) 1579 0 + 2 645 (-4040 3760 672) (-4040 3759.5 672) 1577 1 + 2 644 (-3968 3856 672) (-3967.5 3856 672) 1580 1 + 2 1359 (-4096 3856 672) (-4096.5 3856 672) 1578 1 + } + 644 ( 69 0 5715 6 18 108 0 0 ) 8 { + 2 651 (-3960 3952.1000976563 672) (-3960 3952.5 672) 1583 0 + 8 621 (-3952 3946 672) (-3950 3946 48) 1581 129 + 8 608 (-3952 3932 672) (-3950 3932 96) 1581 127 + 8 607 (-3952 3914 672) (-3950 3914 96) 1581 127 + 8 558 (-3952 3888 672) (-3950 3888 96) 1581 127 + 8 556 (-3952 3848 672) (-3950 3848 320) 1581 116 + 8 554 (-3952 3816 672) (-3950 3816 320) 1581 116 + 2 643 (-3968 3856 672) (-3968.5 3856 672) 1580 1 + } + 645 ( 65 0 5721 7 18 109 0 0 ) 3 { + 2 643 (-4040 3760 672) (-4040 3760.5 672) 1577 1 + 2 646 (-3984 3616 672) (-3983.5 3616 672) 1587 1 + 2 1359 (-4096 3680 672) (-4096.5 3680 672) 1585 1 + } + 646 ( 65 0 5728 6 18 110 0 0 ) 2 { + 2 645 (-3984 3616 672) (-3984.5 3616 672) 1587 1 + 2 647 (-3968 3616 672) (-3967.5 3616 672) 1590 1 + } + 647 ( 69 0 5734 6 18 111 0 0 ) 2 { + 8 631 (-3952 3616 672) (-3950 3616 640) 1591 101 + 2 646 (-3968 3616 672) (-3968.5 3616 672) 1590 1 + } + 648 ( 2 0 5740 17 0 0 0 0 ) 0 { + } + 649 ( 65 0 5757 7 18 112 0 0 ) 7 { + 2 1374 (-4272 3951.8999023438 672) (-4272 3951.5 672) 1596 0 + 2 1359 (-4160 3951.8999023438 672) (-4160 3951.5 672) 1594 0 + 2 643 (-4032 3951.8999023438 672) (-4032 3951.5 672) 1579 0 + 2 651 (-3968 3960 664) (-3967.5 3960 664) 1600 1 + 2 1391 (-4288 3960 664) (-4288.5 3960 664) 1597 1 + 2 650 (-4096 3968 656) (-4096 3968.5 656) 1599 1 + 2 1386 (-4256 3968 656) (-4256 3968.5 656) 1598 1 + } + 650 ( 69 0 5764 7 18 113 0 0 ) 7 { + 8 1384 (-4160 3984 640) (-4160 3986 0) 1602 130 + 8 623 (-3952 3968 656) (-3950 3968 48) 1604 128 + 8 620 (-3952 3976 648) (-3950 3976 0) 1604 130 + 8 614 (-4024 3984 640) (-4024 3986 0) 1603 130 + 2 649 (-4096 3968 656) (-4096 3967.5 656) 1599 1 + 2 1386 (-4224 3976 648) (-4224.5 3976 648) 1601 1 + 2 651 (-3960 3968 656) (-3960 3967.5 656) 1605 1 + } + 651 ( 69 0 5771 5 18 114 0 0 ) 4 { + 2 644 (-3960 3951.8999023438 672) (-3960 3951.5 672) 1583 0 + 8 621 (-3952 3952 672) (-3950 3952 48) 1606 129 + 2 649 (-3968 3960 664) (-3968.5 3960 664) 1600 1 + 2 650 (-3960 3968 656) (-3960 3968.5 656) 1605 1 + } + 652 ( 65 0 5776 7 18 115 0 0 ) 1 { + 2 374 (-3520 4096 544) (-3520 4096.5 544) 953 1 + } + 653 ( 65 0 5783 6 18 116 0 0 ) 3 { + 2 375 (-3616 4096 632) (-3616 4096.5 632) 959 1 + 2 655 (-3584 3912 632) (-3583.5 3912 632) 1612 1 + 2 654 (-3648 3912 632) (-3648.5 3912 632) 1611 1 + } + 654 ( 69 0 5789 6 18 117 0 0 ) 2 { + 2 376 (-3656 4096 632) (-3656 4096.5 632) 962 1 + 2 653 (-3648 3912 632) (-3647.5 3912 632) 1611 1 + } + 655 ( 69 0 5795 6 18 118 0 0 ) 3 { + 8 652 (-3568 3912 632) (-3566 3912 544) 1616 104 + 2 377 (-3576 4096 632) (-3576 4096.5 632) 966 1 + 2 653 (-3584 3912 632) (-3584.5 3912 632) 1612 1 + } + 656 ( 2 0 5801 12 0 0 0 0 ) 0 { + } + 657 ( 0 0 5813 8 0 0 0 0 ) 0 { + } + 658 ( 2 0 5821 16 0 0 0 0 ) 0 { + } + 659 ( 0 0 5837 5 0 0 0 0 ) 0 { + } + 660 ( 2 0 5842 17 0 0 0 0 ) 0 { + } + 661 ( 2 0 5859 12 0 0 0 0 ) 0 { + } + 662 ( 2 0 5871 8 0 0 0 0 ) 0 { + } + 663 ( 2 0 5879 10 0 0 0 0 ) 0 { + } + 664 ( 2 0 5889 5 0 0 0 0 ) 0 { + } + 665 ( 2 0 5894 6 0 0 0 0 ) 0 { + } + 666 ( 2 0 5900 5 0 0 0 0 ) 0 { + } + 667 ( 2 0 5905 6 0 0 0 0 ) 0 { + } + 668 ( 65 0 5911 6 32 0 0 0 ) 1 { + 2 669 (-2988 3840 192) (-2988.5 3840 192) 1618 1 + } + 669 ( 65 4 5917 6 -38 0 0 0 ) 2 { + 2 668 (-2988 3840 192) (-2987.5 3840 192) 1618 1 + 2 672 (-3024.0102539063 3840 192) (-3024.5102539063 3840 192) 1622 1 + } + 670 ( 2 0 5923 5 0 0 0 0 ) 0 { + } + 671 ( 65 0 5928 18 19 14 0 0 ) 8 { + 2 485 (-3248 4096 192) (-3248 4096.5 192) 1248 1 + 2 524 (-3044 4096 192) (-3044 4096.5 192) 1292 1 + 2 672 (-3032 3846 192) (-3031.5 3846 192) 1625 1 + 2 673 (-3032 4024 192) (-3031.5 4024 192) 1624 1 + 2 674 (-3296.0068359375 3740 192) (-3296.0068359375 3739.5 192) 1628 1 + 2 675 (-3108.0068359375 3740 192) (-3108.0068359375 3739.5 192) 1626 1 + 2 405 (-3344 3918 192) (-3344.5 3918 192) 1051 1 + 2 474 (-3104 4096 192) (-3104 4096.5 192) 1220 1 + } + 672 ( 65 0 5946 9 19 15 0 0 ) 4 { + 2 673 (-3028.0051269531 3952 192) (-3028.0051269531 3952.5 192) 1632 1 + 2 671 (-3032 3846 192) (-3032.5 3846 192) 1625 1 + 2 675 (-3028.0051269531 3740 192) (-3028.0051269531 3739.5 192) 1631 1 + 2 669 (-3024.0102539063 3840 192) (-3023.5102539063 3840 192) 1622 1 + } + 673 ( 65 0 5955 7 19 16 0 0 ) 4 { + 2 672 (-3028.0051269531 3952 192) (-3028.0051269531 3951.5 192) 1632 1 + 2 525 (-3028.0051269531 4096 192) (-3028.0051269531 4096.5 192) 1295 1 + 2 671 (-3032 4024 192) (-3032.5 4024 192) 1624 1 + 2 678 (-3024.0102539063 4040 192) (-3023.5102539063 4040 192) 1633 1 + } + 674 ( 65 0 5962 7 19 17 0 0 ) 1 { + 2 671 (-3296.0068359375 3740 192) (-3296.0068359375 3740.5 192) 1628 1 + } + 675 ( 65 0 5969 9 19 18 0 0 ) 2 { + 2 671 (-3108.0068359375 3740 192) (-3108.0068359375 3740.5 192) 1626 1 + 2 672 (-3028.0051269531 3740 192) (-3028.0051269531 3740.5 192) 1631 1 + } + 676 ( 2 0 5978 7 0 0 0 0 ) 0 { + } + 677 ( 2 0 5985 8 0 0 0 0 ) 0 { + } + 678 ( 65 0 5993 6 19 19 0 0 ) 3 { + 2 525 (-3008.0051269531 4096 192) (-3008.0051269531 4096.5 192) 1294 1 + 2 673 (-3024.0102539063 4040 192) (-3024.5102539063 4040 192) 1633 1 + 2 514 (-2992 4040 192) (-2991.5 4040 192) 1279 1 + } + 679 ( 65 0 5999 21 1 178 0 0 ) 4 { + 2 691 (-4176 6152 0) (-4176.5 6152 0) 1644 1 + 2 902 (-4136 6144 0) (-4136 6143.5 0) 1643 1 + 2 22 (-4096 6152 0) (-4095.5 6152 0) 60 1 + 2 680 (-4136 6160 0) (-4136 6160.5 0) 1642 1 + } + 680 ( 65 0 6020 10 1 179 0 0 ) 4 { + 2 715 (-4208 6176 0) (-4208.5 6176 0) 1647 1 + 2 691 (-4192 6160 0) (-4192 6159.5 0) 1646 1 + 2 679 (-4136 6160 0) (-4136 6159.5 0) 1642 1 + 2 22 (-4096 6176 0) (-4095.5 6176 0) 61 1 + } + 681 ( 65 0 6030 13 1 180 0 0 ) 4 { + 2 699 (-4184 6176 256) (-4184 6175.5 256) 1650 1 + 2 698 (-4200 6176 256) (-4200 6175.5 256) 1651 1 + 2 6 (-4096 6184 256) (-4095.5 6184 256) 9 1 + 2 682 (-4136 6176 256) (-4136 6175.5 256) 1649 1 + } + 682 ( 69 0 6043 11 1 181 0 0 ) 4 { + 8 679 (-4136 6160 256) (-4136 6158 0) 1653 112 + 2 699 (-4176 6173 256) (-4176.5 6173 256) 1655 1 + 2 681 (-4136 6176 256) (-4136 6176.5 256) 1649 1 + 2 7 (-4096 6168 256) (-4095.5 6168 256) 17 1 + } + 683 ( 65 0 6054 6 33 0 0 0 ) 2 { + 2 65 (-4116 6496 256) (-4115.5 6496 256) 183 1 + 2 701 (-4204 6496 256) (-4204.5 6496 256) 1657 1 + } + 684 ( 65 0 6060 9 1 182 0 0 ) 2 { + 2 58 (-4096 6496 544) (-4095.5 6496 544) 166 1 + 2 685 (-4152 6224 544) (-4152 6223.5 544) 1661 1 + } + 685 ( 65 0 6069 8 1 183 0 0 ) 3 { + 2 60 (-4096 6216 536) (-4095.5 6216 536) 174 1 + 2 686 (-4152 6208 528) (-4152 6207.5 528) 1662 1 + 2 684 (-4152 6224 544) (-4152 6224.5 544) 1661 1 + } + 686 ( 69 0 6077 8 1 184 0 0 ) 3 { + 8 681 (-4152 6192 512) (-4152 6190 256) 1664 112 + 2 685 (-4152 6208 528) (-4152 6208.5 528) 1662 1 + 2 60 (-4096 6200 520) (-4095.5 6200 520) 173 1 + } + 687 ( 65 0 6085 21 1 185 0 0 ) 8 { + 2 746 (-4240 7048 584) (-4240.5 7048 584) 1669 1 + 2 92 (-4096 7072 584) (-4095.5 7072 584) 270 1 + 2 84 (-4096 7168 584) (-4095.5 7168 584) 251 1 + 2 72 (-4096 7248 584) (-4095.5 7248 584) 202 1 + 2 73 (-4096 7208 584) (-4095.5 7208 584) 206 1 + 2 94 (-4096 6920 584) (-4095.5 6920 584) 274 1 + 2 98 (-4096 7128 584) (-4095.5 7128 584) 290 1 + 2 776 (-4232 6816 584) (-4232 6815.5 584) 1668 1 + } + 688 ( 65 0 6106 8 1 186 0 0 ) 4 { + 2 95 (-4096 6792 784) (-4095.5 6792 784) 281 1 + 2 689 (-4160 6784 784) (-4160 6783.5 784) 1672 1 + 2 690 (-4152 6800 784) (-4152 6800.5 784) 1671 1 + 2 777 (-4216 6792 784) (-4216.353515625 6792.353515625 784) 1670 1 + } + 689 ( 69 0 6114 9 1 187 0 0 ) 5 { + 8 684 (-4152 6768 784) (-4152 6766 544) 1673 111 + 2 688 (-4160 6784 784) (-4160 6784.5 784) 1672 1 + 2 96 (-4096 6776 784) (-4095.5 6776 784) 286 1 + 2 733 (-4216 6768 784) (-4216 6767.5 784) 1674 1 + 2 703 (-4224 6776 784) (-4224.5 6776 784) 1675 1 + } + 690 ( 69 0 6123 9 1 188 0 0 ) 5 { + 8 776 (-4232 6808 784) (-4233.4140625 6809.4140625 584) 1678 109 + 8 687 (-4160 6816 784) (-4160 6818 584) 1676 109 + 2 688 (-4152 6800 784) (-4152 6799.5 784) 1671 1 + 2 97 (-4096 6808 784) (-4095.5 6808 784) 289 1 + 2 777 (-4224 6800 784) (-4224 6799.5 784) 1677 1 + } + 691 ( 65 0 6132 8 1 189 0 0 ) 4 { + 2 679 (-4176 6152 0) (-4175.5 6152 0) 1644 1 + 2 715 (-4208 6152 0) (-4208.5 6152 0) 1680 1 + 2 902 (-4192 6144 0) (-4192 6143.5 0) 1679 1 + 2 680 (-4192 6160 0) (-4192 6160.5 0) 1646 1 + } + 692 ( 2 0 6140 10 0 0 0 0 ) 0 { + } + 693 ( 65 0 6150 9 1 190 0 0 ) 3 { + 2 695 (-4200 6150.1000976563 320) (-4200 6150.5 320) 1682 0 + 2 694 (-4192 6147 320) (-4191.5 6147 320) 1683 1 + 2 931 (-4200 6144 320) (-4200 6143.5 320) 1684 1 + } + 694 ( 69 0 6159 8 1 191 0 0 ) 4 { + 2 697 (-4184 6150.1000976563 320) (-4184 6150.5 320) 1685 0 + 8 679 (-4176 6147 320) (-4174 6147 0) 1686 115 + 2 693 (-4192 6147 320) (-4192.5 6147 320) 1683 1 + 2 933 (-4184 6144 320) (-4184 6143.5 320) 1687 1 + } + 695 ( 65 0 6167 5 1 192 0 0 ) 3 { + 2 693 (-4200 6149.8999023438 320) (-4200 6149.5 320) 1682 0 + 2 697 (-4192 6152 318.397277832) (-4191.5 6152 318.397277832) 1688 1 + 2 696 (-4200 6154 316.7945556641) (-4200 6154.5 316.7945556641) 1690 1 + } + 696 ( 69 0 6172 6 1 193 0 0 ) 3 { + 2 700 (-4200 6160 312) (-4200 6160.5 312) 1691 1 + 2 697 (-4192 6157 314.397277832) (-4191.5 6157 314.397277832) 1692 1 + 2 695 (-4200 6154 316.7945556641) (-4200 6153.5 316.7945556641) 1690 1 + } + 697 ( 69 0 6178 6 1 194 0 0 ) 5 { + 2 694 (-4184 6149.8999023438 320) (-4184 6149.5 320) 1685 0 + 8 679 (-4176 6150 320) (-4174 6150 0) 1695 115 + 2 695 (-4192 6152 318.397277832) (-4192.5 6152 318.397277832) 1688 1 + 2 696 (-4192 6157 314.397277832) (-4192.5 6157 314.397277832) 1692 1 + 2 700 (-4184 6160 312) (-4184 6160.5 312) 1694 1 + } + 698 ( 65 0 6184 8 1 195 0 0 ) 2 { + 2 699 (-4192 6173 256) (-4191.5 6173 256) 1697 1 + 2 681 (-4200 6176 256) (-4200 6176.5 256) 1651 1 + } + 699 ( 69 0 6192 7 1 196 0 0 ) 3 { + 2 682 (-4176 6173 256) (-4175.5 6173 256) 1655 1 + 2 698 (-4192 6173 256) (-4192.5 6173 256) 1697 1 + 2 681 (-4184 6176 256) (-4184 6176.5 256) 1650 1 + } + 700 ( 69 0 6199 10 1 197 0 0 ) 4 { + 8 699 (-4184 6170 304) (-4184 6172 256) 1702 102 + 8 698 (-4200 6170 304) (-4200 6172 256) 1701 102 + 2 696 (-4200 6160 312) (-4200 6159.5 312) 1691 1 + 2 697 (-4184 6160 312) (-4184 6159.5 312) 1694 1 + } + 701 ( 65 4 6209 7 -39 0 0 0 ) 3 { + 2 683 (-4204 6496 256) (-4203.5 6496 256) 1657 1 + 2 729 (-4224 6576 256) (-4224 6576.5 256) 1706 1 + 2 727 (-4240 6496 256) (-4240.5 6496 256) 1705 1 + } + 702 ( 65 0 6216 9 1 198 0 0 ) 3 { + 2 705 (-4832 6192 576) (-4831.5 6192 576) 1711 1 + 2 744 (-5000 6640 576) (-5000 6640.5 576) 1709 1 + 2 938 (-5000 6144 576) (-5000 6143.5 576) 1712 1 + } + 703 ( 65 0 6225 10 1 199 0 0 ) 6 { + 2 965 (-5008 6112 784) (-5008 6111.5 784) 1718 1 + 2 962 (-4344 6112 784) (-4344 6111.5 784) 1716 1 + 2 689 (-4224 6776 784) (-4223.5 6776 784) 1675 1 + 2 777 (-4696 6784 784) (-4696 6784.5 784) 1714 1 + 2 733 (-4224 6440 784) (-4223.5 6440 784) 1715 1 + 2 961 (-4656 6112 784) (-4656 6111.5 784) 1717 1 + } + 704 ( 69 0 6235 10 1 200 0 0 ) 4 { + 8 705 (-4824.0087890625 6240 640) (-4824.0087890625 6238 576) 1723 103 + 8 702 (-4832 6440 640) (-4834 6440 576) 1719 103 + 2 743 (-4824.0087890625 6640 640) (-4824.0087890625 6640.5 640) 1720 1 + 2 740 (-4816.017578125 6248 640) (-4815.517578125 6248 640) 1722 1 + } + 705 ( 65 0 6245 11 1 201 0 0 ) 3 { + 2 732 (-4384 6192 576) (-4383.5 6192 576) 1724 1 + 2 702 (-4832 6192 576) (-4832.5 6192 576) 1711 1 + 2 938 (-4608 6144 576) (-4608 6143.5 576) 1725 1 + } + 706 ( 65 0 6256 9 34 0 0 0 ) 2 { + 2 707 (-4672.0068359375 6252 268) (-4672.0068359375 6252.5 268) 1729 1 + 2 926 (-4672 6100 318.6653442383) (-4672 6099.5 318.6653442383) 1731 1 + } + 707 ( 65 0 6265 7 34 1 0 0 ) 2 { + 2 723 (-4670.0063476563 6256 266.6665344238) (-4670.0063476563 6256.5 266.6665344238) 1733 1 + 2 706 (-4672.0068359375 6252 268) (-4672.0068359375 6251.5 268) 1729 1 + } + 708 ( 69 0 6272 6 35 0 0 0 ) 1 { + 2 710 (-4320 6248 256) (-4320 6248.5 256) 1736 1 + } + 709 ( 2 0 6278 7 0 0 0 0 ) 0 { + } + 710 ( 69 0 6285 6 35 1 0 0 ) 2 { + 2 726 (-4320 6256 256) (-4320 6256.5 256) 1740 1 + 2 708 (-4320 6248 256) (-4320 6247.5 256) 1736 1 + } + 711 ( 65 0 6291 9 1 202 0 0 ) 2 { + 2 714 (-4256 6192 1) (-4255.5 6192 1) 1746 1 + 2 904 (-4320 6144 1) (-4320 6143.5 1) 1747 1 + } + 712 ( 2 0 6300 7 0 0 0 0 ) 0 { + } + 713 ( 2 0 6307 6 0 0 0 0 ) 0 { + } + 714 ( 65 0 6313 7 1 203 0 0 ) 3 { + 2 711 (-4256 6192 1) (-4256.5 6192 1) 1746 1 + 2 716 (-4240 6168 1) (-4239.5 6168 1) 1750 1 + 2 904 (-4248 6144 1) (-4248 6143.5 1) 1751 1 + } + 715 ( 65 0 6320 12 1 204 0 0 ) 7 { + 2 904 (-4224.1000976563 6128 0) (-4224.5 6128 1) 1755 0 + 2 716 (-4224.1000976563 6168 0) (-4224.5 6168 1) 1755 0 + 2 691 (-4208 6152 0) (-4207.5 6152 0) 1680 1 + 2 680 (-4208 6176 0) (-4207.5 6176 0) 1647 1 + 2 903 (-4224 6088 0) (-4224.5 6088 0) 1754 1 + 2 902 (-4208 6104 0) (-4207.5 6104 0) 1752 1 + 2 893 (-4216 6064 0) (-4216 6063.5 0) 1753 1 + } + 716 ( 65 0 6332 6 1 205 0 0 ) 3 { + 2 715 (-4223.8999023438 6168 1) (-4223.5 6168 0) 1758 1 + 2 714 (-4240 6168 1) (-4240.5 6168 1) 1750 1 + 2 904 (-4232 6144 1) (-4232 6143.5 1) 1759 1 + } + 717 ( 65 0 6338 23 36 0 0 0 ) 7 { + 2 718 (-4780.0126953125 6560 256) (-4780.5126953125 6560 256) 1765 1 + 2 719 (-4780.0126953125 6368 256) (-4780.5126953125 6368 256) 1763 1 + 2 720 (-4608 6636.0170898438 256) (-4608 6636.5170898438 256) 1770 1 + 2 721 (-4720 6636.0170898438 256) (-4720 6636.5170898438 256) 1768 1 + 2 722 (-4496 6636.0170898438 256) (-4496 6636.5170898438 256) 1772 1 + 2 723 (-4670.0063476563 6288 256) (-4670.0063476563 6287.5 256) 1761 1 + 2 725 (-4432 6432 256) (-4431.5 6432 256) 1775 1 + } + 718 ( 65 0 6361 6 36 1 0 0 ) 1 { + 2 717 (-4780.0126953125 6560 256) (-4779.5126953125 6560 256) 1765 1 + } + 719 ( 65 0 6367 6 36 2 0 0 ) 1 { + 2 717 (-4780.0126953125 6368 256) (-4779.5126953125 6368 256) 1763 1 + } + 720 ( 65 0 6373 6 36 3 0 0 ) 1 { + 2 717 (-4608 6636.0170898438 256) (-4608 6635.5170898438 256) 1770 1 + } + 721 ( 65 0 6379 6 36 4 0 0 ) 1 { + 2 717 (-4720 6636.0170898438 256) (-4720 6635.5170898438 256) 1768 1 + } + 722 ( 65 0 6385 6 36 5 0 0 ) 1 { + 2 717 (-4496 6636.0170898438 256) (-4496 6635.5170898438 256) 1772 1 + } + 723 ( 65 4 6391 6 -40 0 0 0 ) 2 { + 2 707 (-4670.0063476563 6256 266.6665344238) (-4670.0063476563 6255.5 266.6665344238) 1733 1 + 2 717 (-4670.0063476563 6288 256) (-4670.0063476563 6288.5 256) 1761 1 + } + 724 ( 65 0 6397 9 36 6 0 0 ) 4 { + 2 725 (-4384 6432 256) (-4384.5 6432 256) 1799 1 + 2 726 (-4320 6284 256) (-4320 6283.5 256) 1797 1 + 2 727 (-4256 6432 256) (-4255.5 6432 256) 1795 1 + 2 728 (-4280 6576 256) (-4280 6576.5 256) 1794 1 + } + 725 ( 65 0 6406 6 36 7 0 0 ) 2 { + 2 717 (-4432 6432 256) (-4432.5 6432 256) 1775 1 + 2 724 (-4384 6432 256) (-4383.5 6432 256) 1799 1 + } + 726 ( 65 4 6412 6 -41 0 0 0 ) 2 { + 2 710 (-4320 6256 256) (-4320 6255.5 256) 1740 1 + 2 724 (-4320 6284 256) (-4320 6284.5 256) 1797 1 + } + 727 ( 65 0 6418 7 36 8 0 0 ) 3 { + 2 724 (-4256 6432 256) (-4256.5 6432 256) 1795 1 + 2 728 (-4248 6576 256) (-4248 6576.5 256) 1805 1 + 2 701 (-4240 6496 256) (-4239.5 6496 256) 1705 1 + } + 728 ( 65 0 6425 8 36 9 0 0 ) 3 { + 2 729 (-4240 6580 256) (-4239.5 6580 256) 1809 1 + 2 727 (-4248 6576 256) (-4248 6575.5 256) 1805 1 + 2 724 (-4280 6576 256) (-4280 6575.5 256) 1794 1 + } + 729 ( 65 0 6433 7 36 10 0 0 ) 2 { + 2 728 (-4240 6580 256) (-4240.5 6580 256) 1809 1 + 2 701 (-4224 6576 256) (-4224 6575.5 256) 1706 1 + } + 730 ( 0 0 6440 6 0 0 0 0 ) 0 { + } + 731 ( 0 0 6446 6 0 0 0 0 ) 0 { + } + 732 ( 65 0 6452 10 1 206 0 0 ) 3 { + 2 705 (-4384 6192 576) (-4384.5 6192 576) 1724 1 + 2 745 (-4320 6640 576) (-4320 6640.5 576) 1813 1 + 2 938 (-4320 6144 576) (-4320 6143.5 576) 1815 1 + } + 733 ( 69 0 6462 17 1 207 0 0 ) 12 { + 8 935 (-4216 6064 784) (-4216 6062 320) 1829 122 + 8 931 (-4208 6088 784) (-4206 6088 320) 1828 122 + 8 698 (-4208 6173 784) (-4206 6173 256) 1823 125 + 8 696 (-4208 6160 784) (-4206 6160 312) 1825 122 + 8 693 (-4208 6147 784) (-4206 6147 320) 1826 122 + 8 685 (-4208 6208 784) (-4206 6208 528) 1820 112 + 8 684 (-4208 6616 784) (-4206 6616 544) 1818 111 + 8 681 (-4208 6184 784) (-4206 6184 256) 1822 125 + 2 963 (-4224 6072 784) (-4224.5 6072 784) 1816 1 + 2 962 (-4224 6096 784) (-4224.5 6096 784) 1817 1 + 2 689 (-4216 6768 784) (-4216 6768.5 784) 1674 1 + 2 703 (-4224 6440 784) (-4224.5 6440 784) 1715 1 + } + 734 ( 2 0 6479 6 0 0 0 0 ) 0 { + } + 735 ( 2 0 6485 6 0 0 0 0 ) 0 { + } + 736 ( 2 0 6491 7 0 0 0 0 ) 0 { + } + 737 ( 65 0 6498 8 1 208 0 0 ) 5 { + 8 780 (-4608 6672.013671875 656) (-4608 6674.013671875 640) 1832 100 + 8 743 (-4816.0087890625 6656.0068359375 656) (-4818.0087890625 6656.0078125 640) 1831 100 + 8 740 (-4608.0087890625 6256 656) (-4608.0087890625 6254 640) 1835 100 + 8 739 (-4400 6448 656) (-4398 6448 640) 1834 100 + 8 704 (-4816.017578125 6448 656) (-4818.017578125 6448 640) 1830 100 + } + 738 ( 2 0 6506 6 0 0 0 0 ) 0 { + } + 739 ( 69 0 6512 9 1 209 0 0 ) 5 { + 8 745 (-4384 6656.0068359375 640) (-4382 6656.0068359375 576) 1839 103 + 8 732 (-4384 6440 640) (-4382 6440 576) 1840 103 + 8 705 (-4392 6240 640) (-4392 6238 576) 1841 103 + 2 740 (-4400 6248 640) (-4400.5 6248 640) 1836 1 + 2 780 (-4392 6672.013671875 640) (-4392 6672.513671875 640) 1838 1 + } + 740 ( 69 0 6521 6 1 210 0 0 ) 3 { + 8 705 (-4608.0087890625 6240 640) (-4608.0087890625 6238 576) 1842 103 + 2 739 (-4400 6248 640) (-4399.5 6248 640) 1836 1 + 2 704 (-4816.017578125 6248 640) (-4816.517578125 6248 640) 1722 1 + } + 741 ( 2 0 6527 9 0 0 0 0 ) 0 { + } + 742 ( 2 0 6536 9 0 0 0 0 ) 0 { + } + 743 ( 69 0 6545 6 1 211 0 0 ) 3 { + 8 744 (-4832 6656.0068359375 640) (-4834 6656.0068359375 576) 1846 103 + 2 704 (-4824.0087890625 6640 640) (-4824.0087890625 6639.5 640) 1720 1 + 2 780 (-4824 6672.013671875 640) (-4824 6672.513671875 640) 1844 1 + } + 744 ( 65 0 6551 7 1 212 0 0 ) 2 { + 2 702 (-5000 6640 576) (-5000 6639.5 576) 1709 1 + 2 781 (-5000 6672.013671875 576) (-5000 6672.513671875 576) 1848 1 + } + 745 ( 65 0 6558 7 1 213 0 0 ) 2 { + 2 732 (-4320 6640 576) (-4320 6639.5 576) 1813 1 + 2 779 (-4320 6672.013671875 576) (-4320 6672.513671875 576) 1851 1 + } + 746 ( 65 0 6565 22 1 214 0 0 ) 3 { + 2 782 (-4712 6800 584) (-4712 6799.5 584) 1856 1 + 2 687 (-4240 7048 584) (-4239.5 7048 584) 1669 1 + 2 776 (-4240 6808 584) (-4239.5 6808 584) 1854 1 + } + 747 ( 2 0 6587 9 0 0 0 0 ) 0 { + } + 748 ( 2 0 6596 13 0 0 0 0 ) 0 { + } + 749 ( 65 0 6609 6 37 0 0 0 ) 4 { + 2 751 (-5040 7072 1760) (-5039.5 7072 1760) 1860 1 + 2 753 (-5072 7072 1760) (-5072.5 7072 1760) 1858 1 + 2 752 (-5056 7104 1760) (-5056 7104.5 1760) 1859 1 + 2 750 (-5056 7040 1760) (-5056 7039.5 1760) 1861 1 + } + 750 ( 69 0 6615 6 37 1 0 0 ) 3 { + 2 751 (-5040 7032 1760) (-5039.5 7032 1760) 1864 1 + 2 753 (-5072 7032 1760) (-5072.5 7032 1760) 1863 1 + 2 749 (-5056 7040 1760) (-5056 7040.5 1760) 1861 1 + } + 751 ( 69 0 6621 7 37 2 0 0 ) 3 { + 2 752 (-5032 7104 1760) (-5032 7104.5 1760) 1867 1 + 2 749 (-5040 7072 1760) (-5040.5 7072 1760) 1860 1 + 2 750 (-5040 7032 1760) (-5040.5 7032 1760) 1864 1 + } + 752 ( 69 0 6628 7 37 3 0 0 ) 3 { + 2 753 (-5072 7112 1760) (-5072.5 7112 1760) 1870 1 + 2 751 (-5032 7104 1760) (-5032 7103.5 1760) 1867 1 + 2 749 (-5056 7104 1760) (-5056 7103.5 1760) 1859 1 + } + 753 ( 69 0 6635 8 37 4 0 0 ) 3 { + 2 752 (-5072 7112 1760) (-5071.5 7112 1760) 1870 1 + 2 749 (-5072 7072 1760) (-5071.5 7072 1760) 1858 1 + 2 750 (-5072 7032 1760) (-5071.5 7032 1760) 1863 1 + } + 754 ( 2 0 6643 9 0 0 0 0 ) 0 { + } + 755 ( 2 0 6652 11 0 0 0 0 ) 0 { + } + 756 ( 2 0 6663 9 0 0 0 0 ) 0 { + } + 757 ( 65 0 6672 6 38 0 0 0 ) 4 { + 2 759 (-4960 6992 1760) (-4960 6992.5 1760) 1876 1 + 2 761 (-4960 6960 1760) (-4960 6959.5 1760) 1874 1 + 2 760 (-4992 6976 1760) (-4992.5 6976 1760) 1875 1 + 2 758 (-4928 6976 1760) (-4927.5 6976 1760) 1877 1 + } + 758 ( 69 0 6678 6 38 1 0 0 ) 3 { + 2 759 (-4920 6992 1760) (-4920 6992.5 1760) 1880 1 + 2 761 (-4920 6960 1760) (-4920 6959.5 1760) 1879 1 + 2 757 (-4928 6976 1760) (-4928.5 6976 1760) 1877 1 + } + 759 ( 69 0 6684 7 38 2 0 0 ) 3 { + 2 760 (-4992 7000 1760) (-4992.5 7000 1760) 1883 1 + 2 757 (-4960 6992 1760) (-4960 6991.5 1760) 1876 1 + 2 758 (-4920 6992 1760) (-4920 6991.5 1760) 1880 1 + } + 760 ( 69 0 6691 7 38 3 0 0 ) 3 { + 2 761 (-5000 6960 1760) (-5000 6959.5 1760) 1886 1 + 2 759 (-4992 7000 1760) (-4991.5 7000 1760) 1883 1 + 2 757 (-4992 6976 1760) (-4991.5 6976 1760) 1875 1 + } + 761 ( 69 0 6698 8 38 4 0 0 ) 3 { + 2 760 (-5000 6960 1760) (-5000 6960.5 1760) 1886 1 + 2 757 (-4960 6960 1760) (-4960 6960.5 1760) 1874 1 + 2 758 (-4920 6960 1760) (-4920 6960.5 1760) 1879 1 + } + 762 ( 2 0 6706 15 0 0 0 0 ) 0 { + } + 763 ( 65 0 6721 6 39 0 0 0 ) 3 { + 2 765 (-5144 6992 1760) (-5144 6992.5 1760) 1891 1 + 2 766 (-5144 6960 1760) (-5144 6959.5 1760) 1893 1 + 2 764 (-5120 6976 1760) (-5119.5 6976 1760) 1892 1 + } + 764 ( 69 0 6727 6 39 1 0 0 ) 3 { + 2 765 (-5112 6992 1760) (-5112 6992.5 1760) 1894 1 + 2 766 (-5112 6960 1760) (-5112 6959.5 1760) 1896 1 + 2 763 (-5120 6976 1760) (-5120.5 6976 1760) 1892 1 + } + 765 ( 69 0 6733 7 39 2 0 0 ) 2 { + 2 763 (-5144 6992 1760) (-5144 6991.5 1760) 1891 1 + 2 764 (-5112 6992 1760) (-5112 6991.5 1760) 1894 1 + } + 766 ( 69 0 6740 7 39 3 0 0 ) 2 { + 2 763 (-5144 6960 1760) (-5144 6960.5 1760) 1893 1 + 2 764 (-5112 6960 1760) (-5112 6960.5 1760) 1896 1 + } + 767 ( 2 0 6747 16 0 0 0 0 ) 0 { + } + 768 ( 2 0 6763 9 0 0 0 0 ) 0 { + } + 769 ( 65 0 6772 6 40 0 0 0 ) 4 { + 2 771 (-5072 6880 1760) (-5072.5 6880 1760) 1905 1 + 2 773 (-5040 6880 1760) (-5039.5 6880 1760) 1903 1 + 2 772 (-5056 6848 1760) (-5056 6847.5 1760) 1904 1 + 2 770 (-5056 6912 1760) (-5056 6912.5 1760) 1906 1 + } + 770 ( 69 0 6778 6 40 1 0 0 ) 3 { + 2 771 (-5072 6920 1760) (-5072.5 6920 1760) 1909 1 + 2 773 (-5040 6920 1760) (-5039.5 6920 1760) 1908 1 + 2 769 (-5056 6912 1760) (-5056 6911.5 1760) 1906 1 + } + 771 ( 69 0 6784 7 40 2 0 0 ) 3 { + 2 772 (-5080 6848 1760) (-5080 6847.5 1760) 1912 1 + 2 769 (-5072 6880 1760) (-5071.5 6880 1760) 1905 1 + 2 770 (-5072 6920 1760) (-5071.5 6920 1760) 1909 1 + } + 772 ( 69 0 6791 7 40 3 0 0 ) 3 { + 2 773 (-5040 6840 1760) (-5039.5 6840 1760) 1915 1 + 2 771 (-5080 6848 1760) (-5080 6848.5 1760) 1912 1 + 2 769 (-5056 6848 1760) (-5056 6848.5 1760) 1904 1 + } + 773 ( 69 0 6798 8 40 4 0 0 ) 3 { + 2 772 (-5040 6840 1760) (-5040.5 6840 1760) 1915 1 + 2 769 (-5040 6880 1760) (-5040.5 6880 1760) 1903 1 + 2 770 (-5040 6920 1760) (-5040.5 6920 1760) 1908 1 + } + 774 ( 2 0 6806 11 0 0 0 0 ) 0 { + } + 775 ( 2 0 6817 11 0 0 0 0 ) 0 { + } + 776 ( 65 0 6828 7 1 215 0 0 ) 2 { + 2 687 (-4232 6816 584) (-4232 6816.5 584) 1668 1 + 2 746 (-4240 6808 584) (-4240.5 6808 584) 1854 1 + } + 777 ( 69 0 6835 8 1 216 0 0 ) 4 { + 8 746 (-4640 6800 784) (-4640 6802 584) 1921 109 + 2 690 (-4224 6800 784) (-4224 6800.5 784) 1677 1 + 2 688 (-4216 6792 784) (-4215.646484375 6791.646484375 784) 1670 1 + 2 703 (-4696 6784 784) (-4696 6783.5 784) 1714 1 + } + 778 ( 2 0 6843 11 0 0 0 0 ) 0 { + } + 779 ( 65 0 6854 9 1 217 0 0 ) 2 { + 2 745 (-4320 6672.013671875 576) (-4320 6671.513671875 576) 1851 1 + 2 783 (-4320 6688 576) (-4320 6688.5 576) 1925 1 + } + 780 ( 69 0 6863 11 1 218 0 0 ) 5 { + 8 783 (-4608 6688 640) (-4608 6690 576) 1929 103 + 8 781 (-4832 6680.0068359375 640) (-4834 6680.0068359375 576) 1928 103 + 8 779 (-4384 6680.0068359375 640) (-4382 6680.0068359375 576) 1930 103 + 2 739 (-4392 6672.013671875 640) (-4392 6671.513671875 640) 1838 1 + 2 743 (-4824 6672.013671875 640) (-4824 6671.513671875 640) 1844 1 + } + 781 ( 65 0 6874 9 1 219 0 0 ) 2 { + 2 744 (-5000 6672.013671875 576) (-5000 6671.513671875 576) 1848 1 + 2 783 (-5000 6688 576) (-5000 6688.5 576) 1932 1 + } + 782 ( 65 0 6883 6 1 220 0 0 ) 2 { + 2 783 (-4712 6767.8999023438 584) (-4712 6767.5 576) 1936 1 + 2 746 (-4712 6800 584) (-4712 6800.5 584) 1856 1 + } + 783 ( 65 0 6889 9 1 221 0 0 ) 3 { + 2 782 (-4712 6768.1000976563 576) (-4712 6768.5 584) 1938 0 + 2 781 (-5000 6688 576) (-5000 6687.5 576) 1932 1 + 2 779 (-4320 6688 576) (-4320 6687.5 576) 1925 1 + } + 784 ( 2 0 6898 46 0 0 0 0 ) 0 { + } + 785 ( 2 0 6944 18 0 0 0 0 ) 0 { + } + 786 ( 2 0 6962 9 0 0 0 0 ) 0 { + } + 787 ( 2 0 6971 7 0 0 0 0 ) 0 { + } + 788 ( 65 0 6978 7 1 222 0 0 ) 4 { + 2 790 (-4160 5280 456) (-4160 5280.5 456) 1943 1 + 2 789 (-4224 5272 456) (-4224.5 5272 456) 1942 1 + 2 183 (-4144 5264 456) (-4144 5263.5 456) 504 1 + 2 196 (-4096 5272 456) (-4095.5 5272 456) 549 1 + } + 789 ( 69 0 6985 6 1 223 0 0 ) 2 { + 2 790 (-4232 5280 456) (-4232 5280.5 456) 1946 1 + 2 788 (-4224 5272 456) (-4223.5 5272 456) 1942 1 + } + 790 ( 69 0 6991 7 1 224 0 0 ) 3 { + 2 199 (-4096 5288 456) (-4095.5 5288 456) 555 1 + 2 788 (-4160 5280 456) (-4160 5279.5 456) 1943 1 + 2 789 (-4232 5280 456) (-4232 5279.5 456) 1946 1 + } + 791 ( 0 0 6998 9 0 0 0 0 ) 0 { + } + 792 ( 2 0 7007 15 0 0 0 0 ) 0 { + } + 793 ( 0 0 7022 7 0 0 0 0 ) 0 { + } + 794 ( 65 0 7029 6 41 0 0 0 ) 2 { + 2 796 (-4460 5048 395.5697937012) (-4460.5 5048 395.5697937012) 1952 1 + 2 799 (-4280 5048 453.423248291) (-4279.5 5048 453.423248291) 1950 1 + } + 795 ( 65 0 7035 10 42 0 0 0 ) 3 { + 2 803 (-4720 5048 384) (-4720.5 5048 384) 1956 1 + 2 796 (-4496 5048 384) (-4495.5 5048 384) 1954 1 + 2 800 (-4608 5000 384) (-4608 4999.5 384) 1955 1 + } + 796 ( 65 4 7045 6 -42 0 0 0 ) 2 { + 2 794 (-4460 5048 395.5697937012) (-4459.5 5048 395.5697937012) 1952 1 + 2 795 (-4496 5048 384) (-4496.5 5048 384) 1954 1 + } + 797 ( 65 0 7051 12 12 5 0 0 ) 5 { + 2 182 (-4144 5216 456) (-4144 5216.5 456) 499 1 + 2 181 (-4096 5160 456) (-4095.5 5160 456) 496 1 + 2 798 (-4240 5048 456) (-4240.5 5048 456) 1962 1 + 2 801 (-4168 5000 456) (-4168 4999.5 456) 1961 1 + 2 175 (-4096 5052 456) (-4095.5 5052 456) 477 1 + } + 798 ( 65 0 7063 6 12 6 0 0 ) 2 { + 2 799 (-4272 5048 456) (-4272.5 5048 456) 1966 1 + 2 797 (-4240 5048 456) (-4239.5 5048 456) 1962 1 + } + 799 ( 65 4 7069 6 -43 0 0 0 ) 2 { + 2 798 (-4272 5048 456) (-4271.5 5048 456) 1966 1 + 2 794 (-4280 5048 453.423248291) (-4280.5 5048 453.423248291) 1950 1 + } + 800 ( 65 0 7075 7 42 1 0 0 ) 2 { + 2 1121 (-4608 4940 384) (-4608 4939.5 384) 1972 1 + 2 795 (-4608 5000 384) (-4608 5000.5 384) 1955 1 + } + 801 ( 65 0 7082 10 12 7 0 0 ) 3 { + 2 1155 (-4160 4960 456) (-4160 4959.5 456) 1974 1 + 2 175 (-4096 4980 456) (-4095.5 4980 456) 476 1 + 2 797 (-4168 5000 456) (-4168 5000.5 456) 1961 1 + } + 802 ( 2 0 7092 8 0 0 0 0 ) 0 { + } + 803 ( 65 0 7100 6 42 2 0 0 ) 1 { + 2 795 (-4720 5048 384) (-4719.5 5048 384) 1956 1 + } + 804 ( 2 0 7106 26 0 0 0 0 ) 0 { + } + 805 ( 65 0 7132 7 1 225 0 0 ) 3 { + 2 216 (-4720 5256 775.991394043) (-4719.5 5256 775.991394043) 608 1 + 2 215 (-4944 5248 784) (-4944 5247.5 784) 605 1 + 2 808 (-4944 5264 767.991394043) (-4944 5264.5 767.991394043) 1980 1 + } + 806 ( 2 0 7139 7 0 0 0 0 ) 0 { + } + 807 ( 2 0 7146 5 0 0 0 0 ) 0 { + } + 808 ( 65 0 7151 7 1 226 0 0 ) 3 { + 2 216 (-4712 5264 767.991394043) (-4712 5263.5 767.991394043) 609 1 + 2 805 (-4944 5264 767.991394043) (-4944 5263.5 767.991394043) 1980 1 + 2 832 (-4936 5552 768) (-4936 5552.5 768) 1984 1 + } + 809 ( 2 0 7158 11 0 0 0 0 ) 0 { + } + 810 ( 2 0 7169 8 0 0 0 0 ) 0 { + } + 811 ( 2 0 7177 13 0 0 0 0 ) 0 { + } + 812 ( 2 0 7190 10 0 0 0 0 ) 0 { + } + 813 ( 65 0 7200 6 43 0 0 0 ) 1 { + 2 814 (-4672 5676 320) (-4672 5676.5 320) 1988 1 + } + 814 ( 65 4 7206 7 -44 0 0 0 ) 2 { + 2 813 (-4672 5676 320) (-4672 5675.5 320) 1988 1 + 2 907 (-4672 5712 320) (-4672 5712.5 320) 1990 1 + } + 815 ( 2 0 7213 18 0 0 0 0 ) 0 { + } + 816 ( 2 0 7231 23 0 0 0 0 ) 0 { + } + 817 ( 69 0 7254 6 1 227 0 0 ) 1 { + 2 913 (-4376 5696 320) (-4376 5696.5 320) 1992 1 + } + 818 ( 2 0 7260 18 0 0 0 0 ) 0 { + } + 819 ( 65 0 7278 21 1 228 0 0 ) 4 { + 2 821 (-4432 5664 576) (-4431.646484375 5664.353515625 576) 2004 1 + 2 828 (-4524 5648 560) (-4524 5647.5 560) 2006 1 + 2 825 (-4464 5648 560) (-4464 5647.5 560) 2005 1 + 2 842 (-4848 5664 576) (-4848.5 5664 576) 2000 1 + } + 820 ( 2 0 7299 13 0 0 0 0 ) 0 { + } + 821 ( 65 0 7312 7 1 229 0 0 ) 4 { + 2 825 (-4408.0708007813 5639.9291992188 552) (-4408.353515625 5639.646484375 552) 2009 0 + 2 819 (-4432 5664 576) (-4432.353515625 5663.646484375 576) 2004 1 + 2 838 (-4424 5680 568) (-4424 5680.5 568) 2010 1 + 2 822 (-4400 5656 544) (-4399.5 5656 544) 2008 1 + } + 822 ( 69 0 7319 7 1 230 0 0 ) 4 { + 8 873 (-4384 5648 528) (-4382 5648 160) 2012 117 + 2 826 (-4392.0708007813 5623.9291992188 536) (-4392.353515625 5623.646484375 536) 2013 0 + 2 839 (-4392 5680 536) (-4392 5680.5 536) 2011 1 + 2 821 (-4400 5656 544) (-4400.5 5656 544) 2008 1 + } + 823 ( 2 0 7326 10 0 0 0 0 ) 0 { + } + 824 ( 2 0 7336 9 0 0 0 0 ) 0 { + } + 825 ( 65 0 7345 5 1 231 0 0 ) 4 { + 2 821 (-4407.9291992188 5640.0708007813 552) (-4407.646484375 5640.353515625 552) 2009 0 + 2 826 (-4456 5632 544) (-4456 5631.5 544) 2014 1 + 2 828 (-4512 5640 552) (-4512.5 5640 552) 2015 1 + 2 819 (-4464 5648 560) (-4464 5648.5 560) 2005 1 + } + 826 ( 69 0 7350 5 1 232 0 0 ) 8 { + 8 885 (-4488 5616 528) (-4488 5614 0) 2016 125 + 8 864 (-4456 5616 528) (-4456 5614 80) 2016 121 + 8 863 (-4444.1884765625 5616 528) (-4444.1884765625 5614 80) 2016 121 + 8 862 (-4426.595703125 5616 528) (-4426.595703125 5614 80) 2016 121 + 8 860 (-4400.6274414063 5616 528) (-4400.6274414063 5614 160) 2016 117 + 2 822 (-4391.9291992188 5624.0708007813 536) (-4391.646484375 5624.353515625 536) 2013 0 + 2 825 (-4456 5632 544) (-4456 5632.5 544) 2014 1 + 2 830 (-4512 5624 536) (-4512.5 5624 536) 2017 1 + } + 827 ( 0 0 7355 11 0 0 0 0 ) 0 { + } + 828 ( 65 0 7366 9 1 233 0 0 ) 3 { + 2 825 (-4512 5640 552) (-4511.5 5640 552) 2015 1 + 2 830 (-4520.005859375 5632 544.0118408203) (-4520.005859375 5631.5 544.0118408203) 2019 1 + 2 819 (-4524 5648 560) (-4524 5648.5 560) 2006 1 + } + 829 ( 65 0 7375 6 44 0 0 0 ) 0 { + } + 830 ( 69 0 7381 8 1 234 0 0 ) 2 { + 2 828 (-4520.005859375 5632 544.0118408203) (-4520.005859375 5632.5 544.0118408203) 2019 1 + 2 826 (-4512 5624 536) (-4511.5 5624 536) 2017 1 + } + 831 ( 2 0 7389 9 0 0 0 0 ) 0 { + } + 832 ( 65 0 7398 7 1 235 0 0 ) 2 { + 2 808 (-4936 5552 768) (-4936 5551.5 768) 1984 1 + 2 833 (-4936 5632 768) (-4936 5632.5 768) 2023 1 + } + 833 ( 69 0 7405 8 1 236 0 0 ) 4 { + 8 842 (-4856 5648 768) (-4856 5650 560) 2027 109 + 8 841 (-5016 5648 768) (-5016 5650 528) 2026 111 + 8 819 (-4760 5648 768) (-4760 5650 560.0317993164) 2029 109 + 2 832 (-4936 5632 768) (-4936 5631.5 768) 2023 1 + } + 834 ( 69 0 7413 6 1 237 0 0 ) 1 { + 8 819 (-4632 5680 624) (-4632 5678 592.0327758789) 2032 101 + } + 835 ( 69 0 7419 6 1 238 0 0 ) 1 { + 8 819 (-4752 5680 624) (-4752 5678 592.0327758789) 2035 101 + } + 836 ( 69 0 7425 9 1 239 0 0 ) 7 { + 8 842 (-4856 5680 784) (-4856 5678 592) 2041 109 + 8 841 (-4864 5688 784) (-4866 5688 528) 2042 112 + 8 838 (-4448 5688 784) (-4446 5688 592) 2046 109 + 8 819 (-4832 5680 784) (-4832 5678 592.0163574219) 2040 109 + 2 960 (-4456 5696 784) (-4456 5696.5 784) 2045 1 + 2 956 (-4856 5696 784) (-4856 5696.5 784) 2043 1 + 2 948 (-4656 5696 784) (-4656 5696.5 784) 2044 1 + } + 837 ( 2 0 7434 13 0 0 0 0 ) 0 { + } + 838 ( 65 0 7447 12 1 240 0 0 ) 2 { + 2 821 (-4424 5680 568) (-4424 5679.5 568) 2010 1 + 2 839 (-4400 5872 544) (-4399.5 5872 544) 2051 1 + } + 839 ( 69 0 7459 8 1 241 0 0 ) 6 { + 8 913 (-4384.005859375 5704 528) (-4382.005859375 5704 320) 2053 109 + 8 911 (-4384.005859375 5880 528) (-4382.005859375 5880 320) 2053 109 + 8 908 (-4384 6056 528) (-4382 6056 320) 2053 109 + 8 817 (-4384 5688 528) (-4382 5688 320) 2054 109 + 2 822 (-4392 5680 536) (-4392 5679.5 536) 2011 1 + 2 838 (-4400 5872 544) (-4400.5 5872 544) 2051 1 + } + 840 ( 2 0 7467 9 0 0 0 0 ) 0 { + } + 841 ( 65 0 7476 17 1 242 0 0 ) 0 { + } + 842 ( 69 0 7493 8 1 243 0 0 ) 2 { + 8 841 (-4864 5680 592) (-4866 5680 528) 2064 103 + 2 819 (-4848 5664 576) (-4847.5 5664 576) 2000 1 + } + 843 ( 65 0 7501 10 45 0 0 0 ) 4 { + 2 845 (-4268 5024 64) (-4268.5 5024 64) 2066 1 + 2 847 (-4206 5104 64) (-4206 5104.5 64) 2067 1 + 2 185 (-4116 5024 64) (-4115.5 5024 64) 514 1 + 2 1154 (-4178 4944 64) (-4178 4943.5 64) 2069 1 + } + 844 ( 65 0 7511 11 46 0 0 0 ) 4 { + 2 849 (-4528 5036 64) (-4528.5 5036 64) 2077 1 + 2 967 (-4416 4940 64) (-4416 4939.5 64) 2075 1 + 2 846 (-4448 5104 64) (-4448 5104.5 64) 2071 1 + 2 845 (-4304 5024 64) (-4303.5 5024 64) 2073 1 + } + 845 ( 65 4 7522 7 -45 0 0 0 ) 3 { + 2 848 (-4286 5104 64) (-4286 5104.5 64) 2078 1 + 2 844 (-4304 5024 64) (-4304.5 5024 64) 2073 1 + 2 843 (-4268 5024 64) (-4267.5 5024 64) 2066 1 + } + 846 ( 65 0 7529 8 46 1 0 0 ) 2 { + 2 849 (-4536 5104 64) (-4536 5103.5 64) 2082 1 + 2 844 (-4448 5104 64) (-4448 5103.5 64) 2071 1 + } + 847 ( 65 0 7537 6 45 1 0 0 ) 2 { + 2 848 (-4268 5112 64) (-4268.5 5112 64) 2086 1 + 2 843 (-4206 5104 64) (-4206 5103.5 64) 2067 1 + } + 848 ( 65 0 7543 6 45 2 0 0 ) 2 { + 2 847 (-4268 5112 64) (-4267.5 5112 64) 2086 1 + 2 845 (-4286 5104 64) (-4286 5103.5 64) 2078 1 + } + 849 ( 65 0 7549 6 46 2 0 0 ) 2 { + 2 844 (-4528 5036 64) (-4527.5 5036 64) 2077 1 + 2 846 (-4536 5104 64) (-4536 5104.5 64) 2082 1 + } + 850 ( 65 0 7555 16 1 244 0 0 ) 3 { + 2 255 (-4096 5544 0) (-4095.5 5544 0) 691 1 + 2 854 (-4224 5536 0) (-4224 5535.5 0) 2091 1 + 2 872 (-4176 5552 0) (-4176 5552.5 0) 2094 1 + } + 851 ( 69 0 7571 9 1 245 0 0 ) 6 { + 8 884 (-4464 5544 80) (-4466 5544 0) 2095 103 + 8 854 (-4408 5536 80) (-4408 5534 0) 2100 103 + 8 850 (-4352 5544 80) (-4350 5544 0) 2099 103 + 2 863 (-4408 5552 80) (-4408 5552.5 80) 2097 1 + 2 864 (-4456 5552 80) (-4456 5552.5 80) 2096 1 + 2 866 (-4360 5552 80) (-4360 5552.5 80) 2098 1 + } + 852 ( 2 0 7580 13 0 0 0 0 ) 0 { + } + 853 ( 2 0 7593 10 0 0 0 0 ) 0 { + } + 854 ( 65 0 7603 18 1 246 0 0 ) 6 { + 2 850 (-4224 5536 0) (-4224 5536.5 0) 2091 1 + 2 208 (-4096 5472 0) (-4095.5 5472 0) 584 1 + 2 207 (-4096 5360 0) (-4095.5 5360 0) 581 1 + 2 884 (-4488 5536 0) (-4488 5536.5 0) 2104 1 + 2 883 (-4512 5432 0) (-4512.5 5432 0) 2103 1 + 2 255 (-4096 5512 0) (-4095.5 5512 0) 690 1 + } + 855 ( 2 0 7621 9 0 0 0 0 ) 0 { + } + 856 ( 2 0 7630 15 0 0 0 0 ) 0 { + } + 857 ( 2 0 7645 15 0 0 0 0 ) 0 { + } + 858 ( 65 0 7660 6 1 247 0 0 ) 3 { + 2 860 (-4356.0830078125 5601.5966796875 160) (-4356.2866210938 5601.1401367188 160) 2109 1 + 2 859 (-4317.3115234375 5601.5966796875 160) (-4316.8549804688 5601.3935546875 160) 2108 1 + 2 873 (-4347.4487304688 5616 160) (-4347.4487304688 5616.5 160) 2107 1 + } + 859 ( 69 0 7666 13 1 248 0 0 ) 10 { + 8 881 (-4281.4794921875 5630.1396484375 160) (-4279.6513671875 5629.326171875 80) 2110 103 + 8 879 (-4275.18359375 5656 160) (-4273.18359375 5656 80) 2117 103 + 8 878 (-4275.18359375 5646.1396484375 160) (-4273.18359375 5646.1396484375 80) 2118 103 + 8 871 (-4297.7509765625 5593.59375 160) (-4295.9228515625 5592.7802734375 80) 2111 103 + 8 869 (-4315.7265625 5571.1870117188 160) (-4315.7255859375 5569.1870117188 80) 2112 103 + 2 858 (-4317.3115234375 5601.5966796875 160) (-4317.7680664063 5601.7998046875 160) 2108 1 + 2 882 (-4290.3564453125 5662.1396484375 160) (-4290.8129882813 5662.3427734375 160) 2115 1 + 2 876 (-4282.3549804688 5664 160) (-4282.3549804688 5664.5 160) 2116 1 + 2 860 (-4323.7255859375 5579.1904296875 160) (-4324.2255859375 5579.1904296875 160) 2113 1 + 2 873 (-4301.0419921875 5638.1396484375 160) (-4301.4985351563 5638.3427734375 160) 2114 1 + } + 860 ( 69 0 7679 8 1 249 0 0 ) 6 { + 8 869 (-4331.7270507813 5571.1870117188 160) (-4331.72265625 5569.1870117188 80) 2123 103 + 8 865 (-4353.8642578125 5577.48046875 160) (-4354.673828125 5575.6552734375 80) 2119 103 + 8 863 (-4390.4072265625 5593.7509765625 160) (-4391.220703125 5591.9262695313 80) 2120 103 + 8 862 (-4412.814453125 5609.86328125 160) (-4414.814453125 5609.8642578125 80) 2121 103 + 2 858 (-4356.0830078125 5601.5966796875 160) (-4355.8793945313 5602.0532226563 160) 2109 1 + 2 859 (-4323.7255859375 5579.1904296875 160) (-4323.2255859375 5579.1904296875 160) 2113 1 + } + 861 ( 2 0 7687 7 0 0 0 0 ) 0 { + } + 862 ( 65 0 7694 7 1 250 0 0 ) 1 { + 2 863 (-4426.595703125 5609.8642578125 80) (-4426.798828125 5609.4077148438 80) 2124 1 + } + 863 ( 65 0 7701 9 1 251 0 0 ) 5 { + 2 865 (-4368 5575.8891601563 80) (-4367.5 5575.8891601563 80) 2130 1 + 2 851 (-4408 5552 80) (-4408 5551.5 80) 2097 1 + 2 864 (-4448 5584 80) (-4448.5 5584 80) 2127 1 + 2 862 (-4426.595703125 5609.8642578125 80) (-4426.392578125 5610.3208007813 80) 2124 1 + 2 866 (-4368 5560 80) (-4367.5 5560 80) 2131 1 + } + 864 ( 69 0 7710 6 1 252 0 0 ) 3 { + 8 885 (-4464 5584 80) (-4466 5584 0) 2132 103 + 2 851 (-4456 5552 80) (-4456 5551.5 80) 2096 1 + 2 863 (-4448 5584 80) (-4447.5 5584 80) 2127 1 + } + 865 ( 65 0 7716 6 1 253 0 0 ) 3 { + 2 863 (-4368 5575.8891601563 80) (-4368.5 5575.8891601563 80) 2130 1 + 2 869 (-4336.1435546875 5569.59375 80) (-4335.9404296875 5570.0502929688 80) 2135 1 + 2 866 (-4350.2836914063 5568 80) (-4350.2836914063 5567.5 80) 2136 1 + } + 866 ( 69 0 7722 11 1 254 0 0 ) 7 { + 8 872 (-4256 5560 80) (-4254 5560 0) 2137 103 + 8 850 (-4304 5552 80) (-4304 5550 0) 2138 103 + 2 870 (-4264 5568 80) (-4264 5568.5 80) 2140 1 + 2 869 (-4302.2836914063 5568 80) (-4302.2836914063 5568.5 80) 2139 1 + 2 851 (-4360 5552 80) (-4360 5551.5 80) 2098 1 + 2 863 (-4368 5560 80) (-4368.5 5560 80) 2131 1 + 2 865 (-4350.2836914063 5568 80) (-4350.2836914063 5568.5 80) 2136 1 + } + 867 ( 2 0 7733 6 0 0 0 0 ) 0 { + } + 868 ( 2 0 7739 7 0 0 0 0 ) 0 { + } + 869 ( 65 0 7746 8 1 255 0 0 ) 4 { + 2 865 (-4336.1435546875 5569.59375 80) (-4336.3466796875 5569.1372070313 80) 2135 1 + 2 870 (-4272 5569.59375 80) (-4271.5 5569.59375 80) 2143 1 + 2 871 (-4289.86328125 5571.1870117188 80) (-4289.86328125 5571.6870117188 80) 2142 1 + 2 866 (-4302.2836914063 5568 80) (-4302.2836914063 5567.5 80) 2139 1 + } + 870 ( 69 0 7754 7 1 256 0 0 ) 5 { + 8 872 (-4256 5592 80) (-4254 5592 0) 2146 103 + 2 869 (-4272 5569.59375 80) (-4272.5 5569.59375 80) 2143 1 + 2 866 (-4264 5568 80) (-4264 5567.5 80) 2140 1 + 2 880 (-4264 5616 80) (-4264 5616.5 80) 2145 1 + 2 871 (-4272 5593.59375 80) (-4272.5 5593.59375 80) 2144 1 + } + 871 ( 65 0 7761 7 1 257 0 0 ) 4 { + 2 869 (-4289.86328125 5571.1870117188 80) (-4289.86328125 5570.6870117188 80) 2142 1 + 2 878 (-4273.591796875 5616 80) (-4273.591796875 5616.5 80) 2148 1 + 2 870 (-4272 5593.59375 80) (-4271.5 5593.59375 80) 2144 1 + 2 881 (-4281.478515625 5616 80) (-4281.478515625 5616.5 80) 2147 1 + } + 872 ( 65 0 7768 9 1 258 0 0 ) 3 { + 2 850 (-4176 5552 0) (-4176 5551.5 0) 2094 1 + 2 255 (-4096 5608 0) (-4095.5 5608 0) 692 1 + 2 874 (-4176 5664 0) (-4176 5664.5 0) 2151 1 + } + 873 ( 65 0 7777 10 1 259 0 0 ) 6 { + 2 876 (-4317.5112304688 5672 160) (-4317.3081054688 5672.4565429688 160) 2152 1 + 2 859 (-4301.0419921875 5638.1396484375 160) (-4300.5854492188 5637.9365234375 160) 2114 1 + 2 882 (-4295.3603515625 5662.1396484375 160) (-4295.1572265625 5662.5961914063 160) 2153 1 + 2 888 (-4376.9897460938 5680 160) (-4376.9897460938 5680.5 160) 2155 1 + 2 887 (-4352.7333984375 5680 160) (-4352.7333984375 5680.5 160) 2156 1 + 2 858 (-4347.4487304688 5616 160) (-4347.4487304688 5615.5 160) 2107 1 + } + 874 ( 65 0 7787 17 1 260 0 0 ) 4 { + 2 872 (-4176 5664 0) (-4176 5663.5 0) 2151 1 + 2 893 (-4185.591796875 5680 0) (-4185.591796875 5680.5 0) 2160 1 + 2 255 (-4096 5672 0) (-4095.5 5672 0) 693 1 + 2 875 (-4275.18359375 5678.1376953125 0) (-4275.68359375 5678.1376953125 0) 2159 1 + } + 875 ( 65 0 7804 9 1 261 0 0 ) 2 { + 2 874 (-4275.18359375 5678.1376953125 0) (-4274.68359375 5678.1376953125 0) 2159 1 + 2 893 (-4279.3647460938 5680 0) (-4279.3647460938 5680.5 0) 2161 1 + } + 876 ( 69 0 7813 9 1 262 0 0 ) 6 { + 8 875 (-4279.3647460938 5678.1376953125 160) (-4278.55078125 5679.96484375 0) 2165 107 + 8 874 (-4275.18359375 5670.1376953125 160) (-4273.18359375 5670.1376953125 0) 2166 107 + 2 873 (-4317.5112304688 5672 160) (-4317.7143554688 5671.5434570313 160) 2152 1 + 2 882 (-4294.5302734375 5664 160) (-4294.5302734375 5663.5 160) 2163 1 + 2 890 (-4309.5166015625 5680 160) (-4309.5166015625 5680.5 160) 2164 1 + 2 859 (-4282.3549804688 5664 160) (-4282.3549804688 5663.5 160) 2116 1 + } + 877 ( 2 0 7822 7 0 0 0 0 ) 0 { + } + 878 ( 65 0 7829 9 1 263 0 0 ) 4 { + 2 880 (-4272 5632 80) (-4271.5 5632 80) 2170 1 + 2 871 (-4273.591796875 5616 80) (-4273.591796875 5615.5 80) 2148 1 + 2 879 (-4273.591796875 5648 80) (-4273.591796875 5648.5 80) 2169 1 + 2 881 (-4275.18359375 5630.1396484375 80) (-4275.68359375 5630.1396484375 80) 2167 1 + } + 879 ( 69 0 7838 7 1 264 0 0 ) 3 { + 8 874 (-4273.591796875 5664 80) (-4273.591796875 5666 0) 2172 103 + 2 880 (-4272 5656 80) (-4271.5 5656 80) 2173 1 + 2 878 (-4273.591796875 5648 80) (-4273.591796875 5647.5 80) 2169 1 + } + 880 ( 69 0 7845 8 1 265 0 0 ) 5 { + 8 874 (-4264 5664 80) (-4264 5666 0) 2174 103 + 8 872 (-4256 5640 80) (-4254 5640 0) 2175 103 + 2 878 (-4272 5632 80) (-4272.5 5632 80) 2170 1 + 2 879 (-4272 5656 80) (-4272.5 5656 80) 2173 1 + 2 870 (-4264 5616 80) (-4264 5615.5 80) 2145 1 + } + 881 ( 65 0 7853 7 1 266 0 0 ) 2 { + 2 878 (-4275.18359375 5630.1396484375 80) (-4274.68359375 5630.1396484375 80) 2167 1 + 2 871 (-4281.478515625 5616 80) (-4281.478515625 5615.5 80) 2147 1 + } + 882 ( 69 0 7860 5 1 267 0 0 ) 3 { + 2 876 (-4294.5302734375 5664 160) (-4294.5302734375 5664.5 160) 2163 1 + 2 859 (-4290.3564453125 5662.1396484375 160) (-4289.8999023438 5661.9365234375 160) 2115 1 + 2 873 (-4295.3603515625 5662.1396484375 160) (-4295.5634765625 5661.6831054688 160) 2153 1 + } + 883 ( 65 0 7865 6 1 268 0 0 ) 2 { + 2 884 (-4520 5536 0) (-4520 5536.5 0) 2178 1 + 2 854 (-4512 5432 0) (-4511.5 5432 0) 2103 1 + } + 884 ( 65 0 7871 9 1 269 0 0 ) 3 { + 2 883 (-4520 5536 0) (-4520 5535.5 0) 2178 1 + 2 885 (-4488 5552 0) (-4488 5552.5 0) 2183 1 + 2 854 (-4488 5536 0) (-4488 5535.5 0) 2104 1 + } + 885 ( 65 0 7880 6 1 270 0 0 ) 1 { + 2 884 (-4488 5552 0) (-4488 5551.5 0) 2183 1 + } + 886 ( 2 0 7886 24 0 0 0 0 ) 0 { + } + 887 ( 65 0 7910 6 1 271 0 0 ) 4 { + 2 890 (-4349.87890625 5686.4077148438 160) (-4349.67578125 5686.8642578125 160) 2189 1 + 2 888 (-4368.9897460938 5682.2250976563 160) (-4369.4462890625 5682.4282226563 160) 2187 1 + 2 873 (-4352.7333984375 5680 160) (-4352.7333984375 5679.5 160) 2156 1 + 2 889 (-4366.134765625 5688.6328125 160) (-4366.5913085938 5688.8359375 160) 2188 1 + } + 888 ( 65 0 7916 7 1 272 0 0 ) 3 { + 2 887 (-4368.9897460938 5682.2250976563 160) (-4368.533203125 5682.0219726563 160) 2187 1 + 2 873 (-4376.9897460938 5680 160) (-4376.9897460938 5679.5 160) 2155 1 + 2 889 (-4376 5684.4501953125 160) (-4376 5684.9501953125 160) 2191 1 + } + 889 ( 69 0 7923 10 1 273 0 0 ) 5 { + 8 900 (-4382.13671875 5704.634765625 160) (-4383.9638671875 5705.4482421875 80) 2195 103 + 8 897 (-4372.2744140625 5708.818359375 160) (-4372.2744140625 5710.818359375 80) 2192 103 + 2 888 (-4376 5684.4501953125 160) (-4376 5683.9501953125 160) 2191 1 + 2 887 (-4366.134765625 5688.6328125 160) (-4365.6782226563 5688.4296875 160) 2188 1 + 2 890 (-4364.2729492188 5700.8168945313 160) (-4363.7729492188 5700.8168945313 160) 2193 1 + } + 890 ( 69 0 7933 10 1 274 0 0 ) 7 { + 8 899 (-4334.1376953125 5702.5234375 160) (-4333.3247070313 5704.3505859375 80) 2197 103 + 8 897 (-4348.2758789063 5708.818359375 160) (-4348.2758789063 5710.818359375 80) 2196 103 + 8 893 (-4293.7729492188 5684.552734375 160) (-4292.9594726563 5686.3798828125 0) 2199 107 + 8 892 (-4312 5692.6669921875 160) (-4311.1865234375 5694.494140625 80) 2198 103 + 2 876 (-4309.5166015625 5680 160) (-4309.5166015625 5679.5 160) 2164 1 + 2 887 (-4349.87890625 5686.4077148438 160) (-4350.08203125 5685.951171875 160) 2189 1 + 2 889 (-4364.2729492188 5700.8168945313 160) (-4364.7729492188 5700.8168945313 160) 2193 1 + } + 891 ( 2 0 7943 8 0 0 0 0 ) 0 { + } + 892 ( 69 0 7951 8 1 275 0 0 ) 5 { + 8 901 (-4312 5736 80) (-4312 5738 0) 2204 103 + 8 893 (-4304 5712.552734375 80) (-4302 5712.552734375 0) 2205 103 + 2 899 (-4320 5702.5234375 80) (-4320.5 5702.5234375 80) 2201 1 + 2 898 (-4320 5728 80) (-4320.5 5728 80) 2203 1 + 2 897 (-4320 5714.4091796875 80) (-4320.5 5714.4091796875 80) 2202 1 + } + 893 ( 65 0 7959 16 1 276 0 0 ) 8 { + 2 874 (-4185.591796875 5680 0) (-4185.591796875 5679.5 0) 2160 1 + 2 875 (-4279.3647460938 5680 0) (-4279.3647460938 5679.5 0) 2161 1 + 2 715 (-4216 6064 0) (-4216 6064.5 0) 1753 1 + 2 256 (-4096 6056 0) (-4095.5 6056 0) 698 1 + 2 903 (-4264 6064 0) (-4264 6064.5 0) 2208 1 + 2 902 (-4152 6064 0) (-4152 6064.5 0) 2209 1 + 2 901 (-4304 5900 0) (-4304.5 5900 0) 2207 1 + 2 255 (-4096 5864 0) (-4095.5 5864 0) 694 1 + } + 894 ( 2 0 7975 8 0 0 0 0 ) 0 { + } + 895 ( 2 0 7983 9 0 0 0 0 ) 0 { + } + 896 ( 2 0 7992 16 0 0 0 0 ) 0 { + } + 897 ( 65 0 8008 10 1 277 0 0 ) 4 { + 2 900 (-4382.13671875 5708.818359375 80) (-4382.13671875 5708.318359375 80) 2215 1 + 2 899 (-4334.1381835938 5708.818359375 80) (-4334.1381835938 5708.318359375 80) 2213 1 + 2 898 (-4352 5720 80) (-4352 5720.5 80) 2212 1 + 2 892 (-4320 5714.4091796875 80) (-4319.5 5714.4091796875 80) 2202 1 + } + 898 ( 69 0 8018 8 1 278 0 0 ) 3 { + 8 901 (-4352 5736 80) (-4352 5738 0) 2217 103 + 2 897 (-4352 5720 80) (-4352 5719.5 80) 2212 1 + 2 892 (-4320 5728 80) (-4319.5 5728 80) 2203 1 + } + 899 ( 65 0 8026 5 1 279 0 0 ) 2 { + 2 897 (-4334.1381835938 5708.818359375 80) (-4334.1381835938 5709.318359375 80) 2213 1 + 2 892 (-4320 5702.5234375 80) (-4319.5 5702.5234375 80) 2201 1 + } + 900 ( 65 0 8031 5 1 280 0 0 ) 1 { + 2 897 (-4382.13671875 5708.818359375 80) (-4382.13671875 5709.318359375 80) 2215 1 + } + 901 ( 65 0 8036 6 1 281 0 0 ) 2 { + 2 903 (-4344 6064 0) (-4344 6064.5 0) 2221 1 + 2 893 (-4304 5900 0) (-4303.5 5900 0) 2207 1 + } + 902 ( 65 0 8042 13 1 282 0 0 ) 5 { + 2 691 (-4192 6144 0) (-4192 6144.5 0) 1679 1 + 2 22 (-4096 6104 0) (-4095.5 6104 0) 59 1 + 2 679 (-4136 6144 0) (-4136 6144.5 0) 1643 1 + 2 715 (-4208 6104 0) (-4208.5 6104 0) 1752 1 + 2 893 (-4152 6064 0) (-4152 6063.5 0) 2209 1 + } + 903 ( 65 0 8055 9 1 283 0 0 ) 4 { + 2 904 (-4304 6112.1000976563 0) (-4304 6112.5 1) 2225 0 + 2 901 (-4344 6064 0) (-4344 6063.5 0) 2221 1 + 2 715 (-4224 6088 0) (-4223.5 6088 0) 1754 1 + 2 893 (-4264 6064 0) (-4264 6063.5 0) 2208 1 + } + 904 ( 65 0 8064 9 1 284 0 0 ) 5 { + 2 903 (-4304 6111.8999023438 1) (-4304 6111.5 0) 2226 1 + 2 715 (-4223.8999023438 6128 1) (-4223.5 6128 0) 2228 1 + 2 716 (-4232 6144 1) (-4232 6144.5 1) 1759 1 + 2 714 (-4248 6144 1) (-4248 6144.5 1) 1751 1 + 2 711 (-4320 6144 1) (-4320 6144.5 1) 1747 1 + } + 905 ( 2 0 8073 6 0 0 0 0 ) 0 { + } + 906 ( 2 0 8079 7 0 0 0 0 ) 0 { + } + 907 ( 65 0 8086 14 47 0 0 0 ) 6 { + 2 914 (-4420 5888 320) (-4419.5 5888 320) 2236 1 + 2 923 (-4748 6000 320) (-4748.5 6000 320) 2232 1 + 2 924 (-4748 6056 320) (-4748.5 6056 320) 2233 1 + 2 814 (-4672 5712 320) (-4672 5711.5 320) 1990 1 + 2 918 (-4748 5832 320) (-4748.5 5832 320) 2231 1 + 2 927 (-4654 6064 320) (-4654 6064.5 320) 2234 1 + } + 908 ( 65 0 8100 8 1 285 0 0 ) 4 { + 2 935 (-4256 6056 320) (-4255.5 6056 320) 2241 1 + 2 911 (-4376 6048 320) (-4376 6047.5 320) 2238 1 + 2 914 (-4384 6056 320) (-4384.5 6056 320) 2239 1 + 2 909 (-4312 6048 320) (-4312 6047.5 320) 2237 1 + } + 909 ( 69 0 8108 8 1 286 0 0 ) 4 { + 2 908 (-4312 6048 320) (-4312 6048.5 320) 2237 1 + 2 912 (-4360 6032 320) (-4360 6031.5 320) 2243 1 + 2 911 (-4368 6040 320) (-4368.5 6040 320) 2244 1 + 2 932 (-4256 6040 320) (-4255.5 6040 320) 2245 1 + } + 910 ( 2 0 8116 8 0 0 0 0 ) 0 { + } + 911 ( 65 0 8124 7 1 287 0 0 ) 5 { + 2 914 (-4384.005859375 5880 320) (-4384.505859375 5880 320) 2246 1 + 2 913 (-4376.005859375 5720 320) (-4375.65234375 5719.646484375 320) 2248 1 + 2 912 (-4368 5880 320) (-4367.5 5880 320) 2247 1 + 2 908 (-4376 6048 320) (-4376 6048.5 320) 2238 1 + 2 909 (-4368 6040 320) (-4367.5 6040 320) 2244 1 + } + 912 ( 69 0 8131 6 1 288 0 0 ) 3 { + 2 911 (-4368 5880 320) (-4368.5 5880 320) 2247 1 + 2 909 (-4360 6032 320) (-4360 6032.5 320) 2243 1 + 2 913 (-4360 5728 320) (-4360 5727.5 320) 2250 1 + } + 913 ( 69 0 8137 8 1 289 0 0 ) 3 { + 2 911 (-4376.005859375 5720 320) (-4376.359375 5720.353515625 320) 2248 1 + 2 912 (-4360 5728 320) (-4360 5728.5 320) 2250 1 + 2 817 (-4376 5696 320) (-4376 5695.5 320) 1992 1 + } + 914 ( 65 4 8145 7 -46 0 0 0 ) 3 { + 2 907 (-4420 5888 320) (-4420.5 5888 320) 2236 1 + 2 911 (-4384.005859375 5880 320) (-4383.505859375 5880 320) 2246 1 + 2 908 (-4384 6056 320) (-4383.5 6056 320) 2239 1 + } + 915 ( 2 0 8152 13 0 0 0 0 ) 0 { + } + 916 ( 2 0 8165 6 0 0 0 0 ) 0 { + } + 917 ( 2 0 8171 10 0 0 0 0 ) 0 { + } + 918 ( 65 0 8181 15 47 1 0 0 ) 4 { + 2 921 (-4780.0126953125 5776 320) (-4780.5126953125 5776 320) 2257 1 + 2 922 (-4780.0126953125 5888 320) (-4780.5126953125 5888 320) 2259 1 + 2 907 (-4748 5832 320) (-4747.5 5832 320) 2231 1 + 2 923 (-4764.0063476563 5952 320) (-4764.0063476563 5952.5 320) 2261 1 + } + 919 ( 0 0 8196 6 0 0 0 0 ) 0 { + } + 920 ( 0 0 8202 6 0 0 0 0 ) 0 { + } + 921 ( 65 0 8208 7 47 2 0 0 ) 1 { + 2 918 (-4780.0126953125 5776 320) (-4779.5126953125 5776 320) 2257 1 + } + 922 ( 65 0 8215 7 47 3 0 0 ) 1 { + 2 918 (-4780.0126953125 5888 320) (-4779.5126953125 5888 320) 2259 1 + } + 923 ( 65 0 8222 12 47 4 0 0 ) 3 { + 2 907 (-4748 6000 320) (-4747.5 6000 320) 2232 1 + 2 924 (-4764.0063476563 6048 320) (-4764.0063476563 6048.5 320) 2272 1 + 2 918 (-4764.0063476563 5952 320) (-4764.0063476563 5951.5 320) 2261 1 + } + 924 ( 65 0 8234 7 47 5 0 0 ) 3 { + 2 907 (-4748 6056 320) (-4747.5 6056 320) 2233 1 + 2 923 (-4764.0063476563 6048 320) (-4764.0063476563 6047.5 320) 2272 1 + 2 927 (-4764.0063476563 6064 320) (-4764.0063476563 6064.5 320) 2273 1 + } + 925 ( 2 0 8241 8 0 0 0 0 ) 0 { + } + 926 ( 65 0 8249 9 34 2 0 0 ) 2 { + 2 706 (-4672 6100 318.6653442383) (-4672 6100.5 318.6653442383) 1731 1 + 2 927 (-4670.0063476563 6096 320) (-4670.0063476563 6095.5 320) 2276 1 + } + 927 ( 65 4 8258 9 -47 0 0 0 ) 3 { + 2 926 (-4670.0063476563 6096 320) (-4670.0063476563 6096.5 320) 2276 1 + 2 907 (-4654 6064 320) (-4654 6063.5 320) 2234 1 + 2 924 (-4764.0063476563 6064 320) (-4764.0063476563 6063.5 320) 2273 1 + } + 928 ( 2 0 8267 11 0 0 0 0 ) 0 { + } + 929 ( 2 0 8278 8 0 0 0 0 ) 0 { + } + 930 ( 2 0 8286 12 0 0 0 0 ) 0 { + } + 931 ( 65 0 8298 7 1 290 0 0 ) 4 { + 2 935 (-4208 6056 320) (-4208.5 6056 320) 2281 1 + 2 933 (-4192 6096 320) (-4191.5 6096 320) 2283 1 + 2 693 (-4200 6144 320) (-4200 6144.5 320) 1684 1 + 2 932 (-4200 6048 320) (-4200 6047.5 320) 2284 1 + } + 932 ( 69 0 8305 8 1 291 0 0 ) 4 { + 2 933 (-4192 6040 320) (-4191.5 6040 320) 2285 1 + 2 931 (-4200 6048 320) (-4200 6048.5 320) 2284 1 + 2 935 (-4232 6048 320) (-4232 6048.5 320) 2287 1 + 2 909 (-4256 6040 320) (-4256.5 6040 320) 2245 1 + } + 933 ( 69 0 8313 7 1 292 0 0 ) 3 { + 2 694 (-4184 6144 320) (-4184 6144.5 320) 1687 1 + 2 931 (-4192 6096 320) (-4192.5 6096 320) 2283 1 + 2 932 (-4192 6040 320) (-4192.5 6040 320) 2285 1 + } + 934 ( 2 0 8320 9 0 0 0 0 ) 0 { + } + 935 ( 65 0 8329 6 1 293 0 0 ) 3 { + 2 908 (-4256 6056 320) (-4256.5 6056 320) 2241 1 + 2 931 (-4208 6056 320) (-4207.5 6056 320) 2281 1 + 2 932 (-4232 6048 320) (-4232 6047.5 320) 2287 1 + } + 936 ( 2 0 8335 14 0 0 0 0 ) 0 { + } + 937 ( 2 0 8349 12 0 0 0 0 ) 0 { + } + 938 ( 65 0 8361 8 1 294 0 0 ) 3 { + 2 732 (-4320 6144 576) (-4320 6144.5 576) 1815 1 + 2 702 (-5000 6144 576) (-5000 6144.5 576) 1712 1 + 2 705 (-4608 6144 576) (-4608 6144.5 576) 1725 1 + } + 939 ( 2 0 8369 13 0 0 0 0 ) 0 { + } + 940 ( 65 0 8382 9 1 295 0 0 ) 3 { + 2 943 (-4844 5736 624) (-4844 5735.5 624) 2298 1 + 2 942 (-4844 6040 624) (-4844 6040.5 624) 2294 1 + 2 941 (-4848 5888 624) (-4848.5 5888 624) 2299 1 + } + 941 ( 69 0 8391 8 1 296 0 0 ) 4 { + 8 841 (-4864 5888 624) (-4866 5888 528) 2303 104 + 2 940 (-4848 5888 624) (-4847.5 5888 624) 2299 1 + 2 942 (-4848 6044 624) (-4847.5 6044 624) 2300 1 + 2 943 (-4848 5732 624) (-4847.5 5732 624) 2301 1 + } + 942 ( 65 0 8399 5 1 297 0 0 ) 2 { + 2 940 (-4844 6040 624) (-4844 6039.5 624) 2294 1 + 2 941 (-4848 6044 624) (-4848.5 6044 624) 2300 1 + } + 943 ( 65 0 8404 5 1 298 0 0 ) 2 { + 2 940 (-4844 5736 624) (-4844 5736.5 624) 2298 1 + 2 941 (-4848 5732 624) (-4848.5 5732 624) 2301 1 + } + 944 ( 2 0 8409 11 0 0 0 0 ) 0 { + } + 945 ( 69 0 8420 6 1 299 0 0 ) 1 { + 8 838 (-4448 5796 624) (-4446 5796 592) 2310 101 + } + 946 ( 69 0 8426 6 1 300 0 0 ) 1 { + 8 838 (-4448 5980 624) (-4446 5980 592) 2313 101 + } + 947 ( 2 0 8432 9 0 0 0 0 ) 0 { + } + 948 ( 65 0 8441 8 1 301 0 0 ) 6 { + 2 954 (-4840 5712 784) (-4840 5712.5 784) 2315 1 + 2 956 (-4848 5704 784) (-4848.5 5704 784) 2319 1 + 2 836 (-4656 5696 784) (-4656 5695.5 784) 2044 1 + 2 958 (-4472 5712 784) (-4472 5712.5 784) 2317 1 + 2 960 (-4464 5704 784) (-4463.5 5704 784) 2318 1 + 2 949 (-4656 5712 784) (-4656 5712.5 784) 2316 1 + } + 949 ( 69 0 8449 8 1 302 0 0 ) 7 { + 8 953 (-4660 5728 784) (-4660 5730 752) 2321 101 + 8 950 (-4500 5728 784) (-4500 5730 752) 2322 101 + 2 955 (-4824 5728 784) (-4824 5728.5 784) 2320 1 + 2 954 (-4832 5720 784) (-4832.5 5720 784) 2325 1 + 2 948 (-4656 5712 784) (-4656 5711.5 784) 2316 1 + 2 959 (-4488 5728 784) (-4488 5728.5 784) 2323 1 + 2 958 (-4480 5720 784) (-4479.5 5720 784) 2324 1 + } + 950 ( 69 0 8457 8 1 303 0 0 ) 3 { + 8 940 (-4504 5888 752) (-4506 5888 624) 2329 106 + 2 951 (-4504 6044 752) (-4504.5 6044 752) 2330 1 + 2 953 (-4504 5732 752) (-4504.5 5732 752) 2328 1 + } + 951 ( 69 0 8465 6 1 304 0 0 ) 2 { + 8 940 (-4660 6040 752) (-4660 6038 624) 2333 106 + 2 950 (-4504 6044 752) (-4503.5 6044 752) 2330 1 + } + 952 ( 2 0 8471 9 0 0 0 0 ) 0 { + } + 953 ( 69 0 8480 6 1 305 0 0 ) 2 { + 8 940 (-4660 5736 752) (-4660 5738 624) 2337 106 + 2 950 (-4504 5732 752) (-4503.5 5732 752) 2328 1 + } + 954 ( 65 0 8486 7 1 306 0 0 ) 5 { + 2 948 (-4840 5712 784) (-4840 5711.5 784) 2315 1 + 2 949 (-4832 5720 784) (-4831.5 5720 784) 2325 1 + 2 955 (-4832 5896 784) (-4831.5 5896 784) 2340 1 + 2 956 (-4848 5888 784) (-4848.5 5888 784) 2338 1 + 2 961 (-4840 6064 784) (-4840 6064.5 784) 2339 1 + } + 955 ( 69 0 8493 7 1 307 0 0 ) 6 { + 8 953 (-4816 5732 784) (-4814 5732 752) 2345 101 + 8 951 (-4816 6044 784) (-4814 6044 752) 2343 101 + 2 949 (-4824 5728 784) (-4824 5727.5 784) 2320 1 + 2 954 (-4832 5896 784) (-4832.5 5896 784) 2340 1 + 2 964 (-4816 6056 784) (-4815.5 6056 784) 2342 1 + 2 961 (-4824 6064 784) (-4824 6064.5 784) 2341 1 + } + 956 ( 69 0 8500 9 1 308 0 0 ) 7 { + 8 841 (-4864 5888 784) (-4866 5888 528) 2346 112 + 2 836 (-4856 5696 784) (-4856 5695.5 784) 2043 1 + 2 948 (-4848 5704 784) (-4847.5 5704 784) 2319 1 + 2 954 (-4848 5888 784) (-4847.5 5888 784) 2338 1 + 2 966 (-4864 6072 784) (-4864.5 6072 784) 2348 1 + 2 965 (-4856 6080 784) (-4856 6080.5 784) 2349 1 + 2 961 (-4848 6072 784) (-4847.5 6072 784) 2350 1 + } + 957 ( 2 0 8509 14 0 0 0 0 ) 0 { + } + 958 ( 65 0 8523 7 1 309 0 0 ) 5 { + 2 948 (-4472 5712 784) (-4472 5711.5 784) 2317 1 + 2 949 (-4480 5720 784) (-4480.5 5720 784) 2324 1 + 2 961 (-4472 6064 784) (-4472 6064.5 784) 2352 1 + 2 959 (-4480 5896 784) (-4480.5 5896 784) 2351 1 + 2 960 (-4464 5888 784) (-4463.5 5888 784) 2353 1 + } + 959 ( 69 0 8530 7 1 310 0 0 ) 5 { + 8 950 (-4496 5888 784) (-4498 5888 752) 2354 101 + 2 949 (-4488 5728 784) (-4488 5727.5 784) 2323 1 + 2 958 (-4480 5896 784) (-4479.5 5896 784) 2351 1 + 2 964 (-4496 6056 784) (-4496.5 6056 784) 2355 1 + 2 961 (-4488 6064 784) (-4488 6064.5 784) 2356 1 + } + 960 ( 69 0 8537 9 1 311 0 0 ) 7 { + 8 838 (-4448 5712 784) (-4446 5712 592) 2360 109 + 2 836 (-4456 5696 784) (-4456 5695.5 784) 2045 1 + 2 948 (-4464 5704 784) (-4464.5 5704 784) 2318 1 + 2 958 (-4464 5888 784) (-4464.5 5888 784) 2353 1 + 2 963 (-4448 6072 784) (-4447.5 6072 784) 2359 1 + 2 961 (-4464 6072 784) (-4464.5 6072 784) 2357 1 + 2 962 (-4456 6080 784) (-4456 6080.5 784) 2358 1 + } + 961 ( 65 0 8546 12 1 312 0 0 ) 10 { + 2 962 (-4464 6096 784) (-4463.5 6096 784) 2363 1 + 2 964 (-4656 6064 784) (-4656 6063.5 784) 2361 1 + 2 958 (-4472 6064 784) (-4472 6063.5 784) 2352 1 + 2 959 (-4488 6064 784) (-4488 6063.5 784) 2356 1 + 2 960 (-4464 6072 784) (-4463.5 6072 784) 2357 1 + 2 956 (-4848 6072 784) (-4848.5 6072 784) 2350 1 + 2 955 (-4824 6064 784) (-4824 6063.5 784) 2341 1 + 2 954 (-4840 6064 784) (-4840 6063.5 784) 2339 1 + 2 965 (-4848 6096 784) (-4848.5 6096 784) 2362 1 + 2 703 (-4656 6112 784) (-4656 6112.5 784) 1717 1 + } + 962 ( 65 0 8558 7 1 313 0 0 ) 5 { + 2 961 (-4464 6096 784) (-4464.5 6096 784) 2363 1 + 2 963 (-4336 6080 784) (-4336 6079.5 784) 2364 1 + 2 733 (-4224 6096 784) (-4223.5 6096 784) 1817 1 + 2 703 (-4344 6112 784) (-4344 6112.5 784) 1716 1 + 2 960 (-4456 6080 784) (-4456 6079.5 784) 2358 1 + } + 963 ( 69 0 8565 6 1 314 0 0 ) 6 { + 8 935 (-4240 6064 784) (-4240 6062 320) 2365 122 + 8 908 (-4320 6064 784) (-4320 6062 320) 2365 122 + 8 838 (-4400 6064 784) (-4400 6062 544) 2365 111 + 2 962 (-4336 6080 784) (-4336 6080.5 784) 2364 1 + 2 733 (-4224 6072 784) (-4223.5 6072 784) 1816 1 + 2 960 (-4448 6072 784) (-4448.5 6072 784) 2359 1 + } + 964 ( 69 0 8571 6 1 315 0 0 ) 5 { + 8 951 (-4660 6048 784) (-4660 6046 752) 2367 101 + 8 950 (-4500 6048 784) (-4500 6046 752) 2366 101 + 2 961 (-4656 6064 784) (-4656 6064.5 784) 2361 1 + 2 955 (-4816 6056 784) (-4816.5 6056 784) 2342 1 + 2 959 (-4496 6056 784) (-4495.5 6056 784) 2355 1 + } + 965 ( 65 0 8577 7 1 316 0 0 ) 4 { + 2 703 (-5008 6112 784) (-5008 6112.5 784) 1718 1 + 2 966 (-5016 6080 784) (-5016 6079.5 784) 2369 1 + 2 956 (-4856 6080 784) (-4856 6079.5 784) 2349 1 + 2 961 (-4848 6096 784) (-4847.5 6096 784) 2362 1 + } + 966 ( 69 0 8584 6 1 317 0 0 ) 3 { + 8 841 (-5016 6064 784) (-5016 6062 528) 2370 112 + 2 965 (-5016 6080 784) (-5016 6080.5 784) 2369 1 + 2 956 (-4864 6072 784) (-4863.5 6072 784) 2348 1 + } + 967 ( 65 0 8590 7 46 3 0 0 ) 2 { + 2 844 (-4416 4940 64) (-4416 4940.5 64) 2075 1 + 2 1015 (-4416 4936 64) (-4416 4935.5 64) 2372 1 + } + 968 ( 65 0 8597 15 18 119 0 0 ) 8 { + 2 1393 (-4288 4096 0) (-4288 4095.5 0) 2375 1 + 2 1392 (-4329.1572265625 4096 0) (-4329.1572265625 4095.5 0) 2376 1 + 2 1141 (-4272 4196 0) (-4271.5 4196 0) 2383 1 + 2 1002 (-4288 4296 0) (-4288 4296.5 0) 2382 1 + 2 980 (-4354.314453125 4189.384765625 0) (-4354.814453125 4189.384765625 0) 2378 1 + 2 979 (-4354.314453125 4270.228515625 0) (-4354.814453125 4270.228515625 0) 2380 1 + 2 978 (-4354.314453125 4131.1552734375 0) (-4354.814453125 4131.1552734375 0) 2377 1 + 2 998 (-4329.1572265625 4296 0) (-4329.1572265625 4296.5 0) 2381 1 + } + 969 ( 2 0 8612 12 0 0 0 0 ) 0 { + } + 970 ( 2 0 8624 7 0 0 0 0 ) 0 { + } + 971 ( 65 0 8631 8 18 120 0 0 ) 1 { + 2 978 (-4410.943359375 4166.310546875 0) (-4410.943359375 4165.810546875 0) 2386 1 + } + 972 ( 65 0 8639 9 18 121 0 0 ) 5 { + 2 976 (-4386.1162109375 4232.9833984375 48) (-4385.978515625 4233.4638671875 48) 2389 1 + 2 982 (-4402.21875 4236.470703125 48) (-4402.69921875 4236.6083984375 48) 2388 1 + 2 973 (-4409.8828125 4189.865234375 48) (-4410.0205078125 4189.384765625 48) 2392 1 + 2 974 (-4394.0795898438 4185.326171875 48) (-4394.2172851563 4184.845703125 48) 2391 1 + 2 975 (-4376.9306640625 4205.373046875 48) (-4376.4501953125 4205.2353515625 48) 2390 1 + } + 973 ( 65 0 8648 6 18 122 0 0 ) 2 { + 2 972 (-4409.8828125 4189.865234375 48) (-4409.7451171875 4190.345703125 48) 2392 1 + 2 974 (-4410.31640625 4188.353515625 48) (-4410.31640625 4187.853515625 48) 2394 1 + } + 974 ( 69 0 8654 9 18 123 0 0 ) 5 { + 8 978 (-4399.5478515625 4166.310546875 48) (-4399.5478515625 4164.310546875 0) 2397 102 + 8 971 (-4410.080078125 4169.330078125 48) (-4410.6284179688 4167.408203125 0) 2398 102 + 2 973 (-4410.31640625 4188.353515625 48) (-4410.31640625 4188.853515625 48) 2394 1 + 2 972 (-4394.0795898438 4185.326171875 48) (-4393.9418945313 4185.806640625 48) 2391 1 + 2 975 (-4383.5473632813 4174.3046875 48) (-4383.0473632813 4174.3046875 48) 2396 1 + } + 975 ( 69 0 8663 8 18 124 0 0 ) 6 { + 8 980 (-4360.9287109375 4189.3842773438 48) (-4359.0083007813 4188.8334960938 0) 2402 102 + 8 978 (-4375.544921875 4166.310546875 48) (-4375.5473632813 4164.310546875 0) 2399 102 + 8 968 (-4354.314453125 4212.4580078125 48) (-4352.314453125 4212.4580078125 0) 2401 102 + 2 976 (-4362.314453125 4228.4521484375 48) (-4362.314453125 4228.9521484375 48) 2400 1 + 2 974 (-4383.5473632813 4174.3046875 48) (-4384.0473632813 4174.3046875 48) 2396 1 + 2 972 (-4376.9306640625 4205.373046875 48) (-4377.4111328125 4205.5107421875 48) 2390 1 + } + 976 ( 69 0 8671 11 18 125 0 0 ) 6 { + 8 983 (-4400.4658203125 4257.69140625 48) (-4400.4658203125 4259.69140625 0) 2405 102 + 8 979 (-4375.3911132813 4250.5 48) (-4374.8393554688 4252.4223632813 0) 2407 102 + 8 968 (-4354.314453125 4236.4565429688 48) (-4352.314453125 4236.4565429688 0) 2408 102 + 2 972 (-4386.1162109375 4232.9833984375 48) (-4386.25390625 4232.5029296875 48) 2389 1 + 2 975 (-4362.314453125 4228.4521484375 48) (-4362.314453125 4227.9521484375 48) 2400 1 + 2 982 (-4402.21875 4237.60546875 48) (-4402.3564453125 4237.125 48) 2403 1 + } + 977 ( 2 0 8682 10 0 0 0 0 ) 0 { + } + 978 ( 65 0 8692 10 18 126 0 0 ) 5 { + 2 980 (-4360.9306640625 4166.310546875 0) (-4360.9306640625 4166.810546875 0) 2413 1 + 2 1392 (-4398.408203125 4096 0) (-4398.408203125 4095.5 0) 2409 1 + 2 968 (-4354.314453125 4131.1552734375 0) (-4353.814453125 4131.1552734375 0) 2377 1 + 2 971 (-4410.943359375 4166.310546875 0) (-4410.943359375 4166.810546875 0) 2386 1 + 2 996 (-4433.53515625 4127.2661132813 0) (-4434.015625 4127.4038085938 0) 2410 1 + } + 979 ( 65 0 8702 7 18 127 0 0 ) 4 { + 2 983 (-4390.6435546875 4276.845703125 0) (-4391.1240234375 4276.9833984375 0) 2415 1 + 2 984 (-4396.30078125 4257.1171875 0) (-4396.78125 4257.2548828125 0) 2414 1 + 2 968 (-4354.314453125 4270.228515625 0) (-4353.814453125 4270.228515625 0) 2380 1 + 2 998 (-4369.7333984375 4296 0) (-4369.7333984375 4296.5 0) 2416 1 + } + 980 ( 65 0 8709 5 18 128 0 0 ) 2 { + 2 978 (-4360.9306640625 4166.310546875 0) (-4360.9306640625 4165.810546875 0) 2413 1 + 2 968 (-4354.314453125 4189.384765625 0) (-4353.814453125 4189.384765625 0) 2378 1 + } + 981 ( 2 0 8714 6 0 0 0 0 ) 0 { + } + 982 ( 65 0 8720 6 18 129 0 0 ) 2 { + 2 972 (-4402.21875 4236.470703125 48) (-4401.73828125 4236.3330078125 48) 2388 1 + 2 976 (-4402.21875 4237.60546875 48) (-4402.0810546875 4238.0859375 48) 2403 1 + } + 983 ( 65 0 8726 10 18 130 0 0 ) 5 { + 2 979 (-4390.6435546875 4276.845703125 0) (-4390.1630859375 4276.7080078125 0) 2415 1 + 2 984 (-4398.3017578125 4257.69140625 0) (-4398.3017578125 4257.19140625 0) 2421 1 + 2 986 (-4402.51953125 4292.7353515625 0) (-4403.01953125 4292.7353515625 0) 2425 1 + 2 989 (-4402.51953125 4278.4467773438 0) (-4403.01953125 4278.4467773438 0) 2424 1 + 2 998 (-4393.8359375 4296 0) (-4393.8359375 4296.5 0) 2420 1 + } + 984 ( 65 0 8736 5 18 131 0 0 ) 2 { + 2 979 (-4396.30078125 4257.1171875 0) (-4395.8203125 4256.9794921875 0) 2414 1 + 2 983 (-4398.3017578125 4257.69140625 0) (-4398.3017578125 4258.19140625 0) 2421 1 + } + 985 ( 65 0 8741 14 18 132 0 0 ) 7 { + 2 1001 (-4640 4296.1000976563 0) (-4640 4296.5 8) 2434 0 + 2 999 (-4578.7348632813 4296.1000976563 0) (-4578.7348632813 4296.5 8) 2434 0 + 2 1392 (-4594.7348632813 4096 0) (-4594.7348632813 4095.5 0) 2432 1 + 2 986 (-4533.4697265625 4292.7353515625 0) (-4532.9697265625 4292.7353515625 0) 2427 1 + 2 987 (-4533.4697265625 4169.5576171875 0) (-4532.9697265625 4169.5576171875 0) 2430 1 + 2 988 (-4533.4697265625 4251.0263671875 0) (-4532.9697265625 4251.0263671875 0) 2428 1 + 2 996 (-4533.4697265625 4127.2661132813 0) (-4532.9697265625 4127.2661132813 0) 2431 1 + } + 986 ( 65 0 8755 14 18 133 0 0 ) 7 { + 2 1000 (-4520 4296.1000976563 0) (-4520 4296.5 8) 2438 0 + 2 999 (-4530.7348632813 4296.1000976563 0) (-4530.7348632813 4296.5 8) 2438 0 + 2 983 (-4402.51953125 4292.7353515625 0) (-4402.01953125 4292.7353515625 0) 2425 1 + 2 985 (-4533.4697265625 4292.7353515625 0) (-4533.9697265625 4292.7353515625 0) 2427 1 + 2 988 (-4522.4458007813 4289.4711914063 0) (-4522.4458007813 4288.9711914063 0) 2437 1 + 2 989 (-4440.966796875 4289.4711914063 0) (-4440.966796875 4288.9711914063 0) 2435 1 + 2 998 (-4457.259765625 4296 0) (-4457.259765625 4296.5 0) 2439 1 + } + 987 ( 65 0 8769 7 18 134 0 0 ) 2 { + 2 985 (-4533.4697265625 4169.5576171875 0) (-4533.9697265625 4169.5576171875 0) 2430 1 + 2 996 (-4495.0185546875 4158.5322265625 0) (-4495.0185546875 4158.0322265625 0) 2440 1 + } + 988 ( 65 0 8776 7 18 135 0 0 ) 2 { + 2 986 (-4522.4458007813 4289.4711914063 0) (-4522.4458007813 4289.9711914063 0) 2437 1 + 2 985 (-4533.4697265625 4251.0263671875 0) (-4533.9697265625 4251.0263671875 0) 2428 1 + } + 989 ( 65 0 8783 7 18 136 0 0 ) 2 { + 2 986 (-4440.966796875 4289.4711914063 0) (-4440.966796875 4289.9711914063 0) 2435 1 + 2 983 (-4402.51953125 4278.4467773438 0) (-4402.01953125 4278.4467773438 0) 2424 1 + } + 990 ( 65 0 8790 6 18 137 0 0 ) 4 { + 2 994 (-4506.4331054688 4235.02734375 80) (-4506.9135742188 4235.1650390625 80) 2444 1 + 2 991 (-4479.021484375 4185.5576171875 80) (-4479.1591796875 4185.0771484375 80) 2447 1 + 2 992 (-4429.5375976563 4212.9770507813 80) (-4429.0571289063 4212.8393554688 80) 2446 1 + 2 993 (-4456.94921875 4262.4467773438 80) (-4456.8115234375 4262.9272460938 80) 2445 1 + } + 991 ( 69 0 8796 7 18 138 0 0 ) 5 { + 8 996 (-4448.5698242188 4158.5322265625 80) (-4448.5703125 4156.5322265625 0) 2451 103 + 8 987 (-4487.0185546875 4167.2661132813 80) (-4487.5698242188 4165.34375 0) 2448 103 + 2 990 (-4479.021484375 4185.5576171875 80) (-4478.8837890625 4186.0380859375 80) 2447 1 + 2 992 (-4440.5727539063 4166.5322265625 80) (-4440.0727539063 4166.5322265625 80) 2450 1 + 2 995 (-4517.4697265625 4186.2915039063 80) (-4517.9697265625 4186.2915039063 80) 2449 1 + } + 992 ( 69 0 8803 13 18 139 0 0 ) 10 { + 8 996 (-4432.5703125 4158.5322265625 80) (-4432.5703125 4156.5322265625 0) 2457 103 + 8 978 (-4423.4521484375 4162.4213867188 80) (-4421.5317382813 4161.8701171875 0) 2456 103 + 8 976 (-4402.51953125 4244.556640625 80) (-4400.51953125 4244.556640625 48) 2459 101 + 8 974 (-4418.310546875 4180.353515625 80) (-4416.392578125 4179.8002929688 48) 2454 101 + 8 973 (-4415.5830078125 4189.865234375 80) (-4413.6645507813 4189.3139648438 48) 2453 101 + 8 972 (-4408.8344726563 4213.3999023438 80) (-4406.9145507813 4212.8481445313 48) 2452 101 + 8 971 (-4421.470703125 4169.33203125 80) (-4419.5532226563 4168.779296875 0) 2455 103 + 2 991 (-4440.5727539063 4166.5322265625 80) (-4441.0727539063 4166.5322265625 80) 2450 1 + 2 990 (-4429.5375976563 4212.9770507813 80) (-4430.0180664063 4213.1147460938 80) 2446 1 + 2 993 (-4410.5107421875 4251.4223632813 80) (-4410.5107421875 4251.9223632813 80) 2458 1 + } + 993 ( 69 0 8816 10 18 140 0 0 ) 7 { + 8 989 (-4440.966796875 4278.4467773438 80) (-4440.4155273438 4280.369140625 0) 2461 103 + 8 986 (-4487.41796875 4289.4711914063 80) (-4487.41796875 4291.4711914063 0) 2466 103 + 8 983 (-4402.51953125 4262.8505859375 80) (-4400.51953125 4262.8505859375 0) 2462 103 + 8 976 (-4402.51953125 4254.556640625 80) (-4400.51953125 4254.556640625 48) 2464 101 + 2 994 (-4495.4091796875 4281.4711914063 80) (-4495.9091796875 4281.4711914063 80) 2465 1 + 2 992 (-4410.5107421875 4251.4223632813 80) (-4410.5107421875 4250.9223632813 80) 2458 1 + 2 990 (-4456.94921875 4262.4467773438 80) (-4457.0869140625 4261.9663085938 80) 2445 1 + } + 994 ( 69 0 8826 7 18 141 0 0 ) 5 { + 8 988 (-4514.4458007813 4278.9306640625 80) (-4516.3681640625 4279.482421875 0) 2467 103 + 8 986 (-4503.421875 4289.4711914063 80) (-4503.421875 4291.4711914063 0) 2468 103 + 2 990 (-4506.4331054688 4235.02734375 80) (-4505.9526367188 4234.8896484375 80) 2444 1 + 2 993 (-4495.4091796875 4281.4711914063 80) (-4494.9091796875 4281.4711914063 80) 2465 1 + 2 995 (-4517.4697265625 4232.486328125 80) (-4517.9697265625 4232.486328125 80) 2469 1 + } + 995 ( 69 0 8833 7 18 142 0 0 ) 5 { + 8 988 (-4525.4697265625 4240.4853515625 80) (-4527.3920898438 4241.037109375 0) 2472 103 + 8 987 (-4525.4697265625 4178.2919921875 80) (-4526.0205078125 4176.369140625 0) 2470 103 + 8 985 (-4533.4697265625 4196.58203125 80) (-4535.4697265625 4196.5825195313 0) 2471 103 + 2 991 (-4517.4697265625 4186.2915039063 80) (-4516.9697265625 4186.2915039063 80) 2449 1 + 2 994 (-4517.4697265625 4232.486328125 80) (-4516.9697265625 4232.486328125 80) 2469 1 + } + 996 ( 65 0 8840 10 18 143 0 0 ) 4 { + 2 987 (-4495.0185546875 4158.5322265625 0) (-4495.0185546875 4159.0322265625 0) 2440 1 + 2 1392 (-4487.986328125 4096 0) (-4487.986328125 4095.5 0) 2473 1 + 2 985 (-4533.4697265625 4127.2661132813 0) (-4533.9697265625 4127.2661132813 0) 2431 1 + 2 978 (-4433.53515625 4127.2661132813 0) (-4433.0546875 4127.1284179688 0) 2410 1 + } + 997 ( 2 0 8850 34 0 0 0 0 ) 0 { + } + 998 ( 65 0 8884 20 18 144 0 0 ) 7 { + 2 1000 (-4512.1000976563 4296 0) (-4512.5 4296 8) 2479 0 + 2 986 (-4457.259765625 4296 0) (-4457.259765625 4295.5 0) 2439 1 + 2 968 (-4329.1572265625 4296 0) (-4329.1572265625 4295.5 0) 2381 1 + 2 1009 (-4448 4400 0) (-4448 4400.5 0) 2475 1 + 2 1002 (-4304 4308 0) (-4303.5 4308 0) 2478 1 + 2 983 (-4393.8359375 4296 0) (-4393.8359375 4295.5 0) 2420 1 + 2 979 (-4369.7333984375 4296 0) (-4369.7333984375 4295.5 0) 2416 1 + } + 999 ( 65 0 8904 10 18 145 0 0 ) 5 { + 2 986 (-4530.7348632813 4295.8999023438 8) (-4530.7348632813 4295.5 0) 2482 1 + 2 985 (-4578.7348632813 4295.8999023438 8) (-4578.7348632813 4295.5 0) 2483 1 + 2 1001 (-4624 4348 30.2857322693) (-4624.5 4348 30.2857322693) 2484 1 + 2 1000 (-4528 4348 30.2857322693) (-4527.5 4348 30.2857322693) 2481 1 + 2 1007 (-4576 4400 52.5714645386) (-4576 4400.5 52.5714645386) 2480 1 + } + 1000 ( 69 0 8914 8 18 146 0 0 ) 4 { + 8 998 (-4512 4400 52.5692901611) (-4510 4400 0) 2486 102 + 2 986 (-4520 4295.8999023438 8) (-4520 4295.5 0) 2487 1 + 2 999 (-4528 4348 30.2857322693) (-4528.5 4348 30.2857322693) 2481 1 + 2 1008 (-4520 4400 52.5703773499) (-4520 4400.5 52.5703773499) 2485 1 + } + 1001 ( 65 0 8922 7 18 147 0 0 ) 3 { + 2 985 (-4640 4295.8999023438 8) (-4640 4295.5 0) 2490 1 + 2 999 (-4624 4348 30.2857322693) (-4623.5 4348 30.2857322693) 2484 1 + 2 1007 (-4640 4400 52.5714645386) (-4640 4400.5 52.5714645386) 2489 1 + } + 1002 ( 65 0 8929 8 18 148 0 0 ) 3 { + 2 1141 (-4272 4308 0) (-4271.5 4308 0) 2491 1 + 2 968 (-4288 4296 0) (-4288 4295.5 0) 2382 1 + 2 998 (-4304 4308 0) (-4304.5 4308 0) 2478 1 + } + 1003 ( 0 0 8937 6 0 0 0 0 ) 0 { + } + 1004 ( 2 0 8943 18 0 0 0 0 ) 0 { + } + 1005 ( 2 0 8961 7 0 0 0 0 ) 0 { + } + 1006 ( 2 0 8968 6 0 0 0 0 ) 0 { + } + 1007 ( 65 0 8974 7 18 149 0 0 ) 4 { + 2 1056 (-4576 4408.1000976563 56) (-4576 4408.5 64) 2495 0 + 2 999 (-4576 4400 52.5714645386) (-4576 4399.5 52.5714645386) 2480 1 + 2 1001 (-4640 4400 52.5714645386) (-4640 4399.5 52.5714645386) 2489 1 + 2 1008 (-4528 4404 54.2857322693) (-4527.5 4404 54.2857322693) 2496 1 + } + 1008 ( 69 0 8981 5 18 150 0 0 ) 4 { + 2 1013 (-4520 4408.1000976563 56) (-4520 4408.5 64) 2497 0 + 8 1009 (-4512 4408 56) (-4510 4408 0) 2498 102 + 2 1000 (-4520 4400 52.5703773499) (-4520 4399.5 52.5703773499) 2485 1 + 2 1007 (-4528 4404 54.2857322693) (-4528.5 4404 54.2857322693) 2496 1 + } + 1009 ( 65 0 8986 7 18 151 0 0 ) 2 { + 2 1023 (-4448 4408 0) (-4448 4408.5 0) 2499 1 + 2 998 (-4448 4400 0) (-4448 4399.5 0) 2475 1 + } + 1010 ( 0 0 8993 5 0 0 0 0 ) 0 { + } + 1011 ( 65 0 8998 11 18 152 0 0 ) 6 { + 2 1016 (-4368 4796 64) (-4367.5 4796 64) 2505 1 + 2 1015 (-4448 4904 64) (-4448 4904.5 64) 2504 1 + 2 1048 (-4528 4738.2822265625 64) (-4528.5 4738.2822265625 64) 2502 1 + 2 1012 (-4440 4688 64) (-4440 4687.5 64) 2506 1 + 2 1013 (-4520 4688 64) (-4520 4687.5 64) 2507 1 + 2 1054 (-4528 4846.2822265625 64) (-4528.5 4846.2822265625 64) 2503 1 + } + 1012 ( 65 0 9009 6 18 153 0 0 ) 4 { + 2 1024 (-4440 4671.8999023438 64) (-4440 4671.5 64) 2508 0 + 2 1011 (-4440 4688 64) (-4440 4688.5 64) 2506 1 + 2 1016 (-4368 4680 64) (-4367.5 4680 64) 2510 1 + 2 1013 (-4512 4680 64) (-4512.5 4680 64) 2509 1 + } + 1013 ( 69 0 9015 15 18 154 0 0 ) 7 { + 8 1023 (-4512 4484 64) (-4510 4484 0) 2512 103 + 2 1008 (-4520 4407.8999023438 64) (-4520 4407.5 56) 2513 1 + 2 1011 (-4520 4688 64) (-4520 4688.5 64) 2507 1 + 2 1012 (-4512 4680 64) (-4511.5 4680 64) 2509 1 + 2 1047 (-4528 4456 64) (-4528.5 4456 64) 2515 1 + 2 1048 (-4528 4580 64) (-4528.5 4580 64) 2516 1 + 2 1056 (-4528 4424 64) (-4528.5 4424 64) 2514 1 + } + 1014 ( 2 0 9030 13 0 0 0 0 ) 0 { + } + 1015 ( 65 4 9043 7 -48 0 0 0 ) 3 { + 2 1011 (-4448 4904 64) (-4448 4903.5 64) 2504 1 + 2 967 (-4416 4936 64) (-4416 4936.5 64) 2372 1 + 2 1016 (-4336 4904 64) (-4336 4903.5 64) 2519 1 + } + 1016 ( 65 0 9050 12 18 155 0 0 ) 4 { + 2 1027 (-4360 4671.8999023438 64) (-4360 4671.5 64) 2522 0 + 2 1011 (-4368 4796 64) (-4368.5 4796 64) 2505 1 + 2 1012 (-4368 4680 64) (-4368.5 4680 64) 2510 1 + 2 1015 (-4336 4904 64) (-4336 4904.5 64) 2519 1 + } + 1017 ( 2 0 9062 11 0 0 0 0 ) 0 { + } + 1018 ( 2 0 9073 12 0 0 0 0 ) 0 { + } + 1019 ( 65 0 9085 6 18 156 0 0 ) 3 { + 2 1021 (-4336 4632 96) (-4336.5 4632 96) 2525 1 + 2 1022 (-4320 4608 96) (-4320 4607.5 96) 2524 1 + 2 1020 (-4320 4656 96) (-4320 4656.5 96) 2526 1 + } + 1020 ( 69 0 9091 6 18 157 0 0 ) 3 { + 8 1016 (-4320 4672 96) (-4320 4674 64) 2527 101 + 2 1021 (-4336 4664 96) (-4336.5 4664 96) 2529 1 + 2 1019 (-4320 4656 96) (-4320 4655.5 96) 2526 1 + } + 1021 ( 69 0 9097 7 18 158 0 0 ) 6 { + 8 1027 (-4352 4640 96) (-4354 4640 48) 2530 102 + 8 1026 (-4352 4608 96) (-4354 4608 32) 2530 103 + 8 1016 (-4344 4672 96) (-4344 4674 64) 2531 101 + 2 1022 (-4344 4608 96) (-4344 4607.5 96) 2532 1 + 2 1019 (-4336 4632 96) (-4335.5 4632 96) 2525 1 + 2 1020 (-4336 4664 96) (-4335.5 4664 96) 2529 1 + } + 1022 ( 69 0 9104 8 18 159 0 0 ) 5 { + 8 1030 (-4344 4592 96) (-4344 4590 48) 2533 102 + 8 1029 (-4320 4592 96) (-4320 4590 48) 2533 102 + 8 1026 (-4352 4592 96) (-4354 4592 24) 2534 103 + 2 1021 (-4344 4608 96) (-4344 4608.5 96) 2532 1 + 2 1019 (-4320 4608 96) (-4320 4608.5 96) 2524 1 + } + 1023 ( 65 0 9112 9 18 160 0 0 ) 2 { + 2 1024 (-4448 4560.1000976563 0) (-4448 4560.5 8) 2538 0 + 2 1009 (-4448 4408 0) (-4448 4407.5 0) 2499 1 + } + 1024 ( 65 0 9121 9 18 161 0 0 ) 5 { + 2 1023 (-4448 4559.8999023438 8) (-4448 4559.5 0) 2543 1 + 2 1013 (-4512.1000976563 4672 64) (-4512.5 4672 64) 2544 0 + 2 1012 (-4440 4672.1000976563 64) (-4440 4672.5 64) 2508 0 + 2 1027 (-4368 4656 56) (-4367.5 4656 56) 2539 1 + 2 1026 (-4368 4592 24) (-4367.5 4592 24) 2541 1 + } + 1025 ( 0 0 9130 6 0 0 0 0 ) 0 { + } + 1026 ( 65 0 9136 11 18 162 0 0 ) 3 { + 2 1028 (-4351.8999023438 4568 12) (-4351.5 4568 0) 2547 1 + 2 1027 (-4360 4624.1000976563 40) (-4360 4624.5 48) 2549 0 + 2 1024 (-4368 4592 24) (-4368.5 4592 24) 2541 1 + } + 1027 ( 65 0 9147 6 18 163 0 0 ) 3 { + 2 1026 (-4360 4623.8999023438 48) (-4360 4623.5 40) 2552 1 + 2 1016 (-4360 4672.1000976563 64) (-4360 4672.5 64) 2522 0 + 2 1024 (-4368 4656 56) (-4368.5 4656 56) 2539 1 + } + 1028 ( 65 0 9153 8 18 164 0 0 ) 1 { + 2 1026 (-4352.1000976563 4560 0) (-4352.5 4560 8) 2557 0 + } + 1029 ( 65 0 9161 6 18 165 0 0 ) 2 { + 2 1031 (-4320 4584 48) (-4320 4583.5 48) 2561 1 + 2 1030 (-4336 4588 48) (-4336.5 4588 48) 2562 1 + } + 1030 ( 69 0 9167 6 18 166 0 0 ) 3 { + 8 1026 (-4352 4584 48) (-4354 4584 20) 2563 101 + 2 1031 (-4344 4584 48) (-4344 4583.5 48) 2565 1 + 2 1029 (-4336 4588 48) (-4335.5 4588 48) 2562 1 + } + 1031 ( 69 0 9173 7 18 167 0 0 ) 4 { + 8 1028 (-4328 4568 48) (-4328 4566 0) 2566 102 + 8 1026 (-4352 4568 48) (-4354 4568 12) 2567 101 + 2 1029 (-4320 4584 48) (-4320 4584.5 48) 2561 1 + 2 1030 (-4344 4584 48) (-4344 4584.5 48) 2565 1 + } + 1032 ( 2 0 9180 20 0 0 0 0 ) 0 { + } + 1033 ( 2 0 9200 14 0 0 0 0 ) 0 { + } + 1034 ( 2 0 9214 8 0 0 0 0 ) 0 { + } + 1035 ( 65 0 9222 10 18 168 0 0 ) 4 { + 2 1038 (-4712.435546875 4587.44140625 144) (-4712.1704101563 4587.865234375 144) 2572 1 + 2 1036 (-4720.908203125 4521.453125 144) (-4720.484375 4521.1879882813 144) 2574 1 + 2 1044 (-4736 4589.080078125 144) (-4736.5 4589.080078125 144) 2571 1 + 2 1037 (-4704.435546875 4547.814453125 144) (-4704.01171875 4547.5493164063 144) 2573 1 + } + 1036 ( 65 0 9232 5 18 169 0 0 ) 2 { + 2 1035 (-4720.908203125 4521.453125 144) (-4721.33203125 4521.7182617188 144) 2574 1 + 2 1037 (-4720 4521.453125 144) (-4719.5 4521.453125 144) 2576 1 + } + 1037 ( 69 0 9237 12 18 170 0 0 ) 9 { + 8 1054 (-4672.87109375 4564.7138671875 144) (-4670.87109375 4564.7133789063 64) 2580 103 + 8 1051 (-4680.8193359375 4544 144) (-4679.1215820313 4542.9404296875 112) 2582 101 + 8 1050 (-4694.9091796875 4521.44921875 144) (-4693.2114257813 4520.392578125 112) 2583 101 + 8 1049 (-4674.345703125 4554.3583984375 144) (-4672.6499023438 4553.296875 64) 2581 103 + 2 1040 (-4709 4498.9013671875 144) (-4708.576171875 4498.6362304688 144) 2584 1 + 2 1039 (-4717 4490.904296875 144) (-4717 4490.404296875 144) 2577 1 + 2 1035 (-4704.435546875 4547.814453125 144) (-4704.859375 4548.0795898438 144) 2573 1 + 2 1036 (-4720 4521.453125 144) (-4720.5 4521.453125 144) 2576 1 + 2 1038 (-4680.87109375 4572.716796875 144) (-4680.87109375 4573.216796875 144) 2579 1 + } + 1038 ( 69 0 9249 12 18 171 0 0 ) 9 { + 8 1058 (-4722.3735351563 4619.6435546875 144) (-4721.3129882813 4621.3369140625 64) 2589 103 + 8 1057 (-4756.7392578125 4631.1245117188 144) (-4756.7377929688 4633.1245117188 64) 2588 103 + 8 1055 (-4688.435546875 4598.4306640625 144) (-4687.375 4600.1298828125 64) 2590 103 + 8 1054 (-4672.87109375 4580.705078125 144) (-4670.87109375 4580.7114257813 64) 2591 103 + 8 1043 (-4774.08203125 4628.962890625 144) (-4775.77734375 4630.0229492188 64) 2587 103 + 2 1035 (-4712.435546875 4587.44140625 144) (-4712.7006835938 4587.017578125 144) 2572 1 + 2 1044 (-4746.373046875 4608.642578125 144) (-4746.6381835938 4608.21875 144) 2585 1 + 2 1046 (-4766.08984375 4620.962890625 144) (-4766.3549804688 4620.5390625 144) 2586 1 + 2 1037 (-4680.87109375 4572.716796875 144) (-4680.87109375 4572.216796875 144) 2579 1 + } + 1039 ( 69 0 9261 7 18 172 0 0 ) 4 { + 8 1052 (-4704 4480 144) (-4702 4480 112) 2596 101 + 8 1050 (-4704 4489.4521484375 144) (-4702 4489.4521484375 112) 2595 101 + 2 1040 (-4709 4490.904296875 144) (-4709 4491.404296875 144) 2594 1 + 2 1037 (-4717 4490.904296875 144) (-4717 4491.404296875 144) 2577 1 + } + 1040 ( 69 0 9268 5 18 173 0 0 ) 3 { + 8 1050 (-4704 4498.9013671875 144) (-4702 4498.904296875 112) 2597 101 + 2 1039 (-4709 4490.904296875 144) (-4709 4490.404296875 144) 2594 1 + 2 1037 (-4709 4498.9013671875 144) (-4709.423828125 4499.1665039063 144) 2584 1 + } + 1041 ( 2 0 9273 9 0 0 0 0 ) 0 { + } + 1042 ( 2 0 9282 7 0 0 0 0 ) 0 { + } + 1043 ( 65 0 9289 8 18 174 0 0 ) 1 { + 2 1057 (-4778.3647460938 4631.1245117188 64) (-4778.3647460938 4631.6245117188 64) 2599 1 + } + 1044 ( 65 0 9297 8 18 175 0 0 ) 4 { + 2 1035 (-4736 4589.080078125 144) (-4735.5 4589.080078125 144) 2571 1 + 2 1045 (-4774.5888671875 4586.5458984375 144) (-4775.0126953125 4586.8110351563 144) 2602 1 + 2 1046 (-4762.373046875 4606.107421875 144) (-4762.796875 4606.3725585938 144) 2603 1 + 2 1038 (-4746.373046875 4608.642578125 144) (-4746.1079101563 4609.06640625 144) 2585 1 + } + 1045 ( 65 0 9305 6 18 176 0 0 ) 2 { + 2 1044 (-4774.5888671875 4586.5458984375 144) (-4774.1650390625 4586.2807617188 144) 2602 1 + 2 1046 (-4776 4597.0913085938 144) (-4776 4597.5913085938 144) 2606 1 + } + 1046 ( 69 0 9311 7 18 177 0 0 ) 4 { + 8 1043 (-4779.716796875 4619.9443359375 144) (-4781.4130859375 4621.00390625 64) 2608 103 + 2 1044 (-4762.373046875 4606.107421875 144) (-4761.94921875 4605.8422851563 144) 2603 1 + 2 1045 (-4776 4597.0913085938 144) (-4776 4596.5913085938 144) 2606 1 + 2 1038 (-4766.08984375 4620.962890625 144) (-4765.8247070313 4621.38671875 144) 2586 1 + } + 1047 ( 65 0 9318 9 18 178 0 0 ) 3 { + 2 1048 (-4588 4472 64) (-4588 4472.5 64) 2613 1 + 2 1056 (-4592 4440 64) (-4592 4439.5 64) 2609 1 + 2 1013 (-4528 4456 64) (-4527.5 4456 64) 2515 1 + } + 1048 ( 65 0 9327 11 18 179 0 0 ) 5 { + 2 1047 (-4588 4472 64) (-4588 4471.5 64) 2613 1 + 2 1011 (-4528 4738.2822265625 64) (-4527.5 4738.2822265625 64) 2502 1 + 2 1013 (-4528 4580 64) (-4527.5 4580 64) 2516 1 + 2 1049 (-4648 4574.2587890625 64) (-4648.5 4574.2587890625 64) 2615 1 + 2 1054 (-4588 4692.541015625 64) (-4588.423828125 4692.8061523438 64) 2616 1 + } + 1049 ( 65 0 9338 8 18 180 0 0 ) 2 { + 2 1048 (-4648 4574.2587890625 64) (-4647.5 4574.2587890625 64) 2615 1 + 2 1054 (-4660.435546875 4576.6162109375 64) (-4660.859375 4576.8813476563 64) 2618 1 + } + 1050 ( 65 0 9346 7 18 181 0 0 ) 3 { + 2 1052 (-4684 4488 112) (-4684 4487.5 112) 2624 1 + 2 1053 (-4664 4512 112) (-4663.5 4512 112) 2623 1 + 2 1051 (-4674.9077148438 4536 112) (-4674.9077148438 4536.5 112) 2622 1 + } + 1051 ( 69 0 9353 6 18 182 0 0 ) 3 { + 8 1049 (-4669.91015625 4552 112) (-4669.91015625 4554 64) 2626 102 + 2 1053 (-4664 4544 112) (-4663.5 4544 112) 2627 1 + 2 1050 (-4674.9077148438 4536 112) (-4674.9077148438 4535.5 112) 2622 1 + } + 1052 ( 69 0 9359 6 18 183 0 0 ) 2 { + 2 1053 (-4664 4480 112) (-4663.5 4480 112) 2630 1 + 2 1050 (-4684 4488 112) (-4684 4488.5 112) 2624 1 + } + 1053 ( 69 0 9365 8 18 184 0 0 ) 5 { + 8 1049 (-4656 4552 112) (-4656 4554 64) 2633 102 + 8 1048 (-4648 4512 112) (-4646 4512 64) 2631 102 + 2 1052 (-4664 4480 112) (-4664.5 4480 112) 2630 1 + 2 1050 (-4664 4512 112) (-4664.5 4512 112) 2623 1 + 2 1051 (-4664 4544 112) (-4664.5 4544 112) 2627 1 + } + 1054 ( 65 0 9373 9 18 185 0 0 ) 4 { + 2 1049 (-4660.435546875 4576.6162109375 64) (-4660.01171875 4576.3510742188 64) 2618 1 + 2 1011 (-4528 4846.2822265625 64) (-4527.5 4846.2822265625 64) 2503 1 + 2 1048 (-4588 4692.541015625 64) (-4587.576171875 4692.2758789063 64) 2616 1 + 2 1055 (-4672.87109375 4746.35546875 64) (-4673.37109375 4746.35546875 64) 2635 1 + } + 1055 ( 65 0 9382 7 18 186 0 0 ) 3 { + 2 1054 (-4672.87109375 4746.35546875 64) (-4672.37109375 4746.35546875 64) 2635 1 + 2 1058 (-4704 4619.640625 64) (-4704.5 4619.640625 64) 2637 1 + 2 1057 (-4704 4767.5625 64) (-4704.5 4767.5625 64) 2638 1 + } + 1056 ( 65 0 9389 8 18 187 0 0 ) 3 { + 2 1007 (-4576 4407.8999023438 64) (-4576 4407.5 56) 2641 1 + 2 1047 (-4592 4440 64) (-4592 4440.5 64) 2609 1 + 2 1013 (-4528 4424 64) (-4527.5 4424 64) 2514 1 + } + 1057 ( 65 0 9397 9 18 188 0 0 ) 3 { + 2 1058 (-4722.373046875 4631.1245117188 64) (-4722.373046875 4630.6245117188 64) 2644 1 + 2 1043 (-4778.3647460938 4631.1245117188 64) (-4778.3647460938 4630.6245117188 64) 2599 1 + 2 1055 (-4704 4767.5625 64) (-4703.5 4767.5625 64) 2638 1 + } + 1058 ( 65 0 9406 5 18 189 0 0 ) 2 { + 2 1057 (-4722.373046875 4631.1245117188 64) (-4722.373046875 4631.6245117188 64) 2644 1 + 2 1055 (-4704 4619.640625 64) (-4703.5 4619.640625 64) 2637 1 + } + 1059 ( 65 0 9411 8 48 0 0 0 ) 2 { + 2 1061 (-5056 4324 192) (-5056 4323.5 192) 2649 1 + 2 1062 (-5040 4400 192) (-5040 4400.5 192) 2652 1 + } + 1060 ( 65 0 9419 10 18 190 0 0 ) 5 { + 2 1061 (-4992 4288 192) (-4992 4288.5 192) 2657 1 + 2 1070 (-4944 4120 192) (-4943.5 4120 192) 2660 1 + 2 1071 (-4944 4208 192) (-4943.5 4208 192) 2659 1 + 2 1074 (-5040 4216 192) (-5040.5 4216 192) 2656 1 + 2 1415 (-4992 4096 192) (-4992 4095.5 192) 2661 1 + } + 1061 ( 65 4 9429 8 -49 0 0 0 ) 4 { + 2 1060 (-4992 4288 192) (-4992 4287.5 192) 2657 1 + 2 1074 (-5072 4288 192) (-5072 4287.5 192) 2662 1 + 2 1059 (-5056 4324 192) (-5056 4324.5 192) 2649 1 + 2 1131 (-5136 4288 192) (-5136 4287.5 192) 2663 1 + } + 1062 ( 65 4 9437 7 -50 0 0 0 ) 2 { + 2 1059 (-5040 4400 192) (-5040 4399.5 192) 2652 1 + 2 1096 (-5040 4436 210) (-5040 4436.5 210) 2668 1 + } + 1063 ( 2 0 9444 8 0 0 0 0 ) 0 { + } + 1064 ( 2 0 9452 16 0 0 0 0 ) 0 { + } + 1065 ( 65 0 9468 11 18 191 0 0 ) 4 { + 2 1069 (-4656 4184 192) (-4656.5 4184 192) 2670 1 + 2 1395 (-4648 4096 192) (-4648 4095.5 192) 2669 1 + 2 1104 (-4648 4432 192) (-4648 4432.5 192) 2672 1 + 2 1066 (-4640 4264 192) (-4639.5 4264 192) 2673 1 + } + 1066 ( 69 0 9479 11 18 192 0 0 ) 3 { + 2 1396 (-4632 4096 192) (-4632 4095.5 192) 2677 1 + 2 1065 (-4640 4264 192) (-4640.5 4264 192) 2673 1 + 2 1106 (-4632 4432 192) (-4632 4432.5 192) 2674 1 + } + 1067 ( 2 0 9490 11 0 0 0 0 ) 0 { + } + 1068 ( 2 0 9501 10 0 0 0 0 ) 0 { + } + 1069 ( 65 0 9511 15 18 193 0 0 ) 6 { + 2 1065 (-4656 4184 192) (-4655.5 4184 192) 2670 1 + 2 1395 (-4672 4096 192) (-4672 4095.5 192) 2678 1 + 2 1071 (-4848 4208 192) (-4848.5 4208 192) 2682 1 + 2 1070 (-4848 4120 192) (-4848.5 4120 192) 2681 1 + 2 1415 (-4824 4096 192) (-4824 4095.5 192) 2680 1 + 2 1444 (-4744 4096 192) (-4744 4095.5 192) 2679 1 + } + 1070 ( 65 0 9526 10 18 194 0 0 ) 4 { + 2 1060 (-4944 4120 192) (-4944.5 4120 192) 2660 1 + 2 1071 (-4896 4144 192) (-4896 4144.5 192) 2684 1 + 2 1069 (-4848 4120 192) (-4847.5 4120 192) 2681 1 + 2 1415 (-4896 4096 192) (-4896 4095.5 192) 2685 1 + } + 1071 ( 65 0 9536 7 18 195 0 0 ) 3 { + 2 1060 (-4944 4208 192) (-4944.5 4208 192) 2659 1 + 2 1070 (-4896 4144 192) (-4896 4143.5 192) 2684 1 + 2 1069 (-4848 4208 192) (-4847.5 4208 192) 2682 1 + } + 1072 ( 2 0 9543 15 0 0 0 0 ) 0 { + } + 1073 ( 2 0 9558 14 0 0 0 0 ) 0 { + } + 1074 ( 65 0 9572 7 18 196 0 0 ) 3 { + 2 1060 (-5040 4216 192) (-5039.5 4216 192) 2656 1 + 2 1131 (-5104 4232 192) (-5104.5 4232 192) 2689 1 + 2 1061 (-5072 4288 192) (-5072 4288.5 192) 2662 1 + } + 1075 ( 2 0 9579 25 0 0 0 0 ) 0 { + } + 1076 ( 2 0 9604 18 0 0 0 0 ) 0 { + } + 1077 ( 69 0 9622 7 18 197 0 0 ) 3 { + 8 1044 (-4744 4576 192) (-4744 4578 144) 2694 102 + 8 1035 (-4736 4540 192) (-4734 4540 144) 2691 102 + 2 1112 (-4744 4520 192) (-4744 4519.5 192) 2692 1 + } + 1078 ( 2 0 9629 18 0 0 0 0 ) 0 { + } + 1079 ( 65 0 9647 8 18 198 0 0 ) 3 { + 2 1080 (-4776 4888 256) (-4776 4887.5 256) 2699 1 + 2 1085 (-4312 4888 256) (-4312 4887.5 256) 2697 1 + 2 1081 (-4544 4888 256) (-4544 4887.5 256) 2698 1 + } + 1080 ( 65 0 9655 10 18 199 0 0 ) 4 { + 2 1079 (-4776 4888 256) (-4776 4888.5 256) 2699 1 + 2 1081 (-4768 4880 256) (-4767.5 4880 256) 2701 1 + 2 1090 (-4784 4672 256) (-4784.5 4672 256) 2705 1 + 2 1083 (-4768 4656 256) (-4767.5 4656 256) 2702 1 + } + 1081 ( 69 0 9665 10 18 200 0 0 ) 5 { + 2 1080 (-4768 4880 256) (-4768.5 4880 256) 2701 1 + 2 1083 (-4760 4872 256) (-4760 4871.5 256) 2712 1 + 2 1079 (-4544 4888 256) (-4544 4888.5 256) 2698 1 + 2 1086 (-4328 4872 256) (-4328 4871.5 256) 2708 1 + 2 1085 (-4320 4880 256) (-4319.5 4880 256) 2707 1 + } + 1082 ( 2 0 9675 14 0 0 0 0 ) 0 { + } + 1083 ( 69 0 9689 7 18 201 0 0 ) 6 { + 8 1113 (-4752 4464 256) (-4750 4464 240) 2716 100 + 8 1112 (-4752 4512 256) (-4750 4512 192) 2714 103 + 8 1111 (-4752 4496 256) (-4750 4496 192) 2715 103 + 8 1077 (-4752 4548 256) (-4750 4548 192) 2713 103 + 2 1081 (-4760 4872 256) (-4760 4872.5 256) 2712 1 + 2 1080 (-4768 4656 256) (-4768.5 4656 256) 2702 1 + } + 1084 ( 2 0 9696 10 0 0 0 0 ) 0 { + } + 1085 ( 65 0 9706 8 18 202 0 0 ) 4 { + 2 1079 (-4312 4888 256) (-4312 4888.5 256) 2697 1 + 2 1081 (-4320 4880 256) (-4320.5 4880 256) 2707 1 + 2 1086 (-4320 4716 256) (-4320.5 4716 256) 2721 1 + 2 1095 (-4304 4672 256) (-4303.5 4672 256) 2719 1 + } + 1086 ( 69 0 9714 6 18 203 0 0 ) 4 { + 8 1030 (-4336 4588 256) (-4338 4588 48) 2723 109 + 8 1021 (-4336 4664 256) (-4338 4664 96) 2723 107 + 2 1081 (-4328 4872 256) (-4328 4872.5 256) 2708 1 + 2 1085 (-4320 4716 256) (-4319.5 4716 256) 2721 1 + } + 1087 ( 2 0 9720 9 0 0 0 0 ) 0 { + } + 1088 ( 2 0 9729 12 0 0 0 0 ) 0 { + } + 1089 ( 65 0 9741 11 18 204 0 0 ) 2 { + 2 1091 (-4900 4672 256) (-4899.5 4672 256) 2728 1 + 2 1093 (-5040 4560 256) (-5040 4559.5 256) 2725 1 + } + 1090 ( 65 0 9752 10 18 205 0 0 ) 2 { + 2 1091 (-4864 4672 256) (-4864.5 4672 256) 2730 1 + 2 1080 (-4784 4672 256) (-4783.5 4672 256) 2705 1 + } + 1091 ( 65 0 9762 6 18 206 0 0 ) 2 { + 2 1090 (-4864 4672 256) (-4863.5 4672 256) 2730 1 + 2 1089 (-4900 4672 256) (-4900.5 4672 256) 2728 1 + } + 1092 ( 65 0 9768 7 49 0 0 0 ) 2 { + 2 1094 (-5040 4524 254) (-5040 4524.5 254) 2734 1 + 2 1096 (-5040 4520 252) (-5040 4519.5 252) 2736 1 + } + 1093 ( 65 0 9775 6 18 207 0 0 ) 2 { + 2 1089 (-5040 4560 256) (-5040 4560.5 256) 2725 1 + 2 1094 (-5040 4528 256) (-5040 4527.5 256) 2740 1 + } + 1094 ( 65 4 9781 6 -51 0 0 0 ) 2 { + 2 1093 (-5040 4528 256) (-5040 4528.5 256) 2740 1 + 2 1092 (-5040 4524 254) (-5040 4523.5 254) 2734 1 + } + 1095 ( 65 4 9787 6 -52 0 0 0 ) 2 { + 2 1085 (-4304 4672 256) (-4304.5 4672 256) 2719 1 + 2 1143 (-4268 4672 256) (-4267.5 4672 256) 2744 1 + } + 1096 ( 65 0 9793 13 49 1 0 0 ) 2 { + 2 1092 (-5040 4520 252) (-5040 4520.5 252) 2736 1 + 2 1062 (-5040 4436 210) (-5040 4435.5 210) 2668 1 + } + 1097 ( 2 0 9806 11 0 0 0 0 ) 0 { + } + 1098 ( 2 0 9817 6 0 0 0 0 ) 0 { + } + 1099 ( 2 0 9823 5 0 0 0 0 ) 0 { + } + 1100 ( 0 0 9828 7 0 0 0 0 ) 0 { + } + 1101 ( 2 0 9835 8 0 0 0 0 ) 0 { + } + 1102 ( 2 0 9843 12 0 0 0 0 ) 0 { + } + 1103 ( 2 0 9855 14 0 0 0 0 ) 0 { + } + 1104 ( 65 0 9869 7 18 208 0 0 ) 4 { + 2 1106 (-4640 4444 192) (-4639.5 4444 192) 2753 1 + 2 1105 (-4648 4456 192) (-4648 4456.5 192) 2752 1 + 2 1108 (-4656 4448 192) (-4656.5 4448 192) 2751 1 + 2 1065 (-4648 4432 192) (-4648 4431.5 192) 2672 1 + } + 1105 ( 69 0 9876 9 18 209 0 0 ) 8 { + 8 1053 (-4660 4472 192) (-4660 4474 112) 2757 103 + 8 1052 (-4684 4472 192) (-4684 4474 112) 2757 103 + 8 1048 (-4644 4472.0048828125 192) (-4644.0014648438 4474.0048828125 64) 2758 106 + 8 1039 (-4712 4472 192) (-4712 4474 144) 2757 102 + 2 1106 (-4640 4464.0048828125 192) (-4639.5 4464.0048828125 192) 2759 1 + 2 1104 (-4648 4456 192) (-4648 4455.5 192) 2752 1 + 2 1107 (-4728 4472 192) (-4728 4472.5 192) 2756 1 + 2 1108 (-4696 4456 192) (-4696 4455.5 192) 2754 1 + } + 1106 ( 69 0 9885 7 18 210 0 0 ) 4 { + 8 1048 (-4632 4472.0102539063 192) (-4632 4474.0102539063 64) 2760 106 + 2 1104 (-4640 4444 192) (-4640.5 4444 192) 2753 1 + 2 1105 (-4640 4464.0048828125 192) (-4640.5 4464.0048828125 192) 2759 1 + 2 1066 (-4632 4432 192) (-4632 4431.5 192) 2674 1 + } + 1107 ( 69 0 9892 8 18 211 0 0 ) 6 { + 8 1039 (-4720 4481.4521484375 192) (-4718 4481.4521484375 144) 2766 102 + 8 1037 (-4720 4505.4521484375 192) (-4718 4505.4521484375 144) 2766 102 + 8 1035 (-4728.908203125 4520 192) (-4728.908203125 4522 144) 2765 102 + 2 1105 (-4728 4472 192) (-4728 4471.5 192) 2756 1 + 2 1112 (-4736 4512 192) (-4736.5 4512 192) 2764 1 + 2 1111 (-4736 4496 192) (-4736.5 4496 192) 2763 1 + } + 1108 ( 65 0 9900 6 18 212 0 0 ) 2 { + 2 1104 (-4656 4448 192) (-4655.5 4448 192) 2751 1 + 2 1105 (-4696 4456 192) (-4696 4456.5 192) 2754 1 + } + 1109 ( 2 0 9906 14 0 0 0 0 ) 0 { + } + 1110 ( 2 0 9920 11 0 0 0 0 ) 0 { + } + 1111 ( 65 0 9931 8 18 213 0 0 ) 2 { + 2 1107 (-4736 4496 192) (-4735.5 4496 192) 2763 1 + 2 1112 (-4744 4504 192) (-4744 4504.5 192) 2770 1 + } + 1112 ( 69 0 9939 8 18 214 0 0 ) 3 { + 2 1077 (-4744 4520 192) (-4744 4520.5 192) 2692 1 + 2 1107 (-4736 4512 192) (-4735.5 4512 192) 2764 1 + 2 1111 (-4744 4504 192) (-4744 4503.5 192) 2770 1 + } + 1113 ( 69 0 9947 6 18 215 0 0 ) 4 { + 8 1111 (-4744 4488 240) (-4744 4490 192) 2774 102 + 8 1108 (-4736 4448 240) (-4734 4448 192) 2777 102 + 8 1107 (-4736 4480 240) (-4734 4480 192) 2775 102 + 8 1105 (-4736 4464 240) (-4734 4464 192) 2776 102 + } + 1114 ( 65 0 9953 6 18 216 0 0 ) 4 { + 2 1161 (-5088.1000976563 4120 432) (-5088.5 4120 432) 2781 0 + 2 1115 (-5056 4120 400) (-5055.5 4120 400) 2783 1 + 2 1442 (-5064 4096 408) (-5064 4095.5 408) 2779 1 + 2 1402 (-5080 4096 424) (-5080 4095.5 424) 2780 1 + } + 1115 ( 69 0 9959 6 18 217 0 0 ) 3 { + 8 1060 (-5040 4120 384) (-5038 4120 192) 2784 109 + 2 1114 (-5056 4120 400) (-5056.5 4120 400) 2783 1 + 2 1443 (-5048 4096 392) (-5048 4095.5 392) 2785 1 + } + 1116 ( 2 0 9965 12 0 0 0 0 ) 0 { + } + 1117 ( 2 0 9977 15 0 0 0 0 ) 0 { + } + 1118 ( 2 0 9992 5 0 0 0 0 ) 0 { + } + 1119 ( 2 0 9997 5 0 0 0 0 ) 0 { + } + 1120 ( 2 0 10002 8 0 0 0 0 ) 0 { + } + 1121 ( 65 0 10010 6 42 3 0 0 ) 2 { + 2 1122 (-4608 4920 384) (-4608 4919.5 384) 2788 1 + 2 800 (-4608 4940 384) (-4608 4940.5 384) 1972 1 + } + 1122 ( 69 4 10016 6 -53 0 0 0 ) 2 { + 8 1079 (-4608 4904 384) (-4608 4902 256) 2791 106 + 2 1121 (-4608 4920 384) (-4608 4920.5 384) 2788 1 + } + 1123 ( 2 0 10022 13 0 0 0 0 ) 0 { + } + 1124 ( 2 0 10035 11 0 0 0 0 ) 0 { + } + 1125 ( 2 0 10046 9 0 0 0 0 ) 0 { + } + 1126 ( 2 0 10055 18 0 0 0 0 ) 0 { + } + 1127 ( 2 0 10073 9 0 0 0 0 ) 0 { + } + 1128 ( 2 0 10082 6 0 0 0 0 ) 0 { + } + 1129 ( 2 0 10088 6 0 0 0 0 ) 0 { + } + 1130 ( 0 0 10094 7 0 0 0 0 ) 0 { + } + 1131 ( 65 0 10101 6 18 218 0 0 ) 2 { + 2 1074 (-5104 4232 192) (-5103.5 4232 192) 2689 1 + 2 1061 (-5136 4288 192) (-5136 4288.5 192) 2663 1 + } + 1132 ( 65 0 10107 7 11 8 0 0 ) 3 { + 2 171 (-4096 4846 256) (-4095.5 4846 256) 461 1 + 2 1143 (-4120 4784 256) (-4120 4783.5 256) 2795 1 + 2 170 (-4096 4814 256) (-4095.5 4814 256) 454 1 + } + 1133 ( 65 0 10114 11 18 219 0 0 ) 6 { + 2 457 (-4095.8999023438 4224 0) (-4095.5 4224 8) 2801 0 + 2 1139 (-4104 4144 0) (-4104 4143.5 0) 2802 1 + 2 1137 (-4128 4144 0) (-4128 4143.5 0) 2803 1 + 2 1141 (-4144 4224 0) (-4144.5 4224 0) 2798 1 + 2 1134 (-4128 4304 0) (-4128 4304.5 0) 2799 1 + 2 1136 (-4104 4304 0) (-4104 4304.5 0) 2800 1 + } + 1134 ( 65 0 10125 11 18 220 0 0 ) 5 { + 2 1133 (-4128 4304 0) (-4128 4303.5 0) 2799 1 + 2 1141 (-4144 4312 0) (-4144.5 4312 0) 2804 1 + 2 1140 (-4128 4368 0) (-4128 4368.5 0) 2807 1 + 2 1135 (-4112 4344 0) (-4111.5 4344 0) 2808 1 + 2 1136 (-4112 4312 0) (-4111.5 4312 0) 2809 1 + } + 1135 ( 65 0 10136 9 18 221 0 0 ) 4 { + 2 1134 (-4112 4344 0) (-4112.5 4344 0) 2808 1 + 2 456 (-4096 4344 0) (-4095.5 4344 0) 1184 1 + 2 1140 (-4104 4368 0) (-4104 4368.5 0) 2810 1 + 2 1136 (-4104 4320 0) (-4104 4319.5 0) 2811 1 + } + 1136 ( 69 0 10145 9 18 222 0 0 ) 4 { + 2 458 (-4095.8999023438 4312 0) (-4095.5 4312 8) 2812 0 + 2 1134 (-4112 4312 0) (-4112.5 4312 0) 2809 1 + 2 1133 (-4104 4304 0) (-4104 4303.5 0) 2800 1 + 2 1135 (-4104 4320 0) (-4104 4320.5 0) 2811 1 + } + 1137 ( 65 0 10154 7 18 223 0 0 ) 5 { + 2 1141 (-4144 4120 0) (-4144.5 4120 0) 2814 1 + 2 1384 (-4128 4096 0) (-4128 4095.5 0) 2813 1 + 2 1138 (-4112 4112 0) (-4111.5 4112 0) 2816 1 + 2 1139 (-4112 4136 0) (-4111.5 4136 0) 2815 1 + 2 1133 (-4128 4144 0) (-4128 4144.5 0) 2803 1 + } + 1138 ( 65 0 10161 8 18 224 0 0 ) 4 { + 2 1137 (-4112 4112 0) (-4112.5 4112 0) 2816 1 + 2 1384 (-4104 4096 0) (-4104 4095.5 0) 2817 1 + 2 413 (-4096 4112 0) (-4095.5 4112 0) 1074 1 + 2 1139 (-4104 4128 0) (-4104 4128.5 0) 2818 1 + } + 1139 ( 69 0 10169 9 18 225 0 0 ) 4 { + 2 414 (-4095.8999023438 4136 0) (-4095.5 4136 8) 2819 0 + 2 1137 (-4112 4136 0) (-4112.5 4136 0) 2815 1 + 2 1138 (-4104 4128 0) (-4104 4127.5 0) 2818 1 + 2 1133 (-4104 4144 0) (-4104 4144.5 0) 2802 1 + } + 1140 ( 65 0 10178 9 18 226 0 0 ) 3 { + 2 456 (-4096 4384 0) (-4095.5 4384 0) 1185 1 + 2 1134 (-4128 4368 0) (-4128 4367.5 0) 2807 1 + 2 1135 (-4104 4368 0) (-4104 4367.5 0) 2810 1 + } + 1141 ( 65 0 10187 17 18 227 0 0 ) 7 { + 2 1002 (-4272 4308 0) (-4272.5 4308 0) 2491 1 + 2 1384 (-4200 4096 0) (-4200 4095.5 0) 2822 1 + 2 1393 (-4264 4096 0) (-4264 4095.5 0) 2823 1 + 2 1137 (-4144 4120 0) (-4143.5 4120 0) 2814 1 + 2 1133 (-4144 4224 0) (-4143.5 4224 0) 2798 1 + 2 1134 (-4144 4312 0) (-4143.5 4312 0) 2804 1 + 2 968 (-4272 4196 0) (-4272.5 4196 0) 2383 1 + } + 1142 ( 0 0 10204 8 0 0 0 0 ) 0 { + } + 1143 ( 65 0 10212 10 11 9 0 0 ) 5 { + 2 473 (-4096 4752 256) (-4095.5 4752 256) 1217 1 + 2 439 (-4096 4640 256) (-4095.5 4640 256) 1148 1 + 2 1145 (-4120 4560 256) (-4120 4559.5 256) 2825 1 + 2 1095 (-4268 4672 256) (-4268.5 4672 256) 2744 1 + 2 1132 (-4120 4784 256) (-4120 4784.5 256) 2795 1 + } + 1144 ( 2 0 10222 8 0 0 0 0 ) 0 { + } + 1145 ( 65 0 10230 8 11 10 0 0 ) 4 { + 2 1143 (-4120 4560 256) (-4120 4560.5 256) 2825 1 + 2 440 (-4096 4466 256) (-4095.5 4466 256) 1152 1 + 2 439 (-4096 4528 256) (-4095.5 4528 256) 1147 1 + 2 441 (-4120 4436 256) (-4120 4435.5 256) 1158 1 + } + 1146 ( 65 0 10238 6 18 228 0 0 ) 3 { + 2 431 (-4096 4392 256) (-4095.5 4392 256) 1118 1 + 2 1147 (-4120 4384 256) (-4120 4383.5 256) 2830 1 + 2 441 (-4120 4400 256) (-4120 4400.5 256) 1156 1 + } + 1147 ( 69 0 10244 6 18 229 0 0 ) 4 { + 8 1135 (-4104 4368 256) (-4104 4366 0) 2832 112 + 8 1134 (-4128 4368 256) (-4128 4366 0) 2832 112 + 2 432 (-4096 4376 256) (-4095.5 4376 256) 1127 1 + 2 1146 (-4120 4384 256) (-4120 4384.5 256) 2830 1 + } + 1148 ( 2 0 10250 18 0 0 0 0 ) 0 { + } + 1149 ( 2 0 10268 12 0 0 0 0 ) 0 { + } + 1150 ( 2 0 10280 5 0 0 0 0 ) 0 { + } + 1151 ( 2 0 10285 9 0 0 0 0 ) 0 { + } + 1152 ( 2 0 10294 7 0 0 0 0 ) 0 { + } + 1153 ( 2 0 10301 23 0 0 0 0 ) 0 { + } + 1154 ( 65 0 10324 6 45 3 0 0 ) 2 { + 2 187 (-4116 4936 64) (-4115.5 4936 64) 520 1 + 2 843 (-4178 4944 64) (-4178 4944.5 64) 2069 1 + } + 1155 ( 65 0 10330 7 12 8 0 0 ) 1 { + 2 801 (-4160 4960 456) (-4160 4960.5 456) 1974 1 + } + 1156 ( 2 0 10337 13 0 0 0 0 ) 0 { + } + 1157 ( 2 0 10350 12 0 0 0 0 ) 0 { + } + 1158 ( 2 0 10362 7 0 0 0 0 ) 0 { + } + 1159 ( 2 0 10369 20 0 0 0 0 ) 0 { + } + 1160 ( 2 0 10389 20 0 0 0 0 ) 0 { + } + 1161 ( 65 0 10409 7 18 230 0 0 ) 4 { + 2 1409 (-5104.1000976563 4056 448) (-5104.5 4056 448) 2840 0 + 2 1167 (-5104.1000976563 4104 448) (-5104.5 4104 448) 2841 0 + 2 1114 (-5087.8999023438 4120 432) (-5087.5 4120 432) 2781 0 + 2 1402 (-5088 4056 432) (-5087.5 4056 432) 2838 1 + } + 1162 ( 2 0 10416 10 0 0 0 0 ) 0 { + } + 1163 ( 2 0 10426 22 0 0 0 0 ) 0 { + } + 1164 ( 2 0 10448 9 0 0 0 0 ) 0 { + } + 1165 ( 2 0 10457 7 0 0 0 0 ) 0 { + } + 1166 ( 2 0 10464 13 0 0 0 0 ) 0 { + } + 1167 ( 65 0 10477 9 18 231 0 0 ) 2 { + 2 1161 (-5103.8999023438 4104 448) (-5103.5 4104 448) 2841 0 + 2 1409 (-5136 4096 448) (-5136 4095.5 448) 2846 1 + } + 1168 ( 2 0 10486 11 0 0 0 0 ) 0 { + } + 1169 ( 65 0 10497 8 18 232 0 0 ) 4 { + 2 1196 (-4448 4904.07421875 640) (-4448 4904.4741210938 648) 2847 0 + 2 1171 (-4448 4896 640) (-4448 4895.5 640) 2849 1 + 2 1172 (-4416 4899.9873046875 640) (-4415.5 4899.9873046875 640) 2848 1 + 2 1170 (-4480 4899.9873046875 640) (-4480.5 4899.9873046875 640) 2850 1 + } + 1170 ( 69 0 10505 8 18 233 0 0 ) 3 { + 2 1199 (-4488 4904.07421875 640) (-4488 4904.4741210938 648) 2851 0 + 2 1171 (-4488 4896 640) (-4488 4895.5 640) 2852 1 + 2 1169 (-4480 4899.9873046875 640) (-4479.5 4899.9873046875 640) 2850 1 + } + 1171 ( 69 0 10513 7 18 234 0 0 ) 3 { + 2 1172 (-4416 4888 640) (-4415.5 4888 640) 2854 1 + 2 1169 (-4448 4896 640) (-4448 4896.5 640) 2849 1 + 2 1170 (-4488 4896 640) (-4488 4896.5 640) 2852 1 + } + 1172 ( 69 0 10520 9 18 235 0 0 ) 3 { + 2 1202 (-4408 4904.07421875 640) (-4408 4904.4741210938 648) 2857 0 + 2 1171 (-4416 4888 640) (-4416.5 4888 640) 2854 1 + 2 1169 (-4416 4899.9873046875 640) (-4416.5 4899.9873046875 640) 2848 1 + } + 1173 ( 2 0 10529 13 0 0 0 0 ) 0 { + } + 1174 ( 65 0 10542 8 18 236 0 0 ) 4 { + 2 1198 (-4768 4904.07421875 640) (-4768 4904.4741210938 648) 2860 0 + 2 1176 (-4800 4899.9873046875 640) (-4800.5 4899.9873046875 640) 2863 1 + 2 1177 (-4768 4896 640) (-4768 4895.5 640) 2862 1 + 2 1175 (-4736 4899.9873046875 640) (-4735.5 4899.9873046875 640) 2861 1 + } + 1175 ( 69 0 10550 8 18 237 0 0 ) 3 { + 2 1199 (-4728 4904.07421875 640) (-4728 4904.4741210938 648) 2864 0 + 2 1177 (-4728 4896 640) (-4728 4895.5 640) 2866 1 + 2 1174 (-4736 4899.9873046875 640) (-4736.5 4899.9873046875 640) 2861 1 + } + 1176 ( 69 0 10558 8 18 238 0 0 ) 4 { + 2 1200 (-4808 4904.07421875 640) (-4808 4904.4741210938 648) 2868 0 + 8 1178 (-4816 4900.9873046875 640) (-4818 4900.9873046875 512) 2867 106 + 2 1177 (-4808 4896 640) (-4808 4895.5 640) 2869 1 + 2 1174 (-4800 4899.9873046875 640) (-4799.5 4899.9873046875 640) 2863 1 + } + 1177 ( 69 0 10566 8 18 239 0 0 ) 6 { + 8 1183 (-4792 4880 640) (-4792 4878 512) 2871 106 + 8 1181 (-4808 4880 640) (-4808 4878 512) 2872 106 + 8 1178 (-4816 4888 640) (-4818 4888 512) 2873 106 + 2 1176 (-4808 4896 640) (-4808 4896.5 640) 2869 1 + 2 1174 (-4768 4896 640) (-4768 4896.5 640) 2862 1 + 2 1175 (-4728 4896 640) (-4728 4896.5 640) 2866 1 + } + 1178 ( 65 0 10574 13 18 240 0 0 ) 2 { + 2 1189 (-4816 4889 512) (-4815.5 4889 512) 2879 1 + 2 1181 (-4960 4880 512) (-4960 4879.5 512) 2875 1 + } + 1179 ( 2 0 10587 29 0 0 0 0 ) 0 { + } + 1180 ( 2 0 10616 14 0 0 0 0 ) 0 { + } + 1181 ( 65 0 10630 11 18 241 0 0 ) 7 { + 2 1189 (-4808 4880 512) (-4808 4880.5 512) 2885 1 + 2 1183 (-4800 4840 512) (-4799.5 4840 512) 2886 1 + 2 1185 (-4936 4800 512) (-4936 4799.5 512) 2882 1 + 2 1184 (-4896 4800 512) (-4896 4799.5 512) 2881 1 + 2 1178 (-4960 4880 512) (-4960 4880.5 512) 2875 1 + 2 1187 (-5024 4800 512) (-5024 4799.5 512) 2883 1 + 2 1182 (-4832 4800 512) (-4832 4799.5 512) 2880 1 + } + 1182 ( 69 0 10641 7 18 242 0 0 ) 5 { + 8 1090 (-4824 4784 512) (-4824 4782 256) 2887 112 + 2 1183 (-4800 4792 512) (-4799.5 4792 512) 2890 1 + 2 1181 (-4832 4800 512) (-4832 4800.5 512) 2880 1 + 2 1184 (-4864 4792 512) (-4864.5 4792 512) 2889 1 + 2 1186 (-4856 4784 512) (-4856 4783.5 512) 2888 1 + } + 1183 ( 69 0 10648 8 18 243 0 0 ) 5 { + 8 1090 (-4792 4784 512) (-4792 4782 256) 2893 112 + 8 1080 (-4784 4832 512) (-4782 4832 256) 2892 112 + 2 1190 (-4792 4880 512) (-4792 4880.5 512) 2891 1 + 2 1181 (-4800 4840 512) (-4800.5 4840 512) 2886 1 + 2 1182 (-4800 4792 512) (-4800.5 4792 512) 2890 1 + } + 1184 ( 65 0 10656 7 18 244 0 0 ) 5 { + 2 1186 (-4864 4672 512) (-4863.5 4672 512) 2896 1 + 2 1185 (-4928 4680 512) (-4928.5 4680 512) 2895 1 + 2 1259 (-4896 4560 512) (-4896 4559.5 512) 2894 1 + 2 1181 (-4896 4800 512) (-4896 4800.5 512) 2881 1 + 2 1182 (-4864 4792 512) (-4863.5 4792 512) 2889 1 + } + 1185 ( 69 0 10663 7 18 245 0 0 ) 4 { + 2 1184 (-4928 4680 512) (-4927.5 4680 512) 2895 1 + 2 1187 (-4944 4792 512) (-4944.5 4792 512) 2899 1 + 2 1181 (-4936 4800 512) (-4936 4800.5 512) 2882 1 + 2 1261 (-4936 4560 512) (-4936 4559.5 512) 2897 1 + } + 1186 ( 69 0 10670 6 18 246 0 0 ) 3 { + 2 1184 (-4864 4672 512) (-4864.5 4672 512) 2896 1 + 2 1182 (-4856 4784 512) (-4856 4784.5 512) 2888 1 + 2 1263 (-4856 4560 512) (-4856 4559.5 512) 2901 1 + } + 1187 ( 69 0 10676 6 18 247 0 0 ) 3 { + 8 1089 (-5024 4784 512) (-5024 4782 256) 2903 112 + 2 1185 (-4944 4792 512) (-4943.5 4792 512) 2899 1 + 2 1181 (-5024 4800 512) (-5024 4800.5 512) 2883 1 + } + 1188 ( 2 0 10682 9 0 0 0 0 ) 0 { + } + 1189 ( 65 0 10691 5 18 248 0 0 ) 3 { + 2 1190 (-4800 4889 512) (-4799.5 4889 512) 2905 1 + 2 1181 (-4808 4880 512) (-4808 4879.5 512) 2885 1 + 2 1178 (-4816 4889 512) (-4816.5 4889 512) 2879 1 + } + 1190 ( 69 0 10696 5 18 249 0 0 ) 4 { + 8 1080 (-4784 4884 512) (-4782 4884 256) 2906 112 + 8 1079 (-4784 4893 512) (-4782 4893 256) 2906 112 + 2 1183 (-4792 4880 512) (-4792 4879.5 512) 2891 1 + 2 1189 (-4800 4889 512) (-4800.5 4889 512) 2905 1 + } + 1191 ( 65 0 10701 11 18 250 0 0 ) 1 { + 2 1192 (-4288.029296875 4731.9873046875 591.9876708984) (-4288.529296875 4731.9873046875 591.9876708984) 2911 1 + } + 1192 ( 69 0 10712 11 18 251 0 0 ) 2 { + 8 1085 (-4304.0146484375 4832 575.9876708984) (-4306.0146484375 4832 256) 2912 115 + 2 1191 (-4288.029296875 4731.9873046875 591.9876708984) (-4287.529296875 4731.9873046875 591.9876708984) 2911 1 + } + 1193 ( 2 0 10723 8 0 0 0 0 ) 0 { + } + 1194 ( 69 0 10731 6 18 252 0 0 ) 2 { + 8 1201 (-4272 4919.9741210938 688) (-4274 4919.9741210938 664) 2918 101 + 8 1191 (-4272 4731.9873046875 688) (-4274 4731.9873046875 608.0297851563) 2917 103 + } + 1195 ( 2 0 10737 24 0 0 0 0 ) 0 { + } + 1196 ( 65 0 10761 7 18 253 0 0 ) 5 { + 2 1169 (-4448 4903.8740234375 648) (-4448 4903.4741210938 640) 2924 1 + 2 1201 (-4416 4927.9873046875 672.0128173828) (-4415.5 4927.9873046875 672.0128173828) 2922 1 + 2 1197 (-4480 4927.9873046875 672.0128173828) (-4480.5 4927.9873046875 672.0128173828) 2926 1 + 2 1199 (-4480 4911.9741210938 656) (-4480.5 4911.9741210938 656) 2925 1 + 2 1202 (-4416 4911.9741210938 656) (-4415.5 4911.9741210938 656) 2923 1 + } + 1197 ( 65 0 10768 7 18 254 0 0 ) 4 { + 2 1196 (-4480 4927.9873046875 672.0128173828) (-4479.5 4927.9873046875 672.0128173828) 2926 1 + 2 1198 (-4768 4919.9741210938 664) (-4768 4919.4741210938 664) 2930 1 + 2 1199 (-4608 4919.9741210938 664) (-4608 4919.4741210938 664) 2929 1 + 2 1200 (-4920 4919.9741210938 664) (-4920 4919.4741210938 664) 2931 1 + } + 1198 ( 65 0 10775 6 18 255 0 0 ) 4 { + 2 1174 (-4768 4903.8740234375 648) (-4768 4903.4741210938 640) 2933 1 + 2 1197 (-4768 4919.9741210938 664) (-4768 4920.4741210938 664) 2930 1 + 2 1199 (-4736 4911.9741210938 656) (-4735.5 4911.9741210938 656) 2932 1 + 2 1200 (-4800 4911.9741210938 656) (-4800.5 4911.9741210938 656) 2934 1 + } + 1199 ( 69 0 10781 8 18 256 0 0 ) 6 { + 2 1175 (-4728 4903.8740234375 648) (-4728 4903.4741210938 640) 2937 1 + 2 1170 (-4488 4903.8740234375 648) (-4488 4903.4741210938 640) 2935 1 + 8 1079 (-4608 4903.9741210938 648) (-4608 4901.9741210938 256) 2936 118 + 2 1198 (-4736 4911.9741210938 656) (-4736.5 4911.9741210938 656) 2932 1 + 2 1196 (-4480 4911.9741210938 656) (-4479.5 4911.9741210938 656) 2925 1 + 2 1197 (-4608 4919.9741210938 664) (-4608 4920.4741210938 664) 2929 1 + } + 1200 ( 69 0 10789 7 18 257 0 0 ) 4 { + 8 1178 (-4928 4903.9741210938 648) (-4928 4901.9741210938 512) 2939 106 + 2 1176 (-4808 4903.8740234375 648) (-4808 4903.4741210938 640) 2938 1 + 2 1198 (-4800 4911.9741210938 656) (-4799.5 4911.9741210938 656) 2934 1 + 2 1197 (-4920 4919.9741210938 664) (-4920 4920.4741210938 664) 2931 1 + } + 1201 ( 65 0 10796 5 18 258 0 0 ) 3 { + 2 1194 (-4271.8999023438 4936 680.0256958008) (-4271.5 4936 688) 2942 0 + 2 1196 (-4416 4927.9873046875 672.0128173828) (-4416.5 4927.9873046875 672.0128173828) 2922 1 + 2 1202 (-4344 4919.9741210938 664) (-4344 4919.4741210938 664) 2943 1 + } + 1202 ( 69 0 10801 9 18 259 0 0 ) 5 { + 8 1191 (-4288.029296875 4903.9741210938 648) (-4288.029296875 4901.9741210938 591.9876708984) 2944 102 + 2 1172 (-4408 4903.8740234375 648) (-4408 4903.4741210938 640) 2947 1 + 8 1079 (-4352.0146484375 4903.9741210938 648) (-4352 4901.9873046875 256) 2946 118 + 2 1196 (-4416 4911.9741210938 656) (-4416.5 4911.9741210938 656) 2923 1 + 2 1201 (-4344 4919.9741210938 664) (-4344 4920.4741210938 664) 2943 1 + } + 1203 ( 2 0 10810 9 0 0 0 0 ) 0 { + } + 1204 ( 2 0 10819 6 0 0 0 0 ) 0 { + } + 1205 ( 65 0 10825 10 18 260 0 0 ) 3 { + 2 381 (-4120 4431.8999023438 608) (-4120 4431.5 608) 969 0 + 2 388 (-4096 4488 608) (-4095.5 4488 608) 990 1 + 2 368 (-4096 4456 608) (-4095.5 4456 608) 934 1 + } + 1206 ( 2 0 10835 19 0 0 0 0 ) 0 { + } + 1207 ( 2 0 10854 9 0 0 0 0 ) 0 { + } + 1208 ( 65 0 10863 5 18 261 0 0 ) 2 { + 2 392 (-4096 4520 696) (-4095.5 4520 696) 1007 1 + 2 1209 (-4120 4512 688) (-4120 4511.5 688) 2953 1 + } + 1209 ( 69 0 10868 6 18 262 0 0 ) 3 { + 8 1205 (-4120 4496 672) (-4120 4494 608) 2954 103 + 2 393 (-4096 4504 680) (-4095.5 4504 680) 1010 1 + 2 1208 (-4120 4512 688) (-4120 4512.5 688) 2953 1 + } + 1210 ( 2 0 10874 20 0 0 0 0 ) 0 { + } + 1211 ( 65 0 10894 8 18 263 0 0 ) 2 { + 2 1215 (-5071.8999023438 4216 640) (-5071.5 4216 640) 2959 0 + 2 1212 (-5120 4160 640) (-5120 4159.5 640) 2960 1 + } + 1212 ( 69 0 10902 6 18 264 0 0 ) 5 { + 8 1223 (-5112 4144 640) (-5112 4142 512) 2963 106 + 8 1221 (-5144 4144 640) (-5144 4142 512) 2963 106 + 2 1216 (-5071.8999023438 4152 640) (-5071.5 4152 640) 2962 0 + 8 1114 (-5072 4144 640) (-5072 4142 416) 2963 110 + 2 1211 (-5120 4160 640) (-5120 4160.5 640) 2960 1 + } + 1213 ( 2 0 10908 29 0 0 0 0 ) 0 { + } + 1214 ( 2 0 10937 10 0 0 0 0 ) 0 { + } + 1215 ( 65 0 10947 7 18 265 0 0 ) 4 { + 2 1211 (-5072.1000976563 4216 640) (-5072.5 4216 640) 2959 0 + 2 1217 (-4880 4176 576) (-4879.646484375 4175.646484375 576) 2969 1 + 2 1218 (-4864 4232 576) (-4863.5 4232 576) 2968 1 + 2 1216 (-5024 4160 608) (-5024 4159.5 608) 2965 1 + } + 1216 ( 69 0 10954 6 18 266 0 0 ) 5 { + 2 1212 (-5072.1000976563 4152 640) (-5072.5 4152 640) 2962 0 + 8 1114 (-5056 4144 629.3333129883) (-5056 4142 400) 2974 110 + 8 1070 (-4920 4144 576) (-4920 4142 192) 2972 118 + 2 1215 (-4936 4160 576) (-4936 4160.5 576) 2970 1 + 2 1217 (-4896 4152 576) (-4895.5 4152 576) 2971 1 + } + 1217 ( 69 0 10960 7 18 267 0 0 ) 4 { + 8 1070 (-4888 4144 576) (-4888 4142 192) 2977 118 + 2 1218 (-4864 4176 576) (-4863.5 4176 576) 2975 1 + 2 1215 (-4880 4176 576) (-4880.353515625 4176.353515625 576) 2969 1 + 2 1216 (-4896 4152 576) (-4896.5 4152 576) 2971 1 + } + 1218 ( 69 0 10967 7 18 268 0 0 ) 3 { + 8 1069 (-4848 4224 576) (-4846 4224 192) 2979 118 + 2 1217 (-4864 4176 576) (-4864.5 4176 576) 2975 1 + 2 1215 (-4864 4232 576) (-4864.5 4232 576) 2968 1 + } + 1219 ( 2 0 10974 15 0 0 0 0 ) 0 { + } + 1220 ( 2 0 10989 15 0 0 0 0 ) 0 { + } + 1221 ( 65 0 11004 6 18 269 0 0 ) 2 { + 2 1223 (-5120 4136 512) (-5119.5 4136 512) 2983 1 + 2 1222 (-5144 4128 512) (-5144 4127.5 512) 2984 1 + } + 1222 ( 69 0 11010 6 18 270 0 0 ) 3 { + 8 1167 (-5144 4112 512) (-5144 4110 448) 2987 103 + 2 1223 (-5120 4120 512) (-5119.5 4120 512) 2986 1 + 2 1221 (-5144 4128 512) (-5144 4128.5 512) 2984 1 + } + 1223 ( 69 0 11016 7 18 271 0 0 ) 3 { + 8 1167 (-5112 4112 512) (-5112 4110 448) 2990 103 + 2 1221 (-5120 4136 512) (-5120.5 4136 512) 2983 1 + 2 1222 (-5120 4120 512) (-5120.5 4120 512) 2986 1 + } + 1224 ( 2 0 11023 10 0 0 0 0 ) 0 { + } + 1225 ( 65 0 11033 7 18 272 0 0 ) 3 { + 2 1227 (-4687.9233398438 4344 672) (-4687.5234375 4344 672) 2993 0 + 2 1226 (-4896.01171875 4288 672) (-4896.01171875 4287.5 672) 2994 1 + 2 1249 (-4896.01171875 4400 672) (-4896.01171875 4400.5 672) 2992 1 + } + 1226 ( 69 0 11040 7 18 273 0 0 ) 6 { + 2 1229 (-4687.9233398438 4280 672) (-4687.5234375 4280 672) 2996 0 + 8 1218 (-4856 4272 672) (-4856 4270 576) 2997 104 + 8 1215 (-4976 4272 672) (-4976 4270 576) 2997 104 + 8 1211 (-5088 4272 672) (-5088 4270 640) 2998 101 + 8 1069 (-4768.01171875 4272 672) (-4768.01171875 4270 192) 2997 122 + 2 1225 (-4896.01171875 4288 672) (-4896.01171875 4288.5 672) 2994 1 + } + 1227 ( 65 0 11047 6 18 274 0 0 ) 5 { + 2 1249 (-4688.1274414063 4412 672) (-4688.52734375 4412 672) 2999 0 + 2 1225 (-4688.1235351563 4344 672) (-4688.5234375 4344 672) 2993 0 + 2 1229 (-4680.01171875 4288 663.9870605469) (-4680.01171875 4287.5 663.9870605469) 3002 1 + 2 1251 (-4680.015625 4424 663.98828125) (-4680.015625 4424.5 663.98828125) 3000 1 + 2 1228 (-4672 4356 655.9753417969) (-4671.5 4356 655.9753417969) 3001 1 + } + 1228 ( 69 0 11053 10 18 275 0 0 ) 7 { + 8 1108 (-4672 4440 655.9682617188) (-4672 4442 192) 3008 122 + 8 1104 (-4656 4436 639.9691162109) (-4654 4436 192) 3003 121 + 8 1069 (-4672.0234375 4272 656) (-4672.0234375 4270 192) 3005 122 + 8 1065 (-4656 4336 639.9765625) (-4654 4336 192) 3004 121 + 2 1227 (-4672 4356 655.9753417969) (-4672.5 4356 655.9753417969) 3001 1 + 2 1251 (-4672 4432 655.9724121094) (-4672.5 4432 655.9724121094) 3007 1 + 2 1229 (-4672.01171875 4280 655.9870605469) (-4672.51171875 4280 655.9870605469) 3006 1 + } + 1229 ( 69 0 11063 5 18 276 0 0 ) 4 { + 2 1226 (-4688.1235351563 4280 672) (-4688.5234375 4280 672) 2996 0 + 8 1069 (-4688.0234375 4272 672) (-4688.0234375 4270 192) 3009 122 + 2 1227 (-4680.01171875 4288 663.9870605469) (-4680.01171875 4288.5 663.9870605469) 3002 1 + 2 1228 (-4672.01171875 4280 655.9870605469) (-4671.51171875 4280 655.9870605469) 3006 1 + } + 1230 ( 65 0 11068 8 18 277 0 0 ) 5 { + 2 1234 (-4224 4303.8999023438 736) (-4224 4303.5 736) 3015 0 + 2 1255 (-4272 4528 736) (-4272 4528.5 736) 3012 1 + 2 1238 (-4288 4472 736) (-4288.5 4472 736) 3011 1 + 2 1231 (-4160 4416 736) (-4159.5 4416 736) 3014 1 + 2 1232 (-4288 4360 736) (-4288.5 4360 736) 3010 1 + } + 1231 ( 69 0 11076 8 18 278 0 0 ) 9 { + 2 1236 (-4152 4303.8999023438 736) (-4152 4303.5 736) 3020 0 + 8 1208 (-4144 4512 736) (-4142 4512 688) 3017 102 + 8 1205 (-4144 4464 736) (-4142 4464 608) 3018 106 + 8 1147 (-4144 4376 736) (-4142 4376 256) 3019 122 + 8 1146 (-4144 4392 736) (-4142 4392 256) 3019 122 + 8 1134 (-4144 4312 736) (-4142 4312 0) 3019 135 + 8 382 (-4144 4400 736) (-4142 4400 576) 3019 107 + 8 381 (-4144 4416 736) (-4142 4416 592) 3019 106 + 2 1230 (-4160 4416 736) (-4160.5 4416 736) 3014 1 + } + 1232 ( 69 0 11084 7 18 279 0 0 ) 5 { + 2 1237 (-4296 4303.8999023438 736) (-4296 4303.5 736) 3021 0 + 8 998 (-4304 4360 736) (-4306 4360 0) 3022 135 + 2 1230 (-4288 4360 736) (-4287.5 4360 736) 3010 1 + 2 1239 (-4304 4408 736) (-4304.5 4408 736) 3023 1 + 2 1238 (-4296 4416 736) (-4296 4416.5 736) 3024 1 + } + 1233 ( 2 0 11091 11 0 0 0 0 ) 0 { + } + 1234 ( 65 0 11102 5 18 280 0 0 ) 4 { + 2 1230 (-4224 4304.1000976563 736) (-4224 4304.5 736) 3015 0 + 2 1236 (-4160 4296 728) (-4159.5 4296 728) 3026 1 + 2 1237 (-4288 4296 728) (-4288.5 4296 728) 3025 1 + 2 1235 (-4224 4288 720) (-4224 4287.5 720) 3027 1 + } + 1235 ( 69 0 11107 8 18 281 0 0 ) 4 { + 8 1133 (-4144 4288 720) (-4142 4288 0) 3030 134 + 2 1234 (-4224 4288 720) (-4224 4288.5 720) 3027 1 + 2 1237 (-4296 4288 720) (-4296 4288.5 720) 3028 1 + 2 1236 (-4152 4288 720) (-4152 4288.5 720) 3029 1 + } + 1236 ( 69 0 11115 5 18 282 0 0 ) 4 { + 2 1231 (-4152 4304.1000976563 736) (-4152 4304.5 736) 3020 0 + 8 1133 (-4144 4304 736) (-4142 4304 0) 3033 135 + 2 1234 (-4160 4296 728) (-4160.5 4296 728) 3026 1 + 2 1235 (-4152 4288 720) (-4152 4287.5 720) 3029 1 + } + 1237 ( 69 0 11120 5 18 283 0 0 ) 4 { + 2 1232 (-4296 4304.1000976563 736) (-4296 4304.5 736) 3021 0 + 8 998 (-4304 4304 736) (-4306 4304 0) 3034 135 + 2 1234 (-4288 4296 728) (-4287.5 4296 728) 3025 1 + 2 1235 (-4296 4288 720) (-4296 4287.5 720) 3028 1 + } + 1238 ( 65 0 11125 7 18 284 0 0 ) 5 { + 2 1242 (-4400.1000976563 4472 736) (-4400.5 4472 736) 3037 0 + 2 1239 (-4352 4416 736) (-4352 4415.5 736) 3036 1 + 2 1255 (-4344 4528 736) (-4344 4528.5 736) 3035 1 + 2 1230 (-4288 4472 736) (-4287.5 4472 736) 3011 1 + 2 1232 (-4296 4416 736) (-4296 4415.5 736) 3024 1 + } + 1239 ( 69 0 11132 6 18 285 0 0 ) 4 { + 2 1244 (-4400.1000976563 4408 736) (-4400.5 4408 736) 3039 0 + 8 998 (-4392 4400 736) (-4392 4398 0) 3038 135 + 2 1238 (-4352 4416 736) (-4352 4416.5 736) 3036 1 + 2 1232 (-4304 4408 736) (-4303.5 4408 736) 3023 1 + } + 1240 ( 2 0 11138 27 0 0 0 0 ) 0 { + } + 1241 ( 2 0 11165 10 0 0 0 0 ) 0 { + } + 1242 ( 65 0 11175 5 18 286 0 0 ) 5 { + 2 1255 (-4399.8999023438 4536 736) (-4399.5 4536 736) 3042 0 + 2 1238 (-4399.8999023438 4472 736) (-4399.5 4472 736) 3037 0 + 2 1244 (-4408 4416 728.0057373047) (-4408 4415.5 728.0057373047) 3043 1 + 2 1258 (-4408 4544 728) (-4408 4544.5 728) 3041 1 + 2 1243 (-4416 4480 720.0057373047) (-4416.5 4480 720.0057373047) 3040 1 + } + 1243 ( 69 0 11180 9 18 287 0 0 ) 5 { + 8 1024 (-4416 4560 720) (-4416 4562 8) 3049 133 + 8 998 (-4416 4400 720) (-4416 4398 0) 3046 134 + 2 1242 (-4416 4480 720.0057373047) (-4415.5 4480 720.0057373047) 3040 1 + 2 1258 (-4416 4552 720) (-4415.5 4552 720) 3044 1 + 2 1244 (-4416 4408 720.0057373047) (-4415.5 4408 720.0057373047) 3045 1 + } + 1244 ( 69 0 11189 5 18 288 0 0 ) 4 { + 2 1239 (-4399.8999023438 4408 736) (-4399.5 4408 736) 3039 0 + 8 998 (-4400 4400 736) (-4400 4398 0) 3050 135 + 2 1242 (-4408 4416 728.0057373047) (-4408 4416.5 728.0057373047) 3043 1 + 2 1243 (-4416 4408 720.0057373047) (-4416.5 4408 720.0057373047) 3045 1 + } + 1245 ( 2 0 11194 11 0 0 0 0 ) 0 { + } + 1246 ( 65 0 11205 9 18 289 0 0 ) 4 { + 2 1260 (-5016 4528 512) (-5016 4528.5 512) 3051 1 + 2 1259 (-4896 4528 512) (-4896 4528.5 512) 3052 1 + 2 1247 (-4800 4484 512) (-4799.5 4484 512) 3054 1 + 2 1262 (-4832 4528 512) (-4832 4528.5 512) 3053 1 + } + 1247 ( 69 0 11214 11 18 290 0 0 ) 5 { + 8 1090 (-4792 4560 512) (-4792 4562 256) 3059 112 + 8 1080 (-4784 4484 512) (-4782 4484 256) 3061 112 + 2 1246 (-4800 4484 512) (-4800.5 4484 512) 3054 1 + 2 1262 (-4800 4536 512) (-4800.5 4536 512) 3057 1 + 2 1263 (-4800 4552 512) (-4800.5 4552 512) 3058 1 + } + 1248 ( 2 0 11225 9 0 0 0 0 ) 0 { + } + 1249 ( 65 0 11234 6 18 291 0 0 ) 3 { + 2 1227 (-4687.9272460938 4412 672) (-4687.52734375 4412 672) 2999 0 + 2 1225 (-4896.01171875 4400 672) (-4896.01171875 4399.5 672) 2992 1 + 2 1250 (-4896.015625 4424 672) (-4896.015625 4424.5 672) 3064 1 + } + 1250 ( 69 0 11240 8 18 292 0 0 ) 8 { + 2 1251 (-4687.9272460938 4432 672) (-4687.52734375 4431.9995117188 672) 3069 0 + 8 1247 (-4792 4440 672) (-4792 4442 512) 3067 107 + 8 1246 (-4952 4440 672) (-4952 4442 512) 3066 107 + 8 1113 (-4744 4440 672) (-4744 4442 240) 3068 120 + 8 1108 (-4712.01171875 4440 672) (-4712.01171875 4442 192) 3068 122 + 8 1083 (-4760 4440 672) (-4760 4442 256) 3068 119 + 8 1080 (-4776 4440 672) (-4776 4442 256) 3068 119 + 2 1249 (-4896.015625 4424 672) (-4896.015625 4423.5 672) 3064 1 + } + 1251 ( 69 0 11248 5 18 293 0 0 ) 4 { + 2 1250 (-4688.1274414063 4432 672) (-4688.52734375 4432.0004882813 672) 3069 0 + 8 1108 (-4688.0234375 4440 672) (-4688.0234375 4442 192) 3070 122 + 2 1227 (-4680.015625 4424 663.98828125) (-4680.015625 4423.5 663.98828125) 3000 1 + 2 1228 (-4672 4432 655.9724121094) (-4671.5 4432 655.9724121094) 3007 1 + } + 1252 ( 2 0 11253 12 0 0 0 0 ) 0 { + } + 1253 ( 65 0 11265 6 18 294 0 0 ) 1 { + 2 1254 (-5184 4064 640) (-5183.5 4064 640) 3071 1 + } + 1254 ( 69 0 11271 9 18 295 0 0 ) 7 { + 8 1411 (-5168 4008 640) (-5166 4008 512) 3078 106 + 8 1410 (-5168 3992 640) (-5166 3992 512) 3079 106 + 8 1409 (-5168 4056 640) (-5166 4056 448) 3077 109 + 8 1222 (-5168 4120 640) (-5166 4120 512) 3076 106 + 8 1221 (-5168 4136 640) (-5166 4136 512) 3076 106 + 8 1167 (-5168 4104 640) (-5166 4104 448) 3076 109 + 2 1253 (-5184 4064 640) (-5184.5 4064 640) 3071 1 + } + 1255 ( 65 0 11280 7 18 296 0 0 ) 4 { + 2 1242 (-4400.1000976563 4536 736) (-4400.5 4536 736) 3042 0 + 2 1238 (-4344 4528 736) (-4344 4527.5 736) 3035 1 + 2 1256 (-4328 4544 736) (-4328 4544.5 736) 3081 1 + 2 1230 (-4272 4528 736) (-4272 4527.5 736) 3012 1 + } + 1256 ( 69 0 11287 9 18 297 0 0 ) 7 { + 2 1258 (-4400.1000976563 4552 736) (-4400.5 4552 736) 3083 0 + 8 1191 (-4288.029296875 4560 736) (-4288.029296875 4562 591.9876708984) 3086 106 + 8 1086 (-4328 4560 736) (-4328 4562 256) 3084 122 + 8 1085 (-4312.0146484375 4560 736) (-4312 4562 256) 3084 122 + 8 1026 (-4360 4560 736) (-4360 4562 8) 3084 134 + 8 1024 (-4376 4560 736) (-4376 4562 8) 3084 134 + 2 1255 (-4328 4544 736) (-4328 4543.5 736) 3081 1 + } + 1257 ( 2 0 11296 11 0 0 0 0 ) 0 { + } + 1258 ( 69 0 11307 5 18 298 0 0 ) 4 { + 2 1256 (-4399.8999023438 4552 736) (-4399.5 4552 736) 3083 0 + 8 1024 (-4400 4560 736) (-4400 4562 8) 3089 134 + 2 1242 (-4408 4544 728) (-4408 4543.5 728) 3041 1 + 2 1243 (-4416 4552 720) (-4416.5 4552 720) 3044 1 + } + 1259 ( 65 0 11312 9 18 299 0 0 ) 6 { + 2 1184 (-4896 4560 512) (-4896 4560.5 512) 2894 1 + 2 1260 (-4928 4536 512) (-4928.5 4536 512) 3092 1 + 2 1246 (-4896 4528 512) (-4896 4527.5 512) 3052 1 + 2 1262 (-4864 4536 512) (-4863.5 4536 512) 3091 1 + 2 1261 (-4928 4552 512) (-4928.5 4552 512) 3093 1 + 2 1263 (-4864 4552 512) (-4863.5 4552 512) 3090 1 + } + 1260 ( 65 0 11321 6 18 300 0 0 ) 3 { + 2 1259 (-4928 4536 512) (-4927.5 4536 512) 3092 1 + 2 1246 (-5016 4528 512) (-5016 4527.5 512) 3051 1 + 2 1261 (-5016 4544 512) (-5016 4544.5 512) 3095 1 + } + 1261 ( 69 0 11327 8 18 301 0 0 ) 4 { + 8 1089 (-4960 4560 512) (-4960 4562 256) 3096 112 + 2 1259 (-4928 4552 512) (-4927.5 4552 512) 3093 1 + 2 1185 (-4936 4560 512) (-4936 4560.5 512) 2897 1 + 2 1260 (-5016 4544 512) (-5016 4543.5 512) 3095 1 + } + 1262 ( 65 0 11335 6 18 302 0 0 ) 4 { + 2 1246 (-4832 4528 512) (-4832 4527.5 512) 3053 1 + 2 1259 (-4864 4536 512) (-4864.5 4536 512) 3091 1 + 2 1247 (-4800 4536 512) (-4799.5 4536 512) 3057 1 + 2 1263 (-4832 4544 512) (-4832 4544.5 512) 3098 1 + } + 1263 ( 69 0 11341 8 18 303 0 0 ) 5 { + 8 1090 (-4824 4560 512) (-4824 4562 256) 3099 112 + 2 1247 (-4800 4552 512) (-4799.5 4552 512) 3058 1 + 2 1262 (-4832 4544 512) (-4832 4543.5 512) 3098 1 + 2 1259 (-4864 4552 512) (-4864.5 4552 512) 3090 1 + 2 1186 (-4856 4560 512) (-4856 4560.5 512) 2901 1 + } + 1264 ( 65 0 11349 11 50 0 0 0 ) 6 { + 2 1474 (-4688.1000976563 3352 72) (-4688.5 3352 80) 3102 0 + 2 1471 (-4688.1000976563 3528 72) (-4688.5 3528 80) 3102 0 + 2 1466 (-4688.1000976563 3504 72) (-4688.5 3504 80) 3102 0 + 2 1458 (-4688.1000976563 3424 72) (-4688.5 3424 80) 3102 0 + 2 1266 (-4564 3480 72) (-4563.5 3480 72) 3100 1 + 2 1445 (-4688 3576 72) (-4688.5 3576 72) 3103 1 + } + 1265 ( 65 0 11360 8 51 0 0 0 ) 2 { + 2 1281 (-4472 3416 72) (-4472 3416.5 72) 3105 1 + 2 1266 (-4528 3380 72) (-4528.5 3380 72) 3108 1 + } + 1266 ( 65 4 11368 11 -54 0 0 0 ) 5 { + 2 1281 (-4528 3420 72) (-4527.5 3420 72) 3112 1 + 2 1283 (-4528 3544 72) (-4527.5 3544 72) 3110 1 + 2 1284 (-4528 3448 72) (-4527.5 3448 72) 3111 1 + 2 1264 (-4564 3480 72) (-4564.5 3480 72) 3100 1 + 2 1265 (-4528 3380 72) (-4527.5 3380 72) 3108 1 + } + 1267 ( 65 0 11379 18 27 9 0 0 ) 6 { + 2 589 (-4096 3920 64) (-4095.5 3920 64) 1468 1 + 2 535 (-4096 3776 64) (-4095.5 3776 64) 1331 1 + 2 536 (-4096 3626 64) (-4095.5 3626 64) 1338 1 + 2 582 (-4172 3604 64) (-4172 3603.5 64) 1448 1 + 2 1274 (-4248 3776 64) (-4248.5 3776 64) 3116 1 + 2 1272 (-4248 3610 64) (-4248.5 3610 64) 3114 1 + } + 1268 ( 65 0 11397 16 27 10 0 0 ) 6 { + 2 1271 (-4252 3568 64) (-4252 3568.5 64) 3120 1 + 2 1292 (-4256 3520 64) (-4256.5 3520 64) 3124 1 + 2 582 (-4172 3568 64) (-4172 3568.5 64) 1450 1 + 2 530 (-4136 3448 64) (-4136 3447.5 64) 1308 1 + 2 533 (-4096 3456 64) (-4095.5 3456 64) 1320 1 + 2 532 (-4096 3516 64) (-4095.5 3516 64) 1314 1 + } + 1269 ( 0 0 11413 7 0 0 0 0 ) 0 { + } + 1270 ( 0 0 11420 5 0 0 0 0 ) 0 { + } + 1271 ( 65 0 11425 8 27 11 0 0 ) 3 { + 2 582 (-4248 3576 64) (-4247.5 3576 64) 1451 1 + 2 1273 (-4252 3584 64) (-4252 3584.5 64) 3126 1 + 2 1268 (-4252 3568 64) (-4252 3567.5 64) 3120 1 + } + 1272 ( 65 0 11433 6 27 12 0 0 ) 2 { + 2 1267 (-4248 3610 64) (-4247.5 3610 64) 3114 1 + 2 1273 (-4252 3604 64) (-4252 3603.5 64) 3129 1 + } + 1273 ( 65 0 11439 6 27 13 0 0 ) 3 { + 2 1272 (-4252 3604 64) (-4252 3604.5 64) 3129 1 + 2 582 (-4248 3594 64) (-4247.5 3594 64) 1452 1 + 2 1271 (-4252 3584 64) (-4252 3583.5 64) 3126 1 + } + 1274 ( 65 0 11445 8 27 14 0 0 ) 1 { + 2 1267 (-4248 3776 64) (-4247.5 3776 64) 3116 1 + } + 1275 ( 2 0 11453 15 0 0 0 0 ) 0 { + } + 1276 ( 65 0 11468 11 28 2 0 0 ) 5 { + 2 1277 (-4172 3756 352) (-4172 3756.5 352) 3139 1 + 2 1278 (-4248 3688 352) (-4248.5 3688 352) 3137 1 + 2 1279 (-4248 3516 352) (-4248.5 3516 352) 3135 1 + 2 527 (-4136 3448 352) (-4136 3447.5 352) 1300 1 + 2 534 (-4096 3602 352) (-4095.5 3602 352) 1321 1 + } + 1277 ( 65 4 11479 9 -55 0 0 0 ) 3 { + 2 1276 (-4172 3756 352) (-4172 3755.5 352) 3139 1 + 2 543 (-4096 3774 352) (-4095.5 3774 352) 1355 1 + 2 542 (-4172 3792 352) (-4172 3792.5 352) 1347 1 + } + 1278 ( 65 0 11488 7 28 3 0 0 ) 1 { + 2 1276 (-4248 3688 352) (-4247.5 3688 352) 3137 1 + } + 1279 ( 65 0 11495 9 28 4 0 0 ) 2 { + 2 1276 (-4248 3516 352) (-4247.5 3516 352) 3135 1 + 2 1349 (-4256 3520 352) (-4256.5 3520 352) 3145 1 + } + 1280 ( 2 0 11504 5 0 0 0 0 ) 0 { + } + 1281 ( 65 0 11509 9 51 1 0 0 ) 4 { + 2 1265 (-4472 3416 72) (-4472 3415.5 72) 3105 1 + 2 1284 (-4480 3424 72) (-4480 3424.5 72) 3149 1 + 2 1304 (-4424 3424 72) (-4424 3424.5 72) 3150 1 + 2 1266 (-4528 3420 72) (-4528.5 3420 72) 3112 1 + } + 1282 ( 65 0 11518 9 51 2 0 0 ) 4 { + 2 1284 (-4472 3471.8999023438 64) (-4472 3471.5 72) 3154 0 + 2 1283 (-4512.1000976563 3544 64) (-4512.5 3544 72) 3155 0 + 2 1287 (-4472 3616 64) (-4472 3616.5 64) 3156 1 + 2 1291 (-4432 3520 64) (-4431.5 3520 64) 3153 1 + } + 1283 ( 65 0 11527 6 51 3 0 0 ) 3 { + 2 1282 (-4511.8999023438 3544 72) (-4511.5 3544 64) 3158 1 + 2 1284 (-4520 3472 72) (-4520 3471.5 72) 3159 1 + 2 1266 (-4528 3544 72) (-4528.5 3544 72) 3110 1 + } + 1284 ( 65 0 11533 7 51 4 0 0 ) 5 { + 2 1282 (-4472 3472.1000976563 72) (-4472 3472.5 64) 3160 1 + 2 1283 (-4520 3472 72) (-4520 3472.5 72) 3159 1 + 2 1281 (-4480 3424 72) (-4480 3423.5 72) 3149 1 + 2 1304 (-4432 3448 72) (-4431.5 3448 72) 3161 1 + 2 1266 (-4528 3448 72) (-4528.5 3448 72) 3111 1 + } + 1285 ( 2 0 11540 13 0 0 0 0 ) 0 { + } + 1286 ( 65 0 11553 6 18 304 0 0 ) 2 { + 2 1290 (-4472 3680.1000976563 64) (-4472 3680.5 64) 3165 0 + 2 1287 (-4472 3652 64) (-4472 3651.5 64) 3163 1 + } + 1287 ( 65 4 11559 6 -56 0 0 0 ) 2 { + 2 1282 (-4472 3616 64) (-4472 3615.5 64) 3156 1 + 2 1286 (-4472 3652 64) (-4472 3652.5 64) 3163 1 + } + 1288 ( 2 0 11565 12 0 0 0 0 ) 0 { + } + 1289 ( 65 0 11577 9 18 305 0 0 ) 4 { + 2 1290 (-4480 3791.8999023438 0) (-4480 3791.5 7.9874572754) 3172 0 + 2 1299 (-4432 3880 0) (-4431.5 3880 0) 3170 1 + 2 1314 (-4528 3864 0) (-4528.5 3864 0) 3168 1 + 2 1398 (-4480 3936 0) (-4480 3936.5 0) 3169 1 + } + 1290 ( 65 0 11586 10 18 306 0 0 ) 5 { + 2 1314 (-4536 3792.1000976563 7.9937257767) (-4536 3792.5 0) 3173 1 + 2 1289 (-4480 3792.1000976563 7.9874572754) (-4480 3792.5 0) 3179 1 + 2 1286 (-4472 3679.8999023438 64) (-4472 3679.5 64) 3165 0 + 2 1324 (-4544 3736 36) (-4544.5 3736 36) 3177 1 + 2 1319 (-4544 3768 20) (-4544.5 3768 20) 3178 1 + } + 1291 ( 65 0 11596 13 51 5 0 0 ) 3 { + 2 1304 (-4424 3471.8999023438 64) (-4424 3471.5 72) 3182 0 + 2 1282 (-4432 3520 64) (-4432.5 3520 64) 3153 1 + 2 1293 (-4304 3520 64) (-4303.5 3520 64) 3184 1 + } + 1292 ( 65 0 11609 6 27 15 0 0 ) 2 { + 2 1293 (-4268 3520 64) (-4268.5 3520 64) 3186 1 + 2 1268 (-4256 3520 64) (-4255.5 3520 64) 3124 1 + } + 1293 ( 65 4 11615 6 -57 0 0 0 ) 2 { + 2 1292 (-4268 3520 64) (-4267.5 3520 64) 3186 1 + 2 1291 (-4304 3520 64) (-4304.5 3520 64) 3184 1 + } + 1294 ( 2 0 11621 10 0 0 0 0 ) 0 { + } + 1295 ( 2 0 11631 12 0 0 0 0 ) 0 { + } + 1296 ( 65 0 11643 6 18 307 0 0 ) 2 { + 2 1298 (-4368 3848 80) (-4368.5 3848 80) 3191 1 + 2 1297 (-4336 3888 80) (-4336 3888.5 80) 3192 1 + } + 1297 ( 69 0 11649 6 18 308 0 0 ) 4 { + 8 1303 (-4364 3904 80) (-4364 3906 48) 3195 101 + 8 1302 (-4332 3904 80) (-4332 3906 48) 3195 101 + 2 1298 (-4368 3896 80) (-4368.5 3896 80) 3194 1 + 2 1296 (-4336 3888 80) (-4336 3887.5 80) 3192 1 + } + 1298 ( 69 0 11655 7 18 309 0 0 ) 5 { + 8 1303 (-4372 3904 80) (-4372 3906 48) 3199 101 + 8 1301 (-4380 3904 80) (-4380 3906 0) 3199 103 + 8 1299 (-4384 3864 80) (-4386 3864 0) 3198 103 + 2 1296 (-4368 3848 80) (-4367.5 3848 80) 3191 1 + 2 1297 (-4368 3896 80) (-4367.5 3896 80) 3194 1 + } + 1299 ( 65 0 11662 8 18 310 0 0 ) 3 { + 2 1289 (-4432 3880 0) (-4432.5 3880 0) 3170 1 + 2 1301 (-4384 3920 0) (-4383.5 3920 0) 3201 1 + 2 1398 (-4408 3936 0) (-4408 3936.5 0) 3200 1 + } + 1300 ( 0 0 11670 5 0 0 0 0 ) 0 { + } + 1301 ( 65 0 11675 7 18 311 0 0 ) 2 { + 2 1299 (-4384 3920 0) (-4384.5 3920 0) 3201 1 + 2 1398 (-4380 3936 0) (-4380 3936.5 0) 3204 1 + } + 1302 ( 65 0 11682 6 18 312 0 0 ) 2 { + 2 1303 (-4360 3920 48) (-4360.5 3920 48) 3208 1 + 2 1399 (-4332 3936 48) (-4332 3936.5 48) 3209 1 + } + 1303 ( 69 0 11688 6 18 313 0 0 ) 3 { + 8 1301 (-4376 3920 48) (-4378 3920 0) 3212 102 + 2 1302 (-4360 3920 48) (-4359.5 3920 48) 3208 1 + 2 1399 (-4368 3936 48) (-4368 3936.5 48) 3213 1 + } + 1304 ( 65 0 11694 7 51 6 0 0 ) 3 { + 2 1291 (-4424 3472.1000976563 72) (-4424 3472.5 64) 3214 1 + 2 1284 (-4432 3448 72) (-4432.5 3448 72) 3161 1 + 2 1281 (-4424 3424 72) (-4424 3423.5 72) 3150 1 + } + 1305 ( 2 0 11701 8 0 0 0 0 ) 0 { + } + 1306 ( 2 0 11709 20 0 0 0 0 ) 0 { + } + 1307 ( 65 0 11729 6 18 314 0 0 ) 2 { + 2 1309 (-4560 3696 128) (-4559.5 3696 128) 3219 1 + 2 1308 (-4572 3712 128) (-4572 3712.5 128) 3218 1 + } + 1308 ( 69 0 11735 6 18 315 0 0 ) 4 { + 8 1325 (-4568 3728 128) (-4568 3730 80) 3222 102 + 8 1322 (-4580 3728 128) (-4580 3730 80) 3221 102 + 2 1309 (-4560 3720 128) (-4559.5 3720 128) 3223 1 + 2 1307 (-4572 3712 128) (-4572 3711.5 128) 3218 1 + } + 1309 ( 69 0 11741 7 18 316 0 0 ) 5 { + 8 1325 (-4556 3728 128) (-4556 3730 80) 3226 102 + 8 1324 (-4548 3728 128) (-4548 3730 39.9938468933) 3227 104 + 8 1290 (-4544 3728 128) (-4542 3728 40) 3224 104 + 2 1307 (-4560 3696 128) (-4560.5 3696 128) 3219 1 + 2 1308 (-4560 3720 128) (-4560.5 3720 128) 3223 1 + } + 1310 ( 2 0 11748 12 0 0 0 0 ) 0 { + } + 1311 ( 65 0 11760 6 18 317 0 0 ) 2 { + 2 1313 (-4620 3736 128) (-4620 3736.5 128) 3229 1 + 2 1312 (-4616 3732 128) (-4615.5 3732 128) 3230 1 + } + 1312 ( 69 0 11766 6 18 318 0 0 ) 3 { + 8 1321 (-4600 3732 128) (-4598 3732 80) 3233 102 + 2 1313 (-4608 3736 128) (-4608 3736.5 128) 3232 1 + 2 1311 (-4616 3732 128) (-4616.5 3732 128) 3230 1 + } + 1313 ( 69 0 11772 7 18 319 0 0 ) 4 { + 8 1327 (-4612 3752 128) (-4612 3754 80) 3236 102 + 8 1321 (-4600 3744 128) (-4598 3744 80) 3237 102 + 2 1311 (-4620 3736 128) (-4620 3735.5 128) 3229 1 + 2 1312 (-4608 3736 128) (-4608 3735.5 128) 3232 1 + } + 1314 ( 65 0 11779 11 18 320 0 0 ) 5 { + 2 1290 (-4536 3791.8999023438 0) (-4536 3791.5 7.9937257767) 3239 0 + 2 1289 (-4528 3864 0) (-4527.5 3864 0) 3168 1 + 2 1398 (-4536 3936 0) (-4536 3936.5 0) 3238 1 + 2 1317 (-4544 3872 0) (-4544.5 3872 0) 3241 1 + 2 1318 (-4544 3800 0) (-4544.5 3800 0) 3240 1 + } + 1315 ( 2 0 11790 8 0 0 0 0 ) 0 { + } + 1316 ( 65 0 11798 14 18 321 0 0 ) 5 { + 2 1319 (-4559.8999023438 3792 0) (-4559.5 3792 7.9874486923) 3245 0 + 2 1320 (-4576 3880 0) (-4576.5 3880 0) 3248 1 + 2 1398 (-4568 3936 0) (-4568 3936.5 0) 3242 1 + 2 1317 (-4560 3872 0) (-4559.5 3872 0) 3243 1 + 2 1318 (-4560 3800 0) (-4559.5 3800 0) 3244 1 + } + 1317 ( 65 0 11812 7 18 322 0 0 ) 4 { + 2 1398 (-4552 3936 0) (-4552 3936.5 0) 3249 1 + 2 1316 (-4560 3872 0) (-4560.5 3872 0) 3243 1 + 2 1314 (-4544 3872 0) (-4543.5 3872 0) 3241 1 + 2 1318 (-4552 3808 0) (-4552 3807.5 0) 3250 1 + } + 1318 ( 69 0 11819 7 18 323 0 0 ) 4 { + 2 1319 (-4552 3791.8999023438 0) (-4552 3791.5 7.9937243462) 3251 0 + 2 1316 (-4560 3800 0) (-4560.5 3800 0) 3244 1 + 2 1314 (-4544 3800 0) (-4543.5 3800 0) 3240 1 + 2 1317 (-4552 3808 0) (-4552 3808.5 0) 3250 1 + } + 1319 ( 69 0 11826 9 18 324 0 0 ) 4 { + 2 1318 (-4552 3792.1000976563 7.9937243462) (-4552 3792.5 0) 3252 1 + 8 1316 (-4560 3744 31.9876937866) (-4562 3744 0) 3255 101 + 2 1324 (-4548 3744 31.9938468933) (-4548 3743.5 31.9938468933) 3253 1 + 2 1290 (-4544 3768 20) (-4543.5 3768 20) 3178 1 + } + 1320 ( 65 0 11835 9 18 325 0 0 ) 3 { + 2 1316 (-4576 3880 0) (-4575.5 3880 0) 3248 1 + 2 1326 (-4600 3880 0) (-4600.5 3880 0) 3258 1 + 2 1398 (-4588 3936 0) (-4588 3936.5 0) 3256 1 + } + 1321 ( 65 0 11844 8 18 326 0 0 ) 3 { + 2 1327 (-4600 3780 80) (-4600.5 3780 80) 3262 1 + 2 1323 (-4596 3808 80) (-4596 3808.5 80) 3263 1 + 2 1322 (-4592 3768 80) (-4591.5 3768 80) 3259 1 + } + 1322 ( 69 0 11852 7 18 327 0 0 ) 4 { + 8 1316 (-4576 3776 80) (-4574 3776 0) 3265 103 + 2 1323 (-4584 3808 80) (-4584 3808.5 80) 3264 1 + 2 1321 (-4592 3768 80) (-4592.5 3768 80) 3259 1 + 2 1325 (-4576 3736 80) (-4575.5 3736 80) 3266 1 + } + 1323 ( 69 0 11859 8 18 328 0 0 ) 5 { + 8 1320 (-4588 3824 80) (-4588 3826 0) 3268 103 + 8 1316 (-4576 3816 80) (-4574 3816 0) 3269 103 + 2 1328 (-4600 3816 80) (-4600.5 3816 80) 3270 1 + 2 1321 (-4596 3808 80) (-4596 3807.5 80) 3263 1 + 2 1322 (-4584 3808 80) (-4584 3807.5 80) 3264 1 + } + 1324 ( 69 0 11867 8 18 329 0 0 ) 2 { + 2 1319 (-4548 3744 31.9938468933) (-4548 3744.5 31.9938468933) 3253 1 + 2 1290 (-4544 3736 36) (-4543.5 3736 36) 3177 1 + } + 1325 ( 69 0 11875 7 18 330 0 0 ) 3 { + 8 1319 (-4556 3744 80) (-4556 3746 31.9876937866) 3274 102 + 8 1316 (-4568 3744 80) (-4568 3746 0) 3273 103 + 2 1322 (-4576 3736 80) (-4576.5 3736 80) 3266 1 + } + 1326 ( 65 0 11882 8 18 331 0 0 ) 2 { + 2 1320 (-4600 3880 0) (-4599.5 3880 0) 3258 1 + 2 1398 (-4628 3936 0) (-4628 3936.5 0) 3277 1 + } + 1327 ( 65 0 11890 7 18 332 0 0 ) 2 { + 2 1328 (-4628 3808 80) (-4628 3808.5 80) 3282 1 + 2 1321 (-4600 3780 80) (-4599.5 3780 80) 3262 1 + } + 1328 ( 69 0 11897 7 18 333 0 0 ) 3 { + 8 1326 (-4628 3824 80) (-4628 3826 0) 3284 103 + 2 1323 (-4600 3816 80) (-4599.5 3816 80) 3270 1 + 2 1327 (-4628 3808 80) (-4628 3807.5 80) 3282 1 + } + 1329 ( 2 0 11904 13 0 0 0 0 ) 0 { + } + 1330 ( 65 0 11917 9 18 334 0 0 ) 4 { + 2 1333 (-4656 3896 192) (-4656.5 3896 192) 3290 1 + 2 1331 (-4640 3696 192) (-4639.5 3696 192) 3287 1 + 2 1332 (-4640 3824 192) (-4639.5 3824 192) 3286 1 + 2 1395 (-4648 3936 192) (-4648 3936.5 192) 3285 1 + } + 1331 ( 65 0 11926 6 18 335 0 0 ) 3 { + 8 1337 (-4624 3696 192) (-4622 3696 176) 3291 100 + 2 1330 (-4640 3696 192) (-4640.5 3696 192) 3287 1 + 2 1332 (-4632 3712 192) (-4632 3712.5 192) 3293 1 + } + 1332 ( 69 0 11932 7 18 336 0 0 ) 6 { + 8 1339 (-4624 3720 192) (-4622 3720 176) 3296 100 + 8 1313 (-4624 3744 192) (-4622 3744 128) 3295 103 + 8 1311 (-4624 3732 192) (-4622 3732 128) 3295 103 + 2 1330 (-4640 3824 192) (-4640.5 3824 192) 3286 1 + 2 1331 (-4632 3712 192) (-4632 3711.5 192) 3293 1 + 2 1396 (-4632 3936 192) (-4632 3936.5 192) 3294 1 + } + 1333 ( 65 0 11939 12 18 337 0 0 ) 3 { + 2 1330 (-4656 3896 192) (-4655.5 3896 192) 3290 1 + 2 1444 (-4688 3896 192) (-4688.5 3896 192) 3299 1 + 2 1395 (-4672 3936 192) (-4672 3936.5 192) 3297 1 + } + 1334 ( 2 0 11951 18 0 0 0 0 ) 0 { + } + 1335 ( 2 0 11969 14 0 0 0 0 ) 0 { + } + 1336 ( 2 0 11983 10 0 0 0 0 ) 0 { + } + 1337 ( 65 0 11993 6 18 338 0 0 ) 2 { + 2 1339 (-4612 3712 176) (-4612 3712.5 176) 3303 1 + 2 1338 (-4600 3696 176) (-4599.5 3696 176) 3302 1 + } + 1338 ( 69 0 11999 6 18 339 0 0 ) 2 { + 2 1339 (-4592 3712 176) (-4592 3712.5 176) 3306 1 + 2 1337 (-4600 3696 176) (-4600.5 3696 176) 3302 1 + } + 1339 ( 69 0 12005 7 18 340 0 0 ) 2 { + 2 1337 (-4612 3712 176) (-4612 3711.5 176) 3303 1 + 2 1338 (-4592 3712 176) (-4592 3711.5 176) 3306 1 + } + 1340 ( 65 0 12012 7 29 5 0 0 ) 2 { + 8 542 (-4256 3848 368) (-4254 3848 352) 3315 100 + 2 1341 (-4268 3848 368) (-4268.5 3848 368) 3313 1 + } + 1341 ( 65 0 12019 6 29 6 0 0 ) 2 { + 2 1340 (-4268 3848 368) (-4267.5 3848 368) 3313 1 + 2 1342 (-4288 3848 368) (-4288.5 3848 368) 3317 1 + } + 1342 ( 69 4 12025 6 -58 0 0 0 ) 2 { + 8 1296 (-4304 3848 368) (-4306 3848 80) 3320 113 + 2 1341 (-4288 3848 368) (-4287.5 3848 368) 3317 1 + } + 1343 ( 2 0 12031 8 0 0 0 0 ) 0 { + } + 1344 ( 2 0 12039 9 0 0 0 0 ) 0 { + } + 1345 ( 2 0 12048 7 0 0 0 0 ) 0 { + } + 1346 ( 2 0 12055 8 0 0 0 0 ) 0 { + } + 1347 ( 2 0 12063 6 0 0 0 0 ) 0 { + } + 1348 ( 2 0 12069 6 0 0 0 0 ) 0 { + } + 1349 ( 65 0 12075 8 28 5 0 0 ) 2 { + 2 1279 (-4256 3520 352) (-4255.5 3520 352) 3145 1 + 2 1350 (-4268 3520 352) (-4268.5 3520 352) 3323 1 + } + 1350 ( 65 0 12083 6 28 6 0 0 ) 2 { + 2 1349 (-4268 3520 352) (-4267.5 3520 352) 3323 1 + 2 1351 (-4288 3520 352) (-4288.5 3520 352) 3326 1 + } + 1351 ( 69 0 12089 6 28 7 0 0 ) 1 { + 2 1350 (-4288 3520 352) (-4287.5 3520 352) 3326 1 + } + 1352 ( 2 0 12095 9 0 0 0 0 ) 0 { + } + 1353 ( 2 0 12104 16 0 0 0 0 ) 0 { + } + 1354 ( 2 0 12120 8 0 0 0 0 ) 0 { + } + 1355 ( 2 0 12128 7 0 0 0 0 ) 0 { + } + 1356 ( 2 0 12135 6 0 0 0 0 ) 0 { + } + 1357 ( 2 0 12141 11 0 0 0 0 ) 0 { + } + 1358 ( 2 0 12152 6 0 0 0 0 ) 0 { + } + 1359 ( 65 0 12158 10 18 341 0 0 ) 6 { + 2 649 (-4160 3952.1000976563 672) (-4160 3952.5 672) 1594 0 + 2 1371 (-4256 3624 672) (-4256.5 3624 672) 3332 1 + 2 643 (-4096 3856 672) (-4095.5 3856 672) 1578 1 + 2 1377 (-4256 3712 672) (-4256.5 3712 672) 3333 1 + 2 645 (-4096 3680 672) (-4095.5 3680 672) 1585 1 + 2 1374 (-4256 3864 672) (-4256.5 3864 672) 3334 1 + } + 1360 ( 2 0 12168 7 0 0 0 0 ) 0 { + } + 1361 ( 2 0 12175 5 0 0 0 0 ) 0 { + } + 1362 ( 2 0 12180 5 0 0 0 0 ) 0 { + } + 1363 ( 2 0 12185 14 0 0 0 0 ) 0 { + } + 1364 ( 2 0 12199 7 0 0 0 0 ) 0 { + } + 1365 ( 2 0 12206 14 0 0 0 0 ) 0 { + } + 1366 ( 65 0 12220 7 18 342 0 0 ) 2 { + 2 1367 (-4528 3664 640) (-4528 3664.5 640) 3339 1 + 2 1373 (-4400 3624 640) (-4399.5 3624 640) 3336 1 + } + 1367 ( 69 0 12227 7 18 343 0 0 ) 8 { + 8 1338 (-4592 3680 640) (-4592 3682 176) 3341 122 + 8 1337 (-4612 3680 640) (-4612 3682 176) 3341 122 + 8 1331 (-4632 3680 640) (-4632 3682 192) 3341 121 + 8 1330 (-4648 3680 640) (-4648 3682 192) 3341 121 + 8 1309 (-4552 3680 640) (-4552 3682 128) 3341 124 + 8 1307 (-4572 3680 640) (-4572 3682 128) 3341 124 + 2 1366 (-4528 3664 640) (-4528 3663.5 640) 3339 1 + 2 1382 (-4656 3672 640) (-4656.5 3672 640) 3340 1 + } + 1368 ( 2 0 12234 8 0 0 0 0 ) 0 { + } + 1369 ( 0 0 12242 6 0 0 0 0 ) 0 { + } + 1370 ( 0 0 12248 4 0 0 0 0 ) 0 { + } + 1371 ( 65 0 12252 7 18 344 0 0 ) 3 { + 2 1377 (-4264 3648 672) (-4264 3648.5 672) 3347 1 + 2 1372 (-4288 3624 672) (-4288.5 3624 672) 3345 1 + 2 1359 (-4256 3624 672) (-4255.5 3624 672) 3332 1 + } + 1372 ( 69 0 12259 6 18 345 0 0 ) 2 { + 8 1373 (-4304 3624 672) (-4306 3624 640) 3349 101 + 2 1371 (-4288 3624 672) (-4287.5 3624 672) 3345 1 + } + 1373 ( 65 0 12265 7 18 346 0 0 ) 1 { + 2 1366 (-4400 3624 640) (-4400.5 3624 640) 3336 1 + } + 1374 ( 65 0 12272 7 18 347 0 0 ) 4 { + 2 649 (-4272 3952.1000976563 672) (-4272 3952.5 672) 1596 0 + 2 1377 (-4264 3776 672) (-4264 3775.5 672) 3355 1 + 2 1359 (-4256 3864 672) (-4255.5 3864 672) 3334 1 + 2 1375 (-4288 3864 672) (-4288.5 3864 672) 3354 1 + } + 1375 ( 69 0 12279 7 18 348 0 0 ) 6 { + 8 1399 (-4304 3944 672) (-4306 3944 48) 3359 129 + 2 1391 (-4296 3952.1000976563 672) (-4296 3952.5 672) 3360 0 + 8 1302 (-4304 3920 672) (-4306 3920 48) 3358 129 + 8 1297 (-4304 3896 672) (-4306 3896 80) 3358 128 + 8 1296 (-4304 3848 672) (-4306 3848 80) 3358 128 + 2 1374 (-4288 3864 672) (-4287.5 3864 672) 3354 1 + } + 1376 ( 2 0 12286 7 0 0 0 0 ) 0 { + } + 1377 ( 65 0 12293 6 18 349 0 0 ) 3 { + 2 1371 (-4264 3648 672) (-4264 3647.5 672) 3347 1 + 2 1374 (-4264 3776 672) (-4264 3776.5 672) 3355 1 + 2 1359 (-4256 3712 672) (-4255.5 3712 672) 3333 1 + } + 1378 ( 2 0 12299 8 0 0 0 0 ) 0 { + } + 1379 ( 0 0 12307 7 0 0 0 0 ) 0 { + } + 1380 ( 2 0 12314 10 0 0 0 0 ) 0 { + } + 1381 ( 65 0 12324 5 18 350 0 0 ) 3 { + 2 1407 (-4688.1000976563 3752 672) (-4688.5 3752 672) 3365 0 + 2 1383 (-4680 3840 663.9870605469) (-4680 3840.5 663.9870605469) 3366 1 + 2 1382 (-4672 3752 655.9713134766) (-4671.5 3752 655.9713134766) 3363 1 + } + 1382 ( 69 0 12329 7 18 351 0 0 ) 4 { + 8 1330 (-4656 3760 640) (-4654 3760 192) 3367 121 + 2 1383 (-4664 3840 647.9870605469) (-4664 3840.5 647.9870605469) 3369 1 + 2 1381 (-4672 3752 655.9713134766) (-4672.5 3752 655.9713134766) 3363 1 + 2 1367 (-4656 3672 640) (-4655.5 3672 640) 3340 1 + } + 1383 ( 69 0 12336 6 18 352 0 0 ) 5 { + 2 1408 (-4688.1000976563 3848 672) (-4688.5 3848 672) 3370 0 + 8 1333 (-4688 3856 672) (-4688 3858 192) 3371 122 + 8 1330 (-4656 3848 640) (-4654 3848 192) 3372 121 + 2 1381 (-4680 3840 663.9870605469) (-4680 3839.5 663.9870605469) 3366 1 + 2 1382 (-4664 3840 647.9870605469) (-4664 3839.5 647.9870605469) 3369 1 + } + 1384 ( 65 0 12342 26 18 353 0 0 ) 6 { + 2 1141 (-4200 4096 0) (-4200 4096.5 0) 2822 1 + 2 1393 (-4256 4040 0) (-4256.5 4040 0) 3374 1 + 2 1137 (-4128 4096 0) (-4128 4096.5 0) 2813 1 + 2 1138 (-4104 4096 0) (-4104 4096.5 0) 2817 1 + 2 613 (-4096 4048 0) (-4095.5 4048 0) 1504 1 + 2 614 (-4096 3992 0) (-4095.5 3992 0) 1507 1 + } + 1385 ( 2 0 12368 15 0 0 0 0 ) 0 { + } + 1386 ( 69 0 12383 9 18 354 0 0 ) 6 { + 8 1393 (-4280 3984 640) (-4280 3986 0) 3377 130 + 8 1392 (-4304 3968 656) (-4306 3968 0) 3376 131 + 8 1384 (-4240 3984 640) (-4240 3986 0) 3377 130 + 2 650 (-4224 3976 648) (-4223.5 3976 648) 1601 1 + 2 649 (-4256 3968 656) (-4256 3967.5 656) 1598 1 + 2 1391 (-4296 3968 656) (-4296 3967.5 656) 3375 1 + } + 1387 ( 2 0 12392 9 0 0 0 0 ) 0 { + } + 1388 ( 2 0 12401 22 0 0 0 0 ) 0 { + } + 1389 ( 2 0 12423 8 0 0 0 0 ) 0 { + } + 1390 ( 2 0 12431 15 0 0 0 0 ) 0 { + } + 1391 ( 69 0 12446 5 18 355 0 0 ) 4 { + 8 1392 (-4304 3952 672) (-4306 3952 0) 3378 132 + 2 1375 (-4296 3951.8999023438 672) (-4296 3951.5 672) 3360 0 + 2 649 (-4288 3960 664) (-4287.5 3960 664) 1597 1 + 2 1386 (-4296 3968 656) (-4296 3968.5 656) 3375 1 + } + 1392 ( 65 0 12451 16 18 356 0 0 ) 6 { + 2 978 (-4398.408203125 4096 0) (-4398.408203125 4096.5 0) 2409 1 + 2 985 (-4594.7348632813 4096 0) (-4594.7348632813 4096.5 0) 2432 1 + 2 1393 (-4304 4040 0) (-4303.5 4040 0) 3379 1 + 2 968 (-4329.1572265625 4096 0) (-4329.1572265625 4096.5 0) 2376 1 + 2 996 (-4487.986328125 4096 0) (-4487.986328125 4096.5 0) 2473 1 + 2 1398 (-4516 3952 0) (-4516 3951.5 0) 3382 1 + } + 1393 ( 65 0 12467 7 18 357 0 0 ) 4 { + 2 1392 (-4304 4040 0) (-4304.5 4040 0) 3379 1 + 2 1141 (-4264 4096 0) (-4264 4096.5 0) 2823 1 + 2 1384 (-4256 4040 0) (-4255.5 4040 0) 3374 1 + 2 968 (-4288 4096 0) (-4288 4096.5 0) 2375 1 + } + 1394 ( 2 0 12474 15 0 0 0 0 ) 0 { + } + 1395 ( 65 0 12489 8 18 358 0 0 ) 6 { + 2 1065 (-4648 4096 192) (-4648 4096.5 192) 2669 1 + 2 1069 (-4672 4096 192) (-4672 4096.5 192) 2678 1 + 2 1330 (-4648 3936 192) (-4648 3935.5 192) 3285 1 + 2 1333 (-4672 3936 192) (-4672 3935.5 192) 3297 1 + 2 1444 (-4688 4016 192) (-4688.5 4016 192) 3386 1 + 2 1396 (-4640 4016 192) (-4639.5 4016 192) 3385 1 + } + 1396 ( 69 0 12497 7 18 359 0 0 ) 3 { + 2 1066 (-4632 4096 192) (-4632 4096.5 192) 2677 1 + 2 1395 (-4640 4016 192) (-4640.5 4016 192) 3385 1 + 2 1332 (-4632 3936 192) (-4632 3935.5 192) 3294 1 + } + 1397 ( 2 0 12504 22 0 0 0 0 ) 0 { + } + 1398 ( 65 0 12526 18 18 360 0 0 ) 9 { + 2 1326 (-4628 3936 0) (-4628 3935.5 0) 3277 1 + 2 1320 (-4588 3936 0) (-4588 3935.5 0) 3256 1 + 2 1316 (-4568 3936 0) (-4568 3935.5 0) 3242 1 + 2 1314 (-4536 3936 0) (-4536 3935.5 0) 3238 1 + 2 1301 (-4380 3936 0) (-4380 3935.5 0) 3204 1 + 2 1299 (-4408 3936 0) (-4408 3935.5 0) 3200 1 + 2 1289 (-4480 3936 0) (-4480 3935.5 0) 3169 1 + 2 1317 (-4552 3936 0) (-4552 3935.5 0) 3249 1 + 2 1392 (-4516 3952 0) (-4516 3952.5 0) 3382 1 + } + 1399 ( 69 0 12544 8 18 361 0 0 ) 4 { + 8 1398 (-4376 3944 48) (-4378 3944 0) 3391 102 + 8 1392 (-4340 3952 48) (-4340 3954 0) 3392 102 + 2 1302 (-4332 3936 48) (-4332 3935.5 48) 3209 1 + 2 1303 (-4368 3936 48) (-4368 3935.5 48) 3213 1 + } + 1400 ( 65 0 12552 7 18 362 0 0 ) 2 { + 2 1401 (-5088 3904 192) (-5088.5 3904 192) 3397 1 + 2 1415 (-5040 3920 192) (-5039.5 3920 192) 3395 1 + } + 1401 ( 65 0 12559 6 18 363 0 0 ) 1 { + 2 1400 (-5088 3904 192) (-5087.5 3904 192) 3397 1 + } + 1402 ( 65 0 12565 16 18 364 0 0 ) 3 { + 2 1161 (-5088 4056 432) (-5088.5 4056 432) 2838 1 + 2 1442 (-5072 4040 416) (-5071.5 4040 416) 3402 1 + 2 1114 (-5080 4096 424) (-5080 4096.5 424) 2780 1 + } + 1403 ( 2 0 12581 9 0 0 0 0 ) 0 { + } + 1404 ( 69 0 12590 8 18 365 0 0 ) 3 { + 8 1402 (-5088 4000 512) (-5086 4000 432) 3408 103 + 2 1410 (-5104 3992 512) (-5104.5 3992 512) 3405 1 + 2 1411 (-5104 4008 512) (-5104.5 4008 512) 3406 1 + } + 1405 ( 65 0 12598 8 18 366 0 0 ) 2 { + 2 1439 (-5071.8999023438 3912 640) (-5071.5 3912 640) 3410 0 + 2 1406 (-5120 3968 640) (-5120 3968.5 640) 3414 1 + } + 1406 ( 69 0 12606 8 18 367 0 0 ) 5 { + 2 1440 (-5071.8999023438 3976 640) (-5071.5 3976 640) 3419 0 + 8 1410 (-5136 3984 640) (-5136 3986 512) 3416 106 + 8 1404 (-5096 3984 640) (-5096 3986 512) 3417 106 + 8 1402 (-5072 3984 640) (-5072 3986 416) 3418 110 + 2 1405 (-5120 3968 640) (-5120 3967.5 640) 3414 1 + } + 1407 ( 65 0 12614 6 18 368 0 0 ) 2 { + 2 1381 (-4687.8999023438 3752 672) (-4687.5 3752 672) 3365 0 + 2 1408 (-4896 3840 672) (-4896 3840.5 672) 3420 1 + } + 1408 ( 69 0 12620 11 18 369 0 0 ) 7 { + 8 1456 (-4856 3856 672) (-4856 3858 576) 3426 104 + 8 1444 (-4744 3856 672) (-4744 3858 192) 3428 122 + 8 1415 (-4824 3856 672) (-4824 3858 192) 3427 122 + 8 1413 (-4976 3856 672) (-4976 3858 576) 3425 104 + 8 1405 (-5088 3856 672) (-5088 3858 640) 3423 101 + 2 1383 (-4687.8999023438 3848 672) (-4687.5 3848 672) 3370 0 + 2 1407 (-4896 3840 672) (-4896 3839.5 672) 3420 1 + } + 1409 ( 65 0 12631 9 18 370 0 0 ) 2 { + 2 1161 (-5103.8999023438 4056 448) (-5103.5 4056 448) 2840 0 + 2 1167 (-5136 4096 448) (-5136 4096.5 448) 2846 1 + } + 1410 ( 65 0 12640 8 18 371 0 0 ) 2 { + 2 1404 (-5104 3992 512) (-5103.5 3992 512) 3405 1 + 2 1411 (-5136 4000 512) (-5136 4000.5 512) 3434 1 + } + 1411 ( 69 0 12648 7 18 372 0 0 ) 3 { + 8 1409 (-5136 4016 512) (-5136 4018 448) 3436 103 + 2 1410 (-5136 4000 512) (-5136 3999.5 512) 3434 1 + 2 1404 (-5104 4008 512) (-5103.5 4008 512) 3406 1 + } + 1412 ( 2 0 12655 16 0 0 0 0 ) 0 { + } + 1413 ( 65 0 12671 10 18 373 0 0 ) 4 { + 2 1456 (-4864 3896 576) (-4863.5 3896 576) 3443 1 + 2 1457 (-4880 3952 576) (-4879.646484375 3952.353515625 576) 3442 1 + 2 1439 (-5024 3912 608) (-5024.5 3912 608) 3439 1 + 2 1414 (-5000 3968 592) (-5000 3968.5 592) 3440 1 + } + 1414 ( 69 0 12681 9 18 374 0 0 ) 3 { + 2 1457 (-4880 3968 576) (-4880 3967.5 576) 3450 1 + 2 1413 (-5000 3968 592) (-5000 3967.5 592) 3440 1 + 2 1440 (-5024 3976 608) (-5024.5 3976 608) 3445 1 + } + 1415 ( 65 0 12690 14 18 375 0 0 ) 6 { + 2 1070 (-4896 4096 192) (-4896 4096.5 192) 2685 1 + 2 1069 (-4824 4096 192) (-4824 4096.5 192) 2680 1 + 2 1400 (-5040 3920 192) (-5040.5 3920 192) 3395 1 + 2 1060 (-4992 4096 192) (-4992 4096.5 192) 2661 1 + 2 1418 (-4960 3856 192) (-4960 3855.5 192) 3452 1 + 2 1444 (-4800 3976 192) (-4799.5 3976 192) 3454 1 + } + 1416 ( 65 0 12704 9 52 0 0 0 ) 6 { + 2 1448 (-4888 3759.8999023438 192) (-4888 3759.5 192) 3458 0 + 2 1421 (-4960 3759.8999023438 192) (-4960 3759.5 184) 3459 1 + 2 1436 (-5024 3806 192) (-5024.5 3806 192) 3461 1 + 2 1429 (-5024 3776 192) (-5024.5 3776 192) 3460 1 + 2 1447 (-4880 3776 192) (-4879.5 3776 192) 3457 1 + 2 1418 (-4952 3820 192) (-4952 3820.5 192) 3455 1 + } + 1417 ( 2 0 12713 8 0 0 0 0 ) 0 { + } + 1418 ( 65 4 12721 7 -59 0 0 0 ) 3 { + 2 1416 (-4952 3820 192) (-4952 3819.5 192) 3455 1 + 2 1415 (-4960 3856 192) (-4960 3856.5 192) 3452 1 + 2 1436 (-5032 3820 192) (-5032 3819.5 192) 3462 1 + } + 1419 ( 65 0 12728 10 52 1 0 0 ) 4 { + 2 1453 (-4895.8999023438 3664.0314941406 168) (-4895.5 3664.0314941406 168) 3468 0 + 2 1431 (-5024.1000976563 3664.0314941406 168) (-5024.5 3664.0314941406 168) 3466 0 + 2 1426 (-4960 3663.9313964844 168) (-4960 3663.5 160) 3465 1 + 2 1420 (-4960 3696.1000976563 168) (-4960 3696.5 176) 3467 0 + } + 1420 ( 65 0 12738 10 52 2 0 0 ) 4 { + 2 1453 (-4895.8999023438 3696 176) (-4895.5 3696 176) 3472 0 + 2 1431 (-5024.1000976563 3696 176) (-5024.5 3696 176) 3470 0 + 2 1421 (-4960 3728.1000976563 176) (-4960 3728.5 184) 3471 0 + 2 1419 (-4960 3695.8999023438 176) (-4960 3695.5 168) 3469 1 + } + 1421 ( 65 0 12748 8 52 3 0 0 ) 4 { + 2 1448 (-4895.8999023438 3728 184) (-4895.5 3728 184) 3476 0 + 2 1431 (-5024.1000976563 3728 184) (-5024.5 3728 184) 3474 0 + 2 1420 (-4960 3727.8999023438 184) (-4960 3727.5 176) 3473 1 + 2 1416 (-4960 3760.1000976563 184) (-4960 3760.5 192) 3475 0 + } + 1422 ( 65 0 12756 10 52 4 0 0 ) 4 { + 2 1453 (-4895.8999023438 3540 136) (-4895.5 3540 137) 3479 0 + 2 1433 (-5024.1000976563 3540 136) (-5024.5 3540 137) 3477 0 + 2 1424 (-4960 3568.1000976563 136) (-4960 3568.5 144) 3478 0 + 2 1423 (-4960 3540 136) (-4960 3539.5 136) 3480 1 + } + 1423 ( 65 0 12766 9 52 5 0 0 ) 4 { + 2 1452 (-4895.8999023438 3536.0314941406 136) (-4895.5 3536.0314941406 136) 3483 0 + 2 1434 (-5024.1000976563 3536 136) (-5024.5 3536 136) 3482 0 + 2 1428 (-4960 3535.9155273438 136) (-4960 3535.5 128) 3481 1 + 2 1422 (-4960 3540 136) (-4960 3540.5 136) 3480 1 + } + 1424 ( 65 0 12775 12 52 6 0 0 ) 4 { + 2 1453 (-4895.8999023438 3568 144) (-4895.5 3568 144) 3487 0 + 2 1431 (-5024.1000976563 3568 144) (-5024.5 3568 144) 3485 0 + 2 1425 (-4960 3600.1000976563 144) (-4960 3600.5 152) 3486 0 + 2 1422 (-4960 3567.8999023438 144) (-4960 3567.5 136) 3484 1 + } + 1425 ( 65 0 12787 12 52 7 0 0 ) 4 { + 2 1453 (-4895.8999023438 3600 152) (-4895.5 3600 152) 3491 0 + 2 1431 (-5024.1000976563 3600 152) (-5024.5 3600 152) 3489 0 + 2 1426 (-4960 3632.1000976563 152) (-4960 3632.5 160) 3490 0 + 2 1424 (-4960 3599.8999023438 152) (-4960 3599.5 144) 3488 1 + } + 1426 ( 65 0 12799 13 52 8 0 0 ) 4 { + 2 1453 (-4895.8999023438 3632 160) (-4895.5 3632 160) 3495 0 + 2 1431 (-5024.1000976563 3632 160) (-5024.5 3632 160) 3493 0 + 2 1425 (-4960 3631.8999023438 160) (-4960 3631.5 152) 3492 1 + 2 1419 (-4960 3664.1000976563 160) (-4960 3664.5314941406 168) 3494 0 + } + 1427 ( 65 0 12812 9 53 0 0 0 ) 4 { + 2 1470 (-4888 3504.1000976563 120) (-4888 3504.5 128) 3498 0 + 2 1435 (-5032 3504.1000976563 120) (-5032 3504.5 128) 3498 0 + 2 1428 (-4960 3504.1000976563 120) (-4960 3504.5 128) 3498 0 + 2 1465 (-4880 3424 120) (-4879.5 3424 120) 3499 1 + } + 1428 ( 65 4 12821 9 -60 0 0 0 ) 4 { + 2 1470 (-4895.8999023438 3504 128) (-4895.5 3504 128) 3503 0 + 2 1435 (-5024.1000976563 3504 128) (-5024.5 3504 128) 3501 0 + 2 1427 (-4960 3503.8999023438 128) (-4960 3503.5 120) 3500 1 + 2 1423 (-4960 3536.1000976563 128) (-4960 3536.515625 136) 3502 0 + } + 1429 ( 65 0 12830 7 52 9 0 0 ) 4 { + 2 1432 (-5040.94140625 3759.9313964844 192) (-5040.94140625 3759.5314941406 192) 3505 0 + 2 1431 (-5032 3759.9155273438 192) (-5032.0009765625 3759.515625 192) 3504 0 + 2 1416 (-5024 3776 192) (-5023.5 3776 192) 3460 1 + 2 1436 (-5032 3792 192) (-5032 3792.5 192) 3508 1 + } + 1430 ( 2 0 12837 11 0 0 0 0 ) 0 { + } + 1431 ( 65 0 12848 11 52 10 0 0 ) 9 { + 2 1429 (-5032 3760.1157226563 192) (-5031.9990234375 3760.515625 192) 3504 0 + 2 1426 (-5023.8999023438 3664.0314941406 168) (-5023.5 3664 160) 3515 1 + 2 1425 (-5023.8999023438 3632 160) (-5023.5 3632 152) 3516 1 + 2 1424 (-5023.8999023438 3600 152) (-5023.5 3600 144) 3517 1 + 2 1421 (-5023.8999023438 3760 192) (-5023.5 3760 184) 3512 1 + 2 1420 (-5023.8999023438 3728 184) (-5023.5 3728 176) 3513 1 + 2 1419 (-5023.8999023438 3696 176) (-5023.5 3696 168) 3514 1 + 2 1432 (-5040 3744.0302734375 188) (-5040.5 3744.0302734375 188) 3511 1 + 2 1433 (-5032 3568 144) (-5032 3567.5 144) 3509 1 + } + 1432 ( 65 0 12859 5 52 11 0 0 ) 2 { + 2 1429 (-5040.94140625 3760.1315917969 192) (-5040.94140625 3760.5314941406 192) 3505 0 + 2 1431 (-5040 3744.0302734375 188) (-5039.5 3744.0302734375 188) 3511 1 + } + 1433 ( 65 0 12864 7 52 12 0 0 ) 3 { + 2 1422 (-5023.8999023438 3568 144) (-5023.5 3568 136) 3521 1 + 2 1431 (-5032 3568 144) (-5032 3568.5 144) 3509 1 + 2 1434 (-5032 3540 137) (-5032 3539.5 137) 3519 1 + } + 1434 ( 65 4 12871 7 -61 0 0 0 ) 3 { + 2 1423 (-5023.8999023438 3540 137) (-5023.5 3540 136) 3523 1 + 2 1433 (-5032 3540 137) (-5032 3540.5 137) 3519 1 + 2 1435 (-5032 3536 136) (-5032 3535.5 136) 3524 1 + } + 1435 ( 65 0 12878 6 53 1 0 0 ) 3 { + 2 1428 (-5023.8999023438 3536 136) (-5023.5 3536 128) 3527 1 + 2 1427 (-5032 3503.8999023438 128) (-5032 3503.5 120) 3525 1 + 2 1434 (-5032 3536 136) (-5032 3536.5 136) 3524 1 + } + 1436 ( 65 0 12884 6 52 13 0 0 ) 3 { + 2 1416 (-5024 3806 192) (-5023.5 3806 192) 3461 1 + 2 1429 (-5032 3792 192) (-5032 3791.5 192) 3508 1 + 2 1418 (-5032 3820 192) (-5032 3820.5 192) 3462 1 + } + 1437 ( 2 0 12890 13 0 0 0 0 ) 0 { + } + 1438 ( 2 0 12903 9 0 0 0 0 ) 0 { + } + 1439 ( 65 0 12912 5 18 376 0 0 ) 3 { + 2 1405 (-5072.1000976563 3912 640) (-5072.5 3912 640) 3410 0 + 2 1413 (-5024 3912 608) (-5023.5 3912 608) 3439 1 + 2 1440 (-5048 3968 624) (-5048 3968.5 624) 3530 1 + } + 1440 ( 69 0 12917 5 18 377 0 0 ) 4 { + 8 1442 (-5056 3984 629.3333129883) (-5056 3986 400) 3531 110 + 2 1406 (-5072.1000976563 3976 640) (-5072.5 3976 640) 3419 0 + 2 1414 (-5024 3976 608) (-5023.5 3976 608) 3445 1 + 2 1439 (-5048 3968 624) (-5048 3967.5 624) 3530 1 + } + 1441 ( 2 0 12922 10 0 0 0 0 ) 0 { + } + 1442 ( 65 0 12932 9 18 378 0 0 ) 3 { + 2 1114 (-5064 4096 408) (-5064 4096.5 408) 2779 1 + 2 1443 (-5056 4040 400) (-5055.5 4040 400) 3533 1 + 2 1402 (-5072 4040 416) (-5072.5 4040 416) 3402 1 + } + 1443 ( 69 0 12941 9 18 379 0 0 ) 3 { + 8 1415 (-5040 4040 384) (-5038 4040 192) 3534 109 + 2 1115 (-5048 4096 392) (-5048 4096.5 392) 2785 1 + 2 1442 (-5056 4040 400) (-5056.5 4040 400) 3533 1 + } + 1444 ( 65 0 12950 17 18 380 0 0 ) 4 { + 2 1333 (-4688 3896 192) (-4687.5 3896 192) 3299 1 + 2 1395 (-4688 4016 192) (-4687.5 4016 192) 3386 1 + 2 1415 (-4800 3976 192) (-4800.5 3976 192) 3454 1 + 2 1069 (-4744 4096 192) (-4744 4096.5 192) 2679 1 + } + 1445 ( 65 0 12967 8 50 1 0 0 ) 2 { + 2 1471 (-4688 3535.8999023438 72) (-4688 3535.5 80) 3537 0 + 2 1264 (-4688 3576 72) (-4687.5 3576 72) 3103 1 + } + 1446 ( 2 0 12975 13 0 0 0 0 ) 0 { + } + 1447 ( 65 0 12988 6 52 14 0 0 ) 2 { + 2 1450 (-4879.0581054688 3759.9155273438 192) (-4879.0512695313 3759.515625 192) 3541 0 + 2 1416 (-4880 3776 192) (-4880.5 3776 192) 3457 1 + } + 1448 ( 65 0 12994 5 52 15 0 0 ) 4 { + 2 1453 (-4888 3727.9155273438 184) (-4887.9990234375 3727.515625 184) 3544 0 + 2 1421 (-4896.1000976563 3760 192) (-4896.5 3760 184) 3545 1 + 2 1416 (-4888 3760.1000976563 192) (-4888 3760.5 192) 3458 0 + 2 1450 (-4880 3744.015625 188) (-4879.5 3744.015625 188) 3543 1 + } + 1449 ( 2 0 12999 10 0 0 0 0 ) 0 { + } + 1450 ( 65 0 13009 6 52 16 0 0 ) 2 { + 2 1447 (-4879.0610351563 3760.1157226563 192) (-4879.0678710938 3760.515625 192) 3541 0 + 2 1448 (-4880 3744.015625 188) (-4880.5 3744.015625 188) 3543 1 + } + 1451 ( 2 0 13015 7 0 0 0 0 ) 0 { + } + 1452 ( 65 4 13022 8 -62 0 0 0 ) 3 { + 2 1423 (-4896.1000976563 3540 137) (-4896.5 3540 136) 3549 1 + 2 1470 (-4888 3536.015625 136) (-4888 3535.515625 136) 3548 1 + 2 1453 (-4888 3540 137) (-4888 3540.5 137) 3550 1 + } + 1453 ( 65 0 13030 11 52 17 0 0 ) 8 { + 2 1448 (-4888 3728.1157226563 184) (-4888.0009765625 3728.515625 184) 3544 0 + 2 1426 (-4896.1000976563 3664.0314941406 168) (-4896.5 3664 160) 3555 1 + 2 1425 (-4896.1000976563 3632 160) (-4896.5 3632 152) 3554 1 + 2 1424 (-4896.1000976563 3600 152) (-4896.5 3600 144) 3553 1 + 2 1422 (-4896.1000976563 3568 144) (-4896.5 3568 136) 3552 1 + 2 1420 (-4896.1000976563 3728 184) (-4896.5 3728 176) 3557 1 + 2 1419 (-4896.1000976563 3696 176) (-4896.5 3696 168) 3556 1 + 2 1452 (-4888 3540 137) (-4888 3539.5 137) 3550 1 + } + 1454 ( 2 0 13041 16 0 0 0 0 ) 0 { + } + 1455 ( 2 0 13057 7 0 0 0 0 ) 0 { + } + 1456 ( 69 0 13064 7 18 381 0 0 ) 2 { + 2 1413 (-4864 3896 576) (-4864.5 3896 576) 3443 1 + 2 1457 (-4856 3936 576) (-4856 3936.5 576) 3558 1 + } + 1457 ( 69 0 13071 7 18 382 0 0 ) 3 { + 2 1413 (-4880 3952 576) (-4880.353515625 3951.646484375 576) 3442 1 + 2 1414 (-4880 3968 576) (-4880 3968.5 576) 3450 1 + 2 1456 (-4856 3936 576) (-4856 3935.5 576) 3558 1 + } + 1458 ( 65 0 13078 9 50 2 0 0 ) 4 { + 2 1474 (-4688 3359.8999023438 80) (-4688 3359.5 80) 3563 0 + 2 1466 (-4688 3488.1000976563 80) (-4688 3488.5 80) 3565 0 + 2 1459 (-4720.1000976563 3424 80) (-4720.5 3424 88) 3564 0 + 2 1264 (-4687.8999023438 3424 80) (-4687.5 3424 72) 3566 1 + } + 1459 ( 65 0 13087 9 50 3 0 0 ) 4 { + 2 1474 (-4720 3359.8999023438 88) (-4720 3359.5 88) 3570 0 + 2 1466 (-4720 3488.1000976563 88) (-4720 3488.5 88) 3568 0 + 2 1460 (-4752.1000976563 3424 88) (-4752.5 3424 96) 3567 0 + 2 1458 (-4719.8999023438 3424 88) (-4719.5 3424 80) 3569 1 + } + 1460 ( 65 0 13096 8 50 4 0 0 ) 4 { + 2 1474 (-4752 3359.8999023438 96) (-4752 3359.5 96) 3573 0 + 2 1466 (-4752 3488.1000976563 96) (-4752 3488.5 96) 3571 0 + 2 1459 (-4751.8999023438 3424 96) (-4751.5 3424 88) 3572 1 + 2 1461 (-4780 3424 96) (-4780.5 3424 96) 3574 1 + } + 1461 ( 65 0 13104 9 50 5 0 0 ) 4 { + 2 1476 (-4780 3359.8999023438 96) (-4780 3359.5 103) 3577 0 + 2 1468 (-4780 3488.1000976563 96) (-4780 3488.5 103) 3576 0 + 2 1464 (-4784.1000976563 3424 96) (-4784.5 3424 104) 3575 0 + 2 1460 (-4780 3424 96) (-4779.5 3424 96) 3574 1 + } + 1462 ( 65 0 13113 8 54 0 0 0 ) 4 { + 2 1475 (-4816 3359.8999023438 112) (-4816 3359.5 112) 3580 0 + 2 1467 (-4816.0146484375 3488.1000976563 112) (-4816.0146484375 3488.5 112) 3578 0 + 2 1464 (-4815.9072265625 3424 112) (-4815.5 3424 104) 3579 1 + 2 1463 (-4844 3424 112) (-4844.5 3424 112) 3581 1 + } + 1463 ( 65 0 13121 9 54 1 0 0 ) 4 { + 2 1477 (-4844 3359.8999023438 112) (-4844 3359.5 119) 3584 0 + 2 1469 (-4844 3488.1000976563 112) (-4844 3488.5 119) 3583 0 + 2 1465 (-4848.1000976563 3424 112) (-4848.5 3424 120) 3582 0 + 2 1462 (-4844 3424 112) (-4843.5 3424 112) 3581 1 + } + 1464 ( 65 4 13130 9 -63 0 0 0 ) 4 { + 2 1476 (-4784 3359.8999023438 104) (-4784 3359.5 104) 3587 0 + 2 1468 (-4784 3488.1000976563 104) (-4784 3488.5 104) 3585 0 + 2 1462 (-4816.1000976563 3424 104) (-4816.5073242188 3424 112) 3588 0 + 2 1461 (-4783.8999023438 3424 104) (-4783.5 3424 96) 3586 1 + } + 1465 ( 65 4 13139 8 -64 0 0 0 ) 4 { + 2 1463 (-4847.8999023438 3424 120) (-4847.5 3424 112) 3591 1 + 2 1477 (-4848 3352 120) (-4847.5 3352 120) 3592 1 + 2 1427 (-4880 3424 120) (-4880.5 3424 120) 3499 1 + 2 1469 (-4848 3496 120) (-4847.5 3496 120) 3590 1 + } + 1466 ( 65 0 13147 9 50 6 0 0 ) 7 { + 2 1460 (-4780 3487.8999023438 103) (-4780 3487.5 96) 3600 1 + 2 1459 (-4752 3487.8999023438 96) (-4752 3487.5 88) 3599 1 + 2 1458 (-4720 3487.8999023438 88) (-4720 3487.5 80) 3598 1 + 2 1264 (-4687.8999023438 3504 80) (-4687.5 3504 72) 3597 1 + 2 1472 (-4780 3512 103) (-4780.5 3512 103) 3595 1 + 2 1471 (-4734 3520 91.5) (-4734 3520.5 91.5) 3596 1 + 2 1468 (-4780 3496 103) (-4780.5 3496 103) 3594 1 + } + 1467 ( 65 0 13156 6 54 2 0 0 ) 3 { + 2 1462 (-4844 3487.8999023438 119) (-4844 3487.5 112) 3601 1 + 2 1468 (-4816.0073242188 3496 112) (-4815.5073242188 3496 112) 3604 1 + 2 1469 (-4844 3496 119) (-4844.5 3496 119) 3602 1 + } + 1468 ( 65 4 13162 8 -65 0 0 0 ) 5 { + 2 1464 (-4816.0146484375 3487.8999023438 112) (-4816 3487.5 104) 3606 1 + 2 1461 (-4784 3487.8999023438 104) (-4784 3487.5 96) 3605 1 + 2 1467 (-4816.0073242188 3496 112) (-4816.5073242188 3496 112) 3604 1 + 2 1466 (-4780 3496 103) (-4779.5 3496 103) 3594 1 + 2 1472 (-4782 3504 103.5) (-4782 3504.5 103.5) 3608 1 + } + 1469 ( 65 0 13170 6 54 3 0 0 ) 3 { + 2 1463 (-4848 3487.8999023438 120) (-4848 3487.5 112) 3609 1 + 2 1465 (-4848 3496 120) (-4848.5 3496 120) 3590 1 + 2 1467 (-4844 3496 119) (-4843.5 3496 119) 3602 1 + } + 1470 ( 65 0 13176 6 53 2 0 0 ) 3 { + 2 1428 (-4896.1000976563 3536.0314941406 136) (-4896.5 3536 128) 3613 1 + 2 1427 (-4888 3503.8999023438 128) (-4888 3503.5 120) 3612 1 + 2 1452 (-4888 3536.015625 136) (-4888 3536.515625 136) 3548 1 + } + 1471 ( 69 0 13182 6 50 7 0 0 ) 4 { + 8 1445 (-4780 3536 103) (-4780 3538 72) 3615 101 + 2 1264 (-4687.8999023438 3528 80) (-4687.5 3528 72) 3616 1 + 2 1473 (-4780 3528 103) (-4780.5 3528 103) 3614 1 + 2 1466 (-4734 3520 91.5) (-4734 3519.5 91.5) 3596 1 + } + 1472 ( 65 0 13188 6 50 8 0 0 ) 3 { + 2 1473 (-4782 3520 103.5) (-4782 3520.5 103.5) 3618 1 + 2 1466 (-4780 3512 103) (-4779.5 3512 103) 3595 1 + 2 1468 (-4782 3504 103.5) (-4782 3503.5 103.5) 3608 1 + } + 1473 ( 69 0 13194 6 50 9 0 0 ) 3 { + 8 1445 (-4784 3536 104) (-4784 3538 72) 3620 101 + 2 1471 (-4780 3528 103) (-4779.5 3528 103) 3614 1 + 2 1472 (-4782 3520 103.5) (-4782 3519.5 103.5) 3618 1 + } + 1474 ( 65 0 13200 8 50 10 0 0 ) 5 { + 2 1460 (-4780 3360.1000976563 103) (-4780 3360.5 96) 3623 1 + 2 1459 (-4752 3360.1000976563 96) (-4752 3360.5 88) 3624 1 + 2 1458 (-4720 3360.1000976563 88) (-4720 3360.5 80) 3625 1 + 2 1264 (-4687.8999023438 3352 80) (-4687.5 3352 72) 3626 1 + 2 1476 (-4780 3352 103) (-4780.5 3352 103) 3622 1 + } + 1475 ( 65 0 13208 6 54 4 0 0 ) 3 { + 2 1462 (-4844 3360.1000976563 119) (-4844 3360.5 112) 3629 1 + 2 1476 (-4816 3352 112) (-4815.5 3352 112) 3630 1 + 2 1477 (-4844 3352 119) (-4844.5 3352 119) 3628 1 + } + 1476 ( 65 4 13214 7 -66 0 0 0 ) 4 { + 2 1464 (-4816 3360.1000976563 112) (-4816 3360.5 104) 3632 1 + 2 1461 (-4784 3360.1000976563 104) (-4784 3360.5 96) 3633 1 + 2 1475 (-4816 3352 112) (-4816.5 3352 112) 3630 1 + 2 1474 (-4780 3352 103) (-4779.5 3352 103) 3622 1 + } + 1477 ( 65 0 13221 6 54 5 0 0 ) 3 { + 2 1463 (-4848 3360.1000976563 120) (-4848 3360.5 112) 3635 1 + 2 1465 (-4848 3352 120) (-4848.5 3352 120) 3592 1 + 2 1475 (-4844 3352 119) (-4843.5 3352 119) 3628 1 + } +} +nodes 4417 { + 0 ( 0 0 0 ) + 1 ( 0 2 1915 ) + 2 ( 2 3 1458 ) + 3 ( 4 4 253 ) + 4 ( 6 5 0 ) + 5 ( 8 6 11 ) + 6 ( 11 7 0 ) + 7 ( 13 8 9 ) + 8 ( 15 -1 0 ) + 9 ( 19 10 0 ) + 10 ( 21 -2 0 ) + 11 ( 23 12 94 ) + 12 ( 25 13 71 ) + 13 ( 27 14 60 ) + 14 ( 29 15 47 ) + 15 ( 30 16 41 ) + 16 ( 33 17 30 ) + 17 ( 34 18 23 ) + 18 ( 37 19 21 ) + 19 ( 38 20 -5 ) + 20 ( 40 -3 -4 ) + 21 ( 42 22 0 ) + 22 ( 44 -6 -7 ) + 23 ( 39 24 28 ) + 24 ( 37 25 26 ) + 25 ( 46 -8 -9 ) + 26 ( 51 27 0 ) + 27 ( 46 -10 -11 ) + 28 ( 52 29 0 ) + 29 ( 51 -12 0 ) + 30 ( 51 0 31 ) + 31 ( 54 32 0 ) + 32 ( 42 33 39 ) + 33 ( 57 34 36 ) + 34 ( 36 35 -15 ) + 35 ( 44 -13 -14 ) + 36 ( 58 37 38 ) + 37 ( 60 -16 -17 ) + 38 ( 61 -17 0 ) + 39 ( 37 40 0 ) + 40 ( 64 -18 -19 ) + 41 ( 66 42 45 ) + 42 ( 68 0 43 ) + 43 ( 47 44 0 ) + 44 ( 70 -20 -21 ) + 45 ( 77 -22 46 ) + 46 ( 80 -23 0 ) + 47 ( 83 48 50 ) + 48 ( 58 49 0 ) + 49 ( 13 -24 0 ) + 50 ( 21 51 0 ) + 51 ( 86 52 0 ) + 52 ( 36 53 56 ) + 53 ( 88 54 55 ) + 54 ( 58 -25 0 ) + 55 ( 58 -26 0 ) + 56 ( 58 57 0 ) + 57 ( 93 58 0 ) + 58 ( 95 -27 59 ) + 59 ( 96 -27 0 ) + 60 ( 86 61 68 ) + 61 ( 21 62 0 ) + 62 ( 36 63 64 ) + 63 ( 88 -25 -26 ) + 64 ( 99 65 67 ) + 65 ( 100 -28 66 ) + 66 ( 102 -28 0 ) + 67 ( 104 -28 0 ) + 68 ( 106 0 69 ) + 69 ( 13 70 0 ) + 70 ( 29 -29 0 ) + 71 ( 108 72 86 ) + 72 ( 21 73 0 ) + 73 ( 110 74 83 ) + 74 ( 113 -30 75 ) + 75 ( 45 76 78 ) + 76 ( 114 77 -33 ) + 77 ( 100 -31 -32 ) + 78 ( 118 -34 79 ) + 79 ( 121 80 82 ) + 80 ( 114 81 -37 ) + 81 ( 100 -35 -36 ) + 82 ( 122 -38 0 ) + 83 ( 100 -39 84 ) + 84 ( 124 85 0 ) + 85 ( 12 -40 -41 ) + 86 ( 36 87 89 ) + 87 ( 29 -29 88 ) + 88 ( 124 -42 0 ) + 89 ( 21 90 0 ) + 90 ( 106 0 91 ) + 91 ( 13 92 0 ) + 92 ( 29 -29 93 ) + 93 ( 124 -42 0 ) + 94 ( 127 95 155 ) + 95 ( 76 96 151 ) + 96 ( 129 97 112 ) + 97 ( 21 98 0 ) + 98 ( 42 99 0 ) + 99 ( 113 100 103 ) + 100 ( 131 -43 101 ) + 101 ( 132 -43 102 ) + 102 ( 118 -44 0 ) + 103 ( 58 104 0 ) + 104 ( 25 105 107 ) + 105 ( 140 106 0 ) + 106 ( 86 -25 0 ) + 107 ( 108 108 0 ) + 108 ( 118 109 0 ) + 109 ( 138 -45 110 ) + 110 ( 142 111 -44 ) + 111 ( 136 -46 -44 ) + 112 ( 113 113 126 ) + 113 ( 42 114 0 ) + 114 ( 131 115 123 ) + 115 ( 118 116 120 ) + 116 ( 144 117 -49 ) + 117 ( 136 -47 118 ) + 118 ( 134 -47 119 ) + 119 ( 132 -48 -44 ) + 120 ( 145 -50 121 ) + 121 ( 121 -51 122 ) + 122 ( 150 -52 0 ) + 123 ( 118 124 0 ) + 124 ( 136 -53 125 ) + 125 ( 134 -54 -44 ) + 126 ( 25 127 148 ) + 127 ( 42 128 0 ) + 128 ( 152 129 135 ) + 129 ( 91 130 132 ) + 130 ( 58 131 0 ) + 131 ( 21 -25 0 ) + 132 ( 155 133 0 ) + 133 ( 157 134 0 ) + 134 ( 58 -55 0 ) + 135 ( 91 136 139 ) + 136 ( 58 137 0 ) + 137 ( 140 138 0 ) + 138 ( 86 -25 0 ) + 139 ( 86 140 0 ) + 140 ( 159 141 144 ) + 141 ( 157 142 0 ) + 142 ( 58 143 0 ) + 143 ( 160 -56 0 ) + 144 ( 58 145 0 ) + 145 ( 162 146 0 ) + 146 ( 165 147 0 ) + 147 ( 157 -57 0 ) + 148 ( 21 149 0 ) + 149 ( 108 150 0 ) + 150 ( 118 -53 0 ) + 151 ( 42 152 0 ) + 152 ( 166 153 154 ) + 153 ( 128 -58 -59 ) + 154 ( 168 -60 0 ) + 155 ( 131 156 239 ) + 156 ( 147 157 176 ) + 157 ( 42 158 173 ) + 158 ( 76 159 168 ) + 159 ( 118 160 161 ) + 160 ( 144 -47 -49 ) + 161 ( 145 162 164 ) + 162 ( 170 -61 163 ) + 163 ( 149 -50 -62 ) + 164 ( 121 165 167 ) + 165 ( 170 -63 166 ) + 166 ( 149 -51 -64 ) + 167 ( 150 -52 0 ) + 168 ( 172 169 172 ) + 169 ( 175 170 171 ) + 170 ( 177 -65 0 ) + 171 ( 166 -58 0 ) + 172 ( 166 -58 0 ) + 173 ( 54 174 0 ) + 174 ( 76 175 0 ) + 175 ( 170 -66 0 ) + 176 ( 180 177 0 ) + 177 ( 182 178 205 ) + 178 ( 15 179 0 ) + 179 ( 184 180 186 ) + 180 ( 186 -67 181 ) + 181 ( 188 182 -73 ) + 182 ( 190 183 -72 ) + 183 ( 193 184 -71 ) + 184 ( 194 185 -70 ) + 185 ( 196 -68 -69 ) + 186 ( 198 187 197 ) + 187 ( 200 188 -84 ) + 188 ( 202 189 192 ) + 189 ( 205 190 -77 ) + 190 ( 206 191 -76 ) + 191 ( 208 -74 -75 ) + 192 ( 212 -78 193 ) + 193 ( 205 194 -83 ) + 194 ( 215 195 -82 ) + 195 ( 206 196 -81 ) + 196 ( 70 -79 -80 ) + 197 ( 216 -85 198 ) + 198 ( 218 199 -93 ) + 199 ( 186 -86 200 ) + 200 ( 190 201 -92 ) + 201 ( 221 202 -91 ) + 202 ( 193 203 -90 ) + 203 ( 222 204 -89 ) + 204 ( 196 -87 -88 ) + 205 ( 199 206 226 ) + 206 ( 150 207 215 ) + 207 ( 219 208 212 ) + 208 ( 224 -94 209 ) + 209 ( 226 210 0 ) + 210 ( 229 211 -97 ) + 211 ( 230 -95 -96 ) + 212 ( 216 -98 213 ) + 213 ( 191 -92 214 ) + 214 ( 186 -99 0 ) + 215 ( 145 216 225 ) + 216 ( 219 217 222 ) + 217 ( 224 -100 218 ) + 218 ( 226 219 0 ) + 219 ( 232 220 -104 ) + 220 ( 229 221 -103 ) + 221 ( 230 -101 -102 ) + 222 ( 216 -105 223 ) + 223 ( 191 -92 224 ) + 224 ( 186 -106 0 ) + 225 ( 118 -107 0 ) + 226 ( 184 227 236 ) + 227 ( 15 228 0 ) + 228 ( 186 229 234 ) + 229 ( 118 230 231 ) + 230 ( 144 -108 -109 ) + 231 ( 145 -109 232 ) + 232 ( 121 -110 233 ) + 233 ( 150 -110 0 ) + 234 ( 189 -73 235 ) + 235 ( 191 -72 0 ) + 236 ( 212 237 238 ) + 237 ( 203 -78 0 ) + 238 ( 201 -84 0 ) + 239 ( 112 240 245 ) + 240 ( 118 241 0 ) + 241 ( 21 242 0 ) + 242 ( 15 243 0 ) + 243 ( 13 -111 244 ) + 244 ( 19 -112 0 ) + 245 ( 15 246 0 ) + 246 ( 118 247 0 ) + 247 ( 199 -113 248 ) + 248 ( 184 -114 249 ) + 249 ( 182 250 0 ) + 250 ( 205 251 -77 ) + 251 ( 206 252 -76 ) + 252 ( 211 -74 -115 ) + 253 ( 6 254 0 ) + 254 ( 8 255 262 ) + 255 ( 11 256 0 ) + 256 ( 116 257 258 ) + 257 ( 21 -116 0 ) + 258 ( 234 259 0 ) + 259 ( 237 260 0 ) + 260 ( 197 -117 261 ) + 261 ( 238 -118 0 ) + 262 ( 240 263 1019 ) + 263 ( 243 264 702 ) + 264 ( 244 265 473 ) + 265 ( 246 266 269 ) + 266 ( 236 0 267 ) + 267 ( 258 268 0 ) + 268 ( 238 -119 0 ) + 269 ( 239 270 434 ) + 270 ( 236 271 425 ) + 271 ( 262 272 298 ) + 272 ( 265 273 290 ) + 273 ( 266 274 281 ) + 274 ( 269 275 0 ) + 275 ( 27 276 277 ) + 276 ( 270 -120 0 ) + 277 ( 162 278 280 ) + 278 ( 255 -121 279 ) + 279 ( 274 -122 0 ) + 280 ( 276 -123 0 ) + 281 ( 101 0 282 ) + 282 ( 278 283 0 ) + 283 ( 280 284 288 ) + 284 ( 27 285 0 ) + 285 ( 283 286 287 ) + 286 ( 58 -124 0 ) + 287 ( 284 -125 0 ) + 288 ( 283 289 0 ) + 289 ( 286 -126 0 ) + 290 ( 278 291 0 ) + 291 ( 58 292 0 ) + 292 ( 288 293 295 ) + 293 ( 291 -127 294 ) + 294 ( 292 -128 0 ) + 295 ( 283 296 0 ) + 296 ( 294 0 297 ) + 297 ( 292 -128 0 ) + 298 ( 58 299 367 ) + 299 ( 158 300 344 ) + 300 ( 155 301 0 ) + 301 ( 269 302 0 ) + 302 ( 296 303 331 ) + 303 ( 265 304 327 ) + 304 ( 27 305 309 ) + 305 ( 299 306 307 ) + 306 ( 266 -129 -130 ) + 307 ( 266 308 0 ) + 308 ( 272 -120 -131 ) + 309 ( 266 310 0 ) + 310 ( 162 311 321 ) + 311 ( 250 312 318 ) + 312 ( 255 313 315 ) + 313 ( 272 -121 314 ) + 314 ( 299 -132 -133 ) + 315 ( 274 316 0 ) + 316 ( 272 -122 317 ) + 317 ( 299 -134 -135 ) + 318 ( 306 319 0 ) + 319 ( 255 -136 320 ) + 320 ( 274 -134 0 ) + 321 ( 250 322 325 ) + 322 ( 276 323 0 ) + 323 ( 272 -123 324 ) + 324 ( 299 -137 -138 ) + 325 ( 306 326 0 ) + 326 ( 276 -136 0 ) + 327 ( 299 328 0 ) + 328 ( 308 329 0 ) + 329 ( 27 330 0 ) + 330 ( 310 -139 -140 ) + 331 ( 311 332 0 ) + 332 ( 27 333 0 ) + 333 ( 313 334 338 ) + 334 ( 314 335 337 ) + 335 ( 317 -141 336 ) + 336 ( 318 -141 0 ) + 337 ( 320 -141 0 ) + 338 ( 283 339 0 ) + 339 ( 323 340 342 ) + 340 ( 266 341 0 ) + 341 ( 265 -142 0 ) + 342 ( 266 343 0 ) + 343 ( 265 -143 0 ) + 344 ( 249 0 345 ) + 345 ( 329 346 0 ) + 346 ( 306 347 363 ) + 347 ( 181 348 0 ) + 348 ( 101 349 356 ) + 349 ( 27 350 355 ) + 350 ( 330 351 0 ) + 351 ( 296 352 354 ) + 352 ( 299 -144 353 ) + 353 ( 334 -145 0 ) + 354 ( 336 -146 0 ) + 355 ( 338 -147 0 ) + 356 ( 303 357 360 ) + 357 ( 296 358 0 ) + 358 ( 299 359 0 ) + 359 ( 27 -144 0 ) + 360 ( 296 361 0 ) + 361 ( 27 362 0 ) + 362 ( 299 -130 0 ) + 363 ( 330 364 0 ) + 364 ( 181 365 0 ) + 365 ( 101 366 0 ) + 366 ( 27 -146 0 ) + 367 ( 101 368 371 ) + 368 ( 304 369 0 ) + 369 ( 296 370 0 ) + 370 ( 299 -144 0 ) + 371 ( 313 372 385 ) + 372 ( 175 373 376 ) + 373 ( 266 374 0 ) + 374 ( 265 375 0 ) + 375 ( 324 -148 0 ) + 376 ( 266 377 382 ) + 377 ( 311 378 0 ) + 378 ( 265 379 380 ) + 379 ( 324 -148 0 ) + 380 ( 324 381 0 ) + 381 ( 340 -149 0 ) + 382 ( 324 383 0 ) + 383 ( 158 384 0 ) + 384 ( 342 -150 0 ) + 385 ( 345 0 386 ) + 386 ( 308 387 400 ) + 387 ( 256 0 388 ) + 388 ( 266 389 395 ) + 389 ( 299 390 392 ) + 390 ( 300 391 0 ) + 391 ( 265 -129 0 ) + 392 ( 270 393 0 ) + 393 ( 265 394 0 ) + 394 ( 272 -120 -131 ) + 395 ( 272 0 396 ) + 396 ( 304 397 0 ) + 397 ( 303 398 399 ) + 398 ( 299 -144 0 ) + 399 ( 299 -130 0 ) + 400 ( 304 401 418 ) + 401 ( 300 402 413 ) + 402 ( 323 403 405 ) + 403 ( 266 404 0 ) + 404 ( 265 -142 0 ) + 405 ( 266 406 410 ) + 406 ( 296 407 408 ) + 407 ( 265 -129 0 ) + 408 ( 265 409 0 ) + 409 ( 248 -151 -152 ) + 410 ( 303 411 412 ) + 411 ( 296 -144 0 ) + 412 ( 296 -130 0 ) + 413 ( 296 0 414 ) + 414 ( 324 415 0 ) + 415 ( 323 416 417 ) + 416 ( 265 -142 0 ) + 417 ( 265 -152 0 ) + 418 ( 303 0 419 ) + 419 ( 296 0 420 ) + 420 ( 300 0 421 ) + 421 ( 324 422 0 ) + 422 ( 323 423 424 ) + 423 ( 266 -142 0 ) + 424 ( 266 -152 0 ) + 425 ( 27 426 0 ) + 426 ( 278 0 427 ) + 427 ( 299 428 0 ) + 428 ( 296 429 0 ) + 429 ( 349 0 430 ) + 430 ( 58 431 432 ) + 431 ( 332 -144 -153 ) + 432 ( 304 433 0 ) + 433 ( 332 -144 -153 ) + 434 ( 350 435 459 ) + 435 ( 352 436 445 ) + 436 ( 155 437 0 ) + 437 ( 27 438 0 ) + 438 ( 163 439 443 ) + 439 ( 355 440 441 ) + 440 ( 58 -154 0 ) + 441 ( 58 442 0 ) + 442 ( 356 -155 -156 ) + 443 ( 58 444 0 ) + 444 ( 355 -154 0 ) + 445 ( 101 446 450 ) + 446 ( 58 447 0 ) + 447 ( 360 448 0 ) + 448 ( 27 449 0 ) + 449 ( 362 -157 0 ) + 450 ( 266 451 0 ) + 451 ( 265 452 0 ) + 452 ( 58 453 456 ) + 453 ( 283 454 0 ) + 454 ( 365 -158 455 ) + 455 ( 366 -159 -160 ) + 456 ( 349 0 457 ) + 457 ( 270 458 0 ) + 458 ( 365 -158 -160 ) + 459 ( 27 460 0 ) + 460 ( 86 461 465 ) + 461 ( 58 462 0 ) + 462 ( 355 463 464 ) + 463 ( 352 -154 0 ) + 464 ( 356 -155 -156 ) + 465 ( 369 466 0 ) + 466 ( 371 467 470 ) + 467 ( 58 468 0 ) + 468 ( 352 469 0 ) + 469 ( 355 -161 0 ) + 470 ( 355 471 0 ) + 471 ( 58 472 0 ) + 472 ( 352 -162 0 ) + 473 ( 375 474 578 ) + 474 ( 42 475 537 ) + 475 ( 260 476 501 ) + 476 ( 349 0 477 ) + 477 ( 376 478 490 ) + 478 ( 58 479 0 ) + 479 ( 27 480 0 ) + 480 ( 379 481 487 ) + 481 ( 278 482 485 ) + 482 ( 381 483 0 ) + 483 ( 383 -163 484 ) + 484 ( 386 -164 0 ) + 485 ( 83 -163 486 ) + 486 ( 299 -165 0 ) + 487 ( 83 488 0 ) + 488 ( 385 -163 489 ) + 489 ( 60 -166 -167 ) + 490 ( 27 491 0 ) + 491 ( 60 492 496 ) + 492 ( 83 493 0 ) + 493 ( 296 494 0 ) + 494 ( 58 495 0 ) + 495 ( 389 -168 0 ) + 496 ( 58 497 0 ) + 497 ( 131 498 499 ) + 498 ( 392 -169 0 ) + 499 ( 390 500 0 ) + 500 ( 296 -168 0 ) + 501 ( 299 502 527 ) + 502 ( 249 503 511 ) + 503 ( 395 504 0 ) + 504 ( 175 505 0 ) + 505 ( 203 506 0 ) + 506 ( 397 -170 507 ) + 507 ( 399 508 510 ) + 508 ( 77 -171 509 ) + 509 ( 400 -172 0 ) + 510 ( 196 -173 0 ) + 511 ( 58 512 0 ) + 512 ( 392 513 521 ) + 513 ( 27 514 518 ) + 514 ( 197 515 517 ) + 515 ( 402 -174 516 ) + 516 ( 376 -175 0 ) + 517 ( 404 -176 -177 ) + 518 ( 234 519 0 ) + 519 ( 406 520 0 ) + 520 ( 197 -178 0 ) + 521 ( 408 522 0 ) + 522 ( 296 523 0 ) + 523 ( 27 524 0 ) + 524 ( 404 525 526 ) + 525 ( 209 -179 0 ) + 526 ( 197 -180 -177 ) + 527 ( 58 528 0 ) + 528 ( 411 529 533 ) + 529 ( 406 530 531 ) + 530 ( 197 -178 0 ) + 531 ( 27 532 0 ) + 532 ( 197 -181 0 ) + 533 ( 197 534 0 ) + 534 ( 413 535 536 ) + 535 ( 385 -182 -183 ) + 536 ( 406 -178 0 ) + 537 ( 299 538 558 ) + 538 ( 417 539 0 ) + 539 ( 418 540 0 ) + 540 ( 201 541 551 ) + 541 ( 296 542 544 ) + 542 ( 66 543 0 ) + 543 ( 76 -184 -185 ) + 544 ( 66 545 0 ) + 545 ( 421 546 549 ) + 546 ( 76 547 548 ) + 547 ( 330 -186 0 ) + 548 ( 330 -187 0 ) + 549 ( 422 550 0 ) + 550 ( 76 -186 -187 ) + 551 ( 330 552 0 ) + 552 ( 71 553 0 ) + 553 ( 424 554 0 ) + 554 ( 66 555 0 ) + 555 ( 296 -188 556 ) + 556 ( 421 -186 557 ) + 557 ( 422 -186 0 ) + 558 ( 201 559 573 ) + 559 ( 76 560 568 ) + 560 ( 417 561 0 ) + 561 ( 66 562 565 ) + 562 ( 272 563 -192 ) + 563 ( 385 564 -191 ) + 564 ( 426 -189 -190 ) + 565 ( 272 566 0 ) + 566 ( 428 567 0 ) + 567 ( 385 -189 -191 ) + 568 ( 428 569 0 ) + 569 ( 379 570 0 ) + 570 ( 417 571 0 ) + 571 ( 278 572 0 ) + 572 ( 430 -193 0 ) + 573 ( 433 574 0 ) + 574 ( 379 575 0 ) + 575 ( 417 576 0 ) + 576 ( 278 577 0 ) + 577 ( 428 -194 0 ) + 578 ( 197 579 617 ) + 579 ( 238 580 607 ) + 580 ( 66 581 599 ) + 581 ( 58 582 595 ) + 582 ( 435 583 588 ) + 583 ( 212 584 586 ) + 584 ( 190 -195 585 ) + 585 ( 437 -196 -197 ) + 586 ( 366 -198 587 ) + 587 ( 437 -196 -199 ) + 588 ( 213 -198 589 ) + 589 ( 258 590 592 ) + 590 ( 438 591 -202 ) + 591 ( 190 -200 -201 ) + 592 ( 443 593 594 ) + 593 ( 190 -203 -204 ) + 594 ( 444 -205 0 ) + 595 ( 366 596 598 ) + 596 ( 57 -206 597 ) + 597 ( 213 -198 0 ) + 598 ( 57 -206 0 ) + 599 ( 71 600 603 ) + 600 ( 447 -207 601 ) + 601 ( 201 -208 602 ) + 602 ( 448 -209 -210 ) + 603 ( 450 604 606 ) + 604 ( 448 -211 605 ) + 605 ( 447 -212 -213 ) + 606 ( 448 -211 0 ) + 607 ( 417 608 611 ) + 608 ( 201 609 0 ) + 609 ( 428 610 0 ) + 610 ( 76 -191 0 ) + 611 ( 57 0 612 ) + 612 ( 58 613 0 ) + 613 ( 413 -183 614 ) + 614 ( 406 -214 615 ) + 615 ( 454 616 0 ) + 616 ( 457 -215 -216 ) + 617 ( 27 618 686 ) + 618 ( 367 619 630 ) + 619 ( 391 620 0 ) + 620 ( 260 621 0 ) + 621 ( 238 622 628 ) + 622 ( 460 623 0 ) + 623 ( 462 624 626 ) + 624 ( 175 -217 625 ) + 625 ( 58 -218 -219 ) + 626 ( 55 627 -221 ) + 627 ( 464 -220 0 ) + 628 ( 58 629 0 ) + 629 ( 457 -222 -223 ) + 630 ( 203 631 640 ) + 631 ( 352 632 0 ) + 632 ( 55 633 0 ) + 633 ( 468 634 0 ) + 634 ( 470 635 636 ) + 635 ( 192 -224 -225 ) + 636 ( 193 637 0 ) + 637 ( 447 638 639 ) + 638 ( 440 -226 -227 ) + 639 ( 440 -226 -227 ) + 640 ( 446 641 645 ) + 641 ( 391 642 0 ) + 642 ( 58 0 643 ) + 643 ( 55 644 0 ) + 644 ( 470 -228 0 ) + 645 ( 460 646 0 ) + 646 ( 464 647 681 ) + 647 ( 369 648 678 ) + 648 ( 372 649 652 ) + 649 ( 355 650 0 ) + 650 ( 58 651 0 ) + 651 ( 352 -161 0 ) + 652 ( 473 653 674 ) + 653 ( 355 654 671 ) + 654 ( 58 655 658 ) + 655 ( 391 656 657 ) + 656 ( 260 -218 0 ) + 657 ( 352 -229 0 ) + 658 ( 391 659 0 ) + 659 ( 352 660 667 ) + 660 ( 55 661 664 ) + 661 ( 260 662 663 ) + 662 ( 466 -230 -220 ) + 663 ( 466 -230 -231 ) + 664 ( 260 665 0 ) + 665 ( 462 666 -221 ) + 666 ( 175 -217 -219 ) + 667 ( 260 668 0 ) + 668 ( 462 669 670 ) + 669 ( 175 -217 -219 ) + 670 ( 55 -220 -221 ) + 671 ( 58 0 672 ) + 672 ( 391 673 0 ) + 673 ( 55 -230 0 ) + 674 ( 355 675 0 ) + 675 ( 58 676 0 ) + 676 ( 352 677 0 ) + 677 ( 140 -232 -233 ) + 678 ( 391 679 0 ) + 679 ( 260 680 0 ) + 680 ( 355 -218 0 ) + 681 ( 391 682 0 ) + 682 ( 260 683 684 ) + 683 ( 466 -230 0 ) + 684 ( 352 685 0 ) + 685 ( 466 -230 0 ) + 686 ( 391 687 695 ) + 687 ( 260 688 690 ) + 688 ( 258 689 0 ) + 689 ( 238 -119 0 ) + 690 ( 258 691 0 ) + 691 ( 238 692 0 ) + 692 ( 438 -200 693 ) + 693 ( 440 -234 694 ) + 694 ( 435 -235 -202 ) + 695 ( 475 696 698 ) + 696 ( 258 697 0 ) + 697 ( 238 -119 0 ) + 698 ( 355 699 701 ) + 699 ( 258 700 0 ) + 700 ( 238 -119 0 ) + 701 ( 258 -119 0 ) + 702 ( 27 703 945 ) + 703 ( 57 704 880 ) + 704 ( 75 705 753 ) + 705 ( 66 706 749 ) + 706 ( 417 707 736 ) + 707 ( 13 708 733 ) + 708 ( 468 709 718 ) + 709 ( 29 710 715 ) + 710 ( 391 711 714 ) + 711 ( 84 -236 712 ) + 712 ( 196 713 -239 ) + 713 ( 440 -237 -238 ) + 714 ( 84 -236 0 ) + 715 ( 84 716 0 ) + 716 ( 476 -240 717 ) + 717 ( 480 -240 0 ) + 718 ( 391 719 728 ) + 719 ( 84 720 727 ) + 720 ( 196 721 723 ) + 721 ( 440 -241 722 ) + 722 ( 482 -242 -243 ) + 723 ( 70 724 -247 ) + 724 ( 452 725 -246 ) + 725 ( 482 726 -245 ) + 726 ( 484 -242 -244 ) + 727 ( 197 -239 0 ) + 728 ( 29 729 730 ) + 729 ( 84 -241 0 ) + 730 ( 84 731 0 ) + 731 ( 476 -240 732 ) + 732 ( 480 -240 0 ) + 733 ( 486 734 0 ) + 734 ( 84 735 0 ) + 735 ( 476 -248 0 ) + 736 ( 13 737 0 ) + 737 ( 488 738 746 ) + 738 ( 29 739 743 ) + 739 ( 84 -236 740 ) + 740 ( 391 741 0 ) + 741 ( 197 -249 742 ) + 742 ( 55 -250 0 ) + 743 ( 480 744 0 ) + 744 ( 491 -251 745 ) + 745 ( 492 -252 0 ) + 746 ( 391 747 0 ) + 747 ( 55 -253 748 ) + 748 ( 197 -254 0 ) + 749 ( 480 750 0 ) + 750 ( 197 751 0 ) + 751 ( 71 -255 752 ) + 752 ( 453 -211 0 ) + 753 ( 13 754 874 ) + 754 ( 67 755 761 ) + 755 ( 495 756 757 ) + 756 ( 71 -255 0 ) + 757 ( 77 758 759 ) + 758 ( 78 -22 -256 ) + 759 ( 80 760 0 ) + 760 ( 78 -23 -257 ) + 761 ( 33 762 859 ) + 762 ( 30 763 832 ) + 763 ( 496 764 787 ) + 764 ( 34 765 771 ) + 765 ( 38 766 -263 ) + 766 ( 498 767 -262 ) + 767 ( 500 -258 768 ) + 768 ( 40 769 -261 ) + 769 ( 502 770 -260 ) + 770 ( 504 -259 -260 ) + 771 ( 39 772 778 ) + 772 ( 506 773 -269 ) + 773 ( 48 774 775 ) + 774 ( 46 -8 -264 ) + 775 ( 508 -265 776 ) + 776 ( 510 777 -268 ) + 777 ( 513 -266 -267 ) + 778 ( 499 779 786 ) + 779 ( 48 -270 780 ) + 780 ( 508 -265 781 ) + 781 ( 506 782 -269 ) + 782 ( 260 -271 783 ) + 783 ( 510 784 -268 ) + 784 ( 513 785 -267 ) + 785 ( 209 -266 -272 ) + 786 ( 514 -273 0 ) + 787 ( 54 788 806 ) + 788 ( 516 789 -286 ) + 789 ( 518 790 -285 ) + 790 ( 520 -274 791 ) + 791 ( 522 -275 792 ) + 792 ( 524 -276 793 ) + 793 ( 526 -277 794 ) + 794 ( 528 -278 795 ) + 795 ( 531 796 -284 ) + 796 ( 532 797 805 ) + 797 ( 534 798 -282 ) + 798 ( 536 799 804 ) + 799 ( 538 800 -281 ) + 800 ( 540 801 803 ) + 801 ( 543 802 -280 ) + 802 ( 544 -279 -280 ) + 803 ( 546 -280 -281 ) + 804 ( 548 -281 -282 ) + 805 ( 551 -282 -283 ) + 806 ( 517 807 816 ) + 807 ( 508 808 812 ) + 808 ( 552 -287 809 ) + 809 ( 554 810 -291 ) + 810 ( 556 811 -290 ) + 811 ( 559 -288 -289 ) + 812 ( 562 813 -293 ) + 813 ( 554 814 -291 ) + 814 ( 556 815 -290 ) + 815 ( 560 -288 -292 ) + 816 ( 519 817 819 ) + 817 ( 506 818 -296 ) + 818 ( 190 -294 -295 ) + 819 ( 522 820 822 ) + 820 ( 552 -287 821 ) + 821 ( 564 -297 -298 ) + 822 ( 526 823 824 ) + 823 ( 510 -299 -300 ) + 824 ( 528 825 827 ) + 825 ( 508 -297 826 ) + 826 ( 513 -301 -302 ) + 827 ( 524 828 829 ) + 828 ( 559 -303 -304 ) + 829 ( 520 830 0 ) + 830 ( 562 831 -306 ) + 831 ( 560 -305 -292 ) + 832 ( 508 833 845 ) + 833 ( 552 834 840 ) + 834 ( 49 835 838 ) + 835 ( 70 836 -21 ) + 836 ( 484 -307 837 ) + 837 ( 78 -308 -309 ) + 838 ( 47 839 0 ) + 839 ( 72 -20 -21 ) + 840 ( 564 841 843 ) + 841 ( 522 -310 842 ) + 842 ( 528 -310 0 ) + 843 ( 555 844 0 ) + 844 ( 70 -311 -21 ) + 845 ( 191 846 856 ) + 846 ( 563 847 853 ) + 847 ( 519 848 850 ) + 848 ( 70 849 -21 ) + 849 ( 484 -312 -313 ) + 850 ( 520 851 0 ) + 851 ( 70 852 -21 ) + 852 ( 484 -314 -313 ) + 853 ( 517 854 0 ) + 854 ( 555 855 0 ) + 855 ( 70 -311 -21 ) + 856 ( 507 -315 857 ) + 857 ( 496 858 0 ) + 858 ( 260 -271 0 ) + 859 ( 29 860 865 ) + 860 ( 54 861 864 ) + 861 ( 48 862 -319 ) + 862 ( 64 863 -318 ) + 863 ( 566 -316 -317 ) + 864 ( 49 -319 0 ) + 865 ( 568 866 870 ) + 866 ( 570 867 0 ) + 867 ( 417 -320 868 ) + 868 ( 491 -321 869 ) + 869 ( 492 -322 0 ) + 870 ( 478 871 0 ) + 871 ( 417 -240 872 ) + 872 ( 491 -251 873 ) + 873 ( 492 -252 0 ) + 874 ( 572 875 0 ) + 875 ( 486 876 0 ) + 876 ( 570 877 878 ) + 877 ( 417 -323 0 ) + 878 ( 495 879 0 ) + 879 ( 417 -323 0 ) + 880 ( 574 881 926 ) + 881 ( 577 882 0 ) + 882 ( 95 883 906 ) + 883 ( 163 884 903 ) + 884 ( 58 885 902 ) + 885 ( 13 886 888 ) + 886 ( 60 887 -324 ) + 887 ( 28 -24 -16 ) + 888 ( 579 889 890 ) + 889 ( 86 -155 0 ) + 890 ( 116 891 898 ) + 891 ( 580 892 896 ) + 892 ( 567 893 894 ) + 893 ( 106 -325 -326 ) + 894 ( 106 895 0 ) + 895 ( 86 -327 0 ) + 896 ( 106 897 0 ) + 897 ( 86 -328 0 ) + 898 ( 475 0 899 ) + 899 ( 359 900 901 ) + 900 ( 86 -155 0 ) + 901 ( 86 -329 0 ) + 902 ( 61 -324 0 ) + 903 ( 58 904 0 ) + 904 ( 116 905 0 ) + 905 ( 567 -330 -331 ) + 906 ( 582 907 0 ) + 907 ( 93 908 918 ) + 908 ( 116 909 0 ) + 909 ( 96 910 912 ) + 910 ( 58 911 0 ) + 911 ( 567 -330 -331 ) + 912 ( 49 913 0 ) + 913 ( 476 914 0 ) + 914 ( 585 915 917 ) + 915 ( 75 -332 916 ) + 916 ( 562 -333 0 ) + 917 ( 586 -334 0 ) + 918 ( 116 919 0 ) + 919 ( 58 920 0 ) + 920 ( 49 921 0 ) + 921 ( 585 922 925 ) + 922 ( 75 923 924 ) + 923 ( 476 -335 0 ) + 924 ( 562 -336 0 ) + 925 ( 586 -337 0 ) + 926 ( 61 927 936 ) + 927 ( 58 928 935 ) + 928 ( 84 929 932 ) + 929 ( 212 930 -341 ) + 930 ( 190 931 -340 ) + 931 ( 63 -338 -339 ) + 932 ( 197 933 0 ) + 933 ( 212 934 -341 ) + 934 ( 190 -342 -340 ) + 935 ( 213 -341 0 ) + 936 ( 86 937 939 ) + 937 ( 163 938 0 ) + 938 ( 58 -155 0 ) + 939 ( 58 940 0 ) + 940 ( 475 941 0 ) + 941 ( 84 942 0 ) + 942 ( 13 943 0 ) + 943 ( 28 -24 944 ) + 944 ( 63 -338 -16 ) + 945 ( 110 946 971 ) + 946 ( 116 947 950 ) + 947 ( 21 948 0 ) + 948 ( 115 -343 949 ) + 949 ( 100 -31 -32 ) + 950 ( 237 951 0 ) + 951 ( 84 952 960 ) + 952 ( 112 953 954 ) + 953 ( 114 -344 -345 ) + 954 ( 197 -346 955 ) + 955 ( 574 -347 956 ) + 956 ( 258 957 0 ) + 957 ( 440 958 -351 ) + 958 ( 63 959 -350 ) + 959 ( 211 -348 -349 ) + 960 ( 258 961 969 ) + 961 ( 212 962 -356 ) + 962 ( 190 963 -201 ) + 963 ( 440 964 967 ) + 964 ( 211 -348 965 ) + 965 ( 589 -352 966 ) + 966 ( 112 -353 -349 ) + 967 ( 589 -354 968 ) + 968 ( 197 -355 -351 ) + 969 ( 197 970 0 ) + 970 ( 213 -356 0 ) + 971 ( 21 972 0 ) + 972 ( 29 973 983 ) + 973 ( 84 974 978 ) + 974 ( 112 -357 975 ) + 975 ( 197 -358 976 ) + 976 ( 574 -359 977 ) + 977 ( 590 -360 0 ) + 978 ( 443 979 980 ) + 979 ( 197 -361 0 ) + 980 ( 197 981 0 ) + 981 ( 213 -356 982 ) + 982 ( 444 -205 0 ) + 983 ( 269 984 997 ) + 984 ( 579 985 992 ) + 985 ( 592 986 989 ) + 986 ( 152 0 987 ) + 987 ( 104 988 0 ) + 988 ( 102 -362 0 ) + 989 ( 475 0 990 ) + 990 ( 86 991 0 ) + 991 ( 102 -362 0 ) + 992 ( 116 993 0 ) + 993 ( 86 994 0 ) + 994 ( 102 995 0 ) + 995 ( 104 996 0 ) + 996 ( 567 -363 -327 ) + 997 ( 84 998 0 ) + 998 ( 100 999 1013 ) + 999 ( 25 1000 1006 ) + 1000 ( 579 0 1001 ) + 1001 ( 116 1002 0 ) + 1002 ( 99 1003 1004 ) + 1003 ( 567 -363 -327 ) + 1004 ( 104 1005 0 ) + 1005 ( 567 -363 -327 ) + 1006 ( 266 1007 1011 ) + 1007 ( 567 1008 1010 ) + 1008 ( 116 1009 0 ) + 1009 ( 594 -364 0 ) + 1010 ( 108 -365 0 ) + 1011 ( 116 1012 0 ) + 1012 ( 108 -366 0 ) + 1013 ( 102 1014 1016 ) + 1014 ( 116 1015 0 ) + 1015 ( 567 -363 -327 ) + 1016 ( 592 0 1017 ) + 1017 ( 124 1018 0 ) + 1018 ( 12 -40 -367 ) + 1019 ( 166 1020 1075 ) + 1020 ( 597 1021 1062 ) + 1021 ( 599 1022 1052 ) + 1022 ( 237 1023 0 ) + 1023 ( 252 1024 1030 ) + 1024 ( 601 1025 0 ) + 1025 ( 602 -368 1026 ) + 1026 ( 606 1027 -373 ) + 1027 ( 112 1028 -372 ) + 1028 ( 608 1029 -371 ) + 1029 ( 611 -369 -370 ) + 1030 ( 607 1031 1038 ) + 1031 ( 24 1032 1036 ) + 1032 ( 390 1033 -378 ) + 1033 ( 388 -374 1034 ) + 1034 ( 115 1035 -377 ) + 1035 ( 140 -375 -376 ) + 1036 ( 388 -374 1037 ) + 1037 ( 391 -378 0 ) + 1038 ( 602 1039 1040 ) + 1039 ( 604 -368 0 ) + 1040 ( 131 1041 1045 ) + 1041 ( 604 -379 1042 ) + 1042 ( 615 -380 1043 ) + 1043 ( 618 1044 0 ) + 1044 ( 610 -381 -382 ) + 1045 ( 604 1046 0 ) + 1046 ( 622 1047 0 ) + 1047 ( 608 1048 1051 ) + 1048 ( 611 1049 1050 ) + 1049 ( 210 -383 -384 ) + 1050 ( 211 -384 -385 ) + 1051 ( 211 -384 -386 ) + 1052 ( 260 1053 1056 ) + 1053 ( 601 1054 0 ) + 1054 ( 237 1055 0 ) + 1055 ( 604 -387 0 ) + 1056 ( 399 1057 1059 ) + 1057 ( 604 1058 0 ) + 1058 ( 601 -388 0 ) + 1059 ( 604 1060 0 ) + 1060 ( 601 1061 0 ) + 1061 ( 624 -389 0 ) + 1062 ( 237 1063 0 ) + 1063 ( 627 1064 0 ) + 1064 ( 604 1065 0 ) + 1065 ( 618 1066 0 ) + 1066 ( 601 1067 0 ) + 1067 ( 260 1068 1069 ) + 1068 ( 628 -390 -391 ) + 1069 ( 399 1070 1071 ) + 1070 ( 628 -392 -393 ) + 1071 ( 630 -394 1072 ) + 1072 ( 624 1073 0 ) + 1073 ( 214 1074 -397 ) + 1074 ( 209 -395 -396 ) + 1075 ( 99 1076 1268 ) + 1076 ( 637 1077 1255 ) + 1077 ( 617 1078 1232 ) + 1078 ( 639 1079 1104 ) + 1079 ( 34 1080 1093 ) + 1080 ( 351 1081 1090 ) + 1081 ( 82 1082 1085 ) + 1082 ( 87 1083 1084 ) + 1083 ( 175 -398 0 ) + 1084 ( 641 -399 0 ) + 1085 ( 13 1086 1088 ) + 1086 ( 60 1087 -402 ) + 1087 ( 28 -400 -401 ) + 1088 ( 641 1089 0 ) + 1089 ( 646 -403 -404 ) + 1090 ( 649 1091 0 ) + 1091 ( 641 -405 1092 ) + 1092 ( 652 -406 0 ) + 1093 ( 13 1094 0 ) + 1094 ( 66 1095 1101 ) + 1095 ( 61 1096 1100 ) + 1096 ( 654 1097 -411 ) + 1097 ( 210 1098 1099 ) + 1098 ( 112 -407 -408 ) + 1099 ( 656 -409 -410 ) + 1100 ( 659 -412 0 ) + 1101 ( 211 1102 0 ) + 1102 ( 657 -413 1103 ) + 1103 ( 660 -414 0 ) + 1104 ( 389 1105 1213 ) + 1105 ( 61 1106 1195 ) + 1106 ( 66 1107 1190 ) + 1107 ( 131 1108 1147 ) + 1108 ( 615 1109 1142 ) + 1109 ( 30 1110 1133 ) + 1110 ( 663 1111 1127 ) + 1111 ( 145 1112 1123 ) + 1112 ( 203 1113 1117 ) + 1113 ( 664 1114 -419 ) + 1114 ( 440 1115 -418 ) + 1115 ( 666 1116 -417 ) + 1116 ( 192 -415 -416 ) + 1117 ( 669 1118 1122 ) + 1118 ( 664 1119 1120 ) + 1119 ( 666 -420 -417 ) + 1120 ( 260 1121 -419 ) + 1121 ( 670 -421 -422 ) + 1122 ( 34 -423 0 ) + 1123 ( 54 1124 1125 ) + 1124 ( 664 -424 -425 ) + 1125 ( 665 1126 0 ) + 1126 ( 670 -426 -427 ) + 1127 ( 51 1128 1131 ) + 1128 ( 203 1129 0 ) + 1129 ( 440 1130 -430 ) + 1130 ( 192 -428 -429 ) + 1131 ( 42 1132 0 ) + 1132 ( 672 -431 -432 ) + 1133 ( 261 1134 1141 ) + 1134 ( 665 1135 1138 ) + 1135 ( 674 1136 -436 ) + 1136 ( 70 -433 1137 ) + 1137 ( 671 -434 -435 ) + 1138 ( 441 1139 0 ) + 1139 ( 200 1140 -436 ) + 1140 ( 70 -437 -435 ) + 1141 ( 671 -438 0 ) + 1142 ( 596 1143 1144 ) + 1143 ( 42 -439 0 ) + 1144 ( 42 1145 0 ) + 1145 ( 175 1146 0 ) + 1146 ( 676 -440 -441 ) + 1147 ( 345 1148 1182 ) + 1148 ( 140 1149 1155 ) + 1149 ( 615 1150 1151 ) + 1150 ( 607 -442 0 ) + 1151 ( 679 0 1152 ) + 1152 ( 680 1153 0 ) + 1153 ( 42 1154 0 ) + 1154 ( 682 -443 0 ) + 1155 ( 30 1156 1176 ) + 1156 ( 391 1157 1170 ) + 1157 ( 615 1158 1167 ) + 1158 ( 663 1159 1164 ) + 1159 ( 54 1160 1162 ) + 1160 ( 664 1161 -446 ) + 1161 ( 666 -444 -445 ) + 1162 ( 665 1163 0 ) + 1163 ( 670 -426 -427 ) + 1164 ( 51 0 1165 ) + 1165 ( 42 1166 0 ) + 1166 ( 672 -447 -448 ) + 1167 ( 676 1168 0 ) + 1168 ( 680 1169 0 ) + 1169 ( 42 -449 0 ) + 1170 ( 615 1171 1172 ) + 1171 ( 607 -450 0 ) + 1172 ( 679 0 1173 ) + 1173 ( 680 1174 0 ) + 1174 ( 42 1175 0 ) + 1175 ( 682 -443 0 ) + 1176 ( 671 1177 0 ) + 1177 ( 607 -451 1178 ) + 1178 ( 686 1179 1180 ) + 1179 ( 391 -452 0 ) + 1180 ( 391 1181 0 ) + 1181 ( 139 -453 0 ) + 1182 ( 596 1183 1186 ) + 1183 ( 391 1184 1185 ) + 1184 ( 680 -449 0 ) + 1185 ( 680 -443 0 ) + 1186 ( 615 1187 0 ) + 1187 ( 688 1188 1189 ) + 1188 ( 671 -454 0 ) + 1189 ( 607 -455 0 ) + 1190 ( 615 1191 0 ) + 1191 ( 664 1192 1193 ) + 1192 ( 201 -456 0 ) + 1193 ( 690 1194 0 ) + 1194 ( 671 -457 -458 ) + 1195 ( 34 1196 1209 ) + 1196 ( 607 1197 1199 ) + 1197 ( 13 1198 0 ) + 1198 ( 28 -400 -401 ) + 1199 ( 12 1200 1205 ) + 1200 ( 692 1201 0 ) + 1201 ( 680 1202 1203 ) + 1202 ( 682 -459 0 ) + 1203 ( 682 1204 0 ) + 1204 ( 694 -460 0 ) + 1205 ( 680 1206 0 ) + 1206 ( 684 1207 1208 ) + 1207 ( 682 -459 0 ) + 1208 ( 682 -443 0 ) + 1209 ( 66 1210 0 ) + 1210 ( 607 1211 0 ) + 1211 ( 13 1212 0 ) + 1212 ( 659 -412 0 ) + 1213 ( 607 0 1214 ) + 1214 ( 244 1215 1230 ) + 1215 ( 597 0 1216 ) + 1216 ( 680 1217 1226 ) + 1217 ( 86 1218 1220 ) + 1218 ( 696 1219 0 ) + 1219 ( 699 -461 -462 ) + 1220 ( 701 0 1221 ) + 1221 ( 371 1222 1223 ) + 1222 ( 682 -459 0 ) + 1223 ( 696 1224 1225 ) + 1224 ( 702 -463 -464 ) + 1225 ( 682 -464 0 ) + 1226 ( 350 1227 0 ) + 1227 ( 101 1228 0 ) + 1228 ( 692 1229 0 ) + 1229 ( 694 -465 0 ) + 1230 ( 680 1231 0 ) + 1231 ( 682 -459 0 ) + 1232 ( 596 1233 1247 ) + 1233 ( 705 1234 0 ) + 1234 ( 60 1235 0 ) + 1235 ( 680 1236 0 ) + 1236 ( 59 1237 1241 ) + 1237 ( 684 1238 -467 ) + 1238 ( 86 1239 1240 ) + 1239 ( 699 -461 -462 ) + 1240 ( 371 -459 -466 ) + 1241 ( 371 1242 1244 ) + 1242 ( 684 1243 0 ) + 1243 ( 12 -468 0 ) + 1244 ( 699 1245 0 ) + 1245 ( 86 1246 -466 ) + 1246 ( 101 -469 0 ) + 1247 ( 237 1248 0 ) + 1248 ( 607 1249 1253 ) + 1249 ( 613 1250 1251 ) + 1250 ( 13 -470 0 ) + 1251 ( 388 0 1252 ) + 1252 ( 391 -378 0 ) + 1253 ( 615 1254 0 ) + 1254 ( 131 -380 0 ) + 1255 ( 12 1256 1264 ) + 1256 ( 101 1257 0 ) + 1257 ( 696 1258 0 ) + 1258 ( 617 1259 0 ) + 1259 ( 707 1260 0 ) + 1260 ( 350 1261 1262 ) + 1261 ( 708 -471 0 ) + 1262 ( 389 1263 0 ) + 1263 ( 708 -472 0 ) + 1264 ( 60 0 1265 ) + 1265 ( 42 1266 0 ) + 1266 ( 617 1267 0 ) + 1267 ( 391 -473 0 ) + 1268 ( 715 1269 1383 ) + 1269 ( 20 1270 1289 ) + 1270 ( 717 1271 0 ) + 1271 ( 34 1272 0 ) + 1272 ( 719 1273 0 ) + 1273 ( 639 1274 1275 ) + 1274 ( 175 -474 0 ) + 1275 ( 696 1276 0 ) + 1276 ( 721 1277 1282 ) + 1277 ( 617 1278 1280 ) + 1278 ( 680 1279 0 ) + 1279 ( 637 -475 0 ) + 1280 ( 680 1281 0 ) + 1281 ( 637 -475 0 ) + 1282 ( 617 1283 1286 ) + 1283 ( 680 1284 0 ) + 1284 ( 637 1285 0 ) + 1285 ( 723 -475 -476 ) + 1286 ( 680 1287 0 ) + 1287 ( 637 1288 0 ) + 1288 ( 723 -475 -476 ) + 1289 ( 175 1290 1322 ) + 1290 ( 265 1291 1317 ) + 1291 ( 696 1292 1312 ) + 1292 ( 254 1293 1299 ) + 1293 ( 637 1294 1297 ) + 1294 ( 639 1295 1296 ) + 1295 ( 641 -477 0 ) + 1296 ( 596 -478 0 ) + 1297 ( 324 1298 0 ) + 1298 ( 724 -479 -480 ) + 1299 ( 637 1300 1309 ) + 1300 ( 639 1301 1306 ) + 1301 ( 649 1302 1305 ) + 1302 ( 165 -481 1303 ) + 1303 ( 641 -482 1304 ) + 1304 ( 726 -483 0 ) + 1305 ( 165 -481 0 ) + 1306 ( 596 1307 0 ) + 1307 ( 266 -484 1308 ) + 1308 ( 680 -462 0 ) + 1309 ( 266 1310 0 ) + 1310 ( 324 1311 0 ) + 1311 ( 724 -479 -480 ) + 1312 ( 34 1313 0 ) + 1313 ( 639 1314 0 ) + 1314 ( 649 -485 1315 ) + 1315 ( 165 -486 1316 ) + 1316 ( 254 -487 0 ) + 1317 ( 680 1318 1320 ) + 1318 ( 696 1319 0 ) + 1319 ( 637 -488 0 ) + 1320 ( 34 1321 0 ) + 1321 ( 639 -474 0 ) + 1322 ( 254 1323 1349 ) + 1323 ( 637 1324 1340 ) + 1324 ( 265 1325 1337 ) + 1325 ( 617 1326 1328 ) + 1326 ( 639 0 1327 ) + 1327 ( 596 -478 0 ) + 1328 ( 59 1329 1331 ) + 1329 ( 680 -489 1330 ) + 1330 ( 730 -490 0 ) + 1331 ( 732 1332 1334 ) + 1332 ( 735 1333 0 ) + 1333 ( 104 -491 0 ) + 1334 ( 680 1335 0 ) + 1335 ( 736 1336 0 ) + 1336 ( 104 -491 0 ) + 1337 ( 719 1338 0 ) + 1338 ( 680 1339 0 ) + 1339 ( 59 -488 0 ) + 1340 ( 283 1341 0 ) + 1341 ( 265 1342 0 ) + 1342 ( 735 1343 1347 ) + 1343 ( 712 1344 1345 ) + 1344 ( 724 -479 -492 ) + 1345 ( 59 -493 1346 ) + 1346 ( 104 -494 0 ) + 1347 ( 712 1348 0 ) + 1348 ( 724 -479 -492 ) + 1349 ( 637 1350 1372 ) + 1350 ( 596 1351 0 ) + 1351 ( 680 1352 1365 ) + 1352 ( 732 1353 1359 ) + 1353 ( 162 1354 1355 ) + 1354 ( 735 -495 0 ) + 1355 ( 59 1356 1357 ) + 1356 ( 266 -496 -462 ) + 1357 ( 266 1358 0 ) + 1358 ( 738 -497 0 ) + 1359 ( 59 1360 1361 ) + 1360 ( 266 -498 -462 ) + 1361 ( 736 1362 0 ) + 1362 ( 266 1363 0 ) + 1363 ( 162 -499 1364 ) + 1364 ( 738 -497 0 ) + 1365 ( 627 1366 1368 ) + 1366 ( 266 1367 0 ) + 1367 ( 617 -500 0 ) + 1368 ( 59 1369 0 ) + 1369 ( 266 1370 0 ) + 1370 ( 617 -500 1371 ) + 1371 ( 730 -490 0 ) + 1372 ( 266 1373 0 ) + 1373 ( 283 1374 0 ) + 1374 ( 162 1375 1379 ) + 1375 ( 735 1376 1377 ) + 1376 ( 724 -479 -501 ) + 1377 ( 712 1378 0 ) + 1378 ( 724 -479 -502 ) + 1379 ( 712 1380 1381 ) + 1380 ( 724 -479 -503 ) + 1381 ( 59 -504 1382 ) + 1382 ( 738 -505 0 ) + 1383 ( 740 1384 1429 ) + 1384 ( 717 1385 0 ) + 1385 ( 636 0 1386 ) + 1386 ( 746 1387 1393 ) + 1387 ( 743 1388 0 ) + 1388 ( 696 1389 0 ) + 1389 ( 719 1390 0 ) + 1390 ( 634 1391 1392 ) + 1391 ( 745 -506 0 ) + 1392 ( 680 -476 0 ) + 1393 ( 750 1394 1421 ) + 1394 ( 719 1395 0 ) + 1395 ( 752 1396 1408 ) + 1396 ( 754 1397 1404 ) + 1397 ( 756 1398 1402 ) + 1398 ( 696 1399 0 ) + 1399 ( 745 1400 0 ) + 1400 ( 759 -507 1401 ) + 1401 ( 626 -506 -508 ) + 1402 ( 696 1403 0 ) + 1403 ( 626 -506 0 ) + 1404 ( 626 1405 0 ) + 1405 ( 696 1406 0 ) + 1406 ( 634 1407 0 ) + 1407 ( 748 -506 0 ) + 1408 ( 762 1409 0 ) + 1409 ( 615 1410 1418 ) + 1410 ( 617 1411 1413 ) + 1411 ( 756 -509 1412 ) + 1412 ( 764 -510 0 ) + 1413 ( 705 1414 0 ) + 1414 ( 766 1415 0 ) + 1415 ( 745 1416 1417 ) + 1416 ( 764 -511 0 ) + 1417 ( 768 -511 0 ) + 1418 ( 745 1419 0 ) + 1419 ( 756 1420 0 ) + 1420 ( 617 -512 0 ) + 1421 ( 745 1422 0 ) + 1422 ( 626 1423 1424 ) + 1423 ( 696 -506 0 ) + 1424 ( 759 1425 1428 ) + 1425 ( 696 1426 1427 ) + 1426 ( 760 -507 -513 ) + 1427 ( 762 -513 0 ) + 1428 ( 696 -508 0 ) + 1429 ( 617 1430 0 ) + 1430 ( 756 1431 1451 ) + 1431 ( 34 1432 0 ) + 1432 ( 639 1433 1439 ) + 1433 ( 175 1434 1435 ) + 1434 ( 745 -514 0 ) + 1435 ( 772 1436 1438 ) + 1436 ( 775 -515 1437 ) + 1437 ( 778 -516 0 ) + 1438 ( 782 -517 0 ) + 1439 ( 784 1440 1444 ) + 1440 ( 745 1441 0 ) + 1441 ( 786 1442 1443 ) + 1442 ( 762 -518 0 ) + 1443 ( 762 -519 0 ) + 1444 ( 745 1445 0 ) + 1445 ( 175 1446 1447 ) + 1446 ( 762 -520 0 ) + 1447 ( 772 1448 1450 ) + 1448 ( 775 -521 1449 ) + 1449 ( 778 -522 0 ) + 1450 ( 782 -523 0 ) + 1451 ( 789 0 1452 ) + 1452 ( 641 1453 0 ) + 1453 ( 791 1454 1456 ) + 1454 ( 34 1455 0 ) + 1455 ( 639 -524 0 ) + 1456 ( 34 1457 0 ) + 1457 ( 639 -525 0 ) + 1458 ( 6 1459 0 ) + 1459 ( 8 0 1460 ) + 1460 ( 793 1461 1476 ) + 1461 ( 77 1462 0 ) + 1462 ( 705 1463 0 ) + 1463 ( 794 1464 1469 ) + 1464 ( 796 1465 0 ) + 1465 ( 799 1466 1467 ) + 1466 ( 801 -526 -527 ) + 1467 ( 801 1468 0 ) + 1468 ( 807 -528 0 ) + 1469 ( 796 1470 0 ) + 1470 ( 417 1471 0 ) + 1471 ( 66 1472 0 ) + 1472 ( 51 1473 1474 ) + 1473 ( 801 -529 -530 ) + 1474 ( 801 1475 0 ) + 1475 ( 807 -531 0 ) + 1476 ( 87 1477 1850 ) + 1477 ( 705 1478 1758 ) + 1478 ( 809 1479 1494 ) + 1479 ( 417 1480 1489 ) + 1480 ( 810 1481 1484 ) + 1481 ( 66 1482 0 ) + 1482 ( 192 0 1483 ) + 1483 ( 409 -532 0 ) + 1484 ( 813 1485 0 ) + 1485 ( 66 1486 0 ) + 1486 ( 804 -533 1487 ) + 1487 ( 77 1488 0 ) + 1488 ( 51 -530 0 ) + 1489 ( 794 1490 0 ) + 1490 ( 804 1491 1492 ) + 1491 ( 409 -534 0 ) + 1492 ( 799 1493 0 ) + 1493 ( 77 -527 0 ) + 1494 ( 66 1495 1730 ) + 1495 ( 817 1496 1671 ) + 1496 ( 818 1497 1612 ) + 1497 ( 409 1498 1531 ) + 1498 ( 417 1499 1510 ) + 1499 ( 31 1500 1506 ) + 1500 ( 813 1501 1504 ) + 1501 ( 820 -535 1502 ) + 1502 ( 823 -536 1503 ) + 1503 ( 826 -536 0 ) + 1504 ( 829 1505 0 ) + 1505 ( 830 -537 0 ) + 1506 ( 820 1507 0 ) + 1507 ( 813 -535 1508 ) + 1508 ( 829 1509 0 ) + 1509 ( 830 -537 0 ) + 1510 ( 833 1511 1522 ) + 1511 ( 835 1512 1519 ) + 1512 ( 836 1513 1515 ) + 1513 ( 839 -538 1514 ) + 1514 ( 842 -539 0 ) + 1515 ( 820 1516 0 ) + 1516 ( 844 1517 0 ) + 1517 ( 839 -540 1518 ) + 1518 ( 842 -539 0 ) + 1519 ( 846 1520 0 ) + 1520 ( 839 -541 1521 ) + 1521 ( 842 -539 0 ) + 1522 ( 835 1523 1530 ) + 1523 ( 839 1524 1527 ) + 1524 ( 794 1525 0 ) + 1525 ( 815 -534 1526 ) + 1526 ( 850 -542 -543 ) + 1527 ( 794 1528 0 ) + 1528 ( 815 -534 1529 ) + 1529 ( 850 -542 -544 ) + 1530 ( 794 -542 0 ) + 1531 ( 856 1532 1585 ) + 1532 ( 644 1533 1569 ) + 1533 ( 484 1534 1561 ) + 1534 ( 13 1535 1555 ) + 1535 ( 192 1536 1544 ) + 1536 ( 61 1537 1541 ) + 1537 ( 834 1538 -549 ) + 1538 ( 210 1539 -548 ) + 1539 ( 112 -545 1540 ) + 1540 ( 829 -546 -547 ) + 1541 ( 34 1542 1543 ) + 1542 ( 28 -550 -551 ) + 1543 ( 659 -552 0 ) + 1544 ( 696 1545 1549 ) + 1545 ( 850 1546 0 ) + 1546 ( 860 -553 1547 ) + 1547 ( 863 1548 -556 ) + 1548 ( 441 -554 -555 ) + 1549 ( 834 1550 1553 ) + 1550 ( 212 -557 1551 ) + 1551 ( 658 1552 0 ) + 1552 ( 215 -558 -559 ) + 1553 ( 860 1554 0 ) + 1554 ( 864 -560 0 ) + 1555 ( 82 1556 1558 ) + 1556 ( 34 1557 0 ) + 1557 ( 175 -561 0 ) + 1558 ( 34 1559 0 ) + 1559 ( 641 1560 0 ) + 1560 ( 646 -562 -404 ) + 1561 ( 794 1562 0 ) + 1562 ( 850 1563 0 ) + 1563 ( 799 1564 0 ) + 1564 ( 866 1565 0 ) + 1565 ( 174 1566 0 ) + 1566 ( 829 1567 0 ) + 1567 ( 869 -563 1568 ) + 1568 ( 71 -564 -565 ) + 1569 ( 192 1570 0 ) + 1570 ( 61 1571 1577 ) + 1571 ( 858 -549 1572 ) + 1572 ( 391 1573 0 ) + 1573 ( 131 -566 1574 ) + 1574 ( 688 1575 0 ) + 1575 ( 139 -567 1576 ) + 1576 ( 686 -568 0 ) + 1577 ( 237 1578 0 ) + 1578 ( 858 1579 0 ) + 1579 ( 34 1580 1582 ) + 1580 ( 13 1581 0 ) + 1581 ( 28 -550 -551 ) + 1582 ( 646 0 1583 ) + 1583 ( 659 1584 0 ) + 1584 ( 13 -552 0 ) + 1585 ( 617 1586 1606 ) + 1586 ( 192 1587 1592 ) + 1587 ( 391 1588 0 ) + 1588 ( 345 1589 1591 ) + 1589 ( 139 -569 1590 ) + 1590 ( 686 -570 0 ) + 1591 ( 131 -571 0 ) + 1592 ( 51 1593 1597 ) + 1593 ( 484 1594 0 ) + 1594 ( 872 1595 0 ) + 1595 ( 837 1596 0 ) + 1596 ( 875 -572 -573 ) + 1597 ( 837 1598 0 ) + 1598 ( 191 1599 0 ) + 1599 ( 794 1600 1603 ) + 1600 ( 876 1601 1602 ) + 1601 ( 484 -574 -575 ) + 1602 ( 71 -576 -577 ) + 1603 ( 484 1604 0 ) + 1604 ( 878 -578 1605 ) + 1605 ( 417 -579 -578 ) + 1606 ( 191 1607 1610 ) + 1607 ( 484 1608 0 ) + 1608 ( 837 1609 0 ) + 1609 ( 799 -574 0 ) + 1610 ( 131 1611 0 ) + 1611 ( 192 -571 0 ) + 1612 ( 617 1613 1663 ) + 1613 ( 192 1614 1625 ) + 1614 ( 244 0 1615 ) + 1615 ( 880 1616 0 ) + 1616 ( 391 1617 0 ) + 1617 ( 870 1618 1622 ) + 1618 ( 345 1619 1621 ) + 1619 ( 139 -569 1620 ) + 1620 ( 686 -570 0 ) + 1621 ( 131 -571 0 ) + 1622 ( 417 1623 0 ) + 1623 ( 139 -580 1624 ) + 1624 ( 686 -581 0 ) + 1625 ( 813 1626 1642 ) + 1626 ( 823 1627 1633 ) + 1627 ( 31 1628 1629 ) + 1628 ( 824 -536 -582 ) + 1629 ( 794 -534 1630 ) + 1630 ( 824 0 1631 ) + 1631 ( 417 1632 0 ) + 1632 ( 881 -583 0 ) + 1633 ( 31 1634 1638 ) + 1634 ( 826 1635 1636 ) + 1635 ( 824 -536 -582 ) + 1636 ( 824 0 1637 ) + 1637 ( 881 -584 0 ) + 1638 ( 794 -534 1639 ) + 1639 ( 824 0 1640 ) + 1640 ( 417 1641 0 ) + 1641 ( 881 -583 0 ) + 1642 ( 484 1643 1654 ) + 1643 ( 417 1644 1650 ) + 1644 ( 870 1645 0 ) + 1645 ( 51 1646 1648 ) + 1646 ( 872 1647 0 ) + 1647 ( 875 -572 -573 ) + 1648 ( 875 1649 0 ) + 1649 ( 191 -579 0 ) + 1650 ( 191 1651 0 ) + 1651 ( 870 1652 0 ) + 1652 ( 878 1653 -578 ) + 1653 ( 794 -574 -578 ) + 1654 ( 870 1655 1660 ) + 1655 ( 878 1656 0 ) + 1656 ( 794 1657 0 ) + 1657 ( 876 -575 1658 ) + 1658 ( 409 -534 1659 ) + 1659 ( 71 -576 -577 ) + 1660 ( 409 1661 0 ) + 1661 ( 417 0 1662 ) + 1662 ( 794 -534 0 ) + 1663 ( 409 -534 1664 ) + 1664 ( 191 1665 1668 ) + 1665 ( 484 1666 0 ) + 1666 ( 870 1667 0 ) + 1667 ( 799 -574 0 ) + 1668 ( 131 1669 0 ) + 1669 ( 870 1670 0 ) + 1670 ( 192 -571 0 ) + 1671 ( 409 1672 1700 ) + 1672 ( 770 -585 1673 ) + 1673 ( 417 1674 1687 ) + 1674 ( 31 1675 1683 ) + 1675 ( 854 1676 1680 ) + 1676 ( 403 1677 0 ) + 1677 ( 470 1678 0 ) + 1678 ( 887 -586 1679 ) + 1679 ( 891 -587 -588 ) + 1680 ( 813 1681 0 ) + 1681 ( 823 -589 1682 ) + 1682 ( 826 -589 0 ) + 1683 ( 854 1684 0 ) + 1684 ( 403 1685 0 ) + 1685 ( 890 1686 0 ) + 1686 ( 679 -590 0 ) + 1687 ( 794 1688 0 ) + 1688 ( 403 1689 1698 ) + 1689 ( 174 1690 1696 ) + 1690 ( 799 1691 1694 ) + 1691 ( 887 1692 1693 ) + 1692 ( 854 -591 -542 ) + 1693 ( 891 -592 -593 ) + 1694 ( 887 1695 0 ) + 1695 ( 855 -542 0 ) + 1696 ( 887 1697 0 ) + 1697 ( 855 -542 0 ) + 1698 ( 887 1699 0 ) + 1699 ( 855 -542 0 ) + 1700 ( 794 1701 1706 ) + 1701 ( 13 1702 1704 ) + 1702 ( 770 -594 1703 ) + 1703 ( 484 -595 0 ) + 1704 ( 82 1705 0 ) + 1705 ( 175 -596 0 ) + 1706 ( 484 1707 1729 ) + 1707 ( 659 1708 1713 ) + 1708 ( 212 1709 1712 ) + 1709 ( 13 1710 0 ) + 1710 ( 210 1711 -599 ) + 1711 ( 112 -597 -598 ) + 1712 ( 892 -600 0 ) + 1713 ( 34 1714 1722 ) + 1714 ( 641 1715 1719 ) + 1715 ( 646 -601 1716 ) + 1716 ( 13 1717 -404 ) + 1717 ( 60 1718 -604 ) + 1718 ( 28 -602 -603 ) + 1719 ( 13 -605 1720 ) + 1720 ( 646 1721 0 ) + 1721 ( 82 -596 0 ) + 1722 ( 646 0 1723 ) + 1723 ( 13 1724 0 ) + 1724 ( 61 1725 0 ) + 1725 ( 212 -606 1726 ) + 1726 ( 892 -600 1727 ) + 1727 ( 215 1728 -609 ) + 1728 ( 895 -607 -608 ) + 1729 ( 770 -610 0 ) + 1730 ( 858 1731 0 ) + 1731 ( 192 1732 1736 ) + 1732 ( 834 1733 0 ) + 1733 ( 211 1734 0 ) + 1734 ( 770 -611 1735 ) + 1735 ( 896 -612 0 ) + 1736 ( 770 1737 1740 ) + 1737 ( 196 -611 1738 ) + 1738 ( 898 -613 1739 ) + 1739 ( 191 -614 -615 ) + 1740 ( 484 1741 0 ) + 1741 ( 834 1742 0 ) + 1742 ( 191 1743 1753 ) + 1743 ( 212 1744 1747 ) + 1744 ( 900 -616 1745 ) + 1745 ( 902 1746 0 ) + 1746 ( 817 -617 -618 ) + 1747 ( 892 1748 0 ) + 1748 ( 214 -619 1749 ) + 1749 ( 904 -620 1750 ) + 1750 ( 902 1751 0 ) + 1751 ( 907 1752 -623 ) + 1752 ( 399 -621 -622 ) + 1753 ( 896 1754 0 ) + 1754 ( 196 -612 1755 ) + 1755 ( 900 -624 1756 ) + 1756 ( 902 1757 0 ) + 1757 ( 817 -625 -618 ) + 1758 ( 166 1759 1819 ) + 1759 ( 908 1760 1798 ) + 1760 ( 601 1761 0 ) + 1761 ( 484 1762 1785 ) + 1762 ( 870 1763 0 ) + 1763 ( 237 1764 0 ) + 1764 ( 252 1765 1771 ) + 1765 ( 910 -626 1766 ) + 1766 ( 196 1767 1770 ) + 1767 ( 112 1768 -630 ) + 1768 ( 858 -627 1769 ) + 1769 ( 913 -628 -629 ) + 1770 ( 915 -631 0 ) + 1771 ( 131 1772 1779 ) + 1772 ( 910 -632 1773 ) + 1773 ( 196 1774 1778 ) + 1774 ( 858 -633 1775 ) + 1775 ( 192 -634 1776 ) + 1776 ( 913 1777 -637 ) + 1777 ( 441 -635 -636 ) + 1778 ( 915 -631 0 ) + 1779 ( 622 1780 1784 ) + 1780 ( 858 -638 1781 ) + 1781 ( 913 1782 1783 ) + 1782 ( 210 -639 -640 ) + 1783 ( 211 -640 -641 ) + 1784 ( 858 -638 0 ) + 1785 ( 252 1786 1793 ) + 1786 ( 870 1787 0 ) + 1787 ( 910 1788 1790 ) + 1788 ( 916 -642 1789 ) + 1789 ( 71 -643 -644 ) + 1790 ( 201 -645 1791 ) + 1791 ( 915 1792 0 ) + 1792 ( 71 -646 -647 ) + 1793 ( 770 -648 1794 ) + 1794 ( 918 1795 0 ) + 1795 ( 71 1796 1797 ) + 1796 ( 891 -649 -650 ) + 1797 ( 890 -650 -651 ) + 1798 ( 484 1799 1817 ) + 1799 ( 870 1800 0 ) + 1800 ( 192 1801 1811 ) + 1801 ( 237 1802 0 ) + 1802 ( 858 1803 1810 ) + 1803 ( 24 1804 1808 ) + 1804 ( 390 1805 -656 ) + 1805 ( 388 -652 1806 ) + 1806 ( 115 1807 -655 ) + 1807 ( 140 -653 -654 ) + 1808 ( 388 -652 1809 ) + 1809 ( 391 -656 0 ) + 1810 ( 131 -634 0 ) + 1811 ( 922 1812 1813 ) + 1812 ( 858 -657 0 ) + 1813 ( 915 0 1814 ) + 1814 ( 910 1815 0 ) + 1815 ( 850 -658 1816 ) + 1816 ( 924 -659 0 ) + 1817 ( 817 0 1818 ) + 1818 ( 770 -648 0 ) + 1819 ( 484 1820 1831 ) + 1820 ( 192 1821 1829 ) + 1821 ( 237 1822 0 ) + 1822 ( 858 1823 1827 ) + 1823 ( 388 0 1824 ) + 1824 ( 613 1825 1826 ) + 1825 ( 13 -660 0 ) + 1826 ( 391 -656 0 ) + 1827 ( 131 1828 0 ) + 1828 ( 870 -634 0 ) + 1829 ( 870 1830 0 ) + 1830 ( 850 -658 0 ) + 1831 ( 804 1832 0 ) + 1832 ( 817 1833 1844 ) + 1833 ( 839 1834 1839 ) + 1834 ( 719 1835 0 ) + 1835 ( 815 1836 1838 ) + 1836 ( 926 -661 1837 ) + 1837 ( 928 -662 0 ) + 1838 ( 850 -663 -543 ) + 1839 ( 930 1840 0 ) + 1840 ( 815 1841 1843 ) + 1841 ( 926 -664 1842 ) + 1842 ( 928 -662 0 ) + 1843 ( 850 -665 -666 ) + 1844 ( 770 -648 1845 ) + 1845 ( 869 1846 0 ) + 1846 ( 887 1847 0 ) + 1847 ( 934 1848 0 ) + 1848 ( 839 -667 1849 ) + 1849 ( 930 -665 0 ) + 1850 ( 756 1851 1875 ) + 1851 ( 917 1852 1858 ) + 1852 ( 829 1853 0 ) + 1853 ( 345 1854 0 ) + 1854 ( 850 1855 0 ) + 1855 ( 34 1856 0 ) + 1856 ( 936 1857 -669 ) + 1857 ( 939 -668 0 ) + 1858 ( 745 1859 0 ) + 1859 ( 776 1860 1867 ) + 1860 ( 617 1861 0 ) + 1861 ( 175 1862 1863 ) + 1862 ( 34 -514 0 ) + 1863 ( 775 1864 1866 ) + 1864 ( 772 -515 1865 ) + 1865 ( 782 -517 0 ) + 1866 ( 778 -516 0 ) + 1867 ( 770 1868 0 ) + 1868 ( 175 1869 1870 ) + 1869 ( 34 -514 0 ) + 1870 ( 780 1871 0 ) + 1871 ( 775 1872 1874 ) + 1872 ( 772 -670 1873 ) + 1873 ( 782 -517 0 ) + 1874 ( 778 -516 0 ) + 1875 ( 98 1876 1907 ) + 1876 ( 941 1877 1898 ) + 1877 ( 34 1878 0 ) + 1878 ( 641 1879 1885 ) + 1879 ( 644 1880 0 ) + 1880 ( 650 1881 1883 ) + 1881 ( 791 -671 1882 ) + 1882 ( 917 -672 -673 ) + 1883 ( 165 -674 1884 ) + 1884 ( 942 -675 0 ) + 1885 ( 166 0 1886 ) + 1886 ( 264 1887 1890 ) + 1887 ( 715 1888 0 ) + 1888 ( 175 1889 0 ) + 1889 ( 644 -676 0 ) + 1890 ( 942 0 1891 ) + 1891 ( 650 1892 1895 ) + 1892 ( 165 1893 1894 ) + 1893 ( 175 -677 0 ) + 1894 ( 726 -483 0 ) + 1895 ( 175 1896 0 ) + 1896 ( 644 1897 0 ) + 1897 ( 165 -674 0 ) + 1898 ( 917 1899 1904 ) + 1899 ( 644 1900 0 ) + 1900 ( 829 1901 0 ) + 1901 ( 345 1902 0 ) + 1902 ( 850 1903 0 ) + 1903 ( 34 -669 0 ) + 1904 ( 34 1905 0 ) + 1905 ( 770 1906 0 ) + 1906 ( 641 -678 0 ) + 1907 ( 34 1908 0 ) + 1908 ( 175 1909 0 ) + 1909 ( 643 1910 1912 ) + 1910 ( 641 1911 0 ) + 1911 ( 644 -399 0 ) + 1912 ( 650 1913 0 ) + 1913 ( 641 -405 1914 ) + 1914 ( 652 -406 0 ) + 1915 ( 2 1916 3675 ) + 1916 ( 4 1917 2272 ) + 1917 ( 6 1918 0 ) + 1918 ( 8 1919 1922 ) + 1919 ( 11 1920 0 ) + 1920 ( 15 1921 0 ) + 1921 ( 16 -1 0 ) + 1922 ( 888 1923 2000 ) + 1923 ( 802 1924 1966 ) + 1924 ( 945 1925 1946 ) + 1925 ( 23 1926 1930 ) + 1926 ( 37 -679 1927 ) + 1927 ( 51 -680 1928 ) + 1928 ( 42 1929 0 ) + 1929 ( 44 -681 -682 ) + 1930 ( 42 1931 0 ) + 1931 ( 175 1932 1935 ) + 1932 ( 177 1933 0 ) + 1933 ( 172 1934 0 ) + 1934 ( 179 -683 -65 ) + 1935 ( 15 1936 0 ) + 1936 ( 147 1937 1941 ) + 1937 ( 168 1938 1940 ) + 1938 ( 128 -684 1939 ) + 1939 ( 142 -685 -686 ) + 1940 ( 166 -684 0 ) + 1941 ( 180 1942 0 ) + 1942 ( 224 -687 1943 ) + 1943 ( 226 1944 0 ) + 1944 ( 229 1945 -690 ) + 1945 ( 230 -688 -689 ) + 1946 ( 23 1947 1951 ) + 1947 ( 37 -679 1948 ) + 1948 ( 51 -680 1949 ) + 1949 ( 42 1950 0 ) + 1950 ( 44 -681 -682 ) + 1951 ( 175 1952 1955 ) + 1952 ( 42 1953 0 ) + 1953 ( 177 1954 0 ) + 1954 ( 172 -65 0 ) + 1955 ( 15 1956 0 ) + 1956 ( 147 1957 1961 ) + 1957 ( 168 1958 1960 ) + 1958 ( 128 -684 1959 ) + 1959 ( 142 -685 -686 ) + 1960 ( 166 -684 0 ) + 1961 ( 180 1962 0 ) + 1962 ( 224 -687 1963 ) + 1963 ( 226 1964 0 ) + 1964 ( 229 1965 -690 ) + 1965 ( 230 -688 -689 ) + 1966 ( 23 1967 1981 ) + 1967 ( 37 1968 1975 ) + 1968 ( 55 -691 1969 ) + 1969 ( 696 1970 1972 ) + 1970 ( 954 -692 1971 ) + 1971 ( 415 -693 -694 ) + 1972 ( 956 1973 0 ) + 1973 ( 415 1974 -697 ) + 1974 ( 959 -695 -696 ) + 1975 ( 42 1976 1980 ) + 1976 ( 960 1977 1979 ) + 1977 ( 44 -681 1978 ) + 1978 ( 415 -698 -699 ) + 1979 ( 956 -700 0 ) + 1980 ( 51 -680 0 ) + 1981 ( 42 1982 0 ) + 1982 ( 175 1983 1987 ) + 1983 ( 172 1984 0 ) + 1984 ( 170 0 1985 ) + 1985 ( 177 1986 0 ) + 1986 ( 946 -683 -701 ) + 1987 ( 15 1988 0 ) + 1988 ( 147 1989 1995 ) + 1989 ( 168 1990 1992 ) + 1990 ( 128 -684 1991 ) + 1991 ( 142 -685 -686 ) + 1992 ( 963 1993 1994 ) + 1993 ( 166 -684 0 ) + 1994 ( 166 -684 0 ) + 1995 ( 180 1996 0 ) + 1996 ( 224 -687 1997 ) + 1997 ( 226 1998 0 ) + 1998 ( 229 1999 -690 ) + 1999 ( 230 -688 -689 ) + 2000 ( 965 2001 2172 ) + 2001 ( 967 2002 2006 ) + 2002 ( 16 2003 0 ) + 2003 ( 968 2004 0 ) + 2004 ( 443 -702 2005 ) + 2005 ( 226 -703 0 ) + 2006 ( 971 2007 2013 ) + 2007 ( 968 2008 0 ) + 2008 ( 908 2009 2012 ) + 2009 ( 443 2010 2011 ) + 2010 ( 134 -704 -705 ) + 2011 ( 226 -703 0 ) + 2012 ( 135 -705 0 ) + 2013 ( 974 2014 2149 ) + 2014 ( 617 2015 2093 ) + 2015 ( 963 2016 2049 ) + 2016 ( 853 2017 2036 ) + 2017 ( 977 2018 2020 ) + 2018 ( 978 2019 0 ) + 2019 ( 981 -706 -707 ) + 2020 ( 986 2021 0 ) + 2021 ( 42 2022 2027 ) + 2022 ( 175 2023 0 ) + 2023 ( 989 2024 2026 ) + 2024 ( 972 2025 0 ) + 2025 ( 134 -708 -709 ) + 2026 ( 972 -710 0 ) + 2027 ( 51 2028 2032 ) + 2028 ( 991 2029 2031 ) + 2029 ( 972 2030 0 ) + 2030 ( 992 -711 0 ) + 2031 ( 972 -712 0 ) + 2032 ( 135 2033 0 ) + 2033 ( 995 2034 2035 ) + 2034 ( 972 -713 0 ) + 2035 ( 972 -713 0 ) + 2036 ( 135 2037 0 ) + 2037 ( 949 2038 2042 ) + 2038 ( 995 2039 0 ) + 2039 ( 991 2040 0 ) + 2040 ( 461 2041 0 ) + 2041 ( 992 -714 0 ) + 2042 ( 23 2043 0 ) + 2043 ( 840 2044 2045 ) + 2044 ( 461 -715 0 ) + 2045 ( 995 2046 0 ) + 2046 ( 991 2047 0 ) + 2047 ( 461 2048 0 ) + 2048 ( 992 -716 0 ) + 2049 ( 997 2050 2069 ) + 2050 ( 998 2051 2065 ) + 2051 ( 42 2052 0 ) + 2052 ( 1001 2053 2059 ) + 2053 ( 1002 -717 2054 ) + 2054 ( 171 2055 0 ) + 2055 ( 1004 2056 2057 ) + 2056 ( 18 -718 0 ) + 2057 ( 156 2058 0 ) + 2058 ( 173 -719 0 ) + 2059 ( 1006 2060 0 ) + 2060 ( 1009 2061 0 ) + 2061 ( 1011 2062 2064 ) + 2062 ( 1012 -720 2063 ) + 2063 ( 1015 -721 0 ) + 2064 ( 1016 -722 0 ) + 2065 ( 977 2066 0 ) + 2066 ( 42 2067 0 ) + 2067 ( 978 2068 0 ) + 2068 ( 1002 -723 0 ) + 2069 ( 51 0 2070 ) + 2070 ( 177 2071 2084 ) + 2071 ( 853 2072 2079 ) + 2072 ( 42 2073 0 ) + 2073 ( 1024 2074 2077 ) + 2074 ( 175 2075 0 ) + 2075 ( 972 -724 2076 ) + 2076 ( 998 -725 0 ) + 2077 ( 972 2078 0 ) + 2078 ( 175 -726 0 ) + 2079 ( 998 2080 0 ) + 2080 ( 42 2081 0 ) + 2081 ( 175 2082 0 ) + 2082 ( 949 -727 2083 ) + 2083 ( 172 -701 0 ) + 2084 ( 1026 2085 0 ) + 2085 ( 42 2086 0 ) + 2086 ( 175 2087 0 ) + 2087 ( 170 0 2088 ) + 2088 ( 1029 2089 0 ) + 2089 ( 1031 2090 2091 ) + 2090 ( 949 -728 -729 ) + 2091 ( 1032 2092 0 ) + 2092 ( 949 -730 -731 ) + 2093 ( 972 2094 2106 ) + 2094 ( 853 2095 2098 ) + 2095 ( 443 2096 2097 ) + 2096 ( 968 -732 0 ) + 2097 ( 226 -703 0 ) + 2098 ( 1024 2099 2101 ) + 2099 ( 226 2100 0 ) + 2100 ( 841 -703 -733 ) + 2101 ( 989 2102 2104 ) + 2102 ( 226 2103 0 ) + 2103 ( 841 -703 -733 ) + 2104 ( 226 2105 0 ) + 2105 ( 841 -703 -733 ) + 2106 ( 135 2107 2134 ) + 2107 ( 129 2108 2123 ) + 2108 ( 705 2109 2112 ) + 2109 ( 977 2110 0 ) + 2110 ( 1034 2111 0 ) + 2111 ( 1036 -734 0 ) + 2112 ( 1036 2113 2114 ) + 2113 ( 968 -705 0 ) + 2114 ( 1038 2115 2118 ) + 2115 ( 443 2116 2117 ) + 2116 ( 968 -705 0 ) + 2117 ( 226 -703 0 ) + 2118 ( 986 2119 2122 ) + 2119 ( 443 2120 2121 ) + 2120 ( 968 -705 0 ) + 2121 ( 226 -703 0 ) + 2122 ( 968 -705 0 ) + 2123 ( 986 2124 2127 ) + 2124 ( 443 2125 2126 ) + 2125 ( 968 -705 0 ) + 2126 ( 226 -703 0 ) + 2127 ( 977 2128 2131 ) + 2128 ( 443 2129 2130 ) + 2129 ( 968 -705 0 ) + 2130 ( 226 -703 0 ) + 2131 ( 443 2132 2133 ) + 2132 ( 968 -705 0 ) + 2133 ( 226 -703 0 ) + 2134 ( 705 2135 2140 ) + 2135 ( 997 2136 0 ) + 2136 ( 1040 2137 0 ) + 2137 ( 1043 2138 0 ) + 2138 ( 1009 2139 0 ) + 2139 ( 1006 -735 0 ) + 2140 ( 968 2141 0 ) + 2141 ( 908 2142 0 ) + 2142 ( 1044 2143 2147 ) + 2143 ( 443 2144 2146 ) + 2144 ( 1046 -736 2145 ) + 2145 ( 962 -737 -738 ) + 2146 ( 226 -703 0 ) + 2147 ( 1046 -739 2148 ) + 2148 ( 963 -740 0 ) + 2149 ( 998 2150 2161 ) + 2150 ( 617 0 2151 ) + 2151 ( 705 0 2152 ) + 2152 ( 1040 2153 2157 ) + 2153 ( 908 2154 0 ) + 2154 ( 1044 2155 0 ) + 2155 ( 443 -737 2156 ) + 2156 ( 226 -703 0 ) + 2157 ( 908 2158 0 ) + 2158 ( 1044 2159 0 ) + 2159 ( 443 -737 2160 ) + 2160 ( 226 -703 0 ) + 2161 ( 135 2162 2166 ) + 2162 ( 1052 2163 0 ) + 2163 ( 443 2164 2165 ) + 2164 ( 968 -705 0 ) + 2165 ( 226 -703 0 ) + 2166 ( 908 2167 0 ) + 2167 ( 1044 2168 2171 ) + 2168 ( 443 2169 2170 ) + 2169 ( 962 -737 -738 ) + 2170 ( 226 -703 0 ) + 2171 ( 963 -740 0 ) + 2172 ( 1051 2173 2193 ) + 2173 ( 617 0 2174 ) + 2174 ( 968 2175 0 ) + 2175 ( 853 2176 2191 ) + 2176 ( 16 2177 0 ) + 2177 ( 908 2178 2187 ) + 2178 ( 1044 2179 2183 ) + 2179 ( 443 2180 2182 ) + 2180 ( 1046 -741 2181 ) + 2181 ( 1048 -737 -742 ) + 2182 ( 226 -703 0 ) + 2183 ( 1049 2184 2185 ) + 2184 ( 966 -743 -744 ) + 2185 ( 1046 2186 0 ) + 2186 ( 972 -745 -739 ) + 2187 ( 967 -744 2188 ) + 2188 ( 1049 0 2189 ) + 2189 ( 1046 2190 0 ) + 2190 ( 972 -745 0 ) + 2191 ( 226 2192 0 ) + 2192 ( 841 -703 -733 ) + 2193 ( 175 0 2194 ) + 2194 ( 16 2195 0 ) + 2195 ( 228 2196 2250 ) + 2196 ( 949 2197 2244 ) + 2197 ( 1045 2198 2200 ) + 2198 ( 15 2199 0 ) + 2199 ( 180 -746 0 ) + 2200 ( 1054 2201 2230 ) + 2201 ( 15 2202 0 ) + 2202 ( 1056 2203 2222 ) + 2203 ( 1058 2204 2212 ) + 2204 ( 1060 2205 -755 ) + 2205 ( 216 -747 2206 ) + 2206 ( 1062 -748 2207 ) + 2207 ( 218 2208 -754 ) + 2208 ( 1064 2209 -753 ) + 2209 ( 221 2210 -752 ) + 2210 ( 1067 2211 -751 ) + 2211 ( 222 -749 -750 ) + 2212 ( 1068 -756 2213 ) + 2213 ( 1070 2214 2219 ) + 2214 ( 1072 2215 -762 ) + 2215 ( 1074 2216 -761 ) + 2216 ( 1076 2217 -760 ) + 2217 ( 1079 2218 -759 ) + 2218 ( 1081 -757 -758 ) + 2219 ( 1074 2220 -766 ) + 2220 ( 1079 2221 -765 ) + 2221 ( 1083 -763 -764 ) + 2222 ( 1062 -767 2223 ) + 2223 ( 1084 2224 -775 ) + 2224 ( 1060 2225 -774 ) + 2225 ( 1086 -768 2226 ) + 2226 ( 1067 2227 -773 ) + 2227 ( 1088 2228 -772 ) + 2228 ( 1064 2229 -771 ) + 2229 ( 1091 -769 -770 ) + 2230 ( 1058 2231 2236 ) + 2231 ( 15 2232 0 ) + 2232 ( 1061 -755 2233 ) + 2233 ( 216 -747 2234 ) + 2234 ( 1062 -748 2235 ) + 2235 ( 219 -754 0 ) + 2236 ( 1057 2237 2241 ) + 2237 ( 1062 -767 2238 ) + 2238 ( 1085 -775 2239 ) + 2239 ( 1061 -774 2240 ) + 2240 ( 1086 -768 0 ) + 2241 ( 1073 2242 2243 ) + 2242 ( 1070 -762 0 ) + 2243 ( 1068 -756 0 ) + 2244 ( 15 2245 0 ) + 2245 ( 180 2246 0 ) + 2246 ( 224 -687 2247 ) + 2247 ( 226 2248 2249 ) + 2248 ( 952 -776 -690 ) + 2249 ( 952 -776 0 ) + 2250 ( 968 2251 0 ) + 2251 ( 226 2252 2256 ) + 2252 ( 230 2253 2254 ) + 2253 ( 950 -688 -777 ) + 2254 ( 841 -703 2255 ) + 2255 ( 147 -733 -689 ) + 2256 ( 180 2257 2267 ) + 2257 ( 853 2258 0 ) + 2258 ( 908 2259 2263 ) + 2259 ( 443 2260 0 ) + 2260 ( 1092 -778 2261 ) + 2261 ( 966 2262 -781 ) + 2262 ( 972 -779 -780 ) + 2263 ( 1092 2264 2265 ) + 2264 ( 146 -782 -783 ) + 2265 ( 967 -781 2266 ) + 2266 ( 972 -779 0 ) + 2267 ( 147 2268 0 ) + 2268 ( 853 2269 0 ) + 2269 ( 1092 -783 2270 ) + 2270 ( 967 -781 2271 ) + 2271 ( 972 -779 0 ) + 2272 ( 6 2273 0 ) + 2273 ( 8 2274 2277 ) + 2274 ( 11 2275 0 ) + 2275 ( 234 2276 0 ) + 2276 ( 16 -784 0 ) + 2277 ( 1094 2278 2874 ) + 2278 ( 453 2279 2604 ) + 2279 ( 696 2280 2464 ) + 2280 ( 575 2281 2387 ) + 2281 ( 300 2282 2374 ) + 2282 ( 27 2283 2344 ) + 2283 ( 458 2284 2340 ) + 2284 ( 238 2285 2302 ) + 2285 ( 719 2286 2296 ) + 2286 ( 352 2287 2288 ) + 2287 ( 1096 -785 0 ) + 2288 ( 1096 2289 0 ) + 2289 ( 949 2290 2291 ) + 2290 ( 1098 -786 0 ) + 2291 ( 58 2292 2295 ) + 2292 ( 366 -787 2293 ) + 2293 ( 437 2294 -790 ) + 2294 ( 840 -788 -789 ) + 2295 ( 366 -787 0 ) + 2296 ( 1016 2297 0 ) + 2297 ( 352 2298 2300 ) + 2298 ( 1096 -785 2299 ) + 2299 ( 1100 -791 0 ) + 2300 ( 1098 -792 2301 ) + 2301 ( 1102 -793 0 ) + 2302 ( 1105 2303 2322 ) + 2303 ( 1106 2304 2315 ) + 2304 ( 58 2305 2310 ) + 2305 ( 1109 2306 2308 ) + 2306 ( 1110 -794 2307 ) + 2307 ( 1115 -795 -796 ) + 2308 ( 948 -797 2309 ) + 2309 ( 1116 -798 -799 ) + 2310 ( 1115 -795 2311 ) + 2311 ( 948 0 2312 ) + 2312 ( 1112 2313 0 ) + 2313 ( 1109 2314 -799 ) + 2314 ( 1110 -794 -796 ) + 2315 ( 58 2316 2321 ) + 2316 ( 719 2317 2319 ) + 2317 ( 1115 -800 2318 ) + 2318 ( 948 -801 0 ) + 2319 ( 1115 0 2320 ) + 2320 ( 948 -802 0 ) + 2321 ( 1115 -800 0 ) + 2322 ( 58 2323 2337 ) + 2323 ( 413 2324 2331 ) + 2324 ( 948 2325 2328 ) + 2325 ( 411 -797 2326 ) + 2326 ( 414 2327 0 ) + 2327 ( 385 -182 -183 ) + 2328 ( 1109 2329 0 ) + 2329 ( 263 2330 0 ) + 2330 ( 1115 -795 0 ) + 2331 ( 263 2332 2335 ) + 2332 ( 948 -797 2333 ) + 2333 ( 1109 2334 0 ) + 2334 ( 1115 -795 0 ) + 2335 ( 411 2336 0 ) + 2336 ( 948 -797 0 ) + 2337 ( 1109 2338 0 ) + 2338 ( 263 2339 0 ) + 2339 ( 1115 -795 0 ) + 2340 ( 1120 2341 0 ) + 2341 ( 1105 2342 0 ) + 2342 ( 719 2343 0 ) + 2343 ( 1106 -803 0 ) + 2344 ( 1106 2345 0 ) + 2345 ( 411 2346 2354 ) + 2346 ( 16 2347 0 ) + 2347 ( 458 2348 2350 ) + 2348 ( 234 2349 0 ) + 2349 ( 406 -178 0 ) + 2350 ( 234 2351 0 ) + 2351 ( 1105 2352 2353 ) + 2352 ( 406 -178 0 ) + 2353 ( 406 -178 0 ) + 2354 ( 16 2355 0 ) + 2355 ( 1122 2356 2363 ) + 2356 ( 238 -804 2357 ) + 2357 ( 406 2358 2359 ) + 2358 ( 374 -214 -178 ) + 2359 ( 385 0 2360 ) + 2360 ( 454 2361 0 ) + 2361 ( 457 -215 2362 ) + 2362 ( 459 -805 -216 ) + 2363 ( 238 2364 2368 ) + 2364 ( 1016 2365 2367 ) + 2365 ( 352 -806 2366 ) + 2366 ( 1102 -807 0 ) + 2367 ( 1124 -808 0 ) + 2368 ( 1124 2369 0 ) + 2369 ( 406 2370 2371 ) + 2370 ( 374 -214 -178 ) + 2371 ( 454 2372 0 ) + 2372 ( 457 -215 2373 ) + 2373 ( 459 -805 -216 ) + 2374 ( 1106 2375 0 ) + 2375 ( 948 2376 2379 ) + 2376 ( 238 2377 0 ) + 2377 ( 57 -809 2378 ) + 2378 ( 366 -810 0 ) + 2379 ( 1098 2380 2382 ) + 2380 ( 263 0 2381 ) + 2381 ( 238 -811 0 ) + 2382 ( 1120 2383 0 ) + 2383 ( 263 0 2384 ) + 2384 ( 238 2385 0 ) + 2385 ( 352 2386 0 ) + 2386 ( 1096 -812 0 ) + 2387 ( 617 2388 2399 ) + 2388 ( 977 2389 2393 ) + 2389 ( 578 2390 0 ) + 2390 ( 1013 2391 0 ) + 2391 ( 458 2392 0 ) + 2392 ( 1127 -813 -814 ) + 2393 ( 1096 2394 0 ) + 2394 ( 1129 2395 2396 ) + 2395 ( 1098 -815 0 ) + 2396 ( 972 2397 0 ) + 2397 ( 1130 2398 -818 ) + 2398 ( 1132 -816 -817 ) + 2399 ( 1048 2400 2450 ) + 2400 ( 1131 2401 2436 ) + 2401 ( 719 2402 2408 ) + 2402 ( 1013 0 2403 ) + 2403 ( 1129 2404 2407 ) + 2404 ( 578 2405 2406 ) + 2405 ( 1098 -815 0 ) + 2406 ( 1098 -815 0 ) + 2407 ( 972 -818 0 ) + 2408 ( 116 2409 2416 ) + 2409 ( 1013 2410 2411 ) + 2410 ( 1136 -819 0 ) + 2411 ( 972 -820 2412 ) + 2412 ( 1144 2413 2415 ) + 2413 ( 1142 -819 2414 ) + 2414 ( 1047 -821 -822 ) + 2415 ( 1140 -819 0 ) + 2416 ( 1016 2417 2431 ) + 2417 ( 1098 2418 2426 ) + 2418 ( 972 -820 2419 ) + 2419 ( 1129 -823 2420 ) + 2420 ( 1144 2421 2423 ) + 2421 ( 1142 -824 2422 ) + 2422 ( 1047 -821 -822 ) + 2423 ( 1140 2424 0 ) + 2424 ( 1047 2425 -826 ) + 2425 ( 1146 -825 -826 ) + 2426 ( 1102 2427 0 ) + 2427 ( 1149 -827 2428 ) + 2428 ( 1136 2429 0 ) + 2429 ( 1146 -828 2430 ) + 2430 ( 1097 -829 -830 ) + 2431 ( 1124 2432 2434 ) + 2432 ( 1150 -831 2433 ) + 2433 ( 1147 -832 -833 ) + 2434 ( 1136 2435 0 ) + 2435 ( 1122 -831 0 ) + 2436 ( 1115 2437 2442 ) + 2437 ( 1152 2438 0 ) + 2438 ( 253 2439 2441 ) + 2439 ( 1154 -834 2440 ) + 2440 ( 1157 -835 0 ) + 2441 ( 226 -836 0 ) + 2442 ( 972 -837 2443 ) + 2443 ( 253 2444 2447 ) + 2444 ( 1008 2445 0 ) + 2445 ( 1144 2446 0 ) + 2446 ( 1047 -838 -839 ) + 2447 ( 226 2448 2449 ) + 2448 ( 1008 -840 -836 ) + 2449 ( 1008 -840 0 ) + 2450 ( 1159 2451 2456 ) + 2451 ( 16 2452 0 ) + 2452 ( 116 2453 2454 ) + 2453 ( 1160 -841 0 ) + 2454 ( 1124 2455 0 ) + 2455 ( 1147 -832 -833 ) + 2456 ( 1131 2457 2462 ) + 2457 ( 116 2458 2460 ) + 2458 ( 1138 2459 0 ) + 2459 ( 1120 -819 -842 ) + 2460 ( 1124 2461 0 ) + 2461 ( 1147 -832 -833 ) + 2462 ( 253 0 2463 ) + 2463 ( 226 -836 0 ) + 2464 ( 1019 0 2465 ) + 2465 ( 1131 2466 2590 ) + 2466 ( 66 2467 2569 ) + 2467 ( 329 2468 2501 ) + 2468 ( 1096 2469 2496 ) + 2469 ( 299 2470 2485 ) + 2470 ( 1106 2471 2478 ) + 2471 ( 1163 2472 0 ) + 2472 ( 1164 2473 2475 ) + 2473 ( 417 2474 0 ) + 2474 ( 179 -843 -185 ) + 2475 ( 1027 2476 2477 ) + 2476 ( 417 -844 0 ) + 2477 ( 417 -845 0 ) + 2478 ( 1163 2479 0 ) + 2479 ( 1164 2480 2482 ) + 2480 ( 417 2481 0 ) + 2481 ( 179 -843 -185 ) + 2482 ( 1027 2483 2484 ) + 2483 ( 417 -844 0 ) + 2484 ( 417 -845 0 ) + 2485 ( 417 2486 0 ) + 2486 ( 1027 2487 2491 ) + 2487 ( 1166 0 2488 ) + 2488 ( 1169 2489 0 ) + 2489 ( 1171 -846 2490 ) + 2490 ( 1172 -846 0 ) + 2491 ( 621 2492 0 ) + 2492 ( 1171 2493 2494 ) + 2493 ( 1164 -847 -848 ) + 2494 ( 1172 2495 0 ) + 2495 ( 1164 -847 -848 ) + 2496 ( 1016 2497 0 ) + 2497 ( 1174 2498 0 ) + 2498 ( 299 -849 2499 ) + 2499 ( 1171 -846 2500 ) + 2500 ( 1172 -846 0 ) + 2501 ( 238 2502 0 ) + 2502 ( 1129 2503 2542 ) + 2503 ( 1098 2504 2539 ) + 2504 ( 575 2505 2512 ) + 2505 ( 470 2506 2509 ) + 2506 ( 1176 2507 -853 ) + 2507 ( 62 2508 -852 ) + 2508 ( 1178 -850 -851 ) + 2509 ( 63 -854 2510 ) + 2510 ( 1178 -850 2511 ) + 2511 ( 1177 -855 0 ) + 2512 ( 50 2513 2520 ) + 2513 ( 1180 -856 2514 ) + 2514 ( 1182 2515 -862 ) + 2515 ( 1184 -857 2516 ) + 2516 ( 1186 2517 -861 ) + 2517 ( 1188 2518 2519 ) + 2518 ( 1190 -858 -859 ) + 2519 ( 1192 -859 -860 ) + 2520 ( 470 2521 2534 ) + 2521 ( 1180 2522 2526 ) + 2522 ( 1176 2523 -867 ) + 2523 ( 1169 2524 2525 ) + 2524 ( 1008 -863 -864 ) + 2525 ( 1198 -865 -866 ) + 2526 ( 1187 2527 2530 ) + 2527 ( 852 -868 2528 ) + 2528 ( 1198 2529 -866 ) + 2529 ( 1117 -869 -870 ) + 2530 ( 1183 -862 2531 ) + 2531 ( 1184 2532 0 ) + 2532 ( 852 -868 2533 ) + 2533 ( 1117 -871 -870 ) + 2534 ( 1169 2535 2536 ) + 2535 ( 1177 -855 0 ) + 2536 ( 1187 2537 2538 ) + 2537 ( 852 -872 0 ) + 2538 ( 852 -872 0 ) + 2539 ( 352 2540 0 ) + 2540 ( 1096 2541 0 ) + 2541 ( 575 -812 0 ) + 2542 ( 972 2543 0 ) + 2543 ( 1169 2544 2546 ) + 2544 ( 470 2545 0 ) + 2545 ( 50 -873 0 ) + 2546 ( 476 2547 2557 ) + 2547 ( 470 2548 2554 ) + 2548 ( 50 2549 2552 ) + 2549 ( 1194 -874 2550 ) + 2550 ( 1202 -875 2551 ) + 2551 ( 1200 -873 -876 ) + 2552 ( 1194 -874 2553 ) + 2553 ( 1204 -875 0 ) + 2554 ( 1026 2555 0 ) + 2555 ( 1194 -874 2556 ) + 2556 ( 1204 -875 0 ) + 2557 ( 1194 2558 2563 ) + 2558 ( 470 2559 2562 ) + 2559 ( 852 -877 2560 ) + 2560 ( 1117 2561 -880 ) + 2561 ( 117 -878 -879 ) + 2562 ( 852 -872 0 ) + 2563 ( 50 2564 2567 ) + 2564 ( 1196 -881 2565 ) + 2565 ( 1190 2566 -859 ) + 2566 ( 1200 -873 -882 ) + 2567 ( 1184 2568 0 ) + 2568 ( 470 -881 0 ) + 2569 ( 1096 2570 0 ) + 2570 ( 575 2571 2578 ) + 2571 ( 299 0 2572 ) + 2572 ( 238 2573 0 ) + 2573 ( 63 2574 2576 ) + 2574 ( 1098 -854 2575 ) + 2575 ( 352 -883 0 ) + 2576 ( 1178 -850 2577 ) + 2577 ( 1177 -884 0 ) + 2578 ( 972 2579 2586 ) + 2579 ( 1169 0 2580 ) + 2580 ( 476 2581 2584 ) + 2581 ( 1026 2582 0 ) + 2582 ( 1194 -874 2583 ) + 2583 ( 1204 -875 0 ) + 2584 ( 1194 2585 0 ) + 2585 ( 852 -872 0 ) + 2586 ( 1098 2587 0 ) + 2587 ( 116 0 2588 ) + 2588 ( 1177 2589 0 ) + 2589 ( 1129 -885 0 ) + 2590 ( 972 2591 0 ) + 2591 ( 470 2592 2602 ) + 2592 ( 50 2593 2600 ) + 2593 ( 55 2594 2599 ) + 2594 ( 1206 -886 2595 ) + 2595 ( 1200 2596 2598 ) + 2596 ( 1210 -887 2597 ) + 2597 ( 1213 -888 -889 ) + 2598 ( 1215 -889 -890 ) + 2599 ( 1134 -816 0 ) + 2600 ( 1204 2601 0 ) + 2601 ( 1026 -891 -892 ) + 2602 ( 1026 2603 0 ) + 2603 ( 1204 -893 0 ) + 2604 ( 617 2605 2739 ) + 2605 ( 55 2606 2643 ) + 2606 ( 79 2607 2627 ) + 2607 ( 972 2608 0 ) + 2608 ( 470 2609 2624 ) + 2609 ( 50 2610 2615 ) + 2610 ( 1208 -886 2611 ) + 2611 ( 1216 -894 2612 ) + 2612 ( 1218 -895 2613 ) + 2613 ( 1200 -889 2614 ) + 2614 ( 1215 -889 -890 ) + 2615 ( 1218 2616 2620 ) + 2616 ( 1220 -896 2617 ) + 2617 ( 1026 -891 2618 ) + 2618 ( 1223 2619 -892 ) + 2619 ( 1225 -897 -898 ) + 2620 ( 1204 2621 2623 ) + 2621 ( 1026 -891 2622 ) + 2622 ( 1223 -899 -892 ) + 2623 ( 1226 -900 0 ) + 2624 ( 1026 -893 2625 ) + 2625 ( 1218 2626 0 ) + 2626 ( 1220 -901 0 ) + 2627 ( 888 -902 2628 ) + 2628 ( 977 0 2629 ) + 2629 ( 840 2630 2631 ) + 2630 ( 461 -715 0 ) + 2631 ( 991 2632 2638 ) + 2632 ( 972 2633 0 ) + 2633 ( 49 2634 2635 ) + 2634 ( 461 -903 0 ) + 2635 ( 461 2636 2637 ) + 2636 ( 992 -904 0 ) + 2637 ( 853 -905 0 ) + 2638 ( 972 2639 0 ) + 2639 ( 48 2640 0 ) + 2640 ( 995 2641 2642 ) + 2641 ( 853 -906 0 ) + 2642 ( 853 -906 0 ) + 2643 ( 1049 0 2644 ) + 2644 ( 853 2645 2724 ) + 2645 ( 48 2646 2654 ) + 2646 ( 175 2647 2652 ) + 2647 ( 977 2648 2650 ) + 2648 ( 984 2649 0 ) + 2649 ( 978 -706 0 ) + 2650 ( 972 2651 0 ) + 2651 ( 42 -709 -906 ) + 2652 ( 977 2653 0 ) + 2653 ( 984 -706 0 ) + 2654 ( 696 2655 2712 ) + 2655 ( 79 2656 2698 ) + 2656 ( 984 2657 0 ) + 2657 ( 1228 2658 0 ) + 2658 ( 482 2659 2691 ) + 2659 ( 1230 2660 2676 ) + 2660 ( 1233 2661 2671 ) + 2661 ( 1235 -907 2662 ) + 2662 ( 972 2663 -914 ) + 2663 ( 1178 2664 2666 ) + 2664 ( 1236 2665 -910 ) + 2665 ( 494 -908 -909 ) + 2666 ( 1238 2667 2670 ) + 2667 ( 494 -908 2668 ) + 2668 ( 1169 -911 2669 ) + 2669 ( 1237 -912 -909 ) + 2670 ( 1240 -912 -913 ) + 2671 ( 972 -915 2672 ) + 2672 ( 1235 2673 0 ) + 2673 ( 1114 2674 2675 ) + 2674 ( 1009 -916 0 ) + 2675 ( 977 -917 0 ) + 2676 ( 559 2677 2685 ) + 2677 ( 1002 2678 2682 ) + 2678 ( 1242 -918 2679 ) + 2679 ( 561 2680 2681 ) + 2680 ( 1240 -919 0 ) + 2681 ( 1244 -920 0 ) + 2682 ( 561 2683 2684 ) + 2683 ( 1240 -921 0 ) + 2684 ( 1244 -922 0 ) + 2685 ( 495 2686 2689 ) + 2686 ( 572 -923 2687 ) + 2687 ( 1002 2688 0 ) + 2688 ( 1242 -918 0 ) + 2689 ( 1002 2690 0 ) + 2690 ( 1242 -924 0 ) + 2691 ( 977 2692 2694 ) + 2692 ( 458 2693 0 ) + 2693 ( 1013 -814 0 ) + 2694 ( 1233 2695 2697 ) + 2695 ( 972 2696 0 ) + 2696 ( 1134 -925 -913 ) + 2697 ( 972 -915 0 ) + 2698 ( 1246 2699 2702 ) + 2699 ( 977 2700 0 ) + 2700 ( 984 2701 0 ) + 2701 ( 982 -706 -926 ) + 2702 ( 984 2703 0 ) + 2703 ( 972 0 2704 ) + 2704 ( 1233 2705 2708 ) + 2705 ( 977 2706 0 ) + 2706 ( 1002 2707 0 ) + 2707 ( 1242 -927 0 ) + 2708 ( 1235 2709 0 ) + 2709 ( 977 2710 0 ) + 2710 ( 1230 -927 2711 ) + 2711 ( 1242 -927 0 ) + 2712 ( 972 2713 2716 ) + 2713 ( 1237 2714 0 ) + 2714 ( 1178 -928 2715 ) + 2715 ( 1134 -929 0 ) + 2716 ( 984 2717 0 ) + 2717 ( 701 0 2718 ) + 2718 ( 977 2719 0 ) + 2719 ( 495 0 2720 ) + 2720 ( 79 0 2721 ) + 2721 ( 1246 2722 0 ) + 2722 ( 978 2723 0 ) + 2723 ( 982 -706 -926 ) + 2724 ( 696 2725 2736 ) + 2725 ( 175 2726 2734 ) + 2726 ( 888 2727 2731 ) + 2727 ( 802 -930 2728 ) + 2728 ( 1236 2729 -934 ) + 2729 ( 415 2730 -933 ) + 2730 ( 494 -931 -932 ) + 2731 ( 79 2732 0 ) + 2732 ( 1236 2733 -934 ) + 2733 ( 494 -935 -932 ) + 2734 ( 888 -936 2735 ) + 2735 ( 79 -937 0 ) + 2736 ( 802 -930 2737 ) + 2737 ( 79 2738 0 ) + 2738 ( 1237 -928 0 ) + 2739 ( 48 2740 2779 ) + 2740 ( 566 2741 2768 ) + 2741 ( 984 2742 2758 ) + 2742 ( 977 2743 2749 ) + 2743 ( 705 2744 2746 ) + 2744 ( 1036 2745 0 ) + 2745 ( 1034 -734 0 ) + 2746 ( 443 2747 2748 ) + 2747 ( 968 -938 0 ) + 2748 ( 226 -703 0 ) + 2749 ( 968 2750 2756 ) + 2750 ( 226 2751 2753 ) + 2751 ( 888 -939 2752 ) + 2752 ( 841 -703 -733 ) + 2753 ( 853 2754 2755 ) + 2754 ( 443 -938 0 ) + 2755 ( 888 -939 0 ) + 2756 ( 853 0 2757 ) + 2757 ( 888 -939 0 ) + 2758 ( 16 2759 0 ) + 2759 ( 1052 2760 2763 ) + 2760 ( 443 2761 2762 ) + 2761 ( 968 -938 0 ) + 2762 ( 226 -703 0 ) + 2763 ( 1159 2764 2767 ) + 2764 ( 443 2765 2766 ) + 2765 ( 968 -938 0 ) + 2766 ( 226 -703 0 ) + 2767 ( 968 -938 0 ) + 2768 ( 968 2769 2776 ) + 2769 ( 853 2770 2773 ) + 2770 ( 16 2771 0 ) + 2771 ( 443 -938 2772 ) + 2772 ( 226 -703 0 ) + 2773 ( 888 -939 2774 ) + 2774 ( 226 2775 0 ) + 2775 ( 841 -703 -733 ) + 2776 ( 1052 2777 0 ) + 2777 ( 853 0 2778 ) + 2778 ( 888 -939 0 ) + 2779 ( 253 2780 2813 ) + 2780 ( 1115 2781 2800 ) + 2781 ( 79 2782 0 ) + 2782 ( 1159 2783 2785 ) + 2783 ( 16 2784 0 ) + 2784 ( 1160 -841 0 ) + 2785 ( 495 2786 0 ) + 2786 ( 1220 2787 2795 ) + 2787 ( 1249 2788 2791 ) + 2788 ( 1251 2789 0 ) + 2789 ( 1152 2790 0 ) + 2790 ( 1120 -940 -941 ) + 2791 ( 977 2792 0 ) + 2792 ( 1152 2793 0 ) + 2793 ( 1121 -941 2794 ) + 2794 ( 1252 -942 0 ) + 2795 ( 1048 0 2796 ) + 2796 ( 1240 2797 0 ) + 2797 ( 1152 2798 0 ) + 2798 ( 1121 -941 2799 ) + 2799 ( 1254 -943 0 ) + 2800 ( 79 2801 2811 ) + 2801 ( 1008 2802 2805 ) + 2802 ( 972 -944 2803 ) + 2803 ( 1144 2804 0 ) + 2804 ( 1047 -838 -839 ) + 2805 ( 495 2806 0 ) + 2806 ( 1240 2807 0 ) + 2807 ( 1176 2808 0 ) + 2808 ( 1152 2809 0 ) + 2809 ( 513 -945 2810 ) + 2810 ( 1256 -946 0 ) + 2811 ( 853 0 2812 ) + 2812 ( 888 -939 0 ) + 2813 ( 495 2814 2846 ) + 2814 ( 1115 2815 2839 ) + 2815 ( 1258 2816 2833 ) + 2816 ( 1048 2817 2825 ) + 2817 ( 226 2818 2820 ) + 2818 ( 1240 -947 2819 ) + 2819 ( 483 -948 -949 ) + 2820 ( 1240 2821 0 ) + 2821 ( 1220 2822 2824 ) + 2822 ( 1250 -950 2823 ) + 2823 ( 1248 -951 -952 ) + 2824 ( 1251 -953 -950 ) + 2825 ( 16 2826 0 ) + 2826 ( 226 2827 2832 ) + 2827 ( 1158 2828 -841 ) + 2828 ( 1120 2829 -956 ) + 2829 ( 483 -948 2830 ) + 2830 ( 967 -954 2831 ) + 2831 ( 1240 -955 -949 ) + 2832 ( 1159 -841 0 ) + 2833 ( 1048 2834 2837 ) + 2834 ( 1220 2835 0 ) + 2835 ( 1251 2836 0 ) + 2836 ( 1249 -952 0 ) + 2837 ( 16 2838 0 ) + 2838 ( 1159 -841 0 ) + 2839 ( 226 2840 2845 ) + 2840 ( 1008 -957 2841 ) + 2841 ( 1177 2842 -960 ) + 2842 ( 483 -948 2843 ) + 2843 ( 986 -958 2844 ) + 2844 ( 1240 -959 -949 ) + 2845 ( 1008 -957 0 ) + 2846 ( 1048 2847 2862 ) + 2847 ( 226 2848 2858 ) + 2848 ( 78 2849 2854 ) + 2849 ( 888 -939 2850 ) + 2850 ( 841 2851 -733 ) + 2851 ( 1177 -961 2852 ) + 2852 ( 1260 -962 2853 ) + 2853 ( 1008 -963 -960 ) + 2854 ( 1008 -957 2855 ) + 2855 ( 1177 2856 -960 ) + 2856 ( 986 -958 2857 ) + 2857 ( 1115 -964 -959 ) + 2858 ( 79 2859 2860 ) + 2859 ( 1008 -957 0 ) + 2860 ( 853 0 2861 ) + 2861 ( 888 -939 0 ) + 2862 ( 79 2863 2869 ) + 2863 ( 16 2864 0 ) + 2864 ( 226 2865 2868 ) + 2865 ( 1158 2866 -841 ) + 2866 ( 1120 2867 -956 ) + 2867 ( 967 -954 -955 ) + 2868 ( 1159 -841 0 ) + 2869 ( 16 2870 0 ) + 2870 ( 226 2871 0 ) + 2871 ( 1120 -961 2872 ) + 2872 ( 1260 -965 2873 ) + 2873 ( 1159 -966 -956 ) + 2874 ( 617 2875 3412 ) + 2875 ( 1117 2876 3336 ) + 2876 ( 1070 2877 3312 ) + 2877 ( 175 2878 3236 ) + 2878 ( 1262 2879 2886 ) + 2879 ( 1096 2880 0 ) + 2880 ( 66 2881 0 ) + 2881 ( 1027 2882 2884 ) + 2882 ( 417 2883 0 ) + 2883 ( 1118 -844 -967 ) + 2884 ( 296 2885 0 ) + 2885 ( 417 -845 0 ) + 2886 ( 51 2887 3075 ) + 2887 ( 1265 2888 2970 ) + 2888 ( 615 2889 2955 ) + 2889 ( 1267 2890 2944 ) + 2890 ( 458 2891 0 ) + 2891 ( 659 2892 2943 ) + 2892 ( 1268 2893 2912 ) + 2893 ( 902 2894 2907 ) + 2894 ( 1270 -968 2895 ) + 2895 ( 1272 -969 2896 ) + 2896 ( 1278 -970 2897 ) + 2897 ( 1280 2898 -977 ) + 2898 ( 1282 -971 2899 ) + 2899 ( 1284 2900 2906 ) + 2900 ( 1287 2901 -975 ) + 2901 ( 1288 2902 2905 ) + 2902 ( 1290 2903 -974 ) + 2903 ( 1292 -972 2904 ) + 2904 ( 1294 -973 -974 ) + 2905 ( 1297 -974 -975 ) + 2906 ( 1299 -975 -976 ) + 2907 ( 1270 -968 2908 ) + 2908 ( 1281 -978 2909 ) + 2909 ( 1272 -979 2910 ) + 2910 ( 1302 -980 2911 ) + 2911 ( 1282 -971 0 ) + 2912 ( 1274 2913 2919 ) + 2913 ( 902 2914 2917 ) + 2914 ( 1276 -969 2915 ) + 2915 ( 1300 -981 2916 ) + 2916 ( 1284 -982 -976 ) + 2917 ( 1300 -983 2918 ) + 2918 ( 1272 -984 0 ) + 2919 ( 1305 2920 2921 ) + 2920 ( 1306 -985 0 ) + 2921 ( 470 2922 2938 ) + 2922 ( 1308 -986 2923 ) + 2923 ( 1310 2924 -996 ) + 2924 ( 1312 -987 2925 ) + 2925 ( 1314 -988 2926 ) + 2926 ( 1316 -989 2927 ) + 2927 ( 1320 2928 -995 ) + 2928 ( 1322 2929 2937 ) + 2929 ( 1325 2930 -993 ) + 2930 ( 1326 2931 2936 ) + 2931 ( 1329 2932 -992 ) + 2932 ( 1330 2933 2935 ) + 2933 ( 1332 2934 -991 ) + 2934 ( 1334 -990 -991 ) + 2935 ( 1337 -991 -992 ) + 2936 ( 1339 -992 -993 ) + 2937 ( 1340 -993 -994 ) + 2938 ( 1311 -996 2939 ) + 2939 ( 1308 -986 2940 ) + 2940 ( 1314 -988 2941 ) + 2941 ( 1318 -989 2942 ) + 2942 ( 1312 -987 0 ) + 2943 ( 1012 -997 0 ) + 2944 ( 1306 2945 0 ) + 2945 ( 1027 2946 2952 ) + 2946 ( 1342 2947 2951 ) + 2947 ( 1012 2948 2950 ) + 2948 ( 1098 -998 2949 ) + 2949 ( 1097 -999 -1000 ) + 2950 ( 659 -1001 0 ) + 2951 ( 1098 -998 0 ) + 2952 ( 667 2953 0 ) + 2953 ( 665 -1002 2954 ) + 2954 ( 1344 -1003 0 ) + 2955 ( 1306 2956 0 ) + 2956 ( 1346 2957 2961 ) + 2957 ( 1348 2958 0 ) + 2958 ( 1012 2959 2960 ) + 2959 ( 1169 -1004 0 ) + 2960 ( 659 -1005 0 ) + 2961 ( 1342 2962 2966 ) + 2962 ( 1027 2963 0 ) + 2963 ( 1348 2964 0 ) + 2964 ( 1098 -1006 2965 ) + 2965 ( 1097 -1007 -1008 ) + 2966 ( 1027 2967 0 ) + 2967 ( 973 2968 2969 ) + 2968 ( 1098 -1009 0 ) + 2969 ( 1348 -1010 0 ) + 2970 ( 1096 2971 3011 ) + 2971 ( 66 2972 2989 ) + 2972 ( 1027 2973 0 ) + 2973 ( 1169 2974 2979 ) + 2974 ( 323 2975 -1015 ) + 2975 ( 1350 2976 2978 ) + 2976 ( 1352 -1011 2977 ) + 2977 ( 1098 -1012 -1013 ) + 2978 ( 1098 -1014 -1013 ) + 2979 ( 680 2980 0 ) + 2980 ( 323 2981 -1015 ) + 2981 ( 1179 2982 2983 ) + 2982 ( 1350 -1016 -1017 ) + 2983 ( 1350 -1016 2984 ) + 2984 ( 733 -1018 2985 ) + 2985 ( 658 2986 0 ) + 2986 ( 1354 2987 -1022 ) + 2987 ( 1356 2988 -1021 ) + 2988 ( 1359 -1019 -1020 ) + 2989 ( 1169 2990 2999 ) + 2990 ( 973 2991 2995 ) + 2991 ( 1098 2992 0 ) + 2992 ( 323 2993 0 ) + 2993 ( 681 -1023 2994 ) + 2994 ( 1360 -1024 0 ) + 2995 ( 681 2996 2997 ) + 2996 ( 1348 -1025 0 ) + 2997 ( 323 2998 0 ) + 2998 ( 1360 -1024 0 ) + 2999 ( 681 0 3000 ) + 3000 ( 1179 3001 3004 ) + 3001 ( 1360 3002 0 ) + 3002 ( 1363 -1026 3003 ) + 3003 ( 902 -1027 0 ) + 3004 ( 1027 3005 0 ) + 3005 ( 1350 0 3006 ) + 3006 ( 733 3007 0 ) + 3007 ( 1365 -1028 3008 ) + 3008 ( 902 3009 0 ) + 3009 ( 1366 3010 -1031 ) + 3010 ( 1356 -1029 -1030 ) + 3011 ( 66 3012 0 ) + 3012 ( 30 3013 3045 ) + 3013 ( 323 3014 0 ) + 3014 ( 1368 3015 3034 ) + 3015 ( 1370 3016 3032 ) + 3016 ( 1372 3017 3031 ) + 3017 ( 1374 3018 3026 ) + 3018 ( 1376 -1032 3019 ) + 3019 ( 1378 -1033 3020 ) + 3020 ( 1382 -1034 3021 ) + 3021 ( 1384 3022 3025 ) + 3022 ( 1387 3023 -1037 ) + 3023 ( 1388 -1035 3024 ) + 3024 ( 459 -1036 -1037 ) + 3025 ( 1391 -1037 -1038 ) + 3026 ( 458 3027 0 ) + 3027 ( 1150 3028 3029 ) + 3028 ( 1376 -1032 -1037 ) + 3029 ( 1393 -1039 3030 ) + 3030 ( 1376 -1040 -1037 ) + 3031 ( 1012 -1041 0 ) + 3032 ( 1306 3033 0 ) + 3033 ( 1012 -1041 0 ) + 3034 ( 1370 3035 0 ) + 3035 ( 984 3036 0 ) + 3036 ( 1398 3037 0 ) + 3037 ( 597 0 3038 ) + 3038 ( 1400 3039 0 ) + 3039 ( 1380 -1033 3040 ) + 3040 ( 1394 -1042 3041 ) + 3041 ( 1396 -1043 3042 ) + 3042 ( 1384 3043 -1038 ) + 3043 ( 1402 -1044 3044 ) + 3044 ( 1405 -1045 -1046 ) + 3045 ( 1150 3046 3068 ) + 3046 ( 323 3047 0 ) + 3047 ( 1370 3048 3064 ) + 3048 ( 1376 3049 3059 ) + 3049 ( 1373 3050 3052 ) + 3050 ( 659 -1047 3051 ) + 3051 ( 1012 -1041 0 ) + 3052 ( 1406 -1048 3053 ) + 3053 ( 990 3054 3058 ) + 3054 ( 1408 -1049 3055 ) + 3055 ( 1411 3056 -1053 ) + 3056 ( 1398 3057 -1052 ) + 3057 ( 693 -1050 -1051 ) + 3058 ( 1408 -1049 0 ) + 3059 ( 990 3060 3062 ) + 3060 ( 1382 -1054 3061 ) + 3061 ( 1378 -1055 0 ) + 3062 ( 1382 -1054 3063 ) + 3063 ( 1378 -1055 0 ) + 3064 ( 659 3065 3066 ) + 3065 ( 1306 -1056 0 ) + 3066 ( 1306 3067 0 ) + 3067 ( 1012 -1041 0 ) + 3068 ( 1370 3069 0 ) + 3069 ( 984 3070 0 ) + 3070 ( 1374 3071 0 ) + 3071 ( 1394 3072 3073 ) + 3072 ( 323 -1057 0 ) + 3073 ( 1378 -1058 3074 ) + 3074 ( 1396 -1043 0 ) + 3075 ( 603 3076 3125 ) + 3076 ( 1066 3077 3115 ) + 3077 ( 1413 3078 3089 ) + 3078 ( 34 3079 0 ) + 3079 ( 345 3080 3085 ) + 3080 ( 615 3081 3083 ) + 3081 ( 1414 -1059 3082 ) + 3082 ( 609 -1060 -1061 ) + 3083 ( 1416 3084 0 ) + 3084 ( 1419 -1062 0 ) + 3085 ( 615 3086 0 ) + 3086 ( 1414 0 3087 ) + 3087 ( 609 3088 0 ) + 3088 ( 639 -1063 0 ) + 3089 ( 615 3090 3107 ) + 3090 ( 458 3091 3101 ) + 3091 ( 1306 3092 3099 ) + 3092 ( 1027 3093 3096 ) + 3093 ( 1012 -1064 3094 ) + 3094 ( 34 3095 0 ) + 3095 ( 1155 -1065 -1066 ) + 3096 ( 667 3097 0 ) + 3097 ( 607 -1067 3098 ) + 3098 ( 1420 -1068 0 ) + 3099 ( 34 3100 0 ) + 3100 ( 607 -1069 0 ) + 3101 ( 34 3102 0 ) + 3102 ( 607 3103 0 ) + 3103 ( 1120 -1069 3104 ) + 3104 ( 639 -1070 3105 ) + 3105 ( 345 -1071 3106 ) + 3106 ( 1422 -1072 0 ) + 3107 ( 1027 3108 0 ) + 3108 ( 1306 3109 0 ) + 3109 ( 1169 3110 0 ) + 3110 ( 1012 3111 3113 ) + 3111 ( 997 -1073 3112 ) + 3112 ( 1424 -1073 0 ) + 3113 ( 34 3114 0 ) + 3114 ( 1155 -1065 -1066 ) + 3115 ( 345 3116 0 ) + 3116 ( 638 3117 0 ) + 3117 ( 615 3118 3123 ) + 3118 ( 1414 3119 3120 ) + 3119 ( 34 -1059 0 ) + 3120 ( 609 3121 3122 ) + 3121 ( 34 -1074 0 ) + 3122 ( 34 -1061 0 ) + 3123 ( 34 3124 0 ) + 3124 ( 1416 -1062 0 ) + 3125 ( 323 3126 0 ) + 3126 ( 1374 3127 3180 ) + 3127 ( 701 3128 3140 ) + 3128 ( 1426 3129 0 ) + 3129 ( 680 3130 3136 ) + 3130 ( 1027 3131 0 ) + 3131 ( 1357 3132 0 ) + 3132 ( 1429 3133 0 ) + 3133 ( 1400 -1075 3134 ) + 3134 ( 1368 -1076 3135 ) + 3135 ( 34 -1077 0 ) + 3136 ( 1027 3137 0 ) + 3137 ( 1169 3138 0 ) + 3138 ( 1368 -1078 3139 ) + 3139 ( 34 -1077 0 ) + 3140 ( 1027 3141 3177 ) + 3141 ( 984 3142 3166 ) + 3142 ( 42 3143 3159 ) + 3143 ( 997 3144 3149 ) + 3144 ( 1428 3145 3147 ) + 3145 ( 326 -1079 3146 ) + 3146 ( 1007 -1080 -1081 ) + 3147 ( 1426 -1082 3148 ) + 3148 ( 1007 -1080 -1083 ) + 3149 ( 1424 3150 3153 ) + 3150 ( 626 3151 0 ) + 3151 ( 1428 3152 -1084 ) + 3152 ( 326 -1079 -1081 ) + 3153 ( 680 3154 0 ) + 3154 ( 1428 3155 3157 ) + 3155 ( 326 -1079 3156 ) + 3156 ( 1222 -1085 -1081 ) + 3157 ( 1356 3158 -1087 ) + 3158 ( 1222 -1085 -1086 ) + 3159 ( 1429 3160 0 ) + 3160 ( 1424 3161 3164 ) + 3161 ( 997 3162 3163 ) + 3162 ( 1426 -1088 0 ) + 3163 ( 626 -1084 0 ) + 3164 ( 680 3165 0 ) + 3165 ( 1357 -1087 0 ) + 3166 ( 680 3167 3171 ) + 3167 ( 42 3168 0 ) + 3168 ( 241 3169 0 ) + 3169 ( 1431 -1089 3170 ) + 3170 ( 1158 -1090 -1091 ) + 3171 ( 1419 3172 0 ) + 3172 ( 1433 3173 3174 ) + 3173 ( 1416 -1092 0 ) + 3174 ( 42 3175 3176 ) + 3175 ( 626 -1093 -1094 ) + 3176 ( 1416 -1094 0 ) + 3177 ( 680 3178 0 ) + 3178 ( 42 3179 0 ) + 3179 ( 241 -1095 0 ) + 3180 ( 42 3181 3198 ) + 3181 ( 1419 3182 3187 ) + 3182 ( 345 3183 3184 ) + 3183 ( 676 -1096 -1062 ) + 3184 ( 1370 -1097 3185 ) + 3185 ( 1434 3186 0 ) + 3186 ( 676 -1098 -1099 ) + 3187 ( 997 3188 0 ) + 3188 ( 1370 3189 3197 ) + 3189 ( 1436 3190 3194 ) + 3190 ( 597 3191 0 ) + 3191 ( 752 3192 0 ) + 3192 ( 1413 3193 0 ) + 3193 ( 1438 -1100 0 ) + 3194 ( 984 3195 0 ) + 3195 ( 1426 -1082 3196 ) + 3196 ( 1007 -1080 -1083 ) + 3197 ( 1306 -1101 0 ) + 3198 ( 1368 3199 3219 ) + 3199 ( 701 3200 3215 ) + 3200 ( 1306 3201 3208 ) + 3201 ( 1012 3202 3203 ) + 3202 ( 1169 -1102 0 ) + 3203 ( 34 3204 3207 ) + 3204 ( 1440 -1103 3205 ) + 3205 ( 1155 3206 -1106 ) + 3206 ( 1443 -1104 -1105 ) + 3207 ( 1440 -1103 0 ) + 3208 ( 1370 3209 0 ) + 3209 ( 34 3210 3213 ) + 3210 ( 1372 3211 3212 ) + 3211 ( 458 -1103 -1107 ) + 3212 ( 1443 -1108 -1105 ) + 3213 ( 1372 3214 0 ) + 3214 ( 458 -1103 0 ) + 3215 ( 1306 3216 3218 ) + 3216 ( 1424 3217 0 ) + 3217 ( 997 -1109 0 ) + 3218 ( 1370 -1110 0 ) + 3219 ( 1370 3220 3232 ) + 3220 ( 1426 3221 3227 ) + 3221 ( 1398 3222 3226 ) + 3222 ( 597 3223 3224 ) + 3223 ( 34 -1111 0 ) + 3224 ( 34 3225 0 ) + 3225 ( 1445 -1111 -1112 ) + 3226 ( 700 -1113 0 ) + 3227 ( 984 0 3228 ) + 3228 ( 1416 3229 0 ) + 3229 ( 752 3230 3231 ) + 3230 ( 1419 -1096 0 ) + 3231 ( 1419 -1096 0 ) + 3232 ( 1419 3233 0 ) + 3233 ( 676 3234 3235 ) + 3234 ( 1416 -1096 0 ) + 3235 ( 1416 -1062 0 ) + 3236 ( 1413 3237 3245 ) + 3237 ( 615 3238 3242 ) + 3238 ( 639 3239 0 ) + 3239 ( 1066 -1063 3240 ) + 3240 ( 1446 3241 0 ) + 3241 ( 1449 -1114 -1115 ) + 3242 ( 680 3243 0 ) + 3243 ( 323 3244 0 ) + 3244 ( 241 -1116 0 ) + 3245 ( 300 3246 3281 ) + 3246 ( 680 3247 3265 ) + 3247 ( 241 3248 3256 ) + 3248 ( 1120 3249 3250 ) + 3249 ( 1027 -1117 0 ) + 3250 ( 1362 3251 0 ) + 3251 ( 637 3252 0 ) + 3252 ( 1431 3253 3254 ) + 3253 ( 1450 -1118 0 ) + 3254 ( 1158 3255 0 ) + 3255 ( 1452 -1119 0 ) + 3256 ( 1115 3257 3263 ) + 3257 ( 458 3258 3261 ) + 3258 ( 1118 -800 3259 ) + 3259 ( 323 -1120 3260 ) + 3260 ( 1454 -1121 -1122 ) + 3261 ( 984 3262 0 ) + 3262 ( 323 -1120 0 ) + 3263 ( 323 3264 0 ) + 3264 ( 1027 -1120 0 ) + 3265 ( 615 3266 3273 ) + 3266 ( 1306 3267 3269 ) + 3267 ( 1027 -1123 3268 ) + 3268 ( 607 -1067 0 ) + 3269 ( 607 3270 0 ) + 3270 ( 1120 -1069 3271 ) + 3271 ( 639 -1070 3272 ) + 3272 ( 1422 -1072 0 ) + 3273 ( 1027 3274 0 ) + 3274 ( 1370 3275 3278 ) + 3275 ( 1158 3276 0 ) + 3276 ( 984 3277 0 ) + 3277 ( 997 -1124 0 ) + 3278 ( 984 3279 0 ) + 3279 ( 997 3280 0 ) + 3280 ( 1306 -1125 0 ) + 3281 ( 1027 3282 3310 ) + 3282 ( 615 3283 3289 ) + 3283 ( 1306 -1123 3284 ) + 3284 ( 1414 0 3285 ) + 3285 ( 607 3286 0 ) + 3286 ( 1120 -1069 3287 ) + 3287 ( 639 -1070 3288 ) + 3288 ( 1422 -1072 0 ) + 3289 ( 984 3290 3296 ) + 3290 ( 323 3291 0 ) + 3291 ( 1370 3292 3294 ) + 3292 ( 680 -1126 3293 ) + 3293 ( 997 -1124 0 ) + 3294 ( 997 3295 0 ) + 3295 ( 1306 -1125 0 ) + 3296 ( 241 3297 0 ) + 3297 ( 1362 3298 3306 ) + 3298 ( 637 3299 3303 ) + 3299 ( 1431 3300 3301 ) + 3300 ( 1450 -1118 0 ) + 3301 ( 1158 3302 0 ) + 3302 ( 1452 -1127 0 ) + 3303 ( 1431 0 3304 ) + 3304 ( 1158 3305 0 ) + 3305 ( 1120 -1128 0 ) + 3306 ( 680 3307 0 ) + 3307 ( 1431 0 3308 ) + 3308 ( 1158 3309 0 ) + 3309 ( 1120 -1129 0 ) + 3310 ( 680 0 3311 ) + 3311 ( 607 -1067 0 ) + 3312 ( 175 3313 0 ) + 3313 ( 16 3314 0 ) + 3314 ( 680 0 3315 ) + 3315 ( 1456 3316 3328 ) + 3316 ( 34 3317 0 ) + 3317 ( 752 3318 3322 ) + 3318 ( 597 3319 0 ) + 3319 ( 1416 3320 0 ) + 3320 ( 1458 3321 0 ) + 3321 ( 1460 -1130 0 ) + 3322 ( 345 3323 0 ) + 3323 ( 615 3324 0 ) + 3324 ( 638 3325 0 ) + 3325 ( 609 3326 3327 ) + 3326 ( 784 -1131 0 ) + 3327 ( 1414 -1059 -1061 ) + 3328 ( 34 3329 0 ) + 3329 ( 752 0 3330 ) + 3330 ( 345 3331 0 ) + 3331 ( 615 3332 0 ) + 3332 ( 638 3333 0 ) + 3333 ( 609 3334 3335 ) + 3334 ( 784 -1131 0 ) + 3335 ( 1414 -1059 -1061 ) + 3336 ( 1465 3337 3397 ) + 3337 ( 418 3338 3342 ) + 3338 ( 620 3339 0 ) + 3339 ( 42 3340 0 ) + 3340 ( 175 3341 0 ) + 3341 ( 395 -1132 0 ) + 3342 ( 701 3343 3357 ) + 3343 ( 620 3344 3353 ) + 3344 ( 615 3345 0 ) + 3345 ( 663 3346 3352 ) + 3346 ( 638 3347 3350 ) + 3347 ( 671 -1133 3348 ) + 3348 ( 945 -1134 3349 ) + 3349 ( 664 -1135 -1136 ) + 3350 ( 945 -1137 3351 ) + 3351 ( 657 -1138 -1139 ) + 3352 ( 51 -1140 0 ) + 3353 ( 680 0 3354 ) + 3354 ( 667 3355 0 ) + 3355 ( 665 -1141 3356 ) + 3356 ( 1344 -1142 0 ) + 3357 ( 241 3358 3393 ) + 3358 ( 680 3359 3364 ) + 3359 ( 42 3360 0 ) + 3360 ( 175 3361 3362 ) + 3361 ( 1164 -1143 -1095 ) + 3362 ( 1164 3363 0 ) + 3363 ( 620 -1144 0 ) + 3364 ( 175 3365 3386 ) + 3365 ( 802 3366 3382 ) + 3366 ( 42 3367 3376 ) + 3367 ( 620 3368 3372 ) + 3368 ( 676 -1145 3369 ) + 3369 ( 615 3370 -441 ) + 3370 ( 662 3371 -1148 ) + 3371 ( 672 -1146 -1147 ) + 3372 ( 676 0 3373 ) + 3373 ( 615 3374 0 ) + 3374 ( 607 -1149 3375 ) + 3375 ( 1420 -1150 0 ) + 3376 ( 620 3377 3380 ) + 3377 ( 676 0 3378 ) + 3378 ( 615 3379 0 ) + 3379 ( 663 -1148 0 ) + 3380 ( 615 3381 0 ) + 3381 ( 1420 -1151 0 ) + 3382 ( 42 3383 3384 ) + 3383 ( 607 -1149 0 ) + 3384 ( 1420 3385 0 ) + 3385 ( 607 -1152 0 ) + 3386 ( 620 3387 3390 ) + 3387 ( 615 -1153 3388 ) + 3388 ( 676 3389 0 ) + 3389 ( 596 -1144 0 ) + 3390 ( 676 0 3391 ) + 3391 ( 615 3392 0 ) + 3392 ( 607 -1149 0 ) + 3393 ( 175 3394 0 ) + 3394 ( 42 3395 0 ) + 3395 ( 1164 3396 0 ) + 3396 ( 620 -1132 0 ) + 3397 ( 330 3398 0 ) + 3398 ( 66 3399 0 ) + 3399 ( 948 3400 3407 ) + 3400 ( 417 3401 0 ) + 3401 ( 296 3402 3403 ) + 3402 ( 179 -843 -185 ) + 3403 ( 421 3404 3405 ) + 3404 ( 179 -1154 -187 ) + 3405 ( 422 3406 0 ) + 3406 ( 179 -1154 -187 ) + 3407 ( 1164 3408 3410 ) + 3408 ( 296 3409 0 ) + 3409 ( 417 -843 0 ) + 3410 ( 296 3411 0 ) + 3411 ( 417 -845 0 ) + 3412 ( 719 3413 3467 ) + 3413 ( 680 3414 3442 ) + 3414 ( 296 3415 3423 ) + 3415 ( 948 3416 3420 ) + 3416 ( 58 3417 0 ) + 3417 ( 376 -801 3418 ) + 3418 ( 945 3419 0 ) + 3419 ( 888 -1155 0 ) + 3420 ( 1115 3421 0 ) + 3421 ( 1066 3422 0 ) + 3422 ( 458 -800 0 ) + 3423 ( 1465 3424 3432 ) + 3424 ( 620 0 3425 ) + 3425 ( 1027 3426 0 ) + 3426 ( 1413 3427 3429 ) + 3427 ( 1070 3428 0 ) + 3428 ( 241 -1116 0 ) + 3429 ( 1120 3430 0 ) + 3430 ( 984 -1156 3431 ) + 3431 ( 241 -1157 0 ) + 3432 ( 945 3433 0 ) + 3433 ( 948 0 3434 ) + 3434 ( 458 3435 3439 ) + 3435 ( 323 3436 3437 ) + 3436 ( 1027 -1156 0 ) + 3437 ( 1115 3438 0 ) + 3438 ( 1118 -800 -1158 ) + 3439 ( 1070 3440 0 ) + 3440 ( 984 3441 0 ) + 3441 ( 323 -1156 0 ) + 3442 ( 16 3443 0 ) + 3443 ( 1070 3444 3464 ) + 3444 ( 1027 3445 3459 ) + 3445 ( 615 3446 3455 ) + 3446 ( 639 3447 3450 ) + 3447 ( 798 -1159 3448 ) + 3448 ( 1446 3449 0 ) + 3449 ( 1060 -1160 -1161 ) + 3450 ( 607 3451 3453 ) + 3451 ( 1120 -1162 3452 ) + 3452 ( 1422 -1072 0 ) + 3453 ( 1120 3454 0 ) + 3454 ( 1306 -1163 0 ) + 3455 ( 984 3456 0 ) + 3456 ( 1306 3457 3458 ) + 3457 ( 997 -1164 0 ) + 3458 ( 1370 -1165 0 ) + 3459 ( 620 3460 3461 ) + 3460 ( 615 -1153 0 ) + 3461 ( 676 0 3462 ) + 3462 ( 615 3463 0 ) + 3463 ( 607 -1166 0 ) + 3464 ( 798 3465 0 ) + 3465 ( 639 3466 0 ) + 3466 ( 1467 -1167 0 ) + 3467 ( 680 3468 3549 ) + 3468 ( 1263 3469 3538 ) + 3469 ( 840 0 3470 ) + 3470 ( 948 0 3471 ) + 3471 ( 853 3472 0 ) + 3472 ( 1469 3473 3522 ) + 3473 ( 1471 3474 3516 ) + 3474 ( 1070 3475 0 ) + 3475 ( 908 3476 3488 ) + 3476 ( 601 3477 0 ) + 3477 ( 312 3478 -1179 ) + 3478 ( 1114 3479 3483 ) + 3479 ( 1046 -1168 3480 ) + 3480 ( 1475 3481 -1172 ) + 3481 ( 1464 3482 -1171 ) + 3482 ( 986 -1169 -1170 ) + 3483 ( 1048 3484 -1178 ) + 3484 ( 458 -1173 3485 ) + 3485 ( 1464 3486 -1177 ) + 3486 ( 1476 3487 -1176 ) + 3487 ( 1369 -1174 -1175 ) + 3488 ( 313 3489 3507 ) + 3489 ( 710 3490 3502 ) + 3490 ( 984 -1180 3491 ) + 3491 ( 1412 3492 3500 ) + 3492 ( 1120 3493 3496 ) + 3493 ( 240 3494 -1157 ) + 3494 ( 1477 3495 -1183 ) + 3495 ( 1478 -1181 -1182 ) + 3496 ( 1478 -1181 3497 ) + 3497 ( 1159 3498 3499 ) + 3498 ( 1080 -1184 -1185 ) + 3499 ( 241 -1186 -1182 ) + 3500 ( 240 3501 -1116 ) + 3501 ( 1478 -1181 -1187 ) + 3502 ( 1413 3503 3504 ) + 3503 ( 241 -1116 0 ) + 3504 ( 1120 3505 0 ) + 3505 ( 984 -1180 3506 ) + 3506 ( 241 -1157 0 ) + 3507 ( 984 3508 3512 ) + 3508 ( 1472 -1188 3509 ) + 3509 ( 1115 3510 3511 ) + 3510 ( 458 -1173 0 ) + 3511 ( 1046 -1168 0 ) + 3512 ( 710 3513 0 ) + 3513 ( 1049 -1178 3514 ) + 3514 ( 1472 3515 0 ) + 3515 ( 1477 -1189 -1190 ) + 3516 ( 1480 3517 0 ) + 3517 ( 601 3518 0 ) + 3518 ( 1117 3519 3520 ) + 3519 ( 1482 -1191 -1192 ) + 3520 ( 1484 -1193 3521 ) + 3521 ( 1486 -1194 0 ) + 3522 ( 1066 3523 0 ) + 3523 ( 1117 3524 3534 ) + 3524 ( 1488 3525 3526 ) + 3525 ( 601 -1195 0 ) + 3526 ( 1490 3527 0 ) + 3527 ( 1475 3528 3533 ) + 3528 ( 986 -1196 3529 ) + 3529 ( 1492 -1197 3530 ) + 3530 ( 1115 3531 -1199 ) + 3531 ( 1476 3532 -1200 ) + 3532 ( 1369 -1198 -1199 ) + 3533 ( 1492 -1201 -1202 ) + 3534 ( 601 3535 0 ) + 3535 ( 1484 -1193 3536 ) + 3536 ( 1480 3537 0 ) + 3537 ( 1486 -1194 0 ) + 3538 ( 853 0 3539 ) + 3539 ( 948 3540 0 ) + 3540 ( 296 3541 0 ) + 3541 ( 840 3542 3546 ) + 3542 ( 27 3543 0 ) + 3543 ( 376 -1203 3544 ) + 3544 ( 945 3545 0 ) + 3545 ( 888 -1155 0 ) + 3546 ( 601 3547 0 ) + 3547 ( 1161 3548 0 ) + 3548 ( 376 -1204 0 ) + 3549 ( 601 3550 0 ) + 3550 ( 627 3551 3654 ) + 3551 ( 16 3552 3648 ) + 3552 ( 620 3553 3563 ) + 3553 ( 604 3554 3559 ) + 3554 ( 597 3555 3556 ) + 3555 ( 602 -1205 -1206 ) + 3556 ( 1484 -1207 3557 ) + 3557 ( 618 3558 0 ) + 3558 ( 628 -1208 -1209 ) + 3559 ( 618 3560 3562 ) + 3560 ( 614 3561 -1153 ) + 3561 ( 610 -381 -382 ) + 3562 ( 615 -1153 0 ) + 3563 ( 710 3564 3632 ) + 3564 ( 615 3565 3609 ) + 3565 ( 607 3566 3588 ) + 3566 ( 968 3567 3581 ) + 3567 ( 908 3568 3571 ) + 3568 ( 638 3569 -1213 ) + 3569 ( 1064 -1210 3570 ) + 3570 ( 1494 -1211 -1212 ) + 3571 ( 639 -1213 3572 ) + 3572 ( 1418 3573 3579 ) + 3573 ( 1120 -1214 3574 ) + 3574 ( 1422 -1072 3575 ) + 3575 ( 1159 3576 -1218 ) + 3576 ( 1496 3577 3578 ) + 3577 ( 1494 -1215 -1216 ) + 3578 ( 1501 -1216 -1217 ) + 3579 ( 1498 3580 0 ) + 3580 ( 1494 -1215 -1216 ) + 3581 ( 1120 -1219 3582 ) + 3582 ( 639 3583 3587 ) + 3583 ( 1070 -1220 3584 ) + 3584 ( 1466 3585 -1167 ) + 3585 ( 1083 3586 -1223 ) + 3586 ( 656 -1221 -1222 ) + 3587 ( 1422 -1072 0 ) + 3588 ( 1070 3589 0 ) + 3589 ( 1027 3590 3599 ) + 3590 ( 1306 -1163 3591 ) + 3591 ( 968 3592 0 ) + 3592 ( 252 3593 3595 ) + 3593 ( 1502 -1224 3594 ) + 3594 ( 608 -1225 -1226 ) + 3595 ( 1504 3596 0 ) + 3596 ( 608 3597 3598 ) + 3597 ( 1015 -1227 -1228 ) + 3598 ( 1508 -1228 -1229 ) + 3599 ( 1510 3600 3603 ) + 3600 ( 670 3601 -1233 ) + 3601 ( 920 3602 -1232 ) + 3602 ( 1513 -1230 -1231 ) + 3603 ( 1514 3604 0 ) + 3604 ( 920 3605 3608 ) + 3605 ( 1513 3606 3607 ) + 3606 ( 608 -1234 -1235 ) + 3607 ( 609 -1235 -1236 ) + 3608 ( 609 -1235 -1237 ) + 3609 ( 1070 3610 0 ) + 3610 ( 1510 3611 3616 ) + 3611 ( 1046 3612 -1240 ) + 3612 ( 920 3613 3614 ) + 3613 ( 1513 -1230 -1231 ) + 3614 ( 610 -1238 3615 ) + 3615 ( 1027 -1239 -1232 ) + 3616 ( 1027 3617 0 ) + 3617 ( 1306 3618 3623 ) + 3618 ( 997 -1241 3619 ) + 3619 ( 1516 3620 0 ) + 3620 ( 610 3621 3622 ) + 3621 ( 1474 -1242 -1243 ) + 3622 ( 1475 -1243 -1244 ) + 3623 ( 1370 3624 3626 ) + 3624 ( 984 -1245 3625 ) + 3625 ( 1477 -1246 -1247 ) + 3626 ( 252 3627 3629 ) + 3627 ( 1502 -1248 3628 ) + 3628 ( 1507 -1249 -1250 ) + 3629 ( 1504 3630 0 ) + 3630 ( 1015 3631 -1228 ) + 3631 ( 1507 -1227 -1251 ) + 3632 ( 1070 3633 3646 ) + 3633 ( 1027 3634 3645 ) + 3634 ( 615 3635 3641 ) + 3635 ( 607 3636 3639 ) + 3636 ( 1120 -1252 3637 ) + 3637 ( 639 -1220 3638 ) + 3638 ( 1422 -1072 0 ) + 3639 ( 1120 3640 0 ) + 3640 ( 1306 -1163 0 ) + 3641 ( 984 3642 0 ) + 3642 ( 1306 3643 3644 ) + 3643 ( 997 -1241 0 ) + 3644 ( 1370 -1245 0 ) + 3645 ( 607 -1166 0 ) + 3646 ( 639 3647 0 ) + 3647 ( 1467 -1167 0 ) + 3648 ( 968 3649 0 ) + 3649 ( 607 3650 0 ) + 3650 ( 908 3651 0 ) + 3651 ( 1518 3652 0 ) + 3652 ( 639 3653 0 ) + 3653 ( 1521 -1253 -1254 ) + 3654 ( 1510 3655 3659 ) + 3655 ( 1070 3656 0 ) + 3656 ( 853 3657 0 ) + 3657 ( 1046 3658 -1240 ) + 3658 ( 747 -1255 -1256 ) + 3659 ( 620 0 3660 ) + 3660 ( 1070 3661 0 ) + 3661 ( 984 3662 3667 ) + 3662 ( 1480 3663 0 ) + 3663 ( 997 -1257 3664 ) + 3664 ( 1516 3665 0 ) + 3665 ( 1474 3666 -1243 ) + 3666 ( 747 -1242 -1258 ) + 3667 ( 710 3668 0 ) + 3668 ( 1159 3669 3671 ) + 3669 ( 1080 -1259 3670 ) + 3670 ( 747 -1260 -1261 ) + 3671 ( 747 3672 3673 ) + 3672 ( 1477 -1262 -1247 ) + 3673 ( 1120 3674 -1263 ) + 3674 ( 1477 -1263 -1247 ) + 3675 ( 6 3676 0 ) + 3676 ( 8 0 3677 ) + 3677 ( 1156 3678 4130 ) + 3678 ( 793 3679 3713 ) + 3679 ( 1522 3680 0 ) + 3680 ( 66 3681 0 ) + 3681 ( 705 3682 0 ) + 3682 ( 468 3683 3708 ) + 3683 ( 841 3684 3693 ) + 3684 ( 1525 3685 0 ) + 3685 ( 1014 3686 3692 ) + 3686 ( 1019 3687 3688 ) + 3687 ( 1526 -1264 0 ) + 3688 ( 1475 3689 0 ) + 3689 ( 1526 3690 0 ) + 3690 ( 1096 -1265 3691 ) + 3691 ( 1529 -1264 -1266 ) + 3692 ( 1526 -1264 0 ) + 3693 ( 794 3694 3701 ) + 3694 ( 802 3695 0 ) + 3695 ( 799 3696 3698 ) + 3696 ( 801 3697 -527 ) + 3697 ( 796 -526 0 ) + 3698 ( 801 3699 0 ) + 3699 ( 796 3700 0 ) + 3700 ( 807 -528 0 ) + 3701 ( 796 3702 0 ) + 3702 ( 802 3703 0 ) + 3703 ( 417 3704 0 ) + 3704 ( 51 3705 3706 ) + 3705 ( 801 -529 -530 ) + 3706 ( 801 3707 0 ) + 3707 ( 807 -531 0 ) + 3708 ( 1475 0 3709 ) + 3709 ( 796 3710 0 ) + 3710 ( 852 3711 0 ) + 3711 ( 802 3712 0 ) + 3712 ( 801 -529 -530 ) + 3713 ( 855 3714 4049 ) + 3714 ( 1531 3715 3936 ) + 3715 ( 852 3716 3782 ) + 3716 ( 417 3717 3757 ) + 3717 ( 66 3718 0 ) + 3718 ( 31 3719 3743 ) + 3719 ( 882 3720 3733 ) + 3720 ( 804 3721 3732 ) + 3721 ( 948 3722 3724 ) + 3722 ( 824 -1267 3723 ) + 3723 ( 809 -1268 -582 ) + 3724 ( 884 3725 3727 ) + 3725 ( 824 -1267 3726 ) + 3726 ( 809 -1268 -582 ) + 3727 ( 824 3728 3730 ) + 3728 ( 817 3729 0 ) + 3729 ( 820 -1269 0 ) + 3730 ( 881 3731 0 ) + 3731 ( 809 -1268 -1270 ) + 3732 ( 802 -530 0 ) + 3733 ( 819 3734 3741 ) + 3734 ( 881 3735 3737 ) + 3735 ( 809 3736 -1271 ) + 3736 ( 804 -1268 0 ) + 3737 ( 991 3738 3739 ) + 3738 ( 824 -1272 -1273 ) + 3739 ( 884 3740 0 ) + 3740 ( 824 -1272 -1273 ) + 3741 ( 829 3742 0 ) + 3742 ( 830 -1274 0 ) + 3743 ( 804 3744 3755 ) + 3744 ( 882 3745 3750 ) + 3745 ( 817 3746 0 ) + 3746 ( 824 3747 3748 ) + 3747 ( 820 -1275 0 ) + 3748 ( 881 3749 0 ) + 3749 ( 809 -1268 -583 ) + 3750 ( 824 3751 3753 ) + 3751 ( 829 3752 0 ) + 3752 ( 830 -1274 0 ) + 3753 ( 881 3754 0 ) + 3754 ( 809 -1268 -583 ) + 3755 ( 802 3756 0 ) + 3756 ( 51 -530 0 ) + 3757 ( 794 3758 3768 ) + 3758 ( 804 3759 3767 ) + 3759 ( 882 3760 3762 ) + 3760 ( 815 -1276 3761 ) + 3761 ( 850 -542 -1277 ) + 3762 ( 850 -542 3763 ) + 3763 ( 815 3764 0 ) + 3764 ( 914 3765 3766 ) + 3765 ( 1533 -1278 0 ) + 3766 ( 881 -1279 0 ) + 3767 ( 802 -527 0 ) + 3768 ( 835 3769 3779 ) + 3769 ( 840 3770 3775 ) + 3770 ( 804 3771 0 ) + 3771 ( 836 3772 3773 ) + 3772 ( 833 -538 0 ) + 3773 ( 824 3774 0 ) + 3774 ( 844 -540 0 ) + 3775 ( 824 3776 0 ) + 3776 ( 848 3777 0 ) + 3777 ( 836 -1280 3778 ) + 3778 ( 844 -540 0 ) + 3779 ( 846 3780 0 ) + 3780 ( 840 -541 3781 ) + 3781 ( 848 -541 0 ) + 3782 ( 417 3783 3885 ) + 3783 ( 1096 3784 3839 ) + 3784 ( 1535 3785 3787 ) + 3785 ( 1475 3786 0 ) + 3786 ( 468 -1281 0 ) + 3787 ( 997 3788 3808 ) + 3788 ( 66 3789 3803 ) + 3789 ( 51 3790 3800 ) + 3790 ( 819 3791 3795 ) + 3791 ( 1536 3792 3794 ) + 3792 ( 1098 -1282 3793 ) + 3793 ( 468 -1283 0 ) + 3794 ( 468 -1284 0 ) + 3795 ( 1098 3796 3798 ) + 3796 ( 1538 3797 -1287 ) + 3797 ( 836 -1285 -1286 ) + 3798 ( 1538 3799 0 ) + 3799 ( 836 -1285 0 ) + 3800 ( 819 -1288 3801 ) + 3801 ( 1538 3802 0 ) + 3802 ( 836 -1285 0 ) + 3803 ( 1536 3804 0 ) + 3804 ( 850 -1289 3805 ) + 3805 ( 1538 3806 0 ) + 3806 ( 836 3807 0 ) + 3807 ( 1540 -1290 0 ) + 3808 ( 1536 3809 3835 ) + 3809 ( 66 3810 3825 ) + 3810 ( 819 3811 3818 ) + 3811 ( 51 3812 3816 ) + 3812 ( 1027 3813 3814 ) + 3813 ( 809 -1291 0 ) + 3814 ( 809 3815 0 ) + 3815 ( 1164 -1292 -1293 ) + 3816 ( 1027 3817 0 ) + 3817 ( 809 -1291 0 ) + 3818 ( 1027 3819 0 ) + 3819 ( 866 3820 0 ) + 3820 ( 973 -1294 3821 ) + 3821 ( 816 -1295 3822 ) + 3822 ( 470 3823 0 ) + 3823 ( 1168 3824 -1298 ) + 3824 ( 829 -1296 -1297 ) + 3825 ( 819 0 3826 ) + 3826 ( 1027 3827 0 ) + 3827 ( 866 3828 0 ) + 3828 ( 973 3829 3831 ) + 3829 ( 1544 -1299 3830 ) + 3830 ( 1546 -1300 0 ) + 3831 ( 816 3832 0 ) + 3832 ( 1549 -1301 3833 ) + 3833 ( 902 3834 0 ) + 3834 ( 1550 -1302 -1303 ) + 3835 ( 66 3836 0 ) + 3836 ( 1027 3837 0 ) + 3837 ( 468 3838 0 ) + 3838 ( 1475 -1304 0 ) + 3839 ( 836 3840 3881 ) + 3840 ( 1552 3841 3852 ) + 3841 ( 1012 3842 0 ) + 3842 ( 1554 3843 3847 ) + 3843 ( 1016 -1305 3844 ) + 3844 ( 858 -1306 3845 ) + 3845 ( 977 3846 -1309 ) + 3846 ( 913 -1307 -1308 ) + 3847 ( 858 3848 0 ) + 3848 ( 1556 -1306 3849 ) + 3849 ( 1558 -1310 3850 ) + 3850 ( 645 3851 -1313 ) + 3851 ( 1561 -1311 -1312 ) + 3852 ( 1556 3853 3874 ) + 3853 ( 1016 3854 3857 ) + 3854 ( 850 -1314 3855 ) + 3855 ( 66 -1315 3856 ) + 3856 ( 1542 -1290 0 ) + 3857 ( 1532 3858 3867 ) + 3858 ( 1018 3859 3863 ) + 3859 ( 977 -1316 3860 ) + 3860 ( 850 3861 3862 ) + 3861 ( 866 -1317 -1318 ) + 3862 ( 1540 -1319 0 ) + 3863 ( 1544 -1320 3864 ) + 3864 ( 470 3865 0 ) + 3865 ( 867 3866 -1323 ) + 3866 ( 1011 -1321 -1322 ) + 3867 ( 1562 3868 3870 ) + 3868 ( 1540 3869 0 ) + 3869 ( 858 -1324 0 ) + 3870 ( 470 3871 0 ) + 3871 ( 858 3872 0 ) + 3872 ( 1011 -1321 3873 ) + 3873 ( 1018 -1325 -1322 ) + 3874 ( 1558 3875 0 ) + 3875 ( 659 3876 3880 ) + 3876 ( 1306 3877 0 ) + 3877 ( 1544 -1326 3878 ) + 3878 ( 470 3879 0 ) + 3879 ( 867 -1327 -1328 ) + 3880 ( 1012 -1310 0 ) + 3881 ( 468 3882 0 ) + 3882 ( 1538 0 3883 ) + 3883 ( 819 3884 0 ) + 3884 ( 1529 -1264 -1266 ) + 3885 ( 1536 3886 3929 ) + 3886 ( 836 3887 3909 ) + 3887 ( 1027 3888 3903 ) + 3888 ( 34 3889 3896 ) + 3889 ( 997 3890 3895 ) + 3890 ( 1306 3891 3894 ) + 3891 ( 1012 -1329 3892 ) + 3892 ( 1155 -1330 3893 ) + 3893 ( 913 -1331 -1332 ) + 3894 ( 860 -1333 0 ) + 3895 ( 866 -1334 0 ) + 3896 ( 997 3897 3902 ) + 3897 ( 1012 3898 0 ) + 3898 ( 1554 -1335 3899 ) + 3899 ( 858 -1336 3900 ) + 3900 ( 913 3901 -1339 ) + 3901 ( 1557 -1337 -1338 ) + 3902 ( 866 -1334 0 ) + 3903 ( 794 3904 0 ) + 3904 ( 866 3905 0 ) + 3905 ( 174 3906 0 ) + 3906 ( 829 3907 0 ) + 3907 ( 1164 -1340 3908 ) + 3908 ( 920 -1341 -1342 ) + 3909 ( 1027 3910 3924 ) + 3910 ( 997 3911 3920 ) + 3911 ( 1098 3912 3916 ) + 3912 ( 794 3913 3914 ) + 3913 ( 819 -1343 0 ) + 3914 ( 819 3915 0 ) + 3915 ( 879 -1344 -1345 ) + 3916 ( 819 3917 0 ) + 3917 ( 1525 3918 0 ) + 3918 ( 1096 -1346 3919 ) + 3919 ( 1529 -1264 -1266 ) + 3920 ( 819 3921 0 ) + 3921 ( 809 3922 0 ) + 3922 ( 794 -1347 3923 ) + 3923 ( 879 -1291 -1348 ) + 3924 ( 879 0 3925 ) + 3925 ( 809 3926 0 ) + 3926 ( 794 3927 0 ) + 3927 ( 1164 -1349 3928 ) + 3928 ( 920 -1350 -1351 ) + 3929 ( 1027 3930 0 ) + 3930 ( 1098 3931 3933 ) + 3931 ( 1475 3932 0 ) + 3932 ( 1525 -1352 0 ) + 3933 ( 1525 3934 0 ) + 3934 ( 1096 -1346 3935 ) + 3935 ( 1529 -1264 -1266 ) + 3936 ( 1098 3937 4028 ) + 3937 ( 809 3938 3958 ) + 3938 ( 705 3939 3947 ) + 3939 ( 852 3940 3943 ) + 3940 ( 804 -1353 3941 ) + 3941 ( 802 3942 0 ) + 3942 ( 799 -527 0 ) + 3943 ( 1536 3944 0 ) + 3944 ( 1027 -1354 3945 ) + 3945 ( 799 3946 0 ) + 3946 ( 1164 -1349 -1355 ) + 3947 ( 840 3948 3953 ) + 3948 ( 804 3949 0 ) + 3949 ( 252 0 3950 ) + 3950 ( 719 3951 0 ) + 3951 ( 926 -661 3952 ) + 3952 ( 928 -662 0 ) + 3953 ( 1027 0 3954 ) + 3954 ( 252 0 3955 ) + 3955 ( 932 3956 0 ) + 3956 ( 926 -1356 3957 ) + 3957 ( 928 -662 0 ) + 3958 ( 852 3959 3987 ) + 3959 ( 705 3960 3968 ) + 3960 ( 882 3961 3963 ) + 3961 ( 815 -1357 3962 ) + 3962 ( 850 -542 -1277 ) + 3963 ( 850 -542 3964 ) + 3964 ( 815 3965 0 ) + 3965 ( 914 3966 3967 ) + 3966 ( 1533 -1278 0 ) + 3967 ( 881 -1358 0 ) + 3968 ( 817 3969 3979 ) + 3969 ( 252 3970 3972 ) + 3970 ( 601 3971 0 ) + 3971 ( 870 -1359 0 ) + 3972 ( 840 3973 3976 ) + 3973 ( 719 3974 0 ) + 3974 ( 815 -661 3975 ) + 3975 ( 850 -663 -1360 ) + 3976 ( 932 3977 0 ) + 3977 ( 815 -1356 3978 ) + 3978 ( 850 -1361 -1362 ) + 3979 ( 840 3980 3983 ) + 3980 ( 934 -667 3981 ) + 3981 ( 252 3982 0 ) + 3982 ( 601 -1359 0 ) + 3983 ( 932 3984 3985 ) + 3984 ( 934 -667 0 ) + 3985 ( 252 3986 0 ) + 3986 ( 601 -1359 0 ) + 3987 ( 705 3988 3998 ) + 3988 ( 1027 3989 3993 ) + 3989 ( 997 3990 3991 ) + 3990 ( 836 -1363 0 ) + 3991 ( 836 3992 0 ) + 3992 ( 866 -1334 0 ) + 3993 ( 850 3994 0 ) + 3994 ( 866 3995 0 ) + 3995 ( 799 3996 0 ) + 3996 ( 829 3997 0 ) + 3997 ( 1164 -1340 -1364 ) + 3998 ( 870 3999 0 ) + 3999 ( 1047 4000 4011 ) + 4000 ( 908 4001 4004 ) + 4001 ( 601 4002 0 ) + 4002 ( 836 -1365 4003 ) + 4003 ( 831 -1366 -1367 ) + 4004 ( 997 4005 4006 ) + 4005 ( 836 -1363 0 ) + 4006 ( 866 -1368 4007 ) + 4007 ( 1564 4008 4009 ) + 4008 ( 836 -1369 0 ) + 4009 ( 836 4010 0 ) + 4010 ( 1566 -1370 0 ) + 4011 ( 821 4012 4018 ) + 4012 ( 908 4013 0 ) + 4013 ( 252 4014 4017 ) + 4014 ( 601 4015 0 ) + 4015 ( 1026 4016 -1373 ) + 4016 ( 920 -1371 -1372 ) + 4017 ( 1027 -1373 0 ) + 4018 ( 252 4019 4024 ) + 4019 ( 601 4020 0 ) + 4020 ( 1568 4021 4023 ) + 4021 ( 1026 4022 -1376 ) + 4022 ( 920 -1374 -1375 ) + 4023 ( 1116 -1377 0 ) + 4024 ( 1027 4025 0 ) + 4025 ( 866 -1378 4026 ) + 4026 ( 1566 4027 0 ) + 4027 ( 1568 -1379 0 ) + 4028 ( 1306 4029 4035 ) + 4029 ( 870 4030 0 ) + 4030 ( 908 4031 4034 ) + 4031 ( 601 4032 0 ) + 4032 ( 836 -1365 4033 ) + 4033 ( 831 -1366 -1367 ) + 4034 ( 836 -1363 0 ) + 4035 ( 836 4036 4043 ) + 4036 ( 860 4037 4038 ) + 4037 ( 601 -1333 0 ) + 4038 ( 601 4039 0 ) + 4039 ( 252 -1380 4040 ) + 4040 ( 1504 4041 0 ) + 4041 ( 863 4042 -1383 ) + 4042 ( 1015 -1381 -1382 ) + 4043 ( 601 4044 0 ) + 4044 ( 908 4045 0 ) + 4045 ( 830 4046 0 ) + 4046 ( 252 -1380 4047 ) + 4047 ( 1504 4048 0 ) + 4048 ( 1015 -1381 -1382 ) + 4049 ( 852 4050 4085 ) + 4050 ( 705 4051 4067 ) + 4051 ( 770 -1384 4052 ) + 4052 ( 794 4053 4058 ) + 4053 ( 888 4054 0 ) + 4054 ( 799 4055 0 ) + 4055 ( 174 4056 0 ) + 4056 ( 887 -591 4057 ) + 4057 ( 891 -592 -593 ) + 4058 ( 66 4059 0 ) + 4059 ( 888 4060 0 ) + 4060 ( 679 4061 0 ) + 4061 ( 470 4062 0 ) + 4062 ( 31 4063 4065 ) + 4063 ( 887 -586 4064 ) + 4064 ( 891 -587 -588 ) + 4065 ( 887 0 4066 ) + 4066 ( 890 -590 0 ) + 4067 ( 840 4068 4075 ) + 4068 ( 252 4069 4071 ) + 4069 ( 601 4070 0 ) + 4070 ( 916 -642 -1359 ) + 4071 ( 770 -648 4072 ) + 4072 ( 887 0 4073 ) + 4073 ( 918 4074 0 ) + 4074 ( 891 -649 -650 ) + 4075 ( 890 4076 4079 ) + 4076 ( 601 4077 0 ) + 4077 ( 770 -1385 4078 ) + 4078 ( 918 -1386 0 ) + 4079 ( 932 0 4080 ) + 4080 ( 252 4081 4083 ) + 4081 ( 601 4082 0 ) + 4082 ( 916 -1387 -1359 ) + 4083 ( 887 0 4084 ) + 4084 ( 918 -649 0 ) + 4085 ( 794 4086 4102 ) + 4086 ( 705 4087 4089 ) + 4087 ( 1027 -1388 4088 ) + 4088 ( 770 -1389 0 ) + 4089 ( 890 4090 4094 ) + 4090 ( 601 4091 0 ) + 4091 ( 770 -1385 4092 ) + 4092 ( 1027 -1390 4093 ) + 4093 ( 918 -1386 0 ) + 4094 ( 252 4095 4099 ) + 4095 ( 601 4096 0 ) + 4096 ( 1026 4097 -1390 ) + 4097 ( 916 -1387 4098 ) + 4098 ( 920 -1374 -1375 ) + 4099 ( 1027 -1390 4100 ) + 4100 ( 918 4101 0 ) + 4101 ( 920 -649 -1391 ) + 4102 ( 916 4103 4122 ) + 4103 ( 890 4104 4116 ) + 4104 ( 659 4105 4108 ) + 4105 ( 1027 4106 4107 ) + 4106 ( 1306 -1392 0 ) + 4107 ( 770 -1393 0 ) + 4108 ( 770 4109 4112 ) + 4109 ( 1012 -1394 4110 ) + 4110 ( 34 4111 0 ) + 4111 ( 1155 -1395 -1396 ) + 4112 ( 1027 4113 0 ) + 4113 ( 1012 -1397 4114 ) + 4114 ( 34 4115 0 ) + 4115 ( 1155 -1395 -1396 ) + 4116 ( 1027 4117 0 ) + 4117 ( 659 4118 4119 ) + 4118 ( 1306 -1392 0 ) + 4119 ( 1012 -1397 4120 ) + 4120 ( 34 4121 0 ) + 4121 ( 1155 -1395 -1396 ) + 4122 ( 1027 4123 0 ) + 4123 ( 659 4124 4127 ) + 4124 ( 1306 4125 0 ) + 4125 ( 1549 -1398 4126 ) + 4126 ( 902 -1399 0 ) + 4127 ( 1012 -1397 4128 ) + 4128 ( 34 4129 0 ) + 4129 ( 1155 -1395 -1396 ) + 4130 ( 1501 4131 4277 ) + 4131 ( 1065 4132 4177 ) + 4132 ( 345 4133 4145 ) + 4133 ( 1060 4134 4139 ) + 4134 ( 808 4135 0 ) + 4135 ( 34 4136 0 ) + 4136 ( 771 4137 0 ) + 4137 ( 851 0 4138 ) + 4138 ( 860 -1400 0 ) + 4139 ( 1070 4140 0 ) + 4140 ( 34 4141 0 ) + 4141 ( 776 0 4142 ) + 4142 ( 851 0 4143 ) + 4143 ( 860 4144 0 ) + 4144 ( 917 -1401 0 ) + 4145 ( 601 4146 0 ) + 4146 ( 16 4147 4173 ) + 4147 ( 1070 4148 4164 ) + 4148 ( 770 4149 4156 ) + 4149 ( 798 4150 4153 ) + 4150 ( 1060 -1402 4151 ) + 4151 ( 776 -1403 4152 ) + 4152 ( 710 -1404 0 ) + 4153 ( 1446 4154 0 ) + 4154 ( 1060 -1402 4155 ) + 4155 ( 776 -1161 0 ) + 4156 ( 830 4157 0 ) + 4157 ( 860 4158 4161 ) + 4158 ( 968 4159 0 ) + 4159 ( 908 4160 0 ) + 4160 ( 891 -1405 -1406 ) + 4161 ( 968 4162 0 ) + 4162 ( 252 4163 0 ) + 4163 ( 863 -1407 -1408 ) + 4164 ( 860 4165 0 ) + 4165 ( 770 4166 4170 ) + 4166 ( 798 4167 0 ) + 4167 ( 776 -1409 4168 ) + 4168 ( 710 4169 0 ) + 4169 ( 899 -1410 -1411 ) + 4170 ( 968 4171 0 ) + 4171 ( 908 4172 0 ) + 4172 ( 891 -1405 -1406 ) + 4173 ( 908 4174 0 ) + 4174 ( 1518 4175 0 ) + 4175 ( 770 4176 0 ) + 4176 ( 1521 -1253 -1254 ) + 4177 ( 1062 4178 4230 ) + 4178 ( 830 4179 4205 ) + 4179 ( 34 4180 4198 ) + 4180 ( 968 4181 4191 ) + 4181 ( 860 4182 4188 ) + 4182 ( 601 4183 0 ) + 4183 ( 770 -1412 4184 ) + 4184 ( 1418 4185 4186 ) + 4185 ( 891 -1413 -1414 ) + 4186 ( 1498 4187 0 ) + 4187 ( 891 -1413 -1414 ) + 4188 ( 601 4189 0 ) + 4189 ( 252 4190 0 ) + 4190 ( 863 -1407 -1408 ) + 4191 ( 860 4192 4194 ) + 4192 ( 345 -1415 4193 ) + 4193 ( 770 -1412 0 ) + 4194 ( 1575 4195 4197 ) + 4195 ( 345 4196 0 ) + 4196 ( 910 -1416 -1417 ) + 4197 ( 345 -1418 0 ) + 4198 ( 911 4199 0 ) + 4199 ( 859 4200 4204 ) + 4200 ( 857 4201 4202 ) + 4201 ( 678 -1419 0 ) + 4202 ( 678 4203 0 ) + 4203 ( 416 -1420 0 ) + 4204 ( 1578 -1421 0 ) + 4205 ( 1580 4206 4223 ) + 4206 ( 809 4207 4212 ) + 4207 ( 1582 4208 0 ) + 4208 ( 1584 0 4209 ) + 4209 ( 1586 4210 4211 ) + 4210 ( 345 -1422 0 ) + 4211 ( 345 -1423 0 ) + 4212 ( 871 4213 4216 ) + 4213 ( 601 4214 0 ) + 4214 ( 345 4215 0 ) + 4215 ( 30 -1424 0 ) + 4216 ( 601 4217 0 ) + 4217 ( 915 4218 4220 ) + 4218 ( 345 4219 0 ) + 4219 ( 1588 -1425 0 ) + 4220 ( 1588 4221 0 ) + 4221 ( 345 4222 0 ) + 4222 ( 50 -1426 0 ) + 4223 ( 1591 4224 4227 ) + 4224 ( 1592 4225 0 ) + 4225 ( 1525 4226 0 ) + 4226 ( 1526 -1427 0 ) + 4227 ( 1592 4228 0 ) + 4228 ( 1525 4229 0 ) + 4229 ( 1552 -1428 0 ) + 4230 ( 1591 4231 4235 ) + 4231 ( 1066 4232 0 ) + 4232 ( 1592 4233 0 ) + 4233 ( 1525 4234 0 ) + 4234 ( 1526 -1427 0 ) + 4235 ( 345 4236 4260 ) + 4236 ( 851 4237 4254 ) + 4237 ( 808 4238 4246 ) + 4238 ( 1066 4239 4242 ) + 4239 ( 34 4240 4241 ) + 4240 ( 1594 -1429 -1430 ) + 4241 ( 1598 -1431 0 ) + 4242 ( 1596 4243 0 ) + 4243 ( 34 4244 4245 ) + 4244 ( 1594 -1429 -1430 ) + 4245 ( 1598 -1432 0 ) + 4246 ( 1601 0 4247 ) + 4247 ( 1586 4248 4250 ) + 4248 ( 1598 4249 0 ) + 4249 ( 1066 -1433 0 ) + 4250 ( 1598 4251 0 ) + 4251 ( 1066 4252 0 ) + 4252 ( 1580 -1434 4253 ) + 4253 ( 1525 -1435 0 ) + 4254 ( 34 4255 0 ) + 4255 ( 860 4256 4258 ) + 4256 ( 1066 -1415 4257 ) + 4257 ( 771 -1400 0 ) + 4258 ( 1066 4259 0 ) + 4259 ( 1575 -1436 -1418 ) + 4260 ( 1580 4261 0 ) + 4261 ( 830 4262 0 ) + 4262 ( 968 4263 4272 ) + 4263 ( 860 4264 4269 ) + 4264 ( 601 4265 0 ) + 4265 ( 908 -1437 4266 ) + 4266 ( 770 -1438 4267 ) + 4267 ( 1498 4268 0 ) + 4268 ( 891 -1439 -1440 ) + 4269 ( 601 4270 0 ) + 4270 ( 252 4271 0 ) + 4271 ( 863 -1407 -1408 ) + 4272 ( 860 4273 0 ) + 4273 ( 770 4274 0 ) + 4274 ( 1066 -1441 4275 ) + 4275 ( 1446 4276 0 ) + 4276 ( 1449 -1442 -1443 ) + 4277 ( 1580 4278 4351 ) + 4278 ( 1476 4279 4299 ) + 4279 ( 984 4280 4292 ) + 4280 ( 34 4281 4290 ) + 4281 ( 860 4282 4283 ) + 4282 ( 601 -1444 0 ) + 4283 ( 830 4284 4287 ) + 4284 ( 601 4285 0 ) + 4285 ( 252 4286 0 ) + 4286 ( 863 -1407 -1408 ) + 4287 ( 819 4288 0 ) + 4288 ( 601 4289 0 ) + 4289 ( 1525 -1445 0 ) + 4290 ( 819 4291 0 ) + 4291 ( 468 -1445 0 ) + 4292 ( 34 4293 0 ) + 4293 ( 830 4294 0 ) + 4294 ( 860 4295 4296 ) + 4295 ( 601 -1444 0 ) + 4296 ( 601 4297 0 ) + 4297 ( 252 4298 0 ) + 4298 ( 863 -1407 -1408 ) + 4299 ( 345 4300 4333 ) + 4300 ( 1120 4301 4304 ) + 4301 ( 851 0 4302 ) + 4302 ( 34 4303 0 ) + 4303 ( 860 -1415 0 ) + 4304 ( 1578 4305 4327 ) + 4305 ( 808 4306 4325 ) + 4306 ( 1602 4307 4322 ) + 4307 ( 34 4308 4315 ) + 4308 ( 860 -1415 4309 ) + 4309 ( 1577 4310 4312 ) + 4310 ( 1575 4311 -1418 ) + 4311 ( 910 -1416 -1446 ) + 4312 ( 1575 4313 0 ) + 4313 ( 851 4314 0 ) + 4314 ( 1594 -1447 -1446 ) + 4315 ( 1577 4316 4319 ) + 4316 ( 911 4317 0 ) + 4317 ( 1598 4318 0 ) + 4318 ( 1604 -1448 -1449 ) + 4319 ( 860 0 4320 ) + 4320 ( 851 4321 0 ) + 4321 ( 1598 -1450 0 ) + 4322 ( 34 4323 0 ) + 4323 ( 851 0 4324 ) + 4324 ( 860 -1415 0 ) + 4325 ( 1577 4326 0 ) + 4326 ( 1586 -1451 -1452 ) + 4327 ( 851 4328 0 ) + 4328 ( 1577 4329 0 ) + 4329 ( 859 4330 0 ) + 4330 ( 1601 0 4331 ) + 4331 ( 1598 4332 0 ) + 4332 ( 1586 -1453 -1452 ) + 4333 ( 830 4334 0 ) + 4334 ( 601 4335 0 ) + 4335 ( 1120 4336 4339 ) + 4336 ( 860 -1454 4337 ) + 4337 ( 252 4338 0 ) + 4338 ( 863 -1407 -1408 ) + 4339 ( 860 4340 4348 ) + 4340 ( 770 -1412 4341 ) + 4341 ( 968 4342 4347 ) + 4342 ( 1572 -1455 4343 ) + 4343 ( 891 4344 -1414 ) + 4344 ( 1570 4345 4346 ) + 4345 ( 1159 -1413 -1456 ) + 4346 ( 855 -1456 -1457 ) + 4347 ( 1572 -1455 0 ) + 4348 ( 968 4349 0 ) + 4349 ( 252 4350 0 ) + 4350 ( 863 -1407 -1408 ) + 4351 ( 1606 4352 4402 ) + 4352 ( 1591 4353 4390 ) + 4353 ( 1609 4354 4376 ) + 4354 ( 984 4355 4364 ) + 4355 ( 1426 4356 4361 ) + 4356 ( 458 4357 4359 ) + 4357 ( 1525 4358 0 ) + 4358 ( 470 -1458 0 ) + 4359 ( 1525 4360 0 ) + 4360 ( 460 -1459 0 ) + 4361 ( 1525 4362 0 ) + 4362 ( 658 4363 0 ) + 4363 ( 1610 -1460 -1461 ) + 4364 ( 1120 4365 4372 ) + 4365 ( 788 4366 0 ) + 4366 ( 1049 4367 4371 ) + 4367 ( 990 4368 0 ) + 4368 ( 1612 4369 4370 ) + 4369 ( 1525 -1462 0 ) + 4370 ( 1525 -1463 0 ) + 4371 ( 1525 -1464 0 ) + 4372 ( 1592 4373 0 ) + 4373 ( 1577 4374 4375 ) + 4374 ( 1525 -1427 0 ) + 4375 ( 1525 -1465 0 ) + 4376 ( 1592 4377 4385 ) + 4377 ( 1612 4378 4381 ) + 4378 ( 1525 4379 0 ) + 4379 ( 1610 -1466 4380 ) + 4380 ( 1049 -1467 -1468 ) + 4381 ( 1577 4382 4383 ) + 4382 ( 1525 -1427 0 ) + 4383 ( 1525 4384 0 ) + 4384 ( 1120 -1469 -1465 ) + 4385 ( 1120 4386 0 ) + 4386 ( 1614 4387 0 ) + 4387 ( 1612 4388 -1469 ) + 4388 ( 1610 -1466 4389 ) + 4389 ( 1049 -1467 -1468 ) + 4390 ( 1577 4391 4394 ) + 4391 ( 1592 4392 0 ) + 4392 ( 1525 4393 0 ) + 4393 ( 1598 -1470 0 ) + 4394 ( 468 4395 0 ) + 4395 ( 1049 0 4396 ) + 4396 ( 984 4397 0 ) + 4397 ( 1614 4398 0 ) + 4398 ( 1525 4399 0 ) + 4399 ( 1610 4400 4401 ) + 4400 ( 1617 -1466 -1471 ) + 4401 ( 1617 -1472 -1473 ) + 4402 ( 1526 4403 0 ) + 4403 ( 1577 4404 4406 ) + 4404 ( 1525 4405 0 ) + 4405 ( 1592 -1427 0 ) + 4406 ( 1592 4407 4413 ) + 4407 ( 1612 4408 4411 ) + 4408 ( 1525 4409 0 ) + 4409 ( 1610 -1474 4410 ) + 4410 ( 1049 -1475 -1476 ) + 4411 ( 1525 4412 0 ) + 4412 ( 1120 -1477 -1465 ) + 4413 ( 1614 4414 0 ) + 4414 ( 1612 4415 -1477 ) + 4415 ( 1610 -1474 4416 ) + 4416 ( 1049 -1475 -1476 ) +} +portals 67 { + 0 ( 0 0 0 0 0 ) + 1 ( 27 2 17 5 10 ) + 2 ( 65 1 33 320 1 ) + 3 ( 130 4 6 6 2 ) + 4 ( 131 3 4 4 5 ) + 5 ( 152 4 5 4 4 ) + 6 ( 156 7 8 4 2 ) + 7 ( 160 3 7 5 3 ) + 8 ( 162 7 9 2 2 ) + 9 ( 165 6 10 3 9 ) + 10 ( 177 10 12 8 11 ) + 11 ( 183 1 12 322 9 ) + 12 ( 185 13 45 5 5 ) + 13 ( 187 13 45 3 6 ) + 14 ( 191 1 14 318 5 ) + 15 ( 192 13 14 4 4 ) + 16 ( 222 10 15 7 1 ) + 17 ( 233 9 16 3 1 ) + 18 ( 326 1 17 321 8 ) + 19 ( 329 8 17 1 9 ) + 20 ( 404 18 19 391 20 ) + 21 ( 441 11 18 11 392 ) + 22 ( 443 11 20 12 1 ) + 23 ( 462 21 22 3 6 ) + 24 ( 464 20 21 2 2 ) + 25 ( 476 22 23 4 1 ) + 26 ( 480 5 22 3 5 ) + 27 ( 508 23 24 2 7 ) + 28 ( 520 19 24 21 6 ) + 29 ( 527 25 28 1 11 ) + 30 ( 530 26 27 1 16 ) + 31 ( 543 28 29 12 8 ) + 32 ( 544 28 29 8 7 ) + 33 ( 565 18 29 388 12 ) + 34 ( 573 18 30 387 1 ) + 35 ( 577 28 31 9 1 ) + 36 ( 588 18 27 390 17 ) + 37 ( 593 18 29 389 11 ) + 38 ( 669 19 32 22 1 ) + 39 ( 701 33 36 2 13 ) + 40 ( 723 34 36 3 11 ) + 41 ( 726 35 36 2 12 ) + 42 ( 796 41 42 1 4 ) + 43 ( 799 12 41 10 2 ) + 44 ( 814 43 47 1 8 ) + 45 ( 845 45 46 4 5 ) + 46 ( 914 1 47 319 6 ) + 47 ( 927 34 47 4 7 ) + 48 ( 1015 18 46 396 4 ) + 49 ( 1061 18 48 385 1 ) + 50 ( 1062 48 49 2 3 ) + 51 ( 1094 18 49 384 2 ) + 52 ( 1095 11 18 13 383 ) + 53 ( 1122 18 42 395 5 ) + 54 ( 1266 50 51 14 7 ) + 55 ( 1277 28 29 10 9 ) + 56 ( 1287 18 51 394 8 ) + 57 ( 1293 27 51 18 9 ) + 58 ( 1342 18 29 393 10 ) + 59 ( 1418 18 52 386 18 ) + 60 ( 1428 52 53 21 3 ) + 61 ( 1434 52 53 19 5 ) + 62 ( 1452 52 53 20 4 ) + 63 ( 1464 50 54 13 9 ) + 64 ( 1465 53 54 6 7 ) + 65 ( 1468 50 54 11 8 ) + 66 ( 1476 50 54 12 6 ) +} +portalIndex 132 { + 0 ( 14 ) + 1 ( 46 ) + 2 ( 2 ) + 3 ( 18 ) + 4 ( 11 ) + 5 ( 1 ) + 6 ( 4 ) + 7 ( 7 ) + 8 ( 5 ) + 9 ( 4 ) + 10 ( 3 ) + 11 ( 26 ) + 12 ( 5 ) + 13 ( 3 ) + 14 ( 9 ) + 15 ( 8 ) + 16 ( 7 ) + 17 ( 6 ) + 18 ( 19 ) + 19 ( 6 ) + 20 ( 8 ) + 21 ( 17 ) + 22 ( 16 ) + 23 ( 10 ) + 24 ( 9 ) + 25 ( 21 ) + 26 ( 22 ) + 27 ( 52 ) + 28 ( 11 ) + 29 ( 43 ) + 30 ( 10 ) + 31 ( 13 ) + 32 ( 15 ) + 33 ( 12 ) + 34 ( 15 ) + 35 ( 14 ) + 36 ( 16 ) + 37 ( 17 ) + 38 ( 18 ) + 39 ( 19 ) + 40 ( 1 ) + 41 ( 52 ) + 42 ( 51 ) + 43 ( 49 ) + 44 ( 59 ) + 45 ( 34 ) + 46 ( 33 ) + 47 ( 37 ) + 48 ( 36 ) + 49 ( 20 ) + 50 ( 21 ) + 51 ( 58 ) + 52 ( 56 ) + 53 ( 53 ) + 54 ( 48 ) + 55 ( 20 ) + 56 ( 28 ) + 57 ( 38 ) + 58 ( 22 ) + 59 ( 24 ) + 60 ( 24 ) + 61 ( 23 ) + 62 ( 25 ) + 63 ( 26 ) + 64 ( 23 ) + 65 ( 25 ) + 66 ( 27 ) + 67 ( 28 ) + 68 ( 27 ) + 69 ( 29 ) + 70 ( 30 ) + 71 ( 30 ) + 72 ( 36 ) + 73 ( 57 ) + 74 ( 32 ) + 75 ( 35 ) + 76 ( 55 ) + 77 ( 29 ) + 78 ( 31 ) + 79 ( 32 ) + 80 ( 31 ) + 81 ( 55 ) + 82 ( 58 ) + 83 ( 37 ) + 84 ( 33 ) + 85 ( 34 ) + 86 ( 35 ) + 87 ( 38 ) + 88 ( 2 ) + 89 ( 39 ) + 90 ( 40 ) + 91 ( 47 ) + 92 ( 41 ) + 93 ( 40 ) + 94 ( 41 ) + 95 ( 39 ) + 96 ( 42 ) + 97 ( 43 ) + 98 ( 42 ) + 99 ( 53 ) + 100 ( 44 ) + 101 ( 45 ) + 102 ( 12 ) + 103 ( 13 ) + 104 ( 48 ) + 105 ( 45 ) + 106 ( 46 ) + 107 ( 47 ) + 108 ( 44 ) + 109 ( 49 ) + 110 ( 50 ) + 111 ( 51 ) + 112 ( 50 ) + 113 ( 65 ) + 114 ( 66 ) + 115 ( 63 ) + 116 ( 54 ) + 117 ( 54 ) + 118 ( 56 ) + 119 ( 57 ) + 120 ( 59 ) + 121 ( 61 ) + 122 ( 62 ) + 123 ( 60 ) + 124 ( 60 ) + 125 ( 62 ) + 126 ( 61 ) + 127 ( 64 ) + 128 ( 66 ) + 129 ( 64 ) + 130 ( 65 ) + 131 ( 63 ) +} +clusters 55 { + 0 ( 0 0 0 0 ) + 1 ( 323 323 0 5 ) + 2 ( 6 6 5 1 ) + 3 ( 6 6 6 2 ) + 4 ( 7 7 8 3 ) + 5 ( 5 5 11 2 ) + 6 ( 4 4 13 2 ) + 7 ( 5 5 15 3 ) + 8 ( 3 3 18 2 ) + 9 ( 4 4 20 2 ) + 10 ( 10 10 22 3 ) + 11 ( 14 14 25 3 ) + 12 ( 12 12 28 3 ) + 13 ( 6 6 31 3 ) + 14 ( 6 6 34 2 ) + 15 ( 2 2 36 1 ) + 16 ( 2 2 37 1 ) + 17 ( 11 11 38 3 ) + 18 ( 397 397 41 14 ) + 19 ( 23 23 55 3 ) + 20 ( 3 3 58 2 ) + 21 ( 4 4 60 2 ) + 22 ( 7 7 62 3 ) + 23 ( 3 3 65 2 ) + 24 ( 8 8 67 2 ) + 25 ( 2 2 69 1 ) + 26 ( 2 2 70 1 ) + 27 ( 19 19 71 3 ) + 28 ( 13 13 74 5 ) + 29 ( 13 13 79 6 ) + 30 ( 2 2 85 1 ) + 31 ( 2 2 86 1 ) + 32 ( 2 2 87 1 ) + 33 ( 3 3 88 2 ) + 34 ( 5 5 90 2 ) + 35 ( 3 3 92 1 ) + 36 ( 14 14 93 3 ) + 37 ( 5 5 96 0 ) + 38 ( 5 5 96 0 ) + 39 ( 4 4 96 0 ) + 40 ( 5 5 96 0 ) + 41 ( 3 3 96 2 ) + 42 ( 6 6 98 2 ) + 43 ( 2 2 100 1 ) + 44 ( 1 1 101 0 ) + 45 ( 7 7 101 3 ) + 46 ( 6 6 104 2 ) + 47 ( 9 9 106 3 ) + 48 ( 3 3 109 2 ) + 49 ( 4 4 111 2 ) + 50 ( 15 15 113 4 ) + 51 ( 10 10 117 3 ) + 52 ( 22 22 120 4 ) + 53 ( 7 7 124 4 ) + 54 ( 10 10 128 4 ) +} diff --git a/q4base/maps/mp/q4dm1.aas48 b/q4base/maps/mp/q4dm1.aas48 new file mode 100644 index 00000000..bf51ea7f --- /dev/null +++ b/q4base/maps/mp/q4dm1.aas48 @@ -0,0 +1,51 @@ +DewmAAS "1.08" + +1013305419 + +settings +{ + bboxes + { + (-24 -24 0)-(24 24 88) + } + usePatches = 0 + writeBrushMap = 0 + playerFlood = 0 + allowSwimReachabilities = 0 + allowFlyReachabilities = 1 + generateAllFaces = 0 + generateTacticalFeatures = 0 + fileExtension = "aas48" + gravity = (0 0 -1050) + maxStepHeight = 16 + maxBarrierHeight = 0 + maxWaterJumpHeight = 0 + maxFallHeight = 0 + minFloorCos = 0.6999999881 + tt_barrierJump = 100 + tt_startCrouching = 100 + tt_waterJump = 100 + tt_startWalkOffLedge = 100 +} +planes 0 { +} +vertices 0 { +} +edges 0 { +} +edgeIndex 0 { +} +faces 0 { +} +faceIndex 0 { +} +areas 0 { +} +nodes 0 { +} +portals 0 { +} +portalIndex 0 { +} +clusters 0 { +} diff --git a/q4base/maps/mp/q4dm1.aas96 b/q4base/maps/mp/q4dm1.aas96 new file mode 100644 index 00000000..12d5c096 --- /dev/null +++ b/q4base/maps/mp/q4dm1.aas96 @@ -0,0 +1,51 @@ +DewmAAS "1.08" + +1013305419 + +settings +{ + bboxes + { + (-47 -47 0)-(47 47 96) + } + usePatches = 0 + writeBrushMap = 0 + playerFlood = 0 + allowSwimReachabilities = 0 + allowFlyReachabilities = 0 + generateAllFaces = 0 + generateTacticalFeatures = 0 + fileExtension = "aas96" + gravity = (0 0 -1050) + maxStepHeight = 16 + maxBarrierHeight = 0 + maxWaterJumpHeight = 0 + maxFallHeight = 0 + minFloorCos = 0.6999999881 + tt_barrierJump = 100 + tt_startCrouching = 100 + tt_waterJump = 100 + tt_startWalkOffLedge = 100 +} +planes 0 { +} +vertices 0 { +} +edges 0 { +} +edgeIndex 0 { +} +faces 0 { +} +faceIndex 0 { +} +areas 0 { +} +nodes 0 { +} +portals 0 { +} +portalIndex 0 { +} +clusters 0 { +} From f638fc95d0ec203a03d4948db135a44ce5545b88 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Mon, 26 Jul 2021 12:05:28 -0700 Subject: [PATCH 23/38] Fixed bot AAS not being loaded in multiplayer. --- src/game/Game_local.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/game/Game_local.h b/src/game/Game_local.h index 78a3ee3d..b6f3c08b 100644 --- a/src/game/Game_local.h +++ b/src/game/Game_local.h @@ -520,7 +520,10 @@ class idGameLocal : public idGame { idAAS* GetBotAAS(void) { - return bot_aas; + if (NumAAS() == 0) + return nullptr; + + return GetAAS(0); } void RegisterBot(rvmBot* bot) From b8537a05c2d50d8565e8c9a66101e65d2a44a7d5 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Mon, 26 Jul 2021 13:09:48 -0700 Subject: [PATCH 24/38] Addbot no longer crashes. --- q4base/def/ammo.def | 562 ++++++++++++++++++++++ q4base/def/items.def | 629 +++++++++++++++++++++++++ q4base/def/powerups.def | 330 +++++++++++++ q4base/def/weapons/blaster.def | 339 +++++++++++++ q4base/def/weapons/dmg.def | 432 +++++++++++++++++ q4base/def/weapons/gauntlet.def | 213 +++++++++ q4base/def/weapons/grenadelauncher.def | 340 +++++++++++++ q4base/def/weapons/hyperblaster.def | 358 ++++++++++++++ q4base/def/weapons/lightninggun.def | 324 +++++++++++++ q4base/def/weapons/machinegun.def | 481 +++++++++++++++++++ q4base/def/weapons/nailgun.def | 526 +++++++++++++++++++++ q4base/def/weapons/napalmgun.def | 399 ++++++++++++++++ q4base/def/weapons/railgun.def | 460 ++++++++++++++++++ q4base/def/weapons/rocketlauncher.def | 439 +++++++++++++++++ q4base/def/weapons/shotgun.def | 378 +++++++++++++++ src/game/Game_local.cpp | 8 + src/game/bots/Bot.cpp | 36 +- 17 files changed, 6236 insertions(+), 18 deletions(-) create mode 100644 q4base/def/ammo.def create mode 100644 q4base/def/items.def create mode 100644 q4base/def/powerups.def create mode 100644 q4base/def/weapons/blaster.def create mode 100644 q4base/def/weapons/dmg.def create mode 100644 q4base/def/weapons/gauntlet.def create mode 100644 q4base/def/weapons/grenadelauncher.def create mode 100644 q4base/def/weapons/hyperblaster.def create mode 100644 q4base/def/weapons/lightninggun.def create mode 100644 q4base/def/weapons/machinegun.def create mode 100644 q4base/def/weapons/nailgun.def create mode 100644 q4base/def/weapons/napalmgun.def create mode 100644 q4base/def/weapons/railgun.def create mode 100644 q4base/def/weapons/rocketlauncher.def create mode 100644 q4base/def/weapons/shotgun.def diff --git a/q4base/def/ammo.def b/q4base/def/ammo.def new file mode 100644 index 00000000..10a390ef --- /dev/null +++ b/q4base/def/ammo.def @@ -0,0 +1,562 @@ +//---------------------------------------------------------------- +// ammo.def +// +// Copyright 2002-2004 Raven Software +//---------------------------------------------------------------- + +// Define the types of ammo that are used in the game. +// This entityDef is required by the game code. +// Up to 16 ammo types can be defined. +entityDef ammo_types +{ + "ammo_none" "0" + "ammo_blaster" "1" + "ammo_machinegun" "2" + "ammo_nailgun" "3" + "ammo_railgun" "4" + "ammo_shotgun" "5" + "ammo_hyperblaster" "6" + "ammo_rocketlauncher" "7" + "ammo_grenadelauncher" "8" + "ammo_lightninggun" "9" + "ammo_dmg" "10" + "ammo_napalmgun" "11" +} + +entityDef ammo_triggersize_SP { + "triggerSize" "32" +} +entityDef ammo_triggersize_MP { + "triggerSize" "16" +} + +entityDef ammo_default +{ + "editor_color" ".3 .3 1" + "editor_mins" "-8 -8 0" + "editor_maxs" "8 8 16" + "editor_rotatable" "1" + "editor_menu" "pickup" + + "fx_respawn" "effects/mp/itemrespawn.fx" + "snd_acquire" "items_ammo_default" + "respawn" "40" + "editor_ignore" "1" + "inherit" "ammo_triggersize_SP" +} + +entityDef ammo_machinegun +{ + "inherit" "ammo_default" + + "editor_usage" "Large Clips" + + "spawnclass" "idItem" + "model" "models/pick_ups/sp_pickups/sp_mg_rounds.lwo" + "size" "32 32 32" + "inv_ammo_machinegun" "50" + + "inv_name" "#str_107411" + "inv_icon" "gfx/guis/hud/icons/item_machinegun.tga" + + "dbTitle" "Machinegun Rounds" + "dbText" "Ammo for the machinegun.... " + "dbFilter" "item" + + "editor_ignore" "0" +} + +entityDef ammo_machinegun_mp +{ + "inherit" "ammo_machinegun" + "inherit2" "ammo_triggersize_MP" + + "editor_ignore" "1" + + "model" "models/items/ammo/ammo_box.lwo" + "skin" "skins/items/ammo/machinegun" + "skin_pickup" "skins/items/ammo/machinegun_pickup" + "inv_ammo_machinegun" "60" + "inv_icon" "gfx/guis/hud/icons/ammo_machinegun_colored" + "mtr_simple_icon" "simpleicons/ammo_machinegun_colored" +} + +entityDef ammo_nailgun +{ + "inherit" "ammo_default" + + "editor_usage" "Large Nails" + + "spawnclass" "idItem" + "model" "models/pick_ups/sp_pickups/sp_nails.lwo" + "action" "sound/electronics/1shot_beep_02.wav" + "size" "32 32 32" + "inv_ammo_nailgun" "40" + + "inv_name" "#str_107412" + "inv_icon" "gfx/guis/hud/icons/item_nailgun.tga" + + "dbTitle" "Nailgun Nails" + "dbText" "Ammo for the nailgun.... " + "dbFilter" "item" + "editor_ignore" "0" +} + +entityDef ammo_nailgun_mp +{ + "inherit" "ammo_nailgun" + "inherit2" "ammo_triggersize_MP" + "editor_ignore" "1" + + "model" "models/items/ammo/ammo_box.lwo" + "skin" "skins/items/ammo/nailgun" + "skin_pickup" "skins/items/ammo/nailgun_pickup" + "inv_ammo_nailgun" "50" + "inv_icon" "gfx/guis/hud/icons/ammo_nailgun_colored" + "mtr_simple_icon" "simpleicons/ammo_nailgun_colored" +} + +entityDef ammo_railgun +{ + "inherit" "ammo_default" + + "editor_usage" "Large Slugs" + + "spawnclass" "idItem" + "model" "models/pick_ups/sp_pickups/sp_rails.lwo" + "size" "32 32 32" + + "inv_ammo_railgun" "5" + "inv_name" "#str_107413" + "inv_icon" "gfx/guis/hud/icons/item_railgun.tga" + + "dbTitle" "Railgun Slugs" + "dbText" "Ammo for the railgun.... " + "dbFilter" "item" + "editor_ignore" "0" +} + +entityDef ammo_railgun_mp +{ + "inherit" "ammo_railgun" + "inherit2" "ammo_triggersize_MP" + "editor_ignore" "1" + + "model" "models/items/ammo/ammo_box.lwo" + "skin" "skins/items/ammo/railgun" + "skin_pickup" "skins/items/ammo/railgun_pickup" + "inv_ammo_railgun" "7" + "inv_icon" "gfx/guis/hud/icons/ammo_railgun_colored" + "mtr_simple_icon" "simpleicons/ammo_railgun_colored" +} + +entityDef ammo_shotgun +{ + "inherit" "ammo_default" + + "editor_usage" "Large Shells" + + "spawnclass" "idItem" + "model" "models/pick_ups/sp_pickups/sp_shotgun.lwo" + "size" "32 32 32" + + "inv_ammo_shotgun" "12" + "inv_name" "#str_107414" + "inv_icon" "gfx/guis/hud/icons/item_shotgun.tga" + + "dbTitle" "Shotgun Shells" + "dbText" "Ammo for the shotgun.... " + "dbFilter" "item" + "editor_ignore" "0" +} + +entityDef ammo_shotgun_mp +{ + "inherit" "ammo_shotgun" + "inherit2" "ammo_triggersize_MP" + "editor_ignore" "1" + + "model" "models/items/ammo/ammo_box.lwo" + "skin" "skins/items/ammo/shotgun" + "skin_pickup" "skins/items/ammo/shotgun_pickup" + "inv_ammo_shotgun" "16" + "inv_icon" "gfx/guis/hud/icons/ammo_shotgun_colored" + "mtr_simple_icon" "simpleicons/ammo_shotgun_colored" +} + +entityDef ammo_hyperblaster +{ + "inherit" "ammo_default" + + "editor_usage" "HyperBlaster Ammo" + + "spawnclass" "idItem" + "model" "models/pick_ups/sp_pickups/sp_hyper_ammo.lwo" + "size" "32 32 32" + + "inv_ammo_hyperblaster" "40" + "inv_name" "#str_107415" + "inv_icon" "gfx/guis/hud/icons/item_hyperblaster.tga" + + "editor_ignore" "0" +} + +entityDef ammo_hyperblaster_mp +{ + "inherit" "ammo_hyperblaster" + "inherit2" "ammo_triggersize_MP" + "editor_ignore" "1" + + "model" "models/items/ammo/ammo_box.lwo" + "skin" "skins/items/ammo/hyperblaster" + "skin_pickup" "skins/items/ammo/hyperblaster_pickup" + "inv_ammo_hyperblaster" "50" + "inv_icon" "gfx/guis/hud/icons/ammo_hyperblaster_colored" + "mtr_simple_icon" "simpleicons/ammo_hyperblaster_colored" +} + +entityDef ammo_rocketlauncher +{ + "inherit" "ammo_default" + + "editor_usage" "Rocket Launcher Ammo" + + "spawnclass" "idItem" + "model" "models/pick_ups/sp_pickups/sp_rockets.lwo" + "size" "32 32 32" + + "inv_ammo_rocketlauncher" "6" + "inv_name" "#str_107416" + "inv_icon" "gfx/guis/hud/icons/item_rocket.tga" + + "editor_ignore" "0" +} + +entityDef ammo_rocketlauncher_mp +{ + "inherit" "ammo_rocketlauncher" + "inherit2" "ammo_triggersize_MP" + "editor_ignore" "1" + + "model" "models/items/ammo/ammo_box.lwo" + "skin" "skins/items/ammo/rocketlauncher" + "skin_pickup" "skins/items/ammo/rocketlauncher_pickup" + "inv_ammo_rocketlauncher" "5" + "inv_icon" "gfx/guis/hud/icons/ammo_rocket_colored" + "mtr_simple_icon" "simpleicons/ammo_rocket_colored" +} + +entityDef ammo_grenadelauncher +{ + "inherit" "ammo_default" + + "editor_usage" "Grenade Launcher Ammo" + + "spawnclass" "idItem" + "model" "models/pick_ups/sp_pickups/sp_grenades.lwo" + "size" "32 32 32" + + "inv_ammo_grenadelauncher" "10" + "inv_name" "#str_107417" + "inv_icon" "gfx/guis/hud/icons/item_grenade.tga" + + "editor_ignore" "0" +} + +entityDef ammo_grenadelauncher_mp +{ + "inherit" "ammo_grenadelauncher" + "inherit2" "ammo_triggersize_MP" + "editor_ignore" "1" + + "model" "models/items/ammo/ammo_box.lwo" + "skin" "skins/items/ammo/grenadelauncher" + "skin_pickup" "skins/items/ammo/grenadelauncher_pickup" + "inv_ammo_grenadelauncher" "5" + "inv_icon" "gfx/guis/hud/icons/ammo_grenade_colored" + "mtr_simple_icon" "simpleicons/ammo_grenade_colored" +} + +entityDef ammo_lightninggun +{ + "inherit" "ammo_default" + + "editor_usage" "Lightning Gun Ammo" + + "spawnclass" "idItem" + "model" "models/pick_ups/sp_pickups/sp_lightning.lwo" + "size" "32 32 32" + + "inv_ammo_lightninggun" "80" + "inv_name" "#str_107418" + "inv_icon" "gfx/guis/hud/icons/item_lightning.tga" + + "editor_ignore" "0" + + "fx_idle" "effects/weapons/lightninggun/pickup.fx" +} + +entityDef ammo_lightninggun_mp +{ + "inherit" "ammo_lightninggun" + "inherit2" "ammo_triggersize_MP" + "editor_ignore" "1" + + "model" "models/items/ammo/ammo_box.lwo" + "skin" "skins/items/ammo/lightninggun" + "skin_pickup" "skins/items/ammo/lightninggun_pickup" + "inv_ammo_lightninggun" "60" + "inv_icon" "gfx/guis/hud/icons/ammo_lightning_colored" + "mtr_simple_icon" "simpleicons/ammo_lightning_colored" + "fx_idle" "" +} + +entityDef ammo_dmg +{ + "inherit" "ammo_default" + + "editor_usage" "Dark Matter Gun Ammo" + + "spawnclass" "idItem" + "model" "models/pick_ups/sp_pickups/sp_darkmatter.lwo" + "size" "32 32 32" + + "inv_ammo_dmg" "5" + "inv_name" "#str_107419" + "inv_icon" "gfx/guis/hud/icons/item_darkmatter.tga" + + "editor_ignore" "0" + + "fx_idle" "effects/weapons/dmg/pickup.fx" +} + +entityDef ammo_dmg_mp +{ + "inherit" "ammo_dmg" + "inherit2" "ammo_triggersize_MP" + "editor_ignore" "1" + + "model" "models/items/ammo/ammo_box.lwo" + "skin" "skins/items/ammo/dmg" + "skin_pickup" "skins/items/ammo/dmg_pickup" + "inv_ammo_dmg" "5" + "inv_icon" "gfx/guis/hud/icons/ammo_darkmatter_colored" + "mtr_simple_icon" "simpleicons/ammo_darkmatter_colored" + "fx_idle" "" +} + +entityDef ammo_napalmgun +{ + "inherit" "ammo_default" + "editor_usage" "Napalm Ammo" + + "spawnclass" "idItem" + "model" "models/weapons/napalmgun/ammo_flame.ase" // (Squirrel@Ritual) FIXME: This differs from + // the "models/pick_ups/sp_pickups/sp_darkmatter.lwo" + // pattern significantly... may not be an issue (since + // no Napalm Launcher in single player?) but this raises + // a minor red flag + "size" "32 32 32" + + "inv_ammo_napalmgun" "10" + "inv_name" "Napalm Gun Ammo" + "inv_icon" "gfx/guis/hud/icons/item_fire.tga" + "mtr_simple_icon" "gfx/guis/hud/simpleicons/ammo_napalmgun" + + "editor_ignore" "0" +} + +entityDef ammo_napalmgun_mp +{ + "inherit" "ammo_napalmgun" + "inherit2" "ammo_triggersize_MP" + "editor_ignore" "1" + + "model" "models/items/ammo/ammo_box.lwo" + "skin" "skins/items/ammo/flamegun" + "skin_pickup" "skins/items/ammo/flamegun_pickup" + "inv_ammo_napalmgun" "10" + "inv_icon" "gfx/guis/hud/icons/item_fire_colored" +} + +entityDef ammo_currentweapon +{ + "inherit" "ammo_default" + + "editor_usage" "Ammo for Current Weapon" + + "spawnclass" "idItem" + "model" "models/pick_ups/sp_pickups/sp_mg_rounds.lwo" + "size" "32 32 32" + + "item_currentWeaponAmmo" "1" + "editor_ignore" "0" +} + + +//--------------------------------------------------------------- +// moveable ammo + +entityDef ammo_moveable { + + "spawnclass" "idMoveableItem" + "nodrop" "0" + "noimpact" "1" + "notPushable" "1" + "density" "1" + "mass" "3000" + "friction" "0.4" + "bouncyness" "0.6" +} + +entityDef ammo_machinegun_moveable +{ + "inherit" "ammo_machinegun" + "inherit2" "ammo_triggersize_SP" + + "spawnclass" "idMoveableItem" + "nodrop" "0" + "noimpact" "1" + "notPushable" "1" + "density" "1" + "mass" "2000" + "friction" "0.4" + "bouncyness" "0.3" + +} + +entityDef ammo_hyperblaster_moveable +{ + "inherit" "ammo_hyperblaster" + "inherit2" "ammo_triggersize_SP" + + "spawnclass" "idMoveableItem" + "nodrop" "0" + "noimpact" "1" + "notPushable" "1" + "density" "1" + "mass" "4000" + "friction" "0.4" + "bouncyness" "0.3" + +} + +entityDef ammo_nailgun_moveable +{ + "inherit" "ammo_nailgun" + "inherit2" "ammo_triggersize_SP" + + "spawnclass" "idMoveableItem" + "nodrop" "0" + "noimpact" "1" + "notPushable" "1" + "density" "1" + "mass" "4000" + "friction" "0.4" + "bouncyness" "0.3" +} + +entityDef ammo_rocketlauncher_moveable +{ + "inherit" "ammo_rocketlauncher" + "inherit2" "ammo_triggersize_SP" + + "spawnclass" "idMoveableItem" + "nodrop" "0" + "noimpact" "1" + "notPushable" "1" + "density" "1" + "mass" "5000" + "friction" "0.3" + "bouncyness" "0.2" +} + +entityDef ammo_grenadelauncher_moveable +{ + "inherit" "ammo_grenadelauncher" + "inherit2" "ammo_triggersize_SP" + + "spawnclass" "idMoveableItem" + "nodrop" "0" + "noimpact" "1" + "notPushable" "1" + "density" "1" + "mass" "5000" + "friction" "0.4" + "bouncyness" "0.3" +} + +entityDef ammo_railgun_moveable +{ + "inherit" "ammo_railgun" + "inherit2" "ammo_triggersize_SP" + + "spawnclass" "idMoveableItem" + "nodrop" "0" + "noimpact" "1" + "notPushable" "1" + "density" "1" + "mass" "3000" + "friction" "0.4" + "bouncyness" "0.3" +} + +entityDef ammo_shotgun_moveable +{ + "inherit" "ammo_shotgun" + "inherit2" "ammo_triggersize_SP" + + "spawnclass" "idMoveableItem" + "nodrop" "0" + "noimpact" "1" + "notPushable" "1" + "density" "1" + "mass" "3500" + "friction" "0.4" + "bouncyness" "0.3" +} + +entityDef ammo_lightninggun_moveable +{ + "inherit" "ammo_lightninggun" + "inherit2" "ammo_triggersize_SP" + + "spawnclass" "idMoveableItem" + "nodrop" "0" + "noimpact" "1" + "notPushable" "1" + "density" "1" + "mass" "3200" + "friction" "0.3" + "bouncyness" "0.4" +} + +entityDef ammo_dmg_moveable +{ + "inherit" "ammo_dmg" + "inherit2" "ammo_triggersize_SP" + + "spawnclass" "idMoveableItem" + "nodrop" "0" + "noimpact" "1" + "notPushable" "1" + "density" "1" + "mass" "8000" + "friction" "0.8" + "bouncyness" "0.1" +} + +entityDef ammo_napalmgun_moveable +{ + "inherit" "ammo_napalmgun" + "inherit2" "ammo_triggersize_SP" + + "spawnclass" "idMoveableItem" + "nodrop" "0" + "noimpact" "1" + "notPushable" "1" + "density" "1" + "mass" "5000" + "friction" "0.3" + "bouncyness" "0.2" +} diff --git a/q4base/def/items.def b/q4base/def/items.def new file mode 100644 index 00000000..81800a4b --- /dev/null +++ b/q4base/def/items.def @@ -0,0 +1,629 @@ +/*********************************************************************** + + items + +***********************************************************************/ + +// Everything in here must match dkbase/botfiles/inv.h! +entityDef bot_itemtable { + + "INVENTORY_NONE" "0" + "INVENTORY_ARMOR" "1" + "INVENTORY_GAUNTLET" "4" + "INVENTORY_SHOTGUN" "5" + "INVENTORY_MACHINEGUN" "6" + "INVENTORY_GRENADELAUNCHER" "7" + "INVENTORY_ROCKETLAUNCHER" "8" + "INVENTORY_LIGHTNING" "9" + "INVENTORY_RAILGUN" "10" + "INVENTORY_PLASMAGUN" "11" + "INVENTORY_BFG10K" "13" + "INVENTORY_GRAPPLINGHOOK" "14" + "INVENTORY_NAILGUN" "15" + "INVENTORY_PROXLAUNCHER" "16" + "INVENTORY_CHAINGUN" "17" + "INVENTORY_SHELLS" "18" + "INVENTORY_BULLETS" "19" + "INVENTORY_GRENADES" "20" + "INVENTORY_CELLS" "21" + "INVENTORY_LIGHTNINGAMMO" "22" + "INVENTORY_ROCKETS" "23" + "INVENTORY_SLUGS" "24" + "INVENTORY_BFGAMMO" "25" + "INVENTORY_NAILS" "26" + "INVENTORY_MINES" "27" + "INVENTORY_BELT" "28" + "INVENTORY_HEALTH" "29" + "INVENTORY_TELEPORTER" "30" + "INVENTORY_MEDKIT" "31" + "INVENTORY_KAMIKAZE" "32" + "INVENTORY_PORTAL" "33" + "INVENTORY_INVULNERABILITY" "34" + "INVENTORY_QUAD" "35" + "INVENTORY_ENVIRONMENTSUIT" "36" + "INVENTORY_HASTE" "37" + "INVENTORY_INVISIBILITY" "38" + "INVENTORY_REGEN" "39" + "INVENTORY_FLIGHT" "40" + "INVENTORY_SCOUT" "41" + "INVENTORY_GUARD" "42" + "INVENTORY_DOUBLER" "43" + "INVENTORY_AMMOREGEN" "44" + "INVENTORY_REDFLAG" "45" + "INVENTORY_BLUEFLAG" "46" + "INVENTORY_NEUTRALFLAG" "47" + "INVENTORY_REDCUBE" "48" + "INVENTORY_BLUECUBE" "49" + + "MODELINDEX_DEFAULT" "0" + "MODELINDEX_ARMORSHARD" "1" + "MODELINDEX_ARMORCOMBAT" "2" + "MODELINDEX_ARMORBODY" "3" + "MODELINDEX_HEALTHSMALL" "4" + "MODELINDEX_HEALTH" "5" + "MODELINDEX_HEALTHLARGE" "6" + "MODELINDEX_HEALTHMEGA" "7" + "MODELINDEX_GAUNTLET" "8" + "MODELINDEX_SHOTGUN" "9" + "MODELINDEX_MACHINEGUN" "10" + "MODELINDEX_GRENADELAUNCHER" "11" + "MODELINDEX_ROCKETLAUNCHER" "12" + "MODELINDEX_LIGHTNING" "13" + "MODELINDEX_RAILGUN" "14" + "MODELINDEX_PLASMAGUN" "15" + "MODELINDEX_BFG10K" "16" + "MODELINDEX_GRAPPLINGHOOK" "17" + "MODELINDEX_SHELLS" "18" + "MODELINDEX_BULLETS" "19" + "MODELINDEX_GRENADES" "20" + "MODELINDEX_CELLS" "21" + "MODELINDEX_LIGHTNINGAMMO" "22" + "MODELINDEX_ROCKETS" "23" + "MODELINDEX_SLUGS" "24" + "MODELINDEX_BFGAMMO" "25" + "MODELINDEX_TELEPORTER" "26" + "MODELINDEX_MEDKIT" "27" + "MODELINDEX_QUAD" "28" + "MODELINDEX_ENVIRONMENTSUIT" "29" + "MODELINDEX_HASTE" "30" + "MODELINDEX_INVISIBILITY" "31" + "MODELINDEX_REGEN" "32" + "MODELINDEX_FLIGHT" "33" + "MODELINDEX_REDFLAG" "34" + "MODELINDEX_BLUEFLAG" "35" + "MODELINDEX_KAMIKAZE" "36" + "MODELINDEX_PORTAL" "37" + "MODELINDEX_INVULNERABILITY" "38" + "MODELINDEX_NAILS" "39" + "MODELINDEX_MINES" "40" + "MODELINDEX_BELT" "41" + "MODELINDEX_SCOUT" "42" + "MODELINDEX_GUARD" "43" + "MODELINDEX_DOUBLER" "44" + "MODELINDEX_AMMOREGEN" "45" + "MODELINDEX_NEUTRALFLAG" "46" + "MODELINDEX_REDCUBE" "47" + "MODELINDEX_BLUECUBE" "48" + "MODELINDEX_NAILGUN" "49" + "MODELINDEX_PROXLAUNCHER" "50" + "MODELINDEX_CHAINGUN" "51" + "MODELINDEX_POINTABLUE" "52" + "MODELINDEX_POINTBBLUE" "53" + "MODELINDEX_POINTARED" "54" + "MODELINDEX_POINTBRED" "55" + "MODELINDEX_POINTAWHITE" "56" + "MODELINDEX_POINTBWHITE" "57" + "MODELINDEX_POINTWHITE" "58" + "MODELINDEX_POINTRED" "59" + "MODELINDEX_POINTBLUE" "60" + + "WEAPONINDEX_GAUNTLET" "1" + "WEAPONINDEX_MACHINEGUN" "2" + "WEAPONINDEX_SHOTGUN" "3" + "WEAPONINDEX_GRENADE_LAUNCHER" "4" + "WEAPONINDEX_ROCKET_LAUNCHER" "5" + "WEAPONINDEX_LIGHTNING" "6" + "WEAPONINDEX_RAILGUN" "7" + "WEAPONINDEX_PLASMAGUN" "8" + "WEAPONINDEX_BFG" "9" + "WEAPONINDEX_GRAPPLING_HOOK" "10" + "WEAPONINDEX_NAILGUN" "11" + "WEAPONINDEX_PROXLAUNCHER" "12" + "WEAPONINDEX_CHAINGUN" "13" + +}; + +entityDef item_triggersize_SP { + "triggerSize" "32" +} +entityDef item_triggersize_MP { + "triggerSize" "16" +} + +entityDef item_default { + "editor_color" ".3 .3 1" + "editor_mins" "-8 -8 0" + "editor_maxs" "8 8 16" + "editor_rotatable" "1" + "editor_menu" "pickup" + + "report_stats" "1" + + "inv_item" "1" +// RAVEN BEGIN +// bdube: changed default icon + "inv_icon" "gfx/guis/hud/icons/item_generic.tga" +// abahr: needed for precaching + "mtr_highlight" "models/weapons/itemHighlightShell" +// RAVEN END + + "snd_acquire" "items_ammo_default" + + "editor_bool inv_item" "if set to 1, show item acquisition gui when picked up" + "editor_var inv_name" "name referenced for triggers etc.. requiring this to be in inventory to work" + "editor_var inv_icon" "icon name for hud graphics" + "editor_bool inv_carry" "if set to 1, is carried as opposed to instant use" + "editor_bool no_touch" "trigger to give to player instead of picking up" + "editor_model model" "visual model" + "editor_snd snd_acquire" "sound to make when acquired" + "editor_var triggersize" "amount to expand the pickup trigger by" + "editor_var inv_id" "id number as defined in guis/itemdefs.h" + "editor_bool not_easy" "set to 1 and item will not spawn in easy mode" + "editor_bool not_medium" "set to 1 and item will not spawn in medium mode" + "editor_bool not_hard" "set to 1 and item will not spawn in hard mode" + //"editor_copy3" "inv_name" + //"editor_copy4" "inv_item" + //"editor_copy5" "inv_objective" + //"editor_copy6" "inv_icon" + + "spawnclass" "idItem" + "inherit" "item_triggersize_SP" + + "modelindex" "MODELINDEX_DEFAULT" + + "editor_ignore" "1" +} + + +entityDef item_generic { + "inherit" "item_default" + "inv_item" "1" + "inv_name" "Item" + "editor_copy100" "inv_item" + "editor_copy101" "inv_name" + "editor_ignore" "0" +} + +entityDef item_objective { + "inherit" "item_default" + "editor_color" ".3 .3 1" + "editor_mins" "-4 -4 -4" + "editor_maxs" "4 4 4" + + "editor_usage" "Gives the player an objective, trigger it to give the objective." + + "editor_bool inv_objective" "1 means show objective window" + "editor_var camShot" "name of the entity to take the screen shot from" + "editor_var screenShot" "image name to save shot to" + "editor_var objectivetext" "objective description" + "editor_var objectivetitle" "objective title" + "editor_var inv_name" "name of inventory/objective item used for requirements" + + "spawnclass" "idObjective" + "inv_objective" "1" + + "editor_ignore" "0" +} + + + +// move to misc +entityDef item_objectivecomplete { + "inherit" "item_default" + "editor_color" ".3 .3 1" + "editor_mins" "-4 -4 -4" + "editor_maxs" "4 4 4" + + "editor_usage" "Completes a named objective, trigger it to complete the objective." + + "editor_bool inv_objective" "1 means show objective window" + "editor_var camShot" "name of the entity to take the screen shot from" + "editor_var screenShot" "image name to save shot to" + "editor_var objectivetext" "objective description" + "editor_var objectivetitle" "objective title" + "editor_var inv_name" "name of inventory/objective item to be completed" + + "spawnclass" "idObjectiveComplete" + "inv_objective" "1" + + "editor_ignore" "0" +} + +entityDef item_objectivefailed { + "inherit" "item_default" + "editor_color" ".3 .3 1" + "editor_mins" "-4 -4 -4" + "editor_maxs" "4 4 4" + + "editor_usage" "Completes a named objective, trigger it to complete the objective." + + "editor_var objectivetitle" "objective to fail" + + "spawnclass" "rvObjectiveFailed" + "inv_objective" "1" + + "editor_ignore" "0" +} + +entityDef item_health +{ + "inherit" "item_default" + "editor_color" ".3 .3 1" + "editor_mins" "-10 -10 0" + "editor_maxs" "10 10 16" + "spawnclass" "idItem" + "model" "models/items/health/health.lwo" + "mins" "-10 -10 0" + "maxs" "10 10 16" + "inv_item" "2" + "inv_icon" "gfx/guis/hud/icons/item_health.tga" + "editor_copy100" "inv_item" + "respawn" "35" + "editor_ignore" "1" + + "modelindex" "MODELINDEX_HEALTHLARGE" +} + +entityDef item_health_shard +{ + "inherit" "item_health" + "editor_usage" "#str_107320" + "inv_name" "#str_107320" + "inv_bonushealth" "5" + "snd_acquire" "pickup_health_shard" + "editor_ignore" "0" + + "modelindex" "MODELINDEX_HEALTH" +} + + +entityDef item_health_shard_mp +{ + "inherit" "item_health_shard" + "inherit2" "item_triggersize_MP" + + "model" "models/pick_ups/mp_pickups/mp_healthb.lwo" + "editor_ignore" "1" + "fx_idle" "effects/mp/health_green" + "inv_icon" "gfx/guis/hud/icons/item_healthshard_colored" + "mtr_simple_icon" "simpleicons/item_healthshard_colored" + + "modelindex" "MODELINDEX_HEALTH" +} + +entityDef item_health_oneHP +{ + "inherit" "item_health" + "inv_health" "1" + "snd_acquire" "pickup_health_shard" + "editor_ignore" "1" + + "modelindex" "MODELINDEX_HEALTH" +} + +entityDef item_health_oneHP_silent +{ + "inherit" "item_health" + "inv_health" "1" + "snd_acquire" "" + "editor_ignore" "1" + "inv_name" "" + "inv_icon" "" + + "modelindex" "MODELINDEX_HEALTH" +} + + +entityDef item_health_small +{ + "inherit" "item_health" + "model" "models/pick_ups/sp_pickups/sp_small_health.lwo" + "editor_usage" "#str_107321" + "inv_name" "#str_107321" + "inv_health" "25" + "snd_acquire" "pickup_health_small" + "editor_ignore" "0" + + "modelindex" "MODELINDEX_HEALTH" +} + + +entityDef item_health_small_mp +{ + "inherit" "item_health_small" + "inherit2" "item_triggersize_MP" + + "model" "models/pick_ups/mp_pickups/mp_healthc.lwo" + "editor_ignore" "1" + "fx_idle" "effects/mp/health_yellow" + "inv_icon" "gfx/guis/hud/icons/item_healthsmall_colored" + "mtr_simple_icon" "simpleicons/item_healthsmall_colored" + + "modelindex" "MODELINDEX_HEALTH" +} + +entityDef item_health_large +{ + "inherit" "item_health" + "model" "models/pick_ups/sp_pickups/sp_big_health.lwo" + "editor_usage" "#str_107322" + //"inv_name" "Large Health Pack" + "inv_name" "#str_107322" + + "inv_health" "50" + "snd_acquire" "pickup_health_large" + "editor_ignore" "0" + + "modelindex" "MODELINDEX_HEALTHLARGE" +} + + +entityDef item_health_large_mp +{ + "inherit" "item_health_large" + "inherit2" "item_triggersize_MP" + + "model" "models/pick_ups/mp_pickups/mp_healthd.lwo" + "editor_ignore" "1" + "fx_idle" "effects/mp/health_orange" + "inv_icon" "gfx/guis/hud/icons/item_healthlarge_colored" + "mtr_simple_icon" "simpleicons/item_healthlarge_colored" + + "modelindex" "MODELINDEX_HEALTHLARGE" +} + +entityDef item_health_mega +{ + "inherit" "item_health" + "inherit2" "item_triggersize_MP" + + "model" "models/pick_ups/mp_pickups/mp_mega_health.lwo" + "respawn" "35" + + "editor_usage" "#str_107323" + "inv_name" "#str_107323" + "inv_bonushealth" "100" // bonus health will go above 100 and tick down + "snd_acquire" "pickup_health_mega" + "editor_ignore" "0" + "fx_idle" "effects/mp/megahealth" + "inv_icon" "gfx/guis/hud/icons/item_healthmega_colored" + "mtr_simple_icon" "simpleicons/item_healthmega_colored" + "simple_icon_scale" "32.0" + + "modelindex" "MODELINDEX_HEALTHLARGE" +} + + +entityDef item_armor +{ + "inherit" "item_default" + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + + "spawnclass" "idItem" + "model" "models/items/armor/armor.lwo" + "size" "32 32 32" + "editor_copy100" "inv_item" + "snd_acquire" "pickup_armor" + "respawn" "25" + "inv_item" "2" + "inv_icon" "gfx/guis/hud/icons/item_armor.tga" + "editor_ignore" "1" + + "modelindex" "MODELINDEX_ARMORBODY" +} + +entityDef item_armor_shard +{ + "inherit" "item_armor" + "editor_usage" "#str_107324" + "inv_name" "#str_107324" + "inv_armor" "5" + "model" "models/items/armor/shard.lwo" + "snd_acquire" "pickup_armor_shard" + "editor_ignore" "0" + + "modelindex" "MODELINDEX_ARMORSHARD" +} + + +entityDef item_armor_small +{ + "inherit" "item_armor" + "editor_usage" "#str_107325" + "inv_name" "#str_107325" + "inv_armor" "50" + "editor_ignore" "0" + "simple_icon_scale" "32.0" + + modelindex" "MODELINDEX_ARMORSHARD" +} + + +entityDef item_armor_large +{ + "inherit" "item_armor" + "editor_usage" "#str_107326" + "inv_name" "#str_107326" + "inv_armor" "100" + "skin" "skins/items/armor/base_red" + "editor_ignore" "0" + "simple_icon_scale" "32.0" + + "modelindex" "MODELINDEX_ARMORBODY" +} + +entityDef item_health_small_moveable +{ + "inherit" "item_health_small" + + "spawnclass" "idMoveableItem" + "itemclipmodel" "models/pick_ups/sp_pickups/sp_small_health_col.lwo" + "nodrop" "0" + "noimpact" "1" + "notPushable" "1" + "density" "1" + "mass" "3000" + "friction" "0.4" + "bouncyness" "0.3" + + "modelindex" "MODELINDEX_ARMORSHARD" + +} + +entityDef item_armor_shard_mp +{ + "inherit" "item_armor_shard" + "inherit2" "item_triggersize_MP" + + "editor_ignore" "1" + "fx_idle" "effects/mp/armor_shard" + "inv_icon" "gfx/guis/hud/icons/item_armorshard_colored" + "mtr_simple_icon" "simpleicons/item_armorshard_colored" + + "modelindex" "MODELINDEX_ARMORSHARD" +} + + +entityDef item_armor_small_mp +{ + "inherit" "item_armor_small" + "inherit2" "item_triggersize_MP" + + "editor_ignore" "1" + "fx_idle" "effects/mp/armor_yellow" + "inv_icon" "gfx/guis/hud/icons/item_armorsmall_colored" + "mtr_simple_icon" "simpleicons/item_armorsmall_colored" + + "modelindex" "MODELINDEX_ARMORSHARD" +} + + +entityDef item_armor_large_mp +{ + "inherit" "item_armor_large" + "inherit2" "item_triggersize_MP" + + "editor_ignore" "1" + "fx_idle" "effects/mp/armor_red" + "inv_icon" "gfx/guis/hud/icons/item_armorlarge_colored" + "mtr_simple_icon" "simpleicons/item_armorlarge_colored" +} + +entityDef item_health_large_moveable +{ + "inherit" "item_health_large" + + "spawnclass" "idMoveableItem" + "itemclipmodel" "models/pick_ups/sp_pickups/sp_big_health_col.lwo" + "nodrop" "0" + "noimpact" "1" + "notPushable" "1" + "density" "1" + "mass" "5000" + "friction" "0.5" + "bouncyness" "0.2" + + "modelindex" "MODELINDEX_ARMORBODY" +} + +entityDef item_armor_shard_moveable +{ + "inherit" "item_armor_shard" + + "spawnclass" "idMoveableItem" + "itemclipmodel" "models/items/armor/shard.lwo" + "nodrop" "0" + "noimpact" "0" + "notPushable" "1" + "density" "1" + "mass" "3000" + "friction" "0.4" + "bouncyness" "0.3" + + "modelindex" "MODELINDEX_ARMORBODY" +} + +// Armor pickups for single player + +entityDef item_armor_small_sp +{ + "inherit" "item_armor" + "spawnclass" "idMoveableItem" + + "editor_usage" "#str_107328" + "inv_name" "#str_107325" + "inv_armor" "50" + "skin" "skins/items/armor/base_sp" + "editor_ignore" "0" + "nodrop" "1" + "noimpact" "1" + "notPushable" "1" + "density" "1" + "mass" "3000" + "friction" "1" + "bouncyness" "0.05" + + "modelindex" "MODELINDEX_ARMORSHARD" +} + + +entityDef item_armor_small_sp_strogg +{ + "inherit" "item_armor" + "spawnclass" "idMoveableItem" + + "editor_usage" "#str_107328" + "inv_name" "#str_107325" + "inv_armor" "50" + + "editor_ignore" "0" + + "model" "models\pick_ups\sp_pickups\sp_armor_strogg.lwo" + + "nodrop" "1" + "noimpact" "1" + "notPushable" "1" + "density" "1" + "mass" "3000" + "friction" "1" + "bouncyness" "0.05" + + "modelindex" "MODELINDEX_ARMORSHARD" +} + + +entityDef item_armor_large_sp +{ + "inherit" "item_armor" + "spawnclass" "idMoveableItem" + "model" "models/items/armor/armor_large_sp.lwo" + + "editor_usage" "#str_107329" + "inv_name" "#str_107326" + "inv_armor" "100" + "skin" "skins/items/armor/base_sp" + + "editor_ignore" "0" + + "nodrop" "1" + "noimpact" "1" + "notPushable" "1" + "density" "1" + "mass" "3000" + "friction" "1" + "bouncyness" "0.05" + + "modelindex" "MODELINDEX_ARMORBODY" +} \ No newline at end of file diff --git a/q4base/def/powerups.def b/q4base/def/powerups.def new file mode 100644 index 00000000..a4e140bd --- /dev/null +++ b/q4base/def/powerups.def @@ -0,0 +1,330 @@ +/*********************************************************************** + + powerups + +***********************************************************************/ + +entityDef powerup_types +{ + "powerup_quad_damage" "0" + "powerup_haste" "1" + "powerup_regeneration" "2" + "powerup_invisibility" "3" + "mp_ctf_marine_flag" "4" + "mp_ctf_strogg_flag" "5" + "mp_ctf_one_flag" "6" + "powerup_ammoregen" "7" + "powerup_guard" "8" + "powerup_doubler" "9" + "powerup_scout" "10" + "powerup_moderator" "11" + "powerup_deadzone" "12" + "powerup_team_ammo_regen" "13" + "powerup_team_health_regen" "14" + "powerup_team_damage_mod" "15" +} + +entityDef powerup +{ + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + "editor_copy100" "inv_item" + "editor_menu" "pickup" + "editor_ignore" "1" + + "spawnclass" "idItemPowerup" + "respawn" "120" + "time" "30" + "nopulse" "1" + "spin" "1" + "mins" "-16 -16 0" + "maxs" "16 16 16" + "fx_respawn" "effects/mp/itemrespawn.fx" + "dbFilter" "powerup" + "globalAcquireSound" "1" + + "triggerBounds" "40 40 48" + + "simple_icon_scale" "48.0" +} + +entityDef powerup_quad_damage +{ + "inherit" "powerup" + "editor_usage" "Quad Damage" + + "model" "models/pick_ups/mp_pickups/mp_quad.lwo" + "type" "0" // MUST MATCH ONE OF THE DEFINES IN PLAYER.H + + "inv_name" "#str_107423" + "inv_icon" "gfx/guis/hud/icons/item_quaddamage.tga" + "mtr_simple_icon" "gfx/guis/hud/icons/item_quaddamage.tga" + + "snd_acquire" "sound/mp/pickups/quad_acquire.wav" + + "editor_ignore" "0" + "fx_idle" "effects/mp/quaddamage" + + "net_syncPhysics" "1" +} + +entityDef powerup_haste +{ + "inherit" "powerup" + "editor_usage" "Haste" + + "model" "models/pick_ups/mp_pickups/mp_haste.lwo" + "type" "1" // MUST MATCH ONE OF THE DEFINES IN PLAYER.H + + "inv_name" "#str_107424" + "inv_icon" "gfx/guis/hud/icons/item_haste.tga" + "mtr_simple_icon" "gfx/guis/hud/icons/item_haste.tga" + + "snd_acquire" "sound/mp/pickups/haste.wav" + + "editor_ignore" "0" + + "fx_idle" "effects/mp/haste" + + "net_syncPhysics" "1" +} + +entityDef powerup_regeneration +{ + "inherit" "powerup" + "editor_usage" "Regeneration" + + "model" "models/pick_ups/mp_pickups/mp_regeneration.lwo" + "type" "2" // MUST MATCH ONE OF THE DEFINES IN PLAYER.H + + "inv_name" "#str_107425" + "inv_icon" "gfx/guis/hud/icons/item_regen.tga" + "mtr_simple_icon" "gfx/guis/hud/icons/item_regen.tga" + + "snd_acquire" "sound/mp/pickups/regen_acquire.wav" + + "editor_ignore" "0" + + "fx_idle" "effects/mp/regen" + + "net_syncPhysics" "1" +} + +entityDef powerup_invisibility +{ + "inherit" "powerup" + "editor_usage" "Invisibility" + + "model" "models/pick_ups/mp_pickups/mp_invisibility.lwo" + "type" "3" // MUST MATCH ONE OF THE DEFINES IN PLAYER + + "inv_name" "#str_107426" + "inv_icon" "gfx/guis/hud/icons/item_invis.tga" + "mtr_simple_icon" "gfx/guis/hud/icons/item_invis.tga" + + "snd_acquire" "sound/mp/pickups/invis.wav" + + "editor_ignore" "0" + + "fx_idle" "effects/mp/invis" + + "net_syncPhysics" "1" +} + +entityDef powerup_guard +{ + "inherit" "powerup" + "editor_usage" "Guard" + + "model" "models/pick_ups/mp_pickups/ctf_guard.lwo" + "type" "8" // MUST MATCH ONE OF THE DEFINES IN PLAYER.H + + "inv_name" "#str_107427" + "inv_icon" "gfx/guis/hud/icons/item_guard.tga" + "mtr_simple_icon" "gfx/guis/hud/icons/item_guard.tga" + "inv_bonushealth" "200" + "inv_armor" "200" + "filter_Arena CTF" "1" + "filter_Arena One Flag CTF" "1" + + "globalAcquireSound" "0" + "snd_acquire" "sound/vo/mp/9_99_360_8.wav" + + "editor_ignore" "0" + + "time" "-1" + "nodrop" "1" + "unique" "1" +} + +entityDef powerup_doubler +{ + "inherit" "powerup" + "editor_usage" "Doubler" + + "model" "models/pick_ups/mp_pickups/ctf_doubler.lwo" + "type" "9" // MUST MATCH ONE OF THE DEFINES IN PLAYER.H + + "inv_name" "#str_107428" + "inv_icon" "gfx/guis/hud/icons/item_doubler.tga" + "mtr_simple_icon" "gfx/guis/hud/icons/item_doubler.tga" + "filter_Arena CTF" "1" + "filter_Arena One Flag CTF" "1" + + "globalAcquireSound" "0" + "snd_acquire" "sound/vo/mp/9_99_360_6.wav" + + "editor_ignore" "0" + "time" "-1" + "nodrop" "1" + "unique" "1" +} + +entityDef powerup_ammoregen +{ + "inherit" "powerup" + "editor_usage" "Ammo Regen" + + "model" "models/pick_ups/mp_pickups/ctf_ammo_regen.lwo" + "type" "7" // MUST MATCH ONE OF THE DEFINES IN PLAYER.H + + "inv_name" "#str_107429" + "inv_icon" "gfx/guis/hud/icons/item_ammoregen.tga" + "mtr_simple_icon" "gfx/guis/hud/icons/item_ammoregen.tga" + "filter_Arena CTF" "1" + "filter_Arena One Flag CTF" "1" + + "globalAcquireSound" "0" + "snd_acquire" "sound/vo/mp/9_99_320_10.wav" + + "editor_ignore" "0" + + "time" "-1" + "nodrop" "1" + "unique" "1" +} + +entityDef powerup_scout +{ + "inherit" "powerup" + "editor_usage" "Scout" + + "model" "models/pick_ups/mp_pickups/ctf_scout.lwo" + "type" "10" // MUST MATCH ONE OF THE DEFINES IN PLAYER.H + + "inv_name" "#str_107430" + "inv_icon" "gfx/guis/hud/icons/item_scout.tga" + "mtr_simple_icon" "gfx/guis/hud/icons/item_scout.tga" + "filter_Arena CTF" "1" + "filter_Arena One Flag CTF" "1" + + "globalAcquireSound" "0" + "snd_acquire" "sound/vo/mp/9_99_360_7.wav" + + "editor_ignore" "0" + "time" "-1" + "nodrop" "1" + "unique" "1" +} + +entityDef powerup_moderator +{ + "inherit" "powerup" + "editor_usage" "Moderator" + + "model" "models/pick_ups/mp_pickups/moderator.lwo" + "type" "11" // MUST MATCH ONE OF THE DEFINES IN PLAYER.H + + "inv_name" "#str_107327" + "inv_icon" "gfx/guis/hud/icons/item_moderator.tga" + + "snd_acquire" "items_ammo_default" + + "editor_ignore" "0" + "fx_idle" "effects/mp/quaddamage" + + "skin_inview" +} + +entityDef powerup_deadzone +{ + "inherit" "powerup" + "spawnclass" "riDeadZonePowerup" + "editor_usage" "DeadZone Token" + + "model" "models/pick_ups/mp_pickups/mp_q4x_deadzone_z.ASE" + "type" "12" // MUST MATCH ONE OF THE DEFINES IN PLAYER.H + "time" "30" + "no_respawn" "1" + + "inv_name" "#str_122003" + "inv_icon" "gfx/guis/hud/icons/item_deadzone.tga" + "mtr_simple_icon" "gfx/guis/hud/simpleicons/deadzone" + + "snd_acquire" "mp_dz_pickup" + "filter_DeadZone" "1" + + "dbTitle" "DeadZone" + "dbText" "Allows capture of a dead zone" + "editor_ignore" "0" + "fx_idle" "effects/mp/deadzone" + "net_syncPhysics" "1" + //"unique" "1" +} + +entityDef powerup_team_ammo_regen +{ + "inherit" "powerup" + "editor_usage" "Team Ammo Regen (DO NOT PLACE IN RADIANT)" + + "model" "models/items/quad_damage/quad.lwo" + "type" "13" // MUST MATCH ONE OF THE DEFINES IN PLAYER.H + "time" "30" + + "inv_name" "#str_122004" + "inv_icon" "gfx/guis/hud/icons/item_quaddamage.tga" + + //"snd_acquire" "sound/vo/mp/9_99_360_1.wav" + + "dbTitle" "Team Ammo Regen" + "dbText" "Team Ammo Regen" + "editor_ignore" "1" +} + +entityDef powerup_team_health_regen +{ + "inherit" "powerup" + "editor_usage" "Team Health Regen (DO NOT PLACE IN RADIANT)" + + "model" "models/items/quad_damage/quad.lwo" + "type" "14" // MUST MATCH ONE OF THE DEFINES IN PLAYER.H + "time" "30" + + "inv_name" "#str_122005" + "inv_icon" "gfx/guis/hud/icons/item_quaddamage.tga" + + //"snd_acquire" "sound/vo/mp/9_99_360_1.wav" + + "dbTitle" "Team Health Regen" + "dbText" "Team Health Regen" + "editor_ignore" "1" +} + +entityDef powerup_team_damage_mod +{ + "inherit" "powerup" + "editor_usage" "Team Doubler (DO NOT PLACE IN RADIANT)" + + "model" "models/pick_ups/mp_pickups/ctf_doubler.lwo" + "type" "15" // MUST MATCH ONE OF THE DEFINES IN PLAYER.H + "time" "30" + + "inv_name" "#str_122006" + "inv_icon" "gfx/guis/hud/icons/item_doubler.tga" + + "dbTitle" "Team Doubler" + "dbText" "Team Doubler" + "editor_ignore" "1" +} + diff --git a/q4base/def/weapons/blaster.def b/q4base/def/weapons/blaster.def new file mode 100644 index 00000000..4d6167e2 --- /dev/null +++ b/q4base/def/weapons/blaster.def @@ -0,0 +1,339 @@ +//---------------------------------------------------------------- +// blaster.def +// +// Copyright 2002-2004 Raven Software +//---------------------------------------------------------------- + +export blaster +{ + options -prefix BLASTER_ -scale .4 -keep lft_pnky_3 barrel -keep flashlight -parent lft_wrst body -sourcedir work/models/weapons/marine_blaster_pistol/animations -destdir models/weapons/blaster + + addoptions -skipmesh rt_strogg_arm_mesh + addoptions -skipmesh lft_strogg_arm_mesh + + mesh blaster_idle_00.ma -dest view + anim blaster_position_fire.ma -dest fire + anim blaster_position_fire2.ma -dest fire2 + anim blaster_idle_00.ma -dest idle + anim blaster_raise_weapon.ma -dest raise + anim blaster_lower_weapon.ma -dest lower + anim blaster_flashlight.ma -dest flashlight + anim blaster_position_mod_start.ma -dest charge_up + anim blaster_position_mod_end.ma -dest big_recoil +} + +export blaster_strogg +{ + options -prefix BLASTER_ -scale .4 -keep barrel -keep flashlight -parent lft_wrst body -sourcedir work/models/weapons/marine_blaster_pistol/animations -destdir models/weapons/blaster + addoptions -skipmesh rt_arm_mesh + addoptions -skipmesh lft_arm_mesh + mesh blaster_idle_00.ma -dest view_strogg +} + + +export blaster +{ + options -prefix PLAYER_PST_ -scale .4 -keep muzzle_flash ATTACHER -sourcedir work/models/characters/marine/animation_mocap_cinematics -destdir models/weapons/blaster/world -rename ATTACHER origin -clearorigin + mesh newMarine_oneframe_idle.ma -dest blaster + anim newMarine_oneframe_idle.ma -dest idle +} + + +entityDef viewStyle_shouldered_blaster { + "viewangles" "-0.5 -9 1.6" + "viewoffset" "-1.3 5 1.15" +} + +entityDef viewStyle_q3_blaster { + "viewangles" "1 -5.7 1.6" + "viewoffset" "-2 1.7 1.15" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Weapon Defintion +//-------------------------------------------------------------------------------------------------------------------0 + +entityDef weapon_blaster +{ + "editor_menu" "pickup" + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + + "editor_usage" "Blaster" + + "spawnclass" "idItem" + "weaponclass" "rvWeaponBlaster" + "weaponname" "Blaster" + "size" "32 32 32" + + "model_view" "weapon_blaster_view" + "model_view_strogg" "weapon_blaster_view_strogg" + "model_world" "weapon_blaster_world" + "model" "models/weapons/blaster/w_bp.lwo" + + "joint_attach" "PST_ATTACHER" + "joint_view_flashlight" "barrel" + "joint_view_flash" "barrel" + "joint_world_flash" "muzzle_flash" + + // Firing properties + "chargeTime" ".8" + "chargeDelay" ".1" + "chargeGlow" "0 .4" + "fireRate" ".15" + "spread" ".2" + +// "def_projectile" "projectile_blaster" + "def_hitscan" "hitscan_blaster" + "def_altprojectile" "projectile_blaster_charged" + "ammoType" "ammo_blaster" + "clipSize" "0" + "ammoRequired" "0" +// "launchFromBarrel" "1" + + "inv_weapon" "weapon_blaster" + "inv_item" "5" + "inv_icon" "gfx/guis/hud/icons/item_blaster.tga" + "inv_name" "#str_107400" + +// "gui" "guis/weapons/blaster_ammo.gui" + "mtr_icon" "gfx/guis/hud/icons/gun_blaster" + + "mtr_crosshair" "gfx/guis/crosshairs/crosshair_blaster" +// "crosshairOffsetX" "2" +// "crosshairOffsetY" "2" + + // -------------------- Recoil and Muzzle Kick --------------------------------------- + + "muzzle_kick_time" "0.1" + "muzzle_kick_maxtime" "0.2" + "muzzle_kick_angles" "-5 0 0" + "muzzle_kick_offset" "2 0 0" + + "recoilTime" "100" + "recoilAngles" "-2 0 0" + + // ---------------------------- Flashlight --------------------------------------- + + "mtr_flashlightShader" "gfx/lights/flashlight" + "flashlightColor" "1 1 .9" + "flashlightRadius" "400" + "flashlightAngle" "15.0" + "flashlightTarget" "1000 0 0" + "flashlightUp" "0 375 0" + "flashlightRight" "0 0 -375" + "flashlightPointLight" "0" + + + // ---------------------------- Muzzle Flash --------------------------------------- + + "mtr_flashShader" "lights/muzzleflash" + "flashColor" "0.7 0.8 1" + "flashRadius" "200" + "flashPointLight" "1" + "flashTime" ".1" + "flashViewOffset" "15 5 -10" + + // ------------------------- Sounds and Effects --------------------------------------- + + "snd_charge" "weapon_blaster_charge" + "snd_charge_loop" "weapon_blaster_charged" + "snd_charge_click" "weapon_blaster_charge_click" + "snd_quaddamage" "weapon_quaddamage_fire" + + "fx_normalflash" "effects/weapons/blaster/muzzleflash.fx" + "fx_chargedflash" "effects/weapons/blaster/charged/muzzleflash.fx" + "fx_respawn" "effects/mp/itemrespawn.fx" + "fx_muzzleflash_world" "effects/weapons/blaster/muzzleflash_world.fx" + + "snd_acquire" "pickup_weapon" + + "def_viewStyle" "viewStyle_q3_blaster" + "def_viewStyle1" "viewStyle_shouldered_blaster" + + + "foreshorten" ".65" + + "weaponAngleOffsetAverages" "10" + "weaponAngleOffsetScale" ".25" + "weaponAngleOffsetMax" "10" + "weaponOffsetTime" "600" + "weaponOffsetScale" "0.003" + + "net_syncPhysics" "1" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Models +//-------------------------------------------------------------------------------------------------------------------0 + +model weapon_blaster_view +{ + mesh models/weapons/blaster/view.md5mesh + + anim idle models/weapons/blaster/idle.md5anim + anim raise models/weapons/blaster/raise.md5anim + { + rate 1.4 + frame 6 sound_weapon weapon_blaster_ready + } + anim putaway models/weapons/blaster/lower.md5anim + { + frame 1 sound_weapon weapon_switch + } + + anim fire1 models/weapons/blaster/fire.md5anim + { + frame 1 sound_weapon weapon_blaster_fire + frame 1 sound_item weapon_blaster_fire_stereo + } + anim fire2 models/weapons/blaster/fire2.md5anim + { + frame 1 sound_weapon weapon_blaster_fire + frame 1 sound_item weapon_blaster_fire_stereo + } + + anim flashlight models/weapons/blaster/flashlight.md5anim + { + frame 8 sound_weapon weapon_blaster_flashlight + } + + anim charging models/weapons/blaster/charge_up.md5anim + anim chargedfire models/weapons/blaster/big_recoil.md5anim + { + frame 1 sound_weapon weapon_blaster_fire_charged + frame 1 sound_item weapon_blaster_fire_stereo + } +} + +model weapon_blaster_view_strogg +{ + inherit weapon_blaster_view + mesh models/weapons/blaster/view_strogg.md5mesh +} + +model weapon_blaster_world +{ + mesh models/weapons/blaster/world/blaster.md5mesh + anim idle models/weapons/blaster/world/idle.md5anim +} + +//-------------------------------------------------------------------------------------------------------------------- +// Mods +//-------------------------------------------------------------------------------------------------------------------0 + +//-------------------------------------------------------------------------------------------------------------------- +// Projectile +//-------------------------------------------------------------------------------------------------------------------0 + +entityDef hitscan_blaster +{ + "range" "10000" + + "fx_impact" "effects/weapons/blaster/impact_default.fx" + "fx_impact_water" "effects/ambient/splash_smll.fx" + "fx_impact_concrete" "effects/weapons/hyperblaster/impact_concrete.fx" + "fx_impact_flesh" "effects/weapons/hyperblaster/impact_flesh.fx" + "fx_impact_monstermetal" "effects/weapons/hyperblaster/impact_flesh.fx" + "fx_impact_glass" "effects/weapons/blaster/impact_glass.fx" + "fx_impact_bpglass" "effects/weapons/blaster/impact_bpglass.fx" + "fx_impact_electronics" "effects/weapons/hyperblaster/impact_electronics.fx" + + "fx_path" "effects/weapons/blaster/trail.fx" + + "def_damage" "damage_blaster" + + "push" "7500" + + "impact_gib" "1" +} + +entityDef projectile_blaster +{ + "spawnclass" "idProjectile" + "mins" "-2 -2 -2" + "maxs" "2 2 2" + "cone" "2" + "noshadows" "1" + + "def_damage" "damage_blaster" + + "velocity" "1500 0 0" + "fuse" "4" + "push" "7500" + + "detonate_on_fuse" "1" + "detonate_on_death" "0" + "detonate_on_world" "1" + "detonate_on_actor" "1" + + "impact_gib" "1" + + "decal_bounce" "" + "decal_size" "8" + + "fx_fly" "effects/weapons/blaster/fly.fx" + "fx_impact" "effects/weapons/blaster/impact_default.fx" + "fx_impact_water" "effects/ambient/splash_smll.fx" + "fx_impact_flesh" "effects/weapons/blaster/impact_flesh.fx" + "fx_impact_monstermetal" "effects/weapons/blaster/impact_monstermetal.fx" + "fx_impact_electronics" "effects/weapons/machinegun/impact_electronics.fx" + "fx_impact_armor" "effects/weapons/machinegun/impact_armor.fx" + + "fx_teleport_enter" "effects/mp/item_teleport.fx" + "fx_teleport" "effects/mp/item_teleport.fx" +} + +entityDef projectile_blaster_charged +{ + "inherit" "projectile_blaster" + + "mins" "-8 -8 -8" + "maxs" "8 8 8" + + "velocity" "2000 0 0" + + "fx_fly" "effects/weapons/blaster/charged/fly.fx" + "fx_impact" "effects/weapons/blaster/charged/impact_default.fx" + "fx_impact_flesh" "effects/weapons/blaster/impact_flesh_charged.fx" + "fx_impact_monstermetal" "effects/weapons/blaster/impact_monstermetal_charged.fx" + "fx_impact_electronics" "effects/weapons/machinegun/impact_electronics.fx" + "fx_impact_armor" "effects/weapons/machinegun/impact_armor.fx" + + + "def_damage" "damage_blaster_charged" + "def_splash_damage" "damage_blastersplash_charged" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Damage +//-------------------------------------------------------------------------------------------------------------------0 + +entityDef damage_blaster +{ + "inherit" "damage_bullet" + "damage" "8" + + "fx_wound" "effects/wounds/energy.fx" + + "deathPush" "100" + "deathPushMin" "2000 250" + "deathPushMax" "5000 500" +} + +entityDef damage_blaster_charged +{ + "inherit" "damage_blaster" + "damage" "50" +} + +entityDef damage_blastersplash_charged +{ + "inherit" "damage_blaster" + + "damage" "40" + "radius" "50" + "knockback" "30" + "push" "2500" +} diff --git a/q4base/def/weapons/dmg.def b/q4base/def/weapons/dmg.def new file mode 100644 index 00000000..536436f5 --- /dev/null +++ b/q4base/def/weapons/dmg.def @@ -0,0 +1,432 @@ +//---------------------------------------------------------------- +// dmg.def +// +// Copyright 2002-2004 Raven Software +//---------------------------------------------------------------- + +export dmg +{ + options -prefix DMG_ -scale .3937 -keep muzzle_flash -sourcedir work/models/weapons/strogg_dark_matter/animations -destdir models/weapons/darkmatter +// addoptions -parent middle_ring outer_ring +// addoptions -parent inner_ring middle_ring + addoptions -skipmesh rt_strogg_arm_mesh + addoptions -skipmesh lft_strogg_arm_mesh + + mesh dmg_mesh.ma -dest dmg + anim dmg_sequence.ma -range 14 21 -dest raise + anim dmg_sequence.ma -range 21 93 -dest reload + anim dmg_sequence.ma -range 93 141 -dest idle + anim dmg_sequence.ma -range 141 176 -dest fire + anim dmg_sequence.ma -range 176 181 -dest lower + anim dmg_sequence.ma -range 200 207 -dest raise_loaded + anim dmg_sequence.ma -range 207 212 -dest lower_loaded +} + +export dmg_strogg +{ + options -prefix DMG_ -scale .3937 -keep muzzle_flash -sourcedir work/models/weapons/strogg_dark_matter/animations -destdir models/weapons/darkmatter + addoptions -skipmesh rt_arm_mesh + addoptions -skipmesh lft_arm_mesh + mesh dmg_mesh.ma -dest dmg_strogg +} + + +export dmg +{ + options -prefix PLAYER_DMG_ -scale .4 -keep muzzle_flash ATTACHER -sourcedir work/models/characters/marine/multiplayer -destdir models/weapons/darkmatter/world -rename ATTACHER origin -clearorigin + mesh darkmattergun_idle.ma -dest darkmattergun + anim darkmattergun_idle.ma -dest idle +} + +entityDef viewStyle_q3_dmg { + "viewoffset" "-0.6 0.5 -0.8" + "viewangles" "-0.7 -0.3 -1.5" +} + +entityDef dmg_shellshock +{ + // Double Vision + "dv_time" "1500" + "dv_scale" ".02" + + // Hearing Loss + "hl_volumeDB" "-25" + "hl_fadeOutTime" ".5" + "hl_time" "2.5" + "hl_fadeInTime" "1" + "snd_hl" "player_sounds_ringing" +} + +entityDef dmg_shellshock_nohl +{ + // Double Vision + "dv_time" "1500" + "dv_scale" ".04" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Weapon Definition +//-------------------------------------------------------------------------------------------------------------------- + +entityDef weapon_dmg +{ + "editor_menu" "pickup" + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + + "editor_usage" "Dark Matter Gun" + + "spawnclass" "idItem" + "weaponclass" "rvWeaponDarkMatterGun" + "size" "32 32 32" + "model_view" "weapon_dmg_view" + "model_view_strogg" "weapon_dmg_view_strogg" + "model_world" "weapon_dmg_world" + "model" "models/weapons/darkmatter/w_dmg.lwo" + "def_dropItem" "weapon_dmg" + "mtr_crosshair" "gfx/guis/crosshairs/crosshair_grenadelauncher" + + "joint_attach" "DMG_ATTACHER" + "joint_view_flash" "muzzle_flash" + "joint_view_barrel" "muzzle_flash" + "joint_world_flash" "muzzle_flash" + "joint_core" "inner_ring" + + "fireRate" "2" + "spread" "0" + + "inv_weapon" "weapon_dmg" + "inv_start_ammo_dmg" "10" + "inv_item" "1" + "inv_icon" "gfx/guis/hud/icons/item_darkmatter.tga" + "inv_name" "#str_107401" + + "weaponname" "Dark Matter Gun" + "def_projectile" "projectile_dmg" + "ammoType" "ammo_dmg" + "clipSize" "1" + "ammoRequired" "1" + "mtr_icon" "gfx/guis/hud/icons/gun_darkmatter" + +// "muzzle_kick_time" "0.8" +// "muzzle_kick_maxtime" "0.8" +// "muzzle_kick_angles" "-4 0 0" +// "muzzle_kick_offset" "2 0 1" + + "recoilTime" "500" + "recoilAngles" "-.20 0 0" + + "mtr_flashShader" "lights/muzzleflash" + "flashColor" "0.99 0.84 .31" + "flashRadius" "200" + "flashPointLight" "1" + "flashTime" ".1" + "flashViewOffset" "15 -5 -5" + + "chargeDuration" "4" + + "mtr_guiLightShader" "lights/viewWeaponGuiLight" + + "fx_muzzleflash" "effects/weapons/dmg/muzzleflash.fx" + "fx_muzzleflash_world" "effects/weapons/dmg/muzzleflash_world.fx" + "fx_respawn" "effects/mp/itemrespawn.fx" + "fx_core_start" "effects/weapons/dmg/core_start.fx" + "fx_core" "effects/weapons/dmg/core.fx" + + "snd_acquire" "pickup_weapon" + "snd_rings" "weapon_darkmatter_whoosh" + "snd_quaddamage" "weapon_quaddamage_fire" + "snd_noAmmo" "weapon_darkmatter_dryfire" + + "def_viewStyle" "viewStyle_q3_dmg" + + "hidesurface3" "models/monsters/maya_texture/maya_surface3" + + "weaponAngleOffsetAverages" "10" + "weaponAngleOffsetScale" ".25" + "weaponAngleOffsetMax" "5" + "weaponOffsetTime" "600" + "weaponOffsetScale" "0.002" + + "ring_outer_joint" "outer_ring" + "ring_outer_velocity" "0 500 0" + "ring_middle_joint" "middle_ring" + "ring_middle_velocity" "500 0 0" + "ring_inner_joint" "inner_ring" + "ring_inner_velocity" "0 300 0" + +// "launchFromBarrel" "1" + "foreshorten" ".55" + "net_syncPhysics" "1" +} + +entityDef weapon_dmg_mp +{ + "inherit" "weapon_dmg" + "def_mod1" "" + "editor_ignore" "1" + + "def_projectile" "projectile_dmg_mp" + "inv_icon" "gfx/guis/hud/icons/item_darkmatter_colored" + "mtr_simple_icon" "simpleicons/item_darkmatter_colored" + "simple_icon_scale" "32.0" + "inv_start_ammo_dmg" "3" + "triggerSize" "32" + + "muzzle_kick_time" "0" + "muzzle_kick_maxtime" "0" + "muzzle_kick_angles" "0 0 0" + "muzzle_kick_offset" "0 0 0" + "recoilTime" "0" + "recoilAngles" "0 0 0" + + "respawn_Team DM" "30" + "respawn_Tourney" "15" + + // played when you touch a weapon you can't acquire, i.e. weaponStay in MP + "snd_noAcquire" "pickup_weaponstay" + + "ammoRegenStep" "1" + "ammoRegenTime" "3600" +} + +entityDef moveable_item_dmg +{ + "inherit" "weapon_dmg" + + "editor_rotatable" "1" + + "itemclipmodel" "models/weapons/darkmatter/w_dmg_clip.lwo" + + + "spawnclass" "idMoveableItem" + "density" "0.05" + "friction" "0.2" + "bouncyness" "0" + "mass" "5000" +} + + +//-------------------------------------------------------------------------------------------------------------------- +// Models +//-------------------------------------------------------------------------------------------------------------------- + +model weapon_dmg_view +{ + mesh models/weapons/darkmatter/dmg.md5mesh + anim fire models/weapons/darkmatter/fire.md5anim + { + frame 1 sound_weapon weapon_darkmatter_fire + frame 1 sound_item weapon_darkmatter_stereo_fire + } +// anim fire_idle models/weapons/darkmatter/post_fire_idle.md5anim + anim reload models/weapons/darkmatter/reload.md5anim + { + frame 1 sound_weapon weapon_darkmatter_charge + } + anim idle models/weapons/darkmatter/idle.md5anim + anim raise models/weapons/darkmatter/raise.md5anim + anim putaway models/weapons/darkmatter/lower.md5anim + anim raise_loaded models/weapons/darkmatter/raise_loaded.md5anim + anim putaway_loaded models/weapons/darkmatter/lower_loaded.md5anim +} + +model weapon_dmg_view_strogg +{ + inherit weapon_dmg_view + mesh models/weapons/darkmatter/dmg_strogg.md5mesh +} + +model weapon_dmg_world +{ + mesh models/weapons/darkmatter/world/darkmattergun.md5mesh + anim idle models/weapons/darkmatter/world/idle.md5anim +} + + +//-------------------------------------------------------------------------------------------------------------------- +// Projectile +//-------------------------------------------------------------------------------------------------------------------- + +entityDef damage_dmg_fly +{ + "damage" "30" + "radius" "200" +// "knockback" "100" + "push" "-3000" + "gib" "1" + + "attackerDamageScale" "0" // Dont hurt the player who shot it, but still do effects + "attackerPushScale" "0" // Dont push the player who shot it + + "pain" "stream" + "cower" "1" + + +/* + // Hearing Loss + "hl_volumeDB" "-25" + "hl_fadeOutTime" "0" + "hl_time" ".5" + "hl_fadeInTime" ".01" +// "snd_hl" "player_sounds_ringing" +*/ +} + +entityDef damage_dmg_splash +{ + "damage" "50" + "radius" "150" + "knockback" "100" + "push" "20000" + "gib" "0" + + "deathPush" "100" + "deathPushMin" "7000 9000" + "deathPushMax" "10000 12000" + + "pain" "stream" + + "cower" "1" + +} + +entityDef projectile_dmg +{ + "spawnclass" "rvDarkMatterProjectile" + "mins" "-4 -4 -4" + "maxs" "4 4 4" + "cone" "" + "noshadows" "1" + "clipmask_largeshot" "1" + + "no_contents" "1" + + "def_splash_damage" "damage_dmg_splash" + + "def_radius_damage" "damage_dmg_fly" + "damageRate" ".05" + + "speed" "250" + + "delay_splash" ".45" + + "linear_friction" "0" + "angular_friction" "0" + "contact_friction" "10" + "fuse" "10" + + "detonate_on_fuse" "1" + "detonate_on_death" "0" + "detonate_on_world" "1" + "detonate_on_actor" "0" + + "impact_gib" "1" + "decal_size" "75" + + "flyEffectAttenuateSpeed" "200" + + "fx_fly" "effects/weapons/dmg/fly.fx" + "fx_detonate" "effects/weapons/dmg/impact_default.fx" + "fx_impact" "effects/weapons/dmg/impact_default_mp.fx" + "fx_impact_water" "effects/ambient/splash_med.fx" + + "snd_ricochet" "grenade_bounce" + "snd_fly" "weapon_darkmatter_energy_loop" + + "fx_teleport_enter" "effects/mp/item_teleport.fx" + "fx_teleport" "effects/mp/item_teleport.fx" +} + +entityDef damage_dmg_mp +{ + "damage" "200" + "gib" "1" + + /* + "push" "40000" + "deathPush" "1000" + "deathPushMin" "3000 2000" + "deathPushMax" "5000 3000" + */ + + "knockback" "200" + "push" "0" + "deathPush" "0" + "deathPushMin" "0 00" + "deathPushMax" "0 0" + + "pain" "concussive" + "cower" "1" +} + +entityDef damage_dmg_splash_mp +{ + "damage" "100" + "radius" "768" + "gib" "1" + + /* + "knockback" "500" + "push" "10000" + "deathPush" "500" + "deathPushMin" "5000 6000" + "deathPushMax" "7000 8000" + */ + "knockback" "100" + "push" "0" + "deathPush" "0" + "deathPushMin" "0 00" + "deathPushMax" "0 0" + + "pain" "concussive" + "cower" "1" + + "attackerDamageScale" "0.5" + "attackerPushScale" "1.0" +} + +entityDef projectile_dmg_mp +{ + "spawnclass" "idProjectile" + "mins" "-10 -10 -10" + "maxs" "10 10 10" + "cone" "2" + "noshadows" "1" + "clipmask_largeshot" "1" + + "def_damage" "damage_dmg_mp" + "def_splash_damage" "damage_dmg_splash_mp" + + "speed" "350" + "fuse" "10" + "push" "48000" + + "predictTime" "50" + + "detonate_on_fuse" "1" + "detonate_on_death" "0" + "detonate_on_world" "1" + "detonate_on_actor" "1" + "detonate_on_bounce" "1" + + "impact_gib" "1" + "decal_size" "75" + + "fx_fly" "effects/weapons/dmg/fly_mp.fx" + "fx_detonate" "effects/weapons/dmg/impact_default_mp.fx" + "fx_impact" "effects/weapons/dmg/impact_default_mp.fx" + "fx_impact_mp" "effects/weapons/dmg/impact_default_mp.fx" + "fx_impact_water" "effects/ambient/splash_med.fx" + + "snd_ricochet" "grenade_bounce" + "snd_fly" "weapon_darkmatter_energy_loop" + + "friendly_impact" "1" + + "fx_teleport_enter" "effects/mp/item_teleport.fx" + "fx_teleport" "effects/mp/item_teleport.fx" + + "no_impact_prediction" "1" +} diff --git a/q4base/def/weapons/gauntlet.def b/q4base/def/weapons/gauntlet.def new file mode 100644 index 00000000..7579b27b --- /dev/null +++ b/q4base/def/weapons/gauntlet.def @@ -0,0 +1,213 @@ +//---------------------------------------------------------------- +// gauntlet.def +// +// Copyright 2002-2004 Raven Software +//---------------------------------------------------------------- + +export gauntlet +{ + options -prefix GAUNTLET_ -scale .4 -sourcedir work/models/weapons/strogg_gauntlet/animations -destdir models/weapons/gauntlet + + addoptions -skipmesh rt_strogg_arm_mesh + addoptions -skipmesh lft_strogg_arm_mesh + + mesh idle.ma -dest view + anim idle.ma -dest view_idle + anim lower_raise.ma -range 1 6 -dest lower + anim lower_raise.ma -range 11 18 -dest raise + anim attack_start_loop_end.ma -range 1 8 -dest attack_start + anim attack_start_loop_end.ma -range 8 23 -dest attack_loop + anim attack_start_loop_end.ma -range 23 32 -dest attack_end +} + +export gauntlet_strogg +{ + options -prefix GAUNTLET_ -scale .4 -sourcedir work/models/weapons/strogg_gauntlet/animations -destdir models/weapons/gauntlet + addoptions -skipmesh rt_arm_mesh + addoptions -skipmesh lft_arm_mesh + + mesh idle.ma -dest view_strogg +} + +export gauntlet +{ + options -prefix PLAYER_GNT_ -scale .4 -keep ATTACHER -sourcedir work/models/characters/marine/multiplayer -destdir models/weapons/gauntlet/world -rename ATTACHER origin -clearorigin + mesh idle.ma -dest gauntlet + anim idle.ma -dest idle + anim idle.ma -dest fire +} + +entityDef viewStyle_shouldered_gauntlet { + "viewangles" "0 0 0" + "viewoffset" "0 0 0" +} + +entityDef viewStyle_q3_gauntlet { + "viewangles" "-2.8 -5 2.4" + "viewoffset" "-1.2 2.1 0.3" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Weapon Defintion +//-------------------------------------------------------------------------------------------------------------------0 + +entityDef weapon_gauntlet +{ + "editor_menu" "pickup" + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + + "editor_usage" "Gauntlet" + + "modelindex" "MODELINDEX_GAUNTLET" + + "spawnclass" "idItem" + "weaponclass" "rvWeaponGauntlet" + "weaponname" "Gauntlet" + "size" "32 32 32" + + "model_view" "weapon_gauntlet_view" + "model_view_strogg" "weapon_gauntlet_view_strogg" + "model_world" "weapon_gauntlet_world" + "model" "models/weapons/gauntlet/gauntlet.lwo" + + "joint_attach" "GNT_ATTACHER" + +// "joint_attach" "PST_ATTACHER" +// "joint_view_flashlight" "barrel" +// "joint_view_flash" "barrel" +// "joint_world_flash" "muzzle_flash" + + "inv_weapon" "weapon_gauntlet" + "inv_item" "5" + "inv_icon" "gfx/guis/hud/icons/item_gauntlet_colored" + "mtr_simple_icon" "simpleicons/item_gauntlet_colored" + "simple_icon_scale" "32.0" + "inv_name" "#str_107402" + + "clipSize" "0" + "ammoRequired" "0" + "ammoType" "ammo_none" + + "weaponAngleOffsetAverages" "10" + "weaponAngleOffsetScale" ".25" + "weaponAngleOffsetMax" "10" + "weaponOffsetTime" "600" + "weaponOffsetScale" "0.003" + + "mtr_crosshair" "gfx/guis/crosshairs/crosshair_gauntlet" + "mtr_icon" "gfx/guis/hud/icons/gun_gauntlet" + + "foreshorten" ".65" + + // -------------------- Recoil and Muzzle Kick --------------------------------------- + + "muzzle_kick_time" "0.1" + "muzzle_kick_maxtime" "0.2" + "muzzle_kick_angles" "-5 0 0" + "muzzle_kick_offset" "2 0 0" + + "recoilTime" "100" + "recoilAngles" "-2 0 0" + + // ---------------------------- Muzzle Flash --------------------------------------- + + "mtr_flashShader" "lights/muzzleflash" + "flashColor" "0.7 0.8 1" + "flashRadius" "200" + "flashPointLight" "1" + "flashTime" ".1" + "flashViewOffset" "15 5 -10" + + "def_viewStyle" "viewStyle_q3_gauntlet" + "def_viewStyle1" "viewStyle_shouldered_gauntlet" + + "snd_acquire" "pickup_weapon" + "snd_blade_fast" "generic_laser_coupling_spin_fast" +// "snd_blade_slow" "generic_laser_coupling_spin_slow" + + "snd_spin_up" "weapon_gauntlet_spinup" + "snd_spin_down" "weapon_gauntlet_spindown" + "snd_spin_loop" "weapon_gauntlet_spin" + "snd_spin_wall" "weapon_gauntlet_wall" + "snd_spin_flesh" "weapon_gauntlet_flesh" + + "joint_blade" "center" + "blade_spinfast" "900 0 0" + "blade_spinslow" "90 0 0" + "blade_accel" ".25" + + "def_damage" "damage_gauntlet" + "fx_impact" "effects/weapons/gauntlet/impact.fx" + "fx_impact_flesh" "effects/weapons/gauntlet/impact_flesh.fx" + "fx_impact_monstermetal" "effects/weapons/gauntlet/impact_monstermetal.fx" + "range" "48" + "fireRate" ".4" + + "has_windup" "1" + "snd_hit" "weapon_mp_gauntlet_impact" +} + +entityDef weapon_gauntlet_mp +{ + "inherit" "weapon_gauntlet" + "muzzle_kick_time" "0" + "muzzle_kick_maxtime" "0" + "muzzle_kick_angles" "0 0 0" + "muzzle_kick_offset" "0 0 0" + "recoilTime" "0" + "recoilAngles" "0 0 0" + "range" "50" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Models +//-------------------------------------------------------------------------------------------------------------------- + +model weapon_gauntlet_view +{ + mesh models/weapons/gauntlet/view.md5mesh + anim idle models/weapons/gauntlet/view_idle.md5anim + anim lower models/weapons/gauntlet/lower.md5anim + anim raise models/weapons/gauntlet/raise.md5anim + anim attack_start models/weapons/gauntlet/attack_start.md5anim + { + frame 1 sound_weapon scientist_weapon_move + } + anim attack_loop models/weapons/gauntlet/attack_loop.md5anim + anim attack_end models/weapons/gauntlet/attack_end.md5anim + { + frame 1 sound_weapon scientist_weapon_move + } +} + +model weapon_gauntlet_view_strogg +{ + inherit weapon_gauntlet_view + mesh models/weapons/gauntlet/view_strogg.md5mesh +} + +model weapon_gauntlet_world +{ + mesh models/weapons/gauntlet/world/gauntlet.md5mesh + anim idle models/weapons/gauntlet/world/idle.md5anim + anim fire models/weapons/gauntlet/world/fire.md5anim +} + +entityDef damage_gauntlet +{ + "damage" "50" + "gib" "1" + + "dv_time" "100" + "dv_scale" ".05" + + "deathPush" "200" + "deathPushMin" "2000 400" + "deathPushMax" "4000 500" + "knockback" "50" + + "bleed" "1" +} + diff --git a/q4base/def/weapons/grenadelauncher.def b/q4base/def/weapons/grenadelauncher.def new file mode 100644 index 00000000..9452d8b9 --- /dev/null +++ b/q4base/def/weapons/grenadelauncher.def @@ -0,0 +1,340 @@ +//---------------------------------------------------------------- +// grenadelauncher.def +// +// Copyright 2002-2004 Raven Software +//---------------------------------------------------------------- + +export grenadelauncher +{ + options -prefix NADE_ -scale .4 -keep barrel -sourcedir work/models/weapons/strogg_grenade_launcher/animations -destdir models/weapons/grenadelauncher + + addoptions -skipmesh rt_strogg_arm_mesh + addoptions -skipmesh lft_strogg_arm_mesh + + mesh NADE_idle.ma -dest mesh + anim NADE_idle.ma -dest idle + anim NADE_idle_empty.ma -dest idle_empty + anim NADE_fire_00.ma -dest fire + anim NADE_fire_empty.ma -dest fire_empty + anim NADE_lower.ma -dest lower + anim NADE_raise.ma -dest raise + anim NADE_reload.ma -dest reload +} + +export grenadelauncher_strogg +{ + options -prefix NADE_ -scale .4 -keep barrel -sourcedir work/models/weapons/strogg_grenade_launcher/animations -destdir models/weapons/grenadelauncher + addoptions -skipmesh rt_arm_mesh + addoptions -skipmesh lft_arm_mesh + mesh NADE_idle.ma -dest mesh_strogg +} + + +export grenadelauncher +{ + options -prefix PLAYER_GN_ -scale .4 -keep muzzle_flash ATTACHER -sourcedir work/models/characters/marine/multiplayer -destdir models/weapons/grenadelauncher/world -rename ATTACHER origin -clearorigin + mesh grenadelauncher_idle.ma -dest grenadelauncher + anim grenadelauncher_idle.ma -dest idle +} + +entityDef viewStyle_shouldered_grenadelauncher { + "viewoffset" "-3.2 2.0 0.0" + "viewangles" "-10.0 4.6 -1.1" +} + +entityDef viewStyle_q3_grenadelauncher { + "viewoffset" "-3.2 0.3 0.0" + "viewangles" "-9.7 4.6 -1.1" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Weapon Definition +//-------------------------------------------------------------------------------------------------------------------- +entityDef weapon_grenadelauncher +{ + "editor_menu" "pickup" + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + + "editor_usage" "Grenade Launcher" + + "spawnclass" "idItem" + "weaponclass" "rvWeaponGrenadeLauncher" + "size" "32 32 32" + "model_view" "weapon_grenadelauncher_view" + "model_view_strogg" "weapon_grenadelauncher_view_strogg" + "model_world" "weapon_grenadelauncher_world" + "model" "models/weapons/grenadelauncher/w_gl.lwo" + "def_dropItem" "weapon_grenadelauncher" + "mtr_crosshair" "gfx/guis/crosshairs/crosshair_grenadelauncher" + + "joint_attach" "GN_ATTACHER" + "joint_view_flash" "barrel" + "joint_view_barrel" "barrel" + "joint_world_flash" "muzzle_flash" + + "fireRate" ".8" + "spread" "0" + + // the direction of projectile launches will be modified by this + "dirOffset" "0 0 .2" + + "inv_weapon" "weapon_grenadelauncher" + "inv_start_ammo_grenadelauncher" "10" + "inv_item" "1" + "inv_icon" "gfx/guis/hud/icons/item_grenade.tga" + "inv_name" "#str_107403" + + "weaponname" "Grenade Launcher" + "def_projectile" "projectile_grenade" + "ammoType" "ammo_grenadelauncher" + "clipSize" "8" + "ammoRequired" "1" + "mtr_icon" "gfx/guis/hud/icons/gun_grenadelauncher" + + "ammoRegenStep" "1" + "ammoRegenTime" "2000" + + "muzzle_kick_time" "0.8" + "muzzle_kick_maxtime" "0.8" + "muzzle_kick_angles" "-4 0 0" + "muzzle_kick_offset" "2 0 1" + + "recoilTime" "500" + "recoilAngles" "-.20 0 0" + + "mtr_flashShader" "lights/muzzleflash" + "flashColor" "0.99 0.84 .31" + "flashRadius" "200" + "flashPointLight" "1" + "flashTime" ".1" + "flashViewOffset" "15 -5 -5" + + "mtr_guiLightShader" "lights/viewWeaponGuiLight" + + "fx_muzzleflash" "effects/weapons/grenadelauncher/muzzleflash.fx" + "fx_muzzleflash_world" "effects/weapons/grenadelauncher/muzzleflash.fx" + "fx_respawn" "effects/mp/itemrespawn.fx" + + "snd_acquire" "pickup_weapon" + "snd_quaddamage" "weapon_quaddamage_fire" + "snd_noAmmo" "weapon_grenadelauncher_dryfire" + + "def_viewStyle" "viewStyle_q3_grenadelauncher" + "def_viewStyle1" "viewStyle_shouldered_grenadelauncher" + + "weaponAngleOffsetAverages" "10" + "weaponAngleOffsetScale" ".25" + "weaponAngleOffsetMax" "5" + "weaponOffsetTime" "600" + "weaponOffsetScale" "0.002" + +// "launchFromBarrel" "1" + "foreshorten" ".55" + + "net_syncPhysics" "1" +} + +entityDef weapon_grenadelauncher_mp +{ + "inherit" "weapon_grenadelauncher" + "clipsize" "0" + "editor_ignore" "1" + "inv_icon" "gfx/guis/hud/icons/item_grenade_colored" + "mtr_simple_icon" "simpleicons/item_grenade_colored" + "simple_icon_scale" "32.0" + "triggerSize" "32" + + "muzzle_kick_time" "0" + "muzzle_kick_maxtime" "0" + "muzzle_kick_angles" "0 0 0" + "muzzle_kick_offset" "0 0 0" + "recoilTime" "0" + "recoilAngles" "0 0 0" + + "respawn_Team DM" "30" + "respawn_Tourney" "15" + + // played when you touch a weapon you can't acquire, i.e. weaponStay in MP + "snd_noAcquire" "pickup_weaponstay" +} + +entityDef moveable_item_grenadelauncher +{ + "inherit" "weapon_grenadelauncher" + + "editor_rotatable" "1" + + "itemclipmodel" "models/weapons/grenadelauncher/w_gl_clip.lwo" + + "spawnclass" "idMoveableItem" + "mass" "4000" + "density" "0.05" + "friction" "0.2" + "bouncyness" "0" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Models +//-------------------------------------------------------------------------------------------------------------------- + +model weapon_grenadelauncher_view +{ + mesh models/weapons/grenadelauncher/mesh.md5mesh +// skin skins/weapons/strogg_rocket_launcher/nobounce + + anim idle models/weapons/grenadelauncher/idle.md5anim + anim idle_empty models/weapons/grenadelauncher/idle_empty.md5anim + anim fire models/weapons/grenadelauncher/fire.md5anim + { + frame 1 sound_weapon player_grenadelauncher_fire + frame 1 sound_item player_grenadelauncher_fire_stereo + } + anim fire_empty models/weapons/grenadelauncher/fire_empty.md5anim + { + frame 1 sound_weapon player_grenadelauncher_fire + frame 1 sound_item player_grenadelauncher_fire_stereo + } + anim raise models/weapons/grenadelauncher/raise.md5anim + anim putaway models/weapons/grenadelauncher/lower.md5anim + { + frame 1 sound_weapon weapon_switch + } + anim reload models/weapons/grenadelauncher/reload.md5anim + { + frame 2 sound_weapon player_grenadelauncher_clipout + frame 25 sound_weapon player_grenadelauncher_clipin + } +} + +model weapon_grenadelauncher_view_strogg +{ + inherit weapon_grenadelauncher_view + mesh models/weapons/grenadelauncher/mesh_strogg.md5mesh +} + +model weapon_grenadelauncher_world +{ + mesh models/weapons/grenadelauncher/world/grenadelauncher.md5mesh + anim idle models/weapons/grenadelauncher/world/idle.md5anim +} + +//-------------------------------------------------------------------------------------------------------------------- +// Mods +//-------------------------------------------------------------------------------------------------------------------- + + +//-------------------------------------------------------------------------------------------------------------------- +// Projectile +//-------------------------------------------------------------------------------------------------------------------- + +entityDef projectile_grenade +{ + "spawnclass" "idProjectile" + "mins" "-4 -4 -4" + "maxs" "4 4 4" + "cone" "" + "noshadows" "1" + "clipmask_largeshot" "1" + + "no_contents" "0" + + "model" "models/weapons/grenadelauncher/w_grenade.lwo" + "def_damage" "damage_grenadeDirect" + "def_splash_damage" "damage_grenadeSplash" + + "speed" "700" + "angular_velocity" "-10 5 1" + "settle_duration" "0.08" + + "linear_friction" "0" + "angular_friction" "0" + "contact_friction" "10" + "bounce" ".65" + "gravity" "1" + "fuse" "2.5" + + "detonate_on_fuse" "1" + "detonate_on_death" "0" + "detonate_on_world" "0" + "detonate_on_actor" "1" + "detonateTestGroundMaterial" "1" + + "impact_gib" "1" + "decal_size" "75" + + "flyEffectAttenuateSpeed" "200" + + "airBurst_desc" "midair_" + + "fx_fly" "effects/weapons/grenadelauncher/trail.fx" + "fx_fly_mp" "effects/weapons/grenadelauncher/trail_mp.fx" + "fx_detonate" "effects/weapons/grenadelauncher/detonate.fx" + "fx_detonate_mp" "effects/weapons/rocketlauncher/detonate_mp.fx" + "fx_impact" "effects/weapons/grenadelauncher/impact.fx" + "fx_impact_mp" "effects/weapons/rocketlauncher/impact_mp.fx" + "fx_impact_concrete" "effects/weapons/grenadelauncher/impact_concrete.fx" + "fx_impact_concrete_mp" "effects/weapons/rocketlauncher/impact_mp.fx" + "fx_impact_rock" "effects/weapons/grenadelauncher/impact_concrete.fx" + "fx_impact_rock_mp" "effects/weapons/rocketlauncher/impact_mp.fx" + "fx_impact_water" "effects/ambient/splash_med.fx" + + "friendly_impact" "1" + + "snd_ricochet" "grenade_bounce" + + "net_syncPhysics" "1" + + "fx_teleport_enter" "effects/mp/item_teleport.fx" + "fx_teleport" "effects/mp/item_teleport.fx" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Damage +//-------------------------------------------------------------------------------------------------------------------- + +entityDef damage_grenadeDirect +{ + "damage" "125" + "gib" "1" + + "deathPush" "200" + "deathPushMin" "3000 2000" + "deathPushMax" "5000 3000" + + "pain" "concussive" + + "cower" "1" +} + +entityDef damage_grenadeDirect_mp +{ + "inherit" "damage_grenadeDirect" + "damage" "100" + "knockback" "100" +} + +entityDef damage_grenadeSplash +{ + "damage" "200" + "radius" "250" + "knockback" "100" + "push" "10000" + "gib" "0" + + "deathPush" "100" + "deathPushMin" "7000 9000" + "deathPushMax" "10000 12000" + + "pain" "concussive" + + "cower" "1" +} + +entityDef damage_grenadeSplash_mp +{ + "inherit" "damage_grenadeSplash" + "damage" "100" + "radius" "150" +} diff --git a/q4base/def/weapons/hyperblaster.def b/q4base/def/weapons/hyperblaster.def new file mode 100644 index 00000000..ab654559 --- /dev/null +++ b/q4base/def/weapons/hyperblaster.def @@ -0,0 +1,358 @@ +//---------------------------------------------------------------- +// hyperblaster.def +// +// Copyright 2002-2004 Raven Software +//---------------------------------------------------------------- + +export hyperblaster +{ + options -prefix HYPR_BLASTER_ -scale .4 -keep barrel + //-keep flashlight -parent lft_wrst body + + addoptions -skipmesh rt_strogg_arm_mesh + addoptions -skipmesh lft_strogg_arm_mesh + + mesh work/models/weapons/marine_hyper_blaster/animations/hyper_blaster_idle.ma -dest models/weapons/hyperblaster/mesh + anim work/models/weapons/marine_hyper_blaster/animations/hyper_blaster_idle.ma -dest models/weapons/hyperblaster/idle + anim work/models/weapons/marine_hyper_blaster/animations/hyper_blaster_fire.ma -dest models/weapons/hyperblaster/fire + anim work/models/weapons/marine_hyper_blaster/animations/hyper_blaster_raise.ma -dest models/weapons/hyperblaster/raise + anim work/models/weapons/marine_hyper_blaster/animations/hyper_blaster_lower.ma -dest models/weapons/hyperblaster/lower + anim work/models/weapons/marine_hyper_blaster/animations/hyper_blaster_reload.ma -dest models/weapons/hyperblaster/reload +} + +export hyperblaster_strogg +{ + options -prefix HYPR_BLASTER_ -scale .4 -keep barrel + addoptions -skipmesh rt_arm_mesh + addoptions -skipmesh lft_arm_mesh + mesh work/models/weapons/marine_hyper_blaster/animations/hyper_blaster_idle.ma -dest models/weapons/hyperblaster/mesh_strogg +} + +export hyperblaster +{ + options -prefix PLAYER_HB_ -scale .4 -keep muzzle_flash ATTACHER -sourcedir work/models/characters/marine/multiplayer -destdir models/weapons/hyperblaster/world -rename ATTACHER origin -clearorigin + mesh hyperblaster_idle.ma -dest hyperblaster + anim hyperblaster_idle.ma -dest idle +} + +entityDef viewStyle_shouldered_hyperblaster { + "viewoffset" "-6.75 2.5 1.5" + "viewangles" "-1.6 2 6.2" +} + +entityDef viewStyle_q3_hyperblaster { + "viewoffset" "-5.4 0.6 1.5" + "viewangles" "-1.6 2.5 6.2" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Weapon Definition +//-------------------------------------------------------------------------------------------------------------------- + +entityDef weapon_hyperblaster +{ + "editor_menu" "pickup" + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + + "editor_usage" "HyperBlaster" + + "modelindex" "MODELINDEX_MACHINEGUN" + + "spawnclass" "idItem" + "weaponclass" "rvWeaponHyperblaster" + "size" "32 32 32" + "model_view" "weapon_hyperblaster_view" + "model_view_strogg" "weapon_hyperblaster_view_strogg" + "model_world" "weapon_hyperblaster_world" + "model" "models/weapons/hyperblaster/w_hb.lwo" + "def_dropItem" "weapon_hyperblaster" + "def_projectile" "projectile_hyperblaster" + + "joint_attach" "HB_ATTACHER" + "joint_view_guiLight" "body" + "joint_view_flash" "barrel" + "joint_world_flash" "muzzle_flash" + "joint_view_battery" "ammo_can" + + "mtr_crosshair" "gfx/guis/crosshairs/crosshair_blaster" + "crosshairOffsetX" "0" + "crosshairOffsetY" "0" + + "fireRate" ".08" + "spread" "2" + "spread_mp" "0" + + "inv_weapon" "weapon_hyperblaster" + "inv_item" "1" + "inv_icon" "gfx/guis/hud/icons/item_hyperblaster.tga" + "inv_name" "#str_107404" + + "weaponname" "HyperBlaster" + "ammoType" "ammo_hyperblaster" + "inv_start_ammo_hyperblaster" "60" + "ammoRegenStep" "5" + "ammoRegenTime" "1500" + "clipSize" "60" // large for smooth regen + "ammoRequired" "1" // ammo is handled in the script file + "gui" "guis/weapons/hyperblaster_ammo.gui" + "mtr_icon" "gfx/guis/hud/icons/gun_hyperblaster" + + "muzzle_kick_time" "0.1" + "muzzle_kick_maxtime" "0.15" + "muzzle_kick_angles" "-1 0 0" + "muzzle_kick_offset" "1 .15 0" + + "recoilTime" "100" + "recoilAngles" "1 0 0" + + "mtr_flashShader" "lights/muzzleflash" + "flashColor" "0.7 0.8 1" + "flashRadius" "200" + "flashPointLight" "1" + "flashTime" ".1" + "flashViewOffset" "15 -2 5" + + "mtr_guiLightShader" "lights/viewWeaponGuiLight" + "glightRadius" "1.3" + "glightOffset" "0 2 0" + + "snd_quaddamage" "weapon_quaddamage_fire" + "snd_acquire" "pickup_weapon" + "snd_battery_spinup" "weapon_hyperblaster_spinup" + "snd_battery_spindown" "weapon_hyperblaster_spindown" + "snd_battery_spin" "weapon_hyperblaster_spinfast" + "snd_noAmmo" "weapon_hyperblaster_dryfire" + + "fx_muzzleflash" "effects/weapons/hyperblaster/muzzleflash.fx" + "fx_muzzleflash_world" "effects/weapons/hyperblaster/muzzleflash.fx" + "fx_respawn" "effects/mp/itemrespawn.fx" + + "def_viewStyle" "viewStyle_q3_hyperblaster" + "def_viewStyle1" "viewStyle_shouldered_hyperblaster" + + "weaponAngleOffsetAverages" "10" + "weaponAngleOffsetScale" ".05" + "weaponAngleOffsetMax" "1" + "weaponOffsetTime" "600" + "weaponOffsetScale" "0.001" + +// "launchFromBarrel" "1" + "foreshorten" ".65" + "hidesurface" "models/weapons/hyperblaster/battery1" + + "def_mod1" "wpmod_hyperblaster_bounce1" + + "net_syncPhysics" "1" +} + +entityDef weapon_hyperblaster_mp +{ + "inherit" "weapon_hyperblaster" + "clipsize" "0" + "editor_ignore" "1" + "inv_icon" "gfx/guis/hud/icons/item_hyperblaster_colored" + "mtr_simple_icon" "simpleicons/item_hyperblaster_colored" + "simple_icon_scale" "32.0" + "triggerSize" "32" + + "muzzle_kick_time" "0" + "muzzle_kick_maxtime" "0" + "muzzle_kick_angles" "0 0 0" + "muzzle_kick_offset" "0 0 0" + "recoilTime" "0" + "recoilAngles" "0 0 0" + + "respawn_Team DM" "30" + "respawn_Tourney" "15" + + // played when you touch a weapon you can't acquire, i.e. weaponStay in MP + "snd_noAcquire" "pickup_weaponstay" + + "fireRate" ".07" +} + +entityDef moveable_item_hyperblaster +{ + "inherit" "weapon_hyperblaster" + + "editor_rotatable" "1" + + "itemclipmodel" "models/weapons/hyperblaster/w_hb_clip.lwo" + + "spawnclass" "idMoveableItem" + "mass" "3000" + "density" "0.05" + "friction" "0.2" + "bouncyness" "0" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Models +//-------------------------------------------------------------------------------------------------------------------- + +model weapon_hyperblaster_view +{ + mesh models/weapons/hyperblaster/mesh.md5mesh + + skin skins/weapons/hyperblaster/nobounce + + anim idle models/weapons/hyperblaster/idle.md5anim + anim fire models/weapons/hyperblaster/fire.md5anim + { + frame 1 sound_weapon weapon_hyperblaster_fire + frame 1 sound_item weapon_hyperblaster_fire_stereo + } + anim reload models/weapons/hyperblaster/reload.md5anim + { + frame 1 sound_weapon weapon_hyperblaster_cell_out + frame 21 sound_item weapon_hyperblaster_cell_in + frame 34 sound_weapon weapon_hyperblaster_close + } + anim raise models/weapons/hyperblaster/raise.md5anim + anim putaway models/weapons/hyperblaster/lower.md5anim + { + frame 1 sound_weapon weapon_switch + } +} + +model weapon_hyperblaster_view_strogg +{ + inherit weapon_hyperblaster_view + mesh models/weapons/hyperblaster/mesh_strogg.md5mesh +} + +model weapon_hyperblaster_world +{ + mesh models/weapons/hyperblaster/world/hyperblaster.md5mesh + anim idle models/weapons/hyperblaster/world/idle.md5anim +} + +//-------------------------------------------------------------------------------------------------------------------- +// Mods +//-------------------------------------------------------------------------------------------------------------------- + +entityDef wpmod_hyperblaster_bounce1 +{ + "weapon" "weapon_hyperblaster" + "def_projectile" "projectile_hyperblaster_bounce1" + "mod_showsurface" "models/weapons/hyperblaster/battery2" + "mod_hidesurface" "models/weapons/hyperblaster/battery3" +} + +entityDef weaponmod_hyperblaster_bounce1 +{ + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + "editor_menu" "pickup" + "editor_usage" "HyperBlaster Bounce I Modification" + + "spawnclass" "idItem" + "size" "32 32 32" + "inv_weaponmod" "wpmod_hyperblaster_bounce1" + "inv_ammo_hyperblaster" "40" + "inv_item" "1" + "inv_icon" "gfx/guis/hud/icons/item_hyperblaster.tga" + "inv_name" "#str_107432" + "model" "models/items/ammo/ammo_box.lwo" + + "net_syncPhysics" "1" +} + +entityDef weaponmod_hyperblaster_bounce2 +{ + "inherit" "weaponmod_hyperblaster_bounce1" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Projectile +//-------------------------------------------------------------------------------------------------------------------- + +entityDef damage_hyperblaster +{ + "inherit" "damage_blaster" + "damage" "14" + + "deathPush" "100" + "deathPushMin" "3000 350" + "deathPushMax" "5000 500" +} + +entityDef damage_hyperblaster_mp +{ + "inherit" "damage_hyperblaster" + "knockback" "14" +} + +entityDef damage_hyperblaster_splash +{ + "damage" "10" + "radius" "35" + "knockback" "5" + "push" "0" + "gib" "0" + + "deathPush" "100" + "deathPushMin" "2000 350" + "deathPushMax" "4000 500" +} + +entityDef damage_hyperblaster_splash_mp +{ + "inherit" "damage_hyperblaster_splash" + "knockback" "10" +} + +entityDef projectile_hyperblaster +{ + "inherit" "projectile_blaster" + + "size" "3 3 3" + "cone" "2" + "clipmask_largeshot" "0" + "def_damage" "damage_hyperblaster" + + "speed" "1800" + "orient_towards_motion" "1" + + "fx_impact" "effects/weapons/hyperblaster/impact_default.fx" + "fx_fly" "effects/weapons/hyperblaster/fly.fx" + "fx_impact_concrete" "effects/weapons/hyperblaster/impact_concrete.fx" + "fx_impact_rock" "effects/weapons/hyperblaster/impact_concrete.fx" + "fx_impact_glass" "effects/weapons/hyperblaster/impact_glass.fx" + "fx_impact_bpglass" "effects/weapons/hyperblaster/impact_bpglass.fx" + "fx_impact_electronics" "effects/weapons/hyperblaster/impact_electronics.fx" + "fx_impact_flesh" "effects/weapons/hyperblaster/impact_flesh.fx" + "fx_impact_monstermetal" "effects/weapons/hyperblaster/impact_flesh.fx" + "fx_trail" "" + "fx_impact_mp" "effects/weapons/hyperblaster/impact_default_mp.fx" + "fx_impact_concrete_mp" "effects/weapons/hyperblaster/impact_default_mp.fx" + "fx_impact_rock_mp" "effects/weapons/hyperblaster/impact_default_mp.fx" + "fx_impact_glass_mp" "effects/weapons/hyperblaster/impact_default_mp.fx" + "fx_impact_bpglass_mp" "effects/weapons/hyperblaster/impact_default_mp.fx" + "fx_impact_electronics_mp" "effects/weapons/hyperblaster/impact_default_mp.fx" + + "fx_teleport_enter" "effects/mp/item_teleport.fx" + "fx_teleport" "effects/mp/item_teleport.fx" +} + +entityDef projectile_hyperblaster_mp +{ + "inherit" "projectile_hyperblaster" + "def_splash_damage" "damage_hyperblaster_splash" + "speed" "1950" + "no_impact_prediction" "1" +} + +entityDef projectile_hyperblaster_bounce1 +{ + "inherit" "projectile_hyperblaster" + "detonate_on_world" "0" + "bounce" "1" + "bounce_count" "1" + "bounce_center" "1" + + "fx_bounce" "effects/weapons/hyperblaster/bounce_default.fx" +} diff --git a/q4base/def/weapons/lightninggun.def b/q4base/def/weapons/lightninggun.def new file mode 100644 index 00000000..89c0673d --- /dev/null +++ b/q4base/def/weapons/lightninggun.def @@ -0,0 +1,324 @@ +//---------------------------------------------------------------- +// lightninggun.def +// +// Copyright 2002-2004 Raven Software +//---------------------------------------------------------------- + +export lightning_gun +{ + options -prefix LIGNTNING_ -scale .4 -keep barrel spire_1 spire_2 spire_3 spire_4 -sourcedir work/models/weapons/strogg_lightning_gun/animations -destdir models/weapons/lightning_gun + + addoptions -skipmesh rt_strogg_arm_mesh + addoptions -skipmesh lft_strogg_arm_mesh + + mesh idle_00.ma -dest mesh + anim idle_00.ma -dest idle + anim lower.ma -dest lower + anim raise.ma -dest raise + anim shoot_start.ma -dest shoot_start + anim shoot_loop.ma -dest shoot_loop + anim shoot_end.ma -dest shoot_end +} + +export lightning_gun_strogg +{ + options -prefix LIGNTNING_ -scale .4 -keep barrel spire_1 spire_2 spire_3 spire_4 -sourcedir work/models/weapons/strogg_lightning_gun/animations -destdir models/weapons/lightning_gun + addoptions -skipmesh rt_arm_mesh + addoptions -skipmesh lft_arm_mesh + mesh idle_00.ma -dest mesh_strogg +} + +export lightning_gun +{ + options -prefix PLAYER_LG_ -scale .4 -keep muzzle_flash ATTACHER -sourcedir work/models/characters/marine/animation_mocap_cinematics -destdir models/weapons/lightning_gun/world -rename ATTACHER origin -clearorigin + mesh newMarine_oneframe_idle.ma -dest lightninggun + anim newMarine_oneframe_idle.ma -dest idle +} + +entityDef viewStyle_q3_lightninggun { + "viewoffset" "0 -1.7 1" + "viewangles" "-7.4 8.5 9.8" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Weapon Definition +//-------------------------------------------------------------------------------------------------------------------- +entityDef weapon_lightninggun +{ + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + + "editor_usage" "Lightning Gun" + "editor_menu" "pickup" + "editor_var inv_weaponmod" "comma separated of any of the following lightning gun modifications.\n - weapon_lightninggun_chain" + + "spawnclass" "idItem" + "weaponclass" "rvWeaponLightningGun" + "size" "32 32 32" + "model_view" "weapon_lightninggun_view" + "model_view_strogg" "weapon_lightninggun_view_strogg" + "model_world" "weapon_lightninggun_world" + "model" "models/weapons/lightning_gun/w_lg.lwo" + "def_dropItem" "weapon_lightninggun" + + "chainLightningRange" "0 0" + + "fireRate" ".05" + "spread" "1" + "range" "1600" + + "joint_attach" "LG_ATTACHER" + "joint_view_flash" "barrel" + "joint_world_flash" "muzzle_flash" + +// "joint_hideGun_flash" "GNT_ATTACHER" + "joint_hideGun_flash" "waist" + + "inv_weapon" "weapon_lightninggun" + "inv_start_ammo_lightninggun" "100" + "inv_item" "1" + "inv_icon" "gfx/guis/hud/icons/item_lightning.tga" + "inv_name" "#str_107405" + + "mtr_crosshair" "gfx/guis/crosshairs/crosshair_lightninggun" + "ammoType" "ammo_lightninggun" + "ammoRequired" "1" + "clipSize" "0" + "lowAmmo" "10" + "mtr_icon" "gfx/guis/hud/icons/gun_lightninggun" + + "muzzle_kick_time" "0.1" + "muzzle_kick_maxtime" "0.5" + "muzzle_kick_angles" "-3 0 0" + "muzzle_kick_offset" "0.5 .15 .15" + + "recoilTime" "145" + "recoilAngles" "-1 0 0" + + "def_damage" "damage_lightninggun" + + "ammoRegenStep" "5" + "ammoRegenTime" "1500" + + // Mapping of modifications to indexes + "def_mod1" "wpmod_lightninggun_chain" + + "foreshorten" ".6" + + "mtr_flashShader" "lights/muzzleflash" + "flashColor" ".5 .8 1" + "flashRadius" "200" + "flashPointLight" "1" + "flashTime" ".1" + "flashViewOffset" "15 -5 -5" + + "snd_quaddamage" "weapon_quaddamage_fire" + "snd_acquire" "pickup_weapon" + "snd_fire" "weapon_lightninggun_fire" + "snd_fire_stereo" "weapon_lightninggun_fire_stereo" + "snd_fire_loop" "weapon_lightninggun_fireloop" + + "def_viewStyle" "viewStyle_q3_lightninggun" + + "weaponAngleOffsetAverages" "10" + "weaponAngleOffsetScale" ".25" + "weaponAngleOffsetMax" "5" + "weaponOffsetTime" "600" + "weaponOffsetScale" "0.002" + + "fx_impact" "effects/weapons/lightninggun/impact.fx" + "fx_impact_mp" "effects/weapons/lightninggun/impact_mp.fx" +// "fx_impact_water" "effects/ambient/splash_med.fx" + "fx_trail" "effects/weapons/lightninggun/trail.fx" + "fx_trail_world" "effects/weapons/lightninggun/trail_world.fx" + "fx_crawl" "effects/weapons/lightninggun/crawl.fx" + "fx_spire" "effects/weapons/lightninggun/spire.fx" +// "fx_flash" "effects/weapons/lightninggun/muzzleflash.fx" +// "fx_flash_world" "effects/weapons/lightninggun/muzzleflash_world.fx" + "fx_respawn" "effects/mp/itemrespawn.fx" + "crawlTime" ".05" + + // ------------------------ Ammo Tubes --------------------------------------- + + "joint_tube_0" "tube_1" + "joint_tube_1" "tube_2" + "joint_tube_2" "tube_3" + "tubeTime" "1" + "tubeOffset" "1" + "fx_tube" "effects/weapons/lightninggun/tube.fx" + + "snd_tube" "weapon_lightninggun_tube" + "snd_noAmmo" "weapon_lightninggun_dryfire" + + "net_syncPhysics" "1" +} + +entityDef moveable_item_lightning_gun +{ + "inherit" "weapon_lightninggun" + + "editor_rotatable" "1" + + "itemclipmodel" "models/weapons/lightning_gun/w_lg_clip.lwo" + + "spawnclass" "idMoveableItem" + "mass" "3000" + "density" "0.05" + "friction" "0.2" + "bouncyness" "0" +} + +entityDef weapon_lightninggun_mp +{ + "inherit" "weapon_lightninggun" + "inv_icon" "gfx/guis/hud/icons/item_lightning_colored" + "mtr_simple_icon" "simpleicons/item_lightning_colored" + "simple_icon_scale" "32.0" + "triggerSize" "32" + + "range" "736" // q3a value is 768 + "fireRate" "0.04" + "fx_trail_noimpact" "effects/weapons/lightninggun/trail_noimpact.fx" + + "muzzle_kick_time" "0" + "muzzle_kick_maxtime" "0" + "muzzle_kick_angles" "0 0 0" + "muzzle_kick_offset" "0 0 0" + "recoilTime" "0" + "recoilAngles" "0 0 0" + + "respawn_Team DM" "30" + "respawn_Tourney" "15" + + // played when you touch a weapon you can't acquire, i.e. weaponStay in MP + "snd_noAcquire" "pickup_weaponstay" + "snd_idle_hum" "weapon_lightninggun_hum" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Mods +//-------------------------------------------------------------------------------------------------------------------0 + +entityDef wpmod_lightninggun_chain +{ + + "weapon" "weapon_lightninggun" + "chainLightningRange" "200 400" +} + +entityDef weaponmod_lightninggun_chain +{ + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + "editor_menu" "pickup" + "editor_usage" "Lighting Gun Chain Lightning" + + "spawnclass" "idItem" + "size" "32 32 32" + "inv_weaponmod" "wpmod_lightninggun_chain" + "inv_ammo_lightninggun" "100" + "inv_item" "1" + "inv_icon" "gfx/guis/hud/icons/item_lightning.tga" + "inv_name" "#str_107434" + "model" "models/items/ammo/ammo_box.lwo" + + "net_syncPhysics" "1" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Models +//-------------------------------------------------------------------------------------------------------------------- + +model weapon_lightninggun_view +{ + mesh models/weapons/lightning_gun/mesh.md5mesh + anim idle models/weapons/lightning_gun/idle.md5anim + anim putaway models/weapons/lightning_gun/lower.md5anim + anim raise models/weapons/lightning_gun/raise.md5anim + anim shoot_start models/weapons/lightning_gun/shoot_start.md5anim + { + rate 10 + } + anim shoot_loop models/weapons/lightning_gun/shoot_loop.md5anim + anim shoot_end models/weapons/lightning_gun/shoot_end.md5anim + { + rate .25 + } +} + +model weapon_lightninggun_view_strogg +{ + inherit weapon_lightninggun_view + mesh models/weapons/lightning_gun/mesh_strogg.md5mesh +} + +model weapon_lightninggun_world +{ + mesh models/weapons/lightning_gun/world/lightninggun.md5mesh + anim idle models/weapons/lightning_gun/world/idle.md5anim +} + +//-------------------------------------------------------------------------------------------------------------------- +// HitScan +//-------------------------------------------------------------------------------------------------------------------0 + +entityDef hitscan_lightninggun +{ + "range" "10000" + "push" "10000" + + "def_damage" "damage_lightninggun" + +// "fx_impact" "effects/weapons/lightninggun/impact.fx" +// "fx_impact_water" "effects/ambient/splash_med.fx" +// "fx_path" "effects/weapons/lightninggun/trail.fx" +} + +entityDef hitscan_lightninggun_mp +{ + "inherit" "hitscan_lightninggun" + "range" "736" // q3a value is 768 + "def_damage" "damage_lightninggun_mp" + "inv_icon" "gfx/guis/hud/icons/item_lightning_colored" + "mtr_simple_icon" "simpleicons/item_lightning_colored" +} + + +//-------------------------------------------------------------------------------------------------------------------- +// Damage +//-------------------------------------------------------------------------------------------------------------------0 + +entityDef damage_lightninggun +{ + "damage" "11" +// "knockback" "10" + "gib" "1" + + "filter_electricity" "1" // can damage all entities with their damage_filter set to "electricity" + + "dv_time" "100" + "dv_scale" ".05" + + "fx_wound" "effects/wounds/energy.fx" + + "deathPush" "200" + "deathPushMin" "2000 400" + "deathPushMax" "4000 500" + + "bleed" "1" + + "pain" "stream" +} + +entityDef damage_lightninggun_mp +{ + "inherit" "damage_lightninggun" + "damage" "7" + "knockback" "11" +} + + + + diff --git a/q4base/def/weapons/machinegun.def b/q4base/def/weapons/machinegun.def new file mode 100644 index 00000000..49b7259b --- /dev/null +++ b/q4base/def/weapons/machinegun.def @@ -0,0 +1,481 @@ +//---------------------------------------------------------------- +// machinegun.def +// +// Copyright 2002-2004 Raven Software +//---------------------------------------------------------------- + +export machinegun +{ + options -prefix MACHINE_GUN_ -scale .4 -keep barrel_1 barrel_2 eject flashlight + + addoptions -skipmesh rt_strogg_arm_mesh + addoptions -skipmesh lft_strogg_arm_mesh + + mesh work/models/weapons/marine_machine_gun/animations/machinegun_mesh.ma -dest models/weapons/machinegun/view + anim work/models/weapons/marine_machine_gun/animations/machinegun_fire.ma -dest models/weapons/machinegun/fire + anim work/models/weapons/marine_machine_gun/animations/machinegun_idle.ma -dest models/weapons/machinegun/idle + anim work/models/weapons/marine_machine_gun/animations/machinegun_reload.ma -dest models/weapons/machinegun/reload + anim work/models/weapons/marine_machine_gun/animations/machinegun_raise_weapon.ma -dest models/weapons/machinegun/raise + anim work/models/weapons/marine_machine_gun/animations/machinegun_lower_weapon.ma -dest models/weapons/machinegun/lower + anim work/models/weapons/marine_machine_gun/animations/machinegun_flashlight.ma -dest models/weapons/machinegun/flashlight +} + +export machinegun_strogg +{ + options -prefix MACHINE_GUN_ -scale .4 -keep barrel_1 barrel_2 eject flashlight + addoptions -skipmesh rt_arm_mesh + addoptions -skipmesh lft_arm_mesh + mesh work/models/weapons/marine_machine_gun/animations/machinegun_mesh.ma -dest models/weapons/machinegun/view_strogg +} + +export machinegun +{ + options -prefix PLAYER_MG_ -scale .4 -keep ATTACHER stock_joint clip_joint muzzle_flash handle_joint -sourcedir work/models/characters/marine/multiplayer -destdir models/weapons/machinegun/world -rename ATTACHER origin -clearorigin +/* + addoptions -skipmesh body_mesh + addoptions -skipmesh head_mesh + addoptions -skipmesh Reye_mesh + addoptions -skipmesh Leye_mesh + addoptions -skipmesh teethUpper_mesh + addoptions -skipmesh teethLower_mesh +*/ + mesh idle.ma -dest machinegun_world + anim idle.ma -dest machinegun_idle + anim idle.ma -dest machinegun_reload + anim idle.ma -dest machinegun_fire1 +} + +entityDef viewStyle_shouldered_machinegun { + "viewoffset" "1.1 1.5 -1.0" + "viewangles" "-2.5 -9 -4.9" +} + +entityDef viewStyle_q3_machinegun { + "viewoffset" "1.1 -0.5 -1.0" + "viewangles" "-0.7 -7.4 -4.9" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Weapon Definition +//-------------------------------------------------------------------------------------------------------------------- + +entityDef weapon_machinegun +{ + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + + "editor_usage" "Machinegun" + "editor_menu" "pickup" + "editor_var inv_weaponmod" "comma separated of any of the following machinegun modifications.\n - wpmod_machinegun_ammo" + + "spawnclass" "idItem" + "weaponclass" "rvWeaponMachinegun" + "size" "32 32 32" + "model_view" "weapon_machinegun_view" + "model_view_strogg" "weapon_machinegun_view_strogg" + "model_world" "weapon_machinegun_world" + "model" "models/weapons/machinegun/w_mg_lo.lwo" + "def_dropItem" "weapon_machinegun" + "def_ejectBrass" "debris_brass_machinegun" + + "joint_attach" "MG_ATTACHER" + "joint_view_flash" "barrel_2" + "joint_view_flashlight" "flashlight" + "joint_view_guiLight" "gun_jt" + "joint_view_eject" "eject" + "joint_world_flash" "muzzle_flash" + + "inv_weapon" "weapon_machinegun" + "inv_start_ammo_machinegun" "40" + "inv_item" "1" + "inv_icon" "gfx/guis/hud/icons/item_machinegun.tga" + "inv_name" "#str_107406" + + "fireRate" ".1" + "spread" "2" + + "mtr_crosshair" "gfx/guis/crosshairs/crosshair_machinegun" + "def_hitscan" "hitscan_bullet" + "def_althitscan" "hitscan_zoomed_bullet" + + "ammoType" "ammo_machinegun" + "ammoRequired" "1" + "clipSize" "40" + "lowAmmo" "10" + "gui" "guis/weapons/machinegun_ammo.gui" + "gui2" "guis/weapons/machinegun_inview_scope.gui" + + "mtr_icon" "gfx/guis/hud/icons/gun_machinegun" + + "muzzle_kick_time" "0.2" + "muzzle_kick_maxtime" "0.6" + "muzzle_kick_angles" "0 0 0" + "muzzle_kick_offset" "0.5 .15 .15" + + "ejectOffset" "0.5 -1 -1" + + "ammoRegenStep" "4" + "ammoRegenTime" "1000" + + "recoilTime" "145" + "recoilAngles" "-1 0 0" + + // Mapping of modifications to indexes + "def_mod1" "wpmod_machinegun_ammo" + + "foreshorten" ".6" + + // ---------------------------- Muzzleflash --------------------------------------- + + "mtr_flashShader" "lights/muzzleflash" + "flashColor" "1 0.8 0.4" + "flashRadius" "200" + "flashPointLight" "1" + "flashTime" ".1" + "flashViewOffset" "15 -5 -5" + + // ---------------------------- Flashlight --------------------------------------- + + "mtr_flashlightShader" "gfx/lights/flashlight" + "flashlightColor" "1 1 .9" + "flashlightRadius" "400" + "flashlightAngle" "15.0" + "flashlightTarget" "900 0 0" + "flashlightUp" "0 340 0" + "flashlightRight" "0 0 -340" + "flashlightPointLight" "0" + + "mtr_guiLightShader" "lights/viewWeaponGuiLight" + "glightRadius" "0.9" + "glightOffset" "4 3.5 0.2" + "glightColor" ".5 1 1 1" + + "snd_zoomIn" "weapon_machinegun_scope_in" + "snd_zoomOut" "weapon_machinegun_scope_out" + "snd_quaddamage" "weapon_quaddamage_fire" + "snd_bolt" "weapon_machinegun_bolt" + "snd_acquire" "pickup_weapon" + "snd_noAmmo" "weapon_machinegun_dryfire" + + "fx_muzzleflash" "effects/weapons/machinegun/muzzleflash.fx" + "fx_muzzleflash_world" "effects/weapons/machinegun/muzzleflash.fx" + "fx_respawn" "effects/mp/itemrespawn.fx" + + "def_viewStyle" "viewStyle_q3_machinegun" + "def_viewStyle1" "viewStyle_shouldered_machinegun" + + "weaponAngleOffsetAverages" "10" + "weaponAngleOffsetScale" ".2" + "weaponAngleOffsetMax" "3" + "weaponOffsetTime" "400" + "weaponOffsetScale" "0.002" + + // Scope / Zoom + "spreadzoom" "0" + "zoomFov" "50" + "zoomTime" ".1" + "zoomHideCrosshair" "0" + "gui_zoom" "guis/weapons/machinegun_scope.gui" + + "hidesurface" "models/weapons/blaster/flare" + + "net_syncPhysics" "1" +} + +entityDef weapon_machinegun_mp +{ + "inherit" "weapon_machinegun" + "clipsize" "0" + "def_mod1" "" + "inv_icon" "gfx/guis/hud/icons/item_machinegun_colored" + "mtr_simple_icon" "simpleicons/item_machinegun_colored" + "simple_icon_scale" "32.0" + "triggerSize" "32" + + // use q3 style spread in MP + "machinegunSpreadStyle" "1" + "spread" "200" + "spreadZoom" "150" + "editor_ignore" "1" + + "hidesurface" "models/weapons/machinegun/clip_large" + + "muzzle_kick_time" "0" + "muzzle_kick_maxtime" "0" + "muzzle_kick_angles" "0 0 0" + "muzzle_kick_offset" "0 0 0" + "recoilTime" "0" + "recoilAngles" "0 0 0" + "def_hitscan" "hitscan_bullet_mp" + "def_althitscan" "hitscan_zoomed_bullet_mp" + "altFireRate" ".2" + + "respawn_Team DM" "30" + "respawn_Tourney" "15" + + "inv_start_ammo_machinegun" "100" + + // played when you touch a weapon you can't acquire, i.e. weaponStay in MP + "snd_noAcquire" "pickup_weaponstay" +} + +entityDef weapon_blaster_gui +{ + "model" "weapon_machinegun_world" + "hidesurface" "models/weapons/blaster/flare" + +} + +entityDef moveable_item_machinegun +{ + "inherit" "weapon_machinegun" + + "editor_rotatable" "1" + + "spawnclass" "idMoveableItem" + "mass" "2500" + "density" "0.05" + "friction" "0.2" + "bouncyness" "0" + "itemclipmodel" "models/weapons/machinegun/w_mg_lo_clip.lwo" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Mods +//-------------------------------------------------------------------------------------------------------------------- + +entityDef wpmod_machinegun_ammo +{ + "weapon" "weapon_machinegun" + + "mod_showsurface" "models/weapons/machinegun/clip_large" + "mod_hidesurface" "models/weapons/machinegun/clip_small" + + "clipSize" "80" +} + +entityDef weaponmod_machinegun_ammo +{ + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + + "editor_menu" "pickup" + "editor_usage" "Machinegun Extended Clip Modification" + + "spawnclass" "idItem" + "size" "32 32 32" + "inv_weaponmod" "wpmod_machinegun_ammo" + "inv_ammo_machinegun" "120" + "inv_item" "1" + "inv_icon" "gfx/guis/hud/icons/item_machinegun.tga" + "inv_name" "#str_107435" + + "model" "models/items/ammo/ammo_box.lwo" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Models +//-------------------------------------------------------------------------------------------------------------------0 + +model weapon_machinegun_view +{ + mesh models/weapons/machinegun/view.md5mesh + + offset (-1.5 1.7 .25) + + anim idle models/weapons/machinegun/idle.md5anim + anim raise models/weapons/machinegun/raise.md5anim + { + frame 7 sound_weapon snd_bolt + } + + anim putaway models/weapons/machinegun/lower.md5anim + { + frame 1 sound_weapon weapon_switch + } + + anim fire models/weapons/machinegun/fire.md5anim + { + frame 1 sound_weapon weapon_machinegun_fire + frame 1 sound_item weapon_machinegun_fire_stereo + frame 1 object_call EjectBrass + } + anim reload models/weapons/machinegun/reload.md5anim + { + frame 6 sound_weapon weapon_machinegun_clipout + frame 16 sound_item weapon_machinegun_clipin + frame 26 sound_weapon snd_bolt + } + anim flashlight models/weapons/machinegun/flashlight.md5anim + { + frame 7 sound_weapon weapon_blaster_flashlight + } +} + +model weapon_machinegun_view_strogg +{ + inherit weapon_machinegun_view + + offset (-1.5 1.7 .25) + + mesh models/weapons/machinegun/view_strogg.md5mesh +} + +model weapon_machinegun_world +{ + mesh models/weapons/machinegun/world/machinegun_world.md5mesh + + anim raise models/weapons/machinegun/world/machinegun_idle.md5anim + anim idle models/weapons/machinegun/world/machinegun_idle.md5anim + anim aim models/weapons/machinegun/world/machinegun_idle.md5anim + anim fire1 models/weapons/machinegun/world/machinegun_fire1.md5anim + anim reload models/weapons/machinegun/world/machinegun_reload.md5anim + anim noammo models/weapons/machinegun/world/machinegun_idle.md5anim + anim putaway models/weapons/machinegun/world/machinegun_idle.md5anim +} + +//-------------------------------------------------------------------------------------------------------------------- +// HitScan +//-------------------------------------------------------------------------------------------------------------------0 + +entityDef hitscan_bullet +{ + "range" "40000" + + "fx_impact" "effects/weapons/machinegun/impact_default.fx" + "fx_impact_water" "effects/ambient/splash_smll.fx" + "fx_impact_concrete" "effects/weapons/machinegun/impact_concrete.fx" + "fx_impact_rock" "effects/weapons/machinegun/impact_concrete.fx" + "fx_impact_electronics" "effects/weapons/machinegun/impact_electronics.fx" + "fx_impact_flesh" "effects/weapons/machinegun/impact_flesh.fx" + "fx_impact_glass" "effects/weapons/machinegun/impact_glass.fx" + "fx_impact_monstermetal" "effects/weapons/machinegun/impact_monstermetal.fx" + "fx_impact_bpglass" "effects/weapons/machinegun/impact_bpglass.fx" + "fx_impact_mp" "effects/weapons/machinegun/impact_default_mp.fx" + "fx_impact_concrete_mp" "effects/weapons/machinegun/impact_default_mp.fx" + "fx_impact_rock_mp" "effects/weapons/machinegun/impact_default_mp.fx" + "fx_impact_glass_mp" "effects/weapons/machinegun/impact_default_mp.fx" + "fx_impact_bpglass_mp" "effects/weapons/machinegun/impact_default_mp.fx" + "fx_impact_electronics_mp" "effects/weapons/machinegun/impact_default_mp.fx" + + "def_damage" "damage_machinegun" + "def_damage_flesh" "damage_machinegun_flesh" + + "push" "7500" +} + +entityDef hitscan_zoomed_bullet +{ + "inherit" "hitscan_bullet" + + "def_damage" "damage_machinegun_zoom" + "def_damage_flesh" "damage_machinegun_zoom_flesh" +} + +//--------------------------------------------------------------- +// SP - normal +//--------------------------------------------------------------- +entityDef damage_machinegun +{ + "inherit" "damage_bullet" + "damage" "15" + "damage_flesh" "18" + + "deathPush" "100" + "deathPushMin" "3000 350" + "deathPushMax" "5000 500" +} + +entityDef damage_machinegun_flesh +{ + "inherit" "damage_machinegun" + "damage" "18" +} + +//--------------------------------------------------------------- +// SP - Zoomed +//--------------------------------------------------------------- +entityDef damage_machinegun_zoom +{ + "inherit" "damage_machinegun" + "damage" "20" + "damage_flesh" "24" +} + +entityDef damage_machinegun_zoom_flesh +{ + "inherit" "damage_machinegun" + "damage" "24" +} + +//--------------------------------------------------------------- +// MP +//--------------------------------------------------------------- +entityDef hitscan_bullet_mp +{ + "inherit" "hitscan_bullet" + "range" "40000" + + "def_damage" "damage_machinegun_mp" + "def_damage_flesh" "damage_machinegun_mp" +} + +entityDef hitscan_zoomed_bullet_mp +{ + "inherit" "hitscan_bullet" + "range" "40000" + + "def_damage" "damage_machinegun_zoom_mp" + "def_damage_flesh" "damage_machinegun_zoom_mp" +} + +entityDef damage_machinegun_mp +{ + "inherit" "damage_bullet" + "damage" "7" + "damage_flesh" "7" + "damage_team" "5" + "knockback" "7" + "knockback_team" "5" + + "deathPush" "100" + "deathPushMin" "3000 350" + "deathPushMax" "5000 500" +} + + +entityDef damage_machinegun_zoom_mp +{ + "inherit" "damage_machinegun_mp" + "damage" "10" + "damage_flesh" "10" + "damage_team" "7" + "knockback" "10" + "knockback_team" "10" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Casing +//-------------------------------------------------------------------------------------------------------------------- + +entityDef debris_brass_machinegun { + "model" "models/weapons/machinegun/brass.lwo" + "clipmodel" "simpletri" + + "scale" "0.3" + + "linear_velocity" "10 -75 50" + "linear_velocity_range" "0.1 0.15 0.35" + "angular_velocity" "0 8000 0" + "angular_velocity_range" "0 1.0 0" + + "density" "0.02" + "linear_friction" "0.4" + "angular_friction" "0.1" + "friction" "0.2" + "bouncyness" "0.1" + "snd_bounce" "brass_casing" + "bounce_sound_once" "1" +} diff --git a/q4base/def/weapons/nailgun.def b/q4base/def/weapons/nailgun.def new file mode 100644 index 00000000..e97372de --- /dev/null +++ b/q4base/def/weapons/nailgun.def @@ -0,0 +1,526 @@ +//---------------------------------------------------------------- +// nailgun.def +// +// Copyright 2002-2004 Raven Software +//---------------------------------------------------------------- + +export nailgun +{ + options -prefix NAILGUN_ -scale .4 -parent lft_wrst nailgun_body -keep lft_shldr lft_elbo lft_wrst lft_thmb_1 lft_ndx_1 lft_mddl_1 lft_ring_5 lft_pnky_1 lft_thmb_2 lft_ndx_2 lft_mddl_2 lft_ring_2 lft_pnky_2 lft_thmb_3 lft_ndx_3 lft_mddl_3 lft_ring_3 lft_pnky_3 lft_thmb_4 lft_ndx_4 lft_mddl_4 lft_ring_4 lft_pnky_4 rt_elbo rt_wrst rt_ring_1 rt_ndx_1 rt_thmb_1 rt_ring_2 rt_ndx_2 rt_thmb_2 rt_ring_3 rt_ndx_3 rt_thmb_3 rt_ring_4 rt_ndx_4 rt_thmb_4 nailgun_rt_steam_nozzle nailgun_lft_steam_nozzle +//-keepmeshprefix nailgun_ +//-keepmesh rt_arm_mesh -keepmesh lft_arm_mesh +//-keepmesh temp_left_hand_handle + + addoptions -skipmesh rt_strogg_arm_mesh + addoptions -skipmesh lft_strogg_arm_mesh + addoptions -skipmesh mgun_mesh + addoptions -skipmesh mgun_lg_clip + addoptions -skipmesh mgun_sm_clip + + mesh work/models/weapons/nailgun/animations/nailgun_idle.ma -dest models/weapons/nailgun/view + anim work/models/weapons/nailgun/animations/nailgun_idle.ma -dest models/weapons/nailgun/idle + anim work/models/weapons/nailgun/animations/nailgun_shoot.ma -dest models/weapons/nailgun/fire + anim work/models/weapons/nailgun/animations/nailgun_barrelspin.ma -dest models/weapons/nailgun/barrelspin + anim work/models/weapons/nailgun/animations/nailgun_raise.ma -dest models/weapons/nailgun/raise + anim work/models/weapons/nailgun/animations/nailgun_lower.ma -dest models/weapons/nailgun/lower + anim work/models/weapons/nailgun/animations/nailgun_fire_fast.ma -dest models/weapons/nailgun/fire_fast + anim work/models/weapons/nailgun/animations/nailgun_fire_slow.ma -dest models/weapons/nailgun/fire_slow + anim work/models/weapons/nailgun/animations/nailgun_reload.ma -dest models/weapons/nailgun/reload + anim work/models/weapons/nailgun/animations/nailgun_spinup.ma -dest models/weapons/nailgun/spinup + anim work/models/weapons/nailgun/animations/nailgun_spindown.ma -dest models/weapons/nailgun/spindown + anim work/models/weapons/nailgun/animations/nailgun_spindown.ma -range 1 2 -dest models/weapons/nailgun/spinempty + + anim work/models/weapons/nailgun/animations/nailgun_reload_double_A.ma -dest models/weapons/nailgun/reload_clip1_hold + anim work/models/weapons/nailgun/animations/nailgun_reload_double_B.ma -dest models/weapons/nailgun/reload_clip1_finish + anim work/models/weapons/nailgun/animations/nailgun_reload_double_C.ma -dest models/weapons/nailgun/reload_clip2 + + anim work/models/weapons/nailgun/animations/nailgun_clasp_open.ma -dest models/weapons/nailgun/clasp_open + anim work/models/weapons/nailgun/animations/nailgun_clasp_1clip.ma -dest models/weapons/nailgun/clasp_1clip + anim work/models/weapons/nailgun/animations/nailgun_clasp_2clips.ma -dest models/weapons/nailgun/clasp_2clip + +} + +export nailgun_strogg +{ + options -prefix NAILGUN_ -scale .4 -parent lft_wrst nailgun_body -keep lft_shldr lft_elbo lft_wrst lft_thmb_1 lft_ndx_1 lft_mddl_1 lft_ring_5 lft_pnky_1 lft_thmb_2 lft_ndx_2 lft_mddl_2 lft_ring_2 lft_pnky_2 lft_thmb_3 lft_ndx_3 lft_mddl_3 lft_ring_3 lft_pnky_3 lft_thmb_4 lft_ndx_4 lft_mddl_4 lft_ring_4 lft_pnky_4 rt_elbo rt_wrst rt_ring_1 rt_ndx_1 rt_thmb_1 rt_ring_2 rt_ndx_2 rt_thmb_2 rt_ring_3 rt_ndx_3 rt_thmb_3 rt_ring_4 rt_ndx_4 rt_thmb_4 nailgun_rt_steam_nozzle nailgun_lft_steam_nozzle + addoptions -skipmesh rt_arm_mesh + addoptions -skipmesh lft_arm_mesh + addoptions -skipmesh mgun_mesh + addoptions -skipmesh mgun_lg_clip + addoptions -skipmesh mgun_sm_clip + mesh work/models/weapons/nailgun/animations/nailgun_idle.ma -dest models/weapons/nailgun/view_strogg +} + +/* +export nailgun + +{ +// options -prefix NAILGUN_nailgun_ -scale .4 -keepmesh rt_armmesh_uvs lft_armmesh_uvs comm_lo -keep lft_shldr lft_elbo lft_wrst lft_thmb_1 lft_ndx_1 lft_mddl_1 lft_ring_5 lft_pnky_1 lft_thmb_2 lft_ndx_2 lft_mddl_2 lft_ring_2 lft_pnky_2 lft_thmb_3 lft_ndx_3 lft_mddl_3 lft_ring_3 lft_pnky_3 lft_thmb_4 lft_ndx_4 lft_mddl_4 lft_ring_4 lft_pnky_4 rt_elbo rt_wrst rt_ring_1 rt_ndx_1 rt_thmb_1 rt_ring_2 rt_ndx_2 rt_thmb_2 rt_ring_3 rt_ndx_3 rt_thmb_3 rt_ring_4 rt_ndx_4 rt_thmb_4 +// options -prefix NAILGUN_ -scale .4 -keepmesh temp_left_hand_handle -keepmeshprefix nailgun_ -keepmesh rt_armmesh_uvs -keepmesh lft_armmesh_uvs -keepmesh comm_lo -keep lft_shldr lft_elbo lft_wrst lft_thmb_1 lft_ndx_1 lft_mddl_1 lft_ring_5 lft_pnky_1 lft_thmb_2 lft_ndx_2 lft_mddl_2 lft_ring_2 lft_pnky_2 lft_thmb_3 lft_ndx_3 lft_mddl_3 lft_ring_3 lft_pnky_3 lft_thmb_4 lft_ndx_4 lft_mddl_4 lft_ring_4 lft_pnky_4 rt_elbo rt_wrst rt_ring_1 rt_ndx_1 rt_thmb_1 rt_ring_2 rt_ndx_2 rt_thmb_2 rt_ring_3 rt_ndx_3 rt_thmb_3 rt_ring_4 rt_ndx_4 rt_thmb_4 +// mesh work/models/weapons/nailgun/animations/world_nailgun.ma -dest models/weapons/nailgun/world/worldnailgun + + options -prefix PLAYER_NG_ -scale .4 -keep muzzle_flash ATTACHER -sourcedir work/models/characters/marine/multiplayer -destdir models/weapons/nailgun/world -rename ATTACHER origin -clearorigin + mesh nailgun_idle.ma -dest nailgun + anim nailgun_idle.ma -dest idle + anim nailgun_fire2.ma -dest fire + anim nailgun_spinup.ma -dest spinup + anim nailgun_spindown.ma -dest spindown +} +*/ + +entityDef viewStyle_q3_nailgun { + "viewoffset" "-2.7 2.6 1.6" + "viewangles" "3.1 -7.2 0.3" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Weapon Definition +//-------------------------------------------------------------------------------------------------------------------- + +entityDef weapon_nailgun +{ + "editor_menu" "pickup" + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + "editor_usage" "Nailgun" + + "spawnclass" "idItem" + "weaponclass" "rvWeaponNailgun" + "size" "32 32 32" + "model_view" "weapon_nailgun_view" + "model_view_strogg" "weapon_nailgun_view_strogg" + "model_world" "weapon_nailgun_world" + "model" "models/weapons/nailgun/w_ng.lwo" + "def_dropItem" "weapon_nailgun" + "mtr_crosshair" "gfx/guis/crosshairs/crosshair_nailgun" + + "joint_attach" "NG_ATTACHER" + "joint_view_barrel" "nailgun_rotating_firing_pins" + "joint_view_flash" "nailgun_rotating_firing_pins" + "joint_view_guiLight" "nailgun_body" + "joint_view_drum" "nailgun_rotating_drum" + "joint_view_pins" "nailgun_rotating_firing_pins" + "joint_view_steamRight" "nailgun_rt_steam_nozzle" + "joint_view_steamLeft" "nailgun_lft_steam_nozzle" + + "joint_world_flash" "nailgun_rotating_drum" + + "fireRate" ".16" + "spread" "3" + "spread_mp" "0" + "spreadSeek" "5" + "drumSpeed" ".8" + + "inv_weapon" "weapon_nailgun" + "inv_start_ammo_nailgun" "50" + "inv_item" "1" + "inv_icon" "gfx/guis/hud/icons/item_nailgun" + "inv_name" "#str_107407" + + "gui" "guis/weapons/nailgun_ammo.gui" + "gui_zoom" "guis/weapons/nailgun_scope.gui" + + "mtr_icon" "gfx/guis/hud/icons/gun_nailgun" + + "def_projectile" "projectile_nail" + "def_altprojectile" "projectile_nail_seek" + "ammoType" "ammo_nailgun" + "ammoRequired" "1" + "clipSize" "50" + "lowAmmo" "1" + + "mtr_flashShader" "lights/muzzleflash" + "flashColor" "1 0.8 0.4" + "flashRadius" "200" + "flashPointLight" "1" + "flashTime" ".1" + "flashViewOffset" "15 -5 -5" + + "muzzle_kick_time" "0.2" + "muzzle_kick_maxtime" "0.6" + "muzzle_kick_angles" "0 0 0" + "muzzle_kick_offset" "0.5 .15 .15" + "recoilTime" "145" + "recoilAngles" "-1 0 0" + + "ammoRegenStep" "2" + "ammoRegenTime" "1250" + + "def_mod1" "wpmod_nailgun_power" + "def_mod2" "wpmod_nailgun_seek" + + "foreshorten" ".66" + "snd_zoomIn" "weapon_machinegun_scope_in" + "snd_zoomOut" "weapon_machinegun_scope_out" + "snd_spinfast" "weapon_nailgun_spinfast" + "snd_spinslow" "weapon_nailgun_spinslow" + "snd_spinup" "weapon_nailgun_spinup" + "snd_spindown" "weapon_nailgun_spindown" + "snd_quaddamage" "weapon_quaddamage_fire" + "snd_fire" "weapon_nailgun_fire" + "snd_fireStereo" "weapon_nailgun_fire_stereo" + "snd_acquire" "pickup_weapon" + "snd_noAmmo" "weapon_nailgun_dryfire" + + "fx_muzzleflash" "effects/weapons/nailgun/muzzleflash.fx" + "fx_muzzleflash_world" "effects/weapons/nailgun/muzzleflash_world.fx" + "fx_exhaust" "effects/weapons/nailgun/exhaust.fx" + "fx_respawn" "effects/mp/itemrespawn.fx" + + "def_viewStyle" "viewStyle_q3_nailgun" + + "weaponAngleOffsetAverages" "10" + "weaponAngleOffsetScale" ".25" + "weaponAngleOffsetMax" "5" + "weaponOffsetTime" "600" + "weaponOffsetScale" "0.001" + +// "launchFromBarrel" "1" + + "mtr_guiLightShader" "lights/viewWeaponGuiLight" + "glightRadius" "1.1" + "glightOffset" "1.8 2.0 .9" + + "net_syncPhysics" "1" +} + +entityDef weapon_nailgun_mp +{ + "inherit" "weapon_nailgun" + "clipsize" "0" + "def_mod3" "" + "hidesurface" "models/weapons/nailgun_mod_ammo" + "editor_ignore" "1" + "inv_icon" "gfx/guis/hud/icons/item_nailgun_colored.tga" + "mtr_simple_icon" "simpleicons/item_nailgun_colored.tga" + "simple_icon_scale" "32.0" + "model" "models/weapons/nailgun/w_ng_mp.lwo" + "triggerSize" "32" + + "muzzle_kick_time" "0" + "muzzle_kick_maxtime" "0" + "muzzle_kick_angles" "0 0 0" + "muzzle_kick_offset" "0 0 0" + "recoilTime" "0" + "recoilAngles" "0 0 0" + + "respawn_Team DM" "30" + "respawn_Tourney" "15" + + // played when you touch a weapon you can't acquire, i.e. weaponStay in MP + "snd_noAcquire" "pickup_weaponstay" +} + +entityDef moveable_item_nailgun +{ + "inherit" "weapon_nailgun" + + "editor_rotatable" "1" + "editor_menu" "pickup" + + "itemclipmodel" "models/weapons/nailgun/w_ng_clip.lwo" + + + "spawnclass" "idMoveableItem" + "mass" "4000" + "density" "0.05" + "friction" "0.2" + "bouncyness" "0" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Models +//-------------------------------------------------------------------------------------------------------------------0 + +model weapon_nailgun_view +{ + mesh models/weapons/nailgun/view.md5mesh + + channel legs ( *lft_shldr *rt_elbo origin -nailgun_lft_clasp ) + channel torso ( nailgun_lft_clasp ) + + anim idle models/weapons/nailgun/idle.md5anim + anim raise models/weapons/nailgun/raise.md5anim + { + frame 8 sound_weapon weapon_nailgun_handle + } + anim putaway models/weapons/nailgun/lower.md5anim + { + frame 1 sound_weapon weapon_switch + } + anim fire_slow models/weapons/nailgun/fire_slow.md5anim + { +// frame 1 sound_weapon weapon_nailgun_fire +// frame 1 sound_item weapon_nailgun_fire_stereo + } + anim fire_fast models/weapons/nailgun/fire_fast.md5anim + { + frame 1 sound_weapon weapon_nailgun_fire + frame 1 sound_item weapon_nailgun_fire_stereo + } + anim spinup models/weapons/nailgun/spinup.md5anim + { + rate 2 + } + anim spindown models/weapons/nailgun/spindown.md5anim + anim spinempty models/weapons/nailgun/spinempty.md5anim + anim reload models/weapons/nailgun/reload.md5anim + { + frame 12 sound_weapon weapon_nailgun_clipout + frame 14 object_call ClaspOpen + frame 23 guievent nailgun_clipout + frame 26 sound_item weapon_nailgun_clipin + frame 28 object_call ClaspClose + frame 26 guievent nailgun_clipin + frame 39 sound_weapon weapon_nailgun_handle + } + anim reload_clip1hold models/weapons/nailgun/reload_clip1_hold.md5anim + { + frame 7 sound_weapon weapon_nailgun_clipout + frame 9 object_call ClaspOpen + frame 29 sound_item weapon_nailgun_clipin + frame 31 object_call ClaspClose + } + anim reload_clip1finish models/weapons/nailgun/reload_clip1_finish.md5anim + { + frame 10 sound_weapon weapon_nailgun_handle + } + anim reload_clip2 models/weapons/nailgun/reload_clip2.md5anim + { + frame 10 sound_weapon weapon_nailgun_clipout + frame 35 sound_item weapon_nailgun_clipin + frame 50 sound_weapon weapon_nailgun_handle + } + anim clasp_open models/weapons/nailgun/clasp_open.md5anim + anim clasp_1clip models/weapons/nailgun/clasp_1clip.md5anim + anim clasp_2clip models/weapons/nailgun/clasp_2clip.md5anim +} + +model weapon_nailgun_view_strogg +{ + inherit weapon_nailgun_view + + mesh models/weapons/nailgun/view_strogg.md5mesh + + channel legs ( *lft_shldr *rt_elbo origin -nailgun_lft_clasp ) + channel torso ( nailgun_lft_clasp ) +} + +model weapon_nailgun_world +{ + mesh models/weapons/nailgun/world/nailgun.md5mesh + anim idle models/weapons/nailgun/world/idle.md5anim + anim fire models/weapons/nailgun/world/fire.md5anim + anim spinup models/weapons/nailgun/world/spinup.md5anim + anim spindown models/weapons/nailgun/world/spindown.md5anim +} + +//-------------------------------------------------------------------------------------------------------------------- +// Mods +//-------------------------------------------------------------------------------------------------------------------0 + +entityDef wpmod_nailgun_power +{ + "weapon" "weapon_nailgun" + + "mod_showsurface" "models/weapons/nailgun_mod_rof" + "mod_showsurface2" "models/weapons/nailgun_mod_ammo" + "mod_hidesurface" "models/weapons/nailgun_clip" + + "fireRate" ".12" + "drumSpeed" "1.25" + "clipSize" "100" +} + +entityDef wpmod_nailgun_seek +{ + "weapon" "weapon_nailgun" + + "mod_showsurface" "models/weapons/nailgun_mod_accuracy" + "mod_showsurface2" "models/weapons/nailgun/scope" + + "zoomFov" "80" + "zoomTime" ".1" + "zoomHideCrosshair" "0" + "gui_zoom" "guis/weapons/nailgun_scope.gui" + "fx_guide" "effects/weapons/nailgun/guide.fx" + "fx_guidestart" "effects/weapons/nailgun/guide_start.fx" + + "lockRange" "1000" + "lockHoldTime" "10" + "lockAquireTime" ".1" + "gui2" "guis/weapons/nailgun_scope.gui" +} + +entityDef weaponmod_nailgun_power +{ + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + "editor_menu" "pickup" + "editor_usage" "Nailgun Power Modification" + + "spawnclass" "idItem" + "size" "32 32 32" + "inv_weaponmod" "wpmod_nailgun_power" + "inv_ammo_nailgun" "100" + "inv_item" "1" + "inv_icon" "gfx/guis/hud/icons/item_nailgun.tga" + "inv_name" "#str_107436" + "model" "models/items/ammo/ammo_box.lwo" + + "net_syncPhysics" "1" +} + +entityDef weaponmod_nailgun_seek +{ + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + "editor_menu" "pickup" + "editor_usage" "Nailgun Seeker Modification" + + "spawnclass" "idItem" + "size" "32 32 32" + "inv_weaponmod" "wpmod_nailgun_seek" + "inv_ammo_nailgun" "100" + "inv_item" "1" + "inv_icon" "gfx/guis/hud/icons/item_nailgun.tga" + "inv_name" "#str_107438" + "model" "models/items/ammo/ammo_box.lwo" + + "net_syncPhysics" "1" +} + +entityDef weaponmod_nailgun_rof +{ + "inherit" "weaponmod_nailgun_power" +} + +entityDef weaponmod_nailgun_ammo +{ + "inherit" "weaponmod_nailgun_power" +} +//-------------------------------------------------------------------------------------------------------------------- +// Projectile +//-------------------------------------------------------------------------------------------------------------------0 + +entityDef projectile_nail +{ + "spawnclass" "idProjectile" + "mins" "-1 -1 -1" + "maxs" "1 1 1" + "noshadows" "1" + "clipmask_largeshot" "0" + + "model" "models/weapons/nailgun/nail.ase" + "def_damage" "damage_nailDirect" + "def_splash_damage" "damage_nailSplash" + + "health" "0" + "speed" "1200" + "gravity" "0" + "fuse" "4" + + "detonate_on_fuse" "1" + "detonate_on_death" "0" + "detonate_on_world" "1" + "detonate_on_actor" "1" + "detonate_on_bounce" "1" + + "decal_size" "8" + + //sigh... so that a splash damage projectile can still have it's impact effect suppressed on buddy corpses... :/ + "bloodyImpactEffect" "1" + + "fx_fly" "effects/weapons/nailgun/fly.fx" + "fx_fly_mp_low" "effects/weapons/nailgun/fly_mp_low.fx" + "fx_impact" "effects/weapons/nailgun/impact_default.fx" + "fx_impact_water" "effects/ambient/splash_smll.fx" + "fx_impact_concrete" "effects/weapons/nailgun/impact_concrete.fx" + "fx_impact_rock" "effects/weapons/nailgun/impact_concrete.fx" + "fx_impact_monstermetal" "effects/weapons/machinegun/impact_monstermetal.fx" + "fx_impact_flesh" "effects/weapons/machinegun/impact_flesh.fx" + "fx_impact_glass" "effects/weapons/nailgun/impact_glass.fx" + "fx_impact_bpglass" "effects/weapons/nailgun/impact_bpglass.fx" + "fx_impact_electronics" "effects/weapons/nailgun/impact_electronics.fx" + "fx_impact_mp" "effects/weapons/nailgun/impact_default_mp.fx" + "fx_impact_concrete_mp" "effects/weapons/nailgun/impact_default_mp.fx" + "fx_impact_rock_mp" "effects/weapons/nailgun/impact_default_mp.fx" + "fx_impact_glass_mp" "effects/weapons/nailgun/impact_default_mp.fx" + "fx_impact_bpglass_mp" "effects/weapons/nailgun/impact_default_mp.fx" + "fx_impact_electronics_mp" "effects/weapons/nailgun/impact_default_mp.fx" + + "fx_teleport_enter" "effects/mp/item_teleport.fx" + "fx_teleport" "effects/mp/item_teleport.fx" +} + +entityDef projectile_nail_mp +{ + "inherit" "projectile_nail" + "speed" "1400" + "no_impact_prediction" "1" +} + +entityDef projectile_nail_seek +{ + "inherit" "projectile_nail" + "spawnclass" "idGuidedProjectile" + + "speed" "700" + + "turn_max" "1800" + "turn_accel" ".5" + "clamp_dist" "1001" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Damage +//-------------------------------------------------------------------------------------------------------------------0 + +entityDef damage_nailDirect +{ + "damage" "25" +// "push" "1000" + "gib" "0" + + "deathPush" "150" + "deathPushMin" "2000 350" + "deathPushMax" "4000 500" + + "bleed" "1" +} + +entityDef damage_nailSplash +{ + "damage" "25" + "radius" "50" + "knockback" "5" + "push" "0" + "gib" "0" + + "deathPush" "100" + "deathPushMin" "2000 350" + "deathPushMax" "4000 500" +} + +entityDef damage_nailDirect_mp +{ + "inherit" "damage_nailDirect" + "damage" "25" + "knockback" "30" +} + +entityDef damage_nailSplash_mp +{ + "damage" "25" + "radius" "75" + "knockback" "30" + "push" "0" + "gib" "0" + + "deathPush" "100" + "deathPushMin" "2000 350" + "deathPushMax" "4000 500" +} \ No newline at end of file diff --git a/q4base/def/weapons/napalmgun.def b/q4base/def/weapons/napalmgun.def new file mode 100644 index 00000000..2ffa5b2b --- /dev/null +++ b/q4base/def/weapons/napalmgun.def @@ -0,0 +1,399 @@ +//---------------------------------------------------------------- +// napalmgun.def +//---------------------------------------------------------------- + +export napalmgun +{ + options -game /q4xbase -prefix SRL_ -scale .4 -keep offset lighter light_pivot reticle canister muzzle_flash peice1 peice2 peice3 plunger tube tube1 tube2 tube3 -skipmesh rt_strogg_arm_mesh -skipmesh lft_strogg_arm_mesh -sourcedir models/weapons/flame_goop/animations -destdir models/weapons/napalmgun + + addoptions -skipmesh rt_strogg_arm_mesh + addoptions -skipmesh lft_strogg_arm_mesh + + mesh idle_00.ma -dest mesh + anim idle_00.ma -dest idle + anim fire_00.ma -dest fire -range 4 10 + anim raise_00.ma -dest raise + anim lower_00.ma -dest lower + anim fire_00.ma -dest reload -range 11 24 + anim reload_slow.ma -dest reload_empty + anim reload_slow.ma -dest idle_empty -range 1 2 +} + +/* viewmodel will fix +export napalmgun_strogg +{ + options -prefix SRL_ -scale .4 -keep muzzle_flash l_vent r_vent -sourcedir work/models/weapons/strogg_rocket_launcher/animations -destdir models/weapons/rocketlauncher + addoptions -skipmesh rt_arm_mesh + addoptions -skipmesh lft_arm_mesh + mesh idle_00.ma -dest mesh_strogg +} + +export napalmgun +{ + options -prefix PLAYER_RKT_ -scale .4 -keep muzzle_flash ATTACHER -sourcedir work/models/characters/marine/animation_mocap_cinematics -destdir models/weapons/rocketlauncher/world -rename ATTACHER origin -clearorigin + mesh newMarine_oneframe_idle.ma -dest rocketlauncher + anim newMarine_oneframe_idle.ma -dest idle +} +*/ + +entityDef viewStyle_q3_napalmgun { + "viewoffset" "-2.6 2.2 2.3" + "viewangles" "5.7 -3.9 -1.2" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Weapon Definition +//-------------------------------------------------------------------------------------------------------------------- +entityDef weapon_napalmgun +{ + "editor_menu" "pickup" + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + + "editor_usage" "Napalm Launcher" + + "spawnclass" "idItem" + "weaponclass" "WeaponNapalmGun" + "size" "32 32 32" + "model_view" "weapon_napalmgun_view" + "model_world" "weapon_napalmgun_world" + "model" "models/weapons/napalmgun/w_flamegun.ase" + "def_dropItem" "weapon_napalmgun" + "mtr_crosshair" "gfx/guis/crosshairs/crosshair_napalm" + + "joint_attach" "RKT_ATTACHER" + "joint_view_flash" "muzzle_flash" + "joint_view_barrel" "muzzle_flash" + "joint_world_flash" "muzzle_flash" + + "inv_weapon" "weapon_napalmgun" + "inv_start_ammo_napalmgun" "10" + "inv_item" "1" + "inv_icon" "gfx/guis/hud/icons/item_fire.tga" + "inv_name" "Napalm Launcher" + + "fireRate" ".8" +// "reloadRate" ".1" + "spread" "0" + "dirOffset" "0 0 .1" + + "weaponname" "Napalm Launcher" + "def_projectile" "projectile_napalm" + "ammoType" "ammo_napalmgun" + "clipSize" "20" + "ammoRequired" "1" + "gui" "guis/weapons/napalmgun.gui" + "mtr_icon" "gfx/guis/hud/icons/gun_napalmgun" + +// "muzzle_kick_time" ".5" +// "muzzle_kick_maxtime" "0.5" +// "muzzle_kick_angles" "-15 0 0" +// "muzzle_kick_offset" "3 0 3" + +// "recoilTime" "20" +// "recoilAngles" "-.20 0 0" + + "muzzle_kick_time" "0.8" + "muzzle_kick_maxtime" "0.8" + "muzzle_kick_angles" "-10 0 0" + "muzzle_kick_offset" "2 0 1" + + "recoilTime" "500" + "recoilAngles" "-.20 0 0" + + "mtr_flashShader" "lights/muzzleflash" + "flashColor" "0.99 0.84 .31" + "flashRadius" "200" + "flashPointLight" "1" + "flashTime" ".1" + "flashViewOffset" "15 -5 -5" + + "mtr_guiLightShader" "lights/viewWeaponGuiLight" + + "fx_muzzleflash" "effects/weapons/rocketlauncher/muzzleflash.fx" + "fx_muzzleflash_world" "effects/weapons/rocketlauncher/muzzleflash_world.fx" + + "fx_respawn" "effects/mp/itemrespawn.fx" + + "snd_acquire" "pickup_weapon" + "snd_noacquire" "pickup_weaponstay" + + "foreshorten" ".6" + + "def_viewStyle" "viewStyle_q3_napalmgun" + + "weaponAngleOffsetAverages" "10" + "weaponAngleOffsetScale" ".15" + "weaponAngleOffsetMax" "3" + "weaponOffsetTime" "600" + "weaponOffsetScale" "0.002" + + "useAltFireAnim" "1" + +// "launchFromBarrel" "1" + + "dbTitle" "Napalm Launcher" + "dbText" "Sticky Like Napalm." + "dbFilter" "weapon" + + + "cylinderMoveTime" "850" + "cylinder_offset0" "-2.235" + "cylinder_offset1" "-2.487" + "cylinder_offset2" "-1.806" + "cylinder_offset3" "-0.798" + + "cylinder_joint0" "plunger" + "cylinder_joint1" "peice1" + "cylinder_joint2" "peice2" + "cylinder_joint3" "peice3" + + "net_syncPhysics" "1" + + "snd_quaddamage" "weapon_quaddamage_fire" +} + +entityDef weapon_napalmgun_mp +{ + "inherit" "weapon_napalmgun" + "clipSize" "0" + "inv_icon" "gfx/guis/hud/icons/item_fire_colored" + "mtr_simple_icon" "gfx/guis/hud/simpleicons/item_napalmgun" + "simple_icon_scale" "32.0" + + "ammoRegenStep" "1" + "ammoRegenTime" "2500" +} + +entityDef moveable_item_napalmgun +{ + "inherit" "weapon_napalmgun" + + "editor_rotatable" "1" + + "spawnclass" "idMoveableItem" + "density" "0.05" + "friction" "0.2" + "bouncyness" "0" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Models +//-------------------------------------------------------------------------------------------------------------------- + +model weapon_napalmgun_view +{ + mesh models/weapons/napalmgun/mesh.md5mesh + + channel legs ( *origin -*tube) + channel torso ( *tube) + + anim idle models/weapons/napalmgun/idle.md5anim + anim fire models/weapons/napalmgun/fire.md5anim + { + rate .25 + + frame 1 sound_weapon weapon_napalmgun_fire_mono + frame 1 sound_voice2 weapon_napalmgun_fire + //frame 1 fx effects/weapons/rocketlauncher/vent.fx muzzle_flash + //frame 1 fx effects/weapons/rocketlauncher/vent.fx muzzle_flash + } + + + anim idle_empty models/weapons/napalmgun/idle_empty.md5anim + + anim reload models/weapons/napalmgun/reload.md5anim + { + rate 2 + frame 1 object_call MoveCylinder + frame 4 sound_body weapon_napalmgun_reload + //frame 9 sound_body2 player_rocketlauncher_servo + } + + anim reload_empty models/weapons/napalmgun/reload_empty.md5anim + { + frame 96 sound_body weapon_napalmgun_reload + frame 24 sound weapon_shotgun_clipout + frame 73 sound weapon_shotgun_clipin + //frame 8 sound_body2 player_rocketlauncher_servo + } + + anim raise models/weapons/napalmgun/raise.md5anim + anim putaway models/weapons/napalmgun/lower.md5anim + { + frame 1 sound weapon_switch + } +} + +model weapon_napalmgun_view_strogg +{ + inherit weapon_rocketlauncher_view + + mesh models/weapons/napalmgun/mesh_strogg.md5mesh + + channel legs ( *origin -*reload_rack -*ram -iris_bone_6 -iris_bone_5 -iris_bone_4 -iris_bone_3 -iris_bone_2 -iris_bone_1 ) + channel torso ( *reload_rack *ram iris_bone_6 iris_bone_5 iris_bone_4 iris_bone_3 iris_bone_2 iris_bone_1 ) +} + +model weapon_napalmgun_world +{ + mesh models/weapons/napalmgun/world/napalmgun.md5mesh + anim idle models/weapons/napalmgun/world/idle.md5anim +} + + +//-------------------------------------------------------------------------------------------------------------------- +// Projectile +//-------------------------------------------------------------------------------------------------------------------- + +entityDef projectile_napalm +{ + "spawnclass" "idProjectile" + "size" "7 7 7" + "cone" "2" + "noshadows" "1" + "clipmask_largeshot" "1" + "no_contents" "0" + + "model" "models/weapons/napalmgun/flame_gun_glob.ase" + "def_damage" "damage_napalmDirect" + "def_splash_damage" "damage_napalmSplash" + + "speed" "1200" + "angular_velocity" "-10 5 1" + "settle_duration" "0.08" + + "linear_friction" "0" + "angular_friction" "0" + "contact_friction" "10" + //"bounce" ".65" + "gravity" "1.2" + "fuse" "2.5" + + "detonate_on_fuse" "1" + "detonate_on_death" "0" + "detonate_on_world" "1" + "detonate_on_actor" "1" + + "impact_gib" "1" + "decal_size" "75" + + "flyEffectAttenuateSpeed" "200" + + "airBurst_desc" "midair_" + + "fx_fly" "effects/weapons/napalmgun/flyburn.fx" + "fx_fly_mp_low" "effects/weapons/napalmgun/flyburn_mp_low.fx" + "fx_impact_water" "effects/ambient/splash_med.fx" + + "snd_ricochet" "weapon_napalmgun_bounce" + + // These are the impact effects and the detonation effects. + //"fx_detonate" "effects/weapons/napalmgun/detonate.fx" + //"fx_impact" "effects/weapons/napalmgun/areaburn" + //"fx_impact_actor" "effects/weapons/napalmgun/actorimpact" + + "fx_impact_actor" "effects/weapons/rocketlauncher/detonate.fx" + "fx_impact" "effects/weapons/napalmgun/impact.fx" + "fx_detonate" "effects/weapons/napalmgun/detonate.fx" + + //"delay_residual" "1.5" + //"residual_time" "6" + //"def_residual_damage" "damage_lightTank_residualPlasma" + + + //spawn impact entity information + "def_impactEntity" "impact_napalm_projectile" + "numImpactEntities" "1" + "ieMinPitch" "20" + "ieMaxPitch" "50" + "ieSlicePercentage" "1.00" + + "net_syncPhysics" "1" + + "fx_teleport_enter" "effects/mp/item_teleport.fx" + "fx_teleport" "effects/mp/item_teleport.fx" + + "no_impact_prediction" "1" +} + +entityDef impact_napalm_projectile +{ + //"inherit" "projectile_grenade" + "spawnclass" "idProjectile" + "size" "1 1 1" + "noshadows" "1" + "clipmask_largeshot" "0" + "no_contents" "0" + + "model" "models/weapons/napalmgun/flame_gun_globsmall.ase" + + "fuse" "6.0" + "fuse_random" "0.4" + "speed" "1" + "gravity" "1.2" + "remove_time" "100" + + "angular_velocity" "-10 5 1" + + "linear_friction" "0" + "angular_friction" "0" + "contact_friction" "10" + + "detonate_on_fuse" "0" + "detonate_on_death" "0" + "detonate_on_world" "0" + "detonate_on_actor" "0" + "detonate_on_bounce" "0" + + "flyEffectAttenuateSpeed" "200" + "fx_launch" "effects/weapons/napalmgun/globburn.fx" + "fx_fly" "effects/weapons/napalmgun/flyburn.fx" + + "delay_emit_damage" "0.75" + "def_emit_damage" "damage_napalmGlobEmit" + + "fx_teleport_enter" "effects/mp/item_teleport.fx" + "fx_teleport" "effects/mp/item_teleport.fx" + + "net_syncPhysics" "1" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Damage +//-------------------------------------------------------------------------------------------------------------------- + +entityDef damage_napalmDirect +{ + "damage" "70" + "gib" "1" + "knockback" "60" + "deathPush" "200" + "deathPushMin" "3000 2000" + "deathPushMax" "5000 3000" +} + +entityDef damage_napalmSplash +{ + "damage" "70" + "radius" "140" + "attackerDamageScale" "1.0" + "knockback" "60" + "gib" "0" + "deathPush" "100" + "deathPushMin" "3000 2000" + "deathPushMax" "5000 3000" +} + +entityDef damage_napalmGlobEmit +{ + "damage" "15" + "radius" "140" + "attackerDamageScale" "1.0" + "knockback" "0" + "gib" "0" + "deathPush" "100" + "deathPushMin" "3000 2000" + "deathPushMax" "5000 3000" +} diff --git a/q4base/def/weapons/railgun.def b/q4base/def/weapons/railgun.def new file mode 100644 index 00000000..c91cc1d4 --- /dev/null +++ b/q4base/def/weapons/railgun.def @@ -0,0 +1,460 @@ +//---------------------------------------------------------------- +// railgun.def +// +// Copyright 2002-2004 Raven Software +//---------------------------------------------------------------- + +export railgun +{ + options -prefix SROCKET_ -scale .4 -parent lft_wrst srocket_body -keep lft_shldr lft_elbo lft_wrst lft_thmb_1 lft_ndx_1 lft_mddl_1 lft_ring_5 lft_pnky_1 lft_thmb_2 lft_ndx_2 lft_mddl_2 lft_ring_2 lft_pnky_2 lft_thmb_3 lft_ndx_3 lft_mddl_3 lft_ring_3 lft_pnky_3 lft_thmb_4 lft_ndx_4 lft_mddl_4 lft_ring_4 lft_pnky_4 rt_elbo rt_wrst rt_ring_1 rt_ndx_1 rt_thmb_1 rt_ring_2 rt_ndx_2 rt_thmb_2 rt_ring_3 rt_ndx_3 rt_thmb_3 rt_ring_4 rt_ndx_4 rt_thmb_4 srocket_muzzle_flash + +//-keepmeshprefix srocket_ +//-keepmesh rt_arm_mesh +//-keepmesh lft_arm_mesh + + addoptions -skipmesh rt_strogg_arm_mesh + addoptions -skipmesh lft_strogg_arm_mesh + + mesh work/models/weapons/railgun/animations/railgun_idle.ma -dest models/weapons/railgun/view + anim work/models/weapons/railgun/animations/railgun_idle.ma -dest models/weapons/railgun/idle + anim work/models/weapons/railgun/animations/railgun_raise.ma -dest models/weapons/railgun/raise + anim work/models/weapons/railgun/animations/railgun_lower.ma -dest models/weapons/railgun/lower + + anim work/models/weapons/railgun/animations/railgun_reload_v2.ma -dest models/weapons/railgun/reload + +// anim work/models/weapons/railgun/animations/railgun_reload_noArm.ma -dest models/weapons/railgun/reload + anim work/models/weapons/railgun/animations/railgun_fire_slow2.ma -dest models/weapons/railgun/fire_slow + anim work/models/weapons/railgun/animations/railgun_fire_slow2.ma -dest models/weapons/railgun/fire_fast + anim work/models/weapons/railgun/animations/railgun_fire_slow_vs01.ma -dest models/weapons/railgun/fire_fast_2 + anim work/models/weapons/railgun/animations/railgun_multiplayer_fire.ma -dest models/weapons/railgun/fire_inview_multiplayer + +} + +export railgun_strogg +{ + options -prefix SROCKET_ -scale .4 -parent lft_wrst srocket_body -keep lft_shldr lft_elbo lft_wrst lft_thmb_1 lft_ndx_1 lft_mddl_1 lft_ring_5 lft_pnky_1 lft_thmb_2 lft_ndx_2 lft_mddl_2 lft_ring_2 lft_pnky_2 lft_thmb_3 lft_ndx_3 lft_mddl_3 lft_ring_3 lft_pnky_3 lft_thmb_4 lft_ndx_4 lft_mddl_4 lft_ring_4 lft_pnky_4 rt_elbo rt_wrst rt_ring_1 rt_ndx_1 rt_thmb_1 rt_ring_2 rt_ndx_2 rt_thmb_2 rt_ring_3 rt_ndx_3 rt_thmb_3 rt_ring_4 rt_ndx_4 rt_thmb_4 srocket_muzzle_flash + addoptions -skipmesh rt_arm_mesh + addoptions -skipmesh lft_arm_mesh + mesh work/models/weapons/railgun/animations/railgun_idle.ma -dest models/weapons/railgun/view_strogg +} + +export railgun +{ + options -prefix PLAYER_RG_ -scale .4 -keep ATTACHER -sourcedir work/models/characters/marine/animation_mocap_cinematics -destdir models/weapons/railgun/world -rename ATTACHER origin -clearorigin + mesh newMarine_oneframe_idle.ma -dest railgun + anim newMarine_oneframe_idle.ma -dest idle + + +} + +entityDef viewStyle_shouldered_railgun { + "viewoffset" "0 3 0" + "viewangles" "-3.5 -6 3" +} + +entityDef viewStyle_q3_railgun { + "viewoffset" "0 1.6 0" + "viewangles" "-3 -9.4 2.3" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Weapon Defintion +//-------------------------------------------------------------------------------------------------------------------- + +entityDef weapon_railgun +{ + "editor_menu" "pickup" + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + + "editor_usage" "Railgun" + + "spawnclass" "idItem" + "weaponclass" "rvWeaponRailgun" + "size" "32 32 32" + "model_view" "weapon_railgun_view" + "model_view_strogg" "weapon_railgun_view_strogg" + "model_world" "weapon_railgun_world" + "model" "models/weapons/railgun/world/w_rg.lwo" + "def_dropItem" "weapon_railgun" + + "joint_attach" "RG_ATTACHER" + "joint_view_flash" "srocket_muzzle_flash" + "joint_view_barrel" "srocket_muzzle_flash" + "joint_world_flash" "muzzle_flash" + + "fireRate" "1.6" + "spread" "0" + + "inv_weapon" "weapon_railgun" + "inv_start_ammo_railgun" "10" + "inv_item" "1" + "inv_icon" "gfx/guis/hud/icons/item_railgun" + "inv_name" "#str_107408" + + "def_hitscan" "hitscan_railgun" + "mtr_crosshair" "gfx/guis/crosshairs/crosshair_railgun" + + "ammoType" "ammo_railgun" + "ammoRequired" "1" + "clipSize" "3" + "lowAmmo" "1" + "continuousFire" "1" + "dryFireReload" "1" + "switchWhenEmpty" "0" + "gui" "guis/weapons/railgun.gui" + "mtr_icon" "gfx/guis/hud/icons/gun_railgun" + + "ammoRegenStep" "1" + "ammoRegenTime" "2750" + + "muzzle_kick_time" "0.2" + "muzzle_kick_maxtime" "0.6" + "muzzle_kick_angles" "0 0 0" + "muzzle_kick_offset" "0.5 .15 .15" // 1 1 2" //"2.5 1 2" + + "recoilTime" "600" + "recoilAngles" "-.10 0 0" + + "barrelPressure" "250" + + "weapon_scriptobject" "weapon_railgun" + + "mtr_flashShader" "lights/muzzleflash" + "flashColor" "0.72 1 .9" + "flashRadius" "260" + "flashPointLight" "1" + "flashTime" "1" + "flashViewOffset" "15 -5 -5" + + "def_mod1" "wpmod_railgun_penetrate" + + "snd_zoomIn" "weapon_railgun_scope_in" + "snd_zoomOut" "weapon_railgun_scope_out" + "snd_quaddamage" "weapon_quaddamage_fire" + "snd_acquire" "pickup_weapon" + "snd_idle_hum" "weapon_railgun_hum" + "snd_noAmmo" "weapon_railgun_dryfire" + + "fx_muzzleflash" "effects/weapons/railgun/muzzleflash.fx" + "fx_muzzleflash_mp" "effects/weapons/railgun/muzzleflash_mp.fx" + "fx_muzzleflash_world" "effects/weapons/railgun/muzzleflash_world.fx" + "fx_respawn" "effects/mp/itemrespawn.fx" + + "def_viewStyle" "viewStyle_q3_railgun" + "def_viewStyle1" "viewStyle_shouldered_railgun" + + "foreshorten" ".55" + + "launchFromBarrel" "0" + + "mtr_guiLightShader" "lights/viewWeaponGuiLight" + "glightRadius" "1.1" + "glightOffset" "1.8 2.0 .9" + + "weaponAngleOffsetAverages" "10" + "weaponAngleOffsetScale" ".25" + "weaponAngleOffsetMax" "5" + "weaponOffsetTime" "600" + "weaponOffsetScale" "0.003" + + "zoomFov" "40" + "zoomTime" ".1" + "zoomHideCrosshair" "0" + "gui_zoom" "guis/weapons/railgun_scope.gui" + + "net_syncPhysics" "1" +} + +entityDef weapon_railgun_mp +{ + "inherit" "weapon_railgun" + "model_view" "weapon_railgun_view_mp" + "editor_ignore" "1" + "clipsize" "0" + "fireRate" "1.5" + "inv_icon" "gfx/guis/hud/icons/item_railgun_colored.tga" + "mtr_simple_icon" "simpleicons/item_railgun_colored.tga" + "simple_icon_scale" "32.0" + "triggerSize" "32" + + "muzzle_kick_time" "0" + "muzzle_kick_maxtime" "0" + "muzzle_kick_angles" "0 0 0" + "muzzle_kick_offset" "0 0 0" + "recoilTime" "0" + "recoilAngles" "0 0 0" + "muzzleTint" "1" + + "respawn_Team DM" "30" + "respawn_Tourney" "15" + + // played when you touch a weapon you can't acquire, i.e. weaponStay in MP + "snd_noAcquire" "pickup_weaponstay" + + "inv_start_ammo_railgun" "7" +} + +entityDef moveable_item_railgun +{ + "inherit" "weapon_railgun" + + "editor_rotatable" "1" + + "itemclipmodel" "models/weapons/railgun/world/w_rg_clip.lwo" + + "spawnclass" "idMoveableItem" + "mass" "4000" + "density" "0.05" + "friction" "0.2" + "bouncyness" "0" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Models +//-------------------------------------------------------------------------------------------------------------------0 + +model weapon_railgun_view +{ + mesh models/weapons/railgun/view.md5mesh + + offset (-3 1.65 .75) + + anim idle models/weapons/railgun/idle.md5anim + anim raise models/weapons/railgun/raise.md5anim + { + frame 8 sound_weapon weapon_railgun_readjust3 + frame 10 sound_item weapon_railgun_smallcharge + } + anim putaway models/weapons/railgun/lower.md5anim + { + frame 1 sound_weapon weapon_switch + } + anim fire models/weapons/railgun/fire_fast_2.md5anim + { + frame 1 sound_weapon weapon_railgun_fire + frame 1 sound_item weapon_railgun_fire_stereo + frame 3 sound weapon_railgun_charge + frame 4 sound weapon_railgun_readjust + frame 5 sound weapon_railgun_readjust3 + frame 21 sound weapon_railgun_readjust2 + } + anim reload models/weapons/railgun/reload.md5anim + { + rate 1.2 + frame 20 sound weapon_railgun_clipin + frame 35 sound weapon_railgun_clipout + frame 43 sound weapon_railgun_smallcharge + } +} + +model weapon_railgun_view_mp +{ + mesh models/weapons/railgun/view.md5mesh + + offset (-3 1.65 .75) + + anim idle models/weapons/railgun/idle.md5anim + anim raise models/weapons/railgun/raise.md5anim + { + frame 8 sound_weapon weapon_railgun_readjust3 + frame 10 sound_item weapon_railgun_smallcharge + } + anim putaway models/weapons/railgun/lower.md5anim + { + frame 1 sound_weapon weapon_switch + } +// anim fire models/weapons/railgun/fire_fast.md5anim + anim fire models/weapons/railgun/fire_inview_multiplayer.md5anim + { + frame 1 sound_weapon weapon_railgun_fire + frame 1 sound_item weapon_railgun_fire_stereo + frame 3 sound weapon_railgun_charge + frame 4 sound weapon_railgun_readjust + frame 5 sound weapon_railgun_readjust3 + frame 21 sound weapon_railgun_readjust2 + } + anim reload models/weapons/railgun/reload.md5anim + { + rate 1.6 + frame 20 sound_weapon weapon_railgun_clipin + frame 35 sound_item weapon_railgun_clipout + frame 43 sound_weapon weapon_railgun_smallcharge + } +} + +model weapon_railgun_view_strogg +{ + inherit weapon_railgun_view + mesh models/weapons/railgun/view_strogg.md5mesh +} + +model weapon_railgun_world +{ + + mesh models/weapons/railgun/world/railgun.md5mesh + anim idle models/weapons/railgun/world/idle.md5anim + +/* + mesh models/test/doom3/weapons/plasmagun_world/worldplasmagun.md5mesh + anim raise models/test/doom3/weapons/plasmagun_world/plasmagun_idle.md5anim + anim idle models/test/doom3/weapons/plasmagun_world/plasmagun_idle.md5anim + anim aim models/test/doom3/weapons/plasmagun_world/plasmagun_idle.md5anim + anim fire1 models/test/doom3/weapons/plasmagun_world/plasmagun_idle.md5anim + anim reload models/test/doom3/weapons/plasmagun_world/plasmagun_idle.md5anim + anim noammo models/test/doom3/weapons/plasmagun_world/plasmagun_idle.md5anim + anim putaway models/test/doom3/weapons/plasmagun_world/plasmagun_idle.md5anim +*/ +} + +//-------------------------------------------------------------------------------------------------------------------- +// Mods +//-------------------------------------------------------------------------------------------------------------------- + +entityDef wpmod_railgun_penetrate +{ + "mod_showsurface" "models/weapons/railgun/rg_mod" + "def_hitscan" "hitscan_railgun_penetrate" + + "weapon" "weapon_railgun" +} + +entityDef weaponmod_railgun_penetrate +{ + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + + "editor_menu" "pickup" + "editor_usage" "Railgun penetrate mod" + + "spawnclass" "idItem" + "size" "32 32 32" + "inv_weaponmod" "wpmod_railgun_penetrate" + "inv_ammo_railgun" "20" + "inv_item" "1" + "inv_icon" "gfx/guis/hud/icons/item_railgun.tga" + "inv_name" "#str_107439" + + "model" "models/items/ammo/ammo_box.lwo" + + "net_syncPhysics" "1" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Hitscan +//-------------------------------------------------------------------------------------------------------------------- + +entityDef hitscan_railgun +{ + "range" "40000" + + "push" "40000" + + "def_damage" "damage_railgun" + + "fx_impact" "effects/weapons/railgun/impact_default.fx" + "fx_impact_water" "effects/ambient/splash_med.fx" + "fx_path" "effects/weapons/railgun/trail.fx" + "fx_impact_bpglass" "effects/weapons/railgun/impact_bpglass.fx" + "fx_impact_glass" "effects/weapons/railgun/impact_glass.fx" + "fx_impact_concrete" "effects/weapons/railgun/impact_concrete.fx" + "fx_impact_rock" "effects/weapons/railgun/impact_concrete.fx" + "fx_impact_electronics" "effects/weapons/railgun/impact_electronics.fx" + "fx_impact_flesh" "effects/weapons/railgun/impact_flesh.fx" + "fx_impact_monstermetal" "effects/weapons/railgun/impact_flesh.fx" + "fx_impact_mp" "effects/weapons/railgun/impact_default_mp.fx" + "fx_impact_concrete_mp" "effects/weapons/railgun/impact_default_mp.fx" + "fx_impact_rock_mp" "effects/weapons/railgun/impact_default_mp.fx" + "fx_impact_glass_mp" "effects/weapons/railgun/impact_default_mp.fx" + "fx_impact_bpglass_mp" "effects/weapons/railgun/impact_default_mp.fx" + "fx_impact_electronics_mp" "effects/weapons/railgun/impact_default_mp.fx" + "fx_path_mp" "effects/weapons/railgun/trail_mp.fx" + "fxOriginOffset" "0 -15 10" +} + +entityDef hitscan_railgun_mp +{ + // stupid inherit doesn't work here? + "range" "40000" + + "push" "40000" + + "def_damage" "damage_railgun" + + "fx_impact" "effects/weapons/railgun/impact_default.fx" + "fx_impact_water" "effects/ambient/splash_med.fx" + "fx_path" "effects/weapons/railgun/trail.fx" + "fx_path_mp_low" "effects/weapons/railgun/trail_mp_low.fx" + "fx_impact_bpglass" "effects/weapons/railgun/impact_bpglass.fx" + "fx_impact_glass" "effects/weapons/railgun/impact_glass.fx" + "fx_impact_concrete" "effects/weapons/railgun/impact_concrete.fx" + "fx_impact_rock" "effects/weapons/railgun/impact_concrete.fx" + "fx_impact_electronics" "effects/weapons/railgun/impact_electronics.fx" + "fx_impact_flesh" "effects/weapons/railgun/impact_flesh.fx" + "fx_impact_monstermetal" "effects/weapons/railgun/impact_flesh.fx" + "fx_impact_mp" "effects/weapons/railgun/impact_default_mp.fx" + "fx_impact_concrete_mp" "effects/weapons/railgun/impact_default_mp.fx" + "fx_impact_rock_mp" "effects/weapons/railgun/impact_default_mp.fx" + "fx_impact_glass_mp" "effects/weapons/railgun/impact_default_mp.fx" + "fx_impact_bpglass_mp" "effects/weapons/railgun/impact_default_mp.fx" + "fx_impact_electronics_mp" "effects/weapons/railgun/impact_default_mp.fx" + "fx_path_mp" "effects/weapons/railgun/trail_mp.fx" + "penetrate" "1.0" + "fxOriginOffset" "0 -15 10" + "hitscanTint" "1" +} + +entityDef hitscan_railgun_reflect_I +{ + "inherit" "hitscan_railgun" + "reflect" "1" + "reflect_powerup" ".25" + + "fx_reflect" "effects/weapons/railgun/reflect.fx" +} + +entityDef hitscan_railgun_reflect_II +{ + "inherit" "hitscan_railgun_reflect_I" + "reflect_powerup" ".3" +} + +entityDef hitscan_railgun_penetrate +{ + "inherit" "hitscan_railgun" + "penetrate" ".85" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Damage +//-------------------------------------------------------------------------------------------------------------------0 + +entityDef damage_railgun +{ + "damage" "125" + "push" "500" + "knockback" "100" + "gib" "1" + + "dv_time" "500" + "dv_scale" ".1" + + "fx_wound" "effects/wounds/energy.fx" + +// "deathPush" "200" + "deathPush" "400" + "deathPushMin" "4000 400" + "deathPushMax" "7000 500" + + "bleed" "1" + + "pain" "concussive" +} + +entityDef damage_railgun_mp +{ + "inherit" "damage_railgun" + "damage" "90" +} diff --git a/q4base/def/weapons/rocketlauncher.def b/q4base/def/weapons/rocketlauncher.def new file mode 100644 index 00000000..e54c86cf --- /dev/null +++ b/q4base/def/weapons/rocketlauncher.def @@ -0,0 +1,439 @@ +//---------------------------------------------------------------- +// rocketlauncher.def +// +// Copyright 2002-2004 Raven Software +//---------------------------------------------------------------- + +export rocketlauncher +{ + options -prefix SRL_ -scale .4 -keep muzzle_flash l_vent r_vent -sourcedir work/models/weapons/strogg_rocket_launcher/animations -destdir models/weapons/rocketlauncher + + addoptions -skipmesh rt_strogg_arm_mesh + addoptions -skipmesh lft_strogg_arm_mesh + + mesh idle_00.ma -dest mesh + anim idle_00.ma -dest idle + anim fire_00.ma -dest fire + anim raise_00.ma -dest raise + anim lower_00.ma -dest lower + anim reload_fast.ma -dest reload + anim reload_fast.ma -dest reload_empty -range 1 17 + anim reload_fast.ma -dest idle_empty -range 17 18 + anim reload_fast.ma -dest ammo_pickup -range 16 20 +} + +export rocketlauncher_strogg +{ + options -prefix SRL_ -scale .4 -keep muzzle_flash l_vent r_vent -sourcedir work/models/weapons/strogg_rocket_launcher/animations -destdir models/weapons/rocketlauncher + addoptions -skipmesh rt_arm_mesh + addoptions -skipmesh lft_arm_mesh + mesh idle_00.ma -dest mesh_strogg +} + +export rocketlauncher +{ + options -prefix PLAYER_RKT_ -scale .4 -keep muzzle_flash ATTACHER -sourcedir work/models/characters/marine/animation_mocap_cinematics -destdir models/weapons/rocketlauncher/world -rename ATTACHER origin -clearorigin + mesh newMarine_oneframe_idle.ma -dest rocketlauncher + anim newMarine_oneframe_idle.ma -dest idle +} + +entityDef viewStyle_q3_rocketlauncher { + "viewoffset" "-2.6 2.2 2.3" + "viewangles" "5.7 -3.9 -1.2" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Weapon Definition +//-------------------------------------------------------------------------------------------------------------------- +entityDef weapon_rocketlauncher +{ + "editor_menu" "pickup" + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + + "editor_usage" "Rocket Launcher" + + "modelindex" "MODELINDEX_ROCKETLAUNCHER" + + "spawnclass" "idItem" + "weaponclass" "rvWeaponRocketLauncher" + "size" "32 32 32" + "model_view" "weapon_rocketlauncher_view" + "model_view_strogg" "weapon_rocketlauncher_view_strogg" + "model_world" "weapon_rocketlauncher_world" + "model" "models/weapons/rocketlauncher/w_rl.lwo" + "def_dropItem" "weapon_rocketlauncher" + "mtr_crosshair" "gfx/guis/crosshairs/crosshair_rocketlauncher" + + "joint_attach" "RKT_ATTACHER" + "joint_view_flash" "muzzle_flash" + "joint_view_barrel" "muzzle_flash" + "joint_world_flash" "muzzle_flash" + + "inv_weapon" "weapon_rocketlauncher" + "inv_start_ammo_rocketlauncher" "10" + "inv_item" "1" + "inv_icon" "gfx/guis/hud/icons/item_rocket.tga" + "inv_name" "#str_107409" + + "fireRate" ".8" + "reloadRate" ".8" + "spread" "0" + + "ammoRegenStep" "1" + "ammoRegenTime" "1750" + + "weaponname" "Rocket Launcher" + "def_projectile" "projectile_rocket" + "ammoType" "ammo_rocketlauncher" + "clipSize" "1" + "ammoRequired" "1" + "gui" "guis/weapons/rocketlauncher_ammo.gui" + "mtr_icon" "gfx/guis/hud/icons/gun_rocketlauncher" + + "muzzle_kick_time" "0.5" + "muzzle_kick_maxtime" "0.5" + "muzzle_kick_angles" "-15 0 0" + "muzzle_kick_offset" "3 0 3" + + "recoilTime" "500" + "recoilAngles" "-.20 0 0" + + "mtr_flashShader" "lights/muzzleflash" + "flashColor" "0.99 0.84 .31" + "flashRadius" "200" + "flashPointLight" "1" + "flashTime" ".1" + "flashViewOffset" "15 -5 -5" + + "mtr_guiLightShader" "lights/viewWeaponGuiLight" + + "fx_muzzleflash" "effects/weapons/rocketlauncher/muzzleflash.fx" + "fx_muzzleflash_world" "effects/weapons/rocketlauncher/muzzleflash_world.fx" + "fx_respawn" "effects/mp/itemrespawn.fx" + + "snd_acquire" "pickup_weapon" + "snd_quaddamage" "weapon_quaddamage_fire" + "snd_noAmmo" "weapon_rocketlauncher_dryfire" + + "foreshorten" ".6" + + "def_viewStyle" "viewStyle_q3_rocketlauncher" + + "weaponAngleOffsetAverages" "10" + "weaponAngleOffsetScale" ".15" + "weaponAngleOffsetMax" "3" + "weaponOffsetTime" "600" + "weaponOffsetScale" "0.002" + +// "launchFromBarrel" "1" + + "def_mod1" "wpmod_rocketlauncher_burst" + "def_mod2" "wpmod_rocketlauncher_homing" + + "net_syncPhysics" "1" +} + +entityDef moveable_item_rocketlauncher +{ + "inherit" "weapon_rocketlauncher" + + "editor_rotatable" "1" + + "itemclipmodel" "models/weapons/rocketlauncher/w_rl_clip.lwo" + + + "spawnclass" "idMoveableItem" + "mass" "5000" + "density" "0.05" + "friction" "0.2" + "bouncyness" "0" +} + +entityDef weapon_rocketlauncher_mp +{ + "inherit" "weapon_rocketlauncher" + + "muzzle_kick_time" "0" + "muzzle_kick_maxtime" "0" + "muzzle_kick_angles" "0 0 0" + "muzzle_kick_offset" "0 0 0" + "recoilTime" "0" + "recoilAngles" "0 0 0" + + "inv_icon" "gfx/guis/hud/icons/item_rocket_colored" + "mtr_simple_icon" "simpleicons/item_rocket_colored" + "simple_icon_scale" "32.0" + "triggerSize" "32" + + "respawn_Team DM" "30" + "respawn_Tourney" "15" + + // played when you touch a weapon you can't acquire, i.e. weaponStay in MP + "snd_noAcquire" "pickup_weaponstay" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Models +//-------------------------------------------------------------------------------------------------------------------- + +model weapon_rocketlauncher_view +{ + mesh models/weapons/rocketlauncher/mesh.md5mesh + + channel legs ( *origin -*reload_rack -*ram -iris_bone_6 -iris_bone_5 -iris_bone_4 -iris_bone_3 -iris_bone_2 -iris_bone_1 ) + channel torso ( *reload_rack *ram iris_bone_6 iris_bone_5 iris_bone_4 iris_bone_3 iris_bone_2 iris_bone_1 ) + + anim idle models/weapons/rocketlauncher/idle.md5anim + anim fire models/weapons/rocketlauncher/fire.md5anim + { + rate .25 + + frame 1 sound_weapon player_rocketlauncher_fire + frame 1 sound_item player_rocketlauncher_fire_stereo + } + + anim idle_empty models/weapons/rocketlauncher/idle_empty.md5anim + + anim reload models/weapons/rocketlauncher/reload.md5anim + { + rate 2 + frame 5 sound player_rocketlauncher_load + frame 8 object_call AddToClip + frame 9 sound player_rocketlauncher_servo + } + + anim reload_empty models/weapons/rocketlauncher/reload_empty.md5anim + { + frame 5 sound player_rocketlauncher_load + frame 8 object_call AddToClip + frame 8 sound player_rocketlauncher_servo + } + + anim raise models/weapons/rocketlauncher/raise.md5anim + anim putaway models/weapons/rocketlauncher/lower.md5anim + { + frame 1 sound weapon_switch + } + + anim ammo_pickup models/weapons/rocketlauncher/ammo_pickup.md5anim +} + +model weapon_rocketlauncher_view_strogg +{ + inherit weapon_rocketlauncher_view + + mesh models/weapons/rocketlauncher/mesh_strogg.md5mesh + + channel legs ( *origin -*reload_rack -*ram -iris_bone_6 -iris_bone_5 -iris_bone_4 -iris_bone_3 -iris_bone_2 -iris_bone_1 ) + channel torso ( *reload_rack *ram iris_bone_6 iris_bone_5 iris_bone_4 iris_bone_3 iris_bone_2 iris_bone_1 ) +} + +model weapon_rocketlauncher_world +{ + mesh models/weapons/rocketlauncher/world/rocketlauncher.md5mesh + anim idle models/weapons/rocketlauncher/world/idle.md5anim +} + +//-------------------------------------------------------------------------------------------------------------------- +// Mods +//-------------------------------------------------------------------------------------------------------------------- + +// twhitaker: ugly hack to make it so that we only have a single rocket launcher mod. +// basically getting either of the mods is equivalent to getting both of the mods. +entityDef wpmod_rocketlauncher_burst +{ + "weapon" "weapon_rocketlauncher" + + "def_projectile" "projectile_rocket_homing" + + "fx_guide" "effects/weapons/rocketlauncher/guide.fx" + "zoomFov" "90" + + "lockRange" "10000" + "lockSlowdown" ".25" + "lockAccelTime" ".5" + + "clipSize" "3" + "fireRate" ".3" +} + +entityDef wpmod_rocketlauncher_homing +{ + "weapon" "weapon_rocketlauncher" + + "mod_showsurface" "models/weapons/rocketlauncher/rl_seeker" + + "def_projectile" "projectile_rocket_homing" + + "fx_guide" "effects/weapons/rocketlauncher/guide.fx" + "zoomFov" "90" + + "lockRange" "10000" + "lockSlowdown" ".25" + "lockAccelTime" ".5" + + "clipSize" "3" + "fireRate" ".3" +} + +entityDef weaponmod_rocketlauncher_burst +{ + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + "editor_menu" "pickup" + "editor_usage" "RocketLauncher burst fire modification" + + "spawnclass" "idItem" + "size" "32 32 32" + "inv_weaponmod" "wpmod_rocketlauncher_burst" + "inv_ammo_rocketlauncher" "10" + "inv_item" "1" + "model" "models/items/ammo/ammo_box.lwo" + + "net_syncPhysics" "1" +} + +entityDef weaponmod_rocketlauncher_homing +{ + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + "editor_menu" "pickup" + "editor_usage" "RocketLauncher homing rocket modification" + + "spawnclass" "idItem" + "size" "32 32 32" + "inv_weaponmod" "wpmod_rocketlauncher_homing" + "inv_ammo_rocketlauncher" "10" + "inv_item" "1" + "inv_icon" "gfx/guis/hud/icons/item_rocket.tga" + "inv_name" "#str_107440" + "model" "models/items/ammo/ammo_box.lwo" + + "net_syncPhysics" "1" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Projectile +//-------------------------------------------------------------------------------------------------------------------- + +entityDef projectile_rocket +{ + "spawnclass" "idProjectile" + "size" "7 7 7" + "cone" "2" + "noshadows" "1" + "clipmask_largeshot" "1" + + "model" "models/weapons/rocketlauncher/rocket.lwo" + "def_damage" "damage_rocketDirect" + "def_splash_damage" "damage_rocketSplash" + + "speed" "900" + "fuse" "6" + "push" "48000" + + + "detonate_on_fuse" "1" + "detonate_on_death" "0" + "detonate_on_world" "1" + "detonate_on_actor" "1" + "detonate_on_bounce" "1" + + "impact_gib" "1" + "decal_size" "75" + + "fx_fly" "effects/weapons/rocketlauncher/fly.fx" + "fx_fly_mp" "effects/weapons/rocketlauncher/fly_mp.fx" + "fx_fly_mp_low" "effects/weapons/rocketlauncher/fly_mp_low.fx" + "fx_detonate" "effects/weapons/rocketlauncher/detonate.fx" + "fx_detonate_mp" "effects/weapons/rocketlauncher/detonate_mp.fx" + "fx_impact" "effects/weapons/rocketlauncher/impact.fx" + "fx_impact_mp" "effects/weapons/rocketlauncher/impact_mp.fx" + "fx_impact_water" "effects/ambient/splash_med.fx" + "fx_impact_rock" "effects/weapons/rocketlauncher/impact_concrete.fx" + "fx_impact_rock_mp" "effects/weapons/rocketlauncher/impact_mp.fx" + "fx_impact_concrete" "effects/weapons/rocketlauncher/impact_concrete.fx" + "fx_impact_concrete_mp" "effects/weapons/rocketlauncher/impact_mp.fx" + + "snd_fly" "player_rocketlauncher_fly" + + "friendly_impact" "1" + + "fx_teleport_enter" "effects/mp/item_teleport.fx" + "fx_teleport" "effects/mp/item_teleport.fx" +} + +entityDef projectile_rocket_mp +{ + "inherit" "projectile_rocket" + "predictTime" "50" + "speed" "935" + "size" "5 5 5" + "no_impact_prediction" "1" +} + +entityDef projectile_rocket_homing +{ + "inherit" "projectile_rocket" + + "spawnclass" "idGuidedProjectile" + "random" "450 450 450" + + "turn_max" "360" + "clamp_dist" "10000" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Damage +//-------------------------------------------------------------------------------------------------------------------- + +entityDef damage_rocketDirect +{ + "damage" "150" + "push" "45000" + "gib" "1" + + "deathPush" "200" + "deathPushMin" "3000 2000" + "deathPushMax" "5000 3000" + + "pain" "concussive" + "cower" "1" + +} + +entityDef damage_rocketDirect_mp +{ + "inherit" "damage_rocketDirect" + "damage" "100" + "knockback" "110" +} + +entityDef damage_rocketSplash +{ + "damage" "150" + "radius" "180" + "knockback" "100" + "push" "10000" + "gib" "0" + + "deathPush" "100" + "deathPushMin" "5000 6000" + "deathPushMax" "7000 8000" + + "pain" "concussive" + + "cower" "1" +} + +entityDef damage_rocketSplash_mp +{ + "inherit" "damage_rocketSplash" + "knockback" "110" + "damage" "100" + "radius" "120" +} \ No newline at end of file diff --git a/q4base/def/weapons/shotgun.def b/q4base/def/weapons/shotgun.def new file mode 100644 index 00000000..a0ddcc5c --- /dev/null +++ b/q4base/def/weapons/shotgun.def @@ -0,0 +1,378 @@ +//---------------------------------------------------------------- +// shotgun.def +// +// Copyright 2002-2004 Raven Software +//---------------------------------------------------------------- + +export shotgun +{ + options -prefix SHOTGUN_ -keep lft_pnky_3 -scale .4 -keep flash eject -parent lft_wrst body + + addoptions -skipmesh rt_strogg_arm_mesh + addoptions -skipmesh lft_strogg_arm_mesh + + mesh work/models/weapons/marine_shotgun/animations/SHOTGUN_mesh.ma -dest models/weapons/shotgun/view + anim work/models/weapons/marine_shotgun/animations/SHOTGUN_fire.ma -dest models/weapons/shotgun/fire + anim work/models/weapons/marine_shotgun/animations/SHOTGUN_idle.ma -dest models/weapons/shotgun/idle + anim work/models/weapons/marine_shotgun/animations/SHOTGUN_raise.ma -dest models/weapons/shotgun/raise + anim work/models/weapons/marine_shotgun/animations/SHOTGUN_lower.ma -dest models/weapons/shotgun/lower + + anim work/models/weapons/marine_shotgun/animations/SHOTGUN_reload_start.ma -dest models/weapons/shotgun/reload_start + anim work/models/weapons/marine_shotgun/animations/SHOTGUN_reload_loop.ma -dest models/weapons/shotgun/reload_loop + anim work/models/weapons/marine_shotgun/animations/SHOTGUN_reload_end.ma -dest models/weapons/shotgun/reload_end + anim work/models/weapons/marine_shotgun/animations/SHOTGUN_reload_clip.ma -dest models/weapons/shotgun/reload_clip +} + +export shotgun_strogg +{ + options -prefix SHOTGUN_ -keep lft_pnky_3 -scale .4 -keep flash eject -parent lft_wrst body + + addoptions -skipmesh rt_arm_mesh + addoptions -skipmesh lft_arm_mesh + mesh work/models/weapons/marine_shotgun/animations/SHOTGUN_mesh.ma -dest models/weapons/shotgun/view_strogg +} + +export shotgun +{ + options -prefix PLAYER_SG_ -scale .4 -keep ATTACHER muzzle_flash -sourcedir work/models/characters/marine/multiplayer -destdir models/weapons/shotgun/world -rename ATTACHER origin -clearorigin + mesh shotgun_idle.ma -dest shotgun + anim shotgun_idle.ma -dest idle +} + +entityDef viewStyle_shouldered_shotgun { + "viewoffset" "-1.6 4.5 3.7" + "viewangles" "2 -6.25 2" +} + +entityDef viewStyle_q3_shotgun { + "viewoffset" "-1.6 3.8 3.7" + "viewangles" "3 -8.5 2" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Weapon Defintion +//-------------------------------------------------------------------------------------------------------------------0 + +entityDef weapon_shotgun +{ + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + + "editor_usage" "Shotgun" + "editor_menu" "pickup" + "editor_var inv_weaponmod" "comma separated of any of the following shotgun modifications.\n - weapon_shotgun_ammo" + + "modelindex" "MODELINDEX_SHOTGUN" + + "spawnclass" "idItem" + "weaponclass" "rvWeaponShotgun" + "size" "32 32 32" + "model_view" "weapon_shotgun_view" + "model_view_strogg" "weapon_shotgun_view_strogg" + "model_world" "weapon_shotgun_world" + "model" "models/weapons/shotgun/w_sg.lwo" + "def_dropItem" "weapon_shotgun" + "def_ejectBrass" "debris_brass_shotgun" + + "joint_attach" "SG_ATTACHER" + "joint_view_flash" "flash" + "joint_view_eject" "eject" + "joint_view_guiLight" "body" + "joint_world_flash" "muzzle_flash" + + "fireRate" ".8" + "spread" "7" + "hitscans" "10" + + "inv_weapon" "weapon_shotgun" + "inv_start_ammo_shotgun" "10" + "inv_item" "1" + "inv_icon" "gfx/guis/hud/icons/item_shotgun.tga" + "inv_name" "#str_107410" + + "weaponname" "Shotgun" + "def_hitscan" "hitscan_shotgun_pellet" + "mtr_crosshair" "gfx/guis/crosshairs/crosshair_shotgun" + "ammoType" "ammo_shotgun" + "clipSize" "8" + "ammoRequired" "1" + "gui" "guis/weapons/shotgun_ammo.gui" + "mtr_icon" "gfx/guis/hud/icons/gun_shotgun" + + "muzzle_kick_time" "0.5" + "muzzle_kick_maxtime" "0.8" + "muzzle_kick_angles" "0 0 0" + "muzzle_kick_offset" "5.5 .15 .15" // 1 1 2" //"2.5 1 2" + + "ammoRegenStep" "1" + "ammoRegenTime" "1500" + + "ejectOffset" "6 -4 -3" + + "recoilTime" "600" + "recoilAngles" "-.25 0 0" + + "def_mod1" "wpmod_shotgun_ammo" + + "foreshorten" ".44" + + "mtr_flashShader" "lights/muzzleflash" + "flashColor" "1 0.8 0.4" + "flashRadius" "240" + "flashPointLight" "1" + "flashTime" ".1" + "flashViewOffset" "15 -5 -5" + + "fx_eject" "effects/weapons/shotgun/eject.fx" + "fx_muzzleflash" "effects/weapons/shotgun/muzzleflash.fx" + "fx_muzzleflash_world" "effects/weapons/shotgun/muzzleflash_world.fx" + "fx_respawn" "effects/mp/itemrespawn.fx" + + "def_viewStyle" "viewStyle_q3_shotgun" + "def_viewStyle1" "viewStyle_shouldered_shotgun" + + "weaponAngleOffsetAverages" "10" + "weaponAngleOffsetScale" ".10" + "weaponAngleOffsetMax" "2" + "weaponOffsetTime" "600" + "weaponOffsetScale" "0.002" + + "snd_quaddamage" "weapon_quaddamage_fire" + "snd_acquire" "pickup_weapon" + "snd_noAmmo" "weapon_shotgun_dryfire" + + "mtr_guiLightShader" "lights/viewWeaponGuiLight" + "glightRadius" ".9" + "glightOffset" "0 1.5 -5.0" + "glightColor" "1 0 0 1" + + "net_syncPhysics" "1" +} + +entityDef weapon_shotgun_mp +{ + "inherit" "weapon_shotgun" + "clipsize" "0" + "hidesurface" "models/weapons/shotgun/clip" + // q3 style spread + "shotgunSpreadStyle" "1" + "spread" "875" + "hitscans" "11" + "editor_ignore" "1" + "range" "131072" + "fireRate" "1.0" + "inv_icon" "gfx/guis/hud/icons/item_shotgun_colored" + "mtr_simple_icon" "simpleicons/item_shotgun_colored" + "simple_icon_scale" "32.0" + "triggerSize" "32" + + "muzzle_kick_time" "0" + "muzzle_kick_maxtime" "0" + "muzzle_kick_angles" "0 0 0" + "muzzle_kick_offset" "0 0 0" + "recoilTime" "0" + "recoilAngles" "0 0 0" + "respawn_Team DM" "30" + "respawn_Tourney" "15" + + // played when you touch a weapon you can't acquire, i.e. weaponStay in MP + "snd_noAcquire" "pickup_weaponstay" +} + +entityDef moveable_item_shotgun +{ + "inherit" "weapon_shotgun" + + "editor_rotatable" "1" + + "itemclipmodel" "models/weapons/shotgun/w_sg_clip.lwo" + + "spawnclass" "idMoveableItem" + "mass" "2000" + "density" "0.05" + "friction" "0.2" + "bouncyness" "0" + +} + +//-------------------------------------------------------------------------------------------------------------------- +// Models +//-------------------------------------------------------------------------------------------------------------------0 + +model weapon_shotgun_view +{ + mesh models/weapons/shotgun/view.md5mesh + + anim idle models/weapons/shotgun/idle.md5anim + { + rate .25 + } + anim raise models/weapons/shotgun/raise.md5anim + { + frame 5 sound weapon_shotgun_pump1 + frame 10 sound weapon_shotgun_pump2 + } + anim putaway models/weapons/shotgun/lower.md5anim + { + frame 1 sound_weapon weapon_switch + } + + anim fire1 models/weapons/shotgun/fire.md5anim + { + frame 1 sound_weapon weapon_shotgun_fire + frame 1 sound_item weapon_shotgun_fire_stereo + frame 12 sound weapon_shotgun_pump1 + frame 15 object_call EjectBrass + frame 16 sound weapon_shotgun_pump2 + } + + anim reload_start models/weapons/shotgun/reload_start.md5anim + anim reload_loop models/weapons/shotgun/reload_loop.md5anim + { + frame 4 sound_item weapon_shotgun_shell + } + + anim reload_end models/weapons/shotgun/reload_end.md5anim + { + frame 4 sound weapon_shotgun_pump1 + frame 8 sound weapon_shotgun_pump2 + } + + anim reload_clip models/weapons/shotgun/reload_clip.md5anim + { + frame 9 sound weapon_shotgun_clipout + frame 22 sound weapon_shotgun_clipin + frame 35 sound weapon_shotgun_pump1 + frame 38 sound weapon_shotgun_pump2 + } +} + +model weapon_shotgun_view_strogg +{ + inherit weapon_shotgun_view + mesh models/weapons/shotgun/view_strogg.md5mesh +} + +model weapon_shotgun_world +{ + mesh models/weapons/shotgun/world/shotgun.md5mesh + anim idle models/weapons/shotgun/world/idle.md5anim + +/* + anim idle models/weapons/shotgun/world/shotgun_idle.md5anim + anim aim models/weapons/shotgun/world/shotgun_idle.md5anim + anim fire1 models/weapons/shotgun/world/shotgun_fire1.md5anim + anim fire2 models/weapons/shotgun/world/shotgun_fire1.md5anim + anim fire3 models/weapons/shotgun/world/shotgun_fire1.md5anim + anim fire4 models/weapons/shotgun/world/shotgun_fire1.md5anim + anim fire5 models/weapons/shotgun/world/shotgun_fire1.md5anim + anim reload_start models/weapons/shotgun/world/shotgun_reload_start.md5anim + anim reload_loop models/weapons/shotgun/world/shotgun_reload_loop.md5anim + anim reload_end models/weapons/shotgun/world/shotgun_reload_end.md5anim + anim putaway models/weapons/shotgun/world/shotgun_idle.md5anim +*/ +} + +//-------------------------------------------------------------------------------------------------------------------- +// Mods +//-------------------------------------------------------------------------------------------------------------------0 + +entityDef wpmod_shotgun_ammo +{ + "weapon" "weapon_shotgun" + "mod_showsurface" "models/weapons/shotgun/clip" + "clipSize" "10" +} + +entityDef weaponmod_shotgun_ammo +{ + "editor_color" ".3 .3 1" + "editor_mins" "-16 -16 0" + "editor_maxs" "16 16 32" + "editor_menu" "pickup" + "editor_usage" "Shotgun Ammo Modification" + + "spawnclass" "idItem" + "size" "32 32 32" + "inv_weaponmod" "wpmod_shotgun_ammo" + "inv_ammo_shotgun" "32" + "inv_item" "1" + "inv_icon" "gfx/guis/hud/icons/item_shotgun.tga" + "inv_name" "#str_107431" + "model" "models/items/ammo/ammo_box.lwo" +} + +//-------------------------------------------------------------------------------------------------------------------- +// HitScan +//-------------------------------------------------------------------------------------------------------------------0 + +entityDef hitscan_shotgun_pellet +{ + "inherit" "hitscan_bullet" + "fx_impact" "effects/weapons/shotgun/impact_default.fx" + "fx_impact_water" "effects/ambient/splash_smll.fx" + "fx_impact_concrete" "effects/weapons/shotgun/impact_concrete.fx" + "fx_impact_electronics" "effects/weapons/shotgun/impact_electronics.fx" + "fx_impact_flesh" "effects/weapons/shotgun/impact_flesh.fx" + "fx_impact_glass" "effects/weapons/shotgun/impact_glass.fx" + "fx_impact_bpglass" "effects/weapons/shotgun/impact_bpglass.fx" + "fx_impact_monstermetal" "effects/weapons/shotgun/impact_monstermetal.fx" + "fx_impact_mp" "effects/weapons/shotgun/impact_default_mp.fx" + "fx_impact_concrete_mp" "effects/weapons/shotgun/impact_default_mp.fx" + "fx_impact_rock_mp" "effects/weapons/shotgun/impact_default_mp.fx" + "fx_impact_glass_mp" "effects/weapons/shotgun/impact_default_mp.fx" + "fx_impact_bpglass_mp" "effects/weapons/shotgun/impact_default_mp.fx" + "fx_impact_electronics_mp" "effects/weapons/shotgun/impact_default_mp.fx" + "def_damage" "damage_pellet" + "def_damage_flesh" "damage_pellet" + // for multiplayer clients. we only sync the hitscan def + // must be the same as weapon_shotgun_mp + "hitscans" "11" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Damage +//-------------------------------------------------------------------------------------------------------------------0 + +entityDef damage_pellet +{ + "inherit" "damage_bullet" + "damage" "14" + + "splat_size" "128" + + "deathPush" "100" + "deathPushMin" "4000 500" + "deathPushMax" "9000 600" +} + +entityDef damage_pellet_mp +{ + "inherit" "damage_pellet" + "knockback" "10" + "damage" "10" +} + +//-------------------------------------------------------------------------------------------------------------------- +// Casing +//-------------------------------------------------------------------------------------------------------------------0 + +entityDef debris_brass_shotgun { + "model" "models/weapons/shotgun/sshell_bigger.lwo" + + "scale" "0.3" + "scale_reset_duration" "0.35" + + "linear_velocity" "10 -55 75" + "linear_velocity_range" "0.1 0.2 0.25" + "angular_velocity" "0 16000 0" + "angular_velocity_range" "0 0.5 0" + + "density" "0.02" + "linear_friction" "0.2" + "angular_friction" "0.1" + "friction" "0.2" + "bouncyness" "0.1" + "snd_bounce" "shotgun_shell" +} diff --git a/src/game/Game_local.cpp b/src/game/Game_local.cpp index c7e437fb..824ae17c 100644 --- a/src/game/Game_local.cpp +++ b/src/game/Game_local.cpp @@ -552,6 +552,14 @@ void idGameLocal::Init( void ) { // jmarshall end // jmarshall + // + // load in the bot itemtable. + botItemTable = FindEntityDef("bot_itemtable", false); + if (botItemTable == NULL) + { + common->FatalError("Failed to find bot_itemtable decl!\n"); + } + // init all the bot systems. botCharacterStatsManager.Init(); botFuzzyWeightManager.Init(); diff --git a/src/game/bots/Bot.cpp b/src/game/bots/Bot.cpp index 6597b125..8a71f3cb 100644 --- a/src/game/bots/Bot.cpp +++ b/src/game/bots/Bot.cpp @@ -9,7 +9,7 @@ idCVar bot_pathdebug( "bot_pathdebug", "0", CVAR_BOOL | CVAR_CHEAT, "force the b idCVar bot_goaldist( "bot_goaldist", "20", CVAR_INTEGER | CVAR_CHEAT, "" ); idCVar bot_debugnav( "bot_debugnav", "0", CVAR_BOOL | CVAR_CHEAT, "draws navmesh paths for the bot" ); idCVar bot_showstate( "bot_showstate", "0", CVAR_BOOL | CVAR_CHEAT, "draws the bot state above the bot" ); -idCVar bot_debug( "bot_debug", "0", CVAR_BOOL, "shows debug info for the bot" ); +idCVar bot_debug( "bot_debug", "1", CVAR_BOOL, "shows debug info for the bot" ); idCVar bot_skill("bot_skill", "3", CVAR_INTEGER, ""); CLASS_DECLARATION( idPlayer, rvmBot ) @@ -72,12 +72,12 @@ void rvmBot::BotUpdateInventory( void ) bs.inventory[INVENTORY_PLASMAGUN] = HasWeapon( weapon_plasmagun ); bs.inventory[INVENTORY_BFG10K] = 0; bs.inventory[INVENTORY_GRAPPLINGHOOK] = 0; - bs.inventory[INVENTORY_SHELLS] = inventory.ammo[rvWeapon::GetAmmoIndexForName( "ammo_shells" )]; - bs.inventory[INVENTORY_BULLETS] = inventory.ammo[rvWeapon::GetAmmoIndexForName( "ammo_clip" )]; + bs.inventory[INVENTORY_SHELLS] = inventory.ammo[rvWeapon::GetAmmoIndexForName( "ammo_shotgun" )]; + bs.inventory[INVENTORY_BULLETS] = inventory.ammo[rvWeapon::GetAmmoIndexForName( "ammo_machinegun" )]; bs.inventory[INVENTORY_GRENADES] = 0; - bs.inventory[INVENTORY_CELLS] = inventory.ammo[rvWeapon::GetAmmoIndexForName( "ammo_cells" )]; + bs.inventory[INVENTORY_CELLS] = inventory.ammo[rvWeapon::GetAmmoIndexForName( "ammo_lightninggun" )]; bs.inventory[INVENTORY_LIGHTNINGAMMO] = 0; - bs.inventory[INVENTORY_ROCKETS] = inventory.ammo[rvWeapon::GetAmmoIndexForName( "ammo_rockets" )]; + bs.inventory[INVENTORY_ROCKETS] = inventory.ammo[rvWeapon::GetAmmoIndexForName( "ammo_rocketlauncher" )]; bs.inventory[INVENTORY_SLUGS] = 0; bs.inventory[INVENTORY_BFGAMMO] = 0; bs.inventory[INVENTORY_HEALTH] = health; @@ -395,19 +395,19 @@ void rvmBot::Think( void ) { ServerThink(); - //if( bot_debug.GetBool() ) - //{ - // idVec4 color; - // color = idVec4(1, 1, 1, 1); - // if (bs.enemy >= 0) - // color = idVec4(1, 0, 0, 1); - // - // idBounds bounds = idBounds( idVec3( -10, -10, -10 ), idVec3( 10, 10, 10 ) ); - // gameRenderWorld->DebugBounds( color, bounds, GetOrigin() ); - // - // idMat3 axis = viewAngles.ToMat3(); - // gameRenderWorld->DrawTextA(stateThread.GetState()->state.c_str(), GetOrigin(), 1.0f, color, axis); - //} + if( bot_debug.GetBool() ) + { + idVec4 color; + color = idVec4(1, 1, 1, 1); + if (bs.enemy >= 0) + color = idVec4(1, 0, 0, 1); + + idBounds bounds = idBounds( idVec3( -10, -10, -10 ), idVec3( 10, 10, 10 ) ); + gameRenderWorld->DebugBounds( color, bounds, GetOrigin() ); + + //idMat3 axis = viewAngles.ToMat3(); + //gameRenderWorld->DrawTextA(stateThread.GetState()->state.c_str(), GetOrigin(), 1.0f, color, axis); + } } deltaViewAngles.Zero(); From 0e7bc5d93499c55be2c1ca48e8dd0d4ad1a07557 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Mon, 26 Jul 2021 14:59:03 -0700 Subject: [PATCH 25/38] Fixed broken BotAI states. --- src/game/Game_local.cpp | 2 +- src/game/bots/Bot.cpp | 11 ++++++ src/game/bots/Bot.h | 21 ++++++----- src/game/bots/BotAI_Battle_Attacked.cpp | 2 +- src/game/bots/BotAI_Battle_Chase.cpp | 2 +- src/game/bots/BotAI_Battle_Fight.cpp | 2 +- src/game/bots/BotAI_Battle_NBG.cpp | 2 +- src/game/bots/BotAI_Battle_Retreat.cpp | 2 +- src/game/bots/BotAI_SeekLTG.cpp | 2 +- src/game/bots/BotAI_Seek_NBG.cpp | 2 +- src/game/bots/BotAI_respawn.cpp | 8 ++--- src/q4sdk.sln | 47 ++++++++++++++++++++++++- 12 files changed, 81 insertions(+), 22 deletions(-) diff --git a/src/game/Game_local.cpp b/src/game/Game_local.cpp index 824ae17c..d55e1672 100644 --- a/src/game/Game_local.cpp +++ b/src/game/Game_local.cpp @@ -8478,7 +8478,7 @@ idGameLocal::TravelTimeToGoal */ int idGameLocal::TravelTimeToGoal( const idVec3& origin, const idVec3& goal ) { - idAAS* aas = bot_aas; + idAAS* aas = GetBotAAS(); if( aas == NULL ) { diff --git a/src/game/bots/Bot.cpp b/src/game/bots/Bot.cpp index 8a71f3cb..7a9e4c9a 100644 --- a/src/game/bots/Bot.cpp +++ b/src/game/bots/Bot.cpp @@ -15,6 +15,17 @@ idCVar bot_skill("bot_skill", "3", CVAR_INTEGER, ""); CLASS_DECLARATION( idPlayer, rvmBot ) END_CLASS +CLASS_STATES_DECLARATION(rvmBot) + STATE("state_Chase", rvmBot::state_Chase) + STATE("state_BattleFight", rvmBot::state_BattleFight) + STATE("state_BattleNBG", rvmBot::state_BattleNBG) + STATE("state_Retreat", rvmBot::state_Retreat) + STATE("state_Respawn", rvmBot::state_Respawn) + STATE("state_SeekNBG", rvmBot::state_SeekNBG) + STATE("state_SeekLTG", rvmBot::state_SeekLTG) + STATE("state_Attacked", rvmBot::state_Attacked) +END_CLASS_STATES + /* =================== rvmBot::rvmBot diff --git a/src/game/bots/Bot.h b/src/game/bots/Bot.h index 5466e074..03a8c27f 100644 --- a/src/game/bots/Bot.h +++ b/src/game/bots/Bot.h @@ -906,18 +906,21 @@ class rvmBot : public idPlayer static int WP_SHOTGUN; static int WP_PLASMAGUN; static int WP_ROCKET_LAUNCHER; -private: - stateResult_t state_Chase(stateParms_t* parms); - stateResult_t state_BattleFight(stateParms_t* parms); - stateResult_t state_BattleNBG(stateParms_t* parms); - stateResult_t state_Retreat(stateParms_t* parms); - stateResult_t state_Respawn(stateParms_t* parms); - stateResult_t state_SeekNBG(stateParms_t* parms); - stateResult_t state_SeekLTG(stateParms_t* parms); - stateResult_t state_Attacked(stateParms_t* parms); +public: + stateResult_t state_Chase(const stateParms_t& parms); + stateResult_t state_BattleFight(const stateParms_t& parms); + stateResult_t state_BattleNBG(const stateParms_t& parms); + stateResult_t state_Retreat(const stateParms_t& parms); + stateResult_t state_Respawn(const stateParms_t& parms); + stateResult_t state_SeekNBG(const stateParms_t& parms); + stateResult_t state_SeekLTG(const stateParms_t& parms); + stateResult_t state_Attacked(const stateParms_t& parms); + + CLASS_STATES_PROTOTYPE(rvmBot); private: idAAS* aas; }; + extern idCVar bot_skill; diff --git a/src/game/bots/BotAI_Battle_Attacked.cpp b/src/game/bots/BotAI_Battle_Attacked.cpp index b994b9a3..18888d25 100644 --- a/src/game/bots/BotAI_Battle_Attacked.cpp +++ b/src/game/bots/BotAI_Battle_Attacked.cpp @@ -10,7 +10,7 @@ rvmBot::state_Attacked ================== */ -stateResult_t rvmBot::state_Attacked(stateParms_t* parms) { +stateResult_t rvmBot::state_Attacked(const stateParms_t& parms) { // respawn if dead. if (BotIsDead(&bs)) { diff --git a/src/game/bots/BotAI_Battle_Chase.cpp b/src/game/bots/BotAI_Battle_Chase.cpp index 2bed5b9f..7e14f463 100644 --- a/src/game/bots/BotAI_Battle_Chase.cpp +++ b/src/game/bots/BotAI_Battle_Chase.cpp @@ -11,7 +11,7 @@ rvmBot::state_Chase ===================== */ -stateResult_t rvmBot::state_Chase(stateParms_t* parms) +stateResult_t rvmBot::state_Chase(const stateParms_t& parms) { bot_goal_t goal; idVec3 target, dir; diff --git a/src/game/bots/BotAI_Battle_Fight.cpp b/src/game/bots/BotAI_Battle_Fight.cpp index 5180244d..8b6cc4ee 100644 --- a/src/game/bots/BotAI_Battle_Fight.cpp +++ b/src/game/bots/BotAI_Battle_Fight.cpp @@ -10,7 +10,7 @@ rvmBot::state_BattleFight ===================== */ -stateResult_t rvmBot::state_BattleFight(stateParms_t* parms) +stateResult_t rvmBot::state_BattleFight(const stateParms_t& parms) { int areanum; idVec3 target; diff --git a/src/game/bots/BotAI_Battle_NBG.cpp b/src/game/bots/BotAI_Battle_NBG.cpp index 9188deb9..f11b6516 100644 --- a/src/game/bots/BotAI_Battle_NBG.cpp +++ b/src/game/bots/BotAI_Battle_NBG.cpp @@ -10,7 +10,7 @@ rvmBot::state_BattleNBG ===================== */ -stateResult_t rvmBot::state_BattleNBG(stateParms_t* parms) +stateResult_t rvmBot::state_BattleNBG(const stateParms_t& parms) { int areanum; bot_goal_t goal; diff --git a/src/game/bots/BotAI_Battle_Retreat.cpp b/src/game/bots/BotAI_Battle_Retreat.cpp index e8298c12..95d874f5 100644 --- a/src/game/bots/BotAI_Battle_Retreat.cpp +++ b/src/game/bots/BotAI_Battle_Retreat.cpp @@ -10,7 +10,7 @@ rvmBot::state_Retreat ===================== */ -stateResult_t rvmBot::state_Retreat(stateParms_t* parms) +stateResult_t rvmBot::state_Retreat(const stateParms_t& parms) { bot_goal_t goal; idPlayer* entinfo; diff --git a/src/game/bots/BotAI_SeekLTG.cpp b/src/game/bots/BotAI_SeekLTG.cpp index 37faad03..7c8894c3 100644 --- a/src/game/bots/BotAI_SeekLTG.cpp +++ b/src/game/bots/BotAI_SeekLTG.cpp @@ -10,7 +10,7 @@ rvmBot::state_SeekLTG ===================== */ -stateResult_t rvmBot::state_SeekLTG(stateParms_t* parms) +stateResult_t rvmBot::state_SeekLTG(const stateParms_t& parms) { if( BotIsDead( &bs ) ) { diff --git a/src/game/bots/BotAI_Seek_NBG.cpp b/src/game/bots/BotAI_Seek_NBG.cpp index 1852975c..c542d4b3 100644 --- a/src/game/bots/BotAI_Seek_NBG.cpp +++ b/src/game/bots/BotAI_Seek_NBG.cpp @@ -10,7 +10,7 @@ rvmBot::state_SeekNBG ===================== */ -stateResult_t rvmBot::state_SeekNBG(stateParms_t* parms) +stateResult_t rvmBot::state_SeekNBG(const stateParms_t& parms) { bot_goal_t goal; idVec3 target, dir; diff --git a/src/game/bots/BotAI_respawn.cpp b/src/game/bots/BotAI_respawn.cpp index 4fef75f6..421650a1 100644 --- a/src/game/bots/BotAI_respawn.cpp +++ b/src/game/bots/BotAI_respawn.cpp @@ -10,16 +10,16 @@ rvmBot::state_Respawn ===================== */ -stateResult_t rvmBot::state_Respawn(stateParms_t* parms) +stateResult_t rvmBot::state_Respawn(const stateParms_t& parms) { - if (parms->stage == 0) + if (parms.stage == 0) { bs.botinput.respawn = true; - parms->stage = 1; + ((stateParms_t &)parms).stage = 1; return SRESULT_WAIT; } - if (parms->stage == 1) + if (parms.stage == 1) { if (spectating) { diff --git a/src/q4sdk.sln b/src/q4sdk.sln index df42a669..3bb9231c 100644 --- a/src/q4sdk.sln +++ b/src/q4sdk.sln @@ -12,73 +12,118 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Engine", "Engine", "{F464E5 EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Quake4", "doomdll.vcxproj", "{49BEC5C6-B964-417A-851E-808886B57420}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{C4AAA1D6-0C91-44CB-AC96-8525342E2020}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug with inlines and memory log|x64 = Debug with inlines and memory log|x64 + Debug with inlines and memory log|x86 = Debug with inlines and memory log|x86 Debug with inlines|x64 = Debug with inlines|x64 + Debug with inlines|x86 = Debug with inlines|x86 Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 DebugInline|x64 = DebugInline|x64 + DebugInline|x86 = DebugInline|x86 Dedicated Debug with inlines|x64 = Dedicated Debug with inlines|x64 + Dedicated Debug with inlines|x86 = Dedicated Debug with inlines|x86 Dedicated Debug|x64 = Dedicated Debug|x64 + Dedicated Debug|x86 = Dedicated Debug|x86 Dedicated Release|x64 = Dedicated Release|x64 + Dedicated Release|x86 = Dedicated Release|x86 Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {49BEC5C6-B964-417A-851E-808886B57430}.Debug with inlines and memory log|x64.ActiveCfg = DebugInline|x64 {49BEC5C6-B964-417A-851E-808886B57430}.Debug with inlines and memory log|x64.Build.0 = DebugInline|x64 + {49BEC5C6-B964-417A-851E-808886B57430}.Debug with inlines and memory log|x86.ActiveCfg = Release|x64 + {49BEC5C6-B964-417A-851E-808886B57430}.Debug with inlines and memory log|x86.Build.0 = Release|x64 {49BEC5C6-B964-417A-851E-808886B57430}.Debug with inlines|x64.ActiveCfg = DebugInline|x64 {49BEC5C6-B964-417A-851E-808886B57430}.Debug with inlines|x64.Build.0 = DebugInline|x64 + {49BEC5C6-B964-417A-851E-808886B57430}.Debug with inlines|x86.ActiveCfg = Release|x64 + {49BEC5C6-B964-417A-851E-808886B57430}.Debug with inlines|x86.Build.0 = Release|x64 {49BEC5C6-B964-417A-851E-808886B57430}.Debug|x64.ActiveCfg = Debug|x64 {49BEC5C6-B964-417A-851E-808886B57430}.Debug|x64.Build.0 = Debug|x64 + {49BEC5C6-B964-417A-851E-808886B57430}.Debug|x86.ActiveCfg = Debug|x64 {49BEC5C6-B964-417A-851E-808886B57430}.DebugInline|x64.ActiveCfg = DebugInline|x64 {49BEC5C6-B964-417A-851E-808886B57430}.DebugInline|x64.Build.0 = DebugInline|x64 + {49BEC5C6-B964-417A-851E-808886B57430}.DebugInline|x86.ActiveCfg = DebugInline|x64 {49BEC5C6-B964-417A-851E-808886B57430}.Dedicated Debug with inlines|x64.ActiveCfg = Debug|x64 {49BEC5C6-B964-417A-851E-808886B57430}.Dedicated Debug with inlines|x64.Build.0 = Debug|x64 + {49BEC5C6-B964-417A-851E-808886B57430}.Dedicated Debug with inlines|x86.ActiveCfg = Release|x64 + {49BEC5C6-B964-417A-851E-808886B57430}.Dedicated Debug with inlines|x86.Build.0 = Release|x64 {49BEC5C6-B964-417A-851E-808886B57430}.Dedicated Debug|x64.ActiveCfg = Debug|x64 {49BEC5C6-B964-417A-851E-808886B57430}.Dedicated Debug|x64.Build.0 = Debug|x64 + {49BEC5C6-B964-417A-851E-808886B57430}.Dedicated Debug|x86.ActiveCfg = Release|x64 + {49BEC5C6-B964-417A-851E-808886B57430}.Dedicated Debug|x86.Build.0 = Release|x64 {49BEC5C6-B964-417A-851E-808886B57430}.Dedicated Release|x64.ActiveCfg = Release|x64 {49BEC5C6-B964-417A-851E-808886B57430}.Dedicated Release|x64.Build.0 = Release|x64 + {49BEC5C6-B964-417A-851E-808886B57430}.Dedicated Release|x86.ActiveCfg = Release|x64 + {49BEC5C6-B964-417A-851E-808886B57430}.Dedicated Release|x86.Build.0 = Release|x64 {49BEC5C6-B964-417A-851E-808886B57430}.Release|x64.ActiveCfg = Release|x64 {49BEC5C6-B964-417A-851E-808886B57430}.Release|x64.Build.0 = Release|x64 + {49BEC5C6-B964-417A-851E-808886B57430}.Release|x86.ActiveCfg = Release|x64 {49BEC5C6-B964-417A-851E-808886B57400}.Debug with inlines and memory log|x64.ActiveCfg = DebugInline|x64 {49BEC5C6-B964-417A-851E-808886B57400}.Debug with inlines and memory log|x64.Build.0 = DebugInline|x64 + {49BEC5C6-B964-417A-851E-808886B57400}.Debug with inlines and memory log|x86.ActiveCfg = Release|x64 + {49BEC5C6-B964-417A-851E-808886B57400}.Debug with inlines and memory log|x86.Build.0 = Release|x64 {49BEC5C6-B964-417A-851E-808886B57400}.Debug with inlines|x64.ActiveCfg = DebugInline|x64 {49BEC5C6-B964-417A-851E-808886B57400}.Debug with inlines|x64.Build.0 = DebugInline|x64 + {49BEC5C6-B964-417A-851E-808886B57400}.Debug with inlines|x86.ActiveCfg = Release|x64 + {49BEC5C6-B964-417A-851E-808886B57400}.Debug with inlines|x86.Build.0 = Release|x64 {49BEC5C6-B964-417A-851E-808886B57400}.Debug|x64.ActiveCfg = Debug|x64 {49BEC5C6-B964-417A-851E-808886B57400}.Debug|x64.Build.0 = Debug|x64 + {49BEC5C6-B964-417A-851E-808886B57400}.Debug|x86.ActiveCfg = Debug|x64 {49BEC5C6-B964-417A-851E-808886B57400}.DebugInline|x64.ActiveCfg = DebugInline|x64 {49BEC5C6-B964-417A-851E-808886B57400}.DebugInline|x64.Build.0 = DebugInline|x64 + {49BEC5C6-B964-417A-851E-808886B57400}.DebugInline|x86.ActiveCfg = DebugInline|x64 {49BEC5C6-B964-417A-851E-808886B57400}.Dedicated Debug with inlines|x64.ActiveCfg = Debug|x64 {49BEC5C6-B964-417A-851E-808886B57400}.Dedicated Debug with inlines|x64.Build.0 = Debug|x64 + {49BEC5C6-B964-417A-851E-808886B57400}.Dedicated Debug with inlines|x86.ActiveCfg = Release|x64 + {49BEC5C6-B964-417A-851E-808886B57400}.Dedicated Debug with inlines|x86.Build.0 = Release|x64 {49BEC5C6-B964-417A-851E-808886B57400}.Dedicated Debug|x64.ActiveCfg = Debug|x64 {49BEC5C6-B964-417A-851E-808886B57400}.Dedicated Debug|x64.Build.0 = Debug|x64 + {49BEC5C6-B964-417A-851E-808886B57400}.Dedicated Debug|x86.ActiveCfg = Release|x64 + {49BEC5C6-B964-417A-851E-808886B57400}.Dedicated Debug|x86.Build.0 = Release|x64 {49BEC5C6-B964-417A-851E-808886B57400}.Dedicated Release|x64.ActiveCfg = Release|x64 {49BEC5C6-B964-417A-851E-808886B57400}.Dedicated Release|x64.Build.0 = Release|x64 + {49BEC5C6-B964-417A-851E-808886B57400}.Dedicated Release|x86.ActiveCfg = Release|x64 + {49BEC5C6-B964-417A-851E-808886B57400}.Dedicated Release|x86.Build.0 = Release|x64 {49BEC5C6-B964-417A-851E-808886B57400}.Release|x64.ActiveCfg = Release|x64 {49BEC5C6-B964-417A-851E-808886B57400}.Release|x64.Build.0 = Release|x64 + {49BEC5C6-B964-417A-851E-808886B57400}.Release|x86.ActiveCfg = Release|x64 {49BEC5C6-B964-417A-851E-808886B57420}.Debug with inlines and memory log|x64.ActiveCfg = Debug with inlines and memory log|x64 {49BEC5C6-B964-417A-851E-808886B57420}.Debug with inlines and memory log|x64.Build.0 = Debug with inlines and memory log|x64 + {49BEC5C6-B964-417A-851E-808886B57420}.Debug with inlines and memory log|x86.ActiveCfg = Debug with inlines and memory log|x64 {49BEC5C6-B964-417A-851E-808886B57420}.Debug with inlines|x64.ActiveCfg = Debug with inlines|x64 {49BEC5C6-B964-417A-851E-808886B57420}.Debug with inlines|x64.Build.0 = Debug with inlines|x64 + {49BEC5C6-B964-417A-851E-808886B57420}.Debug with inlines|x86.ActiveCfg = Debug with inlines|x64 {49BEC5C6-B964-417A-851E-808886B57420}.Debug|x64.ActiveCfg = Debug|x64 {49BEC5C6-B964-417A-851E-808886B57420}.Debug|x64.Build.0 = Debug|x64 + {49BEC5C6-B964-417A-851E-808886B57420}.Debug|x86.ActiveCfg = Debug|x64 {49BEC5C6-B964-417A-851E-808886B57420}.DebugInline|x64.ActiveCfg = Debug with inlines|x64 {49BEC5C6-B964-417A-851E-808886B57420}.DebugInline|x64.Build.0 = Debug with inlines|x64 + {49BEC5C6-B964-417A-851E-808886B57420}.DebugInline|x86.ActiveCfg = Release|x64 + {49BEC5C6-B964-417A-851E-808886B57420}.DebugInline|x86.Build.0 = Release|x64 {49BEC5C6-B964-417A-851E-808886B57420}.Dedicated Debug with inlines|x64.ActiveCfg = Dedicated Debug with inlines|x64 {49BEC5C6-B964-417A-851E-808886B57420}.Dedicated Debug with inlines|x64.Build.0 = Dedicated Debug with inlines|x64 + {49BEC5C6-B964-417A-851E-808886B57420}.Dedicated Debug with inlines|x86.ActiveCfg = Dedicated Debug with inlines|x64 {49BEC5C6-B964-417A-851E-808886B57420}.Dedicated Debug|x64.ActiveCfg = Dedicated Debug|x64 {49BEC5C6-B964-417A-851E-808886B57420}.Dedicated Debug|x64.Build.0 = Dedicated Debug|x64 + {49BEC5C6-B964-417A-851E-808886B57420}.Dedicated Debug|x86.ActiveCfg = Dedicated Debug|x64 {49BEC5C6-B964-417A-851E-808886B57420}.Dedicated Release|x64.ActiveCfg = Dedicated Release|x64 {49BEC5C6-B964-417A-851E-808886B57420}.Dedicated Release|x64.Build.0 = Dedicated Release|x64 + {49BEC5C6-B964-417A-851E-808886B57420}.Dedicated Release|x86.ActiveCfg = Dedicated Release|x64 {49BEC5C6-B964-417A-851E-808886B57420}.Release|x64.ActiveCfg = Release|x64 {49BEC5C6-B964-417A-851E-808886B57420}.Release|x64.Build.0 = Release|x64 + {49BEC5C6-B964-417A-851E-808886B57420}.Release|x86.ActiveCfg = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {49BEC5C6-B964-417A-851E-808886B57430} = {3D58340E-5538-4A17-9EF4-3FF7906932C3} - {49BEC5C6-B964-417A-851E-808886B57400} = {3D58340E-5538-4A17-9EF4-3FF7906932C3} + {49BEC5C6-B964-417A-851E-808886B57400} = {C4AAA1D6-0C91-44CB-AC96-8525342E2020} {49BEC5C6-B964-417A-851E-808886B57420} = {F464E540-A37A-4D17-8545-D63D0486E06B} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution From a1b2751cf7aef288964f702cac1773b8d766b457 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Mon, 26 Jul 2021 21:03:21 -0700 Subject: [PATCH 26/38] Fixed AAS face lookup in BotGetRandomPointNearPosition. --- src/game/bots/BotAI.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/game/bots/BotAI.cpp b/src/game/bots/BotAI.cpp index 59a3658c..7f5f3bef 100644 --- a/src/game/bots/BotAI.cpp +++ b/src/game/bots/BotAI.cpp @@ -1153,7 +1153,8 @@ void rvmBot::BotGetRandomPointNearPosition( idVec3 point, idVec3& randomPoint, f int numFaces = area.numFaces; int faceId = rvRandom::irand(firstFace, numFaces); - const aasFace_t& face = file->GetFace(faceId); + const aasIndex_t index = abs(file->GetFaceIndex(faceId)); + const aasFace_t& face = file->GetFace(index); int firstEdge = face.firstEdge; int i = rvRandom::irand(0, face.numEdges); From 8537f826a0b02de10bb7ba8414c5148df1afbb41 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Mon, 26 Jul 2021 21:17:18 -0700 Subject: [PATCH 27/38] Fixed bug with debug render. --- src/game/Game_local.cpp | 4 ++++ src/game/Player.cpp | 4 ++-- src/renderer/RenderWorld.h | 2 +- src/renderer/RenderWorld_local.h | 1 + 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/game/Game_local.cpp b/src/game/Game_local.cpp index d55e1672..d54ecfc8 100644 --- a/src/game/Game_local.cpp +++ b/src/game/Game_local.cpp @@ -3529,6 +3529,10 @@ idGameLocal::RunFrame assert( !isClient ); + if (gameRenderWorld) { + gameRenderWorld->DebugClear(0); + } + player = GetLocalPlayer(); if ( !isMultiplayer && g_stopTime.GetBool() ) { diff --git a/src/game/Player.cpp b/src/game/Player.cpp index abb0d89b..e23f7ec0 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -10199,9 +10199,9 @@ void idPlayer::Damage( idEntity *inflictor, idEntity *attacker, const idVec3 &di attacker->DamageFeedback( this, inflictor, damage ); // jmarshall if (gameLocal.IsMultiplayer() && gameLocal.isServer) { - if (attacker->IsType(rvmBot::GetClassType())) + if (attacker->IsType(rvmBot::GetClassType()) || attacker->IsType(idPlayer::GetClassType())) { - attacker->InflictedDamageEvent(this); + InflictedDamageEvent(attacker); } } // jmarshall end diff --git a/src/renderer/RenderWorld.h b/src/renderer/RenderWorld.h index 26721d1c..74df4ca9 100644 --- a/src/renderer/RenderWorld.h +++ b/src/renderer/RenderWorld.h @@ -608,7 +608,7 @@ class idRenderWorld { //-------------- Debug Visualization ----------------- // Line drawing for debug visualization - virtual void DebugClear(int time) { }; // a time of 0 will clear all lines and text + virtual void DebugClear(int time) = 0; // a time of 0 will clear all lines and text virtual void DebugLine(const idVec4& color, const idVec3& start, const idVec3& end, const int lifetime = 0, const bool depthTest = false) { } virtual void DebugArrow( const idVec4 &color, const idVec3 &start, const idVec3 &end, int size, const int lifetime = 0 ) = 0; virtual void DebugWinding( const idVec4 &color, const idWinding &w, const idVec3 &origin, const idMat3 &axis, const int lifetime = 0, const bool depthTest = false ) = 0; diff --git a/src/renderer/RenderWorld_local.h b/src/renderer/RenderWorld_local.h index 1263090f..4b53ad81 100644 --- a/src/renderer/RenderWorld_local.h +++ b/src/renderer/RenderWorld_local.h @@ -114,6 +114,7 @@ class idRenderWorldLocal : public idRenderWorld { virtual bool Trace( modelTrace_t &trace, const idVec3 &start, const idVec3 &end, const float radius, bool skipDynamic = true, bool skipPlayer = false ) const; virtual bool FastWorldTrace( modelTrace_t &trace, const idVec3 &start, const idVec3 &end ) const; + virtual void DebugClear(int time) { DebugClearLines(0); } virtual void DebugClearLines( int time ); virtual void DebugLine( const idVec4 &color, const idVec3 &start, const idVec3 &end, const int lifetime = 0, const bool depthTest = false ); virtual void DebugArrow( const idVec4 &color, const idVec3 &start, const idVec3 &end, int size, const int lifetime = 0 ); From 3e341aece8c1af116f94149de8fb4fdca9c1fb8a Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Mon, 26 Jul 2021 21:25:02 -0700 Subject: [PATCH 28/38] Fixed a bug were input commands weren't being processed in the right order. --- src/game/bots/Bot.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/bots/Bot.cpp b/src/game/bots/Bot.cpp index 7a9e4c9a..c4af058b 100644 --- a/src/game/bots/Bot.cpp +++ b/src/game/bots/Bot.cpp @@ -249,8 +249,6 @@ void rvmBot::ServerThink( void ) bs.thinktime = Bot_Time(); bs.botinput.actionflags = 0; - BotInputFrame(); - BotUpdateInventory(); if( bot_pathdebug.IsModified() ) @@ -267,6 +265,8 @@ void rvmBot::ServerThink( void ) stateThread.Execute(); + BotInputFrame(); + // If we are moving along a set of waypoints, let's move along. aasPath_t path; //int myArea = aas->PointAreaNum(GetOrigin()); From 8308062d421f0c549f5f0860a8db78175bdbccb4 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Mon, 26 Jul 2021 23:32:25 -0700 Subject: [PATCH 29/38] Fixed a bug in multiplayer were the players/bots couldn't be hit. --- src/game/Player.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index e23f7ec0..51fb994c 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -2798,7 +2798,9 @@ void idPlayer::SpawnToPoint( const idVec3 &spawn_origin, const idAngles &spawn_a // Force players to use bounding boxes when in multiplayer if ( gameLocal.isMultiplayer ) { - use_combat_bbox = true; +// jmarshall - breaks multiplayer. +// use_combat_bbox = true; +// jmarshall end // Make sure the combat model is unlinked if ( combatModel ) { From e2b8a0698d170fb43563a564f8781c5e8131f9d6 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Mon, 26 Jul 2021 23:37:52 -0700 Subject: [PATCH 30/38] Fixed a bug were the network system would try and send packets to bot clients. --- src/framework/async/AsyncServer.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/framework/async/AsyncServer.cpp b/src/framework/async/AsyncServer.cpp index 6b4c079b..05436b79 100644 --- a/src/framework/async/AsyncServer.cpp +++ b/src/framework/async/AsyncServer.cpp @@ -2503,6 +2503,11 @@ void idAsyncServer::RunFrame( void ) { continue; } +// jmarshall - Don't send update packets to bots. + if (client.channel.GetRemoteAddress().type == NA_BOT) + continue; +// jmarshall end + // modify maximum rate if necesary if ( idAsyncNetwork::serverMaxClientRate.IsModified() ) { client.channel.SetMaxOutgoingRate( Min( client.clientRate, idAsyncNetwork::serverMaxClientRate.GetInteger() ) ); From b457efb0465176fe4304117e6db688625a91598c Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Tue, 27 Jul 2021 07:33:08 -0700 Subject: [PATCH 31/38] Added AlertBot code. --- src/game/Game_local.cpp | 46 +++++++++++++++++++++++++++++++++++++++++ src/game/Game_local.h | 2 ++ 2 files changed, 48 insertions(+) diff --git a/src/game/Game_local.cpp b/src/game/Game_local.cpp index d54ecfc8..122ccd5c 100644 --- a/src/game/Game_local.cpp +++ b/src/game/Game_local.cpp @@ -5617,6 +5617,39 @@ bool idGameLocal::IsWeaponsStayOn( void ) { return serverInfo.GetBool( "si_weaponStay" ); } +/* +=================== +idGameLocal::AlertBots +=================== +*/ +// jmarshall +void idGameLocal::AlertBots(idPlayer* player, idVec3 alert_position) +{ + for (int i = 0; i < MAX_CLIENTS; i++) + { + rvmBot* bot = NULL; + + if (entities[i] == NULL) + { + continue; + } + + bot = entities[i]->Cast(); + if (bot == NULL) + { + continue; + } + + trace_t tr; + Trace(tr, alert_position, bot->GetRenderEntity()->origin, CONTENTS_SOLID, 0); + + if (tr.fraction == 1.0f) + { + bot->SetEnemy(player, player->GetOrigin()); + } + } +} +// jmarshall end /* ============ @@ -5627,6 +5660,19 @@ void idGameLocal::AlertAI( idEntity *ent ) { // RAVEN BEGIN // bdube: merged if ( ent ) { +// jmarshall + // Alert any bots near were we just exploded. + if (gameLocal.IsMultiplayer() && gameLocal.isServer) + { + idPlayer* player = ent->Cast(); + if (player) + { + AlertBots(player, ent->GetOrigin()); + } + + } +// jmarshall end + // RAVEN BEGIN // jnewquist: Use accessor for static class type if ( ent->IsType( idActor::GetClassType() ) ) { diff --git a/src/game/Game_local.h b/src/game/Game_local.h index b6f3c08b..380a565f 100644 --- a/src/game/Game_local.h +++ b/src/game/Game_local.h @@ -1169,6 +1169,8 @@ class idGameLocal : public idGame { // RAVEN END // jmarshall + void AlertBots(idPlayer* player, idVec3 alert_position); + const idDeclEntityDef* botItemTable;; idList registeredBots; From 95b7d351e946eced9aac9985df9177bc2ef4a75f Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Tue, 27 Jul 2021 18:11:02 -0700 Subject: [PATCH 32/38] BSE(Quake 4 VFX system) parsing code decompiled from ETQW. --- src/bse/BSE.h | 13 + src/bse/BSEInterface.h | 4 + src/bse/BSE_Effect.cpp | 1106 ++++++++++++++++++++++++++ src/bse/BSE_EffectTemplate.cpp | 174 +++- src/bse/BSE_Envelope.h | 2 +- src/bse/BSE_Envelopes.cpp | 247 ++++++ src/bse/BSE_Manager.cpp | 72 +- src/bse/BSE_Particle.h | 7 +- src/bse/BSE_Segment.cpp | 1310 +++++++++++++++++++++++++++++++ src/bse/BSE_SegmentTemplate.cpp | 539 +++++++++++++ src/doomdll.vcxproj | 5 + src/doomdll.vcxproj.filters | 15 + src/idlib/Parser.cpp | 20 +- src/idlib/Parser.h | 2 +- src/idlib/geometry/TraceModel.h | 3 +- 15 files changed, 3503 insertions(+), 16 deletions(-) create mode 100644 src/bse/BSE_Effect.cpp create mode 100644 src/bse/BSE_Envelopes.cpp create mode 100644 src/bse/BSE_Segment.cpp create mode 100644 src/bse/BSE_SegmentTemplate.cpp diff --git a/src/bse/BSE.h b/src/bse/BSE.h index 3be4f5dc..8b6c8c5f 100644 --- a/src/bse/BSE.h +++ b/src/bse/BSE.h @@ -586,4 +586,17 @@ class rvBSEManagerLocal : public rvBSEManager virtual void UpdateRateTimes(void) ; virtual bool CanPlayRateLimited(effectCategory_t category); + + virtual int AddTraceModel(idTraceModel* model); + virtual idTraceModel* GetTraceModel(int index); + virtual void FreeTraceModel(int index); +private: + static idBlockAlloc effects; + static idVec3 mCubeNormals[6]; + static idMat3 mModelToBSE; + static idList mTraceModels; + static const char* mSegmentNames[SEG_COUNT]; + static int mPerfCounters[NUM_PERF_COUNTERS]; + static float mEffectRates[EC_MAX]; + float pauseTime; // -1 means pause at the next time update }; diff --git a/src/bse/BSEInterface.h b/src/bse/BSEInterface.h index 625a64d4..1c6e8b75 100644 --- a/src/bse/BSEInterface.h +++ b/src/bse/BSEInterface.h @@ -55,6 +55,10 @@ class rvBSEManager virtual void UpdateRateTimes( void ) = 0; virtual bool CanPlayRateLimited( effectCategory_t category ) = 0; + + virtual int AddTraceModel(idTraceModel* model) = 0; + virtual idTraceModel* GetTraceModel(int index) = 0; + virtual void FreeTraceModel(int index) = 0; }; extern rvBSEManager *bse; diff --git a/src/bse/BSE_Effect.cpp b/src/bse/BSE_Effect.cpp new file mode 100644 index 00000000..7414fe8f --- /dev/null +++ b/src/bse/BSE_Effect.cpp @@ -0,0 +1,1106 @@ +// BSE_Effect.cpp +// + +#pragma hdrstop +#include "precompiled.h" + +#include "BSE_Envelope.h" +#include "BSE_Particle.h" +#include "BSE.h" +#include "BSE_SpawnDomains.h" + +#include "../renderer/Model_local.h" +//#include "../renderer/RenderCommon.h" + +void rvBSE::Init(const rvDeclEffect* declEffect, renderEffect_s* parms, float time) +{ + int v6; // esi + float* v7; // ecx + float* v8; // eax + double v9; // st3 + double v10; // st5 + float* v11; // esi + float* v12; // eax + int v13; // ecx + double v14; // st5 + //float v15; // [esp+18h] [ebp-30h] + //float v16; // [esp+1Ch] [ebp-2Ch] + //float v17; // [esp+20h] [ebp-28h] + //float v18; // [esp+24h] [ebp-24h] + //float v19; // [esp+28h] [ebp-20h] + //float v20; // [esp+2Ch] [ebp-1Ch] + //float v21; // [esp+30h] [ebp-18h] BYREF + //float v22[5]; // [esp+34h] [ebp-14h] BYREF + float parmsa; // [esp+50h] [ebp+8h] + + this->mStartTime = time; + this->mDeclEffect = declEffect; + this->mLastTime = time; + this->mFlags = 0; + this->mDuration = 0.0; + this->mAttenuation = 1.0; + v6 = 2; + this->mCost = 0.0; + this->mFlags = parms->loop; + this->mCurrentLocalBounds[1].z = 0.0; + this->mCurrentLocalBounds[1].y = 0.0; + v7 = &this->mLastRenderBounds[0].z; + this->mCurrentLocalBounds[1].x = 0.0; + this->mCurrentLocalBounds[0].z = 0.0; + this->mCurrentLocalBounds[0].y = 0.0; + this->mCurrentLocalBounds[0].x = 0.0; + v8 = &this->mCurrentLocalBounds[0].z; + v9 = declEffect->mSize; + this->mCurrentLocalBounds[0].x = this->mCurrentLocalBounds[0].x - v9; + this->mCurrentLocalBounds[0].y = this->mCurrentLocalBounds[0].y - v9; + this->mCurrentLocalBounds[0].z = this->mCurrentLocalBounds[0].z - v9; + this->mCurrentLocalBounds[1].x = this->mCurrentLocalBounds[1].x + v9; + this->mCurrentLocalBounds[1].y = v9 + this->mCurrentLocalBounds[1].y; + this->mCurrentLocalBounds[1].z = v9 + this->mCurrentLocalBounds[1].z; + do + { + v10 = *(v8 - 2); + v8 += 3; + *(v7 - 2) = v10; + v7 += 3; + --v6; + *(v7 - 4) = *(v8 - 4); + *(v7 - 3) = *(v8 - 3); + } while (v6); + this->mGrownRenderBounds[0].z = 1.0e30; + this->mGrownRenderBounds[0].y = 1.0e30; + this->mGrownRenderBounds[0].x = 1.0e30; + parmsa = -1.0e30; + this->mGrownRenderBounds[1].z = parmsa; + this->mGrownRenderBounds[1].y = parmsa; + this->mGrownRenderBounds[1].x = parmsa; + this->mForcePush = 0; + this->mOriginalOrigin.x = parms->origin.x; + this->mOriginalOrigin.y = parms->origin.y; + this->mOriginalOrigin.z = parms->origin.z; + this->mOriginalEndOrigin.z = 0.0; + this->mOriginalEndOrigin.y = 0.0; + this->mOriginalEndOrigin.x = 0.0; + memcpy(&this->mOriginalAxis, &parms->axis, sizeof(this->mOriginalAxis)); + //v18 = this->mOriginalOrigin.x + this->mCurrentLocalBounds.b[1].x; + //v19 = this->mCurrentLocalBounds[1].y + this->mOriginalOrigin.y; + //v11 = &v21; + //v20 = this->mCurrentLocalBounds[1].z + this->mOriginalOrigin.z; + //v12 = &this->mCurrentWorldBounds[0].y; + //v13 = 2; + //v15 = this->mOriginalOrigin.x + this->mCurrentLocalBounds.b[0].x; + //v16 = this->mCurrentLocalBounds[0].y + this->mOriginalOrigin.y; + //v17 = this->mCurrentLocalBounds[0].z + this->mOriginalOrigin.z; + //v21 = v15; + //v22[0] = v16; + //v22[1] = v17; + //v22[2] = v18; + //v22[3] = v19; + //v22[4] = v20; + //do + //{ + // v14 = *v11; + // v11 += 3; + // *(v12 - 1) = v14; + // v12 += 3; + // --v13; + // *(v12 - 3) = *(float*)((char*)v12 + (char*)&v21 - (char*)&this->mCurrentWorldBounds - 12); + // *(v12 - 2) = *(float*)((char*)v12 + (char*)v22 - (char*)&this->mCurrentWorldBounds - 12); + //} while (v13); + if (parms->hasEndOrigin) + { + this->mFlags |= 2u; + this->mOriginalEndOrigin.x = parms->endOrigin.x; + this->mOriginalEndOrigin.y = parms->endOrigin.y; + this->mOriginalEndOrigin.z = parms->endOrigin.z; + this->mCurrentEndOrigin.x = parms->endOrigin.x; + this->mCurrentEndOrigin.y = parms->endOrigin.y; + this->mCurrentEndOrigin.z = parms->endOrigin.z; + } + this->mCurrentTime = time; + this->mCurrentOrigin.x = this->mOriginalOrigin.x; + this->mCurrentOrigin.y = this->mOriginalOrigin.y; + this->mCurrentOrigin.z = this->mOriginalOrigin.z; + this->mCurrentVelocity.z = 0.0; + this->mCurrentVelocity.y = 0.0; + this->mCurrentVelocity.x = 0.0; + UpdateFromOwner(parms, time, 1); + this->mReferenceSound = 0; +// jmarshall + //if ((declEffect->mFlags & 1) != 0) + // this->mReferenceSound = common->SW()->AllocSoundEmitter(); +// jmarshall end + UpdateSegments(time); + this->mOriginDistanceToCamera = 0.0; + this->mShortestDistanceToCamera = 0.0; +} + +float rvBSE::GetAttenuation(rvSegmentTemplate* st) const +{ + double result; // st7 + float sta; // [esp+4h] [ebp+4h] + float stb; // [esp+4h] [ebp+4h] + float stc; // [esp+4h] [ebp+4h] + float std; // [esp+4h] [ebp+4h] + + result = 0.0; + if (st->mAttenuation.x <= 0.0 && st->mAttenuation.y <= 0.0) + return this->mAttenuation; + sta = st->mAttenuation.x + 1.0; + if (sta > (double)this->mShortestDistanceToCamera) + return this->mAttenuation; + stb = st->mAttenuation.y - 1.0; + if (stb >= (double)this->mShortestDistanceToCamera) + { + stc = (this->mShortestDistanceToCamera - st->mAttenuation.x) / (st->mAttenuation.y - st->mAttenuation.x); + std = (1.0 - stc) * this->mAttenuation; + result = std; + } + return result; +} + +void rvBSE::UpdateSoundEmitter(rvSegmentTemplate* st, rvSegment* seg) +{ + idSoundEmitter* v4; // ecx + soundShaderParms_t parms; // [esp+0h] [ebp-28h] BYREF + int v6; // [esp+24h] [ebp-4h] + + parms.maxDistance = 0.0; + //parms.farDistance = 0.0; + parms.volume = 0.0; + parms.shakes = 0.0; + parms.soundShaderFlags = 0; + //parms.pitchShift = 0.0; + parms.soundClass = 0; + //parms.soundArea = 0; + v6 = 0; + if ((this->mFlags & 8) != 0) + { + if (st->GetSoundLooping() && (seg->mFlags & 2) != 0) + this->mReferenceSound->StopSound(seg->mSegmentTemplateHandle + 1); + } + else + { + v4 = this->mReferenceSound; + parms.shakes = seg->mSoundVolume; + *(float*)&parms.soundClass = seg->mFreqShift; + v4->UpdateEmitter(mCurrentOrigin, 0, (soundShaderParms_t*)&parms.maxDistance); + } +} +const idVec3 rvBSE::GetInterpolatedOffset(float time) const +{ + idVec3 result; // eax + float v5; // [esp+0h] [ebp-18h] + float v6; // [esp+4h] [ebp-14h] + float v7; // [esp+8h] [ebp-10h] + float v8; // [esp+Ch] [ebp-Ch] + float v9; // [esp+10h] [ebp-8h] + float v10; // [esp+14h] [ebp-4h] + float deltaTime; // [esp+1Ch] [ebp+4h] + float deltaTimea; // [esp+1Ch] [ebp+4h] + + result.z = 0.0; + result.y = 0.0; + result.x = 0.0; + deltaTime = this->mCurrentTime - this->mLastTime; + if (deltaTime >= 0.0020000001) + { + deltaTimea = 1.0 - (time - this->mLastTime) / deltaTime; + v5 = this->mCurrentOrigin.x - this->mLastOrigin.x; + v6 = this->mCurrentOrigin.y - this->mLastOrigin.y; + v7 = this->mCurrentOrigin.z - this->mLastOrigin.z; + v8 = v5 * deltaTimea; + v9 = v6 * deltaTimea; + v10 = deltaTimea * v7; + result.x = v8; + result.y = v9; + result.z = v10; + } + return result; +} + +void rvBSE::SetDuration(float time) +{ + double v2; // st7 + + v2 = time; + if (time < 0.0) + { + v2 = this->mDeclEffect->mMinDuration; + LABEL_3: + this->mDuration = v2; + return; + } + if (this->mDuration < v2) + goto LABEL_3; +} + +const char* rvBSE::GetDeclName() +{ + return mDeclEffect->base->GetName(); +} + +void rvBSE::UpdateAttenuation() +{ + double v2; // st7 + double v3; // st7 + float fovx; // [esp+Ch] [ebp-50h] + float fovxb; // [esp+Ch] [ebp-50h] + float fovxa; // [esp+Ch] [ebp-50h] + float fovxc; // [esp+Ch] [ebp-50h] + float v8; // [esp+10h] [ebp-4Ch] BYREF + float v9; // [esp+14h] [ebp-48h] + float v10; // [esp+18h] [ebp-44h] + idVec3 origin; // [esp+1Ch] [ebp-40h] BYREF + idVec3 localOrigin; // [esp+28h] [ebp-34h] BYREF + idMat3 axis; // [esp+34h] [ebp-28h] BYREF + + if ((this->mDeclEffect->mFlags & 4) != 0) + { + game->GetPlayerView(origin, axis); + fovx = (mCurrentOrigin - origin).LengthFast(); //idVec3::Dist(&this->mCurrentOrigin, (idVec3*)&origin.y); + v2 = 1.0; + if (fovx >= 1.0) + { + v2 = fovx; + if (fovx > 131072.0) + v2 = 131072.0; + } + fovxb = v2; + this->mOriginDistanceToCamera = fovxb; + v9 = origin.y - this->mCurrentOrigin.x; + v10 = origin.z - this->mCurrentOrigin.y; + origin.x = localOrigin.x - this->mCurrentOrigin.z; + localOrigin.y = this->mCurrentAxis[2].x * origin.x + + this->mCurrentAxis[0].x * v9 + + this->mCurrentAxis[1].x * v10; + localOrigin.z = this->mCurrentAxis[1].y * v10 + + this->mCurrentAxis[0].y * v9 + + this->mCurrentAxis[2].y * origin.x; + axis[0].x = v9 * this->mCurrentAxis[0].z + + v10 * this->mCurrentAxis[1].z + + origin.x * this->mCurrentAxis[2].z; + fovxa = mCurrentLocalBounds.ShortestDistance(localOrigin); + v3 = 1.0; + if (fovxa < 1.0 || (v3 = fovxa, fovxa <= 131072.0)) + { + fovxc = v3; + this->mShortestDistanceToCamera = fovxc; + } + else + { + this->mShortestDistanceToCamera = 131072.0; + } + } +} + +void rvBSE::LoopInstant(float time) +{ + rvBSE* v2; // esi + int v3; // edi + bool v4; // zf + bool v5; // sf + int v6; // ebx + unsigned __int64 v7; // st7 + + v2 = this; + if (0.0 == this->mDuration) + { + v3 = 0; + v4 = this->mSegments.Num() == 0; + v5 = this->mSegments.Num() < 0; + this->mStartTime = this->mDeclEffect->mMaxDuration + 0.5 + this->mStartTime; + if (!v5 && !v4) + { + v6 = 0; + do + { + v2->mSegments[v6].ResetTime(v2, v2->mStartTime); + ++v3; + ++v6; + } while (v3 < v2->mSegments.Num()); + } + if (bse_debug.GetInteger() == 2) + { + v7 = v2->mDeclEffect->mMaxDuration + 0.5; + common->Printf("BSE: Looping duration %g\n", v7); + } + ++v2->mDeclEffect->mLoopCount; + } +} + +void rvBSE::LoopLooping(float time) +{ + int v3; // edi + bool v4; // cc + int v5; // ebx + + if (0.0 != this->mDuration) + { + v3 = 0; + v4 = this->mSegments.Num() <= 0; + this->mStartTime = this->mStartTime + this->mDuration; + this->mDuration = 0.0; + if (!v4) + { + v5 = 0; + do + { + mSegments[v5].ResetTime(this, this->mStartTime); + ++v3; + ++v5; + } while (v3 < this->mSegments.Num()); + } + if (bse_debug.GetInteger() == 2) { + common->Printf("BSE: Looping duration: %g", this->mDuration); + } + + ++this->mDeclEffect->mLoopCount; + } +} +bool rvBSE::Service(renderEffect_t* parms, float time, bool spawn, bool& forcePush) +{ + renderEffect_s* v5; // ebp + int v7; // edi + int v8; // ebx + int v9; // edi + char v10; // bl + int v11; // ebp + bool v12; // zf + float spawna; // [esp+24h] [ebp+Ch] + float spawnb; // [esp+24h] [ebp+Ch] + float spawnc; // [esp+24h] [ebp+Ch] + float spawnd; // [esp+24h] [ebp+Ch] + + v5 = parms; + UpdateFromOwner(parms, time, 0); + UpdateAttenuation(); + if (spawn) + { + v7 = 0; + if (this->mSegments.Num() > 0) + { + v8 = 0; + do + { + spawna = (double)(this->mSegments.Num() - v7) * -10.0; + mSegments[v8].Check(this, time, spawna); + ++v7; + ++v8; + } while (v7 < this->mSegments.Num()); + } + } + if ((this->mFlags & 8) == 0 && parms->loop) + { + spawnb = this->mDuration + this->mStartTime; + if (spawnb < (double)time) + LoopLooping(time); + } + v9 = 0; + v10 = 0; + if (this->mSegments.Num() > 0) + { + v11 = 0; + do + { + if (mSegments[v11].UpdateParticles(this, time)) + v10 = 1; + ++v9; + ++v11; + } while (v9 < this->mSegments.Num()); + v5 = parms; + } + this->mFlags &= 0xFFFFFFFB; + forcePush = this->mForcePush; + v12 = (this->mFlags & 8) == 0; + this->mForcePush = 0; + if (!v12) + return v10 == 0; + if (v5->loop) + { + spawnc = this->mDuration + this->mStartTime; + if (spawnc < (double)time) + LoopInstant(time); + if (v5->loop) + return 0; + } + spawnd = this->mDuration + this->mStartTime; + return spawnd < (double)time; +} + +float rvBSE::EvaluateCost(int segment) +{ + double result; // st7 + int v4; // edi + int v5; // ebx + double v6; // st7 + + if (segment < 0) + { + v4 = 0; + this->mCost = 0.0; + if (this->mSegments.Num() > 0) + { + v5 = 0; + do + { + v6 = mDeclEffect->EvaluateCost( + this->mSegments[v5].mActiveCount, + segment); + ++v4; + ++v5; + this->mCost = v6 + this->mCost; + } while (v4 < this->mSegments.Num()); + } + result = this->mCost; + } + else + { + this->mCost = mDeclEffect->EvaluateCost( + this->mSegments[segment].mActiveCount, + segment); + result = this->mCost; + } + return result; +} + +void rvBSE::InitModel(idRenderModel* model) +{ + int v3; // edi + int v4; // ebx + + v3 = 0; + if (this->mSegments.Num() > 0) + { + v4 = 0; + do + { + mSegments[v4].AllocateSurface(this, model); + ++v3; + ++v4; + } while (v3 < this->mSegments.Num()); + } +} + +// jmarshall +#if 0 +idRenderModel* rvBSE::Render(idRenderModel* model, const struct renderEffect_s* owner, const viewDef_t* view) +{ + rvRenderModelBSE* renderModel; // ebp + idBounds v23; // [esp+2Ch] [ebp-30h] BYREF + float time; // [esp+6Ch] [ebp+10h] + + if (!bse_render.GetInteger()) + return 0; + + renderModel = (rvRenderModelBSE*)model; + + if (model == NULL) + { + renderModel = renderModelManager->AllocBSEModel(); + InitModel(renderModel); + } + + renderModel->FreeVertexCache(); + + v23 = renderModel->Bounds(NULL); + + memcpy(&this->mViewAxis, &view->renderView.viewaxis, sizeof(this->mViewAxis)); + + this->mViewOrg.x = view->renderView.vieworg.x; + this->mViewOrg.y = view->renderView.vieworg.y; + //v11 = view->renderView.vieworg.z; + this->mViewOrg.z = view->renderView.vieworg.z; + if (bse->IsTimeLocked()) + time = bse->GetLockedTime(); + else + time = view->renderView.time[1] * 0.001f; //time = view->floatTime; + for (int i = 0; i < this->mSegments.Num(); ++i) + { + mSegments[i].ClearSurface(this, renderModel); + if (mSegments[i].Active()) + { + mSegments[i].Render(this, owner, renderModel, time); + mSegments[i].RenderTrail(this, owner, renderModel, time); + } + } + renderModel->FinishSurfaces(false); + mLastRenderBounds = renderModel->Bounds(NULL); + + v23[1].x = mLastRenderBounds[0].x + 20.0; + v23[1].y = mLastRenderBounds[0].y + 20.0; + v23[1].z = mLastRenderBounds[0].z + 20.0; + v23[0].x = mLastRenderBounds[1].x - 20.0; + v23[0].y = mLastRenderBounds[1].y - 20.0; + v23[0].z = mLastRenderBounds[1].z - 20.0; + this->mGrownRenderBounds = v23; + this->mForcePush = 1; +LABEL_18: + //this->DisplayDebugInfo(this, a9, view, (idBounds*)&v24); + return renderModel; +} +#endif +// jmarshall end + +void rvBSE::Destroy() +{ + mSegments.Clear(); + if (mReferenceSound) + mReferenceSound->Free(false); +} + + +void rvBSE::UpdateSegments(float time) +{ + int v3; // ebx + rvSegment* v4; // eax + rvParticle** v5; // esi + bool v6; // cc + int v7; // ecx + int* v8; // eax + rvSegment* v9; // esi + rvSegment* v10; // ecx + int v11; // edx + int v12; // eax + rvParticle** v13; // esi + int v14; // esi + int v15; // edi + int v16; // esi + int v17; // edi + int v18; // esi + int v19; // edi + rvSegment* ptr; // [esp+14h] [ebp-14h] + + v3 = this->mDeclEffect->mSegmentTemplates.Num(); + if (v3 > 0) + { + if (v3 != this->mSegments.Size()) + { + mSegments.SetNum(v3); + } + } + else + { + mSegments.Clear(); + } + v14 = 0; + //this->mSegments.num = v3; // Not sure why this gets set twice? compiler optimization gone wrong? + if (v3 > 0) + { + v15 = 0; + do + mSegments[v15++].Init(this, this->mDeclEffect, v14++, time); + while (v14 < this->mSegments.Num()); + } + v16 = 0; + if (this->mSegments.Num() > 0) + { + v17 = 0; + do + { + mSegments[v17].CalcCounts(this, time); + ++v16; + ++v17; + } while (v16 < this->mSegments.Num()); + } + v18 = 0; + if (this->mSegments.Num() > 0) + { + v19 = 0; + do + { + + mSegments[v19].InitParticles(this); + ++v18; + ++v19; + } while (v18 < this->mSegments.Num()); + } +} + + +void rvBSE::DisplayDebugInfo(const struct renderEffect_s* parms, const struct viewDef_s* view, idBounds& bounds) { + // TODO +} + +void __thiscall rvBSE::UpdateFromOwner(renderEffect_s* parms, float time, bool init) +{ + // jmarshall - todo + /* + renderEffect_s* v4; // edx + rvBSE* v5; // ebx + float* v6; // ebp + double v7; // st7 + double v8; // st7 + renderEffect_s* v9; // ecx + float* v10; // eax + double v11; // st7 + double v12; // st7 + double v13; // st6 + double v14; // st5 + float* v15; // esi + float v16; // edi + float v17; // xmm1_4 + float v18; // xmm3_4 + float v19; // xmm5_4 + double v20; // st4 + float* v21; // esi + float v22; // xmm1_4 + float v23; // xmm3_4 + float v24; // xmm5_4 + float* v25; // eax + double v26; // st7 + float* v27; // esi + float v28; // edi + float v29; // xmm1_4 + float v30; // xmm3_4 + float v31; // xmm5_4 + double v32; // st4 + float* v33; // esi + float v34; // xmm1_4 + float v35; // xmm3_4 + float v36; // xmm5_4 + float* v37; // ecx + int v38; // eax + signed int v39; // edx + double v40; // st7 + idRenderWorldVtbl* v41; // edx + double v42; // st7 + double v43; // st7 + float* v44; // esi + float v45; // xmm1_4 + float v46; // xmm3_4 + float v47; // xmm5_4 + double v48; // st4 + float* v49; // esi + float v50; // xmm1_4 + float v51; // xmm3_4 + float v52; // xmm5_4 + float* v53; // eax + signed int v54; // ecx + double v55; // st7 + float* v56; // esi + float v57; // edi + float v58; // xmm1_4 + float v59; // xmm3_4 + float v60; // xmm5_4 + double v61; // st7 + idMat3* v62; // eax + double v63; // st7 + double v64; // st7 + idVec4* v65; // [esp+4h] [ebp-B4h] + float* v66; // [esp+8h] [ebp-B0h] + float* v67; // [esp+Ch] [ebp-ACh] + int v68; // [esp+10h] [ebp-A8h] + int v69; // [esp+14h] [ebp-A4h] + float v70; // [esp+28h] [ebp-90h] + float v71; // [esp+2Ch] [ebp-8Ch] + float v72; // [esp+30h] [ebp-88h] + float v73; // [esp+34h] [ebp-84h] + float length; // [esp+38h] [ebp-80h] + idVec3 size; // [esp+3Ch] [ebp-7Ch] + idVec3 corner; // [esp+48h] [ebp-70h] + idVec3 dir; // [esp+54h] [ebp-64h] + float v78; // [esp+60h] [ebp-58h] + float v79; // [esp+64h] [ebp-54h] + float v80; // [esp+68h] [ebp-50h] + float v81; // [esp+6Ch] [ebp-4Ch] + float v82; // [esp+70h] [ebp-48h] + float v83; // [esp+74h] [ebp-44h] + float v84; // [esp+78h] [ebp-40h] + float v85; // [esp+7Ch] [ebp-3Ch] + float v86; // [esp+80h] [ebp-38h] + float v87; // [esp+84h] [ebp-34h] + float v88; // [esp+88h] [ebp-30h] + float v89; // [esp+8Ch] [ebp-2Ch] + float v90; // [esp+90h] [ebp-28h] + idMat3 result; // [esp+94h] [ebp-24h] + + v4 = parms; + v5 = this; + this->mLastTime = this->mCurrentTime; + v6 = &this->mCurrentOrigin.x; + this->mLastOrigin.x = this->mCurrentOrigin.x; + this->mLastOrigin.y = this->mCurrentOrigin.y; + this->mLastOrigin.z = this->mCurrentOrigin.z; + this->mCurrentTime = time; + *v6 = parms->origin.x; + v6[1] = parms->origin.y; + v6[2] = parms->origin.z; + memcpy(&this->mCurrentAxis, &parms->axis, sizeof(this->mCurrentAxis)); + v70 = this->mCurrentAxis[2].z; + v71 = this->mCurrentAxis[1].z; + v85 = this->mCurrentAxis[0].z; + v86 = this->mCurrentAxis[2].y; + v88 = this->mCurrentAxis[1].y; + v90 = this->mCurrentAxis[0].y; + v89 = this->mCurrentAxis[2].x; + v87 = this->mCurrentAxis[1].x; + size.x = this->mCurrentAxis[0].x; + dir.y = size.x; + dir.z = v87; + v78 = v89; + v79 = v90; + v80 = v88; + v81 = v86; + v82 = v85; + v83 = v71; + v84 = v70; + qmemcpy(&this->mCurrentAxisTransposed, &dir.y, sizeof(this->mCurrentAxisTransposed)); + size.x = this->mCurrentAxis.mat[2].z; + v90 = this->mCurrentAxis.mat[1].z; + v85 = this->mCurrentAxis.mat[0].z; + v89 = this->mCurrentAxis.mat[2].y; + v88 = this->mCurrentAxis.mat[1].y; + v71 = this->mCurrentAxis.mat[0].y; + v87 = this->mCurrentAxis.mat[2].x; + v86 = this->mCurrentAxis.mat[1].x; + v70 = this->mCurrentAxis.mat[0].x; + size.y = v4->windVector.x * v70 + v4->windVector.y * v71 + v4->windVector.z * v85; + size.z = v4->windVector.x * v86 + v4->windVector.y * v88 + v4->windVector.z * v90; + corner.x = v4->windVector.y * v89 + v4->windVector.x * v87 + v4->windVector.z * size.x; + this->mCurrentWindVector.x = size.y; + this->mCurrentWindVector.y = size.z; + this->mCurrentWindVector.z = corner.x; + v7 = v5->mCurrentTime - v5->mLastTime; + if (v7 > 0.002000000094994903) + { + size.y = *v6 - this->mLastOrigin.x; + size.z = this->mCurrentOrigin.y - this->mLastOrigin.y; + corner.x = this->mCurrentOrigin.z - this->mLastOrigin.z; + v70 = v7; + v70 = 1.0 / v70; + dir.y = v70 * size.y; + dir.z = size.z * v70; + v78 = v70 * corner.x; + this->mCurrentVelocity.x = dir.y; + this->mCurrentVelocity.y = dir.z; + this->mCurrentVelocity.z = v78; + } + this->mGravity.x = parms->gravity.x; + this->mGravity.y = parms->gravity.y; + this->mGravity.z = parms->gravity.z; + this->mGravityDir.x = this->mGravity.x; + this->mGravityDir.y = this->mGravity.y; + this->mGravityDir.z = this->mGravity.z; + v70 = this->mGravityDir.y * this->mGravityDir.y + + this->mGravityDir.x * this->mGravityDir.x + + this->mGravityDir.z * this->mGravityDir.z; + v70 = sqrt(v70); + if (v70 >= 0.00000011920929) + { + v70 = 1.0 / v70; + v8 = v70; + this->mGravityDir.x = this->mGravityDir.x * v70; + this->mGravityDir.y = this->mGravityDir.y * v8; + this->mGravityDir.z = v8 * this->mGravityDir.z; + } + v9 = parms; + if (parms->useRenderBounds || parms->isStatic) + { + if (v5->mGrownRenderBounds.b[1].x >= (double)v5->mGrownRenderBounds.b[0].x) + { + v37 = &dir.y; + size.y = v5->mGrownRenderBounds.b[1].x + 10.0; + v38 = (int)&v5->mCurrentWorldBounds.b[0].y; + v39 = 2; + size.z = v5->mGrownRenderBounds.b[1].y + 10.0; + corner.x = v5->mGrownRenderBounds.b[1].z + 10.0; + v72 = v5->mGrownRenderBounds.b[0].x - 10.0; + v73 = v5->mGrownRenderBounds.b[0].y - 10.0; + length = v5->mGrownRenderBounds.b[0].z - 10.0; + dir.y = v72; + dir.z = v73; + v78 = length; + v79 = size.y; + v80 = size.z; + v81 = corner.x; + do + { + v40 = *v37; + v37 += 3; + *(float*)(v38 - 4) = v40; + v38 += 12; + --v39; + *(float*)(v38 - 12) = *(float*)((char*)&dir.y - (char*)&v5->mCurrentWorldBounds + v38 - 12); + *(float*)(v38 - 8) = *(float*)((char*)&dir.z - (char*)&v5->mCurrentWorldBounds + v38 - 12); + } while (v39); + idBounds::FromTransformedBounds( + &v5->mCurrentWorldBounds, + &v5->mCurrentWorldBounds, + &vec3_origin, + &v5->mCurrentAxis); + v9 = parms; + v5->mCurrentWorldBounds.b[0].x = v5->mCurrentWorldBounds.b[0].x + *v6; + v5->mCurrentWorldBounds.b[0].y = v6[1] + v5->mCurrentWorldBounds.b[0].y; + v5->mCurrentWorldBounds.b[0].z = v6[2] + v5->mCurrentWorldBounds.b[0].z; + v5->mCurrentWorldBounds.b[1].x = *v6 + v5->mCurrentWorldBounds.b[1].x; + v5->mCurrentWorldBounds.b[1].y = v6[1] + v5->mCurrentWorldBounds.b[1].y; + v5->mCurrentWorldBounds.b[1].z = v5->mCurrentWorldBounds.b[1].z + v6[2]; + v13 = size.z; + v14 = corner.x; + v12 = size.y; + } + else + { + size.y = v5->mDeclEffect->mSize; + v70 = COERCE_FLOAT(&v72); + size.z = size.y; + v25 = (float*)&v5->mCurrentWorldBounds; + corner.x = size.y; + v71 = *(float*)&v25; + v25[2] = 1.0e30; + v25[1] = 1.0e30; + *v25 = 1.0e30; + size.x = -1.0e30; + v26 = size.x; + v25[5] = size.x; + v25[4] = v26; + v25[3] = v26; + v12 = size.y; + v72 = size.y + *v6; + v13 = size.z; + v73 = v6[1] + size.z; + v14 = corner.x; + length = v6[2] + corner.x; + v27 = (float*)LODWORD(v71); + v28 = v70; + v29 = *(float*)LODWORD(v70); + *(float*)LODWORD(v71) = fminf(*(float*)LODWORD(v71), *(float*)LODWORD(v70)); + v30 = *(float*)(LODWORD(v28) + 4); + v27[1] = fminf(v27[1], v30); + v31 = *(float*)(LODWORD(v28) + 8); + v27[2] = fminf(v27[2], v31); + v27[3] = fmaxf(v29, v27[3]); + v27[4] = fmaxf(v30, v27[4]); + v27[5] = fmaxf(v31, v27[5]); + v32 = *v6 - v12; + v70 = COERCE_FLOAT(&v72); + LODWORD(v71) = (char*)v5 + 396; + v72 = v32; + v73 = v6[1] - v13; + length = v6[2] - v14; + v33 = (float*)&v5->mCurrentWorldBounds; + v34 = v72; + *v33 = fminf(v5->mCurrentWorldBounds.b[0].x, v72); + v35 = v73; + v33[1] = fminf(v5->mCurrentWorldBounds.b[0].y, v73); + v36 = length; + v33[2] = fminf(v5->mCurrentWorldBounds.b[0].z, length); + v33[3] = fmaxf(v34, v5->mCurrentWorldBounds.b[1].x); + v33[4] = fmaxf(v35, v5->mCurrentWorldBounds.b[1].y); + v33[5] = fmaxf(v36, v5->mCurrentWorldBounds.b[1].z); + } + } + else + { + size.y = v5->mDeclEffect->mSize; + v70 = COERCE_FLOAT(&v72); + size.z = size.y; + v10 = (float*)&v5->mCurrentWorldBounds; + corner.x = size.y; + v71 = *(float*)&v10; + v10[2] = 1.0e30; + v10[1] = 1.0e30; + *v10 = 1.0e30; + size.x = -1.0e30; + v11 = size.x; + v10[5] = size.x; + v10[4] = v11; + v10[3] = v11; + v12 = size.y; + v72 = *v6 + size.y; + v13 = size.z; + v73 = v6[1] + size.z; + v14 = corner.x; + length = v6[2] + corner.x; + v15 = (float*)LODWORD(v71); + v16 = v70; + v17 = *(float*)LODWORD(v70); + *(float*)LODWORD(v71) = fminf(*(float*)LODWORD(v71), *(float*)LODWORD(v70)); + v18 = *(float*)(LODWORD(v16) + 4); + v15[1] = fminf(v15[1], v18); + v19 = *(float*)(LODWORD(v16) + 8); + v15[2] = fminf(v15[2], v19); + v15[3] = fmaxf(v17, v15[3]); + v15[4] = fmaxf(v18, v15[4]); + v15[5] = fmaxf(v19, v15[5]); + v20 = *v6 - v12; + v70 = COERCE_FLOAT(&v72); + LODWORD(v71) = (char*)v5 + 396; + v72 = v20; + v73 = v6[1] - v13; + length = v6[2] - v14; + v21 = (float*)&v5->mCurrentWorldBounds; + v22 = v72; + *v21 = fminf(v5->mCurrentWorldBounds.b[0].x, v72); + v23 = v73; + v21[1] = fminf(v5->mCurrentWorldBounds.b[0].y, v73); + v24 = length; + v21[2] = fminf(v5->mCurrentWorldBounds.b[0].z, length); + v21[3] = fmaxf(v22, v5->mCurrentWorldBounds.b[1].x); + v21[4] = fmaxf(v23, v5->mCurrentWorldBounds.b[1].y); + v21[5] = fmaxf(v24, v5->mCurrentWorldBounds.b[1].z); + v5->mForcePush = 0; + } + if (bse_debug.internalVar->integerValue > 2) + { + v41 = session->rw->vfptr; + v69 = 0; + v68 = 10000; + v67 = &v5->mLastOrigin.x; + ((void(__stdcall*)(idVec4*, float*, idVec3*, signed int, _DWORD))v41->DebugLine)( + &colorWhite, + v6, + &v5->mLastOrigin, + 10000, + 0); + v72 = *v6; + v42 = v5->mCurrentOrigin.y; + v69 = 0; + v73 = v42; + v68 = 10000; + v43 = v5->mCurrentOrigin.z + 10.0; + v67 = &v72; + v66 = v6; + v65 = &colorGreen; + length = v43; + ((void(__stdcall*)(idVec4*, float*, float*, signed int, _DWORD))session->rw->vfptr->DebugLine)( + &colorGreen, + v6, + &v72, + 10000, + 0); + v13 = size.z; + v9 = parms; + v14 = corner.x; + v12 = size.y; + } + if (((unsigned int)v5->mFlags >> 1) & 1 + && ((unsigned int)v5->mDeclEffect->mFlags >> 1) & 1 + && (init + || v9->endOrigin.x != v5->mCurrentEndOrigin.x + || v9->endOrigin.y != v5->mCurrentEndOrigin.y + || v9->endOrigin.z != v5->mCurrentEndOrigin.z + || v5->mLastOrigin.x != *v6 + || v5->mLastOrigin.y != v6[1] + || v5->mLastOrigin.z != v6[2])) + { + v5->mCurrentEndOrigin.x = v9->endOrigin.x; + LODWORD(v71) = (char*)v5 + 396; + v5->mCurrentEndOrigin.y = v9->endOrigin.y; + v5->mCurrentEndOrigin.z = v9->endOrigin.z; + v70 = COERCE_FLOAT(&v72); + v72 = v12 + v5->mCurrentEndOrigin.x; + v73 = v5->mCurrentEndOrigin.y + v13; + length = v5->mCurrentEndOrigin.z + v14; + v44 = (float*)LODWORD(v71); + v45 = v72; + *(float*)LODWORD(v71) = fminf(*(float*)LODWORD(v71), v72); + v46 = v73; + v44[1] = fminf(v44[1], v73); + v47 = length; + v44[2] = fminf(v44[2], length); + v44[3] = fmaxf(v45, v44[3]); + v44[4] = fmaxf(v46, v44[4]); + v44[5] = fmaxf(v47, v44[5]); + v48 = v5->mCurrentEndOrigin.x; + v70 = COERCE_FLOAT(&v72); + LODWORD(v71) = (char*)v5 + 396; + v72 = v48 - v12; + v73 = v5->mCurrentEndOrigin.y - v13; + length = v5->mCurrentEndOrigin.z - v14; + v49 = (float*)&v5->mCurrentWorldBounds; + v50 = v72; + *v49 = fminf(v5->mCurrentWorldBounds.b[0].x, v72); + v51 = v73; + v49[1] = fminf(v5->mCurrentWorldBounds.b[0].y, v73); + v52 = length; + v49[2] = fminf(v5->mCurrentWorldBounds.b[0].z, length); + v49[3] = fmaxf(v50, v5->mCurrentWorldBounds.b[1].x); + v49[4] = fmaxf(v51, v5->mCurrentWorldBounds.b[1].y); + v49[5] = fmaxf(v52, v5->mCurrentWorldBounds.b[1].z); + v5->mFlags |= 4u; + } + v53 = (float*)&v5->mCurrentLocalBounds; + v53[2] = 1.0e30; + v54 = 0; + v53[1] = 1.0e30; + v70 = COERCE_FLOAT((idVec3*)((char*)&corner + 4)); + LODWORD(v71) = (char*)v5 + 372; + *v53 = 1.0e30; + size.x = -1.0e30; + v55 = size.x; + v53[5] = size.x; + v53[4] = v55; + v53[3] = v55; + do + { + corner.y = *((float*)&v5->vfptr + 3 * ((v54 & 1) + 33)); + corner.z = v5->mCurrentWorldBounds.b[(v54 >> 1) & 1].y; + dir.x = v5->mCurrentWorldBounds.b[(v54 >> 2) & 1].z; + corner.y = corner.y - *v6; + corner.z = corner.z - v6[1]; + dir.x = dir.x - v6[2]; + v72 = v5->mCurrentAxisTransposed.mat[2].x * dir.x + + v5->mCurrentAxisTransposed.mat[0].x * corner.y + + corner.z * v5->mCurrentAxisTransposed.mat[1].x; + v73 = v5->mCurrentAxisTransposed.mat[0].y * corner.y + + v5->mCurrentAxisTransposed.mat[1].y * corner.z + + dir.x * v5->mCurrentAxisTransposed.mat[2].y; + length = dir.x * v5->mCurrentAxisTransposed.mat[2].z + + corner.y * v5->mCurrentAxisTransposed.mat[0].z + + corner.z * v5->mCurrentAxisTransposed.mat[1].z; + corner.y = v72; + corner.z = v73; + dir.x = length; + v56 = (float*)LODWORD(v71); + v57 = v70; + v58 = *(float*)LODWORD(v70); + *(float*)LODWORD(v71) = fminf(*(float*)LODWORD(v71), *(float*)LODWORD(v70)); + v59 = *(float*)(LODWORD(v57) + 4); + v56[1] = fminf(v56[1], v59); + v60 = *(float*)(LODWORD(v57) + 8); + v56[2] = fminf(v56[2], v60); + v56[3] = fmaxf(v58, v56[3]); + v56[4] = fmaxf(v59, v56[4]); + v56[5] = fmaxf(v60, v56[5]); + ++v54; + } while (v54 < 8); + dir.y = v5->mCurrentEndOrigin.x - *v6; + dir.z = v5->mCurrentEndOrigin.y - v6[1]; + v78 = v5->mCurrentEndOrigin.z - v6[2]; + v70 = dir.y * dir.y + dir.z * dir.z + v78 * v78; + v70 = sqrt(v70); + v61 = v70; + if (v70 >= 0.00000011920929) + { + v70 = 1.0 / v61; + dir.y = v70 * dir.y; + dir.z = dir.z * v70; + v78 = v70 * v78; + } + else + { + v61 = 0.0; + } + size.x = v61; + v62 = idVec3::ToMat3((idVec3*)((char*)&dir + 4), &result); + v63 = size.x / 100.0; + qmemcpy(&v5->mLightningAxis, v62, sizeof(v5->mLightningAxis)); + v70 = v63; + v64 = v70; + v5->mLightningAxis.mat[0].x = v5->mLightningAxis.mat[0].x * v70; + v5->mLightningAxis.mat[0].y = v64 * v5->mLightningAxis.mat[0].y; + v5->mLightningAxis.mat[0].z = v64 * v5->mLightningAxis.mat[0].z; + v5->mTint.x = parms->shaderParms[0]; + v5->mTint.y = parms->shaderParms[1]; + v5->mTint.z = parms->shaderParms[2]; + v5->mTint.w = parms->shaderParms[3]; + v5->mBrightness = parms->shaderParms[6]; + v5->mSuppressLightsInViewID = parms->suppressLightsInViewID; + v5->mAttenuation = parms->attenuation; + v5->mMaterialColor.x = parms->materialColor.x; + v5->mMaterialColor.y = parms->materialColor.y; + v5->mMaterialColor.z = parms->materialColor.z; + */ +} \ No newline at end of file diff --git a/src/bse/BSE_EffectTemplate.cpp b/src/bse/BSE_EffectTemplate.cpp index a5bf0115..372dfa10 100644 --- a/src/bse/BSE_EffectTemplate.cpp +++ b/src/bse/BSE_EffectTemplate.cpp @@ -35,17 +35,86 @@ size_t rvDeclEffect::Size(void) const { int rvDeclEffect::GetTrailSegmentIndex(const idStr& name) { - return 0; + rvDeclEffect* v2; // esi + int v3; // edi + int v4; // ebx + rvSegmentTemplate* v5; // eax + int result; // eax + + v2 = this; + v3 = 0; + if (mSegmentTemplates.Num() <= 0) + { + LABEL_6: + common->Warning("^4BSE:^1 Unable to find segment '%s'\n", name.c_str()); + result = -1; + } + else + { + v4 = 0; + while (1) + { + v5 = &this->mSegmentTemplates[v4]; + if (v5) + { + if (name == v5->GetSegmentName()) + break; + } + ++v3; + ++v4; + if (v3 >= this->mSegmentTemplates.Num()) + goto LABEL_6; + } + result = v3; + } + return result; } float rvDeclEffect::EvaluateCost(int activeParticles, int segment) const { - return 0; + int v5; // edi + int v6; // ebx + double v7; // st7 + float cost; // [esp+Ch] [ebp+8h] + + if (segment != -1) + return mSegmentTemplates[segment].EvaluateCost(activeParticles); + v5 = 0; + cost = 0.0; + if (this->mSegmentTemplates.Num() > 0) + { + v6 = 0; + do + { + v7 = mSegmentTemplates[v6].EvaluateCost(activeParticles); + ++v5; + ++v6; + cost = v7 + cost; + } while (v5 < this->mSegmentTemplates.Num()); + } + return cost; } void rvDeclEffect::FreeData() { - + int v2; // ebx + int v3; // edi + rvSegmentTemplate* v4; // eax + int* v5; // edi + + v2 = 0; + if (this->mSegmentTemplates.Num() > 0) + { + v3 = 0; + do + { + mSegmentTemplates[v3].GetParticleTemplate()->Purge(); + mSegmentTemplates[v3].GetParticleTemplate()->PurgeTraceModel(); + ++v2; + ++v3; + } while (v2 < this->mSegmentTemplates.Num()); + } + mSegmentTemplates.Clear(); } const char* rvDeclEffect::DefaultDefinition() const @@ -66,10 +135,107 @@ void rvDeclEffect::SetMaxDuration(float duration) } void rvDeclEffect::Finish() { - + rvSegmentTemplate* segment; + for (int j = 0; j < mSegmentTemplates.Num(); j++) + { + segment = &mSegmentTemplates[j]; + if (segment) + { + segment->Finish(this); + + if (segment->GetType() == SEG_SOUND) + mFlags |= ETFLAG_HAS_SOUND; + + if (segment->GetParticleTemplate()->UsesEndOrigin()) + mFlags |= ETFLAG_USES_ENDORIGIN; + + if ((mFlags & 0x200) != 0) + mFlags |= ETFLAG_HAS_PHYSICS; + if ((mFlags & 0x40) != 0) + mFlags |= ETFLAG_ATTENUATES; + + segment->EvaluateTrailSegment(this); + segment->SetMinDuration(this); + segment->SetMaxDuration(this); + } + } } bool rvDeclEffect::Parse(const char* text, const int textLength) { + return true; +#if 0 + idParser src; + idToken token, token2; + rvSegmentTemplate segment; + + src.LoadMemory(text, textLength, GetFileName()); + src.SetFlags(DECL_LEXER_FLAGS); + src.SkipUntilString("{"); + + if (src.ReadToken(&token)) + { + while (token != "}") + { + segment.Init(this); + if (token == "tunnel") + { + segment.Parse(this, SEG_TUNNEL, &src); + } + else if (token == "shake") + { + segment.Parse(this, SEG_SHAKE, &src); + } + else if (token == "delay") + { + segment.Parse(this, SEG_DELAY, &src); + } + else if (token == "light") + { + segment.Parse(this, SEG_LIGHT, &src); + } + else if (token == "decal") + { + segment.Parse(this, SEG_DECAL, &src); + } + else if (token == "sound") + { + segment.Parse(this, SEG_SOUND, &src); + } + else if (token == "trail") + { + segment.Parse(this, SEG_TRAIL, &src); + } + else if (token == "spawner") + { + segment.Parse(this, SEG_SPAWNER, &src); + } + else if (token == "emitter") + { + segment.Parse(this, SEG_EMITTER, &src); + } + else if (token == "effect") + { + segment.Parse(this, SEG_EFFECT, &src); + if (segment.Finish(this)) { + mSegmentTemplates.Append(segment); + } + } + else if (token == "cutOffDistance") { + mCutOffDistance = src.ParseFloat(); + } + else if (token == "size") + { + mSize = src.ParseFloat(); + } + else + { + src.Error("^4BSE:^1 Invalid segment type '%s' (file: %s, line: %d)\n", token, GetFileName(), src.GetLineNum()); + } + } + } + + Finish(); return true; +#endif } diff --git a/src/bse/BSE_Envelope.h b/src/bse/BSE_Envelope.h index aa2191bf..33803914 100644 --- a/src/bse/BSE_Envelope.h +++ b/src/bse/BSE_Envelope.h @@ -46,7 +46,7 @@ class rvEnvParms //: public sdPoolAllocator< rvEnvParms, sdPoolAllocator_rvEnvPa void Finalize( void ); void ClearFast( void ) { mFastLookUp = false; } -private: +public: bool Compare( const rvEnvParms &comp ) const; const idDeclTable *mTable; diff --git a/src/bse/BSE_Envelopes.cpp b/src/bse/BSE_Envelopes.cpp new file mode 100644 index 00000000..082f34fc --- /dev/null +++ b/src/bse/BSE_Envelopes.cpp @@ -0,0 +1,247 @@ +// BSP_Envelopes.cpp +// + +#pragma hdrstop +#include "precompiled.h" + +#include "BSE_Envelope.h" + +/* +========================== +rvEnvParms::GetMinMax +========================== +*/ +bool rvEnvParms::GetMinMax(float& min, float& max) +{ + bool result = false; // al + + if (mTable) + { + min = mTable->GetMinValue(); + result = true; + max = mTable->GetMaxValue(); + } + else + { + min = 0.0; + max = 0.0; + result = false; + } + return result; +} + +/* +========================== +rvEnvParms::Init +========================== +*/ +void rvEnvParms::Init(void) +{ + mTable = 0; + mIsCount = 1; + mFastLookUp = 0; + mEnvOffset.z = 0.0; + mEnvOffset.y = 0.0; + mEnvOffset.x = 0.0; + mRate.x = 1.0; + mRate.y = 1.0; + mRate.z = 1.0; +} + +/* +========================== +rvEnvParms::Compare +========================== +*/ +bool rvEnvParms::Compare(const rvEnvParms& comp) const +{ + return this->mTable == comp.mTable + && this->mIsCount == comp.mIsCount + && comp.mRate.x == comp.mRate.x + && comp.mRate.y == comp.mRate.y + && comp.mRate.z == comp.mRate.z + && comp.mEnvOffset.x == comp.mEnvOffset.x + && comp.mEnvOffset.y == comp.mEnvOffset.y + && comp.mEnvOffset.z == comp.mEnvOffset.z; +} + +/* +========================== +rvEnvParms::operator= +========================== +*/ +void rvEnvParms::operator=(const rvEnvParms& copy) +{ + *this = copy; +} + +void rvEnvParms::Evaluate(class rvEnvParms1Particle& env, float time, float oneOverDuration, float* dest) +{ + + const idDeclTable* v6; // ecx + float v7; // [esp+4h] [ebp-4h] + int result; // [esp+14h] [ebp+Ch] + float resulta; // [esp+14h] [ebp+Ch] + + v6 = this->mTable; + if (v6) + { + v7 = this->mRate.x; + if (this->mIsCount) + v7 = v7 * oneOverDuration; + result = v7 * time + this->mEnvOffset.x; + resulta = v6->TableLookup(result); + *dest = (env.mEnd - env.mStart) * resulta + env.mStart; + } + else + { + *dest = env.mStart; + } +} + +void rvEnvParms::Evaluate(class rvEnvParms2Particle& env, float time, float oneOverDuration, float* dest) +{ + const idDeclTable* v6; // ecx + float rate_4; // [esp+14h] [ebp-8h] + float rate_4a; // [esp+14h] [ebp-8h] + float v9; // [esp+18h] [ebp-4h] + float timea; // [esp+24h] [ebp+8h] + float timeb; // [esp+24h] [ebp+8h] + float result; // [esp+28h] [ebp+Ch] + float resulta; // [esp+28h] [ebp+Ch] + float resultb; // [esp+28h] [ebp+Ch] + float resultc; // [esp+28h] [ebp+Ch] + + if (this->mFastLookUp) + { + rate_4 = this->mRate.x; + if (this->mIsCount) + rate_4 = rate_4 * oneOverDuration; + timea = rate_4 * time + this->mEnvOffset.x; + result = mTable->TableLookup(timea); + *dest = env.mStart.x + (env.mEnd.x - env.mStart.x) * result; + dest[1] = result * (env.mEnd.y - env.mStart.y) + env.mStart.y; + } + else + { + v6 = this->mTable; + if (this->mTable) + { + rate_4a = this->mRate.x; + v9 = this->mRate.y; + if (this->mIsCount) + { + rate_4a = rate_4a * oneOverDuration; + v9 = oneOverDuration * v9; + } + resulta = rate_4a * time + this->mEnvOffset.x; + resultb = v6->TableLookup(resulta);// ((double(__stdcall*)(_DWORD))v6->TableLookup)(LODWORD(resulta)); + *dest = (env.mEnd.x - env.mStart.x) * resultb + env.mStart.x; + timeb = v9 * time + this->mEnvOffset.y; + resultc = mTable->TableLookup(timeb); //((double(__stdcall*)(_DWORD))this->mTable->TableLookup)(LODWORD(timeb)); + dest[1] = (env.mEnd.y - env.mStart.y) * resultc + env.mStart.y; + } + else + { + *dest = env.mStart.x; + dest[1] = env.mStart.y; + } + } +} + + +void rvEnvParms::Evaluate(class rvEnvParms3Particle& env, float time, float oneOverDuration, float* dest) +{ + const idDeclTable* v6; // ecx + float v8; // [esp+18h] [ebp-10h] + float v9; // [esp+1Ch] [ebp-Ch] + float v10; // [esp+20h] [ebp-8h] + float v11; // [esp+24h] [ebp-4h] + float enva; // [esp+2Ch] [ebp+4h] + float timea; // [esp+30h] [ebp+8h] + float timeb; // [esp+30h] [ebp+8h] + float result; // [esp+34h] [ebp+Ch] + float resulta; // [esp+34h] [ebp+Ch] + float resultb; // [esp+34h] [ebp+Ch] + float resultc; // [esp+34h] [ebp+Ch] + float resultd; // [esp+34h] [ebp+Ch] + + if (this->mFastLookUp) + { + v8 = this->mRate.x; + if (this->mIsCount) + v8 = v8 * oneOverDuration; + timea = v8 * time + this->mEnvOffset.x; + result = this->mTable->TableLookup(timea); + *dest = env.mStart.x + (env.mEnd.x - env.mStart.x) * result; + dest[1] = (env.mEnd.y - env.mStart.y) * result + env.mStart.y; + dest[2] = result * (env.mEnd.z - env.mStart.z) + env.mStart.z; + } + else + { + v6 = this->mTable; + if (this->mTable) + { + v9 = this->mRate.x; + v10 = this->mRate.y; + v11 = this->mRate.z; + if (this->mIsCount) + { + v9 = v9 * oneOverDuration; + v10 = v10 * oneOverDuration; + v11 = oneOverDuration * v11; + } + resulta = v9 * time + this->mEnvOffset.x; + resultb = v6->TableLookup(resulta); + *dest = (env.mEnd.x - env.mStart.x) * resultb + env.mStart.x; + enva = v10 * time + this->mEnvOffset.y; + resultc = this->mTable->TableLookup(enva); + dest[1] = (env.mEnd.y - env.mStart.y) * resultc + env.mStart.y; + timeb = v11 * time + this->mEnvOffset.z; + resultd = this->mTable->TableLookup(timeb); + dest[2] = (env.mEnd.z - env.mStart.z) * resultd + env.mStart.z; + } + else + { + *dest = env.mStart.x; + dest[1] = env.mStart.y; + dest[2] = env.mStart.z; + } + } +} + +void rvEnvParms::Finalize(void) +{ + bool v1; // zf + + v1 = this->mTable == 0; + this->mFastLookUp = 0; + if (!v1) + this->mFastLookUp = this->mRate.y == this->mRate.x + && this->mRate.z == this->mRate.x + && this->mEnvOffset.y == this->mEnvOffset.x + && this->mEnvOffset.z == this->mEnvOffset.x; +} + +void rvEnvParms3Particle::Rotate(const rvAngles& angles) +{ + this->mStart.x = angles.pitch + this->mStart.x; + this->mStart.y = angles.yaw + this->mStart.y; + this->mStart.z = angles.roll + this->mStart.z; + this->mEnd.x = angles.pitch + this->mEnd.x; + this->mEnd.y = this->mEnd.y + angles.yaw; + this->mEnd.z = angles.roll + this->mEnd.z; +} + +void rvEnvParms::SetDefaultType() +{ + if (!this->mTable) + { + this->mTable = (const idDeclTable*)declManager->FindType( + DECL_TABLE, + "linear", + 1); + this->mIsCount = 1; + this->mFastLookUp = 1; + } +} \ No newline at end of file diff --git a/src/bse/BSE_Manager.cpp b/src/bse/BSE_Manager.cpp index 0e1c1663..5f140d4d 100644 --- a/src/bse/BSE_Manager.cpp +++ b/src/bse/BSE_Manager.cpp @@ -21,13 +21,70 @@ idCVar bse_singleEffect("bse_singleEffect", "", 0, "set to the name of the effec idCVar bse_rateLimit("bse_rateLimit", "1", CVAR_FLOAT, "rate limit for spawned effects"); idCVar bse_rateCost("bse_rateCost", "1", CVAR_FLOAT, "rate cost multiplier for spawned effects"); +float effectCosts[EC_MAX] = { 0, 2, 0.1 }; // dd 0.0, 2 dup(0.1) + +idBlockAlloc rvBSEManagerLocal::effects; +idVec3 rvBSEManagerLocal::mCubeNormals[6]; +idMat3 rvBSEManagerLocal::mModelToBSE; +idList rvBSEManagerLocal::mTraceModels; +const char* rvBSEManagerLocal::mSegmentNames[SEG_COUNT]; +int rvBSEManagerLocal::mPerfCounters[NUM_PERF_COUNTERS]; +float rvBSEManagerLocal::mEffectRates[EC_MAX]; + bool rvBSEManagerLocal::Init(void) { + common->Printf("----------------- BSE Init ------------------\n"); + + renderModelManager->FindModel("_default"); + + common->Printf("--------- BSE Created Successfully ----------\n"); return true; } + bool rvBSEManagerLocal::Shutdown(void) { return true; } +/* +======================= +rvBSEManagerLocal::AddTraceModel +======================= +*/ +int rvBSEManagerLocal::AddTraceModel(idTraceModel* model) +{ + mTraceModels.Append(model); + return mTraceModels.Num() - 1; +} + +/* +======================= +rvBSEManagerLocal::GetTraceModel +======================= +*/ +idTraceModel* rvBSEManagerLocal::GetTraceModel(int index) +{ + idTraceModel* result; // eax + + if (index < 0 || index >= mTraceModels.Num()) + result = 0; + else + result = mTraceModels[index]; + return result; +} + +/* +======================= +rvBSEManagerLocal::FreeTraceModel +======================= +*/ +void rvBSEManagerLocal::FreeTraceModel(int index) +{ + if (index >= 0 && index < mTraceModels.Num()) + { + delete mTraceModels[index]; + mTraceModels[index] = NULL; + } +} + bool rvBSEManagerLocal::PlayEffect(class rvRenderEffectLocal* def, float time) { return true; } @@ -61,11 +118,22 @@ void rvBSEManagerLocal::EndLevelLoad(void) { } void rvBSEManagerLocal::StartFrame(void) { - + if (bse_speeds.GetInteger()) + { + rvBSEManagerLocal::mPerfCounters[0] = 0; + rvBSEManagerLocal::mPerfCounters[1] = 0; + rvBSEManagerLocal::mPerfCounters[2] = 0; + rvBSEManagerLocal::mPerfCounters[3] = 0; + rvBSEManagerLocal::mPerfCounters[4] = 0; + } } void rvBSEManagerLocal::EndFrame(void) { - + common->Printf("bse_active: %i particles: %i traces: %i texels: %i\n", + rvBSEManagerLocal::mPerfCounters[0], + rvBSEManagerLocal::mPerfCounters[2], + rvBSEManagerLocal::mPerfCounters[1], + (double)rvBSEManagerLocal::mPerfCounters[3] * 0.00000095367431640625); } bool rvBSEManagerLocal::Filtered(const char* name, effectCategory_t category) { diff --git a/src/bse/BSE_Particle.h b/src/bse/BSE_Particle.h index 8b8f0264..0d0e35e8 100644 --- a/src/bse/BSE_Particle.h +++ b/src/bse/BSE_Particle.h @@ -110,6 +110,10 @@ class rvParticle int GetTiled( void ) const { return( ( mFlags & PTFLAG_TILED ) ); } int GetPersist( void ) const { return( ( mFlags & PTFLAG_PERSIST ) ); } + int GetFlags(void) { + return mFlags; + } + void SetStationary( bool stopped ) { SetFlag( stopped, PTFLAG_STATIONARY ); } void SetLocked( bool locked ) { SetFlag( locked, PTFLAG_LOCKED ); } void SetHasOffset( bool hasOffset ) { SetFlag( hasOffset, PTFLAG_HAS_OFFSET ); } @@ -631,6 +635,7 @@ class rvParticleTemplate bool operator!= ( const rvParticleTemplate& a ) const { return( !Compare( a ) ); } rvParticleTemplate& operator=(const rvParticleTemplate& __that); + int GetFlags(void) { return mFlags; } void SetFlag( bool on, int flag ) { on ? mFlags |= flag : mFlags &= ~flag; } bool GetFlag( int flag ) const { return ( mFlags & flag ) != 0; } bool GetParsed( void ) const { return( !!( mFlags & PTFLAG_PARSED ) ); } @@ -732,7 +737,7 @@ class rvParticleTemplate void Duplicate( rvParticleTemplate const © ); private: bool Compare( const rvParticleTemplate& a ) const; - void FixupParms( rvParticleParms &parms ); + void FixupParms( rvParticleParms *parms ); void AllocTrail( void ); void AllocElectricityInfo( void ); diff --git a/src/bse/BSE_Segment.cpp b/src/bse/BSE_Segment.cpp new file mode 100644 index 00000000..14439444 --- /dev/null +++ b/src/bse/BSE_Segment.cpp @@ -0,0 +1,1310 @@ +// BSE_Segment.cpp +// + +#pragma hdrstop +#include "precompiled.h" + +#include "BSE_Envelope.h" +#include "BSE_Particle.h" +#include "BSE.h" + +#include "../renderer/tr_local.h" + +rvSegment::~rvSegment() { + +} + +void rvSegment::Init(rvBSE* effect, const rvDeclEffect* effectDecl, int segmentTemplateHandle, float time) { + +} +void rvSegment::ResetTime(rvBSE* effect, float time) { + +} + +void rvSegment::InitParticles(rvBSE* effect) { + +} + +bool rvSegment::Check(rvBSE* effect, float time, float offset) { + return false; +} + +bool rvSegment::UpdateParticles(rvBSE* effect, float time) { + return false; +} + +void rvSegment::CalcCounts(rvBSE* effect, float time) { + +} + +void rvSegment::AllocateSurface(rvBSE* effect, idRenderModel* model) { + +} + +#if 0 +void rvSegment::Handle(rvBSE* effect, float time) +{ + rvSegmentTemplate* v3; // edx + + v3 = (rvSegmentTemplate*)mEffectDecl->GetSegmentTemplate(this->mSegmentTemplateHandle); + if (v3 && this->mSegStartTime <= (double)time) + { + switch (v3->mSegType) + { + case SEG_EMITTER: + case SEG_SPAWNER: + if (effect->GetEndOriginChanged()) + RefreshParticles(effect, v3); + break; + case SEG_SOUND: + effect->UpdateSoundEmitter(v3, this); + break; + case SEG_LIGHT: + if ((v3->mFlags & 1) != 0) + HandleLight(effect, v3, time); + break; + default: + return; + } + } +} + +void rvSegment::ValidateSpawnRates() +{ + double v1; // st6 + double v2; // st7 + double v3; // st6 + float v4; // [esp+0h] [ebp-4h] + float v5; // [esp+0h] [ebp-4h] + float v6; // [esp+0h] [ebp-4h] + float v7; // [esp+0h] [ebp-4h] + + v1 = this->mSecondsPerParticle.y; + if (v1 >= 0.0020000001) + { + v2 = 300.0; + if (v1 > 300.0) + { + v6 = 300.0; + goto LABEL_4; + } + } + else + { + v1 = 0.0020000001; + v2 = 300.0; + } + v6 = v1; +LABEL_4: + v3 = v6; + this->mSecondsPerParticle.y = v6; + v4 = this->mSecondsPerParticle.x; + if (v4 < v3 || (v3 = v4, v4 <= v2)) + { + v5 = v3; + this->mSecondsPerParticle.x = v5; + } + else + { + v7 = v2; + this->mSecondsPerParticle.x = v7; + } +} + +void rvSegment::GetSecondsPerParticle(rvBSE* effect, rvSegmentTemplate* st, rvParticleTemplate* pt) +{ + double v4; // st7 + double v7; // st7 + int v8; // edi + float volume; // [esp+10h] [ebp+8h] + float volumea; // [esp+10h] [ebp+8h] + + v4 = 0.0; + if (0.0 == st->mDensity.y) + { + this->mCount = st->mCount; + } + else + { + volume = pt->GetSpawnVolume(effect); + v7 = 0.0020000001; + if (volume >= 0.0020000001) + { + v7 = volume; + if (volume > 2048.0) + v7 = 2048.0; + } + volumea = v7; + this->mCount.x = st->mDensity.x * volumea; + this->mCount.y = volumea * st->mDensity.y; + v4 = 0.0; + } + v8 = st->mSegType; + if (v8 == 2 || v8 == 4) + { + if (v4 != this->mCount.x) + this->mSecondsPerParticle.x = 1.0 / this->mCount.x; + if (v4 != this->mCount.y) + this->mSecondsPerParticle.y = 1.0 / this->mCount.y; + ValidateSpawnRates(); + } +} + +void rvSegment::InitTime(rvBSE* effect, rvSegmentTemplate* st, float time) +{ + float sta; // [esp+20h] [ebp+8h] + float timea; // [esp+24h] [ebp+Ch] + + this->mFlags &= 0xFFFFFFFE; + this->mSegStartTime = rvRandom::flrand(st->mLocalStartTime.x, st->mLocalStartTime.y) + time; + sta = rvRandom::flrand(st->mLocalDuration.x, st->mLocalDuration.y); + this->mSegEndTime = this->mSegStartTime + sta; + if ((st->mFlags & 0x10) == 0 || (effect->GetLooping()) == 0 && !st->GetSoundLooping()) + { + timea = this->mSegEndTime - time; + effect->SetDuration(timea); + } +} + +float rvSegment::AttenuateDuration(rvBSE* effect, rvSegmentTemplate* st) +{ + return (float)(effect->GetAttenuation(st) * (this->mSegEndTime - this->mSegStartTime)); +} + +float rvSegment::AttenuateInterval(rvBSE* effect, rvSegmentTemplate* st) +{ + double result; // st7 + float v5; // [esp+4h] [ebp-Ch] + float v6; // [esp+8h] [ebp-8h] + float v7; // [esp+Ch] [ebp-4h] + float atten; // [esp+18h] [ebp+8h] + float attena; // [esp+18h] [ebp+8h] + float attenb; // [esp+18h] [ebp+8h] + + v5 = (this->mSecondsPerParticle.y - this->mSecondsPerParticle.x) * 1.0f; // bse_detailLevel.internalVar->floatValue + + this->mSecondsPerParticle.x; + v6 = this->mSecondsPerParticle.y; + v7 = this->mSecondsPerParticle.x; + if (v6 <= (double)v5) + { + if (v7 < (double)v5) + v5 = v7; + } + else + { + v5 = v6; + } + if ((st->mFlags & 0x40) == 0) + return v5; + atten = effect->GetAttenuation(st); + if ((st->mFlags & 0x80) != 0) + atten = 1.0 - atten; + if (atten < 0.0020000001) + return 1.0; + attena = v5 / atten; + result = attena; + if (attena <= 0.00000011920929) + { + attenb = 0.00000011920929 + 0.00000011920929; + result = attenb; + } + return result; +} + +float rvSegment::AttenuateCount(rvBSE* effect, rvSegmentTemplate* st, float min, float max) +{ + double v5; // st7 + float v7; // [esp+8h] [ebp-4h] + float v8; // [esp+8h] [ebp-4h] + float atten; // [esp+18h] [ebp+Ch] + + v7 = (max - min) * /*bse_detailLevel.internalVar->floatValue*/ 1.0f + min; + v8 = rvRandom::flrand(min, v7); + if (min <= (double)v8) + { + if (max < (double)v8) + v8 = max; + } + else + { + v8 = min; + } + if ((st->mFlags & 0x40) != 0) + { + atten = effect->GetAttenuation(st); + v5 = atten; + if ((st->mFlags & 0x80) != 0) + v5 = 1.0 - v5; + v8 = v5 * v8; + } + return v8; +} + +void rvSegment::RefreshParticles(rvBSE* effect, rvSegmentTemplate* st) +{ + rvParticle* v4; // ecx + rvParticle* v5; // esi + + if (st->mParticleTemplate.UsesEndOrigin()) + { + v4 = this->mUsedHead; + if (v4) + { + do + { + v5 = v4->GetNext(); + v4->Refresh(effect, st, &st->mParticleTemplate); + v4 = v5; + } while (v5); + } + } +} + +void rvParticle::DoRenderBurnTrail(rvBSE* effect, rvParticleTemplate* pt, const idMat3& view, srfTriangles_t* tri, float time) +{ + int v7; // ecx + int v8; // edi + double v10; // st7 + float v11; // [esp+0h] [ebp-20h] + int delta; // [esp+18h] [ebp-8h] + float v13; // [esp+1Ch] [ebp-4h] + float trailTime; // [esp+30h] [ebp+10h] + float trailTimea; // [esp+30h] [ebp+10h] + + v7 = this->mTrailCount; + if (v7) + { + if (0.0 != this->mTrailTime) + { + v8 = 1; + delta = 1; + v13 = this->mTrailTime / (double)v7; + if (v7 + 1 > 1) + { + do + { + trailTime = time - (double)delta * v13; + v10 = trailTime; + if (this->mStartTime <= (double)trailTime && this->mEndTime > v10) + { + trailTimea = (double)(this->mTrailCount - v8) / (double)this->mTrailCount; + v11 = v10; + Render(effect, pt, view, tri, v11, trailTimea); + } + delta = ++v8; + } while (v8 < this->mTrailCount + 1); + } + } + } +} + +void rvSegment::RenderMotion(rvBSE* effect, const renderEffect_s* owner, idRenderModel* model, rvParticleTemplate* pt, float time) +{ + const modelSurface_t* v7; // eax + rvParticle* v8; // esi + srfTriangles_t* v9; // ebx + modelSurface_t* surf; // [esp+28h] [ebp+Ch] + + v7 = model->Surface(this->mSurfaceIndex + 1); + v8 = this->mUsedHead; + v9 = v7->geometry; + surf = (modelSurface_t*)v7; + if (v8) + { + do + { + v8->RenderMotion(effect, pt, v9, owner, time, pt->GetTrailScale()); + v8 = v8->GetNext(); + } while (v8); + v7 = surf; + } + R_BoundTriSurf(v7->geometry); +} + +rvParticle* rvSegment::SpawnParticle(rvBSE* effect, rvSegmentTemplate* st, float birthTime, const idVec3& initOffset, const idMat3& initAxis) +{ + rvParticle* v6; // esi + rvParticle* v7; // edx + float initAxisa; // [esp+28h] [ebp+14h] + + if ((mEffectDecl->GetSegmentTemplate(this->mSegmentTemplateHandle)->mFlags & 0x100) != 0) + { + v6 = this->mParticles; + } + else + { + v6 = this->mFreeHead; + if (!v6) + return v6; + v7 = this->mUsedHead; + this->mFreeHead = v6->GetNext(); + v6->SetNext(v7); + this->mUsedHead = v6; + } + if (v6) + { + initAxisa = birthTime - effect->GetStartTime(); + v6->FinishSpawn(effect, this, birthTime, initAxisa, initOffset, initAxis); + } + return v6; +} + +void rvSegment::SpawnParticles(rvBSE* effect, rvSegmentTemplate* st, float birthTime, int count) +{ + int v6; // ebp + rvParticle* v8; // ecx + rvParticle* v9; // eax + int v11; // [esp+20h] [ebp-4h] + float counta; // [esp+34h] [ebp+10h] + + v6 = 0; + v11 = 0; + if (count > 0) + { + while ((this->mEffectDecl->GetSegmentTemplate(this->mSegmentTemplateHandle)->mFlags & 0x100) == 0) + { + v8 = this->mFreeHead; + if (v8) + { + v9 = this->mUsedHead; + this->mFreeHead = v8->GetNext(); + v8->SetNext(v9); + this->mUsedHead = v8; + LABEL_6: + if (v8) + { + if (count == 1) + { + v8->FinishSpawn(effect, this, birthTime, 0.0, vec3_origin, mat3_identity); + } + else + { + counta = (double)v11 / (double)(count - 1); + v8->FinishSpawn(effect, this, birthTime, counta, vec3_origin, mat3_identity); + } + } + } + v11 = ++v6; + if (v6 >= count) + return; + } + v8 = this->mParticles; + goto LABEL_6; + } +} + +void rvSegment::PlayEffect(rvBSE* effect, rvSegmentTemplate* st, float depthOffset) +{ + int v4; // eax + idDeclBase* v5; // ecx + int v6; // eax + + v4 = st->mNumEffects; + if (v4) + { + v5 = st->mEffects[rvRandom::irand(0, v4 - 1)]->base; + v6 = v5->Index(); +// jmarshall - todo add PlayEffect to game code. + //((void(__thiscall*)(idGame*, int, idVec3*, idVec3*, idMat3*, _DWORD, idVec3*, _DWORD))game->PlayEffect)( + // game, + // v6, + // &effect->mMaterialColor, + // &effect->mCurrentOrigin, + // &effect->mCurrentAxis, + // 0, + // &vec3_origin, + // LODWORD(depthOffset)); + common->FatalError("rvSegment::PlayEffect\n"); +// jmarshall end + } +} + +void rvSegment::UpdateSimpleParticles(float time) +{ + rvDeclEffect* v3; // eax + int v4; // ecx + rvParticle* v5; // esi + rvParticle* v6; // ebp + rvParticle* v7; // ebx + float pt; // [esp+14h] [ebp-8h] + + v3 = (rvDeclEffect *)this->mEffectDecl; + v4 = this->mSegmentTemplateHandle; + v5 = this->mUsedHead; + v6 = 0; + this->mActiveCount = 0; + if (v5) + { + do + { + v7 = v5->GetNext(); + pt = v5->GetEndTime() - 0.002000000094994903; + if (pt > (double)time) + { + v6 = v5; + this->mActiveCount += v5->Update(&v3->GetSegmentTemplate(v4)->mParticleTemplate, time); + } + else + { + if (v6) + v6->SetNext(v7); + else + this->mUsedHead = v7; + rvParticle* destroyedParticle = v5; // jmarshall: should be fine, eval if broken, passed a function here? + v5->SetNext(this->mFreeHead); + destroyedParticle->Destroy(); + this->mFreeHead = v5; + } + v5 = v7; + } while (v7); + } +} + +void rvSegment::UpdateGenericParticles(rvBSE* effect, rvSegmentTemplate* st, float time) +{ + rvSegment* v5; // esi + unsigned int v6; // eax + rvParticle* v7; // esi + char v8; // al + bool v10; // bl + int v11; // eax + bool(__thiscall * v12)(rvParticle*); // eax + bool v13; // [esp+17h] [ebp-Dh] + rvParticle* v15; // [esp+1Ch] [ebp-8h] + float v16; // [esp+20h] [ebp-4h] + rvParticle* next; // [esp+28h] [ebp+4h] + char infinite; // [esp+2Ch] [ebp+8h] + + v5 = this; + v13 = st->GetSmoker(); + v6 = (unsigned int)st->mFlags >> 5; + v5->mActiveCount = 0; + v7 = v5->mUsedHead; + v8 = v6 & 1; + infinite = v8; + v15 = 0; + if (v7) + { + while (1) + { + v10 = 0; + next = v7->GetNext(); + if (v8) + { + v7->RunPhysics(effect, st, time); + if (effect->GetStopped()) + goto LABEL_9; + } + else + { + v16 = v7->GetEndTime() - 0.002000000094994903; + if (v16 <= (double)time) + { + v7->CheckTimeoutEffect(effect, st, time); + LABEL_9: + v10 = 1; + goto LABEL_10; + } + v10 = v7->RunPhysics(effect, st, time); + } + LABEL_10: + if (effect->GetStopped() && (v7->GetFlags() & 0x200000) == 0) + v10 = 1; + if (v13) + { + v11 = st->mTrailSegmentIndex; + if (v11 >= 0) + v7->EmitSmokeParticles(effect, effect->GetTrailSegment(v11), &st->mParticleTemplate, time); + } + if (v10) + { + if (v15) + v15->SetNext(next); + else + this->mUsedHead = next; + //v12 = v7->Destroy; + rvParticle* destroyedParticle = v7; // jmarshall: should be fine, eval if broken, passed a function here? + v7->SetNext(this->mFreeHead); + destroyedParticle->Destroy(); + this->mFreeHead = v7; + } + else + { + v15 = v7; + v7->Update(st->GetParticleTemplate(), time); + } + v7 = next; + if (!next) + return; + v8 = infinite; + } + } +} + +bool rvSegment::UpdateParticles(rvBSE* effect, float time) +{ + rvSegmentTemplate* v4; // esi + //connectdata* v6; // [esp+8h] [ebp-8h] + int v7; // [esp+Ch] [ebp-4h] + + v4 = (rvSegmentTemplate * )mEffectDecl->GetSegmentTemplate(this->mSegmentTemplateHandle); + if (!v4) + return 0; + Handle(effect, time); + if ((v4->mFlags & 0x20) != 0 + || v4->GetSmoker() + || (v4->mParticleTemplate.GetFlags() & 0x200) != 0 + || v4->mParticleTemplate.GetNumTimeoutEffects()) + { + UpdateGenericParticles(effect, v4, time); + } + else + { + UpdateSimpleParticles(time); + } +// jmarshall - debug, uses undefined struct connectdata, since its debug, not worth dealing with. + //if (bse_speeds.internalVar->integerValue) + //{ + // dword_11F4D54 += this->mActiveCount; + // if (this->mUsedHead) + // dword_11F4D58 += idFile::Tell(v6, v7); + //} +// jmarshall end + return this->mUsedHead != 0; +} + +bool rvSegment::Active() +{ + rvSegmentTemplate* v1; // eax + bool result; // al + + v1 = (rvSegmentTemplate * )mEffectDecl->GetSegmentTemplate(this->mSegmentTemplateHandle); + if (v1 && (v1->mFlags & 4) != 0 && this->mActiveCount) + result = v1->mFlags & 1; + else + result = 0; + return result; +} + +void rvSegment::AllocateSurface(rvBSE* effect, idRenderModel* model) +{ + rvSegmentTemplate* v4; // eax + rvParticleTemplate* v5; // edi + int v6; // ebp + srfTriangles_t* v7; // eax + int v9; // eax + srfTriangles_t* v10; // eax + idRenderModel* v11; // ebp + + v4 = (rvSegmentTemplate*)mEffectDecl->GetSegmentTemplate(this->mSegmentTemplateHandle); + if (v4 && (v4->mFlags & 4) != 0) + { + v5 = &v4->mParticleTemplate; + if (effect->GetLooping()) + v6 = this->mLoopParticleCount; + else + v6 = this->mParticleCount; + v7 = model->AllocSurfaceTriangles(v6 * v4->mParticleTemplate.GetVertexCount(), v6 * v4->mParticleTemplate.GetIndexCount()); + + //v7->texCoordScale = 100.0; // jmarshall: todo + + modelSurface_t surf; + surf.id = 0; + surf.geometry = v7; + surf.shader = v5->GetMaterial(); + model->AddSurface(surf); + + + mSurfaceIndex = model->NumSurfaces() - 1; + if (v5->GetTrailType() == 2 + && (v5->GetMaxTrailCount() || v5->GetMaxTrailTime() >= 0.0020000001)) + { + v9 = v5->GetMaxTrailCount(); + v10 = model->AllocSurfaceTriangles(2 * v6 * v9 + 2, 12 * v6 * v9); + + modelSurface_t surf; + surf.id = 0; + surf.geometry = v10; + surf.shader = v5->GetTrailMaterial(); + model->AddSurface(surf); + + this->mFlags |= 4u; + } + } +} + +void rvSegment::ClearSurface(rvBSE* effect, idRenderModel* model) +{ + int v4; // ebp + rvSegmentTemplate* v6; // eax + rvParticleTemplate* v7; // ebp + int v8; // eax + int v9; // ebx + int v10; // eax + int v11; // ecx + srfTriangles_t* v12; // eax + modelSurface_t *v13; // edi + int v14; // eax + int v15; // ecx + int v16; // eax + srfTriangles_t* v17; // eax + srfTriangles_t* v18; // eax + srfTriangles_t* v19; // eax + int v20; // [esp-8h] [ebp-10h] + int v21; // [esp-4h] [ebp-Ch] + int v22; // [esp-4h] [ebp-Ch] + const modelSurface_t* v23; // [esp+18h] [ebp+10h] + + v6 = (rvSegmentTemplate*)mEffectDecl->GetSegmentTemplate(this->mSegmentTemplateHandle); + if (v6 && (v6->mFlags & 4) != 0) + { + v21 = v4; + v7 = &v6->mParticleTemplate; + if (v6->mParticleTemplate.GetType() == 7) + { + v23 = model->Surface(this->mSurfaceIndex); + model->FreeSurfaceTriangles(v23->geometry); + if (effect->GetLooping()) + v8 = this->mLoopParticleCount; + else + v8 = this->mParticleCount; + v9 = v8 * this->mActiveCount; + v10 = v9 * v7->GetVertexCount(); + if (v10 > 10000) + v10 = 10000; + v11 = v9 * v7->GetIndexCount(); + if (v11 > 30000) + v11 = 30000; + v12 = model->AllocSurfaceTriangles(v10, v11); + //model[2].__vftable = (idRenderModel_vtbl*)v12; + //v12->texCoordScale = 100.0; + if ((this->mFlags & 4) != 0) + { + v13 = (modelSurface_t * )model->Surface(this->mSurfaceIndex + 1); + model->FreeSurfaceTriangles(v13->geometry); + v14 = v9 * v7->GetMaxTrailCount(); + v15 = 2 * v14 + 2; + if (v15 > 10000) + v15 = 10000; + v16 = 12 * v14; + if (v16 > 30000) + v16 = 30000; + v17 = model->AllocSurfaceTriangles(v15, v16); + v13->geometry = v17; + //v17->texCoordScale = 100.0; // jmarshall + } + } + else + { + v18 = model->Surface(mSurfaceIndex)->geometry; + v18->numIndexes = 0; + v18->numVerts = 0; + if ((this->mFlags & 4) != 0) + { + v19 = model->Surface(mSurfaceIndex + 1)->geometry; + v19->numIndexes = 0; + v19->numVerts = 0; + } + } + } +} + +void rvSegment::RenderTrail(rvBSE* effect, const renderEffect_s* owner, idRenderModel* model, float time) +{ + rvSegmentTemplate* v6; // eax + rvParticleTemplate* v7; // esi + float v9; // [esp+10h] [ebp-4h] + + v6 = (rvSegmentTemplate*)mEffectDecl->GetSegmentTemplate(this->mSegmentTemplateHandle); + if (v6) + { + v7 = &v6->mParticleTemplate; + v9 = ceil(v6->mParticleTemplate.GetMaxTrailTime()); + if ((int)v9 != -1) + { + if (v7->GetMaxTrailTime() >= 0.0020000001 && v7->GetTrailType() == 2) + rvSegment::RenderMotion(effect, owner, model, v7, time); + } + } +} + +void rvSegment::Init(rvBSE* effect, const rvDeclEffect* effectDecl, int segmentTemplateHandle, float time) +{ + rvSegmentTemplate* v6; // edi + + this->mSegmentTemplateHandle = segmentTemplateHandle; + this->mFlags = 0; + this->mEffectDecl = effectDecl; + this->mParticleType = effectDecl->GetSegmentTemplate(segmentTemplateHandle)->mParticleTemplate.GetType(); + this->mSurfaceIndex = -1; + v6 = (rvSegmentTemplate * )effectDecl->GetSegmentTemplate(segmentTemplateHandle); + if (v6) + { + this->mActiveCount = 0; + this->mLastTime = time; + this->mSecondsPerParticle.y = 0.0; + this->mSecondsPerParticle.x = 0.0; + this->mCount.x = 1.0; + this->mCount.y = 1.0; + this->mFreqShift = 1.0; + this->mParticleCount = 0; + this->mLoopParticleCount = 0; + this->mParticles = 0; + this->mSoundVolume = 0.0; + InitTime(effect, v6, time); + GetSecondsPerParticle(effect, v6, &v6->mParticleTemplate); + } +} + +void rvSegment::AddToParticleCount(rvBSE* effect, int count, int loopCount, float duration) +{ + rvSegmentTemplate* v6; // edi + int v7; // eax + int v8; // ebx + const char* v9; // eax + int v10; // ebx + const char* v11; // eax + int v12; // eax + int v13; // eax + char* X_4; // [esp+4h] [ebp-14h] + char* X_4a; // [esp+4h] [ebp-14h] + float durationa; // [esp+28h] [ebp+10h] + float durationb; // [esp+28h] [ebp+10h] + float durationc; // [esp+28h] [ebp+10h] + + v6 = (rvSegmentTemplate * )mEffectDecl->GetSegmentTemplate(mSegmentTemplateHandle); + if (v6) + { + if (duration < (double)v6->mParticleTemplate.GetMaxDuration()) + duration = v6->mParticleTemplate.GetMaxDuration(); + durationa = duration + 0.01600000075995922; + durationb = durationa / this->mSecondsPerParticle.y; + durationc = ceil(durationb); + v7 = (int)durationc; + this->mLoopParticleCount += loopCount * (v7 + 1); + this->mParticleCount += count * (v7 + 1); + if (effect->GetLooping()) //((effect->mFlags & 1) != 0) + { + if (this->mLoopParticleCount > 2048) + { + common->Warning("More than MAX_PARTICLES required for segment %s\n", v6->GetSegmentName().c_str()); + this->mLoopParticleCount = 2048; + } + } + else if (this->mParticleCount > 2048) + { + common->Warning("More than MAX_PARTICLES required for segment %s\n", v6->GetSegmentName().c_str()); + this->mParticleCount = 2048; + } + v12 = count; + if (count >= 2048) + v12 = 2048; + this->mParticleCount = v12; + v13 = loopCount; + if (loopCount >= 2048) + v13 = 2048; + this->mLoopParticleCount = v13; + } +} + +void rvSegment::CalcTrailCounts(rvBSE* effect, rvSegmentTemplate* st, rvParticleTemplate* pt, float duration) +{ + if (st->mTrailSegmentIndex >= 0) { + effect->GetTrailSegment(st->mTrailSegmentIndex)->AddToParticleCount(effect, mParticleCount, mLoopParticleCount, duration); + } +} + +void rvSegment::CalcCounts(rvBSE* effect, float time) +{ + rvDeclEffect* effectDecl; // ebx + int v4; // ebp + bool v5; // zf + rvSegmentTemplate* segmentTemplate; // ebp + int segType; // eax + int v8; // ecx + int v9; // edi + int v10; // esi + int v11; // eax + double v12; // st7 + bool v13; // cc + char* v14; // edi + int v15; // eax + char* v16; // esi + int v17; // eax + int v18; // eax + int v19; // eax + float v21; // [esp+14h] [ebp-18h] + float v22; // [esp+14h] [ebp-18h] + float effectMinDuration; // [esp+1Ch] [ebp-10h] + float pt; // [esp+20h] [ebp-Ch] + float _X; // [esp+28h] [ebp-4h] + float v27; // [esp+28h] [ebp-4h] + float v28; // [esp+28h] [ebp-4h] + float effecta; // [esp+30h] [ebp+4h] + + effectDecl = (rvDeclEffect * )this->mEffectDecl; + v4 = this->mSegmentTemplateHandle; + v5 = effectDecl->GetSegmentTemplate(v4) == 0; + segmentTemplate = effectDecl->GetSegmentTemplate(v4); + if (!v5) + { + segType = segmentTemplate->mSegType; + if (segType != SEG_TRAIL) + { + v8 = segmentTemplate->mParticleTemplate.GetType(); + if (v8) + { + v21 = 0.0; + v9 = 0; + v10 = 0; + effectMinDuration = segmentTemplate->GetParticleTemplate()->GetMaxDuration() + 0.01600000075995922; + pt = effectDecl->GetMinDuration(); + switch (segType) + { + case SEG_EMITTER: + if (v8 == 10) + { + v10 = 1; + v9 = 1; + } + else + { + v22 = segmentTemplate->GetParticleTemplate()->GetMaxDuration() + 0.01600000075995922; + if (segmentTemplate->mLocalDuration.y < (double)effectMinDuration) + v22 = segmentTemplate->mLocalDuration.y; + v21 = v22 + 0.01600000075995922; + _X = v21 / this->mSecondsPerParticle.y; + v11 = (int)ceilf(_X); + v9 = v11 + 1; + v10 = v11 + 1; + if (effectMinDuration > (double)pt) + { + v27 = effectMinDuration * (double)(v11 + 1) / pt; + v10 = (int)ceilf(v27) + 1; + } + } + break; + case SEG_SPAWNER: + if (v8 == 10) + { + v10 = 1; + v9 = 1; + } + else + { + v9 = (int)ceilf(this->mCount.y); + v10 = v9; + v12 = pt; + if (pt != 0.0 && (segmentTemplate->mFlags & 0x20) == 0 && effectMinDuration > v12) + { + v28 = effectMinDuration / v12; + v10 = v9 * ((int)ceilf(v28) + 1) + 1; + } + } + break; + case SEG_TRAIL: + break; + case SEG_DECAL: + case SEG_LIGHT: + v9 = 1; + v10 = 1; + break; + default: + v9 = 0; + v10 = 0; + break; + } + if (segmentTemplate->mSegType == 4) + goto LABEL_37; + if (effect->GetLooping()) + { + if (v10 > 2048) + { + common->Warning("More than MAX_PARTICLES required for segment %s\n", segmentTemplate->GetSegmentName().c_str()); + v10 = 2048; + } + v13 = v9 < 2048; + } + else + { + v13 = v9 < 2048; + if (v9 > 2048) + { + common->Warning("More than MAX_PARTICLES required for segment %s\n", segmentTemplate->GetSegmentName().c_str()); + goto LABEL_27; + } + } + if (v13) + { + LABEL_28: + this->mParticleCount = v9; + if (v10 >= 2048) + v10 = 2048; + this->mLoopParticleCount = v10; + if ((segmentTemplate->mFlags & 4) != 0) + { + if (!v9 || !v10) + { + common->Warning("Segment with no particles for effect %s\n", effectDecl->base->GetName()); + } + v19 = segmentTemplate->mSegType; + if (v19 == 2 || v19 == 3) + CalcTrailCounts(effect, segmentTemplate, &segmentTemplate->mParticleTemplate, v21); + } + LABEL_37: + if (!effect->GetLooping()) //effect->mFlags & 1) == 0) + { + effecta = this->mSegEndTime - time + segmentTemplate->mParticleTemplate.GetMaxDuration(); + effect->SetDuration(effecta); + } + return; + } + LABEL_27: + v9 = 2048; + goto LABEL_28; + } + } + } +} + +void rvSegment::ResetTime(rvBSE* effect, float time) +{ + rvSegmentTemplate* v3; // eax + + v3 = (rvSegmentTemplate*)mEffectDecl->GetSegmentTemplate(mSegmentTemplateHandle); + if (v3) + { + if ((v3->mFlags & 0x20) == 0) + InitTime(effect, v3, time); + } +} + +// jmarshall: this isn't like the original function, which was heavily optimized in the executable; +// basically here it allocates a block a rvParticle derieved classes, but its partially expecting a +// continous block even though its in a linked list. They probably had some optimizaiton here to +// prevent memory fragmentation. This needs to be looked at because +rvParticle* rvSegment::InitParticleArray(rvBSE* effect) { + int particleCount = 0; + rvParticle* particle[2048]; // Max Particles + + if (effect->GetLooping()) + particleCount = this->mLoopParticleCount; + else + particleCount = this->mParticleCount; + + int type = mEffectDecl->GetSegmentTemplate(mSegmentTemplateHandle)->mParticleTemplate.GetType(); + + for (int i = 0; i < particleCount - 1; i++) + { + rvParticle* newParticle = NULL; + + switch (type) + { + case PTYPE_LINE: + newParticle = new rvLineParticle(); + break; + + case PTYPE_ORIENTED: + newParticle = new rvOrientedParticle(); + break; + + case PTYPE_DECAL: + newParticle = new rvDecalParticle(); + break; + + case PTYPE_MODEL: + newParticle = new rvModelParticle(); + break; + + case PTYPE_LIGHT: + newParticle = new rvLightParticle(); + break; + + case PTYPE_ELECTRICITY: + newParticle = new rvElectricityParticle(); + break; + + case PTYPE_LINKED: + newParticle = new rvLinkedParticle(); + break; + + case PTYPE_ORIENTEDLINKED: + newParticle = new sdOrientedLinkedParticle(); + break; + + case PTYPE_DEBRIS: + newParticle = new rvDebrisParticle(); + break; + + default: + newParticle = new rvSpriteParticle(); + break; + } + + particle[i] = newParticle; + + if (i > 0) { + particle[i]->SetNext(newParticle); + } + } + + particle[particleCount - 1]->SetNext(NULL); + + mFreeHead = particle[0]; + mUsedHead = NULL; + return particle[0]; +} + +void rvSegment::Sort(const idVec3& eyePos) { + // This used smooth sort to sort the particles from the eye position. + // Needs eval. +} + +void rvSegment::InitParticles(rvBSE* effect) +{ + if (mEffectDecl->GetSegmentTemplate(this->mSegmentTemplateHandle)) + { + mParticles = (rvParticle*)InitParticleArray(effect); + mActiveCount = 0; + } +} + +void rvSegment::Render(rvBSE* effect, const renderEffect_s* owner, idRenderModel* model, float time) +{ +// jmarshall +#if 0 + const rvDeclEffect* v5; // edx + int v6; // eax + bool v7; // zf + rvSegmentTemplate* v8; // eax + int v9; // ecx + modelSurface_t* v10; // eax + srfTriangles_t* v11; // edi + int v12; // ecx + //void(__thiscall * v13)(sdRenderSystemUtilities*, const idMat3*, const idVec3*, float*); // edx + double v14; // st7 + rvSegment* v15; // esi + double v16; // st6 + bool v17; // al + void* v18; // esp + int v19; // eax + int v20; // eax + rvParticle* v21; // ebx + double v22; // st7 + rvParticleTemplate* v23; // esi + //bool(__thiscall * v24)(rvParticle*, const rvBSE*, rvParticleTemplate*, const idMat3*, srfTriangles_t*, float, float); // edx + bool v25; // sf + int v26; // eax + rvParticle* v27; // ebx + int v28; // ecx + int v29; // ecx + float v30; // [esp+3Ch] [ebp-54h] + int v31; // [esp+44h] [ebp-4Ch] BYREF + float modelMatrix[16]; // [esp+50h] [ebp-40h] BYREF + idMat3 view; // [esp+90h] [ebp+0h] BYREF + float v34; // [esp+B4h] [ebp+24h] + float v35; // [esp+B8h] [ebp+28h] + float v36; // [esp+BCh] [ebp+2Ch] + modelSurface_t* surf; // [esp+C0h] [ebp+30h] + float v38; // [esp+C4h] [ebp+34h] + int startIdx; // [esp+C8h] [ebp+38h] + rvParticleTemplate* pt; // [esp+CCh] [ebp+3Ch] + rvSegmentTemplate* st; // [esp+D0h] [ebp+40h] + int startVtx; // [esp+D4h] [ebp+44h] + float v43; // [esp+D8h] [ebp+48h] + float v44; // [esp+DCh] [ebp+4Ch] + float v45; // [esp+E0h] [ebp+50h] + rvSegment* v46; // [esp+E4h] [ebp+54h] + int numAllocedIndices; // [esp+E8h] [ebp+58h] + int numAllocedVerts; // [esp+ECh] [ebp+5Ch] + rvParticle** inverseList; // [esp+F0h] [ebp+60h] + int numRender; // [esp+F4h] [ebp+64h] + int i; // [esp+104h] [ebp+74h] + int ia; // [esp+104h] [ebp+74h] + float modela; // [esp+108h] [ebp+78h] + bool model_3; // [esp+10Bh] [ebp+7Bh] + + v5 = this->mEffectDecl; + v6 = this->mSegmentTemplateHandle; + v7 = v5->GetSegmentTemplate(v6) == 0; + v8 = (rvSegmentTemplate * )v5->GetSegmentTemplate(v6); + v46 = this; + st = v8; + if (!v7) + { + v9 = this->mSurfaceIndex; + pt = &v8->mParticleTemplate; + v10 = (modelSurface_t *)model->Surface(v9); + v11 = v10->geometry; + v12 = v11->numIndexes; + surf = v10; + startVtx = v11->numVerts; + startIdx = v12; + numRender = 0; + R_AxisToModelMatrix(owner->axis, owner->origin, modelMatrix); + R_GlobalVectorToLocal(modelMatrix, effect->GetViewAxis()[1], view[1]); + R_GlobalVectorToLocal(modelMatrix, effect->GetViewAxis()[2], view[2]); + v43 = effect->GetViewOrg().x - owner->origin.x; + v44 = effect->GetViewOrg().y - owner->origin.y; + v45 = effect->GetViewOrg().z - owner->origin.z; + v35 = owner->axis[2].z; + v34 = owner->axis[1].z; + //numAllocedIndices = SLODWORD(owner->axis.mat[0].z); <-- nonsense optimized garbage. + v36 = owner->axis[2].y; + //numAllocedVerts = SLODWORD(owner->axis.mat[1].y); <-- nonsense optimized garbage. + modela = owner->axis[0].y; + v38 = owner->axis[2].x; + //inverseList = (rvParticle**)LODWORD(owner->axis.mat[1].x); <-- nonsense optimized garbage. + v14 = v44; + v15 = v46; + v16 = v43; + v43 = owner->axis[0].x * v43 + v44 * modela + v45 * owner->axis[0].z; // (SLODWORD(owner->axis.mat[0].z)) + v44 = v44 * owner->axis[1].y + owner->axis[1].x * v16 + v45 * v34; + v45 = v45 * v35 + v16 * v38 + v14 * v36; + view[0].x = v43; + view[0].y = v44; + view[0].z = v45; +// jmarshall - todo sort particles. + //if (r_sortParticles.internalVar->integerValue + // && (v46->mEffectDecl->mSegmentTemplates.list[v46->mSegmentTemplateHandle].mFlags & 0x400) != 0) + //{ + // rvSegment::Sort(v46, view.mat); + //} +// jmarshall end + +// jmarshall - inverse draw order + //v17 = st->GetInverseDrawOrder();//(st->mFlags & 0x800) != 0; + //v7 = !st->GetInverseDrawOrder(); //(st->mFlags & 0x800) == 0; + v17 = false; + v7 = true; +// jmarshall end + + //*(float*)&inverseList = 0.0; <-- looks like compiler generated nonsense from above. + i = 0; + model_3 = v17; +// jmarshall - not sure what to do here, compiler nuked this statement pretty badly. +// inverse draw order. + //if (!v7) + //{ + // v18 = alloca(4 * v15->mActiveCount); + // *(float*)&inverseList = COERCE_FLOAT(&v31); + //} +// jmarshall end + + v19 = v11->numVerts; + numAllocedVerts = 9500; + if (v19 <= 9500) + numAllocedVerts = v19; + v20 = v11->numIndexes; + numAllocedIndices = 29500; + if (v20 <= 29500) + numAllocedIndices = v20; + v21 = v15->mUsedHead; + v22 = time; + if (v21) + { + while (1) + { + if ((st->mFlags & 0x20) != 0) + v21->mEndTime = v22 + 1.0; + v23 = pt; + if (v11->numVerts + pt->GetVertexCount() > numAllocedVerts || v11->numIndexes + pt->GetIndexCount() > numAllocedIndices) + break; + if (model_3) + { + inverseList[i++] = v21; + } + else + { + ++numRender; + v30 = v22; + if (v21->Render(effect, pt, view, v11, v30, 1.0f) && v23->GetTrailType() == 1) + { + v21->RenderBurnTrail(effect, v23, view, v11, time); + } + } + v21 = v21->mNext; + if (!v21) + { + v23 = pt; + break; + } + v22 = time; + } + } + else + { + v23 = pt; + } +// jmarshall - inverse. + //if (model_3) + //{ + // v25 = i - 1 < 0; + // v26 = i - 1; + // ia = i - 1; + // if (!v25) + // { + // numRender += v26 + 1; + // while (1) + // { + // v27 = inverseList[v26]; + // if (((unsigned __int8(__thiscall*)(rvParticle*, rvBSE*, rvParticleTemplate*, idMat3*, srfTriangles_t*, _DWORD, _DWORD))v27->Render)( + // v27, + // effect, + // v23, + // &view, + // v11, + // LODWORD(time), + // 1.0) + // && v23->mTrailInfo->mTrailType == 1) + // { + // ((void(__thiscall*)(rvParticle*, rvBSE*, rvParticleTemplate*, idMat3*, srfTriangles_t*, _DWORD))v27->RenderBurnTrail)( + // v27, + // effect, + // v23, + // &view, + // v11, + // LODWORD(time)); + // } + // if (--ia < 0) + // break; + // v26 = ia; + // } + // } + //} +// jmarshall end + v28 = v46->mActiveCount; + if (v11->numVerts > v28 * v23->GetVertexCount()) + common->Printf("rvSegment::Render - tri->numVerts > pt->GetVertexCount() * mActiveCount ( [%d %d] [%d %d] [%d %d] [%d %d %d] )", + startVtx, + startIdx, + v11->numVerts, + v11->numIndexes, + numRender, + v28, + v23->GetIndexCount(), + v23->GetVertexCount(), + model_3); + v29 = v46->mActiveCount; + if (v11->numIndexes > v29 * v23->GetIndexCount()) + common->Printf("rvSegment::Render - tri->numIndexes > pt->GetIndexCount() * mActiveCount ( [%d %d] [%d %d] [%d %d] [%d %d %d] )", + startVtx, + startIdx, + v11->numVerts, + v11->numIndexes, + numRender, + v29, + v23->GetIndexCount(), + v23->GetVertexCount(), + model_3); + R_BoundTriSurf(surf->geometry); + } +#endif +// jmarshall end +} + +void rvSegment::CreateDecal(rvBSE* effect, float time) +{ + // jmarshall: todo +} +#endif \ No newline at end of file diff --git a/src/bse/BSE_SegmentTemplate.cpp b/src/bse/BSE_SegmentTemplate.cpp new file mode 100644 index 00000000..94a47df9 --- /dev/null +++ b/src/bse/BSE_SegmentTemplate.cpp @@ -0,0 +1,539 @@ +// BSE_SegmentTemplate.cpp +// + +#pragma hdrstop +#include "precompiled.h" + +#include "BSE_Envelope.h" +#include "BSE_Particle.h" +#include "BSE.h" + +void rvSegmentTemplate::CreateParticleTemplate(rvDeclEffect* effect, idParser* src, int particleType) +{ + mParticleTemplate.Init(); + mParticleTemplate.mType = particleType; + mParticleTemplate.SetParameterCounts(); + mParticleTemplate.Parse(effect, src); +} + +bool rvSegmentTemplate::GetSoundLooping() +{ + if (mSoundShader != NULL) { + return ((unsigned int)mSoundShader->GetParms()->soundShaderFlags >> 5) & 1; + } + return false; +} + +void rvSegmentTemplate::EvaluateTrailSegment(rvDeclEffect* et) { + if (mParticleTemplate.mTrailInfo->mTrailType) + { + // jmarshall - WindowName isn't defined and doesn't make sense here + // if (idStr::Cmp(v3->mTrailTypeName.data, (const char*)&WindowName)) + // jmarshall end + { + mTrailSegmentIndex = et->GetTrailSegmentIndex(mParticleTemplate.mTrailInfo->mTrailTypeName); + } + } +} + +bool rvSegmentTemplate::GetSmoker() +{ + return mParticleTemplate.mTrailInfo->mTrailType == 3; +} + +bool rvSegmentTemplate::DetailCull() const +{ + // jmarshall - effect culling function. forcing everything to no cull + return false; // 0.0 != mDetail && mDetail > bse_detailLevel.internalVar->floatValue; +// jmarshall end +} + +float rvSegmentTemplate::EvaluateCost(int activeParticles) const +{ + float v4; // [esp+8h] [ebp-4h] + float activeParticlesa; // [esp+10h] [ebp+4h] + + if ((mFlags & 1) == 0) + return 0.0; + v4 = rvSegmentTemplate::mSegmentBaseCosts[mSegType]; + if (mParticleTemplate.mType) + { + activeParticlesa = (float)activeParticles; + v4 = mParticleTemplate.CostTrail(activeParticlesa) + v4; + if ((mParticleTemplate.mFlags & 0x200) != 0) + v4 = activeParticlesa * 80.0 + v4; + } + return v4; +} + +rvParticleTemplate& rvParticleTemplate::operator=(const rvParticleTemplate& __that) +{ + mFlags = __that.mFlags; + mTraceModelIndex = __that.mTraceModelIndex; + mType = __that.mType; + mMaterial = __that.mMaterial; + mModel = __that.mModel; + mEntityDefName = __that.mEntityDefName; + mGravity = __that.mGravity; + mDuration = __that.mDuration; + mCentre = __that.mCentre; + mTiling = __that.mTiling; + mBounce = __that.mBounce; + mPhysicsDistance = __that.mPhysicsDistance; + mWindDeviationAngle = __that.mWindDeviationAngle; + mVertexCount = __that.mVertexCount; + mIndexCount = __that.mIndexCount; + mTrailRepeat = __that.mTrailRepeat; + mNumSizeParms = __that.mNumSizeParms; + mNumRotateParms = __that.mNumRotateParms; + mNumFrames = __that.mNumFrames; + mTrailInfo = __that.mTrailInfo; + mElecInfo = __that.mElecInfo; + mpSpawnPosition = __that.mpSpawnPosition; + mpSpawnDirection = __that.mpSpawnDirection; + mpSpawnVelocity = __that.mpSpawnVelocity; + mpSpawnAcceleration = __that.mpSpawnAcceleration; + mpSpawnFriction = __that.mpSpawnFriction; + mpSpawnTint = __that.mpSpawnTint; + mpSpawnFade = __that.mpSpawnFade; + mpSpawnSize = __that.mpSpawnSize; + mpSpawnRotate = __that.mpSpawnRotate; + mpSpawnAngle = __that.mpSpawnAngle; + mpSpawnOffset = __that.mpSpawnOffset; + mpSpawnLength = __that.mpSpawnLength; + mpSpawnWindStrength = __that.mpSpawnWindStrength; + mpTintEnvelope = __that.mpTintEnvelope; + mpFadeEnvelope = __that.mpFadeEnvelope; + mpSizeEnvelope = __that.mpSizeEnvelope; + mpRotateEnvelope = __that.mpRotateEnvelope; + mpAngleEnvelope = __that.mpAngleEnvelope; + mpOffsetEnvelope = __that.mpOffsetEnvelope; + mpLengthEnvelope = __that.mpLengthEnvelope; + mpDeathTint = __that.mpDeathTint; + mpDeathFade = __that.mpDeathFade; + mpDeathSize = __that.mpDeathSize; + mpDeathRotate = __that.mpDeathRotate; + mpDeathAngle = __that.mpDeathAngle; + mpDeathOffset = __that.mpDeathOffset; + mpDeathLength = __that.mpDeathLength; + mNumImpactEffects = __that.mNumImpactEffects; + mImpactEffects[0] = __that.mImpactEffects[0]; + mImpactEffects[1] = __that.mImpactEffects[1]; + mImpactEffects[2] = __that.mImpactEffects[2]; + mImpactEffects[3] = __that.mImpactEffects[3]; + mNumTimeoutEffects = __that.mNumTimeoutEffects; + mTimeoutEffects[0] = __that.mTimeoutEffects[0]; + mTimeoutEffects[1] = __that.mTimeoutEffects[1]; + mTimeoutEffects[2] = __that.mTimeoutEffects[2]; + mTimeoutEffects[3] = __that.mTimeoutEffects[3]; + return *this; +} + +void rvSegmentTemplate::Duplicate(const rvSegmentTemplate& copy) +{ + mDeclEffect = copy.mDeclEffect; + mSegmentName = copy.mSegmentName; + mFlags = copy.mFlags; + mSegType = copy.mSegType; + mLocalStartTime = copy.mLocalStartTime; + mLocalDuration = copy.mLocalDuration; + mScale = copy.mScale; + mAttenuation = copy.mAttenuation; + mParticleCap = copy.mParticleCap; + mScale = copy.mScale; + mDetail = copy.mDetail; + mCount = copy.mCount; + mDensity = copy.mDensity; + mTrailSegmentIndex = copy.mTrailSegmentIndex; + mNumEffects = copy.mNumEffects; + mEffects[0] = copy.mEffects[0]; + mEffects[1] = copy.mEffects[1]; + mEffects[2] = copy.mEffects[2]; + mEffects[3] = copy.mEffects[3]; + mSoundShader = copy.mSoundShader; + mSoundVolume = copy.mSoundVolume; + mFreqShift = copy.mFreqShift; + mParticleTemplate.Duplicate(copy.mParticleTemplate); + mDecalAxis = copy.mDecalAxis; +} + +void rvSegmentTemplate::Init(rvDeclEffect* decl) +{ + mDeclEffect = decl; + mFlags = 1; + mSegType = 0; + mLocalStartTime.y = 0.0; + mLocalStartTime.x = 0.0; + mParticleTemplate.mImpactEffects[3] = NULL; + mParticleTemplate.mImpactEffects[2] = NULL; + mParticleTemplate.mTimeoutEffects[0] = NULL; + mParticleTemplate.mNumTimeoutEffects = 0.0; + mParticleTemplate.mTimeoutEffects[1] = NULL; + mParticleTemplate.mTimeoutEffects[2] = NULL; + mParticleTemplate.mTimeoutEffects[3] = NULL; + mParticleTemplate.mFlags = 1.0; + mParticleTemplate.mTraceModelIndex = 1.0; + mParticleTemplate.mMaterial = NULL; + mParticleTemplate.mType = 0.0; + mParticleTemplate.mModel = NULL; + mParticleTemplate.mEntityDefName = ""; + mParticleTemplate.mGravity.x = 1.0; + mParticleTemplate.mGravity.y = 1.0; + mParticleTemplate.mDuration.x = 3; + mParticleTemplate.Init(); +} + + +void rvSegmentTemplate::SetMinDuration(rvDeclEffect* effect) +{ + const idSoundShader* v2; // eax + float duration; // [esp+4h] [ebp-4h] + + if ((mFlags & 0x10) == 0) + { + v2 = mSoundShader; + if (!v2 || (v2->GetParms()->soundShaderFlags & 0x20) == 0) + { + duration = mLocalDuration.x + mLocalStartTime.x; + effect->SetMinDuration(duration); + } + } +} + +bool rvSegmentTemplate::Finish(rvDeclEffect* effect) +{ + rvParticleTemplate* v3; // edi + int v5; // ecx + float v6; // [esp+4h] [ebp-4h] + float v7; // [esp+4h] [ebp-4h] + float v8; // [esp+4h] [ebp-4h] + float v9; // [esp+4h] [ebp-4h] + float v10; // [esp+4h] [ebp-4h] + + if (mLocalStartTime.y <= mLocalStartTime.x) + { + v6 = mLocalStartTime.x; + mLocalStartTime.x = mLocalStartTime.y; + mLocalStartTime.y = v6; + } + if (mLocalDuration.y <= mLocalDuration.x) + { + v7 = mLocalDuration.x; + mLocalDuration.x = mLocalDuration.y; + mLocalDuration.y = v7; + } + if (mCount.y <= mCount.x) + { + v8 = mCount.x; + mCount.x = mCount.y; + mCount.y = v8; + } + if (mDensity.y <= mDensity.x) + { + v9 = mDensity.x; + mDensity.x = mDensity.y; + mDensity.y = v9; + } + if (mAttenuation.y <= mAttenuation.x) + { + v10 = mAttenuation.x; + mAttenuation.x = mAttenuation.y; + mAttenuation.y = v10; + } + if (mParticleTemplate.mType) + { + v3 = &mParticleTemplate; + mParticleTemplate.Finish(); + v3->mFlags &= 0xFFF7FFFF; + } + switch (mSegType) + { + case 2: + mFlags |= 4u; + if (mParticleTemplate.mType && (mFlags & 0x20) == 0) + goto LABEL_25; + return 0; + case 3: + mFlags |= 4u; + if (mParticleTemplate.mType) + goto LABEL_25; + return 0; + case 4: + mFlags |= 4u; + mLocalStartTime.y = 0.0; + mLocalStartTime.x = 0.0; + mLocalDuration.y = 0.0; + mLocalDuration.x = 0.0; + if (!mParticleTemplate.mType) + return 0; + mParticleTemplate.mFlags |= 0x80000u; + LABEL_25: + v5 = mParticleTemplate.mType; + if (v5 == 10) + mFlags = mFlags & 0xFFFFFFFB | 0x100; + if ((mFlags & 0x20) != 0 + || mParticleTemplate.mTrailInfo->mTrailType == 3 + || (mParticleTemplate.mFlags & 0x200) != 0 + || mParticleTemplate.mNumTimeoutEffects) + { + mFlags |= 0x2000u; + } + if (v5 == 7 || v5 == 6) + mFlags |= 0x2000u; + return 1; + case 5: + mFlags |= 0x10u; + goto LABEL_25; + case 6: + mFlags = mFlags & 0xFFFFFFFB | 0x100; + goto LABEL_25; + case 9: + case 0xA: + if (mAttenuation.y > 0.0) + mFlags |= 0x40u; + goto LABEL_24; + default: + LABEL_24: + mFlags &= 0xFFFFFFFB; + goto LABEL_25; + } +} + + +void rvSegmentTemplate::operator=(const rvSegmentTemplate& copy) +{ + this->mDeclEffect = copy.mDeclEffect; + this->mSegmentName = copy.mSegmentName; + this->mFlags = copy.mFlags; + this->mSegType = copy.mSegType; + this->mLocalStartTime = copy.mLocalStartTime; + this->mLocalDuration = copy.mLocalDuration; + this->mScale = copy.mScale; + this->mAttenuation = copy.mAttenuation; + this->mParticleCap = copy.mParticleCap; + this->mScale = copy.mScale; + this->mDetail = copy.mDetail; + this->mCount = copy.mCount; + this->mDensity = copy.mDensity; + this->mTrailSegmentIndex = copy.mTrailSegmentIndex; + this->mNumEffects = copy.mNumEffects; + this->mEffects[0] = copy.mEffects[0]; + this->mEffects[1] = copy.mEffects[1]; + this->mEffects[2] = copy.mEffects[2]; + this->mEffects[3] = copy.mEffects[3]; + this->mSoundShader = copy.mSoundShader; + this->mSoundVolume = copy.mSoundVolume; + this->mFreqShift = copy.mFreqShift; + this->mParticleTemplate = copy.mParticleTemplate; + this->mDecalAxis = copy.mDecalAxis; +} + +void __thiscall rvSegmentTemplate::SetMaxDuration(rvDeclEffect* effect) +{ + rvSegmentTemplate* v2; // esi + rvDeclEffect* v3; // edi + float duration; // ST0C_4 + float effecta; // [esp+14h] [ebp+4h] + + v2 = this; + if (!(((unsigned int)this->mFlags >> 4) & 1)) + { + v3 = effect; + duration = this->mLocalDuration.x + this->mLocalStartTime.x; + effect->SetMaxDuration(duration); + if (v2->mParticleTemplate.mType) + { + effecta = v2->mLocalDuration.x + v2->mLocalStartTime.x + v2->mParticleTemplate.mDuration.y; + v3->SetMaxDuration(effecta); + } + } +} + +bool rvSegmentTemplate::Parse(rvDeclEffect* effect, int segmentType, idParser* lexer) { + idToken token; + + if (!lexer->ReadToken(&token)) + { + return false; + } + + if (token != "{") { + mSegmentName = token; + } + else { + mSegmentName = va("unnamed%d", effect->GetNumSegmentTemplates()); + lexer->UnreadToken(&token); + } + + if (lexer->ExpectTokenString("{") && lexer->ReadToken(&token)) + { + while (token != "}") + { + if (token == "decalAxis") + { + mDecalAxis = lexer->ParseInt(); + } + else if (token == "orientateIdentity") + { + mFlags |= STFLAG_ORIENTATE_IDENTITY; + } + else if (token == "useMaterialColor") + { + mFlags |= STFLAG_USEMATCOLOR; + } + else if (token == "depthsort") + { + mFlags |= STFLAG_DEPTH_SORT; + } + else if (token == "calcDuration") + { + mFlags |= STFLAG_CALCULATE_DURATION; + } + else if (token == "constant") + { + mFlags |= STFLAG_INFINITE_DURATION; + } + else if (token == "looping") + { + // jmarshall - there was no code for this? + } + else if (token == "locked") + { + mFlags |= STFLAG_LOCKED; + } + else if (token == "inverseAttenuateEmitter") + { + mFlags |= STFLAG_INVERSE_ATTENUATE; + } + else if (token == "attenuateEmitter") + { + mFlags |= STFLAG_ATTENUATE_EMITTER; + } + else if (token == "scale") + { + mScale = lexer->ParseFloat(); + } + else if (token == "channel") + { + lexer->ReadToken(&token); // is this ignored? + } + else if (token == "effect") + { + lexer->ReadToken(&token); + if (mNumEffects >= 4) + { + common->FatalError("Unable to add effect '%s' - too many effects\n", token.c_str()); + } + else + { + mEffects[this->mNumEffects++] = (rvDeclEffect*)declManager->FindType(DECL_EFFECT, token); + } + } + else if (token == "freqShift") + { + mFreqShift.x = lexer->ParseFloat(); + lexer->ExpectTokenString(","); + mFreqShift.y = lexer->ParseFloat(); + } + else if (token == "attenuation") + { + mAttenuation.x = lexer->ParseFloat(); + lexer->ExpectTokenString(","); + mAttenuation.y = lexer->ParseFloat(); + } + else if (token == "volume") + { + mSoundVolume.x = lexer->ParseFloat(); + lexer->ExpectTokenString(","); + mSoundVolume.y = lexer->ParseFloat(); + } + else if (token == "soundShader") + { + lexer->ReadToken(&token); + mSoundShader = (idSoundShader*)declManager->FindSound(token); + // jmarshall: Doom 3's sound engine didn't expose gettimelength! + //float effecta = mSoundShader->(double)v11->GetTimeLength((idSoundShader*)v11) * 0.001; + float effecta = 1.0f; + // jmarshall end + mLocalDuration.x = effecta; + mLocalDuration.y = effecta; + } + else if (token == "detail") + { + mDetail = lexer->ParseFloat(); + } + else if (token == "duration") + { + mLocalDuration.x = lexer->ParseFloat(); + lexer->ExpectTokenString(","); + mLocalDuration.y = lexer->ParseFloat(); + } + else if (token == "start") + { + mLocalStartTime.x = lexer->ParseFloat(); + lexer->ExpectTokenString(","); + mLocalStartTime.y = lexer->ParseFloat(); + } + else if (token == "density") + { + mDensity.x = lexer->ParseFloat(); + lexer->ExpectTokenString(","); + mDensity.y = lexer->ParseFloat(); + } + else if (token == "count" || token == "rate") + { + mCount.x = lexer->ParseFloat(); + lexer->ExpectTokenString(","); + mCount.y = lexer->ParseFloat(); + } + else if (token == "particleCap") + { + mParticleCap = lexer->ParseFloat(); + } + else if (token == "debris") + { + CreateParticleTemplate(effect, lexer, PTYPE_DEBRIS); + } + else if (token == "orientedlinked") + { + CreateParticleTemplate(effect, lexer, PTYPE_ORIENTEDLINKED); + } + else if (token == "linked") + { + CreateParticleTemplate(effect, lexer, PTYPE_LINKED); + } + else if (token == "electricity") + { + CreateParticleTemplate(effect, lexer, PTYPE_ELECTRICITY); + } + else if (token == "light") + { + CreateParticleTemplate(effect, lexer, PTYPE_LIGHT); + } + else if (token == "model") + { + CreateParticleTemplate(effect, lexer, PTYPE_MODEL); + } + else if (token == "decal") + { + CreateParticleTemplate(effect, lexer, PTYPE_DECAL); + } + else if (token == "oriented") + { + CreateParticleTemplate(effect, lexer, PTYPE_ORIENTED); + } + else if (token == "line") + { + CreateParticleTemplate(effect, lexer, PTYPE_LINE); + } + else if (token == "sprite") + { + CreateParticleTemplate(effect, lexer, PTYPE_SPRITE); + } + else + { + common->Warning("^4BSE:^1 Invalid segment parameter '%s' (file: %s, line: %d", token.c_str(), lexer->GetFileName(), lexer->GetLineNum()); + } + } + } +} \ No newline at end of file diff --git a/src/doomdll.vcxproj b/src/doomdll.vcxproj index 9813321e..124338af 100644 --- a/src/doomdll.vcxproj +++ b/src/doomdll.vcxproj @@ -451,8 +451,13 @@ + + + + + diff --git a/src/doomdll.vcxproj.filters b/src/doomdll.vcxproj.filters index a3ed26ea..ab58b82e 100644 --- a/src/doomdll.vcxproj.filters +++ b/src/doomdll.vcxproj.filters @@ -1286,6 +1286,21 @@ Renderer\OpenGL + + BSE + + + BSE + + + BSE + + + BSE + + + BSE + diff --git a/src/idlib/Parser.cpp b/src/idlib/Parser.cpp index 45d51c5c..37140361 100644 --- a/src/idlib/Parser.cpp +++ b/src/idlib/Parser.cpp @@ -2781,19 +2781,29 @@ float idParser::ParseFloat( void ) { idParser::Parse1DMatrix ================ */ -int idParser::Parse1DMatrix( int x, float *m ) { +int idParser::Parse1DMatrix( int x, float *m, bool ravenMatrix) { int i; - if ( !idParser::ExpectTokenString( "(" ) ) { - return false; + if (!ravenMatrix) + { + if (!idParser::ExpectTokenString("(")) { + return false; + } } for ( i = 0; i < x; i++ ) { m[i] = idParser::ParseFloat(); + + if (ravenMatrix && i < x - 1) { + idParser::ExpectTokenString(","); + } } - if ( !idParser::ExpectTokenString( ")" ) ) { - return false; + if (!ravenMatrix) + { + if (!idParser::ExpectTokenString(")")) { + return false; + } } return true; } diff --git a/src/idlib/Parser.h b/src/idlib/Parser.h index 14220051..3ae5341f 100644 --- a/src/idlib/Parser.h +++ b/src/idlib/Parser.h @@ -102,7 +102,7 @@ class idParser { // read a floating point number float ParseFloat( void ); // parse matrices with floats - int Parse1DMatrix( int x, float *m ); + int Parse1DMatrix( int x, float *m, bool ravenMatrix = false ); int Parse2DMatrix( int y, int x, float *m ); int Parse3DMatrix( int z, int y, int x, float *m ); // get the white space before the last read token diff --git a/src/idlib/geometry/TraceModel.h b/src/idlib/geometry/TraceModel.h index 1793f597..592165da 100644 --- a/src/idlib/geometry/TraceModel.h +++ b/src/idlib/geometry/TraceModel.h @@ -128,12 +128,11 @@ class idTraceModel { // calculate mass properties assuming an uniform density void GetMassProperties( const float density, float &mass, idVec3 ¢erOfMass, idMat3 &inertiaTensor ) const; -private: void InitBox( void ); void InitOctahedron( void ); void InitDodecahedron( void ); void InitBone( void ); - +private: void ProjectionIntegrals( int polyNum, int a, int b, struct projectionIntegrals_t &integrals ) const; void PolygonIntegrals( int polyNum, int a, int b, int c, struct polygonIntegrals_t &integrals ) const; void VolumeIntegrals( struct volumeIntegrals_t &integrals ) const; From 8e554b302fe959942981f851afdfdca9b9c8ef08 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Tue, 27 Jul 2021 18:13:05 -0700 Subject: [PATCH 33/38] Missing file from previous CL. --- src/bse/BSE_ParseParticle2.cpp | 1713 ++++++++++++++++++++++++++++++++ 1 file changed, 1713 insertions(+) create mode 100644 src/bse/BSE_ParseParticle2.cpp diff --git a/src/bse/BSE_ParseParticle2.cpp b/src/bse/BSE_ParseParticle2.cpp new file mode 100644 index 00000000..1556e2cd --- /dev/null +++ b/src/bse/BSE_ParseParticle2.cpp @@ -0,0 +1,1713 @@ +// BSE_ParseParticle2.cpp +// + +#include "precompiled.h" + +#include "BSE_Envelope.h" +#include "BSE_Particle.h" +#include "BSE.h" +#include "BSE_SpawnDomains.h" + +rvTrailInfo rvParticleTemplate::sTrailInfo; +rvElectricityInfo rvParticleTemplate::sElectricityInfo; +rvEnvParms rvParticleTemplate::sDefaultEnvelope; +rvEnvParms rvParticleTemplate::sEmptyEnvelope; +rvParticleParms rvParticleTemplate::sSPF_ONE_1; +rvParticleParms rvParticleTemplate::sSPF_ONE_2; +rvParticleParms rvParticleTemplate::sSPF_ONE_3; +rvParticleParms rvParticleTemplate::sSPF_NONE_0; +rvParticleParms rvParticleTemplate::sSPF_NONE_1; +rvParticleParms rvParticleTemplate::sSPF_NONE_3; +bool rvParticleTemplate::sInited = false; + +float rvSegmentTemplate::mSegmentBaseCosts[SEG_COUNT]; + +void rvParticleTemplate::AllocTrail() +{ + if (mTrailInfo != NULL) { + mTrailInfo = new rvTrailInfo(); + } +} + +bool rvParticleTemplate::ParseBlendParms(rvDeclEffect* effect, idParser* src) +{ + rvParticleTemplate* v3; // edi + char result; // al + idLexer* v5; // eax + int v6; // edi + idBitMsg** v7; // esi + int v8; // eax + idToken token; // [esp+0h] [ebp-60h] + __int16 v10; // [esp+50h] [ebp-10h] + int v11; // [esp+5Ch] [ebp-4h] + + v3 = this; + v10 = 0; + v11 = 0; + if (src->ReadToken(&token)) + { + if (idStr::Icmp(token, "add")) + { + src->Error("Invalid blend type"); + return false; + } + else + { + v3->mFlags |= 0x8000u; + } + v11 = -1; + //idStr::FreeData((idStr*)&token.data); + result = 1; + } + else + { + v11 = -1; + // idStr::FreeData((idStr*)&token.data); + result = 0; + } + return result; +} + +bool rvParticleTemplate::ParseImpact(rvDeclEffect* effect, idParser* src) +{ + int v3; // ebp + rvParticleTemplate* v4; // esi + int v6; // edi + //sdDeclTypeHolder* v7; // eax + idLexer* v8; // eax + idBitMsg** v9; // edi + int v10; // ST0C_4 + idLexer* v11; // eax + idBitMsg** v12; // edi + int v13; // ST0C_4 + idToken token; // [esp+4h] [ebp-60h] + __int16 v15; // [esp+54h] [ebp-10h] + int v16; // [esp+60h] [ebp-4h] + + v3 = 0; + v4 = this; + v15 = 0; + v16 = 0; + if (!src->ExpectTokenString("{")) + { + v16 = -1; + return false; + } + v4->mFlags |= 0x200u; + if (!src->ReadToken(&token)) + { + LABEL_30: + v16 = -1; + return 0; + } + while (idStr::Cmp(token, "}")) + { + if (idStr::Icmp(token, "effect")) + { + if (!idStr::Icmp(token, "remove")) + { + if (src->ParseInt() != 0) + v4->mFlags |= 0x400u; + else + v4->mFlags &= 0xFFFFFBFF; + goto LABEL_29; + } + if (idStr::Icmp(token, "bounce")) + { + if (idStr::Icmp(token, "physicsDistance")) + { + //v11 = src->scriptstack; + //if (v11) + // v3 = v11->line; + //if (v11) + // v12 = (idBitMsg**)v11->filename.data; + //else + // v12 = &s2; + //v13 = (*(int (**)(void))effect->base->vfptr->gap4)(); + //(*(void(__cdecl**)(netadrtype_t, const char*, int, int, idBitMsg**, int))(*(_DWORD*)common.type + 68))( + // common.type, + // "^4BSE:^1 Invalid impact parameter '%s' in '%s' (file: %s, line: %d)", + // token.alloced, + // v13, + // v12, + // v3); + src->Error("Invalid impact parameter"); + return false; + } + v4->mPhysicsDistance = src->ParseFloat(); + } + else + { + v4->mBounce = src->ParseFloat(); + } + } + else + { + //idParser::ReadToken(src, (idToken*)((char*)&token + 4)); + src->ReadToken(&token); + if (v4->mNumImpactEffects >= 4) + { + src->Error("too many impact effects"); + goto LABEL_29; + } + //v7 = sdSingleton::GetInstance(); + //v4->mImpactEffects[v4->mNumImpactEffects++] = (rvDeclEffect*)((int(__stdcall*)(int, int, signed int))declManager->vfptr->FindType)( + // v7->declEffectsType.declTypeHandle, + // v6, + // 1); + + v4->mImpactEffects[v4->mNumImpactEffects++] = declManager->FindEffect(token); + } + LABEL_29: + if (!src->ReadToken(&token)) + goto LABEL_30; + } + v16 = -1; + return true; +} + +bool rvParticleTemplate::ParseTimeout(rvDeclEffect* effect, idParser* src) +{ + rvParticleTemplate* v3; // edi + idParser* v4; // ebp + char result; // al + int v6; // esi + //sdDeclTypeHolder* v7; // eax + idLexer* v8; // eax + int v9; // ebp + idBitMsg** v10; // esi + int v11; // ST0C_4 + idLexer* v12; // eax + int v13; // ebp + idBitMsg** v14; // esi + int v15; // ST0C_4 + idToken token; // [esp+4h] [ebp-60h] + __int16 v17; // [esp+54h] [ebp-10h] + int v18; // [esp+60h] [ebp-4h] + + v3 = this; + v17 = 0; + v4 = src; + v18 = 0; + if (src->ExpectTokenString("{")) + { + if (src->ReadToken(&token)) + { + while (idStr::Cmp(token, "}")) + { + if (idStr::Icmp(token, "effect")) + { + //v12 = v4->scriptstack; + //if (v12) + // v13 = v12->line; + //else + // v13 = 0; + //if (v12) + // v14 = (idBitMsg**)v12->filename.data; + //else + // v14 = &s2; + //v15 = (*(int (**)(void))effect->base->vfptr->gap4)(); + //(*(void(__cdecl**)(netadrtype_t, const char*, int, int, idBitMsg**, int))(*(_DWORD*)common.type + 68))( + // common.type, + // "^4BSE:^1 Invalid timeout parameter '%s' in '%s' (file: %s, line: %d)", + // token.alloced, + // v15, + // v14, + // v13); + src->Error("Invalid timeout parameter"); + } + else + { + src->ReadToken(&token); + if (v3->mNumTimeoutEffects >= 4) + { + //v8 = v4->scriptstack; + //if (v8) + // v9 = v8->line; + //else + // v9 = 0; + //if (v8) + // v10 = (idBitMsg**)v8->filename.data; + //else + // v10 = &s2; + //v11 = (*(int (**)(void))effect->base->vfptr->gap4)(); + //(*(void(__cdecl**)(netadrtype_t, const char*, int, int, idBitMsg**, int))(*(_DWORD*)common.type + 68))( + // common.type, + // "^4BSE:^1 Too many timeout effects '%s' in '%s' (file: %s, line: %d)", + // token.alloced, + // v11, + // v10, + // v9); + src->Error("Too many timeout effects"); + } + else + { + //v6 = token.alloced; + //v7 = sdSingleton::GetInstance(); + //v3->mTimeoutEffects[v3->mNumTimeoutEffects++] = (rvDeclEffect*)((int(__stdcall*)(int, int, signed int))declManager->vfptr->FindType)( + // v7->declEffectsType.declTypeHandle, + // v6, + // 1); + + v3->mTimeoutEffects[v3->mNumTimeoutEffects++] = declManager->FindEffect(token); + } + } + if (!src->ReadToken(&token)) + goto LABEL_25; + v4 = src; + } + v18 = -1; + //idStr::FreeData((idStr*)&token.data); + result = 1; + } + else + { + LABEL_25: + v18 = -1; + //idStr::FreeData((idStr*)&token.data); + result = 0; + } + } + else + { + v18 = -1; + // idStr::FreeData((idStr*)&token.data); + result = 0; + } + return result; +} + +rvEnvParms* rvParticleTemplate::ParseMotionParms(idParser* src, int count, rvEnvParms* def) +{ + rvEnvParms* result; // eax + //sdDetails::sdPoolAlloc* v4; // ecx + //rvEnvParms* v5; // eax + rvEnvParms* v6; // esi + int v7; // ebp + //sdDeclTypeHolder* v8; // eax + idLexer* v9; // eax + int v10; // edx + idBitMsg** v11; // ecx + //sdDetails::sdPoolAlloc* v12; // eax + //sdDetails::sdPoolAlloc* v13; // eax + idToken token; // [esp+4h] [ebp-60h] + __int16 v15; // [esp+54h] [ebp-10h] + int v16; // [esp+60h] [ebp-4h] + + v15 = 0; + v16 = 0; + if (src->ExpectTokenString("{")) + { + //v4 = sdPoolAllocator::GetMemoryManager()->allocator; + //if (v4 && (v5 = sdDetails::sdPoolAlloc::Alloc(v4)) != 0) + //{ + // v5->mStatic = 0; + // v5->mFastLookUp = 0; + // v6 = v5; + //} + //else + //{ + // v6 = 0; + //} + v6 = new rvEnvParms(); // jmarshall: mem leak + v6->Init(); + if (src->ReadToken(&token)) + { + while (idStr::Cmp(token, "}")) + { + if (idStr::Icmp(token, "envelope")) + { + if (idStr::Icmp(token, "rate")) + { + if (idStr::Icmp(token, "count")) + { + if (idStr::Icmp(token, "offset")) + { + //v9 = src->scriptstack; + //if (v9) + // v10 = v9->line; + //else + // v10 = 0; + //if (v9) + // v11 = (idBitMsg**)v9->filename.data; + //else + // v11 = &s2; + //(*(void (**)(netadrtype_t, const char*, ...))(*(_DWORD*)common.type + 68))( + // common.type, + // "^4BSE:^1 Invalid motion parameter '%s' (file: %s, line: %d)", + // token.alloced, + // v11, + // v10); + + src->Error("Invalid motion parameter"); + src->SkipBracedSection(1); + } + else + { + // rvParticleTemplate::GetVector(src, count, v6->mEnvOffset); + + src->Parse1DMatrix(count, v6->mEnvOffset.ToFloatPtr(), true); + } + } + else + { + //rvParticleTemplate::GetVector(src, count, v6->mRate); + src->Parse1DMatrix(count, v6->mRate.ToFloatPtr(), true); + v6->mIsCount = 1; + } + } + else + { + //rvParticleTemplate::GetVector(src, count, v6->mRate); + src->Parse1DMatrix(count, v6->mRate.ToFloatPtr(), true); + v6->mIsCount = 0; + } + } + else + { + //idParser::ReadToken(src, (idToken*)((char*)&token + 4)); + //v7 = token.alloced; + //v8 = sdSingleton::GetInstance(); + //v6->mTable = (idDeclTable*)((int(__stdcall*)(int, int, signed int))declManager->vfptr->FindType)( + // v8->declTableType.declTypeHandle, + // v7, + // 1); + + src->ReadToken(&token); + v6->mTable = declManager->FindTable(token); + } + if (!src->ReadToken(&token)) + goto LABEL_25; + } + v6->Finalize(); + if (v6->Compare(*def)) + { + if (v6) + { +// jmarshall - unknown memory + //v13 = sdPoolAllocator::GetMemoryManager()->allocator; + //if (v13) + //{ + // LODWORD(v6[-1].mRate.z) = v13->free; + // --v13->active; + // ++v13->numFree; + // v13->free = (sdDetails::sdPoolAlloc::element_t*) & v6[-1].mRate.z; + //} +// jmarshall - unknown memory + } + v16 = -1; + //idStr::FreeData((idStr*)&token.data); + result = def; + } + else + { + v16 = -1; + //idStr::FreeData((idStr*)&token.data); + result = v6; + } + } + else + { + LABEL_25: + if (v6) + { +// jmarshall - unknown memory + //v12 = sdPoolAllocator::GetMemoryManager()->allocator; + //if (v12) + //{ + // LODWORD(v6[-1].mRate.z) = v12->free; + // --v12->active; + // ++v12->numFree; + // v12->free = (sdDetails::sdPoolAlloc::element_t*) & v6[-1].mRate.z; + //} +// jmarshall - unknown memory + } + v16 = -1; + // idStr::FreeData((idStr*)&token.data); + result = def; + } + } + else + { + v16 = -1; + //idStr::FreeData((idStr*)&token.data); + result = def; + } + return result; +} + + +bool rvParticleTemplate::ParseMotionDomains(rvDeclEffect* effect, idParser* src) +{ + rvParticleTemplate* v3; // esi + idParser* v4; // edi + char result; // al + idLexer* v6; // eax + idBitMsg** v7; // ebp + int v8; // eax + idToken token; // [esp+0h] [ebp-60h] + __int16 v10; // [esp+50h] [ebp-10h] + int v11; // [esp+5Ch] [ebp-4h] + idParser* srca; // [esp+68h] [ebp+8h] + + v3 = this; + v10 = 0; + v4 = src; + v11 = 0; + if (src->ExpectTokenString("{")) + { + if (src->ReadToken(&token)) + { + while (token.Cmp("}")) + { + if (token.Icmp("tint")) + { + if (token.Icmp("fade")) + { + if (token.Icmp("size")) + { + if (token.Icmp("rotate")) + { + if (token.Icmp("angle")) + { + if (token.Icmp("offset")) + { + if (token.Icmp("length")) + { + //v6 = v4->scriptstack; + //if (v6) + // srca = (idParser*)v6->line; + //else + // srca = 0; + //if (v6) + // v7 = (idBitMsg**)v6->filename.data; + //else + // v7 = &s2; + //v8 = (*(int (**)(void))effect->base->vfptr->gap4)(); + //(*(void (**)(netadrtype_t, const char*, ...))(*(_DWORD*)common.type + 68))( + // common.type, + // "^4BSE:^1 Invalid motion domain '%s' in %s (file: %s, line: %d)", + // token.alloced, + // v8, + // v7, + // srca); + + src->Error("Invalid motion domain"); + src->SkipBracedSection(1); + } + else + { + v3->mpLengthEnvelope = rvParticleTemplate::ParseMotionParms( + v4, + 3, + &rvParticleTemplate::sDefaultEnvelope); + } + } + else + { + v3->mpOffsetEnvelope = rvParticleTemplate::ParseMotionParms( + v4, + 3, + &rvParticleTemplate::sDefaultEnvelope); + } + } + else + { + v3->mpAngleEnvelope = rvParticleTemplate::ParseMotionParms( + v4, + 3, + &rvParticleTemplate::sDefaultEnvelope); + } + } + else + { + v3->mpRotateEnvelope = rvParticleTemplate::ParseMotionParms( + v4, + (unsigned __int8)v3->mNumRotateParms, + &rvParticleTemplate::sDefaultEnvelope); + } + } + else + { + v3->mpSizeEnvelope = rvParticleTemplate::ParseMotionParms( + v4, + (unsigned __int8)v3->mNumSizeParms, + &rvParticleTemplate::sDefaultEnvelope); + } + } + else + { + v3->mpFadeEnvelope = rvParticleTemplate::ParseMotionParms(v4, 1, &rvParticleTemplate::sDefaultEnvelope); + } + } + else + { + v3->mpTintEnvelope = rvParticleTemplate::ParseMotionParms(v4, 3, &rvParticleTemplate::sDefaultEnvelope); + } + if (!src->ReadToken(&token)) + goto LABEL_27; + } + v11 = -1; + //idStr::FreeData((idStr*)&token.data); + result = 1; + } + else + { + LABEL_27: + v11 = -1; + //idStr::FreeData((idStr*)&token.data); + result = 0; + } + } + else + { + v11 = -1; + //idStr::FreeData((idStr*)&token.data); + result = 0; + } + return result; +} + +void rvParticleTemplate::FixupParms(rvParticleParms* parms) +{ + rvParticleParms* v1; // esi + char v2; // cl + int v3; // edx + unsigned int v4; // eax + float* v5; // ebx + float* v6; // ebp + int v7; // ecx + float* v8; // esi + float* v9; // edi + float* v10; // esi + bool maxs_3; // [esp+7h] [ebp-5h] + +#if 0// jmarshall fix me + v1 = parms; + v2 = parms->mSpawnType; + v3 = parms->mSpawnType & 3; + v4 = 4 * ((unsigned int)(unsigned __int8)parms->mSpawnType >> 2); + if (!v4) + return; + if (v4 == 4) + return; + maxs_3 = v4 != 8; + if (v2 == 43 || v2 == 47) + return; + v5 = &parms->mMaxs.x; + v6 = &parms->mMins.x; + if ((v3 < 2 || *v6 == parms->mMins.y) + && (v3 < 3 || *v6 == parms->mMins.z) + && (!maxs_3 || *v6 == *v5 && (v3 < 2 || *v6 == parms->mMaxs.y) && (v3 < 3 || *v6 == parms->mMaxs.z))) + { + if (0.0 == *v6) + { + parms->mSpawnType = v3; + } + else if (1.0 == *v6) + { + parms->mSpawnType = v3 + 4; + } + else + { + parms->mSpawnType = v3 + 8; + } + goto LABEL_42; + } + if (maxs_3) + { + v7 = 0; + if (v3 < 4) + { + LABEL_24: + if (v7 >= v3) + { + LABEL_35: + v1->mSpawnType = v3 + 8; + goto LABEL_42; + } + v10 = &v5[v7]; + while (*v10 == *(float*)((char*)v10 + (char*)v6 - (char*)v5)) + { + ++v7; + ++v10; + if (v7 >= v3) + { + v1 = parms; + parms->mSpawnType = v3 + 8; + goto LABEL_42; + } + } + } + else + { + v8 = &parms->mMaxs.y; + v9 = &parms->mMaxs.x; + while (*(v8 - 1) == *(v9 - 3)) + { + if (*v8 != *(v8 - 3)) + { + ++v7; + break; + } + if (v8[1] != *(v9 - 1)) + { + v7 += 2; + break; + } + if (v8[2] != *v9) + { + v7 += 3; + break; + } + v7 += 4; + v8 += 4; + v9 += 4; + if (v7 >= v3 - 3) + { + v5 = &parms->mMaxs.x; + v1 = parms; + goto LABEL_24; + } + } + v5 = &parms->mMaxs.x; + } + if (v7 < v3) + { + v1 = parms; + goto LABEL_42; + } + v1 = parms; + goto LABEL_35; + } +LABEL_42: + if (v1->mSpawnType >= 8u) + { + if (v3 == 1) + { + parms->mMins.y = 0.0; + v5[1] = 0.0; + parms->mMins.z = 0.0; + v5[2] = 0.0; + } + else if (v3 == 2) + { + parms->mMins.z = 0.0; + v5[2] = 0.0; + } + } + else + { + parms->mMins.z = 0.0; + parms->mMins.y = 0.0; + *v6 = 0.0; + } + if (v1->mSpawnType <= 0xBu) + { + *v5 = *v6; + v5[1] = parms->mMins.y; + v5[2] = parms->mMins.z; + } + if (v1->mFlags & 2) + { + if (v1->mSpawnType <= 0xCu) + v1->mSpawnType = v3 + 12; + } +#endif +} + +bool rvParticleTemplate::CheckCommonParms(idParser* src, rvParticleParms& parms) +{ + bool result; // al + idToken token; // [esp+0h] [ebp-60h] + __int16 v4; // [esp+50h] [ebp-10h] + int v5; // [esp+5Ch] [ebp-4h] + + if (src->ReadToken(&token)) + { + while (idStr::Cmp((const char*)token, "}")) + { + if (idStr::Icmp((const char*)token, "surface")) + { + if (idStr::Icmp((const char*)token, "useEndOrigin")) + { + if (idStr::Icmp((const char*)token, "cone")) + { + if (idStr::Icmp((const char*)token, "relative")) + { + if (idStr::Icmp((const char*)token, "linearSpacing")) + { + if (idStr::Icmp((const char*)token, "attenuate")) + { + if (!idStr::Icmp((const char*)token, "inverseAttenuate")) + parms.mFlags |= 0x40u; + } + else + { + parms.mFlags |= 0x20u; + } + } + else + { + parms.mFlags |= 0x10u; + } + } + else + { + parms.mFlags |= 8u; + } + } + else + { + parms.mFlags |= 4u; + } + } + else + { + parms.mFlags |= 2u; + } + } + else + { + parms.mFlags |= 1u; + } + if (!src->ReadToken((idToken*)((char*)&token + 4))) + goto LABEL_18; + } + v5 = -1; + // idStr::FreeData((idStr*)&token.data); + result = 1; + } + else + { + LABEL_18: + v5 = -1; + // idStr::FreeData((idStr*)&token.data); + result = 0; + } + return result; +} + +rvParticleParms* rvParticleTemplate::ParseSpawnParms(rvDeclEffect* effect, idParser* src, int count, rvParticleParms* def) { + idToken token; + rvParticleParms* v7; + rvParticleParms* v8; + + if (!src->ExpectTokenString("{")) { + return def; + } + + src->ReadToken(&token); + + if (token == "}") { + return def; + } + + // jmarshall: mem leak potential + v7 = new rvParticleParms(); + v8 = v7; + + if (token == "box") { + v8->mSpawnType = count + 16; + src->Parse1DMatrix(count, v8->mMins.ToFloatPtr(), true); + src->ExpectTokenString(","); + src->Parse1DMatrix(count, v8->mMaxs.ToFloatPtr(), true); + + if (!rvParticleTemplate::CheckCommonParms(src, *v8)) + { + src->Error("Invalid box parameter!"); + } + + if (v8->mFlags & 1) + v8->mSpawnType = count + 20; + FixupParms(v8); + return v8; + } + else if (token == "sphere") { + v8->mSpawnType = count + 24; + + src->Parse1DMatrix(count, v8->mMins.ToFloatPtr(), true); + src->ExpectTokenString(","); + src->Parse1DMatrix(count, v8->mMaxs.ToFloatPtr(), true); + + if (!rvParticleTemplate::CheckCommonParms(src, *v8)) + { + src->Error("Invalid sphere parameter!"); + } + + if (v8->mFlags & 1) + v8->mSpawnType = count + 28; + FixupParms(v8); + + return v8; + } + else if (token == "cylinder") { + v8->mSpawnType = count + 32; + + src->Parse1DMatrix(count, v8->mMins.ToFloatPtr(), true); + src->ExpectTokenString(","); + src->Parse1DMatrix(count, v8->mMaxs.ToFloatPtr(), true); + + if (!rvParticleTemplate::CheckCommonParms(src, *v8)) + { + src->Error("Invalid cylinder parameter!"); + } + + if (v8->mFlags & 1) + v8->mSpawnType = count + 36; + FixupParms(v8); + + return v8; + } + else if (token == "model") { + v8->mSpawnType = count + 44; + src->ReadToken(&token); + + idRenderModel* model = renderModelManager->FindModel(token); + if (model == NULL) { + src->Error("Failed to load model %s\n", token.c_str()); + } + + v8->mModelInfo = new sdModelInfo(); + v8->mModelInfo->model = model; + + src->ExpectTokenString(","); + src->Parse1DMatrix(count, v8->mMins.ToFloatPtr(), true); + src->ExpectTokenString(","); + src->Parse1DMatrix(count, v8->mMaxs.ToFloatPtr(), true); + + if (!rvParticleTemplate::CheckCommonParms(src, *v8)) + { + src->Error("Invalid model parameter!"); + } + FixupParms(v8); + return v8; + } + else if (token == "spiral") { + v8->mSpawnType = count + 40; + + src->Parse1DMatrix(count, v8->mMins.ToFloatPtr(), true); + src->ExpectTokenString(","); + src->Parse1DMatrix(count, v8->mMaxs.ToFloatPtr(), true); + + v8->mRange = src->ParseFloat(); + + if (!rvParticleTemplate::CheckCommonParms(src, *v8)) + { + src->Error("Invalid spiral parameter!"); + } + FixupParms(v8); + return v8; + } + else if (token == "line") { + v8->mSpawnType = count + 12; + + src->Parse1DMatrix(count, v8->mMins.ToFloatPtr(), true); + src->ExpectTokenString(","); + src->Parse1DMatrix(count, v8->mMaxs.ToFloatPtr(), true); + + if (!rvParticleTemplate::CheckCommonParms(src, *v8)) + { + src->Error("Invalid line parameter!"); + } + FixupParms(v8); + return v8; + } + else if (token == "point") { + v8->mSpawnType = count + 8; + + src->Parse1DMatrix(count, v8->mMins.ToFloatPtr(), true); + + if (!rvParticleTemplate::CheckCommonParms(src, *v8)) + { + src->Error("Invalid point parameter!"); + } + FixupParms(v8); + return v8; + } + + return v8; +} + +bool rvParticleTemplate::ParseSpawnDomains(rvDeclEffect* effect, idParser* src) { + idToken token; + + src->ExpectTokenString("{"); + src->ReadToken(&token); + while (true) { + if (token == "}") + break; + + if (token == "windStrength") { + mpSpawnWindStrength = ParseSpawnParms(effect, src, 1, &rvParticleTemplate::sSPF_NONE_1); + } + else if (token == "length") { + mpSpawnLength = ParseSpawnParms(effect, src, 3, &rvParticleTemplate::sSPF_NONE_3); + } + else if (token == "offset") { + mpSpawnOffset = ParseSpawnParms(effect, src, 3, &rvParticleTemplate::sSPF_NONE_3); + } + else if (token == "angle") { + mpSpawnAngle = ParseSpawnParms(effect, src, 3, &rvParticleTemplate::sSPF_NONE_3); + } + else if (token == "rotate") { + mpSpawnRotate = ParseSpawnParms(effect, src, mNumRotateParms, &rvParticleTemplate::sSPF_NONE_3); + } + else if (token == "size") { + mpSpawnSize = ParseSpawnParms(effect, src, mNumSizeParms, &rvParticleTemplate::sSPF_ONE_3); + } + else if (token == "fade") { + mpSpawnFade = ParseSpawnParms(effect, src, 1, &rvParticleTemplate::sSPF_ONE_1); + } + else if (token == "tint") { + mpSpawnTint = ParseSpawnParms(effect, src, 3, &rvParticleTemplate::sSPF_ONE_3); + } + else if (token == "friction") { + mpSpawnFriction = ParseSpawnParms(effect, src, 3, &rvParticleTemplate::sSPF_NONE_3); + } + else if (token == "acceleration") { + mpSpawnAcceleration = ParseSpawnParms(effect, src, 3, &rvParticleTemplate::sSPF_NONE_3); + } + else if (token == "velocity") { + mpSpawnVelocity = ParseSpawnParms(effect, src, 3, &rvParticleTemplate::sSPF_NONE_3); + } + else if (token == "direction") { + mpSpawnDirection = rvParticleTemplate::ParseSpawnParms(effect, src, 3, &rvParticleTemplate::sSPF_NONE_3); + mFlags |= 0x4000u; + } + else if (token == "position") { + mpSpawnPosition = rvParticleTemplate::ParseSpawnParms(effect, src, 3, &rvParticleTemplate::sSPF_NONE_3); + } + else { + src->Error("Invalid spawn type %s\n", token.c_str()); + } + } + + return true; +} + +bool rvParticleTemplate::ParseDeathDomains(rvDeclEffect* effect, idParser* src) { + idToken token; + + src->ExpectTokenString("{"); + src->ReadToken(&token); + while (true) { + if (token == "}") + break; + + if (token == "length") { + rvParticleParms* v13 = ParseSpawnParms(effect, src, 3, &rvParticleTemplate::sSPF_NONE_3); + bool v7 = mpLengthEnvelope == &rvParticleTemplate::sEmptyEnvelope; + mpDeathLength = v13; + if (v7) { + mpLengthEnvelope = &rvParticleTemplate::sDefaultEnvelope; + } + } + else if (token == "offset") { + rvParticleParms* v13 = ParseSpawnParms(effect, src, 3, &rvParticleTemplate::sSPF_NONE_3); + bool v7 = mpOffsetEnvelope == &rvParticleTemplate::sEmptyEnvelope; + mpDeathOffset = v13; + if (v7) { + mpOffsetEnvelope = &rvParticleTemplate::sDefaultEnvelope; + } + } + else if (token == "angle") { + rvParticleParms* v13 = ParseSpawnParms(effect, src, 3, &rvParticleTemplate::sSPF_NONE_3); + bool v7 = mpAngleEnvelope == &rvParticleTemplate::sEmptyEnvelope; + mpDeathAngle = v13; + if (v7) { + mpAngleEnvelope = &rvParticleTemplate::sDefaultEnvelope; + } + } + else if (token == "rotate") { + rvParticleParms* v10 = ParseSpawnParms(effect, src, mNumRotateParms, &rvParticleTemplate::sSPF_NONE_3); + mpDeathRotate = v10; + if (mpRotateEnvelope == &rvParticleTemplate::sEmptyEnvelope) { + mpRotateEnvelope = &rvParticleTemplate::sDefaultEnvelope; + } + } + else if (token == "size") { + rvParticleParms* v9 = ParseSpawnParms(effect, src, mNumSizeParms, &rvParticleTemplate::sSPF_ONE_3); + mpDeathSize = v9; + if (mpSizeEnvelope == &rvParticleTemplate::sEmptyEnvelope) { + mpSizeEnvelope = &rvParticleTemplate::sDefaultEnvelope; + } + } + else if (token == "fade") { + rvParticleParms* v8 = ParseSpawnParms(effect, src, 1, &rvParticleTemplate::sSPF_NONE_1); + mpDeathFade = v8; + if (mpFadeEnvelope == &rvParticleTemplate::sEmptyEnvelope) { + mpFadeEnvelope = &rvParticleTemplate::sDefaultEnvelope; + } + } + else if (token == "tint") { + rvParticleParms* v6 = ParseSpawnParms(effect, src, 3, &rvParticleTemplate::sSPF_NONE_3); + mpDeathTint = v6; + if (mpTintEnvelope == &rvParticleTemplate::sEmptyEnvelope) { + mpTintEnvelope = &rvParticleTemplate::sDefaultEnvelope; + } + } + else { + src->Error("Invalid end type %s\n", token.c_str()); + } + } + + return true; +} + +bool rvParticleTemplate::Parse(rvDeclEffect* effect, idParser* src) { + idToken token; + + src->ExpectTokenString("{"); + src->ReadToken(&token); + while (true) { + if (token == "}") + break; + + if (token == "windDeviationAngle") { + mWindDeviationAngle = src->ParseFloat(); + } + else if (token == "timeout") { + ParseTimeout(effect, src); + } + else if (token == "impact") { + ParseImpact(effect, src); + } + else if (token == "model") { + src->ReadToken(&token); + mModel = renderModelManager->FindModel(token); + + if (mModel == NULL) { + mModel = renderModelManager->FindModel("_default"); + + src->Warning("No surfaces defined in model %s", token.c_str()); + } + } + else if (token == "numFrames") { + mNumFrames = src->ParseInt(); + } + else if (token == "fadeIn") { + // TODO v3->mFlags |= (unsigned int)&vwin8192[2696]; <-- garbage. + } + else if (token == "useLightningAxis") { + mFlags |= 0x400000u; + } + else if (token == "specular") { + mFlags |= 0x40000u; + } + else if (token == "shadows") { + mFlags |= 0x20000u; + } + else if (token == "blend") { + ParseBlendParms(effect, src); + } + else if (token == "entityDef") { + src->ReadToken(&token); + mEntityDefName = token; + } + else if (token == "material") { + src->ReadToken(&token); + mMaterial = declManager->FindMaterial(token); + } + else if (token == "trailScale") { + AllocTrail(); + mTrailInfo->mTrailScale = src->ParseFloat(); + } + else if (token == "trailCount") { + AllocTrail(); + mTrailInfo->mTrailCount.x = src->ParseFloat(); + src->ExpectTokenString(","); + mTrailInfo->mTrailCount.y = src->ParseFloat(); + } + else if (token == "trailRepeat") { + AllocTrail(); + mTrailRepeat = src->ParseInt(); + } + else if (token == "trailTime") { + AllocTrail(); + mTrailInfo->mTrailTime.x = src->ParseFloat(); + src->ExpectTokenString(","); + mTrailInfo->mTrailTime.y = src->ParseFloat(); + } + else if (token == "trailMaterial") { + AllocTrail(); + src->ReadToken(&token); + mTrailInfo->mTrailMaterial = declManager->FindMaterial(token); + } + else if (token == "trailType") { + src->ReadToken(&token); + + if (token == "burn") { + mTrailInfo->mTrailType = 1; + } + else if (token == "motion") { + mTrailInfo->mTrailType = 2; + } + else { + mTrailInfo->mTrailType = 3; + mTrailInfo->mTrailTypeName = token; + } + } + else if (token == "gravity") { + mGravity.x = src->ParseFloat(); + src->ExpectTokenString(","); + mGravity.y = src->ParseFloat(); + } + else if (token == "duration") { + float srcb = src->ParseFloat(); + float v8 = 0.0020000001; + if (srcb >= 0.0020000001) + { + v8 = srcb; + if (srcb > 300.0) + v8 = 300.0; + } + float srcg = v8; + mDuration.x = srcg; + src->ExpectTokenString(","); + + float srcc = src->ParseFloat(); + srcc = src->ParseFloat(); + float v9 = 0.0020000001; + if (srcc < 0.0020000001 || (v9 = srcc, srcc <= 300.0)) + { + float srch = v9; + mDuration.y = srch; + } + else + { + mDuration.y = 300.0; + } + } + else if (token == "parentvelocity") { + mFlags |= 0x2000000u; + } + else if (token == "tiling") { + mFlags |= 0x100000u; + float srca = src->ParseFloat(); + float v7 = 0.0020000001; + if (srca < 0.0020000001 || (v7 = srca, srca <= 1024.0)) + { + float srcf = v7; + mTiling = srcf; + } + else + { + mTiling = 1024.0; + } + } + else if (token == "persist") { + mFlags |= 0x200000u; + } + else if (token == "generatedLine") { + mFlags |= 0x10000u; + } + else if (token == "flipNormal") { + mFlags |= 0x2000u; + } + else if (token == "lineHit") { + mFlags |= 0x4000000u; + } + else if (token == "generatedOriginNormal") { + mFlags |= 0x1000u; + } + else if (token == "generatedNormal") { + mFlags |= 0x800u; + } + else if (token == "motion") { + ParseMotionDomains(effect, src); + } + else if (token == "end") { + ParseDeathDomains(effect, src); + } + else if (token == "start") { + ParseSpawnDomains(effect, src); + } + else { + src->Error("Invalid particle keyword %s\n", token.c_str()); + } + } + + Finish(); + + return true; +} + +void rvParticleTemplate::Duplicate(rvParticleTemplate const& copy) { + +} + +void rvParticleTemplate::Finish() +{ + double v2; // st7 + rvParticleTemplate* v3; // esi + rvTrailInfo* v4; // eax + float* v5; // eax + const modelSurface_t* v6; // eax + const modelSurface_t* v7; // ebp + idTraceModel* v8; // eax + idTraceModel* v9; // edi + idBounds* v10; // ebp + rvTrailInfo* v11; // ecx + rvElectricityInfo* v12; // eax + float v13; // ST10_4 + float v14; // ST10_4 + rvTrailInfo* v15; // ecx + float v16; // ST10_4 + rvTrailInfo* v17; // ecx + double v18; // st6 + float* v19; // ecx + float v20; // ST10_4 + float* v21; // eax + float v22; // ST14_4 + float v23; // ST18_4 + float v24; // ST1C_4 + float v25; // ST20_4 + float v26; // ST24_4 + float v27; // ST28_4 + signed int retaddr; // [esp+2Ch] [ebp+0h] + + v2 = 0.0; + v3 = this; + v3->mFlags |= 0x100u; + v4 = this->mTrailInfo; + if ((!v4->mTrailType || v4->mTrailType == 3) && !v4->mStatic) + { + v4->mTrailTime.y = 0.0; + v4->mTrailTime.x = 0.0; + v5 = &this->mTrailInfo->mTrailCount.x; + v5[1] = 0.0; + *v5 = 0.0; + } + switch (this->mType) + { + case 1: + case 2: + v11 = this->mTrailInfo; + v3->mVertexCount = 4; + v3->mIndexCount = 6; + if (0.0 != v11->mTrailCount.y && v11->mTrailType == 1) + { + v3->mVertexCount *= (unsigned __int16)v3->GetMaxTrailCount(); + v2 = 0.0; + v3->mIndexCount *= (unsigned __int16)v3->GetMaxTrailCount(); + } + break; + case 4: + case 6: + case 8: + case 9: + this->mVertexCount = 4; + this->mIndexCount = 6; + break; + case 5: + v6 = this->mModel->Surface(0); + v7 = v6; + if (v6) + { + v3->mVertexCount = v6->geometry->numVerts;// *(_WORD*)(*(_DWORD*)(v6 + 8) + 48); + v3->mIndexCount = v6->geometry->numIndexes; // *(_WORD*)(*(_DWORD*)(v6 + 8) + 56); + } + v3->mMaterial = *(idMaterial**)(v6 + 4); + v3->PurgeTraceModel(); + v8 = (idTraceModel*)operator new(0xB4Cu); + v9 = v8; + retaddr = 0; + if (v8) + { + v10 = *(idBounds**)(v7 + 8); + v8->InitBox(); + v9->SetupBox(*v10); + } + retaddr = -1; + v2 = 0.0; + v3->mTraceModelIndex = bse->AddTraceModel(v8); + break; + case 7: + v12 = this->mElecInfo; + this->mVertexCount = 20 * (LOWORD(v12->mNumForks) + 1); + this->mIndexCount = 60 * (LOWORD(v12->mNumForks) + 1); + break; + case 0xA: + this->mVertexCount = 0; + this->mIndexCount = 0; + break; + default: + break; + } + if (v3->mDuration.y <= (double)v3->mDuration.x) + { + v13 = v3->mDuration.x; + v3->mDuration.x = v3->mDuration.y; + v3->mDuration.y = v13; + } + if (v3->mGravity.y <= (double)v3->mGravity.x) + { + v14 = v3->mGravity.x; + v3->mGravity.x = v3->mGravity.y; + v3->mGravity.y = v14; + } + v15 = v3->mTrailInfo; + if (!v15->mStatic) + { + if (v15->mTrailTime.y <= (double)v15->mTrailTime.x) + { + v16 = v15->mTrailTime.x; + v15->mTrailTime.x = v15->mTrailTime.y; + v15->mTrailTime.y = v16; + } + v17 = v3->mTrailInfo; + v18 = v17->mTrailCount.x; + v19 = &v17->mTrailCount.x; + if (v19[1] <= v18) + { + v20 = *v19; + *v19 = v19[1]; + v19[1] = v20; + } + } + v3->mCentre.z = v2; + v3->mCentre.y = v2; + v3->mCentre.x = v2; + if (!(((unsigned int)v3->mFlags >> 12) & 1)) + { + v21 = (float*)&v3->mpSpawnPosition->mSpawnType; + switch (*(unsigned __int8*)v21) + { + case 0xBu: + v3->mCentre.x = v21[3]; + v3->mCentre.y = v21[4]; + v3->mCentre.z = v21[5]; + break; + case 0xFu: + case 0x13u: + case 0x17u: + case 0x1Bu: + case 0x1Fu: + case 0x23u: + case 0x27u: + case 0x2Bu: + case 0x2Fu: + v22 = v21[6] + v21[3]; + v23 = v21[7] + v21[4]; + v24 = v21[8] + v21[5]; + v25 = v22 * 0.5; + v26 = v23 * 0.5; + v27 = 0.5 * v24; + v3->mCentre.x = v25; + v3->mCentre.y = v26; + v3->mCentre.z = v27; + break; + default: + return; + } + } +} + +void rvParticleTemplate::InitStatic() +{ + //sdDeclTypeHolder* v0; // eax + int v1; // eax + //sdDeclTypeHolder* v2; // eax + + if (!rvParticleTemplate::sInited) + { + rvParticleTemplate::sInited = 1; + rvParticleTemplate::sTrailInfo.mTrailType = 0; + //unk_7E672A = 1; + //v0 = sdSingleton::GetInstance(); + //v1 = ((int(__stdcall*)(int, const char*, signed int))declManager->vfptr->FindType)( + // v0->declMaterialType.declTypeHandle, + // "_default", + // 1); + //unk_7E6754 = 0.0; + //unk_7E674C = v1; + //unk_7E6750 = 0.0; + rvParticleTemplate::sElectricityInfo.mNumForks = 0; + //unk_7E675C = 0.0; + rvParticleTemplate::sElectricityInfo.mStatic = 1; + //unk_7E6758 = 0.0; + //unk_7E6760 = 0.5; + rvParticleTemplate::sElectricityInfo.mForkSizeMins.x = -20.0; + rvParticleTemplate::sElectricityInfo.mForkSizeMins.y = -20.0; + rvParticleTemplate::sElectricityInfo.mForkSizeMins.z = -20.0; + rvParticleTemplate::sElectricityInfo.mForkSizeMaxs.x = 20.0; + rvParticleTemplate::sElectricityInfo.mForkSizeMaxs.y = 20.0; + rvParticleTemplate::sElectricityInfo.mForkSizeMaxs.z = 20.0; + rvParticleTemplate::sElectricityInfo.mJitterSize.x = 3.0; + rvParticleTemplate::sElectricityInfo.mJitterSize.y = 7.0; + rvParticleTemplate::sElectricityInfo.mJitterSize.z = 7.0; + rvParticleTemplate::sElectricityInfo.mJitterRate = 0.0; + //v2 = sdSingleton::GetInstance(); + rvParticleTemplate::sElectricityInfo.mJitterTable = declManager->FindTable("halfsintable", false); + rvParticleTemplate::sDefaultEnvelope.Init(); //rvEnvParms::Init(&rvParticleTemplate::sDefaultEnvelope); + rvParticleTemplate::sDefaultEnvelope.SetDefaultType(); // rvEnvParms::SetDefaultType(&rvParticleTemplate::sDefaultEnvelope); + rvParticleTemplate::sDefaultEnvelope.mStatic = 1; + rvParticleTemplate::sEmptyEnvelope.Init(); // rvEnvParms::Init(&rvParticleTemplate::sEmptyEnvelope); + rvParticleTemplate::sSPF_ONE_1.mRange = 0.0; + rvParticleTemplate::sEmptyEnvelope.mStatic = 1; + rvParticleTemplate::sSPF_ONE_1.mMins.z = 0.0; + rvParticleTemplate::sSPF_ONE_1.mSpawnType = 5; + rvParticleTemplate::sSPF_ONE_1.mMins.y = 0.0; + rvParticleTemplate::sSPF_ONE_1.mFlags = 0; + rvParticleTemplate::sSPF_ONE_1.mMins.x = 0.0; + rvParticleTemplate::sSPF_ONE_1.mModelInfo = 0; + rvParticleTemplate::sSPF_ONE_1.mMaxs.z = 0.0; + rvParticleTemplate::sSPF_ONE_1.mStatic = 1; + rvParticleTemplate::sSPF_ONE_1.mMaxs.y = 0.0; + rvParticleTemplate::sSPF_ONE_2.mSpawnType = 6; + rvParticleTemplate::sSPF_ONE_1.mMaxs.x = 0.0; + rvParticleTemplate::sSPF_ONE_2.mFlags = 0; + rvParticleTemplate::sSPF_ONE_2.mRange = 0.0; + rvParticleTemplate::sSPF_ONE_2.mModelInfo = 0; + rvParticleTemplate::sSPF_ONE_2.mMins.z = 0.0; + rvParticleTemplate::sSPF_ONE_2.mStatic = 1; + rvParticleTemplate::sSPF_ONE_2.mMins.y = 0.0; + rvParticleTemplate::sSPF_ONE_3.mSpawnType = 7; + rvParticleTemplate::sSPF_ONE_2.mMins.x = 0.0; + rvParticleTemplate::sSPF_ONE_3.mFlags = 0; + rvParticleTemplate::sSPF_ONE_2.mMaxs.z = 0.0; + rvParticleTemplate::sSPF_ONE_2.mMaxs.y = 0.0; + rvParticleTemplate::sSPF_ONE_2.mMaxs.x = 0.0; + rvParticleTemplate::sSPF_ONE_3.mRange = 0.0; + rvParticleTemplate::sSPF_ONE_3.mMins.z = 0.0; + rvParticleTemplate::sSPF_ONE_3.mModelInfo = 0; + rvParticleTemplate::sSPF_ONE_3.mMins.y = 0.0; + rvParticleTemplate::sSPF_ONE_3.mStatic = 1; + rvParticleTemplate::sSPF_ONE_3.mMins.x = 0.0; + rvParticleTemplate::sSPF_NONE_0.mSpawnType = 0; + rvParticleTemplate::sSPF_ONE_3.mMaxs.z = 0.0; + rvParticleTemplate::sSPF_NONE_0.mFlags = 0; + rvParticleTemplate::sSPF_ONE_3.mMaxs.y = 0.0; + rvParticleTemplate::sSPF_NONE_0.mModelInfo = 0; + rvParticleTemplate::sSPF_ONE_3.mMaxs.x = 0.0; + rvParticleTemplate::sSPF_NONE_0.mStatic = 1; + rvParticleTemplate::sSPF_NONE_0.mRange = 0.0; + rvParticleTemplate::sSPF_NONE_1.mSpawnType = 1; + rvParticleTemplate::sSPF_NONE_0.mMins.z = 0.0; + rvParticleTemplate::sSPF_NONE_1.mFlags = 0; + rvParticleTemplate::sSPF_NONE_0.mMins.y = 0.0; + rvParticleTemplate::sSPF_NONE_1.mModelInfo = 0; + rvParticleTemplate::sSPF_NONE_0.mMins.x = 0.0; + rvParticleTemplate::sSPF_NONE_1.mStatic = 1; + rvParticleTemplate::sSPF_NONE_0.mMaxs.z = 0.0; + rvParticleTemplate::sSPF_NONE_3.mSpawnType = 3; + rvParticleTemplate::sSPF_NONE_0.mMaxs.y = 0.0; + rvParticleTemplate::sSPF_NONE_3.mFlags = 0; + rvParticleTemplate::sSPF_NONE_0.mMaxs.x = 0.0; + rvParticleTemplate::sSPF_NONE_3.mModelInfo = 0; + rvParticleTemplate::sSPF_NONE_1.mRange = 0.0; + rvParticleTemplate::sSPF_NONE_3.mStatic = 1; + rvParticleTemplate::sSPF_NONE_1.mMins.z = 0.0; + rvParticleTemplate::sSPF_NONE_1.mMins.y = 0.0; + rvParticleTemplate::sSPF_NONE_1.mMins.x = 0.0; + rvParticleTemplate::sSPF_NONE_1.mMaxs.z = 0.0; + rvParticleTemplate::sSPF_NONE_1.mMaxs.y = 0.0; + rvParticleTemplate::sSPF_NONE_1.mMaxs.x = 0.0; + rvParticleTemplate::sSPF_NONE_3.mRange = 0.0; + rvParticleTemplate::sSPF_NONE_3.mMins.z = 0.0; + rvParticleTemplate::sSPF_NONE_3.mMins.y = 0.0; + rvParticleTemplate::sSPF_NONE_3.mMins.x = 0.0; + rvParticleTemplate::sSPF_NONE_3.mMaxs.z = 0.0; + rvParticleTemplate::sSPF_NONE_3.mMaxs.y = 0.0; + rvParticleTemplate::sSPF_NONE_3.mMaxs.x = 0.0; + } +} + +void rvParticleTemplate::Init(void) +{ + rvParticleTemplate* v1; // esi + //sdDeclTypeHolder* v2; // eax + rvDeclEffect** v3; // eax + signed int v4; // ecx + + v1 = this; + rvParticleTemplate::InitStatic(); + v1->mFlags = 0; + v1->mType = 0; + //v2 = sdSingleton::GetInstance(); + v1->SetMaterial((idMaterial *)declManager->FindMaterial("_default")); + v1->mModel = renderModelManager->FindModel("_default"); + //v1->mMaterial = (idMaterial*)((int(__stdcall*)(int, const char*, signed int))declManager->vfptr->FindType)( + // v2->declMaterialType.declTypeHandle, + // "_default", + // 1); + //v1->mModel = (idRenderModel*)((int(__stdcall*)(const char*))renderModelManager->vfptr->FindModel)("_default"); + v1->mTraceModelIndex = -1; + v1->mGravity.y = 0.0; + v1->mGravity.x = 0.0; + v1->mTiling = 8.0; + v1->mPhysicsDistance = 0.0; + v1->mBounce = 0.0; + v1->mDuration.x = 0.0020000001; + v1->mDuration.y = 0.0020000001; + v1->mCentre.z = 0.0; + v1->mCentre.y = 0.0; + v1->mCentre.x = 0.0; + v1->mFlags |= 0x4000000u; + v1->mpSpawnPosition = &rvParticleTemplate::sSPF_NONE_3; + v1->mWindDeviationAngle = 0.0; + v1->mpSpawnDirection = &rvParticleTemplate::sSPF_NONE_3; + v1->mpSpawnVelocity = &rvParticleTemplate::sSPF_NONE_3; + v1->mpSpawnAcceleration = &rvParticleTemplate::sSPF_NONE_3; + v1->mpSpawnFriction = &rvParticleTemplate::sSPF_NONE_3; + v1->mpSpawnRotate = &rvParticleTemplate::sSPF_NONE_3; + v1->mpSpawnAngle = &rvParticleTemplate::sSPF_NONE_3; + v1->mpSpawnOffset = &rvParticleTemplate::sSPF_NONE_3; + v1->mpSpawnLength = &rvParticleTemplate::sSPF_NONE_3; + v1->mpDeathTint = &rvParticleTemplate::sSPF_NONE_3; + v1->mpDeathRotate = &rvParticleTemplate::sSPF_NONE_3; + v1->mpDeathAngle = &rvParticleTemplate::sSPF_NONE_3; + v1->mpDeathOffset = &rvParticleTemplate::sSPF_NONE_3; + v1->mpDeathLength = &rvParticleTemplate::sSPF_NONE_3; + v1->mNumSizeParms = 2; + v1->mNumRotateParms = 1; + v1->mVertexCount = 4; + v1->mIndexCount = 6; + v1->mTrailInfo = &rvParticleTemplate::sTrailInfo; + v1->mElecInfo = &rvParticleTemplate::sElectricityInfo; + v1->mpSpawnTint = &rvParticleTemplate::sSPF_ONE_3; + v1->mpSpawnFade = &rvParticleTemplate::sSPF_ONE_1; + v1->mpSpawnSize = &rvParticleTemplate::sSPF_ONE_3; + v1->mpSpawnWindStrength = &rvParticleTemplate::sSPF_NONE_1; + v1->mpTintEnvelope = &rvParticleTemplate::sEmptyEnvelope; + v1->mpFadeEnvelope = &rvParticleTemplate::sEmptyEnvelope; + v1->mpSizeEnvelope = &rvParticleTemplate::sEmptyEnvelope; + v1->mpRotateEnvelope = &rvParticleTemplate::sEmptyEnvelope; + v1->mpAngleEnvelope = &rvParticleTemplate::sEmptyEnvelope; + v1->mpOffsetEnvelope = &rvParticleTemplate::sEmptyEnvelope; + v1->mpLengthEnvelope = &rvParticleTemplate::sEmptyEnvelope; + v1->mpDeathFade = &rvParticleTemplate::sSPF_NONE_1; + v1->mpDeathSize = &rvParticleTemplate::sSPF_ONE_3; + v1->mTrailRepeat = 1; + v1->mNumFrames = 0; + v1->mNumImpactEffects = 0; + v1->mNumTimeoutEffects = 0; + // jmarshall: no idea + //v3 = &v1->mTimeoutEffects[0]; + // jmarshall end + v4 = 4; + + // jmarshall: no idea + //do + //{ + // *(v3 - 5) = 0; + // *v3 = 0; + // ++v3; + // --v4; + //} while (v4); + // jmarshall end + v1->mFlags |= 0x8000000u; +} + +void rvParticleTemplate::SetParameterCounts() +{ + rvParticleParms* v1; // eax + rvParticleParms* v2; // edx + + switch (this->mType) + { + case 1: + this->mNumSizeParms = 2; + this->mNumRotateParms = 1; + v1 = &rvParticleTemplate::sSPF_ONE_2; + v2 = &rvParticleTemplate::sSPF_NONE_1; + goto LABEL_11; + case 2: + case 7: + case 8: + case 9: + this->mNumSizeParms = 1; + this->mNumRotateParms = 0; + v1 = &rvParticleTemplate::sSPF_ONE_1; + v2 = &rvParticleTemplate::sSPF_NONE_0; + goto LABEL_11; + case 3: + this->mNumSizeParms = 2; + this->mNumRotateParms = 3; + v1 = &rvParticleTemplate::sSPF_ONE_2; + v2 = &rvParticleTemplate::sSPF_NONE_3; + goto LABEL_11; + case 4: + this->mNumSizeParms = 3; + this->mNumRotateParms = 1; + v2 = &rvParticleTemplate::sSPF_NONE_1; + goto LABEL_10; + case 5: + this->mNumSizeParms = 3; + this->mNumRotateParms = 3; + goto LABEL_9; + case 6: + this->mNumSizeParms = 3; + this->mNumRotateParms = 0; + v2 = &rvParticleTemplate::sSPF_NONE_0; + goto LABEL_10; + case 0xA: + this->mNumSizeParms = 0; + this->mNumRotateParms = 3; + LABEL_9: + v2 = &rvParticleTemplate::sSPF_NONE_3; + LABEL_10: + v1 = &rvParticleTemplate::sSPF_ONE_3; + LABEL_11: + this->mpSpawnSize = v1; + this->mpSpawnRotate = v2; + this->mpDeathSize = v1; + this->mpDeathRotate = v2; + break; + default: + return; + } +} + +void rvParticleTemplate::PurgeTraceModel(void) { + rvParticleTemplate* v1; // esi + int v2; // eax + + v1 = this; + v2 = this->mTraceModelIndex; + if (v2 != -1) + { + //bse->FreeTraceModel(v2); // jmarshall: todo + v1->mTraceModelIndex = -1; + } +} + +void rvParticleTemplate::Purge() { + // TODO +} + +float rvParticleTemplate::CostTrail(float cost) const +{ + rvTrailInfo* v2; // eax + double result; // st7 + float costa; // [esp+4h] [ebp+4h] + float costb; // [esp+4h] [ebp+4h] + + v2 = this->mTrailInfo; + switch (v2->mTrailType) + { + case 1: + costa = v2->mTrailCount.y * (cost + cost); + result = costa; + break; + case 2: + costb = v2->mTrailCount.y * (cost * 1.5) + 20.0; + result = costb; + break; + default: + result = cost; + break; + } + return result; +} + +bool rvParticleTemplate::UsesEndOrigin(void) { + bool result; // al + + if (this->mpSpawnPosition->mFlags & 2 || this->mpSpawnLength->mFlags & 2) + result = 1; + else + result = ((unsigned int)this->mFlags >> 22) & 1; + return result; +} From 665bbd5b679580f81910edb9cba7b971e3604a94 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Tue, 27 Jul 2021 18:34:56 -0700 Subject: [PATCH 34/38] BSE loading enabled. --- src/bse/BSE_EffectTemplate.cpp | 5 ++--- src/bse/BSE_ParseParticle2.cpp | 14 ++++++++------ src/bse/BSE_SegmentTemplate.cpp | 2 ++ 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/bse/BSE_EffectTemplate.cpp b/src/bse/BSE_EffectTemplate.cpp index 372dfa10..e2a1e520 100644 --- a/src/bse/BSE_EffectTemplate.cpp +++ b/src/bse/BSE_EffectTemplate.cpp @@ -162,8 +162,6 @@ void rvDeclEffect::Finish() { } bool rvDeclEffect::Parse(const char* text, const int textLength) { - return true; -#if 0 idParser src; idToken token, token2; rvSegmentTemplate segment; @@ -231,11 +229,12 @@ bool rvDeclEffect::Parse(const char* text, const int textLength) { { src.Error("^4BSE:^1 Invalid segment type '%s' (file: %s, line: %d)\n", token, GetFileName(), src.GetLineNum()); } + + src.ReadToken(&token); } } Finish(); return true; -#endif } diff --git a/src/bse/BSE_ParseParticle2.cpp b/src/bse/BSE_ParseParticle2.cpp index 1556e2cd..ac05b698 100644 --- a/src/bse/BSE_ParseParticle2.cpp +++ b/src/bse/BSE_ParseParticle2.cpp @@ -771,7 +771,7 @@ bool rvParticleTemplate::CheckCommonParms(idParser* src, rvParticleParms& parms) { parms.mFlags |= 1u; } - if (!src->ReadToken((idToken*)((char*)&token + 4))) + if (!src->ReadToken(&token)) goto LABEL_18; } v5 = -1; @@ -933,8 +933,9 @@ bool rvParticleTemplate::ParseSpawnDomains(rvDeclEffect* effect, idParser* src) idToken token; src->ExpectTokenString("{"); - src->ReadToken(&token); while (true) { + src->ReadToken(&token); + if (token == "}") break; @@ -990,8 +991,9 @@ bool rvParticleTemplate::ParseDeathDomains(rvDeclEffect* effect, idParser* src) idToken token; src->ExpectTokenString("{"); - src->ReadToken(&token); while (true) { + src->ReadToken(&token); + if (token == "}") break; @@ -1058,9 +1060,10 @@ bool rvParticleTemplate::ParseDeathDomains(rvDeclEffect* effect, idParser* src) bool rvParticleTemplate::Parse(rvDeclEffect* effect, idParser* src) { idToken token; - src->ExpectTokenString("{"); - src->ReadToken(&token); + src->ExpectTokenString("{"); while (true) { + src->ReadToken(&token); + if (token == "}") break; @@ -1167,7 +1170,6 @@ bool rvParticleTemplate::Parse(rvDeclEffect* effect, idParser* src) { src->ExpectTokenString(","); float srcc = src->ParseFloat(); - srcc = src->ParseFloat(); float v9 = 0.0020000001; if (srcc < 0.0020000001 || (v9 = srcc, srcc <= 300.0)) { diff --git a/src/bse/BSE_SegmentTemplate.cpp b/src/bse/BSE_SegmentTemplate.cpp index 94a47df9..16b4c75e 100644 --- a/src/bse/BSE_SegmentTemplate.cpp +++ b/src/bse/BSE_SegmentTemplate.cpp @@ -534,6 +534,8 @@ bool rvSegmentTemplate::Parse(rvDeclEffect* effect, int segmentType, idParser* l { common->Warning("^4BSE:^1 Invalid segment parameter '%s' (file: %s, line: %d", token.c_str(), lexer->GetFileName(), lexer->GetLineNum()); } + + lexer->ReadToken(&token); } } } \ No newline at end of file From ac23595eab3805cac3e19cf729700df8d7e5b2ce Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Tue, 27 Jul 2021 19:14:21 -0700 Subject: [PATCH 35/38] BSE bug were effect segments weren't properly stored. --- src/bse/BSE_EffectTemplate.cpp | 30 ++++++++++++++++++++++++++++++ src/bse/BSE_SegmentTemplate.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/src/bse/BSE_EffectTemplate.cpp b/src/bse/BSE_EffectTemplate.cpp index e2a1e520..41c230c5 100644 --- a/src/bse/BSE_EffectTemplate.cpp +++ b/src/bse/BSE_EffectTemplate.cpp @@ -178,42 +178,72 @@ bool rvDeclEffect::Parse(const char* text, const int textLength) { if (token == "tunnel") { segment.Parse(this, SEG_TUNNEL, &src); + if (segment.Finish(this)) { + mSegmentTemplates.Append(segment); + } } else if (token == "shake") { segment.Parse(this, SEG_SHAKE, &src); + if (segment.Finish(this)) { + mSegmentTemplates.Append(segment); + } } else if (token == "delay") { segment.Parse(this, SEG_DELAY, &src); + if (segment.Finish(this)) { + mSegmentTemplates.Append(segment); + } } else if (token == "light") { segment.Parse(this, SEG_LIGHT, &src); + if (segment.Finish(this)) { + mSegmentTemplates.Append(segment); + } } else if (token == "decal") { segment.Parse(this, SEG_DECAL, &src); + if (segment.Finish(this)) { + mSegmentTemplates.Append(segment); + } } else if (token == "sound") { segment.Parse(this, SEG_SOUND, &src); + if (segment.Finish(this)) { + mSegmentTemplates.Append(segment); + } } else if (token == "trail") { segment.Parse(this, SEG_TRAIL, &src); + if (segment.Finish(this)) { + mSegmentTemplates.Append(segment); + } } else if (token == "spawner") { segment.Parse(this, SEG_SPAWNER, &src); + + if (segment.Finish(this)) { + mSegmentTemplates.Append(segment); + } } else if (token == "emitter") { segment.Parse(this, SEG_EMITTER, &src); + + if (segment.Finish(this)) { + mSegmentTemplates.Append(segment); + } } else if (token == "effect") { segment.Parse(this, SEG_EFFECT, &src); + if (segment.Finish(this)) { mSegmentTemplates.Append(segment); } diff --git a/src/bse/BSE_SegmentTemplate.cpp b/src/bse/BSE_SegmentTemplate.cpp index 16b4c75e..d60c6919 100644 --- a/src/bse/BSE_SegmentTemplate.cpp +++ b/src/bse/BSE_SegmentTemplate.cpp @@ -159,6 +159,30 @@ void rvSegmentTemplate::Duplicate(const rvSegmentTemplate& copy) void rvSegmentTemplate::Init(rvDeclEffect* decl) { + mSoundShader = NULL; + mFlags = 0; + mSegType = 0; + mLocalStartTime.Zero(); // Start time of segment wrt effect + mLocalDuration.Zero(); // Min and max duration + mAttenuation.Zero(); // How effect fades off to the distance + mParticleCap = 0; + mScale = 0; + mDetail = 0; + + // Emitter parms + mCount.Zero(); // The count of particles from a spawner + mDensity.Zero(); // Sets count or rate based on volume, area or length + mTrailSegmentIndex = 0; + + mNumEffects = 0; + for (int i = 0; i < BSE_NUM_SPAWNABLE; i++) + mEffects[i] = NULL; + + mSoundShader = NULL; + mSoundVolume.Zero(); // Starting volume of sound in decibels + mFreqShift.Zero(); // Frequency shift of sound + + mDecalAxis = 0; mDeclEffect = decl; mFlags = 1; mSegType = 0; From ec8ec15bf6a76fd0080c5aa630fc2b7d457875fd Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Tue, 27 Jul 2021 19:15:54 -0700 Subject: [PATCH 36/38] BSE seg type is now set. --- src/bse/BSE_SegmentTemplate.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/bse/BSE_SegmentTemplate.cpp b/src/bse/BSE_SegmentTemplate.cpp index d60c6919..f9eaeb1f 100644 --- a/src/bse/BSE_SegmentTemplate.cpp +++ b/src/bse/BSE_SegmentTemplate.cpp @@ -389,6 +389,8 @@ bool rvSegmentTemplate::Parse(rvDeclEffect* effect, int segmentType, idParser* l lexer->UnreadToken(&token); } + mSegType = segmentType; + if (lexer->ExpectTokenString("{") && lexer->ReadToken(&token)) { while (token != "}") From d1e6acd0e4c3a401baf23035ace544322fa31350 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Wed, 28 Jul 2021 12:24:57 -0700 Subject: [PATCH 37/38] BSE: Initial execution pipeline. --- src/bse/BSE_Manager.cpp | 125 ++++++++++++++++++++++++++++--- src/renderer/RenderWorld.cpp | 67 +++++++++++++++++ src/renderer/RenderWorld.h | 38 ++++++++++ src/renderer/RenderWorld_local.h | 15 ++-- src/renderer/tr_light.cpp | 16 ++++ src/renderer/tr_local.h | 2 + src/renderer/tr_main.cpp | 2 + 7 files changed, 248 insertions(+), 17 deletions(-) diff --git a/src/bse/BSE_Manager.cpp b/src/bse/BSE_Manager.cpp index 5f140d4d..798b48cf 100644 --- a/src/bse/BSE_Manager.cpp +++ b/src/bse/BSE_Manager.cpp @@ -30,7 +30,11 @@ idList rvBSEManagerLocal::mTraceModels; const char* rvBSEManagerLocal::mSegmentNames[SEG_COUNT]; int rvBSEManagerLocal::mPerfCounters[NUM_PERF_COUNTERS]; float rvBSEManagerLocal::mEffectRates[EC_MAX]; - +/* +==================== +rvBSEManagerLocal::Init +==================== +*/ bool rvBSEManagerLocal::Init(void) { common->Printf("----------------- BSE Init ------------------\n"); @@ -40,7 +44,20 @@ bool rvBSEManagerLocal::Init(void) { return true; } +/* +==================== +rvBSEManagerLocal::Shutdown +==================== +*/ bool rvBSEManagerLocal::Shutdown(void) { + common->Printf("--------------- BSE Shutdown ----------------\n"); + + mTraceModels.Clear(); + mEffectRates[0] = 0.0f; + mEffectRates[1] = 0.0f; + mEffectRates[2] = 0.0f; + + common->Printf("---------------------------------------------\n"); return true; } @@ -86,19 +103,101 @@ void rvBSEManagerLocal::FreeTraceModel(int index) } bool rvBSEManagerLocal::PlayEffect(class rvRenderEffectLocal* def, float time) { - return true; + const rvDeclEffect* v3; // esi + + v3 = (const rvDeclEffect *)def->parms.declEffect; + idStr effectName = def->parms.declEffect->GetName(); + + if (Filtered(effectName, EC_IGNORE)) + return 0; + if (bse_debug.GetInteger()) + { + common->Printf("Playing effect: %s at %g\n", effectName.c_str(), time); + } + ++v3->mPlayCount; + rvBSE* bse = effects.Alloc(); + def->effect = bse; + bse->Init(v3, &def->parms, time); + return 1; } bool rvBSEManagerLocal::ServiceEffect(class rvRenderEffectLocal* def, float time) { - return true; + rvBSE* v5; // ebp + idStr v6; // eax + idBounds v9; // eax + + bool forcePush = false; + + if (-1.0 == this->pauseTime) + this->pauseTime = time; + if (this->pauseTime > 0.0) + time = this->pauseTime; + v5 = def->effect; + if (!v5) + return 1; + v6 = def->parms.declEffect->GetName(); + if (Filtered(v6, EC_IGNORE)) + return true; + if (v5->Service(&def->parms, time, def->gameTime > def->serviceTime, forcePush)) + { + return true; + } + def->serviceTime = def->gameTime; + v9 = v5->GetCurrentLocalBounds(); + def->referenceBounds[0].x = v9[0][0]; + def->referenceBounds[0].y = v9[0][1]; + def->referenceBounds[0].z = v9[0][2]; + def->referenceBounds[1].x = v9[1][0]; + def->referenceBounds[1].y = v9[1][1]; + def->referenceBounds[1].z = v9[1][2]; + if (bse_speeds.GetBool()) + ++rvBSEManagerLocal::mPerfCounters[0]; + if (bse_debug.GetInteger()) + v5->EvaluateCost(); + + return 0; } void rvBSEManagerLocal::StopEffect(rvRenderEffectLocal* def) { - + if (def && def->index >= 0 && def->effect) + { + if (bse_debug.GetInteger()) + { + idStr effectName = def->parms.declEffect->GetName(); + common->Printf("Stopping effect %s\n", effectName.c_str()); + } + def->effect->SetStopped(true); + } + else + { + def->newEffect = 0; + def->expired = 1; + } } void rvBSEManagerLocal::FreeEffect(rvRenderEffectLocal* def) { + int v1; // eax + rvBSE* v2; // eax + if (def && def->index >= 0 && def->effect) + { + if (bse_debug.GetInteger()) + { + idStr effectName = def->parms.declEffect->GetName(); + common->Printf("Freeing effect %s\n", effectName.c_str()); + } + def->effect->Destroy(); + v2 = def->effect; + // jmarshall - not sure what this is + //if (v2) + //{ + // v2[1].vfptr = (rvBSEVtbl*)unk_11F4D64; + // --unk_11F4D6C; + // unk_11F4D64 = v2; + //} + // jmarshall end + def->effect = 0; + } } float rvBSEManagerLocal::EffectDuration(const rvRenderEffectLocal* def) { @@ -114,7 +213,9 @@ void rvBSEManagerLocal::BeginLevelLoad(void) { } void rvBSEManagerLocal::EndLevelLoad(void) { - + mEffectRates[0] = 0.0f; + mEffectRates[1] = 0.0f; + mEffectRates[2] = 0.0f; } void rvBSEManagerLocal::StartFrame(void) { @@ -129,15 +230,17 @@ void rvBSEManagerLocal::StartFrame(void) { } void rvBSEManagerLocal::EndFrame(void) { - common->Printf("bse_active: %i particles: %i traces: %i texels: %i\n", - rvBSEManagerLocal::mPerfCounters[0], - rvBSEManagerLocal::mPerfCounters[2], - rvBSEManagerLocal::mPerfCounters[1], - (double)rvBSEManagerLocal::mPerfCounters[3] * 0.00000095367431640625); + if (bse_speeds.GetInteger()) { + common->Printf("bse_active: %i particles: %i traces: %i texels: %i\n", + rvBSEManagerLocal::mPerfCounters[0], + rvBSEManagerLocal::mPerfCounters[2], + rvBSEManagerLocal::mPerfCounters[1], + (double)rvBSEManagerLocal::mPerfCounters[3] * 0.00000095367431640625); + } } bool rvBSEManagerLocal::Filtered(const char* name, effectCategory_t category) { - return true; + return false; } void rvBSEManagerLocal::UpdateRateTimes(void) { diff --git a/src/renderer/RenderWorld.cpp b/src/renderer/RenderWorld.cpp index 190768cf..e58be836 100644 --- a/src/renderer/RenderWorld.cpp +++ b/src/renderer/RenderWorld.cpp @@ -172,6 +172,73 @@ void idRenderWorldLocal::ResizeInteractionTable() { interactionTable = NULL; } +/* +=================== +AddEffectDef +=================== +*/ +qhandle_t idRenderWorldLocal::AddEffectDef(const renderEffect_t* reffect, int time) { + int effectHandle = effectsDef.FindNull(); + if (effectHandle == -1) { + effectHandle = effectsDef.Append(NULL); + } + + if (effectsDef[effectHandle] == NULL) { + effectsDef[effectHandle] = new rvRenderEffectLocal(); + } + + effectsDef[effectHandle]->parms = *reffect; + effectsDef[effectHandle]->gameTime = time; + + bse->PlayEffect(effectsDef[effectHandle], tr.frameShaderTime); + + return effectHandle; +} + +/* +=================== +UpdateEffectDef +=================== +*/ +bool idRenderWorldLocal::UpdateEffectDef(qhandle_t effectHandle, const renderEffect_t* reffect, int time) { + // create new slots if needed + if (effectHandle < 0 || effectHandle > LUDICROUS_INDEX) { + common->Error("idRenderWorld::UpdateEffectDef: index = %i", effectHandle); + } + //while (effectHandle >= effectsDef.Num()) { + // effectsDef.Append(NULL); + //} + + effectsDef[effectHandle]->parms = *reffect; + effectsDef[effectHandle]->gameTime = time; + + return true; +} + +void idRenderWorldLocal::FreeEffectDef(qhandle_t effectHandle) { + bse->FreeEffect(effectsDef[effectHandle]); + + if (effectsDef[effectHandle] != NULL) + delete effectsDef[effectHandle]; + + effectsDef[effectHandle] = NULL; +} + +void idRenderWorldLocal::StopEffectDef(qhandle_t effectHandle) { + if (effectsDef[effectHandle] == NULL) + return; + + bse->StopEffect(effectsDef[effectHandle]); +} + +const class rvRenderEffectLocal* idRenderWorldLocal::GetEffectDef(qhandle_t effectHandle) const { + return effectsDef[effectHandle]; +} + +bool idRenderWorldLocal::EffectDefHasSound(const renderEffect_s* reffect) { + return false; +} + /* =================== AddEntityDef diff --git a/src/renderer/RenderWorld.h b/src/renderer/RenderWorld.h index 74df4ca9..8cce3b94 100644 --- a/src/renderer/RenderWorld.h +++ b/src/renderer/RenderWorld.h @@ -429,6 +429,44 @@ enum // RAVEN END + +// RAVEN BEGIN +// jscott: effect handling in the renderer +class rvRenderEffect { +public: + virtual ~rvRenderEffect(void) {} +}; +// RAVEN END + +class rvRenderEffectLocal : rvRenderEffect +{ +public: + renderEffect_s parms; + //renderEffect_s gameParms; + int gameTime; + int serviceTime; + bool newEffect; + bool expired; + class rvBSE* effect; + idBounds referenceBounds; + float modelMatrix[16]; + class idRenderWorldLocal* world; + int lastModifiedFrameNum; + bool archived; + int viewCount; + //viewEffect_s* viewEffect; + int visibleCount; + //areaReference_s* effectRefs; + //cullLink_t* cullLinks; + bool remove; + int updateFramenum; + idLinkList node; + int index; + idRenderModel* dynamicModel; + int dynamicModelFrameCount; +}; +// RAVEN END + class idRenderWorld { public: virtual ~idRenderWorld( void ) {}; diff --git a/src/renderer/RenderWorld_local.h b/src/renderer/RenderWorld_local.h index 4b53ad81..92731566 100644 --- a/src/renderer/RenderWorld_local.h +++ b/src/renderer/RenderWorld_local.h @@ -137,12 +137,12 @@ class idRenderWorldLocal : public idRenderWorld { virtual void ReadRenderLight(idDemoFile* readDemo, renderLight_t& light) { }; // jscott: handling of effects - virtual qhandle_t AddEffectDef(const renderEffect_t* reffect, int time) { return 1; } - virtual bool UpdateEffectDef(qhandle_t effectHandle, const renderEffect_t* reffect, int time) { return true; } - virtual void StopEffectDef(qhandle_t effectHandle) { } - virtual const class rvRenderEffectLocal* GetEffectDef(qhandle_t effectHandle) const { return NULL; } - virtual void FreeEffectDef(qhandle_t effectHandle) { } - virtual bool EffectDefHasSound(const renderEffect_s* reffect) { return false; } + virtual qhandle_t AddEffectDef(const renderEffect_t* reffect, int time); + virtual bool UpdateEffectDef(qhandle_t effectHandle, const renderEffect_t* reffect, int time); + virtual void StopEffectDef(qhandle_t effectHandle); + virtual const class rvRenderEffectLocal* GetEffectDef(qhandle_t effectHandle) const; + virtual void FreeEffectDef(qhandle_t effectHandle); + virtual bool EffectDefHasSound(const renderEffect_s* reffect); // jscott: for optimised pushes virtual void PushMarkedDefs(void) { } @@ -174,6 +174,9 @@ class idRenderWorldLocal : public idRenderWorld { idList entityDefs; idList lightDefs; +// jmarshall: BSE + idList effectsDef; +// jmarshll end idBlockAlloc areaReferenceAllocator; idBlockAlloc interactionAllocator; diff --git a/src/renderer/tr_light.cpp b/src/renderer/tr_light.cpp index 8579bbd2..4a256da0 100644 --- a/src/renderer/tr_light.cpp +++ b/src/renderer/tr_light.cpp @@ -1449,6 +1449,22 @@ idScreenRect R_CalcEntityScissorRectangle( viewEntity_t *vEntity ) { return R_ScreenRectFromViewFrustumBounds( bounds ); } +/* +=============== +R_AddEffectSurfaces +=============== +*/ +void R_AddEffectSurfaces(void) { + idRenderWorldLocal* world = tr.viewDef->renderWorld; + + for (int i = 0; i < world->effectsDef.Num(); i++) { + if (world->effectsDef[i] == NULL) + continue; + + bse->ServiceEffect(world->effectsDef[i], tr.frameShaderTime); + } +} + /* =================== R_AddModelSurfaces diff --git a/src/renderer/tr_local.h b/src/renderer/tr_local.h index 3b2503f8..3574ff85 100644 --- a/src/renderer/tr_local.h +++ b/src/renderer/tr_local.h @@ -1238,6 +1238,8 @@ void R_ModulateLights_f( const idCmdArgs &args ); void R_SetLightProject( idPlane lightProject[4], const idVec3 origin, const idVec3 targetPoint, const idVec3 rightVector, const idVec3 upVector, const idVec3 start, const idVec3 stop ); +void R_AddEffectSurfaces(void); + void R_AddLightSurfaces( void ); void R_AddModelSurfaces( void ); void R_RemoveUnecessaryViewLights( void ); diff --git a/src/renderer/tr_main.cpp b/src/renderer/tr_main.cpp index 0ba2ccec..69d6ff92 100644 --- a/src/renderer/tr_main.cpp +++ b/src/renderer/tr_main.cpp @@ -1126,6 +1126,8 @@ void R_RenderView( viewDef_t *parms ) { // constrain the view frustum to the view lights and entities R_ConstrainViewFrustum(); + R_AddEffectSurfaces(); + // make sure that interactions exist for all light / entity combinations // that are visible // add any pre-generated light shadows, and calculate the light shader values From de21473a820b8089dea1b4a6a6e298ebc588ed02 Mon Sep 17 00:00:00 2001 From: IlDucci Date: Mon, 2 Aug 2021 18:23:55 +0200 Subject: [PATCH 38/38] Adding proper fonts in D3 format. --- q4base/fonts/Lowpixel/fontImage_12.dat | Bin 20548 -> 20548 bytes q4base/fonts/Lowpixel/fontImage_24.dat | Bin 20548 -> 20548 bytes q4base/fonts/Lowpixel/fontImage_48.dat | Bin 20548 -> 20548 bytes q4base/fonts/Marine/Marine_0_12.tga | Bin 262694 -> 262694 bytes q4base/fonts/Marine/Marine_0_24.tga | Bin 262694 -> 262694 bytes q4base/fonts/Marine/Marine_0_48.tga | Bin 262694 -> 262694 bytes q4base/fonts/Marine/Marine_1_24.tga | Bin 262694 -> 262694 bytes q4base/fonts/Marine/Marine_1_48.tga | Bin 262694 -> 262694 bytes q4base/fonts/Marine/Marine_2_48.tga | Bin 262694 -> 262694 bytes q4base/fonts/Marine/fontImage_12.dat | Bin 20548 -> 20548 bytes q4base/fonts/Marine/fontImage_24.dat | Bin 20548 -> 20548 bytes q4base/fonts/Marine/fontImage_48.dat | Bin 20548 -> 20548 bytes q4base/fonts/Marine_0_12.tga | Bin 262694 -> 262694 bytes q4base/fonts/Marine_0_24.tga | Bin 262694 -> 262694 bytes q4base/fonts/Marine_0_48.tga | Bin 262694 -> 262694 bytes q4base/fonts/Marine_1_24.tga | Bin 262694 -> 262694 bytes q4base/fonts/Marine_1_48.tga | Bin 262694 -> 262694 bytes q4base/fonts/Marine_2_48.tga | Bin 262694 -> 262694 bytes q4base/fonts/Profont/fontImage_12.dat | Bin 20548 -> 20548 bytes q4base/fonts/Profont/fontImage_24.dat | Bin 20548 -> 20548 bytes q4base/fonts/Profont/fontImage_48.dat | Bin 20548 -> 20548 bytes q4base/fonts/Strogg/Strogg_0_12.tga | Bin 262694 -> 262694 bytes q4base/fonts/Strogg/Strogg_0_24.tga | Bin 262694 -> 262694 bytes q4base/fonts/Strogg/Strogg_0_48.tga | Bin 262694 -> 262694 bytes q4base/fonts/Strogg/Strogg_1_48.tga | Bin 262694 -> 262694 bytes q4base/fonts/Strogg/fontImage_12.dat | Bin 20548 -> 20548 bytes q4base/fonts/Strogg/fontImage_24.dat | Bin 20548 -> 20548 bytes q4base/fonts/Strogg/fontImage_48.dat | Bin 20548 -> 20548 bytes q4base/fonts/chain/chain_0_12.tga | Bin 0 -> 262694 bytes q4base/fonts/chain/chain_0_24.tga | Bin 0 -> 262694 bytes .../Marine_0_24.tga => chain/chain_0_48.tga} | Bin 262694 -> 262694 bytes q4base/fonts/chain/chain_1_24.tga | Bin 0 -> 262694 bytes q4base/fonts/chain/chain_1_48.tga | Bin 0 -> 262694 bytes q4base/fonts/chain/chain_2_24.tga | Bin 0 -> 262694 bytes q4base/fonts/chain/chain_2_48.tga | Bin 0 -> 262694 bytes q4base/fonts/chain/chain_3_48.tga | Bin 0 -> 262694 bytes q4base/fonts/chain/chain_4_48.tga | Bin 0 -> 262694 bytes q4base/fonts/chain/chain_5_48.tga | Bin 0 -> 262694 bytes q4base/fonts/chain/chain_6_48.tga | Bin 0 -> 262694 bytes q4base/fonts/chain/chain_7_48.tga | Bin 0 -> 262694 bytes .../Marine_0_24.tga => chain/chain_8_48.tga} | Bin 262694 -> 262694 bytes .../Marine_0_12.tga => chain/chain_9_48.tga} | Bin 262694 -> 262694 bytes q4base/fonts/chain/fontImage_12.dat | Bin 0 -> 20548 bytes q4base/fonts/chain/fontImage_24.dat | Bin 0 -> 20548 bytes q4base/fonts/chain/fontImage_48.dat | Bin 0 -> 20548 bytes q4base/fonts/fontImage_12.dat | Bin 20548 -> 20548 bytes q4base/fonts/fontImage_24.dat | Bin 20548 -> 20548 bytes q4base/fonts/fontImage_48.dat | Bin 20548 -> 20548 bytes q4base/fonts/lowpixel/lowpixel_0_12.tga | Bin 0 -> 262694 bytes q4base/fonts/lowpixel/lowpixel_0_24.tga | Bin 0 -> 262694 bytes q4base/fonts/lowpixel/lowpixel_0_48.tga | Bin 0 -> 262694 bytes .../lowpixel_1_12.tga} | Bin 262694 -> 262694 bytes q4base/fonts/lowpixel/lowpixel_1_24.tga | Bin 0 -> 262694 bytes q4base/fonts/lowpixel/lowpixel_1_48.tga | Bin 0 -> 262694 bytes q4base/fonts/lowpixel/lowpixel_2_24.tga | Bin 0 -> 262694 bytes .../lowpixel_2_48.tga} | Bin 262694 -> 262694 bytes q4base/fonts/lowpixel/lowpixel_3_48.tga | Bin 0 -> 262694 bytes .../lowpixel_4_48.tga} | Bin 262694 -> 262694 bytes .../lowpixel_5_48.tga} | Bin 262694 -> 262694 bytes q4base/fonts/lowpixel/lowpixel_6_48.tga | Bin 0 -> 262694 bytes q4base/fonts/lowpixel/lowpixel_7_48.tga | Bin 0 -> 262694 bytes q4base/fonts/lowpixel/lowpixel_8_48.tga | Bin 0 -> 262694 bytes .../lowpixel_9_48.tga} | Bin 262694 -> 262694 bytes q4base/fonts/marine/marine_2_24.tga | Bin 0 -> 262694 bytes q4base/fonts/marine/marine_3_48.tga | Bin 0 -> 262694 bytes .../marine_4_48.tga} | Bin 262694 -> 262694 bytes q4base/fonts/marine/marine_5_48.tga | Bin 0 -> 262694 bytes q4base/fonts/marine/marine_6_48.tga | Bin 0 -> 262694 bytes q4base/fonts/marine/marine_7_48.tga | Bin 0 -> 262694 bytes q4base/fonts/marine_2_24.tga | Bin 0 -> 262694 bytes q4base/fonts/marine_3_48.tga | Bin 0 -> 262694 bytes .../Marine_2_48.tga => marine_4_48.tga} | Bin 262694 -> 262694 bytes q4base/fonts/marine_5_48.tga | Bin 0 -> 262694 bytes q4base/fonts/marine_6_48.tga | Bin 0 -> 262694 bytes q4base/fonts/marine_7_48.tga | Bin 0 -> 262694 bytes q4base/fonts/profont/profont_0_12.tga | Bin 0 -> 262694 bytes q4base/fonts/profont/profont_0_24.tga | Bin 0 -> 262694 bytes q4base/fonts/profont/profont_0_48.tga | Bin 0 -> 262694 bytes .../profont_1_12.tga} | Bin 262694 -> 262694 bytes q4base/fonts/profont/profont_1_24.tga | Bin 0 -> 262694 bytes q4base/fonts/profont/profont_1_48.tga | Bin 0 -> 262694 bytes q4base/fonts/profont/profont_2_24.tga | Bin 0 -> 262694 bytes q4base/fonts/profont/profont_2_48.tga | Bin 0 -> 262694 bytes q4base/fonts/profont/profont_3_48.tga | Bin 0 -> 262694 bytes q4base/fonts/profont/profont_4_48.tga | Bin 0 -> 262694 bytes q4base/fonts/profont/profont_5_48.tga | Bin 0 -> 262694 bytes q4base/fonts/profont/profont_6_48.tga | Bin 0 -> 262694 bytes q4base/fonts/profont/profont_7_48.tga | Bin 0 -> 262694 bytes q4base/fonts/profont/profont_8_48.tga | Bin 0 -> 262694 bytes q4base/fonts/profont/profont_9_48.tga | Bin 0 -> 262694 bytes q4base/fonts/r_strogg/fontImage_12.dat | Bin 0 -> 20548 bytes q4base/fonts/r_strogg/fontImage_24.dat | Bin 0 -> 20548 bytes q4base/fonts/r_strogg/fontImage_48.dat | Bin 0 -> 20548 bytes q4base/fonts/r_strogg/r_strogg_0_12.tga | Bin 0 -> 262694 bytes q4base/fonts/r_strogg/r_strogg_0_24.tga | Bin 0 -> 262694 bytes q4base/fonts/r_strogg/r_strogg_0_48.tga | Bin 0 -> 262694 bytes q4base/fonts/r_strogg/r_strogg_1_24.tga | Bin 0 -> 262694 bytes q4base/fonts/r_strogg/r_strogg_1_48.tga | Bin 0 -> 262694 bytes q4base/fonts/r_strogg/r_strogg_2_24.tga | Bin 0 -> 262694 bytes q4base/fonts/r_strogg/r_strogg_2_48.tga | Bin 0 -> 262694 bytes q4base/fonts/r_strogg/r_strogg_3_48.tga | Bin 0 -> 262694 bytes q4base/fonts/r_strogg/r_strogg_4_48.tga | Bin 0 -> 262694 bytes q4base/fonts/r_strogg/r_strogg_5_48.tga | Bin 0 -> 262694 bytes q4base/fonts/r_strogg/r_strogg_6_48.tga | Bin 0 -> 262694 bytes .../r_strogg_7_48.tga} | Bin 262694 -> 262694 bytes q4base/fonts/r_strogg/r_strogg_8_48.tga | Bin 0 -> 262694 bytes q4base/fonts/r_strogg/r_strogg_9_48.tga | Bin 0 -> 262694 bytes q4base/fonts/strogg/strogg_1_24.tga | Bin 0 -> 262694 bytes q4base/fonts/strogg/strogg_2_48.tga | Bin 0 -> 262694 bytes q4base/fonts/strogg/strogg_3_48.tga | Bin 0 -> 262694 bytes q4base/fonts/strogg/strogg_4_48.tga | Bin 0 -> 262694 bytes q4base/fonts/strogg/strogg_5_48.tga | Bin 0 -> 262694 bytes q4base/fonts/strogg/strogg_6_48.tga | Bin 0 -> 262694 bytes 113 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 q4base/fonts/chain/chain_0_12.tga create mode 100644 q4base/fonts/chain/chain_0_24.tga rename q4base/fonts/{Profont/Marine_0_24.tga => chain/chain_0_48.tga} (68%) create mode 100644 q4base/fonts/chain/chain_1_24.tga create mode 100644 q4base/fonts/chain/chain_1_48.tga create mode 100644 q4base/fonts/chain/chain_2_24.tga create mode 100644 q4base/fonts/chain/chain_2_48.tga create mode 100644 q4base/fonts/chain/chain_3_48.tga create mode 100644 q4base/fonts/chain/chain_4_48.tga create mode 100644 q4base/fonts/chain/chain_5_48.tga create mode 100644 q4base/fonts/chain/chain_6_48.tga create mode 100644 q4base/fonts/chain/chain_7_48.tga rename q4base/fonts/{Lowpixel/Marine_0_24.tga => chain/chain_8_48.tga} (68%) rename q4base/fonts/{Lowpixel/Marine_0_12.tga => chain/chain_9_48.tga} (84%) create mode 100644 q4base/fonts/chain/fontImage_12.dat create mode 100644 q4base/fonts/chain/fontImage_24.dat create mode 100644 q4base/fonts/chain/fontImage_48.dat create mode 100644 q4base/fonts/lowpixel/lowpixel_0_12.tga create mode 100644 q4base/fonts/lowpixel/lowpixel_0_24.tga create mode 100644 q4base/fonts/lowpixel/lowpixel_0_48.tga rename q4base/fonts/{Profont/Marine_0_12.tga => lowpixel/lowpixel_1_12.tga} (84%) create mode 100644 q4base/fonts/lowpixel/lowpixel_1_24.tga create mode 100644 q4base/fonts/lowpixel/lowpixel_1_48.tga create mode 100644 q4base/fonts/lowpixel/lowpixel_2_24.tga rename q4base/fonts/{Profont/Marine_0_48.tga => lowpixel/lowpixel_2_48.tga} (61%) create mode 100644 q4base/fonts/lowpixel/lowpixel_3_48.tga rename q4base/fonts/{Lowpixel/Marine_0_48.tga => lowpixel/lowpixel_4_48.tga} (59%) rename q4base/fonts/{Profont/Marine_1_48.tga => lowpixel/lowpixel_5_48.tga} (55%) create mode 100644 q4base/fonts/lowpixel/lowpixel_6_48.tga create mode 100644 q4base/fonts/lowpixel/lowpixel_7_48.tga create mode 100644 q4base/fonts/lowpixel/lowpixel_8_48.tga rename q4base/fonts/{Profont/Marine_1_24.tga => lowpixel/lowpixel_9_48.tga} (88%) create mode 100644 q4base/fonts/marine/marine_2_24.tga create mode 100644 q4base/fonts/marine/marine_3_48.tga rename q4base/fonts/{Lowpixel/Marine_2_48.tga => marine/marine_4_48.tga} (66%) create mode 100644 q4base/fonts/marine/marine_5_48.tga create mode 100644 q4base/fonts/marine/marine_6_48.tga create mode 100644 q4base/fonts/marine/marine_7_48.tga create mode 100644 q4base/fonts/marine_2_24.tga create mode 100644 q4base/fonts/marine_3_48.tga rename q4base/fonts/{Profont/Marine_2_48.tga => marine_4_48.tga} (66%) create mode 100644 q4base/fonts/marine_5_48.tga create mode 100644 q4base/fonts/marine_6_48.tga create mode 100644 q4base/fonts/marine_7_48.tga create mode 100644 q4base/fonts/profont/profont_0_12.tga create mode 100644 q4base/fonts/profont/profont_0_24.tga create mode 100644 q4base/fonts/profont/profont_0_48.tga rename q4base/fonts/{Lowpixel/Marine_1_24.tga => profont/profont_1_12.tga} (88%) create mode 100644 q4base/fonts/profont/profont_1_24.tga create mode 100644 q4base/fonts/profont/profont_1_48.tga create mode 100644 q4base/fonts/profont/profont_2_24.tga create mode 100644 q4base/fonts/profont/profont_2_48.tga create mode 100644 q4base/fonts/profont/profont_3_48.tga create mode 100644 q4base/fonts/profont/profont_4_48.tga create mode 100644 q4base/fonts/profont/profont_5_48.tga create mode 100644 q4base/fonts/profont/profont_6_48.tga create mode 100644 q4base/fonts/profont/profont_7_48.tga create mode 100644 q4base/fonts/profont/profont_8_48.tga create mode 100644 q4base/fonts/profont/profont_9_48.tga create mode 100644 q4base/fonts/r_strogg/fontImage_12.dat create mode 100644 q4base/fonts/r_strogg/fontImage_24.dat create mode 100644 q4base/fonts/r_strogg/fontImage_48.dat create mode 100644 q4base/fonts/r_strogg/r_strogg_0_12.tga create mode 100644 q4base/fonts/r_strogg/r_strogg_0_24.tga create mode 100644 q4base/fonts/r_strogg/r_strogg_0_48.tga create mode 100644 q4base/fonts/r_strogg/r_strogg_1_24.tga create mode 100644 q4base/fonts/r_strogg/r_strogg_1_48.tga create mode 100644 q4base/fonts/r_strogg/r_strogg_2_24.tga create mode 100644 q4base/fonts/r_strogg/r_strogg_2_48.tga create mode 100644 q4base/fonts/r_strogg/r_strogg_3_48.tga create mode 100644 q4base/fonts/r_strogg/r_strogg_4_48.tga create mode 100644 q4base/fonts/r_strogg/r_strogg_5_48.tga create mode 100644 q4base/fonts/r_strogg/r_strogg_6_48.tga rename q4base/fonts/{Lowpixel/Marine_1_48.tga => r_strogg/r_strogg_7_48.tga} (55%) create mode 100644 q4base/fonts/r_strogg/r_strogg_8_48.tga create mode 100644 q4base/fonts/r_strogg/r_strogg_9_48.tga create mode 100644 q4base/fonts/strogg/strogg_1_24.tga create mode 100644 q4base/fonts/strogg/strogg_2_48.tga create mode 100644 q4base/fonts/strogg/strogg_3_48.tga create mode 100644 q4base/fonts/strogg/strogg_4_48.tga create mode 100644 q4base/fonts/strogg/strogg_5_48.tga create mode 100644 q4base/fonts/strogg/strogg_6_48.tga diff --git a/q4base/fonts/Lowpixel/fontImage_12.dat b/q4base/fonts/Lowpixel/fontImage_12.dat index f0d652e044f812eca13c22b5b5079e8786eade9c..53567ed67f5f5cbaa30430d8602b5c7f2630f289 100644 GIT binary patch literal 20548 zcmeI4O^9Sy6~~{SlT0!?i>Pr>DNr;{&~$1aixrh7SeP!QMcU~YuJvei#Zu(p{ELgHUV7r0$Mzn(_rA|xx%BwPpWX4s zVcErRS1(=_yY=Cb$m4E(?AC`@!)|?eB=WdhAG`J8)$mSSAEzY_<8XcKDSdAJAG*V@ zcHQg&Uf1gRJ-u_`yZpPbzZ6OR-J=oeK60;USG3o`fk^`x5+rr z=Pc&a@ip^xPviFb;GB_}KD1%~4C^cX8?|02S zuV>T8T0`HTZi<&RFB9*$nMeGxzpKRicQbG3Z>OB%@2wi!@-gJm3*dcpA|AZ}-e)J` zt$TrZUk>xAU5umOUuk-uY%8F|_qde(5pfmmbsR?~q52fk%(op7#Nr z^Ff*En=7Y>vR}xis%Lr@`W|W0H?9|Y7WsI3A|5>p9zClbzr44|`$_IMnb)DX5yLxV z>^Y|39VOl*pC5>|O1#+T2kiZl}!>8tbTf9Q+tUrK-dy=g|@T)f|C{B}s6pD(uu>o@c0f9Q+#Ki^+C&#y3eD-ee^%{#roeSfAidm_{shyYpZAS%^I=zQOodd)7Zv?lh+5e43GQ$7_Y29 z_mz38Wq6+vFLwXt=X19A`#eW2!@EDMFW*ZVkG&r?!@ONP4#oSU>}6TKzmz;06U@ncud9*I2e>iO-h=NxIP=bOF$?s)wOj9>r1*K@hQ^1ZX|uedj2e|6~{ zy1!aKpV4Q#KGyp)e&HjB_h;6K`OCc<{$2_D>-$mX`Tf4#UvmAJiS>#`z9SLSXIh5W zBb$TAJq_2R`29JWIPll?S`6T^$A=fYKSxKYFVDeaPkvov?0Eq9rWUJVKA5-rEo$)h z;{8NpJ$_ub`}*)5zFp6k;$S?FkKG^fSz4dRy%NT}>7!=2-+CdWFUQLK_0O;DcdW!Y zl=0d9HCf$Xv~1F6_jG5a3Eqb_{yN0-`sH_1FL0<8t08I`9{1;b#u3xkUvJJbebh3% zFNO6H_bI>scXB>h8|ZsTV=NzKy`UA#^}=^^{vhVhHP++DxtsE9F<@<=?@5in(pcva z|9(C^-!?}r!$TvV*~NIJzWh6uFvR++##0)n;8D}?VxOOu`JmV5e4vk-{)7md$Nz*~uPBzsdvkFM9BuLpj1-2bR$c+@i2^g54RT5TAQ zyz)%m=BQ`qpf)T_2Ka}e;0{Ie~I~vZ?+aJejZPo zTglg@?1n6MJ+Je~F}&FQew{~uf%iF$_59X(^Thj36K~jGh~GitJsaXt8yE-c!}F2m z#2_E1HU2|m-CsYSpM?j97+AfqKHz;^<8g>rJ`Z(&?RhA<#n2af9$MzZ>zR3D&BVGz z)|THfZ=QH<`5p5P5-*nDll>(h)Xbe4{}akb$>Tc2^~mB!?BIQBA|Cp%J7m;Mz5Ysl zzCSR1u=Zs9?F>D2dmeiYEc5mg?}s5?xjy`TULOl_&dIKZc%{E^xCb$Pv`p z-g{d=_5G<`lgaNw#vV2He44&#_u{$V`#q~&JJ83y`5PLyUmqSns~5Dvqn2a-o*X~& z+sVl98D3Zap0my)hVa_@{m@_ZQ8Vz``aL|%;s@_Q#^2Ax`n~rPV#D>X`g#_sp2-#(Am)FAWL z`{0pZ{swM)e~0yquV}>IM<(JOB;L~#@fL}9bpjr&nT+_IZ{qpq6IOrl_GCYmwbkF4 zM^50y>aScMzW>Ym_7kryzhfTxMPGY}+ zBOmZ$>z93=#me%5KFs!ida*uM`u{2H>$&JCANQ93KfIFX_0r?9uNUhJoA&or-dNwE eIOuyh#MASLxjkd&-v^(4{L&M0VeMr2pZ@|4i;Y+S literal 20548 zcmeI4J&0XJ6vxMpd>NH3q6k{NB7PR;MNkW)-og(Ag%nX15t0QrF`%2EQ4pJ3ib3b18&YOLeoPo1*cX;o&=bSm`%(-{p?osF5 z5eefK$zciKAC;uB@vL)GiF4;K?Ogfb#A{pcU)O9NzYi$|thd6r>2E2H7 z#5FDH?49ZSpvM~LasIUXgUIve=ro*fPiCK&^lI&Xjq5vFYdUwO7ro@$S^DvQ`T+*^ z4taIpeV)bZ`w!j7!Q{W0IP~IQt%)}eydSf8_&@5>?hjb^V<8Ux!Eaf-zP)jO?swu{7H1*-J}TmM^^3Lnd+B#wvbz6by$bq~yW%{e zxts^n^Qyq3mX`5)_68ocbR9fuDfWI-%){1XFSQij&->z0^S%F?S}NY(#k{WnoMI0B zj%d#FU(7G5)TuA5D=z}?nC86uLGr=Bx6AW2aT0jc((k0_cs$4a;`iOaz@wJt z@#rhs`o;bA{RXvwaZz)XRj-mR%k-;)elKV1M_hzlZR~}Q&3=vA$Np|=&f8yNjrTL~ z-(8ZsC9FG#z3_H4-^kjJzJB;G#WO6YSca9?|Bdsiz~hcHcf*y=oNP5m17 z&cyjub6LL@;p=JCk9A)Q@ZYzR3G9{QudCl2 zhU6DX*?x3+i@>AbDC2d{BWeNq9oAgN>&6SU0N(w@yl#F_3*bFk%Zat$8+OWA(FN<4B6-p9o}?o;WvQhlk!J0{tbtezjR5)T$~rkFR> zuNDja^7@1R^DAm8G2{Em#((bjJf2v zecMI6;eL?A?8k@2yp$i6IJJc5C7()G_aC;Rqqi5{O!AiG%OW1SaULb!T%30#W%(P= z-^5#pg}r6@JLHkS@XGSHyTAC4{5_{RFMpHoyY-KCe-@Fy==X4Oyrld^Kk^s-%JO$; zFZm0vEPsdbNB$CjW%)bYU-B3KmFI6a-^gEhW%=99k6Ik|oe;b+6(;0vx9dvkNb~)s?Eb*n5_F+T8l%k z_C*$NZ~dqR=*P2&JpJgW!r9ZVee*s|QvOy3dR4 z{?hI*?f%mG1A888&tvU*Z0ruK9#}oFdSLay>H!{Tf4QdM1M3g0 mKd}BF#en^O;pV?z&}Sqo|34D=`pSD-7q<0J{o1}8zy22;N&`Ru diff --git a/q4base/fonts/Lowpixel/fontImage_24.dat b/q4base/fonts/Lowpixel/fontImage_24.dat index 607e9afa4c427c7980c5e43ccbeca66784a5a486..2477fb9a5686331e3f5d6848b93a557268760115 100644 GIT binary patch literal 20548 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 OE?&?dC3rN&t^WZN5}J+x diff --git a/q4base/fonts/Lowpixel/fontImage_48.dat b/q4base/fonts/Lowpixel/fontImage_48.dat index 2296dc8bea00555276cbcc94aec5b48530db20fb..ab134293f26fec4ec4f09e62a34dd3c201125b4a 100644 GIT binary patch literal 20548 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 diff --git a/q4base/fonts/Marine/Marine_0_12.tga b/q4base/fonts/Marine/Marine_0_12.tga index aa57b0530d9b6aaff38fa9dc6cb20f7aa219329a..5842e4ab446d00fec5f93344aa944453fe531200 100644 GIT binary patch literal 262694 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 diff --git a/q4base/fonts/Marine/Marine_0_24.tga b/q4base/fonts/Marine/Marine_0_24.tga index 4d49eee869edd5ed2465860b27d8049a1f459d49..61c8883127a783cc2be83704db6e1f41a50c5dbf 100644 GIT binary patch literal 262694 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

-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 diff --git a/q4base/fonts/Marine/Marine_0_48.tga b/q4base/fonts/Marine/Marine_0_48.tga index 2f673403158c9422c618908612b2296f9e5a32ec..f0d178e26ecc619201360762efee9e414f6fc204 100644 GIT binary patch literal 262694 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 literal 262694 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°9VS!E`1W3cH4amGwReOOHI~ISKDC8+$Yt` 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 Vvcpb0yyE3s?fQZpUb_8b{|9Y0*#7_k literal 262694 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

toWkMGbv5pt8^^UATt#K7uQP4|yA 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 ScKyev+<%`Z?7G|IxBp+MpbCuu diff --git a/q4base/fonts/Marine/Marine_2_48.tga b/q4base/fonts/Marine/Marine_2_48.tga index 8c6ea38d2dce7e9a4b4716dff4df514a4131b12e..75cb7e0ce21213934d059077762a8acfee6a61ca 100644 GIT binary patch literal 262694 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 literal 262694 zcmeHw3EVAJap!vi0RiQSnlTK7mqenXAdAXqG&~nJK}B#Q85fXcToMUrG~*=EXeJY7 zP#`Xu$S@d14WNJ`x4N`Ty_N-CuQeb@w@ayKkTSZq@Hs zU!ST|=bWnlIo0>xUe32-#luz^z{cz^J@;2Xd{2X~== zN2B||KLno!ehN6s7dLhUW{m*WXx|i@|Ht&~z{_JW#MlS+JbvEYy(sJy-=^Uys2M_80U#zU=PA7+>7h5tuasap6bi-9N=(;kL^N zXdodwmdo(;RUTuPY75z zLs#T-mvW42UHUiLKvmGcM~+`K%nF|WF#rx^t0x7r=l=j$TR1~E>->K-#ylGQVeqHH zvDX06q@bV1z*MwaE-Y03BkZ=hei&>H2A>MP416niJ$Q26CI;&mTlBBV^FIc_KwAwm zlj-(MpjN9 z%b565v9)l9u4zrQ*2Tnzu|8w?FpcW4$no`9p8repzd3;U7Y&Y$a zrO%4NI>vT+xT56w9|K^ZZGrA`VVdefV%KE_RB{Gc(Ke4KK8&;On|jzD6g_?BZi7H zRbx~1{EtE~%-F&ix-L0bvuH{ z3S`g!7ytupEu7{2b}0uAJuyT7hZ;Uiqk2)~_56t_}};V@Ck_&G)Byeg6vZ zWKVA#bE5o4aP2u@D134U#L++h2LM~(J5{lZYZ#F0YCrIozHO0N4i3om5?1!$5rR zuMc{0?D!b8Si>!4?cc_n|HOp9`L9wz|0QG-uUOne?bY}cJ^w?&i?B0r?xczsvM|L! z7k3)0+UUZf)4&3{FxRu8*Q0Ih`A=Nltb)G8z-5A8Al%VrYJ7^G|IsM6Hvq2u{b%vr z1YMD3H_^3^RJB0gdJH~iUOR@Uqn)ImReNvNpt0vaAgaM(HwiAvKdG^626>8FH9kep z|0(dSYg#w2#G9Zis#`C0-8br0-xPyBTQj>-^TvUUN;IyGMb(wYfe_@QF=Ub|6>E;k zHY(@`YU~D!NsUj@^M3%e>*kes6LdxS`luYcxTgB17?fL?U8#BO_-I^-p+;942SSjK zvHpx@UlTL;`qX6NHI(0aaLAtj1Aq-&&3Pr>#vIhycJj>VKPa~>-(np=AGNWlI_+kV zkFoxYWv^nDnCQ4=T~Qv&Z#_6<&;J3yZkT`1|D|(;UW%Uo;@mmFlALs@LHGP02I-OW z|4NK6`ST6_6rVX<3*ZvPqJze=zov3&90;EO0=rn;L+v%_#67gF+l3;qn!Kj4zlHmE@0mrr`fL5+`S+3+*gKgU| zW_?qCEp-*&%mEsdE&WRzU|J&2f3ap7AfBqKg!q!+`9Bq+c4I&**SaiMa;(AD?z~0Y z)L%jj|FMfML3?XXGhHRe8f-g7*3@51UB$Op2U_}< z>l~&fT9o|%cq!^7f#-nz!M_5Y>kE$!c zTP&lTW~s*asnuyl>t0z17?bV!AC~`*26nd?`0;<`?hLlzPD%$KKWX?swJNC~-I+!N zjLG)=56l0*HL#=Vzkw&ej~anbpb~!a|NPd)aUJSf_c^m{5(v#*2t)w$r^)lbJ^v5X zpk?ysa9jzVm;9%nJO`W(*7P70F9A1Q>oMyBm!6v?fPkKK$e#brYknJGbfbYAb^J|G ze{@()(>VEg0W8g*A?O?I!v(qjj$=1oQ+CATMhEUuxlc^~6LHS6K%rnV`?=)N=~P&2=M zs^=~LW3GQNN45qZZvd8b+*}p#xs4g$DMoBmy$Ni#Z(ea;n-T)X+{UbbYyNeYN#}uf z7IK&PH@EspX`U@#;IlP$(WUNg83-72>iHj@7kU2hdYPt;DgPNK&jGx@Y0*2N%&{<5 znX6Joz?e+Wf3cS3x^5^x&B8I&InVuSh^NS9Wy5p8`;1tr`eX2W*Iz9glP$E_9VZWz^cS^d*n1anyiqU;(M!=X<&wm4y02SYr zy9s2xSO|C63| zcg_)5Lcq$^2;Ik2@^jDpU$@#j-j0AHkRAe7t_JEJ3p@U=FG<`tv+~(bos%Qr2&9KV zUA_kB{{%LY_{{(IV9)>brrAAm1WW|#^0h_J{l0DnOF9XHnfuf`IRYsnkgeH+ar_ea zU%~thI}P!3@H+6Pz`KJ}47>1&{(<)a^M8BX0RB06TH^15Yr$uL_XHQ?rBI+h5e(B3 zMZF)ELcH!nJp!27Lrb&UufTJ`uJxmjUjzU42XkNhp@5>Z|7AE9x`ef` zcBqA)_50D30fvuX9yoq>e^N>qz#q^5lqO_EU$7SL-~tsCv;UQ~UzF%-QvBwK;k6D8 z4{uctxBdUK`<4C0kTnj0n6C)GSnqX3IlkS`x$a91p*;zeQ3O0P747&xv}#Ld%cEq zmr1RCjlOoaA^y)O+xJ4&vFEZf-H;Rp4SwhT%VQ;$nD!cPm(xN(PcG!P^SgfT#pt4> zN^0$E^h=&D33c&58Pz9(Zv)>8el%F-i7cb4L`h))&!n$yhLl9(RimOXTkA% z-Fh&u1z!d}70hR1_VVKbhK!?+zK!^#>T(F?``mf_efThDA2Qgi?D^lE+cH1u${N;r{QUn@ z9fXkiS-Bs$F8)G4=GqP!Tf|gXyc!ie=NB=_a>y7d+ZaK&N*E|#t$5yP#GqAt#(CeizEXKC9*WJ$3=l?sj^O?L3NBwRDpM`opxOPpXJoofX`Mw$C*Ms#tFg!nK+licd zd~NE10&;!z}9!fAhHBsvXbdf534S_z*Dv&ygga1D*%Y`zRe} z8CRFFYWzMy28i-M*VuI#GO0EyPKwj!Kkti4J~pX4KDTF?8*4G z+TTp(y%G*xo>F}*{ zKaC?)B{DG>-os%>K!m)eGZgV!(KCjPV7lJn-;0L|KI@m)%y*g2%YIwKAFgFy=eBbH zr_k@3*_dly)%^)%P5chU-_ZR!K0t5uv4){8k!d%8OEc{f5i+h9fxiIe|F2&Uo`!f| z_i2_*fUKj>oj?!3FQa5pV=XLcsHXB;b8mM<4+NJpU7z1b4v^7zu%f z{MYxz&36Dsa@&V>1RQ}L5NODM-piEq%MdEp0D5r2yKn>?fsqifayrxT`mLnrK=Aw@ zX`XyoM_>p9tenntydNfs_c%QNhnNKK(-9a60V}67oqoQN_eOt1+mGb759UfP$?+wG8-w|B22^b=26U3sam-U}?(84(#Jmg;D zM?Yee^osNk{9nL)Utg1XuNy|ix)}$GVCSQ!>Bf*ol zsbZ1)XB@u?oh0s)RKX$DxI+Ds0cK^-e`B7lxo^{j&cPUV%J=;sbDt7T$3Rh8^O*SZcf;(i2l{Cv0Qd?@*wpwxe=SZF_mydGsq#djGfi`Y_)E7UI;U{?107xOFU zI<_1-2V>aP#PTZWne&o(PB;jhuX+B@^Gl_HD02^`&B3{CaU3JYkTES^GaU{kGXEE7 z$QUWxlpQ^bkC4uibwC!>II@p+aF|5e=Ynr)Q8Z=U}SzbhQ1i1(U}n|rH`r%u|!2I&=%zpUGHV+QiS1x=YKO+JQpOr z_bvP@)^J1lUCm)`_z>z>HncCs=w-1E&`E>uI`kqI*=7KjX4<6=GEnyXZwKn{W;&6P zgUL1AQ2tHSSmTy^2%me^|3i)4e!q8Td+ZSYnd@2TcSiXq;5xbt72AT_`kB=C=z6bR)%efnnI-WZ z05i^Bof)As8Dv&o^!)D(hn zYe4E|J+GnTNgqY|MJP++vw&uNq2r`#Cxgt&p8qv-UAG1@y@qlg^M5Y{VZ9T`XM&Cb z^By1XZ)oCsK7207%n|BSr5c~V480`&)-hvCHLg&(&7D{H?5M-twRS zvzOOCH1QqSSA+BQzbVRRYa_^)f*%3S?Mlbc^*C$0%-_v%+zxyoSm!=e8~z`-6i+VC z+TXs%V{nRMuYbvFVR?DWzWp4kKNUO0*!a0#tk2AOy8gEYG2F}G74g~MSAg}}=W~AN zDO-w{fVT!~`=O?9>VD~T0PPK%N=($vI|anv#bnjI;L;_yz&1(m4TBi+^}G+t*89JF zhT$c`F1OE*{LDNbtmz^sD(8Sy*MoN6kWYm!kGXP8HLg&B!zQ0)pi}Jw%ZSsEKtJ+Tf7ernAv9VFU_9f0!{_DNo`obXZhv$Nw$DU_7KK#ko zYRHj$fpQNZNk4{AyxWIzV?T226v}P>qJAA%(ghG2W6bKgH_}gJLzMqIt25h=jfe8J zFL9po|Eqlk-O$fTW6!f3AAXu^(a`hVckbt5(Yv4w>PL>9Lb=6n?t`X@d!OzEZj1M2 zx*=rlCso-GCGTr&JZk(s3;JpJHDkvWIzHmOO<@qb|Cfc6>T<({q5jOm4$if$^mquUJ>zwS1vy@2c1qSBwDgMfUsp_}Y=q}rC&`skCa z9BAhOlP@0W%~c@L|ta&6|K;iu<+&AHl|zZ#u}b>8xSHw2)+7x8xy_sIUf z3hsN58~^|B%olabfbh3;eiHIkDz?iZUnz8TpX1yMRsW9Uy&p**g-{u{#nr*9rGr`7 z^WT^!Ywj9!8rFHre_r#uL zY8$#vhq9B-MV8;JW0CSu{`TFk5%VJFKmU*4tp+9s%DF{(cd)+J^*&`&tnQz;Z3?^81Z8FVJn0ne5CF<=;L=47~TLW98?a zq;{stds*|uW>y-{F5=AC7sX8lXte19iNA~PuQM=GJnrYdJhEIcV7OMG(wqp zPwKR9vzC=#6g~g#In3uWo)B$k?sLydY-e}9u%DjHoOS*MD;oIX- z=5>BaJbx9wtFpYFuYW61-ci}-{k#!+N#BMrscUt1U<2t?R$jFH*U!215x<7@%7Ldb zs{4HHWk>!V)%0B`_?sYKzfDIz`*Iyv62B8{3r=E7P-fir-LdQp(x95Rp$3Eg$U2eE2)Sp?{!MS{W?}@Vh z9OHexX9}C#w(0o0u-8=lhMq-CF=N0{#=>V7f25q|X92$xG{t(kYLkmEZE5$}+%P+S znD%3n@~JOz|FPo=9UlRIwXdKX`Z+n&pIO+!Pp)r%zVmyiroV-vY5iMu?CX1~BYv;m znSG^3^a=bzu%^0uoigS(=thwL6}%}}+UfGasvWNbZaFqK%BQ}>dCLET`U<+HpY_l` zdF*+X5$m*J6Pg)(U&++`OmrD56ty&1NZ^(w8ZPg*MQFe^E>v~(_9)K{_yvxUW-s|`0wDR zwcl39&reM+E)AZ500*}R>+3$ekI!ovZ85U`Z@@Y6_tI)`NIU)}lJus-eU=|A&wk4OG51YYb^c<-N-!^lG^)8&w&wt zR~2La8h8!3goz$ACD{lzbpBVN?U_dVT(uU39l$AtTk$1#Rvb%nNB=wWqUHYs7m4tD|?fAjPA?-e@eOnwiJl{J@=!tlE;{vBa^v0+aY_kcJNZ0;YCQoPz1ItlMp@ z`M)J%Jqv8nJ%)0T@_%0={;%jYmy&Gwo9F-TsH?2u%>FJMUk%o4-jq{{SNoF1BM&-; z|1B%CvcCTD3FvjZ3U+$z6l5c|eExMjlz$a`nbC%-Yrs!2>J};gdCi~uK1;eLg?X;? zK{}e1{~5>Q!2E7&(S=a%2)5RTsjC}11-%iVjNuTY{wnC60oI>&heIdZZfyDgOvHCH z*rKmOxhd96dP^VV|R*eU3Zfb)2ELLI;7 zNaDWNJA-NSN?Cz2>z)YC+iy(y|60Vg9&FJEpyYj_JZ^2XX!(Dw0^t4>)_I)|%GWya zXQ-&V&Xv!5?Xhm`6!b>GjN{?p?;CZ8K_}xpN!eThIe+eBW5|D=>))?p%tf9LUJI6Z zu&im(^8aoHz>iW`=XE|PUn%llo<$cxxdT|wcdJ}Cb_#kUP{wnbp+5yW9V`E*#U;v? z&x6x$-t(XT=i>`1wp_dkg}uNU56YSrDgXK1P}ABJ)_I)|+F8h4xBM-u&to*@_kbh7 z*1Xs1>c&n%&!7|?sbq?mf|=`9jMlxum%(=g7yd=Dtyt&q0|mts=#b0N!n0z6ON z1};$w@oFDR4lW6N&cpiONUS{#Y(C=!eU1-`C0dmHe<7mQ*Zv=b?$;_>-5+u$ZbAn^*py7%Mb!M zYf>CG_WWOsNcrrmJpbpx^V(<%(_HIA?x;A*{LklmH`HG#Y-I5q2>%J3+g6UXgC|fS z12M|)Y>LaM`<&57p-Ld!iVKBv^##7?5_%5g+-sV*{O9jpKHt>DoaeRRAA{?N&x~ye zu3(;$!f@Wof6gnfYx8_&T_5E4MSX3&I1i*0ul5Cg*U{%u!RK6yI0DMsz~*YONqX!Q zWYf`QwGYRtIPj<4e+zz2BRHS+z;Tf z;M{f|<7XVahg-~_j;BTD`;Yg5D^xcJW9lnTE-OBZ;@05OTn5O?JuH&b%Lmj7H2%nkl;Z;N=n>`-vAZrXepv)%}R*Z+2x{&y(zx=4k_jI(a+ijzy< z@7@J{?027hzIB%yWB&8H9Lz+HN>&(a%+R=_O z-x<6f%y+@w0OtO|BS#iCJpBYe7knQ0W-#|W>O$Q6>P9f%0p9~0=73wx90AS^n0xq1 z;vQd*2TyYjI9_&`mHGb=9y#+M0|zwx?L)=Ak{%Q2!l-8O^MF1AR(-68{M1nc^TBHo zz}zs$cLFo#C7lbQYyNW&u)AbuS^2-R&s53qw=dNxsm3h*La-P16|m~(R5^~9(?J09 zl;`+gs5zs!kEqY>LXM{zeSIVEE1l@eo)|ud?EfbBhPwcL@V$9W-z$%lrUa+;Ih(P_ z_(ID%{_mt2v3rGy%JX?El=+)Y68AI=o%7u8Y_!q)0`m9ZF5t;nsiF@5G{x+HlH>SP z-3jER_r1yI!}1%tJg%6d?&_+13_qrYfSOccq>8Q)beH^JY4o!$)tIGUhTmP{=RE&R@pt7o z^HfG0+_&x@!8!3d*^9u%dY+=pe<xb&yxh5+B2N?pbU7{{pBx5%<3=VKvM6V#YF} z>$3j$H2OI+#*eXV4Zpj@Uz+QD?#GI0+Ho`gcfe8pHfGKqn8()f$o4Y#`CI!xv#(iF zjqiU2y(He#CI;r*X8Kpk23eWclPhgz8DGp;hX1kG|GtVo^nTx*=F_x_nzvut* z`h5!Uxl>@Y9%cTYugdxk(D6Pi+vju#3Qq!0`kLkZ=VPklqafb~mc(oNb+K-ay6dDd z%KQ$&?-G?Zvy3lhEam^SBCmm70{$&5cbiXr*4OzU^rxdNNnX=?JSrZP zl_*~XuET7i@6-Q2`%-aG?6Us(y-Cxe-T(VE0FZoQpYt@!z7R*#TK=e-Xy!OS=VhBU zko7g;4=WpKKg;k+6-iyb;qMDiO(tU zTBxRzp{R{3uNx|sY5Uc|K<={sf6eM=THj{T9)3TheD4xJ=U>wgX5s%3V<3>W^~~RV z{LU+h=Kx+4zgH?z=CgIYSJv3)5OLJ?+2%`DzZs5KfhF;trKFo7)L!#LT@iDgFJtRv zFj+bF{y*QN*7r@>)n#MH7BW8k)N^_dbo`DN%V<)fZ-$JYq79-b)@?(X_sg#=MO+p5 znYjww+TSd32=OPg;kAt>dMzqjW1~%~)D+y5b!Vg+v-ArwuAMT@y5=91m-C|h(flqkY4cSpc3-i@G()`Ls6RaF&2KsOsN)liBQDNVnh`#UG+-t#8!{O0twg1ieS zXWr?%pZWd2zjN=M-qw4@_mcha!G88*y=kUFzMnH!`vV`FKehtzw{CqG%Qp+W7v1u`Q?hjJ7vqn0 zJ7%)mOuFv6?8kXGgfnA2~Oi{@5>`@sHVWH|V>k*&lyFyf$8|E0q|KJnruiAb{a{XJpag}_LAASe^6^DMPPTxMS?T5s>)6I+L zOODpR$d&rZHvYtGpAm0*Ki?_!&oH|3!6RO5t(8xokgsv=XRv=a{$QoG6G7jvYp#ozSP$%X zOakwzY975gOyg|^-VdvJFQ`udnYBanSd{Y92K|+3#48@8N-XCj;+s7mxg6aKw7h zU2B>Rao7)@bMdHiU0$qLR{y55+f3s(8n0@UU$z48kDB+yE&F$Iy_yBy-v{FD2Htg4O|%k>=I@oFBqmh8v%7v9-w9{GXJX1}Re>_1>$)_m~zo6k4)3*_&g zt9Y6H#29I8Y8H0xDvu^ctC&)*wDf4ps&C5rBg?vNwSLjQB1+TupO7#UE z{T1<7*I&)Y3;x*D@cARRAAW$D>H+;4`quSp^Z9{4$d94?aV*GJ*Z@-p{Ie^YRhT$mfe^`bNurs|VBq zhV_%}epR0y71Q^;hkf|#SFc{x)b^+73g7nUHtt$}=hs^Z0dBiV09oWmObsN(hO0rKr>pznVN z;;krN;N7bE;QpPL?@-`<$i*W*g00$m8hNbiK-a*#$HmLzFY=N}~dT#!h1>Q^5yuN&mbVa_KHP^}4 z_s44BePAFS_al(+6K)>;GB)F&KZyMc>$3!j*L+}}W7a>OTJ-d|DcVOf7g{|E0|n%4)APvG`>S)=~%IgPUY7V8TE){=L< z_Z^q^>*mKYUP{kHm+`WUmt{S@{`=$0{8;A4GC$tF{AjP(;UD_(xOcUsY3TjpT<$07 z=NTN``-!&3^E~?9Gn$XM`d#|(C=)#TX9nwf4iI=h(tOm#%jJvrH%z`QF}PpC^J(An zBjm{UAAC0X;Bmj?_Zt7yIJo`h<>P({^7)>BU@P`79M})J7_8g=XhpVTfAl`hW%*!r z{maj++3!GK?w4Rg_J(EN(DfdBb^QUKcN%PMCb=dW+`IazMp?dm|3)mLtL@*=cP;39 z*rhM`{q5Z34|w)GfOzJ(sM+^Cfb+WffxhYaLL(0P^8UeDm%eYmKQ2iw{PFAmiG28? z8!y+5?m z=*u&yGViU3mu`K*H{^%;h>7W1$lENu9yi?_J`O~t@|mo)p{uS37C zzPIV~YFZ1dRn3=O@-60ZO+&WzYF>Q5&SV}3-dC!5=*LYy@(tV3kMnbxmwajUfOzRV^AdyjgXfFCGLQI!=c}h>9`Ogy7k|0^qQ1#~ z#2>t|M%jL49`Oh7go{T$FgU2sF@J51_}dVN{C(QR zj>Q2d3E%eW?eZ z((KzWeok&bKBt((e(=7hnbPdxq}qG1&OzAVq*sITQOycG?2w-3alp2GWxis6m)kG$lKqek-a{^4o*&qb`e!kYOvE35ALV-=Za?|pCHaUyc&9YV z`X<|3e(*WfXXGRP;B5}TBWH=1FKMg}z&jCm-*od9+YkAOKjib((=w0vgXe!AGwco8 zeytxb$VdFa^SzIWd|h7juf+>I;twA8h~8|xz$5NH3q6k{NB7PR;MNkW)-og(Ag%nX15t0QrF`%2EQ4pJ3ib3b18&YOLeoPo1*cX;o&=bSm`%(-{p?osF5 z5eefK$zciKAC;uB@vL)GiF4;K?Ogfb#A{pcU)O9NzYi$|thd6r>2E2H7 z#5FDH?49ZSpvM~LasIUXgUIve=ro*fPiCK&^lI&Xjq5vFYdUwO7ro@$S^DvQ`T+*^ z4taIpeV)bZ`w!j7!Q{W0IP~IQt%)}eydSf8_&@5>?hjb^V<8Ux!Eaf-zP)jO?swu{7H1*-J}TmM^^3Lnd+B#wvbz6by$bq~yW%{e zxts^n^Qyq3mX`5)_68ocbR9fuDfWI-%){1XFSQij&->z0^S%F?S}NY(#k{WnoMI0B zj%d#FU(7G5)TuA5D=z}?nC86uLGr=Bx6AW2aT0jc((k0_cs$4a;`iOaz@wJt z@#rhs`o;bA{RXvwaZz)XRj-mR%k-;)elKV1M_hzlZR~}Q&3=vA$Np|=&f8yNjrTL~ z-(8ZsC9FG#z3_H4-^kjJzJB;G#WO6YSca9?|Bdsiz~hcHcf*y=oNP5m17 z&cyjub6LL@;p=JCk9A)Q@ZYzR3G9{QudCl2 zhU6DX*?x3+i@>AbDC2d{BWeNq9oAgN>&6SU0N(w@yl#F_3*bFk%Zat$8+OWA(FN<4B6-p9o}?o;WvQhlk!J0{tbtezjR5)T$~rkFR> zuNDja^7@1R^DAm8G2{Em#((bjJf2v zecMI6;eL?A?8k@2yp$i6IJJc5C7()G_aC;Rqqi5{O!AiG%OW1SaULb!T%30#W%(P= z-^5#pg}r6@JLHkS@XGSHyTAC4{5_{RFMpHoyY-KCe-@Fy==X4Oyrld^Kk^s-%JO$; zFZm0vEPsdbNB$CjW%)bYU-B3KmFI6a-^gEhW%=99k6Ik|oe;b+6(;0vx9dvkNb~)s?Eb*n5_F+T8l%k z_C*$NZ~dqR=*P2&JpJgW!r9ZVee*s|QvOy3dR4 z{?hI*?f%mG1A888&tvU*Z0ruK9#}oFdSLay>H!{Tf4QdM1M3g0 mKd}BF#en^O;pV?z&}Sqo|34D=`pSD-7q<0J{o1}8zy22;N&`Ru diff --git a/q4base/fonts/Marine/fontImage_24.dat b/q4base/fonts/Marine/fontImage_24.dat index 607e9afa4c427c7980c5e43ccbeca66784a5a486..eb3d3d28dde813e8d8b600910801d1ab35189e76 100644 GIT binary patch literal 20548 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 literal 20548 zcmeI3JBVCW7{{*~UwP=}X%LGkMF*XPs6l*8AsA(SccNsrh%pj3AqfapQ(B3LNDzy~ zLM%iqL{d&^xn&TG#ll*wh4ufN?|ge7bC-MO?5*S+I61pFGr#?R=X;#*-q}4~6vbgp z#vPgugn66`J7e;EQT(7;6dzn!zj6J^*Ve9GTEB39bpG_2CvIF^+j(74?9eH(%IYc%g3y>~^E;qijKTsMECYbIg2Vo=TK3do&6eT zBa;D-bK^cuzoswYDgH*RojlH-YJb3a#+L*R~v%vdHYux^|@s92A3Z3KFdrWH_kG*$a;$M90 zJ~4lc#ls)(p|#V$O?~j{@iN~-@ox6SoA04`x1)GfE!c}*`YWy%#US)Uk87QY*=?`i zU-4Ra_<~sBy7BPGY4OfR>0|G$_ck87N`H)kzGt-JlWu)?hWGPY^f`;`>c<1`WvyRC z@#vGoz2BVY`uv*yTdXbJYwgq8t*VOxN7G)fuVyd$@GtrfV*AqdU{T*7@P<9{@G<&U zd*b0^c$a(N;aeu>M<4#hxA6Xq<~8pJJ%9ZkQF$Rd$=_$A>?Ifcz18!>>K_q;Kj6I{ z&GYxdBi{~bhHGMA?;)+RnZz*JrLQ(C+Cuc;4q*}uTUzu#-^Bj4an#3Mh_^38ic zt5-8|nB+%V{UcsVd+`OlqgvB=^?Hgg;GIh55ij)9W-q>g_hvG$ZZE!ocRiU$+?D$W zi#?>@jf>}I{MGXV9(zcx4Ye*G&+HxfT*eD~2roUJ>-MsT*qav5=qvrp-ZANk()RC! z0QlJK9R%K)WM19B-omsVe?_lp=NiyRQ7&ePu*UwYltz{q#lrS z-MnTz6D!nI^9Q_%<`K=bc!7t_rGE!vQD5ThZR#U8$T{O-E4(+7d4B#H4_o0~OXlH+ zy1i(`-c`-z{Xu>(%l$*+)0%1iKwIfwv@ze-Ow)(GWlW+C-qk(v>i&g^f79%xpRC`% z!Q=j|4<0P$r9J7R_cQ;pZ}2{e<~5&RofM0hw$FP8;%unaQ%`@?+8uw~hyT01z0GUs z*U&}3Yxn2Wl&SXaeXVi#=cR4s^8@ekEmo$|bxypvez$qQ;Qfa6)N_5}v4>wp+1tj0 zX}qyG>>u&>OAkDB!Ml>o^L#UX5;`CFWT4sb@2SPl&ztu8{X^i*ZM0`YX*|C-G9JEV zaBq~xtJ^yZyscy&^$%vSSAJluXid|Hz2u1T$T!BYCm!*~pf;!J!@s4y#2?4tVid*uKoT-L_9bAE8JKdH1Zk$^7*mIn+9G>eTmRV zZ7J&uiZ;Z%Dt#^WrG>}-`(9C>T_4wN%!0n(lk8p8S14A{w|^cx%lZQzG3c5t*NB&g zlX#7KB{De&@3ABvxl#AWNF3~KdEV6G5A1T={P|FsZ~D)9KScb!nxv2Zndv{n`udyV zy_>|t*1A4w0{T8m;^B|_{!v@lzfY5Rjd%&Md{*nGnBDnHuS`xbyno^I6t0_{3m-1^D^g0J}>im zna@j)fm{!AJ@8n_{Xy;zay`iPAlHN3A9xJpdXVdZ$3pH8a(}Q)Jy6_??RSRx_mz*= OE?&?dC3rN&t^WZN5}J+x diff --git a/q4base/fonts/Marine/fontImage_48.dat b/q4base/fonts/Marine/fontImage_48.dat index 2296dc8bea00555276cbcc94aec5b48530db20fb..3fd55d24f4e917ac62633922c2a33bee5e7f8207 100644 GIT binary patch literal 20548 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 literal 20548 zcmeI4&x;&I6vxXDHR2khu5nDN^+sVzsJ1#tVI7!J9{8r@ze8Ea&fG z@%ntRT2&w8Uf;0Lch02mAzfAFJ)`$KWQ=Rha)xv3>c_7#(iPv0=g*yjp@^$rGx6s1 z>FWHEFY_|Sy*}c5Tl&^b@#VS)@@wn!=XvOZhdvvxEuYco^O^Z09)HP3vhMkNRG+Ep zBOXu679yn|RDUMkD_olcCLzp^y1{QT+~+zq4K+iRWu{ zY<*7im*&scKHGkt^5y={7nSx&qu#R@g|@01U$yT2jlB`0!FxisUFOG*6#K_X^_gk^ zVEbvJ}mp=0>A5<%OFd6raJso{-nRv~3>=)#Ktc;P)E#eT1k4(G}ORw*7v4{oZAy+;V z?{nGa{pD2mIu80S(cgh&|=QVgQi}!^|UwMDU z)$oW1Imoy_?~cXUD&8Fv58wQ~L0de?74)4}Z;J=#d+%G|@t$#?EA%(Svz_nJ)~3&o zk$dR7rv4L?zs>bQu28dld|@$vU&;P9@tW&{wYDVlG0&t6-fQYP<9FwClb7il>O zQNf#qzhnq)o91ymy}uoue*UuY{H^9W?A$MAUh{sCT0p(`_k;LKj9I_jqj%@??#Z>G zzQAL=s4rr{+b!$nvF`n~p4ZoV#(X_MUnaXHd&R^HzIh&dB{|KwTF%gj`V~_=y7djk zLSNi|K9DH(4qsnj(ax#2<;x5DH0zbdesriX#*3!7F3Uchj;|sA%JY@i2a$Z?{L)fS z4ZQk#%N5F3)<-Y*z4rXdz}qJTXSJY@eBr#-QeO-_@&#t#5tE*HE%n8~tJhP3^LmQE zE%n8~%S7Nj?e*pLK&+o-BUxj;8F=IgF)92d2IA~hKMP)-&*EK*=CSuuAH2R19NEXR zmicRWp3QZIZ~6Mj^git8%pdlH>|5F9=a0Dy`2uS!`&|~dJ~Htd@s+Q{x2Jyd`d-pC z;eG*qnK*x_UykC{^93F;{!RVaC?3xz>hni@nZK6!8uFQ15Y8`7EHo~ux5am$>#O-v z>SJ6@9OAoA{lDrr9}n^+)GOu=eebEa>1*aQypS*G%VdkPxcK(P8_0?|5C@F|SzLU} z{WtJNVzK|m#W$0-5MQ(rk9XC_tvA*O=JmmIva7Nluj{|381fHo)cnB9#JMPoi$^9_ z-Cs1~Z(Ka!4P-&zNUZZRTRb=qRiAHgp5z&kKd+I?%-@&lcd2j8UrT*%@}}UU+_hKIV^mY1?^?b0hOl+afzGBd3e=q+Zc7@mkK4$EMHsTlMLG?%uu2Rq%)d zni=f?Cm3p`>=dpnw!>FR;3(5F{UzTT0qE4lBr^Qpn#@_A9hrYP= z0jrWP;*7+*sy;4X>h+5GBgWsWk6Ry^^z~&S9_afqS|6;zgy+OUBj?k&d@1kWygqz| zcR8AezO1H?T*<_<-zcBkbm$h`633|cvff2KhDam2^#Bz z+RX1MjH`(=l*ik=93AAKW|9QawoZAk~9Z4}3L9^`LwnOI-|&-+R*iW!vAcru`%BA8G$c`$t(T zQ$0xaAk~9Z4^lnwzh9>FB$<%T&-eQOzoh*#?U!kNr2R7OmubH&b0F1&R1eBrNaut9 d*ZDyIUiFm!n*{#*`n3yJF6oa>%4pg8{{Vc}`2+v} diff --git a/q4base/fonts/Marine_0_12.tga b/q4base/fonts/Marine_0_12.tga index aa57b0530d9b6aaff38fa9dc6cb20f7aa219329a..5842e4ab446d00fec5f93344aa944453fe531200 100644 GIT binary patch literal 262694 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 diff --git a/q4base/fonts/Marine_0_24.tga b/q4base/fonts/Marine_0_24.tga index 4d49eee869edd5ed2465860b27d8049a1f459d49..61c8883127a783cc2be83704db6e1f41a50c5dbf 100644 GIT binary patch literal 262694 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

-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 diff --git a/q4base/fonts/Marine_0_48.tga b/q4base/fonts/Marine_0_48.tga index 2f673403158c9422c618908612b2296f9e5a32ec..f0d178e26ecc619201360762efee9e414f6fc204 100644 GIT binary patch literal 262694 zcmeHw3*2_qnD^U(&N`0LK_Q)!8999j4Zc!@iZNm|YJ3p}W0a9z8swOd$!Hi7GLgcR zs8pIvDW@SsXFAcFN>Ne0^Z(!NwYv6ouf6ZJ_g-u7eLv52{eIW8uC>;+uET$=b>I8m zr)SBM6_-rthf99AWQ8RwY%!_WA49+pFa!(%L%7_-w}QU_ z-U6IGeE7HDImwZK#RG|={7wCxW*6?_*shWJ^q8`#^=ouAn^1jdX2_QIEH zHqHsTV-NWL9omiuzZkqVcunx?;D>{s13nV`9q_&2wsZ;xZUoMq-e~PN0dBNOSYVwI zz&hZ5tD;*wJD6brj-L(Yae6BH4Gf(F{tEa!@Grq3;xW(DW`wt3yF-9fwdDi>J~>yK z_?z&|oPLM0trJaMZ<-hU-(C~LZB6Yp)rW5$i?0Jd2K*;*Q{tF2z^?{x1@_1GLVhIV z*MlzuOIq4A-i4wsL6{}y%o)D#sqlYKPQOFhuE;f6bJM)w__P}5r#7|MR3E+(&} z*EBEq+zA}oZ@d<;V^e!g_2DD5Uspx@bHPi&p8$Uj%yav106!JX{?NGCw$(8H2=Jjz z<6S8F$UT~J=3Ey;E4xRTsYrwF~wIN^#^nd{N ze&z4K9^9J?L%C*q1ekk6U_bu>HTJ^89BVHWhupK)a-?Q7PFUaH=a^>ljsiPnnRCc^~iOIX*R}l(X)u48%Hm zM*wqk7FZLn2cF)0FatS6uC?p6L4W8z-jeNsQml15Bfk~Ue=fL+K97!4jd_?h!%rgi7!9KuhiCL9YwkoYf*w%wMpm9k_rxXRX%; z{R?&fb3gMPUR87@I{1!|+I{c(7tqp~`&2L|l{ELsMJ50MqSkGM-a_90+}~GJE|%rX z-xGn)1n0;Y$RP|8SEGPoP1Nu+K2 zKMsT4)e@0azB7i;G0wztEQXW_xKY;=t`)p*3o_moTGcj1YVEXPs4CRJQ!r(XmxcYM$7 z#hk>#d$-{{_`nPer*j-{A?(F=4qR8QRUY{T>2fxJbsJC0;(m-{;tOSh%8PI zm_^>l(hH3dVI&^A=A9mo@xNOG7~g5`bf?O(U=WDE%l^N8EO}WR%@7EzgKSOBBI`%H zZm-t#?To&vb4SFF?+={X`)nHvF-S$d?tl2^dlY$(DCq~_2Y@|hW5FqB9LV<^uqK{Q zJsX_UwYROEXRI%jEw`9F@+RQfI4OF|8uAmAo>O5L?F_Bx%gsDCJAyJ2|Q)Dhby zioYL4Ru%H1{cEqAmEZqtxz#_5uOe{*PZ5{Qj!@A13@=yE53Xv*08Q&?sYSA!A61y6k^q z!~dh|=nx1=5urUW{|A$#-=p$pU_Upr6?}cDT{|2GtKefM*J?C7N@6)kF)ED#q z=jY{56^62U3M%}q5SoHP+89d*#?TVA-T&v5tcXfVP+->O%K!Cxt8hc{FtF>dEmOus zTky-{9(Ug?kAJq4v847FvIl=Z0*B}WXspFU_0Q}6-w=6h34Vymr%CSA-344n`=T>6 z1%tFPmJY1*Y`g#UJ&4|JN>EguJm!~l6Dq-LwP-J4lrkpTD(uT+5`Is(_SEiz_TZ0e z-`$4+u|yw5ZSuW^(#KUH&+Go@?@dQM1})u(g8HnyW&d%`P@udXZR-RlVSvVldC43p zYihgywH;qi2?>nK_<7EczsV%M2^FamlvBn;TZK=aA9mM38Pn5?_SEiz_6lDQMR_SW zM4v+AieMLSRXMNwU+4TYG<*ph`z(yqtNRT=KOYHB!T^nkrD`5y+L?=_dD{QX?AZrxInI(pw0d6cDWoJ&?{jOvfZUk`FooS1m#QE*9WN> zHb9-%tV47%8tbkL*!~ZprrP?L(-T%mum7D5L+-ktwE4}L9Ab4~IF#!# z(jjEtvt75oW8FpTskr#N)9t;hAg>y2sDq-4fjIFT>6zfrXETqBLs+uya6~9tmmd-UBlG)`@dnhozyFG<9!?Yv*&;c-N`!c6od^n1Pp;e z5UAPHpFy7_euq{5&K)Fpb7}|}0-X@Ro-Q4SiaM{iYuXPDLH$la*kD7z5Eul3s{LHF z^Ea&|Uc(7q?;0d{b7}|}0-X@Rehz-07wwOco4=6v4vpy)gbg+X41qxq2<>In_Vr@l zyMpK8r|x?jBzSXb2p9sL5KwzPbS&@`xA8@}haT4{h+?p?KT90-HI)=tm<>aq4+Qi+ zuBe}@Hsl4UmyQ8a#HxJMRc-&L0NiXWdIYe^Lf`qi?f(Wg<6p|LDS!<4sA}qE|HC<- zOUXq)hT-0yX>2l2h>!Ov^+lt62Wk_%=1~`utM_`S&hPr~s)ca29GfC{*pttTNLjgV zeotka__Wgu^<}X6Snve%HZkTLlOf+)lR0xS+hGLU+KVWkADFx+xp86Z&03wUK&f5# z_5H8?=BV>MD^CSC1FHw^9Ld(%>>(v{p%CD@i)3E+zgW%R*W6fTwpG>H3Y5xiZ{Pn% z!?8RLX)E&@ioTy(=EQg8?bZskjDuu=eaIP8G1Ce^oqf+IhajJ;$u`Vg1@>Xyw-q1zEIhjIs>|9J5)K-TWCf^H3FM)AnXw`_)D+ zP3DpJ|LbSjPNIzzR1*ujN;HrApE$p)l!dCKz%Zo^6`rg%Su-JBY0JwgV^3kr2i8$Y z5lb!`NG&u!b!`U*;MgHWd^NFXm-D*+iR-&`GOnHi!<05$T!FG~eZ=$yOeXpgNeDnN z$QF$WLrQK6>BP*J)L8{%u2C=?pCYiDSd_coe*eq7Q^{-TWL!N3hAC~hxB_KYECMD+ zx&N!q_k_;nROz0Wa!wYqEi8(vb*0zKJb(W)#~_VuZi7MI*H|@AvF$-A#$zlTZGpo==+hv?ULLwQqSrzG}}QX>~NdD;GNgk+p@4c?`7 zf{N|`I7mBbY0z`mI|Z9zF!HVXjLWwF6~@}X@6M3!;3jME_IVe=Jnw(LTP;X~Pk;&_ z7-Ysq<$mxgQq}v<)ouT0n4KED^{N}g{^$PzOG+6a?PM}(alq;JWU?loWP2Vyysb{bW*97E zQ?l*sWqT82Etp_deVW+ z^Zw^EltG#SPw(9b@}^**_ch*z;_=|BIcwbBdxA3@*5qdUe+G7Kx`B7qGZg45QD6H% z)%!nWUgwoE5tTNW zZep{Iu6Gm=+SrR36L3}4)Yty6@}H$W2BSW8kR;b1-&^wgED0;4edZS9ONH0E8sp39 zC?`Yi{~><=tMn_Yw*TFN$yfq?xBmE^N4}>pD`iZjmFZN;HgT?eI{aPfyPMc-qYFo; zga70m-Y=Zh#$L>r`(4bG`r7}$o*79xh0(qL8mYN;$8u-zRq4{5va~E_jr6HA6=BPU zK4UgthJYbp2p9r}fFWQA7y^cXAz%m?0)~JgUuV;8BYiL(AO|m{$Z^?EmMgy?+<#o8-tJcF$72SmnLPU(eysY?cuK z&ienH5dT~>#`}M6$dxSY{sO!m*nj7i(eI}w{YS_vK<7fRq+?LY5-jZAD;){>-YgEy zXbAy;#^C1`Lt1^Bq|}3wo0HUCj46X9-<8(sCAuX0(KW#yoeu zl8&@I2w02Esm45W{f4o@i+pn)|4TS; zMdb-Y1t^ z2YLU0gB-8<*kS+c;Ly89&dA}4w%HD^sA=$<`M2y+N zfvC$NGLDFs7<@&=dYT@WBX;dW)^qqXn`H#loXcvCeNlEkf|^`!31wbG3(^oNBam5h z$?FrEo{WalxE!%-AF`gqpV=%UpeJ3_OLH&hrHfqlK76f9E;GiWdzyyG7*Wic%M(dGR1BqR0`s*dbbdvBEtEeNf$;m8p9@nM)*7GDsqCF9 z{2ju+z6idq5x%pFedQJFCws#8JK&nyIySD9dhn~)?uKaN|2LI%ASzm~R8JX`vn2!2 zveU^`!XLkDw+Hig_y@q>1m6VKvGs;01CX9LdoJLpf~FM}TscDX(jvZIY4 zxb`POJ_XG6y?&kTS$%~~e#Qi8*7#KYaPD&JTJnB|*Mjc}CUjrp9jW3@Wv3?A+H+wT z*9xyxaW}CeV&(m-zg0OOD*9`4YT`3iSH)7Q#@cABSLDsTuJeAP2xRi!7Ns*8)7CG? z750Rive?CTldztanr z+HQ)vilvjWiVQfHquftlw;Ax^C6C210je}OSh9@h0Utt z|K8qx;*!i*@;s{l4DEthj23`qJe z(X^;6E^C;J9LN7R%?pZw#k-jH|1B#2%G{wB`b^~eyZ>3)sH*-B9s7VocIIWdEVwwU z=A&re9Ay=)kB;D6vVC4CkX+>+NSzaW5B>eGf16k4UN_h1dq)6A+4MiCJQ6(j>m~IX z7}{RloD_X1f>b$|&>lLiX#auCD)&IN(MU!39(w=l^ec1coL2CzXunw-QuRwv-x6G9 zBN8!FON~I?oD_X1f>b$|&`up@HhY20D)&I@AmDrG{jc9u$9E#|n7(#yML*wZ!}kZq z5Z}AT&x)Y!)YzK6I0UNZL$pH-Qg9xjIcbmcKD<^Sv&FRkuMFgW8ro{VtI^N@8}R5ef~VHb@GD_)Mi80{)rM-2rsfb@zHMI63}m*L_Wxml{Mp2JRxJgG z{_oG4X#WbhiY`URc3{5u=Ee%852Jl$@Z7DJd0E%7amqQUkkK3@KX>Szl4Jc3try5_ zG3|fu!A}G*a7~v(csAJ0FR$6xUDrPy{p$+-he5s=9HOtH(f`&MdL1lQ|Cj?ew^e0m z?$}nPKWU#AJOjxsrv2~ca8KayivSj`=_Clx1z+zP0_6wMR{Bmyo%SCD{!g$Zo-ceF z*!iEA<+9-7lyguaqd7=^?$A3W&kIn2%ogMR=lt=W96kr2?+FM%RBGZg0Dl9XS_7hu z=L>i*FzG5Ve;<_e=ViStv^e!V1nOuCQfdC6QL4`iPJzr8>;8B1w*fFY8mzAk1fZH6 z4?F=KZtSd*{~K$gkp8@^mxUH*Xf9M6szIuq>v_Q`klAA2|88D)1~xnoSVg>dcoVSG z?^MpqdRb_3M$BK;{MXL+yx7SSNve4p;m?NkJ zsdnz?1*bq}w*Qwee|G>EHt{#X8^Qj(J>=ST5Zga5>t&(E88JUl2~zF6&kIh0%xwQp z|F0Cn#Pfo?fve{I@6jju)it_PHs)o$EVMXh%n^UzRngQOLeaO)3r>OLZ2wP#!u$5N zlJgso^{7f517qi9xh%Li#a!?@EuYbhCBN4(U`n1BpaRKOuG`c(!S~Sj|4+?ZF_#*a zN=yoU+R?;o{8jd++EZg|_Tmr_bHwX1O=xNkG1#}oc^_UYkZ|Q%PaQ3Mk9Gg+xcIyO z#2Kui8O zFre*L*5g*IX{AO$%@ObQ<};u%R5_OzoI1>G_F@t(be5(L0(Qr`|F=eLRnP9kK=x}W z&3cBgw0=@!Yxd$0z&w@a0rkg$W9D9uE7jw?53hw>V`*vXXyN!-;5{X$_EBdKeoJ$v z>JLW!a4_!!xDH(RUU1$gbOZR?;CFyIw$AocUtOHmmk)u8dE#gH55QH#@2#mhlx_JU zPHVX;!9e@cw4TkHAz%m?0)~JgU-PH+E!6N9;KtR zAn=_%C7%)X6``{q_-kNZ59B+5`OYxD|LaBI(sP5s;09=mp4e!DQ%+qMPlFPwC9?gWbAmG1#_Vwo^1I5>VG#V<&fqd=Qu>5^kP9YI z9xQc(#v&V~9VI^u^_#$sUJSuwQX_L5zwcw{S}1J>j*K?H8e?h5P%qKk?tf&#AR?`*d>RQV-ZVTexW{@ z3*~v<|8LRBWUL>Wa^AYwLXK`;cNO_w1bOniw~Os2V?`W1{*d$yR8E%-ke7ldaX0ay zb)Aix@(}bn;`hROV2773_jig#c^pc8|L=xqW4ol6>bQogBPgBIth&sD@;vYVt93FN z>sJjm$J#G)lyiKl$eC+jt7oehar_xd`RpZs@ALm?aNk`4c61vA?xjxgaC`)R5ju|e zS;TXDp>bz8C6u48&~f9A6}sQ(ltjY8Gh%kJ%TlB<5$AdT>s+$d6HZ$vQ%F+I=k}=I zT_k=d%56ItZ!oxs~*EBx8(`T@J2Xi2I+{gJQ4<>F_fkNGa#7i!B7lxOtsBNL_3<84Ks1 z7XcgrIfN(MjuLubXyQZb*7ykd-UIslTq5z0H;&ttYK*ah@xwi|w(GMba^AT-PQy{y~s@+99MII0Q9e5M)1HhYsUj^3p z2RvgeI3c#)X%2Fi^WR1eVmhL{nNuZ=CC(giAZazaUPoIilPa?5w8J0~56|=eCHU>&Pl7)W{txiWI+!mFg{{58 zl1@ZrW3ZfO*5$c<>OZg0VT`A-p`epd@-sz_pDCAu8nDtd?jmPd*!lnIxtI8OdBABd zxkf;>>$9ZXL#2pkeU$tT4$+5Fg#qL8d|ln%<(_80qmv*w+}4GBnd?CLR?+8lYRgpl zbhXnoZjrMSZU5iDF5H|uY)WO143Df$19*qa@ zMRs&81lhkM>RkJzd%({I%l=w97Mt99O=2!|QIyE`|Ma|<0CJVwa~W$N@r-J1A|8I% zy1nG!l4Z*MFMr!V5Kii_;CVeqJh!KHU*tMb-VEL{prgl3>alZ`TQ4?Vp$D-GcWsAJQJ#%*Q?QRSp|9T*K3MD|eFS9oJK{SCd^|#a zpHo12F?bEp7t)`!rOKzPotRja4yq-x{Xe}fN&vY^*SShH9`SGup6TKe<=v3KnaWSB z9r)xqHTnI&AL^yO6KiXh9_-4zc^+>i?W?G>o$vB<#Akg=F%@;{Nt<7&&?}9d6=z@l zF|jHgR7t|xV*%yXAl3FSA}=uXC^%BQQHS#bvXMVb?FA@2WY1@e~j zT_^9M0dn=ObCqg*k(&!^s!Zi4)=m-6!%*H<1ao}R=5da-HA@e6c@NId3qP*lXW@6i zyf$zVn8!hqsPFIHf$ZZF@}EO??<(Nbr`)0ED1gEYAg^)ar?eyHF7es3U>(!59T#Kp65Rud?0w%F~79sWZL`|*wNH)8Fa*kn_Z8wG-Q{TE9ZIt^IY9OfG>B+ zWGJtI%{PO`_WtiP5mV?h;Ee2x&Kwv5hJYbp2p9r}fFWQA7y^cXAz%m?0)~JgU?rp)JfUN0oG>j`~i^dQz1d<@Y zy)F0&kTvmHs3gA3h#_DIj0*woZN;H?AZ$Obs4W^pzz|4*fZF@~Ech5$)4?fxnGHk0 z5EvH%*y#HE|7CjfqyFh}MQza-0){{e1Oog2F@gPmehOb^!w@h8#)Uv&|8Ef3|Gykp z)E12)U=-@m5crtoDp3;{!6TnJ#J>)-$Kf84pxft&h@x`=0Mlm~!$F7iC^ zwctC!d=K~y;BSEWp3cetW$7z6^J54sGz74R^!^VW|M&K;a>Vl_a4ek*#WlOk3C4d7 zd`T|u5}S=R1ac#Qb+7k-==|S*=Z?eKM?6mkYq}8)mxB3DZcXoVW80K4#=W17+QejI z41vB7z{1!2KXm=?*dF6~G-5gd{3`I{!217XJOypP2RrI?ZW2ap|MxYy=4W&WVEya; ze~jB$qI`8SS>4&DE|ZSFXn z{XjfAzD=RC4D9F{H?~a)BYv+!*1p=-z0Ec;*%(8hF9g(@e}daoqU7)HzQPIZH(rnU zXu+qTl*j(4F8_F!;4t3rRmdU#ZQ8ueF0t8ILm)Q-YR&U~ADRwBL+&uVefm#{0brS^I8V_cmLEWJ3&r-VhLLp6~zA?*QZfzucHQeUXUA?LE2w??FHR z|MrDozMru3{{n>#zgHnUpIu9DvoGAtk0H@{lAWA z_j|OBA2$Z}{9X;&ZrSE-IzLv9AAuHgjUgrSYZ9$9q#JL4Z{oT)Zfo(@ac^BIxffF1GvtkVCBKwXcitPhfSz-g113tbc?s>~5uQ+u#J)wpUEAsp<+8yzli$4zpS+4P)Iwh36 zR4>N>rI6w5Iy9C1Qr75x~6oy&9UMmTlfL0+9b1G8-SVQj! zU@rV#gQ6LP)Q+tzpR7)Db)LzQQGw zvHUq~ua_+mGaQWo=E3h($hGUVLBF>d9mqh6H936^eUcuFN(di*r%8GwDj~hfwt-Tg za*Mb>AQQCEes4_*+&!lXVs9ypKTZRo2IX5n}!WSQ77lsEk`G7IK{~ zZArRiEO|2y1Sa`IGSEUkmO2ZKkdxo5%r6mpn`6fd`SO^z>N`%};{&zjXH@9&vq2Jn zJ5<@^+A85Z7K~&9g`9K$-#eDP8HbpYZ6V8ZKZJtc0~>!IOcrP+Lq)!qqU@9S-e!+=rqmjnl`%!i8Z)0$V7%V{ z_cRVL)p1VLt(kD>~t@B-_666n7 z=uM4n5N=l0*m#8=#1c*AhF;gE_y5gVlWAxiaq`(ZKF6hr|BJ)r(9r7m)sdUut1{1y zvbQ;Q1S0a(&jj*Z5U&mRHBrcXPV-k_M|@X%@Oe$Nm&T3-BNf+4EXcl(D_U> zmnfv;+Vu6m3&)Z-<3JWqE@g6G<;N&SIajH$LwRdb2z0Fi{=CTu+W6!k|*CCJBD=#|Fi%B`v0BG!Xc4mqk9!|2*g{s~_DSRLFnysY|&=OrRIyq%9#$x5|SFE~D9DveDe z5nkuh^guL}VsC7CW*;4s~yHQf?gll=SukGz2>h4Uj*hH+y=e?{3OuS%O8WpA@fY<-MXdHyr% zebXcR$TP+V66c!IWcxqSUTZK1>thnQ*Q@9}bgT!SdB{nWLW6@7t8(+9sjQaF#Pu{<=g}xypDVpcov-r1?qMR3FG}e(*%VbCx?C_>$lM+ezPr z{0Nke?EAmtgaAlCw+-Z7-2@cnaTR0#O6k2nq}MTpWWz;l8$vz;%ze5HEWeXbZA3g@ z#p9*Rz`V!ytS$* zeBXt!l3s>N2tR&?OL`V6CA}WfjB=slim1!HD3|h@RgVg)CnXW<7nq2mx1v7DEq6HZ z!|xV(4M2tBtJI-xr;sq-?^SO(q0lL~9tIP?mdwv%NoS%Gvh{zY66DWly&lqxa-rjj zs6(Yhq5Lb`qJrv430b%}dCmWirL1~<|7Q^gk2lUyF~}Z=iaS>*z!U# zDLii66dW4+3!yjlTcM{VKGRJ_?4f*In@DRSy7s7YWmzZFS#}WJt$iiJ>>tihPj#{e~dap*iq(e{%+2iq}q?e-N z_4>#&#)ph4QkFSU_BqAKF){U}qvBm1^~=GU7To{;=nG%-V+a@mhJYbp2p9r}fFWQA z7y^cXAz%m?0)~JgUE|u8b{JEb#GQ z@J0oPo~d&&@cO6IdvGfMX2%d90$5wT{>OdxK(JeLELSbsS;}@VcR{eqCfc_F-wY=4 zoikf?@e?x^KKPvRonR7uGX|fhlw<70=)fkQqj7X3grGmP%V!`y7h~IW41rh#u)a<% z79sBeSPksf;o(I)@5kYNg09_{u|7h2A$w@s04(oCcrW#GQxVI%Q95D_jK$~bO!`9bE@uEpQh%QDf-?%xBuJ0Xt$WNpqILz&3r# z_fPP1md`#pTpkVi4`4_9f34C)YngVy{Cp$p<38uVvTW_R7+Cms_MeRUe}k*&Tj+QU zc%t9cw~a3&09^U|l6#HBXPSj%s5?tTep6ku(dbjyTP-F$4O5IdmE_**yeBGDN5}}+M9BA-~I0%=TN^KpF)NY z`s4S$qw^uS^HG~Zmd^)07j++B7yr@@*pAoDY!^Ez-gQ2sSo(mkl~-Sp0X+bNA6Cw)PF6!>ni zr2SCooU;tb*+a>5F4uyq=z4VU9BnfHg{`MlIjm^s{^M^XnMNy_Ho$KMJGvbLk2kgj z^Ecnx;KzXZn@7F_`W3AlMht?V#k~JHANI{^~p1N5wKRO6t#ZSyw?GN>J!8*2OXxlQzUW|_N$6^!5SAj|AfoGYY*-sl_e&>^TT(JV!=cr_U4>|hzOyeyT;9#-uf99`$ zk39!%oR`OgCGi;jX)U3i48!4SY<>p50) z7n`%j!q>|c?}56+Vyb_Z&8GdzA3p=+8uY(A(azswrM@~}H?L6FYki3kSar#YORimI zoh9omd2AQU&p7ZO4?OsFe}CW`wtnLlyT4}tS01>g^HKi`UPjh+ literal 262694 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°9VS!E`1W3cH4amGwReOOHI~ISKDC8+$Yt` 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 Vvcpb0yyE3s?fQZpUb_8b{|9Y0*#7_k literal 262694 zcmeHw2e>Uol{Gvk&K@^E1K?L5cb?&Ki_u0Lxy1Ki%x}Ue|`}XasUAuOzwRhJ! zolf7?R$F7WSy_Fx)tAj0rBWhLB2XewB2XewB2XewB2XewB2XewB2XewB2XewB2Xew zB2XewB2XewB2XewB2XewB2XewB2XewBJj5xft7j61IHRc&|eL*Ddcd-49A6W8-YZ0u%L3)cFrU7)_VM+VghI>;D}+ zbGO{TZ7e$gz`fN1*pu$?G4Sq*TgB}dxYl8)fbK^z=JkJOKa_)Be^Qs1T>U_KMi6P* z&L8LE6`BW>UXqrU?Jb01EPXce|7(-8t#^3!i1L4RJ=|m#SB-%;*zlUi%aXD3 zI2r@jIt(7@R5M1&qz=bW{or^j$r>dUcf<9{TZZDR=LNW1EP&8;oQSFXGb z`sW+=dc4^lf?Lx$J-n$lIknX{#g)rG1AlXhT>R?hF~Kb;yXN0?U56(}KY&@>USk4Y zP`=nR#_}`M<>1nFjsWKwk2c)(n65bc8lQo`IYnQ5n))@tEhxL@-*nv+Umx}W=HvD{ z6ZC@efWSD@Umw_0`wZ|kIW>)evrmmXmA?%9%_&mh@9M_{x1j8rf75kWyeY;5Scuyj zOyCR3SJjN2^P2)|-#!9dn{+*-E-roZXzM>faxRy3`~v;v6m9XQ9%q7EP32s3d+_zy;*KfK`jlYe* z2<+s>_08Xe`3j$#4t@r-!IpcBj~w*JHjpi08{8jq^NO7>z(2^Rj<4u9r-;SZx19-Y zLD`kR>AG(|G5!H8mK)di5hjrZ)iaT`2v_NE?nQC--x{z{pM$YHTT$bW|9_^RxDcU#>U&>$-v*7!p%SQ z)&!R(|EBAq`Eq^$Ybspd?=%T5D38Hr4al6|F>tNJ5a2Y&MRRM~uEQ}@e+K^M6hraV z^P1omlwI?0y4Ld#(FU+K-1r&rZj;o4@}tc9W- z?E>ChVn9rv={HwiL-R!9w>a`MfXDm3@+owz37L!yVHiuFkBH-tYC9Ib8VC6Ke*bIb zzm3ic@tA)9YvH4=4OcnF^sD1PM7tw5eg+(El3P%I4x8IShM?AX&H#@l*Z=Emmo)~K zX#n^y_4j}Hb^*DT+tf|JnbI1Z#srpD`9-)}D+ppFooQ)%y^Z<(A8+@f?yuvBk))sN z+E?1Fc{#@PI|kk+u=L8Wj)7|(hV-;ek7Hi{n*s4fChC5aE8upMy1eA-4^WhAxlP@4 zor_m!9urs($`FRJ^z}g7ayjPp&wZQkz+DbG6>>Qw#rv<}W>V;jK2L$X39=DnEa@kA zUum=EJv|dQgsmYr#+=P$EzwP$EzwP$EzwP$EzwP$EzwP$EzwP$EzwP$Ezw zP$EzwP$EzwP$EzwP$EzwP$EzwP$EzwP$KZRAAydKJ@Ee|T@U#^M@NANW1j@J&_u{vROui2H2c zYfxvttkT%m0F#pqnQH zUugYr0sGU9F;2zno4g0WdjT#MuFq}D`tO#qR-;8eTwdz7>$-#)TbbWFKa>7epfe0I zxH(l6FBpgHHh0d{_J$19qNY%|*z~P`ewO{tuy-on^WP1kn>r&_Ja-mr6rTlo59VgWIWo|8Aq$!n2=p$47zzT!2KFJa^D1UqS5bEJlE$lPj%;l&faay`tO#qR-+O8nEg5QS^sC3K(&2c zjPF*UGYnE(WHTmSbvCb%4n_U_8K^}~Auze>nW$_H`HfQ;+v}j?Gmmxr*{@4k|52Gq zYlI}!Gd74MVre%h+E{(lR+4|14WZZT}G47vX2fb`uM z%RWvV;3{QzwE10al|MoG5Qwz*)%jg-{RV{J8IO@Z#uN*Q1sMA-{EXy1lDT7NiDAfk zfc%N*+Z5un|Y$1$FZ@wr5&&PS%vqAc7#lP4L~_+N(*=* z9nX*c4Z?eAm3T&h%V6Z;dNlO2V-*X31D&3ttp5yo)l*FK^+;@e_wo5X{?w^mWq+;F zzZU&gxf;p`LNuJwv@OsLbv)MLbMd@Z`Yp)ekf%V_gLvaOmH+^wEd2a`9>j~gMW6J~ zdRhMiBp-3-HM?t=08iofc$d5%33`enE2VBqm1sekGU|2FQxVWMuUH9)oaJJ&x4#>yE~xH-{@H7xllU0 znC;)g-uG-V*Zzx~zcIyPy8rXLIY$}I|NN0TFo?&l|2tsp*$^J@-UAY|pV0SQkyvuq z0pyf9F#R-6&dn<{A1KN^@wa|A8MJSP?(xc2j+1pBOK=~s3fKM%Av60Bwjug}?J5g+ z54y{S;8!=N!83OKe@=}3G3t|R9N5lsZPdrM{&~LNce$c22RZveR_A9A=x#BBz~8TK zZ`jN6d>0t6b6JJ&7ODKEC@0sLxq#944iw3=Y2Av)O)+?K+ZaG&*8c&B7pJkU ze}2!&62rYI$G_&zX=px>wear?J-@4Uxde*4L98+Ng#IFkRk)`1gH*$Kl~CNqw*DP%x2@wI;^z8B#Zl)!ke^q$AgJvx z(B?f7$B)~)K+c0$g=?RmC(?da*La3*TLh-M8D<}sfZlXFG*@eW188UsYzBLNC-@5A zh427~FLt9^8^F0-$;$)SeVnv@R2+5AYxunx{Z{!NlxsuCbrZ-hAy(me#IqqfCbPE2 zGj!V`G1bj5hxmB)GZ zxj{_l#A@?c?@N(EV7&H<^sC_v-VSiI;?hYsI9UUL!C$X`-s9oDAYJ%waQA*->$(81 z1L=FnV_W|l0pq!vSmO4nM%V{afm`f8%=@|Dsfh*G{?i)x9E`Vb;sC$cI7Qp}Fbt_T z_{;Ur-$ne~u;Fz+zE4tee;C?-QMSCleh*5dKADoUE+xoxSz}iK{<6&MyI2CdTgx3~^OmAgw;)#%l!zQ%$(LE{T%WFe1 zJ|{L6Km#ilXqbPaImPlHn5sFw!JKRK0T6vGPt)Teyfzey&F#^D7DSibp{Sfon4mH# zfrsB=vbfK_5WmKKndn4K1G07ax%U4ggCgqIb6?y~o&>4$JL!)CnbAma)72>khu~Kv;6Bl2mJ%2cHihBjh$Qqv#->0!9bsl>9Z5io(3C0Z!&cJUHAPUKE9TISJ>aC zd~rXSD?QPQaytiPp^;+!^D~mq$ju}QOeQ1XvT{Y;BO$)E{~PpeF&(=(wruNi9TYrv z@cEzUGtrEm26**8>Uaft)bMmZ^YV_AYjB_V}EsGg7TgH3P9& zNwNOvW3E&t9#8>bE;n+^wa@iym5ZTV29fq#p=~`2bPe@WsQm(ZT46Ci6tSa6LRohssjx?I!@$sQ#>;L8 z@6orlF@`?4&aJh>>!03ZMU7|ZHn3XPs-R9@&KjDlHGd7uQL3h_u)BUC__#f4X=-H)1g6 zv;puVHTa&|N9N=eJ6C`!zYFgO(K&C^=KX}qxj*NQ#o31)rvDHz^jtpE2llo;!PVt2 zwD$SEzJsuJW325yu(QsgdERg@?V~O3zQzF`uV-8e>9a5voA{&s@sb04TCg`d;xZ<6N&7lu~;UI5MA zq_31*Quvx;KIk0+eUa|9~CT#dC>pwOb zJ=-BSzBMoPFEVoYwaBr~58n&TX9;EDyI|dWAe~)h+j9si?j^t;>o2ZMJQ78ZoSo~k z{>PK+%6dbRw2sd%>vAg;_k?I$U;DM%!L+@1osZn1^59IZJ~KD3*!fZuHT;$JADfJx z?T{PadUg8y8~JmpBO=Dr58wH~cg0!d+fcf>%x%vhsJOR4PIV@}0Dki3?>*i%9WOUG zR3;vYLW1n6Ue^D3a$UDizb~*4T!y~2Aay?YP5@uw`S3D`*GKM9`GAHn*7V&D{nu;1 zxp~FTr*Vq5H%G8()EA4T*!3HMn!NG<{qWj#sO*K#y4>^qDWUQfbb5XC8-c3#08lT+ z5dLZ3dD?Gv=5c5=PSNhde{SqJm=+Y%eRD21LdW-b)Rhxp;2TfO)Dj$?FxES6%|Zv>FrP|m(9av!RO-V5`F&_L1mWYkS8 z{YIebU0~8x6Q2*a((CX4YpOGkL!(KHb{GD0W5>a?piuj$%n{$y#dC9AJ`RO`&+mJn zlVe?--{}`Zbon3@`aPjvhR%(f+vd)a1}oZgxO{jGJA<=2g(G3vpxJ_DRz*a>LIQzCZXAQi(dBlbgL02zBS9 z-vAii6)xGFVUqX)b$9*$DCuNcf2A??C{zYkr)tXIYd;F21%xj@Ya-!1C)b7VM&_8U zAo|$gxzj%B^DEHl@;xYM^AEZMZ9XF)$4~0H(`4XEt>W_(>*nSaJ70ioB{#5brHjQ< z?D~y>Cx1K_x5}%bbou^{GWe0`qs?6*)^)$9Pwn{K_*;l9d@rE$Kil>jfvR^2C~^Jg z@b?M`@2gZN9*HKvd6pC6?;<0iy5wPaa>#RWUAUI{EQ`xK@B8WUKqy@Qn{+4Izk~2x z*x9_zu-QrUPwa9h$-tCS^$R%rzvMX95+LjH)_FTt?n@09_d_K-2j{uCE?KDoaFOa`^Kgjtv8`eAX=Rf=B?cy^;&Tj5KhHUtZb$V$AZ3gdPT6eA*=sN7EA`k1dwBwqdTH*U8g!t*f?9c<#j-wAB4)m=#*o0 zo%aNFIR=V}T`ZSWb{dFiYuvHz{{tWT80XehcvJfke04RJZ>?Qw%*9{32q3{OS1-}Y zp0-~oY@Ds$TKDmsJMQ=LzM&q=Ht&aD;{|e4oDk0tCszjhfphTcVphUnMfrj5%q3^eQ!q=0O zJl^Nu3#fFI2$Tq9i-2!^w$OhKV|3v?A@egM8^JPBi9m^fHv+!(*-+1C@n>egvQ|CxI6qs`yA%+|V9_W~*% zy+r_d*bZX-Uisx#jymYp#@LG?R(Vcu1Y0<^08Vwm{TDV?|6`%QB;b=>{EgXGEui)? z1X##peaNdJJZHZYaw8;F;X7{VlfGXCxdWsZE+MC!vxV@tI{G=i54P|Vf|jjsiu(iD z>aqd~KGW1DM%I`Y>j|dqA7Zj^A5WX)i0$Cmt zVA%+AE+kjsbFv%eVYfI7=Je$*q~~vWbzvUw0|||*^erM8t~SNIF}BwAn&&j-k zxDcWXp9|grGF$+RnKek!uH=x|4Os>qztcm7>ubUt+ldbY${;G>IV=Rcr@lAkChOwf zV7mou`5e1dj)T(L7reUMe69He<^v5%-% zcKq#jsC*cmlVe_NXFiAGtLFu#ABVvA)b}HeqwltiePsPJHQXN;>1UGjzWK%Y7kK#{ z&Eqg#o&v>eA8k?Rv8{D1$^U24}47B3_ z4>k)g-`)393$&rzH`Z@Q_(_HvSifm-O0D8=D|tU)7V9Kr5;+Nwo#7SOdER8b-^jV) zJLULpDQoPUE)o3BZX9r9JBL?s`hSM~6P1k{Z>zKTr*=MPoQ<&feQU-|2JZ=Izey4{DpLy9DBFA~_1JSKa8zAJv&ie)W z-I+WV_Su_LRDkrX2;h^rH-z2g24LRT;q}|!7=4F8Cw-Xpp6Nxo_uxF*;FL6+7dF#a9%d`DO6!s80_KB)gp3aZC?U`Pb`vAsQpih^tL1A)H`iJR((>6a#&GAuSGZ}fXQ~jerAGtHuwyX| zPYsM=Y(8s@I}18<->*m5zeNona@rQ6uYvfE<@uXItLy}2aNp^lY5WWpfvN7<*k0%9 zzX zSCbL#C>{~Kh0DdN#?g1%z{%rOt8hQ&aX}1!J{NYa;pB~aeBb^^J=9g|_aF?iB%$h>f7`ZlyU@&*;ORt| zRpRG0ZQpU-Ta>LFXVtmZb>VsA+%rMB`C9Vk`JEt3pubvlJc^+exIlM4v+qQfU{rjJnTA-l2 z6mkbh6RzCve+SX!!%)op=(rEjmUtrS{5^**E1()6H|VD?U9KL0r{lxtU6~`R><6W@YqI72Ze93H z&~}iCpWJ+{`5cx8+poj6uABseCb6=h4W6~-X6f;SJx5Q53Ha`69KN51A#}W58UQ?po z%;!LKE7JngW)NP#$yHWhqD?A5dRAag#{T;dt9%K{S#CPie`q-8b;dP%rWfVDC9jPz z&N^SZ2Kr6g_>2OZ$q4v;rRo0gBsjX<=M4JOA+vj^ndsF{15D((F=RR9R0ug(&$U3^ zs?ZmGo&tFjg!@x1uG9vYb1#Thh;J)M(|lX@kG3X&ZokxgioX(p5`hwd5`hwd5`hwd z5`hwd5`hwd5`hwd5`hwd5`hwd5`hwd5`hwd5`hwd5`hwd5`hwd5`hwd5`hwdr5=Il z^B#PU$?G8}L;eWi^UO^OpY8ht#v}p%_2AW3Uu)bGU5p37NH+jO%k#nU9PpllL{ zTHCS4qyztb17pqq131*-SO#%x_$1%xvtT74jKNfu<@xA-? zdW`!I$on9BL)L*zVmQ_qEJa+%iLW%--%TH@Qanup-Ie?wl9xih0Qq~!XhQ;QeV3nM z0={#6v@uwUz>tqed8Dj=1SVnO^|6PKbstN}Gvtcz&>d?CmLx9bBY~JXUzGxC5=gK7 z`dDLmngkY

toWkMGbv5pt8^^UATt#K7uQP4|yA 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 ScKyev+<%`Z?7G|IxBp+MpbCuu diff --git a/q4base/fonts/Marine_2_48.tga b/q4base/fonts/Marine_2_48.tga index 8c6ea38d2dce7e9a4b4716dff4df514a4131b12e..75cb7e0ce21213934d059077762a8acfee6a61ca 100644 GIT binary patch literal 262694 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 literal 262694 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 diff --git a/q4base/fonts/Profont/fontImage_24.dat b/q4base/fonts/Profont/fontImage_24.dat index 607e9afa4c427c7980c5e43ccbeca66784a5a486..31ef72d933dc3fa9e684814ff9b20dc3ac9e75ed 100644 GIT binary patch literal 20548 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 NKJ&iLKycOG{sE;!g**TN literal 20548 zcmeI3JBVCW7{{*~UwP=}X%LGkMF*XPs6l*8AsA(SccNsrh%pj3AqfapQ(B3LNDzy~ zLM%iqL{d&^xn&TG#ll*wh4ufN?|ge7bC-MO?5*S+I61pFGr#?R=X;#*-q}4~6vbgp z#vPgugn66`J7e;EQT(7;6dzn!zj6J^*Ve9GTEB39bpG_2CvIF^+j(74?9eH(%IYc%g3y>~^E;qijKTsMECYbIg2Vo=TK3do&6eT zBa;D-bK^cuzoswYDgH*RojlH-YJb3a#+L*R~v%vdHYux^|@s92A3Z3KFdrWH_kG*$a;$M90 zJ~4lc#ls)(p|#V$O?~j{@iN~-@ox6SoA04`x1)GfE!c}*`YWy%#US)Uk87QY*=?`i zU-4Ra_<~sBy7BPGY4OfR>0|G$_ck87N`H)kzGt-JlWu)?hWGPY^f`;`>c<1`WvyRC z@#vGoz2BVY`uv*yTdXbJYwgq8t*VOxN7G)fuVyd$@GtrfV*AqdU{T*7@P<9{@G<&U zd*b0^c$a(N;aeu>M<4#hxA6Xq<~8pJJ%9ZkQF$Rd$=_$A>?Ifcz18!>>K_q;Kj6I{ z&GYxdBi{~bhHGMA?;)+RnZz*JrLQ(C+Cuc;4q*}uTUzu#-^Bj4an#3Mh_^38ic zt5-8|nB+%V{UcsVd+`OlqgvB=^?Hgg;GIh55ij)9W-q>g_hvG$ZZE!ocRiU$+?D$W zi#?>@jf>}I{MGXV9(zcx4Ye*G&+HxfT*eD~2roUJ>-MsT*qav5=qvrp-ZANk()RC! z0QlJK9R%K)WM19B-omsVe?_lp=NiyRQ7&ePu*UwYltz{q#lrS z-MnTz6D!nI^9Q_%<`K=bc!7t_rGE!vQD5ThZR#U8$T{O-E4(+7d4B#H4_o0~OXlH+ zy1i(`-c`-z{Xu>(%l$*+)0%1iKwIfwv@ze-Ow)(GWlW+C-qk(v>i&g^f79%xpRC`% z!Q=j|4<0P$r9J7R_cQ;pZ}2{e<~5&RofM0hw$FP8;%unaQ%`@?+8uw~hyT01z0GUs z*U&}3Yxn2Wl&SXaeXVi#=cR4s^8@ekEmo$|bxypvez$qQ;Qfa6)N_5}v4>wp+1tj0 zX}qyG>>u&>OAkDB!Ml>o^L#UX5;`CFWT4sb@2SPl&ztu8{X^i*ZM0`YX*|C-G9JEV zaBq~xtJ^yZyscy&^$%vSSAJluXid|Hz2u1T$T!BYCm!*~pf;!J!@s4y#2?4tVid*uKoT-L_9bAE8JKdH1Zk$^7*mIn+9G>eTmRV zZ7J&uiZ;Z%Dt#^WrG>}-`(9C>T_4wN%!0n(lk8p8S14A{w|^cx%lZQzG3c5t*NB&g zlX#7KB{De&@3ABvxl#AWNF3~KdEV6G5A1T={P|FsZ~D)9KScb!nxv2Zndv{n`udyV zy_>|t*1A4w0{T8m;^B|_{!v@lzfY5Rjd%&Md{*nGnBDnHuS`xbyno^I6t0_{3m-1^D^g0J}>im zna@j)fm{!AJ@8n_{Xy;zay`iPAlHN3A9xJpdXVdZ$3pH8a(}Q)Jy6_??RSRx_mz*= OE?&?dC3rN&t^WZN5}J+x diff --git a/q4base/fonts/Profont/fontImage_48.dat b/q4base/fonts/Profont/fontImage_48.dat index 2296dc8bea00555276cbcc94aec5b48530db20fb..88003a72b4eae9cb00dcd34d707f9405835f8e81 100644 GIT binary patch literal 20548 zcmeI3zmHW#7=|y+HW&j+U?aQaLIOenWo3mmSzrr8G-{%WF%}qhO@tT)R@i8w&He!v zR>so8!h*uW7z&Gxv7|P{idaz)V@YCx?{ntNo_lA$J7>;i5}WfS!?`=`d3e7c^W8af zFNX(%!C?(-hsIE2uZEw~OW9B727^84d3EK+^^IFEuHU@Di_51jFD|{XadnNqamIcA z-k#^9(#Nl_mwtWp{h;p${rgA%e%bF2nmv;12>;*yz;`6BzCVx74F;RlzRzFV*6$JB z%)mVF8NK#%j`NN7lXtWBle={9abPmfV}HtgZ5Q1BbeFE}`_ujU9k0dn<}}B=toC(X z*L%{~&Rfv$g!E=lhPOvQGheS+Y5P%QwbI(QerI$S>kISx z_?dZUtI|flx{{TTow_O1_pIiaceXChcjA4O#XGB;PSkgLeM9}syi5%8OB~5@d;O)? z+e*#5q-$QkO7p6E5sP}sTfgl*G{VcvN18|61{%~~34QR;2d{)aGK$?-z04ZF^FFYeQ1M6{7Ud(!9-sPe_=7uSAr*RE1T5sUn<=1yYh%1M*L=}#h_nx zy)n;WIp|{-)vKGd!zay7KUq!TPoOOIIGg!Xv+VJocva7|g$4 z((m1#6<^_fpzA$dpR`_Jp%H&e-xY~>W}>9)nB@v(FTwFmf(?FjP+}sN7(U8)U#MH$%j=h z)9{EPJZt|F^V0FF{FOfZ{Zu2YzpgyAVdOVIe&PDyyu{DB`omvqKh#wp^@33^dHT}v ztNc~m@V7+#Dt+RiuLO_$GRW^Q8twTd?vv{o)>h4%sbV?)c|g~E5I>m2FHhgH^!dG% z-@nkWn3v(BSoG&*LtoslU|IVY_ivzWD9#VMzGLuWe=U9NPiuW*5Wju8;&XdG_?*Ma zhx_~kee2?oU+eRa*x&y9b^Z4f`|o4+-#?}IV0}O6`$69i`hMWLLEjIC3IzK}{~bdY z7oLCn|G!}Ue+?HO_ov^FkIZRby2(D*UxV}A`25d0-(dgjo(I`GvmfWXITy3`&)moP zCg%0c>9ym*g2}T&-t)|H-OIp6d2S9K1DINoutFaC+}ujVaL?znS^9{-CfeehgNVKG=A)5ovj30xWZwZ1=jCfW~K`E7XQ7o+}4@W=&5{7UeM9Y*|0 z@L=IH@w2{v5XY~jUI0oPyd#y?@%>fIBOg}%`8C+QUt0BI^ZdQO|BdGtf5~s2zv+6x zS9s*N1dsf}Bflkhu+WIVR)3i$erSYOA|GgD5Wf=o&<2nAmEggGiM~94t@Sa#UE{DA zd|%J%r(N?QaAlMF-`T?buPcxEVZ_hsS6z9;4kN!Mc(7O_llos*eem!Zo>hM_kKV+d z2pjEJ%sazpc=#Od4`QBGf3RGS#a9OF*V^yKyeI2_U3vJ5K76(MUsoP1@-eCZO~XUu zr2f~Hhc*W5Bd=c4`9&K%;%B}8+WM^L)%rbD9GK{{`d`fB*)4p2qyF3+EC%|nX|&gK zng;=6eJqmeVE?=n^}jT)suxknZyqoGJV-7u;&&oTUq*h#BYv}4ycT_8;WP2Go>$}e z@hojUPy0FjwY0(8U->@1|BHF}>+c=yf39EYFRSNEco(yH?fJ!D^8062{L(ypg-3o% z@K_u0$ZsAmT`#cEh`&}pi1T6j%lQ!VP8%9;i)XFhJRavcj<+QaynmjE$9ak4;VXml zl9Rk{?FUx;n$H(tp%0$5U(55i>3>5sX)J5x=}WI)c<6&?ec!RGJ|c!q>Zh+1?x$UO z#13PPhiu22T z{$86$3@7#HSfAAontDd{u;#s0#d5sgcjXZ~#-#on^Z2e__>~ETfHU{yt b_NOsVK3#A%z@M*QTf6#^dPXHT`;Y$sPK?=3 literal 20548 zcmeI4&x;&I6vxXDHR2khu5nDN^+sVzsJ1#tVI7!J9{8r@ze8Ea&fG z@%ntRT2&w8Uf;0Lch02mAzfAFJ)`$KWQ=Rha)xv3>c_7#(iPv0=g*yjp@^$rGx6s1 z>FWHEFY_|Sy*}c5Tl&^b@#VS)@@wn!=XvOZhdvvxEuYco^O^Z09)HP3vhMkNRG+Ep zBOXu679yn|RDUMkD_olcCLzp^y1{QT+~+zq4K+iRWu{ zY<*7im*&scKHGkt^5y={7nSx&qu#R@g|@01U$yT2jlB`0!FxisUFOG*6#K_X^_gk^ zVEbvJ}mp=0>A5<%OFd6raJso{-nRv~3>=)#Ktc;P)E#eT1k4(G}ORw*7v4{oZAy+;V z?{nGa{pD2mIu80S(cgh&|=QVgQi}!^|UwMDU z)$oW1Imoy_?~cXUD&8Fv58wQ~L0de?74)4}Z;J=#d+%G|@t$#?EA%(Svz_nJ)~3&o zk$dR7rv4L?zs>bQu28dld|@$vU&;P9@tW&{wYDVlG0&t6-fQYP<9FwClb7il>O zQNf#qzhnq)o91ymy}uoue*UuY{H^9W?A$MAUh{sCT0p(`_k;LKj9I_jqj%@??#Z>G zzQAL=s4rr{+b!$nvF`n~p4ZoV#(X_MUnaXHd&R^HzIh&dB{|KwTF%gj`V~_=y7djk zLSNi|K9DH(4qsnj(ax#2<;x5DH0zbdesriX#*3!7F3Uchj;|sA%JY@i2a$Z?{L)fS z4ZQk#%N5F3)<-Y*z4rXdz}qJTXSJY@eBr#-QeO-_@&#t#5tE*HE%n8~tJhP3^LmQE zE%n8~%S7Nj?e*pLK&+o-BUxj;8F=IgF)92d2IA~hKMP)-&*EK*=CSuuAH2R19NEXR zmicRWp3QZIZ~6Mj^git8%pdlH>|5F9=a0Dy`2uS!`&|~dJ~Htd@s+Q{x2Jyd`d-pC z;eG*qnK*x_UykC{^93F;{!RVaC?3xz>hni@nZK6!8uFQ15Y8`7EHo~ux5am$>#O-v z>SJ6@9OAoA{lDrr9}n^+)GOu=eebEa>1*aQypS*G%VdkPxcK(P8_0?|5C@F|SzLU} z{WtJNVzK|m#W$0-5MQ(rk9XC_tvA*O=JmmIva7Nluj{|381fHo)cnB9#JMPoi$^9_ z-Cs1~Z(Ka!4P-&zNUZZRTRb=qRiAHgp5z&kKd+I?%-@&lcd2j8UrT*%@}}UU+_hKIV^mY1?^?b0hOl+afzGBd3e=q+Zc7@mkK4$EMHsTlMLG?%uu2Rq%)d zni=f?Cm3p`>=dpnw!>FR;3(5F{UzTT0qE4lBr^Qpn#@_A9hrYP= z0jrWP;*7+*sy;4X>h+5GBgWsWk6Ry^^z~&S9_afqS|6;zgy+OUBj?k&d@1kWygqz| zcR8AezO1H?T*<_<-zcBkbm$h`633|cvff2KhDam2^#Bz z+RX1MjH`(=l*ik=93AAKW|9QawoZAk~9Z4}3L9^`LwnOI-|&-+R*iW!vAcru`%BA8G$c`$t(T zQ$0xaAk~9Z4^lnwzh9>FB$<%T&-eQOzoh*#?U!kNr2R7OmubH&b0F1&R1eBrNaut9 d*ZDyIUiFm!n*{#*`n3yJF6oa>%4pg8{{Vc}`2+v} diff --git a/q4base/fonts/Strogg/Strogg_0_12.tga b/q4base/fonts/Strogg/Strogg_0_12.tga index 169bc9931694ad4d2332f3f772e88b17a9182c9c..968f6363aa175bca13bfd0d82cd1ac0a943e6b4a 100644 GIT binary patch literal 262694 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 delta 6538 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 diff --git a/q4base/fonts/Strogg/Strogg_0_24.tga b/q4base/fonts/Strogg/Strogg_0_24.tga index 7930b69f078ad2ec9ea6de63e7734fd11a0beacf..712f31cd1fe1df1ca500d40c8b4ba6451112cfac 100644 GIT binary patch literal 262694 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 z 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 diff --git a/q4base/fonts/Strogg/Strogg_0_48.tga b/q4base/fonts/Strogg/Strogg_0_48.tga index 5688e27ba80c249cdc24f43b7ed8833ecaf6f2e9..6f8f8f3b022b7441a691780617102bd90b130de2 100644 GIT binary patch delta 14781 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 delta 14647 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 EACcjd>Hq)$ diff --git a/q4base/fonts/Strogg/Strogg_1_48.tga b/q4base/fonts/Strogg/Strogg_1_48.tga index 27e73593a1935bfb46d7f1891f38b48fc76980e8..25e8c777b4cbe7c5f2fa7badbf12e38051e62804 100644 GIT binary patch delta 12737 zcmZvD4OmrG*1zibXya#Un2lv0PB~d-Ws{ZmVSe>yV>OnVHvivR=bQ`EGxvFRa?d^cx7S{K zeXrfB`(jqz7ZcN^i`7LxZ*_UA3w0r$J;83-6sjL(0u|$9L;wEwzt>~LZW{vLZe1{peTt3c9G0T4?Q?5(uhDWn7zW2er zf9qV#QZr^ujPnB?4&MBmF>4ji>5i`-n!$5&o#*gZ3fIo2k4;`hBK0xrUraXjbJJQv z(}e`idye9rkMUBZsjZx3a#kdo6IH97{df{@nkLV}OIc1|d^@Lb|HNN6f&NxJ9~MdY zc9;HEH#(W(T!KnWWpxVGZLX~j5`AczYaYbAxm1t&h0b5_b{ue*w1m3i@eqpT{K-}V z_8vta@!c~lHa#l()19VnbkI41m%H-aW5An0MG^OzW2cxC6Ibxi$yN`r=T5oS)yB0X(*>YY8TMf z4rb<>;>Nx_d#s%%TQR%pwm9Daq{uWiEfD~6c+hsGAch9JFa^#4ym1=rE1=OGNLf5} zFD06aIU(94G%c?Gm`?Mc)0FKIQ{rS`-nSwW=Jbo6Fy-pQuLR8b0zW$)fa#{VVF1tm z1Erb84Ik1OQ@*8_2USYd%G)#Cw8Yu~A&sH`$K{jt5MsE#&EAM-@z~k`dK0wp=xvl> z)-~>=A2{`I6g2ai=5k;RxLsWhlEGd2htJt;+9-k%c@D&+VRY#rC}{f4zLJ&$FhYL7 z$O9E|X4C9#&INqC5uEQW6#fKzi;tbbnVVH-<4x7cSiA{kopUoy6B1Kj1zlU`Y;=AE z(gdz~kJkPKW`PeAqD)S$v5Op~(NnBss9}Fqi2=&}xqD67(c=F?&9pEK_uD}IdEoo1 z7z@qfmC2mbZe>J@(by?NcBk}oSIBvL=@(|uy0I;xu|FZL%*RYIRUe5_il_fGhi3Oz z#cC;Wwg4@S%d04vK6K@Oam(v;RBTpX)3ihkMk!sSM|!yrl}M4C`kE!epU6XBrzDqO z6$vJ9QHoMElYd!7>GYI`xaf6aoWKCtvjScLz;x$4)^<8T>r7g65k2QAiCD`xle09$ zBWGEOTvbIe)ZpPQecc>b*3;xygnUGK^}+R+*Y-w#n9c^hJQZRw6@ zP}-HRn#SKn^0-^AY}4E%R=9*Lk+v)tMMWc$Z4DERgvcY$qQV=9!;y&sJz7Guh^pMz+9Kb#a~(? z$71E6A?sRA!@s)oHDj%fQGk)pw-|M%W_baP6HuP^2>GZn_(>F1#?LUsYUMh6@mDlh zr)${w!m(djA^M)n&r@Ghd$v%l2j|@b!wlgwCpO(`>Sx7r`B-bM3CxJr`9+wYCFV7o zF7_Ey{*fyM`+3k?Rw2)xY`4hHQkSLEPP{IXDZ5DK>IrrREMC9H$6=c zbKn>yK!yjcNf*`3aE^gA-~PyE{hh3qZ92Q~Bo?p*&P4q6M>WpRrqezDu~N?CI2~E( z^s^Iq%oIBhr{Q^rnaR#^OdOB*lR4?E9cBJ7I?;Jq*6}vPfqz;Bv{{a$pnD2__$!8d z8n77WH`wXs;JhTReUGlzZ6Pj5F>ma6kjvh|k*WC1Oz$C+F30exmw!WgP*b0v?%weW znz+!e&TIHt(}G%$$wU&AeGDvtoGa5zAlE)a+5m%9V5MY_d%Ln+ZI7DLra>?n*Jm`=*<9yISdl zh<9Ie=m<<1Fq;Y@KLp-TjCnSJ$fNc6>Kf5VJ)zw}It4YIU>5Iw zj=_K&Vc(;C)k(E<@!V&rmCXYWhGBX1E9%y|3S`KUz-~Jr6X>vK)7}X2z>_rCV+7pX z8?8L@HM^fjw9p{o&O;{c)Q!$1_^ab|AFy%-HAUm0bwEv~9Ukhw5LZ59_rW1b)Ctsm zE9jiB&gzCc3*;?aQ-dI(cXKcLO8wDgt6gL++XuyB4|G33XM3QF_qWsYru@Cv03S`i zrM+jbbFKKvR~GnCOTEoyFH6-R7Yk=!7O#e9eJYy4^#Jb9&+ZPhsna zz^EYfs&|d3d9sDWQK``+?t6zti8_h-v*B9NjzjeG^Ki-{8I zcLI3HH#a^9amg>B|M56z-aInAB{V_jRo#nu zm+8C~aF^0K|2r=`-oZ7`OMHm3g{6+dKevZJn_P>nFA-zGerBo55P2N(E zBa@;V#7`7L2oQNaLF-)3ri*Njw+iWgu6>$XJI4`0Y#~{EP6%5NZq4)1R#Fu4;AT8U zEXz|@`B*^_Sm48>znG?*-d>-j0Ah(kG{Kv{h9ZdjdnsxIG>O1Se!>?^%R*+XCytw%g-&T5~BKQQ5REwTTr&1!U+09)Evfm*2jqBq4Oy_avY{+V2HqENj@ls1T;MAZXkun z%mC{~gy-+*G~ZB$sD6}F3V?G8fYXqedX~xGu6xkLy~Yl5)qCM6wmtA7jUb-3AGHQI z0TDh#qjXljh|;yfM|{nFw&qWI90lSGxSVYl(=9F`#Wq#z{RqA-uuCc9z-kn=_6RqV zIqy!_j5~)wpgJ}lx5hInU``_EHECMc6%x|{wA%$reaOnCBV1EKZbY?FRo^*gN zNEF1Q_dxx{la)k{!As{ct}?YtmT+JxWkm{xg!DI?H+Q7d8L5+q=r3#w98{8!uqA8m z7XgG)x&r@o^(t`2&eBX+JZqLI-l2t{w!o*}v>6G`XTVLwgzLOI#w@<#Gi)8I?z}0> zf{N9u!$B zxF&geTi~>UiglEaq~#ZRTNG~%>)upCkMW?dNlK0&_N=}yEI!0FcWBvV2nwAoc(KqC z87b!S)AV|K(gl|Qc{5jcRDGJB-4r@L0vefaCN3Yi8JRn63ME?dfHv}=^Y+#7VqP>i z9!!ox+S)WvgBz48Mq4QouJjQ)FeS+SuCvZ}PX)ewHeqyaA2b#Qzq<&LgVBU>mYW_{ zgdq31!9oG9*76aO+xpySQTH;u<$qe;T48fjD^?iqh&sN*Gag2|E(`XN-iKsfQq@s@ zaA3T3orZq7TziN0f+I`c&R1NZA3**T=jd6921>Sfs+op zM4Tlw4RX#ab|Tk3KxuA{KHaZUiIcq>qZn@&q05oF1p!8Qfj+l@&x0>eKOunw|7#87 zsf(;6FC}r2NA9vxki^JA$4W{lk+^)MJpCsrZxzrO?N)TaR?UY4LqN^rPSdNL_FHQJ zS5CJ?vNcmM#ZQIQ0A1y?)&xFHP+1+0CqYfpHb_~`hfGGT9R|oNo+h-;}c~4aK z#F*k;-Z9S%c7GCNNpz>ig|AvfrC|`%+ELi}#Of6(`)I(JiO9*uzZ`qot)6k!?bf?g zr^e_zsiwZ7PJL#2tRyvKF$6aq<9W%9!_ZPuO`&f^qH?vY^#Wdz&n%72?ywRF(NKtX zDj!YK%xrqe?ZY7Wpsg*j${5a@iSroxp_Lsw8gs>T_#eUX9Y8gf9>Npvvi9(p$Lx@V z0p0;NT9YEhNG`z$ghAn*xPAup6!rX>Sf&JW$+{b4apgUTVyoY#XInxs9B8y|c6Q=D z@s*pkUP*tznIuym9<&D8tUK{uD~>p48A5{dru=QOObgv=NbghqRXA^eYY-Jk;GFwK z5nr?8wM%z9prz#E13dsBRQklZ>~;G9)BRoEjv#)R`t5uCphlPk#D{>`P)jjRBG8`2 zqSo;7&8WIw%c*V1MMUe} zgl4|%6D7!yU%?K>ikWD^IF2Eoav+1OXqwEacUYy=imI`%mZ0@dmRqx1DB?`*+%(x< z2$559$;BV?5VCZ?U?1V?N-Srg53BxYFT*|5stXma~i>K;@X?A3+419 z*0qj!?w(%Y)*kq?6^*DD##P|d_)3rWW{mAZSQahS02STS6sH_d&kAPbHvAQdAtB9Q zICHsmZKM=>3cW`zrH?7JYjz`Ojo+q>!Ir&-Y>0-3mBx7#ZxP-IFJz*BgWwZ6QF-xM88aRE-k~VZAvOWp(LNNc{OEXFhEWpnXtH zNx4-#rA>I=tUQrudY>AgXPVWqd?Dqk1&{n1Ym04^b86$XXMlo^+H%-N560xp%jS{o z*1M{O5{Se~IsH+Lt2)i~{5pEY>yal<{nn24Y=1PTZMXWPiCg|7N+~WVSn`~8#x0h> z8g`e+W(~$DjElTD3!E$BoJU--L%hLxBn|P5RW$c&RDDc@07zmboJ-L1f-29*mu273G?jhP%2zOci_xRQkyRA> zp+kgLkD@xjH{hHgAD*w0CgD-HJT&rEI2{eKRh&XV8{jQpNVQ_%#3_hKiU@&+f46$k zGY|~vRS1!Bi2UWPk*`~CiF%>dBYlg!3Q1t)g+h3r3^Ee8Y@kcj7KwPM<(B!nEiT&& zItBqLNb3ChqE;`Kppc8}l`#=CRv|d&uV`?nXh^fwJML(Tc8f-ENbh=ehX~p!f!f7n z_U*_J=c~Km{I?M{s1#i3Q5a2QWD92GA?eI5;GZ|T%^SDz(@`TWK+Rn&{%4Sk&D`?? zG$lu&`SC8ujAqm|Lc*%|rP&qo+K>|43J(fQ@qHOw`IHvH7Vss9ted4=wuLh{!l6_h zqGIGH)?=pfwiLRceF?6aU>%cwLxwc#u+b;E=V#XSGHWBJy^oUG(8Cakq$60hcoQV6 zgW&~wmj*dU?UD_gbkrK_PSR$*)C*vU*K*I}@Ssw3AMTULWd~r$zx90xU-E@@qnb9k zup*VxRuviZ86i@FK!WTf-p&u!T|w)&MdN>O$LrNmPyzepkx z;tBZL5iU(hsMGP7hHzI;IG4+5hrxp}&wFs+SR*uAtCDy}m-P*9o;You@~ySS^m_?e z|4~G@t_CKX>0YVOW03{1r*l?`D%cX~jJg5(rJq1%q?c0tgY`a51!J%E7#oI=hNUP40DiQJ z9C1v!8k4mr{oA^>GE%}jDQ5h`EMJsBm$$^qeVo$BVR-Z$#%o?K#evcGZ#C-Rz}@yF zFgL=~*LxRGMu|Za8ERTa3(Vr`68yJ(z3M6lZt&&-7UljM?Fd3^q5NLtxt~bIUKG42 zb|IGP{4wEW$9dD+1LJK}KeQr+1{)@F;3g!HBR|N|EvJ4Xaucs40&-Ye_02YE#v%oX zAU)zQ27M9-n7|_s**cYfJ`R1u-lvB9b4Qq6^=|Yqdy@ST=iK8OKyJLa&WId$!2po=?erWm2Z2~f75BYS89BzV?N%^peuaZ zG523qB7KR2mhvPrm|D9)OjoVlmun7N-Dt8KHVs4mkpEtgmW7eb{z|PR!(@3}&*Gdd zFmeYL^%RNaz-@r~XD3TMOlx4W>rcYA?MwJcQIIV3SW>v(87;?wj2U*J*gCOf^7AmM z$aCWz_7>+#9P43|zds9oMLCDv9zr_BnVNTlk`Joq;lND0kgoA!V!?171UKGguZ@(1 z_kIlM!!b?EyYa*oump2org<%)2)v%IaWHP6xM*6ukixkX6Qn`0S29pFr9p1E+g__B z+`ogQ1Th0rQR`*~&I-}JVfwrV$9$BCU5hU|FG1ZAbtkPIqz>WCsUW7|UVF9PBaqro zvcgIRG9H?hP7^%bAjC$@xn#3?hF&*59wDsW3!0A24B_G*?HI^&3^zPrub>!HQ-eDh z$Emo-5) z+-o@UI2z(4+k}W|x+uho0YUYZ?N-it5PFTkQiDK=y~1#!Wnus#^dg9wTFi}OsUFB< zuH0_px```P5t=V?{h#gCoVgeTptIxb16(G&my}i#=x5@dwBng<8ka~A%YheAx9$0b zxSpdO)R{hSyN0L!F?+3AA%M{na(P4wePWsuJmVB4WojQzo^#r6us2-1!J`uC;WncD zQU4^+au&&TnGBkX1CX;*FizX4E!U85`x3Mzmu_}^?MH1Ts3K(OeL%N&;>sF5OLaU64gpqm*n%WL{%32>nb&DzitdVqp2%vnNK{~z?H~Ymi=lTp2tb~ z1}UcWD}3;1y42(^%@9A-1GPchTFk5LF%I{BAv2H$3hLI#kyO&{FWuEhC$JcSa_ zXzC`Sb{$BG`Uzpv7KAqohYJ_xN^;!`_BQF4t5|z=6-5#+l`R&czxtFgeTY|;JPy2U z7ild;Pt?E6q4f3q#PyiYd!X+ki8gjBapD2gjP>9eDU?-J9V7?YG`}lRa^4U zPr(_H6S;#UdZt+b68HZ;9mPf|*0m?SZllAMb_3L4zgy~T(*CxdHzLqSaObo3Q=E;j zzJG2{+AC9XHbQ)Hzd{>gOB?JzGGiZh&QE4N?#ys-NTp9 zv2#If49t)FlJcq@t|&zGH!1LM=FAn42HX-IET_+xzDhD9o__BeL!E-kox6_@B}lqU z#E~2Bg0Xd}GWm_A+7j!JS!(2U7PyEw#>*Gl10RDvHS~_;sa=sN?CET2Ka?sSedboT zUAHDEh4hW*ecA(u?QZ0ntaMyuLN4=`AMAGL)VZkmYzyC4)TwgYNUp^BHanU#kJ)F! z#YzV62J0b8aE}P-c`b~3iuf+F7V%}BylFZY|DXLi_uK}4s?+;$22LH81G7A74MC10dKWW1~TW*S1U_noh^tS$sKuP8)XDzvx z;`_7$GjNrgslrHXqLK(S*_aMgKF)ncV zSI|e7Il)+|BtC)Re-1y8fOn?$#xx%aLx~yA*ZFX^9=c VuTj?=>*+4?|7Rp|l-2dp{|^tKBrX5| literal 262694 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 G`u_`Nws`CS diff --git a/q4base/fonts/Strogg/fontImage_12.dat b/q4base/fonts/Strogg/fontImage_12.dat index 90a30da422d30161fbe28bf9c1dabe69365a25d0..438209908fbf3197a262381dfa5917c636ce49fc 100644 GIT binary patch literal 20548 zcmeI4JC7Vi5P*lb!2}x`nP5XBELey@ye6~-!DU!7lGhS&MmBf_4vm5){*Pn7kjGa; z=Ggq#=RLlEp~vD&sl2BG9{-r8U&sqt&{Oq0%MS%BWTx`MIvTS0HL1Ku1Ks#X$V}yx z_HW3WuHO^EdBd~vrPT9=@iJY%FyE%@SK5B1^$U6F_9MS6$Ea822luS*n%VCcse`Mi z`_(@0Nnx?|cf2icWt|fl$9q=3o6SN$Sj3E7bNSZ3SygS8ez3fLwd!{zTEG5zu^&ve zpYp!W=Aj!o=Xg8i{gBN=H?Lo#yk86PTIKzb&BK0djhA=it*kR5*cT5t;;!+6YDAQ49{e`e#DAjTjiOY%G)W=UspJF zt2~qAyng&)KOcWfjlT=g@pl@}*XNb;UeD&Co9ETayF7{K&wHf2E7`ozerx63D8$<+ z@5@3wVy2dusU+uaAxHDK?_Yf3?FV72yt`Sv(0=fC%KJH+2NS*BYJ@}o{Vj{fS;OmkBBAH}1dn5}HS;=I1jbTvVE7o&LN`gJ)hymt%n zx*QhX)k3^3hlO`Di#LpyE{BEpRTj_YN#`SaCHtQ2-({!gZ%;poVR%cCdAu668>!FA<9;SCo=@ZXd|N2*xojTw%Ja;>FHGXWbopU^eJz{UtABdl zONDsmSLV}vfB5sRRX^s_JRZLAyp8ghPxE-8{m6~2)T%~g{yYiO`4`?!c=tr+&6Awf zpBG-E`jwa`;ZdVGZ{9pPv|lB@fEPDU9-jZuj~s^gyvV8b1s*vE?~Ot{YAL)D^CbF_ zbMW%!$zi;ZbMW%!$#C94KXQ(E&YLGg{VIt)_EPpm-jDY4)9Ss?k6L-_Y+moY%47b^ z(~o-P`^Qds%zt^jP`^fb%ztsb!}DJyoLcq;*&Eq;{s`wkn9P51`tdt$F|UR5hV>7V zLP^Rt_o-3;x%Gj-k# z=V$Icn0HO4&*S0zyj7mbsl1)?OitxB$}>5Y*DB9sIp|#` zjp}DIUBA$N=(ZK6$#h=$`OaE$V}Gafdip7Et1_Jz`eUaYlT&$(@=Q+UwaPP@&I|2V zX}p}s>qAH^w-+VAk++b#ZhUK{uK z-NU?v`r%w5-corN3h`FT<9Tg~^VZ7ad2I>ak@9$68^_zrg>JsL&xYuA;nY&2@pC6f z^P}%y?uY&JkG1OeNwj`_9`Ov5>+V@pCHnFFH}1TLd9Ze}m$LJo*M|DRYm}GwymrWI zl~>|gRlh%@^&81I)r)>!!oPM-`gsW+wE(-(&r9%D%A=ph@eV&fN4Kr)8?wKbo#$WQ zFR3js`R@(l^y~XK{Jg-C^4`zph4o;qyc>mh8|Bf@^UfRUhwU2KYuP3GFT7THCHgPC zO3sRYCHgNsat>Zx|0PCkQLn=J&+^S=dOU~oANs-iP-KaI4v!q>ym|e67%#Q*;`(_% z--bML4*jl*Ot;^Vw^rWGLOgN~{YuOSTj8+j=XYgKJ?~C=^z#zDMtSt}JYG2ewaTOa z#_Gy$LV)Co~bSH=;tMP)B|_*KX~K_ytw{* zc>aU85Z-qp^FOcb=RbJF%C{op`rEjE#5DT7Cvx0=5)ZX|hQsUSPp=<;B>z)CelmXj E4RqL&1poj5 literal 20548 zcmeI4J#Q015QdlUKqy>BqDhH_1c46mD?Jp9nl zzm%7@85|e-ZWNxlpAlFFa7aQ*PQyq=>z7JI(_HR@N!&DR`l zPd!CGgGZb1A95wOiSlUs@}|n8?aP}fk2aqdbp=t+l}DS;L+&j!$vZ#4wAu5U@{rHq z(dPRHt&eS6cxbf$o|nc;zi9LQOY@l=+I-%+k6)@UjFUD$UTA%6rulD*;dp^?pedaN3 zdpo$PrJVO#glU@h{}`Pftco_6+c6)(=mq4HiA^T3Mpfe5D>@23j!f;Us% z*J56rU+{2mgy%0mi+G4Njn`oeWqvpPShhV+Ts0pl5BEmkovXz2H7vXfMZD#BeGLom zS`jbJXNlDL8W!H&N<3e~!h2MS=W9-Q&x&}<<*MDsQh6Z=$?+#XRU$)W50nJ{I#Z7g1kk%ER-?ZsUh_f@=kz7sJ1B40GXx z<)3GZ&7WWRhkL@Xrp(p9AD#WfHQC_b@_xhTi{!HRwRL?X3wHVWB(wz_+V*&xywpEv z3wX5oJj`uu&=&A$+j*>iFc2^E565F0V4l%i$Ip0S3~l@@U+nv=VK2&BFnyt-nx5MC z6GJZ8dTHyW{XK;J{RdYD(*x53(*x53(*t`R!5lC>Fg;){*#5xw2c`$62c`$MKVS}+ z9+)057i@oE`vcPh(*x53+aE9oOb<*CmFDQf$71Y(gXSa;V^v19Itnt?~fkK KKlS6)y4hc#Vx{c> diff --git a/q4base/fonts/Strogg/fontImage_24.dat b/q4base/fonts/Strogg/fontImage_24.dat index a5bc556f3175d32252e93350092b28e2eca54ae4..ff78bb9c484691273bf61027c98c273bb147a3a8 100644 GIT binary patch literal 20548 zcmeI3JC7Vi5P*k(w~sRj&Ll|t2fz;@TSz=6gupTo7y=}(1GohHEZefv`4xx=IUux< zLjr>P9SB+e0TwYK^-XtePxTBp-90VK64O#`&F$TOuIhSB&Ca-K!g?Vb{^!vTM>p@@ zIeX{s?W4oPYv-f(Onag7qA1uS-{aoIQ1DHQF%v|0pmSpNcOc|Rrd&d6sG7WR=ZhV_dEQ6GJZua0wVro*5ijiD*7JTW=IM7O&R;RMuQ$Fc`L>VE zT)oBd(Cdf5BM0F6_iorcIqK^}c&g`lasFW+IT-TqSa{^$Q_=Z6;%j-0)Ec~lzV>qK zW6axl-o;8h_73~5Ch_R&x>wro@mJ3QO|$j9`$@c+cn|}Tk40+qm(KHkDdyS!N3LMs z<6@pYACW8Y_C%NYYkA}fy!VTFwm*|A@UAT4VWZ0-as}SaVqR3g!sjz_hi7~vgelX?{V|Z!(Al^TlFT|D@!@DOszn?O@g!zToB0r0i z#n<{vY~fMAX}q}qDbM#m@e$s>=-)(_`3uw42eE}m{ifL$$Ky?5A&y6E;eA!iBNo9v zVhis^F%R3g2j}dAbu99$NLjsMpXD`T8@#l7laKG#c%H=HMp&xnA!(&{blf65E}4<7yRZ_!KRK`h{%6`f{Z9AA4r zA{OwNU&?rP{v#Ifj*5BgU+AZ>8e#n@I;~&D{*HO>>G5me268(bXF~ z_V6#!W%+FDm%T&Czw-UVMrYr~^T@v%yw>x`zcQZnck6lNUkx66htKTaMUnjawfO?C z^}MS^JUjov+lrhLxmU!q`?nDWLVVNwjr*VST>oo5kN92^$=|>6e1(0?S84Xe{lLzD zu(0vGNO?T)In>8iSj?wo@v!qBwjp1Ol-n2PKWu|{JDEq!bTMDqc>`AGdmwr~zRE(w zdujMapUZHtvy5l$YlPJaYp1j4D|&NS$HE)RyuVuiFz|PMzK)$(pO;#nmm&}3%<6^X zwLaJd)>tlVMaP0@r?s>xJz200`aIc&%?frP>+kqYsEw^433&*n?( zIjZyh<@zYBt>>xE=h^4~$mLF$s`Gg^|2D!JND z9@@rnKF{Wh+NC<5XU~_*?X&S!yHw}fXL-x*v;9x)Qk`#~jmL8P-X7I2%yRoI@A|`-%%x=dd~B8k3^#UJ3s#a$tU~U_;VZ2)70QG zr?I%-U4zG*!Q%d48qfW`du6^KKi}E;`annfH}U_wCxY`$T+C=Cz(jKG)!FJ&$~@!6O3X;4R7J@A_Dq`D()7sd!Lxu71IhgI@~o zVI>|p2yf#4evy6T47`JWFPHmE&cM4^%p2sh>>oLEOL!Ca%M$&yJaPu!L_f{v5mOQR z)x`6x**tOu9{s8Yk6eLAzpB9_SK#f7uE8T$;L%^wc=GqVML!+Sr=75fF?wk~ZDELg z^s6-c;{K=SU)N8u3m*L{t-qYigVl+Ue-qDRPUPP_@7VJuo^LARHR3Dwoxyi|JvhOO z`>DNuj=vk>d@j05e-REb#=f%t5$N4=HX7kIGP!^ffzM9=5TR6Hz?J%m@|e1v`M zA-uBlk=C#42k_WKcxC4!%VY15eUTdbxADBQ$vk4FYdrsT;%6hGdTD%HZ{L+<`{I73 z=U>-Px1L8nm-SQ2BNpr-@hI!3V;(-kE9<9Y9zMe>>!)`9!&l^jNR4{KS9n*7dDgzI d=kYvdnthV5t-I#t^@|(V55Jc$%{0T)^uGu1;+_Bi literal 20548 zcmeI4J#Q2-5Qa^`cS86Kl(aM=Wq!>#+@9nXV-tmlQ$D0*v&bc+|v=h=VOTQ>x&&i>**_Ly= z(w%!deZTkd_KUp_)5&CebNlYSjlIbZKZM40dadzvR&4$(UVJRr`mp?B`PA+odS|eF zVEN!E^MS@8BlX(p<_YH>g|9kx)_={*58?5%vZ}GGo^12ZHczxz{FKUDjd^?DUE`v-Ma)zlwSA*SEY7F$PBviSFk+_i&cwWk#ZLoyAR=ZeuXOxfKvCQV=_|c{ zTmC@lvC`MFH(B4hTtTOiuUH@Sa4y(7lJQ5c{coFhURdWAyjkFV?#;U{*V1X|BVNcc z{@i}x{gUx#mOfZ$^!6SE-oM`Z+V-lxFn^B)Ep1iC{P|H&oOTnSURTXdu*-S ze&Fdily?w#Iu7MI{0mdZ6p&D6xqv{8U9#|sq3ROFP^_zm+DN_r_W|96RVG5_Fkz$;b<7I^!&y71&PD-trWJm zw14A#Fx=j&h3zfv-_r3{+8?F$m7c%S_Lj~s$K777&Ff_{EWecYM`>PZ|CY|r$DPMs zD{jN$rF6bu-tVXBW1pdW4fd<(BWCoRzyI>LFOHW^K%keiC4)K?t59;{CR(y=UynL{%4p~Zja~JD|F`}V-l^t^%2qUL@6IpH%a`?GD=Zz;d905{3;u9AcGerLEjkT- z_P!o7Vei-3`*p;DUmLbQ>Kx%`#ny+d4<8A3|FHMX?0#wQpZaWI_e-mvi3F<;tUj>% z!1mL6SFn6w`M~mlkAK2fgH3lpnSU%8L qu=>F21Iq`N4=f*8eV{RLl=(n3jQle$KA*hXnY@wz)UQ_7=jcCDlvif} diff --git a/q4base/fonts/Strogg/fontImage_48.dat b/q4base/fonts/Strogg/fontImage_48.dat index 7e43ebab5779873873fa076949e46e3ef9945720..86902580df57436f05ae2133bca4fae30bd389e2 100644 GIT binary patch literal 20548 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 diff --git a/q4base/fonts/chain/chain_0_12.tga b/q4base/fonts/chain/chain_0_12.tga new file mode 100644 index 0000000000000000000000000000000000000000..87bb5336276bc4427f7050cc4ba23ada7bf4bf05 GIT binary patch literal 262694 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 A-~a#s literal 0 HcmV?d00001 diff --git a/q4base/fonts/chain/chain_0_24.tga b/q4base/fonts/chain/chain_0_24.tga new file mode 100644 index 0000000000000000000000000000000000000000..b93b0eff9c20c7184104515a510286f77bf68250 GIT binary patch literal 262694 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 LVaJ`ff7bs8G8fSM literal 0 HcmV?d00001 diff --git a/q4base/fonts/Profont/Marine_0_24.tga b/q4base/fonts/chain/chain_0_48.tga similarity index 68% rename from q4base/fonts/Profont/Marine_0_24.tga rename to q4base/fonts/chain/chain_0_48.tga index 4d49eee869edd5ed2465860b27d8049a1f459d49..ff47fe219b2cfce98e9cf43c870b919529a30d95 100644 GIT binary patch literal 262694 zcmeHQ39v0yb^V_~a6%jq2@yX81+`R+q8J4!6fBgeQB+FB3BN-M1+gSrPCv$IoT4#C zEfXUu8smgBqC^Oa;s7E>KvX7~W%$S-!~c-A@4LI-?tRbcK0Tc7``%l-YX39rbM{_) zopav3x4ZBCt5$8YY9gnvI(^mZRjb!b8vKV0kO4A42FL&zAOmE843GgbKnBPF86X2> zfDDiUGC&5%02v?yWPl8i0Wv@a$N(8217v^ zfDDiUGC&5%02v?yWPl8i0Wv@a$N(8217v^ zfDDiUGC&5%02v?yWPl8i0Wv@a$N(8217v^ zfDDj<_6*#9`|YPYJq_)XphrVr0lgb^l_-S_kb&jJ0M2!tT#W(yL6=wJ%!Uk*0eM|d zk!vw%JJLl4$iVVq0Oxx0-hNu%6Xl1YA$jBS%ADDd0WyGtZqL8ew+S77^c_dG$N(8w zUJL}z|LVy3KRZX}F8-S$v9Pv5amB1NRBjG`2?2tWlH)c_`MMN73hJ`$?Hrj zkeMeYR%cA5wQJzo3@YoATYiB6cWMnZ!$jb* z=TGY)9xlreUgK$b*HB>7w^=3(CPY!a6*Yfvv`brF1LU>fGH8x8TKNPP*^?r2jrSa= z;B1@cnV5SEG$zk)1v2v_fc@JTVD!uT0O2K-le4FDPz2@mnbT?H9tid9*)jxti1RNP zs-#hFse>Z{C+8G4%S+d~e74#VIybL_z_JtcF3_&I>HNpRS4_T>x+X)81K9tK0Y?8* zp_*H2Dfi1`@}nVhtBVDYp`1e4dH%y(h4`!Ot6P_$?2+}a#a}V+4x!C6?Ym;Ayqd%T zwyP>I-x0Q^d~9Cf@0upqa*vJV7J|?7-+UiL_f76~P4ypH|0wRn@uB@AeYd9K8gd+P zRbA_A%SDWXjYH;E7YiUm`Gv6a{D-*;@mJedw=P53BkNy_zh+)&|4jOZ%BxA7DA)x< zTP~t*n_$a579d0Ug|PGdhq(&zSKF6+T~qx>*1r~i&Aib5ne?UN8gg6|?1G^!7g4uE z=2jOAAVc|uu=D(fxeD=D+gG3}w%e8+=A(sJxoQiGp1)v|Z<@+a}m@j|Iq3ej)5D@%#%9 zw?Tge{Rs5A(ECC|oHgppy{@VL`^Y8W16^TB#Wm!(Fw&y8(Yj)mjxQYe%82af=>Y ztqHc=V*|J)kB}_q^M7L~;Rbz|W9*lpheIC$mG6@H{ZMM>Ue{FrbvRqt<$0Ny%WtA|EGi!?$Gx~%$4txyb-!5bPH%{AElnp+~a_2H|P$~ zKCX4jvwsIeWAg3X`LyvL13T@PoJwn#(3a<^V{&;LjJf6jWGJ@~_T_y3<(YN)ZcZ-w z6C8gQx-)dbcdqqp>KAy{L5Gs3H^n!^_?qMofqhG8=$wT5Wb7*{e9qPHXhiY~!C%hj zU)J&d&`(0;zF#g`562IH4zaD1VgSn!=U=X&%J<)sFbzEjxQ3Kx51n6CJR~0a8y4bY zxu1XKLEfuB0s0S6`Ciyf&_3m(a8|V>gW7;4<^2Bv<4$j&KgU@4O!W=u+o2DJPWT-( zxx`?=RwciwGB&iyZ>=Pv8fKW_31}#-m2&<)AM*ELFR1)B(RZNNLA%IVm^{qlCPV?2 zl=J_1!Q6)?KpK1q@~V=D!gw51{-!ng8z^H>g&q%mKXiBKgu}rTtO%%>T#4q4tkm=G z_r3g9%%h;MgMJ-)4YY~K=ZlIJ8P)_Wb?0Al^c=Kq51UpN_xv3K_MQ-^3w)m?m3bCwY%5+h0l4C$ogvT zw){;F+z1fce>S$(b3o{QeF0W{#^e?lvgFamDX>)WFV`}*6})|E8;rT@z*5Kmu^7|G zv%zz>_mx-VC)YV+(&qW!%6+79=b=Q>9&7Bk(BG2-FXGE}^Hj+JLGr&R)br4#EzkVN zM7|f0C66{vfn{9`sOgvMnO*phxpI!SX@fEM9N@YP8k4yf8fz) z8h(NLCD4$_-^T|w@tZmpeuW!(KI|jVx@T`w-8LGBxN;BwLa1`lrIhEzHbP_a0vHi@n_UV-b&(3r^o19LXCOa3zVmr(hR$yYV*Je0sw zCvx@=g=T>(evRG@^~0dQhK3{;hBHIKGV~n-pYj@zC66{vfhFbq_eI4)Z7}AZgXHAd zyuP3Fj&b(h-1#)|9{?$@UDra-fPNVIFzDorHu0M}R(-otK5y;^{TkH1mZrLGG!8NT z2bx1fDDiUGC&5%02v?yWPl8i z0Wv@a$N(8217v^fDDiUGC&5%02v?yWPl8i z0Wv@a$N(8217v^fDDiUGC&5%02v?yWPl8i z0Wv@a$N(8217v^jP z^U**uFc}~NSs1_>m-GK*=#|h)$pU~*$p9G`jR73^ouM~Y9{j0sG>{BT2FO4b25_`L z5IOrFL;roC`uQMBd^#lqWMDi7aK7a;zL$;YxFfVU`%7{Iw+5A|{dI!b3> z+FbsLx z1U7;(1Q>le&cB?uOI*CaK|6UZ`lJVO<#j(M8(=saDxZx~RL0&4jmfL~#NNdh0RH0? zq`Y3A5B(K1CCAX1GcosOXiN_5f;HD%fKA?W4aQy`Awm8&6!CK9)YfkVbB^;b9ISKk zjI{tMbA zj$-Y$IfmvTM(DbSLQBFEz^U_nxgmsMjJ^Qowz=AQK3{F$JVuUnF*9+%^It){;e0RM z9Mf_=$~zgm-B+c0h5N=Phru^XaZ|8O$9O+QyD`8_6B^{wgo7eaU&)k4C%2h6;Q6mu z703A*ZlA1m_Tb*DaNpSE;`?SWega1Cr)W0@m}x>n4sCKT^7NHVX>@X%i36VhidAu( zzufH;xwc%p?<(9kHo5q|S&Jot*ZV2jjR9tw5W(FxU!7Ov=_{Gi=;SsN2R#23tKvAn zGuraL-%9B|DGa)|in79eW0MUWs24FqI4b%At`@o)1I#p`0(;w>WnNS=rP0Z46zl+o zPQWuvj-)Jq%VzdNm+%39A8@fh6Btv%&?UZ~>tg$6DQ+DuWA}cFwvRtn+hA>*V`yHH zr>opHR-RRH9mYYMRk+5mMUo%l{NEq3<^G?FJV&w(G_=1aeSPwyK_g`pLlwS=uSs{G z*t__u!QXe@>$_mhHMeS=a@%s{)Yfk#-yzPw?6u=u{5PN--Ggm&49#RlegTviOEmL$gwVF4D1m7b=ZcsM{*wO{QtF!e*xN?K!f|RPi|aX-wei& z;WGW+PtooZdlz2@YbeJxuy0#4#?F&x+g=8Z$&p>K=9(J=J4Ao3oZ9-0Gyt$b_l~5eG%N6@45nTx5`bJ{;$wGjFDqqOyH9H z&4N+oT2!6}RUX=ua%MtO@>PdzXnP1S`i46H!p)HmgM20^ai;A)xp6UlGZVcZ%)NDCIk-DsnCAZP3-wHtWyxU$I~n zoZb_*KS5Pw9ppF3X4as>ePfdbio^PhE zxgY2K6zy(k`F&Myxa(piO zZ!n2mhr0Y$N@#4TkLSOF{{$X?Y`B-|OZ=P)_l-?1mT!jEH>J<}DcX$zW|{y%DS0#< zQ{?F?w`5AAliLao9tPX*Tn_IQ1^a{b|m}Ma({3#uEKp|lLm;C9#?8R;tmPS zi71ynmvf)DrN3eByI{Qh&Z(96qTzqLda0g&d(BgGlw4-^yydWIJ>)OacZ`CVmhya1 zj`MHd+qsalxhsa6()-c&#-@Db8efBdX3Z1FYo5MbF2DaJ_eH( zT$h(L<#`;mQ%bb{8?cNBQ!6|J~T;FG2xW#7vB%4geOKvQ$IF{UY@^Fk@s9Xb&2oi z!k>I^{WJ}bvHTHyZ{g#Q)dm*%%sPa889_D~E6=L9z?HfWtH#Omsh>_DvgD%**BCa# zg}kph8v1MKAE7gU&${4)zY-4#?GIy&m3McE@8`m?;E}%p@;*R53#^CE$lH>PCj3Zm1k94U~9S;tH!??{;K}(x6<4y zT(pq^GC&5%02v?yWPl8i0Wv@a$N(8217v^ zfDDiUGC&5%02!D^1|rYh-2?shIqYwty?P$;6B8LA1ML|IoPYUk7yCV$OVPf!jH8eN zGB6ASIB!wu69IzQXW`|0Nb_*O;L;nvd zay@h}DBlMy&*h%GtYp*0q))JjA)oDapKD0j?+<|5&jx*loqJ!?+~xP9^!w++$>cYv z<{mr&E_nv9*P_yAatQKl=sKtSqg^`t(q2ho^8W zjTI_~h(A`0m6q>VJTq=J1EGDWebqDjv1+VP*-wP|^s>_OozGPuD(u6V`w!YT1Unil zR1Oh;tQg35M#jRzxGR?dY(k#@5te`E@XJC_$iTo1@ca)<_%s~P|2Vw+s91*;{roA< zzuytVw0ZuA;kho#bpNl|=TCY5>vl*UJI{X}UYmL~`~MSWO;*hFrzZcI>i|u;Y%_lB z_-!!vF~{t+qS}XF`e?>LLH=wd+w-Thq3U~@WtBdW+?A&9yz-W1EF=$zBc|+=BWQBWs2W6W2!K;@z-?D*zud< z?Q47}@4kG~PdWpkb}(|0ZR#2fDDiUGO*Mb zSjq1@kh|RL-4yyN=+B@xKvU!j4EhxG&QN>5_?c**1-%&>leJ52j}Y(jWgxamrGNQm zy^tAF+ywd+$+e|?9`p44%Wv3iNbs|6x%0~WmJS0|`*rDL(GDqcKcpgmc`qQpPk*}8 zbKIOG(B2ig-u3(DZ_#lP^kePNauylrp8>x~ZM*+y^W_n_o@n!R_1)0c*LGhXZpPk< z`h}+LtJk1oU#R-nY`$0^nw89e->kO1+<8H+ayDbK84P-6L*-{;6HUMTZFoGiG=I7C z%KVlN1AcGX_R`6s9a7|~|JMSlGg3OUu=@7h(Razrta8U|1M}K}Vi z=E`OHsLr(fdH3yIFr(^z!7<9CFXxH`f?3fFU~ldX4axq?otRM4rq7>u+m_$Tko$!( zITwblp>|GDU+%mzzoo+f_UH?tAvt8}WYG?3C~4DIoLBVu`a8`yUzN`kj||Kye6&N$ zSveS}S|?*ewIsz_qBmI2fi;Iu;D1Xgv&F`nbHtk`pNpvmYr%EJ$j3uB24^gG%00o@ z{CT2a#bc>jCu3V&*@aqkZFSC4Ar^Q)?vtCgKeAMEXp1wFw|0ltSl-iD-Rsl2x1jQ9 zXvjxfxSW@Pf!G?kel$xGTvv=J`ZGYy;u4sTFJ-pa_)3<5bL4a})nKhyOIWr3x!}l! z&Z|+JX6)yo9=rxHM-;4hC|Dz1+p5wm>!eyWc4Av9#3GxseR9+GDN7}Xwm2hsYqwwH zgVhizpM`$;KkRQb_TW8$ws<+Oe+IBtew{;Yv!s)1XiTZEf24UlA{+UQ$B>+xC*u5g z4JB>*?0W8q{%eiRSC2x6j+gHeS$RGhYMYev!@wdEkI}X59{HuS&3$f*S|4)6zAS?+2bdV_obx57n)pI({|k_A}KFjcqcf zzYO~G-W}W~O^w9Xvod2&a@t@J0!XX_p+ASpclA<5-qXu> z{uOJeTx#cEzRzGW3m5WU;0e&DNn&6qm{3rt1;jU}aAx0CPuioOt9B`=53&JES&Gqn0E*#l5U?*dlI|H;r3 zpjPBrCixzt%3-MZzm@Vn;9%$$qbJf3fF{*<*$~EP!>jVn4Jr~_&&rIsZ#)Q~v26J$ z^#5rl_+rN~k$KifWxek_`tav++8yoBK<%>(XqH6Y104mGu|>XpU>VX!DWe`6L*~#W zR#nPf{HDx}#MZquV@~neWDEjmEG@T3U)6W|FNXb|fq6PVsceFAsIifpZ|sU$_d=nd8fOrcY# zQdX|f$#KGD7fzeXr?!hS!DXW%aICSUl>1m!@*WuN_}2ACAO{*e%}t(LI2w8r)XGuQ zhI}6Qs5PK|J@oz1KZg#4w!bifIYBX`B(-z;Lzvf7DJ$2=8+ny*7!u`n#@06;1khNa zYu`4$Ji}LYuTT9Xm3`;Yhd<=^Sex*)F4y^93YB{#D)&Q0UiU-y3YOya|CBY;+_kKo z)5n?&;X@M&mAT`GVxmvEoiX=~$HbD)voW~=h8>`at8>|R9)0+m=Jypt!tYVvYuf)- z)31GUU+{9%{}$ByfHJ5L!JMEb%}KR(&Y($j2<8*B?GA2}rrKDhuH2fgg=&)127};L zWBtcWu*Hs}%s3riSIV^n`TqZ1LvtHI9Bk+m=T0c)y}#V!xW}|la{U}sMeg%y{(px0 zNzikkTS)&>6TzII7*dkjIZK6yQdX{!I|mm|o64=Wi?VM#aICT9_j+O?=i&4OJp*HY z4VC{JY$NnGsQ>@LCh_{tqYr<;s$Be~scYXU=u?sR{@O34Jmavl_Vs~fNFR#3ri8g9 zHveFK$Q-)FDrMywUHqoZb>XzBd}_NWQ+zfV1IHRm?sLi6?Ncs-Gxc98n_wJjYz*tP zUvg1-FDj*cYBMP%k8I>m1~R?Te)>;Ky1&VYc(ymM)@Y_ zPoe9f@*3VnzK6-0OR4NRjb7Zvuul8s89fDDiUGC&5%02v?yWPl8i0Wv@a$N(8217v^fDDiUGC&5%02v?yWPl8i0Wv@a$N(8217v^fDDiUGC&5%02v?yWPl8i0Wv@a$N(8217v^p2PT~1$iN&i!1F&xi!ldKupe%K z{w$N;Fb63{A-J=!4sDh7s7yY~n(|X>MEP6O@5e>s&4Zx|cff|Oi7cD<|Hx)$y-eTs zs9!(Hc;O#e=PjUBbJVsi#(f@oCG<9Em5BXn=vSd@#@rW(FK1tK=)3&cn7P%(c6q-D zZ7W-&VflEgG2Vjurp{iBt&2OR9hg6C^5|N<6%PIY{UP*iP&or*rdJzV@YU$w!EWVE zXw=OS``7HG2KDdMg3dSqIC=gT)^~5WW)DZ(uKV+xeT}mhV>2#SXV<{|b(cq<&5Pme zKAk~kbO3zCIz{T6qhH?dsN9Ik{h)R8?E40p`!eXR0ez_$ja;8G-CEbc!SlbcwsM}W zJOd58=6hHp>ial*F}9ZU5eESC>C-$mpp@6{-%R_Y-z&N%aufcwwlmR|_dp?e=ZNXm zh6dnbohs`4y2QR*F;@M#DYtJDnIrursRf;J0D$oPFYJlUz=fO%mDi%8Yb)iw)G#d% zarRrEX;>cw`(T#^~U~>0sCZpE$Jf;h+&TOYr3KHe+M05+G|&Iynx1GD@tdgoH9XbW z|0`ghjL*1Son6N;NBTA0(D|R)$J4==bq1NyK_pMV&f1o1e^%arhT42-$4TAWZM!r! zW4g7j0fgs&ajlLr3nQO#?V3ql?(eAl7!_}yv};KpaX<`nq+fGgspntr{mJza6?s2! zUubCEb&QswG1{kNCgq6RLGbYWFRtf0voLbqSJz9+cNn`|JJbGBIp%uS#g1W)^lQ4I z^M5Bbx^g+a{>!>P+2!{Iv`gzfZM$K?F*>g_wrKi%g z9!x2f5`X^Xb@AnDbmek8|H6~MxBo=+dHx&?Gj=<^G`8!Sc9{<#JpZND=+v03ahLVT zJr~&t#;u_1pr=9q2<=mr&xZ(zdy6<98X80ZO1rs$!5n%y(DAq z2>@Bi=ijf3wC(kt&^qh2-=f8Z0ziZY=8`w`U_;XZ0 zREJ?qI}-Nm*`)n6N7(0#zmuFTwfU2g`QZ64?}>jm3wMTDU)?8i=2e3C0LNU`bWiBs6)Mk8i=WB7F$n<%p8xV0em*#{ zvNamT*+%_PW4sM@xff>bV=iZHY=hlbpMnnE$C{6h@%R7K9xQ7?j5q)ZU9CwqEM=bN zE6;vgIRXu}H7-Y_L$LDvm)B1IHe1;Z4ZEfXSR?B4cih^?T+Z6q4!btx+EposXHKR>T0VN3tIyx>1NmF8W8~SV3)BHh;cq*r+8dR%ikc$x}YJ zhW4xuU(V-0l(+V2{#t6klm}|(v^*N6wI|m*FKPz|z|8aS7P4!z!*XPwirhlq+voWY zpIyHd{F%1*ie&6wP(P-&oqf?O0st@1|Liqjc|WIeJu3d%uzWW_T>zuN0Rrvb9z=S``yQ16vJv{?$e+|XYnQ4!?DS(&ffA(+orx%uc@~=GW>DTNy zW0%)}l6}netcwk-#~bXnD)+BSc^G5r`M)>jJiHFWn0AwsR(;O4tz)#bHm$!~jnncl zlxj;VN9Kd)e|EjzZq`(u`(EwV^rOc9J7*hnIcsAB>nja*TfG?#xtC?%%c%V(*KfyY z{nr>H*T_Ct3u43pnvf~0&ZrqSsfNbh1(u7i7P(@XF9#$3<3*uW~^Tls;4&rrUx4#SxCK)!ZeecccDc5NTz27VH4wbhm* z^TG2!yH@+T^_1s1>^eTn+2!~23j3JrSr>bXb4!%3gUWL|@_Hq&+kMF)br{C92a+t- z4K`o*!@b?MPcVap&&NWoJz5``51#+ob=t+OrBq)Cwd?l?=`^x0>V@**_kKAzW?+Ciwx zykd1q;g)zCG9jF*m(ZK>+=&`M3g57*6`=X{zYr=v>=%$Tbv1X zO>sG$|6?_&hNax|tvtt5`@zodf7Z>*yyTVcf$avU{0+#VOX>gr^lNLs=PQ5Hz1{x* z5T{vtCE+6*EzX2GhD>BRo&Oz>(O04JeV)4Oo?^cWdJOcwP`?La?eAl(iul+A8XMco zj<{xZFK*~0je#v!ZL;d(Ew)~@^{U;|CWJ>laqW?74?XPgwMXpo+BN&X>cuZ#yXJsb zzT}7(AMu7YyTY{p0T0w^Ut6_CtG?Xy9;-H+^d0z&XYKp!{hzu2)1LZ}gZA71fPEkO E|EW&livR!s literal 262694 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

-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 diff --git a/q4base/fonts/chain/chain_1_24.tga b/q4base/fonts/chain/chain_1_24.tga new file mode 100644 index 0000000000000000000000000000000000000000..28f4550bde659c02aa6381a3efaa8ac6591893cb GIT binary patch literal 262694 zcmeI52e@rjb++kTn$m#VTCN-Grd^%cIp!ip=bxJ8l4e{uwJ1abs&1abs&1abs&1abs&1abs&1abs&1abs& z1abs&1abs&1abs&1abs&1abs&1abs&1abs&1abs&1abs&1abs&1abs&1abs&1abs& z1abs&1abs&1abs&1abs&1abs&1e!(Q{`>D=AGDE!n^|t&3i1t{1HUJ|9#}z`hQPBW z_$>Gx7$^TrgO7tvQ}~7*jdLlu4BQRI$vrgq9M}Z(c0o44%=k5c;DhOn$?paB3)rCd zAhUtm2!z<93eonrtOkcuek|Cl)>y|1Y-;XJw7zUx=xDKBH~6&nO->_G7lYHS5&D95 zEY+>Cqp@D;?4D2h>=F1#X!~w-wb2%(vH@nsFIR&P(gy(T|Gn(oVmP^J%Lou?#oc6J z?NR9GrcAe_7~4GXRQfQsbAkpC+i_pI9A`y(Wpfh!vjo(}W!wBXezi9ru9bg%MK-|9 z_~n1_LHZ_OvNwsX!J@un%>C;lKztQAQ{*W`;M_me>lA#tC2q#Tm- zMe&$u+%{IPHSYbvF`&*==W^KuCIjQ^Y_vs3BSsH!laJ?Mz|R&GwM_$uxzL2)d`PnX zX3ej_xHwnFp*DC4D(J zTJwBhob9@L`j=x2X?wrqAo6zXH67@RdlUY=z|y)#e;#OcjZXX8wHNAQAM1wGxqOrl zosG8W2){{Q|HIql(ENvBCAt5gX~LfFrGLUE0d42t1$T?7?A#PiJ>!$C2%4<_Rg2d2 z>q<)hIJUY6aXt6}7}y7rZzGLe!l-;OX|nw{w%xQL2r&!}tk zZK?k&^=m3>3rw19|4mIdZU=d-4~>oVXb8Wadq|{x%;U7~)0m`u|IchTihpRFI0n`}3BRVz@r0ob?uUC!ZR4&Ge<6@Jz5dsEx8%~sBvC{9`my`;d#Ka>$EB_f z$wC@!BN0_?7K=8YGJZE$R)ZrcKMw3uYpi1hHoXr6_uB;921Pph`YX;r^lGdh{ASV(-Tur}a!k@?xMmlho@!<{g{wI^Mc| z46K&3u20Hx$Nyl`dak4MeDi5_(z}7;T`yOj#077!OS-QUT{wN8zWnO%?Ah}#orjj? zDLBU22z*aKYki6TK%nE2-G7%}0*(PXH~$sTGrMu7YwOi_4D=3?&IA0tkx8!qrErV$;TRWhR6-F5N#9^|uqsdm?AhUVUxzKOGnLx*Ye*wP$CZ~|Fwyiko8hd+DTHDsG z;5s0`N?xC?v)i=X+aj%F;Fp26@23KB?g;J#Hv_GK0Y94ZjB4j>UP;>IEhKauws=(E zRCVy!xU`@DK9GDJyaBu%oC>Z563xjDpy<=p2kSpV>%8_U|TTcM^m0r?VMe`W2WmcZSy8m`Taj+ zer!7DI~2$l&B47v>v;SUuqr6qj~d&kI&Y&Ut$1i((^lI4{?Ep;8bn%ywhrTb(Qee3 zy3{#N@rlEHSgnh_wtWJp#Xwr~`zJv6fvkKb(mMW`k8Nox+dKQlqwVVtK--)hgRO2z zR~l_mSivujt%26OMEfBf6Nk7}mL*3ZM<7QaM<7QaM<7QaM<7QaM<7QaM<7QaM<7Qa zM<7QaM<7R_E&|*`{A+L@Xe!s%*~;ZP0yzT9R|Ht}dam%=Xz{;^{IVLnYWW&r_BKZ# zN1!eOtZ{p;c%It_e2cW+MY6g9U1uwo=LqBoEMF0DYkUpTUjZf`CgI<|DE9%&*9fz> zIRZHXbrE2Vm+PAJ67W-CasmloU!?17)xM<-apP z={H!H0h3RW&~LDk4+NVpFp@D^zf06{dh1k9U`unm5x5)td&t+#_m<^N*mfUf;?FSysZ+Qb7c#Z|xU^w(8nD@EU5_&C_K4M$a5Y-o&+ z1)BT+4EbW*ZPHb?o0bJ0{oYb*O@53MeH%b)U=z@krnVh6wgE?js^|T>Cf0G$KzK>=lopPabm|Q{cFrODh@WTM4OyX;_MOlNND(ObR&*Yjj*Bh-$o7?Wv@#evy0~5WQKy1f-X`7EK z?YDv6-~V-7*Vy3Ee*murRr{b*T|2GQ!pA-V2sU)iB^ft<@mUP6CEbU5-t^Tt8iHnp zB>DEc0)RD-kCE5&&qYzW+8hl`bevcW%D!EL8Elx{2kQE7Gybw|*O*(s5PQv`tv|E< zcdo9SW6E^>YohI>s55(Abg*GI8_j=c{9W~32ohr8<6M>2xwgq~QjHsfp6f}0;EWvuPWc=2A66;_5ZwdrI zMsExT<~h_!mA>|gL9lOTOPirQ=C-`rFQoPVMGHVf{f0g<_kH2Bn3~={_^?l?i;w-f zMzFS}_BPw3gRMYWT>tG&CWd^GU&nwp=Et^`y#Q1p1KZ$O0|^=!F?xWTy!qy}HJ{Y_ z*Yn)V1Ia~bU2j+NTX~-l1RJPAnv7q*NEXui*ZEdcxtWH^{s#`W{M;(7`Mv>M66$m> z$jg(+#CPHIKQ7&wtE!_Li}4O@gH?S}ml-j7fZO@z<893+wf@DWXKQx7H*lZV z$kC;*ed2)~@tKr1Dez;C(`vtv*1wHk`vE-+PG5u=-o-&zBhVo**E7I~|A+7)4Xh4YGZ7SZUMaN@bLk)uTo_m`!?8Q8mf1{BFt!sk# zTF}~>xz;-H8&$bYh4RwA&$lKS(ZSiR^kGETWK~9tZZdvr-g_Iskj1yO>B>~6d%&Lv zl{)uZEu^JNU;6|CJK`}ZZBk&qRcWQ4fpx+0KYUfS1 zN(Z~BLK@9~D}phNVYP7u7Y5hhnC?lcA+~+LwE0t|b^c|N^8G)vSr`AEXrOabFJ;?4 zLBOEKX;RvxplbY9ruGYI{Wo3vcQNiO!4vw#-1o(n#WdDWqfUGh&5P~_#cj&Gx7j8g zY@!Oeo4?Cya3tlr9!>V_Lw;hy)_dD-GJdszYb&6AfUQH4 zwW2kmYw{&c?bo%#hRx?^9h;u_RqcQD9N51nd@=dnF~Y`!fQgDi7n4YO??99djQWIICi;GR?K-Mro~4F2wbWc)k zTy1qutN>CXT?e{CXqE_ezkwue4`n2oNw5BGfO%h+wd+I0P|oXYnRalf3p^TBh$ z`+@S4T>ql#4vJ)rZhy0)F&iEM5_{s-X4;Q2u3 z!@BMmI4A5(R?!jL8q>c6t@$Is?cggw??6=aNM9r#2mQv*zD565(r*KjcLMDT%C>zy z@wQr~^^96E`VLsLj~^p=A41(tK>L~f>)Q3}G`s(hRK8=Y+@31Z z+TJt|1KV9iyUy-Z*wTLH*Fd8Ez(c`+kDbXXItJT1-h3WNeh4-J1!qN<sd=*qz zNLQ}hFGnCpV17k_1+BGiqHFxBwXd>#{Xf5^E_;(B&^rQQz327cJCfNzj==I4fxP~g zzd6eu=Ln>VKwkf;BAM;v2rPdQ$m@Uko3re3jzFpiJdoEvV_y&G_imDhgSva4zFfbN z^>RX=xxkRVFWE+te*Z_lL%!HKpl>m(0s0K9RbRNa1o{R~`Hl(cI?;XTkAqEHk&I}J zt(o$VaBbpMjD0m=@_@Sk&!DyKzbFj;;E?xgy(+EmVwl`YV)Z_gM1OIZ=(pZ=zr#43 zx?{m!efX;SV$=IjZUa?qCs78!|Nho#<_bmqRY7_ z?YI54$(Qd2cHxi2yur$6&*Fn{5Am=qmfx z`B2$-0);ksbd&L0^Su5iFc;G{8MZxJ2eH=nU=r7r`K~@=xU@lfLvR=Px2RlgwC}O! z1SE_94OaH;%CCOd5=^vT*}DS!P_{of2K1q;>?@nVq+ElQjVDlO#ORWnw8bXY);zEO z3CzW`O^%pn&HFUhzxe(Y=pOvWz;AaiA#bAlpj(5ozE8}89kbm;_o1uo8~ISK!OF%H zD0G7^xr0w-j9uQE=k?!nE(oOVr|Nhoc@L^%RmZ*GIqs_Z z!ruXdEi#VV#;tb%w7ySqb@qIKqC(E+ueI;RFIR)DIm>guztl5^7)vPI2J8V^jIdc# z*#su#8f@0Pe=8$Km)xW+HnFzm3ugU?v7UrJzGmFo2LA&bp!!texc-5(aiiRruP~AII&-{9($=d;6rH6S=cf+^;LY`UP7?(PaDYLs!|i&WFmz z6DYL7qnnK1nlGgF|5O_ky12$e+qSVH>347W#6kZ}MVns!V9)bg`p*NOzKNveIZCT1F{uC?^o%6 z4IBo(4NSgBVs%ioPv!uI%x0wZT>U%1i{8;$6Abm~>Q9xePzJy{dXO1ZNEAnYC9yZu)(97jNh6swDqrT;f*#p^pW7Kkk{JR@vqokQib2_Mfz>z zz1&7-Q()U_D*D2Xv+Fs1TKD92-BBgI;(@_(Oi|jddvqOO@+}hD9}o5E6OdrfIGSw# zedsFt*7;D`cmjp++kGDCq4>Ho-LEoPFz^2{AV20)ZGb^*?Y|h5ZBk8vx9QSBCpmH}av}2UWG5L>c@S0Ta#bvKpLWjnEgS@&#M7=C|#@^fhjrL-*wq zj@$T5?+mZjyotW~r|V&>FLWw?*@A^8k{yqW#k+z>+o` zquOF?*8G0E`lo2*x*k6mlx;?hrA?i;Nm}RlT3aUXC80R~3Op7h=a;X}uFkDL4ZP^S zsBg1JsC=I1!*4yZl_BPw5yYRN<7}vhehjIN<)z|TlD_?;8y8mW!1PT5BV~O?w z2Z3TOOkmuLuUF_hWy@G|ln#_dx15!)qiGOhKm^IVhHknpk4 zKHy!U@*Z^R=l_1cBN}`5=zY-j_O0L-;LlRUU3RdyInchv%LmDL{y41|NxlZw>FN)C zW4o5OdAH+EoVRv`?#ds=KVZxGq-z~ri|d}?ey+R^U1eWqdoR)w?O(U5Y&?NNxawk{ zZU1~Axd9BE52bPiyD`6?Z*2pXA841D|0H;hukb~jD}i@|=cztRjzEq;jzEq;jzEq; zjzEq;jzEq;jzEq;jzEq;jzEq;jzEq;jzEq;jzEq;jzEq;jzEq;jzEq;jzEq;jzEq; zjzEq;jzEq;jzEq;jzEq;jzEq;jzEq;jzEq;jzEsUbR(eObU5gDKi2?#3q!wy{3O^O zlx?Q#U1rM>SeOxDP3gNgKLrwfd#GGvBhn{O=jE`z(ZQJK)$g8n1p3|Cqk#4S`W9K) zrZ1oGk6rz?vyCMG{*d=)+Gz%^@7_qXzt!&z%Q#1A{Vq0^B<^B#OYm7BAI6D(pZ{^N zX%g}Wun}UYxqc~-6u+%R*Ui6`f2n9a_ebAIUa4;gD>$_#9}4t)SN-N%-vTiHzH|fq zgI!c1`mOP@8XQjfv0$$O1Iu}a@o3FUZUkkFqqOEi>n@fgqsOS$zR77M>gM2dYlOZa z3Hbxq2r<-ruL5oa`tE4m{9E~BXyfGoGQA@x8xfu!NWP2y0(hFQ?@j0o1iPq0w2jBU z4CP(-T$$B*{XPpm`g)-G=sj}TsKCEa_LhqB-hAFbu#YMvum9n>c#Z`p=)=(3S4ey) zJE!MN6@Qz=-U?HIi+(6`p^237K}y(YY-GeqLou~gfF`BJ6z9i(;CCWS;?@psUuu9crt zvj!-9?CT45v|X9VkGktWmA|eppYM-7jlpCV>tFohH5oN_fBpO4ejHuXklOgG*8kb& z6k6Zj+di~ksO$d{H{LTz+g#|J=hfhEyT*A`KkRB}c){y8o{^ezPmHx(8GCYhZE$39D;LSKAI-w!a;B{a0|-8tPCH#(^qC z{CihmAIkOz$AAtj)m>yOz^{KRtJ41Z_vh7C+m!}>)X??+Ur_dcst9rt+I(85>tFLP z(e`L#9nkHf+pINQI+kkfH<2IE=ueti9^DE%17jn9F3|Hfo%i{=*OE8+Er|_4SwEU( ze61NqPxbgK&%!vI3uBYx2h^}d;Fb?f*T34DB)R^@nAy~tws`2->vcwi{tj3jSp7m> z|2E{>?Xcn0wrUpQs%I>=zx^TU7lTKEX99ia*W?)_TG_8_EISc&9WK#&w>r)HPgEG> zt!S$&be;XC7ltwV2;de)CXfF<*=PH-O|Lpqb$@tz@SHpQP-^K*s>p9|}x#pK1#* z&~FUQ*lIJ5p7r{lD!+^4d|Ln7&)x0jswaLtGJ#LcwU0meTnafywrKX{3&%kL$exZf2!+G-i7g)3sdEX)b2Idb*KEW zGSlXx>C)F`(H-3iW3nsJnpXPr$^_AIK=*!(+jL(4qr=*&HpKU?5c5B+h_~XtcBq$1 z@;^|pWAhnnJqOggeftA1JCcdpwi;_yV@EL6^(SA#c+7>V@*C+GZ9bZ|=99SoKgf&+ zy&u|mz0T{uYD4Z=7GiA2fF|pI^Nv&l-D>7m^Za}u(K`VqdPmc517&)^Xorjupr^Y2 zm#W<4(!v4U_@hVSv)mv6DzCJ)-Lt>H@nhz0_}h5d`P|i zFA`~x)6jA3Eq{hJLSHx{w5_TfpP8@Q4qDl5+89#B`NTkeJ9=~AW3O}nYk}l^(A4zE zcCu50^(g-lF!?Hpy0#-Znp7GIdKT+n?^CsrWWWD|)M7fz^}k`o;9ur^GapUs{XaV| zO!6B%>}>_K53ut9lC`2(eF7|LvTZeKQ_D15(ZpQqHqa=x@$al;Xr^Te+|IxhaI{!mJ?-}Ts;cpmVgLK7D<`rp9D) z8VS4Ji}m5u9o3i5_s3p5p1mp4e&~Ck>e-j?-Yf06{rZo`?DPKm_tU+|LucoM#X;NR zg+QWx;6H;$f&T||EU=mQTSg8)gsv*Wf7dW>@CxQ&A4s30#W% zT6MgkT-RQ@7ckJjYi0zOe9`X#7P&S$M^V{8Je2P%*wA^!CBUx(vXydPUq0U-20xwy z$o~QS8Z3?K%67hgpLDRVxZVSriejYw@V0%ptuJ=UaYgBekoWVy8u_95H#>cF#QPZX zw*blcK-+w!k9|0E-yDG)fgFJxfgFJxfgFJxfgFJxfgFJxfgFJxfgFJxfgFJxfgFJx zfgFJxfgFJxfgFJxfgFJxfgFJxfgFJxfgFJxfgFJxfgFJxfgFJxfgFJxfgFJxfgFJx zfgFJxfgFJxfgFMP907h;wK34|izP$9?V_yecULEF3Gvr9@CqP#0`TiSPQR~cHTOr~ zh|>3{X5@XQ?Hd8jUBFD{f7bjKKj(+VBi8y3l)isvva0n>p)o4HrlN1<>Dx#<_T|Qg zjZ@zg(l=ed0?w+z+bGxfz)X%HQS|TQhuNsme@@wb;5wjh&zP^H^!BtfS+kE{)9j1G zPXijKzW3Hd-kQQch%A;fng3byTMV5a7LO|JzfEObljy*IE?VE6lIR;$`u5@35iTZg za#>$;4Eb@MYK9x=pVLO)tt$HW@xyG?XnlK5ax(C~)}=QqTF?FIjm{fgl*Xnxz{}&9!V?CELee-qQsP47o zO|*?}0Ls1=$1d92sY&lnx#X)r_o~F(NV@nli#~2J+Q!Pbj!LKSv%>zllud2^XU%Uh z#E+f9w}7rUV^P_E0sH@)s<*C5wCqLDaaf}3!MM(@3C`?GUSWF&ks?~}#=AP{pQtd% zThUfm=steLwrcY44BW?t`sbjp2m6P-`Lh{$lRj=uwXZphp7r{l>ijcan>W)_<+n-3 z4;@=fjw2CYf4$x+gSM_oG&XJg(*7CSjZvL%*PFY>_9rR-F|d1XhmtnYdFmD*nIG6% zA86fH!Ok;uJ|ds)2HOGgZvs9I-UW33N@cQP(mOuWGJwN&+>zcC48*r8pTf5)yOd3B z{%6f^F~kqM?>g%GYm&$Rz45`|->>zYKH(U!V5H+%!zl*{Wmpx*7%`L&lF$qe=B;|TU_Eys3O zb;O$o-VcVdSBAXx(K*2vfjuu!vp#N3wJ*Ld2D-1Wd;ePN!hZl0?E`GAg-+pMY}4hZ zGXIWmU~H66h2LTbpUJG&zm8j4YyKUBgUMH&6I+?N-&tcnj=SZbPo3nBIaU1qEPt(j zKzDY4j&(Lec|pvdr6Io&TIUKnPunV#nGNkP{vNz5ppRQq?Hi55#-n$uOoq106b@qC zxMDq(`JXkv#n6I`9*VQ`agxV>#sACBkINlzJU3gVkI1!)}v?cU2#q)oOYVQpU&3NJ?M{NKulbRWN_*>}Vks48S=yG-F9mWN^%%BC{^ zv*x!L77?ENGZbg%QkB7(*E5@Np@HgClsSGXJyYw-{QG(X(9t=7#QZ z$J@K#uC3i9p8tEE#%YUV7tLUdNALRR9NzM4lGgojt^YM#x$2jII|CjX)mi^8?#!f5 zo&S{Y7O+d)CWWK1&93>bzI5e_`*r2Fe%PD!{eNwshB`u#uS)boXV zfv)$p9(69LXF^(w&jQx2)E37sy2_p_BU#9{{4M!HTE~8ge2eRfd>4Oa(WlOT%D)?+ z`(XoPOyOs2Gsn6`-lexL8^i?>mc*7c^gxwAptJ>n$ujD3IYeLQ))1~q*G zWnQ`txw0RIHIB<1!9S5UZm&;uZ7#1g)}jzwb#togaLK#CzZI$b?>_=v*}etkP*ZF^ z5BM=!+F$=atb$wD{+9sBfndnDA+mW|Q003lLlrV~UYcSkSRRU5DAT(iA1IjTo=McT zE6Th2GJ@aujtxG15G|jqd_Z^Qw|>}tBKQ{2aW59_|8$JG&Q&b7z9}?zHJ}wPDn`pG5arMjm^q?;I-i9Rtm~-hq*P4#>BmKAj!N9diV71abs& z1abs&1abs&1abs&1abs&1abs&1abs&1abs&1abs&1abs&1abs&1abs&1abs&1abs& z1abs&1abs&1abs&1abs&1abs&1abs&1abs&1abs&1abs&1abs&1abs&1m<-Fs(w>O znaNTT`pubiA@h1L*|{8n9D!C5U{MeKrZg;dsl5JMMKd?f5m>$=kk|k6HDB4=9D$S( z$m>64G?y=1VeXGXn`}s;>U^*)OFhDfZ!7XwM`fughwMds`qt9H;3A-J>*zad(#jtK z2EN5KWUNI2wiMSBfyqWB%2?N>TTqN`TEk)fO#J*m;(s*xKY;In)uXymanZMsOx7Gb z=+J-;-sYacz-OXz-$v&o0>DW z=lC8)`ny1)?@pcqUJl*}^nbP_s#m+h$Jkbze6WEkq*457*@j|lTiL5X;ShhOz5eBk zeS7WX3csp+Rhf=kCS%8J4d@WtyC4|ZzoO3C8c)@?GM7>LGO&(u%x4|OXyY0B&RVFq zaThxEc;HwBo(%Q|`u3)dw@MpUOU)VEgG*z39MJ!o(l-cS00zcQUf*MTDbV+l)lThW zQ?2sq4@?@xpT?~?#x<6`3Ybr`SpWL=`Hetv*73mmcMka~yoYj=bHgnKZE4>-` z4frv55QyuQH_tw!hTlf&BC4K#g9SnlrWsueP}xfX;>X180KQ z13$ky7kD!`6i99ajn6e>PUYz@m^6w%jjK#`E|a|qm`}4<|MJJq#jhgmzrksKjnqwp zfsv}QA03SA|0!10Ya5ZA4t4=+fuVLyeVApt;5Vue{a?9H0~_C5>D*r(ll2YYT~qsu zP1%;{ykGl!?Sl>5lAidv6dXqa$@_ukQlj&Gn^(=VMBnRG*@em=NA`&a{f(eZbo7MW4ADRov5y1R_W0O} zHvU|L>SFuV+ITn6cC;yI?87V@%1_|scrwc(oZuRKEw#VScJ1*mHD_!OA1)1k=>INQ zO#J$PFXh@#Jv`L!g_c|r+iH`izi}1D_@i&W$MOGrs|>mg#n`skwC&z&qnzdXUyKvK z1o~e`Iv$vRnuD){(}32h%2Td?+1nZDIQS*t&p*tEO(@?N$cN7Z`Dh}a*BTr6dC&kq zH69Zk|80D+zAH4kC$-x~j-KWE*PKc8zuzn-KP0_3(Et6p8)%!;HmQ2urP}}7}tBAg_Nr#_UcoEGD;+Ugn@V|G!YL>jKH8edd||#wA;g;;%j_1$+M` z@*1)AAYDjGZrQ@9AutTBf7PE7D&OwfTfZUQ)JJD4m>=R^kqSM7ko+YW;;Jia>ccGC z1>aGHG}``B`wO$Ktxa@)_o)F-LmvpXNX;4BgX5Jz@&T|`ksAJ^YlM#iZ3EJhl=uG| z#UIYt{a$(O>3MgZ%$N1Q2nW9pwEx`&j9iCJ1LEwEEX2m^?LUSZom=R*zZ&p$wdtll z%(7h=3#yPt+h1ybVLlDm_4k}7gMS~NnlrWs-P+(5pzTZd`)cQvI=vevxgM+$+iH`i zzj#a<#h=D)D8{zMo_OoT)`N5*V-2=!fKiKeU>G_ETfL6I5}oU>4y=4gH+8|;AX$iw zH@10Zs6QSZ*Hz}5`Y_9OVJu;2#s8A6919I5dH-LWn$Hcv&OrNGr41`jI!18GhbI87 z1)Yx^2;x}iT<~C^_jG>+bX@4=n)(A1amSpNSDi^O&bTv1KWm07w5^Bvu>KVby?-G& z30Q1~bUenoyt5&j5*u%9a~pWBPb?^r8a&RiR7D%oG?&S6L6G?~@<*KclgZ=*_1pitX` zbRm7lTh$k%>jIryo7AmA#cD$!U$qb39t>{ka1$^Y#ck((pQLdmuP?9S zn{Q?K`!E|gTJJpBeK1#CB()~B{qK@`4A}IsTtr@L(3hpA9I_YjX`gr~xCrR^kH#*o z}(25>ehdJKcWT0_@qi80es3`G@A$x>cS|KF0?mcK!6$htDCTB9#3}nQnFtg!J@;p8o9|dphI!z(w^jQ9 zb8X_^U!BzWn%HHKdXKP9u4rPTPaBB!+k)GGzVW2@LG>LG{T@#5+pY}yn9qIZc?6hW zecM9vaj*>R2#R?}Pjvrp_R)U<^qnj53r7KyE$4X%d%4FTwbr!uwEwm9uPsB_?|T_< z&>0@h@gYE>-#00LE|BQ^BMq$NCd+FCnBT*|SApI?H_>kaE(JO_eE6ishHX3UpGZ0u z{RZGlF!A4CPHKEj?1n+>{)ffFw8|#F_yVu4!@dC&^Tz|72k1AqKLrnJGLGD4`HTSb zYunqJq<00c0T+Ou0m&rq{~5Qgf&Dp$e9>|7D$wg22jgZ1`x>w02w?t<>z1s(V4l1G zS#k$IX0`tR6n>qDX#MNDAg}*qvpr~t*e(sQ@4A%v!IqQD!5?pTme+M)A(LXqxN%kK zz<&R>lj4_MNVMO%8tB;f0#NueNltGYKFO?)|91ZWZhX=B&jk{ddv_O9nz8Bk*ZT$R ziQW*D+v21L3zv!3y?9NgcFzk!eP3W%1>O{#`R%0Qfc*n1c;$he zw>R*jZQ$vk*e)jRq$Ae$H>>skbLU5#{1pYSom3pK{l1vc<+U!(2P;mBUv{x?cn0Yc z!7*Us|MStt1lKu@Jv&!}`>^1@Uh3HHUYA~3m=L|*@?f}HK- z2-HL%tTS78TI0pKb6VFX*INVhNvcaFvgJUs5M2l5^`9!p*-nl?O$5R^n_G3&|9|2= zR*AkC=r~-Qj=gQUl0vlld~ zkkXIV1Iit81abr#M}XDl*T2sH9}&v7LhCx*|igDKH-VBMEUMU(C1 z2+Z3EXoGJmsRseCU;lDL&)@Xy_lwE|xe#5heWg=LWcMwBPwFe+MX7kQog9Jr8UeS> zk4>f?1B8D4Ywhdz2VV3J>PBE1>tElSxEPd@dc4_Qj=+4202{mB^=*XIzQgO+zg>5~ zm~y2huL1*WU-?uL+5RMX6a7Di9a8bkXFH5@b+8-IyHJKFkk)fooHCL5A<8qp0A=)Pl#HOl$ zpR!I_JYlklEv_0+T*$hqox$oV;M~IcAOHM2$yHKwRoR0l z9*k23$2*?ldJ{;&?@c)2S!KC?%ZAv^NKvf}=SpUakS>xXqX#D#Cz4LPXL z!((%9nxaDfl)qM1=+ypTUokf+*Bu3ZE}l7pg9m$d&`iLP|eU@r<$qqkJg8 zbs6&J*Y@O}1d87Wj*3CI`%#r*!91(?#D{Hnr_q&`==Bve_a0` z3Hb-g`d9oH0h@bi_Z zawKSIsavyxrTL#ptbd(r>0Zk@;AP-ka4*=m+lborf@ffjlQ)^h`rp9F(6d6 z|N9i!0u(W67s+m|jSH>w0G;<2&mLU4&Cf)h!@;BdU6pA4Yk$yfU=4f8K3EBS1K9IF z#o^aL-zJ#!^FM9pO_BUt1aNEo&j8;7+7Cz<*FFtH*sB>_wtbnVsE~=T|6Y#g&N%`( z0yzRX0yzRX0yzRX0yzRX0yzRX0yzRX0yzRX0yzRX0yzRX0yzRX0yzRX0yzRX0yzRX z0yzRX0yzRX0yzRX0yzRX0yzRX0yzRX0yzRX0yzRX0yzRX0yzRX0yzRX0yzRX0yzRX z0t-3<{Mu2!1NL~@f*x=lT#i7FKpBC#pF0oy{ok@OCvpUG1Qv7z+{)KCK=j>%O&0Wk z^Wbs>=0OBlXRmN;uW9l*G)(HfBQC!|l$4;tn8r|nl_}HrU?tmEbW2(UhrT&#@@*2A zSSHf$BdkGQF)?{?Z{lD8gZl2%7tC`u8C}Fy>IEn3$yI*Z=y_ zx8_W~Okx#KFCxatDF1LJ^I(i;~~FY@Z-nmV*l5lWweFhL!hnS?rBiY|7eTt zYmGc`)XjOxPrLRcBYMbQ0ICpiS=oRdVWx9c9amI7k?{u(R3WwFrgoD2im|SHuP(fp z`=jrm?f?ej@AI7lUeR%mviMuZprTpQB0rXpJ}dZflGP<8tS}aM0&QOZArR#@VDn(Q zB80t*us!bn$A8mC=SC*IIn4kDwZ2Sh$4vv(nOOJU8iRg)>-eYh8xvjYXusgwl0^g=cTl`XJBSV*SpTh1a8_}4q3qCyAmyhb7qAqX+>OYR% z`w-H3{U_e<*!)@W(dD)`D*mcVC4mQ3$gKF|wfzXZ(e=N{RV4JBaG+hP7|4zhq01Pg zv|nY*jpr$W|J$xC`95xh4}rdT1~U+2=TE->pK#szxv=1)%Wcoa-R47eCcb;GGzR^) zKkE65-G9)zN-s{|Iq=&Uz1DMRFRv!!>%E!YX-8DfL2sjD47l-J5cu`K-zGN3Dt7{3 zpfA+P{2lfDJ^BBngip_VO~$={pmtS5>0E|A8?X7Gb51Msx--Y9jz)?uw>{DW+d-(a zrlZWYstY`3SNcTY$E@`0R1rk?Dq3-jYAjnd(DN^UUqr_ry(dt%A7!^~9d=F1IcRI6 zZF>kcmL)*%cKrrC2$bVfdeRd3P=#n8|54!I^_r`h^YNQxc1i6MHlGM&TXBd*zI+Bu zk`!AX+>)Kn(mJ9|dkA37v zt;ycJW+3qB8slhi7>KVubWQBXt{80v%tR86Jrle3``aXjM;L+d1%dQ(bY;9pbWc(R z@9Mz^sYdgkgxDE@w{q-J`9zL?a>McX=T0Y39&d}!bZ#e0!ZWk`A7SjMLK@9KEmMwN z@jr8pzVY8nX_@r@uvaio{P+KGUKw}~K>O{mOeYI;jUjlq3_eITn*SP8or~cu$6J$L zMEQNdq%&7lM~oW(<4NnCGdmA3KGXkP)xU2U#&u2oEl_v=tTRcZJ9I8U9lbdCeh5zT&7uUbXG3x7hP# z2OWCI7JDD|l2;w{s@H9?l&U@V-p-7FbcHP}8S9nTUtyJ^Y`=Y^Q!R8Ygqi8&k>ASOnm z2N#m#js`Fsi7Sa1QH%mE2naj`6j9&-vM(>+oxiH7>8V>?)l=PF^Uqi3+`p=CRo(i& zulml?(=-2)C95wPl}nafvShU-t1TNH@DCNB0#twsPys4H1*iZOpaN8Y3Qz$mKn17( z6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$mKn17( z6`%rCfC^9nDnJFO02QDDv#G$URjZDHEqCm(XfKJh{hWCcV~^QXfvBm#d@6vPeHY9v zr{Ewa|JTO28=Q#`p}pOFsz}yUU^W#%&Mt-B?&R@Gv^Rz|Jq8@%%#r42Wey7!paQd_ zfaEMpp7Y)ERvd)#e>L=9?o4mUd-lEgsyk+Om=h@#paO30qJ4(RXzBuZb8V-ocX!87Q7S+MW=8=xchTM! z_8`obi_vhO|DTFuxz=aP|DfUa&kk`Sr2od@NLe z3e1iIS{}pyT$rz10jKZ2fYIZ@>@X)%DlohP$fZkStSh8g+xt9j{1>9G7x~_gI;Sg~ zj7tR;qXPBh(vG|09?E6($@lx+vH}Nd!kGVEZ3yGel>%;Zh1zo^3dvG|IZ;5#`J3v` zv2!8^X;Oi?Qh@p2|8_(3y%gPZxu4xXtN0Z`a+e08yP{uxkEis#s3~SV!tO@`>%k3p z_v{|U64BUK`263Y_z-*}pXeEVujml|)S$O9*4QxM}rw)V2At>S}g-G)t3ZH*}qWH zCui(Y05JbEYFrNm%^UaLjL~wu(O+M)q~i|xE2s0wU6KTL{|3ja0AT)ic(y=u=D%{{ z8Mn=k)H)Qk!yQcz9diz(M@^rh2*&(Rmoj=r%-)+Zspo$+J{rsb13ToeoX#Wn08I5I zV>Hlb=j%}fWB%upcp_5F-kUL1KBpc}ELxDGL;eV@mVy)*eeNcE8!ElvRRA#mJ5(Q< zH}1U|!~9>+Dpm*ObRM}o+|l&VG3P*f)btsOV9ft?DWhk^?7bNid)`lsiv}~mzz+E< zr}M}?08@R*7!CB<`Fa$=nE&}Co`@8)_h!sQUdQ?;7A?rpA%BEcOF;_o^?y;D(K8sF zp_133(mL-EbTqeTN=eHZj9u^##!Ld)@!%K@I)*R`uL#EH{|?2E*?Tjl_2WQ?@TU&l zA%Ep`9=WH+oijj;207Q$Vkv?#|24rf_+$3oj7iD=H8AH%u15DPqb0L6-lQdOu9ca#)Axrw=Xo1ZdA?df*u& zfP0e$8CTOoDSN>D*Cm^}Ct~lFZHaO-|NSyey>B@KM4SUTms4Z;rQ-L0RKYTIMC`q? zEm7{pkpE4ud$j(LKpA!}Ux0jnP1vn$@ic#{AE!@_4YAy*FcmIUX7_zG7KN9r8zLwG<@+Q1bb| zs2%AKOw8V!G0gvkJc-poO@7g{q!M!u^nq6qjL-iaiXXH0W=!mPKQXRD_)~}OkiT*| zkK9w^&KV#^gPiMWu@u3W|C(SK{4slP#!TdOtUm+H&O&s^AEDLK8J{+Rfl~H1RN911 zo}&O@{wFILKLMII?!6hq{O9Zc_!FzeNalYF(Wacj{O|1XPdS}O?kRUI@AQ~+An%I) zXo_Hb{`bq3#T&EtW(=SI`TU>doYR6Z|21X0^LL#8@_!|^=??w$kvrtCoX#Wn^uRMl zh|wV9a%w0=Fh2jQicQ}UvG>~jt(yO*h$;X7<94&3@0=cGcM&4^w|(7X=zFW~2(^eD zqd|+X$y2;aty=W}{A1@@a$rtS6^Ph-Wm}@%hpUSh&;b_mKioq_Uc;n52FSh8p|WWK z)GG)8+Vnr*HmnAB*a!*c_H_th?m|P?XS>>V&@TP|e?Fsu^FHWL&Hp`{VwQBG0qg!H z;BCNAb(f?au}}djKn17(6`%sMtpHwN#JtXv@3`&9FLyj-9i3)FTrrFxv{4oRw>Pww#29Q_rm1bzI@If zDi5RczhH;Ls~!gyk9uT61!h|Td? z1tWSYu!s~uUVg+$)aN^SdY9vuW|hBzc5TY4r@(QcamxL}qZo@wK2o6qGpzt}^7|$~ zrCJwe^W1Tdn${nxeRJf0V$1b|OJQ%J9sUL#5#qHDD?s#e2aj!ES9~U1B6`%rT zD1dylpY6$a{A|8TeFMxbJL16Y_qE;e(zat{u9VSZOc~6Hf(lRp zRR(jSpaN6?Nh!bAVariy*qlwR>!1J2>j@iU3%da7qJJBoX9N|PCk2p?2RpfW7TPvv z-S-047pgaL;z;wCPOQD0zNPb|FS$~Ik`+K+%4h!a*`E}7&bIFXPDWeq{r`ES*%%l; zD(=06A22@otg&P{h>Z%&l>(BFuv1KaO7$_A_+BjsiA6q3SOI$v%>HJGye_yECgp6{ zTy#;=O}znX_kMtTar|zW{Y`+F{C^b2|2@pTfB5fkT+N*;fk~DM6s&-om!>V( z0_2__x7>sSxgSto53C8Ra@n+(qL$}(d9N?;9c+=ufVaWM#uqFHp;3XkQlOrj=2$)x zl>370dv`ReA~}6C>}RkQusdPC@_%qX3pSSfa?C;ns6ZJC`0~^7?TYr-VJSuO{xz_% z-~7UH^*B%lbE2RERKU&4Kzm#Cod7!$%Md@CeEi#~bG*UI|C?>rHR0@xt2P`L!1 zDRu?M%jcq6IlLt00kVm|)u?q{5?>z{XmFgiS@6qV%60A7bKs{K+w|JO2ZO!=6u@3} zasKa*xLP@H0GjHO0NDlqvBwH^@j^PF!MC-|g8yYkqcKhmzTE=xq^l6-gkknEv|TCt zZpX^K(^|Q)B-H^@Fo%le)VeN-uMZ2z-x3f&_A-^byq^da9}M~iPyn0M)%maO|Gfjy zRF~|Kf0Z-p;)QfT1MNDU>|wyUqyH>ICtT9O)n#lvV7 zdmIW|x+HUh&+KV%uM+p&o*!z=lEm$hzty26x?U{mMlEzyJd9Sc$Dy!Z9CY@tfZ5aF zUM23kJwMc#{j=0p?2y0JL0`O(9(AJ@Iw~GUtJvdE*g}{ShS}5LUM23kJwMc#C8^#a zf2%`DbiG*Ajaulaco?l>k3(U-IOyzO0kfyUy-M77dw!@f`)8@I*dc$bgT8nnJ?cg+ zbW}WyR%K zG*cHZq@#g{-S?dNzeOR`=N?AH`EU0>wN_87l0?tQUw$WGJ=o^3onc487E}Je9eiTn z3pI_~rKEFUp0Sv76qQ<1^WKiv0~RDWKnmVav3y$B1=00F36V!%Yu=%`ULbV#u7KI2 z&?(S%|J9hilMF1_A^%FZ!16_OsT;M>QSmTZWjQW_I6>IG44ndYOlqyhEJ=2APODf= ze=7H}@g?!~VF{7X!QU6dhl9TU6)<}fIt9kgW#3*ZJ~d|lEcF!)b``6_ElCr7^)h-w zy>S9zkZUPh0)Q41Xv52IC<<1&~NMTh6Vc3ScGzY06;uu-AkYtEAI^~a9F zB$!(`9p(S}TJppH>ypIoi2qp5l*HGE1sdEM*e}`3F+MqteK_drUjeh1f$eX#_wqk; zv~qs`EcF!uQqJvAndaQz1cA5KS1+Rn7{3z`;Kk^hMgu!{W5lWcmr@zbiNfq{VEdEr z`I7&MEdLK#D@T;1IzTq%f788e^?v#P7gxhp8Uc40z0UJFY_;AqIzXE1IQ1w#I!zyd^&r)9zc$)HmT4DCpS1+Rn1m*jD7fwqwV!r%u zLFRuM+de{p{dji7zO@}9|Nm1S^Us030yg^2XhHPlTz{U=$tX|9}1^ z>>IF~VE4gtmopHM`S05V`ltXEpaN8Y3Q&Pw6tJ&F0(I#1&**hbU~bjl3mGm#1*kxh z0ui~({7+JpgQ>vmD8T%moxLJbDv(1r2@GXh{*ry8s0Qx zbK_<_DnJFMS0Ey%*Tfjjq8}TkN6H9PfC}VRAR_-UL@mt!+#AApRG>!%kl9T+tR{cN z+$wgDl(-ZXpaPK!MC35@KT=B$qXM(00P}y=c8qwbKt2VS|M|3JBq}g#3NZg?ZO4e0 z3glB@%KYCjV*cnFU_Qi*L@|>@gpXEc$NK}9d8`Tua|M7RJIpaRJXWX%6{5KAj}CIjOHDnJD~R{#mSC2Vb2 z%=Nv{n9%=_yu5QFT!0Etfn)`c_ius8|2dWaS?{~IFUEJdiGj*nKAH@S6Q}?c=v)D0 z>p|X(&F8!ep?2t;2p6CNR3KRafQ^-N@x0mwKi&A-{%Q<4-IJWF#6;*jLR{meHrH50sDk!NxBAB0Q+L| z`4ec{axog#pQHY<4eY7^!mc%>6b6F_Ugc_|!z-%UlZ|tRwYbXysaT$p2LyjUQ48g8`LVTu!m=(0hs- zhve&98_a*DvR}1Ie%mINw|AUxP5Opapth&~=IsBcYJJ{4jTqy`bi$9CZ*b=isf58% z$LAim>9LQ4-FO%%*xePhbln5(JR4- z#p?KK$8Gsn^CBP&KBUI^A{@UAHo88Iy5f@B9-Np0z{6u7_-y$t8e`AVIF8jo?jext zzP@rNoJ(P2u@s2CxD6H`R_hzXTE`wZw(}?IUWg?uG68Vh(UyNTF9FJ6L&qssM=Q{h z?+D8EoQh9MdoV%`3o9Hhg}=*kDuPew*Z{TDZi6Spc>=GGgU6@F?37T8;409Cj<)=( zc`YFIJ_S^@=PXe{`c8)}gH^m@+PxErTu{OOYWTYw<3ry%23AvMD22Y6d1YREp zk57%+36Uv+sz4Vy+VZdFO#!X9sh}#)@p8Y)wJ@#7y)s{b$?tts{6g*C2qZ3~U|tLU z8(_A`cNt^u^{``ZvlBh_necfvON5?vxWVLsTe-ZLH7<_73Q%j@la)Y*U^RU8!?ygZ zc^M#f9s;B-UU|=d2<$s`A!^6p#j)Hs6}(2!Iq;SX0Jr5^uixtMytav-6GwgnP5T^K z?jd`sGj?pvmK3r~Gni1RWeh7u#T?5u5UuG%*YD&y=mam1@3ru0MgD)H8e>W-Q%yIxG~D7> zaVvdt-Sn?yqEb$o3UCLL6`af2avOe1lbAPj_>hkzZVvIeS16l<#R8&pRS6P z9cZS2E=EuLH27?}7>$aL(q0XI`5iQ^?2ZmKMkY$F!Wdi{?wo#k@AzrhdaZzVIH`f8 zx^I{l)z=~PY@s8$Y>08k!hQkMio8~k*9<$uvf;}eNU#M=9>d(%JbMJjN}PjWT9Nlj zp|x^TONwW(Y1pUr%ljU=hVo6=D`9edB?(_2gMlejf_sOFjs1Oan0AdA9?qE6(Ux=m z0$8XVH!ZHN<^y!ozR7cyEy36C7!c z_+X5@Pt?i{J{&{(G@!=chX2@{A-Tn_4X$ID8;<3>t8!iZB3P)L5W9Zg;{ZB_?+YDr z_oBU7ZQk}cme&TpBA*4yXM&CE^v&H}&*1anx4uUF3P(G?UO(WjUqZVMuy)**e>JZJ zj!hWAxxyQ0%V%RJz^;R7#eR?IIT+Bi>|p(ZEyCow{!d`G)V~+>G27v(-wt2Q8iQ#d z3mc3c_?63!Nv*2@^~RutJ&V`z)s9nnPmK30S)2=;CvZEyC!qZSn0$XlEA}4YZ7`sU zRUA*uKGGp9*Rt0)<2OgGeQ#Vo3zf&pN{3K;NR13GRBDOhfZ6qNdcYwGd)8Kg zE_Bp+B_Dg1EY9WGKjFC>>`O3tPS?r`bQ}-!en+S{q6QG~#_r?V82f9OEytiCbKhef zp89=eOw<}fYGiPFC{(T}4j#T$fO=y{zP`2V_-e;(`B(FNYnJ8%XNys(@|s`^m^(k%9`al;I9>epb`X1jXFX1JJS1P= z+7&Q=qb>hxo^Q?4e4xG*_BPn{ei=qyxhLi`u;|~&D~+ec0}j>xM6@N}-S<8h;8-gk zM@LF*3u%zrVAZ&YKZ%PoUW-}c^*`->+%)_v-3Hm%#6>~$_u7WRe;Z6*?>-(@@rr3D z!su;y4EEX>x&F~qLiY)%y7fldvk(Xgu24~NW0KYv`uy)^4~#)w;Biwx0DHYh0# z>6iZv6)JKsU{DWV|6n3uVS^{cDfYf!J5KI-^xX?;*En)WzP_~q>@^mgr1Cu<@eX%3zFY>Kfnh)GJhqXF?L-R`GY4L-fGV1hkId2(oN_E7;UKn17(6`%rC zfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$mKn17(6`%rC zfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$mKn17(6`%rC zfC^9nDnJFO02P=g1#h%r=1GCJ`Q0>co-`y^Dln@GAdfpKv#JMiQ-OI>pp)cB(0S63 zT&cjUD!}}o)tw`5DlokQ%>U^%WCSWe1*iZOpaN8&d#ybijwHnu)D>bOKz z9A5jP{W;hQ*gddm%iRcY4eT?pyVBS4z;olu| zv~qn({O1`9HpsW%tHXbtvUv}}znL=67i+>-qTb+hy~0=A>%t~@H2Bt$iAuSyBn^Nu zm0QgCwG{5+exM}&^Nc01_sawOcU)jzjFqgo6$3tz}|0-K6$S96?uQ??sHPRXNpnF`A9mxBz}%IPKfbl6sVpCIe6Rh)aH$o zc8+?Ymb6R`H~t&%|WJh*}LXPqspH>=OG8e&YG8$DBuTCPs6c09o$l5;K0BZpC- zdKwhTrHuxU5U#a)qL#EwMjal7SbqbP&(W4Af#`W~1Lr?RzgE76jyC5+&kW<1(?}YB zE1sd4aj5zk)pj2v=BX0&!z^u;2tG~c!8VBTkFYx(;>*)e^gB9&^H&@$_2!>N%%9M# zUxsn3)rr-PCpbj%u7!EzFb-8eqawMq(clrnwN^jO(pH&5hg~rDEST^8^71qk{f>^{ z{HGYBm2aRU`Ml_tVccpOLE}&6XmnA-#-ZwGl)>7TV`$z?@V6=_>LB+_90vQYN^+s& zcpJaO8W2PKXZyYo;P`^b7&cakG6=R%sjy>EN?VOtk_a_U&%yD(z%GFO5LUmpr|I}d znDZsr)-bh{#NT28*qFWD7~_tItx(A=ybh3@8NEKX@k^|MF^2QD7-#PftJ9Y61jzjY zF>yv?3f1BFbz;tOG`E@#PKdGQ-6d(@V3zl;xytuLflA_Uu>fyqpSMQ;X|UU2TDb!q zr^A-Ps#rFDiM5Nfp&dFmUfVFY(n7|SSb!^ZzHXSp&y3vwwN@@JNdthC{dt)NwhMnr z{4Exv!`QhBpS=J5Jk0mr9_~?Dfxq&aKwcZv=iBf_);_$7Pq^Ix^Oc+6^m2!PCiDQ# zH~5Gd-!Z7yhD~r$d~)xf%+boBC7lcaDZI|tz{3A}m~e{aFZWBz_e9iE5`T*YU@bp+ zZ+{5ve^mkt9p6PI*8pU^ojXz6_$AgM+@8LJ;M0n{?wR23^A)PYYQXw_nD#ygT~n78 zi16pIq9hPJu$y68Ssxuyd+Uq~z5Xdn0J9swz7gy=n0#MbEAl#^dT)<*qb@~lb`4An z{@R$caO^9h%QIm!sfUAmQ?y?K`#9_>*tF$71o$EBWZ2_jBYkSyFzBJd6#Bki} z4~u?(i?L&RD9aV$u49cn-Us94T=tcJhI5R6{kRC?H4wlUy8b16gPc75^4X78-cwtC z&_jR}ZlRLO-Humd4oX;ATmkzl_}>BB6lQrP)yi^3xZ85Vynldc=kp<+bGpJp@j{94eMmYOTf`l(4cmz=l2pz6<>yhHVE+(m`3S2zM$M zXS`hVya47ax5D{Em{+GFh}S>>>)k#g#^>ds@pJrI$Pz#Q*RYB|H~&(v|1AYq`@J1a z4|&}yzm>QrEJ~N!saDisEC*%WAHaVV%va=EfcHI9Q34n+J_3#}YM(K_KF$d--YiK2 zgL@p{_)(o#?D2RM=cpw977O56Uh=(Nc|UlO1KHR7A)K#*$#0$5xf8XGUt%4?9oZ-M z2L2Z2E9b#Eac^LuI{5Hg-^8AxBgSXvPt+x8V7N?RbR02UePf&u{@ zuZ({079Eu?h3eqLZhaMYmq$d~&Y!4D z(!lVT!00#@HGjJoMhA`SGW5&29J>Ekt{;35CeMjg92>vH+Qm6#TRuCx7v?KR!CAB( zz^8qlA$%(AiEWwdD-V}+E&!nL>y!UOCGoddj1EnEE%yk$87BYFKr0WS<80XOFdM$e zTJU8w?J+>~IMS|Dq7c9qdR)(a{eNXi8kl_v@t4msQqL2)XHYA*mc-v;0oW9d^1k+9 z*ta#3#(#p1Ut$f6o5SR~XA1YwSnV-Do?niYbxJJ2^#hnzc0)&qv#(Dc`?XTy_kS+d zz{3ALn2%$~C!Yap<-$VGfe@ci-%cR6DhiC9{B zo?W}78ere40fzrRn0%hm#M}1E{eQl50q#+GS7F@c++J?5`6_w+b~()QYpUg33SBQd zrX>Cr3owUrJf?38#5e^epMTr3+{Q1l2FN`u(4Oj@3e{ml@c&T{8c6PJRFVe3Bj@%~ z*tM{(%h$2MnkDhKSb!@g$79CGd!IMLLB|n|Nlnr_5N>| zd>=0K9FFd&BCj28f_)SACfMlv5hZB=O!l094BGM?NO}Eo7c57S*ABmfeGB$FnA|s3 z68#E`;L2?Bozl&!1qNu`w%P!T&hL`zE?Irajq5C3vUJJL(}=Lw(QiHam^UAH^zl!A z%d-8BJ>vC8FFW9kM;?E~@h2|Z9$ot#u!9YL?viD;S+CdFbjiZA>>)2XbnnCVd+B}$ P9r(1D@3Y?ld++%FP6=RP literal 0 HcmV?d00001 diff --git a/q4base/fonts/chain/chain_2_24.tga b/q4base/fonts/chain/chain_2_24.tga new file mode 100644 index 0000000000000000000000000000000000000000..84f589bcfc4afe7c5a9389603a904530a6843fed GIT binary patch literal 262694 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 literal 0 HcmV?d00001 diff --git a/q4base/fonts/chain/chain_2_48.tga b/q4base/fonts/chain/chain_2_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..e26211d425d4f8fc791114765e849b86f7bedb02 GIT binary patch literal 262694 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 literal 0 HcmV?d00001 diff --git a/q4base/fonts/chain/chain_3_48.tga b/q4base/fonts/chain/chain_3_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..ff35844b08a76aa740d58b9a363643d011ad9739 GIT binary patch literal 262694 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

{I34&|JVCNZEbZNEZ!IrKRY>?2$Mi%^+v-~Vs) z4Q5uiHBvcm{#(d?TeV5KUcTx19kLhj^H33s%yK=`e?A{}H1K<{XrK)5i+uaxH)QQ{ zubKLC7=`?;t3I>8EK>T#=Ms;BQ_*y}|M$h)HViZb`Yp8=EPy@8hN zmFt?vW%a^WpMUcigooTZmG|}XI!NjYogMfb^iq!dB#!1IBm0&OV`O>Qp9$u;)|o6b5H#`kQCHW$oZ}jo?NO1NuUYwMA$V3mrq{3L;fz-A@o`nu`SyVrn!DEL{kq%3 zdjxszduu%S`++{1jY`T=$Ag)`vq)D2_jN=EkVp`=_W{>MKTPCiZE6rWvG-9|*Z+5X zV4#lY0Q&P(Bw&*JVK@Nn z{mQQ!b&RvHqu$gI(YCf7Q9~@ad1LCfG->Mx_rk-V@LU=>c$0rjA&L>4e>T=ztu--a=#55gy&$@dZO<)xg?UzBy?8s@b> zubDOd8Wp;qEX)0ZS5dZUg3a^5ns^_x30V4CCI9lK<0)$|i&4kVa#z;>Twn00tA`|9SE@r)FtoyLHbj$k9bWqEcTCxPG1vwnLV;V$7hA`VU%r}U{gMe z6z=ry3x0u$Yb){s^!r)U@sza(A34T8>caY88G&=0e8fGmVe`MJ?LwiH*Ty~hvg1>i zeC7|I<@xsP==$tTCKTuEDO5mn&>rf~`o9wWucU0#1e<)m!9B`4==i4NDQgcwuNDZr z%KBexn69$E)hQ1@Isd*8@R!wp0v(lWB zDwhSzK03d?>bObM_+I-;(qg3R~0}QyJaxWnJ)-(m|DviS<;~M;1fx2Wh>s&zH-@ zP$c{NC5j}hJs|?KX3U)NyJc6MvFePiN74G`0}eaj;D7#?0}kEf15XZR(VNZ^o3%>U7D~XDrpL+v9KFw$t0^ymiiB?Y_mHJI~o|r`P;{ D$@L;u literal 0 HcmV?d00001 diff --git a/q4base/fonts/chain/chain_5_48.tga b/q4base/fonts/chain/chain_5_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..0cf14f1713a286966205b16fa9018b0458964b06 GIT binary patch literal 262694 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 R?e(H9U$*SrDds+sbe*z zjhcvIYG#^QO_n*+=wKm=7X%SR%?mmxi2C=e^X>Jr-u zTme_W6>tSy0aw5ka0OfeSHKl;1zZ7Fz!h)>Tme_W6>tSy0aw5ka0OfeSHKl;1zZ7F zz!h)>Tme_W6>tSy0aw5ka0OfeSHKl;1zZ7Fz!h)>Tme_W6>tSy0aw5ka0OfeSHKl; z1zZ7Fz!h)>Tme_W6>tSy0aw5ka0OfeSHKl;1zZ7Fz!h)>Tme_W6>tSyf$|FM-o1N= zut%buD#w>ca8pDi?#&OM2JcNPw?|8GJ09)xVOPMehvgQEL9yNedoXOF;r39?S>!0d zXCc%FqfV8aRK07FxHmt1w)_2mMQQ^I&Ap0r^x_K0`xM%#BUV+gA^9cVs$f=i#|TQ#k* z%9m<#nGzd7*ZTR-6wPwiK=b(QSm%YtbJHc)2Q10_!DqYv{J$YVKHjIHeJkYk$<0{7 zB!I5<^Pd$+uAL$4ywG@6h!j7SJj^$ktAbfU@G;zDEfRe*>yl1pO{E~R88&_JCU2Fn&&+u+h*9>e8$E%fo@K0d;VkfD&eo3rPMZ*NNL6h zSd#fAUNg{$2^kOV!;R!W#`u0C!cKBEa`W)EKmSbBsJAVD@MUgyH@MUA$?P}ja2bm@ zrl`?0ixH*FFtU;kslqxf>JnLztQFHp{#Ej;U5wm39OE3?=k=YsHlMNaI{@1QL;1#j z?I@x*7GEuYKw``{N89?$#!mJtiGyQ`8cnm5Ox=lvtfWJ#uuhA*6JWvslC@$Q$*&>5 z+QrDt!!gdGeO}+GYx5Z!zXPy6FqCiX*N!53WAWAU2PBD^&YD*Cz~I8KBo2-#YArX9 zl}z1<6)>5bfqjc-7p2O7gMpf8$dU zNR*p$q)N%uomfcRn?Lw0wCDtwFd*Y4^85XtpzYWt&_7k0^AD#nZ8PRre6{=|K7Rkr z9c%AIy!@X|IHoq`yZVZdCsl2spirS z_`pOa(9H>pU*EVHb|9?kZU87b`29C`tffk{4b(*I*2B`7?XEoOk0F# zH`8dAHw#pfkKh0HHp!mUsmKOJ+EaY3`28=Ub~=bAyclckJ;sOjMTmAYjb?eX5f{Jz z?QN31)}EKxp-6kb|0P777(;Hf(r)d&vTxSB5^8g3BFy5;A})Ua%^hn$=9k!rNPEBk zB}APV!`}AAjCH^J#?7!3VHRH&ok73<=8pOOkIqWp*|#3g777nI@Tk~evB$yRUnm{)vEPj3CX4n-_ zR8s<=`9%9>_wzK#n+18{~~IqgJ{BwvDV&Wd}v>UXgAYnmNy%5@%!K2CfRH4d5Im0v|si8 zU*_MxxS@o8C1c2qR@$w-SN6@CS3+$LmBgMCE8^n!-`uhGV}6e2yf)H))%X9)Huc^6 zDOjyD&*QYlDp#@wbEz$$VVpUQty+>RxKSe$#!emtYKcz3 zwU*C+z+0Z{Ro?$wCe8~@9Z>T)AbxLt_%vFTz#`+JeHctD%ew!>?KK*J!eg&Ryb|&i zjR8z+`TU3WLf9(rf9m^U0CD$8MK?SOhWNetg-+4xXHS?2wxvv4wu?!uQ~ zCBFaj`-nr||4Dye|0LMryiHTA-YVcC-d5SR&woIe@Bhuvww|-GPtgq!xtsW@v7*VN zV5z*?T(o>rSBq?+XL~5el%EzCW4{3V4vfnpe=1IiIV9_FOpMXrivBbML`~oKeF$uDj1rhj z#zE0Y*h1fUeaSxO2>C8Y zEz4QxwD!0}?l>m;$H1WXdefYXPeseene3$G9KFZg~_{5&jF5LpJ6PfdvTtT^&8+X%e&E8JYJ!0 zw9?wsk=9wMVGLvR^XG>!DldjHue+fAYS=emaiPbGBVp{@sq3&9A2kN9U~ajL&tR_* zx#)Fw{JV$q#QZ`(J5v5koC|&0TUqD~5YA#)I2LMpz5i{PEN7t8oSS@x=?F5{i1sbv z8-H)^8;7h2qdT#pX@o_<)+9xsXm)9(J?hPkD1Czx@*5&eh3 zH!kO5AQ`hqnx#+o;JqE@>3i6;LXX>j0J|fMULU*;#>IRNuyle(LIx`8c;CcSp@Sc= zAn-o07r-_mQ-7yqP$)8t{4sCp)9bhx8~tu#?-EH7=V(~`bN_0Lb>2%WkuMbkIW_)6 z$9@g#rA{wJ|2C9v7{5mQINE2!n)j#BCcO@X(er;Q&xNTPu7abM zbAht`PmH%UtHtm!SHKl;1zZ7Fz!h)>Tme_W6>tSy0aw5ka0OfeSHKl;1zZ7Fz!h)> zTme_W6>tSy0aw5ka0OfeSHKl;1zZ7Fz!h)>Tme_W6>tSy0aw5ka0OfeSHKl;1zZ7F zz!h)>Tme_W6>tSy0aw5ka0OfeSHKl;1zZ7Fz!h)>Tme_W6>tSy0aw5ka0OfeSHKl; z1zZ7Fz!h)>Tme_W6>tSy0aw5ka0OfeSHKl;1=d*s@jW&4ovY`=u7J_^o#hsaL9yNe zdoXPA{W5dYnsK3COa61)5681y1;Y7%1?t-6RYtY$f; z8u$W%L7dLs19}9YpG(z#b|Urz6Zz?T**^!nXrO%te*B%;Xm-j81!OB40tnZde^D_< z27~tWJ<>JH6GuW?sym3&y}osi0E@d%zBLNsUXaNDc*;A{9+HT6K@AQ$F@bfh`R8bt zyEdGw#Bmw?bBBLE(f4*=2K#OZdQL9Jn(Kj)?^b}TR_s#+3Nl`)X5Ad5@3n674{XyK zt9+>niHx8Cy4L(Nq|06k?dfc#%Gk3f{pq{gcV&aD7y$Sf?;s6oKtbXg63H3g*xCwt zeGLvdG1r}cj&`|gp*@|eR2h5jI{vvBYpw@z#yd!Z8dy?^1wO_(v^K-m;E)s31iCpf zlyB^3hRwmc-PS@R(k)eDT}SultQm+ipFtYb;F3x#@G;JzwHdYshn$!u(9MaVd}BW| zY!24#wiY6hZmAOMI=Vk+%|M*_4AP(mmsDbbk8uvI&9F5%q)eY|& z9JGXDtjUeBF>Mi|-K@bOCuSR6r#FVP^z8)VfgG$Q)&hsb$!&%w>uWUM5*Ro}h%a-- zZN@jb=3H~Eg}yOw*>AYl;2;wz?It(o#jcMN$A!=12kr6b47k9^SmcDVErk??|$Wj22IJw>6 z6OB3Ce*tH7a|0`iXjUr-;R}``$39hHq!J5!4TgbZX4onuGJ={wHz&sOW`8qm2Gk-; z0gN%qTEpx2zlh>?5V04U{yf&~lO1XL3@0(_CO78Cw2g4{dq6gUZcdEhEPc(e(|4-O zN&u5Mxvk-y!~JJ`ef1t7a5LCJusg#}g&hkkBU+^>gfAE>v#?JU6lT`Vi6%F?W7=le zDkL(3nn1THe`6mt8Me~>H_v9q(Wt&u?1iR3k2TzC0OBM@-Q>pnn6?paehJ5txf z*hg)@{QlS73VEM2{duhMs{x0T7 z5!PJ+plih+e6{`4_RH^o-J>V>LDQed8owHFkmN#6q|~QjtjRyHeX?W?|AWEgh|0$&D}0asyb;ZQWhFBf2Mn*_WEJbzQm(m`b>koSHfIX`!(dvO z!~O63e?Rg3r$B_h|Kr*~=-j!TH;D%rc^?8?wPGK+v{+kUpyvVfT=+|{65s#%eZ-;f z|GWTp5^TYv81O=Y7#Hfb;4k>{xjF%3TA9QB*Kmy)JH5~`sS*Z6Xb)2Fml4+kf?rJx zd={$LRY+t6Wo?&LXFx5oG?!-)5FrS#90RLaw!-&+-mgc1sy{oCd&-^Pg>@UjUX1z{ zL*tY@KP6%%aMS-Oc^-^;z7Xxb75_ak_I%;@+i26@pip%!fjK9Jg=^?|PVRW^(40Ab zan3pQ$MULyeJlp}{}hZ~BXIdsG}N=Mjo09i6H~(|#-4_@EWe9R%=NdV1KMXPKFyjO ztR>b08$E{6W7I~lm!NK*W1`()Mf;54!@fnoPcOBD(5zOBvHWY`7>R+ttN4Fl zT`HOo3Cq3F?asX;=?+0swU?}PTg!eluW9m`)G zufZWF<^cTkf6A{Er0KcOfiQZ_bBP$g8tvP_RNg$EgSEt3#)10vFj;;R9makSw67DB zm!eIN{UsnYF(_WbFx4v3w>5!|oNKk4WHW5UBorPkml_n5oGtyrJiQh^zXfLZ?zatG z+lp6%Lr%Pf(anyWYqdGo9P0r*S}rv>AVEtnrBCl|$K^>F=v$}G*Wi#7a|93i zdHL~Jh%iR4ja0tzcn;PQYhyg<)9>Kqdl=|8Wdp4iuM!wIMjSipHy}bo;z-R&KTb8v zIwpaB3wu0YgM^Y(VxZT)^#1UMu;=!yk?T9{8XR(Bj^uJDp#y6|V;!E>SPs?_YYkja z$9P=cjRAVy*Wy+JgU4_MTme_W6>tSy0aw5ka0OfeSHKl;1zZ7Fz!h)>Tme_W6>tSy z0aw5ka0OfeSHKl;1zZ7Fz!h)>Tme_W6>tSy0aw5ka0OfeSHKl;1zZ7Fz!h)>Tme_W z6>tSy0aw5ka0OfeSHKl;1zZ7Fz!h)>Tme_W6>tSy0aw5ka0OfeSHKl;1zZ7Fz!h)> zTme_W6>tSy0aw5ka0OfeSHKl;1zZ7Fz!h)>T!DNA@ZBOO#$P&8xPMGO%JLDS?^JnY z59i|}|MGx5qARch1#qr!*>m=Dr=Pe2TD>Ww`+RT@$=3HT(ONIAz;;j|+=JBdzX+3K z>|*#|2K#OZdd?hm0=D>02e@h#`_7Tlmc#_LPm2_v{Jo}#L;G|e*bk$aad%5Tz6){2Vy(7VY0{xEO1IPX-ie+`TqEuBd2VE_l zXng8kH0!DW&kU;Y8l^#IdS4zC2>T$l-(T6A<}4-Vj>X)MWS~Ub^|$qpWgDV>(r1oh zgJg_3<}LfN?;I&@NlalMq}HA9yAM8{JrLu!K>M>YNYuVA>TgM{YJi3=q-(0AbRRTV z19xsr5RS2r(jYg#uisQ4?1R)k-j^Z$^JD;}{hVmb{6>fhI@xBOqC+rch1&}jMmFinnqSU06ScQ6K#52+Yi?8&q|~$4zWebPP54^ag1pzX;(g^;O`I@ z104-=2t>JSfBs6)*!^~N_Q=6rdTr1`V(e%ge6;b`%Y{n&OtDr@m!^>wFJP4Txc${I z*Kp5Dq%2P4W(-a47|YPUl6K`o3U=nJ)g29T2#m}<=CfDidnqjSKKK)Iu$NvNv_RFA zj@Fpb#vX|A)bsxLN9&pdG(M*ia7ujKz9!5y{7d6b2kR!YJU^`pM=S^(xo(wtat&Z#K-Ne zdjIzVfjhx=!LqcewU}^4hOSv+-z-?j62~(WE57kstxvCut#VZs_`-_;lJLu-@rlR& zTrN=B+GmKRTVWP?;Q%bwfU(Zu{ttcr`ALBOH0)~F4+4P=)Oq4mT1~hj3y{?+_RT^S z<+b*nfpl^!>op%8!Nh6=KRY)Rv_%i@b0E7UN^AbGZME zWlFt4+~!yaS7a%Ev2PZoD6h5mjHi=ZS+Du<`c9n%zVPC}MPk&r@Yt>4c%^iX+FwWi zP#F8mTDlfykryuDmH4>r_dicsb9K<%Iv=b**V1p%HUkfs$jz;+@8DzLT0H>b(p&-; z2~*?3V{ejeFW|ZU#FDc4yeBuw!9EBv`r+ z;ff4hv&6nxc#$QJXC_vBsvVr)5r=Ja7%pL z-b(l1(mhL?T8o3`5;JSA)zWX#&cT(NTUp=1r;*^X9PFjn1}+SZYK;s1Ou0%rMQwV| ziT;L*wwA}_lF~G?;sx9iAGiJfXDMqh4x01XpgL8g-=b|t?w>)TINqq-%KA7S_07_c zaCsg88DrJByu~E5IYG}2v~_Y!hFBiK0ht1JiI3ZU{|D$d#U*HNoe$QZYw5RWPszz^ za&s%|JNOv5Rx^${)PakH8FM*JPAcuc3Nhk!abGT-1N8<&z%TJ}+wXs)QrSk(T%Hlu zT&tzuqMd^#H@C9BgHI#DV>#GMuMJ!n8r71^A?VW`u*wyfxD`yUvDz|5X&PDa0)B~) z+kXGEl(iQJ&E;8P&9z$kE!uYE{+Zm|%K8pIjRcSNBV3+G;KIn!ftxD2^G zf&(%IE)pNNxBC63-^m^^K!T;a1kL3+Va>H#`YqZyfOB&z>pS=~5oJxyR2E?{3w+_lfs2Iu4cUp>^#9BDg=u{I#$>3%Eb_tyJ`x|d=WzcS%hdYx zJay`<1{rx?=>L^{#l^nSgFK{Zwp6a-VB=szVPCJ-^3~==sSJx6a0s2ApJzB zd3`1wzz&n(M0*+c{}_?4Msq8C|7YK4%jy4|%CnSp3*uNkqPOxYYpr=RY!>*!ivu4M ztC)Cs@U{4+#^b;Lxp!e2S>eFz1i@1_mvR47x)qtr5~tGQjI*@RBnOs~Tkd(>p1KEd zoTi_Hz4TguI;s#sMf~&i_N95`#2dpaCy%z)$bCGNcuZ| zsX~8C=I3E!xW~Tqe^F)m<-#Hk}O5ys_uG_*Z#!wen#6XxI%fE|;Jo{}%bPcp}tqMZFZv8jrDK0W1CN zk$)@qbLi7^8s?5#$gKfafvxvDxjM6-E;ss2!XP3gb&|^U7c|cAcZ7p(Wn#!^B z8BnO7g8H*!jGiML1(R!9Z7uJr#{^!w>mPv0@*;HJF9*8S1 z`(!g3xaMFly|#xF{l1UOub{#F>G{C(V4vd2sHW#>$;W`wJaXazEAu)U?HdIb`u>lf z6Z1J~)U`6U(Iy?`;}W{9ayEL5U#-=|D;|t6)6e=VTddk0`uWo0mIFVI)lSvv^?lwd zp8pIY$TJiNd`b@X(rW>(rEAou$L4<*1TIJWVi^6*=_|?K7nbIc6AwhB2K0WqEc71L zU11BKoIKiEj@wfoiTUrr;_?p|pgofKJ8doRs>c+}zlbsI-uySlJHLC%!LQ`T&{E2K zk!8;u?4{QNPv^WuV@II>e=w_j7!!|#(a)(n!szjj%5|{)VQT!+JaXbi80mG+M`5xw zj{!M(w6#d0>Z6R)bIJ{2FGc&du-^4r-c^qoxF3aa$&uPSHQyZkQM~)1U#rk#_T?~o zPlH~+EFPTme_W6>tSy0aw5ka0OfeSHKl;1zZ7F zz!h)>Tme_W6>tSy0aw5ka0OfeSHKl;1zZ7Fz!h)>Tme_W6>tSy0aw5ka0OfeSHKl; z1zZ7Fz!h)>Tme_W6>tSy0aw5ka0OfeSHKl;1zZ7Fz!h)>Tme_W6>tSy0aw5ka0Ofe zSHKl;1zZ7Fz!h)>Tme_W6>tSyfm#aSdll60h!ErS-RJau6ZG9O--glmP|)`RJs);+ zn7O_dW{>L%xB_JqNZnt|9SYOF7YxIT@^Soo2uytpD1)$G6yQE_!J^(j$J9fgA9>yR z=PS7NBj60EcUO$l_fS6vb}!g|uzSG%3&!Oy&`@K{T^-=2@6D@Oo;YU>KzyzF&v|c_ zg$-vwy}Lc*cNdrDYnJb_I84nGa0@D(X8iraeSP|V-pgS8{dMO|#kP!fz)5?bDt&z8 z`7OnN85++$2R47o{lASkG}l`(wg`7YrPG|E4X?Q!qRsj{E5p8ZNQ(jHGNqn9|GA&f zW#9{Epl^QiRtr@{ew2kL)@{Rxb|tKB>!%i=IKPr#1KEG9Rs7&JE(+cMS#4kr1b98-SF;Ndx@ zE0Ef|Xzl^%Q+W$)%b$HxEbt&sR$-sX_4J*ozY?U0SE@|rji8IQ^;vj^90hov2G(y2 zhvnfz{Bv+EV{PCND5=%9KL6{;ADmyS?DQ*x7E|~8F-pu*LyPyEY7JT&V{VXYAd#Mh2LIPV4fr)bj$Kc@|vHTxU-w~peK>|RSb zY8AxZ1NPREfJ3Y|)WTdUE^w~h`Ip+QBmcnpK-6D=arqV+^jWC*UXST>EUk_|Cz0xZ z5&4_tu&@@U$?1HDOJa78f{_jpi8Ea2&0k8nanf zOD}-ES_2%$_D9`d7~8Iexm4W1Cs0+ZDctGxC7q*Puu@Q~#36jJRM~d?K~{3Q1^V>- zmdn4OA?L@mIfhn`iKF^fIRFR>u>2aMIPO}QOT`6Y;-4zJC|-^r>BO4Td&Sf3>2hQ=i{Y$as-$47ehF`o+_C<(JQ~FJ6*E&ZXr0s!8SP^2e zt`_D}aRbga<8r+Xia+PFj{F1X_*@@^@oQjQ==Wi?Apg*T&_Z6$Y+DuU#rdY0cUM)UyL6Idn3>1?zOcZ z@l!>^Hh9d+IhSz|CoZWnm@9&)zH{NK;Ru-5iodl_(fE<*^XE87pYx)5ZLi7CDyjDk zwEZhFW&sZ48qdLFCGgdZ0gl8aRR(iK5Y@LP{@mCB^IGw@_DLCk zxe(@uXx~fmk$W!Oi#8WIa`)O=--A^08{M{Y&SgC8XG((6oI}iJ-CVe8IM$JWyg!LP zeYee}FfR0(fLRS_kZtQjB zpV}*B?l_Fe=i<*$e0bk6Wfu17tLgED{!hYTu%lu0cQ+Sna`)O=kNBz5hc`KI<($hn zh!g%)N%F(O)cnDiKVmLiH5>u|TJi7MGi^WV`)#;<6Ak)KEX|L7v|95YHKy%fi7^eV z7#oEV>stOL@YReF@Cv$}rhIQ^NSppf>SeHNL!@(S;?Io@jI>{=GK91AnLU4yZJp5p z{R83i6(Q1J8*7A1r#Uuf$3J(kt@RzG?ST#sOb;Hja?WKuaA`9x+dF+OTs0i)$Ukr% ze1?PnW20knoDwH;X?4fu>-cN?S7NM%vfJt4fXm>q68LJy0GDIBl#7nc{rf-Hj{lhR z8~MIhoD6!NL;v4H-UTt;X-dCI?OOMsgS0&`2`fS@*44sXDlX%!S(n0EBTh};9J>bY zoS2MjLVY;adVJ`3x(T!+R^7;C}fTFpL_>soqg zV8z&EyogZ?a{~EF<4}(rOij92_+C$dW+O{HbhjM`5y>QMw}!63k`;v6x4H~7js^N6q(m05Cg7F3`e3W(+3J&6g>XAvf2Z)cic zZy>kh;P-tP7y2FW?O=m+nIG$$5Dn!J{C*#`Ea#(>`aIl1pPRDHqXo=^_N~Y7WkQH6 z(5CZ{DpPZkzITKjP)j|;{!juq{oI>^{Z?3aR4vS<;tt?;6nx}+KIrZq^t_*Am%>^j z4r3fx)8}F7eQ#Obh)(i+)WDq+vk&jUdD4RZuMU^^jPN+u@-q^B?N4G6#a`C;e>|N* zDm8uo$7f-EnB_eA)4KC=_GuYwfiZP}Bwnnu9TpsP7A3`8ojI z-Sq!tOdY3UtF!TW;lGS>Et1rdgZ6E2*as^Rd1f`xg#weVhW!l2uZ%SL2Ks}a z_jBArP^*Mtj3etmgnwMl#(=7272p{`Eu1694}|ZlVe&lybgPw5AaVxd^iqlqqt_Wv zf&C-wD%ka~+;T!X^Xg|oP(8C4KOMFa*$D}ME6(akCJ;>FgEjlY&V@;R==Xw$z&bi4 z(pR1O)*e;Ed+@db`|j9t$5l5!aL0i=j&4tk>z#P!3(h?2H=cXu*>`!~&QqRq#xu^` z`Os%R?d&to{+*q>Fm=j9@5DX3Mx7ogaic%j#!0D1UHN%QOty-492A@ zSfwTvv@{V%j7YSSs3i_4W|0^{K~MrJpyI|NARrn3eCPe$@0~uk`)=?3ulvpYPSyFl z`}FpGU*Ep(-TU7A@2XX+SB>n_RhO>XZq;^cM+N?&0#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1!kwf($dnZ4t^Bc z*4eXB*?PR$vEWElfC}_cpv!(m+db+wf5)-QJY#1}b^6w6T!#x*fAS z5xfF^X$!v!ZDjw)>_!BO|p_CLj z2Yvku{weFr@YcjV z*H{|mo*K(zC?y5XL0|uZ|JKN&a{njxv^%c%SDGcYD&-irI2?yA`&QAdWV?)Gp=2+E z&CsuZD+`K1@|Z?l-Fhd-%D&JE01bRnT=!B$<@1ebyTp{)!zsKqaYeV1jdD+om7Tl+ z0Gva={;e!10^I-Mo<0Veycm8U{BZadxVKA?iS7Y&s1;L8;Z4NXc%q5)eu;hyp$V`L z{rWeytla;TJ-s^wlKY`Cy92>>@P#-frRznJK97W^FeTj6`dll|;mrIhP1o4P|#j_nVG z$0pzVI0&B9LD!X{fyXgs5oU(;`gd7KeO&7L`M<1x%(jL7FWf%p$jQE6$YWg{^KJ02 z0naNP=cYuCA^8lwaa@m~lr%wXNc;bcga&sb{w;W$@BjHWv7xq={l7EFeH$*Xck&tF z!X4{=&$YphHh>GdXVVRSn*P{K9FX@ayc5_Wy1m-u67NHENq*g#9ny^?5z~%W!#* z-}IgrO&aaNe!rEL0(sLueG1yhc`juiLWPX+e$_xe2YIxMC&w>P3ts;&e~0aKtexD; zz7?*|>nKiTrSJb8!R|k%Vi@myXlci~#{;;@{fRm`7s~s-l>HDDa!*vo*cC3{hxYa* zWVVAR$M+aYNr9EuzcuSsx0b3-uKkXK$E@`Ie@YBAVtuZEWZzr|{}ueCQjT$p1K5)L z6Ln|8>udumb$=;qdo>EWKFC`vxy!)H>))F7s#{A_C+C2e$$rSa%*pwIZA%O^Vh6y3 zW4A+D-cvjvIcesK8XiwZUETYB`P?I>$+?Jo`vo!&fydfqW?r2hIC=e>SgX_;CgSot zikQj!tE%vYM1bw55zw~?=4rhUiWL|MUh=;G3V6zXj0*V;L`;{x5Wh)v{B)vS1xxOL z!zsVv8tV10tm&H6dUc4)XTUN0D1y0{IXOSD$^S31Ho9g(Fm|lBjwL6}T#?}QS5^d5 zJ|@x6>+y2a{>8EOnW)K-e`9tef)(9M3B&*+ zHnjbJFgVw}@Bb%R!xsJpwDBhI7xsV${YqJPkHg}dqP(crzw5wxrED_>9<9IEyR3;vupwXUw9UIa|p#GO|Zy!cxDEog=uYdRRi#3B(UPI)1`U3by`1rG+()PW_ z1B@{n(*A!(OaK*=_lLnAZYaN5^_A>%b$hRSDJifG{rb1d+V*Z+%6eNIa)3r`DEnW& z-(UB>|5K>%y5{ma_%)^J^~n403t0KHmw|2Q*S}rYw^#e@3!MOwO^l>F01$hhOBFor}WPq2kw|{>-+yTG14aXCX^f3wWf`HUZ_pp4;-I+z3u$KG!4hreeJxZ zlw0uM7j0ypr|f1_JPcl|MJaqOjs&S~egD_4RnuBdQ*ZUpU7m(Zm%h1qrsi+K;qTE# zOs)rC3;#8^+%tU@+<)f(cgWWsQ>poL$ALR$-2dTvz6c_n?EGk?wQF5hpL@OS{0Xd2 zLVT0*6B6x22l@SoZu`(!TRU$lHGl3naNi>YjB)>0*YixH(c4fC*0@bM_j=p;YcR`i8uV|QZ%0}G zChUbM>vQ5)P?q0)MK!VWmQqgPRq^YP7kdNTa+8>tw6S$TxfH$@2XM>xm8{AAjsSn3 zvYo4xavv_}vjhC!;oANjg-$w^qJhWJfL~tU{57udz6LJeX?_CyHn=xA{^fj;)WXkK zT3UzM)x8g?n4JG!1>X}c8k`8f11`46*Z&tTQ>gqs43Xq|wy4{ow6*qlT3}D{emMH- z-}#}q^cV0{`%2tnC?#!y{bfQ@*#*ddSCwTC90;#))v;3eS{xcRF zj$q-AgEpAaMy`Fn2)Fi^2sCn*HlXBl!H zkoP)U;nSF0E0wzB#6<@$XLj|b73Me4^5xxbUvZtX!Un6wQAF2kvSjM7J0V+_20&Z{L zr1q%I?&#Wd-S@t|^!FyuRWE}$QBVOY;P>dgeuG9*-)5TB4=eLfbt*sw3Q<7zqu-o~ zbeetd`|6ofA_3^2IVwA()%vNR+q8jRTRJ`$G~9Ee~!Ogr^@~5ufT7CcRBydJ#M+z zeK`D2;V~=n{12eq|I4r2u{FCB!M2}$T!pr&?@Zh%I+tp|HuUq~toYv!E&mg4t=RKF zfO7vYEuCi<%#|PK^bw8P`1-^+rSE^aZi(4Y&VPgDk45MHUs}34a`2Bnt8n_X+56IF zO=KJimA?One*POQe;k|K|4U1^MfUAz&pLhD?*EjQrSJctpZ^BSpZkB6?AfgY-~U5D z{|%Nu_y1`BN4Ed+dv>SKw*LA*^z+|f`E&ns|Hn>#hz;rbCnmul_;der|Hlq~?*Cz& z|G580`(OS~fi?L}M3?vdzO5Zc%BA1`OJYWa=hZe%j#cpYACj22b^eZDjK7byUH7_n zek@6gI}Cv7G7V7WyMF#J8pN#h{Xg{c-(dOUU`-vf{y47N*KORbKx0 zfqbvC%l|%5-N)I|_y5q(e}mZ%SpGO_`TD=CLECGYR6F_oTMh}m@r7I)vn0}^aA@I^oWO{>8|@^|ZwBx%#?BK@`b!>*VV;AX*5#*p8U z#!T)n6~os85o|N^A)o(5!-eDT)*VUGW^ruj!R_Ify$o;~lROLS^W0z_( z;O%uA`uT6+_`9`NhiWD3*S2rE+KgD-HUPfk;qqJeZ@{~J)~DNEj=u7L9%6PRg2nOn zfPii2=fA=7m*X;az^Yi^eee6peRXaAuq!47xOE!fjPsi@-bjmL2pb^4H}v!0VEMaa zv+j`h`?zoV>t^uc{tq7T?PoAfQv+>kg7vxOs=r{SCIn~h+@#NGb=+#Pr$2 z;4wZ&sr+Hc%l|WesEWnfwT@*cngB2>eof;frq3E~!tCmi1ZLMfs6@fm2j#4UBa=7b zRrPxye?8pWPmp;$Jm8lqN2V?!l)$?Maj_4DKj%a4 z^&ik?3^Q#p#RPWQ%VKxJe*-RBtbxmK96k?E{XXhVsEg@V3||W*h1bQA1ZKGfl_=Qy zaoNsWLb(pFs%zrdR6o{0#w^Vg&j4ple3Kz8=YZd=X+IjbG~OOh0{32s{~RtR-)s5~ zT+RheCjU$KLGX%}e!kMu7*-WSHZaR8s6@fmkISX;7Cd!$Rb3Ourutx>(sWQf1DrK+ z`JU%RhV;)+eqv3Z(rAzI)L@p^`qb;Zobxup9|f21c%2IOCi#k%;|UAP#IUNE=j2n% z%g23c>&NB7Xpi6k^cY`F-gEP*?c?J-{G#vmsz}K=Y-;40CkDj-b4@~thjkm{> z!t3H2kbV^|ul>UBU*N~WcY<5p{tGd&&%kY+pRTwxhE>Io4b1WiDp9cY<8pDt35W_% z0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$mKn17(6`%rCfC^9nDnJFO02QDDRDcRl z0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$mKn17(6`%rCfC^9nDnJFO02QDDRDcRl z0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$mKn17(6`%rCfC^9nDnJFO02QDDRDcRl zfvFTQ&ntNe%JOVSdA5^&#wCiq><;w$I{Y;F_<1o?0cK|^Km}%|0QRLkpGcnBd=7ji zO`ex`ANb6$b08`}1*TI#_9J{FJY{#I;tKesJ^Wkf^DDTwQ;?YsFnd!0DljtzWIw{U zz*F`#RE(ct*du?a8u()APon}b!@B8X;3t>(eRDcR_|MM820>f2+`+vA= zPv*-CxIG}BO`i;xd(?8Ds_vQ?)q&lE(zWmt;Kv0ulfwQb>J51E9=*=|d-!QmJ$_L# z0NC?2xJdqZ#HQh1>062bhSv)t+$D6QYIkU&O)M;*8-EY}A^4-Y60JiPnTj0~0 zd}r>$$RKwiwz@KL0RiBWb-w1aJ z_1*t^xL=@9nu2S(XdZhj~@q; zDeCxWd^W$QYtx5!v`;3gm1zwx`3`8zQv3hsX#73n*Q2~OHV9%LsQ@S>0Bq+aFh36Q z=o%*C>l5Q}|4)P|WYw2pxOJSMtLDbPTX1c=91qd9r3et=Q)M5%{yz*2j)p%l(${m9 z?~BFk`=#);#_y0uT($+q;W*%|dW4?8}QUm}&i`jG5 zX`g){eJWN8Z;Jy!W7jNwc&Cmf?*GZrVCBzR2CUSYO%V6X$-SUk;NOIw4L=k<+HYA2 ztI0hcl_FcQKKo$N_J4&m0)2R=jwSB@iNfj#%%26U)S68Y&o1{qnXeRc+(+jmmya>+ zvk$ocLnXQYCwi1}_>XYZ9QPh^*WW$MJ@7g^vJ?RTQt$oLd64_Rs*}}Cmt$+s{XbEq zl*7O6{?}{UHvgIl-AeBKQUm}p%clYsfg$XF`9D?G`1-FzDdq5A$^D;t9T>?_iU0t^{lC2bcY_vJs$+E4 zS-$>H6fNcO=l@I(8#%>-L27v37eVnvK%}XdRa>b#e}f z*>wmu;>giJaK!+tSQq}WwyV`xlFdOgIj7(;_-rx8sZGp|GcG5=%(()9ERQipmFctp z<^8j@E9XqF^>hGgb?94`|057H`Fx=@o_RJDTrt2Z)>jMPZ&x*zWamk*aW27Q@Y$m0 z(KWT>jLVIn=F|XyET=I>mFcqowd<)uU_qAWc~1KPqFF zXpXajTFG|Rz_#DVj9AqFL0LimhW4ab%5mVh>-Cy|oaFTWKXVf9l=~@KuPueQ#Q|*c zKc3`&eS8Dn<+DEB_Hy)<|ML^GBN4RI7EuPSy3eYG%Yy{_6#i5hMA_a&5O*MeOSsip zAMW;=N00x@QuqVZtKj+=);N8>&;FO+K79>-KKwNJ=zpk`!rS5izIE`GvdtKHbPU;f zODF@|Aq~Xkf132!1HR8I%=jBh;O#LuZU$md^gOzxdj}(gh41>gbEkl{DTEd+>HYs& zw9w}ZpO^oUWncT`9)SGrQM4Fomz!^De&E{=J}Z-RpS<6>0KO4E{{IoF`E$mBugh^g zleRhe+PNKnBuVSac@K>Ap5$mtOCPfsa+QH`Qw>gErT2fG7LV~AO!{$@NBwf~Y?{~O zTj{h3M~?ai&QC(U93$S3O0<`Id~Z|j-hll0yl4C5;F+4!VM8((lkb!~J%wf7abU6g zIVM8e{V!w5|ID%`|66A?&%F7yozLT2>9j4LdA4idEdTpX-s5?bXZaosx5v%Ld;^yr z6KONh10{5fQ=61NZYmkxGd(ZDgU*XaZs5;*!NcH@=^A4+_5ESM0%U|bqN&g%Dw!l9E zm+NNv9Au~$|GO<^_hm!hm~GYZ04 zp6j5`4e~vQHLfnHNrC(UIcah|pXAb~t`z+*owtN?TkL2juVdQ&5QYCy0XYvm2HvPe3A{Z9hgZ?4WE=Uk z;jG*ExpSu)lgob}Y0MspV3Q8=Tltv%2*FX`+dwdP)2Gr~GqkO(0pBpskGOka} zpEKS8|NYVS+whcaM8%kET|OsYJGaA$Bx$WUp?B+c7DKLb1oJ;6RFHcY@)=+1`sZ@g z>DNU)%s-+q(k2(rrg=TSn)GPY$-OUa$D+`B&82OL){(;#(O!-PYad3SwH77m0NnC9 zMV+;}w}Sx|j(-I6V-eHWb9K73sgrAmN5B_(|Gyac?=fW0_MEz;B^~!3OBejE?e8Mp zr2KT`cXoBH_JE(egcP__&#OVz$mE)@6|c7KO5iOR5_shr?t}1a;jwc)!nG#vk*|S& z0RC|Jc%D*tTO1mr$^QY$@_im{^8bMD2Osllo450_Oa-U_6`%rCfC^9nDnJFO02QDD zRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$mKn17(6`%rCfC^9nDnJFO02QDD zRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$mKn17(6`%rCfC^9nDnJFO02QDD zRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Q&PXRRGUx*b{yo+}mf6k>>z)ex}1L z`YfuB#7zYjQ31DSe+#L8j`JVQVlVd@Bd3N2?@LhrJp89{``jCZI@=xS@pbrV@SWhJ z^J`ANc5aW!rGw*d^%z1~t@-iDdy{9pJrzFp_W(IHcYNi&&pGgww2LtK=vmo0`P#XG zN!EL?{6!C^fuzrbZ-###-sjnG=oXlaA!B_U{#^KIF1rTvE_)m)B2Ae*&#&&;zo};eOI)6nr=Od93d(x=?0LZh-w03HHqBoa0K~=Lo)Tb& zaoKC7thwjCJurPvar`&r<@LbVuXvhM5XW;1(v->bQK!-1P&M$yGFD0ExNT7wZFZaH zFKYq9&$6Udc`Nc)!|TrTy6!5pt-E%7cJB2DK6^Yr0I~mtd%F=CxgMC-^!uOZU@$xH zsGL&|hv}voqC2K=w~R}FZ#N^8lWt{h!2=&Ge-Q-y&xNNFYlRBCihtM+*##tSW;Le9$@WR*5ha8YbSSn zG(MZ(rumB=AT0MdQr4G$YP`Gb8qB*4V3yNAC&0@4!anD}4T(Wp;ZkFBTAo_BmSKAZ2u*Y?q4X6I}HXmF9d<78yS$-OAh%d{&DXpRO@IW(7m;fCd-I zcjfBaM}}Gs6~NbH^l1_+Dqf~42JrAa-9Y3=SaOW z6+m{v>e>hRTg0>$6%088L+3Br>&1!WyRNlw9~o*nlykiuUysqJNvx=lHur_g=l){y zo3_Wpecx0nZBrKX$*Bhb3YIzxu%cm~vK~Jt-OAjKkH%;7efZiwddv!j+yM7!nb`S^0&H%S0cT?s`G7h>Y7Fq-7c#fjzbir3kFzS`>ruPepbGA za>qyGv-z%EW9{{r7DD#21{cZ4__T>dhFT8gCJYo7e-f){d$ej;`5upHtD07_!TdS( zaF{CqRUp9X+INkq;duR@bG>78>&1!WyRNlw9~o*n6vHsj7*KeOK22hcw0)0id~&3| z^O*DGZs&6N6{Skn^O+{qgIWk#%R}cc;_JnULZOf6NmO~W)a}EH7 z<&eZ0X{-DGndgb4f&3-CIFWqUwf5~J zLoJ7LGX@He(WgnQk+!~%q^sedb)DtCz_a1L-i4!yZ!=1B>f!K4LAqdo)wS;$)8pr) zTbbMO(fDk>E7w?iJ!S<%?tlgt$;bG#iA9E54i&)H;!k2lg>7rg^8Z5pvjl#O{DWN| zBuNX#$f*Yq3YIzxu%cm~vK~Jt-OAjKkH%;7efZiwddv!j+yM7!nTc-4?#Qs8{#h^FP{=0MGsI9I73Drbpyj;z>-m61zPC_k(>@PLo~fp7Z#{qR zJb(?FzvvGQ>h`OAuGRJVA9c^pcwPZ(9_&BxoAv)c--t0&CjVufzL z1H2u}uP}pe$jR5v4QzwvFM7E3)W2&nOE$COSu$5{b9_B-N$cMK92;q``^NI}OtH)1 zG5a)vL7$v@SS<4>=j3bWo(Eq$hsBV)tnkVE0ND%jdG=lKY3)u7Am5Ka7ycah=(sP4 zuiuCAY|@m;|Np%P-t^oLUH|jcV2B?D_w#1g!(!=BegWEUaxR~J1f1&1xz}IMUxzbN zC)akK^XbU%7HQL{gPy;Hd>;@%mKmllImqCto}FG(6B(uHjCHdtD@b3w&pIQXh+9rOG#Nw^Ac> z+=v2eR;^z3gPnF?wfm}rBektVhn@81lTLo!>rZ;)qfcFX#3?7f@}#xvU;Xkop7_Q; yS^F4N9kG6YKhmdHt@T-(ZokK>9Y(R=Kl+%%Uv$Lp9dYD_Cmj2nBi0{&!2bg|q1sLW literal 0 HcmV?d00001 diff --git a/q4base/fonts/Lowpixel/Marine_0_24.tga b/q4base/fonts/chain/chain_8_48.tga similarity index 68% rename from q4base/fonts/Lowpixel/Marine_0_24.tga rename to q4base/fonts/chain/chain_8_48.tga index 4d49eee869edd5ed2465860b27d8049a1f459d49..36a5dc0d2be29fd3db58cceb0c6f18838cec8d35 100644 GIT binary patch literal 262694 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

-!)**QehywER>kvYT1IQIWTF{AuWP;yPjS!EBOy8cxcKj*5-UrJjv zF8O7AiRuP)itna23J9Gtewp{O4{Vxi-}V{|^y`2DuB(>&$iw*OoIf9+{0i6_sLO@d z2~PxgOnfo00BD>R`$WKECPUjoW9Nw-6cBnSChBZ{Y|kXob&{EULf6ITI~sV5wn~!Y z3M2Ti<5D>vUrBp~$M#K#C8--f^OP)W^ZzIeOzWXmw`Y54&nO0){UQeN|v?xpL+bybAx^RpdNm--mTsR^*y%3zEkZL5PB#k>Xe&3|Gy#CcZwZiTorQQ^*zNa z(z^b4U5ei-o02#jzoaPsZ>oH@ZBsz#Nu2*W_cJuq7JGU20a5aKTTp%y>fQ`|0r(-n zYtughc%J{y0FMcV`ZwJM;3HX@`cAb^PGI_4Ex!j|km@_d4*vE6c)zu7Tj2A-yjHk- zir*?5_-G|nKHIjLL?&+jx8=wnPa^ZP91Cz!;nD2XV@ z3!i-%_zsvfPJF!1z@#t`<~ol7egaU2?mJEj7d}pBVA2@CeAm8yw`}%LKle58yO&Ah z#K-FlObP>L{__}s&#zOC0rb5vDOC74oq>sCz|M1&cLXSW*VO_b`wmDYg&iS$F7pQ9 zRA5uUzeiFDbUSBYh8eK)GnCJVrW^+}o&S744!=7jx1g{F(8$jWQ{ds8fr({6bJOT; zQKsAp@Lkr)+|V}QSZK)$Q1JPm%%U4Q12e~f=4Pb%dw0s)f#hUp8?X+vC{Z9c{HE@`T8~M*|M{+Q%1uDwd&i@C+EFfTys`D%0Xb-WP=B0BLHJIA4S?Ecv`GL= zGRe1(TE~e7@M`1R=a_j8W7`rvHaD9d+Ti%&*wM1O^tJzyzm)%<-?aG%t9vLobiRI3 zCikx}ZAXVXt&^FY|H~uxf0|rW?2CV0H;>1!vBp|sZ~TAr)oY@8YqU=E{|xU{eVs?y zRp^z_Ch7gY0vyNOmM+(grER+g2c5e9)upfPFZYK+>G;*wcARDX6dc-){|Q+BlWF7e zB#*t7pXNaQPNpnys5dcee8qV<+VyNKP4BVxHLjDItv{3%w@UXm_M`+WjG}!17RHi) zS66h+nqdF+&?i;#|Mu3Z^PAcZUzTUS17Y0&Tc4FveKxg2JW0{^HvHdz;*r*K;d!5r-6-t%%wV0! z<~sS`2GDsj-&xz+95C_dllQPr0J#1opF_dEA4~OP;UB?!8~gCuXjX$8H|u&4@6Tk?B{uuY5465}Sak=$ zZ6MCU+K+{Q{bK514!PALd?6` za(?RkrnbZJHNiRWUH+y3p}F7xyter%0CYY+lw%I;vbyxO{pJ2@;wG(AJGPXvf(OlO ze|D@zWnP2VoauZqD2jh3mRGOIL0$Ud|I*+v_4+UED4n1Gfe*g7Q*ukn`m#3Y$lNai z$Q!TAtOVri%-R-}gY7ENX9JQGQOJFu%zHo-`p@c%e6^{AKR$cO|DLzkd$5=Z>-fF! zE?~Jf{!{v7k)}T;eg1Ph8rXiYY_|hjev5cZ;ke2s_~E_lw^hWmu@$aWgPi=RfjZ6R_`h8Y+*QTaWJy%ytIm@cifd z6!!!8F5{uO&pH=pU|C}T+x5eM>i`P>`!(D4+m18yGX0VK{6Ea?dq0hf!Xn=fxdG5N z#ln6j(l=2qeD8B%$DS$?lmB^h1;GECs1m-T@@nA4J%!HPR0TvEWAeTHzXd)4JOjwT zBm2k${+h}veZ-Xy6FlkttLoR6M*PD7&cnL(uT=kp0{^3CwJtfJKi4Dw^NPZE-98;? z?UGJ{G@1YZg+4{^-L`f1KT62c!q!O^bcDYT0^H6ie*yRo@`3lz7If>a3bC#Nn#dKs z1&1ROn8!hucg}h8oxf{4*z$eIo%R(r|KO7ep8tV(5GSqbM(`0NW`K^%a|brd?*AW!wLXXx$djfA7%vV4#;Y=qyNC{Gn~5m%zb^ zf z&CD3(=MCNj$RH%-sYnTL14vdwd;0T{_JJ zGcG%~#yS5Vjhu8Yq%juhPUDWZ7sCVB#je2bP0$Na-Yo9Z=dy`awEhRSJ=kW;V~o%L zYLgt;M;>xkp&4_4hd$!UhlyMC{qy=!#%2yCe$o2>v}uovo#ufVmp%U9O}sSKCb{Ii zOb+DX5x}p3`1_8_ygw#M_Mb8aIA!b&fzuTL`ZnN|0MB_-+_biVe@W5$XKq7i9ju_E zf&v z=l0C|+~RmZx8)?IA7WkyP;Lg|aoc6KQ?5$!n`$%dGW#q#|7HB^0bQ4&em9WulNzJS z4!$I1@ht}|kLvlKl=$DS8cUltj3;&diwE)b!Zz{L2TmSlV$X%=e>LtyHHJPkoNf#Z z%=dV?k2qyM5bIUIHGrN2La|VIKa$TS?NR2dO?_dcrInoTJl5y7$LEip2IO3|i5K^Q zzos&(=YLc3xHite>oS7A3b-23{bm$Ph3kXYralDp^87{D{Jp<3;0!ne&VV!E3^)VM zfHU9>I0MdrGvEw31I~am;0!ne&VV!E3^)VMfHN>#7%08VwzPrI=G+LpA6TL9yy5d8 zK+kocSSWla%{PEG`i}4ZoPkMZz|6L?XMb)tHZSR$EBKcGKcl>)1WIB5zT>+;XJC>U z(8Pi+d-j;`f{-LX*P62}V*vdDlY7IfMCv-AHIeRGfypY#9Z zfamrdzpFpwl|KuLGT$S>_vTy)+z+(>F+tbFy#JhH0GrD4z!?CaZ+#tLx2w3k0opGG z_#WKnbQvi6OUjP_m%xBIoeOk&-)>Q!3JzWN{WCE3A|K{ZUdFaz9H0#<@P2cYn`q4NQ?JqcxAi|6(5omD^VExiUlBxUoD?}d>ZknTCn zQjVd^;&bdT3V3Xq*O{|IURpQQ`u);dRX=l?c%-?^fVP*Qc^>&~fbv;@#|2LZmH<4j zd>)W*cU{H}Ka#Tf$6O@6Uw@Nh=(6}6r=<7zUASXkBxaH4srs(|z5iq|pzXzI9zUK3 zP|gSL0UiVv0d||~L=b#Q%Fh39mI3rAuK(%&ALHov{jpXGv+n*M60_?PLE!SO03cl-i1U?+#cMq>ImI<$Qd=2P5 zeo;X1{u9!&B+|C^BLw$8vDWx&jT`(Eh7R6j?DwwdLCO@QwM6uv7myY~k@;^^+a4+glNO2B(>F9mMy zBaZu+eGG*4zBRP&-MzF)mgpzpeVI=I8w2_FRObt}yr$b!4y*H<+K#}w&y<=2--WqN zs{cAW_^Ny7r_JkDEIb*gbK9t${tEDqsQX_alSU5Rc+N0@mCJR1(ezr*)_0@a(eE;V z_hu-(Z?PSaZ%=j3*eS>z(D8kbvgLj2{HC@mICNe7D~)Y$_hI4lS3ub~RezU>&HF`9 zNF85_9sK3%3uRu%IUdNK--hPzUq6uI$8F{w16a4a0+MY|Xfz1g1AJ!dGXRCp{jLLK z+f)a-{D>!sre4gh>`kem*<3fO<<%gqQ_raJ$Z}CZ#iMb2PS1>@3 z3!!^I-bh|Kv)B;4a2w}7gK`95d5p`CLHm6G<+HPCSjgv;EUT%h%b~Npo8+fH&`$_{ zsP+bue3?G^Jwx@a(oJ%#vTYb&=Dp3osxd}wYbiK%Z}G_u{5=x*g7JR~%C7);{-3lS zt2ka3+X63~_Y@wJas6am73kAYN4XnVe>U-fe6C_*kPiWk*R}dU^BGM^{(V?CR&{{( z`Cq>MaJ{T-xvJx}Njv;j& z*Lju)D*euMBl4Lo^FM_{+A!bV-h%*Nd{(K6ybH#i{&&@`V-xsJl&iLT9jCEN-}8Uq zT0i{rKgMteiLxKZ7>Qrkmps=Dis+;>R& zp8s4|JlEeJ;JLqq=dBw7sl#byNB?cmDp=GBajo!JAhIZ4q@BSADC-{BGebSkhkpl9 z_#4LDzS!eEe;nTfnJ4q^hPqL~KIf&T{HWlYs<-Xm_^g|MoF9@=#Lv%} z5TuNg-s5xqMDchXi{FVlFXC@cj;mXbUD~7gaXzKXU1F*)VxI@_y2qBvLv2-Bwno1h zWy<*gb3PKF@Y>4yKt7Htzcby2ym-$?vJDE2QlPzo_L0<^0?XAoGkvX}xXgPkmjIGc z%)k7Y1wrEYTprc^KaHvG`)4HaxqeE<%l%l+dEI*K(q0n3EU&!2OHB1e?0*361I0MdrGvEw31I~am;0!ne&VV!E3^)VMfHU9>I0MdrGvEw31I~am;0%m~ z0X*Bp=cY~q4$^Z@V@bq=Is?wYj584CJb$;s-%oANWfy0_8JG+PINt&OzJbr>-vF#L z86)>mIs?uC=DU8|z~74U_u^+eE6#v3Fc}Pl`M(4@m&q8pkJ1@%1~BQl{~wUK#tM?x zF^tuG7mvi&=jFLJPS4jF=$ipd5Y7j^=Y;d+)+RARf4)17*AICOLG$YwC{w-+sIE{q ziC1J>;@{_g5m{d64D`r=nS1A8|ON`1bkVm00iZ4Ad}S z=H7uQQ%(dl$KRgSOidkX>eQC&nh>?k@cmqX??1Z_s1v>)_LIO$wT|7u8E^(F8NfW! zJYExJ?(44w_)HP&`A&KY-^(PsAzc|Dp%K3I&PJZcuuRx<8r8`T%~QK4xOS672Egag zdJT2tn!@9;A)7?^ZZ=C9h}P+sxS}E30b1AGFY~_QV@#deGTn7(!9Uc%Hdc20Pdm!t zUE_NHr3`@2fpuz@$u-62|5CboFM(hCe%;%94^ZL|alZ!W9k2S|iJMIw-^ok49*`Y1 z-!0zP{9g;ch?V6Nx^DjW^8Q~FZzGgB#+^-_ofDg*{v6<5;7`C=K*m7{waL}+vj^~7 zpzJ-Y*P!iX0FTR<2jAB$`4$RmCkHDrgbzDbTUMNr&3^>=KY;$XLh-6J$Nz|up){_B zuQJ}_93E`!Jh4L@D6v~-GsJyw96NFOZLsTW{@d+M<+}NQWaq)dfyNLtpP}M+pS=c3 z8!qd=Wo`;KP}z6(CSCJ@AN~K6{od7gEx#8eyheM!7N9wA`0Qub6k;CivcipW{%h{@ z9u&u`vBz5bBIa~(=RpSt@WpoyD;BSLOBhe})W7H}X6y&PmnbOo9dY}pmJ!RYYnHzl z^4QU|osV+qIY8Ik;G6rkHvty_zXr%P=Yqtp1J%8#Yh3n+vl#oMj{Dn3n6}eUru-{F zd**vQK>1?VJm7=dJ*9Atp`P4W;rq|`1oGT_$RYP-{hFYKxpj@p{wBr=QS3M;t`kWw z$A2Ndjl*>-;qPi}TOY$M^f6O$;^1*yEH45mp8zy=UjL`O6;NHSW1mfz;d5I$PZWM9 zb3U%tG)|E{{N&>><^MqWC%~$q?pM&1RRGzujdDqm-zIg_ZnDp!ImVb@H#RIT0iF#g zmnPu~ZLP1UjKxffax3)Jv{C_}3uB-@AE&i#8mG)Y^3Pb3p?u1Gbgf4~JI1c=lKaPT zvCRKa;`YVs5i0}CYi)r4k-=lLfjqg~Rp8?=KqCL-UZT1I-8C-zBR~%n-6JYsE z0A(*g_IqbFQ&VSj%>#aZAADU0y*r>7{Eqo{XrsCqSj+Of(Z&$^tqFYwaAv?c&=ej6 zsP21N&D0eC`%iVBK{@HanySVFABP9uR2&DvZ9$?sYDr($|M-jpe>ZJ~%Z~>h1+dKX zAASdL4&DoJ-jky(fU2P-wb2K#67W`l`*jMhw@6MwfyZUyVRe*weDXroB?YQ5f*)=> zML=~Xx8ifCy~1U3Q}9p4b*?d%X_@=}9}EXFxL#PMZnQy$ennjKnl!J=a^J}IHGuno zn}Fqjyif9qE-{3!odC&iP$25A|LsuXu2D7OoErjjj&oie9G1TY%`t8T{1MnKEa&6a za-)C+#_|*Nj?h+4!oqxDD6Xw5aNDTL`ija}%%pH`HVRT=tN_r3F;H*EE_0v%;4_dh ziuuoLV3b1u@qcPoGd*8bSF%>qtKpO1Cnp1(^STy};*hY7_h()Y%ukO{ZV5m41Kh{w z<3X9nINT4bj_28T1Dl&VwUs+hY>9kcjAhBuDCBXf%88*$%_@8=m%_PO>aanB0zenW zh;ozpsOCSfc}a%yX)vrtrV1#X+Bw*dV*YO$d|v>qZE#Vjv-bv4Q!TYK{uPIs+)HeI zUM_XmpaB8?0PuTd2Y|kLFM`Y0hh@d%y}#>#M@IDxq7|D){;-(IJMgL4)RLiX5)H+U z8`RQA2}T;1DJlT;+e>m#ZtEG_zUTk(# z1fcL(NasS-l6_H#^Gc3YW?1Ai)G6-JTwr@20zW*@q;MVZ9+MrnE#E<-Acyo3n?B%= zcmcrpR))shSIpRt4a#!dUbY^s@t?wl+`GMcJ1NSRXg8n6J)=S|w#Rk4KE}rM{8kgiS6x5dK6n}2x3^)VM zfHU9>I0MdrGvEw31I~am;0!ne&VV!E3^)VMfHU9>I0MdrGvEw#VL&&lpnH2Jrb|BF z*BNjIW{v@$|1-z6M{)*c8v|YEKl=087Cu+>#8Bq)Q&paA%M7 z%=!L3fbSq!9(WAE=kfj>SQ@CHgm(Tm@g#uHQ2H}+1spBwRbjpJcT>j$KLxlg9S9^3 z9kx3HrvZxrKKsh&FfRn2o$O@HhRAhKfX`w-1T2}UbP!9@W&S@KPW}w=+2_vzd=7tI zpmG>&2l$>mK0CiXP-*XtOBn!Hn*&Ycp{2cNPYDCyHgIaeK#on#5`8}kaLz9VE(f^( zq1>42W88MgmG8))Tnn5(Q~6{Or$4&Pf3Cyl0UX11fPV8;ISkmbACDP+0o(wrQ`x~A za|Xbb=D+=oQ(5^+*pFoX!|zT2Wq*L{llUKi@4Z+zPq?H2oAm(-e=o5BSO<6?a8pT_ zp=#LbcP;!~;r76p042!>?D*S_B>-bTAK-5kHwLot3yXod={{OReZE-dwC|xe+SO4viG*741g=ne;zA} z!z!KGF74f4Da8LaG>`wD0`Ofpl(zx3fnf6(fU*ssF&vKaowc2Vf$7Kn4u!{)7Xi;r z@c}!2Z*cy95?~IO06ze@Z%T2|*#>d`1t5oOG>J)DU`v4Whx^b6fSZ8qcgA&z!A{b4 z{+|H{X979qEpT&Inwt85srkZQW9R%|0<56A6d%F%1JIQ1fR|;Z>Ho+`anacZ z@i>N)fX@QS??nv#?DsFfJ1ME(zth(3_y7Fv6#wU={O@LY#VTTg9n?~(vX9%A_F7ts zZOWFH_DCz0`59L|vYt)zpX>kghDq)NvTdS{pJ2Bh^y$F80Ov1{|C9ft7q;5|xWC@W zEZ2q4+Jim6!zjFV#qX}g0FNVfOmfoE2yrxqC!n1C{{*nz8KCexOFo*Me`THV(RTl@ znACj#!N-BTu8NjmcN?_iwkrF$4V{M0cVnBf<)Xe-b!C3WRgYX}#rz-F_&u&OFv$$~ z{Ga5t?_-~I27LZc`WE2hpJWDn{!jAS_pwhp13v#JeGBmMPcj3`%KXPTc&(WCj(HD| z&+YLZz&XH%le~U??9My7&jPh9~-alFlP`*|*es6OICYb@uk7Z^4 zKQ^1~)6Wj-zVWM2_s2XP}q?pZ~?Yc&#%q2@LrBpMPl_<}Pq zLI$vba{g0>egj!hH?sHtXo!f(d9y!2`7y8xpypByo0Wkxfd>IT`*Rg=HE;`1`TOzM zDeNVU=B+wG`}~hd_2pT~0Jc@lf3x{k7Dw{_FOh@D+5R5-`yq=jvaU`{KlP{PJFxf; zo22*mC5qoPn+k+%>*d#; ew?bC8&x`lnb-&&B-hIy(Zt>FHc3-sXlm9;ov@L1? diff --git a/q4base/fonts/Lowpixel/Marine_0_12.tga b/q4base/fonts/chain/chain_9_48.tga similarity index 84% rename from q4base/fonts/Lowpixel/Marine_0_12.tga rename to q4base/fonts/chain/chain_9_48.tga index aa57b0530d9b6aaff38fa9dc6cb20f7aa219329a..344b90b159349178948ecac759d8cce6a232400c 100644 GIT binary patch literal 262694 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 literal 262694 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 diff --git a/q4base/fonts/chain/fontImage_12.dat b/q4base/fonts/chain/fontImage_12.dat new file mode 100644 index 0000000000000000000000000000000000000000..31515d606164ff9261e24192ab4fb99f54a09520 GIT binary patch literal 20548 zcmeI4L8xR$6^6@bk}(st7owvH*o&Ys5pA>3!HK3fYBVCf5l0h955~;IOk#sUqi!14 zE`o^bUbt|PMHVsyanTExgA5WxT=i1K#VkT_A?pA2sY=~j_wnl7`!0xZ3r?zEL4W<9 zI;T!m-R{Y`5W+bb?VYlB%g)Qvm|m(aKCk~^;o0xM_|gwP^_^>1o_q1>#nYdD3g3~Vc#Q5pAo`boVj>Q7mxEY zMoU^bKc}$}*5Yvf`mf~=mxx)ted+*yk^D%@C+FZQkBcIJ{jQG-r zusiw~!mH|+ig8_EbM9fhOLn)6aci%Lbr9>m%h$S~FTbk6FIV)YtQ`*~80^({x@Jsx?hK|I!9t}oOp>>%6A#)!w|sBb+;Uw8hlMc!r*kF}BWg?fs=*VT{V z?>6#&H4<+Zc{kiV^0!$JQhl+pedOI#zjMWxdU6ua>ggf!s0Y7s@rWleprMV|jXgjy zB_8*v_r(KkskSE`_1-j7Q{a6_z0cp%^-)vcJ>=F052K-v*V$ic3cSw^=HY8zztj|X zUmJ{|D}PZxSKq(B6!`)}_MmJSud8n<7W&q(tNSnS$7m`4a(wZ3 zE6y$ToQwMNI2*KiyU62Q)SuV&cP|e9axNN!cZfXBMg4iqAwJuj9`i-H_nP!^PUz2T z=LvR}G*%$Kc&HZP8ev5P$4{#MtwkGwZr z`Z!BA_2DbEAf7SBILIE5{oTcThu-@iHFd}H0ec%f#;s8YW~vK6Cf3#S2KVr$KH>p0 z-r0`~jnKR9`@9#UrSmEI636gSEb`^Ztm;EsQy;I}`A1EFcj2hD_I#++mvS%bn~THw z@1rhWT^}_DeHUH4QeW~n>!ZfN`;v=S>Pz{^xSBXCapvkTyLnMdE54aW%|ajd>U#c_ z`uMvYUuqUS^145-eg0dDgI$)bWp!Rz4^n&>w^{}7=dx=qUg>YUp2FJ7uFGB-#OwOI z69<2N^)LB{cd&>B`pgI`yQFaV<*;D_B$Chp})WF{RnM)8MWo6i^trXmXq=s z-a$rv@!hA(eCg_A&7se?pO^KNd`?V@#Z0`X#QU)N`uycwGk?4Fk2ObZefQ~7ALk)H z!|FZr$C_KK=NVgFALl50c4+$Wm7KBj6~5AVp6EMYmHxtN?3cjQ7CQe0toQk9;xTK} z{7t{tBM)rtv*u{jmT7%36Vv*b)(3eot&gc5kOfmc_fo~3Kg|H|_-f9LZvJnop>k9^OsIL~7= z^rgFujltW9$NlI>Bk0?TgYkQiF`f^>+R3=9`koJ!_oFm_c0Yo*m!Z%1e4OXj&GS|I zKER%5b9bYCO#Su}ulmN9T*<#@z*p>bna|&J|Kqcp`Db@J{5{BiA^V%Gu8;NATp#Iq zj;%X*LB0~(J6-vLjg0krBdY>0RFklWh5_{;tKMzWC~MS+7!k&h=^| z9_!;LN3FH^mg|E&L9h9XHrliFE`OP?)Oej@Y~yI7{ZReV#VhkA@ho3<^79~jRp$G? zv0NYcN4Vhkt9}dp=Hl zZEe~7rFv@lvJ(e=zjf;?^QFr}A3VM@tNUB$vF6}i8i}`zJiarl>nrmw`D^*d{IQ17 z_iY!i^f&ECIUZ|qsP}wlR@YbZ(*BWoo5U^OtxzzT`9dzBdwY6M4S#AA4`P|Dw&th%fW^rh4D+b2wj^ zZ+SmrP8qkoi1~Xef0MYm%k;ioqs_*;!Cais;oYLydR@cOB2t=4$`y{hxiWreN($$!D9ZX&77gn zst$&*<}= zC(C-p{b(k$dbJRT^|4fc)8#Mu)~tWLMl<7Y@O%RklvMoVjhT(L3cZY}$`?5eCDUuq|sXwCBh z;}#3@k9hdbr?5`q*%+~4f4ii9jQx#Rzn5GgJs3lVYYLR@LTpZlB1oS8Fu^Lyh3LC(N0b2IdO^8L;4 zH@`D;>GT40|%#yJQc_&dB1JeySaPVi*o(!|=`PFW$Uy?(5HAd*Q`r51u`L@#8n2 zyT*8ITo3si)cZRth%=O@ZSr1|!(z9QC&v;-MJ{kTR z`xEc~V7^Zl_k{W>)@kh}FKwBv{p7nx*TQ-j{pJz_End0aKA>y%WkDZ2 z*;6u~KCVA4qoMBs8GC5PhhZIfKUe>0exF$1L%Qa}GSjySynm?o=_~z3E6m{U6Z$FE zL+X9JG9EF$7LPS&1o3{a{$aE>{bjC#mhJoz-}_~Z55pqp`e(Vr*oW zWqkT`!D*K!#}F;%jY~E_==G)eg3j;)BNEpyvMqExxQuKkuQDv zxVNSA$13o?-_6V8i?0hA=a0Vl=IagKQpWwVFTPXWD)6qWZ|5^-1FOY$KZ-m%58^9E zJ$Tf`E9-qefA|XTi?Y7?gP-3%>yJmiKG4Ye@WrDxe`&vlHtedb zPv3_$e;>IUbF{(xVK)!GxjvZa>+?6~!NP8K^YZNZU0CAQ}GU6yqZ4FZ>H~#IK=m#>Zz&idVqhXCEuUg z{+a#ckyz{}f33dFU)1~JTk4DT%JhwS{rXZp9W-yWef53% z@ITGpnAfKdKhr&G5%h5{^65j5%~c*>%W>8Q?aGOGc5RKf3Ow#detlyeInCM9#)vP> zKdATB(@`w9>jM_&L&k^UPT=u87L9%RJpMO?5bL(q#`Jltr~c*sq6nWC;`z=W<@(_M z_K3`49`ogreD&pD$z%Pdd>+TQk4Ib+Z!KSW9!q_B%Uxf}d>-Ee>>hGUtk=ZM<9n}o zl)OB?#Dn-w<5A<4^B12-+rI$|e_{FjEqSq?2F;2qJkB#d9@k?ua*umC^(Bt!r&zCw z`GETN{MGcO_>zCD7o)-BJyfdq zj1J-~#M_(jYTvKb^hKY=q6Wx#zwji#v*+!#^@}Fk>!oJw+iMJ7}{=H9a zf6v*aI56p!=K)2?`opJfnR z_>5s{(ghEHc?Ov0OHCiot;hbNk7o$>Je%BG%5KYGwt1z$=*s7BC0)$lb(g;K`F+ek zJJXRX_{{T{1;3l;L9Syx(3n5g3Yxb*J@mPz4y&?0h-&(#fho#Om`_u9xqU#vO9_WcL- z{sl4HymEcOA|`2lET!uUVy!0nYWc@?Q49L;m6#Zh^#PCC?Bj7QMuW$**z`W0{9B9n zxO!i{)OfuAuzzD2cwgNSZzFBkzhtc8JRY_AL&v?>2mZq2`M8hAItXiFJAbSV?w2-( zzwo}Ko;BCjcRX(uc;DR-Z!JyeXefy#Dvu5>5{jCr>;y}#A&AEiEc?8l8q zESSGjvcCC)M@$lr`QzK?zWL+6k@J{8c)s~7*9Yq@!F1vVTzC?ZW z*2qD4)BU)|-}rpj=72S^Q5@b>KaEFi|5wI?IV9eRM?BsVZyFB|FYYHpjHGQTJCLnq z?R+lhFFtRw`GWzE=fyvA@k)PVJd(a6ah{TGT)a|WT)(Do5aUkZ{oBQB>mv^6Bd^=@ z*XFS<;E~t6;IS^?k=JcrIe#%8Hh*hzj%1u=ek)BkT{SfzF#%)cY?-}u4b?Hlcvz%vpOkx0!^TI1T i;BCY>lJR`wcP<`I**%p%KlANt&wWF?;;pmpKi&oMCF>U5L4{CTR;ztH$ET zrYmvTrMQqHU5Q8*E?gA3h)9tlUAS@;L_|bNaUm`$@&7x|nLBgNOz%AR_=1a`2cFD( zC-403^D*lHpFTD&;2c)-2>6eIsZBIylEZw_(t;XCX zZKTGc{he68{qCLmcFPb6_8pPJqhE5yn!D8QpJd-B1UM-*`!;*tb83C|G0w)CeXV|8 z+vy{A=o`{$`FNjL+Soyi`U2&6v4+2O0lo+gCXWu z)HZ7C{xYr~+wofc9PfY01-#cM^T@|Xr2X#@XH&e#)P8lceaClr*azn7waQ-+p_I3wb#_v*V~8nof41!#bT@HT~Yg2 z7w?cpvHlV4qdqeS>9^d{Qct&4^N048@)Pvd=Dycj?73-4=_c|-ePVPpCF;qiB9A3SXQt=hc)d3YZi z_=|1mozlGCdwBR8uSeJh@6u!*Yd7*>!8|UV<}d4(+R{jk1@B9fdDNFUUplD%VZG(` z^g&0xUuyK4)a>i#i+*CSHjT%8N%qw86JhT>jmO%(UmD{F@A=8RQGUh3=fl!`{d(fp zijdR;{luK%ygi@K(|F7mc=`M*@zS|LJ#D4fN5A=sztjWP@UWhic#Xb;B7qm@3%zI-$?07Z!3QaY?J*hhVtX5T&HtxN59 zU>iL4FVlE%lKCtSOs;R!{2lUOq2>LqXa4PFzx&BT{Yz?7mk;)W-22-7`Brb=3u^QG zbId-#&iAVI%&28C$FQC3Yx6{FuwJkM)5PJ74@58*B;r zNc@#e@W`*92NTJ8_zJIlJu1bIc%cZqTcpfq>x0D_c}49Jwe|RMKa}#=OR{$9w|gyk ze-@83i8`;*cTfcTxLyw92aovq=F6BD{I%bKzr+xK^Xo?`e&h9VpX}rM7IJR&>a2Lw z=(@jS9-Lj2$pgV3jsVo^(< zS6k-Nc`;VzFS+5KiGI5mgva^Id!%)L_vt&>h!8){ub6}M zn{C98^Y#lF&vSo7F5>$P*oMzHOE)rJ>3)^@o7%@&BKPR@+uFdsUy92;f8Ag1cf%UP zU)~L4{@C*X?1RU7PX0XLo$SLV1RktbYWCqPx+%R^TDOn5+gRgaSA72u`*`-tvw&}B zyuIfm*!HMc`FU8$-y394S`T<%nVLYq`AN%JgzxzW;~R!Zh#%)`tlj=SXmPfrw@WWe z>+!>uwEj`6Si_-DA0_4UwNDk!*T`*ZA9IHsTh6hK7=B;MGn%@6@m+}MFY}px^L104 z?@4(_qRtyXKVtndr|tO>tX6a7akY=A9rE63zJyqjk8u7MVxTT@4oLI*T#8?*UXc&0 zSNhP^Kk|{+s}c{tIA21rFRW+tx66lEJpc9iOFa$(kN2s`t@Xo0zbSo2I*eaweT?S| z9L}F?zPu>gkeAiIbed1;`Bll^QvG9nSdG~3dH+;<*2N3);&LJNA2q|({?Ns1 z#6S^vysNS<4Slvg&dR>L-k1Cx^BxfE)DEwUpIDs5`sUx5hkcRP`70LBD*U{3eNbP9 z&leWr@qEF@JFf94Li{+}Jt4I|{3XY{uXj_Io7#M-^ICD>ePIPW;)i`F)cWjWKY${s zzt*?e^H^*9r1kZ&I}iKt7yCZv;t_ikN$s;f?1P7WUv%*raZm)_N$GHX@IR~%p3w~b zJyp0Kt?4@{FFZe|zdyfM`y26EX`MHoFI?N0gZ-TBd{mFx!z9^l-o;_c+`37P0y2E@SadRjfZ{g zCyht!P~Oj(7C(4gLo9x;=p8Y@T%H+KF0ZFuYs>-Un>qg zYG3~MGo|&$*gp21eXV}RKI_9i{KdZG(z<D$2 zK6n?Tb$@r~K|l^Ej@+XUc@GupA8TQJ{T=S_w`3Rl$rm#FO8X7!Cil-sn19szVLjz~ z*}Cl8J-_4vIi@zRemzmuxy|?E z9)H=daj(Aw)2&^YugKqgeU$bajI*(3UpUXPK5|M7Is41&frrO_jkyusgvOe6I(mSO2^PbZFuN9AbKm>pBll?&}HDB?W{Q=x*^)Ft}@fGFz zk*~Lsze^23k&utb!!~$a-&Vnc1rz&x^O<;|NNS(;!9uYwuLmW6*TiXoNdk}gLVpz2 zTPq#r)liBQDNVnh`#UG+-t#8!{O0twg1ieS zXWr?%pZWd2zjN=M-qw4@_mcha!G88*y=kUFzMnH!`vV`FKehtzw{CqG%Qp+W7v1u`Q?hjJ7vqn0 zJ7%)mOuFv6?8kXGgfnA2~Oi{@5>`@sHVWH|V>k*&lyFyf$8|E0q|KJnruiAb{a{XJpag}_LAASe^6^DMPPTxMS?T5s>)6I+L zOODpR$d&rZHvYtGpAm0*Ki?_!&oH|3!6RO5t(8xokgsv=XRv=a{$QoG6G7jvYp#ozSP$%X zOakwzY975gOyg|^-VdvJFQ`udnYBanSd{Y92K|+3#48@8N-XCj;+s7mxg6aKw7h zU2B>Rao7)@bMdHiU0$qLR{y55+f3s(8n0@UU$z48kDB+yE&F$Iy_yBy-v{FD2Htg4O|%k>=I@oFBqmh8v%7v9-w9{GXJX1}Re>_1>$)_m~zo6k4)3*_&g zt9Y6H#29I8Y8H0xDvu^ctC&)*wDf4ps&C5rBg?vNwSLjQB1+TupO7#UE z{T1<7*I&)Y3;x*D@cARRAAW$D>H+;4`quSp^Z9{4$d94?aV*GJ*Z@-p{Ie^YRhT$mfe^`bNurs|VBq zhV_%}epR0y71Q^;hkf|#SFc{x)b^+73g7nUHtt$}=hs^Z0dBiV09oWmObsN(hO0rKr>pznVN z;;krN;N7bE;QpPL?@-`<$i*W*g00$m8hNbiK-a*#$HmLzFY=N}~dT#!h1>Q^5yuN&mbVa_KHP^}4 z_s44BePAFS_al(+6K)>;GB)F&KZyMc>$3!j*L+}}W7a>OTJ-d|DcVOf7g{|E0|n%4)APvG`>S)=~%IgPUY7V8TE){=L< z_Z^q^>*mKYUP{kHm+`WUmt{S@{`=$0{8;A4GC$tF{AjP(;UD_(xOcUsY3TjpT<$07 z=NTN``-!&3^E~?9Gn$XM`d#|(C=)#TX9nwf4iI=h(tOm#%jJvrH%z`QF}PpC^J(An zBjm{UAAC0X;Bmj?_Zt7yIJo`h<>P({^7)>BU@P`79M})J7_8g=XhpVTfAl`hW%*!r z{maj++3!GK?w4Rg_J(EN(DfdBb^QUKcN%PMCb=dW+`IazMp?dm|3)mLtL@*=cP;39 z*rhM`{q5Z34|w)GfOzJ(sM+^Cfb+WffxhYaLL(0P^8UeDm%eYmKQ2iw{PFAmiG28? z8!y+5?m z=*u&yGViU3mu`K*H{^%;h>7W1$lENu9yi?_J`O~t@|mo)p{uS37C zzPIV~YFZ1dRn3=O@-60ZO+&WzYF>Q5&SV}3-dC!5=*LYy@(tV3kMnbxmwajUfOzRV^AdyjgXfFCGLQI!=c}h>9`Ogy7k|0^qQ1#~ z#2>t|M%jL49`Oh7go{T$FgU2sF@J51_}dVN{C(QR zj>Q2d3E%eW?eZ z((KzWeok&bKBt((e(=7hnbPdxq}qG1&OzAVq*sITQOycG?2w-3alp2GWxis6m)kG$lKqek-a{^4o*&qb`e!kYOvE35ALV-=Za?|pCHaUyc&9YV z`X<|3e(*WfXXGRP;B5}TBWH=1FKMg}z&jCm-*od9+YkAOKjib((=w0vgXe!AGwco8 zeytxb$VdFa^SzIWd|h7juf+>I;twA8h~8|xz$5NH3q6k{NB7PR;MNkW)-og(Ag%nX15t0QrF`%2EQ4pJ3ib3b18&YOLeoPo1*cX;o&=bSm`%(-{p?osF5 z5eefK$zciKAC;uB@vL)GiF4;K?Ogfb#A{pcU)O9NzYi$|thd6r>2E2H7 z#5FDH?49ZSpvM~LasIUXgUIve=ro*fPiCK&^lI&Xjq5vFYdUwO7ro@$S^DvQ`T+*^ z4taIpeV)bZ`w!j7!Q{W0IP~IQt%)}eydSf8_&@5>?hjb^V<8Ux!Eaf-zP)jO?swu{7H1*-J}TmM^^3Lnd+B#wvbz6by$bq~yW%{e zxts^n^Qyq3mX`5)_68ocbR9fuDfWI-%){1XFSQij&->z0^S%F?S}NY(#k{WnoMI0B zj%d#FU(7G5)TuA5D=z}?nC86uLGr=Bx6AW2aT0jc((k0_cs$4a;`iOaz@wJt z@#rhs`o;bA{RXvwaZz)XRj-mR%k-;)elKV1M_hzlZR~}Q&3=vA$Np|=&f8yNjrTL~ z-(8ZsC9FG#z3_H4-^kjJzJB;G#WO6YSca9?|Bdsiz~hcHcf*y=oNP5m17 z&cyjub6LL@;p=JCk9A)Q@ZYzR3G9{QudCl2 zhU6DX*?x3+i@>AbDC2d{BWeNq9oAgN>&6SU0N(w@yl#F_3*bFk%Zat$8+OWA(FN<4B6-p9o}?o;WvQhlk!J0{tbtezjR5)T$~rkFR> zuNDja^7@1R^DAm8G2{Em#((bjJf2v zecMI6;eL?A?8k@2yp$i6IJJc5C7()G_aC;Rqqi5{O!AiG%OW1SaULb!T%30#W%(P= z-^5#pg}r6@JLHkS@XGSHyTAC4{5_{RFMpHoyY-KCe-@Fy==X4Oyrld^Kk^s-%JO$; zFZm0vEPsdbNB$CjW%)bYU-B3KmFI6a-^gEhW%=99k6Ik|oe;b+6(;0vx9dvkNb~)s?Eb*n5_F+T8l%k z_C*$NZ~dqR=*P2&JpJgW!r9ZVee*s|QvOy3dR4 z{?hI*?f%mG1A888&tvU*Z0ruK9#}oFdSLay>H!{Tf4QdM1M3g0 mKd}BF#en^O;pV?z&}Sqo|34D=`pSD-7q<0J{o1}8zy22;N&`Ru diff --git a/q4base/fonts/fontImage_24.dat b/q4base/fonts/fontImage_24.dat index 607e9afa4c427c7980c5e43ccbeca66784a5a486..eb3d3d28dde813e8d8b600910801d1ab35189e76 100644 GIT binary patch literal 20548 zcmeI4O^9Sy8HR5riH^~j$~fv|Y)K&_1c|0H%tCZxDlrQKLE9j@8JwP&Kf%N@X*7z9 zLPT7Niy$sU3Kx>43l~|4G!i6;3m2}X2ohYn$Rdl7@qOw$-<*5TJ>B>8nQH{83tvvv zq3$#9_j7*kPv_>QX(lp`6SDWoZjs$Ai^uf7rdeI&`;*^(cK`W%p1JbeH=ljt^6c{Y z3!mD5>Pr0K=Dd^#(|Aj9IMyTa=ASd(LhTs(R)P0&G4DeXaJz}v#P9w3e4C8^romtA zP1%_ZdnkT4>8xD*=vUl=zBkn_i}G=!&O#4IJHPbnU%G$OG-uV$t9j(tc+HhUa_M9*hGXYa2}Ovo&raE_=3N9_wOz z{bemWDYNx*Ee87jt@d|nhk5MP+WR&39;dJM!J3OTk^M+E%;Ws_{^|qzPM_^*;H|_t zDSM@em&Oks`Ye9%@ELvV0f+UaJXnnB$YT%4USnsocN^ND5`R0_@=Go-`gMqb#*=Ex z_G_s=Sg~GU&BS_D?ZqN}NAnu_3GbZRG9G%`{yLw2~7jXxk0izNU7V=X*YW%V*CApUvM!%sa%I7WvC{i(R`!9!%>) z-(Jx7c#%GjKWbbbb41wJ*WBT`U`Izcy;q>pGQv6$DA;RK5_!D zY`z-ymz=;W8y}1eehV#LE+Scduv#oDvLnHI^_lo^JT;Ez8^t~lRPm+4FWg@>8HXj{wvEUO#8eI7A{S2upC z7cA(p=w@t z{UvtrE?4u2Uw1vnXV&w&dLb9lU$o)#O|rUrK_AyQF~9hHgRHJzxKV2i#M-d=)cvL3w4w2wj2b-teBYg~(1v|pR;DkV z54t?G!TUxvuUmhxU_KzbBs;#pjEy+o!@|&4$3tJ_p@`#`+P}v+^(oDY_P_fj4kzHCR9)Jx`hDEr3t{U&OKnz8*PzQX*g+Oqv5d$hN%UcIVj zvtJ`_>@Vq8&22O_%@=8lp68(>cb zk9w*1H`WW|g5w^w(|)~V*0(ettR0xe4<7Y$UTvmc3V7Z8GR`=@T&=Im+Y7w!RP(y? z3;OVvyp;JHYt80l*GGRil;59P#~eqY67eu?uvyaRFY`R`Rce2wD`-dY^;@kSMoy(D{l8z1l*<$`xDZc$s8->$xi zIOscD#Umfx_)WzjexIn~_3LFO4)yYxA|87m{NrHH!rlX;-wwvyT)eLq@z_r>KXJhG z@khUn3-qy;f1%IItd}``Frz-k+^+O}x6jLrU*6AQKgEGQ_V$>)Kh#ijvR&EfqWVkq z`FJyZzWjE4Y{$p{a(rn2 zdF^0->U&k|^!=o_$@NTTf8hIh&WFc!QTP7ouJ+B`KP|g|@B4Y@alOU$Ot_xbo@E|v zzrTOU?8j4m@Z$Y;_TnoU`|-^E=M0biPy2etuP^D>A+bD za6R~l+RXju43BHmwm$gegMK^kccN>CvgiBw2ZMwB@^=Azr(cIyTyM?Pa*uM@-?8UE zd~N&d`3-&2Mg5Uq?y(K)<34!%?;)sXYOi~L{DOFy`}diAaGsAb;s=XbG2T)fV)!fB z4xhV!UymwidOFqixE1t)+#~Ytv(XWFV7VB2EQ?J`rE4yIx2Y|wmvla0EE7M=IsU@?WHFETRzvJJ`QI1pncQ=@3U&_c~Kw!!ecK~$76h8 zrf(@0Jgki8&v%5_#Lw4DyQd0oEn|M>neA{shItcl;PFn)7`$2FJy^s`=L7fG<^%lQ z4ZO1b!O^?}@rd8QWIV$h_7^=E2lY%meGSn^G2oq6dt(tVt>?3XU{){aBOh<5E!$6` z$IgxQf?lf^c;tiitt=mDz4-UYBOko4@>r3-e!e7Ki(jix4E#MMtE)d}nLhG?zwpZZ zP3y&ZR)6sD7hYNY`T6dz&j+S&Dh~C6#uKvP`b&ANy_oUlf%m0qURU2<;4O-Iem=f1 zKKwha)--V@GW_N9u)pc}V60(Q<1k=dkXgu`6 z+Y<-g{z$yJIK&Tqb>qYJS^VG;KX_&FJ31fui$45)KsH=2T&sm^`%V4%+-!aD(D%IT z>qR{B7_OZ+Jp9EhzxuE_c%J<8{(ka&|NTVH^K;wRgP~7z0SEUF#^5aj@3$lISU)&e zKg#r_`SpBQy)>H~Xhl`aGxQ|CnfRqV<`rURylLR^{!1AzonPRxJvh56i5E$S--|-p12? ze>2xx)J41gh+Dgc#1o5JVICazw|y@8U>rLcGNoJo$*f7iHAV_3DEG@7Kk= zwEo=RP=DgAWa#^&?D+beZ{xQSV;y+Z;qiIs!y<1Y&Zots4v)|Cd`I3)9AZe_4D;MS zeoMXh_ZUCwj`(H%z9KXKrQ^frXRGl|EsMqc{G!@KUuJx`9)62HAJ3+5DaK0n8(Cd` zooDfbw+_6z{Pua|7kzd4?eoYlyt@24FUF7j!Yj+~(fK$)m+UneYi5$)OuhL1FMdmY zeZOJP2==6noUs4!UJ|ADM&%ax}kW+Z%1f9eF`uTYt zIfX|~#^4b@c#C3QnqSvz@jDP}C0onN##_qsxi9iyVQiNz-FH_Gtb#DL95B~e`GgqE^LKhY4J;w1Ljq7T+ literal 20548 zcmeI3JBVCW7{{*~UwP=}X%LGkMF*XPs6l*8AsA(SccNsrh%pj3AqfapQ(B3LNDzy~ zLM%iqL{d&^xn&TG#ll*wh4ufN?|ge7bC-MO?5*S+I61pFGr#?R=X;#*-q}4~6vbgp z#vPgugn66`J7e;EQT(7;6dzn!zj6J^*Ve9GTEB39bpG_2CvIF^+j(74?9eH(%IYc%g3y>~^E;qijKTsMECYbIg2Vo=TK3do&6eT zBa;D-bK^cuzoswYDgH*RojlH-YJb3a#+L*R~v%vdHYux^|@s92A3Z3KFdrWH_kG*$a;$M90 zJ~4lc#ls)(p|#V$O?~j{@iN~-@ox6SoA04`x1)GfE!c}*`YWy%#US)Uk87QY*=?`i zU-4Ra_<~sBy7BPGY4OfR>0|G$_ck87N`H)kzGt-JlWu)?hWGPY^f`;`>c<1`WvyRC z@#vGoz2BVY`uv*yTdXbJYwgq8t*VOxN7G)fuVyd$@GtrfV*AqdU{T*7@P<9{@G<&U zd*b0^c$a(N;aeu>M<4#hxA6Xq<~8pJJ%9ZkQF$Rd$=_$A>?Ifcz18!>>K_q;Kj6I{ z&GYxdBi{~bhHGMA?;)+RnZz*JrLQ(C+Cuc;4q*}uTUzu#-^Bj4an#3Mh_^38ic zt5-8|nB+%V{UcsVd+`OlqgvB=^?Hgg;GIh55ij)9W-q>g_hvG$ZZE!ocRiU$+?D$W zi#?>@jf>}I{MGXV9(zcx4Ye*G&+HxfT*eD~2roUJ>-MsT*qav5=qvrp-ZANk()RC! z0QlJK9R%K)WM19B-omsVe?_lp=NiyRQ7&ePu*UwYltz{q#lrS z-MnTz6D!nI^9Q_%<`K=bc!7t_rGE!vQD5ThZR#U8$T{O-E4(+7d4B#H4_o0~OXlH+ zy1i(`-c`-z{Xu>(%l$*+)0%1iKwIfwv@ze-Ow)(GWlW+C-qk(v>i&g^f79%xpRC`% z!Q=j|4<0P$r9J7R_cQ;pZ}2{e<~5&RofM0hw$FP8;%unaQ%`@?+8uw~hyT01z0GUs z*U&}3Yxn2Wl&SXaeXVi#=cR4s^8@ekEmo$|bxypvez$qQ;Qfa6)N_5}v4>wp+1tj0 zX}qyG>>u&>OAkDB!Ml>o^L#UX5;`CFWT4sb@2SPl&ztu8{X^i*ZM0`YX*|C-G9JEV zaBq~xtJ^yZyscy&^$%vSSAJluXid|Hz2u1T$T!BYCm!*~pf;!J!@s4y#2?4tVid*uKoT-L_9bAE8JKdH1Zk$^7*mIn+9G>eTmRV zZ7J&uiZ;Z%Dt#^WrG>}-`(9C>T_4wN%!0n(lk8p8S14A{w|^cx%lZQzG3c5t*NB&g zlX#7KB{De&@3ABvxl#AWNF3~KdEV6G5A1T={P|FsZ~D)9KScb!nxv2Zndv{n`udyV zy_>|t*1A4w0{T8m;^B|_{!v@lzfY5Rjd%&Md{*nGnBDnHuS`xbyno^I6t0_{3m-1^D^g0J}>im zna@j)fm{!AJ@8n_{Xy;zay`iPAlHN3A9xJpdXVdZ$3pH8a(}Q)Jy6_??RSRx_mz*= OE?&?dC3rN&t^WZN5}J+x diff --git a/q4base/fonts/fontImage_48.dat b/q4base/fonts/fontImage_48.dat index 2296dc8bea00555276cbcc94aec5b48530db20fb..3fd55d24f4e917ac62633922c2a33bee5e7f8207 100644 GIT binary patch literal 20548 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 literal 20548 zcmeI4&x;&I6vxXDHR2khu5nDN^+sVzsJ1#tVI7!J9{8r@ze8Ea&fG z@%ntRT2&w8Uf;0Lch02mAzfAFJ)`$KWQ=Rha)xv3>c_7#(iPv0=g*yjp@^$rGx6s1 z>FWHEFY_|Sy*}c5Tl&^b@#VS)@@wn!=XvOZhdvvxEuYco^O^Z09)HP3vhMkNRG+Ep zBOXu679yn|RDUMkD_olcCLzp^y1{QT+~+zq4K+iRWu{ zY<*7im*&scKHGkt^5y={7nSx&qu#R@g|@01U$yT2jlB`0!FxisUFOG*6#K_X^_gk^ zVEbvJ}mp=0>A5<%OFd6raJso{-nRv~3>=)#Ktc;P)E#eT1k4(G}ORw*7v4{oZAy+;V z?{nGa{pD2mIu80S(cgh&|=QVgQi}!^|UwMDU z)$oW1Imoy_?~cXUD&8Fv58wQ~L0de?74)4}Z;J=#d+%G|@t$#?EA%(Svz_nJ)~3&o zk$dR7rv4L?zs>bQu28dld|@$vU&;P9@tW&{wYDVlG0&t6-fQYP<9FwClb7il>O zQNf#qzhnq)o91ymy}uoue*UuY{H^9W?A$MAUh{sCT0p(`_k;LKj9I_jqj%@??#Z>G zzQAL=s4rr{+b!$nvF`n~p4ZoV#(X_MUnaXHd&R^HzIh&dB{|KwTF%gj`V~_=y7djk zLSNi|K9DH(4qsnj(ax#2<;x5DH0zbdesriX#*3!7F3Uchj;|sA%JY@i2a$Z?{L)fS z4ZQk#%N5F3)<-Y*z4rXdz}qJTXSJY@eBr#-QeO-_@&#t#5tE*HE%n8~tJhP3^LmQE zE%n8~%S7Nj?e*pLK&+o-BUxj;8F=IgF)92d2IA~hKMP)-&*EK*=CSuuAH2R19NEXR zmicRWp3QZIZ~6Mj^git8%pdlH>|5F9=a0Dy`2uS!`&|~dJ~Htd@s+Q{x2Jyd`d-pC z;eG*qnK*x_UykC{^93F;{!RVaC?3xz>hni@nZK6!8uFQ15Y8`7EHo~ux5am$>#O-v z>SJ6@9OAoA{lDrr9}n^+)GOu=eebEa>1*aQypS*G%VdkPxcK(P8_0?|5C@F|SzLU} z{WtJNVzK|m#W$0-5MQ(rk9XC_tvA*O=JmmIva7Nluj{|381fHo)cnB9#JMPoi$^9_ z-Cs1~Z(Ka!4P-&zNUZZRTRb=qRiAHgp5z&kKd+I?%-@&lcd2j8UrT*%@}}UU+_hKIV^mY1?^?b0hOl+afzGBd3e=q+Zc7@mkK4$EMHsTlMLG?%uu2Rq%)d zni=f?Cm3p`>=dpnw!>FR;3(5F{UzTT0qE4lBr^Qpn#@_A9hrYP= z0jrWP;*7+*sy;4X>h+5GBgWsWk6Ry^^z~&S9_afqS|6;zgy+OUBj?k&d@1kWygqz| zcR8AezO1H?T*<_<-zcBkbm$h`633|cvff2KhDam2^#Bz z+RX1MjH`(=l*ik=93AAKW|9QawoZAk~9Z4}3L9^`LwnOI-|&-+R*iW!vAcru`%BA8G$c`$t(T zQ$0xaAk~9Z4^lnwzh9>FB$<%T&-eQOzoh*#?U!kNr2R7OmubH&b0F1&R1eBrNaut9 d*ZDyIUiFm!n*{#*`n3yJF6oa>%4pg8{{Vc}`2+v} diff --git a/q4base/fonts/lowpixel/lowpixel_0_12.tga b/q4base/fonts/lowpixel/lowpixel_0_12.tga new file mode 100644 index 0000000000000000000000000000000000000000..58115f552a7e44fa85c4b808beeed1e824f3f8bc GIT binary patch literal 262694 zcmeI53EXW{{r?TuJR~7Ru2QHZ4gb(Ud5oEdW)+cUN|O*3(co7qsVG;O`svp|17&EA zA`&9Qy+V;P6uQRyf4}!x>)6kE&OU4HbDr}I_wMiO^?BCXYkjBn-D|DA)*jBY&_atW zRM6!MUB1x53oSgeIB5Pf5ojXNM4*X46M-fIO$3?o_$PQ2%mr72JweiGcq%C=JRdNW8$Ta3 zr&bea`$FaRm-2UzKMpKeOW`Ci`)Yk%->@L%u=p#39q?Zf*r z@F$@E;&Nb{vQ)tLHQ?BPBiIVO0-OvU0qdlcz;gwV_5mYhq-5uZdfK~e#Qe~nI&Glc zar~cJI`3POKO9J(siSW)c=7S~;9{^n*cx04?w%-Lu;tjl2y6?E2adZs?k6X3fQXxDQYu`+q-ttln&{6FBlc>!1iL>(#7rhb}7Ae?KGc}JAbd&vKUboNwl zB0k;^W`Vem+l>6kMEQ*^$?Lx3=5ZcCb;iHzhGRe+cjoW)IEUbS7)1L~hvQf}ETsb; zWj-r2^llJ!q(qB)_@~#)_0diq_qk8t$c`D4v^T;}PO55~*$r$yQQFUTKB8vQWu^|+VWc3qG!+mCvzO8TK4 zund?DoQu{4g^sq79vOJ2+WHHZ((Ufiqy?smIN9f=Ss-3NWB;*F_3VUHZwMX&JID%l z0`6g-JyAi#me+rMT{7V7q<7}phc~vD>|^s_4f#=W9ze-)7xlwC7YuU!FYNIrwj-uR zd9+iNmgL+!N$zE4fGUwun1agDKdxuf{f5lpX&bs^|ME;$)wfjt1sMjN?({AL$i@z`HQ% zi9k9Y6!N{~#Hy)gk>nX_gD{ z-44Die+f?{FYT970#8})2^{|exQ5#>C2Ku=1FgSuZ1m#6zSQ^lN7nQ1zE5o2%hvo> zM|(YgQaOIHKb%JS&Ar-8y}WCKzk@m87O)oRB{r^g*jg0K)Mmg_Nwe=iz}uB_okUo> zqxz6#xfJ9#Cw&EY3vlced+;0`@cQikPVgqM6;RJ9z;(e>Qaa!n>A;sbmj0NMwI05K z)?Ya`dhryVj_$t}WnceG@{WQ06W7bBX;No%L;Fu9js3uV;QN66@Yr5Wp?(!`9r!MA z?Qk}@2CUReZanL>1zbaa8~hmj7A%u%1Kzmq@%iDi;&Bc67(@F{(T7NL#g!G?fnNd1 zc)E|7k)s5@)xep+>-HnSz1SbYD?w5PJe8Cbh5_M$)?Ya`dhrD3jeCrxMRmsivhXhv zuxu||^IIKlHfEhuHne$?>h!I+$d-w&_rO;Bhc^oM{Z{)4Cr7G=a86wps3+KP^y7}Z%mSso9y~7 zZMF^N`#6*BVq?FFKr#ZQeq8k5q(ESRd1-JzxEeSYlwsL@V5yWoc%<_E`w@;uQgV}B zkB@P#i>d8s#{XoWm<7zfoes)=UeFmHWVZ$0bC$C8z-zz%opwulQer zuGwHW@M>@~NO#0+=jDC%;2g!lJBZhO+L!KEPk`+s;H z?>B&51I%Z=`=)>JI`%IDt^GE`!*v#k|Qe*y!PMD@9+LwLmu(=_xF$U0Lto5@M&L~&f{PIj|9az z3;BA3FgMs8e8DD35x>1je_~l3QW(lQUv>1Rc(EDdbwJ_4ym@aXePbzK)Mw~XulhfD$7Oqx>5G`XF<5L|2~>!9Ht;&j9>EY;~e=izxj!z zU^||JLDpY$(RFM|-xtVFNMnLc&6VR{D~v%$Et&CPj&@1c2GaMzcYynWl|gZCQnuie zMzx>gl-Q)#>mzWS&jxn^ubsa4DrN8E;Pv`%`{Vrgb@Fw-|L=DFzdtuX*pkZeFOGBM zVQkMA<|mSZZS4=b{<<6;e+BNJUI(1RC!{f&(H2yWf2}aK#3%LoZySuE{n)+Cg}|}` zsm8!3P1omtaqV+3ZLqzL;akAn;0dX=TMwV_%^SadzyJRuvNwXb|2JP}{}219{#P7l z`mX;4KYwyW#*IgN0fVl;Hbam1|NY+3`~P0UCZsW#dAYWra{phnPLNvSlRo|r4}O@u z3&eAiY)VOPR5mF%$qYE__5PpWUtl>9+q@rnspq$c(S7(f0v7@AnYtGBeqf#N|2Ko* z`Qt&Lj?2JHqyAJ1uT;MN6vrt!>tPg9A)g~NUOd>;_IRwnVmo4LTPAA!d%ioV)^An^ z;mO?p8#nJ=tr=iG#xi-j;q`v`3MHAxo1f}b^4GT7hM65@SxpEs%D)(x7O~3`hAHrm ziGK}w=dl?M9zVf35;#b_Rb29|ul`j(=_L0p8uAHhG9l+h6kTdlw5Z->yq3 z3cQY)6M%aMuR$rXNw3$(4mbxK4~#=mm*ZsQCAHnQ|2dZBlDuF{{AOJ?+hMnx*gDof0Imn4?iq)=VlEiA9}BvEV(t99=5&lh=qH1Y|2xp*ef#pY zXDyDU?C)?VD}MO+GT?f}_kV=XQa7J0e{${Oqw!uG_|Dx&!g2W=^c?^2&j7aDd3r+- zWqpovc`VQMXFBqg+8o!=&;dGvK%F9CZ9Yf)2lXZ^w+h??p%- z9dZ-2xe2%oICkyJw}I?=2VTef4Pe&*^L5_;-5>scgZ~2Ka4$&q2Y6z<$hP`iomiFR zoximGlu}vLU8yqgZb>Tr2t*m*Uyx1&mGbjLh3)GAhqcH5vdAnk9pe$&KIr%#6SJVV zC?9rQFyi~Z{%%0O-~T&yjsdYRn6LBwuVeorQ0x2ul0C8mjeq?<4fx)d_XJ`)inJ>J zCBC!BOU@&%C!GJB!&U=T;`2qh?E|jgBgl^WmVCZwXH_F;tL>lex0K-o=TnQ~o~(lQTu*F4e# z;1=Nf)P>$E`B)C0doS-7xc+(zkoJ!C!%nevH~21C8@LC$795ac7e3qQy;E@I_JKji|6S<#O3)Si;;I}=`wu%f*l^Bw{KWJ4b@Fw-|DTlafAKNKitNDa ze|60OSAe({DfCyxAHHbcbZ-#pS7h4zh${J54zKfP+2)xX?-A>VonmVfuo-wEa1ZuZ z@V*?o@Y(he;C+yPfk^KqV|k96Y0G2#z@X#*2k5v5yaQ|lb^^}F(gwp04mN%Ry#DL} zv^^VKm}?i_&4BW*fgb>ufuVo@i;Xz`$d1eSSKo_)ZCDQ!`m5p)>q%WN+zS2D1 zvn2mf^3vOZ>$dyAHDEDNCEhNF$Msjd{%i9f@RByekTckFzWY3I9&-)2GFUptEPTdn z4Pc+W1Gw)07?55Ba@0&)9@@7tSTkVbei~wo0=(utv2yV4saLS-*D_6_@0qd`wrN?k?~ud8#PLd+r^- zH-g1OnPXXUKBy9Jm&4kR zWAZ(Z=VzjQlGiTLS7Q|m@cxf$$gcwXc2Pd;_ys#pC;ch-6L_*^xdgAjfpZbK9=sU5 zAFNeF-gY|o%>kbS#l5qXJbcdre*vEa=YtbdGUa;sW8Ax?j@`e3%KPv^{uEN_^&sl; z_hXztydFNTY_nS)o=t&qe+c;8@GP)gH{M~CVaxS~^LC_5$gG@W3%;iU{k{n-31SSs zNZz&VdO3QgD^F;%>pW5Gcavh9k&7`ieG+i}RIEL%8#ZYJJOLaD+UGFWZjjgCMMA!4 zPfdAcy#5~_^`zv3EoDvzj=zOdGEIFGfhGb?1eypm5ojXNM4*X46M-fIO$3?{v{wC2zD;vA`79_Qbt>BqyGQF2xZytzo+yMyB=SE0cL|YfUSVf5sm}WR>QX6 z=x-u084;jwJN~z`lULBilqX#avOd2nuOE_fQ-uM)eRktBu(JP)b1WS)Rs5W)ezd}r z{@$q5f8@&X-Z$tm`DnSWQ?Bzk$bFOaYT&appJ`6m`#+ujOqXL~Wc+PPTO zH-T4!-GMqT?Pa^EYyaOFWBh#}`7V~naZj*;$0>qGngup4BPBOg>UAC(vwmq6r^gX| z_S*}=HeeTUE65su#sFT&yYug^0p{!c{)c1V{o1y`=l@ccefYF5^*#RkJ&)Mbws5Uw z4DE+s1=15iQJ>OZaL=3fsmM?IX^{Q<2`T;aYketR`;eDhgLzMI4wxPC$>zh?m6C!} zgdsRT$oO~tbPn)6v@O7FkTw1c0lZ$fj{!x05Bco=3%}%bU-`#*0A<;SPZ?=4$N$S) zE)?(k?iTWIBrW2R>L!8Tcdugn%%?A0DaD!f!TzZJlPOxTA-@)I-u4}CuerYe=sSg3 z-w@TYRpv#1jMwVqrSE|Ci(Kjdsh4HCb$s2#_4*Z?{x9;zMl>JxbbQ=Gk2{BlQ)V}`+_!cPoXGZ*Cop)^H5Ba$%x$&yk zI8=^*E!D_A1Nv+19>{2ACl!# z<#m9%vg~0pL;nQEeld{M7Wkx7!AKe1{GEzrIuDIHe;g;{7uy2w?ZE!G6ZjC2-W=;w zDZGCKH-fnTH=o^q;g!n%7sn~P*2CCtr}>GbV0)&{Lau+KKZh43ng2&M@Ot0X`~SYX zaV^OH{e(f=j4i1g|5_@MwcS3q@VIwWYZl?MnnU`|M|MObx#oyEU+t!(K zq9iveo06L<^}*>;=P$J1s>=99|KZsaI0s0s-F^VFzdwU_GjKWZ{{I8O>p*t@g;y&3 zUmQpOdZjS7`-%CwgiQOMZy&PSejAW{_ayeYO^T9v^NzACMS-{6{z6YmZoKM)efKch zbq#V}9o<3heA2&zR|3bMYoeqYc{Iec z3tw^GN@+jiUmdQ$BI!$={lD@n1Lv&Mz*?ZIzf-YLUjs!)^qO8FdQeg5=z;Iq?0 zUrH|4!|%BD`JH1ym|rH=r&4&ecObYK>=2GqVnsc?+kjia$H1alLM0|-^u0i-I4g^s z_ljLF{Sw4;5Yul{CasZD)?%CV@qY$>xNn;aK9cgeTo1qT+ZT8pi0yv``Blq&-SQ>= zDA(`!SAGfLIT3aC|Izj`$l3pkYfv|Tr(zlYM*m~GV_KA_d=Bz2BfSUobN$!O4Dh}H z^C`3KdU=84ccYNc@>>Oge|^%=nQv%%MWB4XLq2=_Pp_6X-Zl|vBG4IuFy5MHv9jQ&tzNo zZ~F;4vfeBH7uXAI1$F{I2F?ZR_oK6sX(BKkB0&H4d0~8SXh9wScMt=gU&cAmbS)rd z{~zw@aK7h9A2~VJs(n_Z8{XhJRann`TEve>qtw+u^Q2hQa>RgmEDf>PAuF5kCvGG9=`|fwi-wU$u zyTa?UL-#Ab|0k{hn`f9Fm<2n=OX@rRgF1ojUx3-*4Z!u=_TV@mP5Iwn!pGR>Vp^=h zbK`>iCv7P79^klbBc%i07l4a_?@@H4?0%TCHQx0&8{?(lefPi6=t91vv)!-9+wV?& z*mUe)2(|&v!?%F!xWnsszX9wTU_R^pfB1Z7BgSz|+UaZOagZhHKmMIM>mFm<`!$Y% zvj2;7EKT{}U&6<--{$R$*%vcdy>BNS4o2y!8_Vg$UuvsupU&gox%V8fDcAzc26e{2 zd$?mjJoo0azW;~McZLoFHv-AE&^2H?kn9ff0IBczCygW+TIO5!$;TM9{Yr?-=laVv zmvkoZ8;b1sr}U@lu{8p&2gd#{z%^hx_(3tO8_N&P0_H^#hm`HmflHdOVf7yTYS>OM|w;Z?!+z)mGu0j3`ZUM=r%LAmo zY~1(e7C zsv)NPXR7I&4Lc*iIoq}P3?OCScYwFs^*`(Te`Ia5^Pm6w*cdqPc|TZ6wn?6Xv(NF5 ztZm)^^nIVMY@dAj99oqe$M6ia{z?WZ!GL}5+4%iO^u36GLabelTwMPj9r7L*y4pXSn zBPrQ*c?!-xu?mK=eey-W52;l-6U-_pSk zmShb&iZKw5pFp}!ZD*#DKxpTvw)f*cdhCPF0bT>W7S07%1K$VeM`bM;Z0re~10=6S z`Z6Kk|6|Aa*XJcw~yp&!Rf^6GI6 zyfmbR-hOn}kqP!)|F0QfK3heQcOSoD$Y=W<_t8*IR|5LB_vx?>~TT{}7O}*I#wp+{urv%fMg3F5q>bxE6HsRUO0cIk*&f4^bV$ z>(_NvGUamkq%rX;^GwA&KCc11SLLW~&0^dOEug*5rJ;uJ*o9n#Ik-=){+Ufyl1mmfcb14L0*5C0!IOV4S<{DMS$}rO}p_w{UY6X+(cmNMW8kOi~C;QL-0QEz0L=vHGa(B5ulGs<^6wgoN6^pj`uIg z3>^sk?aBz(6VhrKdgMD5jFgd*n=1AA?7i>V;0?fM2-E8Ov#Aot$?$`76|Y&VlV5u> ze3)#Tv|H+T{BPG1@A~&*N|VhCl4bkFIY|mm5eEF93qEOEOIVz|l>Gh-o(}@=xkzUM zpTlMEzZ8PX@hgs}NO*?s291qzHwIEXPTGdob*tB~Tfj?_0z+WHu2epM6Wae<=118t z{7E$xCjInTmG7+G0A>d4M=Bi*Qfky8OIr8QyzhgbTn*iToQT9>besIEmHw9b9Q1mnYmHP;Ik~$`Xuq*Z5 z|B;RDpHs?bH$~%6*?w`HQUFu5`+WtVHGySuPvCbQDK+v-v%tn>Bn77kgU&fDr_jDfr-=Q7Xf=9sh;N`jTf%nhgH{f>g79d@pE8j04He%dYFD%ZRXB*ZJ z`D0^!N`K%#n$*2S8!5S|QXl*uWc-hyh%jM#KcfOju`#+x@U6Jb)yzaX` z0p$L~(rjrH(%yZ&eWetnUIg=K}8sKDUNE>|?2hd~AR1@sHIw_l!z&ZI1_EX!)l|V>`^(x&Pw+ z-}SfGkhuQ4D#thYwYe!MzIn@$i9A6z`uzCPvHjPzU{M$OtJ269(sf8{`%F8tpG`mvm{ z(}naE>;|p_-iI-su8E61P^um9tpsL+p9AAy3>Qhs#d>(32<$)Sf~SEaK&(!t@`5$M z+2Cq06C~v#gSAli@Z8s3(f$mgXmLIW#CVSc`b+BC z-S_w21{MWb?Ff8}kQ&46xW(p=ll;=?ao#b_^1H+SlE^vV3G=bKNt*~X5ojXNM4*X4 z6M-fIO$3?KOf3X`qtfPt2u5W&_rPT zBEZ-j#`s?ay*@{I7)Z_dAHP%9Xlf!bZV_N?4rBcL3{N_#_}h&CaXVkbP{cX%eS_=6 zxiXmxE(O`|APvK>M(6M&z&Rf8@$Y*)_W-Z`KF^bedi_WL2f@7>f_#4X02r#x;h&j_ zvp}pI>&DM_P@KC@0LJh)6X!)^X)+?fIUeuve=s_w6T!f`b7F#>fqwrZ$Hp*uLY#b$ z<}ILjciFOuB5e82%(2=m;mhQ+-=Uo-UmH8)8-Z}XN&3HDDh&DF*)re`V1JqkCTjfq z&CfZ&_prABv%$2v{^P50S{!^F>>iHC_eA&5hP}hV%cI?pev&l#4Kh5wclO>OV>^V$ z>-8`>u2tB28Sve|2LrAk-F#e)^iYN^=WM^^x&RaRr(5~zQ;>TycqxchrH{^ z*cUA7TX#;h(0>Tv|}Cl$>hc9@f!c1M%OLCIrzyz@4&iqVuLNm&+~!rKFDU2etXdVjv}Q1Uj22?^;h8B zdow8Z5-Hj7s>hymB#8aaeD?1z4eCd*`zBK9B9Q&t6NB0wR32ZAnKbD5SH}aO*#D5m zb76Vkx^vox{yl+nfaJY^AAsz00Pp_5HGt&UxzJ1pCHKNPzINjYc8(y8F)Pw;yj5k$ zz7G5`=<-^AB6wOAf4Lk!ulHWJ%l2JA{HV;=Egxi@d**i`*K}Ju;cY=X0T^|E%Uhq z?{mP@f%^yh?$O|3uoUom_+F6xdtAA8BOki&2l4u^{|A9uzoifVN5GCi`a1CVdC^9% z6u#@h)!>!D{mu@+`E+(KIqTqwIE?(GK)XXf=ViaJ=e&0#i2Hx@6S@EQn&Iz;>;|NR z%l=K}JifjV+yoBn*H2_U-;0CuL7Cpe!O;5xHk`xk180DXz-K{rbKrIF;Qc@Ez3&39 z0+Rl33oZn|%vM;F5#7H7mjn0z?*h_3b=1Hg$Dy+AwM32%__qOnRWOk2fos7wDS3FJ z-L=R&XPOTEoR|H=-e$n~x$bcddKt+6{iU+5e)8CIzIG2OxtChEA3c*HgRh<|@7ZSG zFYEL(=!pHmYpB;uVSea+A=uEC`@UDzwF&=gf&11+fY-1;0N1i!m+jNe2b*@bd%TX- z4gLficlUy`K=%G+y!>eNG!bYb&_tk#Kofx`0!;*(2s9CBBG5!&evbfqtx6hZ+cE0B zUhliy1{MWz4{f?PkoFy>4^u%mZCn>z0OCCq_uTHs4+9HN1s@w9#yT3x;Pm~Us>i$o6|5{;w?3p3Qo(G>H4z=^3 z-u16E)c3`R^T^Elo4s+4Awt6m#WcC0eg)@H%Jek=oKgZ~2eqeWk=t*nMX zv_blPAgu|s8}|eoc$^}5P6yKY-~{k>a4nE_OUX}meap=;{V%(31o>H{8wYGex;)5g z8hn!d-FJOP!0q6|EMb`7^}fZ0U>mRtxD{mgX?O>c&-Js45BpN*`1gAFP?gMhl%qfU z9FK>+DjmTOec2jF?!9M#Dv@z1SAW1hq|&~?HPIX}JLHqL;QI&o9*Fu(R|nEZk_sl7 zq2=b7{%0Gczk zn_^#@1>*eaIPm`K#r^8ckwbs>IqszoJyQAn7010~%5^a7N5nT2hCU3+Y?XQVV%%c7 zW+ii}Lj3`8tbT{%^?`IODC$chU9<4HW<5Ichtzq*IpK9(g{Dv;K1${D7voZtr(7+h zTkUr*B~}JM2REc-t%px4+dqoq?C;0mJp{OJlz!AoYK{Ma zza9Ht{-x@IbQJwiW_BYcf0I#PHf(=u)t%t9ZvTP$%wtET3{{{yIWnM>$`jiiW zzuf+^-jw*H*Z1(>s$?uHCV-|TgfKasNAa{~kK2zWkN0?YtX_WRWE4kVxJXBA)J z?PK%jQXH=e?2lRh1Gh?VsvP}s>?F@|FJ0)7%Kg7M?j=*MgW33(5%=F&-w+{tCvfi= zuRn{G^;hNLFOSp1IF|ki?gop2X8iX*{y#(fvVH>sKFR*`bnr%S4>+#symgkt>-_?+ z89RXw0jbXK4-6#V=}+C`mb;_IkNxgbAZz}tYcKMne>}&(-+sjLL^gfhDET3OSBgBn zQUtwL&jROxQ@~2S_+uS>(O=W&fk>y5Y1c*msubRb!6(WxAwQG!@l|qDr5qn6$6ve6 zAzzfI{FDir1>Apa0-TGl16li5_$2K+XGs4C7EjrY_3-Wq9K(`(`5%Dn?|0xGNIv?} zZ;E}XGyca=HWA~$IOqNPu3X`L>o?oXFB*9;OfIH%{7I zXAnEcOE-f(!23Ob-kqxxUj2AHm<8PTe*_fk?;IWQI_Dn>UJs-#S8sI|UwZE`mQ{Mh|0XP@9|IQU3m=9Z>^e6?!B>DS) zgBVA@ag)Yl|9=L0^x3)pVz5fCZ}95Jhk@_@xCeACy*tQK0pB6OdjQ(L8f1O{51)2B zu`^|FEtjX9fOmQD72w!;7)V~z&H_uN>#l6uC3$6>0}cn?N6ajTq zo;y;u= z$TR3UK;G;Ai9wI&b93-lAh`~x^xnDvlK#e^f>7V%w>NOPJWWK_}j`OC4>@Ki@&&~xC)gW~uv_km{oSBHJRscD`5=K0@rJ)xYx zcn!?{=C#~bP8t{L(b+@p(wtnzD*u4#@YDgwkle)In7erzJ|^FQzN9|-(*e7lhM z+20pIrCRFz&5IEr^)&{OQ+}OFBZ&$PLw(s!s9qqdiJjwDa=(|{^Ob`F|2p8u;Ctor zCO>fzAoh;a?}NU+^+s+5@HKD?csRgkf|eD(!%)>4>emC2`Wk~lxG!1#8dScjZ3{{{ z@iT_r_xJmAVLq$*@U0DeS7gyFfrhDxKofx`0!;*(2s9CBBG5#ji9i#9z9PVy+uxh? zJx%v&?cbdu?|Oc3AT0?0KYR_^c{aEU_`GT^xDxCM`igBMwBSU5KH|OaC)-!*_80hP z0NS@NuB=i~P62 zzrbE#E8y?&dr#8yv3{xz@C;->r9V}V{dK_w;6FgJ|M+{hhk=Dt@=g6<5g^8r*NkU@ zTFT(x6-fT(=qJI^;CvwM*-IJq1C8Gx@3WdJ(x+Z7Oo=*t9CZBNfsW&CYYA(Sm)@Cb zBs_iFM|N3Iw%aw|%Ln9t0cL|Y0Ozmm!Erzu>i^*C<=28zM~qh~BHjAdxmL50J2=R$ zM;g!lQladyUdjT0-{UvPFG=ce*4_YS2JA;F>02)srbHb+4my4xL5J_E#rT`LACi*) zhYOy*?IUZ9KMpPhUbiLv`8zlP6!Sx`K*Qs;$7@H~|HV0$vVKdxm;O{;%S_kze^a94 zQs2eCMcK~-JLKOIj^B~%9Q?*z^4WK;SiuLs=XX^Q_uos9e+`fh?WK%*?e;x>gSU?(R8u=37UPRdlvSX=A*C6Fs8Fc*WXmRdHqyMH-vLC_Iw|!*2 zcKGeQfu7-^Uh3Qbp2{;STjsmk&yXIRrHlO{9=V!J@*9zNEL#KWIU~xF6v`n?RWe}`F%79?F$^obHMD7uXKTW<w)OY`HiBFC^wvA!D?*E#+YrlA2+>`v-<6cC))OY)P>CUNZ zneS>pM|@zOF7}Ifum`vmyt0=r z>SI6IhrHC!_*KX1h4j36-yvN;bDI1-I6hVvP#z=<-zb6Td_Q)8$Q=C zM}inn(?x)k{QqYywyyo(s-Eiy>a``ghj;Gx9K^MtK6y{CXA`KG`fh(uD)s|$eyqEI;_&hMKmbtg+=>qlAm{_-p^T$C?BRwjEozCPT z3f|m9Y}~4X;bNae-nmoC{+6-DUR-ytBL6#3%)hw~!tXhB9NP~L&y|x8{tp4kwX?@- z0{4D*gZK8*MZNqH{f^%#e;B%?e*$eU28y~WA7VY}JAmXKChGHe7O-6rNhNICik z9l!q1y?cP|a6RT+{9Pbzkn#(6=)YF9)OItq1zpb~Y@HkWk z`$v<;x&Mjee+h0J2lYu6!T!ypuAAQOmF-67 zRp}a}97BVS-V|eqi4@D&#%h6+8$o15!^PS}c=3{^R_m z|HAeR_5XjzpoI3HLF)e9_0q+l&j0U(y&b=Ak@s9?zxM*K?UjlcM89%UWOghhTkroI zM}9Z35-8%>OGo4h=^*1bp0j1p_4E$Cl`eGfxn`AK24XzQ*95N(i&rWepaQ)!fpb8= z<2SZHrcXncu_%sHuEE#0{b1u3(r-q4A$=vOec8FFrwi0eo#Rj6rR;rhPa{1lTV}@C zKZf$TJ;cVXs=|J@{&A3R#~NMPc4dVBBfU`Go{{WZxqnxRGm#38LsvIiw zg#0t1G8X9>btMC#0Qe!Ip}aK*J=;^`vzIBU#|e3`_n_&Q+g?br}Mn; zPMPc0!jD*Ar6bmt(yx=h4?Me6RwdqP+hgYs<+lb>>=X8j0+q@Js6e;2Ukq*pCjsw; zoC%6CkWvkw@~)q}?{O}0{2T?`*QCVDae%$(NA^XjsOzO5@GMK}`pGfl-d}R;UjPmQ zJ%5*n`sl+;$^R7m0X#mI_p(18b=c{oxfEOqUN|25Q#yk2$sGT>;JJG$NVz+z9{#1l zY2Xgp+@oqXZAxaO7X+5#P!GEc}mfAype72|S< z!5D`X$sY@LDwQQ|lz8L4i>R+iQwmD*?r|0iFrSo8M1XPUGpORZ!$h_ho9%m)&7T*N5 z-s5d6Tfj2JDV{@9pFjEh-}k@E<>uSZ#K$v4B|AQQ{4aP?scakaqi8&BM_m|*ZS@@_ z`|+4(u#^p@{rZ6J&B3+cVc>QAFJPPKUn+(70dOQpv39LT?%UvBU@x#0@cHYHf#a$2 z_tU70aeFCwX^pN15{1aAM=IU{NU)EoM(%cSJ+KcQ3Z&h~Fg68aB0!wtIW+Zso1cNt zh4SZ<+8@0hJOZTmk5Mu}0s5kSZJ!HHES1@>W`mK40ZdhjqC5IvdN8;Q=#TI9I3|bI zew{-9AHj9tEx>PA=74J|9qy=rSL$o*1p9X&?|YNwIIP97RQda9)J1;h9@h&Up5+|| zJtY0L0lC)$`-=X|08-E2-pTW9>T}V~HNYoXYG5es*Hv`; z?r=PZ9)AjCe|rP3q<=MA-eO12x&0H$m*9J3QswWbQ5X4rU-KA``=OwRq`x*G=epJP z|3ly;APxPyiGJET-ZHe)G3uCkF*phQAILT%Zx@_Ond8km`_-pIN|LWT#|iay;ENoe z)lnvo<+tbPtjmMm#lc44{{i;^`+z?I-zVG;oCtmE_cRh`ABz5sRGhgSl3f|r0Tz%9VJ?FZn&ETuJ> z(0dMuL|gg z%5fC>AYTjy?E2U+XIf ztp|PxPRP{(@0jx)%3On<9`d`8M#@#4#fQ>pU;RZNCfy(W7Whp24?uE!9G9iECKGzy z-){g`2a@-Yb^w0{u7h_5k!osBv!i$o@cm%m0@5NTX~`BxkQ-$Dd;LB#+6}2|AF1;9 z)2P$WlY#SREuYJ6Lv|FE>vHlzIQs8>8)-U?f4>#`0{9BJFQ?6s2Y%!JZZI1-UhV=t ze|Ip-n!;NKhwU+_t~)?+KY_H(SC$_%U(!pqZF@2DuIb!^Yj*~491d!(t2}yF4cLiP zdL6JI{k)WqJY97RQizQhTgQ^uvf?;bC;U=z{mYdp^C4@WvF}AcOl_}J`A!dY#>jp5 zdq6FpJM1ef6=S$umy<`%^~e7J^?1)#noi@t@RvWf|IwT_M;`bc7dHaufCIp6FeBEd zQh1Hoc0fH+yarpoKNzzYPwA{vkNzz{yw;R$zk>2>fpdYr6sV&+mpABs6RG67V@067 z7Xp27{u!DNCEaV2-#i}I@ZaqoT zmepqG(P3=w2F5=7xo0$hjQ48(0$j6w7D&@+{M&ZVfw(iaD<_5DKI660dGD*hc_2r$ z;DOgU{CnVwKq`+x_fqz&jlod*KYG6d+UKlfN59SiZ!MK&x2q0gu(LPmYk~AZ5Zn8| zu1H-M>=qq5F7X>?QX+F9IyW<&wAUdieRbJGX&_tk#Kofx`0!;*(2s9CBBG5#jiNO36fw142 zLHYtv`x^#iq+0v-`6+%)Tbc+==Lj%%z29=OgBUuzZd+Pn&G@eyw}!uoz*L9;{V9Lg?qbYqI(mt;nas2NSj=gS5$!l7Rt^MxR z3LM`9oJ*e)>-usmA%yNY{(bLVS{d93ycSxwE0CTAE(We~3YmoJTGi-`{m1=MEm@h7 zk@{XEA^S`42jDw+uKU*q`+?JeYdLA_+Kx?t0Djs2SA%~7`;O=D?Gs?SZ325Sez70v z(`n!Y5U(v$GJZA!AG=b!fr$*lj&-jaUkQq4lRg>T20jFOYM@>!<_Xe+i=)TJU{Tjo zL7$ZZBA47T<@cWR@0m(U{PmA5f3azbuk}>Pf)T1=W4>JDmLx=5~ z3%&r1gKOFuU^yUtsD}#!RiWE)`#i7~*tm`|_&qny%l4bSfcwoQb9KNQ`#?F}nDUf_?zzrbsq$NK{5iQu>3N5FE|mC`Ptm)hEO=yTjlhk<_Nl^taK z``v@v;gZ4!Gw(7+Ah0kUk4~sjXe7J{3d8pda}{wzgmpK=>En zGVp)kZs5Mhb%6J>b^=n*XE^=ZRu0|nAAbyX0ROF{3x4M(_ltXgPlI2BY!&i$0Y&+J z4&E5Qxc=XqGVc{j?i;0H#?L+)sptRt?G_jW9RqP3%!9pEs( z&%wL90+9WqOx~05KGv0BnDKMn=2#Q=lw+HdN2V*~$jXDTxEXj3wgK_l>3J#Yd+CBl zQeOHJh&oNBVUGXrqTe}ZNf7N?CfS#k2C@81@{fSW^=ePux}g67((i$%_92g0|1m<= zIq%EBIo#Ae&Rf7Wz`1Y(P}i+&esq5;pg0%Vf-veAaNJ)9Rs<)5eRFlddj{x6*?kUS z<9A$8@^w=8ithl%&-i!TI1qFuSe-WbFGwIvNzmxq9ID9N1^B2hMl) zWv`#>fZ`nW(gjZ><-BJS&#S4FeJ*<0>8wMq=gsr;dr-D{Aji`0K)L)qMd`eG+ji<2 ziU(-kABx+&OM(0FXqb02Y={sBOfv`hGgsS|D&EJZ6eS_pou^e zfhGb?1eypm5ojXNM4*X46M-fIO$3?<3@ZZMv)DM`X~VM7=xrj?FmRHywxcGCKGuzv;VtTJ-j5dA03 z6&b}>mM6b5us=z@{~G56k0&igqa1DyiU^d>&2HrH0B6Or=@6pmE9u$bF5vqYTLRnT zwh#G-)yF=J$eL#`%bIv+3u+ePD6RrvvF{z`sbpQaZML1@N|7bZJt7ENPW9)q(>&&*Y7fV zh>WT#%a5waJSfSpO5VNKDZo9MbR5txX?`95$I>?6_q`h&2{I$se*g9_$Xo?n!`i3c z1ZIQ(0M}Dp^;r%!0h0aq!$q!D)>Wol2yg5!-yrY1+H=AFme(QpZvuUQU`4Z1JavL#*%Fh(0Py`u|McYxobrMV99hyk4iI16oP( z|3JNOaysxjegf#K&hmgWNc~pMb?}*?tgB49Fz~rQQ}%FhF;G{TEt!XZp!IXoKm`MK zoh#k1OJ4<>m+&0&6_TTi;Vbt1q^}1LfxnFA=zRpgG?c#G+j6V6WqwruFZxA}tUP7; zT$wUoN&c7Q<9Ju^dqbUTVreKbYN;O8{=yc2ia5mjvd`m@5Bk>(`u8FI5ODpoLau&z zV{D#I{#M|BE{1ueA(pmXIU+d=} z8{1*}WZ*h7X*kGMUH{z&WqmUY-xx|7FEIq+q4e#NnaXUmPg;&+C4Xl{S-!I_=QzmE z3aM-1=*N@DyEpqvs2fU*g6{tz)vnhwsq=W;ZDT`wdut3@8^p1+Q%>CELFNPCexToe zzxzpWA9x9H?eBf5uKQTZW1L+(IPZuL#`2U8f$tNfu6Y*&Zvs-S|DgoGek=lNub+|G z8hjSmS55-`O<0 z*p6ClD5U4jJC$^Ue*6jY?p>u9fU+MKa_st28uu}%zb)0pweywa53D$TPd{zzC4(Jp zyI!6h^7h65f-m%vE7!sMzrc03y1a(Y0gmHkz{Wt@q%0Hjlq<6WaNU0j@EkgJRsxZ& zGL;8h0nQHjXOc>LR0?&efPW;Q_WBvQWx;R3z2G?DTINvjvM#1Z6~Uwb;x}Lp@ceHH zoKxHn963s$;s8F!z31UUa2Tld9t`}pf1L{TLodd*H0bzOM_=#%DHzDLn0vB#UQG85 zbtc0c|EHn<8sOOZ6L>RlE$gxOwz94TbxsyKz2-T$eGSAmUr7GyTs`pK2u=XXZviCz z_t-hW>*2e*=?grc3OwtRJ|pCdHCQ*9av8j90jaoGM(P^GaroIXUn&p(7)r^+dIV$K zjAhIhY2>L&OZ?9!|7&nRkX$p}0J7#W_&yHa4xD?A0v~Fl)e^Q@$QW67wVYmcuKR{ok)uRJ>P}T))G6BG?5Oe@R`7 z6}fryKGJD#ypORH&->=&*N(@zcHnoOmmCMqWnKqA5AF`fUnEUl2XpO3K6L8$cA$zb zrXsRera`!T{?vO6c(78aQ~}>V!1q9mqv`5EN}j(K+o=Ad{6?XCpOUGr*$Vltyxj`N zLEiQ|-plQOe9(JPH=E_MD*Lg#%-b!W%hyfTvLOEn(&+!E$Y=i_#b`gsuS4ql+pd3} zU|EXf0gm^l0cjR^N0HdO59YX2Y|Jq{Qn&H{z!>H(1<1PYIU2NMPu?}4 zbHeMoh>R+NN9wd6=l{b;F?Ts=iI0)*!r8qj$j>6(xQy=HV@r{7%^$~)eO^7A04e+W z4R1Mq=A~@;v7Y6XVB-g1PY~^UF47$*sFxQ~W(N2zu)n_;6#7zLz_%}Ozg#BQe%}Jg z|DyztdzRk-_c85#aLR71M<%x0F)N)7lIzZr{Dbg+8hGt@?o{8aK)fdSUCT9*f4tIQ zM_buFiZ$aMm`)^aS*25=tj$g|Qq;wS0-Q^3tnet`-i*}^s zVtuebCW-Z_w8Q`1I~3)P-!cA2y}9;Nd{y<>X`ic*?`Qn$e_RKDxU93vZY+n__0vzm ziaO5+ihNZme5-?x1J~WxgSUgFtN1(1;f?KIiTsy=^Z9Q&`KpfLoefR_KLh6h z^=$|)3wh^;thIENjc(;Zx3=~HlJlr>n*(Ntd^gciW$<+)*A$zNVyrj_!jnDz$F!ls z-7&>M(DjRJsW!$iRulyJ*nY1+Z5`wns}O4!2l=Wbcm7E7wGDP;Fl-+x!?vU^96^t~ zCHfEf>j2j!OMwf(4V4b`S%J>jZs$MgJ7E1H_t^c^r1rpnG->R& zE0F&QxHc&a1AMOc;`%rGWI7W(KBWU5$#Y(obsR|_&6F?uU$i477wcPQ#@LV5$rSmj z_809*DG2t*_#gesl%MSJumARc=?qZk`h5fZe*~`p(rG|_(mEOKH_oeoL&4ubu?9%V z#d`Rif3z3-pL0>x-d7#)I{v)>>pJ|cA^#`R^MSggQnj(?y=*~cs!DlwI04(z*j-ppE!O$mePTo)H(j2+$v80hGpREluwy$*N=m|eeNru z-2SCGc0ZVWeg%&-#{X9FgzW#zew){qy4U~c|FOaE_p2gD4LsX|Yk=3wNcWKOy4pTZ zRT+3@fd{}vU^igjt70Eh4)1l~DzG!~`Nx&uk}-@G1@PL=mw>y$6~Hx!&r;lnyB@d@ zELkDmcQHDP_=fZ_Qpsn~`r-Yv-1x&f>iOGt9J_b9HOD#ljt9;??*iKZ&*zaq+B>DA z#Wu>m=impx{_vDOQ!m&;QE*|x5tyvv0u+KUEUo@7pdkMVJ|24^b9k>-ZA6*ST0E|g@;Q>n3S;F(kM>?HM zyDnuS3U#Dj(_WvFwI06ZL2S2cVaYgpUb_BvPg$?b9prg%9^Dm`S-a*tWZQ>bnY$FW z1v)ZaSi2S>wjwwg+y?CTlJmg{U`AJ=QlZRH96#;z)+(NM*MI$=30x2V3#?sgYLjgu z&_tk#Kofx`0!;*(2s9CBBG5#ji9i#9CIU?ang}!zXd=)=pou^efhGb?1Qw78@QlD` z2LA`P2fjb>R!}?#$q7N=U4*oF-V$X=zXp5`=QH@(;JG>a>hPem@UxVXO+T|K+fbl_ zvfk-Jb|dgd;BzzSe(+ncVcAYq9=^^tcq|pqq^jg%Ieflr%V6z4EUZ{#I?2~bBo|2~WU4)8g$ zbXbnQIy~r%wqmNCtZ^IdC;*)XMmn%g<)bA!g=&B;Mcw6VjX8M(+1V#(pi}{Np^>eh;K< zrz#J>bIoj^{jI?3!Oh^8RWjvr_aukZO&~9OLLL+cq!NvID=@ZP!2TeoMa4o9V-U z;CIZGeewF6^$jEV%PoYzdYe9+cj^Wl(PC{i*?lZ7wY&lcsSGlX#ZJ3mu)G^GUZ)2d@{;})G?JcegpsG zNH+q{2VQ^NJ7t|f`Jh^TCbkPX+bQ)WuO4K(Vbf@1*eUjx1WyL8xt0cA&z1#Qrs4Ct zxe|E1GQe~90^m8A4gLn)4=2~MSq4i?=6e9^Ay*+6z#kFrld*7l#G66mctUcndT*DIu2e~jfWnezI7 zJ#e0kb12#D@h|TsU^}4yp9j*GnfB$q2;6Q4ay{bwwL_+SY`^J?fOIm*5m)AU;2)q& zcXF^vjsp0u1HS^R0_Wf-0q+N7IUrjm>lk;UY`^j{;W_@o7u)B2wnbNm`wT5 zVr`G#sH;d*veqO2A8-sP%f6T6voqz(a^|-O($SgnUOzg=Z=LwfMZVMjFHrXPO#6lZ zIlP@b*l4%Cvo7}-9d8FW0M~zqfK@=Qxc0}a{VmH?psj#INwvQ(D8@sM4tSk^za8Mb zANAP}%Ht|WT`itq%Qe7dz%`>(cl=+1%xthT*c#aPq?hM71K%Hj*WT9x_fd}DLT9FY zjF)rSP2d(F)fxY%!avf1R0 za4DFRDgS$TjoYh$wqFlCAK%WD*XBAoyq!GAdG7j_S6|TK-rx9N47{Gq>ay(k*0m%9MW&yuSwb0?*%F;D=z%OnF%A^_i#_ zIpZhQ>T^-v6xlKyGsferGEc8Oyi0aNFPWyUi9i#9CIU?ang}!zXd=)=pou^efhGb? z1eypm5ojXNM4*X46M-fIIT7IAO+!1zai!CSn4F#ehwjZFla2u$?|c=3k%UjI+^ z_BH-B5ojV%9f8*HZ^nOhgqoTr0`qSKn(;sXp4+BnO$1UAXvTjkLQQ=Wf%!KAgN}dX zi|7BO-bZZS1(<)kO4G9WFaqN+{)^}TVf;7m0?dbfq-oOp8-Z~c|EegyRUcH>{2S$_ zWlaR8Rs`7pwxG@~fneb+sUou{Aj-B}kBraLJ&Ef&oNS@JB^Naz;c26DIJX90UO|fFuz`#R!4{1$`*+ z0K&CXCP-FXCP-FXCP-FXCP-F zXCP-FXCP-FF#~vRFq>dW=!XHPvMo!_K+eF-odK?MU>fjc;9mgcVqmVBd**p|IRiNZ zSmz4^{{SeD0S5we06951133dTc?P)7fy01b0jmN2ejs-07^9N(-2)7yKi+p730w(0 z06YOuo(3KPZU)W)b^zuCVnb`S1DDEtsQCF;>8*r`2F}OqDBl8{1^gL!2;kf){{fhj zYk;o+n*u(@M0b_uj&ClMy8=H3ZUJ~scnYAfWc^m)Two7iZlIDcrjcVCfG#h!+a$(M zn~nF9sI>9M_QNgnz&Wb;+{E&9wS!ahU!3z@z3?B)sewaJUH>n@m^%WFrs{d)PuYw?GqS#l8onhhxZ>l13Lk`0Q&;R0gnSFALo|3kqAN!q-Q{3b zUjJP4CYwR2+b`a2MkufClXD#_oK$P~HS~?w`saO($(>NP0Tu^%Jay ziyyqar#9IRO5Oa~zLy!Iyd5x_UL|<++G=(3HefCEnRMO`AZYSo{48s?Nv}z}!Qkhy z?bmeV11T3C~rtN4jY=GeTD`fYNeaRkGhpBXL6~ z2&%ZP&GSR4-6jq6(OoW%rBVJ(oZbZe`L54mDwWX=S`3|!KI?xGa9j;g{t0{mSP^LP zJX|+?sidy|QeHt+S1;vgsOU9t=(YQr#Wj>);|ct?tvz0ktIT6OeM%*S-j;(wwgdds zZD+Qt)W*|i&Ndc~ERL5$*K5&BQ0KLQ^_NN;-?w!9rJSnIHhyQz{o+u-;^%$jgnfSp zzErxdf1dlN0j~$P2X+MB1Z)U!JCt(NmY3Lm@T%1AYcMLde=KjTojQl!>OZuP_0wb* za-v?^*Ms^X+acgoe=DL-Wg05l@AalR#r6f<`>A8-Ujul3?R}aa%im___)0l7A1vEM zZK1CZTnoID?Gq*NrP5{n?+${yl_b!4PqvS?4K+9AjL=7h@@qVS&%FLezh9tfxe%3c zTZ7;Z*Y;`Z9Qwf(Hn#bCmyUa=_0PHRT*+t0y<>|dfG?HQ_5XSu+@L?BeX+5%*(qm) zKGMdQ+8_9w)z|-UHyHJFkOPl5*{x28t3wZ_B}Wt^cEgIQB;UDQWvE^ipnuX>_WFoKk-!bbiKS!sEdT zKoLVHXBC5tysoSmGUb|r*pv3jU@Xr8rEM(rg~j&4p^_k+RNMCbq1<{N__W_T&_BO( zQ#XIM^ZOAdydQG^8p_jkQjE}*Z8;c^^}iN;>smVlb!fD7T&m ze(#bP-Uz*J{%qe?Z25V$=jo#eC)Ktb488t&P4ho=?1aDfS_a^J`F)mq0h2#N;r)4$ zqds%CvBp(XGPbV+DnCPIu+P@O#krJniaPxcHb>=X({Pa-wqd(Lu_&%&Fwid96Fx9Q(u< zGd74lb^U)u#@_?|NZ=j7t`6@+`9(m#C%0WpTroD_O_CVS6dO1X_y5><-U7oESGBf* z!--t~yx!CE`z@&Z^E>AU@ECYGVDfJ$F9K@klhR?Nsbz|fCR@(KVY!bR9OS;2`HOXGc0=bJygc^*!1yD}FT<|5MjRrZz~@A+|5F0r z#W4+SwkE86DcbnF!{kCJH+@%2MMHTsF)Z$QhX23}C&!4zO!QsDz4`EbqqH&|s^Q*MDr{vR%%=Bxe8%cTcx? zx#s`kbQU|th6Y=`c8DF8?Q#Zk1|~TJZte2Ba(@JPFK|6j{9ZXWG}!0$ADgUfmoqSv zWgxHrnQVjR>EsL~WFW8qgk)vYoPn7v16|fX#(Wsy_YUp@_&x6Vftf5bc{(`*Xgr-8K`ugX0hWR@*lj1uF@iWhsIRiNZ zSUl?hJ2}`|Vi~>ubx^3sWH=ZTXdH>M4PZ98ho7*w>c&||opY(PGS6KzMSQ>XLyY*n^w z<27iNERDv}n5I}JvoDBK=Mue^FvzYS#*{I0Q>W0Q{KC%itHYzlYD^f+YlvSfNsG?k zDJ`NLee@PzRox?f{8fz&oHVWf!vkAit>TSo1A%QvEhlUJU*RY8oboVKz9U8BGd+Ai zr;XYzw2#TfWY`38TKp`N*V07BFLC#Z8H4%G0TaIKgYWv{JHK`T_`Rn00AB%k9bj_U zP;)iHgmPpk-^LU8u3P`h!A{?SRvKnpsU=8kEonI!>wi(i!tb%0@cV2g8$;3fOxO1& z-DJin&j{^P^Df_Wj;4T|G3nthjH?qNe_w*&-o^NPwMP|ACs7t2{YFiEqGVX zD(C-y$h?;f^5M51+Fu}c{}^fm2`AO5y8hQgY-ytirNuJ~*@jld=AJ-DmPu zC@-@LN*?RNI5&{~>!99t1 z)OHb0s#A6SUl7E}&s|Gvv}-=VQSdylfPRr*%QiK0Pp=NPXOV*aZu4S z`sX+loX6$T_5s&c%+LHzwNhi0*s0Dc>;EyC_Y%;n_D8ny+Q8(|p|+zDx^gP6|2G6N zK7u-*Zk+$<) zTQSD`PPI~Fl-Q|G*!u6{7h`N&=}dKPD*REYd##8<=Dy+ca=?7e>N`Q+!=KfzW>?o-4C=zl*a-VAFmDgteC=kp~V39 zZ4H<_3S}Ok7-N2?T50jQ5`~xKwbXTP-s7ke)_HFtt5_U1fOk3Elb>0HWAc~ zCIKfu-!VB8ip4U`8d3gE+V$B0&mU&L2y}f0u$lEW1~ZAB7N09ocu8JMU8mtajw(@p zVQM+o;Zb8XPRGOZ{-sJ(qhE#g-GM>=_XFdo@zd0-;SZt*&bam%7oT_VIkw84s94@h zYqV=1!e_iJOWaj9UH#d(fb%xgP57C<#lq_V9`j7>{_qfMKzR&c_AK@Dq)%I)`JHN| z#pg;CUZU0#tT|_1|EvY93h>%!O@QAko_oCJ3vSCfR4-96YfKo)WA>K-d)DL0DinVH zeFm_Ya`e#yAA6ua<~vkDTOW6oV}lrM{eLoOzXo-F=4E*=t$`+_-Jf$^S#T(NWa2kJ!yUHepyU9j4_l0iq5ER?)77MTUOiqKs?~B^^pq_-z z>m;*f`9{Em>*D!9Qz(<#$Jhi=y+oZ$VQtUPUk;sXWh2jk=fvYRIry-+#a-MnOJl-d zJ@2nCyvA?k8sg~h%F#y`PO4L7{c}H8`6()v2P;c!v}+D3c*$SluCnRs&&CPoccGh{ z2gT-R<+9d^@;2brQojtk*;&c!Nj?)a*&d3yopL2(6IjeFW7ofZ2Wk(D*#OYv4O3kKelg@_82T=fb>{)@X9#-GB;S`YCZ&*>v@1;~Xc? zSJMHLk3k9N$@(A70OdDDAAw$Ff2G)bnKn~Zg7_uu==INgq8ouH94-=)8DahFbNv@0 z_Nwj4win5~{yEh46i%w#@9X^g_MvEZK8&%v z>+`bY{~ZP%Uh|n;3gsPua_)@!y8%A?H@Vp2=vx|LLOIgcXE?sWH=pAy1z4`N9BTbH zxUcUD=a5==b9$e6_!snfT)WPb`kTehR6YaXvw+Z+^=-_^m8+)4H&OP8kL%a=cMUuC z`u|&Q(D9Co_W=~1SLbS)M`2a*r)iA!VVLDz8KPn~4we|q`}+Hpq($d5pI0eIAHBs_ zRrg3Ae^q0voVd0_P+FeDa%Ncn=gQnKX_)Jx=+n>jIqVk=_KTrU@1fpRmG`O8hB!xn zDv4T47|754^gCiaj$Q}6322-m`t7(=DjNs6PI5b-@DdfX@?#`<_qW&{qMXe#;L#zORk%?f5=m@+T-gXO)NN4CD;NWWW|3%C765??^H6 z@8F5_ZO;x?HUgCVy>8U;gFawuI7T@5JO34=&uoe^Cbk$G@zbH<`)>eu1NyspRG;N`;5+871-<|*2Nb^B=GD}1 z92MnRXba_5G!*xgC`9==n6zcn}EHs(8~O8h~6KQnga$xS|D`U1ZBV#b6v z!qIj8^F1>re*X*oRMj!a@-?>+xH5V!!m$MOM}+4j=`%k?Srto{Ht`j!{u_pGv$(qW z495hHeg4e{${z+c=SZLBrR(}%30x`fU%3zV#c?^DM@qdSe$In)coe9T4bW(F^<|1r zwRK$E29AD)dgXBj?av1u5c_+eFRGkfbm5~Ky=K&xaCBY&{}B$q|EZ5U9ph|UFmEc+ zbHO0vVEJhw;aXcJ=r3&R;z?~6UnwfzPf}bbrTVL~4;=gaqn&eI6432KbDonI2Q+V8 z*Z=7x6e0JWz@Gu$$5DR@P&o~is;NY`aeM{zI)~f-Ccvcf{UFf}14EFSe;!L!_}Q2B zX?cnoLEn*feI?+GUNh=fIJ&NXp?K~cnChcWXAT40i)w{oi4PD31lI-Z``|+P@B% z@R(4VLu!TNEAVx+nVb*hQ&vIAcL0wWlj_&(g^TBxhXE7jV*x;Yy%=@g)0$iWh5Lok zbuNw2m3jS-=AFlS6P|0A0(5(H&UZM_oVYSvdnKQ+IZo`agdWm$stYGoje+|Z-{n>% zSD{hk>$?8++G0$e#Rso2=rmb32;((&>b!sCa|RQBhP07YTsaM8XxnJn>+8N4FPv00h7E&0y*Falx`4&Wab98r!vNlI8`QV)TFLkIsmv4Wqsk6M#%twk zl^puA0FQrvlXhN%nSD`KamTa;JY3_KiXT1;T+P|+DeY7b1$+!KzM5#nBSOY!f~EUi^WV1=A5@$6f5ydYW0mO7IGW;ALg*U93DS2X zbgsd>r0sLiEni*Nzm0Dzc@Jd5X9T_e2P?*h{!TV>l>aCFUy}B#rM(#6l-H)dkO%cO z0G``Tegq@1Ho=d=Cxn=J4 zzD%#l>cUBG*MOnx+Os&cG^vwY8n|faX zhf1gY2?Rc-F7app(77KKd@)>R>q-<}qUVAUKK?-egl8MQAK)<|I=0C8#l>@TH$N3+ z$v(zMn~f4exBPD}?Yu{S0l>MhBJEVS0ocxQUfO(GKL&8@62M^q?{j&+)AJyzW8`48 z7)7U&;{}@p9`wG3$3b5InS2O}AKS?}1}TT=^FY5IsFH7>am=``{%u^~D0PM~Q@t$iFX_$+jj+o158L;KIRPL#jV zzE(#y2FelWpFzD!-iAhvsnBcaqniUqo%Sc;nAz4pbIfZ&6J8H53`FO*&CrNlX=`uH zcBW4U9nxugg)u21bjHAEUr$T>R?y8q%Uz|9_u`8KUDvA4fQkl)CV6t=|fm91q3&aQg1n=}P9Ouu1W$wl+Q}S4Um1eRLb#j6UYL6q|B( z(ZQ$EX@3%eskHv1pARGcQci<9*E`p}$;Y5{NpEfGXY`l~_ z4(WB(1E{|hP#Hm`G`6dM8>i&Zr^5Q@zE#Z8Vr(kS)|Ds9|& z4Z2`cOeuXv>dLnD&ue89o_C|?*c6iyx{~?lb7qsnpj74O6f;1170`A4a~>wV->UM( zHlF)85;RSzwNLyU4&CG-DE2%vjN=kBLU|ET^tU>yF|hGc?g?Gx-Kfxq-g`WO`ioq9 zFaH)6xKyUX`cHbshTw}lpyd8xlJwa)1{p_Pxe#pbH*%C8wEXogg_COA`rk|JZ-Cy{ zeKB4*sctTH9!FOIs`A3MsPa;+#0G{j^kLGp{ueYOlpGW5qSB7z9rStIcck6=tvm>Q zCcGBlGs{Zum`08jkc;PglWU>aHP?#J|79I0e*y4Xp%@?ItI5WAtZcHa>%&-+uGjxu zuO^#8iJqI;qTCoT;rXjB+%fI6jQ~IYGP!3ANyi2wbY<20=QaP*z#f1;i{$yYqu25< z@Ti<2m7hbe%MJIz>%{gX(W3*ynCUWZOXzj}))G4&i_4QptT{it-&WZHl{)`?{-Cli zDv4g7Gv`===A1rWEq$~*oQ)zoLNCTY$Jk9X9xJ=BNL*dl|9Qf37xa$;>&L`GJAj{? z-V2zV1|?>AVPk_*%4qTy!xW!l%WGz?hZgp@ZsDc+xYW0UuKQ`Izh7+i*c2TY#-Ae` zy#D5Qj(F|68?ZC56R;m}HDJPP;<(AxSaCe?F(X9DoHkv5(4OBrFyZGTHSF!p9P98} zBXs3i(q}fj_TjoPxf@CmYrCgr3-B<%hECrnv!GCRUH=T7)BVl zF7VhGg8BwNi(M6nbx~=@@xT>;$puiV=BRB)nK4QpFFODJ*7=$rC7JRmrhv^nM!j?^g|uattHKyBTJ*kpbUfuD!}X@3$@!`=_D5IL23# zjqp+JwEmm;b6?It&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU z&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&Oo;e z;Cud6zb{}LfA7WLnout2#-2yz4CD+<kTF#AZ-`>!Y|GK|Mu(zAQ zKRMqE@b~nwLffMO9w+$js?P6W#aNZL`Il_lXIE_jl2RUBeSIN6f^D%PCq*pbcX)Ib;k`#|9Ac zebZIK^Uptkx_9H8)Y0XbVO7qX+Qty{XbAkY?f<3ywuf6k6#icV*tsMKr#L3m^_eaE zU+M`H6(ezF+x*o$X`N|UASvb1)juKRFJ)V-$T+G=alxMFQMtAzF8jQd^eX{%{@K1TjZ8wW zu65&cWw;H-#M9MJ)wopOu=nv)@ujwbPv1Km9{+jn*&etJsFHu7v4|(tuh|ErRk`Q6 zcs1ZsvArI;Q6!ff8-Vw_CU1h0G$$MA%GCA$ZyCRk`9{fWfnQ1=)t?7-Kab=jxB&rQ z@lIv5d0x>M7uzSh`U}T_Q|~XizN>s&+dSz1u_5H@S_hv>)jnwci?XYqs&VSLMt=(J z4+6a2I||@-7%UEOsqh%Db3I)wT48u_#f3z8h?-(izppu>sC^zIiV6Ifx>I zksE78>iXAXs~vk*1lb>q(3M|7$>W2HpGR!0p`DUJ-xTnifxe~K-WBq6tqUhreil;a ze@uHPl=;!_EbYKsF=VIEZ6x*e1EJ_ri-vpaC z0DXPxzQk)@I|u*7xLL*uY*kX%zh2)nj_(5ZC?WJu0lXHQ7q~&-=MfugXa_D8-p_@f zKk&1N_X4*ACf^Hry4H=*mEr#9=ZF3=dRL#}xYQWJ@qOxn@7U_`%*PNCIIPM)pM~pn z;bg9VhRb)P^SIP``W!3R7P`qhp!mL62R7K1sq6oR7w z0IWS}PF=?_C>g8w0X)ZUE`4fOsh1|0P=ODXnC)NqPjJy_3g^7WF`3ox|C{nZmnF%S z^E4(lvNPa}$v^LxReJ3YN(8-W{yayj%n>=oF=imKHN@v#CWk_?_M|y=9ml|AtX_ME z=Y3uW@jk`CKJ;H?{NR0JBGi_20r;2p2>1hO8Zqso%gFId|uuwCr0GTrum1*zahT=bBy@s z_X|pMZ_AzacOA#^GFCzv^ZhsO_bNlKe_l(OECoelQhj0c@i_%?qs_f<39f4Zll7sf z&rsLTKZg7cg866Jv=0{X^qsSgSH~^B*AUxBp({;i9XvM+?>oucf<48a&!T(fM7XFn z<$eXRD;QXTSp5T0qnV)Od>$L~E`V7a3f2vLUV6R+5wJh-Fko^TlwLV8B3D-Beh&044``fs zp`JWf8^Eyu=VNjrlwuxQntfYoB(Ci8{ExnWB|Miv=dpMfS8CtoXzLtnI2Ule3ov;A z%2B{OfL#Il-y1j_xCby9^7FrGAhl;td^8$V@rpNNbUZv~$r~g+2KLG9k?70lL%e}xw0MCcB1D#_H=j6D^$!Ct=2W|p* zFT!&I@o(UM;40vAzzRS})45JAht*Ji2KWtdH$cCk@Yr)6@Cu-_&v0PiWU8%yZhz+g zx4a;h4biAH!hT1Q^x|A0o?z1FTnE=!F_Q$a4m2$unu6`tye7Ii4pq075ExZ ztbLSSrdy1`*yjU0hEdK2N^`M#X9sy;&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU z&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&Opw<43PnRS7;}PH=!*3 zetL$OKn^lzAZMU+2C(K;_#MTSfL`B;>>NxUm@|+wkdy&kyrPf9lE@fS`CFR2{$mrE z?Q#YtF$1<}gK{J`B#h&4XZZVU6aF@hzgdo@$aXmcIRlfF0b8`L+yf===cC_m3tRi` zkfSJy;x}ZIG^Ok|XCP-FG6TA3q5I!{Mh>^N&r&6N{bP`FEP?t1j%e?oPwh59AAhIG z-!Ahvy8MmieZY@^m11KzJB%Us@&Mn(b3MR!yx8v}`L0>McZ0vnJrv-3z=~LGeBTm$ zF~aMrzXIm~#s6nT+1It^bPMo(6X5*$J7b$abIUyQ+0M^_1AyfHq$yDFsd#QQYJ94f z?3=jT`karoP@WFl2=KSxoHN09GhPRL9w^=o*T&bSAKWTU^WO-D_PcnF;lBBbEu)PD*0zh#jP4(8W7#j`P2b%SaUXm^ML+HIoq5jO7r%({t2P+93P67`@_QH+ zzd=`yK6;GPz=p?ymjQj;7Guc)90jDvl`via=&gHjbdF&r}9c=$ZwmyYav75#i) zkI4~Gc)zkUaH4B`G{&#mVBA;SSQgWP_XEbe5A$ryc5_K;I%Gu%VRNpF9y60&^+;dJiYz97(nHv zYW|i7E4?w4zUyDF`%VDgascN%r_;|sY4ZC)CLE9$xhuo@a~pg&u=zgfa{xs?0=lGX z!0Ua-l2{BVpBAp@>th*j+t$jDIX>=_1)sCk^>4N;{dGZX>}H3typJ;BGYI81o!4I` z4??lwy-Oo?rQZhh5kO<0`CNUSgX0e*a#DBfvpC*jhA0QifpAi7n!m-NL;9|N?Z~d|+}mlwAYU$|~&q zJOZ8PA3l4b91obCu74gIt)2FTR61&C#Gvg3JnkE(mh%+k&;9BA{`D}F=O_!!Zv)iS zKXreMb7O{B|9W4;<4fpM>q|PnRt%B@BXecb{4Ew8GUWO%tt&X8KYv|Gr{T66qE22B zoj;GqDtDo>3}AUE%04kDIdtzkmQ!L`5&BuclRzOc955`+C8%$VI-l` z&__u=Mq^A<4A#eEjY{YLzY^v}Num2~0Ns3B$?I~HLC(J*V{T2jubZ!`lE+4sL2{sk z(3|FOG3k&Y*MF67ws{G+-4Jz8KB`y@>!bRp^ikgcupIcZPYl9O)qF=&N<2G4*K+#z3RKVoNP@=a}ouQGrGW5L(+II?|Lwc<}i%AKghcQ?VwA3NJVgM1>l)>Lqqs{y= z9xoR2kfkRdRp^h$dG6CDJVw6>u$W3^pIFR+D}C-`IVC1uo0#keCFi6rIb!q2K=G z2EHBiht*zd&w>s~6YITVfUmY~Khf*IYWfE?#c6r$QU=ca_K)R~xRk26kBZ^IptXPt zfqwuz&T%c@5Agi962R@lV;|+;z>9#!Z5HEKZNT?y!4@_A`=H(AQYcE%OE=QU@($Q- zMgK%!34HqP@A&ijAH5#&Y3iHrs_~w@TDcO;mvw<~ZPSz=Yoqh?!oLjgh)?50v3GH{>v!L}&=CL`ga>bF0+W6;DM+egPeWL7x;zX$oL-5#-duCfdA?zexHZB?7ZrBo^F z-`3U9AmDz_b@v5F#_wXwU`JfVGb)tKw{GD;S^q!|RYHxdNSh7SKeQ)E7AO z+kid-yhLpIJS53al`%L{p8tjMR8c0k$(*P*&ENd%keO}$bN>9C8YR_@L@@FD8wu#H3UOPvbz>DTDMgetzG{MCZD{Yvgw}UI1vH*JJ#ujX829pDmmN z(1!_+LstWb0R9=da`e&7i7Wj!K;6&D>G~PuQ)uh`3=$lAywlH9Lf@?Ox@#*zZ~x32 z_*9zaZ!wkZd*q^GsrH`+=v7UTXvH7ows-5rH!+mfAU`(8KyfN)07BSy3Lkk;> zwRnVP^f(ejB7?kdwCQJj#?O+^XL+wq`5vHsUXSssHU-;re>4uyS>;PP`smNOF0>~9 ziv_mx^zqBF;Nx|K$+l3M=FH=R39lPw@9W>iV4N(Q=5Mi;?EAz3BIB$p8IPAfzUsz$ z@=-NSjp#w zPrA;^YoZvxYGaOE>2rX(`K&CJqmLfppU1uD0mq6hKkw|l{=jjnaB~0RbA{yr=E0t` z&_DM(9&=6ZfYN8$eykC?GA92zWM;hn*Zqz6x+>SA!q3FKjZb6;MTw#N+{aR34DZ(u z7am?W7yC^N2W;*B|48U||9^zz<98nXJViHuccM-28w%SPziQ)rSyA=;Eqorg8e*%;J__B~d>c4tFU|B*yk@J`>m9*f3|s z_k!BCaZ^7@DrBT-Ozz7W$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P z$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$QhXVG9cd{m^SmxF3%`uAZMT{19|;7WheLL49wga z=(GMY*1q3ZRg#+T^{eVD+Gg&|=Go;8O#KXSkvd7f{>Ql5we2|b`k(r{K#p)0&VVg` zlwH?9f5*gke104FGr)J9=!0WIQ0_;=UtA-v1Ncr}{w`SMv#9h=J2@huzWr}h zdj~L!69lapU+74->uz zYayU%f8=}d^u4sF(7vyLLuI1ZKkxNTig(JOVmV;Dt$((yzy>FLS4i*o&w|5zwUy?V zWnTY%cRDvd$p2)ne?EiyBsZ?eozQs=a3HW7urI*t)iZ%#0~|AEzllkW8@D-1m7P!- z!zXQTR%7U!v9GTLoD;qN)%^mTkAQu;{^w$Y$Pn+pRew#oxXtUo?>=Yak<_M~kLj~< zLzXUv56A}oEA+PmmDl&qeoSoE9uu3hCI585gx9p^G=TRWCcGyu;*0UuWMhP`oaptx z8vGh~-=%qFNV@))WP_6@P!93_TjT3ejx^;p_qAsLN!RV&s<$(yTOfwjfhXM#!2A8; z*)qzv0(|GzZNN8x6#?F#eiOJAxE}Z%usGmjkBLC+c@5u1zKB7E&lrDAHi7erUjIIC zHXkV&nyr6+=64bsoLq^rXGkA{+eP6oKMF3=XQP-!1o;g1h@|1 zJ1Cok_hL=cis};wJpS{!F7NHCAg0gqSuJh0k8;vr1dd`Gwv?-)|9Ie_2C7b7;Jh5* zzV6@K3cWU_PEHyI1-=-A3eUBrSQ@B0cfp5US0Cm4aeurMpd1Oz54;4p0ibYSS=r%2 zHb7`!d@m&?5ZKzhcnz=ndhtw8`pxcWw3++`ioaHl@z-Qyq^_Lk_0Q+}7X&dhRr&n$ zqX4&2)3l=c!0{AdatIX5cUYPY%lXVM%1MKf@l=$Y->ZQi0nY%Gkp`+xU8A(c-@EXa zc^$Ln(B^Z|$w|W?<#xJ0-#!Cvb}e4S&_LC>3qH7>DVqWGvjSkkdrq7G8qm4F@cU>y zCa|6RFYntahXPS?&`$6r=qA&l@R*?e+!xFT?Rd}O`=cB-7?Dt9qSycD#W&wE&1rL~D>4Og*TlqZ4g#U+t&m+ALr&~WuzfZ*YXtHtK^u_ZW&mZ>yDnCQzjX-g| z*TmJO54`lf9B?=g`u-`}xSumeMLxRtXc}X@Qt~sPQvp3Dp;|mAU!#euYah68rvr!` z`}-99Jay{hdaOF}nUBqk0R+gO%7-|Ia9k9XS7`x2Aep!n?pJ;q(5jS;(Y zqSwD}=kVH-A?f;Op1Af1J}YXRS4<~40A9=K`SuT}FXZ}cJD}=i$o0P#SWg3Zo-^Sw zh}T79jzckXO0j_tn;%PFd+Z4O3Q)NYmA!%FeWNWFaH@aRS4JP7dGK1>Elee*qpVs83st;pz`!0^U&W+T%{@=_7C;x@AiZZE<91bg@q%RXbv<{ag{N#v2n;N8ag zcpT;O0Au3)hV2i>LFc}?3Sh^^r=c$j&~{6J!gE>F`hi_I?=46m@=EBm;dW5ry+CPf zmf+-EO%{UU=j!xD ztP|yvk+ex>&JX8j_oC-Ow`;IhL%$O+;rXBIp68__03NSR-U=nkH|;9G=N=|^LE*Ny zV-4HsZ_KzThYdy~7MbYv&wcK8@gJjJ45MOQG)yb13p`;yd3^n@1i@p@YEq{<qL2b6ltQ7_}pK7@fpyTu5TWcTL5nas58cufpYK1x)^E ziYv!s{p)t+KF?=Tx*nO6U7{wHUJjo*up2TyZ3^ zfA@(3h-K<&zMdH zc-_hCFUH05^F;uk6FmCH+lW{^`FP*4CD;t z4CD;t4CD;t4CD;t4CD;t4CD;t4CD;t4CD;t4CD;t4CD;t4CD;t4CD;t4CD;t4CD;t z4CD;t4CD;t4CD+xb0~3`2S^q0QzXk9zQ88pcIRiNZ zlam1~cKc595B$P+%H%{eV|Yc1_?wX{T&j57$M|o~jKLfJQLiJMoK5ptqKY0-%Q?|bOdvXeY z@AeA7+M~+Jn?d%RGvLo-+*ehS);|VvJm0TkvKSP$ZE6iDmvwE$x|q>(FLU8LAFcu@ zHv)WyTFfz~?3)Mi!CZe0_&vb)4g3e7uw?x@;B;UUV9;$~d^IJSy$t@_RL`8I3>F96 zGMC)n`Hm6hnD4uI5}@$+#{Av!UxAAO{^q!N&q&|xKGb-`WBV#pFJ0C@-?wV=N+{&j zcfY;CwGF!O4V8yf9-RyHbpYGupAGsfzm;XG-_YLq;yWx-VT*sVOT=Q^PN&di{ga39c%i%pFy7nQ0QoRrZIeCi-u`ti zPCpbSg~xndX^!+~ zGT6Ek-^R^y51{z$x}}`c#`i7Z=YxO=-+y~JuouAGGZvOS@ADeKK7Y};9E zEW57%3mpmH32eOQy0&jf+fd<88jsG!>3rw(?*PgTK-7Ie-wD9aiFD{>1f}J@s{E80 zqCBCmZyVp@Q(UIMo7#NTl}ZlX?mMgIUTUl3OKpeG|B)DY%q{tm`u`KV-=+E)FMAgs zKg&`n-jN#X69es-YwMryI<&U)9Pv%kHp73n2y?00&V28j-FJVc#-=nbHpg{#@L|s$ zpgudT#pl{Ia&l!IXKFk6N^=V8=8xrgod5qN4mOA06pQamonxIn{M{q|S7`9RgxLMF zj&Gvd5fh(Z?I*EKhhF3kEO+L*Z%kfzMH;RM5K<9fFd7R_*SZ!Pud*2d1?064#^#6y~_+5|& zPM+!OSH~NvE0b~@jC~ySU4SBQ>Z3^yIHIaed?|evtCTzknvB{0DcnuAa4?43wei}C z&w(kt4l3@YP*&PE`H1NQ?^A$D+dT*SO$Pg493ZTmn`<|JER*)l$oYR>9f;27vD^+{ z1NH%U{`GOjaL3qy^8*5&OTCXkUlw(f$6~l+ZH&~FNja9W%-5N~NP4 z@u2(@K>0L~#N8Hy@ku$^>!0&`F<|SG@Bh~Pl=Qawwe^ErrSVt;L-u=VcRj=ue>iqd*aB40nu;@kNxo!^ULL`+p;KWm1kYW>?@l!og!^ zQjW~tl@~d#Q>2~870M5RB<{9tV0=E zKL1nyCpe-@P+I%PT^pZ^7i~U(o{I5FIaSvGyol)!0EM3qvu^qDWzXr8M`c!B|305c z2J_78ue|}@8(aaXT!2d7wEOYos=$HjP;@@4-4_`2yY=8J#o&XBP-HArFU5WoF}yIr zDEhbK9sdsmh2J@|w&RMH(Q_d`4;}3JzxXg;A9B7}Seq|n=hS8g?o!Tc>OAk;eE`n^ zW5%@kY3m24%4Dv8uDh*)aE_(;+UAqmU*RwG&-%d<1fQ3tx~a9V@n5(88OASxrD_Q~ zbc8XaP{>%QUb?J*KR8B7iLuEx#+TYOai#QuvuZ!9YCGEb=W&4NrIJmG&njE+J?;2e zOxE+iIpO;(fZr?Pvo@V0s$P=rO{?Y`wt<<~^9IJDzD-}+M=+`k`TZaBQCH3Zmwfj3 zJ&EBv;XL}(!CUg3!X;xRyiVW$(ebT%N{mgmt&ReNCa#n|(3W!EQ0KAKo`3S$N^x&x z_9;HAY{By|VAA&a-}B56<$YCrUE09)Zs84&0n#-t&;Rs(e<3)l+AcgUsLa!4o>gN& zYR4Xyb;lpZw3-AkSne4UcuS~?v#w3XN_d^tzsB%uNA^YG|8LiJGTVj{;Wz)&oF5j} z=F4&P>wQ%CeHq&9JUycQed7TaKVvlE?~$A0SkDYmUf$QYjRzNxX=e(z9s{I#T-N_X z;$V5`RrA-+-uXGeVE5nPBA?0gp;Y;28;?yULx28X@@d;8rbIwC)?#B>Tt~)?r;Tu! zZqEQOlfI)!4EZe(OWkTmt^iYU{WHd60SeDo8vsSztrKi90FQolbENUsl>GeFj>e^3S#v#O{$c z-jx2(XUDPkN_NfbqQlnyTxc$J85{0LV4K+(2xK zYwf_X6=1?O_g#SBz1SVt1=s_4AHd@T`zgE@S-X}ru>)MT&(9A1bAXBYv-)`4|J(Bw z`nVtX1h5ytxw9MrrUNFdC(f|m99;aI+vFZ7M*#Z*^v~zcJSM#hxEwI~pL)jh9wT*S zQjRfZHV4gPK@}T`a2VJ61;OZ_7rFjbrESev?lwEeZGKr!6F=Hs=xuzl{S|)4_^Pnk z6m7O9xSz(ltF;3M*BtM&Vuk(>0BSi?JIEzqJe*sVB<-6qalpx9fIVNS@~LgVM`aNp zhC0dyTrULv3dG9eFnn1Qd8AR`I4Q>%Yuk?JqvHUcp9_g}Z{xKjm)#fb2%UZ0FCGRc zyT)?2*?~*_QlHA}pYicCY08tpdTsM->j#I;|25FR3j7Xu03bhw<$VCZ8*>sc*u96v z22P7XOI~w?lC*Cce^Utu^vV1C_XEEG?gIFmARg!b4crY}415qM?rTvtQ6}|~3s?%^ zz1RN&ypFbgA8H}I-r}_Zug%s0l6rJ<3$<$609e=BZ9V2EzTT zp^mOXrp&rRG`j9hcVWh_e+=MvJTC z#~70{5-=-ds-6E=L{$3$Hjg4m{E3bew)UH*#T^gxZ?afS9=qC@li0GWpFFNQ1IYW$ zF86;y+3CFs7{`6@4~{44e1S1MW>D4u$g>5YzqLfQkUQ~r{_0tDZw05Vo3?T^iiC9) z6P5GN-&=YAG2>{1FRfowDBv;O(q&1AgSzn?c8w(7CD$#!uWu#N1>`Qk>E zt@?0a?D1~=4JfY`F8+>@?;+U>;5{kjZDr5>Yv3FynB)IMudA5o;C6n1^ZOC-24Ieu zakPOgu?g@GfWqqlljt}xz^?y!FGx=N4JNPu=ZcM|i=Fdlb785^0rKKCDoJZt z2SQI8YoYbwz}STW{=Uz?o0;cqf+zt{o#nZUN@bEp!WBS4BoudA3C;h5)sJ~y#v z@7u+UqYcIwUIP6=z^>z=CSCvA^FQ8e@mR#?fD~Sb#fH<#j{E^o^)er{Qhz5WGx;E& ztx+Xu4fh#qY3;*-vE06V#}LnByyxfpAWGX@>*jN)65RYfx1Mv_^hJj9O&*!s3eZ0S zMBjtSSn{k3*u50gr1ifd?0*XII)J}*e+1yOmvMRKqWOal%>i|ly#6&=HM%AYdeZu@ zq0G%W133dTNCvRxOUKX|BZe}E)rikyKNGy{44&!8JFhn+JpKnAe> zRr3A+06EPRIRi6F26XX5&+C6i*>EmS*?!ZY+p`>No;HI`Cx<)18L%D2l{4)6mwo?v zqH{gW1MnTu#oCzQ^p3kb%*!ON|8dXu%;&&%9#_uj>wk01gYUoJ6|i$5-_3qKup--L zHo=_iI|qw!eh$8EW}9!G&#)Q5{-QFYuYZ1*jsIhh--lZrcsaoDr2Gvit_z0EUS`V~ zn6Wc}b)hn&uYaEZ4t5i|7UfM&-wI`MZX9xJIqv9UNZ*+&XJCj71Uqli`o~!Q=7UoF z{vV}Xf3i+_2&5xj(7v zzx4Zm(C{3~-<9)y0F;}Ch%tr(zRoQ?j{g70?>U{%0{Qzi{uY(;sTi(U8}Jp^6tQJ2 zZ??-Bn5YbJQHZ3je;MlEx6a>Pd6~d@Y!0XU0*eA%my{a->PrJ31f~rc5BQ?a`(`(! z@644mFhmBhZ>r45>pwgfb6&Roecuo{GY(B$jBewGDB*9N6b#`rbIg1h2=?2&{u4HF zkh|7u0(Gk?objF}8m)xcV3x?hL(y-Dm?hFN-jkefwmD||+q{d-w%BYh?c-|8{XV+i zf$#soeh01bp_R6N@80|Gx6(H6-shmb4?1L}Y3SN|n>CI6C$p_&YFN(s{Mkm|#UomG$G1a}del0ZK4p1Y|}9R75cVqL>xMz>f+B6n>RE4En1u%BTq9fZz<` zpddy-9Yq`w6$MnHg!d3c2_i`{{A-=p)zsN%SDg-3efr+B_xJ7FRlBNot-Y#upHAnV zdGqGa8_0$8E}XZ-yd@S4D)z@1Fb0ePW55_N28;n?z!)$Fi~(c77%&Em0b{@zFb0eP zW55_N28;n?z!)$Fi~(c77%&Em0b{@zFb3ux0}qE~rMVZaMPv*Z13m-c^ncj$-zUn- z#=sn8!18|%E~y&%s5tkc@$f3|RhGB+9xO19Ol8%l|pJ zs1}kjUX8(fH7bU7z4(DF<=ZB1IB~Uup;yj=#0=U zP@mV8b{MivWegYt1p`HXABC-yU&62?w3B0iEr>B-40O*xk>4w0y9g@feK1)5cfTw) zqcPA4173dbER!GgyP=Qu`eZv6bP}vhVhk7qLkx)A{xa%PehR~UXtvy^Zxds{80ek> zk=LuEegjm>zA#w+cfUL~;}kF;ldVcU6)j3$@21Ru2W%TFeUlv%QpMBMPlnjwQk9ip z9pbGi<{aZBwxYfXw(o!*3;hZ7GU$y^ULQUPrEtqS?QH)sl>OfZ-55F)v#aNbVYc}M z7qul-jF?zkm;Y7(odw$xf&QA0TDDa2H1(4qE``E@X*T8m=0N=2P#`t!-$(z)Lx=W@ zrt3AA#?|C;&^=ZBay^RrTG-w^m}vOVn~V0LHB4bk6;D$?DPj;lP*r8N9Jt^)RxM2xzgq`o%X9tjK&5;OhUC`)sp4ts2Qei%j(L70 zZ>~NY^8aWDHq-WO__h3Ry0a!6=hh*xT_5(_pi=gNA!)uO45^W;)bU8dyn5gBe+6K@ z%fp+iIJg(kXt6R6LclXc(6?iI3G@i)qo8x{nB`)MZ1+K%l$&69G&I>UAoG%rb)Pbp z!WTBG^gaJyq@rGIuANxX7 z*6b_hraUp8G0L_55md^_FpL{pxxFd=RO3>{Quva5xq9F8f5rh7+dree4z%)`7Ja#& zXmT2isg^IPAK>D#=^+L5$NGx7DFKY9f^LF7+BxCNDvYh-zbX7=;}Az^zeiJENftx` zM~L*4K(vF;YqV8bPp{we1O6^%pFT=~o!3Dh5ZHgySIkX$EMl#)rtcA4u*%Pb)uC0! zNBcCzpK2Upn1N12QpJ$M4+uCfK*FNdvK%#+&!SWwmf`@CMnrsYXaQz}}%WKXG+x$e!m(-1j#pZP3Nedd#OXaB9=BjfPF@Zs}oZj+^NSR zV7{ND$*M4x>s6!7>*$cIkQ#pqe*nukLo%m+gBL;8UDKs8hWA0F90fyNUuFLk>(<5x zu+PYViuxW6;|jQYxbOG>-S>GUe!dG*u2+pR$Ax66Hfxq^EWk3(kW732lba_)?^g(V zHf&Aykz7kz*)MR>@UDUFwa}2%dCn2?F`M&06jKxXM=+?v6|O!NaYX{M{2$Kke^a>Pc>&K4)Lhr> z)mJA^PY=^Sp)8MSFb(9d_*?ZI*kZ`Y#`1qLB|JaKvzRTt5?4%Hy6@HSSezBxc)fom zRLY?+M0xbvCryfv1?3MzL-HduRQX+m(D>P!|JoXdVjO2b6&(iq#-!I>o8MszZM8A8 z)fS4eru{kSFNMzs%K!6#a`ad*Y5oL0=J$`GAvqWg(Re}wVV|w}{|aD#C=yrIrpwT= ze3xj_>#ofYe9^Vl#>`gRxL9knYyUIiw-{gPzWJp2Q{v?RIl2+5$pbKM4~^|7+Bn)~ zYyK1W>!EyZ*F^YU(PyB%$5Qe(>2=rU_wi|EZOm-7Y4J6*@w?#Ky)(WqSgv=dJZb&{ zxORa(B#d=vUq;=JGc;~C=Rf1)XZHb6{%@!&p!`mZdl!VqMIIk`pX5>~&!PAX;5AV7 zzR9H5U7H_R{dF8EYhz}sZCtE1+h2(OQh40o3Od50Z<{oKJ{D2t^URQZ6Ahu~V4*Ry zJ^!QYh@fk=PkP<8`NzeejY(m{yoW&Vf!+fB9rWwa{h{kaM|e#%=ZIfzt{S!z(O1g3 zFhuW}rHG}C58w;&ungLMB?I#6?+T3dx(pR(YyPhsh%>}nC3~AS%QbdfoEhhx8QN1G zsqlFe&!dLcAO#Nith7!w`th9jFHk8wjs@pR5lb5%F>Gkt6w32lO?ZCu6sU|%>q}eT z^PlJNn#8VkWbBpeZPqN;SOg!%pK;z9jd;&?5z4DOd?|1^Ux~N7!=IFYz_1xqm!4;`CB9bxZ#{@)eAz5(p&+KsXE{_m~LGe+gRd?X|9Pe=M1!p@Ez#!9Wpf%6!*+y-kUO z*MH?ZVJTv1{2*^vJ{wp}$QjyBCR7(C#+;_`Ib zt-uzFugm=BGv$yZ!2#z@_WLGd`0QVMw!9}XOj=s-@Ij2NBeNm@xxQSl%j*PIvG2Fg zkM{~J|HV%4IPtc;w-S=smj7Ju{gq(&U6C~f6`fasp~*3gV|efD2hgfATk@Z=@qXUH zQ0@Lr)p%XMzo75|Xqo#ccfQV5CL}IsNRs58h65AIeURtIAxVM*&gGmr>%6DQ?*d5q zFO82bZ2;6J?zJ(V`*#(YP5JLQ;pfnEp&y5y4*d=EdgvX{`=JzG2l2ikj}_NKe+NAS z`Y9;yWAS?w&R@Cha*eCbRp7)%l_YtmVZm%AFJ4&%0b@2C8aA^T1I9pJ2E3g2j{}zf zd1*KA#y~F^u>9}EG8hPBU?L1y{!fH^&Zo1(2RjzFc8Q;E#GLf{O`r883!U7pwa z=PSGZrLghd-_U1tN(j<-QO9OPZiOY~)B|55vm`Vm2Wt+EfeZ{Vub?}5yZ%Ec9|7gP zfT7%HJ*6oAL%;vADD~WoLz!Q*q1%XP{f2BQc`{$dKrRNbXS@COOqBl!-QKggwsM;i zhceHOuxWAuj47uc_@d7Ws^J+sE;(3pXbfavz}x>fLYcpB9No85LJ)KD9>cj%P58Vm z<9c|k0Ej)fZ7*4fG)BH=w_OUJK-J_LFXlpOIp2B$#xhw@qENN!d2TeY7yhhl?iL`JZo$B?Zm zhDrA;aR0|hgy{{uu1NkJj<);(6VETNPap1($Kz0I3pLqzVA(RKCIf1YvNM4FU^Qrt z^M1G;k!`XERC59#}Idq6cO0H#F&toy=VH*WU-WWZnVj(s($ zvhH(`0qm=n1ol^cC$!1_&oPe+_`I!e6awd60jy7ey-EBp4EVdWZ?PL5V*vZ=O@aOO zu?_cs<_xbJG`X*Dj05C@8c^8Qf;P#2-doq?#=gaFc#Hw;sG)oRyx-Sk|K}J!Q_$qW zzA+AvD+ScQ-&co+b+o`?ySs0(J3IlrG$;R`+ip(V_JaYeap?1}?!7NRN7fDOQ+M_w z>PJujr;j^DIdtrM;E`GTRSK*X&6fZDTB_t|u*Q!GD4*#y&4*`TtR`0_51^$(fNUCL zXx!>r;IKW^5^A>L0lYL@{%2#oAC9rcq5Zgx{oR3ms(1ImGsGV{|G&2%D?W-MuvRo% z{*Tf%rz{!ve}4Wg<*8zPR?Zc??{@X+XVYR@00Pp zK)(C(Cg>GVP40nl-M-NXOj-`NvAswO9=6N+7Q4d}z)Q2`zawdmZn4I7_VvRe`^vbc zcX6)12{0`UeMdl-Bj%cV1o~_8gTBS?@MvHQ+tlSh;+E^p&o{o;F71AueV(WFaUAz` zt6`4Vn&dyfTgUeS2YmI72jJrKzmU8Y4gNZhEA!d^9RX)Y_APdYCl;gYGc8-e#j2>E zR;=gVqRrnI_#GL_G0=hDO`$tNKMoD$KAIlhy>GEQJiu1&ud?j=Ov~1bpYMNN33bBvWS#<*Tx|uL z{|?PBQP1{2i&C$H5|50}uh+?cxE}nEz@xD(kBO=AxAg~XvHWKYDdZn;vO-&|xyA#V zzs5u5Tyyr-ug3+C@!x~`auq7PzwJ2Uetm)80p%}v?R^ci#N}hHP_CQ*a5<2Z@OQvj zIdM-4z|}?mf06O`RovQW+rDDXg-dX-HtIJ*efc&j?%f#vE`cvRUl{rgm0UPe`2}8g zENi;uags4V8OqQ4kZg~JRIroz0j5~~KNJe4hMoJ*8qj2zQ#&HIkfxri@BS1XUJRR* zgJAG~Gm-6lk9M$+V_Wh$3*#-Z`*GALe+7Lt;jy82bO2K<|Nm7Bq=t>T|4itB)7}MN z0CM=WZEnoUoV@4udgyUbUQ1sG<@Hl1-yOj`+WvnO?7lG9Z}JT&e*!u(HaCB5{cD(8 z+IGNrP0ok0E!^befhm^%JkR4b5C4B@9pQPysnE@!v@EWGmCv}(4ye1%DdX{D3zS3O z{ketx`zF8?%YPR)zYF~-=x?F&9{;_tF}91L--Lb$%KmO_x$Rr*4v&V_*<7Do+hQJG zLx#>9(X?1{VetK8rgFW!GN0?7vKWQ>_ZzT270Nh<#{0heSO(sup&{XMZz!G$bskSb zGQV#e0BDu`ugihjzi+WSJm5gZOM7l9=H46Iv634L{R4zkKHGgO^xUz)9_he$Uk`;o z4m$AD1?Dz$04I-G{0!4%0~j42Rku8k3(4|ru;v&GpqBrUHO|4g?-TrUe_0gTVSKwk zE>{`zJqyZn5#DoXBNt)tn{weyl^+1L{Ew`0 zDxO1r!2dsob{1(5`ABKUoS&BSwx}PH5?c;mh>dysvp|gBfqmqfrWoV$U2gfVuO|Hd zPmT~;`2;4*|H{k&~iVkx3bN8V?KV~T>`xo%J=!VgZiI=s1Aw4$3ELanM=GM%;Q1t ze(y@M0*u7J8#K3^fC=RE6R!i4<$rkPyU73l4NSiW_ZMHg*jbACw!oI3b3^kNb!>)2 z>%-5(EumdNZZ!unLiz0Suh5+GA~u1n{+ zBlC2?(vVY2bHHR+`FZ1(@GPnfw8{lIT=zymjF|_dsT$cagMeZX1{}!0u^1scF zU2&|-%VNu8z^kC4V=|g*37;!0fR@L|im*EC25gr9;U(=N|3lB&E&n^n0zWssGVfnJ z2YMLv+t3T3*F$fI-VY7QjcDL|51)hbx$fYcA6v_RaL`x5`h=v5{C^-Y`9$)+uWMwu zjDfkxKp^*Nw)~%q3vMwP10DmG{~j4uGzO-O0n7g>TW|~481NXd{P)PPqA@UK3|Rh8 z*@9cR#(>9w<-bRU6^(%@W5Du%$`;(hH3mEeEdM<+tY{2O83UI8Q?}q1t});-VEONn zVMSwL${4WxpRxtFaE$?v0n2}n3@aJ~Q^tVh|CBAbg=-9W3|RhqWLVJ{m@)<||EFxh zEnH*3W5Dv?Bg2Zuz?3my`9Ea~Zs8gO9s`#D9vN0N2BwUGNdB*kw(|eRv20=t7z1;Q zfk^(ZX8Aw2*4m;m1|$QK{GZ70e@J{*HwKJ>d<;bLpTEOt=l}VrH_yhv#2G-2-y1jv zywmc3;>%+IjDf5SAjkg_$p6b>U&TKLWCdc*jR9kza|V##KMmwR&3}Nt7Ruk2U%qp2 zHlZs&W9x0S@yH-D523OJTbM^!?D2pyxm@ zhVoj4zkzo*^g*Z;{+8jj(C^i6(yj`(6e{kcW?QK;_;{Ur2s==sn; zL2rZJ2c>Y$Sf-6Jvk&`n%qyU4K-Jh|n7VEYVXR_~!j$haZ3Ww(q5SPb{!Zp#{<_%P_ILAo+sB~% zRjA8x6dMcg>+;yi^gqCyF!I-=G-Bq#tud!%g(CrsI=ROF^^J`UVxUJk36LEf??=Dg&O=sja!84(MQ(T@6+ftQ5 zC+dhf9rrIqS-YN5pf)nm_lu!}`4YiT;>KZWu*DEnEdOh)3>b9#pxg3XnfLsUfu0NH zwdEbq2Wq&j+!cN~@A1$sBz9iCb7jzpIwD}k&ST$A9R$yF9?q2reHu5!(@-%?70drL zOVf!Ltl;|4oS%K_PU0DP4`6R-C-M4|a8Br9(5~cAOyonDc$s(_YKSw-|B0_^bpTkz z{X+{0`#I1TK_3mB57qXSC1773x;gai&^q@Jc)h(Vbl|r->NGtu?~>3PpdmRE4R3_< zp2fOQ-XC2CN-n4@)3zRzeclND0W>6kM#GY6(5LYNJldL8v4vtxmH*_m3XaNs(l9o+ zyny4c2Nv?zurJ+U4Y+QxcbeREx1g}C@4stii}@WMx&1#rwwmR4OJ`nv+pgn`%~vxn zKi9mFhKhCbKXmT7dJAkm&axciVOrb3@$ZLL?~%%D8uHI|JNpqgYH1;?TSCjVVYzF; zobQ8b!sFKvwg&Z|YmQ-iZ`X0g=4%j_<0TN@!*%nY&qp-jJFjl8B-*oJL zf3R2H31xr2*5w!v)7l1(@AEkKi)+^8e;f4YJ?<* zKH&SDuH%f&S0Rp(bt=XL!mIuHe|EqT--!#&-N+u}VOrY)+|w-I*^6<$2m0R~@goov|(7noyHGDN~3(#Ma%e#&(}JwKJ9A&ST!Em zPm7JVy7~X?kfXwW4z~M2pAKCCDsfb<_lftuU;&?@92l4Xd|&YxXiUzFG>)uW*PH-b z=$xg_xz9)(@Jrh&f!P1ib)2#J3ap_RV)j6Iwez2!A))IqZH|R7@);|y58ejlJEhA( zV^{}mF&?J14ZK|f)g<;A$bI_^ZIEZ6aCqiia?RyZH}@6eY(`Ci6I98Ecz%j3Y)x1gHvxH`fi zY#Tx^(gt|852DQDdMF3jb;NhqJQGAfa^`>c4>}{nBL0zesAvmN*C_vqf%i-KepCwK z``m{^`8id_7olNlo4^mhbEL_aVJx{T%1^=edT2=aKHu(8H_q~3VX99%o3~bO&8lvd z$Ofh+pZ{)7UU%_*>_3H^*R(G}|MGLJPrUa93;0<84c)){652L`a(!M5y%QP|9v7Yl zb!*A3<-fvKU)G*D#Cp}KE0GOMZSvpE&v&btw+BGK3cU=5EMIJoQmYc|XWzI^^%c^%ke_xbKe z`&$BIosZhvuK5D~kW6#_KM$nvvtZo%1-YxUjuqw^heNi1J^<{Sb#P5fUxj}@w+lTJ zB(;Bo?f{j%x2|{1IbsN1JLb&)`@4=aHlJ9>-B9Pb-^ozkyNRtSnpK(P=Rfi8tfIni zX~cM#);4e@*Larze>7hO-2y7dB&m1328bi{-KU)I|J~JfoU!@5wfrZP{d4CNP>)^P zp;?u>`Tu@+(Nukh2YtuwYmZS;;k#)u9wyON#KQNLoa}|dxcK;gYMtzgLM!MTFZ92i zbFsY+bzT?9{>kdC0%W8{UhRj##&{kN)xHOQEbKfV)MAEN zmAd)QYe`L3g;AS#oGrxrJq>n|tV4?UzTgFaVuhH$;`Kj@{o9B#AD^jcvNw$5xMw?` z(|kUl(eZ8KXfhTUuZ3!|0LCcR3hkR}j$ymB3D#U=fM+de?0uWhp-It5Qrhb8QO9iWZhtB8V=}P}Cn$FL0@F!K7VqmIzPP}2j0gv-? zuAzFHIGT(Fp3r^H{l;Of&>s4~s>e3LnrloE2R~Q*^H5Yr10nJaWpjQ3Tv{?ZoWpWp3} zeTV98;%G7!cs>QypZEE?kgfW}JF!H9o@D;- z7{S%1iN|PdKPzoruTO!8xVjL&Pd#|1-F2L?`GBe9Un#$*0Wo#+pYxy5V4gZd=s!lo zMA{+&Ofvs@{&!{sTa%`XFo=F*`&#E~;NjtQOHScE)g7RN_&X0YGNHp1*}ffZb)-rD zZ;A;$x{SZ;IAinqxFY2@p)GV@2TeoLB>&0HQ=tooJhiWo`{zIh+{bvBL|Y`hN#{TL zdNlMz=mQa)&z0^aXH$dA6&$m7cT^m|*ALC&XZIJ-`kpGUije(Qrfd2{Qv&pNWd^W?+ zb$%vrpJ18qCH?{WeJGzHZ42dnTIXl%w(B*BVB@{!S3~)J!0FK6Ko>!8gWd~e+X8(fH7bU z7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8( zfH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX7>7|{MdTm>7t3`zOFJ=P|16+h10u6B*XV<-fnU*P$}_|H0GA%G{3H&&L{NfB#^)%;`Gixy|hC ziw{%G#x_Y_>%FKEGu1QMa?}qFOT>@Ipmn9%`+L!@dTUi9oxX( zGJpkk`M5pGZGUgd-(R#cf173n=wQy?k}{>hignS}jke{dl$JRicCqGA4329OS^rwUXVxVCNzP5YMf`4ivcSXNUUO}3y9{jde(3>9Ki7Y-ZNg2i zF~G`m^7Eiw3hy)L3aOS~;)v)g6;j5oZ^R#e2l5Tj??A7H@|b%+l)`%}yvK4O^jPS# zpq=h7#eCSPGHv<)0l@;-XKAS1UwCcn3xB6k_8F?z+CejS23GzidDp`GgsWr@t&)4- z7+M=q=dtljs4uspvK}-xPHSWCf5UfFq5LnLrz_!H5lqvT|2ryNXusjjW3?}rprWmR zY3ph|tIPweNBH1H`S+;r4SfRiQP5?f+>fO!3B&TxwV>qaRnQZm?z0WW5qVt|e7XAo zRk<#KGOvwz?Dyp)RK|^y?R)qRYLvIj&4Ke@#1w)yZTY{tLd2U3j{LQKhv>&=VJj*9 z$}x`bK5T*WEP>xuFF;{MXo=e^yFPBK^`UJW=$)>U*dE`L_(Rxz`$q(JR-X&?`;05s z{p@#B9@iC5MLcd^xt+HB=XzcxNcbG;a-E+c`moA->9Sv0?`l1(%mbXf4%Or}FqW7_ zS@sY0qy7KM&PDzFD)@5u0hSnc*T(an%S9Y~Cqla(bYtX}??w3X1yp#>d;M1LwcMBBn2^)0qEXFQZ>vI2Rj#y;$bGY~eANv#7)@%C3*whWgRIf$Jo; zcUQ%jvmY?Uu*){y+x6uRRMv;eep>xOe;~?(XQ0YhUUT{KK+gF4<3+#UD}Bn?x`?If90IprjoriW`>|Zcrj)h&C>--pRg5|NDR^VC@OyCb z-N>(1^nq?e!e|E4m7ju?(M9@J_x(IEE^n8^rLa97QjPppFWGA?8 z==f^cxv2lOGRTY_fhC4rYvc7F-v#sKQdIaZnAYFf{QfLEyS5$bn=$-exsGwt1<)bV z^HsVCrScpx&LeG-9c>?`jn}fjlbwtDuPTGg*b!Jl*kksmV4S?3KX8n%BJ6S#^Ivvi zA!GQxa?Maf+67Q@-GOuwO655aZ;y(ca zf$=>D#vSq@x(EB&^}oVl#$BLvEf*+Ly_~NPg~v{a4Ja+a~5b5MHbn(qJmar@=2p8xrC<|_ALw=XduNPj=& zyS*=meh{*@2L>PXGWSI`TRe0uCS5t`L_wu)9KVAZok@9 z{%h;DvJa#v?}M%E`%0zXR!YB4IUP5dhmZH^FH&MiZF&d}2RSkhTNmxXBG<7_o#*Oj z2!i;YAm101ey$Mx4o6+S1Hk(wpAr2o?t+It%pv0TtCP%suH&^n7?in2a(%ZHeOTRH z>DLFUOAH0R&9S`+np^m;(OaPd?n)37EI2GJwmfd$4fW+9ROJ3~ir=9|xfkD)=wgW? zoJ>0Z<##~OQr4H(%W^;Xu+py!Dl5+ceEbai2{flX0O$Pv3-2eCc~Kc;#*RLo7G1rN#&!lg@u$?@L(~27i57{<7%AJdk~QwPe6|jKJ(yuR>*i=+mKVL3zE( z{aDIKjOZ}d)(0Z0;H=nZM@b6mFBD^WuEqPSUxV`dgSSHOh4P-rJe0Tf=DE$pM z>;q3-U_iVfnRNbduK?Q?Ho1==Fg5BYp|9kK=M(1%ADlz>t6Z-a(d_LlIPiW2CXn%f&>mar~C(aa6J-5Ii|39gGZtutT zWD&=0j3c1DPv{GurO5yH7aBWcuNP7M-oVBAUgCk>tFYB~)?$P=zbsn*x8OB46h!}8 zl3mo#z?SE-L;GS;FS?W)tq*NqDtinUc+82x>a1-T)}R*pUJm2oy?iO5*jGkJz6;^Y zA*h7<2kp7ZC@_7&1A3yvnR{;Ezc;@uTK@Y)B`kyJ|Bz&R_5VS6Hz=QB@LYZwD31wJ zXk#1uurJRYz6K4+&(V-Disr5qfWbUOUtR}DiS>Vl=*(-aO`)+dBW=y2t2PpN7}qsW zCx1m@aO|(H@lmAq&09mZZqTZTAxIIwI9mGU$g#*R(dK?3mVeaZiCd6-x{ z8!Fe5@67PM5no=1O4%{1jA&eWIuKhyy#wtvT#$9TDZ^1GgV23GdzlGAZ> z6}aAvZC7$MCK_-t4qF%PO3>vxIh=D9m;C3soRpWtAlK|*(dlN? z%kzXTxU4#dz|MPpzZ2L~RBwlqk3)y2@4$L`j4dd9?lquC`5jTd8afhJ#P$_2p7#dJ&xO#q+(ZdXezlXlbMg5Ti*hG8FlUvu z{F%UZx-w3FPH@PsuAhsy4_k++<`&(DqzZ2%eR>lAH-{prS2-EoN8*au)#V6+WtDWG$ghRXs>Yw+4p}bJ($74Fr`F$DOPldsS+lwvnG*CY- zmYewKOZ>abU~1HNY7qO|h5tpUuMqQ-n<#=B%)i4O9mHUA%qRI!raUeq1b9;ccW(PvYnG&T%rJ3iXdQjGOcEn#z~MP#NLJ*>dyb z0}=Tzkz-c%6GiVI2x3nj4|}k_%6G5;O|%gviV@A_p|o44A$XL#1y#pmsF;6D4kXa9ZPyT$t!?DDQRzkQzt zyS{Vp_rCeP2QAnVO}p&6mGk)Rc?(=oZkJqR-ckeGD|X-W`LEn%k6m8&(kJfqf?alf H{*(ScP2I@~ literal 0 HcmV?d00001 diff --git a/q4base/fonts/Profont/Marine_0_12.tga b/q4base/fonts/lowpixel/lowpixel_1_12.tga similarity index 84% rename from q4base/fonts/Profont/Marine_0_12.tga rename to q4base/fonts/lowpixel/lowpixel_1_12.tga index aa57b0530d9b6aaff38fa9dc6cb20f7aa219329a..8884ae55e793b9f28fb2c7a73a55efa8a00ad4d6 100644 GIT binary patch delta 1119 zcmbu9J7^S96ozN_Zk%0ah1Py0uVCB6j^5m&DjlRh1C2ym^pC@QaAQF23VSA1 zJWp$K-$7z0gyp%!8Ad&qG;sn}oJrIuyn$O_9NY6zvXcF97iJ-K{bQ(QD8VU^=nTsr z;uqTf6!J01QV)Q{kl0;xHo|W>4>F(wBrcfwj^2aZ1g14Fc4UuHO@0VzQ>Ro!wLvjx zoK^#^t9aSxl97m7d=W`9zMhj{*H7;kAUtCc-}gEf%eO|bo*D$4ytgW0sciFyW0Fp_a>PociR8F&hJ zz&y_O_M#*za24c4QrAC+ng=O{VUXxDwPpL$$on9x?FWe?rZzXnGKx;p$^co%0$eil zoi-^9Pb%qa@^$SdA$NZf6$vH*-Ip%C_X=`w-TnV1!3S0Bz M)|g%&xcS0{KjHx9Gynhq literal 262694 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 diff --git a/q4base/fonts/lowpixel/lowpixel_1_24.tga b/q4base/fonts/lowpixel/lowpixel_1_24.tga new file mode 100644 index 0000000000000000000000000000000000000000..39e7b4b803478c2b7495dcac5782c9f5224ffdb0 GIT binary patch literal 262694 zcmeI53AiOib;prKP(cBMBHMs~j0Q!GDBy-75~5LpiipCD3rb?#jaw8(1;I5S8U<7o zH9;jtjm8auxI`2bL=B7R3?MKli!8D#li$CmPIGSEUaD{ReQ)NyI^Xwy=Tz0Hb55PE z>aOm4Z@)FxSaXen&Ryf&HSV^?-L@_Y`A^P3&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU z&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpBmtXQ#PEwCIIeF0&O z1RQT2;J*WF_lsn9dx!D5A+1<1C8E&J@-@=m+B(>|8-1P$J_pVR*MUC+(H-Dwa1J;D z>;}wlii<{_U~AU=HwKp*rIAx*1`8P|mFid0pzR1xEjhFtr$G!m#4E!2~|j z>tAc{#3+Wg;=52Nj#J+pVP{tT_l-aIpDY7m{_Gx2wEb;f)$nIT`cITzAFA=AxvhCw z%<($j$FKDbwqYgB^!neY^xRE&3hFkDi8(fA)&InS=Z?KHpt%F$dw`3nJEZ{^(Pnf7 zg8B~;N4(DW#O_k?4zL}F+lz89$Dwnu4J&D;*T3>@bP2-K!F|EnK<7a1xwZr^27drX zCnNMu0XAmUfA0Zg0~2LHb0%a@m0u+o$gY#_a$u1s{g+6ude-d>;hmVt%o!tLz16>Czam23FULBJ^{Np zEFR;!_B{=}wN9sxU+Wue!%CXz^{?kHMw=nn_^Y_ujr3gbZZ?idIW}h1|D^vu(+>>+Z@!jSkDHG-iKgqy}}K4jxfWCT<3u;dpQoBgMaUKHrIb~ z{tq#g`Hjk*V{OWlH-UvCOQlA5_G2P2g z0A$U#c-&*opWWmuHxPpaxwoSe}(U=zC+XnUz+2dYU4nu%tasn&d!+M zK6X?4I{!AFcpv__ptF+?5Lx#E)~ENe!PX7V{?@VWsJwyG9pphtu69wQ;&C@o*y{!Z2PZWcXjdit#|qMsi=*^>GyK&?2P&CWjL|3^KWxZ-#5|z+vsQn zwHqb``s zkaZ7mp{si*vez%<3EY=moNbA1*PjvJrI8*&7>^HQrq{pnZ1gt>BV&xp`AA&hd8Dwb3%S9u!lbw$S;k``d;2xzZ8FUI+6XPeV4^hXR}Lvu;s&;>Gf}) zJt>Au!2w`PpzrGgl0Iqt}x ziM|bEVvdd3_V0&Xd;BLJU`t2kFd!)or{7|^x!Ktn^V{5Wm{#ZC#&7&MACQv|t?Sb# zB4=M>?eVYj-N&!>4R+<*Xr|ZyS~&g>bDqd`jEd(lHjYU-c4phZA9C&SpLBd}{cvvc zJ}C~T-)6e8-PsxQ+t_iSM(5wgZ#=#Su=p0%_30B5HvRLz`FQ`YylbDoAJ98k^m*uY z;7>qwE6|?oT<~%5WMIdtPwI=l!Pad0Cxnvx`q%kQ&pQkB9%zjL>{~9&AQ0;2p}rSz zl%d9CQZ+Wr?-)-q&{L_&f7iA?q2Np3@iWq~9?OTT)ARq&82b3NzRq^(*V>wRRlm5d zslTD<{T zmSF#la6Q-2eRt`nkKNS1-d~HnHSI@(2i57N`mEB!<~hJf-!&-nP$3VNe~Sel&jWhS zsdG!=+uE8qy7vLk_x(bDT_aS#VN-u=3w`RwEFZ4|-vW9LIHqTICgl}275~@4>%c}8 z?ISTv>eu>V-;>sY+1F>GMz@>(&>RQm?>ut`f10becJW=D&Q*P4!H(veeXnjQvW|1{ z`F9_?seSR~$5kai3Z0X|pMmJbph_>*Wu+cAkCE{}AB0!>2=%*}BK+z~gB>feb4svz z3A{KDq?kZg&xJ+$9PUkE8}J73TOc|p(N5KP^*PH&z)dm)>3bIs1Y^1>KALnYY;HxJ z?m3a8WGYbEfwKZ|{bbqSrm5!Mw-K%R)k@VYq^y2(${aHS4 zM}7xbuR^cr*A!z)Ta8`qH4X*00g#;GVbVXCwuXojYfJj;>54O45By zg}KgE*s(n5yEj*Z{Zfp$e!6GTJn@wn{-<2??C(M zK=YvV>E$NdDQ(#Dv?Yb(!DT?_z$?Ie!8$3nCegvRAD8ZT-VS~Yv=^~wu$pi74EDpw z%F86~%0B8JLHBya{Z^?oMIrJX$D;BU2|7i;K4Cf^y1wW-`~#rluIJt{T}#DR!DB%m zw`E`1ad-f7(sycIAM3wuTvs}25aK?ed=L1VHErgvckUHdf)DL;6i=mY!_ab5&OpvU z&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU&OpvU z&OpvU&OpvU&Opw<3}k@s_IRrOt}#mM1OFZPvfm7ZnO)=z44#2<0;da01`lGE4Msz6 zTL1cPY$eU|5VHH6fr&CuIhmU)mrUen748%bw{HD!j-GxGSV^n!@N#H51GO2boXpLY zOKOd+rVY_>>(>9rBfZmnc{Lq+4tt(wz|Udiy175{+n2ePvV=w0-)bE>sad;Uk`o(^qa?Rz)XfV zBfc1ur@a2F&w=0cNkZ1|fd^Ta*s*m`#|QBB=Yeh%5`(V>Z2~r#l`?aV`QPoe_I?WcH4BEk0^xNqTa`#_haZ8++Tnq zCvARG+Og#+&cR;35n1oa)0~lBNhyA+bTDAYwvG?tr^>gltBFJ7(=~A{Hs5y=+1Zp2 zqayby_UK?SSzqz;*rnKz4t+l04Ez!K6rgt!eH45d+zO07o@%#E4}*$zxfzE466m+) zHm)k})Z4|j7}OqFDf8D9M~dAx9cMoZA*rZ$QS2%kLr~<==U^?`ejc^IRepi=N}4nd z3{)LwUpI)Kw)kq|(D>&1`q%i3_CfHum#jLYrEPgkZO5Q&>pfqd_NEZ~_hql!DyPH} z8S!)9`yG)}?6&E+aYi8|7q3Dy=^dj9v3RFG2ilW)(mwH?K=~MCT?Sht`HkuZ@sp4P z#h`bN>e{yq*t>ra3t8_Z`Zur>XfxN^E*k-`l8W57c1D37hO#q4dF)bbNQXYRI0NOr zk~*`m_gfj=mTI?64}-F=cZ>bOjKj|a`!~R;-ZfS#E!Gj<7K7To!9+R5Y^#oo*}E-| zpKDi)x(;s-J_bC!vDHz6f;Wh4G29DT?_u(^h=S!esZ_y$*{kD&_^EX6Dv4tg zu&f+Vy>J^%yST0siP*65dQU~}Qw%osS6eE1=g9hgm&IjVF)cTw+HKQwevUw%go<3z z(c&EAZ84~Q0>>$4TXkIAK7_V0>Hg?s*WvV5M+pkfoj(_@~&WM{R$#r4qWYFTJl6l<(t!z7t?RN}g)BO)s*& zfbt!{=tP9lr<1K+ymhU##h`X?FvTW1DP~)BWG4VtQtOz|)Vp{~YIT&LP#Rk)JPM{g zxRK`jgMr0se5m#RGjjxgZiS!4u6>x~SL6gAe*W2UkZW82HtvE~nCMi6U9%@2Mup!L zLv*O^ueMY|SI?H-2Xx)_r0@Rh3e3+SeByOci#jC3p(fDzx;n8=ryuO=SZvg026 z9Vs{2OKpq%HWf#Fqd3UA^KnMbPm9X`N;!@}7HQ3w{J|4m!t#|*|Fmu`yDB# z*lp8^{5BOwe4{wXy7TchIM;WM^n50cLFGZ>z>fA8MpgMA#E&0ul}rHoA0I~AV`+?{ z`Lh1)81KJw*u`Jn3ygdxrz&@o)M3~BdHyBmTh9dVAL+T~;(x>`);jE%5|=laC@)E| z+ot2<_HGYy^)@b_AIXES2OmHrznOCE-^zo;5&5%qXFkLSzu&1kHu%vqe>1<6N}8R-QS9mAiZzv@#d*f3k->jqoK?(TI`?Y8N8n@)a= zISu?M*H)RUsNIjFErg;y@|RLvl4Q6=$;It`mdDSvkBo_WeMW24>wi#Nh-NI}`o2rm zdbD^HYe{CSE60Gp?&|v>X5YA;#g)|6eyTnWepEVH`TSA-MYjHTURf;u4*C4w##!=| zn2EylU0B6As;Ez~AsuJO%TJ-+pyvZ+TdLhQJ#RCT{r#u*pL*VH{t-)RT`O%dsJ*n7 zE-Xp0+oprNiN-{~ZC$9>xA{qFcd=MZoq39%Djj_5|LhrUhY=tOK^y6F!fpHd#D>PH?@}KEE(9Wd z|7rac+vvr48Y!pPkWQPOxINWwn_g_!l{N3q21ZvSXwR!yJ+-ctwiwio!Olpr+ot3E zwv9>o&{%bC)MvG~0;40^{G_yF%;!MQVZRRE12jLM3Qh$^`fTt8!1qaUQ>lX;eco?$ zBZ9t%cOZBP_&D&NMNV`5Ydm`1bUe_t-hUo=Gi9w&eIH>9P&t+^mDpGZECoiNLMZmS zDR$7^KfvEJm31jLq=StrP+iiQcNvm7 zZ6{Hm&u-r8C_%x+qH*sC{M@HFMz>I-`w+`hf|qI)Y-|d&$F8Gq`-W;O{cG`2j>XAx zeSs^NI(%J8%%mV@ttH-Yjq`Bp~>3fQw)Jbw`N`+@~gyUxwJC-J%oUb0HgK+ZtUK+ZtU zK+ZtUK+ZtUK+ZtUK+ZtUK+ZtUK+ZtUK+ZtUK+ZtUK+ZtUK+ZtUK+ZtUK+ZtUK+ZtU zK+eEi$^hRV*$sGlK82C*lvI@W^Bs^M(KjcNy_DjTzCL~b6o-+{obvB;F`s0Psm*nL zzt&SxKi6}?fb~5x{ocvwD+rd8I_}>OauND>>zgNY-hnUa>(lq|;MY{=lz*R#`6P2N zZH~{^^{??CZIc?VcMWX_EH5$FZ=-GpM(;%EJ!Q;T2R^6PUx#s<>Y(HAeE?Te10>Vt z_k3RekF`k^xW3FRfCy^nrmQ^&%NOD*s1)ESuX{#`2OmFVW#d|vsz+@3-7%CU0cw^bwe4KR%y!c(aYnQ*>Bb^iX9`z~$Bn{z2gF zN%qeP&-Lwnj|;Xuwa!13`??(I@0}xO|KrDgWG;*(Z-4?hf3`aYzeC;zjQCV}XmUPQ z)%CwAG3tM_+zJ-Dcr7?dF!-NGH{Fl3rvx zrI=(lRVi{fTkC%<;`p|Ue_eY|2cnmQG9So#53)$l3VeN0 z$)D8yzxu}a0Oj*N+TLac;b#NyD>dDS(_E*Sqlae!->S zPeAYf)px{B0>ycMk{mbn!LH3G`CbN$K7ml~Lz`?&(uQsGyDG1L#kf7tJ;04%0kF9L z8u?D3cTsNT>Jba-vi@aL_x(nCC%pO5nm76<1gkIjB)Ru}%y8hX*B|*GlCuAi419H@ zG+MZt;ub^ZUbe95@kq*gx3SS%5C)lNaolDXzN)W(jbC{XeI1nNMC5m>68a&q{ZdiE zpRViw@zyc$E#ZQv1r+@8iqqP;?2RMm^&jOo&bP`#Qj~vP?>`3g?*9XU=9hmy|A8TW z%NF)y97LU`=TaEjt@ktEOI?*P4XS)^m2Yx%QqURYLCv zsyFJo{&f%F-vh7v4Z%p~81q~5z6ZvP2cFk|MULaV_szNQALajzu`kMpIGuBS-y!4* zf0|pzI-lD6?ly!kZ^QYW?e+f!H`ZAEv5WID$aeyr8}9GwH$`3!MEk5{#ow;$KhFC% zvGOfv@72iVx;NS9bQ0OwmzdXoMUE}k#wW>hT^}Xg(RRr3F;<8~~mN^nVwO%6H9EVV~3Ky8#xz_>+M44c7ysN!I@p ztTX)f09EO{vpMiS3%M@8sr546k(Q*|PSNY=Tk3P!{|1aNKF0dL3`TdPtFxdOnaP%xR`V=Z=~mc7ORfWrJ+IBdaD=zXCOO<9h&kG^))-XpSTjl z^j#`UXM{KTNNI~5C6t$>*iF?*@E5DhW&c(CuY33eq~RB?H+QWYw-FmR_Q!FwCP@b!>G+{6uc=H4gLJRS8z4<*< z>EPE?=d%B*_3zimZK-)p)g!6pTxyb2?WO8DUw(W##(maKIhG0HP~S5ZK%m>;uLq?~ zC);;}bTa%BJwl2O*H^pwMj@j(OQ*Ec{b@6MuDRxtJu<1#k!N>DS zbw*dG+D+BNu=l6^=RsiWs6N$PvR-UIE;kuM_rYLKpl9YjeqFow06RAI_ia&szy5zg zTfE0NUz^gV?*@zH&+13G_Y=!?eY)1icDt4v{ONw^!@%GF6yxjaqe(yVuf5jC!DE5{ zoHaSGO}?tyf`8rby%@xMJ^9tKJ{XkoRN0xd4!fQfQ5YF3Wj&KJI(t$-b^S1G{&q$_ zD>%|UvF>Nr1x0&Z|4Hl3ZXIv3OP_xMqKm+5zyk0}Z~+h<*VNy)p}R|f_VPNX==q5{ehuygd|PYIs`OpmzQ}qmc@?NT2eta}M0)P1 z&!R`hR%dIH`pEVZDc=f2KLsxYy8oTF|K0E*x&i3^Ye%pb_z!Rg(6il#gF$lc^Mp-L z+H=bPi@S5DplJ#%LY%7fXXE3DPZ3Bw74so0j`d2aS@$0Vt@}s$`>y@q#`hI}L)fz*r8pQEKaJ-tKzrhm@mM)Ew<&sNGvYe8E&^ABw}O#4QtYPcM7GzVtnc9HI&ukk z4p1!9^pE+HbS*vt=-jL8(j8zKI1X$MQiqkShs}GMZP|~Y>uj;6k_{#*Vt4<5dpn45)Ze$!ZwK%VptY`bEYkV#Jn&>-KI*vEib%(7WX*U#v5an=J=H%O z*#3XtCf(R>*K%ZAIn+6|DYmXI8ueRzZ9@A@?EmBOZi!#5i@3fhHx4K_<_zQvtAty*d<-xIj#ErnLj7!d+^t~KL3jBvXL&TADFlP zl_|!57BG_Rb6qDZ=SJ5ctdpMgRZr6f(v`0&BOz`bCr_)(^dFx*}WBmHAzo%^}sJ;&ReSm(GVDvGBNz%W{^dbHa*DnR#-`^)B2D1;1@HBQyOqlIm(sq3ReG#4u$%GdFx+EWBl6zPj8}7&hZNQZ@e<{ zRDK&f(E**X6JyYCR=)4Xr9F*)*VdGW3B3*9EyU@18sn?V078rw zxA^L|{-5N7?;!7nZgE^DITqFzJ}><%XCVjreeonz?EUFDN%~irK8inJ7x?YK=nRCB z-?LIS-Bm4qi&?zW`uAfB@&nran*E<>3G@UvhP4(6nJ}><%Hz5al|HLFz?EUH3l;%~wP4PP%93|otlt+G7Z@R0> zz(PDe?7r(?`Otl!Nbf}P`HAI1so_t``j^d*I2-y*u(+>>n?D@`JsU83AA+?_bSQj( z9Afh!53&CBoY&q3 zrFY_#+%%YiTB`7jM^VT+0)Jx%9!eWG}Zh5$n(y>a^rHa1li~& zgsOLc_|FQ3uXKdaKI7LR>!9A=bafs{3n^o{RW*6!|>- zu+V7u+^#N9^z(M&J-FTh>D%8G{D}PqjO@wkd^FW#!`q*C{*@b-gB_7Q#pnEOd?RwX z_eX9@^D5t__$#3MUjN-R-48$7>#ZsS3o*e;8fyJ3FCPt7^%-eZp7dVGp9LMQ%P)hs zgIz$OUzaCqciiv6ub|%U@3q!{1&oeD7>T9MM^k-lgYvxcuiUsCD90B9qt7Dv_Sahj zd}Qx0y*?ED=$&iF0L`WA!JPq;Rd+PdJIVUEs_ZM9HFzBL`aXb>&IgLK(62N$3zZ=r zi&1>Y^}iAJG;SS_a!n)0In(*_Y2eM^M?iEqsLhDlB0QP0C*@x{JNZiFM}+#af31^- zhS&z>dF5ZJiE?lRWg|WNT@RSfnbrUw+51bU57A%iTIZBD`aKGp_wiNL7n?T5D*o~) zsPiZnd*Lculhj4_$BJz>>7ckh4Y~ehTle)MJrB@xfvP~`_s^r=GHd) zf6y7%J7{&h7X|2?^ao&cbgRLR3K)*_;LDn8Cz|uX{~JEhZ%(R0i)@b-tNQplIw)RG zeb>L)T8JRq%E326rLONjKiU_F9tNyl>&WPVK2|TIVEUea)H=d11G)$B`_gw(_WFhF z?WW3AcBq>-{*|XF2RhEb21cJkkj`tY0zS6)mrfs|zpkl9`ys?}J=YrHKkMVGs&9qA z*uVBcXS*0A9$RH=k~(bJJx1j-^fsIHSG=BvUjMTHK%i$Jw}S0~<;c#>ie2B8(EeZ_ zV6>nveiY1x=X+Skz+W1b^_EXy+E#-d70hr~-qB61I)3fh*54qZ+Ko6>C|XF{f>8tkh}mp!+-{-G>_e5}~S3Y&xl2V{6{{SCT4npl95k z4)z7)vAsWaN%^i*qW_d^1o(hfv`+^NX ztUgwj4)8Rs^{;EYo&kss0`mJvpnZBw+AACY#^SXKwbkG_>Z|BbDl7Y#%`Uvo7WMPO zzj9TP1D)3|1xDAK0I%HpQ{N@+W4g}1#IgT%LY=;gP|}!zo)x9xjzUkjWp~`_IOy5S zTfu(<%fFt5JhoJ<5ztY8Pt#ie^0QlTbTxbvpgNrwbluQ7>p4Js=#7BdYND>3dxd`J z4;v$U9$|VVuXWPUfc3I}B**sv7Ra3Puhc~2w(yKOen8H>NIk8iK&FTbL?`EJk1PC{qQcU)O6N z=%U^$KPc(*BHf=^++)1Xe^VdY4gn(V4L=JW0mf`wU7e4ndg~kU4^S5Ane1!9)8L7iTe%c8ESPiWf{ekm~0 zbJ9vbwN4ruYHY1V{VTx@z|$Wo=sU3MfUy`F+|)Kz*ilY@2%6|L8sq&zt&g?_Y>kb@ zIrqoks(oGAx6MyeJBAkk|Cx{ZiuqMkY}sUMk~VDGIQBu-I`}Gh8qi$0Klo>$d8liG z>I(fyd{yRF-oh@E2#eVz%w8QcVnDvvddmM>k4^qgPkOYNDg zeuVp2ytfwoy~wzNUU8 zmQ>v+&neeF$;f&A&*0G|-|;zi z8|w7F6TRDE+luyB-Ey*(~G(Kh*r1t|Gbr9clx_zN{3|LnT@iZ*Z&O80CFF%VU_j1 zo3p}kd47$~xzxu9T~=J6wiz5oXIIgfzG8vHmw~;&M!?=_Bd&MkJ{z0|L`yn5%^fN; zuri(H-@N`SvoxJbvR<|RRkst+`>1{g^!~9}kE&*xPQ=4lC2~KWOWa8GE()DJSAgioB_kQ5Pu5Kz5#oMotkDyMZ_YTJE;9BamZuE{u zYeOt(A%BzN4f@8aj=i;sclzHpO#xubVivzu#sfV7?%S$ly&LU-Ci|&v<}{V3+FhOW zqOt2(=-KOKK<_3W`TtLpr!fb#-t?|Nz2jedy!{;zOVa!lO6r?u3>_Mb{SdA=G~fO; z)O|6Oi#gcWS5<#+ze3hnF9f0|0>2gxR3+rk4J&Ip-2YpLz-My(>zSV&XCKC5S8wgc z_odBpaJQ;_cCGV{Q{=Ap+w}3NcWY`tb3^d2wWoK`ei7h47VF`=$^o~sO)?FO#*4~s4U>wJMPnEI|69YL&(v6_O_BfaQ`Y=n z42}i20#8G(|D7?c^Ia-UWBu!zuQ7}M59ryOa1jul4vKxjG>!wdi@EGLVnM|kMpFAn zR#vT863W(RbIN}J%Yoj{ZdCM5iPt&=uKb#9<6dRRV=w#KUv{OJ(4mMeWqfTqW-FDq z+3VVl-z$OWL~sCj9(Xq}+N7(^uKMOEa6j*q=a)zAL(YMdoNayYV+WxB!(;n!`S+yx zDU{T8tg$|Zu1fj69Q|{6Zl5{7P2* zE&8Se==w-hZtLPH+EZ+%=tO>G+o&prIHsbU;-^gqr?GA2&M0ncGuOEtM|S<&5!w7{ z4H!MBv(b(n%u(R?f?FKo4~W`_T>rmvwjUSywHTaAF+VjwO6oY&F?9@?pRWg_dhT%# zp!?IGg}R@rJl1)D3hbJHCvfjU2HIex@O0Oocn+*}S5qMkIR|cb zw(I`CkW-oJ`rp+#(w;}h;yJGFnGGqNxGDIt<1TKbdFbmU+cm!20|%Wg;iow0z91=-rMFPcu0O zykA{&eJ)J)I*Lswsqf%1WPV;<8eOsCQK8=MPxU$cR(*X{^>_X)4huu`(CUnDO5L^K zI&lArcGD|(mA|+S8=m65pX_)Vdj0EO#@}bj*Wys8`Z_$4wsActZ<3g5H&qX(HYV{s!SlcoKy)z}~6^ zV8@t`L-rnG4e;B*U~>^$KHmRzel)g+16>dNa}LQ51V;iLlb5HAuT2L#@gC!K)EUKX z`?uNa+K!`3!EeEnf#qZ!WTVZy+U%-tjsjl~ZgCj*Dnsr8Pj`lOuWkN3cPdj^|H}2U z;6%T-k?#$GU6Vc?>bj;iNgvz)14RD-cc1 zSod9B=xs@kT9k0;;E$igZ?#bQ~BJK-wF^P<`t-fLy*4#KIiHtG2hxJ*w=nnpM~jsW7M|(*GBPd@F%bnu-Hr9>Kq07dD3Sv$AT+> z_So8E=(?}-lI}ZFOeX2bR)n=EzX0faubTJTi}-xpLirN#MetOR%3ueMeE1LQt&E&xh`iQXCP-FXCP-FXCP-FXCP-FXCP-FXCP-F zXCP-FXCP-FXCP-FXCP-FXCP-FXCP-FXCP-FXCP-FXCP-FXJBq+Abe+JGq}D-s_&EO zduaNtM@;&T>VJdXK>mKo+?ob?H1jkAtmUo1RUnmgZYX{qKTlJZhn+JpXEMNAK0aFb zTHpHq^?Bgu;5XoQ;ORdp%$XeIf#eL#*9@?ZwbqS}Mz{wU`5rlCeMkQtz)1H9^EG98 z+&KetCIhTvf3LrV)^!awpx)D3b0!ISAUOl`Gy^PX{m#`;_1ix?AKcR~e&oU412Ruj zpNBoqGr$_MwH0%%Lr-ygQ63_FIH|N9)$9EX|Lg+N@3PmPl7Icqd~cxl+bsinN1&cR zECqU3!k(b`Ejql6eTZ0Q!-gM2kn6^;=P+|_{IiksRmEq;vA6j=+v{I@{XM{;KzjrG z-(-jdoyp%p(kMF)3z5GE+UPVCwgqM1L4uhDBYq6X^KSgJkn&Z=WpwPzxlH{`uYc|B z_XQsUdf$t^hXiqq{y@!+V30h@PJrHjXz$!ZEZz%r7<^H{61aa);PT&Z0+m(^O#T{=SAhmfnNa8jX-?|iDfp7DE2T08~?eKcM0`X<5!z>M63PyXCvpa zPx5GazPppHF6MggT2U9<=~^~B6?`Vw|LOSmr2Fk3fWv{VN%nc*UdTolB6J;Yr9O6a zziWH`uOe&gs(TjrF3=p;JHd4Adj?SM^Q&zsUuXzgau}RiD!c?#CUrATgYy2A1N;BnO`=UQi{Js5qDBl}Yja|pxNau)& z*PIU=J9^e9S_ak!^8GGgbTxv1FWw=PrE?!}IS@V7+w3CK*T#BZWL<-`-`OYBF9>Cw zgLdm;H&qwAHvUVH_1s1AEC(WsO?+c;jVd9X1C*;}DnJvDUvaK9QU29&_I^9Jr;feC zcNs)1bg|i07hh|F^Mg+vhZljs@2!C9PXr>ZyQ%yiM(o=74@9AT4pV~P3WmD=FU8iMfL;5)j4XO5@G(gK0MI>xj+M%~Ug}xpuj6s0mV=$m;kN+M zzW~|RUR$k{YW+&ph2FK^2pHio5V3`leLlAa; z1dOy7l@IxPDA2tBHqd(abQ*;r+{>3f+g~Po0awFC+X1U<;+LRz`=r4HAIHH(H-b%o z{Cx?CwCB^_XHpl9{jeL4U%qYqYuyW)i=vMJ?T36mmQkK~{0ff#o@RRe%l}a>0PVwV ze^-vPF^N4J@n?R{4sm=E?$?{-6GK}u_mO*gE%I)DJwH77iPCrm?3}8?DZQBEA zZ+!;13e=I-!^6Q4?&Uw8|GJ)uiZurx8FNK>8FdrSfBHTMm{09-GzuFXYV-{8$XP1?P`(b=J0fXuHGO`o<9K1hZpI_n!8A zYpjuqzV3_uvIA`2V}5>xp!NPduo!1iZ>=pZ2br>FoO0lYuWh0lXCf!+UG zeomS+7HsMIZuB?=`Fwk*&@s^dpon8qA5HzR{h8ovk@Pc8q-}wEz29%gTyALoWMbN@LSJH(HEPo_CRpu~zZYNDl$KdjZiUK-aU! zf;)j?dJWLMpzg`v3q)4|?NN2Dw$J~bGHD3Gmf86xWsP@Zpl1Q16Tu+IyDCO(?+HZO z*K0o`UsdaW9qP6J68!-vSIU`ak1E@#bt_Gjf44&N$6WKnQ(JqV^)J7=4tRPlh18); zq$m3Uy8ko!AB01It`Fa{O8C1#p+Au`*U9X_HJ7gdMtTlv&p`AXOnVNary>mEU!h=2 zYsr)LnU)XFH8-zza3h&q#GcMI%C+dLK=HgJ*FfWB$aCEj+FKb1Q5r-@UNIf_?dXJkay6Hq!p&Nx-^K%w;3sgK$ra zDOj8Mhh5{(kabR;*st%19qn`c`9=3(-nYqmCSr6Gf;Tg)qGqGUJ8_dPfhLrhhnE#(D%=@Og@nMYn;>HcQV>h89%z_ z{Wkbp2LC6Zao-GX2j_!#0=0=W?>6e_W=tI$nrDv!cLF0_&$K4hX4n+j<|1NoY{u+O zQW1QdC8L3U1b;oyKI{On2)q$o42*t&Fp0adKC%;_bE?iOM#{qyuox@?ZwEgFMmh#M zXBYj)3@27tf4IhM^aupmeP5{1oZmdrWGA)YN4}l_ZUjae|6yPeP!5&=)fs8+?*`Pj zlh0V$3 z2529mbDys3ZvktAZNN$33ZVI_>ypkHuK>k$tA}q)R8tq5U3Kwjd0fxQRu^;4lcKJx zpI9F|%9*EQD8&A(d~ez`7meN$+nc0}F|)5d_oso5wf3Sq_9C4ZZUCAOr+_DdLB_9m z&6eYLL)Q67vB>A`0l$WS3hV)-GtzgGu~+!7dbVBGP3ohmUp$U5wz~0ulJ-Hz-xOPJ z%NfWS$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P z$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P$Qj5P z$QhV#8Hj%Or}rM{ch#4IBS7WvP^Xb2e0hrfzQi@^cc8mZBZh1&mbH#gyZBz&$C_nM%6c`j%+x zU++B7dmxNXMkvllQwd_0j4~!W1{)!t04@W1?}gquq4!NJ0c(L-iZHvKs~OOos=)Eo z8GQ_4L}wbgFlT|=`u~Kh*SiL%`VN$7j4Q<^U zH~I9Aw~>2*P7V^4oj-|M{|CCd>yZa}&st(QGpfeeEcgDsT8B}uy?~M4&o`rSWoL6g z1DaD6xI1;)dm3$vQ0h%1E9NNhm%{x!SpU}hmpn9KQ|}CXGgt=nK0zbNdLQbA;FI7H zU{Lq62eiNUq<0+Zef&l@BMj=-8^gBF@p=!S_F1Xu};QhohM$35> z%>WzE0Rx5<?eqVCK0tg|yoJ@z!d zc#Ww}^T5+Olh{w`gOjRtXTCpULg3R}|EER1RMd0mat@@7r;CoW9lr-vzT^AfH>fhA zw^N=dzR+*i$e!N2Y4-MTZTf6Z=cq2jYt(gqY`*=<`7=@X;TBJ$y-6F*Q3d}tb;bL9 zrx^pbf9ZUG2zdu^fAAMzOW@CoXHPoLs(#p3ZmZV6>h%t2L#O{~Qst|z4j&f-qwgWS z7%T?L#cjaTwAR1&J37CLehc)zUy<(r)&a#FtQ*6m^=23TSzz@2Ae;v;{09CXp6}pJpv(ADbqgwl`_wsGKJ->Wd%4#E3tFHWbDz@b3m$=cn=-)g> zXwy3Ova7wG(U%Y&YX!KSdwd@Dr~YWCqwlG7j?el8u05C0MF@h?Aqa(i@uA4uME)5N zX}xJLc7h6lbS~;VzSKC)N#I%w^7T)yUi;GxLVc>)WW8Wl`>n0Olfk|~$M_)dX5i0- z=O-IZP{g*zx+<-I%fHRHwTREtG}gb)xxWiev=`Am&rYE%_7gCb`4{XyLrwx63Rezp z59Qav<$Iq{7Fz%glo04(c<1=6PvFWy)&Jem*mVr-cqGiKG!;L{3 z{QyBeb^L#CmGDhLYFd-^WD^_-jGm65x*vv$&xP{4Liq}~t`!dnWwB2H^-1A@^_1Ee@@9Gay z{m>MAo$mZ-pD+I(2z9>+@e}uBG$$t!W=ZCsZ;aMNY7a_;=4^&t_3f{>{gR-;h z_Z<%n^*aCB+Pf3^KB}JvVb@dD{F}=7Z7ev~GaMuB{dEtl@sIemvh^E+V>5*YJ??Sb zQ2_bSu4{_B~yk@f2`7D;4Hf&tpFp@T|#4I^NTqw(ug3@!rGKM82!??^T9g|9<{mgCl>hyS;N< zv<)-jyR2aU;m*f@Bik|eap@U=k>8Jh&?@1b*9U#fm-x}n*1sd4?8$V7cZ^(>f3Gt1`hSTt{yAhnc3q2fO)`4SFeARp3WjxjjSfff z{x1m)O9Q_h?(?%a)QjmJ<}SktlJo<#=hkyik+{x#4+=7@xIR4^Ug#&7PErZ>{JpQ9 zaav5`djX^GAtc%Ds$>oV_xbg)lyX=5ZTk4Nd%Y->vEr4~Y|>`0OFQ;7E{)k!IaVr5 zxr^N{y52EzRsOxo(Chz8&iIRv%kc*Jldk=+F5^nk#kRMvdq3}A*I`dTqTt)LZjHW; zkm9n`kv`Bl?hIgbJc9Yqb>Ha62*o{VX`rWoz54YKLz}tbI^;kX-OZo$nzK5#MNe1z0Mr04n*Y&?HW4C*6#1&hBkz-By zAT)FB0YJl{7V6853p)X(BXByp#;Bz2Zbw=7N zb#c+Ci><|G7_R4=e(Way(&;?D(O_=O8ORyP8ORyP8ORyP8ORyP8ORyP8ORyP8ORyP z8ORyP8ORyP8ORyP8ORyP8ORyP8ORyP8ORyP8ORyP8ORyP8ORyP8ORyP8ORyP8ORyP z8ORyP8ORyP8ORyP8ORyP8ORyP8ORyP8JI&E2*0~~82r=V*T8;Lcn9+DfZoq_7|`!= z=g`RWP?Q0VsVBWh>L~Dk;1;0YBVP(W4z>hyE@>JQ*a~Qj8mq>vvFo?F?*n@ORY`L# z0SxS~fX3TK%Ev}Sk3Vu+_4|9TGL?4#3_YgR$(~Ox^4FrWFY5gxo32h{ONo^+Jpe5C z1C8V}d^yGD>ZHTizUs#Jb7Z}D-~jMq@P2S3FnasYV>82n=k-5yf?MoG`PX|^js-6S zF91h^KLVq}Tg~oqpNy5T*VA9 zFn|5i^A8)haXKDgxaA|}KMXo2Okw=G*KDG5XuQD`rr_U9i&y1;+UI|LuAuW?6KPKF z0frvFj@edvV&hT+e#n z3l;%A|NIc}`=e=$9~UL*e_zG(uWUq^#`RzRwC+S72C@HRik6lClX2+u%h%1pzS!m< z_P?!bpLYJW50Cw;&gj~q6M$juZ;bRmD82u!tpTq8lQy(_`O<#dXd49YU$P(n-~nL& zOmhz30mS|nxc1wIP5`!l>Fn!SZ|wgiu6-Kg_vW=1@&4ELjmYaxVf^yQ3%%6j_ zAGtQP>6|>Yd->Kqp3wsk{P-m=utxEr1Ms$y-yjze{@&@FGX?+t`J2zZ;?VKey{KWG zDfs`n8=vNSJpR|Z_G#q*_s+iVwPOEwqi%h}6vnSPZ=`3Pv47Q-GzI^qZG<@g4{?op zE;Q)>ztvca`CQT@8wRlPQesGbNG!wV?GEd2gd^+-!$^??aQzB z{k53F_;t*Us`9V8lBVFlw2h$q58V$g0=n+_y`kix-TV2a?|q1Lzh(7j6g4ZK%@%b- z2Y`JY^CtR*Z=8aEZ~kk(5XpK*wAqyXSIs{=7SqcA7L03oG*(|c-4~`je($PE{_~Xm zSM5JkSJIUIf3|cqF6ewPw0l3d7GU4bg@1{x|A8pF6X-LzY0W>`eHJ(sXpPzRK%f78 z1#AyW8ae@`;gy0u>(P1eB5*rUEcy)Y6JTpFw0n(RevD>g{VRqofySt@YRq?li@|%r zCZMFD6M$juYg6f_DfsvK*Rx*b!{a_axGDJe=5?=eEVu$_E$Z2ruKNcA-3JZr-j7rA zmx1VL@SZ|i`5AnvH*^5_C~eosdM0f&?eqU^tUsOejN<$MwP^U5!`icuf90g4Dfst$ zk2P@=&j)|}FPVaW|NLdU3jYhs!K-m#^0tv@WB&Pk?-k-?*IpV3kTU4zPFGKKu>S)Y;iVn+cz6F3mO8T=X; z{pS??n{DygSpRz7W^_J+o_Xro=PSV3!02>@p@&}{SJ|$?wAa6mvC(-5`n=%<0m{Ko zfzg|XP5_3FG~@6af$sk__w@Wz_e6JslBVFlw2d$u^DjQ`x*i+pyBH(wQyBj}@$rA= zuz~A&z@w(%-@BZR{OkVuG9N^Rto!lZ!O+7WIkvK2foZRQeYW>Y&_=p0Z8&rSu(>JF z{dOIF*EdYTzc)V{^DjQ;_az{$H9eQn+#G42!uVxh-vQO$U)R4IfS!E_Iv-yIP67`H zL%Wx6PqUSO%|ShL(RuKXK-U}{gQei}U{_EahoKW-b{qJ#*T2TK0eB1eA<(_29e>GZ z0bP?dFNYp}kyGq$0Zssy0G(@fucc%09-uW)($E2vhF1zRGXJg{{4R3ntjsBU>#eco z8keuT;TjvRv2&ksJ>}px9Q=>3diBAt-Qjgx@BNAwzU<(wpZ@nRdhH8e`{u0|(zN%} sA8f|Ivc}dX#(b@f*I4-k@!9)6XV3lie%9X4e8xlff9l>(-}7Pr58ZQIPyhe` literal 0 HcmV?d00001 diff --git a/q4base/fonts/lowpixel/lowpixel_1_48.tga b/q4base/fonts/lowpixel/lowpixel_1_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..b143dafb3022600690c11fb551a711826fd94f0c GIT binary patch literal 262694 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 KGq>7&o&N{fySIk` literal 0 HcmV?d00001 diff --git a/q4base/fonts/lowpixel/lowpixel_2_24.tga b/q4base/fonts/lowpixel/lowpixel_2_24.tga new file mode 100644 index 0000000000000000000000000000000000000000..c5fdeaab7adeede4751ed2b680ef1f0ee48c2b51 GIT binary patch literal 262694 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 B{@DNk literal 0 HcmV?d00001 diff --git a/q4base/fonts/Profont/Marine_0_48.tga b/q4base/fonts/lowpixel/lowpixel_2_48.tga similarity index 61% rename from q4base/fonts/Profont/Marine_0_48.tga rename to q4base/fonts/lowpixel/lowpixel_2_48.tga index 2f673403158c9422c618908612b2296f9e5a32ec..894c4b7c7186a493619b6c178ac7c9aab793701d 100644 GIT binary patch literal 262694 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 b?eNwew|@J!Z`=0G+rQ|Y+ibht)*JtS4MLy- literal 262694 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°9VS!E`1W3cH4amGwReOOHI~ISKDC8+$Yt` aUh?vt|7N$B?zYE^xBS~(cH4dDt^OAzb@siNaw*cQsCY%XG#el(s5DVfiJ(Xl5+X$s1%wE;;3Yr#L9wAG@Fy{e zzY+zF3ewx9hA2fus*|Ff~V)1!xSED`;%z4(x@;~pX zce&4f`Kj6@wvba-u@A^O{1$Q54#_!Q%{K(ab#Ov$aQz*A0nr-$;!0xquYsP495cna z-@lr%bd?WKcg~b9)E7179IxgZyx$7UbNn{+^~fO0e+~3Z!0TjcPKiJ%Op(E4fy<0Ft1@X`X(A?gL`s3 zwk;ZJAk-X)$s4F`)CD#kRqPx9c`SAw8~k&DP>tn(qZt@qCrlX6aV0te!r0vVZAVH9 zAp7C?BCEGt#{)_bMM-BP;^{B(qINO=Ee6m)ML-R_VxO@n8k8H7pm?Geo=8Xc*sh` z2=DESae8uMr;+9VkaN@Za7-Mp@g&*+!n(P4?K}^Z=)SJ~A4WeMcK)+GSPGz&J&W?q zV86duZ|hIQw%XLzRya;Iuz2x`4Pt&pWW42n2zF-Mm^x$^Mwb7RJNGH_|M{H5$D*zB zHmJW0+xKaU8uIUei}#yR_UOntUd^{ioRk@0vb(WKq~3*+4lLB-y0JrM0Z zV+Mdeo37Htl`_l!Y-Xt&M=;OYdG1Ex+Kz0$rd%&!F-gz=dh*zd^^hctaQE&n^le%$IY;n#VXB+9pk0DYN{~b51IzM9l#4Es4HoD=|{cZwUAf zL??cBt&{;MWclAU_+!?Oc|Sp!`#T|5pL3zj?F0D!$3jKNXU7~~)VvpiizQaBfd1OM z(hUDv@bXcEnKsgSg)ILwowHPKVcy@Z%ss{Yws$kI^bH(kTYwjUHF{SnKfBNar(^jp zweek7{uY8pXLR9b*E+ReAfMLxkNEsKW~>_d{i=GZdC`nQ-ue3zu)$;euOmLN=^-%R zdpW;k)+vk8BWPSU6-Hg?fq$IKL4V_ezj>-sTR#&2C3+8TbpiN zWv#zr`9Fn;G!G8Gq04^QE6J$xpYOe&R#_dsaw=3%=g`=6set|sA8N0Lw*K~NskWqb zS2emyTbpj2(<79Y|5Kny^Wfkcx)gACqEY2Pzm-^e^${!f836Y}51I2R%B2L3GgEbz@>UhDIBp7<^tne_+3Y-69#fZq=0Sf{5b zJ51l9RhPb^NJnj*f(O!lh#oA_hueMq+S+vEBGFs^Pk|%NgM)AAGKT-q%1wbGU4}s$6ESMe@+^SJhL25V33dp9*Bt zV+aHYSpElq*rp*cgAlO%pFxvtp&9}K0+#;)Ahu};%pe3T|EDG!IB3-L`Hy< z7ChulM__lJZ2mY#SIOtc!m?|FV*Jvd7|1{%}H(mcKcBwGxQcr^Tt2F^# zMLp)P>!XybLe6(A>WJTL6z^D~9LT=!TRC<`l-hUTXlhLSE`+}YQ~BfD%B}AEiMqOm zgMP_lgMN)H|3|QBH1HvBy8o-z1jZEgnA@(8QobMZrnD_O_SvSaDV5{@9c3!wyJ2qy z*W%FB$FBN0AIsA6A3y}ubp5N?bv1V>^#(Efn@!{I%fXm`FwocElktC!Hl<_GQPdT) z@3&$6)=iBK&~Fj?7QY|q+sdsDAARi9H5~M-#-xfTf~y_>Q-K`O6T@Gd`#O2VT(y1# z9Xy|B?u5ka?H58JwtoZ`^~LP_Z5aP0L9Z{m9UHtKaW0tedh`8bmREqE0Bdv{8hlgP z)#;zdmjC@TNlbilLs?g( zfe-np^Zy?dU;Yeoevc*5J`nb-OKvwM^!=5j6f%C#)u&gG@xH%A&p`Kx!et#Vm^_UOAy7R~Kd74CPLb!|60NMWs`#Ngv`@Uf; z^HidBAnemC$d-`?m$GGiTe;PPSkyHf^s6vQ6;A{|JN~BvIie?qzc%-E@`$-={RBE* zuK00X*>8E2(*J7Wci4P(-=jBX-*3aXk10Gi)TwOKFO8P+ZRJ*n(>`XF|NXPr^!TS@ zm)o36{`7}kNt(v*ucM+a*>SR9-MO*+UqTWU_tDV6ewRxfAbWk;?sPd*wPiT2#rEzP zBN6Wn*4iIu2l&T(nT~mXQzO@>r%dI$W)yNe{-**tq9=ww+Nzuyq#iM+>C^u2_?tbu z^A%tD{}+1n#_aoT;kd{)fA5*kCwRPH7rY~wzx(n8SR(#bx^F7Gy5#gAvQz;@Y+C-O z0y&~5hCkYR@~Y`}#GIs$*U(Q2e(<^9(w@yf7Wz=c^MW3|G5da7Fz$8OJ_`JOFz-e1 zx6Ya0P2NXDw;nnXTfV96>OJ1J*hm#n#I)sqDv%?3V)&!2C$E}rN6bn3w0nDJ1on7M z{uDT*=O9=aTJf92zAr02{EcAqJf-iRe&3jVzYSw}kK;B)XIt^%7+A#V+sdupHaIsfRXk3gP>wtQ z`F@AAUPGDP{|j)6t&IRvURU2G%soZxgF~!&elF3!LRj^U+4tKp=3q%#OBt_M_6IYj z!WZ9GZguBlS*mL|=r=INb#ZI@DIW#Fjz(*tp^7(BSFsy~|HInQf`^>{^Dh=Z^HbtE zF`ojRn_yd_J0X;8zftN8*?r)F^A2NvsOY1Z?*`lmz7*`g|9d939iN6eul4^F+=o{T zhjF*TUmss}4WnO$t3M`{|Gv(!p2|i{4{U0*DH?o?v^vidM2gwXrA>5vO1L@-EoRC! zik`P&kgxM^6(#=^^mAi)5B@jGn9bdorr4tY9g41#Am_b)XSY?^)Q@rW3u0SN!GYqX zg1!Y7seG1nJ6S3lF+H%Q(Yw&lWZt!RSDuO4&81BX9&+9f*Wza$YBWgxFHn@ku>XNF z=A)1gv^LRS+n4a3pcZ>$c`kD-`4Pm&cc?U40}XvKOFG-gB;8KdM&F=gw4fp9F`zGQ zLAE_)5-l3kmvQu$94}>uq158%xvoY_$Kt>sr<3PRyjLC)W&BMJ*Dov&2?vzh7r8Mp z`+ghxOZKU5HK!|5GH3o$;UzgPXAC z9(BNLM1L*+-&ErR{aPEW5zmi2OZiplU%-54NunDe+z{N;KUGAbUVl54jhG(Ti_s!9 z^4-+FdpnTvc{HCFJ|6PW**f{`wI36q!-y16Y^=;)=cRqThHXklVJ}12x zd=~i3RPj)k!po+z5z_K;-|9#-> z=ikj)7=X9U`1b=p<;k=vG2;HRHtw>|HHxBrosOE4Ikr&Iaj1)}t}Jb=jgsFG4NJWC z=y_INXMddS@U@sLp(M6DfKLYh1kCHSr@=jx%J&|ny&E~?KQZF793Ib41M~hCbDZ~$ zc~9UG@a^DJ!917jxlfo1qb~KpXN{QujGy`OAuz9h`Ci`RV6KPzz-NQ^2RB~#=*#_t zM%6w99kli7m9O?o`itshbM!#0Xx5{vZ)`|&k!&K z3;{#H5HJJ`0YktLFa!(%L%Hw|8xi}nV2SvDL0<(PW_gZe ztmJ$tv;1$if6ySDl>A>30i2};5s~wM;BE(=iTS@0;=W74hWpT+!NsvpJ`X5IcagGR|L~gs_xzWl_b&>0oVy%+4){v&LtvkHe?X$_7L^Laoyx{H+k`iIv$ik?pi7ogY# z9L_h7f7^n2e=A1W$Im4b2|!x^TcZEd%9z_A=XF63UM-g8NQWq~P%OpY6I&Rov^~;b z1~ex5+d_sRB4xk+;r0I&J)gSQKNoGW`R4lgxiX&O?BnNhiTRH^#<-ahW!W?T5X21U7`1cj(4;13;TifXKSIT&bvyXp({O38(HzKj_ zg*FMFk>~TE1|u<9{ws4D%(Vt#_Uj*x-=H`z9?OEbx!&g~<0;NQ{sHoTzet=XpiRtu z%5$ekT$cZldG+R8gE0H`56ACOoL}9GPhH#Svy3vH;_TyZnE%`tKBdHYG30!Hs$yjM zpDzNjc^jY&T}8@%{ln`=MbDADkgIDtXj4>7i~L^>!QH3?crWB@f}=R)yZWa*Q(~id zkTsxUkaPTXbJwt)SV=Sq`Oo)zB^qSzrSX(yA3xWo<~-!*f`6j4KLh#JV0GQQww%|0 zP5f>R@EniVKfG7OXTeW``HmAYcmT|2!^eR)1NY&PbNqt8eBQ--;+KN?{yU%bFjnTt zLhuj4e+_on#MV#t>mPCO9X^Tt`1HI)?AO2MIOIKZi0x`VgZk`< zj_l*FS^rvSJO*fZ^vQEx|26S%g*YG6K#0gMLtFLiIOq7`C+BM^@cH0DiRT2biww$s z{loX?6#rL&yl*WFvZa;r6lWiQ&HC3uGSAN;FB`| zrH{wd1rur4zJ1}4?AJehp<9Kee*m)qwM2vng5LU8Zh^LwHW2R{s)Nvam4y# zFprbmFYunIcI-e?@w{Yplv#%l|M(sIZ@@9S6OBBlIS0)5-}x)&Cyo7 zw$bNR5g@XUzh?dO`j^LfZ66tZ?vHWVAOC9N=hX5U$GgGOGtRXk{~lPQ;vPxPI{-Mo zkLEn&7lJnehk3wj-tEBGgJYEa`iJxUeovy^Aq?Y|w%;lZE@j!rU$g$*Jn@Na?Q zJNNl6zF0ZY@4q8PZU4vTx_tK~7CX=X7J)UIF8NOk)&MitB|00zIbad1oYy~nlL9Jb zdulNS@*Nc&_po2i1pl=2-%W!U#kobFd0>sQU;l7CcKyS3{R(gx`x21xy!RGxjIxiv zX8pV4zl;Cvkzfx)o9ow8=DhxE;@?t>DUiQf!G+fkS%(k*wEJJhy~`lZo_Q_X_->R& z*{^>%UU&cVdGxszya0SY_($NT&xEs&zh?c1`Oo?PDp;atA$%>kZ;fP~0B}wUrj)HC z#UseLhBTU;bNp~xySFRNec#+-d6-tH`6w-D$lnXD@+Rl? zUvvCVkpoNT96#ns`~D@xzAyXr@2}IczA?&U!IyyV1M?mZzw3Akd?%RizJCbJYd*Ke zQ57ls_=i~kya#%z81>ZqWb@Eg;FI(EA0mD?_pVf+SUe}^_~A6yw?rwfeX?Kw2;9xz zFr|baW!cA{aQ&u|6(2b-hgBGKC@r{4dQEp0n~_;ef$a6 zzlu}V2>|EBnVS->hC+?YYg<;)v50+gCius96eQXl!X~k6&pxR$`}N;2#yT7rt3=ty z&$THzUdjf!{#7x`dHvVK{~F++#^trWvcxMac)gf)`0($B(CKn}clzFdcTvVuoc;Q5 z5ML7vGzhYfzh?c<^!)$phU;S=WdWSe@i`Ox<8K;CbUcJj);{lUbI;-W;L(XSiF9U~hbDziSgS)^nvi#3_ z_AUR3Kx_efZI7US75H56zS*;{4JCw zWci=-~IDa>1De$D^Kd)_0lLD!cJ&kt03$BsnzvX}S2xyBJa-RRZ0lYBMCu}+i0)7)) zNzg~=c8BheV${$3&8h*`QAIf5qt=I6Zq?3KJRqcOmzO| zJU8Z>Az%m?0)~JgUh88F$4?&B2bh6 zY<|1tzpWKRV0t2e+`bYV``?}aZ23Pu=iZ_+1en|4<-p$sOLRSi29zOS2uwo+nA;_9 zA|*d$zh%3TAz%nhKLpC$=RSbX`!t#}{UW!B3;{y`3Ga^oEHzqwCLpB+54rmvXYT*M zeGM}H|F;Lh{GVw2|EGL+g8vWxIPj)mAJ?LuGlqh{eD1RYnDOwP5dQD?UxWF-?nwOq zkgW56;N1W|1I+(@w=H-MxF`OcV|Tv6XN}za_r!$G;Wqn;B|G%Gyan-SK6fv~50Y6=?@|f?A@u&_(U%==>Z(F}cIW7{Z<^KpK zB8LA6%*XQovWRbWO&>*v>~o;>ae0*Y)CDwP`+n3t2^5LT@_z&q7{h-A=41KqyY>h+ z{u_KQ_)_rg;280|f%gqY5khMl^bdRpI7WA&@e=Sk;0wT4fqw~((YOnk!T@=TY~+V{rdW7 zJ4G5;%64n**a!zk{I~oc!92w9AAxzUXN`D2YZb7+=EM4uXunQT@Q)muGnKLN8HPl~ z{tFFZ%>Fj_i##Wg=)|03cfLuEmom$L2U3S+4F3+zR;nZRKa4hit!wpt6diniR@uq1 z0{?iQQlqudpvCOV_f!;Ilw-`HPm1ppTmFY&b+8@7zXNl9DkJtcLz}BWeoog%~q--_E$%nzs|M#vWkvH z9G^2aj8BW($%&IhkL4V@^G$NRlv(~ekUA`5_;+ZwQXR98Hn+y>N=XfWTdA^>V`YH& zV)3sa1rOP?ImR6Nr1(y;<$nlP2ir0HJ22O$GG-rbv32jaX=<|mhC+z%WsvdRg|ooC zet8o70{Hh}p3htjJ`wyzu#2C0B2pjN845(lr-YXOBbcuk{v$BYHLOw7`H$&XdK59V zwSmB04)dMmkAa`kz!2o$fsD^bEdK>?C~7+|U5}${9@ABcX8Qa8Jg@a}(&~H$rcu`4 zP{C=&#Ag8C)B>oH{}}CjP9Rd(>o|pe(eWu^)BXR%?f(#-zm_!!W_teDJ^ObU#=fDR zn_`W2rK4O2AJG;-L;07reqH&UQm^Jaf8Delks-~Tu{z{#I;zy3)DKt3zWZR&gcfq#5QS)#)s^ka73?!DPM&0K(O>I znBPwP4fr{*M5pB%Kb-aFQu3X$aUXxjZQsX*@4@kW{sJ)Xf%CYj%{!Wk-_j~_DAzSW zzu@N+bXFkV)ArX$tiHD}z7XXcyYo%+9de%kIpSRNw_h&-^Y;??-h+l6nhH9=*~qPg zcm8~q?)DYq&cAWnXP&nuo)Z=r=Qj7gKk!l8hgtqFUi|lMCm-YZ`%f$TSm#uSZ&OA08HZ007@e21L- zz7BYnaq9{1k|F7U}MR_BlNuPjlBH1_;+{&rc4kxvQTF_6ddzXX35{Btm``}j>9 z?+^2LF!}#Kjt6fJ_VXg^H9$<^uYZk;&5D{l`**SKTa5}TUCvu7-GR&grknpIA>{F# z_j+#uGsn5#8cf)57w>^D>Sm|73~baTg2Bg_9@oP5k0*Hh13N`094N0rH6 z2lA#d9;E1)4#)qd7>NB+&Q(fXP3JbHO-+}!b|4@7{--HUv3^?IImqER-%*rkO9;g^ zEy$0S6i}8!jCDR}zC-Sg|4nh|>sM!cT~#8nchKCOHu8lg7(#v>?7?mH2sIYvl&TE~K zA~9J0cZ9jGHip07ud8~@KH8>x{`1@Zg%J$c#P&9#v z7)ZQqN}M%aG5obLDdjQyXq)c&&-f0AV9=!LZmmgWC|FAMCFU%r0QTA-h%}3O;e*Wh}3|}>B z`uw}I@xGr{Hw026fQ9Swp5?yah1z0nAm=_|FL0$ZwZC2Hi^OI5-v!{NGaCfTT;+RA zpNZtbpiTUqqSyyy6KKSdNN|?_5!|e4@)0QW^qr9$Xw$^shh3MtCxIdXTK-SM1e%Yn z5y0B#cMo?)a)8(U{J%d7z-NK^o$T4*Yr!voHTnlMwDxP11GNAkxBMUFM3}9SBY-vj z24(&8n};L8%Y&=y`Jm3d=@_5=9l$ z!SX+oH8Ne@z{2DAJYCV;Nx&@)0#=A$bg8_s1o-}_)3bJXYerSh@Vi=q)FUk|YQNF&RGcj7m~sbK0< zPb9R}8AAisR17;l`FwW@Wai2n%wss$e760tFu6yh3KhD!UujCo*8>dm`+kX5f-uBG z+Fnu`3>p6?aw?cQ)uZ@N@dk{chWYKJM#GLzKHr@JnYnUIQr%pJ?SG(5>_(|Vh5q@9 z4N07QJ;2E2k|D^}28Vb^+dRjWi2oNU6-=G#k(@7OyD)|tUarIO6LJ5v)5%Gwyk;Jy zc|Km4TmDawWL`nne8Gk$>LUNYr5M`^atV`AwxKef-v}ndsY^wQ{}g|LG1TxT?5NN% z@MS;X}W=D-CTz4Hwp9ldFn|;icf;sLexe6e?&2MgyLI>(Fc_ACvf~Ekm5hZ zPk`40hcWxx{6I#i;Fg{;pz|VKbJIQ>Ovd zC`YjV{MFSD6~OroWJ^&`DpGtBOc$aq@}KMYN18#%xgWR|d=Z%E^cR4y0^bMLh~NGe zzZ;MWr!MtqK|ubr*Y*_Z*MJ%S#o&9uG5SQ%IOzD#VSJZiTmHxQ2mIf@A$=QyV!x4U zVw}F94DGt@F7lu8{E;(|sO0}qPKr}1yd^!6m`{$h#hPwMBhQ<7540_9j)9W9$z*LE z8)jTG=UXTuo(-ALzJ4#n`KNAt3-jU-r!Oc4(}k$3{3k9S(Tol#=Q%=gj)YQ-IX7V> zK0X5(G>3WL?rn@6%zLPH*9Yj*M_+=Z^ZjR^)e#8BIrk3J2IYGNC^)aHy0NL^aQcE0 zn<90Y|6Ff7fo~Ko*9&=mdn~xhebiII)Ty3GXng;dbN+)!AHRv$N?bcd?v~~2P~HM= zO1y7cVc2EhO&vsL&AHY;77ojm`W`f2^99|BlZUvvvgDS7R(0k~TC!`8=% zVng4xdtn><<5R`q>-6fVie&kp3V74QoaV7ky3g$|zMHYJA~?xDV4ScwjN!9>@MZlD zlsqr4Fh~`LuhXleDw5@YD&S3zTg$6qrQIp6wiktGpgITa#N4!{FmG@}FcR!Pbq4?x%hov3=lOb=4 zgthnSaKQ!JPhy+zG)TGANH$K?8~DxlIzu`Yg1*>N#Ubeq9q_i3=YL@TrPw|Ud^(uV zsoZlvR4ZD9+F9V;!S0?2pMy!1+}~8VJ3VkZoZDp}+Z+7K!H29fq~#II*blll%OT_>PA7PDiRZpkKl)^uui@&!^J`Y`^(np2YgIszC2I7kT5jAbRDjz2p zHU6GbMfPIl3T;fPI28RadeB=-o=;Fe5BzkmnSr)=?7vAFk=)-@xH~=Yn``wT#s9YA zOQ|<^qK^^gJ#Tl-gQ`deLK@T2*EUW}BEIrHh+hj49;J;*6^Ei&nIX-S~FJ4 zZ%4`Xd@lGbFyB?>_rKaXKbk5^?r$pGogR3~xxcUSxWB?2;Q8$|vNbYYc+?^iy|5mU@pF+b+z<%7Wz69j&0P|j;M4xjuaxLMs zi$yDEqtCxf!FjR=QGW$k)6pXzCl(POKj+2cs&}En_-;YQh=W9TGW>V z*XkQ577_n$^I~z;6C?eTg`wDRK7?iRe1d@|LnGz(+9+%16MgvHM5E;XCIh}y1joOt zIR7Tdo5a7BGX9>_zNXgKFg{}NQZVmp#^^uMs2(rTR$!SrhC%c>AA*w4Z6(?XLUsNJ zu^a2F*pU38EO|abC$HfoS_48gey@$^#~LN~H-=@KHaLEb;`~~WH;JFQA<>g<{2ApK zINc;Z*Jo?=ue(poXF;yNSdKEj(3axc5s-((?;e*1i!o51iWD0ViEhQjuQ(d z-bU*T^3ldnK>^G=yq>UdZ7=ll$K=vFsq`!b5icP9G6g#0mZaaBC zLGf`;xlj_DtHFHkbtah4|M*)s{Jr3Z!F80}-&D9eJqSR0=aX?+{>wSQ=cN}Apa|WH zww1trIplC3M=AKTj}QaTVQQ~^Q~59WM9efwo=-6JYOt0AnjgMgJASfHa(`3d?)3P9 z1a-@QA%B4p*XOF>I|IDJO&%}!jI?JT;BX&D8Tx|lZ-GO)5`rF|rR`MyOS(gcyzS)q zRNDWzXJgRnL6HH;{Y{0t(*xh1SNym9kLST_fE&MyiV@E(dveL)K8`Z*Whrd)S|udr zLXXeVb}IiR-JwI?cJh2G?ekjx!(iU`9E84#&K#>za(`3d?)1R%rxfQc|LgPM-3oTT z`2E6#@Xfp^af3MvwEMET#LH3(>~)JX7<(Hf{kM z-Vf4f**5bu$}w>KZpHbg`Oj`uHD>S@CrR=bTW^Nrh8adf+qf_ej+A{U5GtiJtAs z=Tv&(bes8>#&BQBZ=_;$85);P<$D`Fu)(Q>(vT8VuRPSp_OM(=a|Q?ohrS^u?Y95vG#` zH%2D%;{7O{35fSHnG0cD;&v*h6?=he)n*sRf1V3z&;Q<}_~&DCWaV9N3@qU#9;J_|w&h-pVx-5If@=DUA~o1nTCK=OQ8T8pgHPmZ{=UY=*wM?Jn}4vEJqk z1m#b$y%AW#gZs)4fW!NP5Eb+<_?rr*&h)^?*G{=B{yhp(?YlO{&wHiX_Y-41)-?eP zzH?qjN=^Lgst*EXysLqwXTJND?b2HBlcn+zHs^zzQdjx^&ovJ4UdbikbHEpa`D}pq zbz{We21o@{XL{fx&wuznqeeV8x&iFR&uwkL=k)B*nbV0B!%?p5ky0YpTd6^yjQ7uk zfcef}aeuPx!+ue2<$y2m{&r?d5P#F_>aLU=>jO5 zomZs&-oQu3K2qxUVssJ&%6Lx|0=}wjV|yb`e$rH|l|QZnaTC_`73_2sB?y{UD;Mf@3sDY{bniDGml zIx-?5qI|0o=@yVzYqm)}mCLX-U-3y2cbWe#{*__)gWzw1c@O_yFrSUM`&`eU&VA?u z;A_FBgSr3Q8eE+7qjb7b!PJ=^-`BFv82%7^Eck3N?~OhRX57qiUiWkRZtxXg;&d>0 zeQ*^w>$%aR*271*=wiw?)six-}TPT_uhHe J-FDjIe*w;h^H=}? literal 0 HcmV?d00001 diff --git a/q4base/fonts/Lowpixel/Marine_0_48.tga b/q4base/fonts/lowpixel/lowpixel_4_48.tga similarity index 59% rename from q4base/fonts/Lowpixel/Marine_0_48.tga rename to q4base/fonts/lowpixel/lowpixel_4_48.tga index 2f673403158c9422c618908612b2296f9e5a32ec..288568fa73be7fab10213071213c81027eb2e0f8 100644 GIT binary patch literal 262694 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 literal 262694 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°9VS!E`1W3cH4amGwReOOHI~ISKDC8+$Yt` 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 M(bIN&)-GH9e`PXwqW}N^ literal 262694 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

toWkMGbv5pt8^^UATt#K7uQP4|yA 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 ScKyev+<%`Z?7G|IxBp+MpbCuu diff --git a/q4base/fonts/lowpixel/lowpixel_6_48.tga b/q4base/fonts/lowpixel/lowpixel_6_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..184ff5c4bbbe7deac4c6d538b53ae78ce9c10c10 GIT binary patch literal 262694 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 B=P3XH literal 0 HcmV?d00001 diff --git a/q4base/fonts/lowpixel/lowpixel_7_48.tga b/q4base/fonts/lowpixel/lowpixel_7_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..5291554495b99af3dcf73c53b0ff2c9f99e5420f GIT binary patch literal 262694 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 literal 0 HcmV?d00001 diff --git a/q4base/fonts/lowpixel/lowpixel_8_48.tga b/q4base/fonts/lowpixel/lowpixel_8_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..b84eab6b7db4896150472f2bb924464780fa1401 GIT binary patch literal 262694 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 m47VCCH<>{g>)rQQt$|J0^^6-Yewn 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 N(Wg9n;|a$f^M9o;kIn!9 literal 0 HcmV?d00001 diff --git a/q4base/fonts/marine/marine_3_48.tga b/q4base/fonts/marine/marine_3_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..88e725d0692fd6e95aad6cd77dd7048a60a3ed9e GIT binary patch literal 262694 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 X&F|jwom;+b+ckFBe9NuhyypK0TlN;4 literal 0 HcmV?d00001 diff --git a/q4base/fonts/Lowpixel/Marine_2_48.tga b/q4base/fonts/marine/marine_4_48.tga similarity index 66% rename from q4base/fonts/Lowpixel/Marine_2_48.tga rename to q4base/fonts/marine/marine_4_48.tga index 8c6ea38d2dce7e9a4b4716dff4df514a4131b12e..18ca4b4288afe7e4743154b9f16d3ba3201b52fe 100644 GIT binary patch literal 262694 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 CMy>Y% literal 262694 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

mi~@k3ghWbs8FB$4kYq9z3Qu-ciA=-jU_Ho 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 MPCjz|h9eI8Kkbda*#H0l literal 0 HcmV?d00001 diff --git a/q4base/fonts/marine_2_24.tga b/q4base/fonts/marine_2_24.tga new file mode 100644 index 0000000000000000000000000000000000000000..b42d7486e02aff9539f9769df0a8d6eab1aa7eec GIT binary patch literal 262694 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 N(Wg9n;|a$f^M9o;kIn!9 literal 0 HcmV?d00001 diff --git a/q4base/fonts/marine_3_48.tga b/q4base/fonts/marine_3_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..88e725d0692fd6e95aad6cd77dd7048a60a3ed9e GIT binary patch literal 262694 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 X&F|jwom;+b+ckFBe9NuhyypK0TlN;4 literal 0 HcmV?d00001 diff --git a/q4base/fonts/Profont/Marine_2_48.tga b/q4base/fonts/marine_4_48.tga similarity index 66% rename from q4base/fonts/Profont/Marine_2_48.tga rename to q4base/fonts/marine_4_48.tga index 8c6ea38d2dce7e9a4b4716dff4df514a4131b12e..18ca4b4288afe7e4743154b9f16d3ba3201b52fe 100644 GIT binary patch literal 262694 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 CMy>Y% literal 262694 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

mi~@k3ghWbs8FB$4kYq9z3Qu-ciA=-jU_Ho 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 MPCjz|h9eI8Kkbda*#H0l literal 0 HcmV?d00001 diff --git a/q4base/fonts/profont/profont_0_12.tga b/q4base/fonts/profont/profont_0_12.tga new file mode 100644 index 0000000000000000000000000000000000000000..86cbdca633fe3daf94b9602afeae7a132dbe4b66 GIT binary patch literal 262694 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 literal 0 HcmV?d00001 diff --git a/q4base/fonts/profont/profont_0_24.tga b/q4base/fonts/profont/profont_0_24.tga new file mode 100644 index 0000000000000000000000000000000000000000..4d323fee1cd624b98a0ab072fd7d5e1812b29242 GIT binary patch literal 262694 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 literal 0 HcmV?d00001 diff --git a/q4base/fonts/profont/profont_0_48.tga b/q4base/fonts/profont/profont_0_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..ee80cc8fd23d91c712eed709978a4d9d9ba693c3 GIT binary patch literal 262694 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 YWUrU5c+raIKW~S9pSfc1y&nDl0VCO)c>n+a literal 0 HcmV?d00001 diff --git a/q4base/fonts/Lowpixel/Marine_1_24.tga b/q4base/fonts/profont/profont_1_12.tga similarity index 88% rename from q4base/fonts/Lowpixel/Marine_1_24.tga rename to q4base/fonts/profont/profont_1_12.tga index d099a78891a2247517f9071b6d30b91479ca9426..bbc585c3bc6cf9604a54c6b44c1e373d05046dcf 100644 GIT binary patch literal 262694 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 literal 262694 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 AU;qFB literal 0 HcmV?d00001 diff --git a/q4base/fonts/profont/profont_1_48.tga b/q4base/fonts/profont/profont_1_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..71d1e3344bae9866cba77ddf48cb739eacd66505 GIT binary patch literal 262694 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 C7C27; literal 0 HcmV?d00001 diff --git a/q4base/fonts/profont/profont_2_48.tga b/q4base/fonts/profont/profont_2_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..b7c881db148454103cc729d36d9da0eac49221e9 GIT binary patch literal 262694 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 literal 0 HcmV?d00001 diff --git a/q4base/fonts/profont/profont_3_48.tga b/q4base/fonts/profont/profont_3_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..464c33f22da7d7a29dd94f133b1eb49415c8ddf1 GIT binary patch literal 262694 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 literal 0 HcmV?d00001 diff --git a/q4base/fonts/profont/profont_5_48.tga b/q4base/fonts/profont/profont_5_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..e651c445c6cbdd693cc1c6a7094896536c5b7e46 GIT binary patch literal 262694 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 literal 0 HcmV?d00001 diff --git a/q4base/fonts/profont/profont_6_48.tga b/q4base/fonts/profont/profont_6_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..baf2e80141ab485df17a2a226c54d6a6e5358c6c GIT binary patch literal 262694 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 literal 0 HcmV?d00001 diff --git a/q4base/fonts/profont/profont_7_48.tga b/q4base/fonts/profont/profont_7_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..02eeb6cec8b3524eba880f329ed9cfef430bcb79 GIT binary patch literal 262694 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"T6Z22kibCB~Mt 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 DO4J7; literal 0 HcmV?d00001 diff --git a/q4base/fonts/profont/profont_9_48.tga b/q4base/fonts/profont/profont_9_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..3d804561c53bc94db2a9187cebf8ba458d0d2f3d GIT binary patch literal 262694 zcmeHQZLBU;bv_qSE-2y$e#Q$|gQ*{}KiZm9V@+FyiqO_5H41*Bw2)M;UWl=#H9!Tb zs1y)|_?2q47{tU{n;;jwT8*(kT5Sa{Q0YOgnl>6LZRJvh)8{$&o!5Q#tUa^e`PlEC zcRwpxXJ*!3d(T?WT5Hd|GjnFv)(%~O#YiG_d=SP}xL)uHJC27C|rNbr_UEL-|KEi%t^n^3j79M! z;O<7Mrw|YVqae^wvqLrUJ%D=u&nVH;phBP@0z(yfU>v>wuU~l7TL_GbK%j1i5bOQF zqef1H4}ky@y?SqrzkD*<-U_}6d?%RSxwr@XW$;uzkiFm#1CE$5}JL@IYzx(~4HvH z;M6SZ_*vj}@FK)(-+bo9od>2~|FqxrXOQ(Vo0i#v_IR;BM4UPcv|9eIaoCjGUlhJNcD zFu3sp3~2aHk?MZ{Y&Asw2q4$_yqZs^K~U9p?2>(c?hoW{=ZJ=DpR=y|&oNlCX>bIb zoOf5d=0C6d1?PaljUQk@*J)?HtN)F2i0#44mt9|nSl^DpJ0|qsGput?H zo%KHc2j_r+Ox7?$U@!!noOf6I=Ks0wVAc9yMr$A;AOr?MpsG!8*|+}Lzea-?tU-i; z5Eu-BT9FP9 z5!U!ZAYTMj|M|v7mI;Be5h%U>;lK5~&SwI+SYr46e{X@plLBLo9ZHQa1QtfXN@&Q6 zx&Ifa)kW&xhmikI@gDGz{@4o#M;(N~$O!n!JKI+M2Y^{XtoQ$qoVyynKLUY#R{aNn zSx~I+|MX8$jW8ktfqYi|2Y~4y=6Qg=|2JX|Yv}F>1oFA``ad4HoEgbyL+}0IAA&=q z@BemBQS}@V0VJ$-{d*MIh;DQqdO-h=z*zill102G_@vH8s-qAX2?6BgD79{lJCX~% zhPCYMDGR+z{ms1$9jSA`SDydH(*Hq`--7!G@Y})1fz6y6$psDD1A$Pi#*p_gbF{7_ z_{sAC>;1G@%kF!2R{nP)u!B4Bk?O~?6j)XuJo5SgFio#D_tKF<13^-sKR2S1Wyi}FK&afxKszI$!!7HmI0 zvhU_T^7DSp@}2kUdH&98_Jh(y{3j;-CS2_O&o@E$ePHW55)g0FW%!$;`^DSDxJ2+F z(D^Xfr+pAS0UR?%mRNhXKNZ{G0gpmC0su#&Vi%#u@4j9d0Pa4>kIB*h(rt=}D{KE_ z;1GQT4N*CiBi4@Xto*!@lzhd_VKh6PLbUuX9zInQxT;4^TYkNed=azqfeS4aN}F2poO8hT7M`?2&n$czW*7UC(>I@1XTZJ-~U|Atd>`? z2&n$czW*7UC(>I@1XTZJ-~U|Atd92z`5(G|&+9^bHkQxF@fjKGJ~_mja<)^C`s`

+5P3+DZx(Er3(`QpmhkNr8$ma%h0z%|@iSN(gj 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 Kt3}l67USOr=kwA4 literal 0 HcmV?d00001 diff --git a/q4base/fonts/r_strogg/fontImage_48.dat b/q4base/fonts/r_strogg/fontImage_48.dat new file mode 100644 index 0000000000000000000000000000000000000000..99009c1a72be001d1ab29a125bd61ab8d63c1d5a GIT binary patch literal 20548 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 literal 0 HcmV?d00001 diff --git a/q4base/fonts/r_strogg/r_strogg_0_12.tga b/q4base/fonts/r_strogg/r_strogg_0_12.tga new file mode 100644 index 0000000000000000000000000000000000000000..5f2ff623ea10ea9bc263e0e74117e6f7036672e8 GIT binary patch literal 262694 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≥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 V-thAqe(tkNZ?pb}o2<9Y{{w-wDwF^K literal 0 HcmV?d00001 diff --git a/q4base/fonts/r_strogg/r_strogg_0_48.tga b/q4base/fonts/r_strogg/r_strogg_0_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..6b35ede89e3d0a3d2b0cbdd6a3817e3b0f8b6824 GIT binary patch literal 262694 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 L{f>*ad(!^_WBU&D literal 0 HcmV?d00001 diff --git a/q4base/fonts/r_strogg/r_strogg_1_24.tga b/q4base/fonts/r_strogg/r_strogg_1_24.tga new file mode 100644 index 0000000000000000000000000000000000000000..2a5d0605b04eb7bf103f02c22a431d639872e175 GIT binary patch literal 262694 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 literal 0 HcmV?d00001 diff --git a/q4base/fonts/r_strogg/r_strogg_1_48.tga b/q4base/fonts/r_strogg/r_strogg_1_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..cdbffd8727ab1887e50e4d06b45d38717f361f5c GIT binary patch literal 262694 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 BQWgLJ literal 0 HcmV?d00001 diff --git a/q4base/fonts/r_strogg/r_strogg_2_24.tga b/q4base/fonts/r_strogg/r_strogg_2_24.tga new file mode 100644 index 0000000000000000000000000000000000000000..826694393ed69545c9df38fd829b80d4e26896dd GIT binary patch literal 262694 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

35!WdV1-U$<6xJ{DQS*QbuZ&+5=|cVnNw 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 literal 0 HcmV?d00001 diff --git a/q4base/fonts/r_strogg/r_strogg_5_48.tga b/q4base/fonts/r_strogg/r_strogg_5_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..d27dccd34ba5c082dcae1f11c449182bbca78f0d GIT binary patch literal 262694 zcmeHw3*2r~wfA;stL>6pE8ABmDY->dv|ZY2%RNMqSK6fG&Z#(@Nco&Zh)+s3ClQ@W ziqdh5NGds%NVMH@zeMi0zW@KR=K76iJaeu!*IIL}=Y8L2jNfm(bIvix9GCxGbFRy? zp68u1W!@=0x^c>lQ|6g6&-7ly{uly=fFWQA7y^cXAz%m?0)~JgU?zXje1JcVpz2p9sB0|Bh(&w*p<6e!L! zIWo5_3;{y`>-h+^_@74m4)9;VybjQ`jiF`;7y^?60W9u!f_DdR23`?7FSvJ|pVhZS zDe0VvkU0W&ImDJfkx6FtrHkxL1RN|zL!bzOqT@U3du_HBTyaH_z46i)k(b;T=7Ijh zF2Ssvi&E+g)W=J%7Kb5F7lDFfd|~vh3O*Ms>HNCBx*Ugq2i9wWY$cgsRzJT$zh}G4 ze9V_2&;|mYV|*LP9?jN(uh_ATI8xj6Ww+K-UO(j`2@=)`Am# z1CXHB^E&-Vbl*UaN2^ujPgv8R+5 z24J0rfFUq61X8Z^kgcI5XO0a4L!c0W(3(vtFATss4FN-7Xb51PFAr{ucyBcS(2_I9 zhJYbZhyd27es4MDUT`&x75cYML%05zibAq-w+rc0$87Xcd0FUBMc8OIrD4?7y^X|aDBGTg#lQnAz%m$4S}}TzMcPv zHnry15GX~!)_*BPreFw6S_EwUPui)q#0-H_1R~b|hoN(X;%O1%^5+VrL70LeUEa&LVoiJ4PFzz`@!Ahc#P`Qj*F21~jQ4evS+$xDMU1w+6P z7zzTRHJiz2qSW*?2yFciWwy+zA&?e|L%DetsLX>QUxFa!*NE)c+a=6ip!zk|>3#B~vt`7i_wfesMhdIt0Tzq0#)FF=Ry3Uv^b zxiAC_fi4i>dd^tC|NlJXcZ1IcuaoKYbi0Vld>8_TfFWQA7y^cXAz%m?0)~JgU4Pr-1XX z2K43F*!t42^(}Dkb5&_KMP6pZ5EzdL$m6`Aelq%s=oxe_lp;Ua(d(7(L+Jng;bIx{ z=?-1%kzyBFR&TgK0-8Z!S;amRZ-~8$lU*^yxlxr4!MuM3!&3# zTCN0Jr-6rZ{|CP-gXQ=CXQMrkQ{uyIz`n=lJ0J_u!bUX#Sc zAEPrLY(1fzJdO6c^wA~JpW>0a|53RU3%(1>i0kHyzHBzr961W&bij( z|C4sabMH)WPbYTnn&>%SD0c%(`U@Jb0k;y1vs+O99(_LAAHqHio8<4tDw{KWjx!nW zOZxmbX!HLm_~k1mLQGUolx z^0>fe35KD2&u{w1rNBwpT@3XQeF`0N{+iVJ8Iq6k zYn&8$#o9n1GM7=m|M{qIVlvsX3M+|Q)%srpe!f8;lbK2|44r@Zncx7%DR2^Yi_Xh4 zpto=VS9vyY0qpoFzs5BV3Y>)9@1Wj<80Rdo zn`d9SVu6D_-Pja)#oBN_QI7ik58uiB2iQlShtM~lb!75;AJW$|Xe>ZKlbH%|JVb&a z>ilfdi*pK`gl)d}(3GBqfla~Qcp?9AfrGW&xDL&SMY zmH(vyC)YyWJ8ojx(M^U^X1nO#BM??l%zb>5%&y)CLid;4H+p+N z$8|{}&QZVr*%??gq1`Z8&$n*-zW3pLp5VrJIsaYzayfd+yBrXz9P{Y*a7__=W_x4h zvuTsx<=HT^Esp{2@jm(`gt=adykcz#zoUNt!}ZsMUdG^^!1+9S>Y?v_&@VrG=#7n? zyNRgha#ZCqXoqN3ba*jMk$-0U(;?>#1Vdj^Erp? zmXPlna{eEc5bc7FJjWDy#oEaHj{5x%k1_7oDTtp1Z3fQgQ`Em6aPW7?=XH9qb2kz7 zT#l+d5^Wz{1)&ee)a(CtpL59gK2p$s#lF1*J}6#U+Ujy%GryyL|MON(LPFwo-X>su z?C>2AAN>!6xo(&9-?cB9r>I}-0|hdE7c0j_*Hgp}n@fO0#P{KX{wwyK9dN?mn#lKl z+U%0D97g^Ahu^dDEYe=J}P{kk|KCG4ZU~3 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 literal 0 HcmV?d00001 diff --git a/q4base/fonts/r_strogg/r_strogg_6_48.tga b/q4base/fonts/r_strogg/r_strogg_6_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..5fed75b4b65ce088bc96117681e8c6d7567b723a GIT binary patch literal 262694 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 literal 0 HcmV?d00001 diff --git a/q4base/fonts/Lowpixel/Marine_1_48.tga b/q4base/fonts/r_strogg/r_strogg_7_48.tga similarity index 55% rename from q4base/fonts/Lowpixel/Marine_1_48.tga rename to q4base/fonts/r_strogg/r_strogg_7_48.tga index d5e42ed1a4cd1fc8a30b3103caec59ca6c4a62c2..04f1893cfa580d7cd9d5d0f6ad3a0edd4841d0bd 100644 GIT binary patch literal 262694 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%0A<(m032=t4ID3l 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 literal 262694 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

toWkMGbv5pt8^^UATt#K7uQP4|yA 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 ScKyev+<%`Z?7G|IxBp+MpbCuu diff --git a/q4base/fonts/r_strogg/r_strogg_8_48.tga b/q4base/fonts/r_strogg/r_strogg_8_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..8daea8bb7fa70229289369d237f47a62c5a996be GIT binary patch literal 262694 zcmeHw3DhM;k#4guvIz)?D1Fc;qQEc$ii&nS0@8{&BDmqR!4U<-4Z#@{5Eo{S;`Sbk zjDmnHg5v_{DC(2VjZH+wQGuaZ9*Tkjin7!1i~B0esJszbRau#NZ~r&qocJ>{GBdu2 zFKfSb|2uEq^7BS=&Ae;oEjMqu`J;yYF$RnQW55_N28;n?z!)$Fi~(c77%&Em0b{@z zFb0ePW55_N28;n?z!)$Fi~(c77%&Em0b{@zFb0ePW55_N28;n?z!)$Fi~(c77%&Em z0b{@zFb0ePW55_N28;n?z!)$Fi~(c77%&Em0b{@zFb0ePW55_N28;n?z!)$Fi~(c7 z7%&Em0b{@zFb0ePW55_N28@C93@lx`bY2Htj4^HU{PfY8M`OSk$jJb9>Mr~LaV

    <-_sI4`(ZyQ+K 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 literal 0 HcmV?d00001 diff --git a/q4base/fonts/r_strogg/r_strogg_9_48.tga b/q4base/fonts/r_strogg/r_strogg_9_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..e2770cb5d9591b02fb87abb9ea7982e59e3a6ec6 GIT binary patch literal 262694 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 KU$y%9L;oLCVpVhi literal 0 HcmV?d00001 diff --git a/q4base/fonts/strogg/strogg_1_24.tga b/q4base/fonts/strogg/strogg_1_24.tga new file mode 100644 index 0000000000000000000000000000000000000000..78a2ea962ab5465c7e94e309c4b49dbb242ed5bc GIT binary patch literal 262694 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⪙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 literal 0 HcmV?d00001 diff --git a/q4base/fonts/strogg/strogg_4_48.tga b/q4base/fonts/strogg/strogg_4_48.tga new file mode 100644 index 0000000000000000000000000000000000000000..885f42cc95b460d60834f89729e393c5df8da894 GIT binary patch literal 262694 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