Your message dated Sun, 10 Mar 2019 20:11:12 +0000
with message-id <20190310201112.ga16...@espresso.pseudorandom.co.uk>
and subject line Re: Bug#924271: openarena: crashes at launch with "Couldn't 
compile shader" message.
has caused the Debian Bug report #924271,
regarding openarena: crashes at launch with "Couldn't compile shader" message.
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact ow...@bugs.debian.org
immediately.)


-- 
924271: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=924271
Debian Bug Tracking System
Contact ow...@bugs.debian.org with problems
--- Begin Message ---
Package: openarena
Version: 0.8.8+dfsg-2
Severity: grave
Justification: renders package unusable

Dear Maintainer,

   * What led up to the situation?
   I attempted to launch the program.

   * What exactly did you do (or not do) that was effective (or
     ineffective)?
   Ran `openarena` from a terminal.

   * What was the outcome of this action?
   Program failed to launch with a lengthy error message (attached).

   * What outcome did you expect instead?
   I expected the program to launch normally.


-- System Information:
Debian Release: buster/sid
  APT prefers testing
  APT policy: (500, 'testing'), (1, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 4.19.0-2-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8),
LANGUAGE=en_GB:en (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages openarena depends on:
ii  ioquake3                      1.36+u20181222.e5da13f~dfsg-1
ii  libc6                         2.28-7
ii  openarena-081-maps            0.8.5split-11
ii  openarena-081-misc            0.8.5split-11
ii  openarena-081-players         0.8.5split-11
ii  openarena-081-players-mature  0.8.5split-11
ii  openarena-081-textures        0.8.5split-11
ii  openarena-085-data            0.8.5split-11
ii  openarena-088-data            0.8.8-9
ii  openarena-data                0.8.5split-11

Versions of packages openarena recommends:
ii  openarena-oacmp1  3-4

openarena suggests no packages.

Versions of packages ioquake3 depends on:
ii  ioquake3-server  1.36+u20181222.e5da13f~dfsg-1
ii  libc6            2.28-7
ii  libcurl3-gnutls  7.64.0-1
ii  libgl1           1.1.0-1
ii  libjpeg62-turbo  1:1.5.2-2+b1
ii  libogg0          1.3.2-1+b1
ii  libopenal1       1:1.19.1-1
ii  libopus0         1.3-1
ii  libopusfile0     0.9+20170913-1
ii  libsdl2-2.0-0    2.0.9+dfsg1-1
ii  libvorbis0a      1.3.6-2
ii  libvorbisfile3   1.3.6-2
ii  zlib1g           1:1.2.11.dfsg-1

Versions of packages ioquake3 recommends:
ii  x11-utils  7.7+4

-- no debconf information
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
tty]    ioq3 1.36+u20181222.e5da13f~dfsg-1/Debian linux-x86_64 Jan 14 
2019
tty]    SSE instruction set enabled
tty]    ----- FS_Startup -----
tty]    We are looking in the current search path:
tty]    /home/empty/.openarena/baseoa
tty]    /usr/lib/openarena/baseoa
tty]    /usr/lib/openarena/baseoa/z_oacmp-volume1-v3.pk3 (370 files)
tty]    /usr/lib/openarena/baseoa/pak6-patch088.pk3 (711 files)
tty]    /usr/lib/openarena/baseoa/pak6-patch085.pk3 (559 files)
tty]    /usr/lib/openarena/baseoa/pak6-misc.pk3 (229 files)
tty]    /usr/lib/openarena/baseoa/pak5-TA.pk3 (139 files)
tty]    /usr/lib/openarena/baseoa/pak4-textures.pk3 (1753 files)
tty]    /usr/lib/openarena/baseoa/pak2-players.pk3 (669 files)
tty]    /usr/lib/openarena/baseoa/pak2-players-mature.pk3 (231 files)
tty]    /usr/lib/openarena/baseoa/pak1-maps.pk3 (100 files)
tty]    /usr/lib/openarena/baseoa/pak0.pk3 (1042 files)
tty]    
tty]    ----------------------
tty]    5803 files in pk3 files
tty]    execing default.cfg
tty]    couldn't exec q3config.cfg
tty]    couldn't exec autoexec.cfg
tty]    Hunk_Clear: reset the hunk ok
tty][Detaching after fork from child process 7475]
    ----- Client Initialization -----
tty]    Couldn't read q3history.
tty]    ----- Initializing Renderer ----
tty]    Trying to load "renderer_opengl2_x86_64.so" from 
"/usr/lib/ioquake3"...
tty]    -------------------------------
tty]    QKEY found.
tty]    ----- Client Initialization Complete -----
tty]    tty]
tty]q     ----- R_Init -----
tty]q[Detaching after fork from child process 7485]
[New Thread 0x7f89daf18700 (LWP 7486)]
     SDL using driver "x11"
