Push all the latest commits from this week's worklog, changes for RT2

This commit is contained in:
Marco Cawthorne 2024-09-01 23:57:51 -07:00
parent 8ab066ffe1
commit b60d420692
159 changed files with 2443 additions and 5081 deletions

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 812 B

View file

@ -1,38 +0,0 @@
//======= Copyright (c) 2015-2022 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Scrolling shader for patches that get blended on top of existing geometry
// with vertex colors defining fading out
//==============================================================================
!!ver 110
!!samps diffuse
#include "sys/defs.h"
varying vec2 tex1_c;
varying vec2 tex2_c;
varying vec4 vex_color;
#ifdef VERTEX_SHADER
void main ( void )
{
tex1_c = v_texcoord + vec2(e_time * 0.25, e_time * 0.25);
tex2_c = v_texcoord * 0.5 + vec2(e_time * 0.1, e_time * 0.2);
vex_color = v_colour;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
void main ( void )
{
vec3 diffuse_f = texture2D( s_diffuse, tex1_c ).rgb * vex_color.a;
diffuse_f *= texture2D( s_diffuse, tex2_c ).rgb * vex_color.a;
gl_FragColor = vec4(diffuse_f, 1.0);
}
#endif

View file

@ -1,39 +0,0 @@
//======= Copyright (c) 2015-2022 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Alternate version of caustics that's practically inverted for subtract blends
//==============================================================================
!!ver 110
!!samps diffuse
#include "sys/defs.h"
varying vec2 tex1_c;
varying vec2 tex2_c;
varying vec4 vex_color;
#ifdef VERTEX_SHADER
void main ( void )
{
tex1_c = v_texcoord + vec2(e_time * 0.25, e_time * 0.25);
tex2_c = v_texcoord * 0.5 + vec2(e_time * 0.1, e_time * 0.2);
vex_color = v_colour;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
void main ( void )
{
vec3 diffuse_f = texture2D( s_diffuse, tex1_c ).rgb;
diffuse_f *= texture2D( s_diffuse, tex2_c ).rgb;
diffuse_f = mix(diffuse_f, vec3(1.0,1.0,1.0), 1.0 - vex_color.a);
gl_FragColor = vec4(diffuse_f, 1.0);
}
#endif

View file

@ -1,41 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Shader used for fading out surfaces after a certain distance.
// It only has a diffuse map.
//==============================================================================
!!ver 110
!!permu FOG
!!samps diffuse=0
#include "sys/defs.h"
#include "sys/fog.h"
varying vec2 tex_c;
varying float eyedist;
#ifdef VERTEX_SHADER
void main ()
{
tex_c = v_texcoord;
eyedist = abs( length( e_eyepos - v_position.xyz ) ) / 2048.0;
if (eyedist > 1.0) {
eyedist = 1.0;
} else if (eyedist < 0.0) {
eyedist = 0.0;
}
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
void main ()
{
vec4 diffuse_f = texture2D(s_diffuse, tex_c);
gl_FragColor = vec4( diffuse_f.rgb, (1.0 - eyedist) * diffuse_f.a);
}
#endif

View file

@ -1,172 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Lightmapped surface that sticks to walls.
//
// diffusemap = albedo (rgba)
// normalmap = normal (rgb), reflectmask (a)
//==============================================================================
!!ver 110
!!permu FOG
!!permu BUMP
!!permu DELUXE
!!permu LIGHTSTYLED
!!samps diffuse
!!samps lightmap
!!samps =BUMP normalmap reflectcube
!!samps =LIGHTSTYLED lightmap1 lightmap2 lightmap3
!!samps =DELUXE deluxemap
!!samps =LIGHTSTYLED =DELUXE deluxemap1 deluxemap2 deluxemap3
!!permu FAKESHADOWS
!!cvardf r_glsl_pcf
!!cvardf r_fullbright
!!samps =FAKESHADOWS shadowmap
#include "sys/defs.h"
// basics
varying vec2 tex_c;
varying vec2 lm0;
// unfortunately we do support lightstyles
#if defined(LIGHTSTYLED)
varying vec2 lm1, lm2, lm3;
#endif
// useful for terrain blending
varying vec4 vex_color;
// dynamic shadows
#ifdef FAKESHADOWS
varying vec4 vtexprojcoord;
#endif
#ifdef BUMP
varying vec3 eyevector;
varying mat3 invsurface;
#endif
#ifdef VERTEX_SHADER
void lightmapped_init(void)
{
lm0 = v_lmcoord;
#if defined(LIGHTSTYLED)
lm1 = v_lmcoord2;
lm2 = v_lmcoord3;
lm3 = v_lmcoord4;
#endif
}
void main ()
{
lightmapped_init();
tex_c = v_texcoord;
vex_color = v_colour;
gl_Position = ftetransform();
#ifdef FAKESHADOWS
vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0));
#endif
#ifdef BUMP
vec3 eyeminusvertex = e_eyepos - v_position.xyz;
eyevector.x = dot(eyeminusvertex, v_svector.xyz);
eyevector.y = dot(eyeminusvertex, v_tvector.xyz);
eyevector.z = dot(eyeminusvertex, v_normal.xyz);
invsurface[0] = v_svector;
invsurface[1] = v_tvector;
invsurface[2] = v_normal;
#endif
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
#include "sys/pcf.h"
#if defined(LIGHTSTYLED)
#define LIGHTMAP0 texture2D(s_lightmap0, lm0).rgb
#define LIGHTMAP1 texture2D(s_lightmap1, lm1).rgb
#define LIGHTMAP2 texture2D(s_lightmap2, lm2).rgb
#define LIGHTMAP3 texture2D(s_lightmap3, lm3).rgb
#else
#define LIGHTMAP texture2D(s_lightmap, lm0).rgb
#endif
vec3 lightmap_fragment()
{
vec3 lightmaps;
#if defined(LIGHTSTYLED)
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb;
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb;
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb;
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb;
#else
lightmaps = LIGHTMAP * e_lmscale.rgb;
#endif
return (r_fullbright == 1) ? vec3(1.0, 1.0, 1.0) : lightmaps;
}
vec3 lightmap_fragment(vec3 normal_f)
{
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps;
#if defined(LIGHTSTYLED)
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0);
#else
lightmaps = LIGHTMAP * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0);
#endif
return (r_fullbright == 1) ? vec3(1.0, 1.0, 1.0) : lightmaps;
#endif
}
void main (void)
{
vec4 diffuse_f;
float alpha;
diffuse_f = texture2D(s_diffuse, tex_c);
diffuse_f.rgb *= diffuse_f.a;
#ifdef FAKESHADOWS
diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif
// the lighting stage for the world
#if defined(BUMP)
vec3 cube_c;
vec3 env_f;
vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
float refl = texture2D(s_normalmap, tex_c).a;
diffuse_f.rgb *= lightmap_fragment(normal_f);
cube_c = reflect(normalize(-eyevector), normal_f.rgb);
cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2];
cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz;
env_f = textureCube(s_reflectcube, cube_c).rgb * (e_lmscale.rgb * 0.25);
diffuse_f.rgb = mix(env_f, diffuse_f.rgb, refl);
#else
diffuse_f.rgb *= lightmap_fragment();
#endif
// start blend at half-way point
alpha = diffuse_f.a;
if (alpha > 1.0)
alpha = 1.0;
gl_FragColor = vec4(fog3(diffuse_f.rgb), alpha);
}
#endif

View file

@ -1,56 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// The diffusemap (monochrome) decides the reflectivity of a surface.
// Using a cube environmentmap as a source for reflectivity.
//==============================================================================
!!ver 110
!!permu FOG
!!permu BUMP
!!permu DELUXE
!!samps diffuse normalmap reflectcube
#include "sys/defs.h"
varying vec2 tex_c;
varying vec3 eyevector;
varying mat3 invsurface;
varying vec2 wat_c;
#ifdef VERTEX_SHADER
void main (void)
{
invsurface[0] = v_svector;
invsurface[1] = v_tvector;
invsurface[2] = v_normal;
vec3 eyeminusvertex = e_eyepos - v_position.xyz;
eyevector.x = dot(eyeminusvertex, v_svector.xyz);
eyevector.y = dot(eyeminusvertex, v_tvector.xyz);
eyevector.z = dot(eyeminusvertex, v_normal.xyz);
tex_c = v_texcoord;
wat_c = tex_c + vec2(e_time * 0.01, sin(e_time) * 0.005);
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
void main (void)
{
vec3 cube_c;
vec4 out_f = vec4(1.0, 1.0, 1.0, 1.0);
vec4 diffuse_f = texture2D(s_diffuse, tex_c);
cube_c = reflect(normalize(-eyevector), texture2D(s_normalmap, wat_c).rgb * 0.35);
cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2];
cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz;
out_f.rgb = textureCube(s_reflectcube, cube_c).rgb;
out_f.rgb *= diffuse_f.r + diffuse_f.b + diffuse_f.g / 3.0;
// Add fog to the final fragment
gl_FragColor = fog4(out_f);
}
#endif

View file

@ -1,29 +0,0 @@
!!ver 100-450
!!samps 1
varying vec2 tc;
varying vec4 vc;
#ifdef VERTEX_SHADER
attribute vec2 v_texcoord;
attribute vec4 v_colour;
void main ()
{
tc = v_texcoord;
vc = v_colour;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
void main ()
{
vec4 f = vc;
#ifdef PREMUL
f.rgb *= f.a;
#endif
f *= texture2D(s_t0, tc);
gl_FragColor = f;
}
#endif

View file

@ -1,27 +0,0 @@
!!permu FOG
!!samps 1
#include "sys/fog.h"
#ifdef VERTEX_SHADER
attribute vec2 v_texcoord;
attribute vec4 v_colour;
varying vec2 tc;
varying vec4 vc;
void main ()
{
tc = v_texcoord;
vc = v_colour;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
varying vec2 tc;
varying vec4 vc;
uniform vec4 e_colourident;
void main ()
{
vec4 diffuse_f = texture2D(s_t0, tc);
gl_FragColor = fog4additive(diffuse_f * vc * e_colourident);
}
#endif

View file

@ -1,20 +0,0 @@
!!ver 100-450
#ifdef VERTEX_SHADER
attribute vec4 v_colour;
varying vec4 vc;
void main ()
{
vc = v_colour;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
varying vec4 vc;
void main ()
{
gl_FragColor = vc;
}
#endif

View file

@ -1,43 +1,64 @@
!!ver 130 //======= Copyright (c) 2015-2021 Vera Visions LLC. All rights reserved. =======
!!permu FRAMEBLEND //
// Purpose:
//
// Skinned objects, aka rigged objects are handled here.
// Skeletal operations are performed on the GPU (hopefully) and we don't care
// about lightmaps, but query the engine for a dir + ambient term which may
// come from the lightgrid or not exist at all. At that point it should be
// the rtlight shader doing the major work though.
//==============================================================================
!!ver 100 150
!!permu FOG
!!permu BUMP
!!permu DELUXE
!!permu SPECULAR
!!permu FULLBRIGHT
!!permu FAKESHADOWS
!!permu OFFSETMAPPING
!!permu SKELETAL !!permu SKELETAL
!!permu UPPERLOWER !!permu UPPERLOWER
!!permu FOG
!!samps diffuse reflectcube upper lower !!samps diffuse
!!cvardf gl_affinemodels=0 !!samps =BUMP normalmap
!!cvardf gl_ldr=1 !!samps =SPECULAR specular reflectcube
!!cvardf gl_halflambert=1 !!samps =FULLBRIGHT fullbright
!!cvardf gl_mono=0 !!samps =UPPERLOWER upper lower
!!cvardf gl_kdither=0 !!samps =FAKESHADOWS shadowmap
!!cvardf gl_stipplealpha=0
!!permu FAKESHADOWS !!permu FAKESHADOWS
!!cvardf r_glsl_pcf !!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap !!samps =FAKESHADOWS shadowmap
!!cvardf r_skipDiffuse !!cvarf r_glsl_offsetmapping_scale
!!cvarf gl_specular
#ifndef FRESNEL
#define FRESNEL 0.25f
#endif
#include "sys/defs.h" #include "sys/defs.h"
#include "sys/fog.h"
#if gl_affinemodels == 1 // always required
#define affine noperspective varying vec2 tc;
#else varying vec3 lightvector;
#define affine varying vec3 light;
#endif
#ifdef REFLECTCUBE // from this point forth, if we check for SPECULAR this means we're in PBR territory
#ifdef BUMP
varying vec3 eyevector; varying vec3 eyevector;
varying mat3 invsurface; varying mat3 invsurface;
#define PBR
#endif #endif
// r_shadows 2
#ifdef FAKESHADOWS #ifdef FAKESHADOWS
varying vec4 vtexprojcoord; varying vec4 vtexprojcoord;
#endif #endif
affine varying vec2 tex_c; // our basic vertex shader
varying vec3 light;
#ifdef VERTEX_SHADER #ifdef VERTEX_SHADER
#include "sys/skeletal.h" #include "sys/skeletal.h"
@ -48,292 +69,145 @@ varying vec3 light;
return ( dot( normal, dir ) * 0.5 ) + 0.5; return ( dot( normal, dir ) * 0.5 ) + 0.5;
} }
#ifdef CHROME
/* Rotate Light Vector */
vec3 rlv(vec3 axis, vec3 origin, vec3 lightpoint)
{
vec3 offs;
vec3 result;
offs[0] = lightpoint[0] - origin[0];
offs[1] = lightpoint[1] - origin[1];
offs[2] = lightpoint[2] - origin[2];
result[0] = dot(offs[0], axis[0]);
result[1] = dot(offs[1], axis[1]);
result[2] = dot(offs[2], axis[2]);
return result;
}
#endif
vec3 VectorIRotate( vec3 inPos, mat3x4 xform )
{
vec3 outPos;
outPos.x = inPos.x*xform[0][0] + inPos.y*xform[1][0] + inPos.z*xform[2][0];
outPos.y = inPos.x*xform[0][1] + inPos.y*xform[1][1] + inPos.z*xform[2][1];
outPos.z = inPos.x*xform[0][2] + inPos.y*xform[1][2] + inPos.z*xform[2][2];
return outPos;
}
vec3 VectorTransform( vec3 inPos, mat3x4 xform )
{
vec3 outPos;
outPos.x = dot( inPos, xform[0].xyz ) + xform[0][3];
outPos.y = dot( inPos, xform[1].xyz ) + xform[1][3];
outPos.z = dot( inPos, xform[2].xyz ) + xform[2][3];
return outPos;
}
void main () void main ()
{ {
vec3 n, s, t, w; vec3 n, s, t, w;
gl_Position = skeletaltransform_wnst(w,n,s,t); gl_Position = skeletaltransform_wnst(w,n,s,t);
tex_c = v_texcoord;
#if gl_halflambert==1 #ifdef PBR
light = e_light_ambient + (e_light_mul * halflambert(n, e_light_dir)); vec3 eyeminusvertex = e_eyepos - w.xyz;
#else eyevector.x = dot(eyeminusvertex, s.xyz);
eyevector.y = dot(eyeminusvertex, t.xyz);
eyevector.z = dot(eyeminusvertex, n.xyz);
invsurface[0] = s;
invsurface[1] = t;
invsurface[2] = n;
#endif
light = e_light_ambient + (e_light_mul * lambert(n, e_light_dir)); light = e_light_ambient + (e_light_mul * lambert(n, e_light_dir));
tc = v_texcoord;
lightvector.x = dot(e_light_dir, s.xyz);
lightvector.y = dot(e_light_dir, t.xyz);
lightvector.z = dot(e_light_dir, n.xyz);
#ifdef FAKESHADOWS
vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0));
#endif #endif
light *= e_lmscale.r;
if (gl_ldr == 1.0) {
if (light.r > 1.5)
light.r = 1.5;
if (light.g > 1.5)
light.g = 1.5;
if (light.b > 1.5)
light.b = 1.5;
light.rgb * 0.5;
light.rgb = floor(light.rgb * vec3(32,64,32))/vec3(32,64,32);
light.rgb * 2.0;
light.rgb *= 0.75;
}
#ifdef CHROME
#ifndef SKELETAL
vec3 rorg = rlv(vec3(0,0,0), w, e_light_dir);
vec3 viewc = normalize(rorg - w);
float d = dot(n, viewc);
vec3 reflected;
reflected.x = n.x * 2.0 * d - viewc.x;
reflected.y = n.y * 2.0 * d - viewc.y;
reflected.z = n.z * 2.0 * d - viewc.z;
tex_c.x = 0.5 + reflected.y * 0.5;
tex_c.y = 0.5 - reflected.z * 0.5;
#else
/* code contributed by Slartibarty */
vec3 tmp = e_eyepos * -1.0f;
int boneid = int(v_bone.r);
tmp.x += m_bones_mat3x4[boneid][0][3];
tmp.y += m_bones_mat3x4[boneid][1][3];
tmp.z += m_bones_mat3x4[boneid][2][3];
tmp = normalize( tmp );
vec3 chromeUp = normalize( cross( tmp, vec3( m_modelview[0][0], m_modelview[1][0], m_modelview[2][0] ) ) );
vec3 chromeRight = normalize( cross( chromeUp, tmp ) );
chromeUp = VectorIRotate( chromeUp, m_bones_mat3x4[boneid] );
chromeRight = VectorIRotate( chromeRight, m_bones_mat3x4[boneid] );
float na;
// calc s coord
na = dot( v_normal, chromeRight );
tex_c.x = ( na + 1.0 ) * 0.5;
// calc t coord
na = dot( v_normal, chromeUp );
tex_c.y = ( na + 1.0 ) * 0.5;
#endif
#endif
#ifdef REFLECTCUBE
invsurface[0] = v_svector;
invsurface[1] = v_tvector;
invsurface[2] = v_normal;
vec3 eyeminusvertex = e_eyepos - v_position.xyz;
eyevector.x = dot( eyeminusvertex, v_svector.xyz );
eyevector.y = dot( eyeminusvertex, v_tvector.xyz );
eyevector.z = dot( eyeminusvertex, v_normal.xyz );
#endif
} }
#endif #endif
#ifdef FRAGMENT_SHADER #ifdef FRAGMENT_SHADER
#include "sys/fog.h"
#if defined(SPECULAR)
uniform float cvar_gl_specular;
#endif
#ifdef FAKESHADOWS
#include "sys/pcf.h" #include "sys/pcf.h"
#endif
vec4 kernel_dither(sampler2D targ, vec2 texc) #ifdef OFFSETMAPPING
#include "sys/offsetmapping.h"
#endif
float LightingFuncGGX(vec3 N, vec3 V, vec3 L, float roughness, float F0)
{ {
int x = int(mod(gl_FragCoord.x, 2.0)); float alpha = roughness*roughness;
int y = int(mod(gl_FragCoord.y, 2.0));
int index = x + y * 2;
vec2 coord_ofs;
vec2 size;
size.x = 1.0 / textureSize(targ, 0).x; vec3 H = normalize(V+L);
size.y = 1.0 / textureSize(targ, 0).y;
if (index == 0) float dotNL = clamp(dot(N,L), 0.0, 1.0);
coord_ofs = vec2(0.25, 0.0); float dotLH = clamp(dot(L,H), 0.0, 1.0);
else if (index == 1) float dotNH = clamp(dot(N,H), 0.0, 1.0);
coord_ofs = vec2(0.50, 0.75);
else if (index == 2)
coord_ofs = vec2(0.75, 0.50);
else if (index == 3)
coord_ofs = vec2(0.00, 0.25);
return texture2D(targ, texc + coord_ofs * size); float F, D, vis;
}
vec3 hsv2rgb(float h, float s, float v) // D
{ float alphaSqr = alpha*alpha;
int i; float pi = 3.14159f;
float f,p,q,t; float denom = dotNH * dotNH *(alphaSqr-1.0) + 1.0f;
vec3 col = vec3(0,0,0); D = alphaSqr/(pi * denom * denom);
h = max(0.0, min(360.0, h)); // F
s = max(0.0, min(100.0, s)); float dotLH5 = pow(1.0f-dotLH,5);
v = max(0.0, min(100.0, v)); F = F0 + (1.0-F0)*(dotLH5);
s /= 100; // V
v /= 100; float k = alpha/2.0f;
float k2 = k*k;
float invK2 = 1.0f-k2;
vis = 1.0/(dotLH*dotLH*invK2 + k2);
if (s == 0) { float specular = dotNL * D * F * vis;
col.x= col.y = col.z = int(v*255); return specular;
return col / 255.0;
}
h /= 60;
i = int(floor(h));
f = h - i;
p = v * (1 - s);
q = v * (1 - s * f);
t = v * (1 - s * (1 - f));
switch (i) {
case 0:
col[0] = int(255*v);
col[1] = int(255*t);
col[2] = int(255*p);
break;
case 1:
col[0] = int(255*q);
col[1] = int(255*v);
col[2] = int(255*p);
break;
case 2:
col[0] = int(255*p);
col[1] = int(255*v);
col[2] = int(255*t);
break;
case 3:
col[0] = int(255*p);
col[1] = int(255*q);
col[2] = int(255*v);
break;
case 4:
col[0] = int(255*t);
col[1] = int(255*p);
col[2] = int(255*v);
break;
default:
col[0] = int(255*v);
col[1] = int(255*p);
col[2] = int(255*q);
}
return col / 255.0;
} }
void main () void main ()
{ {
vec4 diffuse_f; #ifdef OFFSETMAPPING
vec2 tcoffsetmap = offsetmap(s_normalmap, tc, eyevector);
#if r_skipDiffuse==1 #define tc tcoffsetmap
diffuse_f = vec4(1.0, 1.0, 1.0, 1.0); #endif
#else
#if gl_kdither==1 vec4 albedo_f = texture2D(s_diffuse, tc);
diffuse_f = kernel_dither(s_diffuse, tex_c);
#else #ifdef BUMP
diffuse_f = texture2D(s_diffuse, tex_c); vec3 normal_f = normalize(texture2D(s_normalmap, tc).rgb - 0.5);
#else
vec3 normal_f = vec3(0.0, 0.0, 1.0);
#endif #endif
#endif
#ifdef UPPER #ifdef UPPER
vec4 uc = texture2D(s_upper, tex_c); vec4 uc = texture2D(s_upper, tc);
albedo_f.rgb += uc.rgb * e_uppercolour * uc.a;
if (e_colourident.z == 2.0) {
vec3 topcolor = hsv2rgb(e_colourident.x * 360, 100, 100);
diffuse_f.rgb += uc.rgb*topcolor*uc.a;
} else {
diffuse_f.rgb += uc.rgb*e_uppercolour*uc.a;
}
#endif #endif
#ifdef LOWER #ifdef LOWER
vec4 lc = texture2D(s_lower, tex_c); vec4 lc = texture2D(s_lower, tc);
albedo_f.rgb += lc.rgb * e_lowercolour * lc.a;
if (e_colourident.z == 2.0) {
vec3 bottomcolor = hsv2rgb(e_colourident.y * 360, 100, 100);
diffuse_f.rgb += lc.rgb*bottomcolor*lc.a;
} else {
diffuse_f.rgb += lc.rgb*e_lowercolour*lc.a;
}
#endif #endif
diffuse_f.rgb *= light; #ifdef PBR
float metalness_f = texture2D(s_specular, tc).r;
float roughness_f = texture2D(s_specular, tc).g;
float ao = texture2D(s_specular, tc).b;
#ifdef REFLECTCUBE /* coords */
vec3 cube_c; vec3 cube_c;
vec4 out_f = vec4( 1.0, 1.0, 1.0, 1.0 );
cube_c = reflect( normalize( -eyevector ), vec3( 0, 0, 1 ) ); /* calculate cubemap texcoords */
cube_c = reflect(-normalize(eyevector), normal_f.rgb);
cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2]; cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2];
cube_c = ( m_model * vec4( cube_c.xyz, 0.0 ) ).xyz; cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz;
out_f.rgb = mix( textureCube( s_reflectcube, cube_c ).rgb, diffuse_f.rgb, diffuse_f.a );
diffuse_f = out_f;
#endif
if (e_colourident.z != 2.0) { /* do PBR reflection using cubemap */
diffuse_f *= e_colourident; gl_FragColor = albedo_f + (metalness_f * textureCube(s_reflectcube, cube_c));
}
#if gl_stipplealpha==1 /* do PBR specular using our handy function */
float alpha = e_colourident.a; gl_FragColor += (LightingFuncGGX(normal_f, normalize(eyevector), normalize(lightvector), roughness_f, FRESNEL) * gl_FragColor);
int x = int(mod(gl_FragCoord.x, 2.0)); #else
int y = int(mod(gl_FragCoord.y, 2.0)); gl_FragColor = albedo_f;
if (alpha <= 0.0) {
discard;
} else if (alpha <= 0.25) {
diffuse_f.a = 1.0;
if (x + y == 2)
discard;
if (x + y == 1)
discard;
} else if (alpha <= 0.5) {
diffuse_f.a = 1.0;
if (x + y == 2)
discard;
if (x + y == 0)
discard;
} else if (alpha < 1.0) {
diffuse_f.a = 1.0;
if (x + y == 2)
discard;
}
#endif #endif
#if gl_mono==1 /* this isn't necessary if we're not doing lightgrid terms */
float bw = (diffuse_f.r + diffuse_f.g + diffuse_f.b) / 3.0; gl_FragColor.rgb *= light;
diffuse_f.rgb = vec3(bw, bw, bw);
#endif
/* r_shadows 2 */
#ifdef FAKESHADOWS #ifdef FAKESHADOWS
diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); gl_FragColor.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif #endif
gl_FragColor = fog4(diffuse_f);
#ifdef PBR
gl_FragColor.rgb *= ao;
#endif
#ifdef FULLBRIGHT
vec4 fb = texture2D(s_fullbright, tc);
gl_FragColor.rgb += fb.rgb * fb.a * e_glowmod.rgb;
#endif
gl_FragColor = fog4(gl_FragColor * e_colourident);
} }
#endif #endif

View file

