From 7be59705857fd4fa43029b1ace62ad6744505dd5 Mon Sep 17 00:00:00 2001 From: Laurent Le Brun Date: Wed, 2 Oct 2024 22:11:20 +0200 Subject: [PATCH 1/5] Draft: more function overloading in output --- Minifier/ast.fs | 4 ++++ Minifier/renamer.fs | 28 +++++++++++++++------------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/Minifier/ast.fs b/Minifier/ast.fs index 9b971af..ee07e39 100644 --- a/Minifier/ast.fs +++ b/Minifier/ast.fs @@ -100,6 +100,10 @@ and Expr = and TypeSpec = | TypeName of string | TypeBlock of StructOrInterfaceBlock +with override t.ToString() = + match t with + | TypeName n -> n + | TypeBlock b -> b.ToString() // An interface block followed by an instance name (in a TLDecl), like structs, declares an instance. // An interface block without an instance name (in a TypeDecl), unlike structs, introduces a set of external global variables. diff --git a/Minifier/renamer.fs b/Minifier/renamer.fs index bdd9e62..288700f 100644 --- a/Minifier/renamer.fs +++ b/Minifier/renamer.fs @@ -11,14 +11,14 @@ open Ast type private Env = { // Map from an old variable name to the new one. varRenames: Map - // Map from a new function name and function arity to the old name. - funRenames: Map> + // Map from a new function name and function signature to the old name. + funRenames: Map> // List of names that are still available. availableNames: string list exportedNames: Ast.ExportedName list ref - // Whether multiple functions can have the same name (but different arity). + // Whether multiple functions can have the same name (but different signature). allowOverloading: bool // Function that decides a name (and returns the modified Env). newName: Env -> Ident -> Env @@ -182,17 +182,19 @@ type private RenamerImpl(options: Options.Options) = if not id.IsUniqueId then env.exportedNames.Value <- {prefix = prefix; name = id.OldName; newName = id.Name} :: env.exportedNames.Value - let renFunction env nbArgs (id: Ident) = + let renFunction env (args: Decl list) (id: Ident) = + let signature = String.concat "," [for ty, _ in args -> ty.name.ToString()] + // we're looking for a function name, already used before, - // but not with the same number of arg, and which is not in options.noRenamingList. - let isFunctionNameAvailableForThisArity (x: KeyValuePair>) = - not (x.Value.ContainsKey nbArgs || List.contains x.Key options.noRenamingList) + // but not with the same signature, and which is not in options.noRenamingList. + let isFunctionNameAvailableForThisSignature(x: KeyValuePair>) = + not (x.Value.ContainsKey signature || List.contains x.Key options.noRenamingList) - match env.funRenames |> Seq.tryFind isFunctionNameAvailableForThisArity with + match env.funRenames |> Seq.tryFind isFunctionNameAvailableForThisSignature with | Some res when env.allowOverloading -> - // overload an existing function name used with a different arity + // overload an existing function name used with a different signature let newName = res.Key - let funRenames = env.funRenames.Add (res.Key, res.Value.Add(nbArgs, id.Name)) + let funRenames = env.funRenames.Add (res.Key, res.Value.Add(signature, id.Name)) let env = env.Update(env.varRenames.Add(id.Name, newName), funRenames, env.availableNames) id.Rename(newName) env @@ -200,7 +202,7 @@ type private RenamerImpl(options: Options.Options) = // find a new function name let prevName = id.Name let env = env.newName env id - let funRenames = env.funRenames.Add (id.Name, Map.empty.Add(nbArgs, prevName)) + let funRenames = env.funRenames.Add (id.Name, Map.empty.Add(signature, prevName)) let env = env.Update(env.varRenames, funRenames, env.availableNames) env @@ -212,10 +214,10 @@ type private RenamerImpl(options: Options.Options) = else match env.varRenames.TryFind(f.fName.Name) with | Some name -> - f.fName.Rename(name) + f.fName.Rename(name) // bug, may cause conflicts env | None -> - let newEnv = renFunction env (List.length f.args) f.fName + let newEnv = renFunction env f.args f.fName if f.isExternal(options) then export env ExportPrefix.HlslFunction f.fName newEnv From 4b7cab1013b4361da547aeb2f0649cfe381e5047 Mon Sep 17 00:00:00 2001 From: Laurent Le Brun Date: Sun, 6 Apr 2025 16:33:22 +0200 Subject: [PATCH 2/5] update tests --- tests/compression_results.log | 46 +- tests/real/elevated.hlsl.expected | 22 +- tests/real/kinder_painter.expected | 230 +++++----- tests/real/leizex.expected | 88 ++-- tests/real/mandelbulb.expected | 64 +-- tests/real/mouton/mouton.expected | 172 ++++---- tests/real/oscars_chair.frag.expected | 54 +-- ...real_party_is_in_your_pocket.frag.expected | 414 +++++++++--------- .../real/yx_long_way_from_home.frag.expected | 112 ++--- 9 files changed, 601 insertions(+), 601 deletions(-) diff --git a/tests/compression_results.log b/tests/compression_results.log index afb350b..3912bcd 100644 --- a/tests/compression_results.log +++ b/tests/compression_results.log @@ -1,24 +1,24 @@ -clod.frag (and others) 8692 => 1483.915 -mouton/mouton.vert (and others) 16569 => 2403.743 -audio-flight-v2.frag 4466 => 873.500 +clod.frag (and others) 8692 => 1480.576 +mouton/mouton.vert (and others) 16569 => 2402.720 +audio-flight-v2.frag 4466 => 863.455 buoy.frag 3976 => 598.113 -controllable-machinery.frag 7671 => 1220.647 -ed-209.frag 7661 => 1340.206 -elevated.hlsl 3405 => 604.101 -endeavour.frag 2567 => 530.460 -from-the-seas-to-the-stars.frag 14169 => 2275.913 -frozen-wasteland.frag 4455 => 791.550 -kinder_painter.frag 2832 => 442.132 -leizex.frag 2252 => 506.309 -lunaquatic.frag 5222 => 1047.812 -mandelbulb.frag 2309 => 533.408 -ohanami.frag 3179 => 703.261 -orchard.frag 5380 => 1000.024 -oscars_chair.frag 4648 => 986.069 -robin.frag 6183 => 1038.390 -slisesix.frag 4429 => 890.365 -terrarium.frag 3565 => 745.926 -the_real_party_is_in_your_pocket.frag 11964 => 1762.787 -valley_ball.glsl 4306 => 881.929 -yx_long_way_from_home.frag 2885 => 586.201 -Total: 132785 => 23246.758 +controllable-machinery.frag 7671 => 1212.215 +ed-209.frag 7661 => 1330.885 +elevated.hlsl 3405 => 602.340 +endeavour.frag 2567 => 522.812 +from-the-seas-to-the-stars.frag 14169 => 2272.104 +frozen-wasteland.frag 4455 => 772.630 +kinder_painter.frag 2832 => 446.282 +leizex.frag 2252 => 502.674 +lunaquatic.frag 5222 => 1040.171 +mandelbulb.frag 2309 => 530.410 +ohanami.frag 3179 => 699.259 +orchard.frag 5380 => 996.917 +oscars_chair.frag 4648 => 979.875 +robin.frag 6183 => 1030.289 +slisesix.frag 4429 => 882.573 +terrarium.frag 3565 => 743.327 +the_real_party_is_in_your_pocket.frag 11964 => 1744.283 +valley_ball.glsl 4306 => 877.540 +yx_long_way_from_home.frag 2885 => 581.527 +Total: 132785 => 23112.976 diff --git a/tests/real/elevated.hlsl.expected b/tests/real/elevated.hlsl.expected index 5ba42f2..b2bde77 100644 --- a/tests/real/elevated.hlsl.expected +++ b/tests/real/elevated.hlsl.expected @@ -6,11 +6,11 @@ # define VAR_t1 "m" # define VAR_t2 "y" # define VAR_v "z" -# define F_m0 "l" -# define F_m1 "l" -# define F_m2 "p" +# define F_m0 "D" +# define F_m1 "p" +# define F_m2 "D" # define F_m3 "e" -# define F_m4 "s" +# define F_m4 "l" const char *elevated_hlsl = "sampler f,m,y;" @@ -40,18 +40,18 @@ const char *elevated_hlsl = "float m=D(f,x);" "return normalize(float3(t[2].w*(m-D(f+float2(y,0),x)),y,t[2].w*(m-D(f+float2(0,y),x))));" "}" - "float3 l(float3 f,float3 y,float3 z)" + "float3 D(float3 f,float3 y,float3 z)" "{" "float x=mul(z,t[3]),m=lerp(x,mul(y,t[3]),.5+.5*t[2].x);" "return float3(.13,.18,.22)*(y.y+.25*saturate(-m)-.1*D(1024*f.xz).y)+float3(1.4,1,.7)*saturate(m)*saturate(2*x);" "}" - "float4 l(float4 f:position,out float4 x:color):position" + "float4 D(float4 f:position,out float4 x:color):position" "{" "f.z=t[2].w*D(f.yx,8);" "x=f.yzxw;" "return mul(z,x);" "}" - "float4 l(float2 s:vpos):color" + "float4 p(float2 s:vpos):color" "{" "float2 x=t[0]+s.x*.37;" "float3 y;" @@ -65,7 +65,7 @@ const char *elevated_hlsl = "y.z+=.002*D(x+.1);" "return float4(y,.3*cos(w*2));" "}" - "float4 p(float4 f:color):color" + "float4 D(float4 f:color):color" "{" "return f;" "}" @@ -86,7 +86,7 @@ const char *elevated_hlsl = "r=(.1+.75*t[2].x)*(.8+.2*s);" "r=lerp(r,lerp(float3(.8,.85,.9),float3(.45,.45,.2)*(.8+.2*s),t[2].x),smoothstep(.5-.8*x.y,1-1.1*x.y,w*.15));" "r=lerp(r,lerp(float3(.37,.23,.08),float3(.42,.4,.2),t[2].x)*(.5+.5*s),smoothstep(0,1,50*(x.y-1)+(w+t[2].x)/.4));" - "r*=l(y,x,D(y.xz,.001*f,5));" + "r*=D(y,x,D(y.xz,.001*f,5));" "}" "else" "{" @@ -96,14 +96,14 @@ const char *elevated_hlsl = "r=.12*(float3(.4,1,1)-float3(.2,.6,.4)*saturate(w*16));" "r*=.3+.7*t[2].x;" "r+=pow(1-mul(-x,z),4)*(pow(mul(t[3],reflect(-x,z)),32)*float3(.32,.31,.3)+.1);" - "r=lerp(r,l(y,z,z),smoothstep(1,0,t[2].x+w*60-D(666*y.xz+saturate(w*60)*float2(t[3].w,0)*2,5))*.5);" + "r=lerp(r,D(y,z,z),smoothstep(1,0,t[2].x+w*60-D(666*y.xz+saturate(w*60)*float2(t[3].w,0)*2,5))*.5);" "}" "r=r*(.7+.3*smoothstep(0,1,256*abs(w)))*exp(-.042*f);" "r+=(1-exp(-.1*f))*(float3(.52,.59,.65)+pow(saturate(mul(x,t[3])),8)*float3(.6,.4,.1));" "}" "return float4(r,0);" "}" - "float4 s(float2 x:texcoord):color" + "float4 l(float2 x:texcoord):color" "{" "float2 s=x+.5/1280;" "float4 r=tex2D(m,s);" diff --git a/tests/real/kinder_painter.expected b/tests/real/kinder_painter.expected index edca313..fd74642 100644 --- a/tests/real/kinder_painter.expected +++ b/tests/real/kinder_painter.expected @@ -19,145 +19,145 @@ "uniform vec4 s;" "uniform sampler2D y,f,o,w;" "vec4 r[6],b[6];" - "float t(vec4 z,vec3 m,vec3 v)" + "float t(vec4 z,vec3 v,vec3 r)" "{" - "vec3 r=m-z.xyz;" - "float w=dot(v.xz,v.xz),d=dot(v.xz,r.xz),b=d*d-w*(dot(r.xz,r.xz)-z.w*z.w);" - "if(b>0.)" - "b=(-d-sqrt(b))/w;" - "return b-.001;" + "vec3 b=v-z.xyz;" + "float w=dot(r.xz,r.xz),d=dot(r.xz,b.xz),y=d*d-w*(dot(b.xz,b.xz)-z.w*z.w);" + "if(y>0.)" + "y=(-d-sqrt(y))/w;" + "return y-.001;" "}" - "float d(vec4 z,vec3 m,vec3 v)" + "float d(vec4 z,vec3 v,vec3 y)" "{" - "vec3 r=m-z.xyz;" - "float d=dot(v,r),b=d*d-dot(r,r)+z.w*z.w;" + "vec3 r=v-z.xyz;" + "float d=dot(y,r),b=d*d-dot(r,r)+z.w*z.w;" "if(b>0.)" "b=-d-sqrt(b);" "return b-.001;" "}" - "bool d(vec4 z,vec3 m,vec3 v,float w)" + "bool d(vec4 z,vec3 v,vec3 r,float w)" "{" - "vec3 r=m-z.xyz;" - "float d=dot(v,r),b=d*d-dot(r,r)+z.w*z.w;" + "vec3 y=v-z.xyz;" + "float d=dot(r,y),b=d*d-dot(y,y)+z.w*z.w;" "bool f=false;" "if(b>0.)" "b=-d-sqrt(b),f=b>0.&&b0.)" - "f=-b-sqrt(f),o=f>0.&&f0.)" + "y=-s-sqrt(y),f=y>0.&&y2.5?" - "z.xz=r.xz-v.xz,z.y=0.,z/=v.w,vec2(z.x,r.y):" - "m.w>1.5?" - "z=v.xyz,r.xz*.2:" - "(z=(r-v.xyz)/v.w,z.xy);" - "return z;" + "vec3 y;" + "b=v.w>2.5?" + "y.xz=r.xz-z.xz,y.y=0.,y/=z.w,vec2(y.x,r.y):" + "v.w>1.5?" + "y=z.xyz,r.xz*.2:" + "(y=(r-z.xyz)/z.w,y.xy);" + "return y;" "}" - "vec4 m(vec4 z,vec4 v,bool r)" + "vec4 d(vec4 z,vec4 v,bool y)" "{" - "return r?" + "return y?" "v:" "z;" "}" - "float m(float z,float v,bool r)" + "float d(float z,float v,bool y)" "{" - "return r?" + "return y?" "v:" "z;" "}" - "int m(int z,int v,bool r)" + "int d(int z,int v,bool y)" "{" - "return r?" + "return y?" "v:" "z;" "}" - "float m(vec3 v,vec3 z,out vec4 f,out vec4 w)" + "float d(vec3 v,vec3 z,out vec4 y,out vec4 f)" "{" - "float y=1e4,o;" - "w.w=-1.;" - "bool i;" - "o=d(r[0],v,z);" - "i=o>0.&&o0.&&o0.&&o0.&&o0.&&o0.&&o0.&&i0.&&i0.&&i0.&&i0.&&i0.&&i.001)" - "if(f(i,y,r,C,x))" - "v=.1;" - "s=mix(mix(mix(vec3(1),vec3(.8,.6,.2),sqrt(o.x)*1.25),vec3(.8,.3,.3),sqrt(o.y)*1.25),vec3(.7,.4,.3),sqrt(o.z)*1.25)*((.5+.5*e.y)*vec3(.14,.15,.16)*.8+v*vec3(1,.85,.4)+.5*p*vec3(.08,.1,.14))*vec3(pow(n,.8),n,pow(n,1.1));" + "if(e>.001)" + "if(f(i,v,r,C,x))" + "e=.1;" + "s=mix(mix(mix(vec3(1),vec3(.8,.6,.2),sqrt(o.x)*1.25),vec3(.8,.3,.3),sqrt(o.y)*1.25),vec3(.7,.4,.3),sqrt(o.z)*1.25)*((.5+.5*t.y)*vec3(.14,.15,.16)*.8+e*vec3(1,.85,.4)+.5*w*vec3(.08,.1,.14))*vec3(pow(d,.8),d,pow(d,1.1));" "s=1.5*(s*.15+.85*sqrt(s));" "}" "else" - " s=1.3*vec3(1,.98,.9)*(.7+.3*d.y);" - "v=v*.5+.5;" - "s=clamp(s*(.7+4.8*v.x*v.y*(1.-v.x)*(1.-v.y)),0.,1.);" + " s=1.3*vec3(1,.98,.9)*(.7+.3*p.y);" + "i=i*.5+.5;" + "s=clamp(s*(.7+4.8*i.x*i.y*(1.-i.x)*(1.-i.y)),0.,1.);" "gl_FragColor=vec4(s,1);" "}"; diff --git a/tests/real/mouton/mouton.expected b/tests/real/mouton/mouton.expected index d95b5d1..1a8c05a 100644 --- a/tests/real/mouton/mouton.expected +++ b/tests/real/mouton/mouton.expected @@ -357,7 +357,7 @@ const char *mouton_frag = "vec3 i=normalize(cross(v,normalize(vec3(0,1,0))));" "return mat3(i,cross(i,v),v);" "}" - "mat2 F(float v)" + "mat2 A(float v)" "{" "float x=cos(v);" "v=sin(v);" @@ -367,7 +367,7 @@ const char *mouton_frag = "{" "vec2 y=vec2(cos(t*.7+2.),sin(t*.7+2.)*.75);" "float z=smoothstep(.151,.15,length(i-y));" - "vec2 m=F(t*2e-4)*i*2e2,f=floor(m);" + "vec2 m=A(t*2e-4)*i*2e2,f=floor(m);" "v=h(vec3(abs(f),abs(f.x)));" "float c=v.z*.06;" "return z*smoothstep(.13,.2701,length(i-y-vec2(.05))+.004*B(1e2*vec3(i-y,0)))*vec3(1,.9,.1)*smoothstep(.5,-1.,r.y)+smoothstep(c,c*.01,length(fract(m)-.5+(v.xy-.5)))*(1.-z)+exp(-length(i-y)*2.)*.1+pow(x,2.);" @@ -377,10 +377,10 @@ const char *mouton_frag = "v=abs(v)-x;" "return length(max(v,0.))+min(max(v.x,max(v.y,v.z)),0.);" "}" - "vec2 G(vec3 v)" + "vec2 F(vec3 v)" "{" "v-=z;" - "v.xz=F(1.)*v.xz;" + "v.xz=A(1.)*v.xz;" "float i=pow(clamp(v.y-1.,.004,1.),.5);" "i=A(v-vec3(0,1,0),vec3(1.5-i,1,2.5-i));" "if(i<10.)" @@ -392,7 +392,7 @@ const char *mouton_frag = "}" "return vec2(9e7,0);" "}" - "vec2 H(vec3 v)" + "vec2 G(vec3 v)" "{" "v-=y;" "float i=A(v-vec3(0,7.5,-5),vec3(.8,.8,.1))-.2;" @@ -420,7 +420,7 @@ const char *mouton_frag = "x=vec3(0,2,4.9)-x;" "return length(v-x*clamp(dot(v,x)/dot(x,x),0.,1.))-.2;" "}" - "float I(vec3 v)" + "float H(vec3 v)" "{" "vec2 i=vec2(.14*w,.05);" "return length(vec2(length(v.xy)-i.x,v.z))-i.y;" @@ -430,13 +430,13 @@ const char *mouton_frag = "float i=length(v/x);" "return i*(i-1.)/length(v/(x*x));" "}" - "vec2 J(vec3 v)" + "vec2 I(vec3 v)" "{" "v-=s;" "vec3 i=v;" "i.x+=cos(.775+t)*3.1*.2;" "i.y-=2.8;" - "i.zy=F(.7)*i.zy;" + "i.zy=A(.7)*i.zy;" "float x=E(i-vec3(0,.3,0),vec3(1,.2+cos(i.x*150.)*sin(i.z*150.)*.05,1)*.25);" "if(x<5.)" "{" @@ -455,18 +455,18 @@ const char *mouton_frag = "}" "return vec2(9e7,0);" "}" - "float B(float v,float i,float x)" + "float A(float v,float i,float x)" "{" "float y=clamp(.5+.5*(i-v)/x,0.,1.);" "return mix(i,v,y)-x*y*(1.-y);" "}" - "float E(float v,float x,float i)" + "float B(float v,float x,float i)" "{" "i*=1.4;" "float y=max(i-abs(v-x),0.);" "return max(v,x)+y*y*y/(6.*i*i);" "}" - "vec2 K(vec3 v)" + "vec2 J(vec3 v)" "{" "v-=m;" "v.y-=1.;" @@ -484,69 +484,69 @@ const char *mouton_frag = "vec3 o=v;" "o.x-=.8;" "o.z-=2.+n.x;" - "o.yz=F(g.x)*o.yz;" + "o.yz=A(g.x)*o.yz;" "c=A(o-vec3(0),.7,.3,.2);" "l=A(o-vec3(0,-.8,0),.2,.35,.3);" "o=v;" "o.x+=1.;" "o.z-=2.+n.y;" - "o.yz=F(g.y)*o.yz;" + "o.yz=A(g.y)*o.yz;" "c=min(c,A(o-vec3(0),.7,.3,.2));" "l=min(l,A(o-vec3(0,-.8,0),.2,.35,.3));" "o=v;" "o.x-=1.;" "o.z-=4.+n.z;" - "o.yz=F(g.z)*o.yz;" + "o.yz=A(g.z)*o.yz;" "c=min(c,A(o-vec3(0),.7,.3,.2));" "l=min(l,A(o-vec3(0,-.8,0),.2,.35,.3));" "o=v;" "o.x+=1.;" "o.z-=4.+n.w;" - "o.yz=F(g.w)*o.yz;" + "o.yz=A(g.w)*o.yz;" "c=min(c,A(o-vec3(0),.7,.3,.2));" "l=min(l,A(o-vec3(0,-.8,0),.2,.35,.3));" "o=v+vec3(0,-2,-1.2);" - "o.xz=F((smoothstep(0.,1.,abs(mod(t,1.)*2.-1.))*f.y-.5)*.25*i.y+e.x)*o.xz;" - "o.zy=F(sin(t*f.y)*.25*i.y-e.y)*o.zy;" - "s=B(length(o-vec3(0,-1.3,-1.2))-1.,length(o-vec3(0))-.5,1.8);" + "o.xz=A((smoothstep(0.,1.,abs(mod(t,1.)*2.-1.))*f.y-.5)*.25*i.y+e.x)*o.xz;" + "o.zy=A(sin(t*f.y)*.25*i.y-e.y)*o.zy;" + "s=A(length(o-vec3(0,-1.3,-1.2))-1.,length(o-vec3(0))-.5,1.8);" "vec3 z;" - "a=B(length(o-vec3(0,.35,-.1))-.55-(cos(o.z*8.+o.y*4.5+o.x*4.)+cos(o.z*4.+o.y*6.5+o.x*8.))*.05,x,.1);" + "a=A(length(o-vec3(0,.35,-.1))-.55-(cos(o.z*8.+o.y*4.5+o.x*4.)+cos(o.z*4.+o.y*6.5+o.x*8.))*.05,x,.1);" "z=o;" - "z.yz=F(-.6)*z.yz;" + "z.yz=A(-.6)*z.yz;" "z.x=abs(v.x)-.8;" "z*=vec3(.3,1,.4);" "z-=vec3(0,-.05-pow(z.x,2.)*5.,-.1);" - "m=E(length(z)-.15,-length(z-vec3(0,-.1,0))+.12,.01);" + "m=B(length(z)-.15,-length(z-vec3(0,-.1,0))+.12,.01);" "z.y*=.3;" "z.y-=-.11;" - "float M=length(z)-.16;" + "float L=length(z)-.16;" "z=o;" "z.x=abs(o.x)-.4;" - "float r=length(z*vec3(1,1,1.-p)-vec3(0,0,-1))-.3,u=B(E(abs(r)-.01,B(-abs(o.y+o.z*.025)+.25-smoothstep(.95,.96,d)*.3+cos(t)*.02,-o.z-1.-p*1.8,.2),.01),s,.02);" + "float r=length(z*vec3(1,1,1.-p)-vec3(0,0,-1))-.3,u=A(B(abs(r)-.01,A(-abs(o.y+o.z*.025)+.25-smoothstep(.95,.96,d)*.3+cos(t)*.02,-o.z-1.-p*1.8,.2),.01),s,.02);" "s=min(s,u);" "z.x=abs(o.x)-.2;" - "z.xz=F(-.45)*z.xz;" - "s=B(E(s,-length(z-vec3(-.7,-1.2,-2.05))+.14*w,.1),I(z-vec3(-.7,-1.2,-1.94)),.05);" - "u=B(x,B(v-vec3(0,-.1,cos(v.y-.7)*.5),vec3(cos(t*f.z)*i.z,.2,5))-(cos(v.z*8.+v.y*4.5+v.x*4.)+cos(v.z*4.+v.y*6.5+v.x*3.))*.02,.1);" + "z.xz=A(-.45)*z.xz;" + "s=A(B(s,-length(z-vec3(-.7,-1.2,-2.05))+.14*w,.1),H(z-vec3(-.7,-1.2,-1.94)),.05);" + "u=A(x,B(v-vec3(0,-.1,cos(v.y-.7)*.5),vec3(cos(t*f.z)*i.z,.2,5))-(cos(v.z*8.+v.y*4.5+v.x*4.)+cos(v.z*4.+v.y*6.5+v.x*3.))*.02,.1);" "vec2 U=h(h(vec2(x,1),vec2(u,1)),vec2(a,1));" - "U.x=E(U.x,-M,.15);" + "U.x=B(U.x,-L,.15);" "U=h(h(h(h(h(U,vec2(c,2)),vec2(s,2)),vec2(r,3)),vec2(l,4)),vec2(m,2));" "D=s;" "return U;" "}" "return vec2(x,1);" "}" - "float F(vec3 v,vec2 i,float x)" + "float B(vec3 v,vec2 i,float x)" "{" - "return max(abs(v.z)-i.y,E(E(v.x*.9+v.y*.5,-v.x*.9+v.y*.5,x),-v.y,x)-i.x*.5);" + "return max(abs(v.z)-i.y,B(B(v.x*.9+v.y*.5,-v.x*.9+v.y*.5,x),-v.y,x)-i.x*.5);" "}" - "vec2 L(vec3 v)" + "vec2 K(vec3 v)" "{" "v-=x;" - "float i=F(v-vec3(0,7.5,-5),vec2(1.7,.1),.3);" + "float i=B(v-vec3(0,7.5,-5),vec2(1.7,.1),.3);" "if(i<8.)" "{" - "i=E(i,-F(v-vec3(0,7.5,-5.1),vec2(1.6,.1),.3),.001);" + "i=B(i,-B(v-vec3(0,7.5,-5.1),vec2(1.6,.1),.3),.001);" "float x=A(v-vec3(0,4,-5.1),vec3(.11,4,.08));" "vec3 o=v;" "o.y=abs(o.y-7.3)-.3;" @@ -556,14 +556,14 @@ const char *mouton_frag = "}" "return vec2(9e7,0);" "}" - "vec2 M(vec3 v)" + "vec2 L(vec3 v)" "{" - "return h(h(h(h(h(h(vec2(v.y,0),K(v)),J(v)),H(v)),L(v)),G(v)),A(v));" + "return h(h(h(h(h(h(vec2(v.y,0),J(v)),I(v)),G(v)),K(v)),F(v)),A(v));" "}" - "float B(vec3 v,vec3 x,float i,float y)" + "float A(vec3 v,vec3 x,float i,float y)" "{" - "float m=.5*i-M(v+x*i*.5).x;" - "i=.95*(i-M(v+x*i).x);" + "float m=.5*i-L(v+x*i*.5).x;" + "i=.95*(i-L(v+x*i).x);" "return clamp(1.-y*1.5*(m+i),0.,1.);" "}" "float F(vec3 v,vec3 x)" @@ -571,20 +571,20 @@ const char *mouton_frag = "float i=.01;" "for(int f=0;f<128;f++)" "{" - "float m=M(v+x*i).x;" + "float m=L(v+x*i).x;" "i+=m;" "if(i>1e2||abs(m)<.001)" "break;" "}" "return i;" "}" - "float N(vec3 v)" + "float M(vec3 v)" "{" "vec3 i=r;" "float x=1.,f=.08;" "for(int y=0;y<64;y++)" "{" - "float m=M(v+i*f).x;" + "float m=L(v+i*f).x;" "x=min(x,30.*m/f);" "f+=m;" "if(x<1e-4||f>50.)" @@ -592,7 +592,7 @@ const char *mouton_frag = "}" "return clamp(x,0.,1.);" "}" - "float E(vec2 v,float i,float x,float y)" + "float A(vec2 v,float i,float x,float y)" "{" "v.x=abs(v.x);" "float m=(i-x)/y,c=sqrt(1.-m*m),f=dot(v,vec2(-m,c));" @@ -602,7 +602,7 @@ const char *mouton_frag = "length(v-vec2(0,y))-x:" "dot(v,vec2(c,m))-i;" "}" - "float G(vec2 v,float x)" + "float A(vec2 v,float x)" "{" "vec2 i=vec2(.81,-.59),m=vec2(-i.x,i.y);" "v.x=abs(v.x);" @@ -621,19 +621,19 @@ const char *mouton_frag = "vec3 m=c,f=E(m)*normalize(vec3(i,o-length(i)*u));" "float l=F(m,f);" "vec3 z=m+f*l;" - "vec2 e=M(z),d=vec2(1e-4,0);" - "vec3 w=normalize(vec3(e.x-M(z-d.xyy).x,e.x-M(z-d.yxy).x,e.x-M(z-d.yyx).x));" - "float C=smoothstep(0.,.3,r.y)+.1,H=B(z,w,.15,1.)*B(z,w,1.,.1)*.5,I=N(z),k=1.+dot(f,w);" - "vec3 J=vec3(1,.8,.7)*max(dot(w,r),0.)*pow(vec3(I),vec3(1,1.2,1.5)),K=vec3(1,.8,.7)*.1*max(dot(w,-r),0.)*H,L=vec3(.5)*mix(B(z,f,.3,.75),B(z,r,.3,.75),.5),O=vec3(1)*max(dot(reflect(f,w),r),0.),P=vec3(0),Q=vec3(.4,.45,.5)*H,R=vec3(0),b=vec3(0);" + "vec2 e=L(z),d=vec2(1e-4,0);" + "vec3 w=normalize(vec3(e.x-L(z-d.xyy).x,e.x-L(z-d.yxy).x,e.x-L(z-d.yyx).x));" + "float C=smoothstep(0.,.3,r.y)+.1,G=A(z,w,.15,1.)*A(z,w,1.,.1)*.5,H=M(z),k=1.+dot(f,w);" + "vec3 I=vec3(1,.8,.7)*max(dot(w,r),0.)*pow(vec3(H),vec3(1,1.2,1.5)),J=vec3(1,.8,.7)*.1*max(dot(w,-r),0.)*G,K=vec3(.5)*mix(A(z,f,.3,.75),A(z,r,.3,.75),.5),N=vec3(1)*max(dot(reflect(f,w),r),0.),O=vec3(0),P=vec3(.4,.45,.5)*G,Q=vec3(0),b=vec3(0);" "if(e.y==0.)" - "b=vec3(3),L*=0.,O*=0.;" + "b=vec3(3),K*=0.,N*=0.;" "else if(e.y==1.)" - "b=vec3(.4),L*=k*.5+.5,R=vec3(.35),O=pow(O,vec3(4))*k*.25;" + "b=vec3(.4),K*=k*.5+.5,Q=vec3(.35),N=pow(N,vec3(4))*k*.25;" "else if(e.y==4.)" - "b=vec3(.025),L*=0.,O=pow(O,vec3(80))*k*10.;" + "b=vec3(.025),K*=0.,N=pow(N,vec3(80))*k*10.;" "else if(e.y==3.)" "{" - "L*=.5;" + "K*=.5;" "vec3 v=normalize(a+(B(vec3(t,t*.5,t*1.5))*2.-1.)*.01),i=cross(v,vec3(0,1,0)),x=cross(v,i);" "i=cross(x,v);" "v=w.z*v+w.x*i+w.y*x;" @@ -643,41 +643,41 @@ const char *mouton_frag = "float c=.2+p*.5,l=length(v.xy),s=atan(v.x,v.y);" "x=mix(vec3(.5,.3,.1),vec3(0,.8,1),smoothstep(.16,.3,l)*.3+cos(s*15.)*.04);" "c=smoothstep(c,c+.02,l);" - "b=mix(x*.3,mix(x*((smoothstep(-.9,1.,B(vec3(l*10.,s*30.+cos(l*50.+B(vec3(s))*50.),0)))+smoothstep(-.9,1.,B(vec3(l*10.,s*40.+cos(l*30.+B(vec3(s))*50.)*2.,0))))*.5+.5)*smoothstep(.3,.29,l)*(vec3(1,.8,.7)*pow(max(0.,dot(normalize(vec3(3,1,-1)),v)),8.)*3e2+.5)*c+pow(O,vec3(800))*3,vec3(.8),smoothstep(.29,.3,l)),smoothstep(0.,.05,abs(l-.3)+.01));" + "b=mix(x*.3,mix(x*((smoothstep(-.9,1.,B(vec3(l*10.,s*30.+cos(l*50.+B(vec3(s))*50.),0)))+smoothstep(-.9,1.,B(vec3(l*10.,s*40.+cos(l*30.+B(vec3(s))*50.)*2.,0))))*.5+.5)*smoothstep(.3,.29,l)*(vec3(1,.8,.7)*pow(max(0.,dot(normalize(vec3(3,1,-1)),v)),8.)*3e2+.5)*c+pow(N,vec3(800))*3,vec3(.8),smoothstep(.29,.3,l)),smoothstep(0.,.05,abs(l-.3)+.01));" "w=mix(normalize(w+(a+w)*4.),w,smoothstep(.3,.32,l));" "{" "vec3 o=normalize(vec3(1,1.5,-1)),g=vec3(-o.x,o.y*.5,o.z);" - "P=(mix(mix(vec3(.3,.3,0),vec3(.1),smoothstep(-.7,.2,i.y)),vec3(.3,.65,1),smoothstep(0.,1.,i.y))+(h(i,o,.1)+h(i,g,2.)*.1+h(i,normalize(o+vec3(.2,0,0)),.3)+h(i,normalize(o+vec3(.2,0,.2)),.5)+h(i,normalize(g+vec3(.1,0,.2)),8.)*.5)*vec3(1,.9,.8))*mix(.15,.2,c)*sqrt(k)*2.5;" + "O=(mix(mix(vec3(.3,.3,0),vec3(.1),smoothstep(-.7,.2,i.y)),vec3(.3,.65,1),smoothstep(0.,1.,i.y))+(h(i,o,.1)+h(i,g,2.)*.1+h(i,normalize(o+vec3(.2,0,0)),.3)+h(i,normalize(o+vec3(.2,0,.2)),.5)+h(i,normalize(g+vec3(.1,0,.2)),8.)*.5)*vec3(1,.9,.8))*mix(.15,.2,c)*sqrt(k)*2.5;" "}" - "M(z);" + "L(z);" "b*=smoothstep(0.,.015,D)*.4+.6;" - "O*=0.;" + "N*=0.;" "}" "else if(e.y==5.)" - "b=vec3(.85,.95,1),L*=0.,O=pow(O,vec3(8))*k*2.;" + "b=vec3(.85,.95,1),K*=0.,N=pow(N,vec3(8))*k*2.;" "else if(e.y==6.)" "{" "vec3 y=z-x;" - "L*=0.;" - "O=pow(O,vec3(8))*k*20.;" + "K*=0.;" + "N=pow(N,vec3(8))*k*20.;" "b=w.z>.5?" - "mix(mix(vec3(1.5,0,0),vec3(2),smoothstep(.005,0.,F(y-vec3(0,7.5,-5),vec2(1.3,.2),.01))),vec3(0),smoothstep(.13,.1295,length(y-vec3(0,7.1,-4.9)))+smoothstep(.005,0.,E(y.xy-vec2(0,7.34),.06,.14,1.))):" + "mix(mix(vec3(1.5,0,0),vec3(2),smoothstep(.005,0.,B(y-vec3(0,7.5,-5),vec2(1.3,.2),.01))),vec3(0),smoothstep(.13,.1295,length(y-vec3(0,7.1,-4.9)))+smoothstep(.005,0.,A(y.xy-vec2(0,7.34),.06,.14,1.))):" "vec3(.85,.95,1);" "}" "else if(e.y==7.)" "{" "vec3 o=z-y;" - "L*=0.;" - "O=pow(O,vec3(8))*k*10.;" + "K*=0.;" + "N=pow(N,vec3(8))*k*10.;" "if(w.z>.5)" "{" "b=vec3(0,0,1.5);" "o.y-=7.4;" "float x=A(o-vec3(0,.1,-5),vec3(.8,.8,1)),m=0.;" - "o.xy=F(.8)*o.xy;" - "m=(m+smoothstep(.01,0.,E(o.xy-vec2(-.04,-.6),.1,.05,1.))+smoothstep(.01,0.,E(o.xy-vec2(-.04,.5),.16,.135,.15)))*smoothstep(0.,.01,E(o.xy-vec2(-.12,.56),.001,.02,.2))*smoothstep(0.,.01,E(o.xy-vec2(0,.56),.001,.02,.2));" - "o.xy=F(-1.6)*o.xy;" - "m=m+smoothstep(.01,0.,E(o.xy-vec2(.04,-.6),.1,.05,1.))+smoothstep(.01,0.,E(o.xy-vec2(.04,.5),.16,.1,.15));" + "o.xy=A(.8)*o.xy;" + "m=(m+smoothstep(.01,0.,A(o.xy-vec2(-.04,-.6),.1,.05,1.))+smoothstep(.01,0.,A(o.xy-vec2(-.04,.5),.16,.135,.15)))*smoothstep(0.,.01,A(o.xy-vec2(-.12,.56),.001,.02,.2))*smoothstep(0.,.01,A(o.xy-vec2(0,.56),.001,.02,.2));" + "o.xy=A(-1.6)*o.xy;" + "m=m+smoothstep(.01,0.,A(o.xy-vec2(.04,-.6),.1,.05,1.))+smoothstep(.01,0.,A(o.xy-vec2(.04,.5),.16,.1,.15));" "b=mix(mix(b,vec3(2),smoothstep(.01,0.,x)),vec3(0),m);" "}" "else" @@ -688,55 +688,55 @@ const char *mouton_frag = "vec3 o=z-s;" "o.x+=cos(.775+t)*3.1*.2;" "o.y-=2.8;" - "o.zy=F(.75)*o.zy;" + "o.zy=A(.75)*o.zy;" "b=mix(vec3(2,.75,0),vec3(2,2,0),smoothstep(0.,.45,length(o-vec3(0,.3,0))))*1.8;" - "L=vec3(.01);" - "O*=0.;" + "K=vec3(.01);" + "N*=0.;" "}" "else if(e.y==10.)" - "b=vec3(0,.05,0),O*=k;" + "b=vec3(0,.05,0),N*=k;" "else if(e.y==9.)" "{" "vec3 o=z-s;" "o.x+=cos(.775+t)*3.1*.2;" "o.y-=2.8;" - "o.zy=F(.75)*o.zy;" + "o.zy=A(.75)*o.zy;" "b=mix(vec3(1)+.5,vec3(.75,.5,1),smoothstep(.5,1.1,length(o-vec3(0,.3,0))))*2.;" - "L*=0.;" - "O=pow(O,vec3(4))*k;" + "K*=0.;" + "N=pow(N,vec3(4))*k;" "}" "else if(e.y==11.)" - "b=vec3(1),J*=vec3(.1)*k,Q*=vec3(.1)*k,K*=0.,L*=0.,O=pow(O,vec3(100))*k*2.;" + "b=vec3(1),I*=vec3(.1)*k,P*=vec3(.1)*k,J*=0.,K*=0.,N=pow(N,vec3(100))*k*2.;" "else if(e.y==12.)" - "b=vec3(1,.01,.01)*.3,J*=vec3(3),Q*=vec3(2)*k*k,L*=0.,O=vec3(1,.3,.3)*pow(O,vec3(500))*5.;" + "b=vec3(1,.01,.01)*.3,I*=vec3(3),P*=vec3(2)*k*k,K*=0.,N=vec3(1,.3,.3)*pow(N,vec3(500))*5.;" "else if(e.y==2.)" - "b=vec3(1,.7,.5),Q*=vec3(1,.75,.75),L=pow(L,vec3(.5,2.5,5)+2.)*2.,O=pow(O,vec3(4))*k*.02;" - "J=clamp(mix((b*(Q+J*.5+K*2.+L*2.)+P+O*I+R)*C,A(f,i,C),smoothstep(90.,1e2,l)),0.,1.);" + "b=vec3(1,.7,.5),P*=vec3(1,.75,.75),K=pow(K,vec3(.5,2.5,5)+2.)*2.,N=pow(N,vec3(4))*k*.02;" + "I=clamp(mix((b*(P+I*.5+J*2.+K*2.)+O+N*H+Q)*C,A(f,i,C),smoothstep(90.,1e2,l)),0.,1.);" "if(e.y==0.)" "{" "float v=length(i)*.5,x=cos(atan(i.x,i.y)*15.-t*3.-v*30.*n.y);" - "J=mix(J,mix(mix(vec3(1,.5,0),vec3(.8,.5,1),(cos(v*5.+t*5.)*.5+.5)*n.y),vec3(1),smoothstep(-v,v,x)),n.x);" + "I=mix(I,mix(mix(vec3(1,.5,0),vec3(.8,.5,1),(cos(v*5.+t*5.)*.5+.5)*n.y),vec3(1),smoothstep(-v,v,x)),n.x);" "}" - "e=F(t*5.)*vec2(abs(i.x*5.-.35)-1.8,i.y*5.-1.4);" + "e=A(t*5.)*vec2(abs(i.x*5.-.35)-1.8,i.y*5.-1.4);" "C=(1.4+.2*sin(t*20.))*smoothstep(.5,1.,n.x);" - "J=pow(pow(mix(J,mix(vec3(1,.6,0),vec3(1,.2,0),smoothstep(-.1,.6,G(e,C*.5)))*1.3,smoothstep(0.,-.01,G(e,C))*n.x),vec3(1./2.2)),vec3(1,1.05,1.1));" + "I=pow(pow(mix(I,mix(vec3(1,.6,0),vec3(1,.2,0),smoothstep(-.1,.6,A(e,C*.5)))*1.3,smoothstep(0.,-.01,A(e,C))*n.x),vec3(1./2.2)),vec3(1,1.05,1.1));" "C=length(gl_FragCoord.xy/g.xx-vec2(.5,.3));" - "H=max(.137,smoothstep(147.,146.,t));" - "J*=smoothstep(H,H-.005,C);" - "H=fract(23.*pow(C,.25));" - "H-=smoothstep(.95,.99,H);" - "J=smoothstep(0.,8.,t)*smoothstep(153.,150.,t)*mix(J,mix(vec3(1,.6,0),vec3(1,0,0),H),smoothstep(.135,.136,C)*smoothstep(147.,148.,t));" - "U=vec4(J/(1.+pow(length(v*2.-1.),4.)*.04),1);" + "G=max(.137,smoothstep(147.,146.,t));" + "I*=smoothstep(G,G-.005,C);" + "G=fract(23.*pow(C,.25));" + "G-=smoothstep(.95,.99,G);" + "I=smoothstep(0.,8.,t)*smoothstep(153.,150.,t)*mix(I,mix(vec3(1,.6,0),vec3(1,0,0),G),smoothstep(.135,.136,C)*smoothstep(147.,148.,t));" + "U=vec4(I/(1.+pow(length(v*2.-1.),4.)*.04),1);" "}"; const char *fxaa_frag = "#version 150\n" "out vec4 U;" - "const vec2 O=vec2(1920,1080);" + "const vec2 N=vec2(1920,1080);" "uniform sampler2D k;" "void main()" "{" - "vec2 v=1./O,i=gl_FragCoord.xy*v;" + "vec2 v=1./N,i=gl_FragCoord.xy*v;" "vec4 o=vec4(i,i-v*.5);" "vec3 x=vec3(.299,.587,.114);" "float y=dot(textureLod(k,o.zw,0.).xyz,x),m=dot(textureLod(k,o.zw+vec2(1,0)*v.xy,0.).xyz,x),c=dot(textureLod(k,o.zw+vec2(0,1)*v.xy,0.).xyz,x),s=dot(textureLod(k,o.zw+vec2(1)*v.xy,0.).xyz,x),f=dot(textureLod(k,o.xy,0.).xyz,x);" diff --git a/tests/real/oscars_chair.frag.expected b/tests/real/oscars_chair.frag.expected index 3d938ec..9e369e9 100644 --- a/tests/real/oscars_chair.frag.expected +++ b/tests/real/oscars_chair.frag.expected @@ -16,7 +16,7 @@ const char *oscars_chair_frag = "y+=(texture(a,(x+i*40)*c/vec2(1280,640)).z*2-1)*(m/=v),c*=2;" "return y;" "}" - "float p(vec2 v,out vec3 g)" + "float n(vec2 v,out vec3 g)" "{" "vec2 a=v;" "float m;" @@ -43,10 +43,10 @@ const char *oscars_chair_frag = "g=mix(vec3(.7),mix(vec3(1,1,.5)/1.4+n(v*8,1.2)/15,vec3(.65,1,.5),m)/4*min(v.y*3-1.5+.8,1),step(.5,v.y))-step(.4,n(v*3,1.6))/140;" "return n(v,2)/2-g.y*4;" "}" - "vec3 t(vec2 v,out vec3 y)" + "vec3 p(vec2 v,out vec3 y)" "{" "g=vec3(.004,0,0);" - "return normalize(vec3(p(v+g.xy,y)-p(v-g.xy,y),.16,p(v+g.yx,y)-p(v-g.yx,y)));" + "return normalize(vec3(n(v+g.xy,y)-n(v-g.xy,y),.16,n(v+g.yx,y)-n(v-g.yx,y)));" "}" "float n(vec3 v)" "{" @@ -59,23 +59,23 @@ const char *oscars_chair_frag = "v.z=abs(v.z);" "return min(min(min(max(length(max(abs(v.xz)-vec2(.45,.41),0))-.25,abs(v.y)-.02),length(v-vec3(clamp(v.x,-.6,.6),-.1,.6))-.025),length(vec3(abs(v.x)-.6+min(0,v.y)/5,v.y-clamp(v.y,-1.24,1.5*step(0,v.x)),v.z-.6))-.025),max(length(max(abs(v.yz-vec2(1,0))-vec2(.5,.35),0))-.25,abs(v.x-.6)-.03));" "}" - "float e(vec3 v,vec3 y)" + "float n(vec3 v,vec3 y)" "{" "float x=0,g=0;" "for(;g<200&&x<30;++g)" "i=min(i,m=n(v+y*x)),x+=m/2;" "return x;" "}" - "vec3 h(vec3 v,vec3 a)" + "vec3 p(vec3 v,vec3 a)" "{" "vec3 f;" "x=v+a*(m=min((sign(a.x)*c.x-v.x)/a.x,min((sign(a.y)*c.y-v.y)/a.y,(sign(a.z)*c.z-v.z)/a.z)));" "if(abs(x.y)>c.y-.001)" - "i=0,g=t(x.xz/2,f),f*=min(vec3(.75,1,.75)+min(c.x-abs(x.x),c.z-abs(x.z))/4,1)*smoothstep(0,2.2,length(x-z-vec3(0,-c.y+1.25,0)));" + "i=0,g=p(x.xz/2,f),f*=min(vec3(.75,1,.75)+min(c.x-abs(x.x),c.z-abs(x.z))/4,1)*smoothstep(0,2.2,length(x-z-vec3(0,-c.y+1.25,0)));" "else" "{" "i=1;" - "g=t(vec2(x.x-x.z-c.z,x.y+c.y),f).xzy;" + "g=p(vec2(x.x-x.z-c.z,x.y+c.y),f).xzy;" "if(abs((x/c).x)>abs((x/c).z)&&abs((x/c).x)>abs((x/c).y))" "g=g.zyx*vec3(-sign(x.x),1,-1);" "f*=mix(vec3(1,1,.5),vec3(1),min((-abs(x.y)+c.y)/4,1))*sqrt(min((-abs(x.y)+c.y)*8+.4,1));" @@ -100,59 +100,59 @@ const char *oscars_chair_frag = "}" "else if(abs((v.y+=.22)-.5)<.2)" "{" - "vec3 p=vec3(0);" + "vec3 e=vec3(0);" "for(int a=0;a<8;++a)" "{" - "float t=2.7;" - "vec3 d=vec3(10+y/4,-4,-1),o=vec3(-7,-2,0);" + "float d=2.7;" + "vec3 t=vec3(10+y/4,-4,-1),o=vec3(-7,-2,0);" "m=0;" "if(y>97)" - "o=d=vec3(0,-4,y-97),o.z-=1,l=vec3(0,3,-22),s=.4,c=vec3(3,7,28),z=vec3(-4,0,13);" + "o=t=vec3(0,-4,y-97),o.z-=1,l=vec3(0,3,-22),s=.4,c=vec3(3,7,28),z=vec3(-4,0,13);" "else if(y>81)" - "o=d=vec3(0,-3.6,97-y),o.z-=1,l=vec3(0,5,-5),s=.01,t=1.7,c=vec3(7,5,9),z=vec3(0,0,-2);" + "o=t=vec3(0,-3.6,97-y),o.z-=1,l=vec3(0,5,-5),s=.01,d=1.7,c=vec3(7,5,9),z=vec3(0,0,-2);" "else if(y>60)" - "d=vec3((y-60)/5-1,-2,13),o=vec3(-7,-5,-7),l=vec3(0,5,-3),m=sin(y-60)/10-.9,c=vec3(7,5,9),z=vec3(-4,0,2);" + "t=vec3((y-60)/5-1,-2,13),o=vec3(-7,-5,-7),l=vec3(0,5,-3),m=sin(y-60)/10-.9,c=vec3(7,5,9),z=vec3(-4,0,2);" "else if(y>25)" - "d=vec3(0,0,25-y/2.7),o=vec3(0,-4,18-y/2.7),l=vec3(-2,5,-7),c=vec3(9,5,14),z=vec3(3.5,0,-6);" + "t=vec3(0,0,25-y/2.7),o=vec3(0,-4,18-y/2.7),l=vec3(-2,5,-7),c=vec3(9,5,14),z=vec3(3.5,0,-6);" "else" " m=-.9;" "f=7;" "r=vec3(0,cos(m),sin(m));" - "o=normalize(o-d);" + "o=normalize(o-t);" "vec3 u=normalize(vec3(-o.z,0,o));" "if(y>81&&y<=97)" "o.y+=n(vec2(y+6)/2,2)*.05,u.y+=n(vec2(y)/3,2)*.08;" - "o=mat3(u,cross(u,o),o)*normalize(vec3(v*2+vec2(a&1,a/2)/1200-1,t));" - "float w=e(d,o);" + "o=mat3(u,cross(u,o),o)*normalize(vec3(v*2+vec2(a&1,a/2)/1200-1,d));" + "float w=n(t,o);" "if(w<30)" - "x=d+o*w,g=vec3(.02,0,0),g=normalize(vec3(n(x+g.xyy)-m,n(x+g.yxy)-m,n(x+g.yyx)-m)),f=2,u=h(x,reflect(o,g))*pow(1+dot(o,g),3);" + "x=t+o*w,g=vec3(.02,0,0),g=normalize(vec3(n(x+g.xyy)-m,n(x+g.yxy)-m,n(x+g.yyx)-m)),f=2,u=p(x,reflect(o,g))*pow(1+dot(o,g),3);" "else" "{" - "u=h(d,o);" - "t=(.3+.7*pow(1+dot(o,g),2)/4)*(.1+.9*step(x.y,-c.y+.01));" - "d=reflect(o,g);" + "u=p(t,o);" + "d=(.3+.7*pow(1+dot(o,g),2)/4)*(.1+.9*step(x.y,-c.y+.01));" + "t=reflect(o,g);" "w=m;" "f=2;" "i=1e2;" "o=normalize(l-x);" - "e(x+o*.01,o);" + "n(x+o*.01,o);" "u*=.4+.6*smoothstep(0,n(x)/5,i);" "if(x.y<-c.y+.01)" - "if(e(x,d)<30)" - "t*=.2,u*=.7;" - "u+=h(x,d)*t*mix(vec3(1),u,.8);" + "if(n(x,t)<30)" + "d*=.2,u*=.7;" + "u+=p(x,t)*d*mix(vec3(1),u,.8);" "}" "if(y>60&&y<=97)" "gl_FragColor.w=y<=81?" "(w-15)/6:" "w/15;" "u=pow(.003+smoothstep(0,2,abs(y-60))*smoothstep(0,3,abs(y-112))*(1-(pow(abs(v.x*2-1),4)+pow(abs(v.y*2-1)*2.5,4))*.4)*u*40,vec3(1,1.1,1.2));" - "p+=u/(u+.4)*1.1;" + "e+=u/(u+.4)*1.1;" "}" "m=0;" "for(int x=0;x<64;++x)" "m+=texture(a,clamp((v-vec2(.4,.532)+vec2(x&7,x/8)/10000)*4*vec2(2.25,4),0,1)).x+texture(a,clamp((v-vec2(.38,.33)+vec2(x&7,x/8)/10000)*vec2(2.25,4),0,1)).y;" - "gl_FragColor.xyz=sqrt(p/8)+m/104*clamp((6-abs(y-10))/5,0,1);" + "gl_FragColor.xyz=sqrt(e/8)+m/104*clamp((6-abs(y-10))/5,0,1);" "}" "}"; diff --git a/tests/real/the_real_party_is_in_your_pocket.frag.expected b/tests/real/the_real_party_is_in_your_pocket.frag.expected index 8c6bbb0..105ee74 100644 --- a/tests/real/the_real_party_is_in_your_pocket.frag.expected +++ b/tests/real/the_real_party_is_in_your_pocket.frag.expected @@ -23,11 +23,11 @@ const char *the_real_party_is_in_your_pocket_frag = "v=abs(v)-y;" "return length(max(v,vec3(0)))+min(max(v.z,max(v.x,v.y)),0.);" "}" - "float v(vec2 v,vec2 y)" + "float m(vec2 v,vec2 y)" "{" "return m(vec3(v,0),vec3(y,1));" "}" - "float n(vec2 m,vec2 v,vec2 y)" + "float m(vec2 m,vec2 v,vec2 y)" "{" "return length(m-mix(v,y,clamp(dot(m-v,normalize(y-v))/length(y-v),0.,1.)));" "}" @@ -38,57 +38,57 @@ const char *the_real_party_is_in_your_pocket_frag = "x=float(i)/15.,a=min(a,length(m-mix(mix(v,l,x),mix(l,y,x),x)));" "return a;" "}" - "float n(vec2 m)" + "float m(vec2 v)" "{" "float y=1e4;" - "m.x-=m.y*.11;" - "vec2 l=m-vec2(-.26,0);" + "v.x-=v.y*.11;" + "vec2 l=v-vec2(-.26,0);" "l.x=min(-l.x,0.);" - "y=min(min(y,max(-m.x-.26,abs(length(l*vec2(.9,1))-.022)-.006)),v(m-vec2(-.265,0),vec2(.006,.0278)));" - "l=m;" + "y=min(min(y,max(-v.x-.26,abs(length(l*vec2(.9,1))-.022)-.006)),m(v-vec2(-.265,0),vec2(.006,.0278)));" + "l=v;" "l.x-=-.16;" "l.x=abs(l.x);" - "y=min(min(y,v(l-vec2(l.y/4.+.004,0),vec2(.006,.028))),v(l-vec2(-l.y/3.5+.02,0),vec2(.007,.028)));" - "m.x+=.1;" - "y=min(min(min(min(y,v(m-vec2(-.12,0),vec2(.006,.028))),v(m-vec2(-.11,0),vec2(.014,.007))),v(m-vec2(-.11,.021),vec2(.016,.007))),v(m-vec2(-.11,-.021),vec2(.014,.007)));" - "m.x-=.1;" - "y=min(min(min(min(y,abs(length((m-vec2(-.106,0))*vec2(1,.8))-.017)-.0055),v(m-vec2(-.07,0),vec2(.006,.02))),max(-m.x-.076,abs(length(vec2(max(m.x+.055,0.),abs(m.y)-.011))-.011)-.0059)),abs(length((m-vec2(-.014,0))*vec2(1,.8))-.017)-.0055);" - "m.x-=.023;" - "m.x=abs(m.x);" - "m.x-=max(m.y/2.+.002,0.);" - "return min(y,v(m-vec2(0),vec2(.0065,.028)));" + "y=min(min(y,m(l-vec2(l.y/4.+.004,0),vec2(.006,.028))),m(l-vec2(-l.y/3.5+.02,0),vec2(.007,.028)));" + "v.x+=.1;" + "y=min(min(min(min(y,m(v-vec2(-.12,0),vec2(.006,.028))),m(v-vec2(-.11,0),vec2(.014,.007))),m(v-vec2(-.11,.021),vec2(.016,.007))),m(v-vec2(-.11,-.021),vec2(.014,.007)));" + "v.x-=.1;" + "y=min(min(min(min(y,abs(length((v-vec2(-.106,0))*vec2(1,.8))-.017)-.0055),m(v-vec2(-.07,0),vec2(.006,.02))),max(-v.x-.076,abs(length(vec2(max(v.x+.055,0.),abs(v.y)-.011))-.011)-.0059)),abs(length((v-vec2(-.014,0))*vec2(1,.8))-.017)-.0055);" + "v.x-=.023;" + "v.x=abs(v.x);" + "v.x-=max(v.y/2.+.002,0.);" + "return min(y,m(v-vec2(0),vec2(.0065,.028)));" "}" "float v(vec2 l)" "{" "l*=1.05;" - "return max(max(min(min(min(v(max(min(min(max(min(min(min(min(max(min(min(max(max(min(length((l-vec2(-.11,.01))*vec2(1,1.3))-.016,length(vec2(l.x+.11,max(0.,abs(l.y+.02)-.009))*vec2(.8,1))-.013),-length(vec2(l.x+.112,max(0.,abs(l.y-.009)-.004)))+.005),-length(vec2(l.x+.112,max(0.,abs(l.y+.015)-.007)))+.005),v(l-vec2(-.122,0),vec2(.007,.022))),max(-length(vec2(l.x+.074,max(0.,abs(l.y+.006)-.006)))+.005,length((l-vec2(-.074,-.006))*vec2(.9,1))-.015)),-v(l-vec2(-.06,-.008),vec2(.01,.002))),v(l-vec2(-.075,-.0039),vec2(.01,.002))),v(vec2(abs(l.x+.037)-.01-l.y/2.2,l.y+.006),vec2(.006,.015))),v(l-vec2(-.006,0),vec2(.007,.022))),v(l-vec2(.045,0),vec2(.007,.022))),-v(l-vec2(0,.01),vec2(.06,.002))),max(-v(l-vec2(.025,-.005),vec2(.01,.007)),length(vec2(l.x-.019,l.y+.005-.007)*vec2(.65,1))-.009)),max(-v(l-vec2(.01,-.005),vec2(.01,.007)),length(vec2(l.x-.019,l.y+.005+.007)*vec2(.65,1))-.009)),-length(vec2(l.x-.019,max(0.,abs(l.y+.0055)-.007)))+.005),v(m(0.)*(l-vec2(.019,-.005-(l.x-.019)/2.)),vec2(.0047,.004)),1536.),max(-length(vec2(l.x-.0735,max(0.,abs(l.y+.006)-.006)))+.005,length((l-vec2(.0735,-.006))*vec2(.9,1))-.015)),v(l-vec2(.1,-.006),vec2(.007,.015))),length(vec2(l.x-.118,max(0.,abs(l.y+.012)-.009)))-.013),-length(vec2(l.x-.112,max(0.,abs(l.y+.012)-.01)))+.005),-l.y-.021)+3e-4;" + "return max(max(min(min(min(v(max(min(min(max(min(min(min(min(max(min(min(max(max(min(length((l-vec2(-.11,.01))*vec2(1,1.3))-.016,length(vec2(l.x+.11,max(0.,abs(l.y+.02)-.009))*vec2(.8,1))-.013),-length(vec2(l.x+.112,max(0.,abs(l.y-.009)-.004)))+.005),-length(vec2(l.x+.112,max(0.,abs(l.y+.015)-.007)))+.005),m(l-vec2(-.122,0),vec2(.007,.022))),max(-length(vec2(l.x+.074,max(0.,abs(l.y+.006)-.006)))+.005,length((l-vec2(-.074,-.006))*vec2(.9,1))-.015)),-m(l-vec2(-.06,-.008),vec2(.01,.002))),m(l-vec2(-.075,-.0039),vec2(.01,.002))),m(vec2(abs(l.x+.037)-.01-l.y/2.2,l.y+.006),vec2(.006,.015))),m(l-vec2(-.006,0),vec2(.007,.022))),m(l-vec2(.045,0),vec2(.007,.022))),-m(l-vec2(0,.01),vec2(.06,.002))),max(-m(l-vec2(.025,-.005),vec2(.01,.007)),length(vec2(l.x-.019,l.y+.005-.007)*vec2(.65,1))-.009)),max(-m(l-vec2(.01,-.005),vec2(.01,.007)),length(vec2(l.x-.019,l.y+.005+.007)*vec2(.65,1))-.009)),-length(vec2(l.x-.019,max(0.,abs(l.y+.0055)-.007)))+.005),m(m(0.)*(l-vec2(.019,-.005-(l.x-.019)/2.)),vec2(.0047,.004)),1536.),max(-length(vec2(l.x-.0735,max(0.,abs(l.y+.006)-.006)))+.005,length((l-vec2(.0735,-.006))*vec2(.9,1))-.015)),m(l-vec2(.1,-.006),vec2(.007,.015))),length(vec2(l.x-.118,max(0.,abs(l.y+.012)-.009)))-.013),-length(vec2(l.x-.112,max(0.,abs(l.y+.012)-.01)))+.005),-l.y-.021)+3e-4;" "}" - "float n(vec4 v,vec2 l)" + "float m(vec4 v,vec2 l)" "{" "return length(max(vec4(0),vec4((m(v.x)*l).x,(m(v.y)*-l).x,length(l)-v.z,-length(l)+v.w)));" "}" - "float x(vec3 l,bool y)" + "float m(vec3 v,bool l)" "{" - "l.xy-=vec2(.29,-.745);" - "l.xy=m(.69)*l.xy;" - "vec2 x=vec2(.04,.05),a=l.xy;" - "l.xy=mod(l.xy,x)-x/2.;" - "float z=max(v(vec2(length(l.xy),l.z),vec2(.007,.13))-.001,abs(a.y-.05)-(y?" + "v.xy-=vec2(.29,-.745);" + "v.xy=m(.69)*v.xy;" + "vec2 y=vec2(.04,.05),a=v.xy;" + "v.xy=mod(v.xy,y)-y/2.;" + "float x=max(m(vec2(length(v.xy),v.z),vec2(.007,.13))-.001,abs(a.y-.05)-(l?" ".3:" ".15));" - "if(y)" - "z=max(z,abs(a.x-.04)-.13);" + "if(l)" + "x=max(x,abs(a.x-.04)-.13);" "a.xy=m(-.69)*a.xy;" - "return max(max(z,abs(a.x-.12+x.x)-.125),abs(a.y-a.x*.2+.015+(y?" + "return max(max(x,abs(a.x-.12+y.x)-.125),abs(a.y-a.x*.2+.015+(l?" "-.03:" "0.))-.1265);" "}" - "float s(float y,float m)" + "float m(float y,float v)" "{" - "m=clamp(m/y,0.,1.);" - "return(m*-2.+3.)*m*m;" + "v=clamp(v/y,0.,1.);" + "return(v*-2.+3.)*v*v;" "}" - "vec4 s(vec3 l)" + "vec4 m(vec3 l)" "{" "l.x+=.625;" "float y=floor(l.x/1.25);" @@ -98,280 +98,280 @@ const char *the_real_party_is_in_your_pocket_frag = "l.xz=l.xz*m(-.5*y);" "vec2 a=l.xy;" "a.x=abs(a.x);" - "float i=m(m(a.x-.55,length(a-vec2(0,.8))-1.76,49.),a.y-.95,83.2),f=l.z-.14,z=-l.z-.09-(1.-s(.9,l.y+.3+.1)-s(.55,-l.y-.3-.17))*.17,d=m(m(a.x-.48,length(a-vec2(0,2.5))-2.5,117.),a.y-.87,80.);" + "float x=m(m(a.x-.55,length(a-vec2(0,.8))-1.76,49.),a.y-.95,83.2),i=l.z-.14,s=-l.z-.09-(1.-m(.9,l.y+.3+.1)-m(.55,-l.y-.3-.17))*.17,z=m(m(a.x-.48,length(a-vec2(0,2.5))-2.5,117.),a.y-.87,80.);" "if(l.z>.01)" - "f+=mix(.02,pow(max(0.,v(l.xy-vec2(0,.25+pow(abs(l.x),3.)),vec2(.32,.94))-.05)*1e2,1.3)/15e2,1.-s(-.001,d));" + "i+=mix(.02,pow(max(0.,m(l.xy-vec2(0,.25+pow(abs(l.x),3.)),vec2(.32,.94))-.05)*1e2,1.3)/15e2,1.-m(-.001,z));" "if(l.z<0.)" - "z=v(z,m(l-vec3(0,0,-.1),vec3(.5,.5,.055))-.04,64.);" + "s=v(s,m(l-vec3(0,0,-.1),vec3(.5,.5,.055))-.04,64.);" "a.x-=.09;" "a.y+=.635;" - "i=m(i,f,192.);" - "f=i;" - "float c=.001+v(length(a)-.01,v(length(a-vec2(.036,0))-.01,length(a-vec2(-.036,0))-.01,40.),40.);" - "i=m(i,-l.z-.09,64.);" + "x=m(x,i,192.);" + "i=x;" + "float f=.001+v(length(a)-.01,v(length(a-vec2(.036,0))-.01,length(a-vec2(-.036,0))-.01,40.),40.);" + "x=m(x,-l.z-.09,64.);" "if(l.z<0.)" - "i=v(i,m(f+.03,z,64.),256.);" - "f=1.;" - "i=m(m(m(m(m(m(i,min(l.z,-c+.003),256.),min(l.z,-abs(d)-.001),448.),min(l.z-.13,-v(l.xy-vec2(0,-.118))),512.),min(l.z-.13,-abs(length(vec2(max(abs(l.x)-.12,0.),l.y+.117))-.035)+.003),512.),min(1.,-min(1.,max(m(abs(l.x)-.31,abs(l.y-.49)-.29,5e2),abs(l.z-.185)-.1))+.004),576.),-abs(l.z-.01)-1e-4,384.);" + "x=v(x,m(i+.03,s,64.),256.);" + "i=1.;" + "x=m(m(m(m(m(m(x,min(l.z,-f+.003),256.),min(l.z,-abs(z)-.001),448.),min(l.z-.13,-v(l.xy-vec2(0,-.118))),512.),min(l.z-.13,-abs(length(vec2(max(abs(l.x)-.12,0.),l.y+.117))-.035)+.003),512.),min(1.,-min(1.,max(m(abs(l.x)-.31,abs(l.y-.49)-.29,5e2),abs(l.z-.185)-.1))+.004),576.),-abs(l.z-.01)-1e-4,384.);" "if(l.y<0.)" "{" "if(l.y<-.5)" - "i=m(i+(1.-smoothstep(-.001,.002,x(l+vec3(0,.03,-.2),true)))*.005,-x(l+vec3(0,0,-.2),false),1024.);" + "x=m(x+(1.-smoothstep(-.001,.002,m(l+vec3(0,.03,-.2),true)))*.005,-m(l+vec3(0,0,-.2),false),1024.);" "vec2 y=vec2(-.32,-.314),z=vec2(.124,.033);" - "float d=length(l.xy-vec2(.405,-.28))-.07,p=length(l.xy-vec2(.202,-.345))-.07,e=v(v(l.xy-y,z)-.005,v(l.xy-y,z.yx)-.005,512.);" - "i=m(m(m(i,min(l.z,-d+.004),320.),min(l.z,-p+.004),320.),min(l.z,-min(1.,e)+.006),192.);" + "float s=length(l.xy-vec2(.405,-.28))-.07,c=length(l.xy-vec2(.202,-.345))-.07,n=v(m(l.xy-y,z)-.005,m(l.xy-y,z.yx)-.005,512.);" + "x=m(m(m(x,min(l.z,-s+.004),320.),min(l.z,-c+.004),320.),min(l.z,-min(1.,n)+.006),192.);" "l.xy-=vec2(.405,-.28);" - "float r=(1.-s(.002,min(min(n(l.xy,vec2(0,-.035),vec2(-.014,.024)),n(l.xy,vec2(-.03,-.035),vec2(-.014,.024))),n(l.xy,vec2(-.02),vec2(-.01,-.02)))-.0025))*.002;" + "float r=(1.-m(.002,min(min(m(l.xy,vec2(0,-.035),vec2(-.014,.024)),m(l.xy,vec2(-.03,-.035),vec2(-.014,.024))),m(l.xy,vec2(-.02),vec2(-.01,-.02)))-.0025))*.002;" "l.xy+=vec2(.405,-.28);" "l.xy-=vec2(.202,-.345);" - "float w=min(min(min(n(l.xy,vec2(-.03,-.035),vec2(-.03,.024)),n(l.xy,vec2(-.03,-.035),vec2(-.018,-.035))),n(l.xy,vec2(-.03,.024),vec2(-.018,.024))),n(l.xy,vec2(-.03,-.0055),vec2(-.018,-.0055)));" + "float e=min(min(min(m(l.xy,vec2(-.03,-.035),vec2(-.03,.024)),m(l.xy,vec2(-.03,-.035),vec2(-.018,-.035))),m(l.xy,vec2(-.03,.024),vec2(-.018,.024))),m(l.xy,vec2(-.03,-.0055),vec2(-.018,-.0055)));" "if(l.x>-.018)" - "w=min(min(w,abs(length(l.xy-vec2(-.018,-.02025))-.01475)),abs(length(l.xy-vec2(-.018,.00925))-.01475));" - "w=(1.-s(.002,w-.0025))*.002;" + "e=min(min(e,abs(length(l.xy-vec2(-.018,-.02025))-.01475)),abs(length(l.xy-vec2(-.018,.00925))-.01475));" + "e=(1.-m(.002,e-.0025))*.002;" "l.xy+=vec2(.202,-.345);" - "float k=max(-l.z,m(abs(l.z)-.17,max(-.015,c),96.));" - "w=min(max(-l.z,m(abs(l.z)-.17+w,p,128.)),max(-l.z,m(abs(l.z)-.17+r,d,128.)));" - "vec3 b=l;" - "b.z-=pow(length(l.xy-y),2.)/2.-.01;" - "w=m(min(w,max(-l.z,m(abs(b.z)-.18,e,768.))),-length(b-vec3(y,.19))+.026,512.);" - "b.xy-=y;" - "b.xy=abs(b.xy);" - "if(b.x0.)" "a=vec2(a.x-r*a.y,-r*a.x-a.y)/2.;" "a.x-=clamp(a.x,-2.,0.);" - "w=m(w,-max(-b.z,-length(a)*sign(a.y)+.565),512.);" - "if(w0.&&b.x0.&&w.xb.y||abs(c)<1e-5)" + "n=m(e+s*r);" + "d=n.x;" + "if(r>w.y||abs(d)<1e-5)" "break;" - "r+=c;" + "r+=d;" "}" - "if(r0.)" - "return y=a,i;" - "m=-1.;" - "vec2 x=vec2(-1,-3);" - "float f=(x.x-l.y)/v.y,z=(x.y-l.z)/v.z;" - "vec2 b=h((l-vec3(0,x+2.))*vec3(0,.5,.5),v*vec3(0,.5,.5));" - "x=l.yz+v.yz*b.y-x-2.;" - "if(b.x0.&&x.x<0.&&x.y<0.)" - "y=vec3(-x*.5,0).zxy,m=b.y;" - "else if(f>0.&&(f0.&&(z5.||abs(a.y)>2.5||abs(a.z)>3.3?" + "if(f.x>0.)" + "return y=i,f;" + "x=-1.;" + "vec2 w=vec2(-1,-3);" + "float e=(w.x-l.y)/a.y,s=(w.y-l.z)/a.z;" + "vec2 d=v((l-vec3(0,w+2.))*vec3(0,.5,.5),a*vec3(0,.5,.5));" + "w=l.yz+a.yz*d.y-w-2.;" + "if(d.x0.&&w.x<0.&&w.y<0.)" + "y=vec3(-w*.5,0).zxy,x=d.y;" + "else if(e>0.&&(e0.&&(s5.||abs(i.y)>2.5||abs(i.z)>3.3?" "vec4(-1):" - "vec4(m,0,0,0);" + "vec4(x,0,0,0);" "}" "float y;" - "float h()" + "float m()" "{" "return fract(sin(y++)*43758.5453123);" "}" - "vec3 h(vec3 l)" + "vec3 v(vec3 v)" "{" - "vec3 v=vec3(0,0,4.8),y=vec3(0),a=vec3(1);" - "bool i=false;" - "for(int x=0;x<4;++x)" + "vec3 l=vec3(0,0,4.8),y=vec3(0),a=vec3(1);" + "bool x=false;" + "for(int i=0;i<4;++i)" "{" - "l=normalize(l);" - "vec3 z;" - "vec4 f=h(v,l,z);" - "float r=f.x;" - "if(r<0.)" + "v=normalize(v);" + "vec3 s;" + "vec4 w=m(l,v,s);" + "float f=w.x;" + "if(f<0.)" "{" - "y+=max(a*vec3(.9)*(.5+.5*dot(l,normalize(vec3(-2,4,1))))*.4*1.3*vec3(1,.9,.65)+a*vec3(.9)*step(.9,dot(l,normalize(vec3(6,2,1))))*10.4*2.3+a*vec3(.9)*step(.95,dot(l,normalize(vec3(-2,1,3))))*10.4*1.5,0.)*pow(max(.5+.5*-l.z,0.),.2);" + "y+=max(a*vec3(.9)*(.5+.5*dot(v,normalize(vec3(-2,4,1))))*.4*1.3*vec3(1,.9,.65)+a*vec3(.9)*step(.9,dot(v,normalize(vec3(6,2,1))))*10.4*2.3+a*vec3(.9)*step(.95,dot(v,normalize(vec3(-2,1,3))))*10.4*1.5,0.)*pow(max(.5+.5*-v.z,0.),.2);" "break;" "}" - "float c=floor(f.y/8.);" - "f.y=mod(f.y,8.);" - "vec3 b=v+l*r;" - "vec2 d=vec2(6.28319*h(),h()*2.-1.);" - "vec3 k=z+vec3(sqrt(1.-d.y*d.y)*vec2(cos(d.x),sin(d.x)),d.y);" - "r=f.y>1.5?" - "mix(b.x>0.?" + "float e=floor(w.y/8.);" + "w.y=mod(w.y,8.);" + "vec3 d=l+v*f;" + "vec2 c=vec2(6.28319*m(),m()*2.-1.);" + "vec3 r=s+vec3(sqrt(1.-c.y*c.y)*vec2(cos(c.x),sin(c.x)),c.y);" + "f=w.y>1.5?" + "mix(d.x>0.?" ".1:" - ".05,.5,pow(1.-clamp(dot(-l,z),0.,1.),2.)):" - "mix(.2,.8,pow(1.-clamp(dot(-l,z),0.,1.),1.5));" - "if(f.y>5.5&&f.y<6.5)" + ".05,.5,pow(1.-clamp(dot(-v,s),0.,1.),2.)):" + "mix(.2,.8,pow(1.-clamp(dot(-v,s),0.,1.),1.5));" + "if(w.y>5.5&&w.y<6.5)" "{" - "if(i)" + "if(x)" "break;" - "v=b+z*2e-4;" - "a*=mix(.1,.8,pow(1.-clamp(dot(-l,z),0.,1.),3.))*mix(vec3(1),vec3(1,.9,.5),.5);" - "l=reflect(l,z)+(vec3(h(),h(),h())-.5)*.3;" + "l=d+s*2e-4;" + "a*=mix(.1,.8,pow(1.-clamp(dot(-v,s),0.,1.),3.))*mix(vec3(1),vec3(1,.9,.5),.5);" + "v=reflect(v,s)+(vec3(m(),m(),m())-.5)*.3;" "}" - "else if(f.y>4.5&&f.y<5.5)" + "else if(w.y>4.5&&w.y<5.5)" "{" - "if(i)" + "if(x)" "break;" - "r=.02;" - "if(h()>r)" - "v=b-z*2e-4*-sign(l.z),l+=(vec3(h(),h(),h())-.5)*.1;" + "f=.02;" + "if(m()>f)" + "l=d-s*2e-4*-sign(v.z),v+=(vec3(m(),m(),m())-.5)*.1;" "else" - " v=b+z*2e-4,l=reflect(l,z)+(vec3(h(),h(),h())-.5)*.3;" + " l=d+s*2e-4,v=reflect(v,s)+(vec3(m(),m(),m())-.5)*.3;" "}" - "else if(f.y<.5||f.y>2.5)" + "else if(w.y<.5||w.y>2.5)" "{" - "vec3 r=f.y>2.5?" + "vec3 i=w.y>2.5?" "vec3(.08):" "vec3(.7);" - "if(f.y>3.5)" + "if(w.y>3.5)" "{" - "r=vec3(.008);" - "if(!i)" + "i=vec3(.008);" + "if(!x)" "{" - "if(b.y>.5)" + "if(d.y>.5)" "{" - "vec2 l=f.zw-vec2(-.38,.6);" - "float m=min(min(min(min(min(min(max(length(l-vec2(.005))-.0125,-length(l-vec2(-.012,.005))+.025),max(length(l-vec2(-.02,.005))-.0125,-length(l-vec2(-.045,.005))+.03)),max(length(l-vec2(.005))-.0125,-length(l-vec2(-.012,.005))+.025)),max(length(l-vec2(.03,.005))-.0125,-length(l-vec2(.02,.005))+.02)),abs(length(l-vec2(-.037,-.0398))-.0104)),n(l,vec2(-.064,-.05),vec2(-.064,-.03))),max(-l.x-.063,abs(length(vec2(max(0.,l.x+.06),l.y+.035))-.006)));" - "l.x-=.091;" - "m=min(min(min(m,n(l,vec2(-.064,-.05),vec2(-.064,-.03))),max(-l.x-.063,abs(length(vec2(max(0.,l.x+.06),l.y+.035))-.006))),n(l,vec2(-.054,-.05),vec2(-.059,-.041)));" - "l.x+=.091;" - "m=min(min(min(min(m,n(l,vec2(.009,-.05),vec2(.009,-.03))),n(l,vec2(.009,-.05),vec2(.018,-.05))),n(l,vec2(.009,-.03),vec2(.018,-.03))),n(l,vec2(.009,-.039),vec2(.018,-.039)));" - "l.x=abs(l.x+.01);" - "l.x=abs(l.x-.006);" - "m=min(m,n(l,vec2(0,-.05),vec2(.006,-.03)));" - "r=mix(r,vec3(.3),step(m-.0018,0.));" + "vec2 v=w.zw-vec2(-.38,.6);" + "float l=min(min(min(min(min(min(max(length(v-vec2(.005))-.0125,-length(v-vec2(-.012,.005))+.025),max(length(v-vec2(-.02,.005))-.0125,-length(v-vec2(-.045,.005))+.03)),max(length(v-vec2(.005))-.0125,-length(v-vec2(-.012,.005))+.025)),max(length(v-vec2(.03,.005))-.0125,-length(v-vec2(.02,.005))+.02)),abs(length(v-vec2(-.037,-.0398))-.0104)),m(v,vec2(-.064,-.05),vec2(-.064,-.03))),max(-v.x-.063,abs(length(vec2(max(0.,v.x+.06),v.y+.035))-.006)));" + "v.x-=.091;" + "l=min(min(min(l,m(v,vec2(-.064,-.05),vec2(-.064,-.03))),max(-v.x-.063,abs(length(vec2(max(0.,v.x+.06),v.y+.035))-.006))),m(v,vec2(-.054,-.05),vec2(-.059,-.041)));" + "v.x+=.091;" + "l=min(min(min(min(l,m(v,vec2(.009,-.05),vec2(.009,-.03))),m(v,vec2(.009,-.05),vec2(.018,-.05))),m(v,vec2(.009,-.03),vec2(.018,-.03))),m(v,vec2(.009,-.039),vec2(.018,-.039)));" + "v.x=abs(v.x+.01);" + "v.x=abs(v.x-.006);" + "l=min(l,m(v,vec2(0,-.05),vec2(.006,-.03)));" + "i=mix(i,vec3(.3),step(l-.0018,0.));" "}" - "if(length(f.zw-vec2(-.43,.605))<.014)" - "y+=a*3.*vec3(1,.01,.01)*(.8+8.*(1.-s(.01,length(f.zw-vec2(-.43,.605)))));" - "if(f.w>0.&&b.y<.2)" + "if(length(w.zw-vec2(-.43,.605))<.014)" + "y+=a*3.*vec3(1,.01,.01)*(.8+8.*(1.-m(.01,length(w.zw-vec2(-.43,.605)))));" + "if(w.w>0.&&d.y<.2)" "{" - "r=mix(r,vec3(.3),step(n(f.zw-vec2(0,.103)),0.));" + "i=mix(i,vec3(.3),step(m(w.zw-vec2(0,.103)),0.));" "{" "vec2 v=vec2(-.09,.03),l=vec2(-.1,0);" - "r=mix(r,vec3(.520661,.00153787,.064975),step(min(m(f.zw-vec2(.16,.103),l,l+normalize(l-v)*.03,vec2(-.065,-.026)),m(f.zw-vec2(.16,.103),vec2(-.07,.02),v,l))-.007,0.));" + "i=mix(i,vec3(.520661,.00153787,.064975),step(min(m(w.zw-vec2(.16,.103),l,l+normalize(l-v)*.03,vec2(-.065,-.026)),m(w.zw-vec2(.16,.103),vec2(-.07,.02),v,l))-.007,0.));" "}" "{" - "vec2 l=f.zw-vec2(.16,.103)-vec2(-.029,-.015);" + "vec2 l=w.zw-vec2(.16,.103)-vec2(-.029,-.015);" "l.x+=cos(l.y*30.)*.01;" "l.y-=cos(l.x*20.)*.01;" - "r=mix(r,vec3(.093564,.0865052,.434048),step(abs(length(l)-.02)-.007,0.));" + "i=mix(i,vec3(.093564,.0865052,.434048),step(abs(length(l)-.02)-.007,0.));" "}" "{" - "vec2 l=f.zw-vec2(.16,.103),v=vec2(-.007,0),y=vec2(-.007,-.0205);" - "r=mix(r,vec3(.186082,.481799,.0177778),step(min(m(l,y,y+normalize(y-v)*.01,vec2(.02,-.02)),m(l,vec2(-.01,.02),v,y))-.007,0.));" + "vec2 v=w.zw-vec2(.16,.103),l=vec2(-.007,0),y=vec2(-.007,-.0205);" + "i=mix(i,vec3(.186082,.481799,.0177778),step(min(m(v,y,y+normalize(y-l)*.01,vec2(.02,-.02)),m(v,vec2(-.01,.02),l,y))-.007,0.));" "}" "{" - "vec2 l=f.zw-vec2(.16,.103)-vec2(.045,-.015);" + "vec2 l=w.zw-vec2(.16,.103)-vec2(.045,-.015);" "l.x+=cos(l.y*20.+1.)*.005;" "l.y-=cos(l.x*20.+25.)*.01;" - "r=mix(r,vec3(.730857,.454964,553633e-9),step(abs(length(l)-.02)-.007,0.));" + "i=mix(i,vec3(.730857,.454964,553633e-9),step(abs(length(l)-.02)-.007,0.));" "}" "{" - "vec2 l=f.zw-vec2(.24,.103),v=vec2(-.002,0),y=vec2(-.007,.016),x=y+normalize(y-v)*.012,a=vec2(.02),z=vec2(.002,-.007),i=vec2(.025,-.028);" - "r=mix(r,vec3(0,.332318,.292872),step(min(min(min(m(l,y,x,a),m(l,vec2(-.006,-.026),v,y)),m(l,a,x+normalize(a-x)*.05,z)),m(l,z,(z+i)/2.+vec2(.001),i))-.007,0.));" + "vec2 v=w.zw-vec2(.24,.103),l=vec2(-.002,0),y=vec2(-.007,.016),x=y+normalize(y-l)*.012,a=vec2(.02),s=vec2(.002,-.007),z=vec2(.025,-.028);" + "i=mix(i,vec3(0,.332318,.292872),step(min(min(min(m(v,y,x,a),m(v,vec2(-.006,-.026),l,y)),m(v,a,x+normalize(a-x)*.05,s)),m(v,s,(s+z)/2.+vec2(.001),z))-.007,0.));" "}" "}" "{" - "vec2 l=vec2(160,144)/1.5,v=(f.zw-vec2(-.001,.486))*3.75*vec2(l.y/l.x,1)*.5+.5,x=fract(v*l);" + "vec2 l=vec2(160,144)/1.5,v=(w.zw-vec2(-.001,.486))*3.75*vec2(l.y/l.x,1)*.5+.5,x=fract(v*l);" "v=floor(v*l)/l;" "if(max(abs(v.x-.5),abs(v.y-.5))<.5)" "{" - "vec3 i;" - "vec2 m=(v*2.-1.)*vec2(l.x/l.y,1);" - "float f=floor(v.y*8.);" - "i=mix(.5+.5*cos(vec3(.8,.3,2)*(f+1.)),vec3(1),step(min(min(min(min(min(min(min(min(min(min(min(min(min(min(min(min(min(n(vec4(1.54,.53,.91,.72),m),n(vec4(.63,.78,.91,.72),m)),n(vec4(.61,1.675,.72,.64),m)),n(vec4(2.7,3.11,.72,.64),m)),n(vec4(3.45,3.65,.72,.64),m)),n(vec4(4.71,5.02,.72,.64),m)),n(vec4(5.3,5.51,.72,.64),m)),n(vec4(5.96,6.43,.72,.64),m)),n(vec4(3.2,1.27,.45,.35),m)),n(vec4(1.3,2.3,.45,.35),m)),n(vec4(2.58,4.2,.45,.35),m)),n(vec4(3.2,3.95,.35,.25),m)),n(vec4(5.2,5.93,.35,.25),m)),n(vec4(7.9,8.15,.35,.25),m)),n(vec4(.2,1.16,.32,.17),m)),max(length(m)-.84,-length(m)+.72)),max(length(m)-.52,-length(m)+.45)),max(length(m)-.17,-length(m)+.08)),0.))*vec3(1,1,.8)*(smoothstep(.1,.2,x.x)*smoothstep(.1,.2,x.y));" - "y+=a*3.*i;" - "r=vec3(.1);" + "vec3 f;" + "vec2 s=(v*2.-1.)*vec2(l.x/l.y,1);" + "float w=floor(v.y*8.);" + "f=mix(.5+.5*cos(vec3(.8,.3,2)*(w+1.)),vec3(1),step(min(min(min(min(min(min(min(min(min(min(min(min(min(min(min(min(min(m(vec4(1.54,.53,.91,.72),s),m(vec4(.63,.78,.91,.72),s)),m(vec4(.61,1.675,.72,.64),s)),m(vec4(2.7,3.11,.72,.64),s)),m(vec4(3.45,3.65,.72,.64),s)),m(vec4(4.71,5.02,.72,.64),s)),m(vec4(5.3,5.51,.72,.64),s)),m(vec4(5.96,6.43,.72,.64),s)),m(vec4(3.2,1.27,.45,.35),s)),m(vec4(1.3,2.3,.45,.35),s)),m(vec4(2.58,4.2,.45,.35),s)),m(vec4(3.2,3.95,.35,.25),s)),m(vec4(5.2,5.93,.35,.25),s)),m(vec4(7.9,8.15,.35,.25),s)),m(vec4(.2,1.16,.32,.17),s)),max(length(s)-.84,-length(s)+.72)),max(length(s)-.52,-length(s)+.45)),max(length(s)-.17,-length(s)+.08)),0.))*vec3(1,1,.8)*(smoothstep(.1,.2,x.x)*smoothstep(.1,.2,x.y));" + "y+=a*3.*f;" + "i=vec3(.1);" "}" "}" "}" "}" - "if(f.y>3.&&f.y<3.2)" - "r=vec3(.4);" - "a*=r;" - "v=b+z*2e-4;" - "l=k;" - "i=true;" + "if(w.y>3.&&w.y<3.2)" + "i=vec3(.4);" + "a*=i;" + "l=d+s*2e-4;" + "v=r;" + "x=true;" "}" "else" "{" - "vec3 m=c>1.5?" + "vec3 y=e>1.5?" "vec3(1,.02,.2):" - "c>.5?" + "e>.5?" "vec3(.2,1,.02):" "vec3(.02,.2,1);" - "if(h()>mix(.2,1.,r))" + "if(m()>mix(.2,1.,f))" "{" - "if(f.y>1.5)" - "m=vec3(.02);" - "a*=m;" - "v=b+z*2e-4;" - "l=k;" - "i=true;" + "if(w.y>1.5)" + "y=vec3(.02);" + "a*=y;" + "l=d+s*2e-4;" + "v=r;" + "x=true;" "}" "else" "{" - "if(i)" + "if(x)" "break;" - "a*=f.y>1.5?" + "a*=w.y>1.5?" "vec3(.5):" - ".9*mix(m,vec3(1),.25);" - "v=b+z*2e-4;" - "l=reflect(l,z)+(vec3(h(),h(),h())-.5)*.4;" + ".9*mix(y,vec3(1),.25);" + "l=d+s*2e-4;" + "v=reflect(v,s)+(vec3(m(),m(),m())-.5)*.4;" "}" "}" "if(max(a.x,max(a.y,a.z))<.001)" @@ -382,17 +382,17 @@ const char *the_real_party_is_in_your_pocket_frag = "void main()" "{" "vec3 l=vec3(0);" - "for(int m=0;m<16;++m)" + "for(int i=0;i<16;++i)" "{" - "y=float(m)+gl_TexCoord[0].x*16.;" - "float v=h()*6.28319;" - "vec2 a=vec2(cos(v),sin(v))*sqrt(1.-sqrt(1.-h()))*1.2;" + "y=float(i)+gl_TexCoord[0].x*16.;" + "float x=m()*6.28319;" + "vec2 a=vec2(cos(x),sin(x))*sqrt(1.-sqrt(1.-m()))*1.2;" "if(int(y)%4==0)" "a*=15.*length(a);" - "l+=h(vec3((gl_FragCoord.xy-vec2(960,540)+a)/540.,-3.5))/48.;" + "l+=v(vec3((gl_FragCoord.xy-vec2(960,540)+a)/540.,-3.5))/48.;" "}" "l/=(l+1.)/2.;" - "gl_FragColor.xyz=pow(l+.01*vec3(1,1,.5),vec3(1./2.2))+h()/1e2;" + "gl_FragColor.xyz=pow(l+.01*vec3(1,1,.5),vec3(1./2.2))+m()/1e2;" "}"; #endif // THE_REAL_PARTY_IS_IN_YOUR_POCKET_FRAG_EXPECTED_ diff --git a/tests/real/yx_long_way_from_home.frag.expected b/tests/real/yx_long_way_from_home.frag.expected index 3123ea7..19de2af 100644 --- a/tests/real/yx_long_way_from_home.frag.expected +++ b/tests/real/yx_long_way_from_home.frag.expected @@ -22,21 +22,21 @@ const char *yx_long_way_from_home_frag = "return fract(sin(vec2(v,v+1.))*vec2(43758.5453123));" "}" "int f;" - "float e(vec2 v)" + "float n(vec2 v)" "{" "vec2 x=vec2(.125,0);" "return length((v-clamp(v,-x,x)).xy);" "}" - "float p(vec2 v)" + "float s(vec2 v)" "{" "return smoothstep(.5,1.,cos(v.x*10.))*1.5+sin(v.x*1e2)*.5+.5;" "}" - "float t(vec3 i)" + "float n(vec3 i)" "{" "float x=min(1e9,length(i-vec3(0,5,0))-2.5);" "vec3 c=i;" "c.x=abs(c.x-1.1)-.2;" - "float s=max(length(c.xz+vec2(0,5))-.01,c.y-5.);" + "float y=max(length(c.xz+vec2(0,5))-.01,c.y-5.);" "c=i;" "if(i.y<.3)" "{" @@ -50,31 +50,31 @@ const char *yx_long_way_from_home_frag = "i.z+=sin(i.x*.5)*.5;" "i.z+=step(.5,mod(i.x,1.))*.3-.15;" "i.x=mod(i.x,.5)-.25;" - "float x=e(i.xz),y=smoothstep(.1,.13,x);" + "float x=n(i.xz),y=smoothstep(.1,.13,x);" "i.y+=.1-y*.03;" "i.y-=smoothstep(.05,0.,abs(x-.16))*.004;" - "i.y-=(1.-y)*.01*p(i.xz);" + "i.y-=(1.-y)*.01*s(i.xz);" "}" "i.y-=smoothstep(2.,0.,length(c.xz+vec2(-1.5,3.5)))*.2;" "i.y-=smoothstep(2.,0.,length(c.xz+vec2(1,-2)))*.2;" - "float y=i.y;" - "x=min(x,y);" + "float l=i.y;" + "x=min(x,l);" "i.y-=.25;" - "f=s0.&&!e(t+a*.002,h,o,k,g))" - "l+=n*r*z;" + "if(m>0.&&!e(n+a*.002,r,o,k,g))" + "l+=z*m*y;" "i=s(i.y);" "}" - "else if(abs(h)>.1)" - "return l+vec3(1,2,3)*.2*n;" + "else if(abs(m)>.1)" + "return l+vec3(1,2,3)*.2*z;" "else" " break;" "}" "return vec3(0);" "}" - "vec2 c()" + "vec2 e()" "{" "vec2 v=i;" "if(v.y>v.x)" @@ -159,27 +159,27 @@ const char *yx_long_way_from_home_frag = "void main()" "{" "vec2 v=gl_FragCoord.xy/iResolution.xy-.5;" - "float x=iTime+(v.x+iResolution.x*v.y)*1.51269341231;" - "i=s(x);" + "float c=iTime+(v.x+iResolution.x*v.y)*1.51269341231;" + "i=s(c);" "v+=(i-.5)/iResolution.xy;" "v.x*=iResolution.x/iResolution.y;" - "const vec3 y=vec3(-4,2,3),t=vec3(0);" + "const vec3 x=vec3(-4,2,3),y=vec3(0);" "const vec2 z=vec2(1,2)*.015;" "vec3 f=vec3(0),r=normalize(vec3(v,2));" - "v=c();" + "v=e();" "f.xy+=v*z;" - "r.xy-=v*z*r.z/length(y-t);" - "vec3 h=t-y;" - "x=-atan(h.y,length(h.xz));" - "float a=-atan(h.x,h.z);" - "f.yz*=n(x);" - "r.yz*=n(x);" - "f.xz*=n(a);" - "r.xz*=n(a);" - "f+=y;" - "vec4 g=vec4(c(f,r),1);" - "gl_FragColor=!isnan(g.x)&&g.x>=0.?" - "g:" + "r.xy-=v*z*r.z/length(x-y);" + "vec3 l=y-x;" + "c=-atan(l.y,length(l.xz));" + "float m=-atan(l.x,l.z);" + "f.yz*=n(c);" + "r.yz*=n(c);" + "f.xz*=n(m);" + "r.xz*=n(m);" + "f+=x;" + "vec4 a=vec4(e(f,r),1);" + "gl_FragColor=!isnan(a.x)&&a.x>=0.?" + "a:" "vec4(0);" "}"; From 79010e799c3ae4e7b3c555b1d51b971057f57e64 Mon Sep 17 00:00:00 2001 From: Laurent Le Brun Date: Sun, 6 Apr 2025 16:59:55 +0200 Subject: [PATCH 3/5] Add tests and documentation --- Minifier/options.fs | 4 ++ Minifier/renamer.fs | 6 +-- README.md | 49 +++++++++++++---------- tests/commands.txt | 1 + tests/unit/function_overload.expected | 42 ++++++++++++------- tests/unit/function_overload.frag | 6 +++ tests/unit/function_overload.no.expected | 51 ++++++++++++++++++++++++ tests/unit/function_overload2.expected | 20 ++++++++-- 8 files changed, 135 insertions(+), 44 deletions(-) create mode 100644 tests/unit/function_overload.no.expected diff --git a/Minifier/options.fs b/Minifier/options.fs index 7e96aab..8c5cb95 100644 --- a/Minifier/options.fs +++ b/Minifier/options.fs @@ -37,6 +37,7 @@ type CliArguments = | [] NoRenamingList of string | [] NoSequence | [] NoRemoveUnused + | [] NoOverloading | [] MoveDeclarations | [] Preprocess | [] ExportKkpSymbolMaps @@ -58,6 +59,7 @@ type CliArguments = | NoRenaming -> "Do not rename anything" | NoRenamingList _ -> "Comma-separated list of functions to preserve" | NoSequence -> "Do not use the comma operator trick" + | NoOverloading -> "When renaming functions, do not introduce new overloads" | NoRemoveUnused -> "Do not remove unused code" | MoveDeclarations -> "Move declarations to group them" | Preprocess -> "Evaluate some of the file preprocessor directives" @@ -76,6 +78,7 @@ type Options = { preserveAllGlobals: bool hlsl: bool noInlining: bool + noOverloading: bool aggroInlining: bool noSequence: bool noRenaming: bool @@ -115,6 +118,7 @@ let private initPrivate argv = preserveAllGlobals = args.Contains(PreserveAllGlobals) hlsl = args.Contains(Hlsl) noInlining = args.Contains(NoInlining) + noOverloading = args.Contains(NoOverloading) aggroInlining = args.Contains(AggroInlining) && not (args.Contains(NoInlining)) noSequence = args.Contains(NoSequence) noRenaming = args.Contains(NoRenaming) diff --git a/Minifier/renamer.fs b/Minifier/renamer.fs index 288700f..9c4075a 100644 --- a/Minifier/renamer.fs +++ b/Minifier/renamer.fs @@ -391,16 +391,16 @@ type private RenamerImpl(options: Options.Options) = let text = [for shader in shaders -> Printer.print shader.code] |> String.concat "\0" let names = computeListOfNames text |> List.filter (fun x -> not <| List.contains x forbiddenNames) - + let allowOverloading = not options.noOverloading let mutable env = if Array.length shaders > 1 then // Env.Create(names, true, bijectiveRenaming names, shadowVariables) let exportsRenames = Seq.zip [for export in exportedNames -> export.name] names |> dict let contextTable = computeContextTable text - Env.Create(names, true, multiFileRenaming contextTable exportsRenames, shadowVariables) + Env.Create(names, allowOverloading, multiFileRenaming contextTable exportsRenames, shadowVariables) else let contextTable = computeContextTable text - Env.Create(names, true, optimizeContext contextTable, shadowVariables) + Env.Create(names, allowOverloading, optimizeContext contextTable, shadowVariables) env <- dontRenameList env options.noRenamingList env.exportedNames.Value <- exportedNames renameAsts shaders env diff --git a/README.md b/README.md index 9f359e0..d5fd5bb 100644 --- a/README.md +++ b/README.md @@ -97,14 +97,14 @@ $ mono shader_minifier.exe # Linux, Mac... ``` ``` -USAGE: Shader Minifier [--help] [-o ] [-v] [--hlsl] +USAGE: Shader Minifier [--help] [--version] [-o ] [-v] [--debug] [--hlsl] [--format ] [--field-names ] [--preserve-externals] [--preserve-all-globals] [--no-inlining] [--aggressive-inlining] [--no-renaming] [--no-renaming-list ] [--no-sequence] - [--no-remove-unused] - [--move-declarations] [...] + [--no-remove-unused] [--no-overloading] [--move-declarations] + [--preprocess] [--export-kkp-symbol-maps] [...] FILENAMES: @@ -112,32 +112,33 @@ FILENAMES: OPTIONS: + --version Display the version and exit -o Set the output filename (default is shader_code.h) -v Verbose, display additional information + --debug Debug, display more additional information --hlsl Use HLSL (default is GLSL) --format - Choose to format the output (use 'text' if you want - just the shader) + Choose to format the output (use 'text' if you want just + the shader) --field-names - Choose the field names for vectors: 'rgba', 'xyzw', - or 'stpq' + Choose the field names for vectors: 'rgba', 'xyzw', or + 'stpq' --preserve-externals Do not rename external values (e.g. uniform) --preserve-all-globals Do not rename functions and global variables - --no-inlining Do not automatically inline variables, functions - and arguments - --aggressive-inlining Aggressively inline constants. This can reduce output - size due to better constant folding. It can also - increase output size due to repeated inlined - constants, but this increased redundancy can be - beneficial to compression, leading to a smaller final - compressed size anyway. Does nothing if inlining is - disabled. + --no-inlining Do not automatically inline variables and functions + --aggressive-inlining Aggressively inline constants. This can reduce output size + due to better constant folding. It can also increase + output size due to repeated inlined constants, but this + increased redundancy can be beneficial to compression, + leading to a smaller final compressed size anyway. Does + nothing if inlining is disabled. --no-renaming Do not rename anything --no-renaming-list Comma-separated list of functions to preserve --no-sequence Do not use the comma operator trick --no-remove-unused Do not remove unused code + --no-overloading When renaming functions, do not introduce new overloads --move-declarations Move declarations to group them --preprocess Evaluate some of the file preprocessor directives --export-kkp-symbol-maps @@ -274,13 +275,17 @@ layout(local_size_x = 32) in; ### Overloading -At this time, do not use overloaded functions (two functions with the same name -but different arguments) in the input. The output probably won't compile. +When renaming functions, Shader Minifier will try to introduce as much +overloading as possible. This reduces the number of identifiers used by the +shader and makes it more compression-friendly. + +Shader Minifier works best when the input code doesn't use function overloading +(two functions with the same name and different arguments). Function overloading +might confuse the analysis and lead to an output that doesn't compile. Use the +flag `--no-overloading` if you don't want Shader Minifier to introduce function +overloading, it's probably safer. Please also file issues related to function +overloading, as we don't have enough test coverage at the moment. -On the other hand, Shader Minifier will aggressively use function overloading in -the output. If two functions have a different number of arguments, they may have -the same name in the output. This reduces the number of identifiers used by the -shader and make it more compression friendly. ### kkpView symbol maps diff --git a/tests/commands.txt b/tests/commands.txt index 33a38f1..6ff1cab 100644 --- a/tests/commands.txt +++ b/tests/commands.txt @@ -87,6 +87,7 @@ -o tests/real/oscars_chair.frag.expected tests/real/oscars_chair.frag -o tests/real/the_real_party_is_in_your_pocket.frag.expected tests/real/the_real_party_is_in_your_pocket.frag --no-remove-unused --no-inlining -o tests/unit/function_overload.expected tests/unit/function_overload.frag +--no-remove-unused --no-inlining --no-overloading -o tests/unit/function_overload.no.expected tests/unit/function_overload.frag --no-remove-unused -o tests/unit/function_overload2.expected tests/unit/function_overload.frag -o tests/unit/overload.expected tests/unit/overload.frag --no-remove-unused -o tests/unit/externals.expected tests/unit/externals.frag diff --git a/tests/unit/function_overload.expected b/tests/unit/function_overload.expected index b61a4f9..c913ae2 100644 --- a/tests/unit/function_overload.expected +++ b/tests/unit/function_overload.expected @@ -3,37 +3,49 @@ # define FUNCTION_OVERLOAD_EXPECTED_ const char *function_overload_frag = - "int H()" + "int h()" "{" "return 0;" "}" - "int H(int G)" + "int h(int l)" "{" - "return H()+G;" + "return h()+l;" "}" - "int H(int i,int G)" + "int h(int i,int l)" "{" - "return H(i)+G;" + "return h(i)+l;" "}" - "int H(int i,int G,int E)" + "int h(int i,int l,int J)" "{" - "return H(i,G)+E;" + "return h(i,l)+J;" "}" - "int H(int i,int G,int E,int D)" + "int h(int i,int l,int J,int I)" "{" - "return H(i,G,E)+D;" + "return h(i,l,J)+I;" "}" - "int G(int G)" + "int h(vec2 i)" "{" - "return G;" + "return length(i);" "}" - "int G(int i,int H)" + "int h(vec3 i)" "{" - "return G(i)*H;" + "return length(i);" "}" - "int G(int i,int H,int E)" + "int h(int l,vec2 i)" "{" - "return G(i,H)*E;" + "return length(i)+l;" + "}" + "int l(int l)" + "{" + "return l;" + "}" + "int l(int i,int h)" + "{" + "return l(i)*h;" + "}" + "int l(int i,int h,int J)" + "{" + "return l(i,h)*J;" "}"; #endif // FUNCTION_OVERLOAD_EXPECTED_ diff --git a/tests/unit/function_overload.frag b/tests/unit/function_overload.frag index cd0d5e0..8789eed 100644 --- a/tests/unit/function_overload.frag +++ b/tests/unit/function_overload.frag @@ -8,6 +8,12 @@ int sum3(int x, int y, int z) { return sum2(x, y) + z; } int sum4(int x, int y, int z, int w) { return sum3(x, y, z) + w; } +int sum5(vec2 v2) { return length(v2); } + +int sum6(vec3 v3) { return length(v3); } + +int sum7(int x, vec2 v2) { return length(v2) + x; } + int mult1(int x) { return x; } int mult2(int x, int y) { return mult1(x) * y; } diff --git a/tests/unit/function_overload.no.expected b/tests/unit/function_overload.no.expected new file mode 100644 index 0000000..20233c6 --- /dev/null +++ b/tests/unit/function_overload.no.expected @@ -0,0 +1,51 @@ +// Generated with (https://github.com/laurentlb/Shader_Minifier/) +#ifndef FUNCTION_OVERLOAD_NO_EXPECTED_ +# define FUNCTION_OVERLOAD_NO_EXPECTED_ + +const char *function_overload_frag = + "int h()" + "{" + "return 0;" + "}" + "int l(int l)" + "{" + "return h()+l;" + "}" + "int K(int i,int D)" + "{" + "return l(i)+D;" + "}" + "int J(int i,int l,int D)" + "{" + "return K(i,l)+D;" + "}" + "int I(int i,int l,int D,int E)" + "{" + "return J(i,l,D)+E;" + "}" + "int H(vec2 i)" + "{" + "return length(i);" + "}" + "int G(vec3 i)" + "{" + "return length(i);" + "}" + "int F(int l,vec2 i)" + "{" + "return length(i)+l;" + "}" + "int E(int i)" + "{" + "return i;" + "}" + "int D(int i,int l)" + "{" + "return E(i)*l;" + "}" + "int C(int i,int l,int E)" + "{" + "return D(i,l)*E;" + "}"; + +#endif // FUNCTION_OVERLOAD_NO_EXPECTED_ diff --git a/tests/unit/function_overload2.expected b/tests/unit/function_overload2.expected index 6ca3ed8..ad4a6b7 100644 --- a/tests/unit/function_overload2.expected +++ b/tests/unit/function_overload2.expected @@ -3,13 +3,25 @@ # define FUNCTION_OVERLOAD2_EXPECTED_ const char *function_overload_frag = - "int H(int H,int G,int F,int E)" + "int h(int l,int h,int K,int J)" "{" - "return H+G+F+E;" + "return l+h+K+J;" "}" - "int H(int H,int G,int F)" + "int h(vec2 l)" "{" - "return H*G*F;" + "return length(l);" + "}" + "int h(vec3 l)" + "{" + "return length(l);" + "}" + "int h(int l,vec2 i)" + "{" + "return length(i)+l;" + "}" + "int h(int t,int l,int i)" + "{" + "return t*l*i;" "}"; #endif // FUNCTION_OVERLOAD2_EXPECTED_ From 88749d3af6ea57439450a807709b3d91ed9fe107 Mon Sep 17 00:00:00 2001 From: Laurent Le Brun Date: Sun, 6 Apr 2025 17:20:36 +0200 Subject: [PATCH 4/5] update tests --- tests/unit/function_overload.expected | 26 ++++++++++-------- tests/unit/function_overload.frag | 8 +++--- tests/unit/function_overload.no.expected | 34 +++++++++++++----------- tests/unit/function_overload2.expected | 18 ++++++++----- 4 files changed, 50 insertions(+), 36 deletions(-) diff --git a/tests/unit/function_overload.expected b/tests/unit/function_overload.expected index c913ae2..a821a75 100644 --- a/tests/unit/function_overload.expected +++ b/tests/unit/function_overload.expected @@ -15,23 +15,27 @@ const char *function_overload_frag = "{" "return h(i)+l;" "}" - "int h(int i,int l,int J)" + "int h(int i,int l,int f)" "{" - "return h(i,l)+J;" + "return h(i,l)+f;" "}" - "int h(int i,int l,int J,int I)" + "int h(int i,int l,int f,int L)" "{" - "return h(i,l,J)+I;" + "return h(i,l,f)+L;" "}" - "int h(vec2 i)" + "float h(vec2 i)" "{" "return length(i);" "}" - "int h(vec3 i)" + "float h(vec3 i)" "{" "return length(i);" "}" - "int h(int l,vec2 i)" + "float h(int i,vec2 l)" + "{" + "return length(l)+float(i);" + "}" + "float h(float l,vec2 i)" "{" "return length(i)+l;" "}" @@ -39,13 +43,13 @@ const char *function_overload_frag = "{" "return l;" "}" - "int l(int i,int h)" + "int l(int i,int f)" "{" - "return l(i)*h;" + "return l(i)*f;" "}" - "int l(int i,int h,int J)" + "int l(int i,int f,int h)" "{" - "return l(i,h)*J;" + "return l(i,f)*h;" "}"; #endif // FUNCTION_OVERLOAD_EXPECTED_ diff --git a/tests/unit/function_overload.frag b/tests/unit/function_overload.frag index 8789eed..6700b1d 100644 --- a/tests/unit/function_overload.frag +++ b/tests/unit/function_overload.frag @@ -8,11 +8,13 @@ int sum3(int x, int y, int z) { return sum2(x, y) + z; } int sum4(int x, int y, int z, int w) { return sum3(x, y, z) + w; } -int sum5(vec2 v2) { return length(v2); } +float sum5(vec2 v2) { return length(v2); } -int sum6(vec3 v3) { return length(v3); } +float sum6(vec3 v3) { return length(v3); } -int sum7(int x, vec2 v2) { return length(v2) + x; } +float sum7(int x, vec2 v2) { return length(v2) + float(x); } + +float sum8(float x, vec2 v2) { return length(v2) + x; } int mult1(int x) { return x; } diff --git a/tests/unit/function_overload.no.expected b/tests/unit/function_overload.no.expected index 20233c6..d4da250 100644 --- a/tests/unit/function_overload.no.expected +++ b/tests/unit/function_overload.no.expected @@ -11,41 +11,45 @@ const char *function_overload_frag = "{" "return h()+l;" "}" - "int K(int i,int D)" + "int t(int i,int F)" "{" - "return l(i)+D;" + "return l(i)+F;" "}" - "int J(int i,int l,int D)" + "int M(int i,int l,int F)" "{" - "return K(i,l)+D;" + "return t(i,l)+F;" "}" - "int I(int i,int l,int D,int E)" + "int L(int i,int l,int F,int G)" "{" - "return J(i,l,D)+E;" + "return M(i,l,F)+G;" "}" - "int H(vec2 i)" + "float K(vec2 i)" "{" "return length(i);" "}" - "int G(vec3 i)" + "float J(vec3 i)" "{" "return length(i);" "}" - "int F(int l,vec2 i)" + "float I(int i,vec2 l)" + "{" + "return length(l)+float(i);" + "}" + "float H(float l,vec2 i)" "{" "return length(i)+l;" "}" - "int E(int i)" + "int G(int l)" "{" - "return i;" + "return l;" "}" - "int D(int i,int l)" + "int F(int i,int l)" "{" - "return E(i)*l;" + "return G(i)*l;" "}" - "int C(int i,int l,int E)" + "int E(int i,int l,int G)" "{" - "return D(i,l)*E;" + "return F(i,l)*G;" "}"; #endif // FUNCTION_OVERLOAD_NO_EXPECTED_ diff --git a/tests/unit/function_overload2.expected b/tests/unit/function_overload2.expected index ad4a6b7..79d09ec 100644 --- a/tests/unit/function_overload2.expected +++ b/tests/unit/function_overload2.expected @@ -3,25 +3,29 @@ # define FUNCTION_OVERLOAD2_EXPECTED_ const char *function_overload_frag = - "int h(int l,int h,int K,int J)" + "int h(int l,int f,int h,int M)" "{" - "return l+h+K+J;" + "return l+f+h+M;" "}" - "int h(vec2 l)" + "float h(vec2 l)" "{" "return length(l);" "}" - "int h(vec3 l)" + "float h(vec3 l)" "{" "return length(l);" "}" - "int h(int l,vec2 i)" + "float h(int l,vec2 i)" + "{" + "return length(i)+float(l);" + "}" + "float h(float l,vec2 i)" "{" "return length(i)+l;" "}" - "int h(int t,int l,int i)" + "int h(int l,int h,int i)" "{" - "return t*l*i;" + "return l*h*i;" "}"; #endif // FUNCTION_OVERLOAD2_EXPECTED_ From 2fd28ba7fcffdb78d497f39fa7288b6d0a6bf19d Mon Sep 17 00:00:00 2001 From: Laurent Le Brun Date: Sun, 6 Apr 2025 17:37:47 +0200 Subject: [PATCH 5/5] a bit more test coverage --- tests/unit/function_overload.expected | 14 ++++++--- tests/unit/function_overload.frag | 4 +++ tests/unit/function_overload.no.expected | 38 ++++++++++++++---------- tests/unit/function_overload2.expected | 14 ++++++--- 4 files changed, 46 insertions(+), 24 deletions(-) diff --git a/tests/unit/function_overload.expected b/tests/unit/function_overload.expected index a821a75..33affbb 100644 --- a/tests/unit/function_overload.expected +++ b/tests/unit/function_overload.expected @@ -19,9 +19,9 @@ const char *function_overload_frag = "{" "return h(i,l)+f;" "}" - "int h(int i,int l,int f,int L)" + "int h(int i,int l,int v,int f)" "{" - "return h(i,l,f)+L;" + "return h(i,l,v)+f;" "}" "float h(vec2 i)" "{" @@ -47,9 +47,15 @@ const char *function_overload_frag = "{" "return l(i)*f;" "}" - "int l(int i,int f,int h)" + "int l(int i,int v,int f)" "{" - "return l(i,f)*h;" + "return l(i,v)*f;" + "}" + "void l(const int i,vec2 l)" + "{}" + "int l(float i,vec2 l)" + "{" + "return 0;" "}"; #endif // FUNCTION_OVERLOAD_EXPECTED_ diff --git a/tests/unit/function_overload.frag b/tests/unit/function_overload.frag index 6700b1d..cd4220b 100644 --- a/tests/unit/function_overload.frag +++ b/tests/unit/function_overload.frag @@ -21,3 +21,7 @@ int mult1(int x) { return x; } int mult2(int x, int y) { return mult1(x) * y; } int mult3(int x, int y, int z) { return mult2(x, y) * z; } + +void mult7(const int x, vec2 v2) {} + +int mult8(float x, in vec2 v2) { return 0; } diff --git a/tests/unit/function_overload.no.expected b/tests/unit/function_overload.no.expected index d4da250..bb98c6c 100644 --- a/tests/unit/function_overload.no.expected +++ b/tests/unit/function_overload.no.expected @@ -11,45 +11,51 @@ const char *function_overload_frag = "{" "return h()+l;" "}" - "int t(int i,int F)" + "int i(int i,int H)" "{" - "return l(i)+F;" + "return l(i)+H;" "}" - "int M(int i,int l,int F)" + "int t(int l,int H,int I)" "{" - "return t(i,l)+F;" + "return i(l,H)+I;" "}" - "int L(int i,int l,int F,int G)" + "int N(int i,int l,int H,int I)" "{" - "return M(i,l,F)+G;" + "return t(i,l,H)+I;" "}" - "float K(vec2 i)" + "float M(vec2 i)" "{" "return length(i);" "}" - "float J(vec3 i)" + "float L(vec3 i)" "{" "return length(i);" "}" - "float I(int i,vec2 l)" + "float K(int i,vec2 l)" "{" "return length(l)+float(i);" "}" - "float H(float l,vec2 i)" + "float J(float l,vec2 i)" "{" "return length(i)+l;" "}" - "int G(int l)" + "int I(int i)" "{" - "return l;" + "return i;" "}" - "int F(int i,int l)" + "int H(int i,int l)" "{" - "return G(i)*l;" + "return I(i)*l;" "}" - "int E(int i,int l,int G)" + "int G(int i,int l,int I)" "{" - "return F(i,l)*G;" + "return H(i,l)*I;" + "}" + "void F(const int i,vec2 l)" + "{}" + "int E(float i,vec2 l)" + "{" + "return 0;" "}"; #endif // FUNCTION_OVERLOAD_NO_EXPECTED_ diff --git a/tests/unit/function_overload2.expected b/tests/unit/function_overload2.expected index 79d09ec..ceda830 100644 --- a/tests/unit/function_overload2.expected +++ b/tests/unit/function_overload2.expected @@ -3,9 +3,9 @@ # define FUNCTION_OVERLOAD2_EXPECTED_ const char *function_overload_frag = - "int h(int l,int f,int h,int M)" + "int h(int l,int f,int h,int i)" "{" - "return l+f+h+M;" + "return l+f+h+i;" "}" "float h(vec2 l)" "{" @@ -23,9 +23,15 @@ const char *function_overload_frag = "{" "return length(i)+l;" "}" - "int h(int l,int h,int i)" + "int h(int l,int i,int h)" "{" - "return l*h*i;" + "return l*i*h;" + "}" + "void l(const int l,vec2 i)" + "{}" + "int l(float l,vec2 i)" + "{" + "return 0;" "}"; #endif // FUNCTION_OVERLOAD2_EXPECTED_