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
!!permu FRAMEBLEND
//======= Copyright (c) 2015-2021 Vera Visions LLC. All rights reserved. =======
//
// 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 UPPERLOWER
!!permu FOG
!!samps diffuse reflectcube upper lower
!!cvardf gl_affinemodels=0
!!cvardf gl_ldr=1
!!cvardf gl_halflambert=1
!!cvardf gl_mono=0
!!cvardf gl_kdither=0
!!cvardf gl_stipplealpha=0
!!samps diffuse
!!samps =BUMP normalmap
!!samps =SPECULAR specular reflectcube
!!samps =FULLBRIGHT fullbright
!!samps =UPPERLOWER upper lower
!!samps =FAKESHADOWS shadowmap
!!permu FAKESHADOWS
!!cvardf r_glsl_pcf
!!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/fog.h"
#if gl_affinemodels == 1
#define affine noperspective
#else
#define affine
#endif
// always required
varying vec2 tc;
varying vec3 lightvector;
varying vec3 light;
#ifdef REFLECTCUBE
// from this point forth, if we check for SPECULAR this means we're in PBR territory
#ifdef BUMP
varying vec3 eyevector;
varying mat3 invsurface;
#define PBR
#endif
// r_shadows 2
#ifdef FAKESHADOWS
varying vec4 vtexprojcoord;
#endif
affine varying vec2 tex_c;
varying vec3 light;
// our basic vertex shader
#ifdef VERTEX_SHADER
#include "sys/skeletal.h"
@ -48,292 +69,145 @@ varying vec3 light;
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 ()
{
vec3 n, s, t, w;
gl_Position = skeletaltransform_wnst(w,n,s,t);
tex_c = v_texcoord;
#if gl_halflambert==1
light = e_light_ambient + (e_light_mul * halflambert(n, e_light_dir));
#else
#ifdef PBR
vec3 eyeminusvertex = e_eyepos - w.xyz;
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));
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
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
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
#if defined(SPECULAR)
uniform float cvar_gl_specular;
#endif
#ifdef FAKESHADOWS
#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));
int y = int(mod(gl_FragCoord.y, 2.0));
int index = x + y * 2;
vec2 coord_ofs;
vec2 size;
float alpha = roughness*roughness;
size.x = 1.0 / textureSize(targ, 0).x;
size.y = 1.0 / textureSize(targ, 0).y;
vec3 H = normalize(V+L);
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);
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);
return texture2D(targ, texc + coord_ofs * size);
}
float F, D, vis;
vec3 hsv2rgb(float h, float s, float v)
{
int i;
float f,p,q,t;
vec3 col = vec3(0,0,0);
// D
float alphaSqr = alpha*alpha;
float pi = 3.14159f;
float denom = dotNH * dotNH *(alphaSqr-1.0) + 1.0f;
D = alphaSqr/(pi * denom * denom);
h = max(0.0, min(360.0, h));
s = max(0.0, min(100.0, s));
v = max(0.0, min(100.0, v));
// F
float dotLH5 = pow(1.0f-dotLH,5);
F = F0 + (1.0-F0)*(dotLH5);
s /= 100;
v /= 100;
// V
float k = alpha/2.0f;
float k2 = k*k;
float invK2 = 1.0f-k2;
vis = 1.0/(dotLH*dotLH*invK2 + k2);
if (s == 0) {
col.x= col.y = col.z = int(v*255);
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;
float specular = dotNL * D * F * vis;
return specular;
}
void main ()
{
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
diffuse_f = texture2D(s_diffuse, tex_c);
#ifdef OFFSETMAPPING
vec2 tcoffsetmap = offsetmap(s_normalmap, tc, eyevector);
#define tc tcoffsetmap
#endif
vec4 albedo_f = texture2D(s_diffuse, tc);
#ifdef BUMP
vec3 normal_f = normalize(texture2D(s_normalmap, tc).rgb - 0.5);
#else
vec3 normal_f = vec3(0.0, 0.0, 1.0);
#endif
#endif
#ifdef UPPER
vec4 uc = texture2D(s_upper, tex_c);
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;
}
vec4 uc = texture2D(s_upper, tc);
albedo_f.rgb += uc.rgb * e_uppercolour * uc.a;
#endif
#ifdef LOWER
vec4 lc = texture2D(s_lower, tex_c);
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;
}
vec4 lc = texture2D(s_lower, tc);
albedo_f.rgb += lc.rgb * e_lowercolour * lc.a;
#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;
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 = ( 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
cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz;
if (e_colourident.z != 2.0) {
diffuse_f *= e_colourident;
}
/* do PBR reflection using cubemap */
gl_FragColor = albedo_f + (metalness_f * textureCube(s_reflectcube, cube_c));
#if gl_stipplealpha==1
float alpha = 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;
}
/* do PBR specular using our handy function */
gl_FragColor += (LightingFuncGGX(normal_f, normalize(eyevector), normalize(lightvector), roughness_f, FRESNEL) * gl_FragColor);
#else
gl_FragColor = albedo_f;
#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
/* this isn't necessary if we're not doing lightgrid terms */
gl_FragColor.rgb *= light;
/* r_shadows 2 */
#ifdef FAKESHADOWS
diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
gl_FragColor.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#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

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
!!permu LIGHTSTYLED
!!permu FOG
!!samps diffuse reflectcube normalmap
//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// 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
!!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 lightmap
!!samps =LIGHTSTYLED lightmap1 lightmap2 lightmap3
!!cvardf gl_mono
!!cvardf gl_kdither
!!cvardf gl_stipplealpha
!!cvardf gl_ldr
!!cvardf r_glsl_pcf
!!cvarf r_glsl_offsetmapping_scale
!!cvardf r_skipDiffuse
!!cvardf r_skipNormal
!!cvardf r_skipSpecular
!!cvardf r_skipLightmap
#ifndef FRESNEL
#define FRESNEL 0.25f
#endif
#include "sys/defs.h"
#include "sys/fog.h"
varying vec2 tex_c;
#ifdef BUMP
varying vec3 eyevector;
varying mat3 invsurface;
#define PBR
#endif
varying vec2 lm0;
#ifdef LIGHTSTYLED
varying vec2 lm1, lm2, lm3;
#endif
#ifdef REFLECTCUBE
varying vec3 eyevector;
varying mat3 invsurface;
#endif
#ifdef FAKESHADOWS
varying vec4 vtexprojcoord;
#endif
@ -47,179 +66,183 @@ varying mat3 invsurface;
#endif
}
void main ()
void main (void)
{
lightmapped_init();
tex_c = v_texcoord;
gl_Position = ftetransform();
/* HACK: func_conveyor needs us to scroll this surface! */
if (e_glowmod.g == 0.5)
tex_c[0] += (e_time * (e_glowmod.b * 1024.0)) * -0.01;
#ifdef REFLECTCUBE
#ifdef PBR
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
eyevector.x = dot(eyeminusvertex, v_svector.xyz);
eyevector.y = dot(eyeminusvertex, v_tvector.xyz);
eyevector.z = dot(eyeminusvertex, v_normal.xyz);
#endif
tex_c = v_texcoord;
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"
#ifdef OFFSETMAPPING
#include "sys/offsetmapping.h"
#endif
#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;
#ifdef LIGHTSTYLED
lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb;
lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb;
lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb;
lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb;
#else
lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb;
#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;
}
#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;
}
#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
vec4 kernel_dither(sampler2D targ, vec2 texc)
void main (void)
{
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 ( 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);
#ifdef OFFSETMAPPING
vec2 tcoffsetmap = offsetmap(s_normalmap, tex_c, eyevector);
#else
diffuse_f = texture2D(s_diffuse, tex_c);
#define tcoffsetmap tex_c
#endif
#endif
/* get the alphatesting out of the way first */
#ifdef MASK
/* HACK: terrible hack, CSQC sets this to mark surface as an entity
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();
/* samplers */
vec4 albedo_f = texture2D(s_diffuse, tcoffsetmap); // diffuse RGBA
vec3 normal_f = normalize(texture2D(s_normalmap, tcoffsetmap).rgb - 0.5); // normalmap RGB
#ifdef REFLECTCUBE
#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
/* deluxe/light */
vec3 deluxe = normalize(texture2D(s_deluxemap, lm0).rgb);
#ifdef PBR
float metalness_f =texture2D(s_specular, tcoffsetmap).r; // specularmap R
float roughness_f = texture2D(s_specular, tcoffsetmap).g; // specularmap G
float ao = texture2D(s_specular, tcoffsetmap).b; // specularmap B
/* coords */
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 = ( 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
cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz;
diffuse_f *= e_colourident;
/* do PBR reflection using cubemap */
gl_FragColor = albedo_f + (metalness_f * textureCube(s_reflectcube, cube_c));
#if gl_stipplealpha==1
float alpha = 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;
}
/* do PBR specular using our handy function */
gl_FragColor += (LightingFuncGGX(normal_f, normalize(eyevector), deluxe, roughness_f, FRESNEL) * gl_FragColor);
#else
gl_FragColor = albedo_f;
#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
/* calculate lightmap fragment on top */
gl_FragColor.rgb *= lightmap_fragment(normal_f);
/* r_shadows 2 */
#ifdef FAKESHADOWS
diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
gl_FragColor.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#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

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:
//
// Code for all the dynamic light passes. The renderer is not aware of any
// surface properties beyond diffuse, normal and specularity.
// Alpha-masked surfaces suffer greatly because of this.
//
// diffusemap = albedo (rgba)
// normalmap = normal (rgb), reflectmask (a)
// Lightmapped surface that contains an environment cube as a reflection.
// Alpha channel of the diffuse decides reflectivity.
//==============================================================================
!!ver 100 300
!!ver 100 150
!!permu BUMP
!!permu FRAMEBLEND
!!permu SKELETAL
!!permu FOG
!!permu UPPERLOWER
!!permu FOG
!!permu REFLECTCUBEMASK
!!cvarf r_glsl_offsetmapping_scale
!!cvardf r_glsl_pcf
!!samps diffuse
!!samps =BUMP normalmap reflectcube
!!samps =PCF shadowmap
!!samps =CUBE projectionmap
!!samps =UPPERLOWER upper
!!cvardf r_glsl_fresnel
!!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"
//if there's no vertex normals known, disable some stuff.
//FIXME: this results in dupe permutations.
#ifdef NOBUMP
#undef SPECULAR
#undef BUMP
#endif
varying vec2 tex_c;
varying vec2 tcbase;
varying vec3 lightvector;
#define VERTEXCOLOURS
#if defined(VERTEXCOLOURS)
varying vec4 vc;
#ifdef VERTEXCOLOURS
varying vec4 vc;
#endif
#ifdef BUMP
varying vec3 eyevector;
varying mat3 invsurface;
#ifdef SPECULAR
varying vec3 eyevector;
varying mat3 invsurface;
#define PBR
#endif
#if defined(PCF) || defined(CUBE) || defined(SPOT) || defined(ORTHO)
varying vec4 vtexprojcoord;
#if defined(PCF) || defined(CUBE) || defined(SPOT)
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);
n = normalize(n);
s = normalize(s);
t = normalize(t);
tex_c = v_texcoord;
#ifdef ORTHO
vec3 lightminusvertex = -l_lightdirection;
tcbase = v_texcoord; //pass the texture coords straight through
vec3 lightminusvertex = l_lightposition - w.xyz;
#ifdef NOBUMP
//the only important thing is distance
lightvector = lightminusvertex;
#else
//the 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);
#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
#if defined(VERTEXCOLOURS)
#ifdef VERTEXCOLOURS
vc = v_colour;
#endif
#ifdef BUMP
#ifdef SPECULAR
vec3 eyeminusvertex = e_eyepos - w.xyz;
eyevector.x = dot(eyeminusvertex, s.xyz);
eyevector.y = dot(eyeminusvertex, t.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
#if defined(PCF) || defined(SPOT) || defined(CUBE) || defined(ORTHO)
#if defined(PCF) || defined(SPOT) || defined(CUBE)
//for texture projections/shadowmapping on dlights
vtexprojcoord = (l_cubematrix*vec4(w.xyz, 1.0));
#endif
}
}
#endif
#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/pcf.h"
#ifdef OFFSETMAPPING
#include "sys/offsetmapping.h"
#endif
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
float colorscale = 1.0;
#else
float colorscale = max(1.0 - (dot(lightvector, lightvector)/(l_lightradius*l_lightradius)), 0.0);
#endif
/* filter the light by the shadowmap. logically a boolean, but we allow fractions for softer shadows */
#ifdef PCF
/* filter the light by the shadowmap. logically a boolean, but we allow fractions for softer shadows */
colorscale *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif
/* filter the colour by the spotlight. discard anything behind the light so we don't get a mirror image */
#if defined(SPOT)
if (vtexprojcoord.w < 0.0)
discard;
#ifdef 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) discard;
vec2 spot = ((vtexprojcoord.st)/vtexprojcoord.w);
colorscale*=1.0-(dot(spot,spot));
#endif
#if defined(FLAT)
vec4 bases = vec4(FLAT, FLAT, FLAT, 1.0);
#else
#if r_skipDiffuse == 0
vec4 bases = texture2D(s_diffuse, tex_c);
if (colorscale > 0)
{
vec3 out_f;
#ifdef FLAT
albedo_f = vec4(FLAT, FLAT, FLAT, 1.0);
#else
vec4 bases = vec4(1.0, 1.0, 1.0, 1.0);
#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);
#ifdef VERTEXCOLOURS
albedo_f.rgb *= albedo_f.a;
#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;
/* 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);
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);
/* ammo icon */
iconPos[0] = (hudSize[0] - baseIconSize) - baseIconPadding;
drawpic(iconPos, "gfx/hud/armor", [baseIconSize, baseIconSize], [1,1,1], 1.0f);
/* little point in not drawing these, even if you don't have a suit */
if (pl.m_activeWeapon) {
pl.m_activeWeapon.UpdateGUI();
}
Textmenu_Draw();
}