tty]q     Initializing OpenGL display
tty]q     Display aspect: 1.600
tty]q     ...setting mode 3: 640 480
tty]q     Trying to get an OpenGL 3.2 core context
tty]q     SDL_GL_CreateContext failed: Could not create GL context: 
GLXBadFBConfig
tty]q     Reverting to default context
tty]q     Using 24 color bits, 24 depth, 8 stencil display.
tty]q     Available modes: '640x400 1280x800 640x360 720x405 864x486 
960x540 1024x576 1280x720 640x480 800x600 1024x768'
tty]q     GL_RENDERER: Mesa DRI Intel(R) Ironlake Mobile 
tty]q     Initializing OpenGL extensions
tty]q     ...ignoring GL_EXT_texture_compression_s3tc
tty]q     ...ignoring GL_S3_s3tc
tty]q     ...ignoring GL_EXT_texture_filter_anisotropic
tty]q     ...using GL_ARB_framebuffer_object
tty]q     ...using GL_ARB_vertex_array_object
tty]q     ...using GL_ARB_texture_float
tty]q     ...using GL_ARB_depth_clamp
tty]q     ...ignoring GL_ARB_seamless_cube_map
tty]q     ...using GLSL version 1.20
tty]q     ...GL_NVX_gpu_memory_info not found
tty]q     ...GL_ATI_meminfo not found
tty]q     ...ignoring GL_ARB_texture_compression_rgtc
tty]q     ...GL_ARB_texture_compression_bptc not found
tty]q     ...GL_EXT_direct_state_access not found
tty]q     ------- FBO_Init -------
tty]q     ------- GLSL_InitGPUShaders -------
tty]q     Shader source:
tty]q     #version 120
#define shadow2D(a,b) shadow2D(a,b).r 
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
#ifndef deformGen_t
#define deformGen_t
#define DGEN_WAVE_SIN 1
#define DGEN_WAVE_SQUARE 2
#define DGEN_WAVE_TRIANGLE 3
#define DGEN_WAVE_SAWTOOTH 4
#define DGEN_WAVE_INVERSE_SAWTOOTH 5
#define DGEN_BULGE 7
#define DGEN_MOVE 8
#endif
#ifndef tcGen_t
#define tcGen_t
#define TCGEN_LIGHTMAP 2
#define TCGEN_TEXTURE 3
#define TCGEN_ENVIRONMENT_MAPPED 4
#define TCGEN_FOG 5
#define TCGEN_VECTOR 6
#endif
#ifndef colorGen_t
#define colorGen_t
#define CGEN_LIGHTING_DIFFUSE 11
#endif
#ifndef alphaGen_t
#define alphaGen_t
#define AGEN_LIGHTING_SPECULAR 6
#define AGEN_PORTAL 8
#endif
#ifndef r_FBufScale
#define r_FBufScale vec2(0.001563, 0.002083)
#endif
#line 0
uniform sampler2D u_DiffuseMap;

#if defined(USE_LIGHTMAP)
uniform sampler2D u_LightMap;
#endif

#if defined(USE_NORMALMAP)
uniform sampler2D u_NormalMap;
#endif

#if defined(USE_DELUXEMAP)
uniform sampler2D u_DeluxeMap;
#endif

#if defined(USE_SPECULARMAP)
uniform sampler2D u_SpecularMap;
#endif

#if defined(USE_SHADOWMAP)
uniform sampler2D u_ShadowMap;
#endif

#if defined(USE_CUBEMAP)
uniform samplerCube u_CubeMap;
#endif

#if defined(USE_NORMALMAP) || defined(USE_DELUXEMAP) || 
defined(USE_SPECULARMAP) || defined(USE_CUBEMAP)
// y = deluxe, w = cube
uniform vec4      u_EnableTextures; 
#endif

#if defined(USE_PRIMARY_LIGHT) || defined(USE_SHADOWMAP)
uniform vec3  u_PrimaryLightColor;
uniform vec3  u_PrimaryLightAmbient;
#endif

#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
uniform vec4      u_NormalScale;
uniform vec4      u_SpecularScale;
#endif

#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
#if defined(USE_CUBEMAP)
uniform vec4      u_CubeMapInfo;
#endif
#endif

uniform int       u_AlphaTest;

varying vec4      var_TexCoords;

varying vec4      var_Color;
#if (defined(USE_LIGHT) && !defined(USE_FAST_LIGHT))
varying vec4      var_ColorAmbient;
#endif

#if (defined(USE_LIGHT) && !defined(USE_FAST_LIGHT))
varying vec4   var_Normal;
varying vec4   var_Tangent;
varying vec4   var_Bitangent;
#endif

#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
varying vec4      var_LightDir;
#endif

#if defined(USE_PRIMARY_LIGHT) || defined(USE_SHADOWMAP)
varying vec4      var_PrimaryLightDir;
#endif


#define EPSILON 0.00000001

#if defined(USE_PARALLAXMAP)
float SampleDepth(sampler2D normalMap, vec2 t)
{
  #if defined(SWIZZLE_NORMALMAP)
        return 1.0 - texture2D(normalMap, t).r;
  #else
        return 1.0 - texture2D(normalMap, t).a;
  #endif
}

float RayIntersectDisplaceMap(vec2 dp, vec2 ds, sampler2D normalMap)
{
        const int linearSearchSteps = 16;
        const int binarySearchSteps = 6;

        // current size of search window
        float size = 1.0 / float(linearSearchSteps);

        // current depth position
        float depth = 0.0;

        // best match found (starts with last position 1.0)
        float bestDepth = 1.0;

        // texture depth at best depth
        float texDepth = 0.0;

        float prevT = SampleDepth(normalMap, dp);
        float prevTexDepth = prevT;

        // search front to back for first point inside object
        for(int i = 0; i < linearSearchSteps - 1; ++i)
        {
                depth += size;
                
                float t = SampleDepth(normalMap, dp + ds * depth);
                
                if(bestDepth > 0.996)           // if no depth found yet
                        if(depth >= t)
                        {
                                bestDepth = depth;      // store best depth
                                texDepth = t;
                                prevTexDepth = prevT;
                        }
                prevT = t;
        }

        depth = bestDepth;

#if !defined (USE_RELIEFMAP)
        float div = 1.0 / (1.0 + (prevTexDepth - texDepth) * 
float(linearSearchSteps));
        bestDepth -= (depth - size - prevTexDepth) * div;
#else
        // recurse around first point (depth) for closest match
        for(int i = 0; i < binarySearchSteps; ++i)
        {
                size *= 0.5;

                float t = SampleDepth(normalMap, dp + ds * depth);
                
                if(depth >= t)
                {
                        bestDepth = depth;
                        depth -= 2.0 * size;
                }

                depth += size;
        }
#endif

        return bestDepth;
}
#endif

