diff --git a/.gitattributes b/.gitattributes
index 5f29d3c..0253d6b 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -3,3 +3,26 @@ TA_Features_2013.ccx filter=lfs diff=lfs merge=lfs -text
ProTA.gp3 filter=lfs diff=lfs merge=lfs -text
TotalA.exe filter=lfs diff=lfs merge=lfs -text
TADEMO.UFO filter=lfs diff=lfs merge=lfs -text
+audiere.dll filter=lfs diff=lfs merge=lfs -text
+bassflac.dll filter=lfs diff=lfs merge=lfs -text
+bassmix.dll filter=lfs diff=lfs merge=lfs -text
+tdraw.dll filter=lfs diff=lfs merge=lfs -text
+tplayx.dll filter=lfs diff=lfs merge=lfs -text
+Viewer.exe filter=lfs diff=lfs merge=lfs -text
+cnc-ddraw[[:space:]]config.exe filter=lfs diff=lfs merge=lfs -text
+basscd.dll filter=lfs diff=lfs merge=lfs -text
+basswasapi.dll filter=lfs diff=lfs merge=lfs -text
+ddraw_custom.dll filter=lfs diff=lfs merge=lfs -text
+tmusi.dll filter=lfs diff=lfs merge=lfs -text
+wgmus.dll filter=lfs diff=lfs merge=lfs -text
+bass.dll filter=lfs diff=lfs merge=lfs -text
+Shaders/shader-package.zip filter=lfs diff=lfs merge=lfs -text
+TADemo/SERVER.EXE filter=lfs diff=lfs merge=lfs -text
+TADemo/bitmaps/ocean.jpg filter=lfs diff=lfs merge=lfs -text
+TADemo/3DTA.exe filter=lfs diff=lfs merge=lfs -text
+TADemo/HPIUtil.dll filter=lfs diff=lfs merge=lfs -text
+TADemo/bagge.fnt filter=lfs diff=lfs merge=lfs -text
+TADemo/bitmaps/detailtex.jpg filter=lfs diff=lfs merge=lfs -text
+TADemo/bitmaps/gran.bmp filter=lfs diff=lfs merge=lfs -text
+TADemo/bitmaps/gran2.bmp filter=lfs diff=lfs merge=lfs -text
+TADemo/3DTAConfig.exe filter=lfs diff=lfs merge=lfs -text
diff --git a/ProTA 4.4 changelog.txt b/ProTA 4.4 changelog.txt
index 56731fe..6c0679e 100644
--- a/ProTA 4.4 changelog.txt
+++ b/ProTA 4.4 changelog.txt
@@ -235,7 +235,7 @@ Arm Maverick:
Arm Shooter:
Reduced health (1250->960)
Reduced turn rate (1216->608)
- Reduced torse aiming rate (210->105)
+ Reduced torso aiming rate (210->105)
Core Sumo:
Increased build time (14268->15365)
diff --git a/Shaders/crt/crt-lottes-fast-no-warp-bilinear.glsl b/Shaders/crt/crt-lottes-fast-no-warp-bilinear.glsl
new file mode 100644
index 0000000..449b9be
--- /dev/null
+++ b/Shaders/crt/crt-lottes-fast-no-warp-bilinear.glsl
@@ -0,0 +1,701 @@
+//_____________________________/\_______________________________
+//==============================================================
+//
+//
+// [CRTS] PUBLIC DOMAIN CRT-STYLED SCALAR - 20180120b
+//
+// by Timothy Lottes
+// https://www.shadertoy.com/view/MtSfRK
+// adapted for RetroArch by hunterk
+//
+//
+//==============================================================
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+//_____________________________/\_______________________________
+//==============================================================
+//
+// WHAT'S NEW
+//
+//--------------------------------------------------------------
+// Evolution of prior shadertoy example
+//--------------------------------------------------------------
+// This one is semi-optimized
+// - Less texture fetches
+// - Didn't get to instruction level optimization
+// - Could likely use texture fetch to generate phosphor mask
+//--------------------------------------------------------------
+// Added options to disable unused features
+//--------------------------------------------------------------
+// Added in exposure matching
+// - Given scan-line effect and mask always darkens image
+// - Uses generalized tonemapper to boost mid-level
+// - Note this can compress highlights
+// - And won't get back peak brightness
+// - But best option if one doesn't want as much darkening
+//--------------------------------------------------------------
+// Includes option saturation and contrast controls
+//--------------------------------------------------------------
+// Added in subtractive aperture grille
+// - This is a bit brighter than prior
+//--------------------------------------------------------------
+// Make sure input to this filter is already low-resolution
+// - This is not designed to work on titles doing the following
+// - Rendering to hi-res with nearest sampling
+//--------------------------------------------------------------
+// Added a fast and more pixely option for 2 tap/pixel
+//--------------------------------------------------------------
+// Improved the vignette when WARP is enabled
+//--------------------------------------------------------------
+// Didn't test HLSL or CPU options
+// - Will incorportate patches if they are broken
+// - But out of time to try them myself
+//==============================================================
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+//_____________________________/\_______________________________
+//==============================================================
+//
+// LICENSE = UNLICENSE (aka PUBLIC DOMAIN)
+//
+//--------------------------------------------------------------
+// This is free and unencumbered software released into the
+// public domain.
+//--------------------------------------------------------------
+// Anyone is free to copy, modify, publish, use, compile, sell,
+// or distribute this software, either in source code form or as
+// a compiled binary, for any purpose, commercial or
+// non-commercial, and by any means.
+//--------------------------------------------------------------
+// In jurisdictions that recognize copyright laws, the author or
+// authors of this software dedicate any and all copyright
+// interest in the software to the public domain. We make this
+// dedication for the benefit of the public at large and to the
+// detriment of our heirs and successors. We intend this
+// dedication to be an overt act of relinquishment in perpetuity
+// of all present and future rights to this software under
+// copyright law.
+//--------------------------------------------------------------
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+// KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
+// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+//--------------------------------------------------------------
+// For more information, please refer to
+//
+//==============================================================
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+
+#pragma parameter MASK "Mask Type" 1.0 0.0 3.0 1.0
+#pragma parameter MASK_INTENSITY "Mask Intensity" 0.5 0.0 1.0 0.05
+#pragma parameter SCANLINE_THINNESS "Scanline Intensity" 0.5 0.0 1.0 0.1
+#pragma parameter SCAN_BLUR "Sharpness" 2.5 1.0 3.0 0.1
+#pragma parameter CURVATURE "Curvature" 0.02 0.0 0.25 0.01
+#pragma parameter TRINITRON_CURVE "Trinitron-style Curve" 0.0 0.0 1.0 1.0
+#pragma parameter CORNER "Corner Round" 3.0 0.0 11.0 1.0
+#pragma parameter CRT_GAMMA "CRT Gamma" 2.4 0.0 51.0 0.1
+
+#if defined(VERTEX)
+
+#if __VERSION__ >= 130
+#define COMPAT_VARYING out
+#define COMPAT_ATTRIBUTE in
+#define COMPAT_TEXTURE texture
+#else
+#define COMPAT_VARYING varying
+#define COMPAT_ATTRIBUTE attribute
+#define COMPAT_TEXTURE texture2D
+#endif
+
+#ifdef GL_ES
+#define COMPAT_PRECISION mediump
+#else
+#define COMPAT_PRECISION
+#endif
+
+COMPAT_ATTRIBUTE vec4 VertexCoord;
+COMPAT_ATTRIBUTE vec4 COLOR;
+COMPAT_ATTRIBUTE vec4 TexCoord;
+COMPAT_VARYING vec4 COL0;
+COMPAT_VARYING vec4 TEX0;
+
+vec4 _oPosition1;
+uniform mat4 MVPMatrix;
+uniform COMPAT_PRECISION int FrameDirection;
+uniform COMPAT_PRECISION int FrameCount;
+uniform COMPAT_PRECISION vec2 OutputSize;
+uniform COMPAT_PRECISION vec2 TextureSize;
+uniform COMPAT_PRECISION vec2 InputSize;
+
+// compatibility #defines
+#define vTexCoord TEX0.xy
+#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
+#define OutSize vec4(OutputSize, 1.0 / OutputSize)
+
+void main()
+{
+ gl_Position = MVPMatrix * VertexCoord;
+ TEX0.xy = TexCoord.xy;
+}
+
+#elif defined(FRAGMENT)
+
+#ifdef GL_ES
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+precision highp float;
+#else
+precision mediump float;
+#endif
+#define COMPAT_PRECISION mediump
+#else
+#define COMPAT_PRECISION
+#endif
+
+#if __VERSION__ >= 130
+#define COMPAT_VARYING in
+#define COMPAT_TEXTURE texture
+out COMPAT_PRECISION vec4 FragColor;
+#else
+#define COMPAT_VARYING varying
+#define FragColor gl_FragColor
+#define COMPAT_TEXTURE texture2D
+#endif
+
+uniform COMPAT_PRECISION int FrameDirection;
+uniform COMPAT_PRECISION int FrameCount;
+uniform COMPAT_PRECISION vec2 OutputSize;
+uniform COMPAT_PRECISION vec2 TextureSize;
+uniform COMPAT_PRECISION vec2 InputSize;
+uniform sampler2D Texture;
+COMPAT_VARYING vec4 TEX0;
+
+// compatibility #defines
+#define Source Texture
+#define vTexCoord TEX0.xy
+
+#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
+#define OutSize vec4(OutputSize, 1.0 / OutputSize)
+
+#ifdef PARAMETER_UNIFORM
+uniform COMPAT_PRECISION float CRT_GAMMA;
+uniform COMPAT_PRECISION float SCANLINE_THINNESS;
+uniform COMPAT_PRECISION float SCAN_BLUR;
+uniform COMPAT_PRECISION float MASK_INTENSITY;
+uniform COMPAT_PRECISION float CURVATURE;
+uniform COMPAT_PRECISION float CORNER;
+uniform COMPAT_PRECISION float MASK;
+uniform COMPAT_PRECISION float TRINITRON_CURVE;
+#else
+#define CRT_GAMMA 2.4
+#define SCANLINE_THINNESS 0.5
+#define SCAN_BLUR 2.5
+#define MASK_INTENSITY 0.54
+#define CURVATURE 0.00
+#define CORNER 3.0
+#define MASK 1.0
+#define TRINITRON_CURVE 0.0
+#endif
+
+//_____________________________/\_______________________________
+//==============================================================
+//
+// GAMMA FUNCTIONS
+//
+//--------------------------------------------------------------
+//--------------------------------------------------------------
+// Since shadertoy doesn't have sRGB textures
+// And we need linear input into shader
+// Don't do this in your code
+ float FromSrgb1(float c){
+ return (c<=0.04045)?c*(1.0/12.92):
+ pow(c*(1.0/1.055)+(0.055/1.055),CRT_GAMMA);}
+//--------------------------------------------------------------
+vec3 FromSrgb(vec3 c){return vec3(
+ FromSrgb1(c.r),FromSrgb1(c.g),FromSrgb1(c.b));}
+
+// Convert from linear to sRGB
+// Since shader toy output is not linear
+float ToSrgb1(float c){
+ return(c<0.0031308?c*12.92:1.055*pow(c,0.41666)-0.055);}
+//--------------------------------------------------------------
+vec3 ToSrgb(vec3 c){return vec3(
+ ToSrgb1(c.r),ToSrgb1(c.g),ToSrgb1(c.b));}
+//--------------------------------------------------------------
+
+//_____________________________/\_______________________________
+//==============================================================
+//
+// DEFINES
+//
+//--------------------------------------------------------------
+// CRTS_CPU - CPU code
+// CRTS_GPU - GPU code
+//--------------------------------------------------------------
+// CRTS_GLSL - GLSL
+// CRTS_HLSL - HLSL (not tested yet)
+//--------------------------------------------------------------
+// CRTS_DEBUG - Define to see on/off split screen
+//--------------------------------------------------------------
+// CRTS_WARP - Apply screen warp
+//--------------------------------------------------------------
+// CRTS_2_TAP - Faster very pixely 2-tap filter (off is 8)
+//--------------------------------------------------------------
+// CRTS_MASK_GRILLE - Aperture grille (aka Trinitron)
+// CRTS_MASK_GRILLE_LITE - Brighter (subtractive channels)
+// CRTS_MASK_NONE - No mask
+// CRTS_MASK_SHADOW - Horizontally stretched shadow mask
+//--------------------------------------------------------------
+// CRTS_TONE - Normalize mid-level and process color
+// CRTS_CONTRAST - Process color - enable contrast control
+// CRTS_SATURATION - Process color - enable saturation control
+//--------------------------------------------------------------
+#define CRTS_STATIC
+#define CrtsPow
+#define CRTS_RESTRICT
+//==============================================================
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+
+//==============================================================
+// SETUP FOR CRTS
+//--------------------------------------------------------------
+//==============================================================
+//#define CRTS_DEBUG 1
+#define CRTS_GPU 1
+#define CRTS_GLSL 1
+//--------------------------------------------------------------
+//#define CRTS_2_TAP 1
+//--------------------------------------------------------------
+#define CRTS_TONE 1
+#define CRTS_CONTRAST 0
+#define CRTS_SATURATION 0
+//--------------------------------------------------------------
+#define CRTS_WARP 1
+//--------------------------------------------------------------
+// Try different masks -> moved to runtime parameters
+//#define CRTS_MASK_GRILLE 1
+//#define CRTS_MASK_GRILLE_LITE 1
+//#define CRTS_MASK_NONE 1
+//#define CRTS_MASK_SHADOW 1
+//--------------------------------------------------------------
+// Scanline thinness
+// 0.50 = fused scanlines
+// 0.70 = recommended default
+// 1.00 = thinner scanlines (too thin)
+#define INPUT_THIN 0.5 + (0.5 * SCANLINE_THINNESS)
+//--------------------------------------------------------------
+// Horizonal scan blur
+// -3.0 = pixely
+// -2.5 = default
+// -2.0 = smooth
+// -1.0 = too blurry
+#define INPUT_BLUR -1.0 * SCAN_BLUR
+//--------------------------------------------------------------
+// Shadow mask effect, ranges from,
+// 0.25 = large amount of mask (not recommended, too dark)
+// 0.50 = recommended default
+// 1.00 = no shadow mask
+#define INPUT_MASK 1.0 - MASK_INTENSITY
+//--------------------------------------------------------------
+#define INPUT_X InputSize.x
+#define INPUT_Y InputSize.y
+//--------------------------------------------------------------
+// Setup the function which returns input image color
+vec3 CrtsFetch(vec2 uv){
+ // For shadertoy, scale to get native texels in the image
+ uv*=vec2(INPUT_X,INPUT_Y)/TextureSize.xy;
+ // Move towards intersting parts
+// uv+=vec2(0.5,0.5);
+ // Non-shadertoy case would not have the color conversion
+ return FromSrgb(COMPAT_TEXTURE(Texture,uv.xy,-16.0).rgb);}
+#endif
+
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+//_____________________________/\_______________________________
+//==============================================================
+//
+// GPU CODE
+//
+//==============================================================
+#ifdef CRTS_GPU
+//_____________________________/\_______________________________
+//==============================================================
+// PORTABILITY
+//==============================================================
+ #ifdef CRTS_GLSL
+ #define CrtsF1 float
+ #define CrtsF2 vec2
+ #define CrtsF3 vec3
+ #define CrtsF4 vec4
+ #define CrtsFractF1 fract
+ #define CrtsRcpF1(x) (1.0/(x))
+ #define CrtsSatF1(x) clamp((x),0.0,1.0)
+//--------------------------------------------------------------
+ CrtsF1 CrtsMax3F1(CrtsF1 a,CrtsF1 b,CrtsF1 c){
+ return max(a,max(b,c));}
+ #endif
+//==============================================================
+ #ifdef CRTS_HLSL
+ #define CrtsF1 float
+ #define CrtsF2 float2
+ #define CrtsF3 float3
+ #define CrtsF4 float4
+ #define CrtsFractF1 frac
+ #define CrtsRcpF1(x) (1.0/(x))
+ #define CrtsSatF1(x) saturate(x)
+//--------------------------------------------------------------
+ CrtsF1 CrtsMax3F1(CrtsF1 a,CrtsF1 b,CrtsF1 c){
+ return max(a,max(b,c));}
+ #endif
+//_____________________________/\_______________________________
+//==============================================================
+// TONAL CONTROL CONSTANT GENERATION
+//--------------------------------------------------------------
+// This is in here for rapid prototyping
+// Please use the CPU code and pass in as constants
+//==============================================================
+ CrtsF4 CrtsTone(
+ CrtsF1 contrast,
+ CrtsF1 saturation,
+ CrtsF1 thin,
+ CrtsF1 mask){
+//--------------------------------------------------------------
+ if(MASK == 0.0) mask=1.0;
+//--------------------------------------------------------------
+ if(MASK == 1.0){
+ // Normal R mask is {1.0,mask,mask}
+ // LITE R mask is {mask,1.0,1.0}
+ mask=0.5+mask*0.5;
+ }
+//--------------------------------------------------------------
+ CrtsF4 ret;
+ CrtsF1 midOut=0.18/((1.5-thin)*(0.5*mask+0.5));
+ CrtsF1 pMidIn=pow(0.18,contrast);
+ ret.x=contrast;
+ ret.y=((-pMidIn)+midOut)/((1.0-pMidIn)*midOut);
+ ret.z=((-pMidIn)*midOut+pMidIn)/(midOut*(-pMidIn)+midOut);
+ ret.w=contrast+saturation;
+ return ret;}
+//_____________________________/\_______________________________
+//==============================================================
+// MASK
+//--------------------------------------------------------------
+// Letting LCD/OLED pixel elements function like CRT phosphors
+// So "phosphor" resolution scales with display resolution
+//--------------------------------------------------------------
+// Not applying any warp to the mask (want high frequency)
+// Real aperture grille has a mask which gets wider on ends
+// Not attempting to be "real" but instead look the best
+//--------------------------------------------------------------
+// Shadow mask is stretched horizontally
+// RRGGBB
+// GBBRRG
+// RRGGBB
+// This tends to look better on LCDs than vertical
+// Also 2 pixel width is required to get triad centered
+//--------------------------------------------------------------
+// The LITE version of the Aperture Grille is brighter
+// Uses {dark,1.0,1.0} for R channel
+// Non LITE version uses {1.0,dark,dark}
+//--------------------------------------------------------------
+// 'pos' - This is 'fragCoord.xy'
+// Pixel {0,0} should be {0.5,0.5}
+// Pixel {1,1} should be {1.5,1.5}
+//--------------------------------------------------------------
+// 'dark' - Exposure of of masked channel
+// 0.0=fully off, 1.0=no effect
+//==============================================================
+ CrtsF3 CrtsMask(CrtsF2 pos,CrtsF1 dark){
+ if(MASK == 2.0){
+ CrtsF3 m=CrtsF3(dark,dark,dark);
+ CrtsF1 x=CrtsFractF1(pos.x*(1.0/3.0));
+ if(x<(1.0/3.0))m.r=1.0;
+ else if(x<(2.0/3.0))m.g=1.0;
+ else m.b=1.0;
+ return m;
+ }
+//--------------------------------------------------------------
+ if(MASK == 1.0){
+ CrtsF3 m=CrtsF3(1.0,1.0,1.0);
+ CrtsF1 x=CrtsFractF1(pos.x*(1.0/3.0));
+ if(x<(1.0/3.0))m.r=dark;
+ else if(x<(2.0/3.0))m.g=dark;
+ else m.b=dark;
+ return m;
+ }
+//--------------------------------------------------------------
+ if(MASK == 0.0){
+ return CrtsF3(1.0,1.0,1.0);
+ }
+//--------------------------------------------------------------
+ if(MASK == 3.0){
+ pos.x+=pos.y*2.9999;
+ CrtsF3 m=CrtsF3(dark,dark,dark);
+ CrtsF1 x=CrtsFractF1(pos.x*(1.0/6.0));
+ if(x<(1.0/3.0))m.r=1.0;
+ else if(x<(2.0/3.0))m.g=1.0;
+ else m.b=1.0;
+ return m;
+ }
+ }
+//_____________________________/\_______________________________
+//==============================================================
+// FILTER ENTRY
+//--------------------------------------------------------------
+// Input must be linear
+// Output color is linear
+//--------------------------------------------------------------
+// Must have fetch function setup: CrtsF3 CrtsFetch(CrtsF2 uv)
+// - The 'uv' range is {0.0 to 1.0} for input texture
+// - Output of this must be linear color
+//--------------------------------------------------------------
+// SCANLINE MATH & AUTO-EXPOSURE NOTES
+// ===================================
+// Each output line has contribution from at most 2 scanlines
+// Scanlines are shaped by a windowed cosine function
+// This shape blends together well with only 2 lines of overlap
+//--------------------------------------------------------------
+// Base scanline intensity is as follows
+// which leaves output intensity range from {0 to 1.0}
+// --------
+// thin := range {thick 0.5 to thin 1.0}
+// off := range {0.0 to <1.0},
+// sub-pixel offset between two scanlines
+// --------
+// a0=cos(min(0.5, off *thin)*2pi)*0.5+0.5;
+// a1=cos(min(0.5,(1.0-off)*thin)*2pi)*0.5+0.5;
+//--------------------------------------------------------------
+// This leads to a image darkening factor of roughly:
+// {(1.5-thin)/1.0}
+// This is further reduced by the mask:
+// {1.0/2.0+mask*1.0/2.0}
+// Reciprocal of combined effect is used for auto-exposure
+// to scale up the mid-level in the tonemapper
+//==============================================================
+ CrtsF3 CrtsFilter(
+//--------------------------------------------------------------
+ // SV_POSITION, fragCoord.xy
+ CrtsF2 ipos,
+//--------------------------------------------------------------
+ // inputSize / outputSize (in pixels)
+ CrtsF2 inputSizeDivOutputSize,
+//--------------------------------------------------------------
+ // 0.5 * inputSize (in pixels)
+ CrtsF2 halfInputSize,
+//--------------------------------------------------------------
+ // 1.0 / inputSize (in pixels)
+ CrtsF2 rcpInputSize,
+//--------------------------------------------------------------
+ // 1.0 / outputSize (in pixels)
+ CrtsF2 rcpOutputSize,
+//--------------------------------------------------------------
+ // 2.0 / outputSize (in pixels)
+ CrtsF2 twoDivOutputSize,
+//--------------------------------------------------------------
+ // inputSize.y
+ CrtsF1 inputHeight,
+//--------------------------------------------------------------
+ // Warp scanlines but not phosphor mask
+ // 0.0 = no warp
+ // 1.0/64.0 = light warping
+ // 1.0/32.0 = more warping
+ // Want x and y warping to be different (based on aspect)
+ CrtsF2 warp,
+//--------------------------------------------------------------
+ // Scanline thinness
+ // 0.50 = fused scanlines
+ // 0.70 = recommended default
+ // 1.00 = thinner scanlines (too thin)
+ // Shared with CrtsTone() function
+ CrtsF1 thin,
+//--------------------------------------------------------------
+ // Horizonal scan blur
+ // -3.0 = pixely
+ // -2.5 = default
+ // -2.0 = smooth
+ // -1.0 = too blurry
+ CrtsF1 blur,
+//--------------------------------------------------------------
+ // Shadow mask effect, ranges from,
+ // 0.25 = large amount of mask (not recommended, too dark)
+ // 0.50 = recommended default
+ // 1.00 = no shadow mask
+ // Shared with CrtsTone() function
+ CrtsF1 mask,
+//--------------------------------------------------------------
+ // Tonal curve parameters generated by CrtsTone()
+ CrtsF4 tone
+//--------------------------------------------------------------
+ ){
+//--------------------------------------------------------------
+ #ifdef CRTS_DEBUG
+ CrtsF2 uv=ipos*rcpOutputSize;
+ // Show second half processed, and first half un-processed
+ if(uv.x<0.5){
+ // Force nearest to get squares
+ uv*=1.0/rcpInputSize;
+ uv=floor(uv)+CrtsF2(0.5,0.5);
+ uv*=rcpInputSize;
+ CrtsF3 color=CrtsFetch(uv);
+ return color;}
+ #endif
+//--------------------------------------------------------------
+ // Optional apply warp
+ CrtsF2 pos;
+ #ifdef CRTS_WARP
+ // Convert to {-1 to 1} range
+ pos=ipos*twoDivOutputSize-CrtsF2(1.0,1.0);
+ // Distort pushes image outside {-1 to 1} range
+ pos*=CrtsF2(
+ 1.0+(pos.y*pos.y)*warp.x,
+ 1.0+(pos.x*pos.x)*warp.y);
+ // TODO: Vignette needs optimization
+ CrtsF1 vin=(1.0-(
+ (1.0-CrtsSatF1(pos.x*pos.x))*(1.0-CrtsSatF1(pos.y*pos.y)))) * (0.998 + (0.001 * CORNER));
+ vin=CrtsSatF1((-vin)*inputHeight+inputHeight);
+ // Leave in {0 to inputSize}
+ pos=pos*halfInputSize+halfInputSize;
+ #else
+ pos=ipos*inputSizeDivOutputSize;
+ #endif
+//--------------------------------------------------------------
+ // Snap to center of first scanline
+ CrtsF1 y0=floor(pos.y-0.5)+0.5;
+ #ifdef CRTS_2_TAP
+ // Using Inigo's "Improved Texture Interpolation"
+ // http://iquilezles.org/www/articles/texture/texture.htm
+ pos.x+=0.5;
+ CrtsF1 xi=floor(pos.x);
+ CrtsF1 xf=pos.x-xi;
+ xf=xf*xf*xf*(xf*(xf*6.0-15.0)+10.0);
+ CrtsF1 x0=xi+xf-0.5;
+ CrtsF2 p=CrtsF2(x0*rcpInputSize.x,y0*rcpInputSize.y);
+ // Coordinate adjusted bilinear fetch from 2 nearest scanlines
+ CrtsF3 colA=CrtsFetch(p);
+ p.y+=rcpInputSize.y;
+ CrtsF3 colB=CrtsFetch(p);
+ #else
+ // Snap to center of one of four pixels
+ CrtsF1 x0=floor(pos.x-1.5)+0.5;
+ // Inital UV position
+ CrtsF2 p=CrtsF2(x0*rcpInputSize.x,y0*rcpInputSize.y);
+ // Fetch 4 nearest texels from 2 nearest scanlines
+ CrtsF3 colA0=CrtsFetch(p);
+ p.x+=rcpInputSize.x;
+ CrtsF3 colA1=CrtsFetch(p);
+ p.x+=rcpInputSize.x;
+ CrtsF3 colA2=CrtsFetch(p);
+ p.x+=rcpInputSize.x;
+ CrtsF3 colA3=CrtsFetch(p);
+ p.y+=rcpInputSize.y;
+ CrtsF3 colB3=CrtsFetch(p);
+ p.x-=rcpInputSize.x;
+ CrtsF3 colB2=CrtsFetch(p);
+ p.x-=rcpInputSize.x;
+ CrtsF3 colB1=CrtsFetch(p);
+ p.x-=rcpInputSize.x;
+ CrtsF3 colB0=CrtsFetch(p);
+ #endif
+//--------------------------------------------------------------
+ // Vertical filter
+ // Scanline intensity is using sine wave
+ // Easy filter window and integral used later in exposure
+ CrtsF1 off=pos.y-y0;
+ CrtsF1 pi2=6.28318530717958;
+ CrtsF1 hlf=0.5;
+ CrtsF1 scanA=cos(min(0.5, off *thin )*pi2)*hlf+hlf;
+ CrtsF1 scanB=cos(min(0.5,(-off)*thin+thin)*pi2)*hlf+hlf;
+//--------------------------------------------------------------
+ #ifdef CRTS_2_TAP
+ #ifdef CRTS_WARP
+ // Get rid of wrong pixels on edge
+ scanA*=vin;
+ scanB*=vin;
+ #endif
+ // Apply vertical filter
+ CrtsF3 color=(colA*scanA)+(colB*scanB);
+ #else
+ // Horizontal kernel is simple gaussian filter
+ CrtsF1 off0=pos.x-x0;
+ CrtsF1 off1=off0-1.0;
+ CrtsF1 off2=off0-2.0;
+ CrtsF1 off3=off0-3.0;
+ CrtsF1 pix0=exp2(blur*off0*off0);
+ CrtsF1 pix1=exp2(blur*off1*off1);
+ CrtsF1 pix2=exp2(blur*off2*off2);
+ CrtsF1 pix3=exp2(blur*off3*off3);
+ CrtsF1 pixT=CrtsRcpF1(pix0+pix1+pix2+pix3);
+ #ifdef CRTS_WARP
+ // Get rid of wrong pixels on edge
+ pixT*=vin;
+ #endif
+ scanA*=pixT;
+ scanB*=pixT;
+ // Apply horizontal and vertical filters
+ CrtsF3 color=
+ (colA0*pix0+colA1*pix1+colA2*pix2+colA3*pix3)*scanA +
+ (colB0*pix0+colB1*pix1+colB2*pix2+colB3*pix3)*scanB;
+ #endif
+//--------------------------------------------------------------
+ // Apply phosphor mask
+ color*=CrtsMask(ipos,mask);
+//--------------------------------------------------------------
+ // Optional color processing
+ #ifdef CRTS_TONE
+ // Tonal control, start by protecting from /0
+ CrtsF1 peak=max(1.0/(256.0*65536.0),
+ CrtsMax3F1(color.r,color.g,color.b));
+ // Compute the ratios of {R,G,B}
+ CrtsF3 ratio=color*CrtsRcpF1(peak);
+ // Apply tonal curve to peak value
+ #ifdef CRTS_CONTRAST
+ peak=pow(peak,tone.x);
+ #endif
+ peak=peak*CrtsRcpF1(peak*tone.y+tone.z);
+ // Apply saturation
+ #ifdef CRTS_SATURATION
+ ratio=pow(ratio,CrtsF3(tone.w,tone.w,tone.w));
+ #endif
+ // Reconstruct color
+ return ratio*peak;
+ #else
+ return color;
+ #endif
+//--------------------------------------------------------------
+ }
+
+
+void main()
+{
+ vec2 warp_factor;
+ warp_factor.x = CURVATURE;
+ warp_factor.y = (3.0 / 4.0) * warp_factor.x; // assume 4:3 aspect
+ warp_factor.x *= (1.0 - TRINITRON_CURVE);
+ FragColor.rgb = CrtsFilter(vTexCoord.xy * OutputSize.xy*(TextureSize.xy / InputSize.xy),
+ InputSize.xy / OutputSize.xy,
+ InputSize.xy * vec2(0.5,0.5),
+ 1.0/InputSize.xy,
+ 1.0/OutputSize.xy,
+ 2.0/OutputSize.xy,
+ InputSize.y,
+ warp_factor,
+ INPUT_THIN,
+ INPUT_BLUR,
+ INPUT_MASK,
+ CrtsTone(1.0,0.0,INPUT_THIN,INPUT_MASK));
+
+ // Shadertoy outputs non-linear color
+ FragColor.rgb=ToSrgb(FragColor.rgb);
+}
+#endif
diff --git a/Shaders/cubic/catmull-rom-bilinear.glsl b/Shaders/cubic/catmull-rom-bilinear.glsl
new file mode 100644
index 0000000..55fb05d
--- /dev/null
+++ b/Shaders/cubic/catmull-rom-bilinear.glsl
@@ -0,0 +1,150 @@
+/*
+ Bicubic Catmull-Rom 9 taps (Fast) - ported by Hyllian - 2020
+ The following code is licensed under the MIT license: https://gist.github.com/TheRealMJP/bc503b0b87b643d3505d41eab8b332ae
+ Ported from code: https://gist.github.com/TheRealMJP/c83b8c0f46b63f3a88a5986f4fa982b1
+ Samples a texture with Catmull-Rom filtering, using 9 texture fetches instead of 16.
+ See http://vec3.ca/bicubic-filtering-in-fewer-taps/ for more details
+ ATENTION: This code only work using LINEAR filter sampling set on Retroarch!
+*/
+
+#if defined(VERTEX)
+
+#if __VERSION__ >= 130
+#define COMPAT_VARYING out
+#define COMPAT_ATTRIBUTE in
+#define COMPAT_TEXTURE texture
+#else
+#define COMPAT_VARYING varying
+#define COMPAT_ATTRIBUTE attribute
+#define COMPAT_TEXTURE texture2D
+#endif
+
+#ifdef GL_ES
+#define COMPAT_PRECISION mediump
+precision COMPAT_PRECISION float;
+#else
+#define COMPAT_PRECISION
+#endif
+
+COMPAT_ATTRIBUTE vec4 VertexCoord;
+COMPAT_ATTRIBUTE vec4 COLOR;
+COMPAT_ATTRIBUTE vec4 TexCoord;
+COMPAT_VARYING vec4 COL0;
+COMPAT_VARYING vec4 TEX0;
+
+uniform mat4 MVPMatrix;
+uniform COMPAT_PRECISION int FrameDirection;
+uniform COMPAT_PRECISION int FrameCount;
+uniform COMPAT_PRECISION vec2 OutputSize;
+uniform COMPAT_PRECISION vec2 TextureSize;
+uniform COMPAT_PRECISION vec2 InputSize;
+
+void main()
+{
+ gl_Position = MVPMatrix * VertexCoord;
+ COL0 = COLOR;
+ TEX0.xy = TexCoord.xy;
+}
+
+#elif defined(FRAGMENT)
+
+#if __VERSION__ >= 130
+#define COMPAT_VARYING in
+#define COMPAT_TEXTURE texture
+out mediump vec4 FragColor;
+#else
+#define COMPAT_VARYING varying
+#define FragColor gl_FragColor
+#define COMPAT_TEXTURE texture2D
+#endif
+
+#ifdef GL_ES
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+precision highp float;
+#else
+precision mediump float;
+#endif
+#define COMPAT_PRECISION mediump
+#else
+#define COMPAT_PRECISION
+#endif
+
+uniform COMPAT_PRECISION int FrameDirection;
+uniform COMPAT_PRECISION int FrameCount;
+uniform COMPAT_PRECISION vec2 OutputSize;
+uniform COMPAT_PRECISION vec2 TextureSize;
+uniform COMPAT_PRECISION vec2 InputSize;
+uniform sampler2D Texture;
+COMPAT_VARYING vec4 TEX0;
+
+// compatibility #defines
+#define Source Texture
+#define vTexCoord TEX0.xy
+
+#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
+#define outsize vec4(OutputSize, 1.0 / OutputSize)
+
+#define mul(c,d) (d*c)
+
+void main()
+{
+ // We're going to sample a a 4x4 grid of texels surrounding the target UV coordinate. We'll do this by rounding
+ // down the sample location to get the exact center of our "starting" texel. The starting texel will be at
+ // location [1, 1] in the grid, where [0, 0] is the top left corner.
+ vec2 samplePos = vTexCoord * SourceSize.xy;
+ vec2 texPos1 = floor(samplePos - 0.5) + 0.5;
+
+ // Compute the fractional offset from our starting texel to our original sample location, which we'll
+ // feed into the Catmull-Rom spline function to get our filter weights.
+ vec2 f = samplePos - texPos1;
+
+ // Compute the Catmull-Rom weights using the fractional offset that we calculated earlier.
+ // These equations are pre-expanded based on our knowledge of where the texels will be located,
+ // which lets us avoid having to evaluate a piece-wise function.
+ vec2 w0 = f * (-0.5 + f * (1.0 - 0.5 * f));
+ vec2 w1 = 1.0 + f * f * (-2.5 + 1.5 * f);
+ vec2 w2 = f * (0.5 + f * (2.0 - 1.5 * f));
+ vec2 w3 = f * f * (-0.5 + 0.5 * f);
+ // vec2 w3 = 1.0 - w0 - w1 - w2;
+
+ // Work out weighting factors and sampling offsets that will let us use bilinear filtering to
+ // simultaneously evaluate the middle 2 samples from the 4x4 grid.
+ vec2 w12 = w1 + w2;
+ vec2 offset12 = w2 / (w1 + w2);
+
+ // Compute the final UV coordinates we'll use for sampling the texture
+ vec2 texPos0 = texPos1 - 1.;
+ vec2 texPos3 = texPos1 + 2.;
+ vec2 texPos12 = texPos1 + offset12;
+
+ texPos0 *= SourceSize.zw;
+ texPos3 *= SourceSize.zw;
+ texPos12 *= SourceSize.zw;
+
+ vec4 c00 = COMPAT_TEXTURE(Source, vec2(texPos0.x, texPos0.y));
+ vec4 c10 = COMPAT_TEXTURE(Source, vec2(texPos12.x, texPos0.y));
+ vec4 c20 = COMPAT_TEXTURE(Source, vec2(texPos3.x, texPos0.y));
+
+ vec4 c01 = COMPAT_TEXTURE(Source, vec2(texPos0.x, texPos12.y));
+ vec4 c11 = COMPAT_TEXTURE(Source, vec2(texPos12.x, texPos12.y));
+ vec4 c21 = COMPAT_TEXTURE(Source, vec2(texPos3.x, texPos12.y));
+
+ vec4 c02 = COMPAT_TEXTURE(Source, vec2(texPos0.x, texPos3.y));
+ vec4 c12 = COMPAT_TEXTURE(Source, vec2(texPos12.x, texPos3.y));
+ vec4 c22 = COMPAT_TEXTURE(Source, vec2(texPos3.x, texPos3.y));
+
+ // initialize some variables
+ vec4 c1, c2, c3, wx, wy = vec4(0.,0.,0.,0.);
+ // junk vec4 used only to round out the non-square 3x4 matrices
+ vec4 dummy = vec4(0.,0.,0.,1.);
+
+ wx = vec4(w0.x, w12.x, w3.x, 1.0);
+ wy = vec4(w0.y, w12.y, w3.y, 1.0);
+
+ c1 = vec4(mul(wx, mat4(c00, c10, c20, dummy)));
+ c2 = vec4(mul(wx, mat4(c01, c11, c21, dummy)));
+ c3 = vec4(mul(wx, mat4(c02, c12, c22, dummy)));
+
+ FragColor = mul(wy, mat4(c1, c2, c3, dummy));
+}
+#endif
diff --git a/Shaders/interpolation/bilinear.glsl b/Shaders/interpolation/bilinear.glsl
new file mode 100644
index 0000000..aa7bee6
--- /dev/null
+++ b/Shaders/interpolation/bilinear.glsl
@@ -0,0 +1,73 @@
+#if defined(VERTEX)
+
+#if __VERSION__ >= 130
+#define COMPAT_VARYING out
+#define COMPAT_ATTRIBUTE in
+#define COMPAT_TEXTURE texture
+#else
+#define COMPAT_VARYING varying
+#define COMPAT_ATTRIBUTE attribute
+#define COMPAT_TEXTURE texture2D
+#endif
+
+#ifdef GL_ES
+#define COMPAT_PRECISION mediump
+#else
+#define COMPAT_PRECISION
+#endif
+
+COMPAT_ATTRIBUTE vec4 VertexCoord;
+COMPAT_ATTRIBUTE vec4 COLOR;
+COMPAT_ATTRIBUTE vec4 TexCoord;
+COMPAT_VARYING vec4 COL0;
+COMPAT_VARYING vec4 TEX0;
+
+uniform mat4 MVPMatrix;
+uniform COMPAT_PRECISION int FrameDirection;
+uniform COMPAT_PRECISION int FrameCount;
+uniform COMPAT_PRECISION vec2 OutputSize;
+uniform COMPAT_PRECISION vec2 TextureSize;
+uniform COMPAT_PRECISION vec2 InputSize;
+
+void main()
+{
+ gl_Position = VertexCoord.x * MVPMatrix[0] + VertexCoord.y * MVPMatrix[1] + VertexCoord.z * MVPMatrix[2] + VertexCoord.w * MVPMatrix[3];
+ TEX0.xy = TexCoord.xy;
+}
+
+#elif defined(FRAGMENT)
+
+#if __VERSION__ >= 130
+#define COMPAT_VARYING in
+#define COMPAT_TEXTURE texture
+out vec4 FragColor;
+#else
+#define COMPAT_VARYING varying
+#define FragColor gl_FragColor
+#define COMPAT_TEXTURE texture2D
+#endif
+
+#ifdef GL_ES
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+precision highp float;
+#else
+precision mediump float;
+#endif
+#define COMPAT_PRECISION mediump
+#else
+#define COMPAT_PRECISION
+#endif
+
+uniform COMPAT_PRECISION int FrameDirection;
+uniform COMPAT_PRECISION int FrameCount;
+uniform COMPAT_PRECISION vec2 OutputSize;
+uniform COMPAT_PRECISION vec2 TextureSize;
+uniform COMPAT_PRECISION vec2 InputSize;
+uniform sampler2D Texture;
+COMPAT_VARYING vec4 TEX0;
+
+void main()
+{
+ FragColor = COMPAT_TEXTURE(Texture, TEX0.xy);
+}
+#endif
\ No newline at end of file
diff --git a/Shaders/nearest-neighbor.glsl b/Shaders/nearest-neighbor.glsl
new file mode 100644
index 0000000..aa7bee6
--- /dev/null
+++ b/Shaders/nearest-neighbor.glsl
@@ -0,0 +1,73 @@
+#if defined(VERTEX)
+
+#if __VERSION__ >= 130
+#define COMPAT_VARYING out
+#define COMPAT_ATTRIBUTE in
+#define COMPAT_TEXTURE texture
+#else
+#define COMPAT_VARYING varying
+#define COMPAT_ATTRIBUTE attribute
+#define COMPAT_TEXTURE texture2D
+#endif
+
+#ifdef GL_ES
+#define COMPAT_PRECISION mediump
+#else
+#define COMPAT_PRECISION
+#endif
+
+COMPAT_ATTRIBUTE vec4 VertexCoord;
+COMPAT_ATTRIBUTE vec4 COLOR;
+COMPAT_ATTRIBUTE vec4 TexCoord;
+COMPAT_VARYING vec4 COL0;
+COMPAT_VARYING vec4 TEX0;
+
+uniform mat4 MVPMatrix;
+uniform COMPAT_PRECISION int FrameDirection;
+uniform COMPAT_PRECISION int FrameCount;
+uniform COMPAT_PRECISION vec2 OutputSize;
+uniform COMPAT_PRECISION vec2 TextureSize;
+uniform COMPAT_PRECISION vec2 InputSize;
+
+void main()
+{
+ gl_Position = VertexCoord.x * MVPMatrix[0] + VertexCoord.y * MVPMatrix[1] + VertexCoord.z * MVPMatrix[2] + VertexCoord.w * MVPMatrix[3];
+ TEX0.xy = TexCoord.xy;
+}
+
+#elif defined(FRAGMENT)
+
+#if __VERSION__ >= 130
+#define COMPAT_VARYING in
+#define COMPAT_TEXTURE texture
+out vec4 FragColor;
+#else
+#define COMPAT_VARYING varying
+#define FragColor gl_FragColor
+#define COMPAT_TEXTURE texture2D
+#endif
+
+#ifdef GL_ES
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+precision highp float;
+#else
+precision mediump float;
+#endif
+#define COMPAT_PRECISION mediump
+#else
+#define COMPAT_PRECISION
+#endif
+
+uniform COMPAT_PRECISION int FrameDirection;
+uniform COMPAT_PRECISION int FrameCount;
+uniform COMPAT_PRECISION vec2 OutputSize;
+uniform COMPAT_PRECISION vec2 TextureSize;
+uniform COMPAT_PRECISION vec2 InputSize;
+uniform sampler2D Texture;
+COMPAT_VARYING vec4 TEX0;
+
+void main()
+{
+ FragColor = COMPAT_TEXTURE(Texture, TEX0.xy);
+}
+#endif
\ No newline at end of file
diff --git a/Shaders/readme.txt b/Shaders/readme.txt
new file mode 100644
index 0000000..c262bee
--- /dev/null
+++ b/Shaders/readme.txt
@@ -0,0 +1,7 @@
+This is a package of pixel shaders intended for old school emulators.
+Copyrights are held by the respective authors.
+
+https://github.com/libretro/glsl-shaders
+
+
+Note: Filename must end with "bilinear.glsl" to enable bilinear hardware filtering (GL_LINEAR)
diff --git a/Shaders/scanlines/scanline.glsl b/Shaders/scanlines/scanline.glsl
new file mode 100644
index 0000000..7c8423b
--- /dev/null
+++ b/Shaders/scanlines/scanline.glsl
@@ -0,0 +1,106 @@
+// Parameter lines go here:
+#pragma parameter SCANLINE_BASE_BRIGHTNESS "Scanline Base Brightness" 0.95 0.0 1.0 0.01
+#pragma parameter SCANLINE_SINE_COMP_A "Scanline Sine Comp A" 0.0 0.0 0.10 0.01
+#pragma parameter SCANLINE_SINE_COMP_B "Scanline Sine Comp B" 0.15 0.0 1.0 0.05
+
+#define pi 3.141592654
+
+#if defined(VERTEX)
+
+#if __VERSION__ >= 130
+#define COMPAT_VARYING out
+#define COMPAT_ATTRIBUTE in
+#define COMPAT_TEXTURE texture
+#else
+#define COMPAT_VARYING varying
+#define COMPAT_ATTRIBUTE attribute
+#define COMPAT_TEXTURE texture2D
+#endif
+
+#ifdef GL_ES
+#define COMPAT_PRECISION mediump
+#else
+#define COMPAT_PRECISION
+#endif
+
+COMPAT_ATTRIBUTE vec4 VertexCoord;
+COMPAT_ATTRIBUTE vec4 COLOR;
+COMPAT_ATTRIBUTE vec4 TexCoord;
+COMPAT_VARYING vec4 COL0;
+COMPAT_VARYING vec4 TEX0;
+COMPAT_VARYING vec2 omega;
+
+vec4 _oPosition1;
+uniform mat4 MVPMatrix;
+uniform COMPAT_PRECISION int FrameDirection;
+uniform COMPAT_PRECISION int FrameCount;
+uniform COMPAT_PRECISION vec2 OutputSize;
+uniform COMPAT_PRECISION vec2 TextureSize;
+uniform COMPAT_PRECISION vec2 InputSize;
+
+void main()
+{
+ gl_Position = MVPMatrix * VertexCoord;
+ COL0 = COLOR;
+ TEX0.xy = TexCoord.xy;
+ omega = vec2(pi * OutputSize.x, 2.0 * pi * TextureSize.y);
+}
+
+#elif defined(FRAGMENT)
+
+#if __VERSION__ >= 130
+#define COMPAT_VARYING in
+#define COMPAT_TEXTURE texture
+out vec4 FragColor;
+#else
+#define COMPAT_VARYING varying
+#define FragColor gl_FragColor
+#define COMPAT_TEXTURE texture2D
+#endif
+
+#ifdef GL_ES
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+precision highp float;
+#else
+precision mediump float;
+#endif
+#define COMPAT_PRECISION mediump
+#else
+#define COMPAT_PRECISION
+#endif
+
+uniform COMPAT_PRECISION int FrameDirection;
+uniform COMPAT_PRECISION int FrameCount;
+uniform COMPAT_PRECISION vec2 OutputSize;
+uniform COMPAT_PRECISION vec2 TextureSize;
+uniform COMPAT_PRECISION vec2 InputSize;
+uniform sampler2D Texture;
+COMPAT_VARYING vec4 TEX0;
+COMPAT_VARYING vec2 omega;
+
+// compatibility #defines
+#define Source Texture
+#define vTexCoord TEX0.xy
+
+#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
+#define OutputSize vec4(OutputSize, 1.0 / OutputSize)
+
+#ifdef PARAMETER_UNIFORM
+// All parameter floats need to have COMPAT_PRECISION in front of them
+uniform COMPAT_PRECISION float SCANLINE_BASE_BRIGHTNESS;
+uniform COMPAT_PRECISION float SCANLINE_SINE_COMP_A;
+uniform COMPAT_PRECISION float SCANLINE_SINE_COMP_B;
+#else
+#define SCANLINE_BASE_BRIGHTNESS 0.95
+#define SCANLINE_SINE_COMP_A 0.0
+#define SCANLINE_SINE_COMP_B 0.15
+#endif
+
+void main()
+{
+ vec2 sine_comp = vec2(SCANLINE_SINE_COMP_A, SCANLINE_SINE_COMP_B);
+ vec3 res = COMPAT_TEXTURE(Source, vTexCoord).xyz;
+ vec3 scanline = res * (SCANLINE_BASE_BRIGHTNESS + dot(sine_comp * sin(vTexCoord * omega), vec2(1.0, 1.0)));
+ FragColor = vec4(scanline.x, scanline.y, scanline.z, 1.0);
+}
+#endif
diff --git a/Shaders/shader-package.zip b/Shaders/shader-package.zip
new file mode 100644
index 0000000..c594310
--- /dev/null
+++ b/Shaders/shader-package.zip
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cbf454d1f1f0aca4c38f22e1b8339b3b1402e44c299340a4f0b064563286c4e2
+size 275676
diff --git a/Shaders/sharpen/fast-sharpen.glsl b/Shaders/sharpen/fast-sharpen.glsl
new file mode 100644
index 0000000..623fd6d
--- /dev/null
+++ b/Shaders/sharpen/fast-sharpen.glsl
@@ -0,0 +1,148 @@
+/*
+ Fast Sharpen Shader
+
+ Copyright (C) 2005 - 2019 guest(r) - guest.r@gmail.com
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#pragma parameter SHARPEN "Sharpen strength" 1.00 0.0 2.00 0.05
+#pragma parameter CONTR "Ammount of sharpening" 0.07 0.0 0.25 0.01
+#pragma parameter DETAILS "Details sharpened " 1.00 0.0 1.00 0.05
+
+#if defined(VERTEX)
+
+#if __VERSION__ >= 130
+#define COMPAT_VARYING out
+#define COMPAT_ATTRIBUTE in
+#define COMPAT_TEXTURE texture
+#else
+#define COMPAT_VARYING varying
+#define COMPAT_ATTRIBUTE attribute
+#define COMPAT_TEXTURE texture2D
+#endif
+
+#ifdef GL_ES
+#define COMPAT_PRECISION mediump
+#else
+#define COMPAT_PRECISION
+#endif
+
+COMPAT_ATTRIBUTE vec4 VertexCoord;
+COMPAT_ATTRIBUTE vec4 TexCoord;
+COMPAT_VARYING vec4 TEX0;
+
+vec4 _oPosition1;
+uniform mat4 MVPMatrix;
+uniform COMPAT_PRECISION int FrameDirection;
+uniform COMPAT_PRECISION int FrameCount;
+uniform COMPAT_PRECISION vec2 OutputSize;
+uniform COMPAT_PRECISION vec2 TextureSize;
+uniform COMPAT_PRECISION vec2 InputSize;
+COMPAT_VARYING vec2 g10;
+COMPAT_VARYING vec2 g01;
+COMPAT_VARYING vec2 g12;
+COMPAT_VARYING vec2 g21;
+
+// compatibility #defines
+#define vTexCoord TEX0.xy
+#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
+#define OutSize vec4(OutputSize, 1.0 / OutputSize)
+
+void main()
+{
+ gl_Position = MVPMatrix * VertexCoord;
+ TEX0.xy = TexCoord.xy * 1.00001;
+ g10 = vec2( 0.3333,-1.0)*SourceSize.zw;
+ g01 = vec2(-1.0,-0.3333)*SourceSize.zw;
+ g12 = vec2(-0.3333, 1.0)*SourceSize.zw;
+ g21 = vec2( 1.0, 0.3333)*SourceSize.zw;
+}
+
+#elif defined(FRAGMENT)
+
+#ifdef GL_ES
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+precision highp float;
+#else
+precision mediump float;
+#endif
+#define COMPAT_PRECISION mediump
+#else
+#define COMPAT_PRECISION
+#endif
+
+#if __VERSION__ >= 130
+#define COMPAT_VARYING in
+#define COMPAT_TEXTURE texture
+out COMPAT_PRECISION vec4 FragColor;
+#else
+#define COMPAT_VARYING varying
+#define FragColor gl_FragColor
+#define COMPAT_TEXTURE texture2D
+#endif
+
+uniform COMPAT_PRECISION int FrameDirection;
+uniform COMPAT_PRECISION int FrameCount;
+uniform COMPAT_PRECISION vec2 OutputSize;
+uniform COMPAT_PRECISION vec2 TextureSize;
+uniform COMPAT_PRECISION vec2 InputSize;
+uniform sampler2D Texture;
+COMPAT_VARYING vec4 TEX0;
+COMPAT_VARYING vec2 g10;
+COMPAT_VARYING vec2 g01;
+COMPAT_VARYING vec2 g12;
+COMPAT_VARYING vec2 g21;
+
+// compatibility #defines
+#define Source Texture
+#define vTexCoord TEX0.xy
+
+#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
+#define OutSize vec4(OutputSize, 1.0 / OutputSize)
+
+#ifdef PARAMETER_UNIFORM
+uniform COMPAT_PRECISION float SHARPEN;
+uniform COMPAT_PRECISION float CONTR;
+uniform COMPAT_PRECISION float DETAILS;
+#else
+#define SHARPEN 1.2
+#define CONTR 0.08
+#define DETAILS 1.0
+#endif
+
+void main()
+{
+ vec3 c10 = COMPAT_TEXTURE(Source, vTexCoord + g10).rgb;
+ vec3 c01 = COMPAT_TEXTURE(Source, vTexCoord + g01).rgb;
+ vec3 c21 = COMPAT_TEXTURE(Source, vTexCoord + g21).rgb;
+ vec3 c12 = COMPAT_TEXTURE(Source, vTexCoord + g12).rgb;
+ vec3 c11 = COMPAT_TEXTURE(Source, vTexCoord ).rgb;
+ vec3 b11 = (c10+c01+c12+c21)*0.25;
+
+ float contrast = max(max(c11.r,c11.g),c11.b);
+ contrast = mix(2.0*CONTR, CONTR, contrast);
+
+ vec3 mn1 = min(min(c10,c01),min(c12,c21)); mn1 = min(mn1,c11*(1.0-contrast));
+ vec3 mx1 = max(max(c10,c01),max(c12,c21)); mx1 = max(mx1,c11*(1.0+contrast));
+
+ vec3 dif = pow(mx1-mn1+0.0001, vec3(0.75,0.75,0.75));
+ vec3 sharpen = mix(vec3(SHARPEN*DETAILS), vec3(SHARPEN), dif);
+
+ c11 = clamp(mix(c11,b11,-sharpen), mn1,mx1);
+
+ FragColor = vec4(c11,1.0);
+}
+#endif
diff --git a/Shaders/smooth-chessboard-gray/smooth-chessboard-gray.glsl b/Shaders/smooth-chessboard-gray/smooth-chessboard-gray.glsl
new file mode 100644
index 0000000..0d647fd
--- /dev/null
+++ b/Shaders/smooth-chessboard-gray/smooth-chessboard-gray.glsl
@@ -0,0 +1,74 @@
+#if defined(VERTEX)
+
+attribute vec4 VertexCoord;
+attribute vec4 COLOR;
+attribute vec4 TexCoord;
+varying vec4 COL0;
+varying vec4 TEX0;
+
+vec4 _oPosition1;
+uniform mat4 MVPMatrix;
+uniform int FrameDirection;
+uniform int FrameCount;
+uniform vec2 OutputSize;
+uniform vec2 TextureSize;
+uniform vec2 InputSize;
+
+void main()
+{
+ vec4 _oColor;
+ vec2 _otexCoord;
+ gl_Position = VertexCoord.x * MVPMatrix[0] + VertexCoord.y * MVPMatrix[1] + VertexCoord.z * MVPMatrix[2] + VertexCoord.w * MVPMatrix[3];
+ _oPosition1 = gl_Position;
+ _oColor = COLOR;
+ _otexCoord = TexCoord.xy;
+ COL0 = COLOR;
+ TEX0.xy = TexCoord.xy;
+}
+
+#elif defined(FRAGMENT)
+
+#define BRIGHTNESS 0.5
+
+struct output_dummy {
+ vec4 _color;
+};
+
+uniform int FrameDirection;
+uniform int FrameCount;
+uniform vec2 OutputSize;
+uniform vec2 TextureSize;
+uniform vec2 InputSize;
+uniform sampler2D Texture;
+varying vec4 TEX0;
+//standard texture sample looks like this: texture2D(Texture, TEX0.xy);
+
+void main()
+{
+ vec4 myColor = texture2D(Texture, TEX0.xy);
+ mat4 neighbours = mat4(
+ texture2D(Texture, vec2(TEX0.x+1./TextureSize.x, TEX0.y)),
+ texture2D(Texture, vec2(TEX0.x-1./TextureSize.x, TEX0.y)),
+ texture2D(Texture, vec2(TEX0.x, TEX0.y+1./TextureSize.y)),
+ texture2D(Texture, vec2(TEX0.x, TEX0.y-1./TextureSize.y))
+ );
+ mat4 zero = mat4(
+ 0.,0.,0.,0.,
+ 0.,0.,0.,0.,
+ 0.,0.,0.,0.,
+ 0.,0.,0.,0.
+ );
+
+ if(length(myColor) == 0. && neighbours != zero){
+
+ myColor = ((neighbours[0] + neighbours[1] + neighbours[2] + neighbours[3]) / 4.) * BRIGHTNESS;
+
+ } else if (length(myColor) != 0. && neighbours == zero) {
+
+ myColor = myColor * BRIGHTNESS;
+
+ }
+ gl_FragColor = myColor;
+ return;
+}
+#endif
diff --git a/Shaders/windowed/lanczos2-sharp.glsl b/Shaders/windowed/lanczos2-sharp.glsl
new file mode 100644
index 0000000..5f83af3
--- /dev/null
+++ b/Shaders/windowed/lanczos2-sharp.glsl
@@ -0,0 +1,205 @@
+/*
+ Hyllian's jinc windowed-jinc 2-lobe sharper with anti-ringing Shader
+
+ Copyright (C) 2011-2016 Hyllian/Jararaca - sergiogdb@gmail.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+
+*/
+
+#define JINC2_WINDOW_SINC 0.5
+#define JINC2_SINC 1.0
+#define JINC2_AR_STRENGTH 0.8
+
+#define texCoord TEX0
+
+#if defined(VERTEX)
+
+#if __VERSION__ >= 130
+#define OUT out
+#define IN in
+#define tex2D texture
+#else
+#define OUT varying
+#define IN attribute
+#define tex2D texture2D
+#endif
+
+#ifdef GL_ES
+#define COMPAT_PRECISION mediump
+#else
+#define COMPAT_PRECISION
+#endif
+
+
+IN vec4 VertexCoord;
+IN vec4 Color;
+IN vec2 TexCoord;
+OUT vec4 color;
+OUT vec2 texCoord;
+
+uniform mat4 MVPMatrix;
+uniform COMPAT_PRECISION int FrameDirection;
+uniform COMPAT_PRECISION int FrameCount;
+uniform COMPAT_PRECISION vec2 OutputSize;
+uniform COMPAT_PRECISION vec2 TextureSize;
+uniform COMPAT_PRECISION vec2 InputSize;
+
+void main()
+{
+ gl_Position = MVPMatrix * VertexCoord;
+ color = Color;
+ texCoord = TexCoord;
+}
+
+#elif defined(FRAGMENT)
+
+#if __VERSION__ >= 130
+#define IN in
+#define tex2D texture
+out vec4 FragColor;
+#else
+#define IN varying
+#define FragColor gl_FragColor
+#define tex2D texture2D
+#endif
+
+#ifdef GL_ES
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+precision highp float;
+#else
+precision mediump float;
+#endif
+#define COMPAT_PRECISION mediump
+#else
+#define COMPAT_PRECISION
+#endif
+
+uniform COMPAT_PRECISION int FrameDirection;
+uniform COMPAT_PRECISION int FrameCount;
+uniform COMPAT_PRECISION vec2 OutputSize;
+uniform COMPAT_PRECISION vec2 TextureSize;
+uniform COMPAT_PRECISION vec2 InputSize;
+uniform sampler2D s_p;
+IN vec2 texCoord;
+
+const float halfpi = 1.5707963267948966192313216916398;
+const float pi = 3.1415926535897932384626433832795;
+const float wa = JINC2_WINDOW_SINC*pi;
+const float wb = JINC2_SINC*pi;
+
+// Calculates the distance between two points
+float d(vec2 pt1, vec2 pt2)
+{
+ vec2 v = pt2 - pt1;
+ return sqrt(dot(v,v));
+}
+
+vec3 min4(vec3 a, vec3 b, vec3 c, vec3 d)
+{
+ return min(a, min(b, min(c, d)));
+}
+
+vec3 max4(vec3 a, vec3 b, vec3 c, vec3 d)
+{
+ return max(a, max(b, max(c, d)));
+}
+
+vec4 resampler(vec4 x)
+{
+ vec4 res;
+
+ res.x = (x.x==0.0) ? wa*wb : sin(x.x*wa)*sin(x.x*wb)/(x.x*x.x);
+ res.y = (x.y==0.0) ? wa*wb : sin(x.y*wa)*sin(x.y*wb)/(x.y*x.y);
+ res.z = (x.z==0.0) ? wa*wb : sin(x.z*wa)*sin(x.z*wb)/(x.z*x.z);
+ res.w = (x.w==0.0) ? wa*wb : sin(x.w*wa)*sin(x.w*wb)/(x.w*x.w);
+
+ return res;
+}
+
+void main()
+{
+
+ vec3 color;
+ vec4 weights[4];
+
+ vec2 dx = vec2(1.0, 0.0);
+ vec2 dy = vec2(0.0, 1.0);
+
+ vec2 pc = texCoord*TextureSize;
+
+ vec2 tc = (floor(pc-vec2(0.5,0.5))+vec2(0.5,0.5));
+
+ weights[0] = resampler(vec4(d(pc, tc -dx -dy), d(pc, tc -dy), d(pc, tc +dx -dy), d(pc, tc+2.0*dx -dy)));
+ weights[1] = resampler(vec4(d(pc, tc -dx ), d(pc, tc ), d(pc, tc +dx ), d(pc, tc+2.0*dx )));
+ weights[2] = resampler(vec4(d(pc, tc -dx +dy), d(pc, tc +dy), d(pc, tc +dx +dy), d(pc, tc+2.0*dx +dy)));
+ weights[3] = resampler(vec4(d(pc, tc -dx+2.0*dy), d(pc, tc +2.0*dy), d(pc, tc +dx+2.0*dy), d(pc, tc+2.0*dx+2.0*dy)));
+
+ dx = dx/TextureSize;
+ dy = dy/TextureSize;
+ tc = tc/TextureSize;
+
+ vec3 c00 = tex2D(s_p, tc -dx -dy).xyz;
+ vec3 c10 = tex2D(s_p, tc -dy).xyz;
+ vec3 c20 = tex2D(s_p, tc +dx -dy).xyz;
+ vec3 c30 = tex2D(s_p, tc+2.0*dx -dy).xyz;
+ vec3 c01 = tex2D(s_p, tc -dx ).xyz;
+ vec3 c11 = tex2D(s_p, tc ).xyz;
+ vec3 c21 = tex2D(s_p, tc +dx ).xyz;
+ vec3 c31 = tex2D(s_p, tc+2.0*dx ).xyz;
+ vec3 c02 = tex2D(s_p, tc -dx +dy).xyz;
+ vec3 c12 = tex2D(s_p, tc +dy).xyz;
+ vec3 c22 = tex2D(s_p, tc +dx +dy).xyz;
+ vec3 c32 = tex2D(s_p, tc+2.0*dx +dy).xyz;
+ vec3 c03 = tex2D(s_p, tc -dx+2.0*dy).xyz;
+ vec3 c13 = tex2D(s_p, tc +2.0*dy).xyz;
+ vec3 c23 = tex2D(s_p, tc +dx+2.0*dy).xyz;
+ vec3 c33 = tex2D(s_p, tc+2.0*dx+2.0*dy).xyz;
+
+ color = tex2D(s_p, texCoord).xyz;
+
+ // Get min/max samples
+ vec3 min_sample = min4(c11, c21, c12, c22);
+ vec3 max_sample = max4(c11, c21, c12, c22);
+/*
+ color = mat4x3(c00, c10, c20, c30) * weights[0];
+ color+= mat4x3(c01, c11, c21, c31) * weights[1];
+ color+= mat4x3(c02, c12, c22, c32) * weights[2];
+ color+= mat4x3(c03, c13, c23, c33) * weights[3];
+ mat4 wgts = mat4(weights[0], weights[1], weights[2], weights[3]);
+ vec4 wsum = wgts * vec4(1.0,1.0,1.0,1.0);
+ color = color/(dot(wsum, vec4(1.0,1.0,1.0,1.0)));
+*/
+
+
+ color = vec3(dot(weights[0], vec4(c00.x, c10.x, c20.x, c30.x)), dot(weights[0], vec4(c00.y, c10.y, c20.y, c30.y)), dot(weights[0], vec4(c00.z, c10.z, c20.z, c30.z)));
+ color+= vec3(dot(weights[1], vec4(c01.x, c11.x, c21.x, c31.x)), dot(weights[1], vec4(c01.y, c11.y, c21.y, c31.y)), dot(weights[1], vec4(c01.z, c11.z, c21.z, c31.z)));
+ color+= vec3(dot(weights[2], vec4(c02.x, c12.x, c22.x, c32.x)), dot(weights[2], vec4(c02.y, c12.y, c22.y, c32.y)), dot(weights[2], vec4(c02.z, c12.z, c22.z, c32.z)));
+ color+= vec3(dot(weights[3], vec4(c03.x, c13.x, c23.x, c33.x)), dot(weights[3], vec4(c03.y, c13.y, c23.y, c33.y)), dot(weights[3], vec4(c03.z, c13.z, c23.z, c33.z)));
+ color = color/(dot(weights[0], vec4(1,1,1,1)) + dot(weights[1], vec4(1,1,1,1)) + dot(weights[2], vec4(1,1,1,1)) + dot(weights[3], vec4(1,1,1,1)));
+
+ // Anti-ringing
+ vec3 aux = color;
+ color = clamp(color, min_sample, max_sample);
+ color = mix(aux, color, JINC2_AR_STRENGTH);
+
+ // final sum and weight normalization
+ FragColor.xyz = color;
+}
+#endif
diff --git a/Shaders/xbr/xbr-lv2-noblend.glsl b/Shaders/xbr/xbr-lv2-noblend.glsl
new file mode 100644
index 0000000..bbc2aae
--- /dev/null
+++ b/Shaders/xbr/xbr-lv2-noblend.glsl
@@ -0,0 +1,300 @@
+#version 130
+
+/*
+ Hyllian's xBR-lv2-noblend Shader
+
+ Copyright (C) 2011-2016 Hyllian - sergiogdb@gmail.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+
+ Incorporates some of the ideas from SABR shader. Thanks to Joshua Street.
+*/
+
+#pragma parameter XBR_EQ_THRESHOLD "Eq Threshold" 0.6 0.0 2.0 0.1
+#pragma parameter XBR_LV2_COEFFICIENT "Lv2 Coefficient" 2.0 1.0 3.0 0.1
+
+#define mul(a,b) (b*a)
+
+// Uncomment just one of the three params below to choose the corner detection
+#define CORNER_A
+//#define CORNER_B
+//#define CORNER_C
+//#define CORNER_D
+
+#define lv2_cf XBR_LV2_COEFFICIENT
+
+#define texCoord TEX0
+#define t1 TEX1
+#define t2 TEX2
+#define t3 TEX3
+#define t4 TEX4
+#define t5 TEX5
+#define t6 TEX6
+#define t7 TEX7
+
+#if defined(VERTEX)
+
+#if __VERSION__ >= 130
+#define OUT out
+#define IN in
+#define tex2D texture
+#else
+#define OUT varying
+#define IN attribute
+#define tex2D texture2D
+#endif
+
+#ifdef GL_ES
+#define PRECISION mediump
+#else
+#define PRECISION
+#endif
+
+
+IN vec4 VertexCoord;
+IN vec4 Color;
+IN vec2 TexCoord;
+
+OUT vec4 color;
+OUT vec2 texCoord;
+OUT vec4 t1;
+OUT vec4 t2;
+OUT vec4 t3;
+OUT vec4 t4;
+OUT vec4 t5;
+OUT vec4 t6;
+OUT vec4 t7;
+
+uniform mat4 MVPMatrix;
+uniform PRECISION int FrameDirection;
+uniform PRECISION int FrameCount;
+uniform PRECISION vec2 OutputSize;
+uniform PRECISION vec2 TextureSize;
+uniform PRECISION vec2 InputSize;
+
+void main()
+{
+ gl_Position = MVPMatrix * VertexCoord;
+ color = Color;
+
+ float dx = (1.0/TextureSize.x);
+ float dy = (1.0/TextureSize.y);
+
+ texCoord = TexCoord;
+ texCoord.x *= 1.00000001;
+ t1 = TexCoord.xxxy + vec4( -dx, 0, dx,-2.0*dy); // A1 B1 C1
+ t2 = TexCoord.xxxy + vec4( -dx, 0, dx, -dy); // A B C
+ t3 = TexCoord.xxxy + vec4( -dx, 0, dx, 0); // D E F
+ t4 = TexCoord.xxxy + vec4( -dx, 0, dx, dy); // G H I
+ t5 = TexCoord.xxxy + vec4( -dx, 0, dx, 2.0*dy); // G5 H5 I5
+ t6 = TexCoord.xyyy + vec4(-2.0*dx,-dy, 0, dy); // A0 D0 G0
+ t7 = TexCoord.xyyy + vec4( 2.0*dx,-dy, 0, dy); // C4 F4 I4
+}
+
+
+#elif defined(FRAGMENT)
+
+#if __VERSION__ >= 130
+#define IN in
+#define tex2D texture
+out vec4 FragColor;
+#else
+#define IN varying
+#define FragColor gl_FragColor
+#define tex2D texture2D
+#endif
+
+#ifdef GL_ES
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+precision highp float;
+#else
+precision mediump float;
+#endif
+#define PRECISION mediump
+#else
+#define PRECISION
+#endif
+
+uniform PRECISION int FrameDirection;
+uniform PRECISION int FrameCount;
+uniform PRECISION vec2 OutputSize;
+uniform PRECISION vec2 TextureSize;
+uniform PRECISION vec2 InputSize;
+uniform sampler2D decal;
+IN vec2 texCoord;
+IN vec4 t1;
+IN vec4 t2;
+IN vec4 t3;
+IN vec4 t4;
+IN vec4 t5;
+IN vec4 t6;
+IN vec4 t7;
+
+#ifdef PARAMETER_UNIFORM
+uniform PRECISION float XBR_EQ_THRESHOLD;
+uniform PRECISION float XBR_LV2_COEFFICIENT;
+#else
+#define XBR_EQ_THRESHOLD 0.6
+#define XBR_LV2_COEFFICIENT 2.0
+#endif
+// END PARAMETERS //
+
+const vec3 Y = vec3(0.2126, 0.7152, 0.0722);
+
+// Difference between vector components.
+vec4 df(vec4 A, vec4 B)
+{
+ return vec4(abs(A-B));
+}
+
+// Compare two vectors and return their components are different.
+vec4 diff(vec4 A, vec4 B)
+{
+ return vec4(notEqual(A, B));
+}
+
+// Determine if two vector components are equal based on a threshold.
+vec4 eq(vec4 A, vec4 B)
+{
+ return (step(df(A, B), vec4(XBR_EQ_THRESHOLD)));
+}
+
+// Determine if two vector components are NOT equal based on a threshold.
+vec4 neq(vec4 A, vec4 B)
+{
+ return (vec4(1.0, 1.0, 1.0, 1.0) - eq(A, B));
+}
+
+// Weighted distance.
+vec4 wd(vec4 a, vec4 b, vec4 c, vec4 d, vec4 e, vec4 f, vec4 g, vec4 h)
+{
+ return (df(a,b) + df(a,c) + df(d,e) + df(d,f) + 4.0*df(g,h));
+}
+
+vec4 weighted_distance(vec4 a, vec4 b, vec4 c, vec4 d, vec4 e, vec4 f, vec4 g, vec4 h, vec4 i, vec4 j, vec4 k, vec4 l)
+{
+ return (df(a,b) + df(a,c) + df(d,e) + df(d,f) + df(i,j) + df(k,l) + 2.0*df(g,h));
+}
+
+float c_df(vec3 c1, vec3 c2)
+{
+ vec3 df = abs(c1 - c2);
+ return df.r + df.g + df.b;
+}
+
+void main()
+{
+ vec4 edri, edr, edr_l, edr_u; // px = pixel, edr = edge detection rule
+ vec4 irlv1, irlv2l, irlv2u, block_3d;
+ bvec4 nc, px;
+ vec4 fx, fx_l, fx_u; // inequations of straight lines.
+
+ vec2 fp = fract(texCoord*TextureSize);
+
+ vec3 A1 = tex2D(decal, t1.xw ).xyz;
+ vec3 B1 = tex2D(decal, t1.yw ).xyz;
+ vec3 C1 = tex2D(decal, t1.zw ).xyz;
+ vec3 A = tex2D(decal, t2.xw ).xyz;
+ vec3 B = tex2D(decal, t2.yw ).xyz;
+ vec3 C = tex2D(decal, t2.zw ).xyz;
+ vec3 D = tex2D(decal, t3.xw ).xyz;
+ vec3 E = tex2D(decal, t3.yw ).xyz;
+ vec3 F = tex2D(decal, t3.zw ).xyz;
+ vec3 G = tex2D(decal, t4.xw ).xyz;
+ vec3 H = tex2D(decal, t4.yw ).xyz;
+ vec3 I = tex2D(decal, t4.zw ).xyz;
+ vec3 G5 = tex2D(decal, t5.xw ).xyz;
+ vec3 H5 = tex2D(decal, t5.yw ).xyz;
+ vec3 I5 = tex2D(decal, t5.zw ).xyz;
+ vec3 A0 = tex2D(decal, t6.xy ).xyz;
+ vec3 D0 = tex2D(decal, t6.xz ).xyz;
+ vec3 G0 = tex2D(decal, t6.xw ).xyz;
+ vec3 C4 = tex2D(decal, t7.xy ).xyz;
+ vec3 F4 = tex2D(decal, t7.xz ).xyz;
+ vec3 I4 = tex2D(decal, t7.xw ).xyz;
+
+ vec4 b = mul( mat4x3(B, D, H, F), Y );
+ vec4 c = mul( mat4x3(C, A, G, I), Y );
+ vec4 e = mul( mat4x3(E, E, E, E), Y );
+ vec4 d = b.yzwx;
+ vec4 f = b.wxyz;
+ vec4 g = c.zwxy;
+ vec4 h = b.zwxy;
+ vec4 i = c.wxyz;
+
+ vec4 i4 = mul( mat4x3(I4, C1, A0, G5), Y );
+ vec4 i5 = mul( mat4x3(I5, C4, A1, G0), Y );
+ vec4 h5 = mul( mat4x3(H5, F4, B1, D0), Y );
+ vec4 f4 = h5.yzwx;
+
+ vec4 Ao = vec4( 1.0, -1.0, -1.0, 1.0 );
+ vec4 Bo = vec4( 1.0, 1.0, -1.0,-1.0 );
+ vec4 Co = vec4( 1.5, 0.5, -0.5, 0.5 );
+ vec4 Ax = vec4( 1.0, -1.0, -1.0, 1.0 );
+ vec4 Bx = vec4( 0.5, 2.0, -0.5,-2.0 );
+ vec4 Cx = vec4( 1.0, 1.0, -0.5, 0.0 );
+ vec4 Ay = vec4( 1.0, -1.0, -1.0, 1.0 );
+ vec4 By = vec4( 2.0, 0.5, -2.0,-0.5 );
+ vec4 Cy = vec4( 2.0, 0.0, -1.0, 0.5 );
+
+ // These inequations define the line below which interpolation occurs.
+ fx = vec4(greaterThan(Ao*fp.y+Bo*fp.x, Co));
+ fx_l = vec4(greaterThan(Ax*fp.y+Bx*fp.x, Cx));
+ fx_u = vec4(greaterThan(Ay*fp.y+By*fp.x, Cy));
+
+#ifdef CORNER_A
+ irlv1 = diff(e,f) * diff(e,h);
+#endif
+#ifdef CORNER_B
+ irlv1 = (neq(f,b) * neq(h,d) + eq(e,i) * neq(f,i4) * neq(h,i5) + eq(e,g) + eq(e,c));
+#endif
+#ifdef CORNER_D
+ vec4 c1 = i4.yzwx;
+ vec4 g0 = i5.wxyz;
+ irlv1 = (neq(f,b) * neq(h,d) + eq(e,i) * neq(f,i4) * neq(h,i5) + eq(e,g) + eq(e,c) ) * (diff(f,f4) * diff(f,i) + diff(h,h5) * diff(h,i) + diff(h,g) + diff(f,c) + eq(b,c1) * eq(d,g0));
+#endif
+#ifdef CORNER_C
+ irlv1 = (neq(f,b) * neq(f,c) + neq(h,d) * neq(h,g) + eq(e,i) * (neq(f,f4) * neq(f,i4) + neq(h,h5) * neq(h,i5)) + eq(e,g) + eq(e,c));
+#endif
+
+ irlv2l = diff(e,g) * diff(d,g);
+ irlv2u = diff(e,c) * diff(b,c);
+
+ vec4 wd1 = wd( e, c, g, i, h5, f4, h, f);
+ vec4 wd2 = wd( h, d, i5, f, i4, b, e, i);
+
+ edri = step(wd1, wd2) * irlv1;
+ edr = step(wd1 + vec4(0.1, 0.1, 0.1, 0.1), wd2) * step(vec4(0.5, 0.5, 0.5, 0.5), irlv1);
+ edr_l = step( lv2_cf*df(f,g), df(h,c) ) * irlv2l * edr;
+ edr_u = step( lv2_cf*df(h,c), df(f,g) ) * irlv2u * edr;
+
+ nc = bvec4( edr * ( fx + edr_l * (fx_l)) + edr_u * fx_u);
+
+ px = lessThanEqual(df(e, f), df(e, h));
+
+ vec3 res1 = nc.x ? px.x ? F : H : nc.y ? px.y ? B : F : nc.z ? px.z ? D : B : E;
+ vec3 res2 = nc.w ? px.w ? H : D : nc.z ? px.z ? D : B : nc.y ? px.y ? B : F : E;
+
+ vec2 df12 = abs( mul( mat2x3(res1, res2), Y ) - e.xy);
+
+ vec3 res = mix(res1, res2, step(df12.x, df12.y));
+
+ FragColor.xyz = res;
+}
+#endif
diff --git a/Shaders/xbrz/xbrz-freescale.glsl b/Shaders/xbrz/xbrz-freescale.glsl
new file mode 100644
index 0000000..3cc9edd
--- /dev/null
+++ b/Shaders/xbrz/xbrz-freescale.glsl
@@ -0,0 +1,375 @@
+/*
+ Hyllian's xBR-vertex code and texel mapping
+
+ Copyright (C) 2011/2016 Hyllian - sergiogdb@gmail.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+
+*/
+
+// This shader also uses code and/or concepts from xBRZ as it appears
+// in the Desmume source code. The license for which is as follows:
+
+// ****************************************************************************
+// * This file is part of the HqMAME project. It is distributed under *
+// * GNU General Public License: http://www.gnu.org/licenses/gpl-3.0 *
+// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved *
+// * *
+// * Additionally and as a special exception, the author gives permission *
+// * to link the code of this program with the MAME library (or with modified *
+// * versions of MAME that use the same license as MAME), and distribute *
+// * linked combinations including the two. You must obey the GNU General *
+// * Public License in all respects for all of the code used other than MAME. *
+// * If you modify this file, you may extend this exception to your version *
+// * of the file, but you are not obligated to do so. If you do not wish to *
+// * do so, delete this exception statement from your version. *
+// ****************************************************************************
+
+#if defined(VERTEX)
+
+#if __VERSION__ >= 130
+#define COMPAT_VARYING out
+#define COMPAT_ATTRIBUTE in
+#define COMPAT_TEXTURE texture
+#else
+#define COMPAT_VARYING varying
+#define COMPAT_ATTRIBUTE attribute
+#define COMPAT_TEXTURE texture2D
+#endif
+
+#ifdef GL_ES
+#define COMPAT_PRECISION mediump
+#else
+#define COMPAT_PRECISION
+#endif
+
+COMPAT_ATTRIBUTE vec4 VertexCoord;
+COMPAT_ATTRIBUTE vec4 COLOR;
+COMPAT_ATTRIBUTE vec4 TexCoord;
+COMPAT_VARYING vec4 COL0;
+COMPAT_VARYING vec4 TEX0;
+
+vec4 _oPosition1;
+uniform mat4 MVPMatrix;
+uniform COMPAT_PRECISION int FrameDirection;
+uniform COMPAT_PRECISION int FrameCount;
+uniform COMPAT_PRECISION vec2 OutputSize;
+uniform COMPAT_PRECISION vec2 TextureSize;
+uniform COMPAT_PRECISION vec2 InputSize;
+
+// compatibility #defines
+#define vTexCoord TEX0.xy
+#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
+#define OutSize vec4(OutputSize, 1.0 / OutputSize)
+
+#ifdef PARAMETER_UNIFORM
+uniform COMPAT_PRECISION float WHATEVER;
+#else
+#define WHATEVER 0.0
+#endif
+
+void main()
+{
+ gl_Position = MVPMatrix * VertexCoord;
+ TEX0.xy = TexCoord.xy * 1.0001;
+}
+
+#elif defined(FRAGMENT)
+
+#ifdef GL_ES
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+precision highp float;
+#else
+precision mediump float;
+#endif
+#define COMPAT_PRECISION mediump
+#else
+#define COMPAT_PRECISION
+#endif
+
+#if __VERSION__ >= 130
+#define COMPAT_VARYING in
+#define COMPAT_TEXTURE texture
+out COMPAT_PRECISION vec4 FragColor;
+#else
+#define COMPAT_VARYING varying
+#define FragColor gl_FragColor
+#define COMPAT_TEXTURE texture2D
+#endif
+
+uniform COMPAT_PRECISION int FrameDirection;
+uniform COMPAT_PRECISION int FrameCount;
+uniform COMPAT_PRECISION vec2 OutputSize;
+uniform COMPAT_PRECISION vec2 TextureSize;
+uniform COMPAT_PRECISION vec2 InputSize;
+uniform sampler2D Texture;
+COMPAT_VARYING vec4 TEX0;
+
+// compatibility #defines
+#define Source Texture
+#define vTexCoord TEX0.xy
+
+#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
+#define OutSize vec4(OutputSize, 1.0 / OutputSize)
+
+#define BLEND_NONE 0
+#define BLEND_NORMAL 1
+#define BLEND_DOMINANT 2
+#define LUMINANCE_WEIGHT 1.0
+#define EQUAL_COLOR_TOLERANCE 30.0/255.0
+#define STEEP_DIRECTION_THRESHOLD 2.2
+#define DOMINANT_DIRECTION_THRESHOLD 3.6
+
+float DistYCbCr(vec3 pixA, vec3 pixB)
+{
+ const vec3 w = vec3(0.2627, 0.6780, 0.0593);
+ const float scaleB = 0.5 / (1.0 - w.b);
+ const float scaleR = 0.5 / (1.0 - w.r);
+ vec3 diff = pixA - pixB;
+ float Y = dot(diff.rgb, w);
+ float Cb = scaleB * (diff.b - Y);
+ float Cr = scaleR * (diff.r - Y);
+
+ return sqrt(((LUMINANCE_WEIGHT * Y) * (LUMINANCE_WEIGHT * Y)) + (Cb * Cb) + (Cr * Cr));
+}
+
+bool IsPixEqual(const vec3 pixA, const vec3 pixB)
+{
+ return (DistYCbCr(pixA, pixB) < EQUAL_COLOR_TOLERANCE);
+}
+
+float get_left_ratio(vec2 center, vec2 origin, vec2 direction, vec2 scale)
+{
+ vec2 P0 = center - origin;
+ vec2 proj = direction * (dot(P0, direction) / dot(direction, direction));
+ vec2 distv = P0 - proj;
+ vec2 orth = vec2(-direction.y, direction.x);
+ float side = sign(dot(P0, orth));
+ float v = side * length(distv * scale);
+
+// return step(0, v);
+ return smoothstep(-sqrt(2.0)/2.0, sqrt(2.0)/2.0, v);
+}
+
+#define eq(a,b) (a == b)
+#define neq(a,b) (a != b)
+
+#define P(x,y) COMPAT_TEXTURE(Source, coord + SourceSize.zw * vec2(x, y)).rgb
+
+void main()
+{
+ //---------------------------------------
+ // Input Pixel Mapping: -|x|x|x|-
+ // x|A|B|C|x
+ // x|D|E|F|x
+ // x|G|H|I|x
+ // -|x|x|x|-
+
+ vec2 scale = OutputSize.xy * SourceSize.zw;
+ vec2 pos = fract(vTexCoord * SourceSize.xy) - vec2(0.5, 0.5);
+ vec2 coord = vTexCoord - pos * SourceSize.zw;
+
+ vec3 A = P(-1.,-1.);
+ vec3 B = P( 0.,-1.);
+ vec3 C = P( 1.,-1.);
+ vec3 D = P(-1., 0.);
+ vec3 E = P( 0., 0.);
+ vec3 F = P( 1., 0.);
+ vec3 G = P(-1., 1.);
+ vec3 H = P( 0., 1.);
+ vec3 I = P( 1., 1.);
+
+ // blendResult Mapping: x|y|
+ // w|z|
+ ivec4 blendResult = ivec4(BLEND_NONE,BLEND_NONE,BLEND_NONE,BLEND_NONE);
+
+ // Preprocess corners
+ // Pixel Tap Mapping: -|-|-|-|-
+ // -|-|B|C|-
+ // -|D|E|F|x
+ // -|G|H|I|x
+ // -|-|x|x|-
+ if (!((eq(E,F) && eq(H,I)) || (eq(E,H) && eq(F,I))))
+ {
+ float dist_H_F = DistYCbCr(G, E) + DistYCbCr(E, C) + DistYCbCr(P(0,2), I) + DistYCbCr(I, P(2.,0.)) + (4.0 * DistYCbCr(H, F));
+ float dist_E_I = DistYCbCr(D, H) + DistYCbCr(H, P(1,2)) + DistYCbCr(B, F) + DistYCbCr(F, P(2.,1.)) + (4.0 * DistYCbCr(E, I));
+ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_H_F) < dist_E_I;
+ blendResult.z = ((dist_H_F < dist_E_I) && neq(E,F) && neq(E,H)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;
+ }
+
+
+ // Pixel Tap Mapping: -|-|-|-|-
+ // -|A|B|-|-
+ // x|D|E|F|-
+ // x|G|H|I|-
+ // -|x|x|-|-
+ if (!((eq(D,E) && eq(G,H)) || (eq(D,G) && eq(E,H))))
+ {
+ float dist_G_E = DistYCbCr(P(-2.,1.) , D) + DistYCbCr(D, B) + DistYCbCr(P(-1.,2.), H) + DistYCbCr(H, F) + (4.0 * DistYCbCr(G, E));
+ float dist_D_H = DistYCbCr(P(-2.,0.) , G) + DistYCbCr(G, P(0.,2.)) + DistYCbCr(A, E) + DistYCbCr(E, I) + (4.0 * DistYCbCr(D, H));
+ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_D_H) < dist_G_E;
+ blendResult.w = ((dist_G_E > dist_D_H) && neq(E,D) && neq(E,H)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;
+ }
+
+ // Pixel Tap Mapping: -|-|x|x|-
+ // -|A|B|C|x
+ // -|D|E|F|x
+ // -|-|H|I|-
+ // -|-|-|-|-
+ if (!((eq(B,C) && eq(E,F)) || (eq(B,E) && eq(C,F))))
+ {
+ float dist_E_C = DistYCbCr(D, B) + DistYCbCr(B, P(1.,-2.)) + DistYCbCr(H, F) + DistYCbCr(F, P(2.,-1.)) + (4.0 * DistYCbCr(E, C));
+ float dist_B_F = DistYCbCr(A, E) + DistYCbCr(E, I) + DistYCbCr(P(0.,-2.), C) + DistYCbCr(C, P(2.,0.)) + (4.0 * DistYCbCr(B, F));
+ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_B_F) < dist_E_C;
+ blendResult.y = ((dist_E_C > dist_B_F) && neq(E,B) && neq(E,F)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;
+ }
+
+ // Pixel Tap Mapping: -|x|x|-|-
+ // x|A|B|C|-
+ // x|D|E|F|-
+ // -|G|H|-|-
+ // -|-|-|-|-
+ if (!((eq(A,B) && eq(D,E)) || (eq(A,D) && eq(B,E))))
+ {
+ float dist_D_B = DistYCbCr(P(-2.,0.), A) + DistYCbCr(A, P(0.,-2.)) + DistYCbCr(G, E) + DistYCbCr(E, C) + (4.0 * DistYCbCr(D, B));
+ float dist_A_E = DistYCbCr(P(-2.,-1.), D) + DistYCbCr(D, H) + DistYCbCr(P(-1.,-2.), B) + DistYCbCr(B, F) + (4.0 * DistYCbCr(A, E));
+ bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_D_B) < dist_A_E;
+ blendResult.x = ((dist_D_B < dist_A_E) && neq(E,D) && neq(E,B)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;
+ }
+
+ vec3 res = E;
+
+ // Pixel Tap Mapping: -|-|-|-|-
+ // -|-|B|C|-
+ // -|D|E|F|x
+ // -|G|H|I|x
+ // -|-|x|x|-
+ if(blendResult.z != BLEND_NONE)
+ {
+ float dist_F_G = DistYCbCr(F, G);
+ float dist_H_C = DistYCbCr(H, C);
+ bool doLineBlend = (blendResult.z == BLEND_DOMINANT ||
+ !((blendResult.y != BLEND_NONE && !IsPixEqual(E, G)) || (blendResult.w != BLEND_NONE && !IsPixEqual(E, C)) ||
+ (IsPixEqual(G, H) && IsPixEqual(H, I) && IsPixEqual(I, F) && IsPixEqual(F, C) && !IsPixEqual(E, I))));
+
+ vec2 origin = vec2(0.0, 1.0 / sqrt(2.0));
+ vec2 direction = vec2(1.0, -1.0);
+ if(doLineBlend)
+ {
+ bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_F_G <= dist_H_C) && neq(E,G) && neq(D,G);
+ bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_H_C <= dist_F_G) && neq(E,C) && neq(B,C);
+ origin = haveShallowLine? vec2(0.0, 0.25) : vec2(0.0, 0.5);
+ direction.x += haveShallowLine? 1.0: 0.0;
+ direction.y -= haveSteepLine? 1.0: 0.0;
+ }
+
+ vec3 blendPix = mix(H,F, step(DistYCbCr(E, F), DistYCbCr(E, H)));
+ res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale));
+ }
+
+ // Pixel Tap Mapping: -|-|-|-|-
+ // -|A|B|-|-
+ // x|D|E|F|-
+ // x|G|H|I|-
+ // -|x|x|-|-
+ if(blendResult.w != BLEND_NONE)
+ {
+ float dist_H_A = DistYCbCr(H, A);
+ float dist_D_I = DistYCbCr(D, I);
+ bool doLineBlend = (blendResult.w == BLEND_DOMINANT ||
+ !((blendResult.z != BLEND_NONE && !IsPixEqual(E, A)) || (blendResult.x != BLEND_NONE && !IsPixEqual(E, I)) ||
+ (IsPixEqual(A, D) && IsPixEqual(D, G) && IsPixEqual(G, H) && IsPixEqual(H, I) && !IsPixEqual(E, G))));
+
+ vec2 origin = vec2(-1.0 / sqrt(2.0), 0.0);
+ vec2 direction = vec2(1.0, 1.0);
+ if(doLineBlend)
+ {
+ bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_H_A <= dist_D_I) && neq(E,A) && neq(B,A);
+ bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_D_I <= dist_H_A) && neq(E,I) && neq(F,I);
+ origin = haveShallowLine? vec2(-0.25, 0.0) : vec2(-0.5, 0.0);
+ direction.y += haveShallowLine? 1.0: 0.0;
+ direction.x += haveSteepLine? 1.0: 0.0;
+ }
+ origin = origin;
+ direction = direction;
+
+ vec3 blendPix = mix(H,D, step(DistYCbCr(E, D), DistYCbCr(E, H)));
+ res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale));
+ }
+
+ // Pixel Tap Mapping: -|-|x|x|-
+ // -|A|B|C|x
+ // -|D|E|F|x
+ // -|-|H|I|-
+ // -|-|-|-|-
+ if(blendResult.y != BLEND_NONE)
+ {
+ float dist_B_I = DistYCbCr(B, I);
+ float dist_F_A = DistYCbCr(F, A);
+ bool doLineBlend = (blendResult.y == BLEND_DOMINANT ||
+ !((blendResult.x != BLEND_NONE && !IsPixEqual(E, I)) || (blendResult.z != BLEND_NONE && !IsPixEqual(E, A)) ||
+ (IsPixEqual(I, F) && IsPixEqual(F, C) && IsPixEqual(C, B) && IsPixEqual(B, A) && !IsPixEqual(E, C))));
+
+ vec2 origin = vec2(1.0 / sqrt(2.0), 0.0);
+ vec2 direction = vec2(-1.0, -1.0);
+
+ if(doLineBlend)
+ {
+ bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_B_I <= dist_F_A) && neq(E,I) && neq(H,I);
+ bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_F_A <= dist_B_I) && neq(E,A) && neq(D,A);
+ origin = haveShallowLine? vec2(0.25, 0.0) : vec2(0.5, 0.0);
+ direction.y -= haveShallowLine? 1.0: 0.0;
+ direction.x -= haveSteepLine? 1.0: 0.0;
+ }
+
+ vec3 blendPix = mix(F,B, step(DistYCbCr(E, B), DistYCbCr(E, F)));
+ res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale));
+ }
+
+ // Pixel Tap Mapping: -|x|x|-|-
+ // x|A|B|C|-
+ // x|D|E|F|-
+ // -|G|H|-|-
+ // -|-|-|-|-
+ if(blendResult.x != BLEND_NONE)
+ {
+ float dist_D_C = DistYCbCr(D, C);
+ float dist_B_G = DistYCbCr(B, G);
+ bool doLineBlend = (blendResult.x == BLEND_DOMINANT ||
+ !((blendResult.w != BLEND_NONE && !IsPixEqual(E, C)) || (blendResult.y != BLEND_NONE && !IsPixEqual(E, G)) ||
+ (IsPixEqual(C, B) && IsPixEqual(B, A) && IsPixEqual(A, D) && IsPixEqual(D, G) && !IsPixEqual(E, A))));
+
+ vec2 origin = vec2(0.0, -1.0 / sqrt(2.0));
+ vec2 direction = vec2(-1.0, 1.0);
+ if(doLineBlend)
+ {
+ bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_D_C <= dist_B_G) && neq(E,C) && neq(F,C);
+ bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_B_G <= dist_D_C) && neq(E,G) && neq(H,G);
+ origin = haveShallowLine? vec2(0.0, -0.25) : vec2(0.0, -0.5);
+ direction.x -= haveShallowLine? 1.0: 0.0;
+ direction.y += haveSteepLine? 1.0: 0.0;
+ }
+
+ vec3 blendPix = mix(D,B, step(DistYCbCr(E, B), DistYCbCr(E, D)));
+ res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale));
+ }
+
+ FragColor = vec4(res, 1.0);
+}
+#endif
diff --git a/TADemo/3DTA.exe b/TADemo/3DTA.exe
new file mode 100644
index 0000000..927e22b
--- /dev/null
+++ b/TADemo/3DTA.exe
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a9917e96c903a92bea03b6d5661d1115e3c7ed1ac5d52f50fe776e5a3c26cfb5
+size 536627
diff --git a/TADemo/3DTAConfig.exe b/TADemo/3DTAConfig.exe
new file mode 100644
index 0000000..c74ac93
--- /dev/null
+++ b/TADemo/3DTAConfig.exe
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:30823823ab670e6b8f315af651579b4524bbc088c367a1ee4ca31e87c06087ba
+size 32768
diff --git a/TADemo/HPIUtil.dll b/TADemo/HPIUtil.dll
new file mode 100644
index 0000000..0aa4645
--- /dev/null
+++ b/TADemo/HPIUtil.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8bc007e99bc3f9de69b26d8ae4c10f0592110ef69a826390c6c3ec6ff21f98e7
+size 95232
diff --git a/TADemo/MAPS.TXT b/TADemo/MAPS.TXT
new file mode 100644
index 0000000..3d5cd3d
--- /dev/null
+++ b/TADemo/MAPS.TXT
@@ -0,0 +1,139 @@
+;
+; Default list of maps that the Random Map Selector (tm) will chose from, with weightings.
+; Thanks to Xeno for making the list of mapnames!
+;
+; Structure of this file (quite simple)
+;
+; +Group_name
+;
+;
+; ...
+; +Group_name
+; ...
+;
+; NOTE: If you want to disable a group, just remove the + since all lines that doesn't start with either an
+; integer or a + will be considered as groups to ignore. (and no +10 won't count as an integer). If you want
+; to disable a specific map, just delete the line or perhaps set the weight to 0.
+;
+; About the weightings: They are an INTEGER, and the chance for getting a certain map is proportional to
+; / .
+
++ORIGINAL TA MAPS
+
+100 Anteer Strait
+100 Ashap Plateau
+100 Caldera's Rim
+100 Coast to Coast
+100 Dark Side
+100 Etorrep Glacier
+100 Evad River Confluence
+100 Fox Holes
+100 Full Moon
+100 Gods of War
+100 Great Divide
+100 Greenhaven
+100 Hundred Isles
+100 Kill the Middle
+100 King of the Hill
+100 Lava & Two Hills
+100 Lava Alley
+100 Lava Highground
+100 Lava Mania
+100 Lava Run
+100 Metal Heck
+100 Over Crude Water
+100 Painted Desert
+100 Pincushion
+100 Red Hot Lava
+100 Red Planet
+100 Red Triangle
+100 Ring Atoll
+100 Rock Alley
+100 Seven Islands
+100 Sherwood
+100 Shore to Shore
+100 The Cold Place
+100 The Desert Triad
+100 The Pass
+100 Two Continents
+100 Yerrot Mountains
+
+
++CORE CONTINGENCY MAPS
+
+100 Acid Foursome
+100 Acid Pools
+100 Acid Trip
+100 Assault on Suburbia
+100 Biggie Biggs
+100 Block Wars
+100 Brain Coral
+100 Cavedog Links CC
+100 Checker Ponds
+100 Cluster Freak
+100 Comet Catcher
+100 Core Prime Industrial Area
+100 Crater Islands
+100 Crystal Cracked
+100 Crystal Isles
+100 Crystal Maze
+100 Crystal Treasure Island
+100 Dire Straits
+100 East Indeez
+100 Eastside Westside
+100 Expanded Confluence
+100 Flooded Glaciers
+100 Gasbag Forests
+100 Gasplant Plain
+100 Higher Ground
+100 Ice Scream
+100 Icy Bergs
+100 John's Pass
+100 Lake Shore
+100 Lusch Puppy
+100 Luschaven
+100 Metal Isles
+100 Moon Quartet
+100 Ooooweeee
+100 Pillopeens
+100 Plains and Passes
+100 Polar Range
+100 Polyp Fields
+100 Red River North
+100 Red River
+100 Ror Shock
+100 Sail Away
+100 Sector 410b
+100 Show Down
+100 Slate Gordon
+100 Slated Fate
+100 Steel Jungle
+100 Surface Meltdown
+100 Temblorian Mist
+100 The Barrier Reef
+100 The Bayou
+100 Town & Country
+100 Trout Farm
+
+
++BATTLE TACTICS MAPS
+
+100 Aqua Verdigris
+100 Brilliant Cut Lake
+100 Canal Crossing
+100 Coremageddon
+100 Metal Gridlock
+100 Wretched Ridges
+
+
++ONLINE CAVEDOG MAPS
+
+100 Ancient Issaquah
+100 Evad River Delta
+100 Luschie
+100 Luschinfloggen
+100 Mounds of Mars
+100 ThundurLok Rok
+100 Tropical Paradise
+
+
diff --git a/TADemo/PALETTE.PAL b/TADemo/PALETTE.PAL
new file mode 100644
index 0000000..dfdf538
Binary files /dev/null and b/TADemo/PALETTE.PAL differ
diff --git a/TADemo/SERVER.EXE b/TADemo/SERVER.EXE
new file mode 100644
index 0000000..7305ecf
--- /dev/null
+++ b/TADemo/SERVER.EXE
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:01535310cb0fb90dedb1c35ed73f234449817d476b29c8100b5ba92137b8ee38
+size 574976
diff --git a/TADemo/bagge.fnt b/TADemo/bagge.fnt
new file mode 100644
index 0000000..c7208df
--- /dev/null
+++ b/TADemo/bagge.fnt
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fd5bd3c2861bdc91974456a432774a43c9fa1f7e9e587eaecf595f095875492b
+size 913408
diff --git a/TADemo/bitmaps/detailtex.jpg b/TADemo/bitmaps/detailtex.jpg
new file mode 100644
index 0000000..5cd5e64
--- /dev/null
+++ b/TADemo/bitmaps/detailtex.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a0958945744c90ee51030bf707146c9d31639e6904079090c650d94321964e52
+size 13742
diff --git a/TADemo/bitmaps/gran.bmp b/TADemo/bitmaps/gran.bmp
new file mode 100644
index 0000000..3d402e4
--- /dev/null
+++ b/TADemo/bitmaps/gran.bmp
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:86f0628e876e43d037c29fe6dc0e7688a1230e9f66eb677f3e92041625d0b553
+size 196662
diff --git a/TADemo/bitmaps/gran2.bmp b/TADemo/bitmaps/gran2.bmp
new file mode 100644
index 0000000..4001c91
--- /dev/null
+++ b/TADemo/bitmaps/gran2.bmp
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dd4b8dc8f373e425aa9698d573588ab879482b16853dfae4b9f1f86b226cc28e
+size 196662
diff --git a/TADemo/bitmaps/ocean.jpg b/TADemo/bitmaps/ocean.jpg
new file mode 100644
index 0000000..ba78f5a
--- /dev/null
+++ b/TADemo/bitmaps/ocean.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:046e4aa5ea7964d9ec1ed5e0f1c3c67e32b103e88ff3a536f011eb575055da20
+size 26596
diff --git a/TADemo/uikeys.txt b/TADemo/uikeys.txt
new file mode 100644
index 0000000..35ec8b0
--- /dev/null
+++ b/TADemo/uikeys.txt
@@ -0,0 +1,24 @@
+bind 'p' Pause
+bind pause Pause
+bind 't' Chat
+bind enter Chat
+bind 'b' Debug
+bind up moveforward
+bind down moveback
+bind right moveright
+bind left moveleft
+bind ctrl movefast
+bind shift moveslow
+bind esc quit
+bind pageup increaseViewRadius
+bind pagedown decreaseViewRadius
+bind f6 DrawTrees
+bind f7 dynamicSky
+bind f11 screenshot
+bind numpad+ speedup
+bind numpad- speeddown
+bind 'k' drawkills
+bind 'n' drawnames
+bind 'h' drawhealth
+bind 'r' DrawResources
+bind 'm' DrawMap
\ No newline at end of file
diff --git a/TADemo/unitid.txt b/TADemo/unitid.txt
new file mode 100644
index 0000000..392f7ae
--- /dev/null
+++ b/TADemo/unitid.txt
@@ -0,0 +1,99 @@
+;
+; TA Demo Recoder 0.90ß.
+;
+; This file describes different groups of units.
+; You can therefore add 3rd party units etc to this list if you feel like.
+;
+; The hex-number is the same number that is saved in a unit restrictions file. Don't know
+; how that is related to the unit, or if it can be found in the unit's file somewhere. So if
+; you know, feel free to enlighten me.
+;
+; If you add stuff to the file, you could always send it to me so that future releases of TA Demo can
+; recognize what 3rd-party units was used. (If there should happen to be a nice easy way to get the unit
+; names from those id numbers, this file might become obsolete)
+;
+; Edited by Fnordia 990220
+; 991027
+; 000219
+; 010318
+;
+;
+; Syntax: (very simple)
+;
+; =
+;
+;
+; <...>
+;
+; =
+;
+; etc..
+;
+; update: only units in one of the +-groups will show. with the group furthest down takes presedence.
+; however, the units before the first +-group will be tested for all groups
+
+; I just added one unit to CC cuz I'm lazy. Btw, it's inclusive, so if any unit in the groups list were
+; enabled in the game, this group's name will be listed under used units.
+
+=BAI
+6da73737
+
+=Queller
+; albatross
+62cc5579
+
+=Counterstrike
+; fluxor
+9a34465c
+
++regular ta
+=Core Contingency
+
+; it's the nixter btw. :)
+848ebee6
+
+=ARM Flea
+371d264a
+
+=ARM Scarab
+6b81b8be
+
+=CORE Hedgehog
+763476f4
+
+=CORE Immolator
+3fcf5935
+
+=ARM Fast Attack-Repair Kbot
+d6d867f3
+
+=CORE Necro
+f4c81832
+
++uberhack 1.0
+=UberHack 1.0 TAEC
+; The anemone
+b9f36d39
+
++uberhack 1.1
+=Uberhack 1.1
+; the gimp
+16b40f07
+
+=TAEC units
+; the thumper hehe
+a89cec32
+
++uberhack 3.0
+=Uberhack 3.0
+;centurion
+3b978743
+
++xta 0.8
+=XTA 0.8
+f804eafe
+
++xta betas
+=XTA pre1.0
+; fortwall
+6d197dcf
\ No newline at end of file
diff --git a/Viewer.exe b/Viewer.exe
new file mode 100644
index 0000000..ac006a8
--- /dev/null
+++ b/Viewer.exe
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a3544119e60c55ba2dd6f44522b057accdc793ab0605ca423f7a2d4bf84beae4
+size 1178624
diff --git a/audiere.dll b/audiere.dll
new file mode 100644
index 0000000..c72ed77
--- /dev/null
+++ b/audiere.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:90e59c4f60941a2838d46e20fb78ba0cf71e9cfd0782e291ca876645e3794a66
+size 512000
diff --git a/bass.dll b/bass.dll
index 10114b6..cb33ffa 100644
Binary files a/bass.dll and b/bass.dll differ
diff --git a/basscd.dll b/basscd.dll
index a67d67f..6b5c44e 100644
Binary files a/basscd.dll and b/basscd.dll differ
diff --git a/bassflac.dll b/bassflac.dll
index d017b91..52002f7 100644
Binary files a/bassflac.dll and b/bassflac.dll differ
diff --git a/bassmix.dll b/bassmix.dll
index e413823..df14384 100644
Binary files a/bassmix.dll and b/bassmix.dll differ
diff --git a/basswasapi.dll b/basswasapi.dll
index 41ed83e..c0b347a 100644
Binary files a/basswasapi.dll and b/basswasapi.dll differ
diff --git a/cnc-ddraw config.exe b/cnc-ddraw config.exe
new file mode 100644
index 0000000..f4cb1ce
--- /dev/null
+++ b/cnc-ddraw config.exe
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4ab10bfad5f712e3f1feb72ec9e8b1425171b133aec351c931dfe64071d9e2bb
+size 4155904
diff --git a/ddraw.ini b/ddraw.ini
new file mode 100644
index 0000000..b450621
--- /dev/null
+++ b/ddraw.ini
@@ -0,0 +1,849 @@
+; cnc-ddraw - https://github.com/FunkyFr3sh/cnc-ddraw
+
+[ddraw]
+; ### Optional settings ###
+; Use the following settings to adjust the look and feel to your liking
+
+
+; Stretch to custom resolution, 0 = defaults to the size game requests
+width=0
+height=0
+
+; Override the width/height settings shown above and always stretch to fullscreen
+; Note: Can be combined with 'windowed=true' to get windowed-fullscreen aka borderless mode
+fullscreen=true
+
+; Run in windowed mode rather than going fullscreen
+windowed=true
+
+; Maintain aspect ratio
+maintas=false
+
+; Windowboxing / Integer Scaling
+boxing=false
+
+; Real rendering rate, -1 = screen rate, 0 = unlimited, n = cap
+; Note: Does not have an impact on the game speed, to limit your game speed use 'maxgameticks='
+maxfps=-1
+
+; Vertical synchronization, enable if you get tearing - (Requires 'renderer=auto/opengl/direct3d9')
+; Note: vsync=true can fix tearing but it will cause input lag
+vsync=true
+
+; Automatic mouse sensitivity scaling
+; Note: Only works if stretching is enabled. Sensitivity will be adjusted according to the size of the window
+adjmouse=false
+
+; Preliminary libretro shader support - (Requires 'renderer=opengl') https://github.com/libretro/glsl-shaders
+; 2x scaling example: https://imgur.com/a/kxsM1oY - 4x scaling example: https://imgur.com/a/wjrhpFV
+shader=Shaders\cubic\catmull-rom-bilinear.glsl
+
+; Window position, -32000 = center to screen
+posX=-32000
+posY=-32000
+
+; Renderer, possible values: auto, opengl, gdi, direct3d9 (auto = try direct3d9/opengl, fallback = gdi)
+renderer=opengl
+
+; Developer mode (don't lock the cursor)
+devmode=false
+
+; Show window borders in windowed mode
+border=true
+
+; Save window position/size/state on game exit and restore it automatically on next game start
+; Possible values: 0 = disabled, 1 = save to global 'ddraw' section, 2 = save to game specific section
+savesettings=1
+
+; Should the window be resizable by the user in windowed mode?
+resizable=true
+
+; Enable linear (D3DTEXF_LINEAR) upscaling filter for the direct3d9 renderer
+d3d9linear=true
+
+; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1 and KKND Xtreme)
+vhack=false
+
+; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french
+configlang=auto
+
+; Where should screenshots be saved
+screenshotdir=.\Screenshots\
+
+
+
+; ### Compatibility settings ###
+; Use the following settings in case there are any issues with the game
+
+
+; Hide WM_ACTIVATEAPP and WM_NCACTIVATE messages to prevent problems on alt+tab
+noactivateapp=false
+
+; Max game ticks per second, possible values: -1 = disabled, -2 = refresh rate, 0 = emulate 60hz vblank, 1-1000 = custom game speed
+; Note: Can be used to slow down a too fast running game, fix flickering or too fast animations
+; Note: Usually one of the following values will work: 60 / 30 / 25 / 20 / 15 (lower value = slower game speed)
+maxgameticks=0
+
+; Windows API Hooking, Possible values: 0 = disabled, 1 = IAT Hooking, 2 = Microsoft Detours, 3 = IAT+Detours Hooking (All Modules), 4 = IAT Hooking (All Modules)
+; Note: Change this value if windowed mode or upscaling isn't working properly
+; Note: 'hook=2' will usually work for problematic games, but 'hook=2' should be combined with renderer=gdi
+hook=4
+
+; Force minimum FPS, possible values: 0 = disabled, -1 = use 'maxfps=' value, -2 = same as -1 but force full redraw, 1-1000 = custom FPS
+; Note: Set this to a low value such as 5 or 10 if some parts of the game are not being displayed (e.g. menus or loading screens)
+minfps=0
+
+; Disable fullscreen-exclusive mode for the direct3d9/opengl renderers
+; Note: Can be used in case some GUI elements like buttons/textboxes/videos/etc.. are invisible
+nonexclusive=false
+
+; Force CPU0 affinity, avoids crashes/freezing, *might* have a performance impact
+singlecpu=false
+
+; Available resolutions, possible values: 0 = Small list, 1 = Very small list, 2 = Full list
+; Note: Set this to 2 if your chosen resolution is not working, set to 1 if the game is crashing
+resolutions=0
+
+; Child window handling, possible values: 0 = Disabled, 1 = Display top left, 2 = Display top left + repaint, 3 = Hide
+; Note: Disables upscaling if a child window was detected
+fixchilds=2
+
+; Set the precision for Direct3D9 floating-point calculations to the precision used by the calling thread
+; Note: Enable this if there are desyncs in online games
+fpupreserve=false
+
+
+; Undocumented settings
+d3d9_adapter=0
+opengl_core=false
+d3d9on12=false
+guard_lines=200
+max_resolutions=0
+limit_bltfast=false
+game_handles_close=true
+accuratetimers=false
+fixpitch=true
+fixwndprochook=true
+novidmem=false
+fixnotresponding=false
+locktopleft=false
+lock_surfaces=true
+releasealt=false
+gdilinear=false
+allow_wmactivate=false
+dinputhook=false
+flipclear=false
+fixmousehook=false
+bpp=0
+rgb555=false
+hook_peekmessage=false
+
+
+
+; ### Hotkeys ###
+; Use the following settings to configure your hotkeys, 0x00 = disabled
+; Virtual-Key Codes: https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
+
+
+; Switch between windowed and fullscreen mode = [Alt] + ???
+keytogglefullscreen=0x0D
+
+; Maximize window without frame = [Alt] + ???
+keytogglemaximize=0x22
+
+; Unlock cursor 1 = [Ctrl] + ???
+keyunlockcursor1=0x09
+
+; Unlock cursor 2 = [Right Alt] + ???
+keyunlockcursor2=0xA3
+
+; Screenshot
+keyscreenshot=0x2C
+
+
+
+; ### Game specific settings ###
+; The following settings override all settings shown above, section name = executable name
+
+
+; Atrox
+[Atrox]
+renderer=gdi
+hook=2
+fixchilds=0
+allow_wmactivate=true
+
+; Atomic Bomberman
+[BM]
+maxgameticks=60
+
+; Age of Empires
+[empires]
+renderer=opengl
+nonexclusive=true
+adjmouse=true
+resolutions=2
+
+; Age of Empires: The Rise of Rome
+[empiresx]
+renderer=opengl
+nonexclusive=true
+adjmouse=true
+resolutions=2
+
+; Age of Empires II
+[EMPIRES2]
+renderer=opengl
+nonexclusive=true
+adjmouse=true
+
+; Age of Empires II: The Conquerors
+[age2_x1]
+renderer=opengl
+nonexclusive=true
+adjmouse=true
+
+; American Conquest / Cossacks
+[DMCR]
+resolutions=2
+guard_lines=300
+minfps=-2
+
+; Age of Wonders
+[AoWSM]
+windowed=true
+fullscreen=false
+renderer=gdi
+hook=2
+
+; Age of Wonders 2
+[AoW2]
+windowed=true
+fullscreen=false
+renderer=gdi
+hook=2
+
+; Anstoss 3
+[anstoss3]
+renderer=gdi
+adjmouse=true
+
+; Anno 1602
+[1602]
+adjmouse=true
+
+; Alien Nations
+[AN]
+adjmouse=true
+
+; Amerzone
+[AMERZONE]
+renderer=opengl
+
+; Atlantis
+[ATLANTIS]
+renderer=opengl
+maxgameticks=60
+
+; Airline Tycoon Deluxe
+[AT]
+fixchilds=0
+
+; Baldur's Gate II
+; Note: 'Use 3D Acceleration' must be disabled and 'Full Screen' must be enabled in BGConfig.exe
+[BGMain]
+resolutions=2
+
+; Blade & Sword
+[comeon]
+maxgameticks=62
+fixchilds=3
+
+; Blood II - The Chosen / Shogo - Mobile Armor Division
+[Client]
+checkfile=.\SOUND.REZ
+noactivateapp=true
+
+; Carmageddon
+[CARMA95]
+renderer=opengl
+noactivateapp=true
+flipclear=true
+
+; Carmageddon
+[CARM95]
+renderer=opengl
+noactivateapp=true
+flipclear=true
+
+; Carmageddon 2
+[Carma2_SW]
+renderer=opengl
+noactivateapp=true
+
+; Captain Claw
+[claw]
+noactivateapp=true
+
+; Command & Conquer: Sole Survivor
+[SOLE]
+maxgameticks=120
+maxfps=60
+minfps=-1
+
+; Command & Conquer Gold - CnCNet
+[cnc95]
+maxfps=125
+
+; Command & Conquer Gold
+[C&C95]
+maxgameticks=120
+maxfps=60
+minfps=-1
+
+; Command & Conquer: Red Alert - CnCNet
+[ra95-spawn]
+maxfps=125
+
+; Command & Conquer: Red Alert
+[ra95]
+maxgameticks=120
+maxfps=60
+minfps=-1
+
+; Command & Conquer: Red Alert
+[ra95_Mod-Launcher]
+maxgameticks=120
+maxfps=60
+minfps=-1
+
+; Command & Conquer: Red Alert
+[ra95p]
+maxfps=60
+minfps=-1
+
+; Command & Conquer: Tiberian Sun / Command & Conquer: Red Alert 2
+[game]
+checkfile=.\blowfish.dll
+tshack=true
+noactivateapp=true
+adjmouse=true
+maxfps=60
+minfps=-1
+maintas=false
+boxing=false
+
+; Command & Conquer: Tiberian Sun Demo
+[SUN]
+noactivateapp=true
+tshack=true
+adjmouse=true
+maxfps=60
+minfps=-1
+maintas=false
+boxing=false
+
+; Command & Conquer: Tiberian Sun - CnCNet
+[ts-spawn]
+noactivateapp=true
+tshack=true
+adjmouse=true
+maxfps=60
+minfps=-1
+maintas=false
+boxing=false
+
+; Command & Conquer: Red Alert 2 - XWIS
+[ra2]
+noactivateapp=true
+tshack=true
+maxfps=60
+minfps=-1
+maintas=false
+boxing=false
+
+; Command & Conquer: Red Alert 2 - XWIS
+[Red Alert 2]
+noactivateapp=true
+tshack=true
+maxfps=60
+minfps=-1
+maintas=false
+boxing=false
+
+; Command & Conquer: Red Alert 2: Yuri's Revenge
+[gamemd]
+noactivateapp=true
+tshack=true
+maxfps=60
+minfps=-1
+maintas=false
+boxing=false
+
+; Command & Conquer: Red Alert 2: Yuri's Revenge - ?ModExe?
+[ra2md]
+noactivateapp=true
+tshack=true
+maxfps=60
+minfps=-1
+maintas=false
+boxing=false
+
+; Command & Conquer: Red Alert 2: Yuri's Revenge - CnCNet
+[gamemd-spawn]
+noactivateapp=true
+tshack=true
+maxfps=60
+minfps=-1
+maintas=false
+boxing=false
+
+; Command & Conquer: Red Alert 2: Yuri's Revenge - XWIS
+[Yuri's Revenge]
+noactivateapp=true
+tshack=true
+maxfps=60
+minfps=-1
+maintas=false
+boxing=false
+
+; Caesar III
+[c3]
+renderer=opengl
+nonexclusive=true
+adjmouse=true
+
+; Chris Sawyer's Locomotion
+[LOCO]
+adjmouse=true
+
+; Cultures 2
+[Cultures2]
+adjmouse=true
+
+; Cultures 2 MP
+[Cultures2MP]
+adjmouse=true
+
+; Close Combat 2: A Bridge Too Far
+[cc2]
+adjmouse=true
+renderer=opengl
+nonexclusive=true
+
+; Close Combat 3: The Russian Front
+[cc3]
+adjmouse=true
+renderer=opengl
+nonexclusive=true
+
+; Close Combat 4: The Battle of the Bulge
+[cc4]
+adjmouse=true
+renderer=opengl
+nonexclusive=true
+
+; Close Combat 5: Invasion: Normandy
+[cc5]
+adjmouse=true
+renderer=opengl
+nonexclusive=true
+
+; Call To Power 2
+[ctp2]
+maintas=false
+boxing=false
+
+; Corsairs Gold
+[corsairs]
+adjmouse=true
+renderer=gdi
+hook=2
+
+; Divine Divinity
+[div]
+resolutions=2
+singlecpu=false
+
+; Dune 2000
+[dune2000]
+fpupreserve=true
+
+; Dune 2000 - CnCNet
+[dune2000-spawn]
+fpupreserve=true
+
+; Dragon Throne: Battle of Red Cliffs
+[AdSanguo]
+maxgameticks=60
+noactivateapp=true
+limit_bltfast=true
+
+; Dark Reign: The Future of War
+[DKReign]
+renderer=opengl
+maxgameticks=60
+
+; Dungeon Keeper 2
+[DKII]
+maxgameticks=60
+noactivateapp=true
+
+; Deadlock 2
+[DEADLOCK]
+fixchilds=0
+adjmouse=false
+maintas=false
+boxing=false
+
+; Escape Velocity Nova
+[EV Nova]
+renderer=opengl
+devmode=true
+hook_peekmessage=true
+rgb555=true
+keytogglefullscreen=0x46
+adjmouse=true
+
+; Economic War
+[EcoW]
+maxgameticks=60
+fixnotresponding=true
+
+; Fallout
+[falloutw]
+dinputhook=true
+
+; Fallout 2
+[FALLOUT2]
+dinputhook=true
+
+; Fairy Tale About Father Frost, Ivan and Nastya
+[mrazik]
+guard_lines=0
+
+; Future Cop - L.A.P.D.
+[FCopLAPD]
+renderer=opengl
+nonexclusive=true
+adjmouse=true
+
+; G-Police
+[GPOLICE]
+maxgameticks=60
+
+; Gangsters: Organized Crime
+[gangsters]
+adjmouse=true
+renderer=opengl
+nonexclusive=true
+
+; Grand Theft Auto
+[Grand Theft Auto]
+fixwndprochook=true
+singlecpu=false
+
+; Grand Theft Auto: London 1969
+[gta_uk]
+fixwndprochook=true
+singlecpu=false
+
+; Grand Theft Auto: London 1961
+[Gta_61]
+fixwndprochook=true
+singlecpu=false
+
+; Heroes of Might and Magic II: The Succession Wars
+[HEROES2W]
+adjmouse=true
+
+; Hard Truck: Road to Victory
+[htruck]
+maxgameticks=25
+renderer=opengl
+noactivateapp=true
+
+; Invictus
+[Invictus]
+adjmouse=true
+fixwndprochook=true
+renderer=opengl
+
+; Interstate 76
+[i76]
+adjmouse=true
+renderer=opengl
+
+; Infantry Online
+[infantry]
+devmode=true
+resolutions=2
+infantryhack=true
+max_resolutions=90
+
+; Jagged Alliance 2
+[ja2]
+singlecpu=false
+fixmousehook=true
+noactivateapp=true
+releasealt=true
+novidmem=true
+
+; Jagged Alliance 2: Wildfire
+[WF6]
+singlecpu=false
+fixmousehook=true
+noactivateapp=true
+releasealt=true
+novidmem=true
+
+; Jagged Alliance 2 - UC mod
+[JA2_UC]
+singlecpu=false
+fixmousehook=true
+noactivateapp=true
+releasealt=true
+novidmem=true
+
+; Jagged Alliance 2 - Vengeance Reloaded mod
+[JA2_Vengeance]
+singlecpu=false
+fixmousehook=true
+noactivateapp=true
+releasealt=true
+novidmem=true
+
+; Kings Quest 8
+[Mask]
+renderer=opengl
+
+; Konung
+[konung]
+fixchilds=0
+
+; Konung 2
+[Konung2]
+fixchilds=0
+
+; KKND Xtreme (With high resolution patch)
+[KKNDgame]
+vhack=true
+
+; KKND2: Krossfire
+[KKND2]
+noactivateapp=true
+renderer=gdi
+hook=2
+
+; Lionheart
+[Lionheart]
+locktopleft=true
+
+; Majesty Gold
+[Majesty]
+minfps=-2
+
+; Majesty Gold HD
+[MajestyHD]
+adjmouse=true
+
+; Majesty Gold HD
+[MajestyHD - Old]
+adjmouse=true
+
+; Mech Warrior 3
+[Mech3]
+renderer=opengl
+nonexclusive=true
+
+; Moorhuhn
+[Moorhuhn]
+dinputhook=true
+
+; Moorhuhn 2
+[Moorhuhn2]
+dinputhook=true
+releasealt=true
+
+; New Robinson
+[ROBY]
+adjmouse=true
+hook_peekmessage=true
+
+; Outlaws
+[olwin]
+noactivateapp=true
+maxgameticks=60
+adjmouse=true
+renderer=gdi
+
+; Pharaoh
+[Pharaoh]
+adjmouse=true
+
+; Pax Imperia
+[Pax Imperia]
+renderer=opengl
+nonexclusive=true
+
+; Railroad Tycoon II
+[RT2]
+adjmouse=true
+
+; ROAD RASH
+[RoadRash]
+adjmouse=true
+fixchilds=1
+
+; Septerra Core
+[septerra]
+hook=2
+
+; Sim Copter
+[SimCopter]
+renderer=opengl
+nonexclusive=true
+
+; Settlers 3
+[s3]
+renderer=opengl
+nonexclusive=true
+
+; Star Trek - Armada
+[Armada]
+armadahack=true
+renderer=opengl
+nonexclusive=true
+adjmouse=true
+maintas=false
+boxing=false
+
+; Star Wars: Galactic Battlegrounds
+[battlegrounds]
+renderer=opengl
+nonexclusive=true
+adjmouse=true
+
+; Star Wars: Galactic Battlegrounds: Clone Campaigns
+[battlegrounds_x1]
+renderer=opengl
+nonexclusive=true
+adjmouse=true
+
+; Starcraft
+[StarCraft]
+game_handles_close=true
+
+; Stronghold Crusader HD
+[Stronghold Crusader]
+adjmouse=true
+
+; Space Rangers
+[Rangers]
+locktopleft=true
+
+; Stronghold Crusader Extreme HD
+[Stronghold_Crusader_Extreme]
+adjmouse=true
+
+; Stronghold HD
+[Stronghold]
+adjmouse=true
+
+; Sim City 3000
+[SC3]
+renderer=opengl
+minfps=-2
+
+; Shadow Watch
+[sw]
+adjmouse=true
+
+; Shadow Flare
+[ShadowFlare]
+renderer=opengl
+nonexclusive=true
+adjmouse=true
+maintas=false
+boxing=false
+
+; Theme Park World
+[TP]
+fixwndprochook=true
+
+; Total Annihilation (Unofficial Beta Patch v3.9.02)
+[TotalA]
+lock_surfaces=true
+singlecpu=false
+fixwndprochook=true
+
+; Total Annihilation Replay Viewer (Unofficial Beta Patch v3.9.02)
+[Viewer]
+lock_surfaces=true
+singlecpu=false
+fixwndprochook=true
+
+; Three Kingdoms: Fate of the Dragon
+[sanguo]
+maxgameticks=60
+noactivateapp=true
+limit_bltfast=true
+
+; Twisted Metal
+[TWISTED]
+renderer=opengl
+nonexclusive=true
+maxgameticks=25
+minfps=5
+
+; Twisted Metal 2
+[Tm2]
+renderer=opengl
+nonexclusive=true
+maxgameticks=60
+adjmouse=true
+fixchilds=1
+maintas=false
+boxing=false
+
+; Tzar: The Burden of the Crown
+; Note: Must set 'DIRECTXDEVICE=0' in 'Tzar.ini'
+[Tzar]
+adjmouse=true
+
+; Uprising
+[uprising]
+adjmouse=true
+
+; Uprising 2
+[Uprising 2]
+renderer=opengl
+adjmouse=true
+
+; Wizardry 8
+[Wiz8]
+fixmousehook=true
+noactivateapp=true
+releasealt=true
+novidmem=true
+
+; Worms Armageddon
+[WA]
+adjmouse=true
+width=0
+height=0
+resizable=false
+
+; Wizards and Warriors
+[deep6]
+renderer=gdi
+hook=2
+
+; War Wind
+[WW]
+renderer=opengl
+
+; Zeus and Poseidon
+[Zeus]
+adjmouse=true
+
diff --git a/ddraw_custom.dll b/ddraw_custom.dll
new file mode 100644
index 0000000..7ac213b
--- /dev/null
+++ b/ddraw_custom.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:518796513d85d6c79ba6aec05e5fd9ce1477d34ef11601025f4c4a5289a9d73f
+size 323584
diff --git a/tdraw.dll b/tdraw.dll
new file mode 100644
index 0000000..a35d655
--- /dev/null
+++ b/tdraw.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:908e724c6cfcbeb4d3637cf7e0bc1ff0ff9d8718d6196a48a84b7373a01f4e75
+size 680448
diff --git a/tmusi.dll b/tmusi.dll
new file mode 100644
index 0000000..b602423
--- /dev/null
+++ b/tmusi.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bfd96f5385984e8082db694f4d0192d65b660c1479df70f1a243a9e959beb202
+size 31744
diff --git a/tplayx.dll b/tplayx.dll
new file mode 100644
index 0000000..a6d891a
--- /dev/null
+++ b/tplayx.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:91905ddc9a782089b5034df3d9ae9ed3a24c6af673624a88bad5eeb7f009f706
+size 298496
diff --git a/wgmus.dll b/wgmus.dll
index 3e2ba05..b6e8b5e 100644
Binary files a/wgmus.dll and b/wgmus.dll differ