Skip to content

Commit d40368c

Browse files
committed
Feature: Golf 'return' statements.
1 parent 8862cac commit d40368c

File tree

13 files changed

+247
-227
lines changed

13 files changed

+247
-227
lines changed

ShaderShrinker/Shrinker.Lexer/StringExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ public static int GetCodeCharCount(this string glsl)
4141
var endComment = glsl.IndexOf("*/", startComment, StringComparison.Ordinal);
4242
if (endComment > startComment)
4343
glsl = glsl.Remove(startComment, endComment - startComment + 2);
44+
else
45+
break; // Couldn't find comment end.
4446
}
4547

4648
return glsl.Split('\r', '\n').Sum(o => o.Count(ch => !char.IsWhiteSpace(ch)));

ShaderShrinker/Shrinker.Parser/GlslOutputFormatter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ public static void AppendCode(StringBuilder sb, SyntaxNode rootNode)
249249
o.Children.ToList().ForEach(child => AppendCode(subExpr, child));
250250
var s = subExpr.ToString().Trim();
251251

252-
sb.Append(string.IsNullOrEmpty(s) ? "return" : $"return {s}");
252+
sb.Append(string.IsNullOrEmpty(s) ? o.Name : $"{o.Name} {s}");
253253
break;
254254
}
255255

ShaderShrinker/Shrinker.Parser/Optimizations/GolfExtensions.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ public static void GolfDefineCommonTerms(this SyntaxNode rootNode)
146146
// What would the saving be, should we #define it?
147147
var toAdd = $"#define {replacement} {keyword} ".Length + nodes.Count * replacement.Length;
148148
var toRemove = nodes.Count * keyword.Length;
149-
if (toAdd >= toRemove)
149+
var delta = toAdd - toRemove;
150+
if (delta > 0)
150151
continue; // Could replace with #define, but not worth it.
151152

152153
// We'll get a space saving - Add a #define.

ShaderShrinker/Shrinker.Parser/SyntaxNodes/ReturnSyntaxNode.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,14 @@
1313

1414
namespace Shrinker.Parser.SyntaxNodes
1515
{
16-
public class ReturnSyntaxNode : GroupSyntaxNode
16+
public class ReturnSyntaxNode : GroupSyntaxNode, IRenamable
1717
{
1818
public override string UiName => Children.Any() ? "return ..." : "return";
1919

2020
protected override SyntaxNode CreateSelf() => new ReturnSyntaxNode();
21+
22+
public string Name { get; private set; } = "return";
23+
24+
public void Rename(string oldName, string newName) => Name = newName;
2125
}
2226
}

ShaderShrinker/UnitTests/TestFiles/GolfedReference/Alien.glsl

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,87 +1,88 @@
1-
// Processed by 'GLSL Shader Shrinker' (Shrunk by 2,150 characters)
1+
// Processed by 'GLSL Shader Shrinker' (Shrunk by 2,233 characters)
22
// (https://github.com/deanthecoder/GLSLShaderShrinker)
33

44
#define v3 vec3
55
#define v2 vec2
66
#define _S smoothstep
7+
#define RET return
78
#define NM normalize
89
#define LNG length
910
#define _f float
1011
#define iT iTime
1112
#define iR iResolution
1213
#define F
1314

14-
float G(v2 p) { return fract(sin(dot(p, v2(123.45, 87.43))) * 5432.3); }
15+
float G(v2 p) { RET fract(sin(dot(p, v2(123.45, 87.43))) * 5432.3); }
1516

1617
float Q(v2 p) {
1718
#ifdef F
1819
p *= .05;
19-
return texture(iChannel1, p).r;
20+
RET texture(iChannel1, p).r;
2021
#else
2122
v2 i = floor(p);
2223
v2 f = fract(p);
2324
_f a = G(i);
2425
_f b = G(i + v2(1, 0));
25-
return mix(a, b, f.x) + (G(i + v2(0, 1)) - a) * f.y * (1. - f.x) + (G(i + v2(1)) - b) * f.x * f.y;
26+
RET mix(a, b, f.x) + (G(i + v2(0, 1)) - a) * f.y * (1. - f.x) + (G(i + v2(1)) - b) * f.x * f.y;
2627
#endif
2728
}
2829

2930
float y(v2 p) {
3031
_f f = .5 * Q(p * 1.1);
3132
f += .22 * Q(p * 2.3);
3233
f += .0625 * Q(p * 8.4);
33-
return f / .7825;
34+
RET f / .7825;
3435
}
3536

