<?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>CoderHump.com &#187; Cool Stuff</title>
	<atom:link href="http://coderhump.com/archives/category/cool-stuff/feed" rel="self" type="application/rss+xml" />
	<link>http://coderhump.com</link>
	<description>Game Development Technology, in Flash and Elsewhere</description>
	<lastBuildDate>Tue, 06 Jul 2010 17:18:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>I Wrote A Book: Video Game Optimization</title>
		<link>http://coderhump.com/archives/585</link>
		<comments>http://coderhump.com/archives/585#comments</comments>
		<pubDate>Mon, 05 Apr 2010 06:16:18 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Cool Stuff]]></category>
		<category><![CDATA[How To]]></category>
		<category><![CDATA[Publication]]></category>

		<guid isPermaLink="false">http://coderhump.com/?p=585</guid>
		<description><![CDATA[
More precisely, Eric Preisz and I wrote a  book!
The book is called Video Game Optimization, and it covers everything you need to know to get maximum performance from any software project &#8211; but especially games. If you&#8217;re struggling with getting a great framerate out of your game, I highly recommend checking it out.  [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.amazon.com/Video-Game-Optimization-Eric-Preisz/dp/1598634356"><img src="http://coderhump.com/wp-content/uploads/2010/04/photo-225x300.jpg" alt="" title="Ben Garney With Video Game Optimization" width="225" height="300" class="alignleft size-medium wp-image-591" /></a></p>
<p>More precisely, <a href="http://www.torquepowered.com/account/profile/59817">Eric Preisz</a> and I wrote a  <a href="http://www.amazon.com/Video-Game-Optimization-Eric-Preisz/dp/1598634356">book</a>!</p>
<p>The book is called <a href="http://www.amazon.com/Video-Game-Optimization-Eric-Preisz/dp/1598634356">Video Game Optimization</a>, and it covers everything you need to know to get maximum performance from any software project &#8211; but especially games. If you&#8217;re struggling with getting a great framerate out of your game, I highly recommend checking it out. <img src='http://coderhump.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  </p>
<p>Video Game Optimization goes all the way from high-level concepts like planning for performance in your project&#8217;s timeline, to determining which broad area of your system is a bottleneck, down to specific tips and tricks for optimizing for space, time, and interactivity. Based on the course that Eric Preisz taught at Full Sail University on optimization, it isn&#8217;t the only book you&#8217;d ever want to read on the subject, but we think it is a great introduction!</p>
<p>The journey from that initial conversation where our mutual friend <a href="http://www.linkedin.com/in/jdmoore">Jay Moore</a> introduced us and suggested I would be a good co-author, to the day when we finished and shipped the book was a long but rewarding trek. Eric moved across the country from Florida to Nevada, as he moved from teaching at Full Sail University to running the Tech and Tools group at InstantAction. He also became a father with the arrival of his son, Grant. I left after 5 years at GarageGames and helped build a new company, <a href="http://www.pushbuttonlabs.com/">PushButton Labs</a>.</p>
<p>A lot has changed while we wrote it, but it still felt really good to arrive at GDC, visit the book store outside the exhibition hall, and finding a big stack of Video Game Optimization sitting front and center. <img src='http://coderhump.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://coderhump.com/archives/585/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Adobe MAX 2009 BYOL: Build a Flash Based Platformer in 90 Minutes</title>
		<link>http://coderhump.com/archives/510</link>
		<comments>http://coderhump.com/archives/510#comments</comments>
		<pubDate>Sat, 03 Oct 2009 23:49:27 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Cool Stuff]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[PushButton Engine]]></category>
		<category><![CDATA[PushButton Labs]]></category>
		<category><![CDATA[Talks]]></category>

		<guid isPermaLink="false">http://coderhump.com/?p=510</guid>
		<description><![CDATA[I will be doing a BYOL session at Adobe MAX 2009. It&#8217;s a lab where you learn how to build a platformer in Flash in 90 minutes, and it&#8217;s Wednesday at 4pm. It is titled &#8220;Build a Flash Based Platformer in 90 Minutes&#8221; in honor of its subject matter.
It is pretty cool stuff, and I&#8217;m [...]]]></description>
			<content:encoded><![CDATA[<p>I will be doing a BYOL session at <a href="http://max.adobe.com/">Adobe MAX 2009</a>. It&#8217;s a lab where you learn how to build a platformer in Flash in 90 minutes, and it&#8217;s Wednesday at 4pm. It is titled &#8220;Build a Flash Based Platformer in 90 Minutes&#8221; in honor of its subject matter.</p>
<p>It is pretty cool stuff, and I&#8217;m excited to be sharing it! You get introduced to the <a href="http://www.pushbuttonengine.com/">PushButton Engine</a>, get a preview copy of Clint Herron&#8217;s excellent <a href="http://hanclinto.com/">Platformer Starter Kit</a>, and (assuming things go smoothly), you end up building this platformer:</p>
<p><a href="http://hanclinto.com/blog/demo"><img src="http://coderhump.com/wp-content/uploads/2009/10/picture-1.png" alt="picture-1" title="picture-1" width="637" height="359" class="aligncenter size-full wp-image-512" /></a></p>
<p><center><i>(Click image to play demo)</i></center></p>
<p>We&#8217;re excited about it. <img src='http://coderhump.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>If you are a Flash game dev and at MAX or in the LA area, I&#8217;d love to talk games with you. Shoot me an e-mail (ben dot garney at gmail dot com) or DM me at <a href="http://twitter.com/bengarney">@bengarney</a> and let&#8217;s make it happen!</p>
<p>Also, with luck, Monday there should be a cool update on that secret project I was working on. <img src='http://coderhump.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>See you at MAX!</p>
]]></content:encoded>
			<wfw:commentRss>http://coderhump.com/archives/510/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Technical Notes on O3D</title>
		<link>http://coderhump.com/archives/427</link>
		<comments>http://coderhump.com/archives/427#comments</comments>
		<pubDate>Tue, 21 Apr 2009 22:23:49 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Cool Stuff]]></category>
		<category><![CDATA[Opinion]]></category>

		<guid isPermaLink="false">http://coderhump.com/?p=427</guid>
		<description><![CDATA[
Google released O3D, a web plugin for 3d rendering, today. It&#8217;s a pretty sweet piece of work. Definitely check it out if you have any interest in 3d rendering, the web, or JavaScript.
There are a couple of cool pieces to this puzzle, and I wanted to call them out to other people who might be [...]]]></description>
			<content:encoded><![CDATA[<p><center><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/uofWfXOzX-g&#038;rel=0&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/uofWfXOzX-g&#038;rel=0&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object></center></p>
<p><b>Google released <a href="http://code.google.com/apis/o3d/">O3D, a web plugin for 3d rendering</a>, today.</b> It&#8217;s a pretty sweet piece of work. Definitely check it out if you have any interest in 3d rendering, the web, or JavaScript.</p>
<p>There are a couple of cool pieces to this puzzle, and I wanted to call them out to other people who might be reviewing this technology. The two sentence review: <b>I am blown away. They got this right.</b></p>
<p>(FYI: This post isn&#8217;t meant to be a full walkthrough, just a quick indication of the cool jumping off points in the codebase.)</p>
<p>Stop number one is <b>the graphics API abstraction</b>. This is rooted in <a href="http://o3d.googlecode.com/svn/trunk/googleclient/o3d/core/cross/renderer.h">o3d/core/cross/renderer.h</a>, which provides an abstract interface for performing render operations. This is sensibly designed, oriented for SM2.0 through SM4.0 level hardware. It will also deal with DX11 class hardware, although it won&#8217;t expose all of the niceties DX11 gets you. It wraps GL (<a href="http://o3d.googlecode.com/svn/trunk/googleclient/o3d/core/cross/gl/">o3d/core/cross/gl/</a>) and D3D9 (<a href="http://o3d.googlecode.com/svn/trunk/googleclient/o3d/core/win/d3d9/">o3d/core/win/d3d9</a>). The purpose of all this is to provide a common ground for all the higher level code to issue draw commands from. It is not directly accessible from JavaScript (although some of the related classes like <a href="http://code.google.com/apis/o3d/docs/reference/classo3d_1_1_sampler.html">Sampler</a> and <a href="http://code.google.com/apis/o3d/docs/reference/classo3d_1_1_state.html">State</a> are.)</p>
<p>As an aside, writing a <a href="http://www.radgametools.com/pixomain.htm">Pixomatic</a> or <a href="http://en.wikipedia.org/wiki/Larrabee_(GPU)">Larrabee</a> backend would not be hard. At <a href="http://www.garagegames.com/">GarageGames</a>, we had a rendering API similar to this (unimaginatively called GFX), and it was fantastically useful. Last time I checked, there were DX8, DX9, DX10/11, GL, and Pixomatic backends for it in varying states of usefulness. We even had one guy write a backend that would stream draw commands over a socket, which was pretty cool. In the context of O3D, they have <a href="http://o3d.googlecode.com/svn/trunk/googleclient/o3d/core/cross/command_buffer/">an implementation of Renderer that queues everything into command_buffer</a>, then streams it to a <a href="http://o3d.googlecode.com/svn/trunk/googleclient/o3d/core/win/command_buffer/">command buffer server</a> running in a separate thread, which issues the actual draw commands. It&#8217;s unclear whether this is used in the current version of the plugin based on casual inspection, but it&#8217;s a great example of what good design can get you.</p>
<p>The next piece is <b>the DrawList</b>, which is where most of the heavy lifting for drawing happens. JavaScript, of course, is not really desirable to have in your inner rendering loops, so you queue everything you want to draw (<a href="http://code.google.com/apis/o3d/docs/reference/classo3d_1_1_draw_element.html">DrawElements</a>) into a <a href="http://code.google.com/apis/o3d/docs/reference/classo3d_1_1_draw_list.html">DrawList</a>. This is wrapped by higher levels, of course, but it represents the lowest level API that&#8217;s available to JS code. All the sorting and state management to get stuff on screen happens in this area.</p>
<p>Alongside the DrawList stuff, you find <b>the <a href="http://code.google.com/apis/o3d/docs/shadinglanguage.html">material system</a></b>, which is pretty slick. You write your shaders in their shading language, and it converts to HLSL SM2.0 and Cg (arbvp1/arbfp1). This is enough to do almost anything you might want to (as fantastic as SM3.0+ is it&#8217;s not really necessary for most rendering). There&#8217;s a full SAS system so you can interface programmatically with your shaders.</p>
<p>Above this, you get into <b>the scenegraph</b>. Now, I subscribe to <a href="http://home.comcast.net/~tom_forsyth/blog.wiki.html#%5B%5BScene%20Graphs%20-%20just%20say%20no%5D%5D">Tom Foryth&#8217;s views on scenegraphs</a>, which is that they are basically a bad idea, but I think the Google guys were smart and set up their API so intelligent developers can avoid being screwed by the scenegraph. The scenegraph-esque stuff they do have (<a href="http://code.google.com/apis/o3d/docs/rendering.html">they call it a rendergraph</a>) is powerful enough you can do most rendering without going nuts, and lets a lot of the heavy lifting stay in native code, where it will be fast. You end up doing retained mode-ish things, but since JS is slow, and most JS developers come from a DOM background, it works better than you might expect.</p>
<p>There are a lot of <b>cool miscellaneous features</b>, too. They <a href="http://code.google.com/apis/o3d/docs/v8engine.html">embed the fast V8 JS engine</a> right in the plugin so you can have consistently fast JS execution. They support falling back to an <a href="http://code.google.com/apis/o3d/docs/reference/classo3d_1_1_client.html#49f18f81e6184cbeeeb87306f0cf59ca">error texture (via Client.SetErrorTexture)</a> when you fail to bind a sampler.  You can group objects via <a href="http://code.google.com/apis/o3d/docs/reference/classo3d_1_1_pack.html">Pack</a> objects for easier management and <a href="http://code.google.com/apis/o3d/docs/reference/classo3d_1_1_archive_request.html">stream things from archives</a>, too. There are <a href="http://code.google.com/apis/o3d/docs/reference/jsdocs/js_1_0_o3djs.debug_ref.html">debugging aids</a> and libraries for <a href="http://code.google.com/apis/o3d/docs/reference/jsdocs/js_1_0_o3djs.math_ref.html">math</a> and <a href="http://code.google.com/apis/o3d/docs/reference/jsdocs/js_1_0_o3djs.quaternions_ref.html">quaternions</a>.</p>
<p>You should check out the <a href="http://code.google.com/apis/o3d/docs/samplesdirectory.html#demos">samples</a>. There&#8217;s a lot of impressive stuff. There&#8217;s the <a href="http://o3d.googlecode.com/svn/trunk/samples/beachdemo/beachdemo.html">beach demo</a> in the video at the top of this post, but they also do some cool stuff with <a href="http://o3d.googlecode.com/svn/trunk/samples/animated-scene.html">animation</a>, <a href="http://o3d.googlecode.com/svn/trunk/samples/hud-2d-overlay.html">HUDs</a>, <a href="http://o3d.googlecode.com/svn/trunk/samples/canvas-fonts.html">text rendering</a>, <a href="http://o3d.googlecode.com/svn/trunk/samples/picking.html">picking</a>, and <a href="http://o3d.googlecode.com/svn/trunk/samples/stencil_example.html">stenciled teapots</a>. And everything is done in JavaScript right in the web page. Even the shaders are embedded in &lt;script&gt; tags!</p>
<p><b>O3D is a great piece of technology</b>, and I hope it thrives. I&#8217;m excited to see what people build on this (and I&#8217;ve got a few ideas myself <img src='http://coderhump.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://coderhump.com/archives/427/feed</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>Tweaking your game with Google Spreadsheets</title>
		<link>http://coderhump.com/archives/385</link>
		<comments>http://coderhump.com/archives/385#comments</comments>
		<pubDate>Sun, 01 Feb 2009 07:42:04 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Cool Stuff]]></category>
		<category><![CDATA[How To]]></category>
		<category><![CDATA[PushButton Engine]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[spreadsheets]]></category>
		<category><![CDATA[tweak]]></category>

		<guid isPermaLink="false">http://coderhump.com/?p=385</guid>
		<description><![CDATA[ Our latest game, Grunts: Skirmish, has 200 tweakable parameters. There are 9 player units with three levels of upgrade, and another 9 enemy units. Each unit has between three and ten parameters that can be altered.
We tried a few approaches &#8211; hand-editing a large XML file (but it was too large and spread out) [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://coderhump.com/wp-content/uploads/2009/02/tweaksheet.png" alt="tweaksheet" title="tweaksheet" width="300" height="270" class="alignright size-full wp-image-386" /> Our latest game, <a href="http://makeitbigingames.com/2009/01/woohoo-grunts-skirmish-has-a-logo/">Grunts: Skirmish</a>, has <b>200 tweakable parameters</b>. There are 9 player units with three levels of upgrade, and another 9 enemy units. Each unit has between three and ten parameters that can be altered.</p>
<p>We tried a few approaches &#8211; <b>hand-editing a large XML file</b> (but it was too large and spread out) and an in-game <b>tweaking UI</b> (but it was too much work to get the UI to be friendly to use). The old standby of having <a href="http://makeitbigingames.com/">the designer</a> and <a href="http://subreal.net/">artist</a> <b>file bug reports</b> to have <a href="http://coderhump.com/">the programmer</a> update the game wasn&#8217;t getting us very far, either.</p>
<p>&#8220;Well,&#8221; says I, &#8220;We&#8217;re some sort of Web 2.0 startup, right? And we&#8217;re developing a Flash game aren&#8217;t we? And Flash can talk to websites, can&#8217;t it? And don&#8217;t we use Google Docs for everything?&#8221;</p>
<p>It turns out there is an <a href="http://code.google.com/apis/spreadsheets/docs/2.0/reference.html#CellFeed">XML feed from public Google spreadsheets</a>. And ActionScript 3 supports <a href="http://en.wikipedia.org/wiki/E4X">E4X</a>, so you can directly manipulate XML without any extra work. <b>Now we tweak our game using a shared spreadsheet up on Google Docs.</b></p>
<p>I wrote a parser for their format:</p>
<pre><code>// Extract the entries. It's namespaced, so deal with that.
var xmlns:Namespace = new Namespace("xmlns", "http://www.w3.org/2005/Atom");
tweakXML.addNamespace(xmlns);

// Parse into a dictionary.
var cellDictionary:Dictionary = new Dictionary();
for each(var entryXML:XML in tweakXML.xmlns::entry)
{
   cellDictionary[entryXML.xmlns::title.toString()] = entryXML.xmlns::content.toString();
}</code></pre>
<p>And wrote a quick component that would fetch the spreadsheet feed, parse it, and stuff it into the right places on named objects or template data. Now I have a little entry in our level file that looks like:</p>
<pre><code>&lt;object id="googleTweaker"&gt;
   &lt;component class="com.pblabs.debug.GoogleSpreadsheetTweaker"&gt;
     &lt;SpreadsheetUrl&gt;http://spreadsheets.google.com/feeds/cells/0d8somekey848x/od6/public/basic&lt;/SpreadsheetUrl&gt;
     &lt;Config&gt;
        &lt;!--  Grunt Level 1 tweaks --&gt;
        &lt;_&gt;&lt;Cell&gt;B3&lt;/Cell&gt;&lt;Property&gt;#TheGruntProxy.creator.WarPointCost&lt;/Property&gt;&lt;/_&gt;
        &lt;_&gt;&lt;Cell&gt;C3&lt;/Cell&gt;&lt;Property&gt;!Grunt.health.mMaxHealth&lt;/Property&gt;&lt;/_&gt;
        &lt;_&gt;&lt;Cell&gt;D3&lt;/Cell&gt;&lt;Property&gt;!Grunt.ai.AttackSearchRadius&lt;/Property&gt;&lt;/_&gt;
     &lt;/Config&gt;
  &lt;/component&gt;
&lt;/object&gt;</code></pre>
<p>Each line maps a cell in the spreadsheet to a property on a template or active game object. Some properties have to be set several places, which the system deals with automatically.</p>
<p>The biggest wrinkle was Google&#8217;s crossdomain.xml policy. Basically they do not allow random Flash apps to access their site. So I had to write a small proxy script, which sits on our development server next to the game and fetches the data for it. Figuring out I had to do this took more time than any other step.</p>
<p>The main difference between the snippet and the full code is the version in our repository is 220 lines long. I only have around 150 of the full set of 200 parameters hooked up, but after a hard afternoon&#8217;s work, the process for tweaking the game has become:</p>
<ol>
<li>Open Google Docs.</li>
<li>Edit a clearly labeled value &#8211; like level 1 grunt health.</li>
<li>Restart the game, which is running in another tab in your browser.</li>
</ol>
<p><b>This takes you about a minute between trials.</b> Not too bad. Before this, the process was:</p>
<ol>
<li>Get the game source from SVN.</li>
<li>Find the right XML file &#8211; there are several.</li>
<li>Find the right section in the XML &#8211; altogether we have 200kb of the stuff for Grunts!</li>
<li>Change the value.</li>
<li>Commit the change.</li>
<li>Wait 5-15 minutes for the build system to refresh the live version of the game.</li>
</ol>
<p><b>Ten minutes per tweak is not a good way to develop.</b></p>
<p>I&#8217;ve heard about developers using Excel spreadsheets for tweaking, but can&#8217;t find anything about using Google Docs to do it. <b>But Google Spreadsheet is obviously a better choice</b>. It has built-in revision tracking. You can edit it simultaneously with someone else. You can access live data in XML either publicly (like we did) or privately via their authentication API. It&#8217;s absolutely worth the half-day of your time it will take to add Google Spreadsheet-based tweaking to your game &#8211; even if it&#8217;s a non-Flash game, downloading and parsing XML is pretty easy with the right libraries.</p>
<p>I strongly suspect this feature will find its way into the next beta of the <a href="http://www.pushbuttonengine.com/">PushButton Engine</a>. Which, by the way, you should sign up for if you are interested in developing Flash games. <b>We&#8217;re bringing people in from the signup form starting this week.</b> If you want more information, or just like looking at cool websites, click below to check out the new version of the PBEngine site, which has a bunch of information on the tech. <a href="http://subreal.net/">Tim</a> did an awesome job on the site design.</p>
<p><a href="http://pushbuttonengine.com/"><img src="http://coderhump.com/wp-content/uploads/2009/02/betashot.png" alt="betashot" title="betashot" width="565" height="217" class="aligncenter size-full wp-image-400" /></a></p>
<p><b>Edit:</b> Patrick over on the GG forums asked about the proxy script. It&#8217;s actually ludicrously simple. Not very secure either so I wouldn&#8217;t recommend deploying it on a public server. I got my script from a post on <a href="http://www.adenforshaw.co.uk/?p=4">Aden Forshaw&#8217;s blog</a>. In the real world you would want to have some security token to limit access to your proxy script&#8230; but since this is for tweaking a game that is in development I didn&#8217;t sweat it.</p>
]]></content:encoded>
			<wfw:commentRss>http://coderhump.com/archives/385/feed</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>Potpourri &#8211; Jul 22, 2009</title>
		<link>http://coderhump.com/archives/371</link>
		<comments>http://coderhump.com/archives/371#comments</comments>
		<pubDate>Fri, 23 Jan 2009 01:19:05 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Cool Stuff]]></category>

		<guid isPermaLink="false">http://coderhump.com/?p=371</guid>
		<description><![CDATA[A buddy of mine from GarageGames days, Orion Elenzil, posted some notes on how to get started with the free Flex SDK. Take a peek to see just how simple it can be to get started with Flex.

for those who may come across this post on their search to learning how to set up a [...]]]></description>
			<content:encoded><![CDATA[<p>A buddy of mine from <a href="http://www.garagegames.com/">GarageGames</a> days, <a href="http://elenzil.com/">Orion Elenzil</a>, posted some notes on <a href="http://elenzil.com/flash/flash_1/"><b>how to get started with the free Flex SDK</b></a>. Take a peek to see just how simple it can be to get started with Flex.</p>
<blockquote><p>
for those who may come across this post on their search to learning how to set up a command-line-only Flex environment, and who also know previously zilch about Flex/AS/Flash, i sketch the steps very roughly here: <a href="http://elenzil.com/flash/flash_1/">http://elenzil.com/flash/flash_1</a></p>
<p align="right">&#8211; Orion</p>
</blockquote>
<p><b>If you&#8217;re into Flash coding</b>, you should also read <a href="http://calypso88.com/">Rob Sampson&#8217;s</a> post on <a href="http://www.calypso88.com/?p=174">AS3 Math Optimization – int is the new floor()</a>. Rob&#8217;s been doing ActionScript a lot longer than I have, and I love the historical perspective he can provide. You can tell he&#8217;s a graphic designer &#8211; his performance charts look awesome.</p>
<p><b>I have to quote this from Jeff Tunnell&#8217;s blog, <a href="http://makeitbigingames.com/">Make It Big In Games</a>:</b></p>
<blockquote><p>
I stumbled across this YouTube video of Gary Vaynerchuck of Wine Library TV giving a presentation at Web 2.0 Expo. At first I just thought the guy was a dick, and he even calls himself that at one point in the presentation, but it turned out to be a fascinating 15 minutes of video. Gary essentially says what I have been saying, i.e. make sure you love what you do, work hard, and things will work out, but he says it in a much more succinct, hard edged way than I do.</p></blockquote>
<p><a href="http://makeitbigingames.com/2009/01/motivation/">Check out the video here.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://coderhump.com/archives/371/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blast From The Past: Blitz3D Models in Torque</title>
		<link>http://coderhump.com/archives/301</link>
		<comments>http://coderhump.com/archives/301#comments</comments>
		<pubDate>Fri, 19 Dec 2008 06:30:36 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Cool Stuff]]></category>
		<category><![CDATA[History]]></category>
		<category><![CDATA[blitz3d]]></category>
		<category><![CDATA[nostalgia]]></category>
		<category><![CDATA[screenshots]]></category>
		<category><![CDATA[torque]]></category>

		<guid isPermaLink="false">http://coderhump.com/?p=301</guid>
		<description><![CDATA[I found some old screenshots on a backup, and uploaded them to my Flickr account.

As I was filing them away, I looked back in my .plans at GarageGames and realized that I had never talked about it publicly. At least, the site search didn&#8217;t turn anything up. Well, I think it&#8217;s probably safe to do [...]]]></description>
			<content:encoded><![CDATA[<p>I found some old screenshots on a backup, and uploaded them to my Flickr account.</p>
<p><center><a href="http://flickr.com/photos/bengarney/sets/72157611336463611/"><img src="http://farm4.static.flickr.com/3286/3119954950_7d126465dc.jpg?v=0"></a></center></p>
<p>As I was filing them away, I looked back in my .plans at GarageGames and realized that I had never talked about it publicly. At least, the site search didn&#8217;t turn anything up. Well, I think it&#8217;s probably safe to do so now. <img src='http://coderhump.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Way back in April of 2005, I wrote a Blitz3D loader in Torque for <a href="http://www.garagegames.com/my/home/view.profile.php?qid=5605">Adrian Tysoe</a>. It loaded Blitz3D files, with all their texture and material data, and it did polysoup collision, as well.  This was several years before I released the <a href="http://www.garagegames.com/blogs/8863/13709">OPCODE-based poly soup</a> resource, which I think is now (in some form) in the official Torque codebase.</p>
<p><center><a href="http://flickr.com/photos/bengarney/sets/72157611336463611/"><img src="http://coderhump.com/wp-content/uploads/2008/12/blitzmontage.png" alt="Montage from Blitz3D Loader Work" title="Montage from Blitz3D Loader Work" width="474" height="319" class="size-full wp-image-302" /></a></center></p>
<p>I love seeing how graphics code comes together, so I thought I would share this with the world &#8211; you might like clicking through the images and seeing how each step changed things. By far the biggest pain point was parsing the (sometimes obtuse) <a href="http://www.blitzbasic.com/sdkspecs/sdkspecs.php">Bitz3D format</a>. The format might be a pain, but in the hands of a good artist like Adrian, it gave really solid results. This was all before shaders were mainstream, of course, but still &#8211; the sand had a nice specular highlight, there was lots of clever texture layering, and the whole thing was pretty fast to render.</p>
<p><b>The more interesting aspect to doing the B3D loader was the prevailing opinion in the Torque community at the time that loading a non-DIF/DTS format was impossible &#8211; as was deviating from the collision models those formats used (convex polyhedra mostly).</b> I&#8217;m not quite sure where they got this idea, but it was awfully frustrating at times to see people beat their brains out on those formats when there might be better options for their specific situation.</p>
<p>Partially, I did this project to prove to myself that I wasn&#8217;t just bullshitting people when I said that writing a loader/renderer was easy (certainly easier than canceling your project because another format wasn&#8217;t working for you!). It took me a month or so of part time hacking to get it all together. It didn&#8217;t animate, but it was just for environments &#8211; DTS is actually an awesome format for characters, and the 3Space runtime is very tight, one of the best parts of Torque in terms of features. (Aside: I hope they get a good Collada-&gt;DTS converter as the main pipeline sometime soon!)</p>
<p>Two years passed before anyone put polysoup in without rewriting the rest of the engine to use some other physics SDK. Actually, I ended up being the one to integrate polysoup with DTS. :-/ <b>I was surprised no one else beat me to it!</b> I brute-forced it &#8211; every triangle as its own convex. Torque ran this approach like a champ as long as you didn&#8217;t feed it tiny triangles. Did the same trick again when it came time to write Atlas1 collision a few months later, but that wasn&#8217;t really &#8220;polysoup&#8221; in a meaningful way for anyone since it only imported heightfields.</p>
<p>It&#8217;s interesting to me that the current Torque maintainer (and all around good guy) <a href="http://www.garagegames.com/my/home/view.profile.php?qid=985">Matt Fairfax</a> wrote loaders for <a href="http://www.garagegames.com/index.php?sec=mg&#038;mod=resource&#038;page=view&#038;qid=5265">.3DS, Quake3,</a> and Unreal formats, and the maintainers that came before me (Rick Overman, Mark Frohnmayer, and Tim Gift) have also done things of this nature (in fact, they are at least partially responsible for DIF and DTS). I guess you don&#8217;t get to hold the reigns of TGE unless you&#8217;ve written a couple 3d renderers/loaders. </p>
<p>I think in total I&#8217;ve done 4 loaders with renderers &#8211; Blitz3D, Chunked LOD (for Atlas 1), Atlas2, and OBJ. Really, OBJ doesn&#8217;t count. Every graphics programmer in the universe has hacked up a OBJ loader &#8211; from Carmack on down.</p>
<p>In conclusion? I guess there are a few morals to draw from this nostalgia-inspired post:</p>
<ul>
<li><b>Keep shots from your old projects.</b> It&#8217;s fun to reminisce! I have <a href="http://www.flickr.com/photos/bengarney/sets/451556/">a few hundred shots from Atlas development</a> that might be fun to write about some day&#8230;
<li><b>Don&#8217;t be afraid to buck common knowledge</b> and go out in a technical direction no one thinks is feasible. Try it small and if it works, keep going.
<li><b>Do projects for fun!</b> Good stuff will always find an opportunity for reuse &#8211; be it some code, or a technique, or even a fresh perspective. The ideas and techniques I came up with for this project ended up helping me for years to come. Working with Blitz3D&#8217;s format helped me see Torque&#8217;s approaches in a fresh light.
</ul>
<p><center><img src="http://coderhump.com/wp-content/uploads/2008/12/the_more_you_know2-300x197.jpg" alt="the_more_you_know2" title="the_more_you_know2" width="300" height="197" class="alignnone size-medium wp-image-309" /></center></p>
<p><i>Edit:</i> Adrian Tysoe posted on GarageGames about his side of this experience &#8211; here&#8217;s what he had to say:</p>
<blockquote><p>
<i>
<p>Heh, I remember working on this with you. I figured they were the starting point for some of the later torque advancements. Just wish that the DTS had been updated to support more than 1UV. Was pretty fun to work with and performance was decent. </p>
<p>The worst part was trying to match invisible torque terrain collisions to .b3d meshes just to get the nice water blending around the edges. The terrain used the coldet collision for the actual character and weapons etc. </p>
<p>Was pretty neat and I enjoyed having 2UV&#8217;s to playwith so I could bake my own lightmaps in 3dsmax of gile[s], in many ways the most useful thing to make TGE rendering look a bit nicer.</p>
<p>Here&#8217;s a couple more pics the project Jeremy and I started using it.</p>
<p></i></p>
<p><center><img src="http://coderhump.com/wp-content/uploads/2008/12/oust-3a.jpg" alt="oust-3a" title="oust-3a" width="320" height="240" class="alignnone size-full wp-image-319" /></p>
<p><img src="http://coderhump.com/wp-content/uploads/2008/12/oust-7a.jpg" alt="oust-7a" title="oust-7a" width="320" height="240" class="alignnone size-full wp-image-319" /></center></p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://coderhump.com/archives/301/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Blockland Physics</title>
		<link>http://coderhump.com/archives/275</link>
		<comments>http://coderhump.com/archives/275#comments</comments>
		<pubDate>Thu, 04 Dec 2008 07:12:45 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Cool Stuff]]></category>
		<category><![CDATA[Publication]]></category>

		<guid isPermaLink="false">http://coderhump.com/?p=275</guid>
		<description><![CDATA[
I spent some of my downtime over the past few months working on client-side brick physics for Blockland. The feature has finally been announced, so I can talk about it. The video shows off most of the features; the main one that isn&#8217;t shown is the interaction between players/vehicles and bricks; they will push bricks [...]]]></description>
			<content:encoded><![CDATA[<p><center><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/goxXAPBUGgs&#038;hl=en&#038;ap=%2526fmt%3D22&#038;fs=1&#038;rel=0&#038;color1=0x2b405b&#038;color2=0x6b8ab6"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/goxXAPBUGgs&#038;ap=%2526fmt%3D22&#038;hl=en&#038;fs=1&#038;rel=0&#038;color1=0x2b405b&#038;color2=0x6b8ab6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></center></p>
<p>I spent some of my downtime over the past few months working on client-side brick physics for <a href="http://blockland.us/">Blockland</a>. The feature has finally been announced, so I can talk about it. The video shows off most of the features; the main one that isn&#8217;t shown is the interaction between players/vehicles and bricks; they will push bricks around but aren&#8217;t affected themselves. Watch it in full screen, it&#8217;s full 720p HD video.</p>
<p>There were two big problems related to doing physics for Blockland. The first was the scale of the problem &#8211; there can be well over 100,000 bricks in a single server, which is beyond the capabilities of most physics SDKs to simulate as discrete objects. I started with <a href="http://www.nvidia.com/object/nvidia_physx.html">PhysX</a>, and moved to <a href="http://www.bulletphysics.com/">Bullet</a> after realizing that the PhysX runtime is 80mb, far more than could be included in the Blockland download (which weighs in at 20 mb). Both of these libraries broke in different ways with large numbers of objects.</p>
<p>At first, I implemented a management system for brick proxies, so that it kept them under the hard limit in the SDK (around 2**16). PhysX accepted this, but Bullet&#8217;s broadphase has some stuff that&#8217;s O(# objects) or worse, so it fell down. Eventually, I moved everything into the same system used for static world geometry, which was a grid of static meshes. It turns out that Bullet is a bit faster at creating these mesh objects than PhysX was.</p>
<p>The static mesh cache took quite a bit work to get solid. Because the simulation is for aesthetic purposes, it can tolerate a fair amount of &#8220;fudge,&#8221; which I take full advantage of. Nearly every kind of update is timesliced so that only a little bit is done each tick. This keeps things smooth, even at the cost of the physical state being inconsistent for a tick or two. Most updates are lazy, as well, only done if a dynamically moving brick, player, or vehicle comes into the area.</p>
<p>The other problem is the wide variability of Blockland user&#8217;s computers and usage patterns. Not every user has enough CPU to run physics. And every user has the potential to build something that is very resource intensive to simulate. I spent a lot of time implementing a &#8220;physics diaper&#8221; &#8211; logic to detect when physics calculations were taking too much time, and scaling back the simulation until it&#8217;s fast again. This takes two forms. First, if physics ticks are too slow, the simulation is decimated &#8211; every other brick on the list of moving bricks is converted to a lighter weight parametric simulation that doesn&#8217;t consider collisions. If they remain too slow, then eventually the physics simulation is disabled entirely, until the user turns it back on. This can help with very complex builds or very slow computers.</p>
<p>Thanks to good physics middleware (I include both PhysX and Bullet under the &#8220;good&#8221; category, even though PhysX is a little on the bloated side), I was able to solve a pretty tough problem &#8211; simulating motion for hundreds of thousands of bricks on commodity hardware &#8211; in short order. And I have to thank my friend <a href="http://badspot.us/">Eric</a> for making such an awesome sandbox and letting me play in it. <img src='http://coderhump.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://coderhump.com/archives/275/feed</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>Another Flash MMO Talk</title>
		<link>http://coderhump.com/archives/253</link>
		<comments>http://coderhump.com/archives/253#comments</comments>
		<pubDate>Thu, 30 Oct 2008 21:35:22 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Cool Stuff]]></category>

		<guid isPermaLink="false">http://coderhump.com/?p=253</guid>
		<description><![CDATA[Via Ted On Flex, a talk on &#8220;Creating an MMO w/ Flex 3 in 59 Min&#8221; by Samuel Asher Rivello. This should be of interest for anyone who attended Raphael Cedeno and I&#8217;s talk on Unlocking Flash To Build The Next Great MMO. Definitely worth a watch.

]]></description>
			<content:encoded><![CDATA[<p>Via <a href="http://onflash.org/ted/2008/10/360flex-sj-2008-creating-mmo-w-flex-3.php">Ted On Flex</a>, a talk on &#8220;Creating an MMO w/ Flex 3 in 59 Min&#8221; by Samuel Asher Rivello. This should be of interest for anyone who attended Raphael Cedeno and I&#8217;s talk on <a href="http://coderhump.com/austingdc08/">Unlocking Flash To Build The Next Great MMO</a>. Definitely worth a watch.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="486" height="412" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="name" value="flashObj" /><param name="bgcolor" value="#FFFFFF" /><param name="flashvars" value="videoId=1738803376&amp;playerId=1596744118&amp;viewerSecureGatewayURL=https://console.brightcove.com/services/amfgateway&amp;servicesURL=http://services.brightcove.com/services&amp;cdnURL=http://admin.brightcove.com&amp;domain=embed&amp;autoStart=false&amp;" /><param name="src" value="http://services.brightcove.com/services/viewer/federated_f8/1596744118" /><embed type="application/x-shockwave-flash" width="486" height="412" src="http://services.brightcove.com/services/viewer/federated_f8/1596744118" flashvars="videoId=1738803376&amp;playerId=1596744118&amp;viewerSecureGatewayURL=https://console.brightcove.com/services/amfgateway&amp;servicesURL=http://services.brightcove.com/services&amp;cdnURL=http://admin.brightcove.com&amp;domain=embed&amp;autoStart=false&amp;" bgcolor="#FFFFFF" name="flashObj"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://coderhump.com/archives/253/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Acquisition</title>
		<link>http://coderhump.com/archives/106</link>
		<comments>http://coderhump.com/archives/106#comments</comments>
		<pubDate>Tue, 09 Oct 2007 22:13:19 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Cool Stuff]]></category>

		<guid isPermaLink="false">http://coderhump.com/?p=106</guid>
		<description><![CDATA[Jeff Tunnell, one of the GG founders, wrote a cool post on the IAC acquisition of GarageGames&#8230; Check it out at Make It Big In Games.
]]></description>
			<content:encoded><![CDATA[<p>Jeff Tunnell, one of the GG founders, wrote a cool post on the IAC acquisition of GarageGames&#8230; Check it out at <a href="http://makeitbigingames.com/blog/?p=47">Make It Big In Games</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://coderhump.com/archives/106/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Debugging Tamarin</title>
		<link>http://coderhump.com/archives/104</link>
		<comments>http://coderhump.com/archives/104#comments</comments>
		<pubDate>Sun, 23 Sep 2007 21:58:55 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Cool Stuff]]></category>

		<guid isPermaLink="false">http://coderhump.com/?p=104</guid>
		<description><![CDATA[I&#8217;m getting my feet wet in Tamarin, the open-source ActionScript 3 runtime from Adobe &#8211; same code that&#8217;s in Flash 9. It&#8217;s cool tech, and I&#8217;m ecstatic that they had the cajones to bring it out into the world &#8211; where it&#8217;ll definitely make the world a better place.
This gets kind of technical so I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m getting my feet wet in <a href="http://www.mozilla.org/projects/tamarin/">Tamarin</a>, the open-source ActionScript 3 runtime from Adobe &#8211; same code that&#8217;s in Flash 9. It&#8217;s cool tech, and I&#8217;m ecstatic that they had the cajones to bring it out into the world &#8211; where it&#8217;ll definitely make the world a better place.</p>
<p>This gets kind of technical so I&#8217;ve hidden most of it behind the jump.</p>
<p><span id="more-104"></span></p>
<p><b>C++ And AS3 Compilation</b></p>
<p>So where am I? First step was to build the runtime, which was easy &#8211; compiles right out of the repo. Then I realized I couldn&#8217;t compile. That stalled me for a few months. Once we started working on the current project at work &#8211; which is in Flash 9 &#8211; it was a lot easier to figure out the compiler part. <a href="http://www.adobe.com/products/flex/sdk/">Flex 2 SDK</a> for the win! It&#8217;s free, you see.</p>
<p>The relevant command to compile a .as file is:</p>
<blockquote><p>java -jar <i>SDK_PATH</i>\lib\asc.jar myTest.as</p></blockquote>
<p>Then you can run it with the binary you compiled earlier &#8211; just do:</p>
<blockquote><p>avmplus_d.exe myTest.abc</p></blockquote>
<p>(Paths are a little trickier than this in reality due to where the compiler sticks things, and if you did a release build the binary name might be different.)</p>
<p><b>Native Binding</b></p>
<p>The next thing I attempted was adding my own class. I&#8217;ll be cleaning up the code for this and posting it a little later &#8211; right now it&#8217;s sitting in AvmCore.cpp which is definitely not a good way to do it! But I will talk about the native-function-binding process, which is pretty slick.</p>
<p>Basically, there are two parts. First, some #defines that go in your C++ code and define some tables. They look like this:</p>
<blockquote>
<pre>BEGIN_NATIVE_MAP(TestClass)
   NATIVE_METHOD(TestClass_helloWorld, TestObject::helloWorld)
END_NATIVE_MAP()

BEGIN_NATIVE_CLASSES(AvmCore)
   NATIVE_CLASS(abcclass_TestClass, TestClass, TestObject)
END_NATIVE_CLASSES()</pre>
</blockquote>
<p>This matches up with some ActionScript code that looks like this:</p>
<blockquote><pre>package
{
   public final class TestClass extends Object
   {
      public native function helloWorld():void
   }
}</pre>
</blockquote>
<p>Now the weird thing here is that the C++ side references these magic files (see core/builtin.h and core/builtin.cpp for examples). builtin.h contains lines that look like this:</p>
<blockquote><pre>const int TestClass_helloWorld = 557;
const int abcclass_TestClass = 17;
extern const unsigned char builtin_abc_data[];</pre>
</blockquote>
<p>builtin.cpp is just a big array of bytes defining builtin_abc_data[] &#8211; AS3 bytecode, as it happens. Not too surprisingly, this code is one of the first thing the VM executes when it starts up. Where does it come from? What&#8217;s in it?</p>
<p><b>native keyword and ASC</b></p>
<p>There&#8217;s a file in core called builtin.as that references other .as files in the same directory, and in that is defined a bunch of stuff related to the core built-in classes like Function and Object and Boolean. Some of the methods are native and body-less &#8211; and sure enough there&#8217;s corresponding C++ code in the AVM &#8211; and others are populated with script code. (I assume that you have to have matching AS3 and C++ side functions or face all kinds of nasty bugs, but haven&#8217;t tested this yet.)</p>
<p>However &#8211; there&#8217;s no obvious way that the script code is mapped to C++ code except for these IDs defined in the builtin header file. Where do they come from? What tool made these files? They have all the marks of being machine generated &#8211; they&#8217;d have to be since there&#8217;s no way to manually specify a &#8220;native ID&#8221; for a method.</p>
<p>After some digging, I discovered the key to all this. It&#8217;s the AS3 compiler! If you compile a .as file with a native function in it, it automatically generates the C++ code to embed it in the AVM. That&#8217;s where all those weird constants come from.</p>
<p><b>Exception 0&#215;80000001</b></p>
<p>So &#8211; I made a test class, regenerated the builtin scripts, and bound my own native functions. Neat! So I ran my test script to see if it would trigger the debugger (I set a breakpoint in my class implementation). And it did &#8211; but not in my code. Specifically, I got this weird exception:</p>
<blockquote><p>First-chance exception at 0&#215;00459272 in avmplus_d.exe: 0&#215;80000001: Not Implemented.</p></blockquote>
<p>Well, what the heck is that all about? It turns out that the JIT code generator, which produces machine code versions of your AS3 code, reserves a bunch of memory from the OS to build executable code in. On windows in particular, as part of the memory setup, it does it with a call to VirtualAlloc that looks like this:</p>
<blockquote><pre>void *res = VirtualAlloc(address,
o GCHeap::kNativePageSize,
o MEM_COMMIT,
o PAGE_GUARD | PAGE_READWRITE);</pre>
</blockquote>
<p>(This is in GCHeapWin.cpp line 317 or so.)</p>
<p>It turns out that PAGE_GUARD makes the first access to the specified page trigger an error. <a href="http://msdn2.microsoft.com/en-us/library/aa366549.aspx">MSDN has more to say on the subject of guard pages.</a> I haven&#8217;t fully traced this code yet but it appears that it&#8217;s part of a scheme to dynamically grow a buffer as the MSDN article implies. In any case, it&#8217;s not actually an error &#8211; just a side-effect of normal operation. This can be confirmed by running the AVM outside of a debugger &#8211; it functions correctly &#8211; and by continuing execution after the breakpoint is hit.</p>
<p>The details of how to suppress this error are different for every IDE, but in VC7, you go to Debug-&gt;Exceptions&#8230;,  select Win32 Exceptions, then hit Add&#8230; &#8211; for number input 0&#215;80000001, and description can be whatever you like. I&#8217;d recommend &#8220;page guard&#8221; or something like that. Then make sure that a breakpoint isn&#8217;t triggered by selecting it in the list and choosing &#8220;continue&#8221; from the options at the bottom.</p>
<p><b>Conclusion</b></p>
<p>Things we know how to do:</p>
<ul>
<li>Compile AS3 to ABC and update the builtins in the AVM.
</li>
<li>Compile the AVM from C++ source.
</li>
<li>Bind our own native C++ code to the AVM.
</li>
<li>Debug the AVM w/o extra exceptions causing problems under VC7. (The same steps should apply to VC8 as well.)
</li>
</ul>
<p>AVM is pretty cool. I look forward to working with it more. <img src='http://coderhump.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://coderhump.com/archives/104/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>
