:PROPERTIES:
#+title: cellular programming test document
#+author: bsp
See also: test 2 (literate)
* COMMENT execute source block under cursor with C-c C-c (org-babel-execute-src-block)
* source blocks
** lisp
#+begin_src emacs-lisp
(defun org-xor (a b)
"Exclusive or."
(if a (not b) b))
#+end_src
#+results:
: org-xor
** C
;; :results value raw
#+begin_src C :results output replace
#include <stdio.h>
int main(void) {
printf("hello, world!\n");
return 0;
}
#+end_src
#+results:
: hello, world!
** Python
#+begin_src python
return "hello, world."
#+end_src
#+results:
: hello, world.
** Shell
#+begin_src shell :results output replace :eval query
ls
#+end_src
#+results:
#+begin_example
cellular.org
cellular.org.html
literate.org
literate.org.html
myfs1.png
myfs2.png
myfunc.png
myfunc2.png
org-mode-unicorn.svg
test_client.org
test_client.org.html
#+end_example
#+begin_src shell :results file link :file "org-mode-unicorn.svg" :eval query
wget -c "https://orgmode.org/resources/img/org-mode-unicorn.svg"
#+end_src
#+results:
** TKS
*** test 1 (hello, world.)
#+begin_src tks :results output replace
trace "hello, world.";
#+end_src
#+results:
: hello, world.
*** test 2 (version)
#+begin_src tks :cmd-line "-v" :results output replace
#+end_src
#+results:
: 0.9.86.6 (arm64)
*** test 3 (class)
#+begin_src tks :results output replace
class MyClass{test{trace "this.type="+typename(this)+" this.class="+yacMetaClassName();}}
MyClass c; c.test();
trace [1 2 3 4];
#+end_src
#+results:
: this.type=Class this.class=MyClass
: [1, 2, 3, 4]
*** test 4 (args)
#+begin_src tks :args "1 '2 2.5' 3" :results output replace :eval yes
trace Arguments;
#+end_src
#+results:
: ["1", "2 2.5", "3"]
*** test 5 (plot)
#+begin_src tks :cmd-line "-ef lib:plot" :results output replace :eval yes
function myfunc(float x) { return pow(sin(x), 3); }
Plot.Run(myfunc, 0, 2PI);
trace "plot finished";
#+end_src
#+results:
: plot finished
*** test 6 (plot to PNG)
#+xxbegin_src tks :cmd-line "-ef lib:plot" :results file link :file "myfunc.png" :wrap "org \n#+ATTR_HTML: :width 640"
#+begin_src tks :cmd-line "-ef lib:plot" :results file link :file "myfunc.png"
function myfunc(float x) { return pow(sin(x), 3) * 0.9; }
Plot.SetSize(640, 240); Plot.SavePNG("myfunc.png", myfunc, 0, 2PI);
#+end_src
#+results:
*** test 7 (plot to PNG 2)
#+begin_src tks :cmd-line "-ef lib:plot" :results file link :file "myfunc2.png"
function myfunc(float x) { return sin(x + 0.25 * pow(sin(2*x), 3)) * 0.95; }
Plot.SetSize(640, 240); Plot.SavePNG("myfunc2.png", myfunc, 0, 2PI);
#+end_src
#+results:
*** test 8 (plot fragment shader 1)
#+begin_src tks :cmd-line "-ep lib:plot-fs" :results output replace :eval yes
PlotFS.Run("c = vec4(sin(p.x*M_2PI*4), fract(u_t), sin(p.y*M_2PI*9), 0,1);");
#+end_src
#+results:
: 57 frames rendered.
*** test 9 (plot fragment shader 2)
#+begin_src tks :cmd-line "-ep lib:plot-fs" :results output replace :eval yes
String sFS <= "vec2 t; float d = 0; float s = 0.6;"
"t = vec2(p - s*vec2(sin(u_t*1.31), sin(u_t*1.7)));"
"d += 1.0 - clamp(sqrt(t.x*t.x + t.y*t.y), 0.0, 1.0);"
"t = vec2(p - s*vec2(sin(u_t*-0.93), sin(u_t*1.9)));"
"d -= 1.0 - clamp(sqrt(t.x*t.x + t.y*t.y), 0.0, 1.0);"
"t = vec2(p - s*vec2(sin(u_t*-0.43), sin(u_t*-1.1)));"
"d += 1.0 - clamp(sqrt(t.x*t.x + t.y*t.y), 0.0, 1.0);"
"t = vec2(p - s*vec2(sin(u_t*0.43), sin(u_t*1.1)));"
"d -= 1.0 - clamp(sqrt(t.x*t.x + t.y*t.y), 0.0, 1.0);"
"if(d < 0.0) d = -d;"
"d = clamp(pow(d, 2.3), 0.0, 2.0);"
"c = vec4(mix(vec3(0.05+0.05*(1.0-p.y),0.2+0.1*(1.0-p.y),0.175+0.175*(1.0-p.y)), vec3(0.8+0.1*(1.0-p.x),0.7,0.2), d), 1);"
"p = (p * 0.5) + 0.5;"
"p *= 1.0 - p.yx;"
"d = pow(p.x*p.y*23, 0.85+sin(u_t*0.5)*0.6) * 1.0;"
"c *= d;"
;
PlotFS.Run(sFS);
#+end_src
#+results:
: 105 frames rendered.
*** test 10 (plot fragment shader to PNG)
#+begin_src tks :cmd-line "-ep lib:plot-fs" :results file link :file "myfs1.png"
String sFS <= "vec2 t; float d = 0; float s = 0.6;"
"t = vec2(p - s*vec2(sin(u_t*1.31), sin(u_t*1.7)));"
"d += 1.0 - clamp(sqrt(t.x*t.x + t.y*t.y), 0.0, 1.0);"
"t = vec2(p - s*vec2(sin(u_t*-0.93), sin(u_t*1.9)));"
"d -= 1.0 - clamp(sqrt(t.x*t.x + t.y*t.y), 0.0, 1.0);"
"t = vec2(p - s*vec2(sin(u_t*-0.43), sin(u_t*-1.1)));"
"d += 1.0 - clamp(sqrt(t.x*t.x + t.y*t.y), 0.0, 1.0);"
"t = vec2(p - s*vec2(sin(u_t*0.43), sin(u_t*1.1)));"
"d -= 1.0 - clamp(sqrt(t.x*t.x + t.y*t.y), 0.0, 1.0);"
"if(d < 0.0) d = -d;"
"d = clamp(pow(d, 2.3), 0.0, 2.0);"
"c = vec4(mix(vec3(0.05+0.05*(1.0-p.y),0.2+0.1*(1.0-p.y),0.175+0.175*(1.0-p.y)), vec3(0.8+0.1*(1.0-p.x),0.7,0.2), d), 1);"
"p = (p * 0.5) + 0.5;"
"p *= 1.0 - p.yx;"
"d = pow(p.x*p.y*23, 2.85+sin(u_t*0.5)*0.6) * 1.0;"
"c = mix(vec4(1,1,1,1), c, d);"
;
PlotFS.SetT(36.15); PlotFS.SetSize(640, 480);
if 0 PlotFS.Run(sFS); else PlotFS.SavePNG("myfs1.png", sFS);
#+end_src
#+RESULTS:
*** test 11 (plot fragment shader with controls)
#+begin_src tks :cmd-line "-ep lib:plot-fs" :results output replace :eval yes
String sFS <= "c = vec4(u_r + u_r*sin(u_t+sin(p.x*M_2PI*0.4 * p.y))*u_scl1, "
"u_g + u_g*sin(u_t*1.3 + sin( ((p.x*0.5)+(p.y*0.6))*M_2PI*0.5)*0.2)*u_scl2, "
"u_b+u_b*sin(u_t*p.x*1.1)*sin(u_t*1.23*p.y)*u_scl3, 1);"
;
PlotFS.SetT(122.3); PlotFS.SetSize(640, 240);
PlotFS.AddCtl("r", 0.5);
PlotFS.AddCtl("g", 0.6);
PlotFS.AddCtl("b", 0.7);
PlotFS.AddCtl("scl1", 0.05);
PlotFS.AddCtl("scl2", 0.1);
PlotFS.AddCtl("scl3", 0.7);
PlotFS.SetPNGOutput("myfs2.png", 1);
PlotFS.Run(sFS);
#+end_src
#+results:
#+begin_example
[dbg] UI.SaveScreenShotPNG: pathName="myfs2.png" off=(0,0) s=(640,460)
[...] Texture::saveImage("myfs2.png")
[...] exportPNG: wrote "myfs2.png"
PlotsFS.AddCtl("r", 0.0877309);
PlotsFS.AddCtl("g", 0.6);
PlotsFS.AddCtl("b", 0.7);
PlotsFS.AddCtl("scl1", 0.05);
PlotsFS.AddCtl("scl2", 0.641117);
PlotsFS.AddCtl("scl3", 0.7);
238 frames rendered.
#+end_example
** TKS-remote
* start test_host
Must done on shell (editor hangs otherwise)
#+begin_src shell :results output replace :eval query
tks app:test_host &!
#+end_src
#+results:
#+results:
:
*** test 1 (live coding)
Connects to script host ~test_host~ and evaluates some code in the context of the running host program.
The host ~MyAPI~ provides a few members and methods to play with.
#+begin_src tks-rs :host "test_host" :results output replace
trace "hello, world.";
trace "i="+MyAPI.i+" f="+MyAPI.f+" s=\""+MyAPI.s+"\"";
trace "MyAPI.Add(23, 42)="+MyAPI.Add(23, 42);
trace "MyAPI.Add(1.23, 4.56)="+MyAPI.Add(1.23, 4.56);
#+end_src
#+results:
: hello, world.
: i=42 f=3.14159 s="mystring"
: MyAPI.Add(23, 42)=65
: MyAPI.Add(1.23, 4.56)=5.79
* Link test
** TODO move to another document
*** some section
an anchor that the link below refers to
*** links
M-x org-store-link
C-c C-L : insert link (C-u C-c C-L inserts file link)
C-c C-l : edit link
C-c C-o : open link
file:~/tmp/t.txt
link to some section
link to file:~/Projects/emacs_cheats.txt::org mode links
~/Projects/emacs_cheats.txt
* Notes
** COMMENT use ":results output discard" to quietly ignore stdout messages
** COMMENT ":eval query" forces confirmation
** COMMENT M-x org-toggle-inline-images
** COMMENT M-x htmlize-buffer