3637
float sn(_f a, _f b, _f k) {
3738
_f h = clamp(.5 + .5 * (b - a) / k, 0., 1.);
38-
return mix(b, a, h) - k * h * (1. - h);
39+
RET mix(b, a, h) - k * h * (1. - h);
3940
}
4041

4142
mat2 X(_f a) {
4243
_f c = cos(a),
4344
s = sin(a);
44-
return mat2(c, s, -s, c);
45+
RET mat2(c, s, -s, c);
4546
}
4647

47-
vec2 O(v2 a, v2 b) { return a.x < b.x ? a : b; }
48+
vec2 O(v2 a, v2 b) { RET a.x < b.x ? a : b; }
4849

49-
float SS(v3 p, v2 t) { return LNG(v2(LNG(p.xy) - t.x, p.z)) - t.y; }
50+
float SS(v3 p, v2 t) { RET LNG(v2(LNG(p.xy) - t.x, p.z)) - t.y; }
5051

5152
float ss(v3 p) {
5253
p.z = mod(p.z, .6) - .3;
53-
return SS(p, v2(2, .2));
54+
RET SS(p, v2(2, .2));
5455
}
5556

5657
float se(v3 p) {
5758
_f L = LNG(p.xy);
58-
return max(L - 2., 1.9 - L) - y((p.xy + p.yz) * 4.) * .05;
59+
RET max(L - 2., 1.9 - L) - y((p.xy + p.yz) * 4.) * .05;
5960
}
6061

6162
float sf(v3 p) {
6263
p.y -= 2.5;
63-
return LNG(p.xy) - 1.2 + .2 * pow(abs(.5 + .5 * sin(p.z * 1.4)), 4.);
64+
RET LNG(p.xy) - 1.2 + .2 * pow(abs(.5 + .5 * sin(p.z * 1.4)), 4.);
6465
}
6566

6667
vec3 g(v3 p) {
6768
p.xz *= X(-.01 * p.z);
6869
if (iT < 44.) p.z += iT;
6970
else p.z += 44. + 2.6 * _S(0., 1., min(1., (iT - 44.) / 2.6));
7071

71-
return p;
72+
RET p;
7273
}
7374

7475
float Z(v3 p) {
7576
p = g(p);
7677
p.y += sin(p.x * 1.1 + sin(p.z * .7)) * .15;
77-
return min(p.y + 1.5 + sin(p.z) * .05, LNG(p - v3(0, -3.3, 49)) - 2.) - y(p.xz) * .1;
78+
RET min(p.y + 1.5 + sin(p.z) * .05, LNG(p - v3(0, -3.3, 49)) - 2.) - y(p.xz) * .1;
7879
}
7980

8081
float Y(v3 p) {
8182
p = g(p);
8283
v3 T = p;
8384
T.x = abs(T.x) - .8;
84-
return sn(sn(ss(T), se(T), .1), sf(p), .3);
85+
RET sn(sn(ss(T), se(T), .1), sf(p), .3);
8586
}
8687

