<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>*drawlogic &#187; AIF</title>
	<atom:link href="http://drawlogic.com/category/aif/feed/" rel="self" type="application/rss+xml" />
	<link>http://drawlogic.com</link>
	<description>interactive and game development technologies for the web - flash, flex, unity3d, silverlight, javascript</description>
	<lastBuildDate>Thu, 22 Dec 2011 21:55:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>AS3 Real-Time Raytracing</title>
		<link>http://drawlogic.com/2008/03/22/as3-real-time-raytracing/</link>
		<comments>http://drawlogic.com/2008/03/22/as3-real-time-raytracing/#comments</comments>
		<pubDate>Sat, 22 Mar 2008 22:36:39 +0000</pubDate>
		<dc:creator>drawk</dc:creator>
				<category><![CDATA[3d]]></category>
		<category><![CDATA[ACTIONSCRIPT]]></category>
		<category><![CDATA[ACTIONSCRIPT3]]></category>
		<category><![CDATA[AIF]]></category>
		<category><![CDATA[ALGORITHM]]></category>
		<category><![CDATA[ANIMATION]]></category>
		<category><![CDATA[ARCHITECT]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[EFFECTS]]></category>
		<category><![CDATA[FLASH]]></category>
		<category><![CDATA[FLEX]]></category>
		<category><![CDATA[GAMEDEV]]></category>
		<category><![CDATA[GAMES]]></category>
		<category><![CDATA[OPEN SOURCE]]></category>
		<category><![CDATA[PERFORMANCE]]></category>
		<category><![CDATA[PIXEL]]></category>
		<category><![CDATA[PROGRAMMING]]></category>
		<category><![CDATA[RENDERING]]></category>
		<category><![CDATA[TECHNOLOGY]]></category>
		<category><![CDATA[VISUALIZATION]]></category>
		<category><![CDATA[INTERFACE]]></category>
		<category><![CDATA[raytrace]]></category>
		<category><![CDATA[render]]></category>

		<guid isPermaLink="false">http://drawlogic.com/?p=172</guid>
		<description><![CDATA[Forrest Briggs throwing down with a real-time raytracer in AS3. Also a C++ OpenGL version sample on the page. Real-time pixel manipulation in flash is getting faster, but is still probably going to have to be faked in AS3, maybe AS4 will provide us per pixel speeds that Andre Michelle has been harping on since [...]]]></description>
			<content:encoded><![CDATA[<p>Forrest Briggs throwing down with a <a href="http://www.laserpirate.com/as3raytracer/" target="_blank">real-time raytracer in AS3</a>.  Also a C++ <a href="http://www.laserpirate.com/as3raytracer/" target="_blank">OpenGL version sample on the page</a>.</p>
<p>Real-time pixel manipulation in flash is getting faster, but is still probably going to have to be faked in AS3, maybe AS4 will provide us per pixel speeds that Andre Michelle has been harping on since flash 8.5. Native operations can be much faster in that area. AIF might look to change some of that but that is Flash 10.</p>
<p><a href="http://www.laserpirate.com/as3raytracer/" target="_blank"><img src="http://i81.photobucket.com/albums/j223/drawkbox/raytracer.png" height="304" width="420" /></a></p>
<p>Here is the code for the as3 raytracer.  Read more at <a href="http://www.laserpirate.com/as3raytracer/" target="_blank">laserpirate</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">package</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #003366; font-weight: bold;">import</span> flash.<span style="color: #660066;">display</span>.<span style="color: #660066;">Sprite</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">import</span> flash.<span style="color: #660066;">display</span>.<span style="color: #660066;">Bitmap</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">import</span> flash.<span style="color: #660066;">display</span>.<span style="color: #660066;">BitmapData</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">import</span> flash.<span style="color: #660066;">events</span>.<span style="color: #660066;">Event</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">import</span> flash.<span style="color: #660066;">utils</span>.<span style="color: #660066;">getTimer</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">import</span> flash.<span style="color: #660066;">events</span>.<span style="color: #660066;">MouseEvent</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">import</span> flash.<span style="color: #660066;">text</span>.<span style="color: #660066;">TextField</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">import</span> flash.<span style="color: #660066;">text</span>.<span style="color: #660066;">TextFormat</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">class</span> RayTracer <span style="color: #003366; font-weight: bold;">extends</span> Sprite
<span style="color: #009900;">&#123;</span>
 <span style="color: #003366; font-weight: bold;">private</span> <span style="color: #003366; font-weight: bold;">var</span> t<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">private</span> <span style="color: #003366; font-weight: bold;">var</span> dt<span style="color: #339933;">:</span>Number <span style="color: #339933;">=</span> .01<span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">private</span> <span style="color: #003366; font-weight: bold;">var</span> frameTimeTxt<span style="color: #339933;">:</span>TextField<span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #003366; font-weight: bold;">public</span> static <span style="color: #003366; font-weight: bold;">const</span> BUFFER_WIDTH<span style="color: #339933;">:</span>int <span style="color: #339933;">=</span> <span style="color: #CC0000;">160</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">public</span> static <span style="color: #003366; font-weight: bold;">const</span> BUFFER_HEIGHT<span style="color: #339933;">:</span>int <span style="color: #339933;">=</span> <span style="color: #CC0000;">120</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">public</span> static <span style="color: #003366; font-weight: bold;">const</span> BUFFER_SCALEDDOWN<span style="color: #339933;">:</span>int <span style="color: #339933;">=</span> <span style="color: #CC0000;">320</span> <span style="color: #339933;">/</span> BUFFER_WIDTH<span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #003366; font-weight: bold;">public</span> static <span style="color: #003366; font-weight: bold;">const</span> HALF_BUFFER_WIDTH<span style="color: #339933;">:</span>int <span style="color: #339933;">=</span> BUFFER_WIDTH <span style="color: #339933;">/</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">public</span> static <span style="color: #003366; font-weight: bold;">const</span> HALF_BUFFER_HEIGHT<span style="color: #339933;">:</span>int <span style="color: #339933;">=</span> BUFFER_HEIGHT <span style="color: #339933;">/</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #003366; font-weight: bold;">private</span> <span style="color: #003366; font-weight: bold;">var</span> outputBitmapData<span style="color: #339933;">:</span>BitmapData<span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">private</span> <span style="color: #003366; font-weight: bold;">var</span> outputBitmap<span style="color: #339933;">:</span>Bitmap<span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">var</span> FOV<span style="color: #339933;">:</span>Number <span style="color: #339933;">=</span> <span style="color: #CC0000;">20</span><span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">var</span> sphereCenterX<span style="color: #339933;">:</span>Array 	<span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>	<span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>		<span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> 		<span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">var</span> sphereCenterY<span style="color: #339933;">:</span>Array 	<span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span>.2<span style="color: #339933;">,</span>	.4<span style="color: #339933;">,</span> 		<span style="color: #CC0000;">100.5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">var</span> sphereCenterZ<span style="color: #339933;">:</span>Array 	<span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">4</span><span style="color: #339933;">,</span> 	<span style="color: #CC0000;">4</span><span style="color: #339933;">,</span>		<span style="color: #CC0000;">4</span><span style="color: #339933;">,</span> 		<span style="color: #CC0000;">10</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">var</span> sphereRadius<span style="color: #339933;">:</span>Array 	<span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span>.35<span style="color: #339933;">,</span> .35<span style="color: #339933;">,</span>	.25<span style="color: #339933;">,</span> 	<span style="color: #CC0000;">100</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">var</span> sphereR<span style="color: #339933;">:</span>Array 		<span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">255</span><span style="color: #339933;">,</span>	<span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>		<span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>		<span style="color: #CC0000;">20</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">var</span> sphereG<span style="color: #339933;">:</span>Array 		<span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> 	<span style="color: #CC0000;">150</span><span style="color: #339933;">,</span>	<span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>		<span style="color: #CC0000;">20</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">var</span> sphereB<span style="color: #339933;">:</span>Array 		<span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> 	<span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>		<span style="color: #CC0000;">255</span><span style="color: #339933;">,</span>	<span style="color: #CC0000;">20</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">var</span> sphereReflects<span style="color: #339933;">:</span>Array <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">var</span> sphereReflectiveness<span style="color: #339933;">:</span>Array <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>.3<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">var</span> sphere2dX<span style="color: #339933;">:</span>Array <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Array<span style="color: #009900;">&#40;</span>sphereCenterX.<span style="color: #660066;">length</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">var</span> sphere2dY<span style="color: #339933;">:</span>Array <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Array<span style="color: #009900;">&#40;</span>sphereCenterX.<span style="color: #660066;">length</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">var</span> sphere2dR<span style="color: #339933;">:</span>Array <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Array<span style="color: #009900;">&#40;</span>sphereCenterX.<span style="color: #660066;">length</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">var</span> numSpheres <span style="color: #339933;">=</span> sphereCenterX.<span style="color: #660066;">length</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #003366; font-weight: bold;">var</span> skyR<span style="color: #339933;">:</span>int <span style="color: #339933;">=</span>  <span style="color: #CC0000;">20</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">var</span> skyG<span style="color: #339933;">:</span>int <span style="color: #339933;">=</span>  <span style="color: #CC0000;">20</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">var</span> skyB<span style="color: #339933;">:</span>int <span style="color: #339933;">=</span>  <span style="color: #CC0000;">20</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">var</span> skyColor<span style="color: #339933;">:</span>int <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>skyR<span style="color: #339933;">&lt;</span> <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span><span style="color: #CC0000;">16</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>skyG<span style="color: #339933;">&lt;&amp;</span>lt<span style="color: #339933;">;</span><span style="color: #CC0000;">8</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> skyB<span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">var</span> ambientIllumination<span style="color: #339933;">:</span>Number <span style="color: #339933;">=</span> .1<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #003366; font-weight: bold;">var</span> canvas<span style="color: #339933;">:</span>BlankClip<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #003366; font-weight: bold;">var</span> theta<span style="color: #339933;">:</span>Number <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">var</span> mouseIsDown<span style="color: #339933;">:</span>Boolean <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">var</span> mouseDownTheta<span style="color: #339933;">:</span>Number <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
 <span style="color: #003366; font-weight: bold;">var</span> mouseDownX<span style="color: #339933;">:</span>Number <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">function</span> RayTracer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
 <span style="color: #009900;">&#123;</span>
 	outputBitmapData <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> BitmapData<span style="color: #009900;">&#40;</span>BUFFER_WIDTH<span style="color: #339933;">,</span> BUFFER_HEIGHT<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 	outputBitmap <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Bitmap<span style="color: #009900;">&#40;</span>outputBitmapData<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 	addChild<span style="color: #009900;">&#40;</span>outputBitmap<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 	<span style="color: #006600; font-style: italic;">//outputBitmap.smoothing = true;</span>
&nbsp;
		outputBitmap.<span style="color: #660066;">width</span><span style="color: #339933;">=</span> <span style="color: #CC0000;">320</span><span style="color: #339933;">;</span>
 	outputBitmap.<span style="color: #660066;">height</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">240</span><span style="color: #339933;">;</span>
&nbsp;
		canvas <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> BlankClip<span style="color: #339933;">;</span>
 	addChild<span style="color: #009900;">&#40;</span>canvas<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 	canvas.<span style="color: #660066;">buttonMode</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
 	canvas.<span style="color: #660066;">useHandCursor</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
&nbsp;
		frameTimeTxt <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> TextField<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 	frameTimeTxt.<span style="color: #660066;">defaultTextFormat</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> TextFormat<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Arial&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 	frameTimeTxt.<span style="color: #660066;">x</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">8</span><span style="color: #339933;">;</span>
 	frameTimeTxt.<span style="color: #660066;">y</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">8</span><span style="color: #339933;">;</span>
 	frameTimeTxt.<span style="color: #660066;">width</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">640</span><span style="color: #339933;">;</span>
 	frameTimeTxt.<span style="color: #660066;">textColor</span> <span style="color: #339933;">=</span> 0xFFFFFF<span style="color: #339933;">;</span>
 	frameTimeTxt.<span style="color: #660066;">selectable</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
 	addChild<span style="color: #009900;">&#40;</span>frameTimeTxt<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		t <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
 	addEventListener<span style="color: #009900;">&#40;</span>Event.<span style="color: #660066;">ENTER_FRAME</span><span style="color: #339933;">,</span> update<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		canvas.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span>MouseEvent.<span style="color: #660066;">MOUSE_DOWN</span><span style="color: #339933;">,</span> mouseDownHandler<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 	canvas.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span>MouseEvent.<span style="color: #660066;">MOUSE_UP</span><span style="color: #339933;">,</span> mouseUpHandler<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">function</span> mouseDownHandler<span style="color: #009900;">&#40;</span>e<span style="color: #339933;">:*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span><span style="color: #000066; font-weight: bold;">void</span>
 <span style="color: #009900;">&#123;</span>
 	mouseIsDown <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
 	mouseDownX <span style="color: #339933;">=</span> stage.<span style="color: #660066;">mouseX</span><span style="color: #339933;">;</span>
 	mouseDownTheta <span style="color: #339933;">=</span> theta<span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">function</span> mouseUpHandler<span style="color: #009900;">&#40;</span>e<span style="color: #339933;">:*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span><span style="color: #000066; font-weight: bold;">void</span>
 <span style="color: #009900;">&#123;</span>
 	mouseIsDown <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">function</span> update<span style="color: #009900;">&#40;</span>e<span style="color: #339933;">:*</span><span style="color: #009900;">&#41;</span>
 <span style="color: #009900;">&#123;</span>
 	<span style="color: #006600; font-style: italic;">// start frame timer and update global time</span>
 	<span style="color: #003366; font-weight: bold;">var</span> timer<span style="color: #339933;">:</span>Number <span style="color: #339933;">=</span> getTimer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 	t <span style="color: #339933;">+=</span> dt<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #006600; font-style: italic;">// handle mouse rotation</span>
 	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> mouseIsDown <span style="color: #009900;">&#41;</span> theta <span style="color: #339933;">=</span> mouseDownTheta <span style="color: #339933;">-</span> .0015 <span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span>stage.<span style="color: #660066;">mouseX</span> <span style="color: #339933;">-</span> mouseDownX<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 	theta <span style="color: #339933;">+=</span> dt<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #006600; font-style: italic;">// do some funky animation</span>
 	sphereCenterX<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> .5<span style="color: #339933;">*</span>Math.<span style="color: #660066;">sin</span><span style="color: #009900;">&#40;</span>theta<span style="color: #339933;">*</span><span style="color: #CC0000;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 	sphereCenterZ<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span><span style="color: #CC0000;">1</span> <span style="color: #339933;">+</span> .5<span style="color: #339933;">*</span>Math.<span style="color: #660066;">cos</span><span style="color: #009900;">&#40;</span>theta<span style="color: #339933;">*</span><span style="color: #CC0000;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		sphereCenterX<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> .5<span style="color: #339933;">*</span>Math.<span style="color: #660066;">sin</span><span style="color: #009900;">&#40;</span>theta<span style="color: #339933;">*</span><span style="color: #CC0000;">5</span> <span style="color: #339933;">+</span> <span style="color: #CC0000;">2</span> <span style="color: #339933;">*</span> Math.<span style="color: #660066;">PI</span> <span style="color: #339933;">/</span> <span style="color: #CC0000;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 	sphereCenterZ<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span> <span style="color: #339933;">+</span> .5<span style="color: #339933;">*</span>Math.<span style="color: #660066;">cos</span><span style="color: #009900;">&#40;</span>theta<span style="color: #339933;">*</span><span style="color: #CC0000;">5</span> <span style="color: #339933;">+</span> <span style="color: #CC0000;">2</span> <span style="color: #339933;">*</span> Math.<span style="color: #660066;">PI</span> <span style="color: #339933;">/</span> <span style="color: #CC0000;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		sphereCenterX<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> .5<span style="color: #339933;">*</span>Math.<span style="color: #660066;">sin</span><span style="color: #009900;">&#40;</span>theta<span style="color: #339933;">*</span><span style="color: #CC0000;">5</span> <span style="color: #339933;">+</span> <span style="color: #CC0000;">4</span> <span style="color: #339933;">*</span> Math.<span style="color: #660066;">PI</span> <span style="color: #339933;">/</span> <span style="color: #CC0000;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 	sphereCenterZ<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span> <span style="color: #339933;">+</span> .5<span style="color: #339933;">*</span>Math.<span style="color: #660066;">cos</span><span style="color: #009900;">&#40;</span>theta<span style="color: #339933;">*</span><span style="color: #CC0000;">5</span> <span style="color: #339933;">+</span> <span style="color: #CC0000;">4</span> <span style="color: #339933;">*</span> Math.<span style="color: #660066;">PI</span> <span style="color: #339933;">/</span> <span style="color: #CC0000;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #006600; font-style: italic;">// reused variables</span>
 	<span style="color: #003366; font-weight: bold;">var</span> x<span style="color: #339933;">:</span>int<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> y<span style="color: #339933;">:</span>int<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> i<span style="color: #339933;">:</span>int<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> j<span style="color: #339933;">:</span>int<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003366; font-weight: bold;">var</span> r<span style="color: #339933;">:</span>int<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> g<span style="color: #339933;">:</span>int<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> b<span style="color: #339933;">:</span>int<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003366; font-weight: bold;">var</span> dx<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> dy<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003366; font-weight: bold;">var</span> rayDirX<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> rayDirY<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> rayDirZ<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> rayDirMag<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003366; font-weight: bold;">var</span> reflectRayDirX<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> reflectRayDirY<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> reflectRayDirZ<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003366; font-weight: bold;">var</span> intersectionX<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> intersectionY<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> intersectionZ<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003366; font-weight: bold;">var</span> reflectIntersectionX<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> reflectIntersectionY<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> reflectIntersectionZ<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003366; font-weight: bold;">var</span> rayToSphereCenterX<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> rayToSphereCenterY<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> rayToSphereCenterZ<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003366; font-weight: bold;">var</span> lengthRTSC2<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> closestApproach<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> halfCord2<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> dist<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003366; font-weight: bold;">var</span> normalX<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> normalY<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> normalZ<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> normalMag<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003366; font-weight: bold;">var</span> illumination<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> reflectIllumination<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003366; font-weight: bold;">var</span> reflectR<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> reflectG<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> reflectB<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #006600; font-style: italic;">// setup light dir</span>
 	<span style="color: #003366; font-weight: bold;">var</span> lightDirX<span style="color: #339933;">:</span>Number <span style="color: #339933;">=</span> .3<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> lightDirY<span style="color: #339933;">:</span>Number <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> lightDirZ<span style="color: #339933;">:</span>Number <span style="color: #339933;">=</span> <span style="color: #339933;">-</span>.5<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> lightDirMag<span style="color: #339933;">:</span>Number <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">/</span>Math.<span style="color: #660066;">sqrt</span><span style="color: #009900;">&#40;</span>lightDirX<span style="color: #339933;">*</span>lightDirX <span style="color: #339933;">+</span>lightDirY<span style="color: #339933;">*</span>lightDirY <span style="color: #339933;">+</span>lightDirZ<span style="color: #339933;">*</span>lightDirZ<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 	lightDirX <span style="color: #339933;">*=</span> lightDirMag<span style="color: #339933;">;</span>
 	lightDirY <span style="color: #339933;">*=</span> lightDirMag<span style="color: #339933;">;</span>
 	lightDirZ <span style="color: #339933;">*=</span> lightDirMag<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #006600; font-style: italic;">// vars used to in intersection tests</span>
 	<span style="color: #003366; font-weight: bold;">var</span> closestIntersectionDist<span style="color: #339933;">:</span>Number<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> closestSphereIndex<span style="color: #339933;">:</span>int<span style="color: #339933;">;</span>
 	<span style="color: #003366; font-weight: bold;">var</span> reflectClosestSphereIndex<span style="color: #339933;">:</span>int<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #006600; font-style: italic;">// compute screen space bounding circles</span>
 	<span style="color: #006600; font-style: italic;">//canvas.graphics.clear();</span>
 	<span style="color: #006600; font-style: italic;">//canvas.graphics.lineStyle(1, 0xFF0000, .25);</span>
 	<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> numSpheres<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span>
 	<span style="color: #009900;">&#123;</span>
 		sphere2dX<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>BUFFER_WIDTH <span style="color: #009966; font-style: italic;">/ 2 + FOV * sphereCenterX[i] /</span> sphereCenterZ<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 		sphere2dY<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>BUFFER_HEIGHT <span style="color: #009966; font-style: italic;">/2 + FOV * sphereCenterY[i] /</span> sphereCenterZ<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 		sphere2dR<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #CC0000;">3</span> <span style="color: #339933;">*</span> FOV <span style="color: #339933;">*</span> sphereRadius<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">/</span> sphereCenterZ<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 		<span style="color: #006600; font-style: italic;">//canvas.graphics.drawCircle(sphere2dX[i]*BUFFER_SCALEDDOWN, sphere2dY[i]*BUFFER_SCALEDDOWN, sphere2dR[i]*BUFFER_SCALEDDOWN);</span>
 		sphere2dR<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*=</span> sphere2dR<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// store the squared value</span>
 	<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #006600; font-style: italic;">// write to each pixel</span>
 	outputBitmapData.<span style="color: #660066;">lock</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 	<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> y <span style="color: #339933;">&lt;</span> BUFFER_HEIGHT<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>y<span style="color: #009900;">&#41;</span>
 	<span style="color: #009900;">&#123;</span>
 		<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>x <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> x <span style="color: #339933;">&lt;</span> BUFFER_WIDTH<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>x<span style="color: #009900;">&#41;</span>
 		<span style="color: #009900;">&#123;</span>
 			<span style="color: #006600; font-style: italic;">// compute ray direction</span>
 			rayDirX <span style="color: #339933;">=</span> x <span style="color: #339933;">-</span> HALF_BUFFER_WIDTH<span style="color: #339933;">;</span>
 			rayDirY <span style="color: #339933;">=</span> y <span style="color: #339933;">-</span> HALF_BUFFER_HEIGHT<span style="color: #339933;">;</span>
 			rayDirZ <span style="color: #339933;">=</span> FOV<span style="color: #339933;">;</span>
&nbsp;
				rayDirMag <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">/</span>Math.<span style="color: #660066;">sqrt</span><span style="color: #009900;">&#40;</span>rayDirX <span style="color: #339933;">*</span> rayDirX <span style="color: #339933;">+</span> rayDirY <span style="color: #339933;">*</span> rayDirY <span style="color: #339933;">+</span>rayDirZ <span style="color: #339933;">*</span> rayDirZ<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 			rayDirX <span style="color: #339933;">*=</span> rayDirMag<span style="color: #339933;">;</span>
 			rayDirY <span style="color: #339933;">*=</span> rayDirMag<span style="color: #339933;">;</span>
 			rayDirZ <span style="color: #339933;">*=</span> rayDirMag<span style="color: #339933;">;</span>
&nbsp;
				<span style="color: #006600; font-style: italic;">/// trace the primary ray ///</span>
 			closestIntersectionDist <span style="color: #339933;">=</span> Number.<span style="color: #660066;">POSITIVE_INFINITY</span><span style="color: #339933;">;</span>
 			closestSphereIndex <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span>
 			<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> numSpheres<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span>
 			<span style="color: #009900;">&#123;</span>
 				<span style="color: #006600; font-style: italic;">// check against screen space bounding circle</span>
 				dx <span style="color: #339933;">=</span> x <span style="color: #339933;">-</span> sphere2dX<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 				dy <span style="color: #339933;">=</span> y <span style="color: #339933;">-</span> sphere2dY<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 				<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> dx <span style="color: #339933;">*</span> dx <span style="color: #339933;">+</span> dy <span style="color: #339933;">*</span> dy <span style="color: #339933;">&gt;</span> sphere2dR<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
&nbsp;
					<span style="color: #006600; font-style: italic;">// begin actual ray tracing if its inside the bounding circle</span>
&nbsp;
					lengthRTSC2 <span style="color: #339933;">=</span> 		sphereCenterX<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> sphereCenterX<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span>
 									sphereCenterY<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> sphereCenterY<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span>
 									sphereCenterZ<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> sphereCenterZ<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
					closestApproach <span style="color: #339933;">=</span>	sphereCenterX<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> rayDirX <span style="color: #339933;">+</span>
 									sphereCenterY<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> rayDirY <span style="color: #339933;">+</span>
 									sphereCenterZ<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> rayDirZ<span style="color: #339933;">;</span>
&nbsp;
					<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> closestApproach <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// intersection behind the origin</span>
 					<span style="color: #000066; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
&nbsp;
					halfCord2 <span style="color: #339933;">=</span> sphereRadius<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> sphereRadius<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> lengthRTSC2 <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>closestApproach <span style="color: #339933;">*</span> closestApproach<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 				<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> halfCord2 <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// ray misses the sphere</span>
 					<span style="color: #000066; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
&nbsp;
					<span style="color: #006600; font-style: italic;">// ray hits the sphere</span>
 				dist <span style="color: #339933;">=</span> closestApproach <span style="color: #339933;">-</span> Math.<span style="color: #660066;">sqrt</span><span style="color: #009900;">&#40;</span>halfCord2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 				<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> dist <span style="color: #339933;">&lt;</span> closestIntersectionDist <span style="color: #009900;">&#41;</span>
 				<span style="color: #009900;">&#123;</span>
 					closestIntersectionDist <span style="color: #339933;">=</span> dist<span style="color: #339933;">;</span>
 					closestSphereIndex<span style="color: #339933;">=</span>i<span style="color: #339933;">;</span>
 				<span style="color: #009900;">&#125;</span>
 			<span style="color: #009900;">&#125;</span>
 			<span style="color: #006600; font-style: italic;">/// end of trace primary ray ///</span>
&nbsp;
				<span style="color: #006600; font-style: italic;">// primary ray doesn't hit anything</span>
 			<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> closestSphereIndex <span style="color: #339933;">==</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span>
 			<span style="color: #009900;">&#123;</span>
 				outputBitmapData.<span style="color: #660066;">setPixel</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">,</span> y<span style="color: #339933;">,</span> skyColor<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 			<span style="color: #009900;">&#125;</span>
 			<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #006600; font-style: italic;">// primary ray hits a sphere.. calculate shading, shadow and reflection</span>
 			<span style="color: #009900;">&#123;</span>
 				<span style="color: #006600; font-style: italic;">// location of ray-sphere intersection</span>
 				intersectionX <span style="color: #339933;">=</span> rayDirX <span style="color: #339933;">*</span> closestIntersectionDist<span style="color: #339933;">;</span>
 				intersectionY <span style="color: #339933;">=</span> rayDirY <span style="color: #339933;">*</span> closestIntersectionDist<span style="color: #339933;">;</span>
 				intersectionZ <span style="color: #339933;">=</span> rayDirZ <span style="color: #339933;">*</span> closestIntersectionDist<span style="color: #339933;">;</span>
&nbsp;
					<span style="color: #006600; font-style: italic;">// sphere normal at intersection point</span>
 				normalX <span style="color: #339933;">=</span> intersectionX <span style="color: #339933;">-</span> sphereCenterX<span style="color: #009900;">&#91;</span>closestSphereIndex<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 				normalY <span style="color: #339933;">=</span> intersectionY <span style="color: #339933;">-</span> sphereCenterY<span style="color: #009900;">&#91;</span>closestSphereIndex<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 				normalZ <span style="color: #339933;">=</span> intersectionZ <span style="color: #339933;">-</span> sphereCenterZ<span style="color: #009900;">&#91;</span>closestSphereIndex<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 				normalX <span style="color: #339933;">/=</span> sphereRadius<span style="color: #009900;">&#91;</span>closestSphereIndex<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// could be multiply by precacluated 1/rad</span>
 				normalY <span style="color: #339933;">/=</span> sphereRadius<span style="color: #009900;">&#91;</span>closestSphereIndex<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 				normalZ <span style="color: #339933;">/=</span> sphereRadius<span style="color: #009900;">&#91;</span>closestSphereIndex<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
					<span style="color: #006600; font-style: italic;">// diffuse illumination coef</span>
 				illumination <span style="color: #339933;">=</span> 	normalX <span style="color: #339933;">*</span> lightDirX <span style="color: #339933;">+</span>
 								normalY <span style="color: #339933;">*</span> lightDirY <span style="color: #339933;">+</span>
 								normalZ <span style="color: #339933;">*</span> lightDirZ<span style="color: #339933;">;</span>
&nbsp;
					<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> illumination <span style="color: #339933;">&lt;</span> ambientIllumination <span style="color: #009900;">&#41;</span>
 					illumination <span style="color: #339933;">=</span> ambientIllumination<span style="color: #339933;">;</span>
&nbsp;
					<span style="color: #006600; font-style: italic;">/// trace a shadow ray ///</span>
 				<span style="color: #003366; font-weight: bold;">var</span> isInShadow<span style="color: #339933;">:</span>Boolean <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
 				<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> numSpheres<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>j<span style="color: #009900;">&#41;</span>
 				<span style="color: #009900;">&#123;</span>
 					<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> j <span style="color: #339933;">==</span> closestSphereIndex <span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
&nbsp;
						rayToSphereCenterX <span style="color: #339933;">=</span> sphereCenterX<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> intersectionX<span style="color: #339933;">;</span>
 					rayToSphereCenterY <span style="color: #339933;">=</span> sphereCenterY<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> intersectionY<span style="color: #339933;">;</span>
 					rayToSphereCenterZ <span style="color: #339933;">=</span> sphereCenterZ<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> intersectionZ<span style="color: #339933;">;</span>
&nbsp;
						lengthRTSC2 <span style="color: #339933;">=</span> 		rayToSphereCenterX <span style="color: #339933;">*</span> rayToSphereCenterX <span style="color: #339933;">+</span>
 										rayToSphereCenterY <span style="color: #339933;">*</span> rayToSphereCenterY <span style="color: #339933;">+</span>
 										rayToSphereCenterZ <span style="color: #339933;">*</span> rayToSphereCenterZ<span style="color: #339933;">;</span>
&nbsp;
						closestApproach <span style="color: #339933;">=</span>	rayToSphereCenterX <span style="color: #339933;">*</span> lightDirX <span style="color: #339933;">+</span>
 										rayToSphereCenterY <span style="color: #339933;">*</span> lightDirY <span style="color: #339933;">+</span>
 										rayToSphereCenterZ <span style="color: #339933;">*</span> lightDirZ<span style="color: #339933;">;</span>
 					<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> closestApproach <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// intersection behind the origin</span>
 						<span style="color: #000066; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
&nbsp;
						halfCord2 <span style="color: #339933;">=</span> sphereRadius<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> sphereRadius<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> lengthRTSC2 <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>closestApproach <span style="color: #339933;">*</span> closestApproach<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 					<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> halfCord2 <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// ray misses the sphere</span>
 						<span style="color: #000066; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
&nbsp;
						isInShadow <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
 					<span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
					<span style="color: #009900;">&#125;</span>
&nbsp;
					<span style="color: #006600; font-style: italic;">/// end of shadow ray ///</span>
&nbsp;
					<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> isInShadow <span style="color: #009900;">&#41;</span> illumination <span style="color: #339933;">*=</span> .5<span style="color: #339933;">;</span>
&nbsp;
					<span style="color: #006600; font-style: italic;">/// trace reflected ray ///</span>
 				<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> sphereReflects<span style="color: #009900;">&#91;</span>closestSphereIndex<span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span>
 				<span style="color: #009900;">&#123;</span>
 					<span style="color: #006600; font-style: italic;">// calculate reflected ray direction</span>
 					<span style="color: #003366; font-weight: bold;">var</span> reflectCoef<span style="color: #339933;">:</span>Number <span style="color: #339933;">=</span> <span style="color: #CC0000;">2</span> <span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span>rayDirX <span style="color: #339933;">*</span> normalX <span style="color: #339933;">+</span> rayDirY <span style="color: #339933;">*</span> normalY <span style="color: #339933;">+</span> rayDirZ <span style="color: #339933;">*</span> normalZ<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 					reflectRayDirX <span style="color: #339933;">=</span> rayDirX <span style="color: #339933;">-</span> normalX <span style="color: #339933;">*</span> reflectCoef<span style="color: #339933;">;</span>
 					reflectRayDirY <span style="color: #339933;">=</span> rayDirY <span style="color: #339933;">-</span> normalY <span style="color: #339933;">*</span> reflectCoef<span style="color: #339933;">;</span>
 					reflectRayDirZ <span style="color: #339933;">=</span> rayDirZ <span style="color: #339933;">-</span> normalZ <span style="color: #339933;">*</span> reflectCoef<span style="color: #339933;">;</span>
&nbsp;
						closestIntersectionDist <span style="color: #339933;">=</span> Number.<span style="color: #660066;">POSITIVE_INFINITY</span><span style="color: #339933;">;</span>
 					reflectClosestSphereIndex <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span>
 					<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> numSpheres<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>j<span style="color: #009900;">&#41;</span>
 					<span style="color: #009900;">&#123;</span>
 						<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> j <span style="color: #339933;">==</span> closestSphereIndex <span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
&nbsp;
							rayToSphereCenterX <span style="color: #339933;">=</span> sphereCenterX<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> intersectionX<span style="color: #339933;">;</span>
 						rayToSphereCenterY <span style="color: #339933;">=</span> sphereCenterY<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> intersectionY<span style="color: #339933;">;</span>
 						rayToSphereCenterZ <span style="color: #339933;">=</span> sphereCenterZ<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> intersectionZ<span style="color: #339933;">;</span>
&nbsp;
							lengthRTSC2 <span style="color: #339933;">=</span> 		rayToSphereCenterX <span style="color: #339933;">*</span> rayToSphereCenterX <span style="color: #339933;">+</span>
 											rayToSphereCenterY <span style="color: #339933;">*</span> rayToSphereCenterY <span style="color: #339933;">+</span>
 											rayToSphereCenterZ <span style="color: #339933;">*</span> rayToSphereCenterZ<span style="color: #339933;">;</span>
&nbsp;
							closestApproach <span style="color: #339933;">=</span> 	rayToSphereCenterX <span style="color: #339933;">*</span> reflectRayDirX <span style="color: #339933;">+</span>
 											rayToSphereCenterY <span style="color: #339933;">*</span> reflectRayDirY <span style="color: #339933;">+</span>
 											rayToSphereCenterZ <span style="color: #339933;">*</span> reflectRayDirZ<span style="color: #339933;">;</span>
&nbsp;
							<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> closestApproach <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// intersection behind the origin</span>
 							<span style="color: #000066; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
&nbsp;
							halfCord2 <span style="color: #339933;">=</span> sphereRadius<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> sphereRadius<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> lengthRTSC2 <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>closestApproach <span style="color: #339933;">*</span> closestApproach<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 						<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> halfCord2 <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// ray misses the sphere</span>
 							<span style="color: #000066; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
&nbsp;
							<span style="color: #006600; font-style: italic;">// ray hits the sphere</span>
 						dist <span style="color: #339933;">=</span> closestApproach <span style="color: #339933;">-</span> Math.<span style="color: #660066;">sqrt</span><span style="color: #009900;">&#40;</span>halfCord2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 						<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> dist <span style="color: #339933;">&lt;</span> closestIntersectionDist <span style="color: #009900;">&#41;</span>
 						<span style="color: #009900;">&#123;</span>
 							closestIntersectionDist <span style="color: #339933;">=</span> dist<span style="color: #339933;">;</span>
 							reflectClosestSphereIndex<span style="color: #339933;">=</span>j<span style="color: #339933;">;</span>
 						<span style="color: #009900;">&#125;</span>
 					<span style="color: #009900;">&#125;</span> <span style="color: #006600; font-style: italic;">// end loop through spheres for reflect ray</span>
&nbsp;
						<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> reflectClosestSphereIndex <span style="color: #339933;">==</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// reflected ray misses</span>
 					<span style="color: #009900;">&#123;</span>
 						r <span style="color: #339933;">=</span> sphereR<span style="color: #009900;">&#91;</span>closestSphereIndex<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> illumination<span style="color: #339933;">;</span>
 						g <span style="color: #339933;">=</span> sphereG<span style="color: #009900;">&#91;</span>closestSphereIndex<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> illumination<span style="color: #339933;">;</span>
 						b <span style="color: #339933;">=</span> sphereB<span style="color: #009900;">&#91;</span>closestSphereIndex<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> illumination<span style="color: #339933;">;</span>
&nbsp;
						<span style="color: #009900;">&#125;</span>
 					<span style="color: #000066; font-weight: bold;">else</span>
 					<span style="color: #009900;">&#123;</span>
 						<span style="color: #006600; font-style: italic;">//trace(&quot;ref hit&quot;);</span>
 						<span style="color: #006600; font-style: italic;">// location of ray-sphere intersection</span>
 						reflectIntersectionX <span style="color: #339933;">=</span> reflectRayDirX <span style="color: #339933;">*</span> closestIntersectionDist <span style="color: #339933;">+</span> intersectionX<span style="color: #339933;">;</span>
 						reflectIntersectionY <span style="color: #339933;">=</span> reflectRayDirY <span style="color: #339933;">*</span> closestIntersectionDist <span style="color: #339933;">+</span> intersectionY<span style="color: #339933;">;</span>
 						reflectIntersectionZ <span style="color: #339933;">=</span> reflectRayDirZ <span style="color: #339933;">*</span> closestIntersectionDist <span style="color: #339933;">+</span> intersectionZ<span style="color: #339933;">;</span>
&nbsp;
							<span style="color: #006600; font-style: italic;">// sphere normal at intersection point</span>
 						normalX <span style="color: #339933;">=</span> reflectIntersectionX <span style="color: #339933;">-</span> sphereCenterX<span style="color: #009900;">&#91;</span>reflectClosestSphereIndex<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 						normalY <span style="color: #339933;">=</span> reflectIntersectionY <span style="color: #339933;">-</span> sphereCenterY<span style="color: #009900;">&#91;</span>reflectClosestSphereIndex<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 						normalZ <span style="color: #339933;">=</span> reflectIntersectionZ <span style="color: #339933;">-</span> sphereCenterZ<span style="color: #009900;">&#91;</span>reflectClosestSphereIndex<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
							normalX <span style="color: #339933;">/=</span> sphereRadius<span style="color: #009900;">&#91;</span>reflectClosestSphereIndex<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// could be multiply by precacluated 1/rad</span>
 						normalY <span style="color: #339933;">/=</span> sphereRadius<span style="color: #009900;">&#91;</span>reflectClosestSphereIndex<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 						normalZ <span style="color: #339933;">/=</span> sphereRadius<span style="color: #009900;">&#91;</span>reflectClosestSphereIndex<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
							<span style="color: #006600; font-style: italic;">// diffuse illumination coef</span>
 						reflectIllumination <span style="color: #339933;">=</span> 	normalX <span style="color: #339933;">*</span> lightDirX <span style="color: #339933;">+</span>
 												normalY <span style="color: #339933;">*</span> lightDirY <span style="color: #339933;">+</span>
 												normalZ <span style="color: #339933;">*</span> lightDirZ<span style="color: #339933;">;</span>
&nbsp;
							<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> reflectIllumination <span style="color: #339933;">&lt;</span> ambientIllumination <span style="color: #009900;">&#41;</span>
 							reflectIllumination <span style="color: #339933;">=</span> ambientIllumination<span style="color: #339933;">;</span>
&nbsp;
							r <span style="color: #339933;">=</span> sphereR<span style="color: #009900;">&#91;</span>closestSphereIndex<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> illumination <span style="color: #339933;">+</span> .5 <span style="color: #339933;">*</span> sphereR<span style="color: #009900;">&#91;</span>reflectClosestSphereIndex<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> reflectIllumination<span style="color: #339933;">;</span>
 						g <span style="color: #339933;">=</span> sphereG<span style="color: #009900;">&#91;</span>closestSphereIndex<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> illumination <span style="color: #339933;">+</span> .5 <span style="color: #339933;">*</span> sphereG<span style="color: #009900;">&#91;</span>reflectClosestSphereIndex<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> reflectIllumination<span style="color: #339933;">;</span>
 						b <span style="color: #339933;">=</span> sphereB<span style="color: #009900;">&#91;</span>closestSphereIndex<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> illumination <span style="color: #339933;">+</span> .5 <span style="color: #339933;">*</span> sphereB<span style="color: #009900;">&#91;</span>reflectClosestSphereIndex<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> reflectIllumination<span style="color: #339933;">;</span>
 						<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> r <span style="color: #339933;">&gt;</span> <span style="color: #CC0000;">255</span> <span style="color: #009900;">&#41;</span> r <span style="color: #339933;">=</span> <span style="color: #CC0000;">255</span><span style="color: #339933;">;</span>
 						<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> g <span style="color: #339933;">&gt;</span> <span style="color: #CC0000;">255</span> <span style="color: #009900;">&#41;</span> g <span style="color: #339933;">=</span> <span style="color: #CC0000;">255</span><span style="color: #339933;">;</span>
 						<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> b <span style="color: #339933;">&gt;</span> <span style="color: #CC0000;">255</span> <span style="color: #009900;">&#41;</span> b <span style="color: #339933;">=</span> <span style="color: #CC0000;">255</span><span style="color: #339933;">;</span>
&nbsp;
						<span style="color: #009900;">&#125;</span>  <span style="color: #006600; font-style: italic;">// end if reflected ray hits</span>
&nbsp;
					<span style="color: #009900;">&#125;</span> <span style="color: #006600; font-style: italic;">/// end if reflects</span>
 				<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #006600; font-style: italic;">// primary ray doesn't reflect</span>
 				<span style="color: #009900;">&#123;</span>
 					r <span style="color: #339933;">=</span> sphereR<span style="color: #009900;">&#91;</span>closestSphereIndex<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> illumination<span style="color: #339933;">;</span>
 					g <span style="color: #339933;">=</span> sphereG<span style="color: #009900;">&#91;</span>closestSphereIndex<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> illumination<span style="color: #339933;">;</span>
 					b <span style="color: #339933;">=</span> sphereB<span style="color: #009900;">&#91;</span>closestSphereIndex<span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> illumination<span style="color: #339933;">;</span>
 				<span style="color: #009900;">&#125;</span>
&nbsp;
					outputBitmapData.<span style="color: #660066;">setPixel</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">,</span> y<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>r<span style="color: #339933;">&lt;&amp;</span>lt<span style="color: #339933;">;</span><span style="color: #CC0000;">16</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>g<span style="color: #339933;">&lt;&amp;</span>lt<span style="color: #339933;">;</span><span style="color: #CC0000;">8</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> b<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
				<span style="color: #009900;">&#125;</span> <span style="color: #006600; font-style: italic;">// end if primary ray hit</span>
 		<span style="color: #009900;">&#125;</span> <span style="color: #006600; font-style: italic;">// end x loop</span>
 	<span style="color: #009900;">&#125;</span> <span style="color: #006600; font-style: italic;">// end y loop</span>
 	outputBitmapData.<span style="color: #660066;">unlock</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #006600; font-style: italic;">// compute FPS</span>
 	<span style="color: #003366; font-weight: bold;">var</span> fps<span style="color: #339933;">:</span>Number <span style="color: #339933;">=</span> <span style="color: #CC0000;">1.0</span><span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>getTimer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> timer<span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #CC0000;">1000.0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 	frameTimeTxt.<span style="color: #660066;">text</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;Drag to rotate. FPS: &quot;</span> <span style="color: #339933;">+</span> int<span style="color: #009900;">&#40;</span>fps<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://drawlogic.com/2008/03/22/as3-real-time-raytracing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AS3 Papervision3D 2.0 and 2D BitmapData Effects are Evolving</title>
		<link>http://drawlogic.com/2007/11/22/as3-papervision3d-20-and-effect-evolving/</link>
		<comments>http://drawlogic.com/2007/11/22/as3-papervision3d-20-and-effect-evolving/#comments</comments>
		<pubDate>Thu, 22 Nov 2007 19:12:58 +0000</pubDate>
		<dc:creator>drawk</dc:creator>
				<category><![CDATA[3d]]></category>
		<category><![CDATA[3D ENGINES]]></category>
		<category><![CDATA[ACTIONSCRIPT]]></category>
		<category><![CDATA[ACTIONSCRIPT3]]></category>
		<category><![CDATA[AIF]]></category>
		<category><![CDATA[ALGORITHM]]></category>
		<category><![CDATA[ARCHITECT]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[CODE]]></category>
		<category><![CDATA[DRAWING]]></category>
		<category><![CDATA[EFFECTS]]></category>
		<category><![CDATA[ENGINE]]></category>
		<category><![CDATA[FLASH]]></category>
		<category><![CDATA[FLEX]]></category>
		<category><![CDATA[GAMEDEV]]></category>
		<category><![CDATA[GAMES]]></category>
		<category><![CDATA[OPEN SOURCE]]></category>
		<category><![CDATA[PAPERVISION]]></category>
		<category><![CDATA[PERFORMANCE]]></category>
		<category><![CDATA[PIXEL]]></category>
		<category><![CDATA[PROGRAMMING]]></category>
		<category><![CDATA[RENDERING]]></category>
		<category><![CDATA[TECHNOLOGY]]></category>
		<category><![CDATA[VISUALIZATION]]></category>

		<guid isPermaLink="false">http://drawlogic.com/2007/11/22/as3-papervision3d-20-and-effect-evolving/</guid>
		<description><![CDATA[Andy Zupko is probably doing some of the coolest / useful work in performance and possible effects combining 2D and 3D. Using 2D BitmapData and papervision 3D it turns out you can create a parallel dimension of coolness that cannot fully exist by themselves. Papervision 2.0 with these effects and if it is as pluggable [...]]]></description>
			<content:encoded><![CDATA[<p><strong><a href="http://blog.zupko.info/" target="_blank">Andy Zupko</a></strong> is probably <a href="http://blog.zupko.info/?p=69" target="_blank">doing some of the coolest / useful work in performance and possible effects <strong>combining 2D and 3D</strong></a>.  Using 2D BitmapData and papervision 3D it turns out you can create a <a href="http://blog.zupko.info/?p=54" target="_blank">parallel dimension of coolness</a> that cannot fully exist by themselves.</p>
<p><a href="http://blog.zupko.info/?p=69" target="_blank"></a></p>
<p style="text-align:center;"><a href="http://blog.zupko.info/?p=69" target="_blank"><img src="http://i81.photobucket.com/albums/j223/drawkbox/zupkopv3d.png" border="0" height="402" width="400" /> </a></p>
<p align="left"><strong>Papervision 2.0 with these effects and if it is as pluggable as it seems is very good for games that lighting is a key component or effects. </strong> Imagine a game that can customize weapons with 2d effects in 3d, or rocket boosters, or fireworks or all kinds of inspiring things like changing the mood or environment such as fog, lighting etc&#8230; If you start taling about adding physics to all this it just gets too fun. Effects have always been there and around, but making this possible to have a semi-standard way to do this and if it is pluggable, this can lead to many engine advancements.</p>
<p align="left"> I think the PV3d team additions of Tim Knip and Andy Zupko have been very good and zupko era in PV3d has begun. Tim Knip is also very active and helping to really organize the ascollada formats and performance stuff like only drawing what is on screen.</p>
<p align="left">Who needs Hydra now? j/k although having this now in papervision leads me to see a very fun 2008 ahead for Flash, it is also, if as pluggable as it seems, a bit like a shaders kit.</p>
<p align="left">All those older great 2d effects merging into 3d from the good old days (some still going very strong) of praystation, <a href="http://yugop.com/" target="_blank">yugop</a>, <a href="http://www.levitated.net/" target="_blank">levitated</a>, <a href="http://www.neave.com/" target="_blank">neave </a>(great 2d tv effects in <a href="http://www.neave.tv/" target="_blank">neave.tv</a>) , <a href="http://www.flight404.com/blog/" target="_blank">flight404 </a>(moved to processing) and many others.  And a new era of <a href="http://blog.zupko.info/" target="_blank">zupko [pv3d]</a>, <a href="http://mrdoob.com/" target="_blank">mr. doob</a>, <a href="http://unitzeroone.com/blog/" target="_blank">unitzeroone [pv3d]</a>, <a href="http://www.closier.nl/blog/" target="_blank">fabrice</a> [away3d] and many more a new 2d effects in 3d platform is emerging. This kit for papervision3d by zupko and Hydra is making the future glowing full of bright points, and lots of effect explosions.</p>
<p align="left"><strong> Let&#8217;s hope papervision3d 2.0 it is released soon and it has zupko&#8217;s effects code in there.</strong></p>
<p align="left">&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://drawlogic.com/2007/11/22/as3-papervision3d-20-and-effect-evolving/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flash 10: Hydra and AIF (Adobe Image Foundation) and Hardware Rendering</title>
		<link>http://drawlogic.com/2007/10/02/flash-10-hydra-and-aif-adobe-image-foundation-and-hardware-rendering/</link>
		<comments>http://drawlogic.com/2007/10/02/flash-10-hydra-and-aif-adobe-image-foundation-and-hardware-rendering/#comments</comments>
		<pubDate>Tue, 02 Oct 2007 09:20:44 +0000</pubDate>
		<dc:creator>drawk</dc:creator>
				<category><![CDATA[3d]]></category>
		<category><![CDATA[ACTIONSCRIPT]]></category>
		<category><![CDATA[ACTIONSCRIPT3]]></category>
		<category><![CDATA[ADOBE]]></category>
		<category><![CDATA[AIF]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[COMMERCIAL]]></category>
		<category><![CDATA[COMPANIES]]></category>
		<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[FLASH]]></category>
		<category><![CDATA[FLEX]]></category>
		<category><![CDATA[GAMEDEV]]></category>
		<category><![CDATA[NEWS]]></category>
		<category><![CDATA[RENDERING]]></category>
		<category><![CDATA[TECHNOLOGY]]></category>

		<guid isPermaLink="false">http://drawk.wordpress.com/2007/10/02/flash-10-hydra-and-aif-adobe-image-foundation-and-hardware-rendering/</guid>
		<description><![CDATA[Adobe has announced the release of the inital developer views of AIF and Hydra in &#8220;Astro&#8221; the next version of the flash player (10). AIF (Adobe Image Foundation) like AIR (Adobe Integrated Runtime) is a new technology just out of the gate but it does show that Adobe is into innovating and the vector wars. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.adobe.com/kevin.goldsmith/2007/10/its_alive_hydra.html" target="_blank">Adobe has announced the release of the inital developer views of AIF and Hydra in &#8220;Astro&#8221; the next version of the flash player (10).</a></p>
<p><a href="http://labs.adobe.com/wiki/index.php/AIF_Toolkit" target="_blank">AIF (Adobe Image Foundation)</a> like <a href="http://labs.adobe.com/technologies/air/" target="_blank">AIR (Adobe Integrated Runtime) </a>is a new technology just out of the gate but it does show that Adobe is into innovating and the vector wars.  AIR is beta2 and <a href="http://www.kaourantin.net/2007/10/getting-ready-for-showtime.html" target="_blank">Flash player 9 &#8220;moviestar&#8221; updates for video are coming along nicely</a> but here we have more news out of MAX in Chicago that AIF is now available.</p>
<p><strong>What is AIF?  It is a new imaging and effects technology to help people create their own filters for Flash </strong>(blur, drop shadow etc are defaults)<strong>.  </strong>Hydra the new language for this is reminiscent of processing.org (if you haven&#8217;t been to <a href="http://www.flight404.com/" target="_blank">flight404.com</a> since the 90&#8242;s then processing is all it is about there) and Cg from nVidia to write and test shaders. <strong> The fact that it is based on GLSL (</strong><strong>OpenGL Shading Language)</strong><strong> will help it easily port shaders coming in 3d gaming into Flash which is really sweet. </strong>The direction slowly is that Flash and maybe Silverlight will become more of gaming platforms and this is a nice point in that direction.</p>
<p>From Adobe here is what <a href="http://labs.adobe.com/wiki/index.php/AIF_Toolkit" target="_blank">AIF </a>is:</p>
<blockquote>
<h2> Introduction to the Adobe Image Foundation Toolkit Technology Preview</h2>
<p><strong>The Adobe Image Foundation (AIF) Toolkit preview release includes a high-performance graphics programming language that Adobe is developing for image processing, codenamed Hydra, and an application to create, compile and preview Hydra filters and effects</strong>. The toolkit contains a specification for the Hydra language, several sample filters, and sample images provided by AIF team members. The AIF technology delivers a common image and video processing infrastructure which provides automatic runtime optimization on heterogeneous hardware. It <strong>currently ships in After Effects CS3</strong> and will be used in other Adobe products in the future. <strong>The next release of Flash Player, codenamed <a href="http://labs.adobe.com/wiki/index.php/Astro" class="external" title="http://labs.adobe.com/wiki/index.php/Astro" rel="nofollow" target="_blank">Astro</a>, will leverage Hydra to enable developers to create custom filters, effects and blend modes</strong>.</p>
<p><strong>Hydra is a programming language used to implement image processing algorithms in a hardware-independent manner</strong>. Some benefits of Hydra include:</p>
<ul>
<li>  Familiar syntax that is based on GLSL, which is C-based</li>
<li><strong> Allows the same filter to run efficiently on different GPU and CPU architectures, including multi-core and multiprocessor systems in a future update</strong></li>
<li>  Abstracts out the complexity of executing on heterogeneous hardware</li>
<li><strong>  Supports 3rd party creation and sharing of filters and effects</strong></li>
<li>  Delivers excellent image processing performance in Adobe products</li>
</ul>
</blockquote>
<p>Reaction is that this is a <strong>strong Adobe direction to move towards more capable technology as in AS3 and Hydra</strong> and allow more customizable possibly hardware rendered and accelerated shader like technology for Flash filters. The new AVM2 and AS3 allow for faster processing and pixel based operations that you need for buildng filters and or shaders.</p>
<p>This is pretty interesting, it isn&#8217;t full blown hardware rendering which would just be excellent.  So far <a href="http://drawk.wordpress.com/2007/06/10/directx-and-opengl-hardware-acceleration-in-flash9-update/" target="_blank">hardware accelerated full screen stretching in Flash 9 Moviestar beta</a> and now filters will have an element of hardware capable rendering, it should help performance.  <strong>Full hardware acceleration seemingly will not happen in Flash 10 so the 3d engines and new 3d elements from Adobe are all software rendered still. </strong>However dual and multi-core processing will help rendering of 3d in flash BUT video cards are more prevalent than dual or multi-core for some time.  Basic hardware rendering even for a low bar could greatly change the flash platform.</p>
<p>It is still a while off yet but it was good to know that performance and shaders/filters are getting attention but hardware rendering not just yet for 3d and basic drawing/rendering. One thing is for sure, in 2007 developing interactive for the web is being shook up and changing rapidly.</p>
<p><strong>Here&#8217;s a video taken by Aral Balkan of the Astro presentation at MAX</strong></p>
<p>[youtube="http://www.youtube.com/watch?v=ympeCv8lLmw"]</p>
]]></content:encoded>
			<wfw:commentRss>http://drawlogic.com/2007/10/02/flash-10-hydra-and-aif-adobe-image-foundation-and-hardware-rendering/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