vec3 CalcDiffuse(vec3 diffuseAlbedo, float NH, float EH, float roughness)
{
#if defined(USE_BURLEY)
        // modified from 
https://disney-animation.s3.amazonaws.com/library/s2012_pbs_disney_brdf_notes_v2.pdf
        float fd90 = -0.5 + EH * EH * roughness;
        float burley = 1.0 + fd90 * 0.04 / NH;
        burley *= burley;
        return diffuseAlbedo * burley;
#else
        return diffuseAlbedo;
#endif
}

vec3 EnvironmentBRDF(float roughness, float NE, vec3 specular)
{
        // from 
http://community.arm.com/servlet/JiveServlet/download/96891546-19496/siggraph2015-mmg-renaldas-slides.pdf
        float v = 1.0 - max(roughness, NE);
        v *= v * v;
        return vec3(v) + specular;
}

vec3 CalcSpecular(vec3 specular, float NH, float EH, float roughness)
{
        // from 
http://community.arm.com/servlet/JiveServlet/download/96891546-19496/siggraph2015-mmg-renaldas-slides.pdf
        float rr = roughness*roughness;
        float rrrr = rr*rr;
        float d = (NH * NH) * (rrrr - 1.0) + 1.0;
        float v = (EH * EH) * (roughness + 0.5);
        return specular * (rrrr / (4.0 * d * d * v));
}


float CalcLightAttenuation(float point, float normDist)
{
        // zero light at 1.0, approximating q3 style
        // also don't attenuate directional light
        float attenuation = (0.5 * normDist - 1.5) * point + 1.0;

        // clamp attenuation
        #if defined(NO_LIGHT_CLAMP)
        attenuation = max(attenuation, 0.0);
        #else
        attenuation = clamp(attenuation, 0.0, 1.0);
        #endif

        return attenuation;
}


vec4 hitCube(vec3 ray, vec3 pos, vec3 invSize, float lod, samplerCube tex)
{
        // find any hits on cubemap faces facing the camera
        vec3 scale = (sign(ray) - pos) / ray;

        // find the nearest hit
        float minScale = min(min(scale.x, scale.y), scale.z);

        // if the nearest hit is behind the camera, ignore
        // should not be necessary as long as pos is inside the cube
        //if (minScale < 0.0)
                //return vec4(0.0);

        // calculate the hit position, that's our texture coordinates
        vec3 tc = pos + ray * minScale;

        // if the texture coordinates are outside the cube, ignore
        // necessary since we're not fading out outside the cube
        if (any(greaterThan(abs(tc), vec3(1.00001))))
                return vec4(0.0);

        // fade out when approaching the cubemap edges
        //vec3 fade3 = abs(pos);
        //float fade = max(max(fade3.x, fade3.y), fade3.z);
        //fade = clamp(1.0 - fade, 0.0, 1.0);
                        
        //return vec4(textureCubeLod(tex, tc, lod).rgb * fade, fade);
        return vec4(textureCubeLod(tex, tc, lod).rgb, 1.0);
}