8788
float sg(v3 p) {
@@ -95,29 +96,29 @@ float sg(v3 p) {
9596
if (iT >= 55.) S += sin(iT - 55.) * .05;
9697
d = sn(sn(d, -(LNG(T.xz) - p.y * .5 - mix(.1, .7, S)), -.1), SS((T - v3(0, mix(.4, .25, S), 0)).xzy, v2(.35, .04) * S), .05 * S);
9798
d -= y(T.xz + T.xy) * .05;
98-
return d;
99+
RET d;
99100
}
100101

101102
float SE(v3 p) {
102103
_f t = min(1., max(0., iT - 62.));
103-
if (t <= 0.) return 1e10;
104+
if (t <= 0.) RET 1e10;
104105
p = g(p);
105106
p.z -= 49.;
106107
p.y += 1.5 - 1.4 * sin(t * 1.57079);
107-
return LNG(p) - mix(.1, 2., clamp(0., 1., max(0., iT - 62.8) * 2.5));
108+
RET LNG(p) - mix(.1, 2., clamp(0., 1., max(0., iT - 62.8) * 2.5));
108109
}
109110

110111
vec3 D(v3 W, v3 K, v2 UV) {
111112
v3 A = NM(K - W),
112113
V = NM(cross(v3(0, 1, 0), A));
113-
return NM(A + V * UV.x + cross(A, V) * UV.y);
114+
RET NM(A + V * UV.x + cross(A, V) * UV.y);
114115
}
115116

116-
vec2 M(v3 p) { return O(O(O(v2(Y(p), 1.5), v2(Z(p), 2.5)), v2(sg(p), 3.5)), v2(SE(p), 4.5)); }
117+
vec2 M(v3 p) { RET O(O(O(v2(Y(p), 1.5), v2(Z(p), 2.5)), v2(sg(p), 3.5)), v2(SE(p), 4.5)); }
117118

118119
vec3 m(v3 p) {
119120
const v2 e = v2(1, -1) * 29e-5;
120-
return NM(e.xyy * M(p + e.xyy).x + e.yyx * M(p + e.yyx).x + e.yxy * M(p + e.yxy).x + e.xxx * M(p + e.xxx).x);
121+
RET NM(e.xyy * M(p + e.xyy).x + e.yyx * M(p + e.yyx).x + e.yxy * M(p + e.yxy).x + e.xxx * M(p + e.xxx).x);
121122
}
122123

123124
float r(v3 p) {
@@ -128,14 +129,14 @@ float r(v3 p) {
128129
for (int i = 0; i < 16; i++) {
129130
h = M(p + U * d).x;
130131
P = abs(h / d);
131-
if (P < .01) return 0.;
132+
if (P < .01) RET 0.;
132133
d += h;
133134
}
134135

135-
return P * 5.;
136+
RET P * 5.;
136137
}
137138

138-
float o(v3 p, v3 n) { return 1. - (.3 - M(p + n * .3).x) * 4.; }
139+
float o(v3 p, v3 n) { RET 1. - (.3 - M(p + n * .3).x) * 4.; }
139140

140141
float u(v3 p, v3 I) {
141142
_f w = .1,
@@ -146,42 +147,42 @@ float u(v3 p, v3 I) {
146147
w *= .7;
147148
st = max(st, _S(1. - w, (1. - w) * 1.06, l)) * .5;
148149
w *= .7;
149-
return max(st, _S(1. - w, (1. - w) * 1.07, l));
150+
RET max(st, _S(1. - w, (1. - w) * 1.07, l));
150151
}
151152

152153
vec3 ve(v3 v, v2 C) {
153154
v2 q = C.xy / iR.xy;
154155
v *= .5 + .5 * pow(16. * q.x * q.y * (1. - q.x) * (1. - q.y), .4);
155-
return v;
156+
RET v;
156157
}
157158

158159
vec2 E() {
159160
_f tg = iT;
160-
if (tg < 2.) return v2(0, 1);
161+
if (tg < 2.) RET v2(0, 1);
161162
tg -= 2.;
162-
if (tg < 4.) return v2(0, mix(1., 0., _S(0., 1., min(1., tg / 2.))));
163+
if (tg < 4.) RET v2(0, mix(1., 0., _S(0., 1., min(1., tg / 2.))));
163164
tg -= 4.;
164-
if (tg < 3.5) return v2(0, mix(0., -.4, _S(0., 1., min(1., tg / 1.5))));
165+
if (tg < 3.5) RET v2(0, mix(0., -.4, _S(0., 1., min(1., tg / 1.5))));
165166
tg -= 3.5;
166167
if (tg < 4.) {
167168
_f f = _S(0., 1., min(1., tg / 4.));
168-
return v2(sin(f * 3.141) * -.6, -.4 + 1.1 * sin(f * 1.5705));
169+
RET v2(sin(f * 3.141) * -.6, -.4 + 1.1 * sin(f * 1.5705));
169170
}
170171

171172
tg -= 4.;
172-
if (tg < 12.) return v2(0, mix(.7, -.2, _S(0., 1., min(1., tg))));
173+
if (tg < 12.) RET v2(0, mix(.7, -.2, _S(0., 1., min(1., tg))));
173174
tg -= 12.;
174-
if (tg < 17.) return v2(0, mix(-.2, -.05, _S(0., 1., min(1., tg / 5.))));
175+
if (tg < 17.) RET v2(0, mix(-.2, -.05, _S(0., 1., min(1., tg / 5.))));
175176
tg -= 17.;
176-
return v2(0, mix(-.05, -.35, _S(0., 1., min(1., tg / 5.))));
177+
RET v2(0, mix(-.05, -.35, _S(0., 1., min(1., tg / 5.))));
177178
}
178179

179180
void mainImage(out vec4 B, v2 C) {
180181
v2 UV = (C - .5 * iR.xy) / iR.y;
181182
#ifdef USE_WEBCAM
182183
if (iT > 63.5) {
183184
B = vec4(mix(v3(0), texture(iChannel0, C / iR.xy).rgb, min(1., (iT - 63.5) * 5.)), 1);
184-
return;
185+
RET;
185186
}
186187

187188
#endif

0 commit comments

Comments
 (0)