@ -1,30 +0,0 @@
!!ver 130
!!permu FOG
!!samps reflectcube
!!cvardf gl_mono=0
#include "sys/defs.h"
#include "sys/fog.h"
varying vec3 pos;
#ifdef VERTEX_SHADER
void main ()
{
pos = v_position.xyz - e_eyepos;
pos.y = -pos.y;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
void main ()
{
vec4 skybox = textureCube(s_reflectcube, pos);
if (gl_mono == 1.0) {
float bw = (skybox.r + skybox.g + skybox.b) / 3.0;
skybox.rgb = vec3(bw, bw, bw) * 1.5;
}
gl_FragColor = vec4(fog3(skybox.rgb), 1.0);
}
#endif

View file

@ -1,74 +0,0 @@
!!ver 130
!!permu FOG
!!samps 1
!!cvardf gl_mono=0
!!cvardf gl_kdither=0
#include "sys/fog.h"
#ifdef VERTEX_SHADER
attribute vec2 v_texcoord;
attribute vec4 v_colour;
varying vec2 tc;
varying vec4 vc;
void main ()
{
tc = v_texcoord;
vc = v_colour;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
varying vec2 tc;
varying vec4 vc;
uniform vec4 e_colourident;
uniform vec4 e_vlscale;
vec4 kernel_dither(sampler2D targ, vec2 texc)
{
int x = int(mod(gl_FragCoord.x, 2.0));
int y = int(mod(gl_FragCoord.y, 2.0));
int index = x + y * 2;
vec2 coord_ofs;
vec2 size;
size.x = 1.0 / textureSize(targ, 0).x;
size.y = 1.0 / textureSize(targ, 0).y;
if (index == 0)
coord_ofs = vec2(0.25, 0.0);
else if (index == 1)
coord_ofs = vec2(0.50, 0.75);
else if (index == 2)
coord_ofs = vec2(0.75, 0.50);
else if (index == 3)
coord_ofs = vec2(0.00, 0.25);
return texture2D(targ, texc + coord_ofs * size);
}
void main ()
{
vec4 col;
#if gl_kdither==1
col = texture2D(s_t0, tc);
#else
col = texture2D(s_t0, tc);
#endif
#ifdef MASK
if (col.a < float(MASK))
discard;
#endif
col = fog4blend(col * vc * e_colourident * e_vlscale);
#if gl_mono==1
float bw = (col.r + col.g + col.b) / 3.0;
col.rgb = vec3(bw, bw, bw) * 1.5;
#endif
gl_FragColor = col;
}
#endif

View file

@ -1,37 +1,56 @@
!!ver 130 //======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
!!permu LIGHTSTYLED //
!!permu FOG // Purpose:
!!samps diffuse reflectcube normalmap //
// Lightmapped surface that contains an environment cube as a reflection.
// Alpha channel of the diffuse decides reflectivity.
//==============================================================================
!!ver 100 150
!!permu FOG
!!permu BUMP
!!permu DELUXE
!!permu SPECULAR
!!permu FULLBRIGHT
!!permu FAKESHADOWS !!permu FAKESHADOWS
!!cvardf r_glsl_pcf !!permu OFFSETMAPPING
!!samps diffuse lightmap
!!samps =BUMP normalmap
!!samps =DELUXE deluxemap
!!samps =SPECULAR specular reflectcube
!!samps =FULLBRIGHT fullbright
!!samps =LIGHTSTYLED lightmap1 lightmap2 lightmap3
!!samps =LIGHTSTYLED =DELUXE deluxemap1 deluxemap2 deluxemap3
!!samps =FAKESHADOWS shadowmap !!samps =FAKESHADOWS shadowmap
!!samps lightmap !!cvardf r_glsl_pcf
!!samps =LIGHTSTYLED lightmap1 lightmap2 lightmap3 !!cvarf r_glsl_offsetmapping_scale
!!cvardf gl_mono
!!cvardf gl_kdither
!!cvardf gl_stipplealpha
!!cvardf gl_ldr
!!cvardf r_skipDiffuse !!cvardf r_skipDiffuse
!!cvardf r_skipNormal
!!cvardf r_skipSpecular
!!cvardf r_skipLightmap !!cvardf r_skipLightmap
#ifndef FRESNEL
#define FRESNEL 0.25f
#endif
#include "sys/defs.h" #include "sys/defs.h"
#include "sys/fog.h"
varying vec2 tex_c; varying vec2 tex_c;
#ifdef BUMP
varying vec3 eyevector;
varying mat3 invsurface;
#define PBR
#endif
varying vec2 lm0; varying vec2 lm0;
#ifdef LIGHTSTYLED #ifdef LIGHTSTYLED
varying vec2 lm1, lm2, lm3; varying vec2 lm1, lm2, lm3;
#endif #endif
#ifdef REFLECTCUBE
varying vec3 eyevector;
varying mat3 invsurface;
#endif
#ifdef FAKESHADOWS #ifdef FAKESHADOWS
varying vec4 vtexprojcoord; varying vec4 vtexprojcoord;
#endif #endif
@ -47,179 +66,183 @@ varying mat3 invsurface;
#endif #endif
} }
void main () void main (void)
{ {
lightmapped_init(); lightmapped_init();
tex_c = v_texcoord;
gl_Position = ftetransform();
/* HACK: func_conveyor needs us to scroll this surface! */ #ifdef PBR
if (e_glowmod.g == 0.5)
tex_c[0] += (e_time * (e_glowmod.b * 1024.0)) * -0.01;
#ifdef REFLECTCUBE
invsurface[0] = v_svector; invsurface[0] = v_svector;
invsurface[1] = v_tvector; invsurface[1] = v_tvector;
invsurface[2] = v_normal; invsurface[2] = v_normal;
vec3 eyeminusvertex = e_eyepos - v_position.xyz; vec3 eyeminusvertex = e_eyepos - v_position.xyz;
eyevector.x = dot( eyeminusvertex, v_svector.xyz ); eyevector.x = dot(eyeminusvertex, v_svector.xyz);
eyevector.y = dot( eyeminusvertex, v_tvector.xyz ); eyevector.y = dot(eyeminusvertex, v_tvector.xyz);
eyevector.z = dot( eyeminusvertex, v_normal.xyz ); eyevector.z = dot(eyeminusvertex, v_normal.xyz);
#endif #endif
tex_c = v_texcoord;
gl_Position = ftetransform();
#ifdef FAKESHADOWS
vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0));
#endif
} }
#endif #endif
#ifdef FRAGMENT_SHADER #ifdef FRAGMENT_SHADER
#include "sys/fog.h"
#include "sys/pcf.h" #include "sys/pcf.h"
#ifdef OFFSETMAPPING
#include "sys/offsetmapping.h"
#endif
#if r_skipLightmap==0 #if r_skipLightmap==0
vec3 lightmap_fragment(void) #ifdef LIGHTSTYLED
#define LIGHTMAP0 texture2D(s_lightmap0, lm0).rgb
#define LIGHTMAP1 texture2D(s_lightmap1, lm1).rgb
#define LIGHTMAP2 texture2D(s_lightmap2, lm2).rgb
#define LIGHTMAP3 texture2D(s_lightmap3, lm3).rgb
#else
#define LIGHTMAP texture2D(s_lightmap, lm0).rgb
#endif
#else
#ifdef LIGHTSTYLED
#define LIGHTMAP0 vec3(0.5,0.5,0.5)
#define LIGHTMAP1 vec3(0.5,0.5,0.5)
#define LIGHTMAP2 vec3(0.5,0.5,0.5)
#define LIGHTMAP3 vec3(0.5,0.5,0.5)
#else
#define LIGHTMAP vec3(0.5,0.5,0.5)
#endif
#endif
float LightingFuncGGX(vec3 N, vec3 V, vec3 L, float roughness, float F0)
{
float alpha = roughness*roughness;
vec3 H = normalize(V+L);
float dotNL = clamp(dot(N,L), 0.0, 1.0);
float dotLH = clamp(dot(L,H), 0.0, 1.0);
float dotNH = clamp(dot(N,H), 0.0, 1.0);
float F, D, vis;
// D
float alphaSqr = alpha*alpha;
float pi = 3.14159f;
float denom = dotNH * dotNH *(alphaSqr-1.0) + 1.0f;
D = alphaSqr/(pi * denom * denom);
// F
float dotLH5 = pow(1.0f-dotLH,5);
F = F0 + (1.0-F0)*(dotLH5);
// V
float k = alpha/2.0f;
float k2 = k*k;
float invK2 = 1.0f-k2;
vis = 1.0/(dotLH*dotLH*invK2 + k2);
float specular = dotNL * D * F * vis;
return specular;
}
vec3 lightmap_fragment()
{ {
vec3 lightmaps; vec3 lightmaps;
#ifdef LIGHTSTYLED #ifdef LIGHTSTYLED
lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb; lightmaps = LIGHTMAP0 * e_lmscale[0].rgb;
lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb; lightmaps += LIGHTMAP1 * e_lmscale[1].rgb;
lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb; lightmaps += LIGHTMAP2 * e_lmscale[2].rgb;
lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb; lightmaps += LIGHTMAP3 * e_lmscale[3].rgb;
#else #else
lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb; lightmaps = LIGHTMAP * e_lmscale.rgb;
#endif #endif
if (gl_ldr == 1.0) {
if (lightmaps.r > 1.5)
lightmaps.r = 1.5;
if (lightmaps.g > 1.5)
lightmaps.g = 1.5;
if (lightmaps.b > 1.5)
lightmaps.b = 1.5;
lightmaps.rgb * 0.5;
lightmaps.rgb = floor(lightmaps.rgb * vec3(32,64,32))/vec3(32,64,32);
lightmaps.rgb * 2.0;
}
return lightmaps; return lightmaps;
} }
#else
vec3 lightmap_fragment(void) #if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f)
{ {
return vec3(1.0,1.0,1.0); #ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps;
#ifdef LIGHTSTYLED
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb * dot(normal_f, texture2D(s_deluxemap0, lm0).rgb);
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb * dot(normal_f, texture2D(s_deluxemap1, lm1).rgb);
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb * dot(normal_f, texture2D(s_deluxemap2, lm2).rgb);
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb * dot(normal_f, texture2D(s_deluxemap3, lm3).rgb);
#else
lightmaps = LIGHTMAP * e_lmscale.rgb * dot(normal_f, texture2D(s_deluxemap, lm0).rgb);
#endif
return lightmaps;
#endif
} }
#endif #endif
vec4 kernel_dither(sampler2D targ, vec2 texc) void main (void)
{ {
int x = int(mod(gl_FragCoord.x, 2.0)); #ifdef OFFSETMAPPING
int y = int(mod(gl_FragCoord.y, 2.0)); vec2 tcoffsetmap = offsetmap(s_normalmap, tex_c, eyevector);
int index = x + y * 2;
vec2 coord_ofs;
vec2 size;
size.x = 1.0 / textureSize(targ, 0).x;
size.y = 1.0 / textureSize(targ, 0).y;
if (index == 0)
coord_ofs = vec2(0.25, 0.0);
else if (index == 1)
coord_ofs = vec2(0.50, 0.75);
else if (index == 2)
coord_ofs = vec2(0.75, 0.50);
else if (index == 3)
coord_ofs = vec2(0.00, 0.25);
return texture2D(targ, texc + coord_ofs * size);
}
void main ( void )
{
vec4 diffuse_f;
#if r_skipDiffuse==1
diffuse_f = vec4(1.0,1.0,1.0,1.0);
#else
#if gl_kdither==1
diffuse_f = kernel_dither(s_diffuse, tex_c);
#else #else
diffuse_f = texture2D(s_diffuse, tex_c); #define tcoffsetmap tex_c
#endif #endif
#endif
/* get the alphatesting out of the way first */ /* samplers */
#ifdef MASK vec4 albedo_f = texture2D(s_diffuse, tcoffsetmap); // diffuse RGBA
/* HACK: terrible hack, CSQC sets this to mark surface as an entity vec3 normal_f = normalize(texture2D(s_normalmap, tcoffsetmap).rgb - 0.5); // normalmap RGB
only entities are alphatested - ever */
if (e_glowmod.r == 0.5)
if (diffuse_f.a < 0.6) {
discard;
}
#endif
/* lighting */
//diffuse_f.rgb = vec3(1,1,1);
diffuse_f.rgb *= lightmap_fragment();
#ifdef REFLECTCUBE /* deluxe/light */
#ifdef BUMP vec3 deluxe = normalize(texture2D(s_deluxemap, lm0).rgb);
#ifndef FLATTENNORM
vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5); #ifdef PBR
#else float metalness_f =texture2D(s_specular, tcoffsetmap).r; // specularmap R
// For very flat surfaces and gentle surface distortions, the 8-bit precision per channel in the normalmap float roughness_f = texture2D(s_specular, tcoffsetmap).g; // specularmap G
// can be insufficient. This is a hack to instead have very wobbly normalmaps that make use of the 8 bits float ao = texture2D(s_specular, tcoffsetmap).b; // specularmap B
// and then scale the wobblyness back once in the floating-point domain.
vec3 normal_f = texture2D(s_normalmap, tex_c).rgb - 0.5; /* coords */
normal_f.x *= 0.0625;
normal_f.y *= 0.0625;
normal_f = normalize(normal_f);
#endif
#else
vec3 normal_f = vec3(0, 0, 1);
#endif
vec3 cube_c; vec3 cube_c;
cube_c = reflect( normalize(-eyevector), normal_f); /* calculate cubemap texcoords */
cube_c = reflect(-normalize(eyevector), normal_f.rgb);
cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2]; cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2];
cube_c = ( m_model * vec4(cube_c.xyz, 0.0)).xyz; cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz;
diffuse_f.rgb = mix( textureCube(s_reflectcube, cube_c ).rgb, diffuse_f.rgb, diffuse_f.a);
#endif
diffuse_f *= e_colourident; /* do PBR reflection using cubemap */
gl_FragColor = albedo_f + (metalness_f * textureCube(s_reflectcube, cube_c));
#if gl_stipplealpha==1 /* do PBR specular using our handy function */
float alpha = e_colourident.a; gl_FragColor += (LightingFuncGGX(normal_f, normalize(eyevector), deluxe, roughness_f, FRESNEL) * gl_FragColor);
int x = int(mod(gl_FragCoord.x, 2.0)); #else
int y = int(mod(gl_FragCoord.y, 2.0)); gl_FragColor = albedo_f;
if (alpha <= 0.0) {
discard;
} else if (alpha <= 0.25) {
diffuse_f.a = 1.0;
if (x + y == 2)
discard;
if (x + y == 1)
discard;
} else if (alpha <= 0.5) {
diffuse_f.a = 1.0;
if (x + y == 2)
discard;
if (x + y == 0)
discard;
} else if (alpha < 1.0) {
diffuse_f.a = 1.0;
if (x + y == 2)
discard;
}
#endif #endif
#if gl_mono==1 /* calculate lightmap fragment on top */
float bw = (diffuse_f.r + diffuse_f.g + diffuse_f.b) / 3.0; gl_FragColor.rgb *= lightmap_fragment(normal_f);
diffuse_f.rgb = vec3(bw, bw, bw);
#endif
/* r_shadows 2 */
#ifdef FAKESHADOWS #ifdef FAKESHADOWS
diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); gl_FragColor.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif #endif
gl_FragColor = fog4(diffuse_f); /* emissive texture/fullbright bits */
#ifdef FULLBRIGHT
vec3 emission_f = texture2D(s_fullbright, tcoffsetmap).rgb; // fullbrightmap RGB
gl_FragColor.rgb += emission_f;
#endif
/* ambient occlusion */
#ifdef PBR
gl_FragColor.rgb *= ao;
#endif
/* and let the engine add fog on top */
gl_FragColor = fog4(gl_FragColor);
} }
#endif #endif

View file

