Special K: an interactive K compiler that generates GLSL
beyondloom.com
beyondloom.com
For people who don't know this one: another JS based version of k: http://johnearnest.github.io/ok/ike/ike.html
(without the glsl)
f:{
x.z+:((frame + x.x*sin 0.03* frame + x.y*cos 0.2 * frame)*.03); a:x.z^0.94
x.xy*:mat[cos a;sin a;-sin a;cos a]
.02-#(cos x.xy)+sin x.yz
}
p: 70{x+f[x]*0.5-(pos.xy;340)%size.x}/(0;0;0)
col:((3;5;1)%#p),1
Can anyone give a bit of intuition behind the following construction in reticulum? p:32{x+f[x]*.5-(pos.xy;1)%size.x}/0 0 0
It appears to be some kind of fixed-point iterative approximation: we initialise an accumulator with the zero vec3 (0;0;0) then transform it 32 times by iteratively mapping it by lambda : vec3 -> vec3 where lambda(x) := x+f[x]*.5-(pos.xy;1)%size.xSo if we crank up the number of iterations from 32 to 64 or 1000 or whatever we get a better approximation of the limit, but it looks better -- due to the fuzzier edges -- after a modest number of iterations. (it also takes a lot less effort to compute the fewer iterations we do).
*.5-(pos.xy;1)%size.x
This produces a vec3 of the screen-space coordinates of the fragment, scaled to a -0.5 to 0.5 range (assuming a square display) and the z component will be the scaling factor. This also happens to invert the axes, which doesn't matter. x.xy*:mat[cos a;sin a;-sin a;cos a]
This is a standard 2d rotation matrix- rotate the position xy about the origin by angle a.Your comment is a good description of the overall algorithm.
The real barrier to adoption is likely the same with most non-mainstream languages: unpopularity is a vicious cycle, just as popularity is a virtuous one.
But come on, it doesn't even have first-class functions. There are countless examples of unreadable macros and code duplication out there due to GLSL's extreme simplicity.
A good example there is `twist-func' which takes in a world-space position, a block that hands back a twist factor, and a block that receives the transformed position (in object space). Once you start doing things that way, you end up with ridiculously rapid development, which is the whole reason I created this family of languages; started as an experiment to take APL/K, Lisp, and Forth and smash them all together, and it ended up working out well enough that I've kept it going for 7 years now.
https://www.iquilezles.org/www/articles/distfunctions/distfu...
If you scroll down to the section "Deformations and distortions", you'll notice that iq wishes so hard there were first class functions in GLSL that he pretends they exist in all the code examples (the deformation functions all take functions as parameters).
As for macros specifically filling in the role of first class functions, this is sometimes done by creating a macro that takes a function as parameter. So for example, iq's functions above could be turned into crazy macros.
Have a look at "4.2 Branching" in http://developer.amd.com/wordpress/media/2013/12/AMD_GCN3_In...
Also, it's possible to compile code using function pointers down to more limited forms of flow control instructions.
Special-K is a subset of the k6 dialect of this language, in part due to the constrants of GLSL, which retains its concise nature and which should be intelligible and convenient for those who already know K. For those who do not yet know K, it may still be a pleasant way to experiment with fragment shaders.