void main()
{
        vec3 viewDir, lightColor, ambientColor, reflectance;
        vec3 L, N, E, H;
        float NL, NH, NE, EH, attenuation;

#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
        mat3 tangentToWorld = mat3(var_Tangent.xyz, var_Bitangent.xyz, 
var_Normal.xyz);
        viewDir = vec3(var_Normal.w, var_Tangent.w, var_Bitangent.w);
        E = normalize(viewDir);
#endif

        lightColor = var_Color.rgb;

#if defined(USE_LIGHTMAP)
        vec4 lightmapColor = texture2D(u_LightMap, var_TexCoords.zw);
  #if defined(RGBM_LIGHTMAP)
        lightmapColor.rgb *= lightmapColor.a;
  #endif
  #if defined(USE_PBR) && !defined(USE_FAST_LIGHT)
        lightmapColor.rgb *= lightmapColor.rgb;
  #endif
        lightColor *= lightmapColor.rgb;
#endif

        vec2 texCoords = var_TexCoords.xy;

#if defined(USE_PARALLAXMAP)
        vec3 offsetDir = viewDir * tangentToWorld;

        offsetDir.xy *= -u_NormalScale.a / offsetDir.z;

        texCoords += offsetDir.xy * RayIntersectDisplaceMap(texCoords, 
offsetDir.xy, u_NormalMap);
#endif

        vec4 diffuse = texture2D(u_DiffuseMap, texCoords);
        
        float alpha = diffuse.a * var_Color.a;
        if (u_AlphaTest == 1)
        {
                if (alpha == 0.0)
                        discard;
        }
        else if (u_AlphaTest == 2)
        {
                if (alpha >= 0.5)
                        discard;
        }
        else if (u_AlphaTest == 3)
        {
                if (alpha < 0.5)
                        discard;
        }

#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
        L = var_LightDir.xyz;
  #if defined(USE_DELUXEMAP)
        L += (texture2D(u_DeluxeMap, var_TexCoords.zw).xyz - vec3(0.5)) * 
u_EnableTextures.y;
  #endif
        float sqrLightDist = dot(L, L);
        L /= sqrt(sqrLightDist);

  #if defined(USE_LIGHT_VECTOR)
        attenuation  = CalcLightAttenuation(float(var_LightDir.w > 0.0), 
var_LightDir.w / sqrLightDist);
  #else
        attenuation  = 1.0;
  #endif

  #if defined(USE_NORMALMAP)
    #if defined(SWIZZLE_NORMALMAP)
        N.xy = texture2D(u_NormalMap, texCoords).ag - vec2(0.5);
    #else
        N.xy = texture2D(u_NormalMap, texCoords).rg - vec2(0.5);
    #endif
        N.xy *= u_NormalScale.xy;
        N.z = sqrt(clamp((0.25 - N.x * N.x) - N.y * N.y, 0.0, 1.0));
        N = tangentToWorld * N;
  #else
        N = var_Normal.xyz;
  #endif

        N = normalize(N);

  #if defined(USE_SHADOWMAP) 
        vec2 shadowTex = gl_FragCoord.xy * r_FBufScale;
        float shadowValue = texture2D(u_ShadowMap, shadowTex).r;

        // surfaces not facing the light are always shadowed
        shadowValue *= clamp(dot(N, var_PrimaryLightDir.xyz), 0.0, 1.0);

    #if defined(SHADOWMAP_MODULATE)
        lightColor *= shadowValue * (1.0 - u_PrimaryLightAmbient.r) + 
u_PrimaryLightAmbient.r;
    #endif
  #endif

  #if !defined(USE_LIGHT_VECTOR)
        ambientColor = lightColor;
        float surfNL = clamp(dot(var_Normal.xyz, L), 0.0, 1.0);

        // reserve 25% ambient to avoid black areas on normalmaps
        lightColor *= 0.75;

        // Scale the incoming light to compensate for the baked-in light angle
        // attenuation.
        lightColor /= max(surfNL, 0.25);

        // Recover any unused light as ambient, in case attenuation is over 4x 
or
        // light is below the surface
        ambientColor = max(ambientColor - lightColor * surfNL, vec3(0.0));
  #else
        ambientColor = var_ColorAmbient.rgb;
  #endif

        NL = clamp(dot(N, L), 0.0, 1.0);
        NE = clamp(dot(N, E), 0.0, 1.0);
        H = normalize(L + E);
        EH = clamp(dot(E, H), 0.0, 1.0);
        NH = clamp(dot(N, H), 0.0, 1.0);

  #if defined(USE_SPECULARMAP)
        vec4 specular = texture2D(u_SpecularMap, texCoords);
  #else
        vec4 specular = vec4(1.0);
  #endif
        specular *= u_SpecularScale;

  #if defined(USE_PBR)
        diffuse.rgb *= diffuse.rgb;
  #endif

  #if defined(USE_PBR)
        // diffuse rgb is base color
        // specular red is gloss
        // specular green is metallicness
        float gloss = specular.r;
        float metal = specular.g;
        specular.rgb = metal * diffuse.rgb + vec3(0.04 - 0.04 * metal);
        diffuse.rgb *= 1.0 - metal;
  #else
        // diffuse rgb is diffuse
        // specular rgb is specular reflectance at normal incidence
        // specular alpha is gloss
        float gloss = specular.a;

        // adjust diffuse by specular reflectance, to maintain energy 
conservation
        diffuse.rgb *= vec3(1.0) - specular.rgb;
  #endif

  #if defined(GLOSS_IS_GLOSS)
        float roughness = exp2(-3.0 * gloss);
  #elif defined(GLOSS_IS_SMOOTHNESS)
        float roughness = 1.0 - gloss;
  #elif defined(GLOSS_IS_ROUGHNESS)
        float roughness = gloss;
  #elif defined(GLOSS_IS_SHININESS)
        float roughness = pow(2.0 / (8190.0 * gloss + 2.0), 0.25);
  #endif

        reflectance  = CalcDiffuse(diffuse.rgb, NH, EH, roughness);

  #if defined(r_deluxeSpecular)
    #if defined(USE_LIGHT_VECTOR)
        reflectance += CalcSpecular(specular.rgb, NH, EH, roughness) * 
r_deluxeSpecular;
    #else
        reflectance += CalcSpecular(specular.rgb, NH, EH, pow(roughness, 
r_deluxeSpecular));
    #endif
  #endif

        gl_FragColor.rgb  = lightColor   * reflectance * (attenuation * NL);
        gl_FragColor.rgb += ambientColor * diffuse.rgb;

  #if defined(USE_CUBEMAP)
        reflectance = EnvironmentBRDF(roughness, NE, specular.rgb);

        vec3 R = reflect(E, N);

        // parallax corrected cubemap (cheaper trick)
        // from 
http://seblagarde.wordpress.com/2012/09/29/image-based-lighting-approaches-and-parallax-corrected-cubemap/
        vec3 parallax = u_CubeMapInfo.xyz + u_CubeMapInfo.w * viewDir;

  #if defined(USE_BOX_CUBEMAP_PARALLAX)
        vec3 cubeLightColor = hitCube(R * u_CubeMapInfo.w, parallax, 
u_CubeMapInfo.www, ROUGHNESS_MIPS * roughness, u_CubeMap).rgb * 
u_EnableTextures.w;
  #else
        vec3 cubeLightColor = textureCubeLod(u_CubeMap, R + parallax, 
ROUGHNESS_MIPS * roughness).rgb * u_EnableTextures.w;
  #endif

        // normalize cubemap based on last roughness mip (~diffuse)
        // multiplying cubemap values by lighting below depends on either this 
or the cubemap being normalized at generation
        //vec3 cubeLightDiffuse = max(textureCubeLod(u_CubeMap, N, 
ROUGHNESS_MIPS).rgb, 0.5 / 255.0);
        //cubeLightColor /= dot(cubeLightDiffuse, vec3(0.2125, 0.7154, 0.0721));

    #if defined(USE_PBR)
        cubeLightColor *= cubeLightColor;
    #endif

        // multiply cubemap values by lighting
        // not technically correct, but helps make reflections look less 
