<snapdata remixID="9307059"><project name="Raycasting library" app="Snap! 5.4, http://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" 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! 5.4, http://snap.berkeley.edu" version="1"></media></snapdata>