1#pragma name MMJ_ColorPass
2
3/*
4----------------------------------------------------------------
5MMJ's Cel Shader v2.01 - Multi-Pass
6----------------------------------------------------------------
7Parameters:
8-----------
9Color Saturation = Increase or decrease color saturation.
10
11Color Levels = Determines number of color "bands".
12
13Color Weight = Changes the strength of the color adjustments.
14----------------------------------------------------------------
15*/
16
17#pragma parameter ColorLevels "Color Levels" 12.0 1.0 32.0 1.0
18#pragma parameter ColorSaturation "Color Saturation" 1.15 0.00 2.00 0.05
19#pragma parameter ColorWeight "Color Weight" 0.50 0.00 1.00 0.05
20
21
22#if defined(VERTEX)
23
24#if __VERSION__ >= 130
25#define COMPAT_VARYING out
26#define COMPAT_ATTRIBUTE in
27#define COMPAT_TEXTURE texture
28#else
29#define COMPAT_VARYING varying
30#define COMPAT_ATTRIBUTE attribute
31#define COMPAT_TEXTURE texture2D
32#endif
33
34#ifdef GL_ES
35#define COMPAT_PRECISION mediump
36#else
37#define COMPAT_PRECISION
38#endif
39
40COMPAT_ATTRIBUTE vec4 VertexCoord;
41COMPAT_ATTRIBUTE vec4 TexCoord;
42COMPAT_VARYING vec4 TEX0;
43
44vec4 _oPosition1;
45uniform mat4 MVPMatrix;
46uniform COMPAT_PRECISION vec2 OutputSize;
47uniform COMPAT_PRECISION vec2 TextureSize;
48
49// compatibility #defines
50#define vTexCoord TEX0.xy
51#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
52#define OutSize vec4(OutputSize, 1.0 / OutputSize)
53
54void main()
55{
56	gl_Position = MVPMatrix * VertexCoord;
57	TEX0 = TexCoord;
58}
59
60
61#elif defined(FRAGMENT)
62
63#if __VERSION__ >= 130
64#define COMPAT_VARYING in
65#define COMPAT_TEXTURE texture
66out vec4 FragColor;
67#else
68#define COMPAT_VARYING varying
69#define FragColor gl_FragColor
70#define COMPAT_TEXTURE texture2D
71#endif
72
73#ifdef GL_ES
74#ifdef GL_FRAGMENT_PRECISION_HIGH
75precision highp float;
76#else
77precision mediump float;
78#endif
79#define COMPAT_PRECISION mediump
80#else
81#define COMPAT_PRECISION
82#endif
83
84uniform COMPAT_PRECISION vec2 OutputSize;
85uniform COMPAT_PRECISION vec2 TextureSize;
86uniform sampler2D OrigTexture;
87uniform sampler2D PassPrev1Texture;
88COMPAT_VARYING vec4 TEX0;
89
90// compatibility #defines
91#define Source Texture
92#define vTexCoord TEX0.xy
93
94#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
95#define OutSize vec4(OutputSize, 1.0 / OutputSize)
96
97#ifdef PARAMETER_UNIFORM
98uniform COMPAT_PRECISION float ColorLevels;
99uniform COMPAT_PRECISION float ColorSaturation;
100uniform COMPAT_PRECISION float ColorWeight;
101#else
102#define ColorLevels 12.0
103#define ColorSaturation 1.15
104#define ColorWeight 0.50
105#endif
106
107
108vec3 RGB2HSL(vec3 cRGB)
109{
110  float cR = cRGB[0], cG = cRGB[1], cB = cRGB[2];
111  float vMin = min(min(cR, cG), cB), vMax = max(max(cR, cG), cB);
112  float dMax = vMax - vMin, vS = 0.0, vH = 0.0, vL = (vMax + vMin) / 2.0;
113
114  // gray, no chroma
115  if(dMax == 0.0) {
116    vH = 0.0; vS = vH;
117
118  // chromatic data
119  } else {
120    if(vL < 0.5) { vS = dMax / (vMax + vMin); }
121    else         { vS = dMax / (2.0 - vMax - vMin); }
122
123    float dR = (((vMax - cR) * 0.1667) + (dMax * 0.5)) / dMax;
124    float dG = (((vMax - cG) * 0.1667) + (dMax * 0.5)) / dMax;
125    float dB = (((vMax - cB) * 0.1667) + (dMax * 0.5)) / dMax;
126
127    if     (cR >= vMax) { vH = dB - dG; }
128    else if(cG >= vMax) { vH = 0.3333 + dR - dB; }
129    else if(cB >= vMax) { vH = 0.6667 + dG - dR; }
130
131    if     (vH < 0.0) { vH += 1.0; }
132    else if(vH > 1.0) { vH -= 1.0; }
133  }
134  return vec3(vH, vS, vL);
135}
136
137float Hue2RGB(float v1, float v2, float vH)
138{
139  float v3 = 0.0;
140
141  if     (vH < 0.0) { vH += 1.0; }
142  else if(vH > 1.0) { vH -= 1.0; }
143
144  if     ((6.0 * vH) < 1.0) { v3 = v1 + (v2 - v1) * 6.0 * vH; }
145  else if((2.0 * vH) < 1.0) { v3 = v2; }
146  else if((3.0 * vH) < 2.0) { v3 = v1 + (v2 - v1) * (0.6667 - vH) * 6.0; }
147  else                      { v3 = v1; }
148
149  return v3;
150}
151
152vec3 HSL2RGB(vec3 vHSL)
153{
154    float cR = 0.0, cG = cR, cB = cR;
155
156  if(vHSL[1] == 0.0) {
157    cR = vHSL[2], cG = cR, cB = cR;
158
159  } else {
160    float v1 = 0.0, v2 = v1;
161
162    if(vHSL[2] < 0.5) { v2 = vHSL[2] * (1.0 + vHSL[1] ); }
163    else              { v2 = (vHSL[2] + vHSL[1] ) - (vHSL[1] * vHSL[2] ); }
164
165    v1 = 2.0 * vHSL[2] - v2;
166
167    cR = Hue2RGB(v1, v2, vHSL[0] + 0.3333);
168    cG = Hue2RGB(v1, v2, vHSL[0] );
169    cB = Hue2RGB(v1, v2, vHSL[0] - 0.3333);
170  }
171  return vec3(cR, cG, cB);
172}
173
174vec3 colorAdjust(vec3 cRGB)
175{
176  vec3 cHSL = RGB2HSL(cRGB);
177
178  float cr = 1.0 / ColorLevels;
179
180  // brightness modifier
181  float BrtModify = mod(cHSL[2], cr);
182
183  cHSL[1] *= ColorSaturation;
184  cHSL[2] += (cHSL[2] * cr - BrtModify);
185  cRGB = 1.2 * HSL2RGB(cHSL);
186
187  return cRGB;
188}
189
190void main()
191{
192  vec3 cOriginal = COMPAT_TEXTURE(OrigTexture, vTexCoord).rgb;
193  vec3 cOutline = COMPAT_TEXTURE(PassPrev1Texture, vTexCoord).rgb;
194
195	vec3 cNew = cOriginal;
196	cNew = min(vec3(1.0), min(cNew, cNew + dot(vec3(1.0), cNew)));
197	FragColor.rgb = mix(cOriginal * cOutline, colorAdjust(cNew * cOutline), ColorWeight);
198}
199#endif