unnatural
        //cubeLightColor *= lightColor * (attenuation * NL) + ambientColor;

        gl_FragColor.rgb += cubeLightColor * reflectance;
  #endif

  #if defined(USE_PRIMARY_LIGHT) || defined(SHADOWMAP_MODULATE)
        vec3 L2, H2;
        float NL2, EH2, NH2;

        L2 = var_PrimaryLightDir.xyz;

        // enable when point lights are supported as primary lights
        //sqrLightDist = dot(L2, L2);
        //L2 /= sqrt(sqrLightDist);

        NL2 = clamp(dot(N, L2), 0.0, 1.0);
        H2 = normalize(L2 + E);
        EH2 = clamp(dot(E, H2), 0.0, 1.0);
        NH2 = clamp(dot(N, H2), 0.0, 1.0);

        reflectance  = CalcSpecular(specular.rgb, NH2, EH2, roughness);

        // bit of a hack, with modulated shadowmaps, ignore diffuse
    #if !defined(SHADOWMAP_MODULATE)
        reflectance += CalcDiffuse(diffuse.rgb, NH2, EH2, roughness);
    #endif

        lightColor = u_PrimaryLightColor;

    #if defined(USE_SHADOWMAP)
        lightColor *= shadowValue;
    #endif

        // enable when point lights are supported as primary lights
        //lightColor *= CalcLightAttenuation(float(u_PrimaryLightDir.w > 0.0), 
u_PrimaryLightDir.w / sqrLightDist);

        gl_FragColor.rgb += lightColor * reflectance * NL2;
  #endif

  #if defined(USE_PBR)
        gl_FragColor.rgb = sqrt(gl_FragColor.rgb);
  #endif

#else

        gl_FragColor.rgb = diffuse.rgb * lightColor;

#endif

        gl_FragColor.a = alpha;
}
tty]q     
tty]q     Shader info log:
tty]q     0:224(14): error: no matching function for call to 
`textureCubeLod(samplerCube, vec3, float)'; candidates are:
0:224(14): error: type mismatch
0:224(9): error: cannot construct `vec4' from a non-numeric data type
0:224(2): error: `return' with wrong type error, in function `hitCube' 
returning vec4

tty]q     ********************
ERROR: Couldn't compile shader
********************
tty]q     RE_Shutdown( 0 )
tty]q     Hunk_Clear: reset the hunk ok
tty]q     ----- R_Init -----
tty]q     ------- FBO_Init -------
tty]q     ------- GLSL_InitGPUShaders -------
tty]q     Shader source:
tty]q     #version 120
#define shadow2D(a,b) shadow2D(a,b).r 
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
#ifndef deformGen_t
#define deformGen_t
#define DGEN_WAVE_SIN 1
#define DGEN_WAVE_SQUARE 2
#define DGEN_WAVE_TRIANGLE 3
#define DGEN_WAVE_SAWTOOTH 4
#define DGEN_WAVE_INVERSE_SAWTOOTH 5
#define DGEN_BULGE 7
#define DGEN_MOVE 8
#endif
#ifndef tcGen_t
#define tcGen_t
#define TCGEN_LIGHTMAP 2
#define TCGEN_TEXTURE 3
#define TCGEN_ENVIRONMENT_MAPPED 4
#define TCGEN_FOG 5
#define TCGEN_VECTOR 6
#endif
#ifndef colorGen_t
#define colorGen_t
#define CGEN_LIGHTING_DIFFUSE 11
#endif
#ifndef alphaGen_t
#define alphaGen_t
#define AGEN_LIGHTING_SPECULAR 6
#define AGEN_PORTAL 8
#endif
#ifndef r_FBufScale
#define r_FBufScale vec2(0.001563, 0.002083)
#endif
#line 0
uniform sampler2D u_DiffuseMap;

#if defined(USE_LIGHTMAP)
uniform sampler2D u_LightMap;
#endif

#if defined(USE_NORMALMAP)
uniform sampler2D u_NormalMap;
#endif

#if defined(USE_DELUXEMAP)
uniform sampler2D u_DeluxeMap;
#endif

#if defined(USE_SPECULARMAP)
uniform sampler2D u_SpecularMap;
#endif

#if defined(USE_SHADOWMAP)
uniform sampler2D u_ShadowMap;
#endif

#if defined(USE_CUBEMAP)
uniform samplerCube u_CubeMap;
#endif

#if defined(USE_NORMALMAP) || defined(USE_DELUXEMAP) || 
defined(USE_SPECULARMAP) || defined(USE_CUBEMAP)
// y = deluxe, w = cube
uniform vec4      u_EnableTextures; 
#endif

#if defined(USE_PRIMARY_LIGHT) || defined(USE_SHADOWMAP)
uniform vec3  u_PrimaryLightColor;
uniform vec3  u_PrimaryLightAmbient;
#endif

#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
uniform vec4      u_NormalScale;
uniform vec4      u_SpecularScale;
#endif

#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
#if defined(USE_CUBEMAP)
uniform vec4      u_CubeMapInfo;
#endif
#endif

