Compare commits
1 Commits
tavmod
...
tavmod-4.5
| Author | SHA1 | Date |
|---|---|---|
|
|
c6653dc1c6 | 2 years ago |
@ -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
|
||||
// <http://unlicense.org/>
|
||||
//==============================================================
|
||||
////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
#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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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)
|
||||
@ -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
|
||||
Binary file not shown.
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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
|
||||
; <weight> <mapname>
|
||||
; <weight> <mapname>
|
||||
; ...
|
||||
; +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
|
||||
; <map_weighting> / <sum_of_all>.
|
||||
|
||||
+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
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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
|
||||
@ -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 <unitid> 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)
|
||||
;
|
||||
; = <group name / unit name>
|
||||
; <unitid>
|
||||
; <unitid>
|
||||
; <...>
|
||||
;
|
||||
; = <group name>
|
||||
;
|
||||
; 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
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue