<?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>#AltDevBlogADay &#187; Mike Acton</title>
	<atom:link href="http://www.altdevblogaday.com/author/mike-acton/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.altdevblogaday.com</link>
	<description>Each day a little more #gamedev love</description>
	<lastBuildDate>Thu, 17 May 2012 03:06:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>#AltDevPanel April Update #1</title>
		<link>http://www.altdevblogaday.com/2012/04/19/altdevpanel-april-update-1/</link>
		<comments>http://www.altdevblogaday.com/2012/04/19/altdevpanel-april-update-1/#comments</comments>
		<pubDate>Thu, 19 Apr 2012 06:49:49 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
				<category><![CDATA[#AltDev Updates]]></category>

		<guid isPermaLink="false">http://www.altdevblogaday.com/?p=25608</guid>
		<description><![CDATA[<p>Two recent #AltDevPanel discussions:</p>
<h2>Why is the #ME3 ending like Javascript in the browser?</h2>
<p>With <a href="http://twitter.com/ArchAzrael">@ArchAzrael</a> and <a href="http://twitter.com/mike_acton">@mike_acton</a><br />
Check out what <a href="http://www.doublecluepon.com/">Double Cluepon</a> is doing. I&#8217;m a big fan of their open development model.<br />
<span style="text-align:center; display: block;"><a href="http://www.altdevblogaday.com/2012/04/19/altdevpanel-april-update-1/"><img src="http://img.youtube.com/vi/YQgbaEpsCbY/2.jpg" alt="" /></a></span></p>
<p><a href="http://www.altdevblogaday.com/2012/04/19/altdevpanel-april-update-1/" class="more-link">Read more on #AltDevPanel April Update #1&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Two recent #AltDevPanel discussions:</p>
<h2>Why is the #ME3 ending like Javascript in the browser?</h2>
<p>With <a href="http://twitter.com/ArchAzrael">@ArchAzrael</a> and <a href="http://twitter.com/mike_acton">@mike_acton</a><br />
Check out what <a href="http://www.doublecluepon.com/">Double Cluepon</a> is doing. I&#8217;m a big fan of their open development model. </p>
<p><iframe width="500" height="281" src="http://www.youtube.com/embed/YQgbaEpsCbY?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<h2>Game tools</h2>
<p>With <a href="http://twitter.com/gorlak">@gorlak</a>, <a href="http://twitter.com/fuzzybinary">@fuzzybinary</a> and <a href="http://twitter.com/mike_acton">@mike_acton</a><br />
Make sure to join up with the IGDA Tools SIG (#toolsmiths) if you&#8217;re interested in a community of tools developers. And check out <a href="http://thetoolsmiths.org/">The Toolsmiths blog</a></p>
<p><iframe width="500" height="281" src="http://www.youtube.com/embed/EhZVirydTMA?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2012/04/19/altdevpanel-april-update-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wed Mar 7, San Francisco #AltDevSummit</title>
		<link>http://www.altdevblogaday.com/2012/03/03/wed-mar-6-san-francisco-altdevsummit/</link>
		<comments>http://www.altdevblogaday.com/2012/03/03/wed-mar-6-san-francisco-altdevsummit/#comments</comments>
		<pubDate>Sat, 03 Mar 2012 22:21:21 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
				<category><![CDATA[#AltDev Updates]]></category>

		<guid isPermaLink="false">http://altdevblogaday.com/?p=24794</guid>
		<description><![CDATA[<p>I&#8217;m pleased to announce the #AltDevSummit on Mar 7 in San Francisco.<br />
Location: <a href="http://www.sirfrancisdrake.com/location">Sir Francis Drake Hotel (450 Powell Street)</a><br />
RSVP: macton@gmail.com (But drop-ins are welcome, if there is space available.)</p>
<p><a href="http://www.altdevblogaday.com/2012/03/03/wed-mar-6-san-francisco-altdevsummit/" class="more-link">Read more on Wed Mar 7, San Francisco #AltDevSummit&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m pleased to announce the #AltDevSummit on Mar 7 in San Francisco.<br />
Location: <a href="http://www.sirfrancisdrake.com/location">Sir Francis Drake Hotel (450 Powell Street)</a><br />
RSVP: macton@gmail.com (But drop-ins are welcome, if there is space available.)</p>
<p>I know that there&#8217;s a group of gamedevs, researchers and students who will be in San Francisco during the GDC timeframe but for one reason or another (including financial) aren&#8217;t able to attend the conference. #AltDevBlogADay will be hosting a free summit on Wednesday to give you another chance to meet other gamedevs and generally have some good discussion and a good time.</p>
<p>We&#8217;ll have a rough structure throughout the day, but I imagine that we will make ad hoc adjustments depending on the group and what would be the most interesting or fun for all of us.</p>
<table>
<tr>
<td style="width:8em;">10AM &#8211; 12AM</td>
<td>Portfolio/resume review, discussion and workshop</td>
</tr>
<tr>
<td>1PM &#8211; 3PM</td>
<td>Game prototyping jam, discussion and workshop</td>
</tr>
<tr>
<td>3PM &#8211; 5PM</td>
<td>Open group. We&#8217;ll continue portfolio reviews and game prototyping workshops as well as other mini-presentations in small groups.</td>
</tr>
<tr>
<td>5PM &#8211; 6PM</td>
<td>Closing. Discussion of day, future of games, other take-away topics.</td>
</tr>
</table>
<p>I would also like to thank <a href="http://www.game-connection.com/gameconn/">Game Connection</a> for sponsoring #AltDevSummit!</p>
<p>Mike.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2012/03/03/wed-mar-6-san-francisco-altdevsummit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Post 1024!</title>
		<link>http://www.altdevblogaday.com/2011/11/12/post-1024/</link>
		<comments>http://www.altdevblogaday.com/2011/11/12/post-1024/#comments</comments>
		<pubDate>Sat, 12 Nov 2011 01:49:48 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
				<category><![CDATA[#AltDev Updates]]></category>

		<guid isPermaLink="false">http://altdevblogaday.com/?p=19745</guid>
		<description><![CDATA[<p>This is (more or less) the 1,024th #AltDevBlogADay post. Special for it&#8217;s power-of-two-ness and the milestone it represents in our continued passion for sharing ideas as #gamedevs (and some non-game developers too!)</p>
<p><a href="http://www.altdevblogaday.com/2011/11/12/post-1024/" class="more-link">Read more on Post 1024!&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>This is (more or less) the 1,024th #AltDevBlogADay post. Special for it&#8217;s power-of-two-ness and the milestone it represents in our continued passion for sharing ideas as #gamedevs (and some non-game developers too!)</p>
<p>We started this experiment in January and so far it&#8217;s been an amazing experience for me personally, and I hope the rest of the #AltDevAuthors.</p>
<p>In this year, we&#8217;ve had to change servers TWICE (here&#8217;s hoping that we even outgrow our current heavy-weight server in the future!) and have tried a lot of different things: Starting with my favorite, posts that share <strong>stories</strong> about experiences and our place in the lifelong journey of #gamedev. But we&#8217;ve also had technical articles (of all disciplines), audio posts, video posts, at least one google hangout, one unconference as well as <a href="http://altdevblogaday.com/2011/10/10/altdevconf-a-conference-for-game-developers/">an online conference to come soon</a>!</p>
<p>A few of our guys will tell you why they joined (and why you should too!)</p>
<p>From Paul Evans:</p>
<p><iframe width="500" height="375" src="http://www.youtube.com/embed/a1n3jHjKwMo?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<p>From Jonathan Adamczewski:</p>
<p><iframe width="500" height="281" src="http://www.youtube.com/embed/RLXaRl37YrA?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<p>From Alex Darby:</p>
<p><iframe width="500" height="375" src="http://www.youtube.com/embed/c-wj5XWRSUI?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<p>You definitely need to check out the one from Jaymin Kessler:</p>
<p><iframe width="500" height="281" src="http://www.youtube.com/embed/6g7FxWhncRM?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<p>And a note from Don Olmstead:</p>
<blockquote><p>
“Imitation is the sincerest of flattery.” &#8211; Charles Caleb Colton</p>
<p>When working in an industry that is always advancing you need to be constantly learning. As an engineer I gravitate towards articles providing new insights in programming, and there are plenty of those here on #AltDevBlogADay. My favorite articles go a step further. After reading them I want to sit down at my computer and pound out my own implementation. The first #AltDev article to cause that reaction was James Podesta’s <a href="http://www.google.com/url?q=http%3A%2F%2Faltdevblogaday.com%2F2011%2F03%2F15%2Fdebugging-on-your-web-browser%2F&#038;sa=D&#038;sntz=1&#038;usg=AFQjCNFLYJhV0zSxTOuBUdVRP-qUTQl75Q">Debugging in Your Web Browser</a>.</p>
<p>In it he presents the potential benefit of his solution, citing multiple examples. He then goes and provides a reference implementation all the while discussing why certain design decisions were made, and noting how it could be expanded. From there a programmer reading it can take that information and start coding up a solution that meets their own needs.</p>
<p>Some other articles that have had me working out my own implementations in the first 1024 posts are Niklas Frykholm’s <a href="http://www.google.com/url?q=http%3A%2F%2Faltdevblogaday.com%2F2011%2F02%2F25%2Fmanaging-decoupling-part-3-c-duck-typing%2F&#038;sa=D&#038;sntz=1&#038;usg=AFQjCNHKYbG-4ojmSvZhlEJaQDb3sPP7Iw">C++ Duck Typing<a/>, Don Williamson’s epic <a href="http://www.google.com/url?q=http%3A%2F%2Faltdevblogaday.com%2F2011%2F09%2F25%2Freflection-in-c-part-1-introduction%2F&#038;sa=D&#038;sntz=1&#038;usg=AFQjCNGdCeKcZuX58B0OHUZg3-n777VsOA">Reflection in C++: Part 1</a>, and Stefan Reinalter’s <a href="http://www.google.com/url?q=http%3A%2F%2Faltdevblogaday.com%2F2011%2F10%2F27%2Fquasi-compile-time-string-hashing%2F&#038;sa=D&#038;sntz=1&#038;usg=AFQjCNG3z3u8HN562GYvsHZ-Qf2nrM33SA">Quasi compile-time string hashing</a>.
</p></blockquote>
<p>I hope you&#8217;ve enjoyed our first 1,024 posts. And I here&#8217;s hoping we&#8217;ll all reach the next power of two together! More good things to come.</p>
<p>Mike.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/11/12/post-1024/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>#GDC12 AltDevProposals</title>
		<link>http://www.altdevblogaday.com/2011/09/08/gdc12-altdevproposals/</link>
		<comments>http://www.altdevblogaday.com/2011/09/08/gdc12-altdevproposals/#comments</comments>
		<pubDate>Thu, 08 Sep 2011 03:48:15 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
				<category><![CDATA[#AltDev Updates]]></category>

		<guid isPermaLink="false">http://altdevblogaday.com/?p=15941</guid>
		<description><![CDATA[<p>We&#8217;re hoping that next year is going to be a good showing for #AltDevBlogADay authors at GDC12! I&#8217;ve started collecting up some of our submissions here. In the spirit of the site, please share your thoughts and give us feedback on how we can make those presentations that are accepted by the GDC committee really useful and interesting for you next year! </p>
<p><a href="http://www.altdevblogaday.com/2011/09/08/gdc12-altdevproposals/" class="more-link">Read more on #GDC12 AltDevProposals&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re hoping that next year is going to be a good showing for #AltDevBlogADay authors at GDC12! I&#8217;ve started collecting up some of our submissions here. In the spirit of the site, please share your thoughts and give us feedback on how we can make those presentations that are accepted by the GDC committee really useful and interesting for you next year! </p>
<p>I&#8217;m also going to leave a link to this post on the right panel and keep it live so we can keep the discussion open between now and then.</p>
<p>Mike.</p>
<h2>Creating Your Dreams &#8211; A Gentle Introduction to Experimental Hardware and the World It Opens</h2>
<p>Track: Programming (Design secondary as it&#8217;s about enabling new experiences)<br />
Format: 60 minute talk<br />
Speaker: <a href="http://altdevblogaday.com/author/richard-sim/">Richard Sim</a></p>
<p>Where and how we play games is rapidly changing. With new markets emerging and existing markets diversifying, new experiences are becoming available with each change. The Wii was hot in the past, mobile, tablet, and social games are hot today, and who knows what will be hot tomorrow. The electronics industry is undergoing similar transitions; with the bar for entry for what used to be sophisticated technology coming down so low that it’s now within the reach of casual experimentation thanks to the advent of open source hardware and what is often referred to as the Maker Movement.</p>
<p>This presentation will provide the audience with an overview of Android USB Accessories, the Arduino platform, what open source hardware is, and how they all come together to give developers new, unbounded power to define what tomorrows innovations will be. There’s nothing in the way of a regular developer coming up with the next Guitar Hero, AR Drone, or Ubisoft tablet.</p>
<p>I will not be focusing on electronics or hardware design per se, but how open hardware can be leveraged as building blocks that can be used to easily create new controllers, feedback and output devices, and other such peripherals, which can then be programmed in a similar fashion to what we’re used to on established platforms. It is these building blocks that have lowered the bar for entry so dramatically, and it’s all happened very fast.</p>
<p>Once the foundations have been covered, I will go into the details of creating a simple controller that will act as an Android USB Accessory. If time allows I will also cover changes required to create a Bluetooth accessory, which opens up the possibility to target both iPhone and Android devices.</p>
<p>To close I will take the audience’s imagination one step further and onto creating games that are played in the Real World(!). I will show how sensors, data logging, real-time feedback, and simple gameplay mechanics can be used to add a new dimension to existing sports. Why play SSX online when you can go down a double black-diamond with your friends and compete for the highest score in real life?</p>
<p>The take-away for the audience will be a spark to dive in and get started creating devices that nobody but themselves have ever imagined, to enable the gameplay experiences that have only ever existed in their dreams, with enough knowledge of the subject to know where to start and hopefully with all the excitement they need to get them on their way to a working prototype!</p>
<h2>Game Tools as a WebApp: Lessons from Insomniac&#8217;s Next-Gen Tools and Engine</h2>
<p>Track: Programming<br />
Format: 60 minute talk<br />
Speaker: <a href="http://altdevblogaday.com/author/mike-acton/">Mike Acton</a></p>
<p>Insomniac, like many developers, has traditionally treated development tools as a second-class development effort. While we have had dedicated Tools programmers for many years, very little effort was put into the overall user experience and runtime performance was always valued over development effort. This resulted in a systematic increase in development cost and an entire &#8220;Engine Economy&#8221; based on brute-force effort. Two years ago, we decided to tackle this problem head-on. The result is an entirely new suite of tools, written from the ground up to fundamentally change the way we work as a studio. </p>
<p>It was also clear that the world was changing. The explosion of web-based enterprise applications, fully-web enabled mobile devices (like the iPhone and iPad) and browser-based gaming sent a clear signal that the era of native applications living in a sandbox was over. Not just for games, but also for the tools we use to develop games. We felt this was an opportunity to make a strategic change that would position us much better and net us valuable experience for the inevitable changes to operating systems, development tools and user expectations.</p>
<p>This is the story of our experience so far.The first game Insomniac will ship on these tools is Overstrike. We will share our most significant choices and the costs of those choices. We will suggest alternatives where we feel that better results can still be achieved. And we will share details of the technical architecture of the new tools suite. </p>
<p>Details such as:</p>
<p>Usability is not random. We needed first-class information to develop first-class tools. We set up a formal usability practice without a lab or additional budget using a single PC. We will also share specific, novel tools features such as our &#8220;neighbor&#8221; and &#8220;tile&#8221; mode which allowed us to increase production time on common tasks by as much as 20x. </p>
<p>The choice to go webapp. The initial version of the tools was not web-based. It was a native application which used Flash for the front-end. This model was not significantly improved over the traditional native model and introduced the same data complexities. Webapp tools allowed us to not only take advantage of many available development tools, it forced a clean separation of UI and back-end data.</p>
<p>Client/Local-server model. One of the concerns of browser-based tools is adding latency. We largely solved this issue by running a mongoose-based web server local to each machine. </p>
<p>Additional details. We will also share our experience with allowing custom tools and UI development by non-tools programmers. Our take on the Flash vs. HTML5 debate. Details of integrating a native engine. And browser and security workarounds. </p>
<p>We&#8217;ll share enough about how we made our tools and why so that you could begin to duplicate the process. We&#8217;ll share why we made the choices we made so that you can justify the effort and search for reasonable alternatives. And we&#8217;ll share where we went wrong so that you can avoid the same costly mistakes.</p>
<h2>#AltDevBlogADay Post Mortem: The First Year</h2>
<p>Track: Business and Marketing and Management; Programming<br />
Format: 60-Minute Panel<br />
Speakers: <a href="http://altdevblogaday.com/author/jaymin-kessler/">Jaymin Kessler</a>, <a href="http://altdevblogaday.com/author/jonathan-adamczewski/">Jonathan Adamczewski</a>, <a href="http://altdevblogaday.com/author/mike-jungbluth/">Michael Jungbluth</a>, <a href="http://altdevblogaday.com/author/mike-acton/">Mike Acton</a>, <a href="http://altdevblogaday.com/author/tiffany-smith/">Tiffany Smith</a>, <a href="http://altdevblogaday.com/author/wolfgang-engel/">Wolfgang Engel</a></p>
<p>#AltDevBlogADay is all about the sharing of knowledge and ideas about game development in a way that is unprecedentedly open and eager. What better way to continue the online initiative of transparency for all things game dev related than a post mortem?</p>
<p>Started by Mike Acton, #AltDevBlogADay is a grand experiment in decentralized collaboration and information sharing.  With hundreds of authors from around the world spanning a full range of specializations and levels of experience, and each author posting once every 15 days, there is always something new and interesting to read.  Select articles even appear on Gamasutra, GameIndustry.biz, and in Game Developer Magazine. This talk will bring together a handful of those contributors to talk about how it formed, why they think it is valuable and what more can still be done.</p>
<p>The panel will start with how the idea came about, straight from the founder Mike Acton, and how it grew through social networks such as twitter and google groups. He will also discuss how it maintained a consistent stream of posts through server changes, copyright discussions and initiatives with other websites and publications, all the while keeping it casual and barrier free for anyone wanting to post.</p>
<p>Authors on the panel will speak to why they felt it important to join the website and keep up a continual posting schedule while balancing a full developer workload. They will speak to any benefits they have found from posting from networking to even advancement opportunities in their careers. One student contributor even got recruited by the studio he now works for after the studio&#8217;s owner read one of his posts. </p>
<p>Panelists will also speak to what responsibility they feel for the content generated, correcting any faulty information on the site, and any need to affect the wider culture of game development. In one instance, Mike Acton put out a call for more female developers to join the site, to help drive forward a gap in the industry both he and many others identify as cultural concern. Both he and panelist Tiffany Smith will touch on how that initiative went and if more can still be done.</p>
<p>Authors will also touch on some of the topics that have gotten the most attention industry wide, be it about a specific discipline&#8217;s skill set or opinions on general development culture or practices. This includes how they have dealt with the replies, when the traditional role of developers is to not engage online comments, especially when the post goes viral outside of the traditional industry community through sites like reddit or facebook.</p>
<p>Finally, they will touch upon where they want to see it grow and what the future can hold for this initiative to give a daily voice to the developers of the world.</p>
<p>Attendees of all disciplines will walk away from the talk with new tools and insights towards getting their voice out there and realizing that every day can be a networking and learning experience like the one at the conference.</p>
<h2>Cutting the Pipe: Achieving Sub-Second Iteration Items</h2>
<p>Track: Programming (Design secondary as it&#8217;s about enabling new experiences)<br />
Format: 60 minute talk<br />
Speaker: <a href="http://altdevblogaday.com/author/niklas-frykholm/">Niklas Frykholm</a></p>
<p>Often there is a perceived conflict between dynamic/flexible systems, where objects can be manipulated directly and high-performance systems that pre-process and pack their data as efficiently as possible. This session will show that this conflict is not innate, by presenting a pipeline design that combines sub-second iteration times with highly efficient load-in-place data structures.</p>
<p>This is achieved by combining several techniques:<br />
Game resources are organised into binary pieces that can be compiled and reloaded individually. A central resource manager keeps track of all resources and a reload broadcasts a function call with the new and old resource pointers to all affected systems. Each system is responsible for handling this in the correct way.<br />
A data compiler process is always kept running as a local TCP/IP server to eliminate startup/shutdown times.<br />
Data that persists between compile sessions is kept in fast in-memory databases.<br />
Directory watching eliminates the need for file tree scanning.<br />
Tools use the actual engine and final data formats for visualization.<br />
Tools talk to the engine over TCP/IP and can tell it to reload individual resources.<br />
Lua is used for reloadable gameplay code and also acts as an interface for the tools (over TCP/IP).</p>
<p>By using this method, the recompile time for a project becomes proportional to the number of changed resources, rather than to the total number of resources, with a very low static overhead. A zero-compile (no data changed) touches no files on the disk.</p>
<p>Additional benefits include:<br />
Immediate drop-in play from the level editor on both PC and console.<br />
Live near-instant reload/recompile of all game resources.<br />
Artists and gameplay programmers see the result of changes immediately.<br />
No central data compiler needed, everyone can work distributed in local repositories.<br />
Consoles can run in slave mode to an editor running on a PC and immediately show what levels, particles and animations will look like on the final hardware.<br />
Tools can be written in any language.</p>
<p>This method has been implemented in the BitSquid engine and is being used by multiple titles currently under development, including the recently released Hamilton’s Great Adventure. Using this method, a recompile of a 10 000 file project with one changed Lua file takes less than 500 ms.</p>
<h2>Technical Animation Roundtable</h2>
<p>Track: Visual Arts<br />
Format: 60-Minute Roundtable<br />
Speaker: <a href="http://altdevblogaday.com/author/tim-borrelli/">Tim Borrelli</a></p>
<p>Over the last 2 years, the Technical Animation Roundtable at GDC has been very successful, and I plan on keeping that success going.</p>
<p>This year, there will be a much broader range of discussion topics that will keep people coming back each day. For example, one topic that has been discussed from many angles is character performance. Since a large part of technical animation relates to getting a character to look its best in-game, the conversations have veered towards discussing how, as tech animators, we can better work with and facilitate meaningful dialogue with modelers, animators, designers, writers, and AI programmers. I plan on promoting this as a full session topic for one of the days.</p>
<p>I will change the intended audience to be broader, to include not just tech animators, animators and programmers, but also modelers, writers, designers and concept artists. In order to get that audience, I will become more active pre-GDC to encourage other disciplines to attend. I know the title will still cause some people in the aforementioned disciplines to skip over it, but my hope is that word of mouth will bring in these other disciplines so that more cross-discipline discussion can occur.</p>
<p>The roundtable will focus on the process of a character&#8217;s performance in game, including the initial design spec, the concept phase, modeling for animation, rigging, creating animations for proper player input or AI controls, use of motion of performance capture, creation of state machines and blendtrees, voice recording, implementing in the game engine, and finally what the end user will experience.</p>
<p>I will encourage the entire audience of modelers, animators, tech animators, designers, writers, and programmers to participate in a productive discussion about how the process works for them, and how it can be improved. </p>
<p>Ultimately, the participants should walk away having seen the process through each other discipline&#8217;s eyes, and be able to go back to work with a newfound understanding on how to best communicate with their coworkers in order to deliver, as a team, the best character performance possible. Participants will also learn what common skills effective technical animators share and how to apply those skills to their specific company, as well as the value it will bring to their projects.</p>
<h2>Animators Demanding Respect</h2>
<p>Track: Visual Arts<br />
Format: 60-Minute Panel<br />
Speaker: <a href="http://altdevblogaday.com/author/mike-jungbluth/">Michael Jungbluth</a>; Nate Walpole; <a href="http://altdevblogaday.com/author/tim-borrelli/">Tim Borrelli</a></p>
<p>We are tired of seeing beaten down, unmotivated animators in the game industry. It shouldn&#8217;t be standard for designers and programmers to throw animations under the game dev bus with ridiculous rate scaling, blending animations that were never meant to go together into a Frankenstein&#8217;s monster, and tossing the wet blanket of universal compression rates over all the animations. Producers will often praise the performance of an actor in a mocap suit, and never once mention the animation team&#8217;s effort in pulling it together. We are fed up with losing some of our best talent to film where a character&#8217;s performance isn&#8217;t sacrificed for gameplay&#8217;s, when the two need not be mutually exclusive.</p>
<p>In this panel, three experienced game animators will talk about how best to deal with these pitfalls and misconceptions, all the while driving home the point that animation is more than just the motions of a character, but also their emotions. Their solutions for how to gain respect and push forward game animation as a whole include a better integration of technical abilities, a renewed focus on traditional artistic principles and a better understanding of the grey area between game design and animation.</p>
<p>Tim Borrelli will speak about the task at hand as a technical animator and lead, and how all the tools in the animators wheelhouse are making them more important by the day. This includes:<br />
- Communication between tech art and animation<br />
- Animation tech working WITH design, not around it (rate scaling tools, compression tools, performance issues)<br />
- Proficiency with scripting (Maxscript, Mel, Python, etc) and Excel</p>
<p>Nate Walpole will talk about how its not just the tools but the need to fully embrace and implement the artistic and traditional roots of animation to take game animation to a new level. This involves:<br />
- Use of appeal in character creation<br />
- Need for pauses in acting, action and simultaneously gameplay<br />
- Motion quality on par with other assets (lighting, fx, modeling)<br />
- Motion style complimenting overall gameplay design (mocap on a twitch shooter?)<br />
- Necessity for motion blur as resolution/visual budget increases and gameplay moves faster in parallel<br />
- Animation fidelity and purpose (play as the character, not the UI)</p>
<p>Mike Jungbluth will focus on the need to embrace the area where game design and animation overlap and why animators need to step it up in this regard.<br />
- How soon animation should be included in the design process<br />
- What to do when 4 or more of the 12 animation principles are in the hands of game design, not animation<br />
- Where animators need to inject more purpose (transitional animations and pathing)<br />
- How player input should be considered as much as design output during gameplay (Making the button presses by the player match the intent of the animation on the screen)</p>
<p>Attendees will walk away with not only a renewed sense of respect for what game animation is capable of, but the tools they need to make it happen across their team.</p>
<h2>Fail Tales: What We Did (Or Should Have Done) To Ship Troubled Projects</h2>
<p>Track: Production<br />
Format: 60-Minute Panel<br />
Speaker: Ed Byrne; <a href="http://altdevblogaday.com/author/keith-fuller/">Keith Fuller</a>; Marc Scattergood </p>
<p>This panel will provide real-world solutions to the pitfalls faced by well-known AAA developers while shipping MMO&#8217;s, original IP&#8217;s, and franchise sequels. Each of the three panelists will present the details of a project on which they were a key participant, delivering a description of things that went wrong and what was done to fix those problems and ship the product. While each participant takes center stage in this series of mini-lectures/post-mortems, the other panelists will be weighing in with their own thoughts as to what solutions should have been attempted. We&#8217;re encouraging each other to inject a little humor into the process while bringing alternative expert opinions to the discussion. Keeping the talk lively, giving personal behind-the-scenes accounts, and providing the audience with multiple viewpoints will make this session much more valuable than the standard white-washed post-mortem.</p>
<p>Some specific problems and solutions we&#8217;ll cover:</p>
<p>How 70 people can finish a game more easily than 150 people (a bigger team can be more problematic)<br />
How experienced developers making something very similar to their last project can still have trouble – what you should watch for<br />
How to cope when delays force you to ship well after your marketing budget has been expended<br />
How good leadership can overcome technical failures, political upheaval, and design mismanagement<br />
How you can go wrong by being too careful with your original IP</p>
<p>Keith Fuller (Production Consultant, Fuller Game Production) was Producer for Raven Software&#8217;s Singularity. He describes the design difficulties and leadership changes that took the game from studio darling to almost-canceled to a mid-70&#8242;s Metacritic. Although I&#8217;m submitting the session under my name, I&#8217;ll be an equal participant with the other panelists.</p>
<p>Marc Scattergood (Senior Product Manager, PopCap) was Associate Producer for now-defunct Sigil Games while working on Vanguard: Saga of Heroes. He talks about the tumultuous 6-year development of this MMO.</p>
<p>Ed Byrne (Creative Director, Imba Entertainment) was designer of several games in the SOCOM series and brings to light the problems he encountered and the solutions he employed with that franchise.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/09/08/gdc12-altdevproposals/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Properties of self-avoiding walks (Part 1)</title>
		<link>http://www.altdevblogaday.com/2011/09/04/properties-of-self-avoiding-walks-part-1/</link>
		<comments>http://www.altdevblogaday.com/2011/09/04/properties-of-self-avoiding-walks-part-1/#comments</comments>
		<pubDate>Sun, 04 Sep 2011 13:19:26 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://altdevblogaday.com/?p=15541</guid>
		<description><![CDATA[<p>About five years ago, I was asked to help look at optimizing a bit of code for the SPUs. Fundamental to that particular issue was the problem of 2D self-avoiding walks. It turns out that optimizing self-avoiding walks is a fascinating and deep subject. In this series, I&#8217;m going to share with you some of the properties of the problem I&#8217;ve observed. And some of the more interesting dead-ends as well.</p>
<p><a href="http://www.altdevblogaday.com/2011/09/04/properties-of-self-avoiding-walks-part-1/" class="more-link">Read more on Properties of self-avoiding walks (Part 1)&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>About five years ago, I was asked to help look at optimizing a bit of code for the SPUs. Fundamental to that particular issue was the problem of 2D self-avoiding walks. It turns out that optimizing self-avoiding walks is a fascinating and deep subject. In this series, I&#8217;m going to share with you some of the properties of the problem I&#8217;ve observed. And some of the more interesting dead-ends as well.</p>
<h2>What is a self-avoiding walk?</h2>
<p>Put simply, a path on a grid that does not cross itself.</p>
<p>For more detailed introductions, see also:</p>
<ul>
<li><a href="http://www.americanscientist.org/issues/id.3301,y.0,no.,content.true,page.1,css.print/issue.aspx">How to Avoid Yourself</a> by Brian Hayes</li>
<li><a href="http://mathworld.wolfram.com/Self-AvoidingWalk.html">Self-Avoiding Walk</a> on Wolfram MathWorld</li>
<li><a href="http://en.wikipedia.org/wiki/Self-avoiding_walk">Self-Avoiding walk</a> on Wikipedia</li>
</ul>
<h2>Counting walks</h2>
<p>From the <a href="http://en.wikipedia.org/wiki/Self-avoiding_walk">wikipedia entry</a>:</p>
<blockquote><p>Calculating the number of self-avoiding walks in any given lattice is a common computational problem. There is currently no known formula for determining the number of self-avoiding walks, although there are rigorous methods for approximating them. Finding the number of such paths is conjectured to be an NP-hard problem.</p></blockquote>
<p>This is typical academic bullshit.</p>
<p>The problem with declaring (or conjecturing) this problem to be NP-hard is that it&#8217;s completely the wrong question being asked. It&#8217;s not a question of creating a &#8220;formula for determining the number of self-avoiding walks&#8221; given no other information. Or at least, it&#8217;s not an <em>interesting</em> or <em>relevant</em> question. As a practical matter, it tells us exactly nothing about the real problem: How we can find that number in a reasonable amount of time given <em>any</em> information or method which might be useful.</p>
<p>So that&#8217;s where we&#8217;ll start this series. We&#8217;ll look at different methods for counting paths of arbitrary lengths in a reasonable time (assuming you have a method of adding increasingly huge numbers.) In the first few parts I hope I to convince you that with a little bit of data analysis (because it&#8217;s <strong>always</strong> about the data), that you <i>can</i> calculate the total number of self-avoiding walks exactly for fairly large path lengths in a reasonable time. And then we might look at other interesting properties and related problems.</p>
<h2>End points</h2>
<p>Let&#8217;s start small.</p>
<p>Here are the self-avoiding walks of length 3. (By convention, the center point is not counted as part of the length of the walk.)</p>
<p>Each next step of the walk is denoted by the direction:</p>
<ul>
<li>C=Center</li>
<li>W=West</li>
<li>E=East</li>
<li>S=South</li>
<li>N=North</li>
</ul>
<pre>C,W,W,W   C,W,N,W   C,S,S,W
C,W,W,S   C,W,N,E   C,S,S,E
C,W,W,N   C,W,N,N   C,S,S,S
C,W,S,W   C,E,E,E   C,N,W,W
C,W,S,E   C,E,E,S   C,N,W,S
C,W,S,S   C,E,E,N   C,N,W,N

C,E,S,W   C,S,W,W   C,N,E,E
C,E,S,E   C,S,W,S   C,N,E,S
C,E,S,S   C,S,W,N   C,N,E,N
C,E,N,W   C,S,E,E   C,N,N,W
C,E,N,E   C,S,E,S   C,N,N,E
C,E,N,N   C,S,E,N   C,N,N,N</pre>
<p>Which can also be visualized like this:</p>
<p><img src="http://altdevblogaday.com/wp-content/uploads/2011/09/path3.png" alt="" width="100%" /></p>
<p>Note that some of the paths end at the same point:</p>
<p><img src="http://altdevblogaday.com/wp-content/uploads/2011/09/end3.png" alt="" width="100%" /></p>
<p>We&#8217;ll call those points &#8220;End Points&#8221; and that&#8217;s what we&#8217;ll concentrate on first. Let&#8217;s visualize where those end points end up for these length 3 paths. Here, the center is denoted by &#8220;*&#8221; and each &#8220;X&#8221; denotes an end point (where one or more paths end.)</p>
<pre>- - - X - - -
- - X - X - -
- X - X - X -
X - X * X - X
- X - X - X -
- - X - X - -
- - - X - - -
EndPointCount: 16</pre>
<div style="font-weight: bold; color: red; padding: 20px; background-color: #ddd; margin-top: 15px; margin-bottom: 15px;">Observation-1: The arrangement of end points is a diamond shape square of (n+1) by (n+1), where n is the length of the path.</div>
<p>This is true for any path length n.</p>
<p>Let&#8217;s look at another example. The end points of path length 15:</p>
<pre>- - - - - - - - - - - - - - - X - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - X - X - - - - - - - - - - - - - -
- - - - - - - - - - - - - X - X - X - - - - - - - - - - - - -
- - - - - - - - - - - - X - X - X - X - - - - - - - - - - - -
- - - - - - - - - - - X - X - X - X - X - - - - - - - - - - -
- - - - - - - - - - X - X - X - X - X - X - - - - - - - - - -
- - - - - - - - - X - X - X - X - X - X - X - - - - - - - - -
- - - - - - - - X - X - X - X - X - X - X - X - - - - - - - -
- - - - - - - X - X - X - X - X - X - X - X - X - - - - - - -
- - - - - - X - X - X - X - X - X - X - X - X - X - - - - - -
- - - - - X - X - X - X - X - X - X - X - X - X - X - - - - -
- - - - X - X - X - X - X - X - X - X - X - X - X - X - - - -
- - - X - X - X - X - X - X - X - X - X - X - X - X - X - - -
- - X - X - X - X - X - X - X - X - X - X - X - X - X - X - -
- X - X - X - X - X - X - X - X - X - X - X - X - X - X - X -
X - X - X - X - X - X - X - X * X - X - X - X - X - X - X - X
- X - X - X - X - X - X - X - X - X - X - X - X - X - X - X -
- - X - X - X - X - X - X - X - X - X - X - X - X - X - X - -
- - - X - X - X - X - X - X - X - X - X - X - X - X - X - - -
- - - - X - X - X - X - X - X - X - X - X - X - X - X - - - -
- - - - - X - X - X - X - X - X - X - X - X - X - X - - - - -
- - - - - - X - X - X - X - X - X - X - X - X - X - - - - - -
- - - - - - - X - X - X - X - X - X - X - X - X - - - - - - -
- - - - - - - - X - X - X - X - X - X - X - X - - - - - - - -
- - - - - - - - - X - X - X - X - X - X - X - - - - - - - - -
- - - - - - - - - - X - X - X - X - X - X - - - - - - - - - -
- - - - - - - - - - - X - X - X - X - X - - - - - - - - - - -
- - - - - - - - - - - - X - X - X - X - - - - - - - - - - - -
- - - - - - - - - - - - - X - X - X - - - - - - - - - - - - -
- - - - - - - - - - - - - - X - X - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - X - - - - - - - - - - - - - - -
EndPointCount: 256</pre>
<div style="font-weight: bold; color: red; padding: 20px; background-color: #ddd; margin-top: 15px; margin-bottom: 15px;">Observation-2: The number of end points of a path length n is (n+1)^2 for odd numbered path lengths and (n+1)^2-1 for even numbered path lengths.</div>
<p>Let&#8217;s look again at the end points of path length 3:</p>
<pre>- - - X - - -
- - X - X - -
- X - X - X -
X - X * X - X
- X - X - X -
- - X - X - -
- - - X - - -
EndPointCount: 16</pre>
<p>And at the end points of path length 4:</p>
<pre>- - - - X - - - -
- - - X - X - - -
- - X - X - X - -
- X - X - X - X -
X - X - * - X - X
- X - X - X - X -
- - X - X - X - -
- - - X - X - - -
- - - - X - - - -
EndPointCount: 24</pre>
<p>Notice that in the odd numbered path the center point is excluded from the area defined by the end points (n+1)*(n+1); in the even numbered path, the center point is included in the area but can obviously not itself be an end point.</p>
<p>Here&#8217;s some simple javascript to help you validate the pattern: <a href="http://altdevblogaday.com/wp-content/uploads/2011/09/walk_11.js">walk_11.js</a> (Note: I&#8217;m using <a href="http://www.jsdb.org/">jsdb</a> to run this javascript, you may need to slightly modify for a different environment.) This script brute force calculates all paths for a given length n, then prints out the end points in the form above. Since it&#8217;s brute forcing all paths, it&#8217;s only usable for small n.</p>
<p>Now just with Observation-1 and Observation-2, you can already significantly reduce the amount of time enumerating self-avoiding walks. By knowing where paths <strong>must</strong> end and where paths <strong>cannot</strong> end, you can reduce the search space significantly. i.e. Traditional brute-force walk enumeration (as in the javascript example above), begin at the center point and simply work out every path one-by-one. However, if you know all the end points, you can iterate through each end point and find the paths that connect the two points instead (end point and center point).</p>
<p>However, we&#8217;ll put that aside for now so that we can look at some additional data.</p>
<p>Let&#8217;s look at the number of paths found at each end point of a length 3 walk:</p>
<pre>----- ----- ----- 00001 ----- ----- -----
----- ----- 00003 ----- 00003 ----- -----
----- 00003 ----- 00002 ----- 00003 -----
00001 ----- 00002 ***** 00002 ----- 00001
----- 00003 ----- 00002 ----- 00003 -----
----- ----- 00003 ----- 00003 ----- -----
----- ----- ----- 00001 ----- ----- -----
EndPointCount: 16
TotalWalkCount: 36</pre>
<div style="font-weight: bold; color: red; padding: 20px; background-color: #ddd; margin-top: 15px; margin-bottom: 15px;">Observation-3: The total number of self avoiding walks for paths of length n is equal to the sum of all self avoiding walks of length n at each end point.</div>
<p>This is obvious. If we know all the points at which paths can end and we know how many paths end at each point we can simply add them all up to get the total number of walks (in this case, 36.)</p>
<p>Another example. End point path counts for path length 8:</p>
<pre>----- ----- ----- ----- ----- ----- ----- ----- 00001 ----- ----- ----- ----- ----- ----- ----- -----
----- ----- ----- ----- ----- ----- ----- 00008 ----- 00008 ----- ----- ----- ----- ----- ----- -----
----- ----- ----- ----- ----- ----- 00028 ----- 00042 ----- 00028 ----- ----- ----- ----- ----- -----
----- ----- ----- ----- ----- 00056 ----- 00092 ----- 00092 ----- 00056 ----- ----- ----- ----- -----
----- ----- ----- ----- 00070 ----- 00118 ----- 00126 ----- 00118 ----- 00070 ----- ----- ----- -----
----- ----- ----- 00056 ----- 00120 ----- 00118 ----- 00118 ----- 00120 ----- 00056 ----- ----- -----
----- ----- 00028 ----- 00118 ----- 00112 ----- 00092 ----- 00112 ----- 00118 ----- 00028 ----- -----
----- 00008 ----- 00092 ----- 00118 ----- 00076 ----- 00076 ----- 00118 ----- 00092 ----- 00008 -----
00001 ----- 00042 ----- 00126 ----- 00092 ----- ***** ----- 00092 ----- 00126 ----- 00042 ----- 00001
----- 00008 ----- 00092 ----- 00118 ----- 00076 ----- 00076 ----- 00118 ----- 00092 ----- 00008 -----
----- ----- 00028 ----- 00118 ----- 00112 ----- 00092 ----- 00112 ----- 00118 ----- 00028 ----- -----
----- ----- ----- 00056 ----- 00120 ----- 00118 ----- 00118 ----- 00120 ----- 00056 ----- ----- -----
----- ----- ----- ----- 00070 ----- 00118 ----- 00126 ----- 00118 ----- 00070 ----- ----- ----- -----
----- ----- ----- ----- ----- 00056 ----- 00092 ----- 00092 ----- 00056 ----- ----- ----- ----- -----
----- ----- ----- ----- ----- ----- 00028 ----- 00042 ----- 00028 ----- ----- ----- ----- ----- -----
----- ----- ----- ----- ----- ----- ----- 00008 ----- 00008 ----- ----- ----- ----- ----- ----- -----
----- ----- ----- ----- ----- ----- ----- ----- 00001 ----- ----- ----- ----- ----- ----- ----- -----
EndPointCount: 80
TotalWalkCount: 5916</pre>
<p>For validation, here&#8217;s another javascript which will brute force through all paths, add up the number of paths at each end point and output in the format above: <a href="http://altdevblogaday.com/wp-content/uploads/2011/09/walk_12.js">walk_12.js</a></p>
<div style="font-weight: bold; color: red; padding: 20px; background-color: #ddd; margin-top: 15px; margin-bottom: 15px;">Observation-4: There are predictable patterns to the number of self avoiding walks at the end points of any set of walks of length n.</div>
<p>This is where we will concern ourselves. If we can predict the number of self avoiding walks for each end point, we can eliminate the work in walking those paths and simply add up the results. The tricky bit is of course determining what those patterns <strong>are</strong> exactly. But rest assured, they exist.</p>
<p>First let&#8217;s rearrange the format of the data. End points are an (n+1) by (n+1) diamond shape, which if rotated 45 degrees, can be made into a square matrix. Here&#8217;s the same data from above for path length 8 in that form:</p>
<pre>00001 00008 00028 00056 00070 00056 00028 00008 00001
00008 00042 00092 00118 00120 00118 00092 00042 00008
00028 00092 00126 00118 00112 00118 00126 00092 00028
00056 00118 00118 00092 00076 00092 00118 00118 00056
00070 00120 00112 00076 ***** 00076 00112 00120 00070
00056 00118 00118 00092 00076 00092 00118 00118 00056
00028 00092 00126 00118 00112 00118 00126 00092 00028
00008 00042 00092 00118 00120 00118 00092 00042 00008
00001 00008 00028 00056 00070 00056 00028 00008 00001
EndPointCount: 80
TotalWalkCount: 5916</pre>
<p>Let&#8217;s start with the easy stuff.</p>
<p>Notice that the walk counts are rotated and mirrored about the center. That makes intuitive sense: Any walk that begins in one direction has an equivalent walk that begins in the other three directions.</p>
<div style="font-weight: bold; color: red; padding: 20px; background-color: #ddd; margin-top: 15px; margin-bottom: 15px;">Observation-5: Any self avoiding path beginning in one direction has equivalent paths in the other three directions.</div>
<p>This observation is well known and is the basis for most high-level optimizations of the brute force algorithm. And it&#8217;s easy to see why. By simply starting the path in one known direction, the total count is simply multiplied by four to account for the other quadrants.</p>
<p>Here the end points paths which are simply mirrors or rotations of one direction for path length 8 are marked in red.</p>
<pre><span style="color: #008000;">00001 00008 00028 00056 00070</span> <span style="color: #ff0000;">00056 00028 00008 00001</span>
<span style="color: #008000;">00008 00042 00092 00118 00120</span><span style="color: #ff0000;"> 00118 00092 00042 00008</span>
<span style="color: #008000;">00028 00092 00126 00118 00112</span> <span style="color: #ff0000;">00118 00126 00092 00028</span>
<span style="color: #008000;">00056 00118 00118 00092 00076</span> <span style="color: #ff0000;">00092 00118 00118 00056</span>
<span style="color: #008000;">00070 00120 00112 00076</span> *****<span style="color: #ff0000;"> 00076 00112 00120 00070</span>
<span style="color: #ff0000;">00056 00118 00118 00092 00076</span> <span style="color: #ff0000;">00092 00118 00118 00056</span>
<span style="color: #ff0000;">00028 00092 00126 00118 00112</span> <span style="color: #ff0000;">00118 00126 00092 00028</span>
<span style="color: #ff0000;">00008 00042 00092 00118 00120</span> <span style="color: #ff0000;">00118 00092 00042 00008</span>
<span style="color: #ff0000;">00001 00008 00028 00056 00070</span> <span style="color: #ff0000;">00056 00028 00008 00001</span>
EndPointCount: 80
TotalWalkCount: 5916</pre>
<p>But there is still more duplication here.</p>
<div style="font-weight: bold; color: red; padding: 20px; background-color: #ddd; margin-top: 15px; margin-bottom: 15px;">Observation-6: All self avoiding paths after the first turn on a path have equivalent paths in the opposite turn direction.</div>
<p>In other words, all the paths which are found after you <em>first</em> turn right have equivalent paths if you had turned left instead. You can see how the end point path counts are mirrored along the diagonal of that quadrant.</p>
<p>Which leaves us with just the following green end points for paths of length 8.</p>
<pre><span style="color: #008000;">00001 <span style="color: #ff0000;">00008</span> <span style="color: #ff0000;">00028</span> <span style="color: #ff0000;">00056</span> <span style="color: #ff0000;">00070</span></span> <span style="color: #ff0000;">00056 00028 00008 00001</span>
<span style="color: #008000;">00008 00042 <span style="color: #ff0000;">00092</span> <span style="color: #ff0000;">00118</span> <span style="color: #ff0000;">00120</span></span><span style="color: #ff0000;"> 00118 00092 00042 00008</span>
<span style="color: #008000;">00028 00092 00126 <span style="color: #ff0000;">00118</span> <span style="color: #ff0000;">00112</span></span> <span style="color: #ff0000;">00118 00126 00092 00028</span>
<span style="color: #008000;">00056 00118 00118 00092 <span style="color: #ff0000;">00076</span></span> <span style="color: #ff0000;">00092 00118 00118 00056</span>
<span style="color: #008000;">00070 00120 00112 00076</span> *****<span style="color: #ff0000;"> 00076 00112 00120 00070</span>
<span style="color: #ff0000;">00056 00118 00118 00092 00076</span> <span style="color: #ff0000;">00092 00118 00118 00056</span>
<span style="color: #ff0000;">00028 00092 00126 00118 00112</span> <span style="color: #ff0000;">00118 00126 00092 00028</span>
<span style="color: #ff0000;">00008 00042 00092 00118 00120</span> <span style="color: #ff0000;">00118 00092 00042 00008</span>
<span style="color: #ff0000;">00001 00008 00028 00056 00070</span> <span style="color: #ff0000;">00056 00028 00008 00001</span>
EndPointCount: 80
TotalWalkCount: 5916</pre>
<p>This is true for paths of any length n. Here is another example with paths of length 13.</p>
<pre><span style="color: #008000;">00001</span> <span style="color: #ff0000;">00013</span> <span style="color: #ff0000;">00078</span> <span style="color: #ff0000;">00286</span> <span style="color: #ff0000;">00715</span> <span style="color: #ff0000;">01287</span> <span style="color: #ff0000;">01716 01716 01287 00715 00286 00078 00013 00001</span>
<span style="color: #008000;">00013 00132</span><span style="color: #ff0000;"> 00607</span> <span style="color: #ff0000;">01683</span> <span style="color: #ff0000;">03190</span> <span style="color: #ff0000;">04521</span> <span style="color: #ff0000;">05214 05214 04521 03190 01683 00607 00132 00013</span>
<span style="color: #008000;">00078 00607 02106</span> <span style="color: #ff0000;">04398</span> <span style="color: #ff0000;">06467</span> <span style="color: #ff0000;">07656</span> <span style="color: #ff0000;">08128 08128 07656 06467 04398 02106 00607 00078</span>
<span style="color: #008000;">00286 01683 04398 07072</span> <span style="color: #ff0000;">08506</span> <span style="color: #ff0000;">08923</span> <span style="color: #ff0000;">08956 08956 08923 08506 07072 04398 01683 00286</span>
<span style="color: #008000;">00715 03190 06467 08506 08924</span> <span style="color: #ff0000;">08518</span> <span style="color: #ff0000;">08080 08080 08518 08924 08506 06467 03190 00715</span>
<span style="color: #008000;">01287 04521 07656 08923 08518 07366</span> <span style="color: #ff0000;">06387 06387 07366 08518 08923 07656 04521 01287</span>
<span style="color: #008000;">01716 05214 08128 08956 08080 06387 04116</span><span style="color: #ff0000;"> 04116 06387 08080 08956 08128 05214 01716</span>
<span style="color: #ff0000;">01716 05214 08128 08956 08080 06387 04116 04116 06387 08080 08956 08128 05214 01716</span>
<span style="color: #ff0000;">01287 04521 07656 08923 08518 07366 06387 06387 07366 08518 08923 07656 04521 01287</span>
<span style="color: #ff0000;">00715 03190 06467 08506 08924 08518 08080 08080 08518 08924 08506 06467 03190 00715</span>
<span style="color: #ff0000;">00286 01683 04398 07072 08506 08923 08956 08956 08923 08506 07072 04398 01683 00286</span>
<span style="color: #ff0000;">00078 00607 02106 04398 06467 07656 08128 08128 07656 06467 04398 02106 00607 00078</span>
<span style="color: #ff0000;">00013 00132 00607 01683 03190 04521 05214 05214 04521 03190 01683 00607 00132 00013</span>
<span style="color: #ff0000;">00001 00013 00078 00286 00715 01287 01716 01716 01287 00715 00286 00078 00013 00001</span>
EndPointCount: 196
TotalWalkCount: 881500</pre>
<p>At this point, using Observation-5 and Observation-6, you <em>could</em> reduce the work of enumerating self avoiding walks significantly again. It&#8217;s hopefully clear that if you can just find those walks which end in the end points in green, you can derive all the remaining walks.</p>
<p>However, again we&#8217;ll put this aside for now to concentrate on digging into the data still further.</p>
<p>Here&#8217;s where we take a step away from the view of the problem <em>in isolation</em> and use more available data.</p>
<div style="font-weight: bold; color: red; padding: 20px; background-color: #ddd; margin-top: 15px; margin-bottom: 15px;">Observation-7: There is a relationship among end point paths counts of path length n and all end point path counts for path lengths less than n.</div>
<p>For example, if we want to get the end point path counts for paths of length 15, it helps to know the counts for all the paths of lengths less than 15. Or rather, if we want to calculate end point counts for paths of length 15, we can assume we&#8217;ve already done that for all the paths of length 14, 13, 12, 11, 10, 9, etc. previously and we can use that data to help.</p>
<p>Let&#8217;s have a look at all the end point counts of path lengths between 1 and 15:</p>
<pre>n 1
v     1     1
v     1     1 

n 2
v     1     2     1
v     2     0     2
v     1     2     1 

n 3
v     1     3     3     1
v     3     2     2     3
v     3     2     2     3
v     1     3     3     1 

n 4
v     1     4     6     4     1
v     4     6     4     6     4
v     6     4     0     4     6
v     4     6     4     6     4
v     1     4     6     4     1 

n 5
v     1     5    10    10     5     1
v     5    12    11    11    12     5
v    10    11     6     6    11    10
v    10    11     6     6    11    10
v     5    12    11    11    12     5
v     1     5    10    10     5     1 

n 6
v     1     6    15    20    15     6     1
v     6    20    26    24    26    20     6
v    15    26    20    16    20    26    15
v    20    24    16     0    16    24    20
v    15    26    20    16    20    26    15
v     6    20    26    24    26    20     6
v     1     6    15    20    15     6     1 

n 7
v     1     7    21    35    35    21     7     1
v     7    30    52    55    55    52    30     7
v    21    52    54    45    45    54    52    21
v    35    55    45    28    28    45    55    35
v    35    55    45    28    28    45    55    35
v    21    52    54    45    45    54    52    21
v     7    30    52    55    55    52    30     7
v     1     7    21    35    35    21     7     1 

n 8
v     1     8    28    56    70    56    28     8     1
v     8    42    92   118   120   118    92    42     8
v    28    92   126   118   112   118   126    92    28
v    56   118   118    92    76    92   118   118    56
v    70   120   112    76     0    76   112   120    70
v    56   118   118    92    76    92   118   118    56
v    28    92   126   118   112   118   126    92    28
v     8    42    92   118   120   118    92    42     8
v     1     8    28    56    70    56    28     8     1 

n 9
v     1     9    36    84   126   126    84    36     9     1
v     9    56   149   231   259   259   231   149    56     9
v    36   149   260   286   277   277   286   260   149    36
v    84   231   286   256   220   220   256   286   231    84
v   126   259   277   220   140   140   220   277   259   126
v   126   259   277   220   140   140   220   277   259   126
v    84   231   286   256   220   220   256   286   231    84
v    36   149   260   286   277   277   286   260   149    36
v     9    56   149   231   259   259   231   149    56     9
v     1     9    36    84   126   126    84    36     9     1 

n 10
v     1    10    45   120   210   252   210   120    45    10     1
v    10    72   226   416   532   560   532   416   226    72    10
v    45   226   486   636   661   660   661   636   486   226    45
v   120   416   636   654   598   568   598   654   636   416   120
v   210   532   661   598   468   396   468   598   661   532   210
v   252   560   660   568   396     0   396   568   660   560   252
v   210   532   661   598   468   396   468   598   661   532   210
v   120   416   636   654   598   568   598   654   636   416   120
v    45   226   486   636   661   660   661   636   486   226    45
v    10    72   226   416   532   560   532   416   226    72    10
v     1    10    45   120   210   252   210   120    45    10     1 

n 11
v     1    11    55   165   330   462   462   330   165    55    11     1
v    11    90   326   699  1026  1176  1176  1026   699   326    90    11
v    55   326   840  1301  1500  1546  1546  1500  1301   840   326    55
v   165   699  1301  1552  1532  1467  1467  1532  1552  1301   699   165
v   330  1026  1500  1532  1340  1157  1157  1340  1532  1500  1026   330
v   462  1176  1546  1467  1157   744   744  1157  1467  1546  1176   462
v   462  1176  1546  1467  1157   744   744  1157  1467  1546  1176   462
v   330  1026  1500  1532  1340  1157  1157  1340  1532  1500  1026   330
v   165   699  1301  1552  1532  1467  1467  1532  1552  1301   699   165
v    55   326   840  1301  1500  1546  1546  1500  1301   840   326    55
v    11    90   326   699  1026  1176  1176  1026   699   326    90    11
v     1    11    55   165   330   462   462   330   165    55    11     1 

n 12
v     1    12    66   220   495   792   924   792   495   220    66    12     1
v    12   110   452  1110  1860  2364  2520  2364  1860  1110   452   110    12
v    66   452  1364  2470  3210  3510  3584  3510  3210  2470  1364   452    66
v   220  1110  2470  3428  3712  3686  3644  3686  3712  3428  2470  1110   220
v   495  1860  3210  3712  3558  3216  3054  3216  3558  3712  3210  1860   495
v   792  2364  3510  3686  3216  2532  2164  2532  3216  3686  3510  2364   792
v   924  2520  3584  3644  3054  2164     0  2164  3054  3644  3584  2520   924
v   792  2364  3510  3686  3216  2532  2164  2532  3216  3686  3510  2364   792
v   495  1860  3210  3712  3558  3216  3054  3216  3558  3712  3210  1860   495
v   220  1110  2470  3428  3712  3686  3644  3686  3712  3428  2470  1110   220
v    66   452  1364  2470  3210  3510  3584  3510  3210  2470  1364   452    66
v    12   110   452  1110  1860  2364  2520  2364  1860  1110   452   110    12
v     1    12    66   220   495   792   924   792   495   220    66    12     1 

n 13
v     1    13    78   286   715  1287  1716  1716  1287   715   286    78    13     1
v    13   132   607  1683  3190  4521  5214  5214  4521  3190  1683   607   132    13
v    78   607  2106  4398  6467  7656  8128  8128  7656  6467  4398  2106   607    78
v   286  1683  4398  7072  8506  8923  8956  8956  8923  8506  7072  4398  1683   286
v   715  3190  6467  8506  8924  8518  8080  8080  8518  8924  8506  6467  3190   715
v  1287  4521  7656  8923  8518  7366  6387  6387  7366  8518  8923  7656  4521  1287
v  1716  5214  8128  8956  8080  6387  4116  4116  6387  8080  8956  8128  5214  1716
v  1716  5214  8128  8956  8080  6387  4116  4116  6387  8080  8956  8128  5214  1716
v  1287  4521  7656  8923  8518  7366  6387  6387  7366  8518  8923  7656  4521  1287
v   715  3190  6467  8506  8924  8518  8080  8080  8518  8924  8506  6467  3190   715
v   286  1683  4398  7072  8506  8923  8956  8956  8923  8506  7072  4398  1683   286
v    78   607  2106  4398  6467  7656  8128  8128  7656  6467  4398  2106   607    78
v    13   132   607  1683  3190  4521  5214  5214  4521  3190  1683   607   132    13
v     1    13    78   286   715  1287  1716  1716  1287   715   286    78    13     1 

n 14
v     1    14    91   364  1001  2002  3003  3432  3003  2002  1001   364    91    14     1
v    14   156   794  2456  5214  8228 10362 11088 10362  8228  5214  2456   794   156    14
v    91   794  3120  7416 12302 15958 17895 18480 17895 15958 12302  7416  3120   794    91
v   364  2456  7416 13706 18430 20724 21502 21652 21502 20724 18430 13706  7416  2456   364
v  1001  5214 12302 18430 21260 21568 20941 20584 20941 21568 21260 18430 12302  5214  1001
v  2002  8228 15958 20724 21568 20030 18006 17100 18006 20030 21568 20724 15958  8228  2002
v  3003 10362 17895 21502 20941 18006 14220 12240 14220 18006 20941 21502 17895 10362  3003
v  3432 11088 18480 21652 20584 17100 12240     0 12240 17100 20584 21652 18480 11088  3432
v  3003 10362 17895 21502 20941 18006 14220 12240 14220 18006 20941 21502 17895 10362  3003
v  2002  8228 15958 20724 21568 20030 18006 17100 18006 20030 21568 20724 15958  8228  2002
v  1001  5214 12302 18430 21260 21568 20941 20584 20941 21568 21260 18430 12302  5214  1001
v   364  2456  7416 13706 18430 20724 21502 21652 21502 20724 18430 13706  7416  2456   364
v    91   794  3120  7416 12302 15958 17895 18480 17895 15958 12302  7416  3120   794    91
v    14   156   794  2456  5214  8228 10362 11088 10362  8228  5214  2456   794   156    14
v     1    14    91   364  1001  2002  3003  3432  3003  2002  1001   364    91    14     1 

n 15
v     1    15   105   455  1365  3003  5005  6435  6435  5005  3003  1365   455   105    15     1
v    15   182  1016  3471  8177 14300 19734 22737 22737 19734 14300  8177  3471  1016   182    15
v   105  1016  4466 11941 22211 31730 38052 41007 41007 38052 31730 22211 11941  4466  1016   105
v   455  3471 11941 25124 37813 46068 50084 51540 51540 50084 46068 37813 25124 11941  3471   455
v  1365  8177 22211 37813 48188 52301 52705 52104 52104 52705 52301 48188 37813 22211  8177  1365
v  3003 14300 31730 46068 52301 51932 48665 45958 45958 48665 51932 52301 46068 31730 14300  3003
v  5005 19734 38052 50084 52705 48665 41872 36443 36443 41872 48665 52705 50084 38052 19734  5005
v  6435 22737 41007 51540 52104 45958 36443 23504 23504 36443 45958 52104 51540 41007 22737  6435
v  6435 22737 41007 51540 52104 45958 36443 23504 23504 36443 45958 52104 51540 41007 22737  6435
v  5005 19734 38052 50084 52705 48665 41872 36443 36443 41872 48665 52705 50084 38052 19734  5005
v  3003 14300 31730 46068 52301 51932 48665 45958 45958 48665 51932 52301 46068 31730 14300  3003
v  1365  8177 22211 37813 48188 52301 52705 52104 52104 52705 52301 48188 37813 22211  8177  1365
v   455  3471 11941 25124 37813 46068 50084 51540 51540 50084 46068 37813 25124 11941  3471   455
v   105  1016  4466 11941 22211 31730 38052 41007 41007 38052 31730 22211 11941  4466  1016   105
v    15   182  1016  3471  8177 14300 19734 22737 22737 19734 14300  8177  3471  1016   182    15
v     1    15   105   455  1365  3003  5005  6435  6435  5005  3003  1365   455   105    15     1</pre>
<p>Relationships between different path lengths may not be apparent in this form. So let&#8217;s transpose this data. Instead of looking at each path length independently, let’s look at each column together:</p>
<pre>c  0
------------------------------------------------------------------------------------------------------
n  0 |     1
n  1 |     1     1
n  2 |     1     2     1
n  3 |     1     3     3     1
n  4 |     1     4     6     4     1
n  5 |     1     5    10    10     5     1
n  6 |     1     6    15    20    15     6     1
n  7 |     1     7    21    35    35    21     7     1
n  8 |     1     8    28    56    70    56    28     8     1
n  9 |     1     9    36    84   126   126    84    36     9     1
n 10 |     1    10    45   120   210   252   210   120    45    10     1
n 11 |     1    11    55   165   330   462   462   330   165    55    11     1
n 12 |     1    12    66   220   495   792   924   792   495   220    66    12     1
n 13 |     1    13    78   286   715  1287  1716  1716  1287   715   286    78    13     1
n 14 |     1    14    91   364  1001  2002  3003  3432  3003  2002  1001   364    91    14     1
n 15 |     1    15   105   455  1365  3003  5005  6435  6435  5005  3003  1365   455   105    15     1 

c  1
------------------------------------------------------------------------------------------------------
n  1 |     1     1
n  2 |     2     0     2
n  3 |     3     2     2     3
n  4 |     4     6     4     6     4
n  5 |     5    12    11    11    12     5
n  6 |     6    20    26    24    26    20     6
n  7 |     7    30    52    55    55    52    30     7
n  8 |     8    42    92   118   120   118    92    42     8
n  9 |     9    56   149   231   259   259   231   149    56     9
n 10 |    10    72   226   416   532   560   532   416   226    72    10
n 11 |    11    90   326   699  1026  1176  1176  1026   699   326    90    11
n 12 |    12   110   452  1110  1860  2364  2520  2364  1860  1110   452   110    12
n 13 |    13   132   607  1683  3190  4521  5214  5214  4521  3190  1683   607   132    13
n 14 |    14   156   794  2456  5214  8228 10362 11088 10362  8228  5214  2456   794   156    14
n 15 |    15   182  1016  3471  8177 14300 19734 22737 22737 19734 14300  8177  3471  1016   182    15 

c  2
------------------------------------------------------------------------------------------------------
n  2 |     1     2     1
n  3 |     3     2     2     3
n  4 |     6     4     0     4     6
n  5 |    10    11     6     6    11    10
n  6 |    15    26    20    16    20    26    15
n  7 |    21    52    54    45    45    54    52    21
n  8 |    28    92   126   118   112   118   126    92    28
n  9 |    36   149   260   286   277   277   286   260   149    36
n 10 |    45   226   486   636   661   660   661   636   486   226    45
n 11 |    55   326   840  1301  1500  1546  1546  1500  1301   840   326    55
n 12 |    66   452  1364  2470  3210  3510  3584  3510  3210  2470  1364   452    66
n 13 |    78   607  2106  4398  6467  7656  8128  8128  7656  6467  4398  2106   607    78
n 14 |    91   794  3120  7416 12302 15958 17895 18480 17895 15958 12302  7416  3120   794    91
n 15 |   105  1016  4466 11941 22211 31730 38052 41007 41007 38052 31730 22211 11941  4466  1016   105 

c  3
------------------------------------------------------------------------------------------------------
n  3 |     1     3     3     1
n  4 |     4     6     4     6     4
n  5 |    10    11     6     6    11    10
n  6 |    20    24    16     0    16    24    20
n  7 |    35    55    45    28    28    45    55    35
n  8 |    56   118   118    92    76    92   118   118    56
n  9 |    84   231   286   256   220   220   256   286   231    84
n 10 |   120   416   636   654   598   568   598   654   636   416   120
n 11 |   165   699  1301  1552  1532  1467  1467  1532  1552  1301   699   165
n 12 |   220  1110  2470  3428  3712  3686  3644  3686  3712  3428  2470  1110   220
n 13 |   286  1683  4398  7072  8506  8923  8956  8956  8923  8506  7072  4398  1683   286
n 14 |   364  2456  7416 13706 18430 20724 21502 21652 21502 20724 18430 13706  7416  2456   364
n 15 |   455  3471 11941 25124 37813 46068 50084 51540 51540 50084 46068 37813 25124 11941  3471   455 

c  4
------------------------------------------------------------------------------------------------------
n  4 |     1     4     6     4     1
n  5 |     5    12    11    11    12     5
n  6 |    15    26    20    16    20    26    15
n  7 |    35    55    45    28    28    45    55    35
n  8 |    70   120   112    76     0    76   112   120    70
n  9 |   126   259   277   220   140   140   220   277   259   126
n 10 |   210   532   661   598   468   396   468   598   661   532   210
n 11 |   330  1026  1500  1532  1340  1157  1157  1340  1532  1500  1026   330
n 12 |   495  1860  3210  3712  3558  3216  3054  3216  3558  3712  3210  1860   495
n 13 |   715  3190  6467  8506  8924  8518  8080  8080  8518  8924  8506  6467  3190   715
n 14 |  1001  5214 12302 18430 21260 21568 20941 20584 20941 21568 21260 18430 12302  5214  1001
n 15 |  1365  8177 22211 37813 48188 52301 52705 52104 52104 52705 52301 48188 37813 22211  8177  1365 

c  5
------------------------------------------------------------------------------------------------------
n  5 |     1     5    10    10     5     1
n  6 |     6    20    26    24    26    20     6
n  7 |    21    52    54    45    45    54    52    21
n  8 |    56   118   118    92    76    92   118   118    56
n  9 |   126   259   277   220   140   140   220   277   259   126
n 10 |   252   560   660   568   396     0   396   568   660   560   252
n 11 |   462  1176  1546  1467  1157   744   744  1157  1467  1546  1176   462
n 12 |   792  2364  3510  3686  3216  2532  2164  2532  3216  3686  3510  2364   792
n 13 |  1287  4521  7656  8923  8518  7366  6387  6387  7366  8518  8923  7656  4521  1287
n 14 |  2002  8228 15958 20724 21568 20030 18006 17100 18006 20030 21568 20724 15958  8228  2002
n 15 |  3003 14300 31730 46068 52301 51932 48665 45958 45958 48665 51932 52301 46068 31730 14300  3003 

c  6
------------------------------------------------------------------------------------------------------
n  6 |     1     6    15    20    15     6     1
n  7 |     7    30    52    55    55    52    30     7
n  8 |    28    92   126   118   112   118   126    92    28
n  9 |    84   231   286   256   220   220   256   286   231    84
n 10 |   210   532   661   598   468   396   468   598   661   532   210
n 11 |   462  1176  1546  1467  1157   744   744  1157  1467  1546  1176   462
n 12 |   924  2520  3584  3644  3054  2164     0  2164  3054  3644  3584  2520   924
n 13 |  1716  5214  8128  8956  8080  6387  4116  4116  6387  8080  8956  8128  5214  1716
n 14 |  3003 10362 17895 21502 20941 18006 14220 12240 14220 18006 20941 21502 17895 10362  3003
n 15 |  5005 19734 38052 50084 52705 48665 41872 36443 36443 41872 48665 52705 50084 38052 19734  5005 

c  7
------------------------------------------------------------------------------------------------------
n  7 |     1     7    21    35    35    21     7     1
n  8 |     8    42    92   118   120   118    92    42     8
n  9 |    36   149   260   286   277   277   286   260   149    36
n 10 |   120   416   636   654   598   568   598   654   636   416   120
n 11 |   330  1026  1500  1532  1340  1157  1157  1340  1532  1500  1026   330
n 12 |   792  2364  3510  3686  3216  2532  2164  2532  3216  3686  3510  2364   792
n 13 |  1716  5214  8128  8956  8080  6387  4116  4116  6387  8080  8956  8128  5214  1716
n 14 |  3432 11088 18480 21652 20584 17100 12240     0 12240 17100 20584 21652 18480 11088  3432
n 15 |  6435 22737 41007 51540 52104 45958 36443 23504 23504 36443 45958 52104 51540 41007 22737  6435 

c  8
------------------------------------------------------------------------------------------------------
n  8 |     1     8    28    56    70    56    28     8     1
n  9 |     9    56   149   231   259   259   231   149    56     9
n 10 |    45   226   486   636   661   660   661   636   486   226    45
n 11 |   165   699  1301  1552  1532  1467  1467  1532  1552  1301   699   165
n 12 |   495  1860  3210  3712  3558  3216  3054  3216  3558  3712  3210  1860   495
n 13 |  1287  4521  7656  8923  8518  7366  6387  6387  7366  8518  8923  7656  4521  1287
n 14 |  3003 10362 17895 21502 20941 18006 14220 12240 14220 18006 20941 21502 17895 10362  3003
n 15 |  6435 22737 41007 51540 52104 45958 36443 23504 23504 36443 45958 52104 51540 41007 22737  6435 

c  9
------------------------------------------------------------------------------------------------------
n  9 |     1     9    36    84   126   126    84    36     9     1
n 10 |    10    72   226   416   532   560   532   416   226    72    10
n 11 |    55   326   840  1301  1500  1546  1546  1500  1301   840   326    55
n 12 |   220  1110  2470  3428  3712  3686  3644  3686  3712  3428  2470  1110   220
n 13 |   715  3190  6467  8506  8924  8518  8080  8080  8518  8924  8506  6467  3190   715
n 14 |  2002  8228 15958 20724 21568 20030 18006 17100 18006 20030 21568 20724 15958  8228  2002
n 15 |  5005 19734 38052 50084 52705 48665 41872 36443 36443 41872 48665 52705 50084 38052 19734  5005 

c 10
------------------------------------------------------------------------------------------------------
n 10 |     1    10    45   120   210   252   210   120    45    10     1
n 11 |    11    90   326   699  1026  1176  1176  1026   699   326    90    11
n 12 |    66   452  1364  2470  3210  3510  3584  3510  3210  2470  1364   452    66
n 13 |   286  1683  4398  7072  8506  8923  8956  8956  8923  8506  7072  4398  1683   286
n 14 |  1001  5214 12302 18430 21260 21568 20941 20584 20941 21568 21260 18430 12302  5214  1001
n 15 |  3003 14300 31730 46068 52301 51932 48665 45958 45958 48665 51932 52301 46068 31730 14300  3003 

c 11
------------------------------------------------------------------------------------------------------
n 11 |     1    11    55   165   330   462   462   330   165    55    11     1
n 12 |    12   110   452  1110  1860  2364  2520  2364  1860  1110   452   110    12
n 13 |    78   607  2106  4398  6467  7656  8128  8128  7656  6467  4398  2106   607    78
n 14 |   364  2456  7416 13706 18430 20724 21502 21652 21502 20724 18430 13706  7416  2456   364
n 15 |  1365  8177 22211 37813 48188 52301 52705 52104 52104 52705 52301 48188 37813 22211  8177  1365 

c 12
------------------------------------------------------------------------------------------------------
n 12 |     1    12    66   220   495   792   924   792   495   220    66    12     1
n 13 |    13   132   607  1683  3190  4521  5214  5214  4521  3190  1683   607   132    13
n 14 |    91   794  3120  7416 12302 15958 17895 18480 17895 15958 12302  7416  3120   794    91
n 15 |   455  3471 11941 25124 37813 46068 50084 51540 51540 50084 46068 37813 25124 11941  3471   455 

c 13
------------------------------------------------------------------------------------------------------
n 13 |     1    13    78   286   715  1287  1716  1716  1287   715   286    78    13     1
n 14 |    14   156   794  2456  5214  8228 10362 11088 10362  8228  5214  2456   794   156    14
n 15 |   105  1016  4466 11941 22211 31730 38052 41007 41007 38052 31730 22211 11941  4466  1016   105 

c 14
------------------------------------------------------------------------------------------------------
n 14 |     1    14    91   364  1001  2002  3003  3432  3003  2002  1001   364    91    14     1
n 15 |    15   182  1016  3471  8177 14300 19734 22737 22737 19734 14300  8177  3471  1016   182    15 

c 15
------------------------------------------------------------------------------------------------------
n 15 |     1    15   105   455  1365  3003  5005  6435  6435  5005  3003  1365   455   105    15     1</pre>
<p><em>Now</em> looking at these counts, it should be much more apparent there is a relationship between end point path counts of different path lengths.</p>
<p>Let&#8217;s start by looking at column 0. When you take into account mirroring and rotation of the quadrants, column 0 represents the &#8220;outer edge&#8221; of the square matrix of end point counts.</p>
<p>For example, of path length 8, these counts:</p>
<pre>c  0
------------------------------------------------------------------------------------------------------
n  0 |     1
n  1 |     1     1
n  2 |     1     2     1
n  3 |     1     3     3     1
n  4 |     1     4     6     4     1
n  5 |     1     5    10    10     5     1
n  6 |     1     6    15    20    15     6     1
n  7 |     1     7    21    35    35    21     7     1
<span style="color: #ff0000;">n  8 |     1     8    28    56    70    56    28     8     1 </span>
n  9 |     1     9    36    84   126   126    84    36     9     1
n 10 |     1    10    45   120   210   252   210   120    45    10     1
n 11 |     1    11    55   165   330   462   462   330   165    55    11     1
n 12 |     1    12    66   220   495   792   924   792   495   220    66    12     1
n 13 |     1    13    78   286   715  1287  1716  1716  1287   715   286    78    13     1
n 14 |     1    14    91   364  1001  2002  3003  3432  3003  2002  1001   364    91    14     1
n 15 |     1    15   105   455  1365  3003  5005  6435  6435  5005  3003  1365   455   105    15     1</pre>
<p>Are found here:</p>
<pre><span style="color: #ff0000;">00001 00008 00028 00056 00070 00056 00028 00008 00001</span>
<span style="color: #ff0000;">00008</span> 00042 00092 00118 00120 00118 00092 00042 <span style="color: #ff0000;">00008</span>
<span style="color: #ff0000;">00028</span> 00092 00126 00118 00112 00118 00126 00092 <span style="color: #ff0000;">00028</span>
<span style="color: #ff0000;">00056</span> 00118 00118 00092 00076 00092 00118 00118 <span style="color: #ff0000;">00056</span>
<span style="color: #ff0000;">00070</span> 00120 00112 00076 ***** 00076 00112 00120 <span style="color: #ff0000;">00070</span>
<span style="color: #ff0000;">00056</span> 00118 00118 00092 00076 00092 00118 00118 <span style="color: #ff0000;">00056</span>
<span style="color: #ff0000;">00028</span> 00092 00126 00118 00112 00118 00126 00092 <span style="color: #ff0000;">00028</span>
<span style="color: #ff0000;">00008</span> 00042 00092 00118 00120 00118 00092 00042 <span style="color: #ff0000;">00008</span>
<span style="color: #ff0000;">00001 00008 00028 00056 00070 00056 00028 00008 00001</span>
EndPointCount: 80
TotalWalkCount: 5916</pre>
<p>If the pattern of values in column 0 seem familiar, that&#8217;s because:</p>
<div style="font-weight: bold; color: red; padding: 20px; background-color: #ddd; margin-top: 15px; margin-bottom: 15px;">Observation-9: Column 0 of the transposed end point counts for all path length n is Pascal&#8217;s Triangle.</div>
<p>In other words, the outer edge of end point counts for path length n are the values in the nth row in Pascal&#8217;s Triangle.</p>
<p>At the very least it should be apparent why the first column of column 0 is always 1. That value represents the outermost tip of the end points. Which always only be reached by exactly one path. Or, for any paths of length n, there are four paths (NSEW) that are straight line paths that reach the four furthest corners permissible by a path of length n.</p>
<p>To generate column 0, we can define it (Pascal&#8217;s Triangle) as a recursive function (recurrence relation):<br />
Let&#8217;s call the function that generates column 0, f0. And n is the path length (down) and i is the column in this form (across)<br />
f0(n,i) = f0(n-1,i) + f0(n-1,i-1)</p>
<p>Here is an awk script which generates the values in this form. <a href="http://altdevblogaday.com/wp-content/uploads/2011/09/fcol01.awk">fcol0.awk</a></p>
<pre>
c  0 | f0(n,i) = f0(n-1,i) + f0(n-1,i-1)
------------------------------------------------------------------------------------------------------
n  0 |     1
n  1 |     1     1
n  2 |     1     2     1
n  3 |     1     3     3     1
n  4 |     1     4     6     4     1
n  5 |     1     5    10    10     5     1
n  6 |     1     6    15    20    15     6     1
n  7 |     1     7    21    35    35    21     7     1
n  8 |     1     8    28    56    70    56    28     8     1
n  9 |     1     9    36    84   126   126    84    36     9     1
n 10 |     1    10    45   120   210   252   210   120    45    10     1
n 11 |     1    11    55   165   330   462   462   330   165    55    11     1
n 12 |     1    12    66   220   495   792   924   792   495   220    66    12     1
n 13 |     1    13    78   286   715  1287  1716  1716  1287   715   286    78    13     1
n 14 |     1    14    91   364  1001  2002  3003  3432  3003  2002  1001   364    91    14     1
n 15 |     1    15   105   455  1365  3003  5005  6435  6435  5005  3003  1365   455   105    15     1
</pre>
<p>So if we now go back to path length 8, we can also predict the first column and only the following end points in green remain to be calculated:</p>
<pre><span style="color: #008000;"><span style="color: #ff0000;">00001</span> <span style="color: #ff0000;">00008</span> <span style="color: #ff0000;">00028</span> <span style="color: #ff0000;">00056</span> <span style="color: #ff0000;">00070</span></span> <span style="color: #ff0000;">00056 00028 00008 00001</span>
<span style="color: #008000;"><span style="color: #ff0000;">00008</span> 00042 <span style="color: #ff0000;">00092</span> <span style="color: #ff0000;">00118</span> <span style="color: #ff0000;">00120</span></span><span style="color: #ff0000;"> 00118 00092 00042 00008</span>
<span style="color: #008000;"><span style="color: #ff0000;">00028</span> 00092 00126 <span style="color: #ff0000;">00118</span> <span style="color: #ff0000;">00112</span></span> <span style="color: #ff0000;">00118 00126 00092 00028</span>
<span style="color: #008000;"><span style="color: #ff0000;">00056</span> 00118 00118 00092 <span style="color: #ff0000;">00076</span></span> <span style="color: #ff0000;">00092 00118 00118 00056</span>
<span style="color: #008000;"><span style="color: #ff0000;">00070</span> 00120 00112 00076</span> *****<span style="color: #ff0000;"> 00076 00112 00120 00070</span>
<span style="color: #ff0000;">00056 00118 00118 00092 00076</span> <span style="color: #ff0000;">00092 00118 00118 00056</span>
<span style="color: #ff0000;">00028 00092 00126 00118 00112</span> <span style="color: #ff0000;">00118 00126 00092 00028</span>
<span style="color: #ff0000;">00008 00042 00092 00118 00120</span> <span style="color: #ff0000;">00118 00092 00042 00008</span>
<span style="color: #ff0000;">00001 00008 00028 00056 00070</span> <span style="color: #ff0000;">00056 00028 00008 00001</span>
EndPointCount: 80
TotalWalkCount: 5916</pre>
<p>In the next part, we&#8217;ll look at the patterns of the other columns and how to predict the patterns for &#8220;future&#8221; columns for paths of greater lengths. Lots more to come!</p>
<p>But I&#8217;ll give you a hint if you want to start working the patterns out on your own:</p>
<div style="font-weight: bold; color: red; padding: 20px; background-color: #ddd; margin-top: 15px; margin-bottom: 15px;">Observation-10: All columns of the transposed end point counts for all path length n have a relationship to Pascal&#8217;s Triangle.</div>
<p>Mike.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/09/04/properties-of-self-avoiding-walks-part-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Okay, women of #gamedev, I&#8217;m calling you out. Where are you?</title>
		<link>http://www.altdevblogaday.com/2011/07/12/women-of-gamedev/</link>
		<comments>http://www.altdevblogaday.com/2011/07/12/women-of-gamedev/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 03:48:16 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
				<category><![CDATA[#AltDev Updates]]></category>

		<guid isPermaLink="false">http://altdevblogaday.com/?p=11242</guid>
		<description><![CDATA[<p>This is a quick post to pose a question: <strong>Why do we have so few women posting on #AltDevBlogADay?</strong></p>
<p>We have smart, successful women on here now. I would consider them good examples. I don&#8217;t want to call anyone out specifically because of their sex parts, but it&#8217;s hard not to notice that out of 184 authors, we have something like 6 women posting.</p>
<p><a href="http://www.altdevblogaday.com/2011/07/12/women-of-gamedev/" class="more-link">Read more on Okay, women of #gamedev, I&#8217;m calling you out. Where are you?&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>This is a quick post to pose a question: <strong>Why do we have so few women posting on #AltDevBlogADay?</strong></p>
<p>We have smart, successful women on here now. I would consider them good examples. I don&#8217;t want to call anyone out specifically because of their sex parts, but it&#8217;s hard not to notice that out of 184 authors, we have something like 6 women posting.</p>
<p>It&#8217;s <em>easy</em> to say that #gamedev is a male-dominated industry (so don&#8217;t bother, we know.) And while the numbers industry-wide might be lopsided (especially on the programming side, unfortunately), it sure <em>seems</em> that the actual industry ratio is higher. Surely, there is something else going on. I haven&#8217;t done a survey or anything, but I wonder if the ratio of men to women #gamedevs blogging is this high.</p>
<p>Ideally, we would <em>beat</em> the industry ratio here. As it is part of the intention of this site to give voice to #gamedevs (and our friends in related work), it would stand to reason that we&#8217;d be able to provide a platform for those whose voices are often drowned out.</p>
<p>Anyone have any ideas? Anyone know any other women #gamedevs that might want to post with us?</p>
<p>Mike.</p>
<p>PS: I don&#8217;t know if lists like this are good or not, but here you go anyway. FragDolls&#8217; <a href="http://www.fragdolls.com/index.php/blogs/detail/category/rhoulette/game_industry_women_to_know_2010">GAME INDUSTRY WOMEN TO KNOW: 2010</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/07/12/women-of-gamedev/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hello!</title>
		<link>http://www.altdevblogaday.com/2011/06/22/hello/</link>
		<comments>http://www.altdevblogaday.com/2011/06/22/hello/#comments</comments>
		<pubDate>Wed, 22 Jun 2011 17:19:55 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
		
		<guid isPermaLink="false">http://altdevblogaday.org/?p=9440</guid>
		<description><![CDATA[<p>Glad you made it to #AltDevBlogADay! Yes, we are having some server issues. Sorry about that!</p>
<p>If you&#8217;re just browsing, you can click on the monthly archives on the right panel. Those are still fresh and up to the minute!</p>
<p><a href="http://www.altdevblogaday.com/2011/06/22/hello/" class="more-link">Read more on Hello!&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Glad you made it to #AltDevBlogADay! Yes, we are having some server issues. Sorry about that!</p>
<p>If you&#8217;re just browsing, you can click on the monthly archives on the right panel. Those are still fresh and up to the minute!</p>
<p>I have just made this front page static temporarily to reduce the load on our server. And hopefully smooth things out a bit until I can work out a more permanent solution.</p>
<p>Thanks for sticking with us!</p>
<p>Mike.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/06/22/hello/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Playing with the theme</title>
		<link>http://www.altdevblogaday.com/2011/06/22/playing-with-the-theme/</link>
		<comments>http://www.altdevblogaday.com/2011/06/22/playing-with-the-theme/#comments</comments>
		<pubDate>Wed, 22 Jun 2011 08:12:04 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
		
		<guid isPermaLink="false">http://altdevblogaday.org/2011/06/22/playing-with-the-theme/</guid>
		<description><![CDATA[<p>Trying out a new theme (P2) &#8211; With a few tweaks (because I can&#8217;t help myself.) What works? What doesn&#8217;t? While you&#8217;re here, give me your feedback on the site. How do <b>you</b> think we can take it to the next level?</p>
<p><a href="http://www.altdevblogaday.com/2011/06/22/playing-with-the-theme/" class="more-link">Read more on Playing with the theme&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Trying out a new theme (P2) &#8211; With a few tweaks (because I can&#8217;t help myself.) What works? What doesn&#8217;t? While you&#8217;re here, give me your feedback on the site. How do <b>you</b> think we can take it to the next level?</p>
<p>Mike.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/06/22/playing-with-the-theme/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>#gamedev: We need to aim higher</title>
		<link>http://www.altdevblogaday.com/2011/06/06/gamedev-we-need-to-aim-higher/</link>
		<comments>http://www.altdevblogaday.com/2011/06/06/gamedev-we-need-to-aim-higher/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 16:03:21 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
		
		<guid isPermaLink="false">http://altdevblogaday.org/?p=5802</guid>
		<description><![CDATA[<h2>Sink or Swim?</h2>
<p>Game developers should know this isn’t a yes or no question. Unlike old school bankers stuck in the vainglorious days of million-dollar pool parties, or alarmist CEO’s who call for massive lay-off’s at the first sign of trouble, most game developers have had the privilege of seeing things from the underdog perspective. By their nature underdogs tend to challenge the status quo and eschew the easy answers. Rather than sink or swim we might make a sail, build a submarine, or find a hundred different ways to get out of the water. We’ve just never been as limited in our thinking as those other guys, right?</p>
<p><a href="http://www.altdevblogaday.com/2011/06/06/gamedev-we-need-to-aim-higher/" class="more-link">Read more on #gamedev: We need to aim higher&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<h2>Sink or Swim?</h2>
<p>Game developers should know this isn’t a yes or no question. Unlike old school bankers stuck in the vainglorious days of million-dollar pool parties, or alarmist CEO’s who call for massive lay-off’s at the first sign of trouble, most game developers have had the privilege of seeing things from the underdog perspective. By their nature underdogs tend to challenge the status quo and eschew the easy answers. Rather than sink or swim we might make a sail, build a submarine, or find a hundred different ways to get out of the water. We’ve just never been as limited in our thinking as those other guys, right?</p>
<p>Then why is it that game developers are beginning to drown in a culture of fear, or more specifically, a fear of change? Is it because the gaming world has gone too corporate and is no longer exclusive to small teams of genius misfits and creative underdogs? Is it because the demographics of game players—once made up almost exclusively of teen boys—has widened to include nearly everyone from 5-50? </p>
<p>There are people who would deny that it&#8217;s fear of change that keeps them where they are. There are those that are content with the status quo because they believe that they have a formula &#8220;that works&#8221; and there&#8217;s no good reason to risk a major change when they already successful with what they&#8217;re doing. At best, they&#8217;ll take a &#8220;wait and see&#8221; approach, confident that they can learn from others&#8217; mistakes and jump in if and when it becomes necessary. However, to those I say that the real risk is in waiting too long and letting the opportunity for change and grow pass you by.</p>
<blockquote><p>
“So there’s no question that they’re scared; they’re scared of screwing up a transition. Right now they have a model that they know works and they don’t know if other models will work for them. And, consequently, that’s why you see them moving so damned slowly.” &#8211; <a href="http://www.gamasutra.com/view/feature/6352/the_necessity_of_making_.php">Paul Hyman, The Necessity Of Making Free-to-Play Moves (gamasutra.com)</a>
</p></blockquote>
<p>Whatever the reasons for their fear and consequent sluggishness, game developers need to get back to their rebellious roots and do what they do best—being catalysts for innovation and evolution. They don’t need to merely embrace change; they need to create the products and ideals that change the gaming environment and keep it fresh. Game developers are, at their heart, futurists and this is what they need to do now—put themselves ahead of the times so that they can surpass the stale leadership and old models that are holding them back. Our collective destiny should not be held hostage to one-size-fits-all concepts or obsolete ideals. </p>
<h2>Game Development Needs Giants—And A Bigger Vision</h2>
<p><em>Nanos gigantium humeris insidentes.</em> Or, as famously quoted by Isaac Newton, “If I have seen further, it is only because I have stood on the shoulders of giants.” While many game developers continue to improve on existing ideas and platforms, others think in more revolutionary terms. There is abundant room in our industry for both the giants and those who would stand on their shoulders. Before individual developers can know which position suits them best, they have to recognize their own goals. What does making a great game mean? </p>
<ul>
<li>An uncompromising expression of artistic vision?</li>
<li>A fantastic diversion for a niche crowd?</li>
<li>Reaching the widest audience and making the most money?</li>
<li>Creating something transformative, that challenges the status quo?</li>
</ul>
<p>The possibilities are wide open. We need only an honest appraisal of our authentic motivations. Is it our goal as game developers to leave our mark on the world? To teach something to others, affect some cultural change, or explore the depths of our own creativity? Knowing the answers to these questions won’t make you a great game developer, but they will give you a clearer focus and help you avoid the distracting maze of less important questions that tend to waste creative talents. Fundamental questions like—What are games? Who should they appeal to? What defining boxes do they fit into? Do we fit our games to an audience or create an audience for our games? Are social, mobile, F2P games, etc., the future?—have been asked hundreds of times before. The simple answer to all of them is that as developers, if we invent the scenario we also get to define (or break) the rules and create the audience and outcome and drive the platform. We don’t have to be bogged down by any particular paradigm except the one that recognizes that change is constant, and that we can either help create that change or merely find ourselves adjusting to it in second-party fashion. </p>
<blockquote><p>
“Social network models are disrupting the traditional gaming industry with superior pricing, business and economic models.” &#8211; <a href="http://www.industrygamers.com/news/hardcore-social-gaming-disrupting-the-industry/">Chris Carvalho, Hardcore Social Gaming Disrupting the Industry (industrygamers.com)</a>
</p></blockquote>
<blockquote><p>
 “We have not been this uncertain about what’s coming next in the games industry since Epic’s been around for 20 years.” &#8211; <a href="http://www.industrygamers.com/news/epic-99-cent-apps-are-killing-us/">Mike Capps, Epic: 99-Cent Apps Are ‘Killing Us&#8217; (industrygamers.com)</a>
</p></blockquote>
<blockquote><p>
“The ripple effect is now that you *cannot* price a game correctly according to scope and effort, because so many games are *not* priced that way . . . &#8211; <a href="http://altdevblogaday.com/2011/04/26/the-race-to-the-bottom/">Jake Simpson, The Race to the Bottom (altdevblogaday.com)</a>
</p></blockquote>
<p>Change is going to happen because it must. The most sought after game developers in the future will be those who not only “adjust, adapt, and overcome” but who also take the lead in revolutionary new schools of thought and opportunity.</p>
<h2>Five Signs of the Old School Apocalypse</h2>
<ol>
<li>The independent game market is thriving. I would venture to guess that more indie games have been produced in the last three years than in the last 25 years combined. Or close to that anyway. Just a few short years ago, everyone was sure that the end of indie games was near. Instead, what we’ve seen is an absolute explosion of Indies. There is an ecosystem that can support independent game development, and right now it is on fire! iOS development is the obvious example.</li>
<p></p>
<li>Serious games are finally catching some momentum. Fundamentally, people now actually believe (rightly) that using games to teach and to learn about the world around us is one of the most effective methods we have at our disposal. We’ve just seen the beginning, but you can’t speak seriously about the future of education and training without considering how games will play a significant, if not the most significant, part in schools, learning centers, and independent studies.</li>
<p></p>
<li>Social and mobile games are rapidly growing in popularity. There’s been a tendency to look at the success of games in social and mobile spaces in a way that conflates the success of a particular type of game or genre of game with the space or platform. That’s completely backward in my opinion. The real transformation is not “social games” or “mobile games” (which are fairly meaningless descriptions), but rather the success of games in new spaces—the recognition of both a wider appeal beyond the traditional “core” audience and a reflection of the broader world. Games are simply and inevitably wherever people are.</li>
<p></p>
<li>Gamification. There is some debate over the word itself (much disliked among certain game developers) and the use of certain “techniques” like pointsification and friendsploitation (see also: <a href="http://www.bogost.com/writing/exploitationware.shtml">exploitionware</a> and alternatively, <a href="http://gameful.org/avantgame/what-is-gameful/">gameful design</a>). But there is no question that whatever you call it, and whether or not you understand it fully, or use it appropriately, games have been recognized for their ability to make a difference in the way people see and interact with the world. Whether used for marketing a product, engaging people in activities they’d otherwise find boring, or simply adding a bit of fun to something, the lessons we’ve learned in developing games are powerful and useful tools.</li>
<p></p>
<li>A ‘change the world’ philosophy is edging its way into game development. If anything makes it obvious that games have leveled up, it’s the belief that games can affect culture and attitudes—and not just in a happy Pollyanna way, either. Savvy game developers are beginning to see how games can help give people insight into their world, and that games don’t have to make light or fun of big problems in order to educate people. We have started to see games take their rightful place among other socially meaningful and artistic media like writing, painting, and film and like those, it can be used as a tool to humanize issues. Interactively engaging and learning about subjects like war, violence, loss, tragedy, poverty, clean water, etc. can put issues into perspective and give people the incentive and knowledge to make real change.</li>
</ol>
<p>Of course, the most significant change in games is their ongoing success. Video games have become an accepted and integral part of our larger culture, with applications that are continuously growing in both scope and potential.</p>
<p>It’s time for game developers to get out of their own way. To refuse to be boxed in by fear or creatively diminished by rigid, outdated schools of thought. We need to reclaim our genius, expand our visions, and get back to doing what we do best: Evolving our products and ourselves and taking the world along with us. </p>
<p>We need to aim higher. </p>
<p>Mike.</p>
<p><em>Thanks to Matt Yaney, Rob Crossley and Leigh Alexander for lending their valuable time, expertise and advice on clarifying my thoughts here. You rock.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/06/06/gamedev-we-need-to-aim-higher/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>June Update #1 (It&#8217;s about the authors)</title>
		<link>http://www.altdevblogaday.com/2011/06/06/june-update-1-its-about-the-authors/</link>
		<comments>http://www.altdevblogaday.com/2011/06/06/june-update-1-its-about-the-authors/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 07:23:30 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
		
		<guid isPermaLink="false">http://altdevblogaday.org/?p=7647</guid>
		<description><![CDATA[<p>Over the last five months or so, #AltDevBlogADay has grown into a healthy community of (mostly game) developers. In that time, we&#8217;ve seen 123 developers write 360 posts that shared personal experiences, ideas, stories and techniques representing only very small slice of what development is about. It&#8217;s been exciting and fun to try different things and meet and work with so many fantastically talented people. It&#8217;s also been incredibly rewarding to see so many people get value from that work.  In the past 30 days we&#8217;ve seen 152,460 unique visitors here (not including all of those that might have read an #AltDevBlogADay reprint on Gamasutra.com, Gamesindustry.biz or Develop-Online.net) and so many people on Facebook and Twitter and email letting me know when a post gives them either something useful or inspiring or validating. It&#8217;s not bad for five months, but I&#8217;d like to see that grow by an order of magnitude this year! I think this collection of talented individuals has so much to offer, not just other game developers, but the development world in general, that it would be a shame not to share that with as many people as I could.</p>
<p><a href="http://www.altdevblogaday.com/2011/06/06/june-update-1-its-about-the-authors/" class="more-link">Read more on June Update #1 (It&#8217;s about the authors)&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Over the last five months or so, #AltDevBlogADay has grown into a healthy community of (mostly game) developers. In that time, we&#8217;ve seen 123 developers write 360 posts that shared personal experiences, ideas, stories and techniques representing only very small slice of what development is about. It&#8217;s been exciting and fun to try different things and meet and work with so many fantastically talented people. It&#8217;s also been incredibly rewarding to see so many people get value from that work.  In the past 30 days we&#8217;ve seen 152,460 unique visitors here (not including all of those that might have read an #AltDevBlogADay reprint on Gamasutra.com, Gamesindustry.biz or Develop-Online.net) and so many people on Facebook and Twitter and email letting me know when a post gives them either something useful or inspiring or validating. It&#8217;s not bad for five months, but I&#8217;d like to see that grow by an order of magnitude this year! I think this collection of talented individuals has so much to offer, not just other game developers, but the development world in general, that it would be a shame not to share that with as many people as I could.</p>
<p>I think it&#8217;s about time that I started regular updates to help keep not just our authors, but everyone, informed of what&#8217;s happening here at #AltDevBlogADay.</p>
<p>This last month, you may have noticed the theme changes that have been happening. Expect another major revision there soon. But the important thing to share is that part of the process of developing a new theme was for me to figure out what the vision for this site really was. What&#8217;s important for me here?</p>
<p>In particular, you may have noticed that on the home page I changed the preview images to be images of the authors as well as adding a featured author section to the top of the site. Some of you might not like these changes so far. I&#8217;ll share with you what I wrote on our mailing list at the time based on some of the internal feedback I was getting. </p>
<blockquote><p>
#AltDevBlogADay is focused on the authors.  </p>
<p>It is important to me to focus on the voice and the individual.  The world has changed. We are no longer a world of faceless masses hidden behind corporations or governments or other institutions. The world has become more personal. We want to know who is behind the curtain. That is important. You cannot separate the message from the voice.  While that&#8217;s clearly my own view of our new collective culture, it is, I think, valid. And that&#8217;s what I want to reflect in the site.  Now, I also think that honestly some of you underestimate considerably how interesting you actually are. And that is what is compelling for me. Lots of things are said in posts that I disagree with, sometimes technically or from a design pov, but always I&#8217;m fascinated by the stories behind those posts. In the more personal history<br />
and context that lead to that view. </p>
<p>In addition, we learn and change and grow constantly. Our posts are not ever green. Nor should they be. They simply reflect what we accept and think now. In five or ten years so much of whatever we might say now will seem naive or even plainly wrong in retrospect. At least I hope so. I know that I hope that of myself, and it&#8217;s true to one degree or another of things I might&#8217;ve said or posted ten years ago.  But to stand up and say with your own voice what you believe right now and put it out there, that&#8217;s the interesting part. Recording some small part of everyone&#8217;s personal journey, that&#8217;s fascinating. And being willing to do it regularly often in spite of not knowing what really to say, or how best to say it or even if there will be real value there is in equal parts a little bit scary, a little bit stupid and a little bit brave. </p>
<p>While I&#8217;m open to suggestions on the form of the site and I&#8217;ve been happy to get the feedback on it up to now, the fundamental focus is what it is. At least for me.  As for the design appearing amateurish, I make no apologies for that. I&#8217;m learning and practicing and trying new things. That&#8217;s the nature of everything we do. And I don&#8217;t mind looking a little bit foolish in the process. The only way to learn is to do. And this is something I&#8217;d like to learn.  </p>
<p>Mike.
</p></blockquote>
<p>In addition, my hope is that by helping to giving real developers a voice and put them in front of you naked and open, that we will all learn from each other. </p>
<p>Since E3 is this week, it reminds me that one of the things that inspires me most is during conferences or other meetups when I&#8217;m able to sit down with my peers and friends and share ideas and just talk and have a little fun. All of the really best moments (and ideas) in my career have been when I&#8217;ve just been able to sit down and talk and listen and share with others. And I think the real vision for #AltDevBlogADay is to bring that late-night-at-a-conference-sharing feeling to us as a group every damn day instead of just a couple times a year. While I don&#8217;t think we&#8217;re quite there yet, I know we&#8217;ll get there. And I can&#8217;t wait!</p>
<p>Today, I&#8217;d like you let you know that we&#8217;ve been thinking hard on #AltDevBlogADay Phase 2. We want to raise the bar for what we doing and really bring more value to both the authors here and you guys, the readers. News on that soon enough. :)</p>
<p>So I hope you like what we&#8217;re doing here and you can support us by (re)tweeting or sharing on facebook, sharing your thoughts in the comments, or posting and linking from other development sites (like from reddit &#8211; I know there are a lot of you out there!) that you think might be interested in our posts. And of course, I encourage you to join us here as a regular author! </p>
<p>And comment below if you have any thoughts on how we can improve things. </p>
<p>Mike.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/06/06/june-update-1-its-about-the-authors/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Kids Day 2011</title>
		<link>http://www.altdevblogaday.com/2011/05/07/kids-day-2011/</link>
		<comments>http://www.altdevblogaday.com/2011/05/07/kids-day-2011/#comments</comments>
		<pubDate>Sat, 07 May 2011 07:26:55 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
		
		<guid isPermaLink="false">http://altdevblogaday.org/?p=5286</guid>
		<description><![CDATA[<p>Today is Kid&#8217;s Day. </p>
<p>Here at #AltDevBlogADay we&#8217;re going to celebrate by talking about a couple of the kids in our group to represent the many, many children loved and adored by parents who post on this site. And to remind ourselves that our kids probably teach us more than we could ever teach them.</p>
<p><a href="http://www.altdevblogaday.com/2011/05/07/kids-day-2011/" class="more-link">Read more on Kids Day 2011&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Today is Kid&#8217;s Day. </p>
<p>Here at #AltDevBlogADay we&#8217;re going to celebrate by talking about a couple of the kids in our group to represent the many, many children loved and adored by parents who post on this site. And to remind ourselves that our kids probably teach us more than we could ever teach them.</p>
<div style="min-height: 128px; margin-bottom: 5px">
<img style="float:left" src="http://www.gravatar.com/avatar/856b34c507fe7fe25a7ffd81e2954b6b.jpg?s=256&#038;d=retro" width="128px"></p>
<div style="font-size: 2em; line-height: 2.25em; margin-left: 140px; padding-top: 20px;">Isabelle, next-gen hacker</div>
<div style="font-size: 1.5em; margin-left: 140px">#AltDevParent: Mattias Jansson</div>
</div>
<p><img src="http://altdevblogaday.com/wp-content/uploads/2011/05/isabelle.jpg.scaled500.jpg" width="100%"></p>
<p>Since our daughter is only days old and I have still to wrap my head around the fact that I&#8217;m the father of the little gorgeoud creature above, I thought I&#8217;d just share some thoughts on paternal leave, and how it works here in Sweden. Parents get 480 days of paid paternal leave by the government, during which you get 80% (roughly) of your normal income as benefit. The days can be divided freely between the two parents, and if you split them equally the government give you some extra cash as equality bonus. You also get 10 extra days in connection with the birth, to allow you to stay at the hospital for a couple of days and get everything sorted at home. Oh, and of course all the care and services at the hospital is free.</p>
<p>The paternal leave is protected by law, the employer cannot deny you your days off. Not that I would have any issues with that, since Starbreeze is very parent-friendly. As an added perk, after the 10 days leave in connection with the birth I get one month where I can work only 80% but still get paid 100%. Yay!</p>
<p>All in all, I&#8217;m very happy with the Swedish way of doing things, and I&#8217;m really looking forward to taking care of my newborn daughter. I&#8217;m sure it will be a blast, and that I will actually end up with a healthy new way of looking at work and my passion for programming.</p>
<div style="min-height: 128px; margin-bottom: 5px">
<img style="float:left" src="http://www.gravatar.com/avatar/4515eddbe61795d7cdbe868aca5ff5f0.jpg?s=256&#038;d=retro" width="128px"></p>
<div style="font-size: 2em; line-height: 2.25em; margin-left: 140px; padding-top: 20px;">Dylan, Karl and Rose</div>
<div style="font-size: 1.5em; margin-left: 140px">#AltDevParent: Thaddaeus Frogley</div>
</div>
<p><img src="http://altdevblogaday.com/wp-content/uploads/2011/05/IMG_4265.jpeg" width="100%"></p>
<p>I have 3 kids, pictured (attached) playing in my parents garden from left to right: Dylan (9), Karl (6) and Rose (2).</p>
<p>Dylan was born severely premature, and has been diagnosed with <a href=" http://en.wikipedia.org/wiki/Dubowitz_syndrome">Dubowitz Syndrome</a>.</p>
<p>Karl is a normal little boy. Rose was not premature, but has some developmental delays that suggest she may also have mild Dubowitz.</p>
<p>The boys are at school right now, and I&#8217;m looking after Rose (I have the day off work). My wife is some kind of saint/ miracle worker looking after them full time! </p>
<p>This email has taken me something like 30mins to write just looking after Rose, and I have no idea how working from home can be productive with kids in the house!</p>
<p>The boys love playing DSi, Wii, and web-games. The &#8220;Lego&#8221; games (Batman, Star Wars, etc) are their favourites on DS, and on Wii they like to play Ben10, Gormiti, Sonic Colours, and Wii Fit.</p>
<p>As a parent, gamer, and game developer, I feel strongly that game age ratings should work, and be respected by both the industry and consumers. Adult themed games have as much a place in society as equivalent movies, and that it is a parents responsibility to audit what their children are exposed too, on TV, games, and the internet.</p>
<h2>Our kids</h2>
<p>Now get to bed! Clean your room! Do your homework! :)</p>
<p>Mike.</p>
<p>PS: My own daughter says I should add: &#8220;Good dads would want to give their daughters rides early tomorrow morning. And would want to give them some spending money.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/05/07/kids-day-2011/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ten years ago&#8230;</title>
		<link>http://www.altdevblogaday.com/2011/05/03/ten-years-ago-2/</link>
		<comments>http://www.altdevblogaday.com/2011/05/03/ten-years-ago-2/#comments</comments>
		<pubDate>Tue, 03 May 2011 08:38:34 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
		
		<guid isPermaLink="false">http://altdevblogaday.org/?p=5052</guid>
		<description><![CDATA[<p><script src="http://storify.com/mike_acton/ten-years-ago.js"></script><noscript>[<a href="http://storify.com/mike_acton/ten-years-ago" target="blank">View the story "Ten years ago..." on Storify]</a></noscript></p>
]]></description>
			<content:encoded><![CDATA[<p><script src="http://storify.com/mike_acton/ten-years-ago.js"></script><noscript>[<a href="http://storify.com/mike_acton/ten-years-ago" target="blank">View the story "Ten years ago..." on Storify]</a></noscript></p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/05/03/ten-years-ago-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>@mike_acton pokes around WebGL and jQuery</title>
		<link>http://www.altdevblogaday.com/2011/04/18/mike_acton-pokes-around-webgl-and-jquery/</link>
		<comments>http://www.altdevblogaday.com/2011/04/18/mike_acton-pokes-around-webgl-and-jquery/#comments</comments>
		<pubDate>Mon, 18 Apr 2011 03:23:19 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
		
		<guid isPermaLink="false">http://altdevblogaday.org/?p=4258</guid>
		<description><![CDATA[<p>My original plan for this post was to talk about a very cool lighting technique I learned only recently. Since I&#8217;ve been meaning to play with WebGL, I thought I could demonstrate the effect here, live in the browser. While I was preparing the demo, I did get the chance to learn a lot more about WebGL and at the same time, work a bit more about jQuery and javascript. And, as is often the case, got distracted from my original goal and spent most of my &#8220;posting time&#8221; just fooling around with the setup. So the lighting demo will have to wait for another time, but today I&#8217;ll share some of the jQuery plugin utilities I wrote that made some of the WebGL setup a little bit easier for me.</p>
<p><a href="http://www.altdevblogaday.com/2011/04/18/mike_acton-pokes-around-webgl-and-jquery/" class="more-link">Read more on @mike_acton pokes around WebGL and jQuery&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>My original plan for this post was to talk about a very cool lighting technique I learned only recently. Since I&#8217;ve been meaning to play with WebGL, I thought I could demonstrate the effect here, live in the browser. While I was preparing the demo, I did get the chance to learn a lot more about WebGL and at the same time, work a bit more about jQuery and javascript. And, as is often the case, got distracted from my original goal and spent most of my &#8220;posting time&#8221; just fooling around with the setup. So the lighting demo will have to wait for another time, but today I&#8217;ll share some of the jQuery plugin utilities I wrote that made some of the WebGL setup a little bit easier for me.</p>
<p>If, like me, you haven&#8217;t had much time to check out WebGL yet, Savas Ziplies has been writing an introductory series here on #AltDevBlogADay you might want to check out:</p>
<ul>
<li><a href="http://altdevblogaday.com/2011/02/14/webgl-part-1-a-new-challenger-appears/">WebGL &#8211; Part 1: A new challenger appears&#8230;</a></li>
<li><a href="http://altdevblogaday.com/2011/02/27/webgl-part-2-in-the-beginning-there-was/">WebGL &#8211; Part 2: In the beginning there was&#8230;</a></li>
</ul>
<div style="display:none">
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script><br />
<script type="text/javascript" src="/projects/macton-teapot/js/macton-utils.js"></script><br />
<script type="text/javascript" src="/projects/macton-teapot/js/macton-gl-utils.js"></script><br />
<script type="text/javascript" src="/projects/macton-teapot/js/webgl-utils.js"></script><br />
<script type="text/javascript" src="/projects/macton-teapot/js/matrix4x4.js"></script><br />
<script type="text/javascript" src="/projects/macton-teapot/js/cameracontroller.js"></script><br />
<script type="text/javascript" src="/projects/macton-teapot/js/demo.js"></script>
</div>
<h2>The demo</h2>
<p>For comparison, I&#8217;ve just rewritten Chromium teapot demo. Here&#8217;s the original WebGL version: <a href="https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/demos/google/shiny-teapot/index.html">shiny-teapot</a></p>
<p>Graphically there&#8217;s really no difference. (Click and drag teapot to rotate.)<br />
See the source: <a href="/projects/macton-teapot/js/demo.js">demo.js</a><br />
<canvas id="macton-teapot-canvas" width="500" height="500"></canvas></p>
<h2>The jQuery plugins</h2>
<p>In the process of working on many variations of the aforementioned lighting demo, there was a lot of WebGL housekeeping setup that I had to do over and over. Looking over the data in the source shader and model files, it seemed like all of that information was already there. I was just typing it in multiple times. And making multiple mistakes doing it! One of the first rules of usability is <b>The Default Behavior should be The Right Behavior, most of the time.</b> I didn&#8217;t find that to be true with the WebGL setup. It&#8217;s not a lot different from the typical OpenGL (or DirectX) interface in that regard.</p>
<p>However, since everything with WebGL is done in Javascript, and the shaders are compiled from text, I figured all the information is there to simplify the setup process and I wanted to try my hand at writing some jQuery plugins to do it. I&#8217;m no jQuery or javascript ninja, so this was also a good opportunity for me to play around a bit more there too.</p>
<p>I wrote three basic plugins:</p>
<ul>
<li> $.glProgram which handles loading and compiling of fragment and vertex shaders.</li>
<li> $.glModel which handles loading of JSON model files.</li>
<li> $.glTexture which handles loading images and building textures and cube maps from them.</li>
</ul>
<p>You can find the source of the plugins here: <a href="/projects/macton-teapot/js/macton-gl-utils.js">macton-gl-utils.js</a></p>
<h2>$.glProgram</h2>
<p>Loading a program with the plugin is very straightforward. Just specify the vertex and fragment shaders. The plugin will load the shader source files (from external files) and compile them into a gl program. The plugin will also scan the source and find all the <em>uniforms</em> and <em>attributes</em> automatically. The <em>uniform locations</em> will be cached along with the types used for both the <em>uniforms</em> and <em>attributes</em>. Because the locations and type information is now available, it can be used (later) to simplify the binding process.</p>
<p>Here&#8217;s how the teapot program is loaded with the plugin:<br />
You can also see the shader sources: <a href="/projects/macton-teapot/shaders/bump_reflect.fs">bump_reflect.fs</a>, <a href="/projects/macton-teapot/shaders/bump_reflect.vs">bump_reflect.vs</a></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">  var bump_reflect_program_config = 
  {
    VertexProgramURL:   './shaders/bump_reflect.vs',
    FragmentProgramURL: './shaders/bump_reflect.fs',
  };
  bump_reflect_program = new $.glProgram( gl, bump_reflect_program_config, ProgramLoaded );</pre></td></tr></table></div>

<p>Below is how it was loaded in the original demo. Note:</p>
<ul>
<li>The vertex and fragment program sources were defined inline. (They&#8217;re much easier to work with as separate source files.)</li>
<li>The uniforms locations and cached by name, even though that information is already available in the source</li>
<li>The attributes are bound by name. Again that information is available in the source. And there&#8217;s not likely to be something else you&#8217;re going to want to do with attributes other than bind them.</li>
<li>The source files and compiled and linked into a program manually. Even though (again), I&#8217;m not sure what else you&#8217;d want to do with them besides that.</li>
</ul>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">var bumpReflectVertexSource = [
    &quot;attribute vec3 g_Position;&quot;,
    &quot;attribute vec3 g_TexCoord0;&quot;,
    &quot;attribute vec3 g_Tangent;&quot;,
    &quot;attribute vec3 g_Binormal;&quot;,
    &quot;attribute vec3 g_Normal;&quot;,
    &quot;&quot;,
    &quot;uniform mat4 world;&quot;,
    &quot;uniform mat4 worldInverseTranspose;&quot;,
    &quot;uniform mat4 worldViewProj;&quot;,
    &quot;uniform mat4 viewInverse;&quot;,
    &quot;&quot;,
    &quot;varying vec2 texCoord;&quot;,
    &quot;varying vec3 worldEyeVec;&quot;,
    &quot;varying vec3 worldNormal;&quot;,
    &quot;varying vec3 worldTangent;&quot;,
    &quot;varying vec3 worldBinorm;&quot;,
    &quot;&quot;,
    &quot;void main() {&quot;,
    &quot;  gl_Position = worldViewProj * vec4(g_Position.xyz, 1.);&quot;,
    &quot;  texCoord.xy = g_TexCoord0.xy;&quot;,
    &quot;  worldNormal = (worldInverseTranspose * vec4(g_Normal, 1.)).xyz;&quot;,
    &quot;  worldTangent = (worldInverseTranspose * vec4(g_Tangent, 1.)).xyz;&quot;,
    &quot;  worldBinorm = (worldInverseTranspose * vec4(g_Binormal, 1.)).xyz;&quot;,
    &quot;  vec3 worldPos = (world * vec4(g_Position, 1.)).xyz;&quot;,
    &quot;  worldEyeVec = normalize(worldPos - viewInverse[3].xyz);&quot;,
    &quot;}&quot;
    ].join(&quot;\n&quot;);
&nbsp;
var bumpReflectFragmentSource = [
    &quot;#ifdef GL_ES\n&quot;,
    &quot;precision highp float;\n&quot;,
    &quot;#endif\n&quot;,
    &quot;const float bumpHeight = 0.2;&quot;,
    &quot;&quot;,
    &quot;uniform sampler2D normalSampler;&quot;,
    &quot;uniform samplerCube envSampler;&quot;,
    &quot;&quot;,
    &quot;varying vec2 texCoord;&quot;,
    &quot;varying vec3 worldEyeVec;&quot;,
    &quot;varying vec3 worldNormal;&quot;,
    &quot;varying vec3 worldTangent;&quot;,
    &quot;varying vec3 worldBinorm;&quot;,
    &quot;&quot;,
    &quot;void main() {&quot;,
    &quot;  vec2 bump = (texture2D(normalSampler, texCoord.xy).xy * 2.0 - 1.0) * bumpHeight;&quot;,
    &quot;  vec3 normal = normalize(worldNormal);&quot;,
    &quot;  vec3 tangent = normalize(worldTangent);&quot;,
    &quot;  vec3 binormal = normalize(worldBinorm);&quot;,
    &quot;  vec3 nb = normal + bump.x * tangent + bump.y * binormal;&quot;,
    &quot;  nb = normalize(nb);&quot;,
    &quot;  vec3 worldEye = normalize(worldEyeVec);&quot;,
    &quot;  vec3 lookup = reflect(worldEye, nb);&quot;,
    &quot;  vec4 color = textureCube(envSampler, lookup);&quot;,
    &quot;  gl_FragColor = color;&quot;,
    &quot;}&quot;
    ].join(&quot;\n&quot;);
&nbsp;
function loadShader(type, shaderSrc) {
    var shader = gl.createShader(type);
    if (shader == null) {
        return null;
    }
    // Load the shader source
    gl.shaderSource(shader, shaderSrc);
    // Compile the shader
    gl.compileShader(shader);
    // Check the compile status
    if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
        var infoLog = gl.getShaderInfoLog(shader);
        output(&quot;Error compiling shader:\n&quot; + infoLog);
        gl.deleteShader(shader);
        return null;
    }
    return shader;
}
&nbsp;
function initShaders() {
    var vertexShader = loadShader(gl.VERTEX_SHADER, bumpReflectVertexSource);
    var fragmentShader = loadShader(gl.FRAGMENT_SHADER, bumpReflectFragmentSource);
    // Create the program object
    var programObject = gl.createProgram();
    if (programObject == null) {
        output(&quot;Creating program failed&quot;);
        return;
    }
    gl.attachShader(programObject, vertexShader);
    gl.attachShader(programObject, fragmentShader);
    // Bind attributes
    gl.bindAttribLocation(programObject, 0, &quot;g_Position&quot;);
    gl.bindAttribLocation(programObject, 1, &quot;g_TexCoord0&quot;);
    gl.bindAttribLocation(programObject, 2, &quot;g_Tangent&quot;);
    gl.bindAttribLocation(programObject, 3, &quot;g_Binormal&quot;);
    gl.bindAttribLocation(programObject, 4, &quot;g_Normal&quot;);
    // Link the program
    gl.linkProgram(programObject);
    // Check the link status
    var linked = gl.getProgramParameter(programObject, gl.LINK_STATUS);
    if (!linked) {
        var infoLog = gl.getProgramInfoLog(programObject);
        output(&quot;Error linking program:\n&quot; + infoLog);
        gl.deleteProgram(programObject);
        return;
    }
    g_programObject = programObject;
    // Look up uniform locations
    g_worldLoc = gl.getUniformLocation(g_programObject, &quot;world&quot;);
    g_worldInverseTransposeLoc = gl.getUniformLocation(g_programObject, &quot;worldInverseTranspose&quot;);
    g_worldViewProjLoc = gl.getUniformLocation(g_programObject, &quot;worldViewProj&quot;);
    g_viewInverseLoc = gl.getUniformLocation(g_programObject, &quot;viewInverse&quot;);
    g_normalSamplerLoc = gl.getUniformLocation(g_programObject, &quot;normalSampler&quot;);
    g_envSamplerLoc = gl.getUniformLocation(g_programObject, &quot;envSampler&quot;);
    checkGLError();
}</pre></td></tr></table></div>

<h2>$.glModel</h2>
<p>Loading a model with the plugin is even easier than loading a program! Just specify the model JSON data. That&#8217;s it. The vertex streams in the JSON data are named, so the plugin can work out that those are attributes that need to (ultimately) be bound to a program and that information is cached. The types and strides are also specified in the JSON data, so the correct fixed array types (e.g. Float32Array) for the WebGL buffers are determined based on those types.</p>
<p>Here is how the teapot model is loaded with the plugin: (You can also see the json file for the teapot here: <a href="/projects/macton-teapot/models/teapot.json">teapot.json</a>)</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">teapot_model         = new $.glModel(   gl, './models/teapot.json',      ModelLoaded       );</pre></td></tr></table></div>

<p>Below is how it was loaded in the original demo. Note:</p>
<ul>
<li>The teapot model was stored inline as a javascript variable (much easier to work with as a separate json file). Not shown here for length.</li>
<li>The buffer sizes and types need to be worked out and bound even though that&#8217;s easily worked out from the source data.</li>
</ul>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">function initTeapot() {
    g_vbo = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER, g_vbo);
    gl.bufferData(gl.ARRAY_BUFFER,
                  teapotPositions.byteLength +
                  teapotNormals.byteLength +
                  teapotTangents.byteLength +
                  teapotBinormals.byteLength +
                  teapotTexCoords.byteLength,
                  gl.STATIC_DRAW);
    g_normalsOffset = teapotPositions.byteLength;
    g_tangentsOffset = g_normalsOffset + teapotNormals.byteLength;
    g_binormalsOffset = g_tangentsOffset + teapotTangents.byteLength;
    g_texCoordsOffset = g_binormalsOffset + teapotBinormals.byteLength;
    gl.bufferSubData(gl.ARRAY_BUFFER, 0, teapotPositions);
    gl.bufferSubData(gl.ARRAY_BUFFER, g_normalsOffset, teapotNormals);
    gl.bufferSubData(gl.ARRAY_BUFFER, g_tangentsOffset, teapotTangents);
    gl.bufferSubData(gl.ARRAY_BUFFER, g_binormalsOffset, teapotBinormals);
    gl.bufferSubData(gl.ARRAY_BUFFER, g_texCoordsOffset, teapotTexCoords);
&nbsp;
    g_elementVbo = gl.createBuffer();
    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, g_elementVbo);
    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, teapotIndices, gl.STATIC_DRAW);
    g_numElements = teapotIndices.length;
}</pre></td></tr></table></div>

<h2>$.glTexture</h2>
<p>Textures are a bit more complicated since there are a lot of user settings per texture that can&#8217;t be worked out from the source. For this plugin, the user settings for each texture are just moved into a config object. The details of setting up TextureParameters and ImageStoreParameters based on those is worked out in the obvious way. The textures are automatically created and bound after the images have been loaded.</p>
<p>Here is how the teapot bump texture is loaded with the plugin:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">  var bump_texture_config =
  {
    Type:      'TEXTURE_2D',
    ImageURL:  './images/bump.jpg',
    TexParameters: 
    {
      TEXTURE_MIN_FILTER: 'LINEAR',
      TEXTURE_MAG_FILTER: 'LINEAR',
      TEXTURE_WRAP_S:     'REPEAT',
      TEXTURE_WRAP_T:     'REPEAT'
    },
    PixelStoreParameters:
    {
      UNPACK_FLIP_Y_WEBGL: true
    },
  };
  bump_texture         = new $.glTexture( gl, bump_texture_config,         bump_textureLoaded );</pre></td></tr></table></div>

<p>Here is how the teapot environment map  is loaded with the plugin:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">  var env_texture_config =
  {
    Type: 'TEXTURE_CUBE_MAP',
    ImageURL: 
    [ 
      './images/skybox-posx.jpg',
      './images/skybox-negx.jpg',
      './images/skybox-posy.jpg',
      './images/skybox-negy.jpg',
      './images/skybox-posz.jpg',
      './images/skybox-negz.jpg' 
    ],
    ImageType: 
    [ 
      'TEXTURE_CUBE_MAP_POSITIVE_X',
      'TEXTURE_CUBE_MAP_NEGATIVE_X',
      'TEXTURE_CUBE_MAP_POSITIVE_Y',
      'TEXTURE_CUBE_MAP_NEGATIVE_Y',
      'TEXTURE_CUBE_MAP_POSITIVE_Z',
      'TEXTURE_CUBE_MAP_NEGATIVE_Z'
    ],
    TexParameters: 
    {
      TEXTURE_WRAP_S:     'CLAMP_TO_EDGE',
      TEXTURE_WRAP_T:     'CLAMP_TO_EDGE',
      TEXTURE_MIN_FILTER: 'LINEAR',
      TEXTURE_MAG_FILTER: 'LINEAR'
    },
    PixelStoreParameters:
    {
      UNPACK_FLIP_Y_WEBGL: false
    }
  };
  env_texture          = new $.glTexture( gl, env_texture_config,          env_textureLoaded  );</pre></td></tr></table></div>

<h2>Binding Attributes</h2>
<p>This is were things really start to get nice! Since the attributes and vertex streams are all cached by the $.glModel and the $.glProgram, all we need to do to bind them together is make one call and then pass the model to GL for drawing.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">    bump_reflect_program.BindModel( teapot_model, TeapotBumpReflectAttributeBindings );
    bump_reflect_program.DrawModel();</pre></td></tr></table></div>

<p>In order to automatically bind the model to the program (as above) a mapping from the names used in one (stream names in model) to the other (attribute names in shader source) must be provided. It looks like this:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">var TeapotBumpReflectAttributeBindings =
{ 
  Positions: 'g_Position', 
  Texcoords: 'g_TexCoord0', 
  Tangents:  'g_Tangent', 
  Binormals: 'g_Binormal',
  Normals:   'g_Normal'
};</pre></td></tr></table></div>

<p>However, one thing I noticed was that very often the names were <b>close</b>, but not exactly the same. I felt it shouldn&#8217;t be necessary to specify them when it&#8217;s obvious (as in the above example) what should be mapped to what. I wrote a quick utility that uses the <a href="http://www.merriampark.com/ld.htm ">Levenshtein Distance</a> between the two pairs of strings to find the best matches and build the above binding object automatically.</p>
<p>It&#8217;s used like this in the teapot demo: (The mapping above is created automatically here.)</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">  TeapotBumpReflectAttributeBindings = bump_reflect_program.CreateBestVertexBindings( teapot_model );</pre></td></tr></table></div>

<p>Here is how the attributes were bound and the model drawn in the original demo. Note:</p>
<ul>
<li>The stream offsets are tracked manually.</li>
<li>The attribute indices are supplied inline and correspond to the bindings in the program. Very easy to get out of sync if you&#8217;re changing around attributes a lot!</li>
</ul>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">    // Bind and set up vertex streams
    gl.bindBuffer(gl.ARRAY_BUFFER, g_vbo);
    gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
    gl.enableVertexAttribArray(0);
    gl.vertexAttribPointer(1, 3, gl.FLOAT, false, 0, g_texCoordsOffset);
    gl.enableVertexAttribArray(1);
    gl.vertexAttribPointer(2, 3, gl.FLOAT, false, 0, g_tangentsOffset);
    gl.enableVertexAttribArray(2);
    gl.vertexAttribPointer(3, 3, gl.FLOAT, false, 0, g_binormalsOffset);
    gl.enableVertexAttribArray(3);
    gl.vertexAttribPointer(4, 3, gl.FLOAT, false, 0, g_normalsOffset);
    gl.enableVertexAttribArray(4);
    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, g_elementVbo);
    checkGLError();
    gl.drawElements(gl.TRIANGLES, g_numElements, gl.UNSIGNED_SHORT, 0);</pre></td></tr></table></div>

<h2>Binding Uniforms</h2>
<p>Like attributes, uniforms are made much simpler. The type of each uniform is known from the source files (e.g. mat4 or sample2D) so there is really only one correct way to bind it and only one correct type to bind it with. Texture slots are given to textures automatically as they are bound and don&#8217;t need to be specified.</p>
<p>Binding the uniforms for the teapot looks like this with the plugins:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">    bump_reflect_program.BindUniform( 'world',                 model.elements );
    bump_reflect_program.BindUniform( 'worldInverseTranspose', worldInverseTranspose.elements );
    bump_reflect_program.BindUniform( 'worldViewProj',         mvp.elements );
    bump_reflect_program.BindUniform( 'viewInverse',           viewInverse.elements );
    bump_reflect_program.BindUniform( 'normalSampler',         bump_texture );
    bump_reflect_program.BindUniform( 'envSampler',            env_texture );</pre></td></tr></table></div>

<p>Here is how the uniforms were bound in the original demo. Note:</p>
<ul>
<li>Separate variables to cache the uniform locations had to be kept. Even though you would <b>always</b> want that to be done.</li>
<li>The type of the fixed array had to be specified (e.g. Float32Array) even though there is only one likely acceptable type given the attribute type in the source file (e.g. mat4)</li>
<li>Texture indices are bound manually. Easy to break if you&#8217;re changing texture and sampler setups a lot!</li>
</ul>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">    // Set up uniforms
    gl.uniformMatrix4fv(g_worldLoc, gl.FALSE, new Float32Array(model.elements));
    gl.uniformMatrix4fv(g_worldInverseTransposeLoc, gl.FALSE, new Float32Array(worldInverseTranspose.elements));
    gl.uniformMatrix4fv(g_worldViewProjLoc, gl.FALSE, new Float32Array(mvp.elements));
    gl.uniformMatrix4fv(g_viewInverseLoc, gl.FALSE, new Float32Array(viewInverse.elements));
    gl.activeTexture(gl.TEXTURE0);
    gl.bindTexture(gl.TEXTURE_2D, g_bumpTexture);
    gl.uniform1i(g_normalSamplerLoc, 0);
    gl.activeTexture(gl.TEXTURE1);
    gl.bindTexture(gl.TEXTURE_CUBE_MAP, g_envTexture);
    gl.uniform1i(g_envSamplerLoc, 1);</pre></td></tr></table></div>

<h2>End</h2>
<p>You&#8217;re welcome to use the plugins if you like. For me, it was mostly an exercise to get to know WebGL for the first time and to learn a bit more about jQuery and javascipt. There are also some WebGL &#8220;frameworks&#8221; out there that also do manage this kind of setup for you, but there&#8217;s nothing like doing it yourself (at least once) to learn how it&#8217;s done.</p>
<p>Mike.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/04/18/mike_acton-pokes-around-webgl-and-jquery/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>#gamedev @mike_acton&#8217;s soft skills self-test</title>
		<link>http://www.altdevblogaday.com/2011/04/01/gamedev-mike_actons-soft-skills-self-test/</link>
		<comments>http://www.altdevblogaday.com/2011/04/01/gamedev-mike_actons-soft-skills-self-test/#comments</comments>
		<pubDate>Fri, 01 Apr 2011 07:58:31 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
		
		<guid isPermaLink="false">http://altdevblogaday.org/?p=2973</guid>
		<description><![CDATA[<p><script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script><br />
<script type="text/javascript" src="/projects/softskills/js/softskills.js"></script></p>
<link type="text/css"          href="/projects/softskills/css/softskills.css" rel="stylesheet" >
<p>This post started last week as a conversation over beers with a good friend of mine. We wanted to figure out:</p>
<ul>
<li> What soft skills are important for game developers. In any position, from intern to CEO. Programmers and artists. Designers and animators. Everyone.</li>
</ul>
</link>
<p><a href="http://www.altdevblogaday.com/2011/04/01/gamedev-mike_actons-soft-skills-self-test/" class="more-link">Read more on #gamedev @mike_acton&#8217;s soft skills self-test&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p><script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script><br />
<script type="text/javascript" src="/projects/softskills/js/softskills.js"></script></p>
<link    type="text/css"          href="/projects/softskills/css/softskills.css" rel="stylesheet" >
<p>This post started last week as a conversation over beers with a good friend of mine. We wanted to figure out:</p>
<ul>
<li> What soft skills are important for game developers. In any position, from intern to CEO. Programmers and artists. Designers and animators. Everyone.</li>
<li> How could we figure out the relative importance for those skills?</li>
<li> How could someone use a self-evaluation to gain some insight into skills that are important for them to work on?</li>
<li> How could we make that self-evaluation a less-random and totally arbitrary process?</li>
</ul>
<p>After sharing his ideas and practices with me, I decided to make some adjustments and create my own. </p>
<p>Oh and since I was also thinking about how I could make a more interactive post as well, this is the result:</p>
<p><noscript><br />
Oh, yeah. You definitely need javascript enabled to see this.<br />
</noscript></p>
<div id="stage">
<div id="scene" class="unselectable">
<div id="scene-header">
<div>Soft skills </div>
<div id="title">&#8230;</div>
<p>          <img id="loading" src="/projects/softskills/data/load-spinner.gif" />
      </div>
<div id="message">
      </div>
<div id="lines">
<div class="line">
<div id="question-0" class="question"></div>
</p></div>
<div class="line">
<div id="question-1" class="question"></div>
</p></div>
</p></div>
<div id="scene-footer">
<div class="status"></div>
<div id="question-undo" class="button">Undo choice</div>
<div id="question-skip" class="button">Skip this choice</div>
</p></div>
</p></div>
<div id="results">
<div id="results-develop"></div>
<div id="results-best"></div>
<div id="results-worst"></div>
<div id="results-part-1"></div>
<div id="results-part-2"></div>
</p></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/04/01/gamedev-mike_actons-soft-skills-self-test/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>(Audio Post) Antisocial games and Zynga sequels</title>
		<link>http://www.altdevblogaday.com/2011/03/09/audio-post-antisocial-games-and-zynga-sequels/</link>
		<comments>http://www.altdevblogaday.com/2011/03/09/audio-post-antisocial-games-and-zynga-sequels/#comments</comments>
		<pubDate>Wed, 09 Mar 2011 08:58:40 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
		
		<guid isPermaLink="false">http://altdevblogaday.org/?p=1642</guid>
		<description><![CDATA[<p>Time again for another audio post. <a href="http://altdevblogaday.com/2011/02/25/audio-post-our-model-of-the-world-and-games/">Last time</a> I teamed up with <a href="http://altdevblogaday.com/author/matt-yaney/">Matt Yaney</a> on his day, so today he has joined me for mine.</p>
<p>This time we take a look at two articles that we had both read recently and discussed some of our thoughts on them. And by that I mean that we largely ignore them and talk about what we want anyway. :)</p>
<p><a href="http://www.altdevblogaday.com/2011/03/09/audio-post-antisocial-games-and-zynga-sequels/" class="more-link">Read more on (Audio Post) Antisocial games and Zynga sequels&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Time again for another audio post. <a href="http://altdevblogaday.com/2011/02/25/audio-post-our-model-of-the-world-and-games/">Last time</a> I teamed up with <a href="http://altdevblogaday.com/author/matt-yaney/">Matt Yaney</a> on his day, so today he has joined me for mine.</p>
<p>This time we take a look at two articles that we had both read recently and discussed some of our thoughts on them. And by that I mean that we largely ignore them and talk about what we want anyway. :)</p>
<p><em>Note: Sorry about the audio quality. Matt&#8217;s a little blown out in these recordings. We tried something different to make up for last time and we way over-compensated. Next time it&#8217;ll be perfect. Either that, or we&#8217;ll find a new and even more interesting way to screw it up. ;)<br />
</em></p>
<p><strong>Article #1:</strong> <a href="http://www.gameproducer.net/2011/03/04/anti-social-games-defined/">Anti-Social Games Defined [gameproducer.net]</a> </p>
<p><a href="http://altdevblogaday.com/wp-content/uploads/2011/03/antisocial_edit.mp3" class="wpaudio">(Mike and Matt) Anti-Social Games</a></p>
<p><strong>Article #2:</strong> <a href="http://venturebeat.com/2011/03/01/farmville-2-why-zynga-needs-to-start-making-sequels-fast/">FarmVille 2? Why Zynga needs to start making sequels, fast [venturebeat.com]</a> </p>
<p><a href="http://altdevblogaday.com/wp-content/uploads/2011/03/zynga_edit.mp3" class="wpaudio">(Mike and Matt) Zynga Sequels</a></p>
<p>Thanks again for listening!</p>
<p>Mike.</p>
<p>PS: I know that some of you prefer the written posts. And there have been some requests for transcriptions so you can skim these faster. Which I&#8217;d be happy to provide if someone wanted to volunteer to write them up for us :) But really, for us these audio posts give the opportunity to speak our minds in a more natural way without the much more self-critical editing of the written word. Of course, we&#8217;re not abandoning our written posts &#8211; it&#8217;s just been fun to do these as well! And if you <em>really</em> don&#8217;t like it, I&#8217;ll refer you back to the image on the very <a href="http://altdevblogaday.com/2011/01/15/it-begins/">first post on this blog:</a></p>
<p><img src="http://altdevblogaday.com/wp-content/uploads/2011/01/some_satisfaction-300x276.png" width="375" height="345"/></p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/03/09/audio-post-antisocial-games-and-zynga-sequels/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>#AltDevUnconference (Burbank)</title>
		<link>http://www.altdevblogaday.com/2011/02/27/altdevunconference-burbank/</link>
		<comments>http://www.altdevblogaday.com/2011/02/27/altdevunconference-burbank/#comments</comments>
		<pubDate>Sun, 27 Feb 2011 21:01:25 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
		
		<guid isPermaLink="false">http://altdevblogaday.org/?p=1305</guid>
		<description><![CDATA[<p><strong>Last night was a blast!</strong></p>
<p>The first #AltDevUnconference was in Burbank, CA and it was great fun. We met new people. We talked. We exchanged ideas. We drank an average of three beers each. (I can tell you that exactly, since the bar tab was included in attendance.) </p>
<p><a href="http://www.altdevblogaday.com/2011/02/27/altdevunconference-burbank/" class="more-link">Read more on #AltDevUnconference (Burbank)&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p><strong>Last night was a blast!</strong></p>
<p>The first #AltDevUnconference was in Burbank, CA and it was great fun. We met new people. We talked. We exchanged ideas. We drank an average of three beers each. (I can tell you that exactly, since the bar tab was included in attendance.) </p>
<p><strong>Nothing ever goes as planned</strong></p>
<p>We did have some problems with the venue. They accidentally double-booked our room! Luckily, we were able to work out something with the management and create a space for ourselves down on the main floor. It was a little bit noisy with the UFC fight going on at the same time (or as it was also referred to, &#8220;sweaty man wrestling&#8221;) but I think we made the best of the situation and still had a great time. We adapted the plan quickly and eventually settled on some smaller rotating groups that were able to talk and share.</p>
<p>We definitely earned the &#8220;un&#8221; in &#8220;unconference&#8221; &#8211; But when Rachel Blum and I imagined this event, we really had no idea how it was going to work or what we were doing. (And speaking for myself, I&#8217;m still pretty sure I have no idea what I&#8217;m doing when it comes to planning something like this &#8211; I have a much healthier respect now for the people who put on the big conferences and still get them to run smoothly!)</p>
<p><strong>What went down?</strong></p>
<p>It become clear really quickly that my original plan for some rapid-fire group presentations wasn&#8217;t going to work in our new space, so we adapted. For most of the night, we went through rounds of group discussions on various topics. I have been working with my own team at Insomniac on similar exercises, so I cribbed pretty heavily from those. Some examples of the topics we discussed:</p>
<ul>
<li>What will games look like in 10 years?</li>
<li>What&#8217;s the difference between art and advertisement? Where do games fit in to that?</li>
<li>What are you afraid of and how do you use it to drive the creative process?</li>
<li>What&#8217;s the &#8216;ideal&#8217; user interface for games?</li>
<li>Gamification: Does it really make everything better?</li>
<li>Feminism and games: Do you really want to define your audience primarily by their sex?</li>
</ul>
<p>There were a lot of really great ideas generated. Which led to a ton of really interesting tangent conversations. </p>
<p><strong>Who was there?</strong></p>
<p>We had a pretty good mix of developers from different specialties and experience levels. We probably had more programmers than any other discipline, but that&#8217;s probably more to do being the group that Rachel and I interact with most often with, rather than specific to the content of the evening.</p>
<p>Dennis Crow was good enough to share some of his pictures from last night. (I&#8217;ll post more as we gather them up.)</p>
<p><img width="100%" src="http://altdevblogaday.com/wp-content/uploads/2011/02/183341_10150106202154286_515829285_6041983_1728165_n.jpg" /><br />
<img width="100%" src="http://altdevblogaday.com/wp-content/uploads/2011/02/183680_10150106202304286_515829285_6041986_6634331_n.jpg" /><br />
<img width="100%" src="http://altdevblogaday.com/wp-content/uploads/2011/02/184392_10150106201874286_515829285_6041975_5829121_n.jpg" /><br />
<img width="100%" src="http://altdevblogaday.com/wp-content/uploads/2011/02/184794_10150106201999286_515829285_6041979_3210771_n.jpg" /><br />
<img width="100%" src="http://altdevblogaday.com/wp-content/uploads/2011/02/190583_10150106201699286_515829285_6041973_8209418_n.jpg" /></p>
<p><strong>The Budget and our Sponsor</strong></p>
<p>The event went way over-budget. Largely due to the fact that we had to rent the space on the main floor on a fight-night. I ended up covering an extra few hundred dollars personally, but what really saved our asses was our sponsor. In retrospect, I can say that it simply would not have been possible without the sponsorship from Visceral Games. Thanks, guys! You really helped to make what could have been a disaster into a good night for everyone.</p>
<p><img width="100%" src="http://altdevblogaday.com/wp-content/uploads/2011/02/Visceral.png" /></p>
<p><strong>More?</strong></p>
<p>I&#8217;m rushing out to catch my plane to San Francisco for GTC and GDC this week, but I wanted to get this quick update out before I took off. I&#8217;d like to gather up thoughts and stories from our attendees and share those with you later though! So stay tuned.</p>
<p>Mike.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/02/27/altdevunconference-burbank/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>A fun hack: iPad to FPGA data-passing</title>
		<link>http://www.altdevblogaday.com/2011/02/15/a-fun-hack-ipad-to-fpga-data-passing/</link>
		<comments>http://www.altdevblogaday.com/2011/02/15/a-fun-hack-ipad-to-fpga-data-passing/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 09:31:31 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
		
		<guid isPermaLink="false">http://altdevblogaday.org/?p=657</guid>
		<description><![CDATA[<p>Nothing ground-breaking today, but it is a fun little hack that I&#8217;ve been using lately.</p>
<p>One of my personal hobbies is developing random stuff on FPGAs. I find hardware development (as much as FPGA is that) a fun diversion from game development. I&#8217;m a strong believer that a huge number of software issues (especially related to concurrency) are well-solved problems in the hardware space and a huge variety of common hardware solutions can be applied to software. Not to mention that a better understanding of what software actually, ultimately does informs good software and data design choices in general.</p>
<p><a href="http://www.altdevblogaday.com/2011/02/15/a-fun-hack-ipad-to-fpga-data-passing/" class="more-link">Read more on A fun hack: iPad to FPGA data-passing&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Nothing ground-breaking today, but it is a fun little hack that I&#8217;ve been using lately.</p>
<p>One of my personal hobbies is developing random stuff on FPGAs. I find hardware development (as much as FPGA is that) a fun diversion from game development. I&#8217;m a strong believer that a huge number of software issues (especially related to concurrency) are well-solved problems in the hardware space and a huge variety of common hardware solutions can be applied to software. Not to mention that a better understanding of what software actually, ultimately does informs good software and data design choices in general.</p>
<p>But a while back I realized the same was true in reverse. While developing some more useless gadgetry, I noticed that I was constantly rebuilding and reloading the ROM when I was just updating a few tweak variables. It occurred to me (obvious in retrospect) that this is exactly the same problem we face every day in game engine development. So why can&#8217;t I solve it the same way? But then I didn&#8217;t really do anything about it for a long time.</p>
<p>Last year though, something changed. I was sitting on my couch with my iPad, playing with iCircuit (which is an awesome app, BTW &#8211; you should totally check it out) and I thought, &#8220;It would be really awesome if I could just update some of my variables while I&#8217;m lazing around here on the couch instead of walking <em>way </em>over there to my desk.&#8221; [Note: One can not over-value general laziness as a motivating factor. My desk was literally 5 feet from the couch.] Plus, you know, it would just be <strong>cool</strong>.</p>
<p>My first thought was that I could write a custom communication app for the iPad and add some kind of wifi module to the FPGA and get something like this:</p>
<p><img width="100%" src="/wp-content/uploads/2011/02/wifi_11.png" /></p>
<p>But then I realized something:</p>
<ul>
<li> Apple makes it obnoxiously difficult to write an app &#8220;just for fun&#8221; on one of their devices. The hoops you need to jump through with certificates, etc. just to run something on your own device are ridiculous. I&#8217;ve written one complete iOS app previously and really, I don&#8217;t feel compelled to do it again.</li>
</ul>
<p>Briefly I considered picking up one of those knock-off Android tablets (this was before the Galaxy came out) for like $150 bucks. That momentarily seemed like a good idea, but then I realized something else:</p>
<ul>
<li> More than 99% of the time, my FPGAs are directly hooked up to my PC when I&#8217;m working on them. Which is obvious, since I&#8217;m always pushing updates to the device. </li>
</ul>
<p>So, I decided to go down a simpler path. (Well, technically way more complicated, but simpler to implement anyway.)</p>
<p><img width="100%" src="/wp-content/uploads/2011/02/wifi_21.png" /></p>
<p>Which basically exactly mirrors the kind of practice we use in engine development for live editing data from the game tools. So it&#8217;s a pretty familiar setup. Here&#8217;s the plan:</p>
<ul>
<li> On the PC, create an HTTP server which provides a REST(-like) interface to talk the FPGA over USB and can specify values to update. (Registers, memory or whatever you like.)</li>
<li> Create a web client (i.e. web page) that talks to the local server through the REST interface and can adjust variables as desired.</li>
<li> Launch web browser on iPad, load up web page on the local server and make adjustments.</li>
</ul>
<h2>HTTP Server</h2>
<p>The first thing I needed was for the PC to be able to speak to the FPGA over USB. This was a non-problem. In this case, I&#8217;m using a <a href="http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,400,789&#038;Prod=NEXYS2">Digilent Nexys2 board</a> and Digilent already provides an API to piggy-back on their USB interface &#8211; <a href="http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,66,828&#038;Prod=ADEPT2">Adept SDK 2</a>.</p>
<p><img width="100%" src="/wp-content/uploads/2011/02/nexys2.png" /></p>
<p>Next, I needed to set up an HTTP server and link to the USB communication functions. For a server, I chose to go with <a href="http://code.google.com/p/mongoose/">mongoose</a>. For three reasons:</p>
<ol>
<li> It&#8217;s very simple. Only a single file to build.</li>
<li> It&#8217;s totally hackable. I can do pretty much whatever I want and I don&#8217;t need to figure out a bunch of complex configuration to do something very simple. </li>
<li> I was already familiar with it.</li>
</ol>
<p>I wrote I little project that linked in mongoose, linked in the Adept SDK library, and provided a couple of example REST methods that I could use to test. Here are the functions that I set up:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">  mg_set_uri_callback<span style="color: #008000;">&#40;</span> s_MongooseContext, <span style="color: #FF0000;">&quot;/SetDeviceRegister&quot;</span>, <span style="color: #000040;">&amp;</span>VGATestServer<span style="color: #008080;">::</span><span style="color: #007788;">HttpSetDeviceRegister</span>, <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  mg_set_uri_callback<span style="color: #008000;">&#40;</span> s_MongooseContext, <span style="color: #FF0000;">&quot;/GetDeviceRegister&quot;</span>, <span style="color: #000040;">&amp;</span>VGATestServer<span style="color: #008080;">::</span><span style="color: #007788;">HttpGetDeviceRegister</span>, <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  mg_set_uri_callback<span style="color: #008000;">&#40;</span> s_MongooseContext, <span style="color: #FF0000;">&quot;/Ping&quot;</span>,              <span style="color: #000040;">&amp;</span>VGATestServer<span style="color: #008080;">::</span><span style="color: #007788;">HttpPing</span>,              <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  mg_set_uri_callback<span style="color: #008000;">&#40;</span> s_MongooseContext, <span style="color: #FF0000;">&quot;/Shutdown&quot;</span>,          <span style="color: #000040;">&amp;</span>VGATestServer<span style="color: #008080;">::</span><span style="color: #007788;">HttpShutdown</span>,          <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  mg_set_uri_callback<span style="color: #008000;">&#40;</span> s_MongooseContext, <span style="color: #FF0000;">&quot;/Bin/*&quot;</span>,             <span style="color: #000040;">&amp;</span>VGATestServer<span style="color: #008080;">::</span><span style="color: #007788;">HttpBin</span>,               <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  mg_set_uri_callback<span style="color: #008000;">&#40;</span> s_MongooseContext, <span style="color: #FF0000;">&quot;/EnumDevices&quot;</span>,       <span style="color: #000040;">&amp;</span>VGATestServer<span style="color: #008080;">::</span><span style="color: #007788;">HttpEnumDevices</span>,       <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  mg_set_uri_callback<span style="color: #008000;">&#40;</span> s_MongooseContext, <span style="color: #FF0000;">&quot;/OpenDevice&quot;</span>,        <span style="color: #000040;">&amp;</span>VGATestServer<span style="color: #008080;">::</span><span style="color: #007788;">HttpOpenDevice</span>,        <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  mg_set_uri_callback<span style="color: #008000;">&#40;</span> s_MongooseContext, <span style="color: #FF0000;">&quot;/CloseDevice&quot;</span>,       <span style="color: #000040;">&amp;</span>VGATestServer<span style="color: #008080;">::</span><span style="color: #007788;">HttpCloseDevice</span>,       <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  mg_set_uri_callback<span style="color: #008000;">&#40;</span> s_MongooseContext, <span style="color: #FF0000;">&quot;/GetActiveDevice&quot;</span>,   <span style="color: #000040;">&amp;</span>VGATestServer<span style="color: #008080;">::</span><span style="color: #007788;">HttpGetActiveDevice</span>,   <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<p>A few things to note:</p>
<ul>
<li> It&#8217;s not truly REST since I have to manage a certain amount of state with multiple devices connected. But who cares? </li>
<li> There&#8217;s a Ping and a Shutdown method. Both I find invaluable for debugging purposes. To be able to test that the server is still running from the client page, and to shut it down remotely. </li>
<li> The SetDeviceRegister and GetDeviceRegister map directly to a register file on the FPGA in a straightforward way. Registers are referenced by index. It&#8217;s up to the device to determine what they mean.</li>
</ul>
<h2>Web client</h2>
<p>On the client-side, I knew I wanted to make a page that was kind of slick and iPad-like. I had previously seen the <a href="http://www.sencha.com/products/touch/">Sencha Touch javascript framework</a> and I had been meaning to poke around with that, so this was a good opportunity. I hacked together a page to test the simple functions exposed by the server:</p>
<p><img width="100%" src="/wp-content/uploads/2011/02/vga_ipad.png" /></p>
<p>Other things I&#8217;m using here:</p>
<ul>
<li> <a href="http://jquery.com/">jQuery</a> &#8211; Initially I had a couple of headaches between Sencha Touch and jQuery. But overall it wasn&#8217;t too bad since I wasn&#8217;t trying to do anything spectacular here.</li>
<li> <a href="http://stanlemon.net/projects/jgrowl.html">jGrowl</a> &#8211; A Growl-like plugin for jQuery. Super-handy for debugging and notifications.</li>
<li> The control widget there (the boxes represent bits) is using HTML canvas. Something else I wanted to mess around with while I was in there anyway.</li>
<li> And a really simple <a href="http://laktek.com/2008/10/27/really-simple-color-picker-in-jquery/">jQuery color picker</a> by Lakshan Perera</li>
</ul>
<p>Color picker:<br />
<img width="100%" src="/wp-content/uploads/2011/02/color_picker.png" /></p>
<p>One cool thing about Safari on the iPad is that I can add any webpage to the Home screen:</p>
<p><img width="100%" src="/wp-content/uploads/2011/02/add_to_home.png" /></p>
<p>&#8230;and have it appear like a native app:</p>
<p><img width="100%" src="/wp-content/uploads/2011/02/like_native.png" /></p>
<p>&#8230;and when viewed this way, the address bar is removed and it does look pretty native. At least enough for my purposes. Note: This is the reason I added the &#8220;Refresh&#8221; button on the bottom. I wanted to be able to run the app, but without the address bar there was no (obvious?) way to refresh the page.</p>
<p><img width="100%" src="/wp-content/uploads/2011/02/native1.png" /></p>
<p>As an added bonus, since the clients really just reflect the values that are stored on the device (and synchronize to any device changes) that means all clients stay in-sync in real-time. (Well, pretty quick, anyway.) So if I&#8217;m also running the web page on the PC, it will show the identical settings and if I change those settings from either client, the other will update immediately. Here&#8217;s the page running in Chrome on the PC:</p>
<p><img width="100%" src="/wp-content/uploads/2011/02/from_pc.png" /></p>
<h2>That&#8217;s pretty much it.</h2>
<p>Client talks to HTTP server. HTTP server talks to FPGA. I can now edit some register values in this sample app, see them updated live on the device and all the changes (even from the device itself) reflected live in the client views. Very handy. </p>
<p>In this test, the actual device isn&#8217;t doing much. It really just outputting a VGA signal and not much else. The background color is set to the specified color and there&#8217;s a test pattern that uses the bits set in the control. The batteries in my camera are dead or I&#8217;d take a picture for you. Maybe I&#8217;ll put one up later. (Not much to see though.)</p>
<p><strong>Source code:</strong></p>
<ul>
<li> <a href="/wp-content/uploads/2011/02/VGATest.zip">VGATest.zip</a> This is the VHDL source for the Digilent Nexys2. Project file included for Xilinx ISE 12.2 </li>
<li> <a href="/wp-content/uploads/2011/02/VGATestServer.zip ">VGATestServer.zip</a> This is the source for the HTTP server and the client web code (found in the Distro sub-directory) Solution file included for Visual Studio 2008.</li>
</ul>
<p>In some future posts I think I&#8217;ll talk about some of the even cooler fun things that you can do with this kind of setup and perhaps walk through the code in detail. For now, poke around. And have fun.</p>
<p>Mike.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/02/15/a-fun-hack-ipad-to-fpga-data-passing/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Sketch on the art of #gamedev</title>
		<link>http://www.altdevblogaday.com/2011/02/02/sketch-on-the-art-of-gamedev/</link>
		<comments>http://www.altdevblogaday.com/2011/02/02/sketch-on-the-art-of-gamedev/#comments</comments>
		<pubDate>Wed, 02 Feb 2011 06:29:00 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
		
		<guid isPermaLink="false">http://altdevblogaday.org/2011/02/02/sketch-on-the-art-of-gamedev/</guid>
		<description><![CDATA[<p>I&#8217;ve been thinking a lot recently about the art of game development. Both in the actual games and in the development of them. And what that means to me. It&#8217;s a topic that&#8217;s difficult for me to articulate clearly, but I will do it anyway. :)</p>
<p><a href="http://www.altdevblogaday.com/2011/02/02/sketch-on-the-art-of-gamedev/" class="more-link">Read more on Sketch on the art of #gamedev&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been thinking a lot recently about the art of game development. Both in the actual games and in the development of them. And what that means to me. It&#8217;s a topic that&#8217;s difficult for me to articulate clearly, but I will do it anyway. :)</p>
<p>Last week I was able to visit the Wilhelm Busch museum in Hannover, Germany. Something struck me as I walked around and admired the work. It was a catalyst for clarifying some of the ideas I&#8217;ve had floating around in my head for quite some time. As Andy (<a href="http://twitter.com/#!/Greenfaery">@greenfaery</a>) will attest to, after that moment no one could shut me up about my thoughts on the matter. And now I will subject you to them as well. Somewhat haphazardly to be sure. I&#8217;m not trying to convince you. Nor myself. Just trying to get my thoughts down.</p>
<p><strong>Form follows meaning</strong></p>
<p>It may surprise some to find that artistically I don&#8217;t subscribe to the idea that &#8220;form follows function.&#8221; I believe That both form <em>and </em>function follow meaning. This means that foremost, games should have something to say. They should be expressing a belief or idea or feeling (or something else.) This is specifically very different from trying to *elicit* a feeling from the player in some purposeful way. Games, as any great art, should stop the player emotionally or personally and they have to discover how they feel. If we are just trying to get everyone to feel the same way, that&#8217;s still function and not meaning. The question to ask is: &#8220;What are you trying to say?&#8221;</p>
<p><strong>Reflect what you believe in everything you do</strong></p>
<p>Game development itself is the same way. For example (for me), I want an engine to reflect a fundamental optimism and hope about the world and development. I want it to reflect a true belief in the medium of games. This drives my choices on a very practical level. In order to know which techical choices are better, I must know what I believe are the most important elements in a game, and in *our* games in particular. As opposed to games in general, or movies, or other possible uses. That belief should also be reflected in the UI and UX of the tools. Is it hopeful? Does it reflect games as a medium in itself? i.e. How can it be more like a game?</p>
<p>And even in my job as Core Director, it&#8217;s the same. What am I trying to say with my work? Everything I do must reflect those beliefs. That I believe in games as a medium. That I fundamentally believe that change is both necessary and good. That I believe that each individual can make a difference. That I believe that the most important thing you can do is help others grow. That I believe in asking myself and others way too many questions. :)</p>
<p><strong>Over-emphasizing the form</strong></p>
<p>I believe that we concern ourselves with the <em>form </em>of games way too much. When we compare games, we discuss genre stereotypes and technical bullet points. When we talk about it as developers, we dicuss game mechanics or code techniques. All have their place. And are certainly valid discussions. But we don&#8217;t discuss meaning, or purpose, nearly enough. And worse yet, when we *only* concern ourselves with the form, the result is often empty and superficial.</p>
<p>Games, or our work in general, should invade a private space in the player. It should reach in and grab them and help them learn something about themselves. Tools are ultimately no different in this regard, either. Helping the users of our tools discover not just a better form (more details, polishing up the graphics on Level 3, whatever) but something about themselves in the process is important. The former serves the latter. Those that truly believe that form follows function will find this particular point very difficult to swallow of course.</p>
<p><strong>Meaning requires understanding</strong></p>
<p>In large part our work is not about finding a solution. That is dwarfed by the effort required to truly define the problem. Even in very technical implementations (or perhaps especially so), many reasonable solutions exist and can be applied to some degree. But it&#8217;s defining the problem specifically to our needs that changes all the constraints and guides the possible results. As a simple example, if you take our conferences (like GDC, for instance) &#8211; in large part we discuss &#8216;solutions&#8217; meaning that we share a (hopefully) working answer to some problem we encountered. But have you ever noticed just how often those solutions are not applicable to your situation? Because the problem (for you) is different. But we de-emphasize that. In general, our presentations and results share the wrong thing. It&#8217;s the journey to finding that solution that was much more important. It&#8217;s the discovery of the *actual* problem that needed to be solved that is much more interesting.</p>
<p>Too often we look at problems superfically and try to apply fixed solutions to them. Jamming them in without much thought. In those cases we are not doing the work justice. Interestingly (at least for me), this is at the heart of what we&#8217;re calling data-oriented programming. More than anything, it&#8217;s about truly understanding what you&#8217;re working with and for. <a href="http://twitter.com/#!/nfalstein">@nfalstein</a> and <a href="http://twitter.com/#!/grumpygamer">@grumpygamer</a> recently shared their memories of defining a &#8220;puzzle dependency chart&#8221; format for the old LucasArts games. Which seems to share a lot of similarities to how I view data design. I suspect that&#8217;s not a coincidence.</p>
<p><strong>Viewpoints</strong></p>
<p>As background on this topic, I suggest reading The Viewpoints Book by Anne Bogart and Tina Landuau.</p>
<p>I believe that we can extend these viewpoints to speak for the medium of games. Using space and time and voice to reflect our meaning in much the same way as theatre or dance. But in a way that&#8217;s uniquely ours. In games space and time and voice are much more flexible. They can be dynamic. Architecture, for example, does not need to be a fixed function as it does in life &#8211; we can change it dynamically, in real time. Something which can not truly be done in the same way in any other form. As well, the choices of the player should *change* space and time and voice in a way that&#8217;s impossible anywhere else. In the broadest terms, we often try to be too much like other media, film in particular, and forget the awesome potential of games. Thus doing them a great disservice.</p>
<p><strong>Sketch</strong></p>
<p>While I leave most of these thoughts here undeveloped, and I&#8217;m wanting to rewrite and rework this post entirely, I think it&#8217;s in the spirit of this itself for me not to over-concern myself with the form too much and just get this sketch out there. Plenty of time for revision in the future. Especially because this post is already two days late. ;)</p>
<p>I invite your thoughts and sure, criticisms too.</p>
<p>Mike.</p>
<p><a href="http://twitter.com/#!/mike_acton">@mike_acton</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/02/02/sketch-on-the-art-of-gamedev/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Week 1: Round-up</title>
		<link>http://www.altdevblogaday.com/2011/01/24/week-1-round-up/</link>
		<comments>http://www.altdevblogaday.com/2011/01/24/week-1-round-up/#comments</comments>
		<pubDate>Mon, 24 Jan 2011 06:00:26 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
		
		<guid isPermaLink="false">http://altdevblogaday.org/2011/01/24/week-1-round-up/</guid>
		<description><![CDATA[<div>We&#8217;ve reached the end of the first week here at #AltDevBlogADay. It&#8217;s been really exciting to see such a great group of developers get together and share their experiences, ideas and feelings about the process. We&#8217;ve had a few bumps along the way (we&#8217;re still working out the site theme, hosting, RSS feed, and messaging issues) but overall it&#8217;s been a really fantastic experience so far!</div>
<div>We have eight days left in our first cycle (15 days, then we wrap back around.) I simply can&#8217;t wait to see what everyone else has up their sleeves to share.</div>
<div>Remember, if you&#8217;re interested in participating with us &#8211; hit me up on twitter (<a href="http://twitter.com/#!/mike_acton">@mike_acton</a>) or shoot me an email (<a href="mailto:macton@gmail.com">macton@gmail.com</a>) &#8211; We welcome devs from all walks of life. So far, we have programmers, artists, animators, designers, bizdev and audio peeps queued up to share (big studio, small indie shops and everything in between.) So definitely don&#8217;t be afraid to join us! If you have an interest in posting more regularly and you want a group of friendly (virtual) faces to help you do that, we&#8217;re here to help.</div>
<div>If you missed any of the posts this week, here&#8217;s a round-up of links to all the awesome posts we&#8217;ve seen so far (hopefully not missing any!):</div>
<div>
</div>
<p><a href="http://www.altdevblogaday.com/2011/01/24/week-1-round-up/" class="more-link">Read more on Week 1: Round-up&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<div>We&#8217;ve reached the end of the first week here at #AltDevBlogADay. It&#8217;s been really exciting to see such a great group of developers get together and share their experiences, ideas and feelings about the process. We&#8217;ve had a few bumps along the way (we&#8217;re still working out the site theme, hosting, RSS feed, and messaging issues) but overall it&#8217;s been a really fantastic experience so far!</div>
<div>We have eight days left in our first cycle (15 days, then we wrap back around.) I simply can&#8217;t wait to see what everyone else has up their sleeves to share.</div>
<div>Remember, if you&#8217;re interested in participating with us &#8211; hit me up on twitter (<a href="http://twitter.com/#!/mike_acton">@mike_acton</a>) or shoot me an email (<a href="mailto:macton@gmail.com">macton@gmail.com</a>) &#8211; We welcome devs from all walks of life. So far, we have programmers, artists, animators, designers, bizdev and audio peeps queued up to share (big studio, small indie shops and everything in between.) So definitely don&#8217;t be afraid to join us! If you have an interest in posting more regularly and you want a group of friendly (virtual) faces to help you do that, we&#8217;re here to help.</div>
<div>If you missed any of the posts this week, here&#8217;s a round-up of links to all the awesome posts we&#8217;ve seen so far (hopefully not missing any!):</div>
<div>
<ul>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/1lxidtxV6ekh" target="_blank">Jonathan Adamczewski</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/research-tastes-better-when-served-with-sourc" target="_blank">Research tastes better when served with source</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/he6bIZdivOJqG" target="_blank">Dylan Cuthbert</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/aesthetics-and-the-art-of-being-anal-for-the" target="_blank">Aesthetics and the Art of being Anal for the Better Good</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/1lxpVNbHN4LD" target="_blank">Joe Hegarty</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/building-a-network-library-for-a-video-game-p" target="_blank">Building a Network Library for a Video Game: Part 1</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/1lxm40ZrjOoh" target="_blank">Joe Valenzuela</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/link-time-sorting" target="_blank">Link time sorting</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/1ls3ju5Rt1yp" target="_blank">Jason Swearingen</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/40579761" target="_blank">Nobody Gives a Shit: Introspections of a start-up indie studio&#8217;s dealings with publishers.</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/he6bIZdn94N3Y" target="_blank">Richard Sim</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/intuition-for-gamma-correct-rendering" target="_blank">Intuition for Gamma Correct Rendering</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/1lxm40QecSGt" target="_blank">Jean-Francois St-Amour</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/teaching-the-high-performance-mindset" target="_blank">Teaching the high-performance mindset</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/1lxoBnbkJpct" target="_blank">Justin Liew</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/private/FegoFlIHIj" target="_blank">Lessons from a Failed Project</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/1lxtKLLQUSJ3" target="_blank">Kyle Howells</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/making-a-complete-ios-game-part-1" target="_blank">Making A Complete iOS Game : Part 1</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/he6h1G0cZMNqG" target="_blank">Daniel</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/introducing-score" target="_blank">Introducing Score!</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/1lrWT5P80ubv" target="_blank">Georg Backer</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/the-difference-between-non-interactive-and-in" target="_blank">The difference between non-interactive and interactive entertainment</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/1lxtMWAVRdND" target="_blank">Fabrice Lété</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/the-ill-fated-binac" target="_blank">The ill-fated BINAC</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/3sO90ZFcK6aJ" target="_blank">David Evans</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/private/grguFtIfCm" target="_blank">Tools Team Test &#8211; 5 steps to better tools</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/1lxicR8k1kXf" target="_blank">Christoph Lang</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/40265204" target="_blank">Thoughts of a Newcomer</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/1lxoF7jTCB1L" target="_blank">Colin Riley</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/preparing-for-parallelism" target="_blank">Preparing for Parallelism</a></span></li>
<li><span style="font-family: dejarip-1, dejarip-2, sans-serif; line-height: 22px;"><a style="color: #336699;" href="http://posterous.com/people/1lxpX2H4NFK1">Chris Kosanovich</a> wrote </span><span style="font-family: dejarip-1, dejarip-2, sans-serif; font-weight: bold; line-height: 22px;"><a style="color: #336699;" href="http://altdevblogaday.com/think-low-level-write-high-level-0">Think low level, write high level</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/1lxtL4YKHvgZ" target="_blank">Bruno Evangelista</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/forward-vs-deferred-rendering-whywhen-forward" target="_blank">Forward vs. Deferred Rendering: why/when forward rendering still matters</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/1lxicQiJzfih" target="_blank">Aras Pranckevičius</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/ios-shader-tricks-or-its-2001-all-over-again" target="_blank">iOS shader tricks, or it&#8217;s 2001 all over again</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/1ls237qP8oIF" target="_blank">Julien Hamaide</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/aliasing-the-silent-killer" target="_blank">Aliasing, the silent killer</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/1lrZq8EBdNTz" target="_blank">Ben Carter</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/why-names-matter" target="_blank">Why Names Matter</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/1lrZsWIFcMhj" target="_blank">Brett Douville</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/a-smoky-kitchen" target="_blank">A Smoky Kitchen</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/1lxoDyx1Q6UF" target="_blank">Sean Parsons</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/pattern-matching-for-fun-and-profit" target="_blank">Pattern Matching In Scala For Fun And Profit</a></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; color: #999999; line-height: 18px;"><a style="color: #bc7134; text-decoration: none;" href="http://posterous.com/people/1lrZq8NZGGNX" target="_blank">Jaymin Kessler</a> wrote </span><span style="font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; font-weight: bold; line-height: 18px;"><a style="color: #222222; line-height: 20px; text-decoration: none;" href="http://altdevblogaday.com/looks-like-im-up" target="_blank">Looks like I&#8217;m up</a></span></li>
<li>&#8230;and I wrote <strong><a href="http://altdevblogaday.com/its-a-trap">It&#8217;s a trap!</a></strong></li>
</ul>
<div>And of course, everyone loves reading the comments &#8211; so please, join in on the conversation! Either here, or on Twitter.</div>
</div>
<div>Mike.</div>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/01/24/week-1-round-up/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>It’s a trap!</title>
		<link>http://www.altdevblogaday.com/2011/01/16/its-a-trap/</link>
		<comments>http://www.altdevblogaday.com/2011/01/16/its-a-trap/#comments</comments>
		<pubDate>Sun, 16 Jan 2011 08:57:36 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
		
		<guid isPermaLink="false">http://altdevblogaday.org/2011/01/16/its-a-trap/</guid>
		<description><![CDATA[<div>Or,questions for engine teams to ask to avoid common traps.</div>
<p><img title="Ackbar_HS.jpg" src="http://images.wikia.com/starwars/images/f/fb/Ackbar_HS.jpg" alt="Ackbar_HS.jpg" /><br /> 
<p />
<div><b>Are you trying to please <i>everyone</i>?</b></div>
<p />
<div>This is easy to fall in to. Everyone has an opinion. Everyone has stuff they think is critically important for success, in their opinion. But ultimately you have to realize that you simply can&#39;t give everyone, everything. If you try, you will never be able to give anyone, anything (good.) Accept it. Embrace it. Know what problems you&#39;re trying to solve and stick with those. However, be careful not to ignore issues, either! What can I say? It&#39;s a balance. That&#39;s not sexy and it&#39;s not a hard rule, but there you go, man.</div>
<p><a href="http://www.altdevblogaday.com/2011/01/16/its-a-trap/" class="more-link">Read more on It’s a trap!&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<div>Or,questions for engine teams to ask to avoid common traps.</div>
<p><img title="Ackbar_HS.jpg" src="http://images.wikia.com/starwars/images/f/fb/Ackbar_HS.jpg" alt="Ackbar_HS.jpg" /><br /> 
<p />
<div><b>Are you trying to please <i>everyone</i>?</b></div>
<p />
<div>This is easy to fall in to. Everyone has an opinion. Everyone has stuff they think is critically important for success, in their opinion. But ultimately you have to realize that you simply can&#39;t give everyone, everything. If you try, you will never be able to give anyone, anything (good.) Accept it. Embrace it. Know what problems you&#39;re trying to solve and stick with those. However, be careful not to ignore issues, either! What can I say? It&#39;s a balance. That&#39;s not sexy and it&#39;s not a hard rule, but there you go, man.</div>
<p />
<div><b>Do you know what the <i>interesting</i> questions are?</b></div>
<p />
<div>If you ask anyone on an engine team what they <i>want</i> to do, you&#39;re very likely to get a specific technical feature in response. That&#39;s okay. I know I&#39;ve certainly been known to get really excited about technical features now and again ;) But is that really the most interesting question? Or the most important one? Ultimately, we&#39;re all here to serve the players. As engine teams, we often do that indirectly through our production teams. For <i>me</i>, some of the most interesting questions are: What can we give the player? What can we inspire in the player? What do we want the players to feel? What can we learn from the players? How can we help the production team give the players more?  Technical features answer those questions, but we have to be careful not to simply do things for the sake of doing them. There is always a reason. Sometimes it&#39;s just not a good one. Let&#39;s make sure it is.</div>
<p />
<div><b>Is it better? Or just different?</b></div>
<p />
<div>We all want to put our stamp on the world. I know there&#39;s a general fear out there of Not Invented Here Syndrome, but honestly doing stuff for yourself is how you learn and definitely how you advance the state of the art. Someone has to do it, and it might as well be you. If, and only if, you can do it better. Not just different. You have to be answer what better means. Is it faster? Cheaper? Does it give something new to players? Does it allow the production team to do something no one else can do? Does it serve the central vision better? Don&#39;t move forward without knowing the answer.</div>
<p />
<div><b>Are you paying attention to what&#39;s happening in the world?</b></div>
<p />
<div>Like it or not (and well, you should like it because that&#39;s the way it is), our work is ephemeral in the extreme. Nothing you do will survive very long. If I look back at the games I made ten or fifteen years ago, for example, there&#39;s virtually no one playing them today in any capacity (some people are a lot luckier than me &#8211; but still it&#39;s rare.) And certainly all the actual work I did is gone and would require quite a feat of digital archeology to dig it up and get it to compile again. The point is: The same is true of what I do today. The world is changing and the work that we do now reflects the world of today. We need to understand what&#39;s happening so that we can do <b>this moment</b> <i>justice</i>. Because in twenty years it just won&#39;t matter anymore. Pay attention to what&#39;s happening in games, and in technology, for sure. But look outside too. I mean damn, ten years ago? Where was the internet? Where was social media? Where were our freaking cellphones? Where was CG in movies? Don&#39;t fool yourself into living inside a little sandbox and believing that what&#39;s happening in the world doesn&#39;t make a difference to what you do. Reflecting the world <i>is</i> what you do.</div>
<p />
<div><b>Do you understand the problem?</b></div>
<p />
<div>Don&#39;t ask for the solution. Ask for the problem. Be especially vigilant about this. Certainly you should appreciate people&#39;s suggestions for what you might want to do or how you might want to accomplish it. But really, <i>you</i> are responsible. You are the one that is supposed to understand the problem at hand from all the angles. Considerations for performance, and usability and direction and memory, etc. etc. But to do that you must understand <i>the problem</i>. If someone makes a suggestion, any suggestion, it&#39;s your responsibility to figure out exactly why they thought that. What problem are they <i>really</i> trying to solve? Their suggestion may honestly be the best answer, but unless you thouroughly understand the problem you simply cannot know that. And if you don&#39;t know that, you simply can&#39;t do a good job. Who wants that? So for any issue, always stop and figure out how you can understand the real problem better first, before you decide on any solutions.</div>
<p />
<div><b>Are you waiting for someone <i>else</i> to solve the problem?</b></div>
<p />
<div>Sometimes it&#39;s tricky to see when you&#39;re falling in this trap. But let&#39;s look at an example. Customization. If you find yourself saying &quot;well, we&#39;ll allow them to customize it, so it&#39;s cool&quot; then you know there&#39;s a problem. That can be simple things like hotkeys or what values are displayed.  The <i>default</i> answer needs to be the <i>right</i> answer. At least most of the time. Right means usable. Right means expected. Right means predictable. Right means performant. If you have different types of users, find out who they are, how they work and provide solutions that work for them.</div>
<p />
<div><b>Are you really trying to solve 100% of the problems?</b></div>
<p />
<div>Ah. A classic. Programmer philosophizing. I&#39;m sure you&#39;ve been into one of these traps. &quot;Oh, but will that work in <i>this</i> situation?&quot;  &quot;What if aliens come down with new technology that we can&#39;t even imagine &#8211; how will we handle that?!&quot; Listen closely: You cannot solve all problems. More than that, you don&#39;t <i>want</i> to solve all problems. You want to solve the important ones. You want to solve the common ones. You want to solve the ones that will ultimately matter to the player. Solve the common case really well. Handle the outliers separately. If you find your system becoming more and more complicated because of all the different problems you are trying to solve, you know you&#39;ve fallen in this trap. Systems that solve the common problems well (and first) get <i>simpler</i> as they mature, <b>not</b> more complex.</div>
<p />
<div><b>Are you questioning &quot;the way things are done?&quot;</b></div>
<p />
<div>Momentum is hard to overcome. But you solve hard problems. This is just one more that you have to solve. If &quot;the way things are done&quot; isn&#39;t getting the job done, you owe it to yourself (and the project, and the players) to push to change that. The status quo may have solved yesterday&#39;s problems, but you have to ask: Will it solve tomorrow&#39;s? Don&#39;t wait for someone to ask you what problems you see and what ideas you have for solving them. Be pro-active. Make a difference.</div>
<p />
<div><b>Do you understand the data?</b></div>
<p />
<div>Okay. You didn&#39;t think I&#39;d leave this one off did you? Look at the data. Understand it. Visualize it. The only thing you do is transform data from one form into another. Understand what that actually <i>means</i>. Here&#39;s an exercise: Take any function. It doesn&#39;t matter which one. Output every data change throughout a some reasonable run of the game or level or assets or whatever. Every change. Every parameter that&#39;s passed. Every value that&#39;s stored. Every variable in the function. Dump them all. Then look at the values. Then find a different way to look at the values. I guarantee there will be surprises that will change the way you understand the problem and change the way you think it should be solved. You simply cannot write good solutions without understanding the data, at least on some level. And the better you understand it, the better solutions you&#39;ll be able to provide.</div>
<p />
<div><b>Do you know how your UI influences user behavior?</b></div>
<p />
<div>This can be a GUI for tools or even a programmer API (which is just a text-based UI.) Every UI influences the behavior of the one that uses it. Sometimes in subtle ways. But the only way to know is to pay attention, experiment and evaluate results. Take Twitter, for example. Here&#39;s my theory: I think a lot of sites tried to do what Twitter did. It wasn&#39;t the first micro-blogging solution. And granted, they certainly had some innovations in the space. And they really didn&#39;t fall into the trap of trying to please everyone, which is great. But I think others did that too, and I don&#39;t think that&#39;s why it caught fire. I believe it caught fire because of the &quot;Fail Whale.&quot; (WTF? I hear you saying. How could their infamous early, well and if we&#39;re honest, continuing, server scaling problems have helped them succeed?) It&#39;s because of that one image. It&#39;s was the UI for failure. They took that one thing, which is too often just the default server message, and turned it into something fun and compelling. It made people <i>want</i> to come back. That, I think, is the secret to Twitter&#39;s success. So take a look at your UI and see what it says to your users. But more generally: Find the <i>worst</i> thing about any system you&#39;re working on and turn it into something compelling. It doesn&#39;t have to be complicated (just a simple image in that example), but it can make a world of difference.</div>
<p />
<div><b>Do you know how the engine is actually used?</b></div>
<p />
<div>I mean, really, truly, used. Day to day. Or do you just have a rough idea? Or just a guess? Find out. Two things for me have been enlightening experiences. (1) Usability testing. Do it as often as you can. Put a real user in front of the system, whether it&#39;s a GUI for the tools or a programmer, and just watch them tackle a task. You can&#39;t get all the answers in this kind of environment, but you can get a lot. It&#39;s absolutely worth every minute. And (2) Shadowing sessions. Just sit behind someone and watch them do what they normally do. Try to be hyper-aware of all the little workarounds and frustrations and patterns of behavior that the user isn&#39;t even aware of (or has forgotten about because they&#39;re so used to it.) And ask them &quot;why?&quot; &#8211; Why are you doing that? What is it that you really want to do? And ask them how they would describe what they want to do <i>in their own terms</i>.</div>
<p />
<div><b>Do you know what &quot;the right way&quot; actually is?</b></div>
<p />
<div>Sigh. &quot;The right way&quot; is usually just another way to say &quot;the way I was taught&quot; or &quot;the way I&#39;m used to&quot; or &quot;the way some guy on the internet said it should be&quot; &#8211; What is the right way? What are your real constraints? What are you really trying to solve? If it&#39;s &quot;right&quot; then it&#39;s provably right. If it&#39;s not <i>provable</i> then it&#39;s probably just opinion at best and nonsense at worst. So if you find yourself saying you want to do this in this way because it&#39;s &quot;the right way&quot; you need to first figure out how you would actually demonstrate that it accomplished that. &quot;Right&quot; is not even interesting. Faster, better, cheaper, more compelling, more value, more usable &#8211; those are much more interesting and valuable. What does &quot;right&quot; mean to you?</div>
<p />
<div><b>Do you know how to decide what is better?</b></div>
<p />
<div>You need a test. You need a way to judge the value of an idea or feature or choice. Those are the central principles of the project. I can&#39;t really stress this enough: If you don&#39;t know what the central principles (or values) of your project are, you cannot make good choices. Decisions will be arbitrary. And inconsistent. If you don&#39;t know what those principles are, if you don&#39;t know how to judge an idea and on what merits, find that out. Right. Now.</div>
<p />
<div><b>What can you cut?</b></div>
<p />
<div>Cut ruthlessly. Much, much better to solve fewer problems really well than more problems poorly. Or as our own Joe Valenzuela (<a href="http://twitter.com/#!/jvalenzu">@jvalenzu</a>) says:</div>
<p />
<div><a href='http://posterous.com/getfile/files.posterous.com/altdevblogaday/W03ivLVb6Q74YlhBfvJ0jCUd68oC0AcDGwYizR0Dk5l0RBlhu25yD3XXWU1u/fully_assed.png'><img src="http://altdevblogaday.com/wp-content/uploads/2011/01/fully_assed.png.scaled.500-300x252.jpg" width="500" height="421"/></a><br />
</div>
<p />
<div><b>That&#39;s enough for today!</b></div>
<p />
<div>There&#39;s a thousand other questions that we need to ask ourselves to avoid the most common traps, but I think that&#39;s good for now. </div>
<p />
<div>I&#39;d really like to hear your thoughts too: <b><i>What&#39;s one question we should ask ourselves to avoid a problem you&#39;ve experienced?</i></b></div>
<p />
<div>Mike.</div>
<div><a href="http://twitter.com/#!/mike_acton">@mike_acton</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/01/16/its-a-trap/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>It begins.</title>
		<link>http://www.altdevblogaday.com/2011/01/15/it-begins/</link>
		<comments>http://www.altdevblogaday.com/2011/01/15/it-begins/#comments</comments>
		<pubDate>Sat, 15 Jan 2011 04:46:18 +0000</pubDate>
		<dc:creator>Mike Acton</dc:creator>
		
		<guid isPermaLink="false">http://altdevblogaday.org/2011/01/15/it-begins/</guid>
		<description><![CDATA[<div><img title="472097903_6147a13e9d_o.jpg" src="http://farm1.static.flickr.com/194/472097903_6147a13e9d_o.jpg" alt="472097903_6147a13e9d_o.jpg" width="420" height="315" /></div>
<div><a href="http://www.flickr.com/photos/oskay/472097903/">Hello, World (CNC toaster / 2D thermal printer)</a></div>
<div>Starting Saturday, 15 January (that&#8217;s now in some places) we will begin posting on #AltDevBlogADay. Learn more about what we&#8217;re doing on the <a href="http://altdevblogaday.com/about/">#readme (for Readers)</a> and the <a href="http://altdevblogaday.com/authors-getting-started/">#readme (for Writers)</a> pages.</div>
<div>We have a great lineup of seasoned developers, indie up-and-comers and even some non-gamedev folk just to throw you off the scent.</div>
<div>
</div>
<p><a href="http://www.altdevblogaday.com/2011/01/15/it-begins/" class="more-link">Read more on It begins&#8230;.</a></p>
]]></description>
			<content:encoded><![CDATA[<div><img title="472097903_6147a13e9d_o.jpg" src="http://farm1.static.flickr.com/194/472097903_6147a13e9d_o.jpg" alt="472097903_6147a13e9d_o.jpg" width="420" height="315" /></div>
<div><a href="http://www.flickr.com/photos/oskay/472097903/">Hello, World (CNC toaster / 2D thermal printer)</a></div>
<div>Starting Saturday, 15 January (that&#8217;s now in some places) we will begin posting on #AltDevBlogADay. Learn more about what we&#8217;re doing on the <a href="http://altdevblogaday.com/about/">#readme (for Readers)</a> and the <a href="http://altdevblogaday.com/authors-getting-started/">#readme (for Writers)</a> pages.</div>
<div>We have a great lineup of seasoned developers, indie up-and-comers and even some non-gamedev folk just to throw you off the scent.</div>
<div>
<ul>
<li>Read more about us in our #AltDev discussion group <a href="http://altdev.posterous.com/#!/introductions">Introduction Thread</a>.</li>
<li>You can also see the upcoming schedule of posters and learn a little more about the process in the group&#8217;s <a href="http://altdev.posterous.com/#!/pages/getting-started-0">Getting Started Thread</a>.</li>
</ul>
</div>
<div>I hope you enjoy the upcoming work. I know we&#8217;re all looking forward to getting to share more with you! (That&#8217;s the entire purpose of this group, of course! We all wanted to share more, but needed a little shove from our peers to take the time to get stuff out the door.)</div>
<div>If you have any suggestions for posts you&#8217;d like to see, please share! Part of the difficulty with posting more regularly is knowing that there are people out there who are interested in your take on the topic. So if we know you want to hear about it, it&#8217;ll encourage us to write about it!</div>
<div>See you tomorrow. (That&#8217;s my day!)</div>
<div><a href="http://twitter.com/#!/mike_acton">@mike_acton</a></div>
<div>PS: Haters, go away. We guarantee nothing. kthxbai.</div>
<div><img src="http://altdevblogaday.com/wp-content/uploads/2011/01/some_satisfaction-300x276.png" alt="" width="375" height="345" /></div>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/01/15/it-begins/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.837 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-05-17 03:14:38 -->
<!-- Compression = gzip -->