uniform int       u_AlphaTest;

varying vec4      var_TexCoords;

varying vec4      var_Color;
#if (defined(USE_LIGHT) && !defined(USE_FAST_LIGHT))
varying vec4      var_ColorAmbient;
#endif

#if (defined(USE_LIGHT) && !defined(USE_FAST_LIGHT))
varying vec4   var_Normal;
varying vec4   var_Tangent;
varying vec4   var_Bitangent;
#endif

#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
varying vec4      var_LightDir;
#endif

#if defined(USE_PRIMARY_LIGHT) || defined(USE_SHADOWMAP)
varying vec4      var_PrimaryLightDir;
#endif


#define EPSILON 0.00000001

#if defined(USE_PARALLAXMAP)
float SampleDepth(sampler2D normalMap, vec2 t)
{
  #if defined(SWIZZLE_NORMALMAP)
        return 1.0 - texture2D(normalMap, t).r;
  #else
        return 1.0 - texture2D(normalMap, t).a;
  #endif
}

float RayIntersectDisplaceMap(vec2 dp, vec2 ds, sampler2D normalMap)
{
        const int linearSearchSteps = 16;
        const int binarySearchSteps = 6;

        // current size of search window
        float size = 1.0 / float(linearSearchSteps);

        // current depth position
        float depth = 0.0;

        // best match found (starts with last position 1.0)
        float bestDepth = 1.0;

        // texture depth at best depth
        float texDepth = 0.0;

        float prevT = SampleDepth(normalMap, dp);
        float prevTexDepth = prevT;

        // search front to back for first point inside object
        for(int i = 0; i < linearSearchSteps - 1; ++i)
        {
                depth += size;
                
                float t = SampleDepth(normalMap, dp + ds * depth);
                
                if(bestDepth > 0.996)           // if no depth found yet
                        if(depth >= t)
                        {
                                bestDepth = depth;      // store best depth
                                texDepth = t;
                                prevTexDepth = prevT;
                        }
                prevT = t;
        }

        depth = bestDepth;

#if !defined (USE_RELIEFMAP)
        float div = 1.0 / (1.0 + (prevTexDepth - texDepth) * 
float(linearSearchSteps));
        bestDepth -= (depth - size - prevTexDepth) * div;
#else
        // recurse around first point (depth) for closest match
        for(int i = 0; i < binarySearchSteps; ++i)
        {
                size *= 0.5;

                float t = SampleDepth(normalMap, dp + ds * depth);
                
                if(depth >= t)
                {
                        bestDepth = depth;
                        depth -= 2.0 * size;
                }

                depth += size;
        }
#endif

        return bestDepth;
}
#endif

vec3 CalcDiffuse(vec3 diffuseAlbedo, float NH, float EH, float roughness)
{
#if defined(USE_BURLEY)
        // modified from 
https://disney-animation.s3.amazonaws.com/library/s2012_pbs_disney_brdf_notes_v2.pdf
        float fd90 = -0.5 + EH * EH * roughness;
        float burley = 1.0 + fd90 * 0.04 / NH;
        burley *= burley;
        return diffuseAlbedo * burley;
#else
        return diffuseAlbedo;
#endif
}

vec3 EnvironmentBRDF(float roughness, float NE, vec3 specular)
{
        // from 
http://community.arm.com/servlet/JiveServlet/download/96891546-19496/siggraph2015-mmg-renaldas-slides.pdf
        float v = 1.0 - max(roughness, NE);
        v *= v * v;
        return vec3(v) + specular;
}

vec3 CalcSpecular(vec3 specular, float NH, float EH, float roughness)
{
        // from 
http://community.arm.com/servlet/JiveServlet/download/96891546-19496/siggraph2015-mmg-renaldas-slides.pdf
        float rr = roughness*roughness;
        float rrrr = rr*rr;
        float d = (NH * NH) * (rrrr - 1.0) + 1.0;
        float v = (EH * EH) * (roughness + 0.5);
        return specular * (rrrr / (4.0 * d * d * v));
}


float CalcLightAttenuation(float point, float normDist)
{
        // zero light at 1.0, approximating q3 style
        // also don't attenuate directional light
        float attenuation = (0.5 * normDist - 1.5) * point + 1.0;

        // clamp attenuation
        #if defined(NO_LIGHT_CLAMP)
        attenuation = max(attenuation, 0.0);
        #else
        attenuation = clamp(attenuation, 0.0, 1.0);
        #endif

        return attenuation;
}


vec4 hitCube(vec3 ray, vec3 pos, vec3 invSize, float lod, samplerCube tex)
{
        // find any hits on cubemap faces facing the camera
        vec3 scale = (sign(ray) - pos) / ray;

        // find the nearest hit
        float minScale = min(min(scale.x, scale.y), scale.z);

        // if the nearest hit is behind the camera, ignore
        // should not be necessary as long as pos is inside the cube
        //if (minScale < 0.0)
                //return vec4(0.0);

        // calculate the hit position, that's our texture coordinates
        vec3 tc = pos + ray * minScale;

        // if the texture coordinates are outside the cube, ignore
        // necessary since we're not fading out outside the cube
        if (any(greaterThan(abs(tc), vec3(1.00001))))
                return vec4(0.0);

        // fade out when approaching the cubemap edges
        //vec3 fade3 = abs(pos);
        //float fade = max(max(fade3.x, fade3.y), fade3.z);
        //fade = clamp(1.0 - fade, 0.0, 1.0);
                        
        //return vec4(textureCubeLod(tex, tc, lod).rgb * fade, fade);
        return vec4(textureCubeLod(tex, tc, lod).rgb, 1.0);
}

