<snapdata remixID="10002424"><project name="Raycasting library" app="Snap! 6, https://snap.berkeley.edu" version="1"><notes></notes><thumbnail>data:image/png;base64,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</thumbnail><stage name="Stage" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="flat" ternary="false" hyperops="true" codify="false" inheritance="true" sublistIDs="false" scheduled="false" id="1"><pentrails>data:image/png;base64,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</pentrails><costumes><list struct="atomic" id="2"></list></costumes><sounds><list struct="atomic" id="3"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites><sprite name="Sprite" idx="1" x="240" y="-180" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="0" color="166.27743415463138,166.27743415463138,166.27743415463138,1" pen="tip" id="8"><costumes><list struct="atomic" id="9"></list></costumes><sounds><list struct="atomic" id="10"></list></sounds><blocks></blocks><variables></variables><scripts><script x="19" y="10"><block s="receiveGo"></block><custom-block s="Initialize Datatypes"></custom-block><custom-block s="let %upvar be %s"><l>map</l><custom-block s="map"></custom-block></custom-block><custom-block s="let %upvar be %s"><l>lights</l><block s="reportNewList"><list></list></block></custom-block><custom-block s="let %upvar be %s"><l>campos</l><custom-block s="vector x: %n y: %n z: %n"><l>2</l><l>3</l><l>-4</l></custom-block></custom-block><block s="doAddToList"><custom-block s="rounded cube %br $- size: %l %br $- position: %l %br $- rounding: %n"><custom-block s="vector x: %n y: %n z: %n"><l>1</l><l>1</l><l>1</l></custom-block><custom-block s="vector x: %n y: %n z: %n"><l>0</l><l>0</l><l>0</l></custom-block><l>.1</l></custom-block><block var="map"/></block><block s="doAddToList"><custom-block s="cube %br $- size: %l %br $- position: %l"><custom-block s="vector x: %n y: %n z: %n"><l>100</l><l>1</l><l>100</l></custom-block><custom-block s="vector x: %n y: %n z: %n"><l>0</l><l>-2</l><l>0</l></custom-block></custom-block><block var="map"/></block><block s="doAddToList"><custom-block s="point light %br $- color: %n %br $- position: %l %br $- range: %n"><custom-block s="color %clr"><color>255,255,255,1</color></custom-block><custom-block s="vector x: %n y: %n z: %n"><l>0</l><l>3</l><l>0</l></custom-block><l>50</l></custom-block><block var="lights"/></block><block s="clear"></block><custom-block s="render scene %br $- quality: %n %br $- camera position: %l %br $- camera rotation: %l %br $- on map: %obj %br $- with lights: %l %br $- trace mode: %mlt %br $- draw distance: %n units %br $- skybox: %n %br $- view scaling: %n %br $- shadows: %b soft %n"><l>25</l><block var="campos"/><custom-block s="rotation from position %l looking at %l"><block var="campos"/><custom-block s="vector x: %n y: %n z: %n"><l>0</l><l>0</l><l>0</l></custom-block></custom-block><block var="map"/><block var="lights"/><l>Slow</l><l>80</l><custom-block s="%n % amount of color %n"><l>25</l><custom-block s="color %clr"><color>230,246,255,1</color></custom-block></custom-block><l>1.3</l><l><bool>false</bool></l><l>0.4</l></custom-block></script></scripts></sprite></sprites></stage><hidden></hidden><headers></headers><code></code><blocks><block-definition s="vector x: %&apos;x&apos; y: %&apos;y&apos; z: %&apos;z&apos;" type="reporter" category="motion"><header></header><code></code><translations></translations><inputs><input type="%n">0</input><input type="%n">0</input><input type="%n">0</input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>x</l><l>y</l><l>z</l></list><l>return new Vector3(x, y, z);</l></block><list><block var="x"/><block var="y"/><block var="z"/></list></block></block></script></block-definition><block-definition s="vector: %&apos;a&apos; %&apos;op&apos; vector: %&apos;b&apos;" type="reporter" category="motion"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%mlt" readonly="true">+<options>Addition (+)=+&#xD;Subtraction (-)=-&#xD;Multiplication (x)=x&#xD;Division (/)=/&#xD;Power (^)=^&#xD;Modulus (mod)=mod&#xD;Distance (|b-a|)=|b-a|&#xD;Direction ((b-a)/|b-a|)=(b-a)/|b-a|&#xD;Dot (᛫)=᛫</options></input><input type="%l"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>a</l><l>op</l><l>b</l></list><l>switch (op) {&#xD;    case "+":&#xD;        return a.add(b);&#xD;    case "-":&#xD;        return a.sub(b);&#xD;    case "x":&#xD;        return a.mul(b);&#xD;    case "/":&#xD;        return a.div(b);&#xD;    case "^":&#xD;        return a.pow(b);&#xD;    case "mod":&#xD;        return a.mod(b);&#xD;    case "|b-a|":&#xD;        return b.sub(a).length();&#xD;    case "(b-a)/|b-a|":&#xD;        return b.sub(a).normalized()&#xD;    case "᛫":&#xD;        return a.dot(b);&#xD;}</l></block><list><block var="a"/><block var="op"/><block var="b"/></list></block></block></script></block-definition><block-definition s="%&apos;op&apos; of vector %&apos;v&apos;" type="reporter" category="motion"><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true">x<options>x&#xD;y&#xD;z&#xD;normalized&#xD;length&#xD;neg</options></input><input type="%l"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>a</l><l>op</l></list><l>switch (op) {&#xD;    case "x":&#xD;    case "y":&#xD;    case "z":&#xD;        return a[op];&#xD;    case "normalized":&#xD;    case "length":&#xD;        return a[op]();&#xD;    case "neg":&#xD;        return a.unm();&#xD;}</l></block><list><block var="v"/><block var="op"/></list></block></block></script></block-definition><block-definition s="vector: %&apos;a&apos; %&apos;op&apos; %&apos;b&apos;" type="reporter" category="motion"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%mlt" readonly="true">+<options>Addition (+)=+&#xD;Subtraction (-)=-&#xD;Multiplication (x)=x&#xD;Division (/)=/&#xD;Power (^)=^&#xD;Modulus (mod)=mod&#xD;Distance (|b-a|)=|b-a|&#xD;Direction ((b-a)/|b-a|)=(b-a)/|b-a|&#xD;Dot (᛫)=᛫</options></input><input type="%n">0</input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>a</l><l>op</l><l>b</l></list><l>switch (op) {&#xD;    case "+":&#xD;        return a.adds(b);&#xD;    case "-":&#xD;        return a.subs(b);&#xD;    case "x":&#xD;        return a.muls(b);&#xD;    case "/":&#xD;        return a.divs(b);&#xD;    case "^":&#xD;        return a.pows(b);&#xD;    case "mod":&#xD;        return a.mods(b);&#xD;    case "|b-a|":&#xD;        return a.subs(b).length();&#xD;    case "(b-a)/|b-a|":&#xD;        return a.subs(b).unm().normalized()&#xD;    case "᛫":&#xD;        return a.dots(b);&#xD;}</l></block><list><block var="a"/><block var="op"/><block var="b"/></list></block></block></script></block-definition><block-definition s="set %&apos;item&apos; of vector %&apos;v&apos; to %&apos;val&apos;" type="command" category="variables"><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true">x<options>x&#xD;y&#xD;z</options></input><input type="%l"></input><input type="%n">0</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>v</l><l>op</l><l>r</l></list><l>v[op] = r;</l></block><list><block var="v"/><block var="item"/><block var="val"/></list></block></script></block-definition><block-definition s="change %&apos;item&apos; of vector %&apos;v&apos; by %&apos;val&apos;" type="command" category="variables"><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true">x<options>x&#xD;y&#xD;z</options></input><input type="%l"></input><input type="%n">0</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>v</l><l>op</l><l>r</l></list><l>v[op] += r;</l></block><list><block var="v"/><block var="item"/><block var="val"/></list></block></script></block-definition><block-definition s="combine vector %&apos;vec&apos; using %&apos;map&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%repRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block var="map"/><list><block s="evaluate"><block var="map"/><list><custom-block s="%mlt of vector %l"><l>x</l><block var="vec"/></custom-block><custom-block s="%mlt of vector %l"><l>y</l><block var="vec"/></custom-block></list></block><custom-block s="%mlt of vector %l"><l>z</l><block var="vec"/></custom-block></list></block></block></script></block-definition><block-definition s="map %&apos;map&apos; over vector %&apos;vec&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input><input type="%l"></input></inputs><script><block s="doReport"><custom-block s="vector x: %n y: %n z: %n"><block s="evaluate"><block var="map"/><list><custom-block s="%mlt of vector %l"><l>x</l><block var="vec"/></custom-block></list></block><block s="evaluate"><block var="map"/><list><custom-block s="%mlt of vector %l"><l>y</l><block var="vec"/></custom-block></list></block><block s="evaluate"><block var="map"/><list><custom-block s="%mlt of vector %l"><l>z</l><block var="vec"/></custom-block></list></block></custom-block></block></script></block-definition><block-definition s="for each %&apos;key&apos; %&apos;value&apos; pairs in %&apos;list&apos; %&apos;do&apos;" type="command" category="lists"><header></header><code></code><translations></translations><inputs><input type="%upvar"></input><input type="%upvar"></input><input type="%l"></input><input type="%ca"></input></inputs><script><block s="doFor"><l>i</l><l>1</l><block s="reportListLength"><block var="list"/></block><script><block s="doSetVar"><l>key</l><block var="i"/></block><block s="doSetVar"><l>value</l><block s="reportListItem"><block var="i"/><block var="list"/></block></block><block s="doRun"><block var="do"/><list></list></block></script></block></script></block-definition><block-definition s="null" type="reporter" category="other"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>return null;</l></block><list></list></block></block></script></block-definition><block-definition s="for each %&apos;slot&apos; %&apos;value&apos; in vector %&apos;vec&apos; %&apos;do&apos;" type="command" category="lists"><header></header><code></code><translations></translations><inputs><input type="%upvar"></input><input type="%upvar"></input><input type="%l"></input><input type="%ca"></input></inputs><script><block s="doSetVar"><l>slot</l><l>x</l></block><block s="doSetVar"><l>value</l><custom-block s="%mlt of vector %l"><block var="slot"/><block var="vec"/></custom-block></block><block s="doRun"><block var="do"/><list></list></block><block s="doSetVar"><l>slot</l><l>y</l></block><block s="doSetVar"><l>value</l><custom-block s="%mlt of vector %l"><block var="slot"/><block var="vec"/></custom-block></block><block s="doRun"><block var="do"/><list></list></block><block s="doSetVar"><l>slot</l><l>z</l></block><block s="doSetVar"><l>value</l><custom-block s="%mlt of vector %l"><block var="slot"/><block var="vec"/></custom-block></block><block s="doRun"><block var="do"/><list></list></block></script></block-definition><block-definition s="iterate over %&apos;func&apos; with %&apos;result&apos; %&apos;do&apos;" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input><input type="%upvar"></input><input type="%ca"></input></inputs><script><block s="doSetVar"><l>result</l><block s="evaluate"><block var="func"/><list></list></block></block><block s="doUntil"><block s="reportIsIdentical"><block var="result"/><custom-block s="null"></custom-block></block><script><block s="doRun"><block var="do"/><list></list></block><block s="doSetVar"><l>result</l><block s="evaluate"><block var="func"/><list><block var="result"/></list></block></block></script></block></script></block-definition><block-definition s="aspect ratio" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reportQuotient"><block s="reportAttributeOf"><l><option>width</option></l><l>Stage</l></block><block s="reportAttributeOf"><l><option>height</option></l><l>Stage</l></block></block></block></script></block-definition><block-definition s="aspect ratio string" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><custom-block s="let %upvar be %s"><l>gcd</l><custom-block s="gcd %n %n"><block s="reportAttributeOf"><l><option>width</option></l><l>Stage</l></block><block s="reportAttributeOf"><l><option>height</option></l><l>Stage</l></block></custom-block></custom-block><block s="doReport"><block s="reportJoinWords"><list><block s="reportQuotient"><block s="reportAttributeOf"><l><option>width</option></l><l>Stage</l></block><block var="gcd"/></block><l>:</l><block s="reportQuotient"><block s="reportAttributeOf"><l><option>height</option></l><l>Stage</l></block><block var="gcd"/></block></list></block></block></script></block-definition><block-definition s="gcd %&apos;a&apos; %&apos;b&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%n">0</input><input type="%n">0</input></inputs><script><block s="doFor"><l>i</l><block s="reportIfElse"><block s="reportLessThan"><block var="a"/><block var="b"/></block><block var="a"/><block var="b"/></block><l>2</l><script><block s="doIf"><block s="reportEquals"><block s="reportSum"><block s="reportModulus"><block var="a"/><block var="i"/></block><block s="reportModulus"><block var="b"/><block var="i"/></block></block><l>0</l></block><script><block s="doReport"><block var="i"/></block></script></block></script></block><block s="doReport"><l>1</l></block></script></block-definition><block-definition s="let %&apos;var&apos; be %&apos;val&apos;" type="command" category="variables"><header></header><code></code><translations></translations><inputs><input type="%upvar"></input><input type="%s">0</input></inputs><script><block s="doSetVar"><l>var</l><block var="val"/></block></script></block-definition><block-definition s="for %&apos;i&apos; = %&apos;low&apos; to %&apos;high&apos; by %&apos;step&apos; %&apos;do&apos;" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%upvar"></input><input type="%n">1</input><input type="%n">10</input><input type="%n">1</input><input type="%ca"></input></inputs><script><block s="doSetVar"><l>i</l><block var="low"/></block><block s="doRepeat"><block s="reportSum"><block s="reportQuotient"><block s="reportDifference"><block var="high"/><block var="low"/></block><block var="step"/></block><l>1</l></block><script><block s="doRun"><block var="do"/><list></list></block><block s="doChangeVar"><l>i</l><block var="step"/></block></script></block></script></block-definition><block-definition s="lerp from: %&apos;from&apos; to: %&apos;to&apos; by %&apos;percent&apos; %" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%n">0</input><input type="%n">10</input><input type="%n">0</input></inputs><script><block s="doReport"><block s="reportSum"><block var="from"/><block s="reportProduct"><block s="reportDifference"><block var="to"/><block var="from"/></block><block s="reportQuotient"><block var="percent"/><l>100</l></block></block></block></block></script></block-definition><block-definition s="clamp %&apos;num&apos; between %&apos;low&apos; and %&apos;high&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%n">0</input><input type="%n">-1</input><input type="%n">1</input></inputs><script><block s="doIfElse"><block s="reportLessThan"><block var="num"/><block var="low"/></block><script><block s="doReport"><block var="low"/></block></script><script><block s="doIfElse"><block s="reportGreaterThan"><block var="num"/><block var="high"/></block><script><block s="doReport"><block var="high"/></block></script><script><block s="doReport"><block var="num"/></block></script></block></script></block></script></block-definition><block-definition s="color %&apos;clr&apos;" type="reporter" category="pen"><comment x="0" y="0" w="90" collapsed="false">Returns a color.</comment><header></header><code></code><translations></translations><inputs><input type="%clr"></input></inputs><script><block s="doReport"><block var="clr"/></block></script></block-definition><block-definition s="%&apos;item&apos; of color %&apos;col&apos;" type="reporter" category="pen"><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true">red<options>redgreenbluealpha</options></input><input type="%n"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>sw</l><l>color</l></list><l>switch (sw) {    case "red":        return color.r;    case "green":        return color.g;    case "blue":        return color.b;    default:        return color.a;}</l></block><list><block var="item"/><block var="col"/></list></block></block></script></block-definition><block-definition s="color from red: %&apos;r&apos; green: %&apos;g&apos; blue: %&apos;b&apos; alpha: %&apos;a&apos;" type="reporter" category="pen"><comment x="0" y="0" w="154" collapsed="false">Creates a new color with RGB.</comment><header></header><code></code><translations></translations><inputs><input type="%n">255</input><input type="%n">255</input><input type="%n">255</input><input type="%n">1</input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>r</l><l>g</l><l>b</l><l>a</l></list><l>return new Color(r, g, b, a);</l></block><list><block var="r"/><block var="g"/><block var="b"/><block var="a"/></list></block></block></script></block-definition><block-definition s="saturate %&apos;color&apos; to %&apos;percent&apos; %" type="reporter" category="pen"><comment x="0" y="0" w="265" collapsed="false">Saturates a color based on common luminance values.</comment><header></header><code></code><translations></translations><inputs><input type="%n"></input><input type="%n">100</input></inputs><script><block s="doDeclareVariables"><list><l>luminosity</l></list></block><block s="doSetVar"><l>luminosity</l><block s="reportSum"><block s="reportSum"><block s="reportProduct"><custom-block s="%mlt of color %n"><l>red</l><block var="color"/></custom-block><l>0.2989</l></block><block s="reportProduct"><custom-block s="%mlt of color %n"><l>green</l><block var="color"/></custom-block><l>0.5870</l></block></block><block s="reportProduct"><custom-block s="%mlt of color %n"><l>blue</l><block var="color"/></custom-block><l>0.1140</l></block></block></block><block s="doReport"><custom-block s="color from red: %n green: %n blue: %n alpha: %n"><custom-block s="clamp %n between %n and %n"><custom-block s="lerp from: %n to: %n by %n %"><block var="luminosity"/><custom-block s="%mlt of color %n"><l>red</l><block var="color"/></custom-block><block var="percent"/></custom-block><l>0</l><l>255</l></custom-block><custom-block s="clamp %n between %n and %n"><custom-block s="lerp from: %n to: %n by %n %"><block var="luminosity"/><custom-block s="%mlt of color %n"><l>green</l><block var="color"/></custom-block><block var="percent"/></custom-block><l>0</l><l>255</l></custom-block><custom-block s="clamp %n between %n and %n"><custom-block s="lerp from: %n to: %n by %n %"><block var="luminosity"/><custom-block s="%mlt of color %n"><l>blue</l><block var="color"/></custom-block><block var="percent"/></custom-block><l>0</l><l>255</l></custom-block><custom-block s="%mlt of color %n"><l>alpha</l><block var="color"/></custom-block></custom-block></block></script></block-definition><block-definition s="set pen color to %&apos;color&apos;" type="command" category="pen"><header></header><code></code><translations></translations><inputs><input type="%n"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>color</l></list><l>this.setColor(color);</l></block><list><block var="color"/></list></block></script></block-definition><block-definition s="pen color" type="reporter" category="pen"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>return this.color;</l></block><list></list></block></block></script></block-definition><block-definition s="draw pixel %&apos;size&apos;" type="command" category="motion"><header></header><code></code><translations></translations><inputs><input type="%n">1</input></inputs><script><block s="doWarp"><script><block s="doSetGlobalFlag"><l><option>flat line ends</option></l><l><bool>true</bool></l></block><block s="down"></block><block s="forward"><block var="size"/></block><block s="up"></block><block s="forward"><block s="reportMonadic"><l><option>neg</option></l><block var="size"/></block></block></script></block></script></block-definition><block-definition s="minimum distance $nl $- from vector %&apos;vec&apos; $nl $- on map %&apos;map&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%obj"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>vec</l><l>map</l></list><l>const args = new List([vec]);&#xD;var lowest = Infinity;&#xD;var temp;&#xD;for (item of map.contents) {&#xD;    temp = invoke(item, args);&#xD;    if (temp &lt; lowest)&#xD;        lowest = temp;&#xD;}&#xD;return lowest;</l></block><list><block var="vec"/><block var="map"/></list></block></block></script></block-definition><block-definition s="map" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block-definition><block-definition s="ray $nl $- from vector %&apos;v&apos; $nl $- in direction %&apos;d&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%l"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>pos</l><l>dir</l></list><l>return new Ray(pos, dir);</l></block><list><block var="v"/><block var="d"/></list></block></block></script></block-definition><block-definition s="march $nl $- ray %&apos;ray&apos; $nl $- for %&apos;dist&apos; units $nl $- on map %&apos;map&apos; $nl $nl mode %&apos;mode&apos;" type="command" category="variables"><header></header><code></code><translations></translations><inputs><input type="%obj"></input><input type="%n">1000</input><input type="%obj"></input><input type="%mlt" readonly="true">Normal<options>Fastest&#xD;Faster&#xD;Fast&#xD;Normal&#xD;Slow&#xD;Slower&#xD;Slowest</options></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>ray</l><l>dist</l><l>map</l><l>mode</l><l>mindist</l></list><l>var MAX_STEP = 400;&#xD;var HIT_MIN = 0.06;&#xD;switch (mode) {&#xD;    case "Fastest":&#xD;        MAX_STEP = 100;&#xD;        HIT_MIN = 0.2;&#xD;        break;&#xD;    case "Faster":&#xD;        MAX_STEP = 200;&#xD;        HIT_MIN = 0.1;&#xD;        break;&#xD;    case "Fast":&#xD;        MAX_STEP = 300;&#xD;        HIT_MIN = 0.08;&#xD;        break;&#xD;    case "Slow":&#xD;        MAX_STEP = 500;&#xD;        HIT_MIN = 0.06;&#xD;        break;&#xD;    case "Slower":&#xD;        MAX_STEP = 600;&#xD;        HIT_MIN = 0.05;&#xD;        break;&#xD;    case "Slowest":&#xD;        MAX_STEP = 800;&#xD;        HIT_MIN = 0.05;&#xD;        break;&#xD;}&#xD;&#xD;const args = new List([ray.Origin, map]);&#xD;&#xD;var travelled = 0;&#xD;ray.Distance = 0;&#xD;ray.End = ray.Origin;&#xD;ray.Hit = false;&#xD;ray.Attenuation = Infinity;&#xD;for (var i = 0; i &lt; MAX_STEP; i++) {&#xD;    args.contents[0] = ray.End;&#xD;    travelled = invoke(mindist, args);&#xD;    if (travelled &lt; ray.Attenuation)&#xD;        ray.Attenuation = travelled;&#xD;    ray.Distance += travelled;&#xD;    ray.End = ray.Origin.add(&#xD;        ray.Direction.muls(ray.Distance)&#xD;    );&#xD;    if (travelled &lt;= HIT_MIN) {&#xD;        ray.Hit = true;&#xD;        break;&#xD;    }&#xD;    else if (ray.Distance &gt;= dist)&#xD;        break;&#xD;}</l></block><list><block var="ray"/><block var="dist"/><block var="map"/><block var="mode"/><block s="reifyReporter"><autolambda><custom-block s="minimum distance %br $- from vector %l %br $- on map %obj"><l/><l/></custom-block></autolambda><list></list></block></list></block></script></block-definition><block-definition s="normals at vector %&apos;vec&apos; on map %&apos;map&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%obj"></input></inputs><script><custom-block s="let %upvar be %s"><l>var</l><custom-block s="minimum distance %br $- from vector %l %br $- on map %obj"><block var="vec"/><block var="map"/></custom-block></custom-block><block s="doReport"><custom-block s="%mlt of vector %l"><l>normalized</l><custom-block s="vector: %l %mlt vector: %l"><custom-block s="vector x: %n y: %n z: %n"><block var="var"/><block var="var"/><block var="var"/></custom-block><l>-</l><custom-block s="vector x: %n y: %n z: %n"><custom-block s="minimum distance %br $- from vector %l %br $- on map %obj"><custom-block s="vector: %l %mlt vector: %l"><block var="vec"/><l>-</l><custom-block s="vector x: %n y: %n z: %n"><l>0.001</l><l>0</l><l>0</l></custom-block></custom-block><block var="map"/></custom-block><custom-block s="minimum distance %br $- from vector %l %br $- on map %obj"><custom-block s="vector: %l %mlt vector: %l"><block var="vec"/><l>-</l><custom-block s="vector x: %n y: %n z: %n"><l>0</l><l>0.001</l><l>0</l></custom-block></custom-block><block var="map"/></custom-block><custom-block s="minimum distance %br $- from vector %l %br $- on map %obj"><custom-block s="vector: %l %mlt vector: %l"><block var="vec"/><l>-</l><custom-block s="vector x: %n y: %n z: %n"><l>0</l><l>0</l><l>0.001</l></custom-block></custom-block><block var="map"/></custom-block></custom-block></custom-block></custom-block></block></script></block-definition><block-definition s="%&apos;item&apos; of ray %&apos;ray&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true">hit<options>origin&#xD;direction&#xD;end&#xD;hit&#xD;distance&#xD;attenuation</options></input><input type="%obj"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>ray</l><l>prop</l></list><l>return ray[prop[0].toUpperCase() + prop.slice(1)];</l></block><list><block var="ray"/><block var="item"/></list></block></block></script></block-definition><block-definition s="ray %&apos;ray&apos; hit?" type="predicate" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%obj"></input></inputs><script><block s="doReport"><custom-block s="%mlt of ray %obj"><l>hit</l><block var="ray"/></custom-block></block></script></block-definition><block-definition s="scale x: %&apos;x&apos; y: %&apos;y&apos; using aspect ratio" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%n">0</input><input type="%n">0</input></inputs><script><custom-block s="let %upvar be %s"><l>ratio</l><custom-block s="aspect ratio"></custom-block></custom-block><block s="doIfElse"><block s="reportGreaterThan"><block var="ratio"/><l>1</l></block><script><block s="doReport"><custom-block s="vector x: %n y: %n z: %n"><block s="reportQuotient"><block var="x"/><block s="reportAttributeOf"><l><option>right</option></l><l>Stage</l></block></block><block s="reportQuotient"><block s="reportQuotient"><block var="y"/><block s="reportAttributeOf"><l><option>top</option></l><l>Stage</l></block></block><block var="ratio"/></block><l>0</l></custom-block></block></script><script><block s="doReport"><custom-block s="vector x: %n y: %n z: %n"><block s="reportProduct"><block s="reportQuotient"><block var="x"/><block s="reportAttributeOf"><l><option>right</option></l><l>Stage</l></block></block><block var="ratio"/></block><block s="reportQuotient"><block var="y"/><block s="reportAttributeOf"><l><option>top</option></l><l>Stage</l></block></block><l>0</l></custom-block></block></script></block></script></block-definition><block-definition s="render scene $nl $- quality: %&apos;level&apos; $nl $- camera position: %&apos;pos&apos; $nl $- camera rotation: %&apos;rot&apos; $nl $- on map: %&apos;map&apos; $nl $- with lights: %&apos;lights&apos; $nl $- trace mode: %&apos;mode&apos; $nl $- draw distance: %&apos;draw&apos; units $nl $- skybox: %&apos;sky&apos; $nl $- view scaling: %&apos;scale&apos; $nl $- shadows: %&apos;shadow&apos; soft %&apos;soft&apos;" type="command" category="looks"><header></header><code></code><translations></translations><inputs><input type="%n">5</input><input type="%l"></input><input type="%l"></input><input type="%obj"></input><input type="%l"></input><input type="%mlt" readonly="true">Normal<options>Fastest&#xD;Faster&#xD;Fast&#xD;Normal&#xD;Slow&#xD;Slower&#xD;Slowest</options></input><input type="%n">1000</input><input type="%n"></input><input type="%n">1</input><input type="%b">false</input><input type="%n">0.5</input></inputs><script><block s="doSetGlobalFlag"><l><option>flat line ends</option></l><l><bool>true</bool></l></block><block s="doSetGlobalFlag"><l><option>turbo mode</option></l><l><bool>true</bool></l></block><block s="doDeclareVariables"><list><l>scaled</l><l>raytrace</l><l>real end</l><l>current</l><l>normals</l><l>this</l></list></block><custom-block s="let %upvar be %s"><l>resolution scale</l><block s="reportQuotient"><block var="level"/><l>100</l></block></custom-block><custom-block s="let %upvar be %s"><l>step</l><block s="reportQuotient"><l>1</l><block var="resolution scale"/></block></custom-block><block s="setSize"><block var="step"/></block><custom-block s="for %upvar = %n to %n by %n %ca"><l>y</l><block s="reportAttributeOf"><l><option>top</option></l><l>Stage</l></block><block s="reportAttributeOf"><l><option>bottom</option></l><l>Stage</l></block><block s="reportMonadic"><l><option>neg</option></l><block var="step"/></block><script><custom-block s="for %upvar = %n to %n by %n %ca"><l>x</l><block s="reportAttributeOf"><l><option>left</option></l><l>Stage</l></block><block s="reportAttributeOf"><l><option>right</option></l><l>Stage</l></block><block var="step"/><script><block s="doSetVar"><l>scaled</l><custom-block s="scale x: %n y: %n using aspect ratio"><block var="x"/><block var="y"/></custom-block></block><block s="doSetVar"><l>raytrace</l><custom-block s="ray %br $- from vector %l %br $- in direction %l"><block var="pos"/><custom-block s="rotate vector %l by rotation %l"><custom-block s="%mlt of vector %l"><l>normalized</l><custom-block s="vector x: %n y: %n z: %n"><custom-block s="%mlt of vector %l"><l>x</l><block var="scaled"/></custom-block><custom-block s="%mlt of vector %l"><l>y</l><block var="scaled"/></custom-block><block var="scale"/></custom-block></custom-block><block var="rot"/></custom-block></custom-block></block><custom-block s="march %br $- ray %obj %br $- for %n units %br $- on map %obj %br %br mode %mlt"><block var="raytrace"/><block var="draw"/><block var="map"/><block var="mode"/></custom-block><block s="doIfElse"><custom-block s="ray %obj hit?"><block var="raytrace"/></custom-block><script><block s="doIfElse"><block var="shadow"/><script><block s="doSetVar"><l>real end</l><custom-block s="%mlt of ray %obj"><l>end</l><block var="raytrace"/></custom-block></block><block s="doSetVar"><l>current</l><custom-block s="color from red: %n green: %n blue: %n alpha: %n"><l>0</l><l>0</l><l>0</l><l>1</l></custom-block></block><block s="doSetVar"><l>this</l><custom-block s="who vector %l is closest to in map %obj"><block var="real end"/><block var="map"/></custom-block></block><block s="doForEach"><l>light</l><block var="lights"/><script><block s="doIfElse"><custom-block s="is vector %l all %n s?"><block s="reportListItem"><l><option>last</option></l><block var="light"/></block><l>0</l></custom-block><script><block s="doSetVar"><l>current</l><custom-block s="add color %n to color %n"><block s="evaluate"><block s="reportListItem"><l>1</l><block var="light"/></block><list><block var="real end"/><block var="map"/></list></block><block var="current"/></custom-block></block></script><script><block s="doSetVar"><l>normals</l><custom-block s="%mlt of vector %l"><l>neg</l><block s="evaluate"><block s="reportListItem"><l><option>last</option></l><block var="light"/></block><list><block var="real end"/><block var="map"/></list></block></custom-block></block><block s="doSetVar"><l>raytrace</l><custom-block s="ray %br $- from vector %l %br $- in direction %l"><custom-block s="vector: %l %mlt vector: %l"><block var="real end"/><l>+</l><custom-block s="vector: %l %mlt %n"><block var="normals"/><l>x</l><l>.1</l></custom-block></custom-block><block var="normals"/></custom-block></block><custom-block s="march %br $- ray %obj %br $- for %n units %br $- on map %obj %br %br mode %mlt %br $- $SHADOW $MODE %n"><block var="raytrace"/><block var="draw"/><block var="map"/><block var="mode"/><block var="soft"/></custom-block><block s="doSetVar"><l>current</l><custom-block s="add color %n to color %n"><custom-block s="%n times the amount of color %n"><custom-block s="%mlt of ray %obj"><l>attenuation</l><block var="raytrace"/></custom-block><block s="evaluate"><block s="reportListItem"><l>1</l><block var="light"/></block><list><block var="real end"/><block var="map"/></list></block></custom-block><block var="current"/></custom-block></block></script></block></script></block><custom-block s="set pen color to %n"><block var="current"/></custom-block></script><script><custom-block s="set pen color to %n"><custom-block s="combine light data %l at vector %l and map %l"><block var="lights"/><custom-block s="%mlt of ray %obj"><l>end</l><block var="raytrace"/></custom-block><block var="map"/></custom-block></custom-block></script></block></script><script><custom-block s="set pen color to %n"><block var="sky"/></custom-block></script></block><block s="doWarp"><script><block s="gotoXY"><block var="x"/><block var="y"/></block><custom-block s="draw pixel %n"><block var="step"/></custom-block></script></block></script></custom-block></script></custom-block></script></block-definition><block-definition s="combine light data %&apos;lights&apos; at vector %&apos;vec&apos; and map %&apos;map&apos;" type="reporter" category="pen"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%l"></input><input type="%l"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>lights</l><l>vec</l><l>map</l></list><l>const args = new List([vec, map]);&#xD;const count = lights.length();&#xD;var col = new Color(0,0,0);&#xD;var temp;&#xD;for (var i = 1; i &lt;= count; i++) {&#xD;    temp = invoke(lights.get(1,i), args);&#xD;    col.r += temp.r;&#xD;    col.g += temp.g;&#xD;    col.b += temp.b;&#xD;}&#xD;return col;</l></block><list><block var="lights"/><block var="vec"/><block var="map"/></list></block></block></script></block-definition><block-definition s="point light $nl $- color: %&apos;clr&apos; $nl $- position: %&apos;pos&apos; $nl $- range: %&apos;range&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%n"></input><input type="%l"></input><input type="%n">100</input></inputs><script><block s="doReport"><block s="reportNewList"><list><block s="reifyReporter"><autolambda><custom-block s="%n times the amount of color %n"><block s="evaluate"><block s="reportJSFunction"><list><l>inpos</l><l>pos</l><l>norm</l><l>range</l></list><l>var temp = pos.sub(inpos);&#xD;return (norm.dot(temp.normalized())*0.5+0.5) * Math.min(Math.max(1 - temp.length() / range, 0), 1);</l></block><list><block var="in pos"/><block var="pos"/><custom-block s="normals at vector %l on map %obj"><block var="in pos"/><block var="map"/></custom-block><block var="range"/></list></block><block var="clr"/></custom-block></autolambda><list><l>in pos</l><l>map</l></list></block><block s="reifyReporter"><autolambda><custom-block s="vector: %l %mlt vector: %l"><block var="pos"/><l>(b-a)/|b-a|</l><block var="in pos"/></custom-block></autolambda><list><l>in pos</l><l>map</l></list></block></list></block></block></script></block-definition><block-definition s="%&apos;d&apos; % amount of color %&apos;color&apos;" type="reporter" category="pen"><header></header><code></code><translations></translations><inputs><input type="%n">100</input><input type="%n"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>col</l><l>f</l></list><l>return new Color(col.r * f, col.g * f, col.b * f);</l></block><list><block var="color"/><block s="reportQuotient"><block var="d"/><l>100</l></block></list></block></block></script></block-definition><block-definition s="%&apos;d&apos; times the amount of color %&apos;color&apos;" type="reporter" category="pen"><header></header><code></code><translations></translations><inputs><input type="%n">1</input><input type="%n"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>col</l><l>f</l></list><l>return new Color(col.r * f, col.g * f, col.b * f);</l></block><list><block var="color"/><block var="d"/></list></block></block></script></block-definition><block-definition s="directional light $nl $- color: %&apos;clr&apos; $nl $- direction: %&apos;dir&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%n"></input><input type="%l"></input></inputs><script><block s="doReport"><block s="reportNewList"><list><block s="reifyReporter"><autolambda><custom-block s="%n times the amount of color %n"><block s="reportSum"><block s="reportProduct"><custom-block s="vector: %l %mlt vector: %l"><custom-block s="normals at vector %l on map %obj"><block var="in pos"/><block var="map"/></custom-block><l>᛫</l><block var="dir"/></custom-block><l>-0.5</l></block><l>0.5</l></block><block var="clr"/></custom-block></autolambda><list><l>in pos</l><l>map</l></list></block><block s="reifyReporter"><autolambda><block var="dir"/></autolambda><list><l>in pos</l><l>map</l></list></block></list></block></block></script></block-definition><block-definition s="who vector %&apos;vec&apos; is closest to in map %&apos;map&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%obj"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>vec</l><l>map</l></list><l>const args = new List([vec]);&#xD;var lowest = Infinity;&#xD;var lowidx = -1;&#xD;var item, temp;&#xD;for (var i = 0; i &lt; map.contents.length; i++) {&#xD;    item = map.contents[i];&#xD;    temp = invoke(item, args);&#xD;    if (temp &lt; lowest) {&#xD;        lowest = temp;&#xD;        lowidx = i;&#xD;    }&#xD;}&#xD;return lowidx + 1;</l></block><list><block var="vec"/><block var="map"/></list></block></block></script></block-definition><block-definition s="is vector %&apos;vec&apos; all %&apos;num&apos; s?" type="predicate" category="motion"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%n">0</input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>vec</l><l>num</l></list><l>return vec.x == num &amp;&amp; vec.y ==num &amp;&amp; vec.z == num;</l></block><list><block var="vec"/><block var="num"/></list></block></block></script></block-definition><block-definition s="sphere $nl $- radius: %&apos;r&apos; $nl $- position: %&apos;pos&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%n">1</input><input type="%l"></input></inputs><script><block s="doIfElse"><custom-block s="is vector %l all %n s?"><block var="pos"/><l>0</l></custom-block><script><block s="doReport"><block s="reifyReporter"><autolambda><block s="reportDifference"><custom-block s="%mlt of vector %l"><l>length</l><block var="in pos"/></custom-block><block var="r"/></block></autolambda><list><l>in pos</l></list></block></block></script><script><block s="doReport"><block s="reifyReporter"><autolambda><block s="reportDifference"><custom-block s="vector: %l %mlt vector: %l"><block var="in pos"/><l>|b-a|</l><block var="pos"/></custom-block><block var="r"/></block></autolambda><list><l>in pos</l></list></block></block></script></block></script></block-definition><block-definition s="add color %&apos;a&apos; to color %&apos;b&apos;" type="reporter" category="pen"><header></header><code></code><translations></translations><inputs><input type="%n"></input><input type="%n"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>c1</l><l>c2</l></list><l>return new Color(c1.r+c2.r, c1.g+c2.g, c1.b+c2.b);</l></block><list><block var="a"/><block var="b"/></list></block></block></script></block-definition><block-definition s="min %&apos;a&apos; %&apos;b&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%n">0</input><input type="%n">0</input></inputs><script><block s="doIfElse"><block s="reportLessThan"><block var="b"/><block var="a"/></block><script><block s="doReport"><block var="b"/></block></script><script><block s="doReport"><block var="a"/></block></script></block></script></block-definition><block-definition s="max %&apos;a&apos; %&apos;b&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%n">0</input><input type="%n">0</input></inputs><script><block s="doIfElse"><block s="reportGreaterThan"><block var="b"/><block var="a"/></block><script><block s="doReport"><block var="b"/></block></script><script><block s="doReport"><block var="a"/></block></script></block></script></block-definition><block-definition s="spot light $nl $- color: %&apos;clr&apos; $nl $- position: %&apos;pos&apos; $nl $- direction: %&apos;dir&apos; $nl $- angle: %&apos;deg&apos; $nl $- range: %&apos;range&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%n"></input><input type="%l"></input><input type="%l"></input><input type="%n">60<options>§_directionDialMenu</options></input><input type="%n">100</input></inputs><script><block s="doReport"><block s="reportNewList"><list><block s="reifyReporter"><autolambda><custom-block s="%n times the amount of color %n"><block s="reportProduct"><custom-block s="clamp %n between %n and %n"><block s="reportDifference"><l>1</l><block s="reportQuotient"><block s="reportMonadic"><l><option>acos</option></l><block s="reportMonadic"><l><option>neg</option></l><custom-block s="vector: %l %mlt vector: %l"><block var="dir"/><l>᛫</l><custom-block s="normals at vector %l on map %obj"><block var="in pos"/><block var="map"/></custom-block></custom-block></block></block><block var="deg"/></block></block><l>0</l><l>1</l></custom-block><custom-block s="clamp %n between %n and %n"><block s="reportDifference"><l>1</l><block s="reportQuotient"><custom-block s="vector: %l %mlt vector: %l"><block var="in pos"/><l>|b-a|</l><block var="pos"/></custom-block><block var="range"/></block></block><l>0</l><l>1</l></custom-block></block><block var="clr"/></custom-block></autolambda><list><l>in pos</l><l>map</l></list></block><block s="reifyReporter"><autolambda><custom-block s="vector: %l %mlt vector: %l"><block var="pos"/><l>(b-a)/|b-a|</l><block var="in pos"/></custom-block></autolambda><list><l>in pos</l><l>map</l></list></block></list></block></block></script></block-definition><block-definition s="ambient light $nl $- color: %&apos;clr&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%n"></input></inputs><script><block s="doReport"><block s="reportNewList"><list><block s="reifyReporter"><autolambda><block var="clr"/></autolambda><list><l>in pos</l><l>map</l></list></block><block s="reifyReporter"><autolambda><custom-block s="vector x: %n y: %n z: %n"><l>0</l><l>0</l><l>0</l></custom-block></autolambda><list><l>in pos</l><l>map</l></list></block></list></block></block></script></block-definition><block-definition s="cube $nl $- size: %&apos;r&apos; $nl $- position: %&apos;pos&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%l">1</input><input type="%l"></input></inputs><script><block s="doIfElse"><custom-block s="is vector %l all %n s?"><block var="pos"/><l>0</l></custom-block><script><block s="doReport"><block s="reifyReporter"><autolambda><block s="evaluate"><block s="reportJSFunction"><list><l>p</l><l>size</l></list><l>var q = p.map(Math.abs).sub(size);&#xD;return Math.sqrt(&#xD;    Math.pow(Math.max(q.x, 0), 2)&#xD;    + Math.pow(Math.max(q.y, 0), 2)&#xD;    + Math.pow(Math.max(q.z, 0), 2)&#xD;) + Math.min(Math.max(q.x, Math.max(q.y, q.z)), 0);</l></block><list><block var="in pos"/><block var="r"/></list></block></autolambda><list><l>in pos</l></list></block></block></script><script><block s="doReport"><block s="reifyReporter"><autolambda><block s="evaluate"><block s="reportJSFunction"><list><l>p</l><l>size</l><l>pos</l></list><l>var q = p.sub(pos).map(Math.abs).sub(size);&#xD;return Math.sqrt(&#xD;    Math.pow(Math.max(q.x, 0), 2)&#xD;    + Math.pow(Math.max(q.y, 0), 2)&#xD;    + Math.pow(Math.max(q.z, 0), 2)&#xD;) + Math.min(Math.max(q.x, Math.max(q.y, q.z)), 0);</l></block><list><block var="in pos"/><block var="r"/><block var="pos"/></list></block></autolambda><list><l>in pos</l></list></block></block></script></block></script></block-definition><block-definition s="rounded cube $nl $- size: %&apos;r&apos; $nl $- position: %&apos;pos&apos; $nl $- rounding: %&apos;round&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%l">1</input><input type="%l"></input><input type="%n">2</input></inputs><script><block s="doIfElse"><custom-block s="is vector %l all %n s?"><block var="pos"/><l>0</l></custom-block><script><block s="doReport"><block s="reifyReporter"><autolambda><block s="evaluate"><block s="reportJSFunction"><list><l>p</l><l>size</l><l>round</l></list><l>var q = p.map(Math.abs).sub(size.subs(round));&#xD;return Math.sqrt(&#xD;    Math.pow(Math.max(q.x, 0), 2)&#xD;    + Math.pow(Math.max(q.y, 0), 2)&#xD;    + Math.pow(Math.max(q.z, 0), 2)&#xD;) + Math.min(Math.max(q.x, Math.max(q.y, q.z)), 0) - round;</l></block><list><block var="in pos"/><block var="r"/><block var="round"/></list></block></autolambda><list><l>in pos</l></list></block></block></script><script><block s="doReport"><block s="reifyReporter"><autolambda><block s="evaluate"><block s="reportJSFunction"><list><l>p</l><l>size</l><l>round</l><l>pos</l></list><l>var q = p.sub(pos).map(Math.abs).sub(size.subs(round));&#xD;return Math.sqrt(&#xD;    Math.pow(Math.max(q.x, 0), 2)&#xD;    + Math.pow(Math.max(q.y, 0), 2)&#xD;    + Math.pow(Math.max(q.z, 0), 2)&#xD;) + Math.min(Math.max(q.x, Math.max(q.y, q.z)), 0) - round;</l></block><list><block var="in pos"/><block var="r"/><block var="round"/><block var="pos"/></list></block></autolambda><list><l>in pos</l></list></block></block></script></block></script></block-definition><block-definition s="repeat shape infinitely $nl $- shape: %&apos;shape&apos; $nl $- padding: %&apos;pad&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%obj"></input><input type="%l">5</input></inputs><script><block s="doReport"><block s="reifyReporter"><autolambda><block s="evaluate"><block var="shape"/><list><custom-block s="vector: %l %mlt vector: %l"><custom-block s="vector: %l %mlt vector: %l"><custom-block s="vector: %l %mlt vector: %l"><block var="in pos"/><l>+</l><custom-block s="vector: %l %mlt %n"><block var="pad"/><l>/</l><l>2</l></custom-block></custom-block><l>mod</l><block var="pad"/></custom-block><l>-</l><custom-block s="vector: %l %mlt %n"><block var="pad"/><l>/</l><l>2</l></custom-block></custom-block></list></block></autolambda><list><l>in pos</l></list></block></block></script></block-definition><block-definition s="offset shape $nl $- shape: %&apos;shape&apos; $nl $- position: %&apos;pos&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%obj"></input><input type="%l"></input></inputs><script><block s="doReport"><block s="reifyReporter"><autolambda><block s="evaluate"><block var="shape"/><list><custom-block s="vector: %l %mlt vector: %l"><block var="in pos"/><l>-</l><block var="pos"/></custom-block></list></block></autolambda><list><l>in pos</l></list></block></block></script></block-definition><block-definition s="sigmoid %&apos;val&apos; $nl $- offset %&apos;offset&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%n">0</input><input type="%b">false</input></inputs><script><block s="doIfElse"><block var="offset"/><script><block s="doReport"><block s="reportDifference"><block s="reportQuotient"><l>2</l><block s="reportSum"><l>1</l><block s="reportMonadic"><l><option>e^</option></l><block s="reportMonadic"><l><option>neg</option></l><block var="val"/></block></block></block></block><l>1</l></block></block></script><script><block s="doReport"><block s="reportQuotient"><l>1</l><block s="reportSum"><l>1</l><block s="reportMonadic"><l><option>e^</option></l><block s="reportMonadic"><l><option>neg</option></l><block var="val"/></block></block></block></block></block></script></block></script></block-definition><block-definition s="minimum distance $nl $- from vector %&apos;vec&apos; $nl $- on map %&apos;map&apos; $nl $- ignoring %&apos;idx&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%obj"></input><input type="%n">1</input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>vec</l><l>map</l><l>idx</l></list><l>const args = new List([vec]);&#xD;var lowest = Infinity;&#xD;var temp, item;&#xD;for (var i = 0; i &lt; map.length(); i++)&#xD;    if (i != idx) {&#xD;    item = map.contents[i];&#xD;    temp = invoke(item, args);&#xD;    if (temp &lt; lowest)&#xD;        lowest = temp;&#xD;    }&#xD;}&#xD;return lowest;</l></block><list><block var="vec"/><block var="map"/><block var="idx"/></list></block></block></script></block-definition><block-definition s="march $nl $- ray %&apos;ray&apos; $nl $- for %&apos;dist&apos; units $nl $- on map %&apos;map&apos; $nl $nl mode %&apos;mode&apos; $nl $- $SHADOW $MODE %&apos;soft&apos;" type="command" category="variables"><header></header><code></code><translations></translations><inputs><input type="%obj"></input><input type="%n">1000</input><input type="%obj"></input><input type="%mlt" readonly="true">Normal<options>Fastest&#xD;Faster&#xD;Fast&#xD;Normal&#xD;Slow&#xD;Slower&#xD;Slowest</options></input><input type="%n">0.5</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>ray</l><l>dist</l><l>map</l><l>mode</l><l>mindist</l><l>softness</l></list><l>var MAX_STEP = 400;&#xD;var HIT_MIN = 0.06;&#xD;switch (mode) {&#xD;    case "Fastest":&#xD;        MAX_STEP = 100;&#xD;        HIT_MIN = 0.2;&#xD;        break;&#xD;    case "Faster":&#xD;        MAX_STEP = 200;&#xD;        HIT_MIN = 0.1;&#xD;        break;&#xD;    case "Fast":&#xD;        MAX_STEP = 300;&#xD;        HIT_MIN = 0.08;&#xD;        break;&#xD;    case "Slow":&#xD;        MAX_STEP = 500;&#xD;        HIT_MIN = 0.06;&#xD;        break;&#xD;    case "Slower":&#xD;        MAX_STEP = 600;&#xD;        HIT_MIN = 0.05;&#xD;        break;&#xD;    case "Slowest":&#xD;        MAX_STEP = 800;&#xD;        HIT_MIN = 0.05;&#xD;        break;&#xD;}&#xD;&#xD;const args = new List([ray.Origin, map]);&#xD;&#xD;var travelled = 0;&#xD;ray.Distance = 0;&#xD;ray.End = ray.Origin;&#xD;ray.Hit = false;&#xD;ray.Attenuation = 1;&#xD;for (var i = 0; i &lt; MAX_STEP; i++) {&#xD;    args.contents[0] = ray.End;&#xD;    travelled = invoke(mindist, args);&#xD;    ray.Attenuation = Math.min(ray.Attenuation, 0.5 + 0.5*travelled/(ray.Distance * softness));&#xD;    if (ray.Attenuation &lt; 0) break;&#xD;    ray.Distance += travelled;&#xD;    ray.End = ray.Origin.add(&#xD;        ray.Direction.muls(ray.Distance)&#xD;    );&#xD;    if (travelled &lt;= HIT_MIN) {&#xD;        ray.Hit = true;&#xD;        break;&#xD;    }&#xD;    else if (ray.Distance &gt;= dist)&#xD;        break;&#xD;}&#xD;ray.Attenuation = Math.max(ray.Attenuation, 0);&#xD;ray.Attenuation = ray.Attenuation*ray.Attenuation*(3 - 2*ray.Attenuation);&#xD;//console.log(ray.Attenuation);</l></block><list><block var="ray"/><block var="dist"/><block var="map"/><block var="mode"/><block s="reifyReporter"><autolambda><custom-block s="minimum distance %br $- from vector %l %br $- on map %obj"><l/><l/></custom-block></autolambda><list></list></block><block var="soft"/></list></block></script></block-definition><block-definition s="rotation matrix $nl $- %&apos;r00&apos; %&apos;r01&apos; %&apos;r02&apos; $nl $- %&apos;r10&apos; %&apos;r11&apos; %&apos;r12&apos; $nl $- %&apos;r20&apos; %&apos;r21&apos; %&apos;r22&apos;" type="reporter" category="motion"><header></header><code></code><translations></translations><inputs><input type="%n">1</input><input type="%n">0</input><input type="%n">0</input><input type="%n">0</input><input type="%n">1</input><input type="%n">0</input><input type="%n">0</input><input type="%n">0</input><input type="%n">1</input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>r00</l><l>r01</l><l>r02</l><l>r10</l><l>r11</l><l>r12</l><l>r20</l><l>r21</l><l>r22</l></list><l>return new RotationMatrix(&#xD;    r00, r01, r02,&#xD;    r10, r11, r12,&#xD;    r20, r21, r22&#xD;); </l></block><list><block var="r00"/><block var="r01"/><block var="r02"/><block var="r10"/><block var="r11"/><block var="r12"/><block var="r20"/><block var="r21"/><block var="r22"/></list></block></block></script></block-definition><block-definition s="%&apos;axis&apos; axis rotation of %&apos;deg&apos; °" type="reporter" category="motion"><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true">x<options>x&#xD;y&#xD;z</options></input><input type="%n">0<options>§_directionDialMenu</options></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>axis</l><l>num</l></list><l>const deg = radians(num);&#xD;const s = Math.sin(deg);&#xD;const c = Math.cos(deg);&#xD;switch (axis) {&#xD;  case "x":&#xD;    return new RotationMatrix(&#xD;      1,0,0,&#xD;      0,c,-s,&#xD;      0,s,c&#xD;    );&#xD;  case "y":&#xD;    return new RotationMatrix(&#xD;      c,0,s,&#xD;      0,1,0,&#xD;      -s,0,c&#xD;    );&#xD;  case "z":&#xD;    return new RotationMatrix(&#xD;      c,-s,0,&#xD;      s,c,0,&#xD;      0,0,1&#xD;    );&#xD;}</l></block><list><block var="axis"/><block var="deg"/></list></block></block></script></block-definition><block-definition s="%&apos;axis&apos; axis of rotation %&apos;rot&apos;" type="reporter" category="motion"><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true">x<options>x&#xD;y&#xD;z</options></input><input type="%l"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>axis</l><l>rot</l></list><l>switch (axis) {&#xD;  case "x":&#xD;    return new Vector3(rot.data[0], rot.data[3], rot.data[6]);&#xD;  case "y":&#xD;    return new Vector3(rot.data[1], rot.data[4], rot.data[7]);&#xD;  case "z":&#xD;    return new Vector3(rot.data[2], rot.data[5], rot.data[8]);&#xD;}</l></block><list><block var="axis"/><block var="rot"/></list></block></block></script></block-definition><block-definition s="%&apos;item&apos; of rotation %&apos;rot&apos;" type="reporter" category="motion"><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true">r00<options>r00&#xD;r01&#xD;r02&#xD;r10&#xD;r11&#xD;r12&#xD;r20&#xD;r21&#xD;r22</options></input><input type="%l"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>item</l><l>rot</l></list><l>switch (item) {&#xD;  case "r00":&#xD;    return rot.data[0];&#xD;  case "r01":&#xD;    return rot.data[1];&#xD;  case "r02":&#xD;    return rot.data[2];&#xD;&#xD;  case "r10":&#xD;    return rot.data[3];&#xD;  case "r11":&#xD;    return rot.data[4];&#xD;  case "r12":&#xD;    return rot.data[5];&#xD;&#xD;  case "r20":&#xD;    return rot.data[6];&#xD;  case "r21":&#xD;    return rot.data[7];&#xD;  case "r22":&#xD;    return rot.data[8];&#xD;}</l></block><list><block var="item"/><block var="rot"/></list></block></block></script></block-definition><block-definition s="rotate vector %&apos;vec&apos; by rotation %&apos;matrix&apos;" type="reporter" category="motion"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%l"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>vec</l><l>mat</l></list><l>return mat.rotateVector(vec);</l></block><list><block var="vec"/><block var="matrix"/></list></block></block></script></block-definition><block-definition s="rotate shape $nl $- shape: %&apos;shape&apos; $nl $- rotation: %&apos;rot&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%obj"></input><input type="%l"></input></inputs><script><block s="doReport"><block s="reifyReporter"><autolambda><block s="evaluate"><block var="shape"/><list><custom-block s="rotate vector %l by rotation %l"><block var="in pos"/><block var="rot"/></custom-block></list></block></autolambda><list><l>in pos</l></list></block></block></script></block-definition><block-definition s="Initialize Datatypes" type="command" category="other"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doRun"><block s="reportJSFunction"><list></list><l>//VECTOR//&#xD;const fmod = (value, fact) =&gt; ((value%fact)+fact)%fact;&#xD;class Vector3 {&#xD;    constructor(x = 0, y = 0, z = 0) {&#xD;        this.x = x;&#xD;        this.y = y;&#xD;        this.z = z;&#xD;    }&#xD;}&#xD;Vector3.prototype.toString = function() {&#xD;    return `&lt;${this.x}, ${this.y}, ${this.z}&gt;`;&#xD;}&#xD;Vector3.prototype.unm = function() {&#xD;    return new Vector3(-this.x, -this.y, -this.z);&#xD;}&#xD;Vector3.prototype.add = function(b) {&#xD;    return new Vector3(this.x + b.x, this.y + b.y, this.z + b.z);&#xD;}&#xD;Vector3.prototype.adds = function(b) {&#xD;    return new Vector3(this.x + b, this.y + b, this.z + b);&#xD;}&#xD;Vector3.prototype.sub = function(b) {&#xD;    return new Vector3(this.x - b.x, this.y - b.y, this.z - b.z);&#xD;}&#xD;Vector3.prototype.subs = function(b) {&#xD;    return new Vector3(this.x - b, this.y - b, this.z - b);&#xD;}&#xD;Vector3.prototype.mul = function(b) {&#xD;    return new Vector3(this.x * b.x, this.y * b.y, this.z * b.z);&#xD;}&#xD;Vector3.prototype.muls = function(b) {&#xD;    return new Vector3(this.x * b, this.y * b, this.z * b);&#xD;}&#xD;Vector3.prototype.div = function(b) {&#xD;    return new Vector3(this.x / b.x, this.y / b.y, this.z / b.z);&#xD;}&#xD;Vector3.prototype.divs = function(b) {&#xD;    return new Vector3(this.x / b, this.y / b, this.z / b);&#xD;}&#xD;Vector3.prototype.pow = function(b) {&#xD;    return new Vector3(Math.pow(this.x,b.x), Math.pow(this.y,b.y), Math.pow(this.z,b.z));&#xD;}&#xD;Vector3.prototype.pows = function(b) {&#xD;    return new Vector3(Math.pow(this.x,b), Math.pow(this.y,b), Math.pow(this.z,b));&#xD;}&#xD;Vector3.prototype.mod = function(b) {&#xD;    return new Vector3(fmod(this.x,b.x), fmod(this.y,b.y), fmod(this.z,b.z));&#xD;}&#xD;Vector3.prototype.mods = function(b) {&#xD;    return new Vector3(fmod(this.x,b), fmod(this.y,b), fmod(this.z,b));&#xD;}&#xD;Vector3.prototype.length = function() {&#xD;    return Math.sqrt(this.x*this.x + this.y*this.y + this.z*this.z);&#xD;}&#xD;Vector3.prototype.normalized = function() {&#xD;    var len = this.length();&#xD;    return new Vector3(this.x / len, this.y / len, this.z / len);&#xD;}&#xD;Vector3.prototype.dot = function(b) {&#xD;    return this.x * b.x + this.y * b.y + this.z * b.z;&#xD;}&#xD;Vector3.prototype.dots = function(b) {&#xD;    return this.x * b + this.y * b + this.z * b;&#xD;}&#xD;Vector3.prototype.cross = function(b) {&#xD;    return new Vector3(&#xD;        this.y * b.z - this.z * b.y,&#xD;        this.z * b.x - this.x * b.z,&#xD;        this.x * b.y - this.y * b.x&#xD;    );&#xD;}&#xD;Vector3.prototype.map = function(item) {&#xD;    return new Vector3(item(this.x), item(this.y), item(this.z));&#xD;}&#xD;window.Vector3 = Vector3;&#xD;&#xD;//ROTATION MATRIX//&#xD;    class RotationMatrix {&#xD;        constructor(&#xD;            r00=1,r01=0,r02=0,&#xD;            r10=0,r11=1,r12=0,&#xD;            r20=0,r21=0,r22=1&#xD;        ) {&#xD;            this.data = [&#xD;                r00,r01,r02,&#xD;                r10,r11,r12,&#xD;                r20,r21,r22&#xD;            ];&#xD;        }&#xD;    }&#xD;&#xD;    RotationMatrix.prototype.toString = function() {&#xD;        return `[${this.data[0]}, ${this.data[1]}, ${this.data[2]}]\n[${this.data[3]}, ${this.data[4]}, ${this.data[5]}]\n[${this.data[6]}, ${this.data[7]}, ${this.data[8]}]`&#xD;    }&#xD;    RotationMatrix.prototype.rotate = function(b) {&#xD;      return new RotationMatrix(&#xD;        this.data[0] * b.data[0]&#xD;          + this.data[1] * b.data[3]&#xD;          + this.data[2] * b.data[6],&#xD;        this.data[0] * b.data[1]&#xD;          + this.data[1] * b.data[4]&#xD;          + this.data[2] * b.data[7],&#xD;        this.data[0] * b.data[2]&#xD;          + this.data[1] * b.data[5]&#xD;          + this.data[2] * b.data[8],&#xD;&#xD;        this.data[3] * b.data[0]&#xD;          + this.data[4] * b.data[3]&#xD;          + this.data[5] * b.data[6],&#xD;        this.data[3] * b.data[1]&#xD;          + this.data[4] * b.data[4]&#xD;          + this.data[5] * b.data[7],&#xD;        this.data[3] * b.data[2]&#xD;          + this.data[4] * b.data[5]&#xD;          + this.data[5] * b.data[8],&#xD;&#xD;        this.data[6] * b.data[0]&#xD;          + this.data[7] * b.data[3]&#xD;          + this.data[8] * b.data[6],&#xD;        this.data[6] * b.data[1]&#xD;          + this.data[7] * b.data[4]&#xD;          + this.data[8] * b.data[7],&#xD;        this.data[6] * b.data[2]&#xD;          + this.data[7] * b.data[5]&#xD;          + this.data[8] * b.data[8],&#xD;      );&#xD;    }&#xD;    RotationMatrix.prototype.rotateVector = function(b) {&#xD;      return new Vector3(&#xD;        b.x * this.data[0] + b.y * this.data[1] + b.z * this.data[2],&#xD;        b.x * this.data[3] + b.y * this.data[4] + b.z * this.data[5],&#xD;        b.x * this.data[6] + b.y * this.data[7] + b.z * this.data[8], &#xD;      );&#xD;    }&#xD;&#xD;    window.RotationMatrix = RotationMatrix;&#xD;&#xD;//RAY//&#xD;class Ray {&#xD;    constructor(pos, dir) {&#xD;        this.Origin = pos;&#xD;        this.Direction = dir;&#xD;        this.End = pos;&#xD;        this.Length = 0;&#xD;        this.Hit = null;&#xD;        this.Attenuation = 1; &#xD;    }&#xD;}&#xD;Ray.prototype.toString = function() {&#xD;    return `Ray from ${this.Origin} in direction ${this.Direction}`;&#xD;}&#xD;window.Ray = Ray;</l></block><list></list></block></script></block-definition><block-definition s="rotate rotation %&apos;a&apos; by rotation %&apos;b&apos;" type="reporter" category="motion"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%l"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>a</l><l>b</l></list><l>return a.rotate(b);</l></block><list><block var="a"/><block var="b"/></list></block></block></script></block-definition><block-definition s="%&apos;mode&apos; rotation x: %&apos;x&apos; y: %&apos;y&apos; z: %&apos;z&apos;" type="reporter" category="motion"><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true">xyz<options>X First={&#xD;Y Next=xyz&#xD;Z Next=xzy&#xD;}&#xD;Y First={&#xD;X Next=yxz&#xD;Z Next=yzx&#xD;}&#xD;Z First={&#xD;X Next=zxy&#xD;Y Next=zyx&#xD;}</options></input><input type="%n">0<options>§_directionDialMenu</options></input><input type="%n">0<options>§_directionDialMenu</options></input><input type="%n">0<options>§_directionDialMenu</options></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>mode</l><l>x</l><l>y</l><l>z</l><l>func</l></list><l>const args = new List([0,0]);&#xD;var cur = new RotationMatrix();&#xD;for (var i = 0; i &lt; 3; i++) {&#xD;  args.contents[0] = mode[i];&#xD;  args.contents[1] = mode[i] == "x" ? x : (mode[i] == "y" ? y : z)&#xD;  if (args.contents[1] != 0)&#xD;    cur = cur.rotate(invoke(func, args));&#xD;}&#xD;return cur;</l></block><list><block var="mode"/><block var="x"/><block var="y"/><block var="z"/><block s="reifyReporter"><autolambda><custom-block s="%mlt axis rotation of %n °"><l></l><l></l></custom-block></autolambda><list></list></block></list></block></block></script></block-definition><block-definition s="average colors %&apos;cols&apos;" type="reporter" category="pen"><header></header><code></code><translations></translations><inputs><input type="%mult%n"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>cols</l></list><l>const count = cols.length();&#xD;var total = new Color();&#xD;for (color of cols.contents) {&#xD;    total.r += color.r;&#xD;    total.g += color.g;&#xD;    total.b += color.b;&#xD;}&#xD;total.r /= count;&#xD;total.g /= count;&#xD;total.b /= count; &#xD;return total;</l></block><list><block var="cols"/></list></block></block></script></block-definition><block-definition s="rotation from direction %&apos;dir&apos;" type="reporter" category="motion"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>vec</l></list><l>const look = vec;&#xD;const right = (new Vector3(0, 1, 0)).cross(vec);&#xD;const up = vec.cross(right);&#xD;return new RotationMatrix(&#xD;    right.x, up.x, look.x,&#xD;    right.y, up.y, look.y,&#xD;    right.z, up.z, look.z&#xD;); </l></block><list><block var="dir"/></list></block></block></script></block-definition><block-definition s="rotation from position %&apos;p&apos; looking at %&apos;pos&apos;" type="reporter" category="motion"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%l"></input></inputs><script><block s="doReport"><custom-block s="rotation from direction %l"><custom-block s="vector: %l %mlt vector: %l"><block var="p"/><l>(b-a)/|b-a|</l><block var="pos"/></custom-block></custom-block></block></script></block-definition></blocks><variables></variables></project><media name="Raycasting library" app="Snap! 6, https://snap.berkeley.edu" version="1"></media></snapdata>