@ -1,146 +0,0 @@
!!ver 100 450
!!permu FOG
!!samps diffuse lightmap
!!cvardf gl_mono=0
!!cvardf gl_stipplealpha=0
!!cvardf r_waterRipples=0
#include "sys/defs.h"
#include "sys/fog.h"
varying vec2 tc;
#ifdef LIT
varying vec2 lm0;
#endif
#ifdef VERTEX_SHADER
void main ()
{
tc = v_texcoord.st;
#ifdef FLOW
tc.s += e_time * -0.5;
#endif
#ifdef LIT
lm0 = v_lmcoord;
#endif
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
#ifndef ALPHA
#define USEALPHA 1.0
#else
#define USEALPHA float(ALPHA)
#endif
// Hash functions shamefully stolen from:
// https://www.shadertoy.com/view/4djSRW
#define HASHSCALE1 .1031
#define HASHSCALE3 vec3(.1031, .1030, .0973)
float hash12(vec2 p)
{
vec3 p3 = fract(vec3(p.xyx) * HASHSCALE1);
p3 += dot(p3, p3.yzx + 19.19);
return fract((p3.x + p3.y) * p3.z);
}
vec2 hash22(vec2 p)
{
vec3 p3 = fract(vec3(p.xyx) * HASHSCALE3);
p3 += dot(p3, p3.yzx+19.19);
return fract((p3.xx+p3.yz)*p3.zy);
}
void main ()
{
vec2 ntc;
ntc.s = tc.s + sin(tc.t+ e_time)*0.125;
ntc.t = tc.t + sin(tc.s+ e_time)*0.125;
vec4 diffuse_f = texture2D(s_diffuse, ntc);
diffuse_f *= e_colourident;
// awful stipple alpha code
#if gl_stipplealpha==1
float alpha = USEALPHA * e_colourident.a;
int x = int(mod(gl_FragCoord.x, 2.0));
int y = int(mod(gl_FragCoord.y, 2.0));
if (alpha <= 0.0) {
discard;
} else if (alpha <= 0.25) {
diffuse_f.a = 1.0;
if (x + y == 2)
discard;
if (x + y == 1)
discard;
} else if (alpha <= 0.5) {
diffuse_f.a = 1.0;
if (x + y == 2)
discard;
if (x + y == 0)
discard;
} else if (alpha < 1.0) {
diffuse_f.a = 1.0;
if (x + y == 2)
discard;
}
#else
#ifdef LIT
#define MAX_RADIUS 2
#if r_waterRipples ==1
float resolution = 5.0f;
float riptime = e_time;
vec2 uv = tc.xy * resolution;
vec2 p0 = floor(uv);
vec2 circles = vec2(0.);
for (int j = -MAX_RADIUS; j <= MAX_RADIUS; ++j) {
for (int i = -MAX_RADIUS; i <= MAX_RADIUS; ++i) {
vec2 pi = p0 + vec2(i, j);
#if DOUBLE_HASH
vec2 hsh = hash22(pi);
#else
vec2 hsh = pi;
#endif
vec2 p = pi + hash22(hsh);
float t = fract(0.3* riptime + hash12(hsh));
vec2 v = p - uv;
float d = length(v) - (float(MAX_RADIUS) + 1.)*t;
float h = 1e-3;
float d1 = d - h;
float d2 = d + h;
float p1 = sin(31.*d1) * smoothstep(-0.6, -0.3, d1) * smoothstep(0., -0.3, d1);
float p2 = sin(31.*d2) * smoothstep(-0.6, -0.3, d2) * smoothstep(0., -0.3, d2);
circles += .05 * normalize(v) * ((p2 - p1) / (2. * h) * (1. - t) * (1. - t));
}
}
circles /= float((MAX_RADIUS*2+1)*(MAX_RADIUS*2+1));
float intensity = mix(0.01, 0.15, smoothstep(0.1, 0.6, abs(fract(0.05* riptime + 0.5)*2.-1.)));
vec3 n = vec3(circles, sqrt(1. - dot(circles, circles)));
diffuse_f = texture2D(s_diffuse, tc + n.yz);
#endif
//diffuse_f.rgb += pow(clamp(dot(n, normalize(vec3(1., 0.7, 0.5))), 0., 1.), 6.);
diffuse_f.rgb *= (texture2D(s_lightmap, lm0) * e_lmscale).rgb;
#endif
#endif
#if gl_mono==1
float bw = (diffuse_f.r + diffuse_f.g + diffuse_f.b) / 3.0;
diffuse_f.rgb = vec3(bw, bw, bw);
#endif
gl_FragColor = fog4(diffuse_f);
}
#endif

View file

@ -1,29 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// None.
//==============================================================================
!!ver 110
!!permu FRAMEBLEND
!!permu SKELETAL
#include "sys/defs.h"
#ifdef VERTEX_SHADER
#include "sys/skeletal.h"
void main ()
{
gl_Position = skeletaltransform();
}
#endif
#ifdef FRAGMENT_SHADER
void main ()
{
gl_FragColor = vec4(0, 0, 0, 1);
}
#endif

View file

@ -1,44 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Fades surfaces in with distance. It's the opposite of the clutter shader.
//==============================================================================
!!ver 110
!!samps diffuse=0
#include "sys/defs.h"
#include "sys/fog.h"
varying vec2 tex_c;
varying float eyedist;
#ifndef TINT
#define TINT 1.0,1.0,1.0
#endif
#ifdef VERTEX_SHADER
void main ()
{
tex_c = v_texcoord;
eyedist = abs( length( e_eyepos - v_position.xyz ) ) / 1024.0;
if (eyedist > 1.0) {
eyedist = 1.0;
} else if (eyedist < 0.0) {
eyedist = 0.0;
}
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
void main ()
{
gl_FragColor = vec4( texture2D( s_diffuse, tex_c ).rgb * eyedist, eyedist );
gl_FragColor *= e_colourident;
gl_FragColor.rgb *= vec3(TINT);
}
#endif

View file

@ -1,33 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Fills any surface with a diffuse texture and applies vertex colors.
//==============================================================================
!!ver 110
!!samps tex=0
varying vec2 tc;
varying vec4 vc;
#ifdef VERTEX_SHADER
attribute vec2 v_texcoord;
attribute vec4 v_colour;
void main ()
{
tc = v_texcoord;
vc = v_colour;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
void main ()
{
vec4 f = vc;
f.rgb *= f.a;
f *= texture2D(s_tex, tc);
gl_FragColor = f;
}
#endif

View file

@ -1,62 +0,0 @@
!!ver 110
!!samps diffuse reflectcube normalmap
#include "sys/defs.h"
varying vec2 tex_c;
varying vec3 eyevector;
varying mat3 invsurface;
#ifdef VERTEX_SHADER
void main ()
{
tex_c = v_texcoord;
gl_Position = ftetransform();
invsurface[0] = v_svector;
invsurface[1] = v_tvector;
invsurface[2] = v_normal;
vec3 eyeminusvertex = e_eyepos - v_position.xyz;
eyevector.x = dot( eyeminusvertex, v_svector.xyz );
eyevector.y = dot( eyeminusvertex, v_tvector.xyz );
eyevector.z = dot( eyeminusvertex, v_normal.xyz );
}
#endif
#ifdef FRAGMENT_SHADER
void main ( void )
{
vec4 diffuse_f = texture2D(s_diffuse, tex_c);
if (diffuse_f.rgb == vec3(0,0,1)) {
diffuse_f.rgb = vec3(0,0,0);
discard;
}
#ifdef BUMP
#ifndef FLATTENNORM
vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
#else
// For very flat surfaces and gentle surface distortions, the 8-bit precision per channel in the normalmap
// can be insufficient. This is a hack to instead have very wobbly normalmaps that make use of the 8 bits
// and then scale the wobblyness back once in the floating-point domain.
vec3 normal_f = texture2D(s_normalmap, tex_c).rgb - 0.5;
normal_f.x *= 0.0625;
normal_f.y *= 0.0625;
normal_f = normalize(normal_f);
#endif
#else
vec3 normal_f = vec3(0, 0, 1);
#endif
vec3 cube_c;
vec4 out_f = vec4( 1.0, 1.0, 1.0, 1.0 );
cube_c = reflect( normalize(-eyevector), normal_f);
cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2];
cube_c = ( m_model * vec4(cube_c.xyz, 0.0)).xyz;
out_f.rgb = mix( textureCube(s_reflectcube, cube_c ).rgb, diffuse_f.rgb, diffuse_f.a);
diffuse_f = out_f * e_colourident;
gl_FragColor = diffuse_f;
}
#endif

View file

@ -1,56 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Non-lit surface that predominantly offers environment cube reflection
// modulated by the diffusemap's RGB. This is used for glass, for example.
//==============================================================================
!!ver 110
!!permu FOG
!!samps diffusemap=0 normalmap=1 reflect=2
#include "sys/defs.h"
varying vec2 tex_c;
varying vec3 eyevector;
varying mat3 invsurface;
varying vec4 tf;
#ifdef VERTEX_SHADER
void main ()
{
tex_c = v_texcoord;
invsurface[0] = v_svector;
invsurface[1] = v_tvector;
invsurface[2] = v_normal;
vec3 eyeminusvertex = e_eyepos - v_position.xyz;
eyevector.x = dot( eyeminusvertex, v_svector.xyz );
eyevector.y = dot( eyeminusvertex, v_tvector.xyz );
eyevector.z = dot( eyeminusvertex, v_normal.xyz );
tf = ftetransform();
gl_Position = tf;
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
void main ()
{
vec2 stc;
vec3 out_f;
vec4 diffuse_f = texture2D(s_diffusemap, tex_c);
vec3 norm_f;
norm_f = ( texture2D( s_normalmap, tex_c + vec2( e_time * 0.01, 0.0 ) ).xyz);
norm_f += ( texture2D( s_normalmap, tex_c - vec2( 0, e_time * 0.01 ) ).xyz);
norm_f -= 1.0 - ( 4.0 / 256.0 );
norm_f = normalize( norm_f );
stc = (1.0 + (tf.xy / tf.w)) * 0.5;
diffuse_f.rgb = texture2D(s_reflect, stc + norm_f.st).rgb;
gl_FragColor = diffuse_f;
}
#endif

View file

@ -1,33 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Shader used for fading out surfaces after a certain distance.
// It only has a diffuse map.
//==============================================================================
!!ver 110
!!samps diffuse=0
#include "sys/defs.h"
#include "sys/fog.h"
varying vec2 tex_c;
varying vec4 vex_color;
#ifdef VERTEX_SHADER
void main ()
{
tex_c = v_texcoord;
vex_color = v_colour;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
void main ()
{
vec4 diffuse_f = texture2D(s_diffuse, tex_c) * vex_color.a;
gl_FragColor = diffuse_f;
}
#endif

View file

@ -1,245 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Lightmapped surface.
//
// diffusemap = albedo (rgba)
// normalmap = normal (rgb), reflectmask (a)
//==============================================================================
!!ver 110
!!permu FOG
!!permu BUMP
!!permu DELUXE
!!permu LIGHTSTYLED
!!permu FULLBRIGHT
!!permu UPPERLOWER
!!samps diffuse
!!samps lightmap
!!samps =BUMP normalmap reflectcube
!!samps =LIGHTSTYLED lightmap1 lightmap2 lightmap3
!!samps =DELUXE deluxemap
!!samps =LIGHTSTYLED =DELUXE deluxemap1 deluxemap2 deluxemap3
!!samps =FULLBRIGHT fullbright
!!samps =UPPERLOWER upper
!!permu FAKESHADOWS
!!cvardf r_glsl_pcf
!!cvardf r_fullbright
!!samps =FAKESHADOWS shadowmap
!!cvardf r_skipDiffuse
!!cvardf r_skipFullbright
!!cvardf r_skipNormal
!!cvardf r_skipEnvmap
!!cvardf r_skipLightmap
!!cvardf r_skipDetail
#include "sys/defs.h"
// basics
varying vec2 tex_c;
varying vec2 lm0;
// unfortunately we do support lightstyles
#if defined(LIGHTSTYLED)
varying vec2 lm1, lm2, lm3;
#endif
// useful for terrain blending
varying vec4 vex_color;
// dynamic shadows
#ifdef FAKESHADOWS
varying vec4 vtexprojcoord;
#endif
#ifdef BUMP
varying vec3 eyevector;
varying mat3 invsurface;
#endif
varying vec3 norm;
#ifdef VERTEX_SHADER
void lightmapped_init(void)
{
lm0 = v_lmcoord;
#if defined(LIGHTSTYLED)
lm1 = v_lmcoord2;
lm2 = v_lmcoord3;
lm3 = v_lmcoord4;
#endif
}
void main ()
{
lightmapped_init();
tex_c = v_texcoord;
vex_color = v_colour;
gl_Position = ftetransform();
#ifdef FAKESHADOWS
vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0));
#endif
#ifdef BUMP
vec3 eyeminusvertex = e_eyepos - v_position.xyz;
eyevector.x = dot(eyeminusvertex, v_svector.xyz);
eyevector.y = dot(eyeminusvertex, v_tvector.xyz);
eyevector.z = dot(eyeminusvertex, v_normal.xyz);
invsurface[0] = v_svector;
invsurface[1] = v_tvector;
invsurface[2] = v_normal;
#endif
norm = v_normal;
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
#include "sys/pcf.h"
#if defined(LIGHTSTYLED)
#define LIGHTMAP0 texture2D(s_lightmap0, lm0).rgb
#define LIGHTMAP1 texture2D(s_lightmap1, lm1).rgb
#define LIGHTMAP2 texture2D(s_lightmap2, lm2).rgb
#define LIGHTMAP3 texture2D(s_lightmap3, lm3).rgb
#else
#define LIGHTMAP texture2D(s_lightmap, lm0).rgb
#endif
#if r_skipLightmap == 0
vec3 lightmap_fragment()
{
vec3 lightmaps;
#if defined(LIGHTSTYLED)
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb;
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb;
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb;
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb;
#else
lightmaps = LIGHTMAP * e_lmscale.rgb;
#endif
return (r_fullbright == 1) ? vec3(1.0, 1.0, 1.0) : lightmaps;
}
vec3 lightmap_fragment(vec3 normal_f)
{
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps;
#if defined(LIGHTSTYLED)
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb * dot(normal_f, texture2D(s_deluxemap0, lm0).rgb);
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb * dot(normal_f, texture2D(s_deluxemap1, lm1).rgb);
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb * dot(normal_f, texture2D(s_deluxemap2, lm2).rgb);
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb * dot(normal_f, texture2D(s_deluxemap3, lm3).rgb);
#else
lightmaps = LIGHTMAP * e_lmscale.rgb * dot(normal_f, texture2D(s_deluxemap, lm0).rgb);
#endif
return (r_fullbright == 1) ? vec3(1.0, 1.0, 1.0) : lightmaps;
#endif
}
#else
vec3 lightmap_fragment()
{
return vec3(1.0,1.0,1.0);
}
vec3 lightmap_fragment(vec3 normal_f)
{
return vec3(1.0,1.0,1.0);
}
#endif
float lambert(vec3 normal, vec3 dir)
{
return max(dot(normal, dir), 0.0);
}
void main (void)
{
vec4 diffuse_f;
float alpha;
#if r_skipDiffuse == 0
diffuse_f = texture2D(s_diffuse, tex_c);
#else
diffuse_f = vec4(1.0, 1.0, 1.0, 1.0);
#endif
#ifdef MASK
// alpha-testing happens here
if (diffuse_f.a < MASK)
discard;
#endif
#if r_skipDetail == 0
#if defined(UPPERLOWER)
diffuse_f.rgb *= (texture2D(s_upper, tex_c * 4.0).rgb + 0.5);
#endif
#endif
#ifdef FAKESHADOWS
diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif
// the lighting stage for the world
#if defined(BUMP)
float refl = texture2D(s_normalmap, tex_c).a;
// whether to respect our bump, or to act flat
#if r_skipNormal == 0
vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
diffuse_f.rgb *= lightmap_fragment(normal_f);
#else
vec3 normal_f = vec3(0.0, 0.0, 1.0);
diffuse_f.rgb *= lightmap_fragment();
#endif
// environment mapping happens here
#if r_skipEnvmap == 0
vec3 cube_c;
vec3 env_f;
cube_c = reflect(normalize(-eyevector), vec3(0.0, 0.0, 1.0));
cube_c = cube_c.x * invsurface[0] +
cube_c.y * invsurface[1] +
cube_c.z * invsurface[2];
cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz;
env_f = textureCube(s_reflectcube, cube_c).rgb * (e_lmscale.rgb * 0.25);
diffuse_f.rgb = mix(env_f, diffuse_f.rgb, refl);
#else
diffuse_f.rgb = mix(vec3(0.0, 0.0, 0.0), diffuse_f.rgb, refl);
#endif
#else
diffuse_f.rgb *= lightmap_fragment();
#endif
#if defined(FULLBRIGHT) && r_skipFullbright == 0
diffuse_f.rgb += texture2D(s_fullbright, tex_c).rgb;
#endif
#if defined (VERTEXLIT)
vec3 light;
/* directional light */
light = (vec3(0.5,0.5,0.5) * lambert(norm, vec3(-1,-0.5,0.5))) * 2.0;
light += (vec3(0.25,0.25,0.25) * lambert(norm, reflect(norm, vec3(0.75, 0, 0)))) * 0.5;
light *= 2.0;
diffuse_f.rgb = texture2D(s_diffuse, tex_c).rgb * light;
#endif
// start blend at half-way point
alpha = vex_color.a * 1.5;
if (alpha > 1.0)
alpha = 1.0;
gl_FragColor = vec4(fog3(diffuse_f.rgb), alpha);
}
#endif

View file

@ -1,167 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Lightmapped surface that effectively acts as a mirror.
// Alpha channel of the diffusemap is referenced for reflectivity.
//==============================================================================
!!ver 110
!!permu FOG
!!permu BUMP
!!permu DELUXE
!!samps diffuse lightmap deluxemap normalmap
!!samps reflect=0
!!permu FAKESHADOWS
!!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap
!!cvardf r_skipDiffuse
!!cvardf r_skipNormal
!!cvardf r_skipLightmap
#include "sys/defs.h"
varying vec2 tex_c;
varying mat3 invsurface;
varying vec4 tf;
varying vec2 lm0;
#ifdef LIGHTSTYLED
varying vec2 lm1, lm2, lm3;
#endif
#ifdef FAKESHADOWS
varying vec4 vtexprojcoord;
#endif
#ifdef VERTEX_SHADER
void lightmapped_init(void)
{
lm0 = v_lmcoord;
#ifdef LIGHTSTYLED
lm1 = v_lmcoord2;
lm2 = v_lmcoord3;
lm3 = v_lmcoord4;
#endif
}
void main (void)
{
lightmapped_init();
invsurface[0] = v_svector;
invsurface[1] = v_tvector;
invsurface[2] = v_normal;
tf = ftetransform();
tex_c = v_texcoord;
gl_Position = tf;
#ifdef FAKESHADOWS
vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0));
#endif
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
#include "sys/pcf.h"
#define s_reflect s_t0
#if r_skipLightmap==0
#ifdef LIGHTSTYLED
#define LIGHTMAP0 texture2D(s_lightmap0, lm0).rgb
#define LIGHTMAP1 texture2D(s_lightmap1, lm1).rgb
#define LIGHTMAP2 texture2D(s_lightmap2, lm2).rgb
#define LIGHTMAP3 texture2D(s_lightmap3, lm3).rgb
#else
#define LIGHTMAP texture2D(s_lightmap, lm0).rgb
#endif
#else
#ifdef LIGHTSTYLED
#define LIGHTMAP0 vec3(0.5,0.5,0.5)
#define LIGHTMAP1 vec3(0.5,0.5,0.5)
#define LIGHTMAP2 vec3(0.5,0.5,0.5)
#define LIGHTMAP3 vec3(0.5,0.5,0.5)
#else
#define LIGHTMAP vec3(0.5,0.5,0.5)
#endif
#endif
vec3 lightmap_fragment()
{
vec3 lightmaps;
#ifdef LIGHTSTYLED
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb;
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb;
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb;
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb;
#else
lightmaps = LIGHTMAP * e_lmscale.rgb;
#endif
return lightmaps;
}
#if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f)
{
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps;
#if defined(LIGHTSTYLED)
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb * dot(normal_f, texture2D(s_deluxemap0, lm0).rgb);
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb * dot(normal_f, texture2D(s_deluxemap1, lm1).rgb);
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb * dot(normal_f, texture2D(s_deluxemap2, lm2).rgb);
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb * dot(normal_f, texture2D(s_deluxemap3, lm3).rgb );
#else
lightmaps = LIGHTMAP * e_lmscale.rgb * dot(normal_f, texture2D(s_deluxemap, lm0).rgb);
#endif
return lightmaps;
#endif
}
#endif
void main (void)
{
vec2 stc;
vec4 diffuse_f;
#if r_skipDiffuse == 0
diffuse_f = texture2D(s_diffuse, tex_c);
#else
diffuse_f = vec4(1.0, 1.0, 1.0, 1.0);
#endif
#if r_skipNormal==1
#define normal_f vec3(0.0,0.0,0.5)
#else
vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
#endif
float refl = texture2D(s_normalmap, tex_c).a;
#if r_skipNormal==1
diffuse_f.rgb *= lightmap_fragment();
#else
diffuse_f.rgb *= lightmap_fragment(normal_f);
#endif
/* map the reflection buffer onto the surface */
stc = (1.0 + (tf.xy / tf.w)) * 0.5;
stc.t -= 1.5* invsurface[2].z / 1080.0;
diffuse_f.rgb = mix(texture2D(s_reflect, stc).rgb, diffuse_f.rgb, refl);
#ifdef FAKESHADOWS
diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif
gl_FragColor = fog4(diffuse_f);
}
#endif

View file

@ -1,166 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Lightmapped surface, normalmap's alpha contains the reference for how
// specular it should be.
//==============================================================================
!!ver 110
!!permu FOG
!!permu BUMP
!!permu DELUXE
!!samps diffuse normalmap lightmap deluxemap
!!permu FAKESHADOWS
!!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap
!!cvardf r_skipDiffuse
!!cvardf r_skipNormal
!!cvardf r_skipSpecular
!!cvardf r_skipLightmap
#include "sys/defs.h"
varying vec2 tex_c;
varying vec3 eyevector;
varying vec2 lm0;
#ifdef LIGHTSTYLED
varying vec2 lm1, lm2, lm3;
#endif
#ifdef FAKESHADOWS
varying vec4 vtexprojcoord;
#endif
#ifdef VERTEX_SHADER
void lightmapped_init(void)
{
lm0 = v_lmcoord;
#ifdef LIGHTSTYLED
lm1 = v_lmcoord2;
lm2 = v_lmcoord3;
lm3 = v_lmcoord4;
#endif
}
void main ()
{
lightmapped_init();
tex_c = v_texcoord;
vec3 eyeminusvertex = e_eyepos - v_position.xyz;
eyevector.x = dot(eyeminusvertex, v_svector.xyz);
eyevector.y = dot(eyeminusvertex, v_tvector.xyz);
eyevector.z = dot(eyeminusvertex, v_normal.xyz);
gl_Position = ftetransform();
#ifdef FAKESHADOWS
vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0));
#endif
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
#include "sys/pcf.h"
#if r_skipLightmap==0
#ifdef LIGHTSTYLED
#define LIGHTMAP0 texture2D(s_lightmap0, lm0).rgb
#define LIGHTMAP1 texture2D(s_lightmap1, lm1).rgb
#define LIGHTMAP2 texture2D(s_lightmap2, lm2).rgb
#define LIGHTMAP3 texture2D(s_lightmap3, lm3).rgb
#else
#define LIGHTMAP texture2D(s_lightmap, lm0).rgb
#endif
#else
#ifdef LIGHTSTYLED
#define LIGHTMAP0 vec3(0.5,0.5,0.5)
#define LIGHTMAP1 vec3(0.5,0.5,0.5)
#define LIGHTMAP2 vec3(0.5,0.5,0.5)
#define LIGHTMAP3 vec3(0.5,0.5,0.5)
#else
#define LIGHTMAP vec3(0.5,0.5,0.5)
#endif
#endif
vec3 lightmap_fragment()
{
vec3 lightmaps;
#ifdef LIGHTSTYLED
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb;
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb;
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb;
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb;
#else
lightmaps = LIGHTMAP * e_lmscale.rgb;
#endif
return lightmaps;
}
#if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f)
{
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps;
#if defined(LIGHTSTYLED)
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb * dot(normal_f, texture2D(s_deluxemap0, lm0).rgb);
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb * dot(normal_f, texture2D(s_deluxemap1, lm1).rgb);
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb * dot(normal_f, texture2D(s_deluxemap2, lm2).rgb);
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb * dot(normal_f, texture2D(s_deluxemap3, lm3).rgb);
#else
lightmaps = LIGHTMAP * e_lmscale.rgb * dot(normal_f, texture2D(s_deluxemap, lm0).rgb);
#endif
return lightmaps;
#endif
}
#endif
void main (void)
{
#if r_skipDiffuse==0
vec4 diffuse_f = texture2D(s_diffuse, tex_c);
#else
vec4 diffuse_f = vec4(1.0,1.0,1.0,1.0);
#endif
#if r_skipNormal==1
vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
#else
#define normal_f vec3(0.0,0.0,0.5)
#endif
if (diffuse_f.a < 0.5) {
discard;
}
#ifdef FAKESHADOWS
diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif
#if r_skipNormal==1
diffuse_f.rgb *= lightmap_fragment();
#else
diffuse_f.rgb *= lightmap_fragment(normal_f);
#endif
#if r_skipSpecular==0
float gloss = texture2D(s_normalmap, tex_c).a * 0.1;
vec3 halfdir = normalize(normalize(eyevector) - e_light_dir);
float spec = pow(max(dot(halfdir, normal_f), 0.0), FTE_SPECULAR_EXPONENT);
spec *= gloss;
diffuse_f.rgb += spec;
#endif
gl_FragColor = fog4(diffuse_f);
}
#endif

View file

@ -1,36 +0,0 @@
//======= Copyright (c) 2023 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Unlit surface.
//==============================================================================
!!ver 110
!!permu FOG
!!samps diffuse
#include "sys/defs.h"
#include "sys/fog.h"
varying vec2 tex_c;
#ifdef VERTEX_SHADER
void main ()
{
tex_c = v_texcoord;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
void main ()
{
vec4 d_f = vec4(1.0, 1.0, 1.0, 1.0) - texture2D( s_diffuse, tex_c );
if (d_f.a > 0.5) {
discard;
}
gl_FragColor = fog4( d_f );
}
#endif

View file

@ -1,31 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Default post-processing shader for the framebuffer.
// Does a 'dodge' filter onto the final scene.
//==============================================================================
!!samps screen=0
#ifdef VERTEX_SHADER
attribute vec2 v_texcoord;
varying vec2 texcoord;
void main()
{
texcoord = v_texcoord.xy;
texcoord.y = 1.0 - texcoord.y;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
varying vec2 texcoord;
void main()
{
vec4 colortint = vec4(COLOR);
vec3 dodged = vec3(1.0,1.0,1.0) - (colortint.rgb * colortint.a);
gl_FragColor.rgb = texture2D(s_screen, texcoord).rgb / dodged;
}
#endif

View file

@ -1,53 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Non-lit surface that predominantly offers environment cube reflection
// modulated by the diffusemap's RGB. This is used for glass, for example.
//==============================================================================
!!ver 110
!!permu FOG
!!samps diffusemap=0 normalmap=1 cubemap:samplerCube=2
#include "sys/defs.h"
varying vec2 tex_c;
varying vec3 eyevector;
varying mat3 invsurface;
#ifdef VERTEX_SHADER
void main ()
{
tex_c = v_texcoord;
invsurface[0] = v_svector;
invsurface[1] = v_tvector;
invsurface[2] = v_normal;
vec3 eyeminusvertex = e_eyepos - v_position.xyz;
eyevector.x = dot( eyeminusvertex, v_svector.xyz );
eyevector.y = dot( eyeminusvertex, v_tvector.xyz );
eyevector.z = dot( eyeminusvertex, v_normal.xyz );
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
void main ()
{
vec3 out_f;
vec3 diffuse_f = texture2D(s_diffusemap, tex_c).rgb;
vec3 normal_f = texture2D(s_normalmap, tex_c).rgb - 0.5;
normal_f.x *= 0.2;
normal_f.y *= 0.2;
normal_f = normalize(normal_f);
vec3 rtc = reflect( normalize( -eyevector ), normal_f );
rtc = rtc.x * invsurface[0] + rtc.y * invsurface[1] + rtc.z * invsurface[2];
rtc = ( m_model * vec4( rtc.xyz, 0.0 ) ).xyz;
diffuse_f = textureCube(s_cubemap, rtc).rgb * (diffuse_f * 2.5);
gl_FragColor = fog4(vec4( diffuse_f, 1.0 ));
}
#endif

View file

@ -1,45 +0,0 @@
!!ver 110
!!samps refraction=0 normalmap=1
#include "sys/defs.h"
varying vec2 tex_c;
varying mat3 invsurface;
varying vec4 tf_c;
varying vec3 eyeminusvertex;
#ifdef VERTEX_SHADER
void main ()
{
invsurface[0] = v_svector;
invsurface[1] = v_tvector;
invsurface[2] = v_normal;
tf_c = ftetransform();
tex_c = v_texcoord;
gl_Position = tf_c;
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
void main ( void )
{
vec2 refl_c;
vec3 refr_f;
vec3 norm_f;
vec4 out_f = vec4( 1.0, 1.0, 1.0, 1.0 );
norm_f = ( texture2D( s_normalmap, tex_c + vec2( e_time * 0.01, 0.0 ) ).xyz);
norm_f += ( texture2D( s_normalmap, tex_c - vec2( 0, e_time * 0.01 ) ).xyz);
norm_f -= 1.0 - ( 4.0 / 256.0 );
norm_f = normalize( norm_f );
// Reflection/View coordinates
refl_c = ( 1.0 + ( tf_c.xy / tf_c.w ) ) * 0.5;
refr_f = texture2D( s_refraction, refl_c + ( norm_f.st) ).rgb;
out_f.rgb = refr_f;
gl_FragColor = out_f;
}
#endif

View file

@ -1,181 +1,230 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. ======= //======= Copyright (c) 2015-2021 Vera Visions LLC. All rights reserved. =======
// //
// Purpose: // Purpose:
// //
// Code for all the dynamic light passes. The renderer is not aware of any // Lightmapped surface that contains an environment cube as a reflection.
// surface properties beyond diffuse, normal and specularity. // Alpha channel of the diffuse decides reflectivity.
// Alpha-masked surfaces suffer greatly because of this.
//
// diffusemap = albedo (rgba)
// normalmap = normal (rgb), reflectmask (a)
//============================================================================== //==============================================================================
!!ver 100 300 !!ver 100 150
!!permu BUMP !!permu BUMP
!!permu FRAMEBLEND !!permu FRAMEBLEND
!!permu SKELETAL !!permu SKELETAL
!!permu FOG
!!permu UPPERLOWER !!permu UPPERLOWER
!!permu FOG
!!permu REFLECTCUBEMASK
!!cvarf r_glsl_offsetmapping_scale
!!cvardf r_glsl_pcf !!cvardf r_glsl_pcf
!!samps diffuse !!cvardf r_glsl_fresnel
!!samps =BUMP normalmap reflectcube
!!samps =PCF shadowmap
!!samps =CUBE projectionmap
!!samps =UPPERLOWER upper
!!cvardf r_skipDiffuse !!samps diffuse shadowmap projectionmap
!!samps =BUMP normalmap
!!samps =UPPERLOWER upper lower
!!samps =SPECULAR specular reflectcube
!!samps =FAKESHADOWS shadowmap
#include "sys/defs.h" #include "sys/defs.h"
//if there's no vertex normals known, disable some stuff. varying vec2 tcbase;
//FIXME: this results in dupe permutations.
#ifdef NOBUMP
#undef SPECULAR
#undef BUMP
#endif
varying vec2 tex_c;
varying vec3 lightvector; varying vec3 lightvector;
#define VERTEXCOLOURS #ifdef VERTEXCOLOURS
varying vec4 vc;
#if defined(VERTEXCOLOURS)
varying vec4 vc;
#endif #endif
#ifdef BUMP #ifdef SPECULAR
varying vec3 eyevector; varying vec3 eyevector;
varying mat3 invsurface; varying mat3 invsurface;
#define PBR
#endif #endif
#if defined(PCF) || defined(CUBE) || defined(SPOT) || defined(ORTHO) #if defined(PCF) || defined(CUBE) || defined(SPOT)
varying vec4 vtexprojcoord; varying vec4 vtexprojcoord;
#endif #endif
#ifdef VERTEX_SHADER #ifdef VERTEX_SHADER
#include "sys/skeletal.h" #include "sys/skeletal.h"
void main () void main ()
{ {
vec3 n, s, t, w; vec3 n, s, t, w;
gl_Position = skeletaltransform_wnst(w,n,s,t); gl_Position = skeletaltransform_wnst(w,n,s,t);
n = normalize(n); tcbase = v_texcoord; //pass the texture coords straight through
s = normalize(s); vec3 lightminusvertex = l_lightposition - w.xyz;
t = normalize(t);
tex_c = v_texcoord; #ifdef NOBUMP
#ifdef ORTHO //the only important thing is distance
vec3 lightminusvertex = -l_lightdirection; lightvector = lightminusvertex;
#else
//the light direction relative to the surface normal, for bumpmapping.
lightvector.x = dot(lightminusvertex, s.xyz); lightvector.x = dot(lightminusvertex, s.xyz);
lightvector.y = dot(lightminusvertex, t.xyz); lightvector.y = dot(lightminusvertex, t.xyz);
lightvector.z = dot(lightminusvertex, n.xyz); lightvector.z = dot(lightminusvertex, n.xyz);
#else
vec3 lightminusvertex = l_lightposition - w.xyz;
#ifdef NOBUMP
lightvector = lightminusvertex;
#else
// light direction relative to the surface normal, for bumpmapping.
lightvector.x = dot(lightminusvertex, s.xyz);
lightvector.y = dot(lightminusvertex, t.xyz);
lightvector.z = dot(lightminusvertex, n.xyz);
#endif
#endif #endif
#if defined(VERTEXCOLOURS) #ifdef VERTEXCOLOURS
vc = v_colour; vc = v_colour;
#endif #endif
#ifdef BUMP #ifdef SPECULAR
vec3 eyeminusvertex = e_eyepos - w.xyz; vec3 eyeminusvertex = e_eyepos - w.xyz;
eyevector.x = dot(eyeminusvertex, s.xyz); eyevector.x = dot(eyeminusvertex, s.xyz);
eyevector.y = dot(eyeminusvertex, t.xyz); eyevector.y = dot(eyeminusvertex, t.xyz);
eyevector.z = dot(eyeminusvertex, n.xyz); eyevector.z = dot(eyeminusvertex, n.xyz);
invsurface = mat3(v_svector, v_tvector, v_normal); invsurface[0] = v_svector;
invsurface[1] = v_tvector;
invsurface[2] = v_normal;
#endif #endif
#if defined(PCF) || defined(SPOT) || defined(CUBE) || defined(ORTHO) #if defined(PCF) || defined(SPOT) || defined(CUBE)
//for texture projections/shadowmapping on dlights //for texture projections/shadowmapping on dlights
vtexprojcoord = (l_cubematrix*vec4(w.xyz, 1.0)); vtexprojcoord = (l_cubematrix*vec4(w.xyz, 1.0));
#endif #endif
} }
#endif #endif
#ifdef FRAGMENT_SHADER #ifdef FRAGMENT_SHADER
vec3 LightingFuncShlick(vec3 N, vec3 V, vec3 L, float roughness, vec3 Cdiff, vec3 F0)
{
vec3 H = normalize(V+L);
float NL = clamp(dot(N,L), 0.001, 1.0);
float LH = clamp(dot(L,H), 0.0, 1.0);
float NH = clamp(dot(N,H), 0.0, 1.0);
float NV = clamp(abs(dot(N,V)), 0.001, 1.0);
float VH = clamp(dot(V,H), 0.0, 1.0);
float PI = 3.14159f;
//Fresnel term
//the fresnel models glancing light.
//(Schlick)
vec3 F = F0 + (1.0-F0)*pow(1.0-VH, 5.0);
//Schlick
float k = roughness*0.79788456080286535587989211986876;
float G = (LH/(LH*(1.0-k)+k)) * (NH/(NH*(1.0-k)+k));
//microfacet distribution
float a = roughness*roughness;
a *= a;
float t = (NH*NH*(a-1.0)+1.0);
float D = a/(PI*t*t);
if (r_glsl_fresnel == 1)
return vec3(F);
if (r_glsl_fresnel == 2)
return vec3(G);
if (r_glsl_fresnel == 3)
return vec3(D);
return ((1.0-F)*(Cdiff/PI) +
(F*G*D)/(4*NL*NV)) * NL;
}
#include "sys/fog.h" #include "sys/fog.h"
#include "sys/pcf.h" #include "sys/pcf.h"
#ifdef OFFSETMAPPING
#include "sys/offsetmapping.h"
#endif
void main () void main ()
{ {
#ifdef OFFSETMAPPING
vec2 tcoffsetmap = offsetmap(s_normalmap, tcbase, eyevector);
#define tcbase tcoffsetmap
#endif
vec4 albedo_f = texture2D(s_diffuse, tcbase);
#ifdef BUMP
vec3 normal_f = normalize(texture2D(s_normalmap, tcbase).rgb - 0.5);
#else
vec3 normal_f = vec3(0.0, 0.0, 1.0);
#endif
#ifdef ORTHO #ifdef ORTHO
float colorscale = 1.0; float colorscale = 1.0;
#else #else
float colorscale = max(1.0 - (dot(lightvector, lightvector)/(l_lightradius*l_lightradius)), 0.0); float colorscale = max(1.0 - (dot(lightvector, lightvector)/(l_lightradius*l_lightradius)), 0.0);
#endif #endif
/* filter the light by the shadowmap. logically a boolean, but we allow fractions for softer shadows */
#ifdef PCF #ifdef PCF
/* filter the light by the shadowmap. logically a boolean, but we allow fractions for softer shadows */
colorscale *= ShadowmapFilter(s_shadowmap, vtexprojcoord); colorscale *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif #endif
/* filter the colour by the spotlight. discard anything behind the light so we don't get a mirror image */ #ifdef SPOT
#if defined(SPOT) /* filter the colour by the spotlight. discard anything behind the light so we don't get a mirror image */
if (vtexprojcoord.w < 0.0) if (vtexprojcoord.w < 0.0) discard;
discard;
vec2 spot = ((vtexprojcoord.st)/vtexprojcoord.w); vec2 spot = ((vtexprojcoord.st)/vtexprojcoord.w);
colorscale*=1.0-(dot(spot,spot)); colorscale*=1.0-(dot(spot,spot));
#endif #endif
#if defined(FLAT) if (colorscale > 0)
vec4 bases = vec4(FLAT, FLAT, FLAT, 1.0); {
#else vec3 out_f;
#if r_skipDiffuse == 0
vec4 bases = texture2D(s_diffuse, tex_c); #ifdef FLAT
albedo_f = vec4(FLAT, FLAT, FLAT, 1.0);
#else #else
vec4 bases = vec4(1.0, 1.0, 1.0, 1.0); #ifdef VERTEXCOLOURS
#endif albedo_f.rgb *= albedo_f.a;
#endif #endif
#ifdef BUMP
vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5) * 2.0;
float refl = 1.0 - texture2D(s_normalmap, tex_c).a;
#endif
#ifdef NOBUMP
// surface can only support ambient lighting, even for lights that try to avoid it.
vec3 diff = bases.rgb * (l_lightcolourscale.x + l_lightcolourscale.y);
#else
vec3 nl = normalize(lightvector);
#ifdef BUMP
vec3 diff = bases.rgb * (l_lightcolourscale.x + l_lightcolourscale.y * max(dot(normal_f, nl), 0.0));
#else
//we still do bumpmapping even without normal_f to ensure colours are always sane. light.exe does it too.
vec3 diff = bases.rgb * (l_lightcolourscale.x + l_lightcolourscale.y * max(dot(vec3(0.0, 0.0, 1.0), nl), 0.0));
#endif
#endif
/* respect the reflectcube surface */
#ifdef BUMP
vec3 rtc = reflect(-eyevector, normal_f);
rtc = rtc.x * invsurface[0] + rtc.y * invsurface[1] + rtc.z * invsurface[2];
rtc = (m_model * vec4(rtc.xyz,0.0)).xyz;
diff += textureCube(s_reflectcube, rtc).rgb * refl;
#endif
/* filter the colour by the cubemap projection */
#ifdef CUBE
diff *= textureCube(s_projectionmap, vtexprojcoord.xyz).rgb;
#endif
diff.rgb *= bases.a;
diff *= colorscale * l_lightcolour;
diff.rgb *= vc.a;
#if defined(UPPERLOWER)
diff.rgb *= (texture2D(s_upper, tex_c * 4.0).rgb + 0.5);
#endif #endif
gl_FragColor = vec4(fog3additive(diff), vc.a); #ifdef UPPER
vec4 uc = texture2D(s_upper, tcbase);
albedo_f.rgb += uc.rgb*e_uppercolour*uc.a;
#endif
#ifdef LOWER
vec4 lc = texture2D(s_lower, tcbase);
albedo_f.rgb += lc.rgb*e_lowercolour*lc.a;
#endif
#ifdef PBR
float metalness_f =texture2D(s_specular, tcbase).r;
float roughness_f = texture2D(s_specular, tcbase).g;
float ao = texture2D(s_specular, tcbase).b;
vec3 nl = normalize(lightvector);
out_f = albedo_f.rgb * (l_lightcolourscale.x + l_lightcolourscale.y * max(dot(normal_f.rgb, nl), 0.0));
const vec3 dielectricSpecular = vec3(0.04, 0.04, 0.04);
const vec3 black = vec3(0.0, 0.0, 0.0);
vec3 F0 = mix(dielectricSpecular, albedo_f.rgb, metalness_f);
albedo_f.rgb = mix(albedo_f.rgb * (1.0 - dielectricSpecular.r), black, metalness_f);
out_f = LightingFuncShlick(normal_f.rgb, normalize(eyevector), nl, roughness_f, albedo_f.rgb, F0);
vec3 cube_c = reflect(-eyevector, normal_f.rgb);
cube_c = cube_c.x*invsurface[0] + cube_c.y*invsurface[1] + cube_c.z*invsurface[2];
cube_c = vec4(m_model * vec4(cube_c.xyz,0.0)).xyz;
out_f.rgb = out_f.rgb + (vec3(metalness_f,metalness_f,metalness_f) * textureCube(s_reflectcube, cube_c).rgb);
#endif
#ifdef CUBE
/* filter the colour by the cubemap projection */
out_f *= textureCube(s_projectionmap, vtexprojcoord.xyz).rgb;
#endif
#ifdef PROJECTION
/* 2d projection, not used */
out_f *= texture2d(s_projectionmap, shadowcoord);
#endif
#ifdef VERTEXCOLOURS
out_f *= vc.rgb * vc.a;
#endif
gl_FragColor.rgb = fog3additive(out_f * colorscale * l_lightcolour);
} else {
gl_FragColor.rgb = vec3(0.0);
}
} }
#endif #endif

View file

@ -1,53 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Basic skybox shader with two clouds rendered on top using a dodge filter.
//==============================================================================
!!ver 110
!!permu FOG
!!samps box:samplerCube=0 cloudA=1 cloudB=2
#include "sys/defs.h"
#include "sys/fog.h"
varying vec3 cloudpos;
varying vec3 boxpos;
#ifdef VERTEX_SHADER
void main ()
{
boxpos = v_position.xyz - e_eyepos;
cloudpos = v_position.xyz;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
#define s_cloud1 s_t0
#define s_cloud2 s_t1
void main ()
{
vec4 skybox = textureCube( s_box, boxpos );
vec2 tccoord;
vec3 dir = cloudpos - e_eyepos;
dir.z *= 3.0;
dir.xy /= 0.5 * length( dir );
tccoord = ( dir.xy + e_time * 0.015 );
vec4 cloud1_f = texture2D( s_cloudA, tccoord );
tccoord = ( dir.xy + e_time * 0.02 );
vec4 cloud2_f = texture2D( s_cloudB, tccoord );
vec3 dodged1 = vec3(1.0,1.0,1.0) - (cloud1_f.rgb * vec3(cloud1_f.a, cloud1_f.a, cloud1_f.a));
vec3 dodged2 = vec3(1.0,1.0,1.0) - (cloud2_f.rgb * vec3(cloud2_f.a, cloud2_f.a, cloud2_f.a));
gl_FragColor.rgb = skybox.rgb / dodged1;
gl_FragColor.rgb = gl_FragColor.rgb / dodged2;
gl_FragColor *= e_lmscale;
#ifdef FOGGED
gl_FragColor.rgb = fog3(gl_FragColor.rgb);
#endif
}
#endif

View file

@ -1,63 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Basic skybox shader with two clouds rendered on top using a dodge filter.
//==============================================================================
!!ver 110
!!permu FOG
!!samps hdr_40:samplerCube=0 hdr_250:samplerCube=1 hdr_1600:samplerCube=2 cloudA=3 cloudB=4
#include "sys/defs.h"
#include "sys/fog.h"
varying vec3 cloudpos;
varying vec3 boxpos;
#ifdef VERTEX_SHADER
void main ()
{
boxpos = v_position.xyz - e_eyepos;
cloudpos = v_position.xyz;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
void main ()
{
float hdr_scale;
vec3 sky_out;
vec3 skybox_40 = textureCube( s_hdr_40, boxpos ).rgb;
vec3 skybox_250 = textureCube( s_hdr_250, boxpos ).rgb;
vec3 skybox_1600 = textureCube( s_hdr_1600, boxpos ).rgb;
hdr_scale = (e_lmscale.r + e_lmscale.g + e_lmscale.b) / 3.0;
if (hdr_scale > 1.0) {
sky_out = mix(skybox_250, skybox_40, hdr_scale - 1.0);
} else {
sky_out = mix(skybox_1600, skybox_250, hdr_scale);
}
/* the cloud bits */
vec2 tccoord;
vec3 dir = cloudpos - e_eyepos;
dir.z *= 3.0;
dir.xy /= 0.5 * length( dir );
tccoord = ( dir.xy + e_time * 0.015 );
vec4 cloud1_f = texture2D( s_cloudA, tccoord );
tccoord = ( dir.xy + e_time * 0.02 );
vec4 cloud2_f = texture2D( s_cloudB, tccoord );
vec3 dodged1 = vec3(1.0,1.0,1.0) - (cloud1_f.rgb * vec3(cloud1_f.a, cloud1_f.a, cloud1_f.a));
vec3 dodged2 = vec3(1.0,1.0,1.0) - (cloud2_f.rgb * vec3(cloud2_f.a, cloud2_f.a, cloud2_f.a));
gl_FragColor.rgb = sky_out / dodged1;
gl_FragColor.rgb = gl_FragColor.rgb / dodged2;
#ifdef FOGGED
gl_FragColor.rgb = fog3(gl_FragColor.rgb);
#endif
}
#endif

View file

@ -1,54 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// A skybox cube with two cloud layers, which get occluded by a blended
// second skybox cube.
//==============================================================================
!!ver 110
!!permu FOG
!!samps cloudA=0 cloudB=1 box:samplerCube=2 mountains:samplerCube=3
#include "sys/defs.h"
#include "sys/fog.h"
varying vec3 cloudpos;
varying vec3 boxpos;
#ifdef VERTEX_SHADER
void main ()
{
boxpos = v_position.xyz - e_eyepos;
cloudpos = v_position.xyz;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
void main ()
{
vec4 mountains = textureCube( s_mountains, boxpos );
vec4 box = textureCube( s_box, boxpos );
vec2 tccoord;
vec3 dir = cloudpos - e_eyepos;
dir.z *= 3.0;
dir.xy /= 0.5 * length( dir );
tccoord = ( dir.xy + e_time * 0.015 );
vec4 cloud1_f = texture2D( s_cloudA, tccoord );
tccoord = ( dir.xy + e_time * 0.02 );
vec4 cloud2_f = texture2D( s_cloudA, tccoord );
gl_FragColor.rgb = mix( box.rgb, cloud1_f.rgb, cloud1_f.a );
gl_FragColor = vec4( mix( gl_FragColor.rgb, cloud2_f.rgb, cloud2_f.a ), 1.0 );
if (mountains.a > 0.9) {
gl_FragColor.rgb = mix( gl_FragColor.rgb, mountains.rgb, mountains.a);
}
gl_FragColor *= e_lmscale;
#ifdef FOGGED
gl_FragColor.rgb = fog3(gl_FragColor.rgb);
#endif
}
#endif

View file

@ -1,53 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Terrain shader for tw_valley's skyroom.
//==============================================================================
!!ver 110
!!permu FOG
!!samps box:samplerCube=0 cloudA=1 cloudB=2
#include "sys/defs.h"
#include "sys/fog.h"
varying vec3 cloudpos;
varying vec3 boxpos;
#ifdef VERTEX_SHADER
void main ()
{
boxpos = v_position.xyz - e_eyepos;
cloudpos = v_position.xyz;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
#define s_cloud1 s_t0
#define s_cloud2 s_t1
void main ()
{
vec4 skybox = textureCube( s_box, boxpos );
vec2 tccoord;
vec3 dir = cloudpos - e_eyepos;
dir.z *= 4.0;
dir.xy /= 0.5 * length( dir );
tccoord = ( dir.xy + e_time * 0.015 ) * 0.75;
vec4 cloud1_f = texture2D( s_cloudA, tccoord );
tccoord = ( dir.xy + e_time * 0.02 ) * 0.75;
vec4 cloud2_f = texture2D( s_cloudB, tccoord );
vec3 dodged1 = vec3(1.0,1.0,1.0) - (cloud1_f.rgb * vec3(cloud1_f.a, cloud1_f.a, cloud1_f.a));
vec3 dodged2 = vec3(1.0,1.0,1.0) - (cloud2_f.rgb * vec3(cloud2_f.a, cloud2_f.a, cloud2_f.a));
gl_FragColor.rgb = skybox.rgb / dodged1;
gl_FragColor.rgb = gl_FragColor.rgb / dodged2;
gl_FragColor *= e_lmscale;
#ifdef FOGGED
gl_FragColor.rgb = fog3(gl_FragColor.rgb);
#endif
}
#endif

View file

@ -1,33 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Trisoup whose diffusemap multiplies against the glColor values.
//==============================================================================
!!ver 110
!!samps diffuse
varying vec2 tex_c;
varying vec4 vex_color;
#ifdef VERTEX_SHADER
attribute vec2 v_texcoord;
attribute vec4 v_colour;
void main ()
{
tex_c = v_texcoord;
vex_color = v_colour;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
void main ()
{
vec4 diffuse_f = vex_color;
diffuse_f.rgb *= diffuse_f.a;
diffuse_f *= texture2D(s_diffuse, tex_c);
gl_FragColor = diffuse_f;
}
#endif

View file

@ -1,33 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Trisoup whose diffusemap multiplies against the glColor values.
//==============================================================================
!!ver 110
!!samps diffuse
varying vec2 tex_c;
varying vec4 vex_color;
#ifdef VERTEX_SHADER
attribute vec2 v_texcoord;
attribute vec4 v_colour;
void main ()
{
tex_c = v_texcoord;
vex_color = v_colour;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
void main ()
{
vec4 diffuse_f = vex_color;
diffuse_f.rgb *= diffuse_f.a;
diffuse_f *= texture2D(s_diffuse, tex_c);
gl_FragColor = diffuse_f;
}
#endif

View file

@ -1,34 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Trisoup whose diffusemap multiplies against the glColor values.
//==============================================================================
!!ver 110
!!samps diffuse
#include "sys/defs.h"
varying vec2 tex_c;
varying vec4 vex_color;
#ifdef VERTEX_SHADER
void main ()
{
tex_c = v_texcoord;
tex_c.y -= e_time;
vex_color = v_colour;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
void main ()
{
vec4 diffuse_f = vex_color;
diffuse_f.rgb *= diffuse_f.a;
diffuse_f *= texture2D(s_diffuse, tex_c);
gl_FragColor = diffuse_f;
}
#endif

View file

@ -1,167 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Default terrain shader that blends between two surfaces and creates a
// realistic transition using the diffusemaps' monochrome channel for masking.
//==============================================================================
!!ver 110
!!permu FOG
!!permu BUMP
!!permu DELUXE
!!permu UPPERLOWER
!!samps 6
!!samps lightmap
!!samps =LIGHTSTYLED lightmap1 lightmap2 lightmap3
!!samps =DELUXE deluxemap
!!samps =LIGHTSTYLED =DELUXE deluxemap1 deluxemap2 deluxemap3
!!samps =UPPERLOWER upper
!!permu FAKESHADOWS
!!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap
!!cvardf r_skipNormal
!!cvardf r_skipLightmap
#include "sys/defs.h"
varying vec2 tex_c;
varying vec4 vex_color;
varying vec2 lm0;
#ifdef LIGHTSTYLED
varying vec2 lm1, lm2, lm3;
#endif
#ifdef FAKESHADOWS
varying vec4 vtexprojcoord;
#endif
#ifdef VERTEX_SHADER
void lightmapped_init(void)
{
lm0 = v_lmcoord;
#ifdef LIGHTSTYLED
lm1 = v_lmcoord2;
lm2 = v_lmcoord3;
lm3 = v_lmcoord4;
#endif
}
void main ( void )
{
lightmapped_init();
tex_c = v_texcoord;
vex_color = v_colour;
gl_Position = ftetransform();
#ifdef FAKESHADOWS
vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0));
#endif
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
#include "sys/pcf.h"
#if r_skipLightmap==0
#ifdef LIGHTSTYLED
#define LIGHTMAP0 texture2D(s_lightmap0, lm0).rgb
#define LIGHTMAP1 texture2D(s_lightmap1, lm1).rgb
#define LIGHTMAP2 texture2D(s_lightmap2, lm2).rgb
#define LIGHTMAP3 texture2D(s_lightmap3, lm3).rgb
#else
#define LIGHTMAP texture2D(s_lightmap, lm0).rgb
#endif
#else
#ifdef LIGHTSTYLED
#define LIGHTMAP0 vec3(0.5,0.5,0.5)
#define LIGHTMAP1 vec3(0.5,0.5,0.5)
#define LIGHTMAP2 vec3(0.5,0.5,0.5)
#define LIGHTMAP3 vec3(0.5,0.5,0.5)
#else
#define LIGHTMAP vec3(0.5,0.5,0.5)
#endif
#endif
vec3 lightmap_fragment()
{
vec3 lightmaps;
#ifdef LIGHTSTYLED
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb;
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb;
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb;
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb;
#else
lightmaps = LIGHTMAP * e_lmscale.rgb;
#endif
return lightmaps;
}
#if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f)
{
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps;
#if defined(LIGHTSTYLED)
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0);
#else
lightmaps = LIGHTMAP * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0);
#endif
return lightmaps;
#endif
}
#endif
void main ( void )
{
vec4 diff1_f = texture2D( s_t0, tex_c);
vec4 diff2_f = texture2D( s_t1, tex_c);
float alpha = 1.0;
float bw = 1.0 - (diff2_f.r + diff2_f.g + diff2_f.b) / 3.0;
#if r_skipNormal==0
vec3 normal1_f = normalize(texture2D(s_t2, tex_c).rgb - 0.5);
vec3 normal2_f = normalize(texture2D(s_t3, tex_c).rgb - 0.5);
#endif
if (vex_color.a < 1.0) {
if (bw > vex_color.a) {
alpha = 0.0;
}
}
/* light */
#if r_skipNormal==0
diff1_f.rgb *= lightmap_fragment(normal1_f);
diff2_f.rgb *= lightmap_fragment(normal2_f);
#else
diff1_f.rgb *= lightmap_fragment();
diff2_f.rgb *= lightmap_fragment();
#endif
vec3 output_f = mix(diff1_f.rgb, diff2_f.rgb, alpha);
#ifdef FAKESHADOWS
output_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif
#if defined(UPPERLOWER)
output_f.rgb *= (texture2D(s_upper, tex_c * 4.0).rgb + 0.5);
#endif
gl_FragColor = fog4( vec4( output_f.rgb, 1.0 ) );
}
#endif

View file

@ -1,169 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Blending terrain and masking its edges for a smooth transition into alpha.
//==============================================================================
!!ver 110
!!permu FOG
!!permu BUMP
!!permu DELUXE
!!permu UPPERLOWER
!!samps diffuse normalmap
!!samps lightmap
!!samps =LIGHTSTYLED lightmap1 lightmap2 lightmap3
!!samps =DELUXE deluxemap
!!samps =LIGHTSTYLED =DELUXE deluxemap1 deluxemap2 deluxemap3
!!samps =UPPERLOWER upper
!!permu FAKESHADOWS
!!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap
!!cvardf r_skipDiffuse
!!cvardf r_skipLightmap
!!cvardf r_skipNormal
#include "sys/defs.h"
varying vec2 tex_c;
varying vec4 vex_color;
varying vec2 lm0;
#ifdef LIGHTSTYLED
varying vec2 lm1, lm2, lm3;
#endif
#ifdef FAKESHADOWS
varying vec4 vtexprojcoord;
#endif
#ifdef VERTEX_SHADER
void lightmapped_init(void)
{
lm0 = v_lmcoord;
#ifdef LIGHTSTYLED
lm1 = v_lmcoord2;
lm2 = v_lmcoord3;
lm3 = v_lmcoord4;
#endif
}
void main ( void )
{
lightmapped_init();
tex_c = v_texcoord;
vex_color = v_colour;
gl_Position = ftetransform();
#ifdef FAKESHADOWS
vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0));
#endif
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
#include "sys/pcf.h"
#if r_skipLightmap==0
#ifdef LIGHTSTYLED
#define LIGHTMAP0 texture2D(s_lightmap0, lm0).rgb
#define LIGHTMAP1 texture2D(s_lightmap1, lm1).rgb
#define LIGHTMAP2 texture2D(s_lightmap2, lm2).rgb
#define LIGHTMAP3 texture2D(s_lightmap3, lm3).rgb
#else
#define LIGHTMAP texture2D(s_lightmap, lm0).rgb
#endif
#else
#ifdef LIGHTSTYLED
#define LIGHTMAP0 vec3(0.5,0.5,0.5)
#define LIGHTMAP1 vec3(0.5,0.5,0.5)
#define LIGHTMAP2 vec3(0.5,0.5,0.5)
#define LIGHTMAP3 vec3(0.5,0.5,0.5)
#else
#define LIGHTMAP vec3(0.5,0.5,0.5)
#endif
#endif
vec3 lightmap_fragment()
{
vec3 lightmaps;
#ifdef LIGHTSTYLED
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb;
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb;
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb;
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb;
#else
lightmaps = LIGHTMAP * e_lmscale.rgb;
#endif
return lightmaps;
}
#if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f)
{
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps;
#if defined(LIGHTSTYLED)
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0);
#else
lightmaps = LIGHTMAP * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0);
#endif
return lightmaps;
#endif
}
#endif
void main ( void )
{
#if r_skipDiffuse==0
vec3 diffuse_f = texture2D(s_diffuse, tex_c).rgb;
#else
vec3 diffuse_f = vec3(1.0,1.0,1.0);
#endif
float bw = 1.0 - (diffuse_f.r + diffuse_f.g + diffuse_f.b) / 3.0;
vec4 vcol = vex_color;
#if r_skipNormal==0
vec3 normal_f;
normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
#endif
if (vcol.a < 1.0) {
if (bw > vcol.a) {
discard;
}
}
#if r_skipNormal==0
diffuse_f.rgb *= lightmap_fragment(normal_f);
#else
diffuse_f.rgb *= lightmap_fragment();
#endif
#ifdef FAKESHADOWS
diffuse_f *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif
#if defined(UPPERLOWER)
diffuse_f.rgb *= (texture2D(s_upper, tex_c * 4.0).rgb + 0.5);
#endif
gl_FragColor = vec4(fog3(diffuse_f), 1.0);
}
#endif

View file

@ -1,173 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Alternative way of blending/masking terrain between to diffuse textures.
//==============================================================================
!!ver 110
!!permu FOG
!!permu BUMP
!!permu DELUXE
!!permu UPPERLOWER
!!samps diffuse normalmap
!!samps lightmap
!!samps =LIGHTSTYLED lightmap1 lightmap2 lightmap3
!!samps =DELUXE deluxemap
!!samps =LIGHTSTYLED =DELUXE deluxemap1 deluxemap2 deluxemap3
!!samps =UPPERLOWER upper
!!permu FAKESHADOWS
!!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap
!!cvardf r_skipDiffuse
!!cvardf r_skipLightmap
!!cvardf r_skipNormal
#include "sys/defs.h"
varying vec2 tex_c;
varying vec4 vex_color;
varying vec2 lm0;
#ifdef LIGHTSTYLED
varying vec2 lm1, lm2, lm3;
#endif
#ifdef FAKESHADOWS
varying vec4 vtexprojcoord;
#endif
#ifdef VERTEX_SHADER
void lightmapped_init(void)
{
lm0 = v_lmcoord;
#ifdef LIGHTSTYLED
lm1 = v_lmcoord2;
lm2 = v_lmcoord3;
lm3 = v_lmcoord4;
#endif
}
void main ( void )
{
lightmapped_init();
tex_c = v_texcoord;
vex_color = v_colour;
gl_Position = ftetransform();
#ifdef FAKESHADOWS
vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0));
#endif
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
#include "sys/pcf.h"
#if r_skipLightmap==0
#ifdef LIGHTSTYLED
#define LIGHTMAP0 texture2D(s_lightmap0, lm0).rgb
#define LIGHTMAP1 texture2D(s_lightmap1, lm1).rgb
#define LIGHTMAP2 texture2D(s_lightmap2, lm2).rgb
#define LIGHTMAP3 texture2D(s_lightmap3, lm3).rgb
#else
#define LIGHTMAP texture2D(s_lightmap, lm0).rgb
#endif
#else
#ifdef LIGHTSTYLED
#define LIGHTMAP0 vec3(0.5,0.5,0.5)
#define LIGHTMAP1 vec3(0.5,0.5,0.5)
#define LIGHTMAP2 vec3(0.5,0.5,0.5)
#define LIGHTMAP3 vec3(0.5,0.5,0.5)
#else
#define LIGHTMAP vec3(0.5,0.5,0.5)
#endif
#endif
vec3 lightmap_fragment()
{
vec3 lightmaps;
#ifdef LIGHTSTYLED
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb;
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb;
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb;
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb;
#else
lightmaps = LIGHTMAP * e_lmscale.rgb;
#endif
return lightmaps;
}
#if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f)
{
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps;
#if defined(LIGHTSTYLED)
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0);
#else
lightmaps = LIGHTMAP * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0);
#endif
return lightmaps;
#endif
}
#endif
void main ( void )
{
#if r_skipDiffuse==0
vec3 diffuse_f = texture2D(s_diffuse, tex_c).rgb;
#else
vec3 diffuse_f = vec3(1.0,1.0,1.0);
#endif
float bw = (diffuse_f.r + diffuse_f.g + diffuse_f.b) / 3.0;
vec4 vcol = vex_color;
float alpha = 1.0;
#if r_skipNormal==0
vec3 normal_f;
normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5) * 2.0;
#endif
if (vcol.a < 1.0) {
if (bw > vcol.a) {
discard;
}
}
if (bw > (vcol.a * 0.25))
alpha = vcol.a;
#if r_skipNormal==0
diffuse_f.rgb *= lightmap_fragment(normal_f);
#else
diffuse_f.rgb *= lightmap_fragment();
#endif
#ifdef FAKESHADOWS
diffuse_f *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif
#if defined(UPPERLOWER)
diffuse_f.rgb *= texture2D(s_upper, tex_c * 4.0).rgb;
#endif
gl_FragColor = vec4(fog3(diffuse_f), alpha);
}
#endif

View file

@ -1,172 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Blending terrain and masking its edges for a smooth transition into alpha.
//==============================================================================
!!ver 110
!!permu FOG
!!permu BUMP
!!permu DELUXE
!!permu UPPERLOWER
!!samps diffuse normalmap
!!samps lightmap
!!samps =LIGHTSTYLED lightmap1 lightmap2 lightmap3
!!samps =DELUXE deluxemap
!!samps =LIGHTSTYLED =DELUXE deluxemap1 deluxemap2 deluxemap3
!!samps =UPPERLOWER upper
!!permu FAKESHADOWS
!!cvardf r_glsl_pcf
!!cvardf r_fullbright
!!samps =FAKESHADOWS shadowmap
!!cvardf r_skipDiffuse
!!cvardf r_skipLightmap
!!cvardf r_skipNormal
#include "sys/defs.h"
varying vec2 tex_c;
varying vec4 vex_color;
varying vec2 lm0;
#ifdef LIGHTSTYLED
varying vec2 lm1, lm2, lm3;
#endif
#ifdef FAKESHADOWS
varying vec4 vtexprojcoord;
#endif
#ifdef VERTEX_SHADER
void lightmapped_init(void)
{
lm0 = v_lmcoord;
#ifdef LIGHTSTYLED
lm1 = v_lmcoord2;
lm2 = v_lmcoord3;
lm3 = v_lmcoord4;
#endif
}
void main ( void )
{
lightmapped_init();
tex_c = v_texcoord;
vex_color = v_colour;
gl_Position = ftetransform();
#ifdef FAKESHADOWS
vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0));
#endif
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
#include "sys/pcf.h"
#if r_skipLightmap==0
#ifdef LIGHTSTYLED
#define LIGHTMAP0 texture2D(s_lightmap0, lm0).rgb
#define LIGHTMAP1 texture2D(s_lightmap1, lm1).rgb
#define LIGHTMAP2 texture2D(s_lightmap2, lm2).rgb
#define LIGHTMAP3 texture2D(s_lightmap3, lm3).rgb
#else
#define LIGHTMAP texture2D(s_lightmap, lm0).rgb
#endif
#else
#ifdef LIGHTSTYLED
#define LIGHTMAP0 vec3(0.5,0.5,0.5)
#define LIGHTMAP1 vec3(0.5,0.5,0.5)
#define LIGHTMAP2 vec3(0.5,0.5,0.5)
#define LIGHTMAP3 vec3(0.5,0.5,0.5)
#else
#define LIGHTMAP vec3(0.5,0.5,0.5)
#endif
#endif
vec3 lightmap_fragment()
{
vec3 lightmaps;
#ifdef LIGHTSTYLED
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb;
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb;
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb;
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb;
#else
lightmaps = LIGHTMAP * e_lmscale.rgb;
#endif
return (r_fullbright == 1) ? vec3(1.0, 1.0, 1.0) : lightmaps;
}
#if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f)
{
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps;
#if defined(LIGHTSTYLED)
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0);
#else
lightmaps = LIGHTMAP * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0);
#endif
return (r_fullbright == 1) ? vec3(1.0, 1.0, 1.0) : lightmaps;
#endif
}
#endif
void main ( void )
{
#if r_skipDiffuse==0
vec3 diffuse_f = texture2D(s_diffuse, tex_c).rgb;
#else
vec3 diffuse_f = vec3(1.0,1.0,1.0);
#endif
float bw = 1.0 - (diffuse_f.r + diffuse_f.g + diffuse_f.b) / 3.0;
vec4 vcol = vex_color;
#if r_skipNormal==0
vec3 normal_f;
normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
#endif
if (vcol.a < 1.0) {
// contrast enhancement
#ifdef BWMASK
bw *= ((bw * 2.0) * BWMASK);
#endif
if (bw > vcol.a) {
discard;
}
}
#if r_skipNormal==0
diffuse_f.rgb *= lightmap_fragment(normal_f);
#else
diffuse_f.rgb *= lightmap_fragment();
#endif
#ifdef FAKESHADOWS
diffuse_f *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif
#if defined(UPPERLOWER)
diffuse_f.rgb *= (texture2D(s_upper, tex_c * 4.0).rgb + 0.5);
#endif
gl_FragColor = vec4(fog3(diffuse_f), 1.0);
}
#endif