void main()
{
        vec3 viewDir, lightColor, ambientColor, reflectance;
        vec3 L, N, E, H;
        float NL, NH, NE, EH, attenuation;

#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
        mat3 tangentToWorld = mat3(var_Tangent.xyz, var_Bitangent.xyz, 
var_Normal.xyz);
        viewDir = vec3(var_Normal.w, var_Tangent.w, var_Bitangent.w);
        E = normalize(viewDir);
#endif

        lightColor = var_Color.rgb;

#if defined(USE_LIGHTMAP)
        vec4 lightmapColor = texture2D(u_LightMap, var_TexCoords.zw);
  #if defined(RGBM_LIGHTMAP)
        lightmapColor.rgb *= lightmapColor.a;
  #endif
  #if defined(USE_PBR) && !defined(USE_FAST_LIGHT)
        lightmapColor.rgb *= lightmapColor.rgb;
  #endif
        lightColor *= lightmapColor.rgb;
#endif

        vec2 texCoords = var_TexCoords.xy;

#if defined(USE_PARALLAXMAP)
        vec3 offsetDir = viewDir * tangentToWorld;

        offsetDir.xy *= -u_NormalScale.a / offsetDir.z;

        texCoords += offsetDir.xy * RayIntersectDisplaceMap(texCoords, 
offsetDir.xy, u_NormalMap);
#endif

        vec4 diffuse = texture2D(u_DiffuseMap, texCoords);
        
        float alpha = diffuse.a * var_Color.a;
        if (u_AlphaTest == 1)
        {
                if (alpha == 0.0)
                        discard;
        }
        else if (u_AlphaTest == 2)
        {
                if (alpha >= 0.5)
                        discard;
        }
        else if (u_AlphaTest == 3)
        {
                if (alpha < 0.5)
                        discard;
        }

#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
        L = var_LightDir.xyz;
  #if defined(USE_DELUXEMAP)
        L += (texture2D(u_DeluxeMap, var_TexCoords.zw).xyz - vec3(0.5)) * 
u_EnableTextures.y;
  #endif
        float sqrLightDist = dot(L, L);
        L /= sqrt(sqrLightDist);

  #if defined(USE_LIGHT_VECTOR)
        attenuation  = CalcLightAttenuation(float(var_LightDir.w > 0.0), 
var_LightDir.w / sqrLightDist);
  #else
        attenuation  = 1.0;
  #endif

  #if defined(USE_NORMALMAP)
    #if defined(SWIZZLE_NORMALMAP)
        N.xy = texture2D(u_NormalMap, texCoords).ag - vec2(0.5);
    #else
        N.xy = texture2D(u_NormalMap, texCoords).rg - vec2(0.5);
    #endif
        N.xy *= u_NormalScale.xy;
        N.z = sqrt(clamp((0.25 - N.x * N.x) - N.y * N.y, 0.0, 1.0));
        N = tangentToWorld * N;
  #else
        N = var_Normal.xyz;
  #endif

        N = normalize(N);

  #if defined(USE_SHADOWMAP) 
        vec2 shadowTex = gl_FragCoord.xy * r_FBufScale;
        float shadowValue = texture2D(u_ShadowMap, shadowTex).r;

        // surfaces not facing the light are always shadowed
        shadowValue *= clamp(dot(N, var_PrimaryLightDir.xyz), 0.0, 1.0);

    #if defined(SHADOWMAP_MODULATE)
        lightColor *= shadowValue * (1.0 - u_PrimaryLightAmbient.r) + 
u_PrimaryLightAmbient.r;
    #endif
  #endif

  #if !defined(USE_LIGHT_VECTOR)
        ambientColor = lightColor;
        float surfNL = clamp(dot(var_Normal.xyz, L), 0.0, 1.0);

        // reserve 25% ambient to avoid black areas on normalmaps
        lightColor *= 0.75;

        // Scale the incoming light to compensate for the baked-in light angle
        // attenuation.
        lightColor /= max(surfNL, 0.25);

        // Recover any unused light as ambient, in case attenuation is over 4x 
or
        // light is below the surface
        ambientColor = max(ambientColor - lightColor * surfNL, vec3(0.0));
  #else
        ambientColor = var_ColorAmbient.rgb;
  #endif

        NL = clamp(dot(N, L), 0.0, 1.0);
        NE = clamp(dot(N, E), 0.0, 1.0);
        H = normalize(L + E);
        EH = clamp(dot(E, H), 0.0, 1.0);
        NH = clamp(dot(N, H), 0.0, 1.0);

  #if defined(USE_SPECULARMAP)
        vec4 specular = texture2D(u_SpecularMap, texCoords);
  #else
        vec4 specular = vec4(1.0);
  #endif
        specular *= u_SpecularScale;

  #if defined(USE_PBR)
        diffuse.rgb *= diffuse.rgb;
  #endif

  #if defined(USE_PBR)
        // diffuse rgb is base color
        // specular red is gloss
        // specular green is metallicness
        float gloss = specular.r;
        float metal = specular.g;
        specular.rgb = metal * diffuse.rgb + vec3(0.04 - 0.04 * metal);
        diffuse.rgb *= 1.0 - metal;
  #else
        // diffuse rgb is diffuse
        // specular rgb is specular reflectance at normal incidence
        // specular alpha is gloss
        float gloss = specular.a;

        // adjust diffuse by specular reflectance, to maintain energy 
conservation
        diffuse.rgb *= vec3(1.0) - specular.rgb;
  #endif

  #if defined(GLOSS_IS_GLOSS)
        float roughness = exp2(-3.0 * gloss);
  #elif defined(GLOSS_IS_SMOOTHNESS)
        float roughness = 1.0 - gloss;
  #elif defined(GLOSS_IS_ROUGHNESS)
        float roughness = gloss;
  #elif defined(GLOSS_IS_SHININESS)
        float roughness = pow(2.0 / (8190.0 * gloss + 2.0), 0.25);
  #endif

        reflectance  = CalcDiffuse(diffuse.rgb, NH, EH, roughness);

  #if defined(r_deluxeSpecular)
    #if defined(USE_LIGHT_VECTOR)
        reflectance += CalcSpecular(specular.rgb, NH, EH, roughness) * 
r_deluxeSpecular;
    #else
        reflectance += CalcSpecular(specular.rgb, NH, EH, pow(roughness, 
r_deluxeSpecular));
    #endif
  #endif

        gl_FragColor.rgb  = lightColor   * reflectance * (attenuation * NL);
        gl_FragColor.rgb += ambientColor * diffuse.rgb;

  #if defined(USE_CUBEMAP)
        reflectance = EnvironmentBRDF(roughness, NE, specular.rgb);

        vec3 R = reflect(E, N);

        // parallax corrected cubemap (cheaper trick)
        // from 
http://seblagarde.wordpress.com/2012/09/29/image-based-lighting-approaches-and-parallax-corrected-cubemap/
        vec3 parallax = u_CubeMapInfo.xyz + u_CubeMapInfo.w * viewDir;

  #if defined(USE_BOX_CUBEMAP_PARALLAX)
        vec3 cubeLightColor = hitCube(R * u_CubeMapInfo.w, parallax, 
u_CubeMapInfo.www, ROUGHNESS_MIPS * roughness, u_CubeMap).rgb * 
u_EnableTextures.w;
  #else
        vec3 cubeLightColor = textureCubeLod(u_CubeMap, R + parallax, 
ROUGHNESS_MIPS * roughness).rgb * u_EnableTextures.w;
  #endif

        // normalize cubemap based on last roughness mip (~diffuse)
        // multiplying cubemap values by lighting below depends on either this 
or the cubemap being normalized at generation
        //vec3 cubeLightDiffuse = max(textureCubeLod(u_CubeMap, N, 
ROUGHNESS_MIPS).rgb, 0.5 / 255.0);
        //cubeLightColor /= dot(cubeLightDiffuse, vec3(0.2125, 0.7154, 0.0721));

    #if defined(USE_PBR)
        cubeLightColor *= cubeLightColor;
    #endif

        // multiply cubemap values by lighting
        // not technically correct, but helps make reflections look less 