View file

@ -13,5 +13,3 @@
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* 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.
*/
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
Game_InitRules(void)
{
g_grMode = spawn(MultiplayerRules);
if (cvar("sv_playerslots") == 1 || cvar("coop") == 1) {
g_grMode = spawn(SingleplayerRules);
} else {
g_grMode = spawn(MultiplayerRules);
}
g_grMode = NSGameRules::InitFromProgs("maps/mp/gametypes/dm.dat");
}
void
Game_Worldspawn(void)
{
}

View file

@ -22,8 +22,6 @@ defs.h
../../../src/botlib/include.src
/* mod specific functions */
gamerules.qc
gamerules_singleplayer.qc
gamerules_multiplayer.qc
/* 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 PreFrame(void);
virtual void PostFrame(void);
virtual void AddedItemCallback(NSItem);
virtual void UseButton(void);
virtual void SetEnemy(entity);
virtual float GetRunSpeed(void);

View file

@ -298,7 +298,7 @@ NSBot::RunAI(void)
input_angles = [0,0,0];
/* attempt to respawn when dead */
if (IsAlive() == false || health <= 0) {
if (IsAlive() == false) {
RouteClear();
WeaponAttack();
SetEnemy(__NULL__);
@ -512,14 +512,16 @@ NSBot::PreFrame(void)
void
NSBot::PostFrame(void)
{
#if 0
/* we've picked something new up */
if (m_iOldItems != g_items) {
Weapons_SwitchBest(this);
BotEntLog("%S is now using %S (%d)", netname, g_weapons[activeweapon].name, activeweapon);
m_iOldItems = g_items;
}
void
NSBot::AddedItemCallback(NSItem newItem)
{
if (isBot(this) == true) {
SwitchToBestWeapon(false);
} else {
super::AddedItemCallback(newItem);
}
#endif
}
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);
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!");
return;
}
}
/* 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 newdist = distanceSquared(origin, g_dmg_eAttacker.origin);
float newdist = distanceSquared(origin, attacker.origin);
if (m_eTarget) {
if (newdist < enemydist) {
SetEnemy(g_dmg_eAttacker);
SetEnemy(attacker);
}
} else {
SetEnemy(g_dmg_eAttacker);
SetEnemy(attacker);
}
}
}
@ -58,21 +58,19 @@ NSBot::SetEnemy(entity en)
void
NSBot::WeaponThink(void)
{
#if 0
int r = Weapons_IsEmpty(this, activeweapon);
bool isEmpty = m_activeWeapon.IsEmpty();
/* clip empty, but the whole weapon isn't */
if (r == 0 && a_ammo1 <= 0) {
if (isEmpty == false) {
/* stop fire, tap reload */
input_buttons &= ~INPUT_PRIMARY;
input_buttons |= INPUT_RELOAD;
} else if (r == 1) {
} else {
/* if empty, switch to the next best weapon */
Weapons_SwitchBest(this, activeweapon);
SwitchToBestWeapon(false);
}
m_wtWeaponType = Weapons_GetType(this, activeweapon);
#endif
//m_wtWeaponType = Weapons_GetType(this, activeweapon);
}
void

View file

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

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