View file

@ -1,120 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Terrain shader used for skyroom surfaces.
//==============================================================================
!!ver 110
!!permu FOG
!!permu BUMP
!!permu DELUXE
!!samps 4 diffuse
!!samps lightmap
!!samps =LIGHTSTYLED lightmap1 lightmap2 lightmap3
!!samps =DELUXE deluxemap
!!samps =LIGHTSTYLED =DELUXE deluxemap1 deluxemap2 deluxemap3
!!cvardf r_skipLightmap
#include "sys/defs.h"
#include "sys/fog.h"
varying vec2 tex_c;
varying vec4 vex_color;
varying vec2 lm0;
#ifdef LIGHTSTYLED
varying vec2 lm1, lm2, lm3;
#endif
#ifdef VERTEX_SHADER
void lightmapped_init(void)
{
lm0 = v_lmcoord;
#ifdef LIGHTSTYLED
lm1 = v_lmcoord2;
lm2 = v_lmcoord3;
lm3 = v_lmcoord4;
#endif
}
void main ()
{
tex_c = v_texcoord;
lm_c = v_lmcoord;
vex_color = v_colour;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
vec3 lightmap_fragment()
{
vec3 lightmaps;
#if r_skipLightmap==0
#ifdef LIGHTSTYLED
#define LIGHTMAP0 texture2D(s_lightmap0, lm0).rgb
#define LIGHTMAP1 texture2D(s_lightmap1, lm1).rgb
#define LIGHTMAP2 texture2D(s_lightmap2, lm2).rgb
#define LIGHTMAP3 texture2D(s_lightmap3, lm3).rgb
#else
#define LIGHTMAP texture2D(s_lightmap, lm0).rgb
#endif
#else
#ifdef LIGHTSTYLED
#define LIGHTMAP0 vec3(0.5,0.5,0.5)
#define LIGHTMAP1 vec3(0.5,0.5,0.5)
#define LIGHTMAP2 vec3(0.5,0.5,0.5)
#define LIGHTMAP3 vec3(0.5,0.5,0.5)
#else
#define LIGHTMAP vec3(0.5,0.5,0.5)
#endif
#endif
vec3 lightmap_fragment()
{
vec3 lightmaps;
#ifdef LIGHTSTYLED
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb;
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb;
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb;
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb;
#else
lightmaps = LIGHTMAP * e_lmscale.rgb;
#endif
return lightmaps;
}
#if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f)
{
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps;
#if defined(LIGHTSTYLED)
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0);
#else
lightmaps = LIGHTMAP * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0);
#endif
return lightmaps;
#endif
}
#endif
void main ()
{
vec4 diff1_f = texture2D( s_t0, tex_c );
vec4 diff2_f = texture2D( s_t1, tex_c );
vec3 output_f = mix( diff1_f.rgb, diff2_f.rgb, vex_color.a ) * lightmap_fragment(normal_f);
gl_FragColor = fog4( vec4( output_f.rgb, 1.0 ) );
}
#endif

View file

@ -1,155 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Terrain shader exclusive to tw_valley. One of the few surfaces that do not
// draw a normalmap as it's too expensive.
//==============================================================================
!!ver 110
!!permu FOG
!!samps 6
!!samps lightmap
!!samps =LIGHTSTYLED lightmap1 lightmap2 lightmap3
!!samps =DELUXE deluxemap
!!samps =LIGHTSTYLED =DELUXE deluxemap1 deluxemap2 deluxemap3
!!permu FAKESHADOWS
!!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap
!!cvardf r_skipDiffuse
!!cvardf r_skipNormal
!!cvardf r_skipLightmap
#include "sys/defs.h"
varying vec2 tex_c;
varying vec2 detail_c;
varying vec4 vex_color;
varying vec2 lm0;
#ifdef LIGHTSTYLED
varying vec2 lm1, lm2, lm3;
#endif
#ifdef FAKESHADOWS
varying vec4 vtexprojcoord;
#endif
#ifdef VERTEX_SHADER
void lightmapped_init(void)
{
lm0 = v_lmcoord;
#ifdef LIGHTSTYLED
lm1 = v_lmcoord2;
lm2 = v_lmcoord3;
lm3 = v_lmcoord4;
#endif
}
void main ( void )
{
lightmapped_init();
tex_c = v_texcoord * 2.5;
detail_c = tex_c * 7.5;
vex_color = v_colour;
gl_Position = ftetransform();
#ifdef FAKESHADOWS
vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0));
#endif
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
#include "sys/pcf.h"
#if r_skipLightmap==0
#ifdef LIGHTSTYLED
#define LIGHTMAP0 texture2D(s_lightmap0, lm0).rgb
#define LIGHTMAP1 texture2D(s_lightmap1, lm1).rgb
#define LIGHTMAP2 texture2D(s_lightmap2, lm2).rgb
#define LIGHTMAP3 texture2D(s_lightmap3, lm3).rgb
#else
#define LIGHTMAP texture2D(s_lightmap, lm0).rgb
#endif
#else
#ifdef LIGHTSTYLED
#define LIGHTMAP0 vec3(0.5,0.5,0.5)
#define LIGHTMAP1 vec3(0.5,0.5,0.5)
#define LIGHTMAP2 vec3(0.5,0.5,0.5)
#define LIGHTMAP3 vec3(0.5,0.5,0.5)
#else
#define LIGHTMAP vec3(0.5,0.5,0.5)
#endif
#endif
vec3 lightmap_fragment()
{
vec3 lightmaps;
#ifdef LIGHTSTYLED
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb;
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb;
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb;
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb;
#else
lightmaps = LIGHTMAP * e_lmscale.rgb;
#endif
return lightmaps;
}
#if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f)
{
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps;
#if defined(LIGHTSTYLED)
lightmaps = LIGHTMAP0 * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP1 * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP2 * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0);
lightmaps += LIGHTMAP3 * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0);
#else
lightmaps = LIGHTMAP * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0);
#endif
return lightmaps;
#endif
}
#endif
void main ( void )
{
vec4 diff1_f = texture2D(s_t0, tex_c);
vec4 diff2_f = texture2D(s_t1, tex_c);
vec3 norm1_f = normalize(texture2D(s_t4, tex_c).rgb - 0.5);
vec3 norm2_f = normalize(texture2D(s_t5, tex_c).rgb - 0.5);
vec3 d1_f = texture2D(s_t2, detail_c).rgb;
vec3 d2_f = texture2D(s_t3, detail_c).rgb;
diff1_f.rgb *= d1_f;
diff2_f.rgb *= d2_f;
if (float(r_skipNormal) == 1.0) {
diff1_f.rgb *= lightmap_fragment();
diff2_f.rgb *= lightmap_fragment();
} else {
diff1_f.rgb *= lightmap_fragment(norm1_f);
diff2_f.rgb *= lightmap_fragment(norm2_f);
}
vec3 output_f = mix( diff1_f.rgb, diff2_f.rgb, vex_color.a );
#ifdef FAKESHADOWS
output_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif
gl_FragColor = fog4( vec4( output_f.rgb, 1.0 ) );
}
#endif

View file

@ -1,38 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Unlit surface.
//==============================================================================
!!ver 110
!!permu FOG
!!samps diffuse
#include "sys/defs.h"
#include "sys/fog.h"
varying vec2 tex_c;
#ifdef VERTEX_SHADER
void main ()
{
tex_c = v_texcoord;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
void main ()
{
vec4 d_f = texture2D( s_diffuse, tex_c );
#ifdef MASK
// alpha-testing happens here
if (d_f.a < MASK)
discard;
#endif
gl_FragColor = fog4( d_f );
}
#endif

View file

@ -1,145 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Lightgrid-lit surface, normalmap's alpha contains environment cube reflec-
// tivity.
//==============================================================================
!!ver 110
!!permu FRAMEBLEND
!!permu FULLBRIGHT
!!permu FOG
!!permu BUMP
!!permu SKELETAL
!!samps diffuse
!!samps =BUMP normalmap reflectcube
!!samps =FULLBRIGHT fullbright
!!cvardf r_skipDiffuse
!!cvardf r_skipFullbright
!!cvardf r_skipNormal
!!cvardf r_skipEnvmap
!!cvardf r_skipLightmap
!!cvardf r_showEnvCubemap
!!permu FAKESHADOWS
!!cvardf r_glsl_pcf
!!cvardf r_fullbright
!!cvardf r_lambertscale
!!samps =FAKESHADOWS shadowmap
#include "sys/defs.h"
varying vec2 tex_c;
varying vec3 norm;
#ifdef BUMP
varying vec3 eyevector;
varying mat3 invsurface;
#endif
#ifdef FAKESHADOWS
varying vec4 vtexprojcoord;
#endif
#ifdef VERTEX_SHADER
#include "sys/skeletal.h"
void main ()
{
vec3 n, s, t, w;
gl_Position = skeletaltransform_wnst(w,n,s,t);
norm = n;
n = normalize(n);
s = normalize(s);
t = normalize(t);
tex_c = v_texcoord;
#ifdef BUMP
/* normalmap */
invsurface = mat3(s, t, n);
/* reflect */
vec3 eyeminusvertex = e_eyepos - w.xyz;
eyevector.x = dot(eyeminusvertex, s.xyz);
eyevector.y = dot(eyeminusvertex, t.xyz);
eyevector.z = dot(eyeminusvertex, n.xyz);
#endif
#ifdef FAKESHADOWS
vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0));
#endif
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
#include "sys/pcf.h"
#ifdef HALFLAMBERT
float lambert(vec3 normal, vec3 dir)
{
return (lambert(normal, dir) * 0.5) + 0.5;
}
#else
float lambert(vec3 normal, vec3 dir)
{
return max(dot(normal, dir), 0.0);
}
#endif
void main (void)
{
vec4 diff_f = vec4(1.0, 1.0, 1.0, 1.0);
vec3 light = vec3(0.0, 0.0, 0.0);
#if r_skipDiffuse == 0
diff_f = texture2D(s_diffuse, tex_c);
#endif
// bump goes here
#if r_skipNormal==0 || defined(BUMP)
vec3 normal_f = (texture2D(s_normalmap, tex_c).rgb - 0.5) * 2.0;
#else
vec3 normal_f = vec3(0.0, 0.0, 1.0);
#endif
#ifdef MASK
if (diff_f.a < MASK) {
discard;
}
#endif
/* directional light */
light += (e_light_mul * lambert(norm, e_light_dir)) * 2.0;
light += (e_light_ambient * lambert(norm, reflect(norm, e_light_dir))) * 0.5;
light += (e_light_mul * dot(normal_f, e_light_dir));
#ifdef FAKESHADOWS
diff_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif
diff_f.rgb *= light;
#if defined(BUMP) && r_skipEnvmap==0
vec3 cube_c;
float refl = 1.0 - texture2D(s_normalmap, tex_c).a;
cube_c = reflect(normalize(eyevector), norm);
cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2];
cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz;
#if r_showEnvCubemap == 0
diff_f.rgb += textureCube(s_reflectcube, cube_c).rgb * refl;
#else
diff_f.rgb = textureCube(s_reflectcube, cube_c).rgb;
#endif
#endif
#if defined(FULLBRIGHT) && r_skipFullbright==0
diff_f.rgb += texture2D(s_fullbright, tex_c).rgb;
#endif
gl_FragColor = fog4(diff_f * e_colourident) * e_lmscale;
}
#endif

View file

@ -1,148 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Lightgrid-lit surface, normalmap's alpha contains specularity information.
//==============================================================================
!!ver 110
!!permu FRAMEBLEND
!!permu FOG
!!permu SKELETAL
!!cvarf gl_specular
!!samps diffuse fullbright normalmap
!!permu FAKESHADOWS
!!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap
!!cvardf r_skipDiffuse
!!cvardf r_skipSpecular
!!cvardf r_skipNormal
#include "sys/defs.h"
varying vec2 tex_c;
varying vec3 eyevector;
varying vec3 norm;
varying mat3 invsurface;
#ifdef FAKESHADOWS
varying vec4 vtexprojcoord;
#endif
#ifdef VERTEX_SHADER
#include "sys/skeletal.h"
#ifdef CHROME
/* Rotate Light Vector */
vec3 rlv(vec3 axis, vec3 origin, vec3 lightpoint)
{
vec3 offs;
vec3 result;
offs[0] = lightpoint[0] - origin[0];
offs[1] = lightpoint[1] - origin[1];
offs[2] = lightpoint[2] - origin[2];
result[0] = dot(offs[0], axis[0]);
result[1] = dot(offs[1], axis[1]);
result[2] = dot(offs[2], axis[2]);
return result;
}
#endif
void main ()
{
vec3 n, s, t, w;
gl_Position = skeletaltransform_wnst(w,n,s,t);
norm = n;
n = normalize(n);
s = normalize(s);
t = normalize(t);
#ifdef CHROME
vec3 rorg = rlv(vec3(0,0,0), w, e_eyepos);
vec3 viewc = normalize(e_eyepos - w);
float d = dot(n, viewc);
vec3 reflected;
reflected.x = n.x * 2.0 * d - viewc.x;
reflected.y = n.y * 2.0 * d - viewc.y;
reflected.z = n.z * 2.0 * d - viewc.z;
tex_c.x = 0.5 + reflected.y * 0.5;
tex_c.y = 0.5 - reflected.z * 0.5;
#else
tex_c = v_texcoord;
#endif
/* normalmap */
invsurface = mat3(s, t, n);
/* reflect */
eyevector = e_eyepos - w.xyz;
#ifdef FAKESHADOWS
vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0));
#endif
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
#include "sys/pcf.h"
#ifdef HALFLAMBERT
float lambert(vec3 normal, vec3 dir)
{
return (lambert(normal, dir) * 0.5) + 0.5;
}
#else
float lambert(vec3 normal, vec3 dir)
{
return max(dot(normal, dir), 0.0);
}
#endif
void main ()
{
vec4 fb_f = texture2D(s_fullbright, tex_c);
vec3 light;
#if r_skipDiffuse==0
vec4 diffuse_f = texture2D(s_diffuse, tex_c);
#else
vec4 diffuse_f = vec4(1.0,1.0,1.0,1.0);
#endif
#if r_skipNormal==0
vec3 normal_f = (texture2D(s_normalmap, tex_c).rgb - 0.5) * 2.0;
float gloss = texture2D(s_normalmap, tex_c).a;
#else
#define normal_f vec3(0.0,0.0,1.0)
float gloss = texture2D(s_normalmap, tex_c).a;
#endif
if (diffuse_f.a < 0.5) {
discard;
}
light = (e_light_mul * lambert(norm, e_light_dir)) * 2.0; /* directional light */
light += (e_light_ambient * lambert(norm, reflect(norm, e_light_dir))) * 0.5; /* reverse ambient */
light *= 2.0;
#if r_skipSpecular==0
vec3 halfdir = normalize(normalize(eyevector) + e_light_dir);
vec3 bumps = normalize(invsurface * (normal_f));
float spec = pow(max(dot(halfdir, bumps), 0.0), FTE_SPECULAR_EXPONENT);
spec *= 5.0 * (1.0 - gloss);
diffuse_f.rgb += spec;
#endif
diffuse_f.rgb *= light;
diffuse_f.rgb += fb_f.rgb;
#ifdef FAKESHADOWS
diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif
gl_FragColor = fog4( diffuse_f * e_colourident ) * e_lmscale;
}
#endif

View file