unnatural
        //cubeLightColor *= lightColor * (attenuation * NL) + ambientColor;

        gl_FragColor.rgb += cubeLightColor * reflectance;
  #endif

  #if defined(USE_PRIMARY_LIGHT) || defined(SHADOWMAP_MODULATE)
        vec3 L2, H2;
        float NL2, EH2, NH2;

        L2 = var_PrimaryLightDir.xyz;

        // enable when point lights are supported as primary lights
        //sqrLightDist = dot(L2, L2);
        //L2 /= sqrt(sqrLightDist);

        NL2 = clamp(dot(N, L2), 0.0, 1.0);
        H2 = normalize(L2 + E);
        EH2 = clamp(dot(E, H2), 0.0, 1.0);
        NH2 = clamp(dot(N, H2), 0.0, 1.0);

        reflectance  = CalcSpecular(specular.rgb, NH2, EH2, roughness);

        // bit of a hack, with modulated shadowmaps, ignore diffuse
    #if !defined(SHADOWMAP_MODULATE)
        reflectance += CalcDiffuse(diffuse.rgb, NH2, EH2, roughness);
    #endif

        lightColor = u_PrimaryLightColor;

    #if defined(USE_SHADOWMAP)
        lightColor *= shadowValue;
    #endif

        // enable when point lights are supported as primary lights
        //lightColor *= CalcLightAttenuation(float(u_PrimaryLightDir.w > 0.0), 
u_PrimaryLightDir.w / sqrLightDist);

        gl_FragColor.rgb += lightColor * reflectance * NL2;
  #endif

  #if defined(USE_PBR)
        gl_FragColor.rgb = sqrt(gl_FragColor.rgb);
  #endif

#else

        gl_FragColor.rgb = diffuse.rgb * lightColor;

#endif

        gl_FragColor.a = alpha;
}
tty]q     
tty]q     Shader info log:
tty]q     0:224(14): error: no matching function for call to 
`textureCubeLod(samplerCube, vec3, float)'; candidates are:
0:224(14): error: type mismatch
0:224(9): error: cannot construct `vec4' from a non-numeric data type
0:224(2): error: `return' with wrong type error, in function `hitCube' 
returning vec4

tty]q     recursive error after: Couldn't compile shader
tty]q[Detaching after fork from child process 7487]
     [Thread 0x7f89e6d3d680 (LWP 7470) exited]
[Inferior 1 (process 7470) exited with code 03]
The program is not being run.

--- End Message ---
--- Begin Message ---
Version: 1.36+u20181222.e5da13f~dfsg-2

On Sun, 10 Mar 2019 at 20:02:17 +0000, Matthew Hoare wrote:
> Yes, that fixes the problem.

Thanks, closing the bug. The updated ioquake3 has been unblocked by the
release team and should reach buster soon.

    smcv

--- End Message ---

Reply via email to