@ -1,36 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Trisoup whose diffusemap multiplies against the glColor values.
//==============================================================================
!!ver 110
!!permu FRAMEBLEND
!!permu FOG
!!samps diffuse
#include "sys/defs.h"
varying vec2 tex_c;
varying vec4 vex_color;
#ifdef VERTEX_SHADER
void main ()
{
tex_c = v_texcoord;
vex_color = v_colour;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
void main ()
{
vec4 diffuse_f = texture2D( s_diffuse, tex_c );
diffuse_f.rgb *= vex_color.rgb;
gl_FragColor = fog4( diffuse_f );
}
#endif

View file

@ -1,70 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Basic water shader, No diffuse texture, just pure normalmap + refraction
//==============================================================================
!!ver 110
!!permu FOG
!!samps 2 normalmap reflectcube
#include "sys/defs.h"
varying mat3 invsurface;
varying vec4 tf_c;
varying vec3 eyeminusvertex;
varying vec3 eyevector;
varying vec2 shift1;
varying vec2 shift2;
#ifdef VERTEX_SHADER
void main ()
{
invsurface[0] = v_svector;
invsurface[1] = v_tvector;
invsurface[2] = v_normal;
eyeminusvertex = e_eyepos - v_position.xyz;
eyevector.x = dot( eyeminusvertex, v_svector.xyz );
eyevector.y = dot( eyeminusvertex, v_tvector.xyz );
eyevector.z = dot( eyeminusvertex, v_normal.xyz );
tf_c = ftetransform();
tf_c.z += 0.1; /* hack to get rid of refraction artifacts */
shift1 = v_texcoord + vec2( e_time * 0.1, 0.0 );
shift2 = v_texcoord - vec2( 0, e_time * -0.01 );
gl_Position = tf_c;
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
void main ( void )
{
float fres;
vec2 refl_c;
vec3 refl_f;
vec3 refr_f;
vec3 norm_f;
vec4 out_f = vec4( 1.0, 1.0, 1.0, 1.0 );
// Use the normalmap to shift the refraction
norm_f = ( texture2D( s_normalmap, shift1 ).xyz);
norm_f += ( texture2D( s_normalmap, shift2 ).xyz);
norm_f -= 1.0 - ( 4.0 / 256.0 );
norm_f = normalize( norm_f ) * 0.05;
// Reflection/View coordinates
refl_c = ( 1.0 + ( tf_c.xy / tf_c.w ) ) * 0.5;
refl_c.t -= 1.5 * invsurface[2].z / 1080.0;
vec3 cube_c = reflect( normalize( -eyevector ), texture2D( s_normalmap, shift2).rgb * 0.35 );
cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2];
cube_c = ( m_model * vec4( cube_c.xyz, 0.0 ) ).xyz;
refl_f = textureCube( s_reflectcube, cube_c ).rgb;
refr_f = texture2D( s_t1, refl_c + ( norm_f.st * 0.1 ) ).rgb;
fres = pow( 1.0 - abs( dot( norm_f, normalize( eyeminusvertex ) ) ), 5.0 );
out_f.rgb = mix( refr_f, refl_f, fres * 0.25 );
gl_FragColor = fog4( out_f );
}
#endif

View file

@ -1,59 +0,0 @@
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Dirty water shader (diffuse and normalmap only) where a refraction-ish effect
// is applied onto the diffusemap itself.
//==============================================================================
!!ver 110
!!permu FOG
!!samps diffuse normalmap
#include "sys/defs.h"
varying vec2 tex_c;
varying vec2 lm_c;
varying vec3 invsurface;
varying vec4 tf_c;
varying vec3 eyeminusvertex;
varying vec2 wat1_c;
varying vec2 wat2_c;
#ifdef VERTEX_SHADER
void main(void)
{
invsurface = v_normal;
eyeminusvertex = e_eyepos - v_position.xyz;
tf_c = ftetransform();
tex_c = v_texcoord;
gl_Position = tf_c;
wat1_c = tex_c + vec2(e_time * 0.05, 0.0);
wat2_c = tex_c - vec2(0, e_time * 0.05);
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
void main(void)
{
vec3 norm_f;
vec4 out_f = vec4(1.0, 1.0, 1.0, 1.0);
vec2 wat3_c;
// Use the normalmap to shift the refraction
norm_f = (texture2D(s_normalmap, wat1_c).xyz);
norm_f += (texture2D(s_normalmap, wat2_c).xyz);
norm_f -= 1.0 - (4.0 / 256.0);
norm_f = normalize(norm_f);
wat3_c = tex_c + (norm_f.st * 0.025) + vec2(sin(e_time * 0.1), 0);
// Load reflection and refraction based on our new coords
out_f.rgb = texture2D(s_diffuse, wat3_c).rgb;
gl_FragColor = fog4(out_f);
}
#endif

View file

@ -1,54 +0,0 @@
!!ver 110
!!permu FOG
!!samps reflection=0 refraction=1 normalmap=2
#include "sys/defs.h"
varying vec2 tex_c;
varying mat3 invsurface;
varying vec4 tf_c;
varying vec3 eyeminusvertex;
#ifdef VERTEX_SHADER
void main ()
{
invsurface[0] = v_svector;
invsurface[1] = v_tvector;
invsurface[2] = v_normal;
eyeminusvertex = e_eyepos - v_position.xyz;
tf_c = ftetransform();
tf_c.z += 0.1; /* hack to get rid of refraction artifacts */
tex_c = v_texcoord;
gl_Position = tf_c;
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
void main ( void )
{
float fres;
vec2 refl_c;
vec3 refl_f;
vec3 refr_f;
vec3 norm_f;
vec4 out_f = vec4( 1.0, 1.0, 1.0, 1.0 );
norm_f = ( texture2D( s_normalmap, tex_c + vec2( e_time * 0.01, 0.0 ) ).xyz);
norm_f += ( texture2D( s_normalmap, tex_c - vec2( 0, e_time * 0.01 ) ).xyz);
norm_f -= 1.0 - ( 4.0 / 256.0 );
norm_f = normalize( norm_f );
// Reflection/View coordinates
refl_c = ( 1.0 + ( tf_c.xy / tf_c.w ) ) * 0.5;
refl_c.t -= 1.5 * invsurface[2].z / 1080.0;
refl_f = texture2D( s_reflection, refl_c ).rgb;
refr_f = texture2D( s_refraction, refl_c + ( norm_f.st) ).rgb;
fres = pow( 1.0 - abs( dot( norm_f, normalize( eyeminusvertex ) ) ), 5.0 );
out_f.rgb = mix( refr_f, refl_f, fres );
gl_FragColor = fog4( out_f );
}
#endif

View file

@ -1,80 +0,0 @@
//======= Copyright (c) 2015-2022 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Water shader that distorts the reflection based on a supplied normalmap
// and blends it on top of a skybox (cube) image.
//==============================================================================
!!ver 110
!!permu FOG
!!samps reflect=0 norm=1 skycube:samplerCube=2
#include "sys/defs.h"
varying vec2 tex_c;
varying vec2 lm_c;
varying mat3 invsurface;
varying vec4 tf_c;
varying vec3 eyeminusvertex;
varying vec3 eyevector;
varying vec2 shift1;
varying vec2 shift2;
#ifdef VERTEX_SHADER
void main ()
{
invsurface[0] = v_svector;
invsurface[1] = v_tvector;
invsurface[2] = v_normal;
eyeminusvertex = e_eyepos - v_position.xyz;
eyevector.x = dot(eyeminusvertex, v_svector.xyz);
eyevector.y = dot(eyeminusvertex, v_tvector.xyz);
eyevector.z = dot(eyeminusvertex, v_normal.xyz);
tf_c = ftetransform();
tf_c.z += 0.1;
shift1 = v_texcoord + vec2( e_time * 0.025, 0.0 );
shift2 = v_texcoord - vec2( 0, e_time * -0.025 );
tex_c = v_texcoord;
gl_Position = tf_c;
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
void main ( void )
{
float fres;
vec2 refl_c;
vec3 refl_f;
vec3 refr_f;
vec3 norm_f;
vec3 cube_c;
vec4 out_f = vec4( 1.0, 1.0, 1.0, 1.0 );
// Use the normalmap to shift the refraction
norm_f = ( texture2D( s_norm, shift1 ).xyz);
norm_f += ( texture2D( s_norm, shift2 ).xyz);
norm_f -= 1.0 - ( 16.0 / 1024.0 );
norm_f = normalize( norm_f );
// Reflection/View coordinates
refl_c = ( 1.0 + ( tf_c.xy / tf_c.w ) ) * 0.5;
refl_c.t -= 1.5 * invsurface[2].z / 1080.0;
// Load reflection and refraction based on our new coords
refl_f = texture2D(s_reflect, refl_c + ( norm_f.st * 0.1 )).rgb;
cube_c = reflect(normalize(eyevector), norm_f.rgb);
cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2];
cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz;
refr_f = textureCube(s_skycube, cube_c).rgb;
fres = pow( 1.0 - abs( dot( norm_f, normalize( eyeminusvertex ) ) ), 1.0 );
out_f.rgb = mix( refr_f, refl_f, fres );
gl_FragColor = fog4(out_f);
}
#endif

View file

@ -32,12 +32,15 @@ HUD_Draw(void)
iconPos[1] = (hudSize[1] - baseIconSize) - baseIconPadding; iconPos[1] = (hudSize[1] - baseIconSize) - baseIconPadding;
/* health, armor icons */ /* health, armor icons */
Font_DrawRText(iconPos + [-((baseIconSize/2) + (baseIconPadding/2)) - baseIconPadding, 0], "100", FONT_16);
drawpic(iconPos + [-((baseIconSize/2) + (baseIconPadding/2)), 0], "gfx/hud/health", [baseIconSize, baseIconSize], [1,1,1], 1.0f); drawpic(iconPos + [-((baseIconSize/2) + (baseIconPadding/2)), 0], "gfx/hud/health", [baseIconSize, baseIconSize], [1,1,1], 1.0f);
Font_DrawText(iconPos + [(baseIconSize/2) + (baseIconPadding/2) + baseIconSize + baseIconPadding, 0], "100", FONT_16);
drawpic(iconPos + [(baseIconSize/2) + (baseIconPadding/2), 0], "gfx/hud/armor", [baseIconSize, baseIconSize], [1,1,1], 1.0f); drawpic(iconPos + [(baseIconSize/2) + (baseIconPadding/2), 0], "gfx/hud/armor", [baseIconSize, baseIconSize], [1,1,1], 1.0f);
/* ammo icon */ /* little point in not drawing these, even if you don't have a suit */
iconPos[0] = (hudSize[0] - baseIconSize) - baseIconPadding; if (pl.m_activeWeapon) {
drawpic(iconPos, "gfx/hud/armor", [baseIconSize, baseIconSize], [1,1,1], 1.0f); pl.m_activeWeapon.UpdateGUI();
}
Textmenu_Draw(); Textmenu_Draw();
} }

View file

@ -13,5 +13,3 @@
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "gamerules.h"

View file

@ -14,114 +14,15 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
void
MultiplayerRules::MultiplayerRules(void)
{
}
void
MultiplayerRules::FrameStart(void)
{
if (cvar("mp_timelimit"))
if (time >= (cvar("mp_timelimit") * 60)) {
IntermissionStart();
}
IntermissionCycle();
}
void
MultiplayerRules::PlayerDeath(NSClientPlayer pl)
{
Plugin_PlayerObituary(g_dmg_eAttacker, g_dmg_eTarget, g_dmg_iWeapon, g_dmg_iHitBody, g_dmg_iDamage);
/* death-counter */
pl.deaths++;
forceinfokey(pl, "*deaths", ftos(pl.deaths));
/* update score-counter */
if (pl.flags & FL_CLIENT || pl.flags & FL_MONSTER)
if (g_dmg_eAttacker.flags & FL_CLIENT) {
if (pl == g_dmg_eAttacker)
g_dmg_eAttacker.frags--;
else
g_dmg_eAttacker.frags++;
}
/* in DM we only care about the frags */
if (cvar("mp_fraglimit"))
if (g_dmg_eAttacker.frags >= cvar("mp_fraglimit")) {
IntermissionStart();
}
pl.SetMovetype(MOVETYPE_NONE);
pl.SetSolid(SOLID_NOT);
pl.SetModelindex(0);
pl.takedamage = DAMAGE_NO;
pl.armor = pl.activeweapon = pl.g_items = 0;
pl.think = PutClientInServer;
pl.nextthink = time + 4.0f;
}
void
MultiplayerRules::PlayerSpawn(NSClientPlayer pl)
{
/* this is where the mods want to deviate */
entity spot;
pl.classname = "player";
pl.health = pl.max_health = 100;
pl.takedamage = DAMAGE_YES;
pl.solid = SOLID_SLIDEBOX;
pl.movetype = MOVETYPE_WALK;
pl.flags = FL_CLIENT;
pl.viewzoom = 1.0;
pl.model = "models/player.mdl";
setmodel(pl, pl.model);
setsize(pl, VEC_HULL_MIN, VEC_HULL_MAX);
pl.velocity = [0,0,0];
pl.gravity = __NULL__;
pl.frame = 1;
pl.SendFlags = UPDATE_ALL;
pl.customphysics = Empty;
pl.iBleeds = TRUE;
forceinfokey(pl, "*spec", "0");
forceinfokey(pl, "*deaths", ftos(pl.deaths));
LevelNewParms();
LevelDecodeParms(pl);
spot = Spawn_SelectRandom("info_player_deathmatch");
setorigin(pl, spot.origin);
pl.angles = spot.angles;
Client_FixAngle(pl, pl.angles);
}
float
MultiplayerRules::ConsoleCommand(NSClientPlayer pp, string cmd)
{
tokenize(cmd);
switch (argv(0)) {
default:
return (0);
}
return (1);
}
void void
Game_InitRules(void) Game_InitRules(void)
{ {
g_grMode = spawn(MultiplayerRules); g_grMode = NSGameRules::InitFromProgs("maps/mp/gametypes/dm.dat");
if (cvar("sv_playerslots") == 1 || cvar("coop") == 1) {
g_grMode = spawn(SingleplayerRules);
} else {
g_grMode = spawn(MultiplayerRules);
}
} }
void
Game_Worldspawn(void)
{
}

View file

@ -22,8 +22,6 @@ defs.h
../../../src/botlib/include.src ../../../src/botlib/include.src
/* mod specific functions */ /* mod specific functions */
gamerules.qc
gamerules_singleplayer.qc
gamerules_multiplayer.qc gamerules_multiplayer.qc
/* global server/shared code */ /* global server/shared code */

Binary file not shown.

View file

@ -0,0 +1,343 @@
// entity 0
{
"classname" "worldspawn"
// brush 0
{
( 248 192 -64 ) ( 248 -192 -64 ) ( -264 192 -64 ) pbrtest/pavingstones094 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( 256 192 8 ) ( -256 192 8 ) ( 256 192 0 ) pbrtestz/pavingstones094 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 256 192 8 ) ( 256 192 0 ) ( 256 -192 8 ) pbrtest/pavingstones094 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -256 -192 -128 ) ( 256 -192 -128 ) ( -256 192 -128 ) pbrtest/pavingstones094 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( -256 -192 0 ) ( -256 -192 8 ) ( 256 -192 0 ) pbrtest/pavingstones094 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 0 -184 0 ) ( 0 200 0 ) ( 0 -184 8 ) pbrtest/pavingstones094 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
}
// brush 1
{
( 248 192 192 ) ( 248 -192 192 ) ( -264 192 192 ) common/skyportal [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0
( 256 192 264 ) ( -256 192 264 ) ( 256 192 256 ) common/skyportal [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 256 192 264 ) ( 256 192 256 ) ( 256 -192 264 ) common/skyportal [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( -256 -192 128 ) ( 256 -192 128 ) ( -256 192 128 ) common/skyportal [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0
( -256 -192 256 ) ( -256 -192 264 ) ( 256 -192 256 ) common/skyportal [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( -256 -192 256 ) ( -256 192 256 ) ( -256 -192 264 ) common/skyportal [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
}
// brush 2
{
( 184 192 192 ) ( 184 -192 192 ) ( -328 192 192 ) pbrtest/leather011 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( 192 192 264 ) ( -320 192 264 ) ( 192 192 256 ) pbrtest/leather011 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -256 192 8 ) ( -256 192 0 ) ( -256 -192 8 ) pbrtest/leather011 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -768 -192 -128 ) ( -256 -192 -128 ) ( -768 192 -128 ) pbrtest/leather011 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( -320 -192 256 ) ( -320 -192 264 ) ( 192 -192 256 ) pbrtest/leather011 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 -192 256 ) ( -320 192 256 ) ( -320 -192 264 ) pbrtest/leather011 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
}
// brush 3
{
( 760 192 192 ) ( 760 -192 192 ) ( 248 192 192 ) pbrtest/tiles032 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( 768 192 264 ) ( 256 192 264 ) ( 768 192 256 ) pbrtest/tiles032 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 320 192 8 ) ( 320 192 0 ) ( 320 -192 8 ) pbrtest/tiles032 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -192 -192 -128 ) ( 320 -192 -128 ) ( -192 192 -128 ) pbrtest/tiles032 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( 256 -192 256 ) ( 256 -192 264 ) ( 768 -192 256 ) pbrtest/tiles032 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 256 -192 256 ) ( 256 192 256 ) ( 256 -192 264 ) pbrtest/tiles032 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
}
// brush 4
{
( 184 -192 192 ) ( 184 -576 192 ) ( -328 -192 192 ) pbrtest/bricks023 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( 192 -192 264 ) ( -320 -192 264 ) ( 192 -192 256 ) pbrtest/bricks023 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 320 96 8 ) ( 320 96 0 ) ( 320 -288 8 ) pbrtest/bricks023 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -768 -576 -128 ) ( -256 -576 -128 ) ( -768 -192 -128 ) pbrtest/bricks023 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( 272 -256 256 ) ( 272 -256 264 ) ( 784 -256 256 ) pbrtest/bricks023 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 -576 256 ) ( -320 -192 256 ) ( -320 -576 264 ) pbrtest/bricks023 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
}
// brush 5
{
( 248 192 -64 ) ( 248 -192 -64 ) ( -264 192 -64 ) pbrtest/marble006 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( 256 192 8 ) ( -256 192 8 ) ( 256 192 0 ) pbrtest/marble006 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 0 192 8 ) ( 0 192 0 ) ( 0 -192 8 ) pbrtest/marble006 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -256 -192 -128 ) ( 256 -192 -128 ) ( -256 192 -128 ) pbrtest/marble006 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( -256 -192 0 ) ( -256 -192 8 ) ( 256 -192 0 ) pbrtest/marble006 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -256 -192 0 ) ( -256 192 0 ) ( -256 -192 8 ) pbrtest/marble006 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
}
// brush 6
{
patchDef2
{
pbrtest/metal012
( 31 31 0 0 0 )
(
( ( 0 0 0 0 0 ) ( 2.1020846367 0 -0.0000004728 0 -0.002052817 ) ( 4.1582341194 0 0.437048018 0 -0.0041056345 ) ( 6.2143831253 0 0.8740955591 0 -0.0061584515 ) ( 8.1347332001 0 1.729090929 0 -0.008211269 ) ( 10.0550832748 0 2.5840854645 0 -0.0102640856 ) ( 11.7557048798 0 3.8196604252 0 -0.0123169031 ) ( 13.456328392 0 5.0552344322 0 -0.0143697206 ) ( 14.8628969193 0 6.6173882484 0 -0.0164225381 ) ( 16.2694664001 0 8.1795415878 0 -0.0184753556 ) ( 17.3205070496 0 10.0000009537 0 -0.0205281731 ) ( 18.3715515137 0 11.8204593658 0 -0.0225809887 ) ( 19.0211296082 0 13.8196611404 0 -0.0246338062 ) ( 19.6707115173 0 15.8188619614 0 -0.0266866237 ) ( 19.8904380798 0 17.9094314575 0 -0.0287394412 ) ( 20.1101665497 0 20 0 -0.0307922568 ) ( 19.8904380798 0 22.0905704498 0 -0.0328450762 ) ( 19.6707115173 0 24.1811389923 0 -0.0348978937 ) ( 19.0211296082 0 26.1803417206 0 -0.0369507112 ) ( 18.3715515137 0 28.1795425415 0 -0.0390035287 ) ( 17.3205070496 0 30.0000019073 0 -0.0410563461 ) ( 16.2694664001 0 31.8204574585 0 -0.0431091599 ) ( 14.8628959656 0 33.3826141357 0 -0.0451619774 ) ( 13.456328392 0 34.9447669983 0 -0.0472147949 ) ( 11.7557039261 0 36.1803398132 0 -0.0492676124 ) ( 10.0550842285 0 37.4159126282 0 -0.0513204262 ) ( 8.1347312927 0 38.2709083557 0 -0.0533732474 ) ( 6.214384079 0 39.1259040833 0 -0.0554260612 ) ( 4.1582322121 0 39.562953949 0 -0.0574788824 ) ( 2.1020855904 0 40 0 -0.0595316961 ) ( -0.0000019073 0 40 0 -0.0615845174 ) )
( ( 0 0 0 0.0041743629 0 ) ( 2.1020846367 0.446811676 -0.0000004728 0.0041743629 -0.002052817 ) ( 4.1582336426 0.8838596344 0.437048018 0.0041743629 -0.0041056345 ) ( 6.2143831253 1.3209075928 0.8740955591 0.0041743629 -0.0061584515 ) ( 8.1347332001 1.7290906906 1.729090929 0.0041743629 -0.008211269 ) ( 10.0550823212 2.1372737885 2.5840854645 0.0041743629 -0.0102640856 ) ( 11.7557048798 2.4987521172 3.8196604252 0.0041743629 -0.0123169031 ) ( 13.4563274384 2.8602304459 5.0552344322 0.0041743629 -0.0143697206 ) ( 14.8628959656 3.1592063904 6.6173882484 0.0041743629 -0.0164225381 ) ( 16.2694664001 3.4581818581 8.1795415878 0.0041743629 -0.0184753556 ) ( 17.3205070496 3.6815876961 10.0000009537 0.0041743629 -0.0205281731 ) ( 18.3715496063 3.9049935341 11.8204593658 0.0041743629 -0.0225809887 ) ( 19.0211296082 4.0430660248 13.8196611404 0.0041743629 -0.0246338062 ) ( 19.67070961 4.1811389923 15.8188619614 0.0041743629 -0.0266866237 ) ( 19.8904380798 4.2278432846 17.9094314575 0.0041743629 -0.0287394412 ) ( 20.1101646423 4.2745475769 20 0.0041743629 -0.0307922568 ) ( 19.8904361725 4.2278432846 22.0905704498 0.0041743629 -0.0328450762 ) ( 19.67070961 4.1811380386 24.1811389923 0.0041743629 -0.0348978937 ) ( 19.0211296082 4.0430660248 26.1803417206 0.0041743629 -0.0369507112 ) ( 18.3715496063 3.9049935341 28.1795425415 0.0041743629 -0.0390035287 ) ( 17.3205070496 3.6815872192 30.0000019073 0.0041743629 -0.0410563461 ) ( 16.2694664001 3.4581818581 31.8204574585 0.0041743629 -0.0431091599 ) ( 14.8628950119 3.1592059135 33.3826141357 0.0041743629 -0.0451619774 ) ( 13.4563274384 2.8602309227 34.9447669983 0.0041743629 -0.0472147949 ) ( 11.7557029724 2.4987516403 36.1803398132 0.0041743629 -0.0492676124 ) ( 10.0550832748 2.1372737885 37.4159126282 0.0041743629 -0.0513204262 ) ( 8.1347312927 1.7290906906 38.2709083557 0.0041743629 -0.0533732474 ) ( 6.2143836021 1.3209080696 39.1259040833 0.0041743629 -0.0554260612 ) ( 4.1582317352 0.8838596344 39.562953949 0.0041743629 -0.0574788824 ) ( 2.1020853519 0.4468121529 40 0.0041743629 -0.0595316961 ) ( -0.0000019073 -0.0000004768 40 0.0041743629 -0.0615845174 ) )
( ( 0 0 0 0.0083487257 0 ) ( 1.9203500748 0.8549947739 -0.0000004728 0.0083487257 -0.002052817 ) ( 3.7987356186 1.6913061142 0.437048018 0.0083487257 -0.0041056345 ) ( 5.6771216393 2.5276174545 0.8740955591 0.0083487257 -0.0061584515 ) ( 7.4314484596 3.3086938858 1.729090929 0.0083487257 -0.008211269 ) ( 9.1857757568 4.0897712708 2.5840854645 0.0083487257 -0.0102640856 ) ( 10.7393712997 4.7814760208 3.8196604252 0.0083487257 -0.0123169031 ) ( 12.2929668427 5.4731817245 5.0552344322 0.0083487257 -0.0143697206 ) ( 13.5779314041 6.0452852249 6.6173882484 0.0083487257 -0.0164225381 ) ( 14.8628969193 6.6173877716 8.1795415878 0.0083487257 -0.0184753556 ) ( 15.8230714798 7.0448856354 10.0000009537 0.0083487257 -0.0205281731 ) ( 16.783246994 7.4723834991 11.8204593658 0.0083487257 -0.0225809887 ) ( 17.3766670227 7.7365913391 13.8196611404 0.0083487257 -0.0246338062 ) ( 17.9700889587 8.0007991791 15.8188619614 0.0083487257 -0.0266866237 ) ( 18.1708183289 8.0901699066 17.9094314575 0.0083487257 -0.0287394412 ) ( 18.3715515137 8.1795415878 20 0.0083487257 -0.0307922568 ) ( 18.1708183289 8.0901699066 22.0905704498 0.0083487257 -0.0328450762 ) ( 17.9700889587 8.0007991791 24.1811389923 0.0083487257 -0.0348978937 ) ( 17.3766670227 7.7365913391 26.1803417206 0.0083487257 -0.0369507112 ) ( 16.7832450867 7.4723834991 28.1795425415 0.0083487257 -0.0390035287 ) ( 15.8230705261 7.0448856354 30.0000019073 0.0083487257 -0.0410563461 ) ( 14.8628978729 6.6173887253 31.8204574585 0.0083487257 -0.0431091599 ) ( 13.5779304504 6.0452842712 33.3826141357 0.0083487257 -0.0451619774 ) ( 12.2929677963 5.4731817245 34.9447669983 0.0083487257 -0.0472147949 ) ( 10.7393703461 4.7814760208 36.1803398132 0.0083487257 -0.0492676124 ) ( 9.1857757568 4.0897712708 37.4159126282 0.0083487257 -0.0513204262 ) ( 7.4314470291 3.308693409 38.2709083557 0.0083487257 -0.0533732474 ) ( 5.6771221161 2.5276174545 39.1259040833 0.0083487257 -0.0554260612 ) ( 3.7987341881 1.6913051605 39.562953949 0.0083487257 -0.0574788824 ) ( 1.9203505516 0.8549952507 40 0.0083487257 -0.0595316961 ) ( -0.0000014305 -0.0000004768 40 0.0083487257 -0.0615845174 ) )
( ( 0 0 0 0.0125230886 0 ) ( 1.738615036 1.2631778717 -0.0000004728 0.0125230886 -0.002052817 ) ( 3.4392371178 2.4987521172 0.437048018 0.0125230886 -0.0041056345 ) ( 5.1398596764 3.7343268394 0.8740955591 0.0125230886 -0.0061584515 ) ( 6.7281632423 4.888297081 1.729090929 0.0125230886 -0.008211269 ) ( 8.3164672852 6.0422677994 2.5840854645 0.0125230886 -0.0102640856 ) ( 9.7230358124 7.0641994476 3.8196604252 0.0125230886 -0.0123169031 ) ( 11.1296062469 8.0861320496 5.0552344322 0.0125230886 -0.0143697206 ) ( 12.292965889 8.9313631058 6.6173882484 0.0125230886 -0.0164225381 ) ( 13.4563264847 9.776594162 8.1795415878 0.0125230886 -0.0184753556 ) ( 14.3256340027 10.4081821442 10.0000009537 0.0125230886 -0.0205281731 ) ( 15.1949415207 11.0397720337 11.8204593658 0.0125230886 -0.0225809887 ) ( 15.7322034836 11.4301147461 13.8196611404 0.0125230886 -0.0246338062 ) ( 16.2694664001 11.8204593658 15.8188619614 0.0125230886 -0.0266866237 ) ( 16.4511985779 11.9524965286 17.9094314575 0.0125230886 -0.0287394412 ) ( 16.6329345703 12.0845336914 20 0.0125230886 -0.0307922568 ) ( 16.4511985779 11.9524965286 22.0905704498 0.0125230886 -0.0328450762 ) ( 16.2694644928 11.8204584122 24.1811389923 0.0125230886 -0.0348978937 ) ( 15.7322025299 11.4301147461 26.1803417206 0.0125230886 -0.0369507112 ) ( 15.1949415207 11.0397720337 28.1795425415 0.0125230886 -0.0390035287 ) ( 14.325633049 10.4081821442 30.0000019073 0.0125230886 -0.0410563461 ) ( 13.4563274384 9.776594162 31.8204574585 0.0125230886 -0.0431091599 ) ( 12.2929649353 8.9313621521 33.3826141357 0.0125230886 -0.0451619774 ) ( 11.1296062469 8.0861320496 34.9447669983 0.0125230886 -0.0472147949 ) ( 9.7230358124 7.0641994476 36.1803398132 0.0125230886 -0.0492676124 ) ( 8.3164672852 6.0422677994 37.4159126282 0.0125230886 -0.0513204262 ) ( 6.7281618118 4.8882961273 38.2709083557 0.0125230886 -0.0533732474 ) ( 5.1398601532 3.7343273163 39.1259040833 0.0125230886 -0.0554260612 ) ( 3.4392359257 2.4987511635 39.562953949 0.0125230886 -0.0574788824 ) ( 1.7386157513 1.2631783485 40 0.0125230886 -0.0595316961 ) ( -0.0000014305 -0.0000009537 40 0.0125230886 -0.0615845174 ) )
( ( 0 0 0 0.0166974515 0 ) ( 1.4065692425 1.5621538162 -0.0000004728 0.0166974515 -0.002052817 ) ( 2.7824015617 3.0901699066 0.437048018 0.0166974515 -0.0041056345 ) ( 4.1582341194 4.6181869507 0.8740955591 0.0166974515 -0.0061584515 ) ( 5.4431986809 6.0452852249 1.729090929 0.0166974515 -0.008211269 ) ( 6.7281637192 7.4723834991 2.5840854645 0.0166974515 -0.0102640856 ) ( 7.8661022186 8.7361917496 3.8196604252 0.0166974515 -0.0123169031 ) ( 9.0040407181 10 5.0552344322 0.0166974515 -0.0143697206 ) ( 9.9452190399 11.0452852249 6.6173882484 0.0166974515 -0.0164225381 ) ( 10.8863983154 12.0905704498 8.1795415878 0.0166974515 -0.0184753556 ) ( 11.5896816254 12.8716468811 10.0000009537 0.0166974515 -0.0205281731 ) ( 12.2929668427 13.6527233124 11.8204593658 0.0166974515 -0.0225809887 ) ( 12.7276201248 14.1354560852 13.8196611404 0.0166974515 -0.0246338062 ) ( 13.1622743607 14.6181869507 15.8188619614 0.0166974515 -0.0266866237 ) ( 13.3093004227 14.7814750671 17.9094314575 0.0166974515 -0.0287394412 ) ( 13.4563274384 14.9447669983 20 0.0166974515 -0.0307922568 ) ( 13.3093004227 14.7814750671 22.0905704498 0.0166974515 -0.0328450762 ) ( 13.1622743607 14.6181869507 24.1811389923 0.0166974515 -0.0348978937 ) ( 12.7276201248 14.1354541779 26.1803417206 0.0166974515 -0.0369507112 ) ( 12.292965889 13.6527233124 28.1795425415 0.0166974515 -0.0390035287 ) ( 11.5896816254 12.8716468811 30.0000019073 0.0166974515 -0.0410563461 ) ( 10.8863983154 12.0905704498 31.8204574585 0.0166974515 -0.0431091599 ) ( 9.9452180862 11.0452842712 33.3826141357 0.0166974515 -0.0451619774 ) ( 9.0040407181 10.0000009537 34.9447669983 0.0166974515 -0.0472147949 ) ( 7.866101265 8.7361907959 36.1803398132 0.0166974515 -0.0492676124 ) ( 6.728164196 7.4723834991 37.4159126282 0.0166974515 -0.0513204262 ) ( 5.4431977272 6.0452842712 38.2709083557 0.0166974515 -0.0533732474 ) ( 4.1582341194 4.6181869507 39.1259040833 0.0166974515 -0.0554260612 ) ( 2.7824003696 3.0901689529 39.562953949 0.0166974515 -0.0574788824 ) ( 1.4065697193 1.5621538162 40 0.0166974515 -0.0595316961 ) ( -0.0000009537 -0.0000014305 40 0.0166974515 -0.0615845174 ) )
( ( 0 0 0 0.0208718143 0 ) ( 1.0745232105 1.8611288071 -0.0000004728 0.0208718143 -0.002052817 ) ( 2.1255655289 3.6815876961 0.437048018 0.0208718143 -0.0041056345 ) ( 3.1766078472 5.5020465851 0.8740955591 0.0208718143 -0.0061584515 ) ( 4.1582336426 7.2022724152 1.729090929 0.0208718143 -0.008211269 ) ( 5.1398591995 8.9024982452 2.5840854645 0.0208718143 -0.0102640856 ) ( 6.0091667175 10.4081821442 3.8196604252 0.0208718143 -0.0123169031 ) ( 6.8784742355 11.9138679504 5.0552344322 0.0208718143 -0.0143697206 ) ( 7.5974702835 13.1592063904 6.6173882484 0.0208718143 -0.0164225381 ) ( 8.3164672852 14.4045448303 8.1795415878 0.0208718143 -0.0184753556 ) ( 8.8537282944 15.3351097107 10.0000009537 0.0208718143 -0.0205281731 ) ( 9.3909902573 16.2656745911 11.8204593658 0.0208718143 -0.0225809887 ) ( 9.7230358124 16.8407936096 13.8196611404 0.0208718143 -0.0246338062 ) ( 10.0550823212 17.4159145355 15.8188619614 0.0208718143 -0.0266866237 ) ( 10.1674003601 17.6104545593 17.9094314575 0.0208718143 -0.0287394412 ) ( 10.279718399 17.8049964905 20 0.0208718143 -0.0307922568 ) ( 10.1674003601 17.6104545593 22.0905704498 0.0208718143 -0.0328450762 ) ( 10.0550823212 17.4159126282 24.1811389923 0.0208718143 -0.0348978937 ) ( 9.7230358124 16.8407936096 26.1803417206 0.0208718143 -0.0369507112 ) ( 9.3909893036 16.2656726837 28.1795425415 0.0208718143 -0.0390035287 ) ( 8.8537273407 15.3351078033 30.0000019073 0.0208718143 -0.0410563461 ) ( 8.3164672852 14.4045448303 31.8204574585 0.0208718143 -0.0431091599 ) ( 7.5974702835 13.159204483 33.3826141357 0.0208718143 -0.0451619774 ) ( 6.8784747124 11.9138679504 34.9447669983 0.0208718143 -0.0472147949 ) ( 6.0091657639 10.4081821442 36.1803398132 0.0208718143 -0.0492676124 ) ( 5.1398596764 8.9024982452 37.4159126282 0.0208718143 -0.0513204262 ) ( 4.1582326889 7.2022705078 38.2709083557 0.0208718143 -0.0533732474 ) ( 3.1766080856 5.5020465851 39.1259040833 0.0208718143 -0.0554260612 ) ( 2.1255645752 3.6815862656 39.562953949 0.0208718143 -0.0574788824 ) ( 1.0745234489 1.8611297607 40 0.0208718143 -0.0595316961 ) ( -0.0000009537 -0.0000014305 40 0.0208718143 -0.0615845174 ) )
( ( 0 0 0 0.0250461772 0 ) ( 0.6495797634 1.9992017746 -0.0000004728 0.0250461772 -0.002052817 ) ( 1.2849647999 3.9547157288 0.437048018 0.0250461772 -0.0041056345 ) ( 1.9203498363 5.9102296829 0.8740955591 0.0250461772 -0.0061584515 ) ( 2.5137705803 7.7365913391 1.729090929 0.0250461772 -0.008211269 ) ( 3.1071913242 9.5629520416 2.5840854645 0.0250461772 -0.0102640856 ) ( 3.6327123642 11.1803398132 3.8196604252 0.0250461772 -0.0123169031 ) ( 4.1582336426 12.7977294922 5.0552344322 0.0250461772 -0.0143697206 ) ( 4.5928874016 14.1354560852 6.6173882484 0.0250461772 -0.0164225381 ) ( 5.0275411606 15.4731826782 8.1795415878 0.0250461772 -0.0184753556 ) ( 5.3523306847 16.472782135 10.0000009537 0.0250461772 -0.0205281731 ) ( 5.6771211624 17.4723834991 11.8204593658 0.0250461772 -0.0225809887 ) ( 5.877851963 18.0901699066 13.8196611404 0.0250461772 -0.0246338062 ) ( 6.0785832405 18.7079582214 15.8188619614 0.0250461772 -0.0266866237 ) ( 6.1464824677 18.9169311523 17.9094314575 0.0250461772 -0.0287394412 ) ( 6.2143821716 19.1259040833 20 0.0250461772 -0.0307922568 ) ( 6.1464824677 18.9169311523 22.0905704498 0.0250461772 -0.0328450762 ) ( 6.0785832405 18.7079582214 24.1811389923 0.0250461772 -0.0348978937 ) ( 5.877851963 18.0901699066 26.1803417206 0.0250461772 -0.0369507112 ) ( 5.6771206856 17.4723815918 28.1795425415 0.0250461772 -0.0390035287 ) ( 5.3523306847 16.472782135 30.0000019073 0.0250461772 -0.0410563461 ) ( 5.0275411606 15.4731826782 31.8204574585 0.0250461772 -0.0431091599 ) ( 4.5928869247 14.1354541779 33.3826141357 0.0250461772 -0.0451619774 ) ( 4.1582336426 12.7977294922 34.9447669983 0.0250461772 -0.0472147949 ) ( 3.6327118874 11.1803388596 36.1803398132 0.0250461772 -0.0492676124 ) ( 3.1071915627 9.5629529953 37.4159126282 0.0250461772 -0.0513204262 ) ( 2.5137701035 7.7365894318 38.2709083557 0.0250461772 -0.0533732474 ) ( 1.9203500748 5.9102306366 39.1259040833 0.0250461772 -0.0554260612 ) ( 1.284964323 3.9547138214 39.562953949 0.0250461772 -0.0574788824 ) ( 0.6495800018 1.9992017746 40 0.0250461772 -0.0595316961 ) ( -0.0000004768 -0.0000014305 40 0.0250461772 -0.0615845174 ) )
( ( 0 0 0 0.0292205401 0 ) ( 0.2246365547 2.1372737885 -0.0000004728 0.0292205401 -0.002052817 ) ( 0.4443640709 4.2278432846 0.437048018 0.0292205401 -0.0041056345 ) ( 0.6640915871 6.3184127808 0.8740955591 0.0292205401 -0.0061584515 ) ( 0.8693072796 8.2709083557 1.729090929 0.0292205401 -0.008211269 ) ( 1.0745227337 10.223405838 2.5840854645 0.0292205401 -0.0102640856 ) ( 1.256257534 11.9524965286 3.8196604252 0.0292205401 -0.0123169031 ) ( 1.4379923344 13.6815872192 5.0552344322 0.0292205401 -0.0143697206 ) ( 1.5883033276 15.1117019653 6.6173882484 0.0292205401 -0.0164225381 ) ( 1.7386145592 16.5418167114 8.1795415878 0.0292205401 -0.0184753556 ) ( 1.8509325981 17.6104545593 10.0000009537 0.0292205401 -0.0205281731 ) ( 1.9632508755 18.6790924072 11.8204593658 0.0292205401 -0.0225809887 ) ( 2.03266716 19.3395462036 13.8196611404 0.0292205401 -0.0246338062 ) ( 2.102083683 20 15.8188619614 0.0292205401 -0.0266866237 ) ( 2.1255645752 20.223405838 17.9094314575 0.0292205401 -0.0287394412 ) ( 2.1490454674 20.446811676 20 0.0292205401 -0.0307922568 ) ( 2.1255645752 20.2234039307 22.0905704498 0.0292205401 -0.0328450762 ) ( 2.102083683 20 24.1811389923 0.0292205401 -0.0348978937 ) ( 2.03266716 19.3395442963 26.1803417206 0.0292205401 -0.0369507112 ) ( 1.9632508755 18.6790924072 28.1795425415 0.0292205401 -0.0390035287 ) ( 1.8509325981 17.6104545593 30.0000019073 0.0292205401 -0.0410563461 ) ( 1.7386145592 16.5418186188 31.8204574585 0.0292205401 -0.0431091599 ) ( 1.5883030891 15.1117019653 33.3826141357 0.0292205401 -0.0451619774 ) ( 1.4379923344 13.6815872192 34.9447669983 0.0292205401 -0.0472147949 ) ( 1.2562572956 11.952495575 36.1803398132 0.0292205401 -0.0492676124 ) ( 1.0745229721 10.223405838 37.4159126282 0.0292205401 -0.0513204262 ) ( 0.8693070412 8.270907402 38.2709083557 0.0292205401 -0.0533732474 ) ( 0.6640915871 6.3184127808 39.1259040833 0.0292205401 -0.0554260612 ) ( 0.4443638325 4.2278413773 39.562953949 0.0292205401 -0.0574788824 ) ( 0.2246365547 2.1372747421 40 0.0292205401 -0.0595316961 ) ( 0 -0.0000019073 40 0.0292205401 -0.0615845174 ) )
( ( 0 0 0 0.0333949029 0 ) ( -0.219727993 2.0905694962 -0.0000004728 0.0333949029 -0.002052817 ) ( -0.434653759 4.1354551315 0.437048018 0.0333949029 -0.0041056345 ) ( -0.6495800018 6.1803398132 0.8740955591 0.0333949029 -0.0061584515 ) ( -0.8503117561 8.0901699066 1.729090929 0.0333949029 -0.008211269 ) ( -1.0510430336 10 2.5840854645 0.0333949029 -0.0102640856 ) ( -1.2288064957 11.6913061142 3.8196604252 0.0333949029 -0.0123169031 ) ( -1.4065699577 13.3826122284 5.0552344322 0.0333949029 -0.0143697206 ) ( -1.5535964966 14.7814750671 6.6173882484 0.0333949029 -0.0164225381 ) ( -1.7006230354 16.1803398132 8.1795415878 0.0333949029 -0.0184753556 ) ( -1.8104867935 17.2256240845 10.0000009537 0.0333949029 -0.0205281731 ) ( -1.9203510284 18.2709083557 11.8204593658 0.0333949029 -0.0225809887 ) ( -1.9882502556 18.9169311523 13.8196611404 0.0333949029 -0.0246338062 ) ( -2.0561499596 19.562953949 15.8188619614 0.0333949029 -0.0266866237 ) ( -2.079117775 19.7814750671 17.9094314575 0.0333949029 -0.0287394412 ) ( -2.1020855904 20 20 0.0333949029 -0.0307922568 ) ( -2.079117775 19.7814750671 22.0905704498 0.0333949029 -0.0328450762 ) ( -2.0561499596 19.5629520416 24.1811389923 0.0333949029 -0.0348978937 ) ( -1.9882502556 18.9169311523 26.1803417206 0.0333949029 -0.0369507112 ) ( -1.9203505516 18.2709083557 28.1795425415 0.0333949029 -0.0390035287 ) ( -1.8104867935 17.2256240845 30.0000019073 0.0333949029 -0.0410563461 ) ( -1.7006230354 16.1803398132 31.8204574585 0.0333949029 -0.0431091599 ) ( -1.5535964966 14.7814750671 33.3826141357 0.0333949029 -0.0451619774 ) ( -1.4065699577 13.3826141357 34.9447669983 0.0333949029 -0.0472147949 ) ( -1.2288060188 11.6913051605 36.1803398132 0.0333949029 -0.0492676124 ) ( -1.0510430336 10.0000009537 37.4159126282 0.0333949029 -0.0513204262 ) ( -0.8503112793 8.0901679993 38.2709083557 0.0333949029 -0.0533732474 ) ( -0.6495804787 6.1803407669 39.1259040833 0.0333949029 -0.0554260612 ) ( -0.434653759 4.1354532242 39.562953949 0.0333949029 -0.0574788824 ) ( -0.219727993 2.090569973 40 0.0333949029 -0.0595316961 ) ( 0.0000002384 -0.0000019073 40 0.0333949029 -0.0615845174 ) )
( ( 0 0 0 0.0375692658 0 ) ( -0.6640920639 2.043864727 -0.0000004728 0.0375692658 -0.002052817 ) ( -1.3136720657 4.0430660248 0.437048018 0.0375692658 -0.0041056345 ) ( -1.9632520676 6.0422668457 0.8740955591 0.0375692658 -0.0061584515 ) ( -2.5699300766 7.9094305038 1.729090929 0.0375692658 -0.008211269 ) ( -3.1766085625 9.776594162 2.5840854645 0.0375692658 -0.0102640856 ) ( -3.7138700485 11.4301147461 3.8196604252 0.0375692658 -0.0123169031 ) ( -4.2511320114 13.0836372375 5.0552344322 0.0375692658 -0.0143697206 ) ( -4.6954956055 14.4512481689 6.6173882484 0.0375692658 -0.0164225381 ) ( -5.1398601532 15.8188610077 8.1795415878 0.0375692658 -0.0184753556 ) ( -5.471906662 16.8407936096 10.0000009537 0.0375692658 -0.0205281731 ) ( -5.8039522171 17.8627243042 11.8204593658 0.0375692658 -0.0225809887 ) ( -6.0091676712 18.4943141937 13.8196611404 0.0375692658 -0.0246338062 ) ( -6.214384079 19.1259040833 15.8188619614 0.0375692658 -0.0266866237 ) ( -6.2838001251 19.3395442963 17.9094314575 0.0375692658 -0.0287394412 ) ( -6.3532171249 19.553188324 20 0.0375692658 -0.0307922568 ) ( -6.2838001251 19.3395442963 22.0905704498 0.0375692658 -0.0328450762 ) ( -6.214384079 19.1259040833 24.1811389923 0.0375692658 -0.0348978937 ) ( -6.0091676712 18.4943122864 26.1803417206 0.0375692658 -0.0369507112 ) ( -5.8039522171 17.8627243042 28.1795425415 0.0375692658 -0.0390035287 ) ( -5.4719057083 16.8407917023 30.0000019073 0.0375692658 -0.0410563461 ) ( -5.1398601532 15.8188610077 31.8204574585 0.0375692658 -0.0431091599 ) ( -4.6954956055 14.4512481689 33.3826141357 0.0375692658 -0.0451619774 ) ( -4.2511320114 13.0836372375 34.9447669983 0.0375692658 -0.0472147949 ) ( -3.7138695717 11.4301128387 36.1803398132 0.0375692658 -0.0492676124 ) ( -3.1766085625 9.776594162 37.4159126282 0.0375692658 -0.0513204262 ) ( -2.5699295998 7.9094285965 38.2709083557 0.0375692658 -0.0533732474 ) ( -1.9632520676 6.0422677994 39.1259040833 0.0375692658 -0.0554260612 ) ( -1.3136715889 4.0430641174 39.562953949 0.0375692658 -0.0574788824 ) ( -0.6640920639 2.0438652039 40 0.0375692658 -0.0595316961 ) ( 0.0000004768 -0.0000019073 40 0.0375692658 -0.0615845174 ) )
( ( 0 0 0 0.0417436287 0 ) ( -1.0510425568 1.820458889 -0.0000004728 0.0417436287 -0.002052817 ) ( -2.0791172981 3.6011362076 0.437048018 0.0417436287 -0.0041056345 ) ( -3.1071920395 5.3818130493 0.8740955591 0.0417436287 -0.0061584515 ) ( -4.0673666 7.0448856354 1.729090929 0.0417436287 -0.008211269 ) ( -5.0275421143 8.7079572678 2.5840854645 0.0417436287 -0.0102640856 ) ( -5.8778533936 10.1807384491 3.8196604252 0.0417436287 -0.0123169031 ) ( -6.7281646729 11.6535215378 5.0552344322 0.0417436287 -0.0143697206 ) ( -7.4314489365 12.8716468811 6.6173882484 0.0417436287 -0.0164225381 ) ( -8.1347341537 14.0897712708 8.1795415878 0.0417436287 -0.0184753556 ) ( -8.6602554321 15 10.0000009537 0.0417436287 -0.0205281731 ) ( -9.1857767105 15.9102287292 11.8204593658 0.0417436287 -0.0225809887 ) ( -9.5105657578 16.472782135 13.8196611404 0.0417436287 -0.0246338062 ) ( -9.8353567123 17.0353355408 15.8188619614 0.0417436287 -0.0266866237 ) ( -9.9452199936 17.2256240845 17.9094314575 0.0417436287 -0.0287394412 ) ( -10.0550842285 17.4159145355 20 0.0417436287 -0.0307922568 ) ( -9.9452199936 17.2256240845 22.0905704498 0.0417436287 -0.0328450762 ) ( -9.8353567123 17.0353355408 24.1811389923 0.0417436287 -0.0348978937 ) ( -9.5105657578 16.472782135 26.1803417206 0.0417436287 -0.0369507112 ) ( -9.1857757568 15.9102287292 28.1795425415 0.0417436287 -0.0390035287 ) ( -8.6602544785 15 30.0000019073 0.0417436287 -0.0410563461 ) ( -8.1347341537 14.0897712708 31.8204574585 0.0417436287 -0.0431091599 ) ( -7.4314489365 12.8716449738 33.3826141357 0.0417436287 -0.0451619774 ) ( -6.7281646729 11.6535224915 34.9447669983 0.0417436287 -0.0472147949 ) ( -5.8778524399 10.1807384491 36.1803398132 0.0417436287 -0.0492676124 ) ( -5.0275421143 8.7079582214 37.4159126282 0.0417436287 -0.0513204262 ) ( -4.0673666 7.044883728 38.2709083557 0.0417436287 -0.0533732474 ) ( -3.1071920395 5.381814003 39.1259040833 0.0417436287 -0.0554260612 ) ( -2.0791163445 3.6011347771 39.562953949 0.0417436287 -0.0574788824 ) ( -1.0510430336 1.8204593658 40 0.0417436287 -0.0595316961 ) ( 0.0000009537 -0.0000014305 40 0.0417436287 -0.0615845174 ) )
( ( 0 0 0 0.0459179915 0 ) ( -1.4379930496 1.5970525742 -0.0000004728 0.0459179915 -0.002052817 ) ( -2.8445620537 3.1592059135 0.437048018 0.0459179915 -0.0041056345 ) ( -4.2511310577 4.7213592529 0.8740955591 0.0459179915 -0.0061584515 ) ( -5.5648031235 6.1803398132 1.729090929 0.0459179915 -0.008211269 ) ( -6.8784751892 7.6393194199 2.5840854645 0.0459179915 -0.0102640856 ) ( -8.0418357849 8.9313621521 3.8196604252 0.0459179915 -0.0123169031 ) ( -9.2051963806 10.223405838 5.0552344322 0.0459179915 -0.0143697206 ) ( -10.1674013138 11.2920417786 6.6173882484 0.0459179915 -0.0164225381 ) ( -11.1296062469 12.3606796265 8.1795415878 0.0459179915 -0.0184753556 ) ( -11.8486032486 13.159204483 10.0000009537 0.0459179915 -0.0205281731 ) ( -12.5676002502 13.9577312469 11.8204593658 0.0459179915 -0.0225809887 ) ( -13.0119628906 14.4512481689 13.8196611404 0.0459179915 -0.0246338062 ) ( -13.4563274384 14.9447631836 15.8188619614 0.0459179915 -0.0266866237 ) ( -13.6066379547 15.1117019653 17.9094314575 0.0459179915 -0.0287394412 ) ( -13.7569503784 15.2786388397 20 0.0459179915 -0.0307922568 ) ( -13.6066379547 15.1117019653 22.0905704498 0.0459179915 -0.0328450762 ) ( -13.4563274384 14.9447631836 24.1811389923 0.0459179915 -0.0348978937 ) ( -13.0119628906 14.4512481689 26.1803417206 0.0459179915 -0.0369507112 ) ( -12.5675983429 13.9577312469 28.1795425415 0.0459179915 -0.0390035287 ) ( -11.8486022949 13.159204483 30.0000019073 0.0459179915 -0.0410563461 ) ( -11.1296072006 12.3606796265 31.8204574585 0.0459179915 -0.0431091599 ) ( -10.1674003601 11.2920408249 33.3826141357 0.0459179915 -0.0451619774 ) ( -9.2051973343 10.223405838 34.9447669983 0.0459179915 -0.0472147949 ) ( -8.0418348312 8.9313611984 36.1803398132 0.0459179915 -0.0492676124 ) ( -6.8784751892 7.6393203735 37.4159126282 0.0459179915 -0.0513204262 ) ( -5.5648021698 6.1803379059 38.2709083557 0.0459179915 -0.0533732474 ) ( -4.2511320114 4.7213592529 39.1259040833 0.0459179915 -0.0554260612 ) ( -2.8445611 3.159204483 39.562953949 0.0459179915 -0.0574788824 ) ( -1.4379935265 1.5970535278 40 0.0459179915 -0.0595316961 ) ( 0.0000011921 -0.0000014305 40 0.0459179915 -0.0615845174 ) )
( ( 0 0 0 0.0500923544 0 ) ( -1.7006225586 1.2355742455 -0.0000004728 0.0500923544 -0.002052817 ) ( -3.3640818596 2.4441480637 0.437048018 0.0500923544 -0.0041056345 ) ( -5.0275421143 3.6527223587 0.8740955591 0.0500923544 -0.0061584515 ) ( -6.5811376572 4.7814760208 1.729090929 0.0500923544 -0.008211269 ) ( -8.1347332001 5.9102287292 2.5840854645 0.0500923544 -0.0102640856 ) ( -9.5105657578 6.9098300934 3.8196604252 0.0500923544 -0.0123169031 ) ( -10.8863983154 7.9094305038 5.0552344322 0.0500923544 -0.0143697206 ) ( -12.0243358612 8.7361907959 6.6173882484 0.0500923544 -0.0164225381 ) ( -13.1622753143 9.5629520416 8.1795415878 0.0500923544 -0.0184753556 ) ( -14.0125865936 10.1807384491 10.0000009537 0.0500923544 -0.0205281731 ) ( -14.8628978729 10.7985258102 11.8204593658 0.0500923544 -0.0225809887 ) ( -15.3884181976 11.1803388596 13.8196611404 0.0500923544 -0.0246338062 ) ( -15.9139404297 11.5621528625 15.8188619614 0.0500923544 -0.0266866237 ) ( -16.0917034149 11.6913051605 17.9094314575 0.0500923544 -0.0287394412 ) ( -16.2694664001 11.8204574585 20 0.0500923544 -0.0307922568 ) ( -16.0917034149 11.6913051605 22.0905704498 0.0500923544 -0.0328450762 ) ( -15.9139404297 11.5621528625 24.1811389923 0.0500923544 -0.0348978937 ) ( -15.3884181976 11.1803379059 26.1803417206 0.0500923544 -0.0369507112 ) ( -14.8628978729 10.7985248566 28.1795425415 0.0500923544 -0.0390035287 ) ( -14.0125846863 10.1807384491 30.0000019073 0.0500923544 -0.0410563461 ) ( -13.1622753143 9.5629520416 31.8204574585 0.0500923544 -0.0431091599 ) ( -12.0243358612 8.7361898422 33.3826141357 0.0500923544 -0.0451619774 ) ( -10.8863992691 7.9094305038 34.9447669983 0.0500923544 -0.0472147949 ) ( -9.5105648041 6.909828186 36.1803398132 0.0500923544 -0.0492676124 ) ( -8.1347341537 5.9102296829 37.4159126282 0.0500923544 -0.0513204262 ) ( -6.5811367035 4.7814750671 38.2709083557 0.0500923544 -0.0533732474 ) ( -5.0275421143 3.6527228355 39.1259040833 0.0500923544 -0.0554260612 ) ( -3.3640809059 2.44414711 39.562953949 0.0500923544 -0.0574788824 ) ( -1.7006230354 1.2355747223 40 0.0500923544 -0.0595316961 ) ( 0.0000014305 -0.0000009537 40 0.0500923544 -0.0615845174 ) )
( ( 0 0 0 0.0542667173 0 ) ( -1.9632515907 0.8740959167 -0.0000004728 0.0542667173 -0.002052817 ) ( -3.8836016655 1.7290906906 0.437048018 0.0542667173 -0.0041056345 ) ( -5.8039512634 2.5840854645 0.8740955591 0.0542667173 -0.0061584515 ) ( -7.5974712372 3.3826112747 1.729090929 0.0542667173 -0.008211269 ) ( -9.3909912109 4.1811380386 2.5840854645 0.0542667173 -0.0102640856 ) ( -10.9792947769 4.8882961273 3.8196604252 0.0542667173 -0.0123169031 ) ( -12.5675983429 5.595454216 5.0552344322 0.0542667173 -0.0143697206 ) ( -13.8812713623 6.1803388596 6.6173882484 0.0542667173 -0.0164225381 ) ( -15.1949424744 6.7652225494 8.1795415878 0.0542667173 -0.0184753556 ) ( -16.176568985 7.2022705078 10.0000009537 0.0542667173 -0.0205281731 ) ( -17.1581935883 7.6393184662 11.8204593658 0.0542667173 -0.0225809887 ) ( -17.7648715973 7.9094295502 13.8196611404 0.0542667173 -0.0246338062 ) ( -18.3715515137 8.1795396805 15.8188619614 0.0542667173 -0.0266866237 ) ( -18.5767650604 8.270907402 17.9094314575 0.0542667173 -0.0287394412 ) ( -18.7819824219 8.3622751236 20 0.0542667173 -0.0307922568 ) ( -18.5767650604 8.270907402 22.0905704498 0.0542667173 -0.0328450762 ) ( -18.3715496063 8.1795396805 24.1811389923 0.0542667173 -0.0348978937 ) ( -17.7648715973 7.9094285965 26.1803417206 0.0542667173 -0.0369507112 ) ( -17.1581935883 7.6393184662 28.1795425415 0.0542667173 -0.0390035287 ) ( -16.1765670776 7.2022705078 30.0000019073 0.0542667173 -0.0410563461 ) ( -15.1949424744 6.7652235031 31.8204574585 0.0542667173 -0.0431091599 ) ( -13.881269455 6.1803379059 33.3826141357 0.0542667173 -0.0451619774 ) ( -12.5676002502 5.5954551697 34.9447669983 0.0542667173 -0.0472147949 ) ( -10.9792938232 4.8882951736 36.1803398132 0.0542667173 -0.0492676124 ) ( -9.3909912109 4.1811380386 37.4159126282 0.0542667173 -0.0513204262 ) ( -7.5974693298 3.3826107979 38.2709083557 0.0542667173 -0.0533732474 ) ( -5.8039522171 2.5840854645 39.1259040833 0.0542667173 -0.0554260612 ) ( -3.883600235 1.7290897369 39.562953949 0.0542667173 -0.0574788824 ) ( -1.9632525444 0.8740959167 40 0.0542667173 -0.0595316961 ) ( 0.0000016689 -0.0000009537 40 0.0542667173 -0.0615845174 ) )
( ( 0 0 0 0.0584410802 0 ) ( -2.0561494827 0.4370479584 -0.0000004728 0.0584410802 -0.002052817 ) ( -4.0673666 0.8645448685 0.437048018 0.0584410802 -0.0041056345 ) ( -6.0785837173 1.2920427322 0.8740955591 0.0584410802 -0.0061584515 ) ( -7.9569702148 1.6913051605 1.729090929 0.0584410802 -0.008211269 ) ( -9.8353557587 2.0905685425 2.5840854645 0.0584410802 -0.0102640856 ) ( -11.4988155365 2.4441475868 3.8196604252 0.0584410802 -0.0123169031 ) ( -13.1622753143 2.7977266312 5.0552344322 0.0584410802 -0.0143697206 ) ( -14.5381069183 3.0901689529 6.6173882484 0.0584410802 -0.0164225381 ) ( -15.9139404297 3.3826107979 8.1795415878 0.0584410802 -0.0184753556 ) ( -16.9420146942 3.6011347771 10.0000009537 0.0584410802 -0.0205281731 ) ( -17.9700889587 3.8196587563 11.8204593658 0.0584410802 -0.0225809887 ) ( -18.605474472 3.9547138214 13.8196611404 0.0584410802 -0.0246338062 ) ( -19.240858078 4.0897693634 15.8188619614 0.0584410802 -0.0266866237 ) ( -19.455783844 4.1354532242 17.9094314575 0.0584410802 -0.0287394412 ) ( -19.6707115173 4.181137085 20 0.0584410802 -0.0307922568 ) ( -19.455783844 4.1354532242 22.0905704498 0.0584410802 -0.0328450762 ) ( -19.240858078 4.0897693634 24.1811389923 0.0584410802 -0.0348978937 ) ( -18.6054725647 3.9547138214 26.1803417206 0.0584410802 -0.0369507112 ) ( -17.9700889587 3.8196587563 28.1795425415 0.0584410802 -0.0390035287 ) ( -16.9420127869 3.6011347771 30.0000019073 0.0584410802 -0.0410563461 ) ( -15.9139404297 3.3826112747 31.8204574585 0.0584410802 -0.0431091599 ) ( -14.5381069183 3.0901684761 33.3826141357 0.0584410802 -0.0451619774 ) ( -13.1622753143 2.7977266312 34.9447669983 0.0584410802 -0.0472147949 ) ( -11.4988136292 2.44414711 36.1803398132 0.0584410802 -0.0492676124 ) ( -9.8353567123 2.0905685425 37.4159126282 0.0584410802 -0.0513204262 ) ( -7.9569683075 1.6913051605 38.2709083557 0.0584410802 -0.0533732474 ) ( -6.078584671 1.2920427322 39.1259040833 0.0584410802 -0.0554260612 ) ( -4.0673646927 0.8645448685 39.562953949 0.0584410802 -0.0574788824 ) ( -2.0561499596 0.4370479584 40 0.0584410802 -0.0595316961 ) ( 0.0000016689 -0.0000004768 40 0.0584410802 -0.0615845174 ) )
( ( 0 0 0 0.0626154467 0 ) ( -2.1490464211 0 -0.0000004728 0.0626154467 -0.002052817 ) ( -4.2511310577 -0.0000004768 0.437048018 0.0626154467 -0.0041056345 ) ( -6.3532161713 -0.0000004768 0.8740955591 0.0626154467 -0.0061584515 ) ( -8.3164672852 -0.0000009537 1.729090929 0.0626154467 -0.008211269 ) ( -10.2797193527 -0.0000009537 2.5840854645 0.0626154467 -0.0102640856 ) ( -12.0183334351 -0.0000009537 3.8196604252 0.0626154467 -0.0123169031 ) ( -13.7569503784 -0.0000014305 5.0552344322 0.0626154467 -0.0143697206 ) ( -15.1949424744 -0.0000014305 6.6173882484 0.0626154467 -0.0164225381 ) ( -16.6329345703 -0.0000014305 8.1795415878 0.0626154467 -0.0184753556 ) ( -17.7074584961 -0.0000014305 10.0000009537 0.0626154467 -0.0205281731 ) ( -18.7819805145 -0.0000014305 11.8204593658 0.0626154467 -0.0225809887 ) ( -19.4460735321 -0.0000019073 13.8196611404 0.0626154467 -0.0246338062 ) ( -20.1101646423 -0.0000019073 15.8188619614 0.0626154467 -0.0266866237 ) ( -20.3348007202 -0.0000019073 17.9094314575 0.0626154467 -0.0287394412 ) ( -20.5594387054 -0.0000019073 20 0.0626154467 -0.0307922568 ) ( -20.3348007202 -0.0000019073 22.0905704498 0.0626154467 -0.0328450762 ) ( -20.1101646423 -0.0000019073 24.1811389923 0.0626154467 -0.0348978937 ) ( -19.4460716248 -0.0000019073 26.1803417206 0.0626154467 -0.0369507112 ) ( -18.7819805145 -0.0000014305 28.1795425415 0.0626154467 -0.0390035287 ) ( -17.7074565887 -0.0000014305 30.0000019073 0.0626154467 -0.0410563461 ) ( -16.6329345703 -0.0000014305 31.8204574585 0.0626154467 -0.0431091599 ) ( -15.194940567 -0.0000014305 33.3826141357 0.0626154467 -0.0451619774 ) ( -13.7569503784 -0.0000014305 34.9447669983 0.0626154467 -0.0472147949 ) ( -12.0183334351 -0.0000009537 36.1803398132 0.0626154467 -0.0492676124 ) ( -10.2797193527 -0.0000009537 37.4159126282 0.0626154467 -0.0513204262 ) ( -8.3164653778 -0.0000009537 38.2709083557 0.0626154467 -0.0533732474 ) ( -6.3532161713 -0.0000004768 39.1259040833 0.0626154467 -0.0554260612 ) ( -4.2511291504 -0.0000004768 39.562953949 0.0626154467 -0.0574788824 ) ( -2.1490473747 0 40 0.0626154467 -0.0595316961 ) ( 0.0000016689 0 40 0.0626154467 -0.0615845174 ) )
( ( 0 0 0 0.0667898059 0 ) ( -2.0561490059 -0.4370484352 -0.0000004728 0.0667898059 -0.002052817 ) ( -4.0673666 -0.8645458221 0.437048018 0.0667898059 -0.0041056345 ) ( -6.0785837173 -1.2920436859 0.8740955591 0.0667898059 -0.0061584515 ) ( -7.9569692612 -1.6913070679 1.729090929 0.0667898059 -0.008211269 ) ( -9.8353557587 -2.0905704498 2.5840854645 0.0667898059 -0.0102640856 ) ( -11.4988145828 -2.4441494942 3.8196604252 0.0667898059 -0.0123169031 ) ( -13.1622753143 -2.7977290154 5.0552344322 0.0667898059 -0.0143697206 ) ( -14.5381069183 -3.0901713371 6.6173882484 0.0667898059 -0.0164225381 ) ( -15.9139385223 -3.3826136589 8.1795415878 0.0667898059 -0.0184753556 ) ( -16.9420127869 -3.6011376381 10.0000009537 0.0667898059 -0.0205281731 ) ( -17.9700889587 -3.8196620941 11.8204593658 0.0667898059 -0.0225809887 ) ( -18.6054725647 -3.9547171593 13.8196611404 0.0667898059 -0.0246338062 ) ( -19.240858078 -4.0897722244 15.8188619614 0.0667898059 -0.0266866237 ) ( -19.455783844 -4.1354560852 17.9094314575 0.0667898059 -0.0287394412 ) ( -19.67070961 -4.1811408997 20 0.0667898059 -0.0307922568 ) ( -19.455783844 -4.1354560852 22.0905704498 0.0667898059 -0.0328450762 ) ( -19.240858078 -4.0897722244 24.1811389923 0.0667898059 -0.0348978937 ) ( -18.6054725647 -3.9547171593 26.1803417206 0.0667898059 -0.0369507112 ) ( -17.9700870514 -3.8196616173 28.1795425415 0.0667898059 -0.0390035287 ) ( -16.9420127869 -3.6011376381 30.0000019073 0.0667898059 -0.0410563461 ) ( -15.9139404297 -3.3826136589 31.8204574585 0.0667898059 -0.0431091599 ) ( -14.538105011 -3.0901713371 33.3826141357 0.0667898059 -0.0451619774 ) ( -13.1622753143 -2.7977290154 34.9447669983 0.0667898059 -0.0472147949 ) ( -11.4988136292 -2.4441494942 36.1803398132 0.0667898059 -0.0492676124 ) ( -9.8353557587 -2.0905704498 37.4159126282 0.0667898059 -0.0513204262 ) ( -7.9569683075 -1.691306591 38.2709083557 0.0667898059 -0.0533732474 ) ( -6.078584671 -1.2920436859 39.1259040833 0.0667898059 -0.0554260612 ) ( -4.0673646927 -0.8645453453 39.562953949 0.0667898059 -0.0574788824 ) ( -2.0561499596 -0.4370484352 40 0.0667898059 -0.0595316961 ) ( 0.0000016689 0.0000004768 40 0.0667898059 -0.0615845174 ) )
( ( 0 0 0 0.0709641725 0 ) ( -1.9632515907 -0.8740963936 -0.0000004728 0.0709641725 -0.002052817 ) ( -3.8836011887 -1.7290911674 0.437048018 0.0709641725 -0.0041056345 ) ( -5.8039512634 -2.5840864182 0.8740955591 0.0709641725 -0.0061584515 ) ( -7.5974702835 -3.3826127052 1.729090929 0.0709641725 -0.008211269 ) ( -9.3909902573 -4.1811389923 2.5840854645 0.0709641725 -0.0102640856 ) ( -10.9792938232 -4.8882980347 3.8196604252 0.0709641725 -0.0123169031 ) ( -12.5675983429 -5.595457077 5.0552344322 0.0709641725 -0.0143697206 ) ( -13.881269455 -6.1803407669 6.6173882484 0.0709641725 -0.0164225381 ) ( -15.1949424744 -6.7652254105 8.1795415878 0.0709641725 -0.0184753556 ) ( -16.1765670776 -7.2022733688 10.0000009537 0.0709641725 -0.0205281731 ) ( -17.1581935883 -7.6393213272 11.8204593658 0.0709641725 -0.0225809887 ) ( -17.7648715973 -7.9094324112 13.8196611404 0.0709641725 -0.0246338062 ) ( -18.3715496063 -8.1795425415 15.8188619614 0.0709641725 -0.0266866237 ) ( -18.5767650604 -8.2709102631 17.9094314575 0.0709641725 -0.0287394412 ) ( -18.7819805145 -8.3622789383 20 0.0709641725 -0.0307922568 ) ( -18.5767650604 -8.2709102631 22.0905704498 0.0709641725 -0.0328450762 ) ( -18.3715496063 -8.1795425415 24.1811389923 0.0709641725 -0.0348978937 ) ( -17.7648696899 -7.9094314575 26.1803417206 0.0709641725 -0.0369507112 ) ( -17.1581916809 -7.6393213272 28.1795425415 0.0709641725 -0.0390035287 ) ( -16.1765651703 -7.2022733688 30.0000019073 0.0709641725 -0.0410563461 ) ( -15.1949424744 -6.7652254105 31.8204574585 0.0709641725 -0.0431091599 ) ( -13.8812675476 -6.1803407669 33.3826141357 0.0709641725 -0.0451619774 ) ( -12.5675983429 -5.595457077 34.9447669983 0.0709641725 -0.0472147949 ) ( -10.9792928696 -4.888297081 36.1803398132 0.0709641725 -0.0492676124 ) ( -9.3909912109 -4.181139946 37.4159126282 0.0709641725 -0.0513204262 ) ( -7.5974693298 -3.3826122284 38.2709083557 0.0709641725 -0.0533732474 ) ( -5.8039522171 -2.5840864182 39.1259040833 0.0709641725 -0.0554260612 ) ( -3.8835997581 -1.7290906906 39.562953949 0.0709641725 -0.0574788824 ) ( -1.9632520676 -0.8740963936 40 0.0709641725 -0.0595316961 ) ( 0.0000016689 0.0000009537 40 0.0709641725 -0.0615845174 ) )
( ( 0 0 0 0.0751385316 0 ) ( -1.7006220818 -1.2355747223 -0.0000004728 0.0751385316 -0.002052817 ) ( -3.3640818596 -2.4441490173 0.437048018 0.0751385316 -0.0041056345 ) ( -5.0275411606 -3.6527233124 0.8740955591 0.0751385316 -0.0061584515 ) ( -6.5811367035 -4.7814769745 1.729090929 0.0751385316 -0.008211269 ) ( -8.1347322464 -5.9102306366 2.5840854645 0.0751385316 -0.0102640856 ) ( -9.5105648041 -6.9098310471 3.8196604252 0.0751385316 -0.0123169031 ) ( -10.8863973618 -7.9094324112 5.0552344322 0.0751385316 -0.0143697206 ) ( -12.0243358612 -8.7361927032 6.6173882484 0.0751385316 -0.0164225381 ) ( -13.162273407 -9.562953949 8.1795415878 0.0751385316 -0.0184753556 ) ( -14.0125846863 -10.1807413101 10.0000009537 0.0751385316 -0.0205281731 ) ( -14.8628959656 -10.7985286713 11.8204593658 0.0751385316 -0.0225809887 ) ( -15.3884162903 -11.1803417206 13.8196611404 0.0751385316 -0.0246338062 ) ( -15.9139385223 -11.5621557236 15.8188619614 0.0751385316 -0.0266866237 ) ( -16.0917015076 -11.6913080215 17.9094314575 0.0751385316 -0.0287394412 ) ( -16.2694644928 -11.8204603195 20 0.0751385316 -0.0307922568 ) ( -16.0917015076 -11.6913080215 22.0905704498 0.0751385316 -0.0328450762 ) ( -15.9139385223 -11.5621547699 24.1811389923 0.0751385316 -0.0348978937 ) ( -15.3884162903 -11.1803417206 26.1803417206 0.0751385316 -0.0369507112 ) ( -14.8628959656 -10.7985277176 28.1795425415 0.0751385316 -0.0390035287 ) ( -14.0125846863 -10.1807403564 30.0000019073 0.0751385316 -0.0410563461 ) ( -13.162273407 -9.562953949 31.8204574585 0.0751385316 -0.0431091599 ) ( -12.0243339539 -8.7361917496 33.3826141357 0.0751385316 -0.0451619774 ) ( -10.8863973618 -7.9094324112 34.9447669983 0.0751385316 -0.0472147949 ) ( -9.5105638504 -6.9098300934 36.1803398132 0.0751385316 -0.0492676124 ) ( -8.1347332001 -5.9102306366 37.4159126282 0.0751385316 -0.0513204262 ) ( -6.5811357498 -4.7814760208 38.2709083557 0.0751385316 -0.0533732474 ) ( -5.0275421143 -3.6527237892 39.1259040833 0.0751385316 -0.0554260612 ) ( -3.3640804291 -2.4441480637 39.562953949 0.0751385316 -0.0574788824 ) ( -1.7006225586 -1.2355751991 40 0.0751385316 -0.0595316961 ) ( 0.0000014305 0.0000009537 40 0.0751385316 -0.0615845174 ) )
( ( 0 0 0 0.0793128982 0 ) ( -1.4379925728 -1.597053051 -0.0000004728 0.0793128982 -0.002052817 ) ( -2.8445615768 -3.1592063904 0.437048018 0.0793128982 -0.0041056345 ) ( -4.2511310577 -4.7213602066 0.8740955591 0.0793128982 -0.0061584515 ) ( -5.5648021698 -6.1803407669 1.729090929 0.0793128982 -0.008211269 ) ( -6.8784742355 -7.6393213272 2.5840854645 0.0793128982 -0.0102640856 ) ( -8.0418338776 -8.9313640594 3.8196604252 0.0793128982 -0.0123169031 ) ( -9.2051944733 -10.2234067917 5.0552344322 0.0793128982 -0.0143697206 ) ( -10.1673994064 -11.2920436859 6.6173882484 0.0793128982 -0.0164225381 ) ( -11.1296043396 -12.3606815338 8.1795415878 0.0793128982 -0.0184753556 ) ( -11.8486003876 -13.1592063904 10.0000009537 0.0793128982 -0.0205281731 ) ( -12.5675964355 -13.9577331543 11.8204593658 0.0793128982 -0.0225809887 ) ( -13.0119609833 -14.4512500763 13.8196611404 0.0793128982 -0.0246338062 ) ( -13.456325531 -14.9447669983 15.8188619614 0.0793128982 -0.0266866237 ) ( -13.6066360474 -15.1117038727 17.9094314575 0.0793128982 -0.0287394412 ) ( -13.7569465637 -15.2786407471 20 0.0793128982 -0.0307922568 ) ( -13.6066360474 -15.1117038727 22.0905704498 0.0793128982 -0.0328450762 ) ( -13.456325531 -14.9447669983 24.1811389923 0.0793128982 -0.0348978937 ) ( -13.0119609833 -14.4512500763 26.1803417206 0.0793128982 -0.0369507112 ) ( -12.5675964355 -13.9577331543 28.1795425415 0.0793128982 -0.0390035287 ) ( -11.8486003876 -13.1592063904 30.0000019073 0.0793128982 -0.0410563461 ) ( -11.1296043396 -12.3606815338 31.8204574585 0.0793128982 -0.0431091599 ) ( -10.1673984528 -11.2920427322 33.3826141357 0.0793128982 -0.0451619774 ) ( -9.2051954269 -10.2234067917 34.9447669983 0.0793128982 -0.0472147949 ) ( -8.0418329239 -8.9313621521 36.1803398132 0.0793128982 -0.0492676124 ) ( -6.8784742355 -7.6393213272 37.4159126282 0.0793128982 -0.0513204262 ) ( -5.5648012161 -6.1803388596 38.2709083557 0.0793128982 -0.0533732474 ) ( -4.2511310577 -4.7213602066 39.1259040833 0.0793128982 -0.0554260612 ) ( -2.8445606232 -3.1592049599 39.562953949 0.0793128982 -0.0574788824 ) ( -1.4379930496 -1.5970535278 40 0.0793128982 -0.0595316961 ) ( 0.0000011921 0.0000014305 40 0.0793128982 -0.0615845174 ) )
( ( 0 0 0 0.0834872574 0 ) ( -1.0510420799 -1.820458889 -0.0000004728 0.0834872574 -0.002052817 ) ( -2.0791163445 -3.6011366844 0.437048018 0.0834872574 -0.0041056345 ) ( -3.1071910858 -5.381814003 0.8740955591 0.0834872574 -0.0061584515 ) ( -4.0673656464 -7.0448856354 1.729090929 0.0834872574 -0.008211269 ) ( -5.0275402069 -8.7079582214 2.5840854645 0.0834872574 -0.0102640856 ) ( -5.8778514862 -10.1807403564 3.8196604252 0.0834872574 -0.0123169031 ) ( -6.7281627655 -11.6535224915 5.0552344322 0.0834872574 -0.0143697206 ) ( -7.4314470291 -12.8716468811 6.6173882484 0.0834872574 -0.0164225381 ) ( -8.1347312927 -14.0897712708 8.1795415878 0.0834872574 -0.0184753556 ) ( -8.6602525711 -15.0000019073 10.0000009537 0.0834872574 -0.0205281731 ) ( -9.1857738495 -15.9102306366 11.8204593658 0.0834872574 -0.0225809887 ) ( -9.5105628967 -16.4727840424 13.8196611404 0.0834872574 -0.0246338062 ) ( -9.8353538513 -17.0353355408 15.8188619614 0.0834872574 -0.0266866237 ) ( -9.9452171326 -17.2256259918 17.9094314575 0.0834872574 -0.0287394412 ) ( -10.0550813675 -17.4159164429 20 0.0834872574 -0.0307922568 ) ( -9.9452171326 -17.2256259918 22.0905704498 0.0834872574 -0.0328450762 ) ( -9.8353528976 -17.0353355408 24.1811389923 0.0834872574 -0.0348978937 ) ( -9.5105628967 -16.472782135 26.1803417206 0.0834872574 -0.0369507112 ) ( -9.1857728958 -15.9102306366 28.1795425415 0.0834872574 -0.0390035287 ) ( -8.6602516174 -15 30.0000019073 0.0834872574 -0.0410563461 ) ( -8.1347312927 -14.0897731781 31.8204574585 0.0834872574 -0.0431091599 ) ( -7.4314460754 -12.8716468811 33.3826141357 0.0834872574 -0.0451619774 ) ( -6.7281627655 -11.6535234451 34.9447669983 0.0834872574 -0.0472147949 ) ( -5.8778505325 -10.1807384491 36.1803398132 0.0834872574 -0.0492676124 ) ( -5.0275411606 -8.7079582214 37.4159126282 0.0834872574 -0.0513204262 ) ( -4.0673646927 -7.0448846817 38.2709083557 0.0834872574 -0.0533732474 ) ( -3.1071910858 -5.3818149567 39.1259040833 0.0834872574 -0.0554260612 ) ( -2.0791158676 -3.6011347771 39.562953949 0.0834872574 -0.0574788824 ) ( -1.0510425568 -1.8204593658 40 0.0834872574 -0.0595316961 ) ( 0.0000009537 0.0000014305 40 0.0834872574 -0.0615845174 ) )
( ( 0 0 0 0.0876616165 0 ) ( -0.6640920639 -2.043864727 -0.0000004728 0.0876616165 -0.002052817 ) ( -1.3136720657 -4.0430660248 0.437048018 0.0876616165 -0.0041056345 ) ( -1.9632525444 -6.0422668457 0.8740955591 0.0876616165 -0.0061584515 ) ( -2.5699305534 -7.9094305038 1.729090929 0.0876616165 -0.008211269 ) ( -3.1766090393 -9.7765932083 2.5840854645 0.0876616165 -0.0102640856 ) ( -3.7138710022 -11.4301147461 3.8196604252 0.0876616165 -0.0123169031 ) ( -4.2511329651 -13.0836353302 5.0552344322 0.0876616165 -0.0143697206 ) ( -4.6954965591 -14.4512481689 6.6173882484 0.0876616165 -0.0164225381 ) ( -5.1398611069 -15.8188610077 8.1795415878 0.0876616165 -0.0184753556 ) ( -5.4719076157 -16.8407917023 10.0000009537 0.0876616165 -0.0205281731 ) ( -5.8039531708 -17.8627243042 11.8204593658 0.0876616165 -0.0225809887 ) ( -6.0091695786 -18.4943141937 13.8196611404 0.0876616165 -0.0246338062 ) ( -6.2143850327 -19.1259021759 15.8188619614 0.0876616165 -0.0266866237 ) ( -6.2838010788 -19.3395442963 17.9094314575 0.0876616165 -0.0287394412 ) ( -6.3532180786 -19.5531864166 20 0.0876616165 -0.0307922568 ) ( -6.2838010788 -19.3395442963 22.0905704498 0.0876616165 -0.0328450762 ) ( -6.2143850327 -19.1259021759 24.1811389923 0.0876616165 -0.0348978937 ) ( -6.0091686249 -18.4943122864 26.1803417206 0.0876616165 -0.0369507112 ) ( -5.8039531708 -17.8627243042 28.1795425415 0.0876616165 -0.0390035287 ) ( -5.471906662 -16.8407917023 30.0000019073 0.0876616165 -0.0410563461 ) ( -5.1398611069 -15.8188610077 31.8204574585 0.0876616165 -0.0431091599 ) ( -4.6954965591 -14.4512462616 33.3826141357 0.0876616165 -0.0451619774 ) ( -4.2511329651 -13.0836372375 34.9447669983 0.0876616165 -0.0472147949 ) ( -3.7138705254 -11.4301128387 36.1803398132 0.0876616165 -0.0492676124 ) ( -3.1766090393 -9.776594162 37.4159126282 0.0876616165 -0.0513204262 ) ( -2.5699300766 -7.9094285965 38.2709083557 0.0876616165 -0.0533732474 ) ( -1.9632525444 -6.0422677994 39.1259040833 0.0876616165 -0.0554260612 ) ( -1.3136715889 -4.0430641174 39.562953949 0.0876616165 -0.0574788824 ) ( -0.6640925407 -2.0438652039 40 0.0876616165 -0.0595316961 ) ( 0.0000004768 0.0000019073 40 0.0876616165 -0.0615845174 ) )
( ( 0 0 0 0.0918359831 0 ) ( -0.2197275162 -2.0905694962 -0.0000004728 0.0918359831 -0.002052817 ) ( -0.4346532822 -4.1354551315 0.437048018 0.0918359831 -0.0041056345 ) ( -0.6495790482 -6.1803398132 0.8740955591 0.0918359831 -0.0061584515 ) ( -0.8503103256 -8.0901699066 1.729090929 0.0918359831 -0.008211269 ) ( -1.0510411263 -10.0000009537 2.5840854645 0.0918359831 -0.0102640856 ) ( -1.2288041115 -11.6913061142 3.8196604252 0.0918359831 -0.0123169031 ) ( -1.4065675735 -13.3826122284 5.0552344322 0.0918359831 -0.0143697206 ) ( -1.5535936356 -14.7814769745 6.6173882484 0.0918359831 -0.0164225381 ) ( -1.7006201744 -16.1803417206 8.1795415878 0.0918359831 -0.0184753556 ) ( -1.8104839325 -17.2256259918 10.0000009537 0.0918359831 -0.0205281731 ) ( -1.9203476906 -18.2709102631 11.8204593658 0.0918359831 -0.0225809887 ) ( -1.9882469177 -18.9169311523 13.8196611404 0.0918359831 -0.0246338062 ) ( -2.0561466217 -19.5629520416 15.8188619614 0.0918359831 -0.0266866237 ) ( -2.0791144371 -19.7814769745 17.9094314575 0.0918359831 -0.0287394412 ) ( -2.1020822525 -20 20 0.0918359831 -0.0307922568 ) ( -2.0791144371 -19.7814769745 22.0905704498 0.0918359831 -0.0328450762 ) ( -2.0561466217 -19.5629520416 24.1811389923 0.0918359831 -0.0348978937 ) ( -1.9882469177 -18.9169311523 26.1803417206 0.0918359831 -0.0369507112 ) ( -1.9203476906 -18.2709102631 28.1795425415 0.0918359831 -0.0390035287 ) ( -1.8104839325 -17.2256240845 30.0000019073 0.0918359831 -0.0410563461 ) ( -1.7006201744 -16.1803417206 31.8204574585 0.0918359831 -0.0431091599 ) ( -1.5535936356 -14.7814750671 33.3826141357 0.0918359831 -0.0451619774 ) ( -1.4065675735 -13.3826141357 34.9447669983 0.0918359831 -0.0472147949 ) ( -1.2288041115 -11.6913051605 36.1803398132 0.0918359831 -0.0492676124 ) ( -1.0510411263 -10.0000009537 37.4159126282 0.0918359831 -0.0513204262 ) ( -0.8503098488 -8.0901689529 38.2709083557 0.0918359831 -0.0533732474 ) ( -0.6495790482 -6.1803407669 39.1259040833 0.0918359831 -0.0554260612 ) ( -0.4346532822 -4.1354532242 39.562953949 0.0918359831 -0.0574788824 ) ( -0.2197275162 -2.090569973 40 0.0918359831 -0.0595316961 ) ( 0.0000002384 0.0000019073 40 0.0918359831 -0.0615845174 ) )
( ( 0 0 0 0.0960103422 0 ) ( 0.2246363163 -2.1372737885 -0.0000004728 0.0960103422 -0.002052817 ) ( 0.4443638325 -4.2278432846 0.437048018 0.0960103422 -0.0041056345 ) ( 0.6640913486 -6.3184127808 0.8740955591 0.0960103422 -0.0061584515 ) ( 0.8693068027 -8.2709093094 1.729090929 0.0960103422 -0.008211269 ) ( 1.0745222569 -10.223405838 2.5840854645 0.0960103422 -0.0102640856 ) ( 1.2562568188 -11.9524965286 3.8196604252 0.0960103422 -0.0123169031 ) ( 1.4379913807 -13.6815872192 5.0552344322 0.0960103422 -0.0143697206 ) ( 1.5883023739 -15.1117019653 6.6173882484 0.0960103422 -0.0164225381 ) ( 1.7386133671 -16.5418186188 8.1795415878 0.0960103422 -0.0184753556 ) ( 1.850931406 -17.6104545593 10.0000009537 0.0960103422 -0.0205281731 ) ( 1.9632496834 -18.6790924072 11.8204593658 0.0960103422 -0.0225809887 ) ( 2.0326662064 -19.3395462036 13.8196611404 0.0960103422 -0.0246338062 ) ( 2.1020827293 -20 15.8188619614 0.0960103422 -0.0266866237 ) ( 2.1255633831 -20.223405838 17.9094314575 0.0960103422 -0.0287394412 ) ( 2.1490442753 -20.446811676 20 0.0960103422 -0.0307922568 ) ( 2.1255633831 -20.223405838 22.0905704498 0.0960103422 -0.0328450762 ) ( 2.1020824909 -20 24.1811389923 0.0960103422 -0.0348978937 ) ( 2.0326662064 -19.3395442963 26.1803417206 0.0960103422 -0.0369507112 ) ( 1.9632496834 -18.6790904999 28.1795425415 0.0960103422 -0.0390035287 ) ( 1.850931406 -17.6104545593 30.0000019073 0.0960103422 -0.0410563461 ) ( 1.7386133671 -16.5418186188 31.8204574585 0.0960103422 -0.0431091599 ) ( 1.5883021355 -15.1117019653 33.3826141357 0.0960103422 -0.0451619774 ) ( 1.4379913807 -13.6815872192 34.9447669983 0.0960103422 -0.0472147949 ) ( 1.2562565804 -11.9524946213 36.1803398132 0.0960103422 -0.0492676124 ) ( 1.0745222569 -10.2234067917 37.4159126282 0.0960103422 -0.0513204262 ) ( 0.8693065643 -8.270907402 38.2709083557 0.0960103422 -0.0533732474 ) ( 0.6640913486 -6.3184127808 39.1259040833 0.0960103422 -0.0554260612 ) ( 0.4443635941 -4.2278413773 39.562953949 0.0960103422 -0.0574788824 ) ( 0.2246363163 -2.1372742653 40 0.0960103422 -0.0595316961 ) ( 0 0.0000019073 40 0.0960103422 -0.0615845174 ) )
( ( 0 0 0 0.1001847088 0 ) ( 0.6495802402 -1.9992012978 -0.0000004728 0.1001847088 -0.002052817 ) ( 1.2849655151 -3.9547152519 0.437048018 0.1001847088 -0.0041056345 ) ( 1.92035079 -5.9102296829 0.8740955591 0.1001847088 -0.0061584515 ) ( 2.5137720108 -7.7365903854 1.729090929 0.1001847088 -0.008211269 ) ( 3.1071929932 -9.5629520416 2.5840854645 0.1001847088 -0.0102640856 ) ( 3.6327142715 -11.1803398132 3.8196604252 0.1001847088 -0.0123169031 ) ( 4.1582360268 -12.7977275848 5.0552344322 0.1001847088 -0.0143697206 ) ( 4.5928897858 -14.1354541779 6.6173882484 0.1001847088 -0.0164225381 ) ( 5.0275440216 -15.4731807709 8.1795415878 0.1001847088 -0.0184753556 ) ( 5.3523340225 -16.472782135 10.0000009537 0.1001847088 -0.0205281731 ) ( 5.6771240234 -17.4723834991 11.8204593658 0.1001847088 -0.0225809887 ) ( 5.8778553009 -18.0901699066 13.8196611404 0.1001847088 -0.0246338062 ) ( 6.0785865784 -18.7079563141 15.8188619614 0.1001847088 -0.0266866237 ) ( 6.1464862823 -18.916929245 17.9094314575 0.1001847088 -0.0287394412 ) ( 6.2143859863 -19.1259040833 20 0.1001847088 -0.0307922568 ) ( 6.1464862823 -18.916929245 22.0905704498 0.1001847088 -0.0328450762 ) ( 6.0785865784 -18.7079563141 24.1811389923 0.1001847088 -0.0348978937 ) ( 5.8778548241 -18.0901679993 26.1803417206 0.1001847088 -0.0369507112 ) ( 5.6771240234 -17.4723815918 28.1795425415 0.1001847088 -0.0390035287 ) ( 5.3523335457 -16.4727802277 30.0000019073 0.1001847088 -0.0410563461 ) ( 5.0275440216 -15.4731807709 31.8204574585 0.1001847088 -0.0431091599 ) ( 4.5928893089 -14.1354522705 33.3826141357 0.1001847088 -0.0451619774 ) ( 4.1582360268 -12.7977275848 34.9447669983 0.1001847088 -0.0472147949 ) ( 3.6327137947 -11.1803379059 36.1803398132 0.1001847088 -0.0492676124 ) ( 3.1071929932 -9.5629529953 37.4159126282 0.1001847088 -0.0513204262 ) ( 2.5137712955 -7.7365894318 38.2709083557 0.1001847088 -0.0533732474 ) ( 1.9203510284 -5.9102296829 39.1259040833 0.1001847088 -0.0554260612 ) ( 1.2849650383 -3.9547138214 39.562953949 0.1001847088 -0.0574788824 ) ( 0.6495804787 -1.9992017746 40 0.1001847088 -0.0595316961 ) ( -0.0000004768 0.0000019073 40 0.1001847088 -0.0615845174 ) )
( ( 0 0 0 0.104359068 0 ) ( 1.0745229721 -1.8611288071 -0.0000004728 0.104359068 -0.002052817 ) ( 2.125565052 -3.6815876961 0.437048018 0.104359068 -0.0041056345 ) ( 3.1766073704 -5.5020465851 0.8740955591 0.104359068 -0.0061584515 ) ( 4.1582331657 -7.2022724152 1.729090929 0.104359068 -0.008211269 ) ( 5.1398587227 -8.9024982452 2.5840854645 0.104359068 -0.0102640856 ) ( 6.0091657639 -10.4081830978 3.8196604252 0.104359068 -0.0123169031 ) ( 6.8784737587 -11.9138679504 5.0552344322 0.104359068 -0.0143697206 ) ( 7.5974698067 -13.1592063904 6.6173882484 0.104359068 -0.0164225381 ) ( 8.3164663315 -14.4045448303 8.1795415878 0.104359068 -0.0184753556 ) ( 8.8537273407 -15.3351097107 10.0000009537 0.104359068 -0.0205281731 ) ( 9.3909893036 -16.2656745911 11.8204593658 0.104359068 -0.0225809887 ) ( 9.7230348587 -16.8407936096 13.8196611404 0.104359068 -0.0246338062 ) ( 10.0550804138 -17.4159145355 15.8188619614 0.104359068 -0.0266866237 ) ( 10.1673984528 -17.6104545593 17.9094314575 0.104359068 -0.0287394412 ) ( 10.2797174454 -17.8049964905 20 0.104359068 -0.0307922568 ) ( 10.1673984528 -17.6104545593 22.0905704498 0.104359068 -0.0328450762 ) ( 10.0550804138 -17.4159145355 24.1811389923 0.104359068 -0.0348978937 ) ( 9.723033905 -16.8407936096 26.1803417206 0.104359068 -0.0369507112 ) ( 9.3909893036 -16.2656726837 28.1795425415 0.104359068 -0.0390035287 ) ( 8.8537273407 -15.3351078033 30.0000019073 0.104359068 -0.0410563461 ) ( 8.3164663315 -14.4045448303 31.8204574585 0.104359068 -0.0431091599 ) ( 7.5974693298 -13.159204483 33.3826141357 0.104359068 -0.0451619774 ) ( 6.8784742355 -11.9138689041 34.9447669983 0.104359068 -0.0472147949 ) ( 6.009165287 -10.4081821442 36.1803398132 0.104359068 -0.0492676124 ) ( 5.1398591995 -8.9024991989 37.4159126282 0.104359068 -0.0513204262 ) ( 4.1582322121 -7.2022714615 38.2709083557 0.104359068 -0.0533732474 ) ( 3.1766076088 -5.5020475388 39.1259040833 0.104359068 -0.0554260612 ) ( 2.1255643368 -3.6815862656 39.562953949 0.104359068 -0.0574788824 ) ( 1.0745234489 -1.8611297607 40 0.104359068 -0.0595316961 ) ( -0.0000009537 0.0000014305 40 0.104359068 -0.0615845174 ) )
( ( 0 0 0 0.1085334346 0 ) ( 1.4065694809 -1.5621533394 -0.0000004728 0.1085334346 -0.002052817 ) ( 2.7824020386 -3.0901694298 0.437048018 0.1085334346 -0.0041056345 ) ( 4.1582345963 -4.618185997 0.8740955591 0.1085334346 -0.0061584515 ) ( 5.4431996346 -6.0452842712 1.729090929 0.1085334346 -0.008211269 ) ( 6.7281651497 -7.4723825455 2.5840854645 0.1085334346 -0.0102640856 ) ( 7.8661036491 -8.7361907959 3.8196604252 0.1085334346 -0.0123169031 ) ( 9.0040416718 -9.9999990463 5.0552344322 0.1085334346 -0.0143697206 ) ( 9.9452209473 -11.0452833176 6.6173882484 0.1085334346 -0.0164225381 ) ( 10.8864002228 -12.0905685425 8.1795415878 0.1085334346 -0.0184753556 ) ( 11.5896835327 -12.8716449738 10.0000009537 0.1085334346 -0.0205281731 ) ( 12.29296875 -13.652721405 11.8204593658 0.1085334346 -0.0225809887 ) ( 12.7276229858 -14.1354522705 13.8196611404 0.1085334346 -0.0246338062 ) ( 13.1622772217 -14.6181850433 15.8188619614 0.1085334346 -0.0266866237 ) ( 13.3093032837 -14.7814731598 17.9094314575 0.1085334346 -0.0287394412 ) ( 13.4563302994 -14.9447631836 20 0.1085334346 -0.0307922568 ) ( 13.3093032837 -14.7814731598 22.0905704498 0.1085334346 -0.0328450762 ) ( 13.162276268 -14.6181850433 24.1811389923 0.1085334346 -0.0348978937 ) ( 12.7276220322 -14.1354522705 26.1803417206 0.1085334346 -0.0369507112 ) ( 12.29296875 -13.652721405 28.1795425415 0.1085334346 -0.0390035287 ) ( 11.5896835327 -12.8716430664 30.0000019073 0.1085334346 -0.0410563461 ) ( 10.8864002228 -12.0905685425 31.8204574585 0.1085334346 -0.0431091599 ) ( 9.9452199936 -11.0452823639 33.3826141357 0.1085334346 -0.0451619774 ) ( 9.0040426254 -9.9999990463 34.9447669983 0.1085334346 -0.0472147949 ) ( 7.8661026955 -8.7361888885 36.1803398132 0.1085334346 -0.0492676124 ) ( 6.7281656265 -7.4723825455 37.4159126282 0.1085334346 -0.0513204262 ) ( 5.4431986809 -6.0452823639 38.2709083557 0.1085334346 -0.0533732474 ) ( 4.1582350731 -4.6181869507 39.1259040833 0.1085334346 -0.0554260612 ) ( 2.7824010849 -3.0901684761 39.562953949 0.1085334346 -0.0574788824 ) ( 1.4065699577 -1.5621538162 40 0.1085334346 -0.0595316961 ) ( -0.0000009537 0.0000009537 40 0.1085334346 -0.0615845174 ) )
( ( 0 0 0 0.1127077937 0 ) ( 1.738615036 -1.2631778717 -0.0000004728 0.1127077937 -0.002052817 ) ( 3.4392371178 -2.498752594 0.437048018 0.1127077937 -0.0041056345 ) ( 5.1398591995 -3.7343268394 0.8740955591 0.1127077937 -0.0061584515 ) ( 6.7281627655 -4.888297081 1.729090929 0.1127077937 -0.008211269 ) ( 8.3164672852 -6.0422677994 2.5840854645 0.1127077937 -0.0102640856 ) ( 9.7230358124 -7.0642004013 3.8196604252 0.1127077937 -0.0123169031 ) ( 11.1296052933 -8.0861330032 5.0552344322 0.1127077937 -0.0143697206 ) ( 12.292965889 -8.9313640594 6.6173882484 0.1127077937 -0.0164225381 ) ( 13.4563264847 -9.7765951157 8.1795415878 0.1127077937 -0.0184753556 ) ( 14.325633049 -10.4081840515 10.0000009537 0.1127077937 -0.0205281731 ) ( 15.1949415207 -11.0397729874 11.8204593658 0.1127077937 -0.0225809887 ) ( 15.7322025299 -11.4301156998 13.8196611404 0.1127077937 -0.0246338062 ) ( 16.2694644928 -11.8204593658 15.8188619614 0.1127077937 -0.0266866237 ) ( 16.4511985779 -11.9524974823 17.9094314575 0.1127077937 -0.0287394412 ) ( 16.6329345703 -12.0845355988 20 0.1127077937 -0.0307922568 ) ( 16.4511985779 -11.9524974823 22.0905704498 0.1127077937 -0.0328450762 ) ( 16.2694644928 -11.8204593658 24.1811389923 0.1127077937 -0.0348978937 ) ( 15.7322015762 -11.4301156998 26.1803417206 0.1127077937 -0.0369507112 ) ( 15.194940567 -11.0397720337 28.1795425415 0.1127077937 -0.0390035287 ) ( 14.325633049 -10.4081830978 30.0000019073 0.1127077937 -0.0410563461 ) ( 13.4563264847 -9.7765951157 31.8204574585 0.1127077937 -0.0431091599 ) ( 12.2929649353 -8.9313631058 33.3826141357 0.1127077937 -0.0451619774 ) ( 11.1296062469 -8.0861330032 34.9447669983 0.1127077937 -0.0472147949 ) ( 9.7230348587 -7.0641994476 36.1803398132 0.1127077937 -0.0492676124 ) ( 8.3164672852 -6.0422687531 37.4159126282 0.1127077937 -0.0513204262 ) ( 6.7281618118 -4.8882961273 38.2709083557 0.1127077937 -0.0533732474 ) ( 5.1398596764 -3.7343273163 39.1259040833 0.1127077937 -0.0554260612 ) ( 3.4392356873 -2.4987516403 39.562953949 0.1127077937 -0.0574788824 ) ( 1.7386155128 -1.2631783485 40 0.1127077937 -0.0595316961 ) ( -0.0000014305 0.0000009537 40 0.1127077937 -0.0615845174 ) )
( ( 0 0 0 0.1168821603 0 ) ( 1.9203500748 -0.8549947739 -0.0000004728 0.1168821603 -0.002052817 ) ( 3.7987360954 -1.6913056374 0.437048018 0.1168821603 -0.0041056345 ) ( 5.6771221161 -2.5276165009 0.8740955591 0.1168821603 -0.0061584515 ) ( 7.4314489365 -3.3086929321 1.729090929 0.1168821603 -0.008211269 ) ( 9.1857757568 -4.0897693634 2.5840854645 0.1168821603 -0.0102640856 ) ( 10.7393722534 -4.7814741135 3.8196604252 0.1168821603 -0.0123169031 ) ( 12.2929677963 -5.4731798172 5.0552344322 0.1168821603 -0.0143697206 ) ( 13.5779333115 -6.0452823639 6.6173882484 0.1168821603 -0.0164225381 ) ( 14.8628978729 -6.6173858643 8.1795415878 0.1168821603 -0.0184753556 ) ( 15.8230724335 -7.0448827744 10.0000009537 0.1168821603 -0.0205281731 ) ( 16.7832489014 -7.4723806381 11.8204593658 0.1168821603 -0.0225809887 ) ( 17.3766689301 -7.7365875244 13.8196611404 0.1168821603 -0.0246338062 ) ( 17.9700889587 -8.0007963181 15.8188619614 0.1168821603 -0.0266866237 ) ( 18.1708202362 -8.0901670456 17.9094314575 0.1168821603 -0.0287394412 ) ( 18.3715515137 -8.1795387268 20 0.1168821603 -0.0307922568 ) ( 18.1708202362 -8.0901670456 22.0905704498 0.1168821603 -0.0328450762 ) ( 17.9700889587 -8.0007953644 24.1811389923 0.1168821603 -0.0348978937 ) ( 17.3766670227 -7.7365875244 26.1803417206 0.1168821603 -0.0369507112 ) ( 16.7832489014 -7.4723796844 28.1795425415 0.1168821603 -0.0390035287 ) ( 15.8230724335 -7.0448827744 30.0000019073 0.1168821603 -0.0410563461 ) ( 14.8628988266 -6.6173858643 31.8204574585 0.1168821603 -0.0431091599 ) ( 13.5779314041 -6.0452823639 33.3826141357 0.1168821603 -0.0451619774 ) ( 12.29296875 -5.4731798172 34.9447669983 0.1168821603 -0.0472147949 ) ( 10.7393703461 -4.7814741135 36.1803398132 0.1168821603 -0.0492676124 ) ( 9.1857767105 -4.0897693634 37.4159126282 0.1168821603 -0.0513204262 ) ( 7.431447506 -3.3086919785 38.2709083557 0.1168821603 -0.0533732474 ) ( 5.6771225929 -2.5276165009 39.1259040833 0.1168821603 -0.0554260612 ) ( 3.7987344265 -1.6913046837 39.562953949 0.1168821603 -0.0574788824 ) ( 1.92035079 -0.8549947739 40 0.1168821603 -0.0595316961 ) ( -0.0000014305 0.0000009537 40 0.1168821603 -0.0615845174 ) )
( ( 0 0 0 0.1210565194 0 ) ( 2.1020846367 -0.4468121529 -0.0000004728 0.1210565194 -0.002052817 ) ( 4.1582336426 -0.8838601112 0.437048018 0.1210565194 -0.0041056345 ) ( 6.2143831253 -1.3209080696 0.8740955591 0.1210565194 -0.0061584515 ) ( 8.1347332001 -1.7290911674 1.729090929 0.1210565194 -0.008211269 ) ( 10.0550823212 -2.1372747421 2.5840854645 0.1210565194 -0.0102640856 ) ( 11.7557048798 -2.4987530708 3.8196604252 0.1210565194 -0.0123169031 ) ( 13.4563264847 -2.8602313995 5.0552344322 0.1210565194 -0.0143697206 ) ( 14.8628959656 -3.1592068672 6.6173882484 0.1210565194 -0.0164225381 ) ( 16.2694664001 -3.4581828117 8.1795415878 0.1210565194 -0.0184753556 ) ( 17.3205070496 -3.6815886497 10.0000009537 0.1210565194 -0.0205281731 ) ( 18.3715496063 -3.9049949646 11.8204593658 0.1210565194 -0.0225809887 ) ( 19.0211296082 -4.0430669785 13.8196611404 0.1210565194 -0.0246338062 ) ( 19.67070961 -4.181139946 15.8188619614 0.1210565194 -0.0266866237 ) ( 19.8904361725 -4.2278442383 17.9094314575 0.1210565194 -0.0287394412 ) ( 20.1101646423 -4.2745485306 20 0.1210565194 -0.0307922568 ) ( 19.8904361725 -4.2278442383 22.0905704498 0.1210565194 -0.0328450762 ) ( 19.6707077026 -4.181139946 24.1811389923 0.1210565194 -0.0348978937 ) ( 19.0211296082 -4.0430669785 26.1803417206 0.1210565194 -0.0369507112 ) ( 18.371547699 -3.9049944878 28.1795425415 0.1210565194 -0.0390035287 ) ( 17.3205070496 -3.6815886497 30.0000019073 0.1210565194 -0.0410563461 ) ( 16.2694664001 -3.4581828117 31.8204574585 0.1210565194 -0.0431091599 ) ( 14.8628950119 -3.1592068672 33.3826141357 0.1210565194 -0.0451619774 ) ( 13.4563274384 -2.8602318764 34.9447669983 0.1210565194 -0.0472147949 ) ( 11.7557029724 -2.498752594 36.1803398132 0.1210565194 -0.0492676124 ) ( 10.0550832748 -2.1372747421 37.4159126282 0.1210565194 -0.0513204262 ) ( 8.1347312927 -1.7290911674 38.2709083557 0.1210565194 -0.0533732474 ) ( 6.2143831253 -1.3209085464 39.1259040833 0.1210565194 -0.0554260612 ) ( 4.1582317352 -0.8838596344 39.562953949 0.1210565194 -0.0574788824 ) ( 2.1020853519 -0.4468121529 40 0.1210565194 -0.0595316961 ) ( -0.0000019073 0.0000004768 40 0.1210565194 -0.0615845174 ) )
( ( 0 0 0 0.1252308935 0 ) ( 2.1020846367 0.0000004768 -0.0000004728 0.1252308935 -0.002052817 ) ( 4.1582341194 0.0000009537 0.437048018 0.1252308935 -0.0041056345 ) ( 6.2143831253 0.0000009537 0.8740955591 0.1252308935 -0.0061584515 ) ( 8.1347332001 0.0000014305 1.729090929 0.1252308935 -0.008211269 ) ( 10.0550832748 0.0000019073 2.5840854645 0.1252308935 -0.0102640856 ) ( 11.7557048798 0.0000019073 3.8196604252 0.1252308935 -0.0123169031 ) ( 13.456328392 0.0000023842 5.0552344322 0.1252308935 -0.0143697206 ) ( 14.8628969193 0.000002861 6.6173882484 0.1252308935 -0.0164225381 ) ( 16.2694664001 0.000002861 8.1795415878 0.1252308935 -0.0184753556 ) ( 17.3205070496 0.000002861 10.0000009537 0.1252308935 -0.0205281731 ) ( 18.3715515137 0.000002861 11.8204593658 0.1252308935 -0.0225809887 ) ( 19.0211296082 0.0000033379 13.8196611404 0.1252308935 -0.0246338062 ) ( 19.6707115173 0.0000033379 15.8188619614 0.1252308935 -0.0266866237 ) ( 19.8904380798 0.0000038147 17.9094314575 0.1252308935 -0.0287394412 ) ( 20.1101665497 0.0000038147 20 0.1252308935 -0.0307922568 ) ( 19.8904380798 0.0000038147 22.0905704498 0.1252308935 -0.0328450762 ) ( 19.6707115173 0.0000033379 24.1811389923 0.1252308935 -0.0348978937 ) ( 19.0211296082 0.0000033379 26.1803417206 0.1252308935 -0.0369507112 ) ( 18.3715515137 0.000002861 28.1795425415 0.1252308935 -0.0390035287 ) ( 17.3205070496 0.000002861 30.0000019073 0.1252308935 -0.0410563461 ) ( 16.2694664001 0.000002861 31.8204574585 0.1252308935 -0.0431091599 ) ( 14.8628959656 0.000002861 33.3826141357 0.1252308935 -0.0451619774 ) ( 13.456328392 0.0000023842 34.9447669983 0.1252308935 -0.0472147949 ) ( 11.7557039261 0.0000019073 36.1803398132 0.1252308935 -0.0492676124 ) ( 10.0550842285 0.0000019073 37.4159126282 0.1252308935 -0.0513204262 ) ( 8.1347312927 0.0000014305 38.2709083557 0.1252308935 -0.0533732474 ) ( 6.214384079 0.0000009537 39.1259040833 0.1252308935 -0.0554260612 ) ( 4.1582322121 0.0000009537 39.562953949 0.1252308935 -0.0574788824 ) ( 2.1020855904 0.0000004768 40 0.1252308935 -0.0595316961 ) ( -0.0000019073 0 40 0.1252308935 -0.0615845174 ) )
)
}
}
// brush 7
{
( 1088 64 80 ) ( 1088 -320 80 ) ( 960 64 80 ) skies/smudge [ 1 0 0 0 ] [ -0 -1 -0 -0 ] -0 0.5 0.5 0 0 0
( 1088 64 64 ) ( 960 64 64 ) ( 1088 64 0 ) skies/smudge [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 1088 64 64 ) ( 1088 64 0 ) ( 1088 -320 64 ) skies/smudge [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 960 -64 0 ) ( 960 -64 64 ) ( 1088 -64 0 ) skies/smudge [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 960 -320 0 ) ( 960 64 0 ) ( 960 -320 64 ) skies/smudge [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 960 64 64 ) ( 1088 -320 64 ) ( 1088 64 64 ) skies/smudge [ 1 0 0 0 ] [ -0 -1 -0 -0 ] -0 0.5 0.5 0 0 0
}
// brush 8
{
( 1088 64 64 ) ( 1088 -320 64 ) ( 960 64 64 ) skies/smudge [ 1 0 0 0 ] [ -0 -1 -0 -0 ] -0 0.5 0.5 0 0 0
( 1088 80 64 ) ( 960 80 64 ) ( 1088 80 0 ) skies/smudge [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 1088 64 64 ) ( 1088 64 0 ) ( 1088 -320 64 ) skies/smudge [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 960 -320 0 ) ( 1088 -320 0 ) ( 960 64 0 ) skies/smudge [ 1 0 0 0 ] [ -0 -1 -0 -0 ] -0 0.5 0.5 0 0 0
( 960 -320 0 ) ( 960 64 0 ) ( 960 -320 64 ) skies/smudge [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 1088 64 0 ) ( 960 64 64 ) ( 1088 64 64 ) skies/smudge [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
}
// brush 9
{
( 1088 64 64 ) ( 1088 -320 64 ) ( 960 64 64 ) skies/smudge [ 1 0 0 0 ] [ -0 -1 -0 -0 ] -0 0.5 0.5 0 0 0
( 1088 64 64 ) ( 960 64 64 ) ( 1088 64 0 ) skies/smudge [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 1104 64 64 ) ( 1104 64 0 ) ( 1104 -320 64 ) skies/smudge [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 960 -320 0 ) ( 1088 -320 0 ) ( 960 64 0 ) skies/smudge [ 1 0 0 0 ] [ -0 -1 -0 -0 ] -0 0.5 0.5 0 0 0
( 960 -64 0 ) ( 960 -64 64 ) ( 1088 -64 0 ) skies/smudge [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 1088 -320 64 ) ( 1088 64 0 ) ( 1088 64 64 ) skies/smudge [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
}
// brush 10
{
( 1088 64 64 ) ( 960 64 64 ) ( 1088 64 0 ) skies/smudge [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 1088 64 64 ) ( 1088 64 0 ) ( 1088 -320 64 ) skies/smudge [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 960 -320 -16 ) ( 1088 -320 -16 ) ( 960 64 -16 ) skies/smudge [ 1 0 0 0 ] [ -0 -1 -0 -0 ] -0 0.5 0.5 0 0 0
( 960 -64 0 ) ( 960 -64 64 ) ( 1088 -64 0 ) skies/smudge [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 960 -320 0 ) ( 960 64 0 ) ( 960 -320 64 ) skies/smudge [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 960 64 0 ) ( 1088 -320 0 ) ( 960 -320 0 ) skies/smudge [ 1 0 0 0 ] [ -0 -1 -0 -0 ] -0 0.5 0.5 0 0 0
}
// brush 11
{
( 1088 64 64 ) ( 1088 -320 64 ) ( 960 64 64 ) skies/smudge [ 1 0 0 0 ] [ -0 -1 -0 -0 ] -0 0.5 0.5 0 0 0
( 1088 64 64 ) ( 1088 64 0 ) ( 1088 -320 64 ) skies/smudge [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 960 -320 0 ) ( 1088 -320 0 ) ( 960 64 0 ) skies/smudge [ 1 0 0 0 ] [ -0 -1 -0 -0 ] -0 0.5 0.5 0 0 0
( 960 -80 0 ) ( 960 -80 64 ) ( 1088 -80 0 ) skies/smudge [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 960 -320 0 ) ( 960 64 0 ) ( 960 -320 64 ) skies/smudge [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 1088 -64 0 ) ( 960 -64 64 ) ( 960 -64 0 ) skies/smudge [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
}
// brush 12
{
( 1088 64 64 ) ( 1088 -320 64 ) ( 960 64 64 ) skies/smudge [ 1 0 0 0 ] [ -0 -1 -0 -0 ] -0 0.5 0.5 0 0 0
( 1088 64 64 ) ( 960 64 64 ) ( 1088 64 0 ) skies/smudge [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 960 -320 0 ) ( 1088 -320 0 ) ( 960 64 0 ) skies/smudge [ 1 0 0 0 ] [ -0 -1 -0 -0 ] -0 0.5 0.5 0 0 0
( 960 -64 0 ) ( 960 -64 64 ) ( 1088 -64 0 ) skies/smudge [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 944 -320 0 ) ( 944 64 0 ) ( 944 -320 64 ) skies/smudge [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( 960 -320 64 ) ( 960 64 0 ) ( 960 -320 0 ) skies/smudge [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
}
// brush 13
{
( 320 768 128 ) ( 320 384 128 ) ( -320 768 128 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( 320 768 64 ) ( -320 768 64 ) ( 320 768 -64 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 320 768 64 ) ( 320 768 -64 ) ( 320 384 64 ) pbrtest/bricks045 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 384 -64 ) ( -320 384 64 ) ( 320 384 -64 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 384 -64 ) ( -320 768 -64 ) ( -320 384 64 ) pbrtest/bricks045 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 768 64 ) ( 320 384 64 ) ( 320 768 64 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
}
// brush 14
{
( 320 768 64 ) ( 320 384 64 ) ( -320 768 64 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( 320 832 64 ) ( -320 832 64 ) ( 320 832 -64 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 0 768 64 ) ( 0 768 -64 ) ( 0 384 64 ) pbrtest/bricks045 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 384 -64 ) ( 320 384 -64 ) ( -320 768 -64 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( -320 384 -64 ) ( -320 768 -64 ) ( -320 384 64 ) pbrtest/bricks045 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 320 768 -64 ) ( -320 768 64 ) ( 320 768 64 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
}
// brush 15
{
( 320 768 64 ) ( 320 384 64 ) ( -320 768 64 ) pbrtest/woodsiding001 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( 320 768 64 ) ( -320 768 64 ) ( 320 768 -64 ) pbrtest/woodsiding001 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 384 768 64 ) ( 384 768 -64 ) ( 384 384 64 ) pbrtest/woodsiding001 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 384 -64 ) ( 320 384 -64 ) ( -320 768 -64 ) pbrtest/woodsiding001 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( -320 384 -64 ) ( -320 384 64 ) ( 320 384 -64 ) pbrtest/woodsiding001 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 320 384 64 ) ( 320 768 -64 ) ( 320 768 64 ) pbrtest/woodsiding001 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
}
// brush 16
{
( 320 768 64 ) ( -320 768 64 ) ( 320 768 -64 ) pbrtest/tiles052 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 320 768 64 ) ( 320 768 -64 ) ( 320 384 64 ) pbrtest/tiles052 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 384 -128 ) ( 320 384 -128 ) ( -320 768 -128 ) pbrtest/tiles052 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( -320 576 -64 ) ( -320 576 64 ) ( 320 576 -64 ) pbrtest/tiles052 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 384 -64 ) ( -320 768 -64 ) ( -320 384 64 ) pbrtest/tiles052 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 768 -64 ) ( 320 384 -64 ) ( -320 384 -64 ) pbrtest/tiles052 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
}
// brush 17
{
( 320 768 64 ) ( 320 384 64 ) ( -320 768 64 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( 320 768 64 ) ( -320 768 64 ) ( 320 768 -64 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 384 -64 ) ( 320 384 -64 ) ( -320 768 -64 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( -320 384 -64 ) ( -320 384 64 ) ( 320 384 -64 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -384 384 -64 ) ( -384 768 -64 ) ( -384 384 64 ) pbrtest/bricks045 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 384 64 ) ( -320 768 -64 ) ( -320 384 -64 ) pbrtest/bricks045 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
}
// brush 18
{
( 184 256 192 ) ( 184 -128 192 ) ( -328 256 192 ) pbrtest/metalplates006 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( 192 384 264 ) ( -320 384 264 ) ( 192 384 256 ) pbrtest/metalplates006 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 320 544 8 ) ( 320 544 0 ) ( 320 160 8 ) pbrtest/metalplates006 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 272 192 256 ) ( 272 192 264 ) ( 784 192 256 ) pbrtest/metalplates006 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 -128 256 ) ( -320 256 256 ) ( -320 -128 264 ) pbrtest/metalplates006 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -64 448 64 ) ( 64 128 64 ) ( 64 448 64 ) common/caulk [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0
}
// brush 19
{
( 192 320 264 ) ( -320 320 264 ) ( 192 320 256 ) pbrtest/metalplates006 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 320 544 8 ) ( 320 544 0 ) ( 320 160 8 ) pbrtest/metalplates006 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -768 -128 -128 ) ( -256 -128 -128 ) ( -768 256 -128 ) pbrtest/metalplates006 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( 272 192 256 ) ( 272 192 264 ) ( 784 192 256 ) pbrtest/metalplates006 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 64 448 64 ) ( 64 128 64 ) ( -64 448 64 ) common/caulk [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0
( 64 128 64 ) ( 64 448 -64 ) ( 64 448 64 ) common/caulk [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
}
// brush 20
{
( 192 384 264 ) ( -320 384 264 ) ( 192 384 256 ) pbrtest/metalplates006 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -768 -128 -128 ) ( -256 -128 -128 ) ( -768 256 -128 ) pbrtest/metalplates006 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( 272 192 256 ) ( 272 192 264 ) ( 784 192 256 ) pbrtest/metalplates006 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 -128 256 ) ( -320 256 256 ) ( -320 -128 264 ) pbrtest/metalplates006 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 64 448 64 ) ( 64 448 -64 ) ( 64 128 64 ) common/caulk [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
( -64 448 -64 ) ( 64 128 -64 ) ( -64 128 -64 ) common/caulk [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0
}
// brush 21
{
( 192 320 264 ) ( -320 320 264 ) ( 192 320 256 ) pbrtest/metalplates006 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 272 192 256 ) ( 272 192 264 ) ( 784 192 256 ) pbrtest/metalplates006 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 -128 256 ) ( -320 256 256 ) ( -320 -128 264 ) pbrtest/metalplates006 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 64 448 64 ) ( 64 128 64 ) ( -64 448 64 ) common/caulk [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0
( -64 128 -64 ) ( 64 128 -64 ) ( -64 448 -64 ) common/caulk [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0
( -64 128 64 ) ( -64 448 -64 ) ( -64 128 -64 ) common/caulk [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
}
// brush 22
{
( 320 768 64 ) ( 320 384 64 ) ( -320 768 64 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( 320 768 64 ) ( 320 768 -64 ) ( 320 384 64 ) pbrtest/bricks045 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 384 -64 ) ( 320 384 -64 ) ( -320 768 -64 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( -320 320 -64 ) ( -320 320 64 ) ( 320 320 -64 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 320 384 -64 ) ( -320 384 64 ) ( -320 384 -64 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 64 128 64 ) ( 64 448 -64 ) ( 64 448 64 ) common/caulk [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
}
// brush 23
{
( 320 768 64 ) ( 320 384 64 ) ( -320 768 64 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( -320 384 -64 ) ( 320 384 -64 ) ( -320 768 -64 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( -320 320 -64 ) ( -320 320 64 ) ( 320 320 -64 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 384 -64 ) ( -320 768 -64 ) ( -320 384 64 ) pbrtest/bricks045 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 320 384 -64 ) ( -320 384 64 ) ( -320 384 -64 ) pbrtest/bricks045 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -64 128 64 ) ( -64 448 -64 ) ( -64 128 -64 ) common/caulk [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0
}
// brush 24
{
( 320 576 64 ) ( -320 576 64 ) ( 320 576 -64 ) pbrtest/woodfloor041 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 320 768 64 ) ( 320 768 -64 ) ( 320 384 64 ) pbrtest/woodfloor041 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 384 -128 ) ( 320 384 -128 ) ( -320 768 -128 ) pbrtest/woodfloor041 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( -320 384 -64 ) ( -320 384 64 ) ( 320 384 -64 ) pbrtest/woodfloor041 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 384 -64 ) ( -320 768 -64 ) ( -320 384 64 ) pbrtest/woodfloor041 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 768 -64 ) ( 320 384 -64 ) ( -320 384 -64 ) pbrtest/woodfloor041 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
}
// brush 25
{
( 320 768 64 ) ( 320 384 64 ) ( -320 768 64 ) pbrtest/woodsiding001 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( 320 832 64 ) ( -320 832 64 ) ( 320 832 -64 ) pbrtest/woodsiding001 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 320 768 64 ) ( 320 768 -64 ) ( 320 384 64 ) pbrtest/woodsiding001 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( -320 384 -64 ) ( 320 384 -64 ) ( -320 768 -64 ) pbrtest/woodsiding001 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.25 0.25 0 0 0
( 0 384 -64 ) ( 0 768 -64 ) ( 0 384 64 ) pbrtest/woodsiding001 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
( 320 768 -64 ) ( -320 768 64 ) ( 320 768 64 ) pbrtest/woodsiding001 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.25 0.25 0 0 0
}
// brush 26
{
patchDef2
{
pbrtest/metal022
( 9 3 0 0 0 )
(
( ( -256 672 -64 0 -0.984375 ) ( -256 672 0 0 -1.234375 ) ( -256 672 64 0 -1.484375 ) )
( ( -256 640 -64 0.125 -0.984375 ) ( -256 640 0 0.125 -1.234375 ) ( -256 640 64 0.125 -1.484375 ) )
( ( -224 640 -64 0.25 -0.984375 ) ( -224 640 0 0.25 -1.234375 ) ( -224 640 64 0.25 -1.484375 ) )
( ( -192 640 -64 0.375 -0.984375 ) ( -192 640 0 0.375 -1.234375 ) ( -192 640 64 0.375 -1.484375 ) )
( ( -192 672 -64 0.5 -0.984375 ) ( -192 672 0 0.5 -1.234375 ) ( -192 672 64 0.5 -1.484375 ) )
( ( -192 704 -64 0.625 -0.984375 ) ( -192 704 0 0.625 -1.234375 ) ( -192 704 64 0.625 -1.484375 ) )
( ( -224 704 -64 0.75 -0.984375 ) ( -224 704 0 0.75 -1.234375 ) ( -224 704 64 0.75 -1.484375 ) )
( ( -256 704 -64 0.875 -0.984375 ) ( -256 704 0 0.875 -1.234375 ) ( -256 704 64 0.875 -1.484375 ) )
( ( -256 672 -64 1 -0.984375 ) ( -256 672 0 1 -1.234375 ) ( -256 672 64 1 -1.484375 ) )
)
}
}
}
// entity 1
{
"classname" "info_player_start"
"origin" "-56.000000 0.000000 0.000000"
}
// entity 2
{
"classname" "info_player_deathmatch"
"origin" "-56.000000 0.000000 0.000000"
}
// entity 3
{
"classname" "env_cubemap"
}
// entity 4
{
"classname" "sky_camera"
"origin" "1024.000000 0.000000 32.000000"
}
// entity 5
{
"classname" "light_environment"
"origin" "64.000000 0.000000 32.000000"
"color" "0.996 0.941 0.835"
"ambientcolor" "0.678 0.816 0.949"
"intensity" "250"
"sunangle" "321"
"pitch" "-145.86"
"filterradius" "1"
"sunspreadangle" "0"
"samples" "16"
}
// entity 6
{
"classname" "light"
"origin" "0.000000 576.000000 0.000000"
"light" "300"
}
// entity 7
{
"classname" "env_cubemap"
"origin" "0.000000 576.000000 0.000000"
}
// entity 8
{
"classname" "prop_dynamic"
"origin" "64.000000 -64.000000 -32.000000"
"model" "models/logo.iqm"
"angles" "0 135 -45"
"modelscale" "0.45"
"shadows" "1"
"_cs" "1"
}

View file

@ -77,6 +77,7 @@ public:
virtual void CheckRoute(void); virtual void CheckRoute(void);
virtual void PreFrame(void); virtual void PreFrame(void);
virtual void PostFrame(void); virtual void PostFrame(void);
virtual void AddedItemCallback(NSItem);
virtual void UseButton(void); virtual void UseButton(void);
virtual void SetEnemy(entity); virtual void SetEnemy(entity);
virtual float GetRunSpeed(void); virtual float GetRunSpeed(void);

View file

@ -298,7 +298,7 @@ NSBot::RunAI(void)
input_angles = [0,0,0]; input_angles = [0,0,0];
/* attempt to respawn when dead */ /* attempt to respawn when dead */
if (IsAlive() == false || health <= 0) { if (IsAlive() == false) {
RouteClear(); RouteClear();
WeaponAttack(); WeaponAttack();
SetEnemy(__NULL__); SetEnemy(__NULL__);
@ -512,14 +512,16 @@ NSBot::PreFrame(void)
void void
NSBot::PostFrame(void) NSBot::PostFrame(void)
{ {
#if 0 }
/* we've picked something new up */
if (m_iOldItems != g_items) { void
Weapons_SwitchBest(this); NSBot::AddedItemCallback(NSItem newItem)
BotEntLog("%S is now using %S (%d)", netname, g_weapons[activeweapon].name, activeweapon); {
m_iOldItems = g_items; if (isBot(this) == true) {
SwitchToBestWeapon(false);
} else {
super::AddedItemCallback(newItem);
} }
#endif
} }
void void

View file

@ -22,23 +22,23 @@ NSBot::Pain(entity inflictor, entity attacker, int damage, vector dir, int locat
super::Pain(inflictor, attacker, damage, dir, location); super::Pain(inflictor, attacker, damage, dir, location);
if (rules.IsTeamplay()) { if (rules.IsTeamplay()) {
if (g_dmg_eAttacker.flags & FL_CLIENT && g_dmg_eAttacker.team == team) { if (isPlayer(attacker) && attacker.team == team) {
ChatSayTeam("Stop shooting me!"); ChatSayTeam("Stop shooting me!");
return; return;
} }
} }
/* make this pain our new enemy! */ /* make this pain our new enemy! */
if (g_dmg_eAttacker && g_dmg_eAttacker != this) { if (attacker && attacker != this) {
float enemydist = distanceSquared(origin, m_eTarget.origin); float enemydist = distanceSquared(origin, m_eTarget.origin);
float newdist = distanceSquared(origin, g_dmg_eAttacker.origin); float newdist = distanceSquared(origin, attacker.origin);
if (m_eTarget) { if (m_eTarget) {
if (newdist < enemydist) { if (newdist < enemydist) {
SetEnemy(g_dmg_eAttacker); SetEnemy(attacker);
} }
} else { } else {
SetEnemy(g_dmg_eAttacker); SetEnemy(attacker);
} }
} }
} }
@ -58,21 +58,19 @@ NSBot::SetEnemy(entity en)
void void
NSBot::WeaponThink(void) NSBot::WeaponThink(void)
{ {
#if 0 bool isEmpty = m_activeWeapon.IsEmpty();
int r = Weapons_IsEmpty(this, activeweapon);
/* clip empty, but the whole weapon isn't */ /* clip empty, but the whole weapon isn't */
if (r == 0 && a_ammo1 <= 0) { if (isEmpty == false) {
/* stop fire, tap reload */ /* stop fire, tap reload */
input_buttons &= ~INPUT_PRIMARY; input_buttons &= ~INPUT_PRIMARY;
input_buttons |= INPUT_RELOAD; input_buttons |= INPUT_RELOAD;
} else if (r == 1) { } else {
/* if empty, switch to the next best weapon */ /* if empty, switch to the next best weapon */
Weapons_SwitchBest(this, activeweapon); SwitchToBestWeapon(false);
} }
m_wtWeaponType = Weapons_GetType(this, activeweapon); //m_wtWeaponType = Weapons_GetType(this, activeweapon);
#endif
} }
void void

View file

@ -35,7 +35,6 @@ var bool autocvar_bot_enable = true;
var bool autocvar_bot_pause = false; var bool autocvar_bot_pause = false;
var bool autocvar_bot_noChat = false; var bool autocvar_bot_noChat = false;
var bool autocvar_bot_fastChat = false; var bool autocvar_bot_fastChat = false;
var bool autocvar_bot_debug = false;
var bool autocvar_bot_developer = false; var bool autocvar_bot_developer = false;
var int autocvar_bot_minClients = -1i; var int autocvar_bot_minClients = -1i;

Some files were not shown because too many files have changed in this diff Show more