<?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>MQuandt.Blog &#187; XNA</title>
	<atom:link href="http://mquandt.com/blog/category/xna/feed/" rel="self" type="application/rss+xml" />
	<link>http://mquandt.com/blog</link>
	<description></description>
	<lastBuildDate>Wed, 25 Jan 2012 14:21:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<cloud domain='mquandt.com' port='80' path='/blog/?rsscloud=notify' registerProcedure='' protocol='http-post' />
		<item>
		<title>ScriptTD v2 Planning</title>
		<link>http://mquandt.com/blog/2011/11/scripttd-v2-planning/</link>
		<comments>http://mquandt.com/blog/2011/11/scripttd-v2-planning/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 12:18:42 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[WP7]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://mquandt.com/blog/?p=161</guid>
		<description><![CDATA[Just a quick post to mention that I&#8217;m currently planning out features for ScriptTD version 2.0. so far I have some input from the discussion boards on the Codeplex site, and I&#8217;ve placed all of that into a Trello board that will let me plan out the roadmap for this version and future versions. If &#8230; <a href="http://mquandt.com/blog/2011/11/scripttd-v2-planning/">Read more <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Just a quick post to mention that I&#8217;m currently planning out features for ScriptTD version 2.0. so far I have some input from the discussion boards on the <a href="http://scripttd.codeplex.com" target="_blank">Codeplex </a>site, and I&#8217;ve placed all of that into a <a href="https://trello.com/board/scripttd/4eb9c108b4a843a14b053155" target="_blank">Trello board</a> that will let me plan out the roadmap for this version and future versions.</p>
<p>If you have anything you want to see in v2 or in the future, please head over to the discussion board, specifically this post: <a href="http://scripttd.codeplex.com/discussions/277634" target="_blank">http://scripttd.codeplex.com/discussions/277634</a> and give your feedback. I probably won&#8217;t do anything too unique as this is still supposed to be a general engine, but if you feel there were features important to the Tower Defense genre that were missing from v1.x, please let me know, and vote in the Trello board if they&#8217;re already there.</p>
]]></content:encoded>
			<wfw:commentRss>http://mquandt.com/blog/2011/11/scripttd-v2-planning/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ScriptTD</title>
		<link>http://mquandt.com/blog/2011/10/scripttd/</link>
		<comments>http://mquandt.com/blog/2011/10/scripttd/#comments</comments>
		<pubDate>Sun, 09 Oct 2011 13:41:46 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Games]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[channel 9]]></category>
		<category><![CDATA[channel9]]></category>
		<category><![CDATA[coding4fun]]></category>
		<category><![CDATA[msdn]]></category>
		<category><![CDATA[scripttd]]></category>
		<category><![CDATA[tower defense]]></category>
		<category><![CDATA[windows phone 7]]></category>
		<category><![CDATA[wp7]]></category>

		<guid isPermaLink="false">http://mquandt.com/blog/?p=148</guid>
		<description><![CDATA[I just realised I never posted about this. ScriptTD is a project I have been working on for the past year now, although we officially launched a couple of months ago, I&#8217;m still working on v2.0. The goal was to create a Tower Defense game engine for Windows Phone 7, allowing people with no coding &#8230; <a href="http://mquandt.com/blog/2011/10/scripttd/">Read more <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I just realised I never posted about this. <img src='http://mquandt.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>ScriptTD is a project I have been working on for the past year now, although we officially launched a couple of months ago, I&#8217;m still working on v2.0. The goal was to create a Tower Defense game engine for Windows Phone 7, allowing people with no coding knowledge to change the data files and art/sounds to create their own Tower Defense game. This was an interesting challenge to work on, and I&#8217;m reasonably happy with the first result, however there is still plenty to add and refine. <img src='http://mquandt.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://scripttd.codeplex.com/"><img class="aligncenter" title="ScriptTD" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/HomeScreen_thumb%5B1%5D.png" alt="" width="300" height="180" /></a>You can get the source code for the project at <a href="http://scripttd.codeplex.com/" target="_blank">http://scripttd.codeplex.com/</a> and there is quite a bit of information about what each XML file does. I also wrote an article which is located at <a href="http://channel9.msdn.com/coding4fun/articles/ScriptTD-Tower-Defense-Made-Easy" target="_blank">http://channel9.msdn.com/coding4fun/articles/ScriptTD-Tower-Defense-Made-Easy</a> and covers how to extend the code (C#) to create a new weapon type.</p>
<p>For those interested in trying out the game on their Windows Phone 7 devices, you can get it from the following marketplace link:</p>
<p><a href="http://www.windowsphone.com/en-GB/apps/ee836335-27a7-e011-986b-78e7d1fa76f8" target="_blank">http://www.windowsphone.com/en-GB/apps/ee836335-27a7-e011-986b-78e7d1fa76f8</a></p>
<p>Be aware: it is quite challenging, but free for everyone. The game is compiled for WP7.0, so you don&#8217;t have to have Mango to run it.</p>
<p><img class="aligncenter" title="ScriptTD Screenshot 1" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/gamePlay_thumb%5B5%5D.png" alt="" width="300" height="180" /></p>
]]></content:encoded>
			<wfw:commentRss>http://mquandt.com/blog/2011/10/scripttd/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Blender 2.57b Tutorial</title>
		<link>http://mquandt.com/blog/2011/05/blender-2-57b-tutorial/</link>
		<comments>http://mquandt.com/blog/2011/05/blender-2-57b-tutorial/#comments</comments>
		<pubDate>Thu, 26 May 2011 13:09:57 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://mquandt.com/blog/?p=143</guid>
		<description><![CDATA[Charles Humphrey (Nemo Krad) has started a tutorial on the 2.57b release of Blender &#8211; the free and open source 3D modelling tool. He focuses on blender, but covers how you can use Blender to create content for XNA; and in future he plans to create content on working with Dual Textures and Skinned Animation. &#8230; <a href="http://mquandt.com/blog/2011/05/blender-2-57b-tutorial/">Read more <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Charles Humphrey (Nemo Krad) has started a tutorial on the 2.57b release of Blender &#8211; the free and open source 3D modelling tool. He focuses on blender, but covers how you can use Blender to create content for XNA; and in future he plans to create content on working with Dual Textures and Skinned Animation.</p>
<p>He currently has two parts complete, covering the UI and UV Mapping, with more on the way.</p>
<p>You can read the series at his blog on the XNA UK User Group here:</p>
<p><a href="http://xna-uk.net/blogs/randomchaos/archive/2011/05/23/blender-2-57b-amp-xna-4-0-part-i.aspx" target="_blank">Part I &#8211; UI and Exporting</a></p>
<p><a href="http://xna-uk.net/blogs/randomchaos/archive/2011/05/26/blender-2-57b-amp-xna-4-0-part-ii.aspx" target="_blank">Part II &#8211; UV Mapping</a></p>
<p><a href="http://xna-uk.net/blogs/randomchaos/archive/2011/05/26/blender-2-57b-amp-xna-4-0-part-iii.aspx" target="_blank">Part III &#8211; Normal Maps</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mquandt.com/blog/2011/05/blender-2-57b-tutorial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XNA Cross-Platform Editing in Real-time</title>
		<link>http://mquandt.com/blog/2011/04/xna-cross-platform-editing-in-real-time/</link>
		<comments>http://mquandt.com/blog/2011/04/xna-cross-platform-editing-in-real-time/#comments</comments>
		<pubDate>Sun, 10 Apr 2011 05:00:52 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[sample code]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[xbox 360]]></category>

		<guid isPermaLink="false">http://mquandt.com/blog/?p=129</guid>
		<description><![CDATA[One of the cool new features appearing in a lot of modern engines is the ability to work in an editor on the PC and have the level changes replicate on a running console build of the game in real-time. For commercial games this often happens over the high speed USB connection, however due to &#8230; <a href="http://mquandt.com/blog/2011/04/xna-cross-platform-editing-in-real-time/">Read more <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>One of the cool new features appearing in a lot of modern engines is the ability to work in an editor on the PC and have the level changes replicate on a running console build of the game in real-time. For commercial games this often happens over the high speed USB connection, however due to the cross platform support in XNA, we can replicate this [in single player games/modes] using a System-Link connection and the XNA networking libraries.</p>
<p>The first step is deciding which side will create the session and which side will join. Considering we only have the option of working with the Xbox 360, and you might not want to include any debug views or information in your Xbox code, the option I chose is to have the Xbox create the session. The code is compatible on both platforms so if you&#8217;re willing to add some system to find and join an active session, you can easily change this to create the session on the PC. For the purposes of this article the session will only contain two &#8220;Players&#8221; and the Xbox will create whilst the PC side joins.</p>
<h2><span id="more-129"></span>Creating</h2>
<p>We start by creating a session, in XNA you can do this with the <a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.net.networksession.create.aspx" target="_blank">NetworkSession.Create()</a> command, which creates a <a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.net.networksession.aspx" target="_blank">NetworkSession</a> object that maintains the session. Then specify session.AllowJoinInProgress to be true, this lets you create the session and at any time join or rejoin from the PC side.</p>
<pre class="brush: csharp;">_session = NetworkSession.Create(NetworkSessionType.SystemLink, 1, 2);
_session.AllowJoinInProgress = true;</pre>
<p>Another key thing to note here is that you will want to specify the network session type as SystemLink, this lets you sign in with your Creators Club gamer tag on the Xbox, and use a local player on the PC side &#8211; no extra accounts!<br />
We then specify a maximum of one local gamer on the Xbox side, and a total of two gamers in the session. (Change as needed)<br />
Finally we handle the session.GamerJoined event and in the handler we start the game if the current session state is set to Lobby.</p>
<h2>Receiving</h2>
<p>At this time you might want to also create a PacketReader and PacketWriter, as we will be using these to do our communication. These can be created at any time, and are not tied to a session, so it is a good idea to create them once and re-use over multiple sessions/games.</p>
<p>How you want to receive the data is up to you, however I chose to allow the Xbox game to register some callbacks for named commands. That way the PC side can specify the name of the command and send data along, which can be passed through as a byte array. This is rather simple to setup, you simply maintain a Dictionary&lt;string, Action&lt;byte[]&gt;&gt; that contains all of the callback delegates and names. Then when a packet comes in it will have the name of the callback as well as the byte[] data, which lets you gets the callback from the Dictionary and call it, passing in the data as is.</p>
<p>On the PC side you simply send the callback name, length of the byte array and the bytes themselves, ready for the Xbox to accept and use.</p>
<p>I further split this into &#8220;Commands&#8221; and &#8220;Data&#8221;, to provide a clear separation of things like console commands, and raw data, but both use the same system of a Action&lt;byte[]&gt; delegate callback.</p>
<h2>Joining</h2>
<p>When joining, the PC needs to do two things:</p>
<ol>
<li>Search for sessions</li>
<li>Join a chosen session</li>
</ol>
<p>The <a href="http://msdn.microsoft.com/en-us/library/bb975501.aspx" target="_blank">NetworkSession.Find()</a> method provides a list of available sessions currently running over SystemLink, which is usually going to be just one, however if you&#8217;re working in a larger team with multiple systems on the same network, you might want to list them and display the host gamertag, so that you can choose the right one.</p>
<p>Once you have chosen the network session, you pass that to <a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.net.networksession.join.aspx" target="_blank">NetworkSession.Join()</a> which creates a NetworkSession object that you can use just like you do on the server &#8211; except this time you don&#8217;t worry about starting the game.</p>
<h2>Updating</h2>
<p>Once the session has been created and is up and running, on both platforms you need to call session.Update() in your update loop. This handles the networking side of things and gets/sends the packets as needed.</p>
<p>Once you have updated, you can make use of the PacketReader and PacketWriter objects to receive and send packets respectively. To receive the data, you need to first check if there is data available by checking the session.LocalGamers[0].IsDataAvailable flag. If there is data available, you can call session.LocalGamers[0].ReceiveData() passing in the PacketReader which you can then use to parse the packet and call the appropriate callback.</p>
<p>If you have data you want to send, you just need to call session.LocalGamers[0].SendData(), and pass in the PacketWriter with the data you want to send.</p>
<p>In the background XNA handles the network magic, so you just have to worry about handling the data on either end.</p>
<h2>Code</h2>
<p>I didn&#8217;t have time to put up a complete code sample for this article, however I hope you understand the general technique. Code for something like this really needs to be tailored to your purpose. If you are just writing a debug console or tweak system, you can just use the command system mentioned below. However if you want to write a sync system for your editor, with camera sync and everything else, you will probably want to change how you send and receive data to optimise for what you are sending.</p>
<h3>Create</h3>
<pre class="brush:csharp;">_session = NetworkSession.Create(NetworkSessionType.SystemLink, 1, 2);
_session.AllowHostMigration = false;
_session.AllowJoinInProgress = true;
_session.GamerJoined += (s, e) =&gt;
{
    if (_session.SessionState == NetworkSessionState.Lobby)
        _session.StartGame();
};
_session.GamerLeft += (s, e) =&gt; _session.EndGame();</pre>
<h3>Find</h3>
<pre class="brush:csharp;">AvailableNetworkSessionCollection sessions = NetworkSession.Find(NetworkSessionType.SystemLink, 1, null);</pre>
<h3>Join</h3>
<p>(&#8216;session&#8217; is an AvailableNetworkSession taken from the collection in Find)</p>
<pre class="brush:csharp;">_session = NetworkSession.Join(session);</pre>
<h3>Update</h3>
<pre class="brush:csharp;">if (_session != null)
{
    _session.Update();
    if (_writer.Length &gt; 0)
        _session.LocalGamers[0].SendData(_writer, SendDataOptions.None);
    while (_session != null &amp;&amp; _session.LocalGamers[0].IsDataAvailable)
    {
        NetworkGamer sender;
        int numBytes = _session.LocalGamers[0].ReceiveData(_reader, out sender);
        if (numBytes &gt; 0 &amp;&amp; !sender.IsLocal)
        {
            string methodName = _reader.ReadString();
            int numBytes = _reader.ReadInt32();
            var data = _reader.ReadBytes(numBytes);
            Action method;
            if (!string.IsNullOrEmpty(methodName) &amp;&amp; _commands.TryGetValue(methodName, out method))
                method(data);
        }
    }
}</pre>
<h3>Sending</h3>
<pre class="brush:csharp;">public void SendCommand(string methodName, byte[] data)
{
    _writer.Write(methodName.ToLower());
    if (data != null)
    {
        _writer.Write(data.Length);
        _writer.Write(data);
    }
    else
    {
        _writer.Write(0);
    }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://mquandt.com/blog/2011/04/xna-cross-platform-editing-in-real-time/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>XNA Tip #1</title>
		<link>http://mquandt.com/blog/2011/01/xna-tip-1/</link>
		<comments>http://mquandt.com/blog/2011/01/xna-tip-1/#comments</comments>
		<pubDate>Tue, 25 Jan 2011 14:15:13 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[alpha blending]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://mquandt.com/blog/2011/01/xna-tip-1/</guid>
		<description><![CDATA[This is the first in what will probably be a random series of small posts about tips and tricks, and other notes about xna. When implementing the light pre-pass algorithm in XNA 4.0, I found that the alpha channel was messing around with my intermediate render targets. To resolve this, you need to create a &#8230; <a href="http://mquandt.com/blog/2011/01/xna-tip-1/">Read more <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><i>This is the first in what will probably be a random series of small posts about tips and tricks, and other notes about xna.</i></p>
<p>When implementing the light pre-pass algorithm in XNA 4.0, I found that the alpha channel was messing around with my intermediate render targets.    <br />To resolve this, you need to create a custom blend state object (cache it) with the colour and alpha destination and blend states set to BlendState.One.</p>
<p>This should prevent any modulation based on the alpha value in a texture when sampling.</p>
<p>*<strong>Edit</strong>* Small code sample:</p>
<pre class="brush: csharp;">var _alphaBlend = new BlendState()
            {
                AlphaDestinationBlend = Blend.One,
                AlphaSourceBlend = Blend.One,
                ColorDestinationBlend = Blend.One,
                ColorSourceBlend = Blend.One
            };</pre>
]]></content:encoded>
			<wfw:commentRss>http://mquandt.com/blog/2011/01/xna-tip-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TechEd 2010 Academic Day Slides</title>
		<link>http://mquandt.com/blog/2010/08/teched-2010-academic-day-slides/</link>
		<comments>http://mquandt.com/blog/2010/08/teched-2010-academic-day-slides/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 00:06:55 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Students]]></category>
		<category><![CDATA[TechEd]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[academic day]]></category>
		<category><![CDATA[presentations]]></category>
		<category><![CDATA[slides]]></category>
		<category><![CDATA[teched 2010]]></category>
		<category><![CDATA[teched australia]]></category>
		<category><![CDATA[windows phone 7]]></category>

		<guid isPermaLink="false">http://mquandt.com/blog/2010/08/teched-2010-academic-day-slides/</guid>
		<description><![CDATA[As promised, here are my slides for my presentation on Windows Phone 7 during Academic Day at TechEd 2010.]]></description>
			<content:encoded><![CDATA[<p>As promised, here are my slides for my presentation on Windows Phone 7 during Academic Day at TechEd 2010.</p>
<p><iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="http://cid-670fd4ae41402e8a.office.live.com/embedicon.aspx/MSP/TechEd2010^_WP7^_Academic.pptx" frameborder="0" marginwidth="0" scrolling="no"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://mquandt.com/blog/2010/08/teched-2010-academic-day-slides/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tech Ed Australia 2010 Day 1</title>
		<link>http://mquandt.com/blog/2010/08/tech-ed-australia-2010-day-1/</link>
		<comments>http://mquandt.com/blog/2010/08/tech-ed-australia-2010-day-1/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 14:16:04 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Students]]></category>
		<category><![CDATA[TechEd]]></category>
		<category><![CDATA[Xbox 360]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[academic day]]></category>
		<category><![CDATA[foxtel]]></category>
		<category><![CDATA[kinect]]></category>
		<category><![CDATA[teched 2010]]></category>
		<category><![CDATA[teched australia]]></category>
		<category><![CDATA[windows phone 7]]></category>
		<category><![CDATA[wp7]]></category>

		<guid isPermaLink="false">http://mquandt.com/blog/2010/08/tech-ed-australia-2010-day-1/</guid>
		<description><![CDATA[I was recently invited to speak on a pre-day for faculty and students at TechEd Australia, held on the Gold Coast. The plan is to write up a little bit about each day, although it might not be up the same day, depending on internet availability. So today was Academic Day, in particular, for faculty &#8230; <a href="http://mquandt.com/blog/2010/08/tech-ed-australia-2010-day-1/">Read more <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I was recently invited to speak on a pre-day for faculty and students at TechEd Australia, held on the Gold Coast. The plan is to write up a little bit about each day, although it might not be up the same day, depending on internet availability.</p>
<p>So today was Academic Day, in particular, for faculty members, who had been invited to hear about what students want, directly from students. (That was the theme)</p>
<p>A couple of weeks previously, Andrew Parsons (<a href="http://twitter.com/mrandypuppy" target="_blank">@MrAndyPuppy</a>), the local Academic Developer Evangelist asked me to do a presentation on Windows Phone 7, with a split between the experience promised by Microsoft, and developing for the phone. After I learned that I really cannot do a reasonable phone demo in 10 minutes, I cut it down to a demo of pre-made code.</p>
<p>Either way, some big highlights arose today. I managed to get Andy to let me see and use a developer phone, and I must say, awesome, however I cannot go into specifics, nor can I take photos unfortunately.</p>
<p>The other highlight was the awesome keynote presented by Michael Kordahi (<a href="http://twitter.com/delic8genius" target="_blank">@delic8genius</a>) with a special appearance by August De Los Reyos (<a href="http://twitter.com/augustdlr" target="_blank">@augustdlr</a>) presenting his experiences developing User experiences on the Surface, and even the Windows key on the keyboard. Some awesome demos for a theoretical Foxtel experience (Cable TV in Australia) that uses all devices, including a Surface table (jeez they love that thing). They then showed off the big devices for this year, Kinect and Windows Phone 7, and seeing this in person was really awesome. I cannot wait for next week when I will get to try out a device. (Unfortunately they took the device back to Sydney right after the keynote.)</p>
<p>Photos will follow as I can sort them out, and maybe videos depending on what I&#8217;m allowed to post, and what connection I can get.</p>
<p>Exciting days remain ahead, I have to present Windows Phone 7 to students on Thursday, and of course I must experience the great TechEd sessions.</p>
]]></content:encoded>
			<wfw:commentRss>http://mquandt.com/blog/2010/08/tech-ed-australia-2010-day-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reconstructing Position from Depth for Fullscreen Quads</title>
		<link>http://mquandt.com/blog/2010/06/reconstructing-position-from-depth-for-fullscreen-quads/</link>
		<comments>http://mquandt.com/blog/2010/06/reconstructing-position-from-depth-for-fullscreen-quads/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 02:56:35 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[DirectX]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[depth]]></category>
		<category><![CDATA[frustum ray]]></category>
		<category><![CDATA[techniques]]></category>
		<category><![CDATA[tutorials]]></category>

		<guid isPermaLink="false">http://mquandt.com/blog/?p=108</guid>
		<description><![CDATA[Recently I found an issue with an older article of mine that covered this topic, so I pulled it down until I could find the time to understand and fix the issue. After a bit of work I have fixed it and present this refresh. The key to deferred rendering and other techniques is the &#8230; <a href="http://mquandt.com/blog/2010/06/reconstructing-position-from-depth-for-fullscreen-quads/">Read more <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Recently I found an issue with an older article of mine that covered this topic, so I pulled it down until I could find the time to understand and fix the issue. After a bit of work I have fixed it and present this refresh.</p>
<p>The key to deferred rendering and other techniques is the ability to use a depth map to store world position. As we know a depth map consists of floating point values (optimally) and so normally we would use those values with our Clip Space coordinates and the Inverse of the ViewProjection matrix to get the position in World Space.</p>
<p>However there is another way to do this, and the big benefit is that it does not require a matrix multiplication to do so.</p>
<p>Presented by Crytek during a presentation on Atmospheric Scattering, this method uses just a Multiply + Add to get the position in World Space from our depth value at that point. To do this we need to get the far view frustum corners, in View Space, and pass them to the shader.</p>
<p>  <span id="more-108"></span><br />
<h3>Getting the Corners</h3>
<p>This is easily done in XNA through the BoundingFrustum.GetCorners() method. Note that we only need the far corners, so we can take the last 4 in the 8 element array, and we also need these corners in View space, so be sure to transform them by the View matrix before you pass them through.</p>
<pre class="brush: csharp;">private void getFrustumCorners(out Vector3[] corners)
{
    corners = new Vector3[4];

    Vector3[] temp = CurrentCamera.Frustum.GetCorners();
    for (int i = 0; i &lt; 4; i++)
    {
        corners[i] = Vector3.Transform(temp[i + 4], CurrentCamera.View);
    }
}</pre>
<p>Since we are in the CPU/XNA code, be sure to also pass the depth of the far clip plane, and the camera’s World matrix. (Simply invert the View matrix if you do not already have a World matrix)</p>
<h3>Writing out Depth</h3>
<p>Now for some shader code! First in the depth shader, you need to change how you write out the depth value, instead we take the Linear View Space depth, which means that we need to get the Z value from Position * World * View rather than Position * World * View * Projection.</p>
<pre class="brush: cpp;">float4x4 wv = mul( World, View );
float4 posVS = mul( pos, wv );

output.Position = mul( posVS, Projection );
output.Depth = posVS.z;</pre>
<p>Then in the pixel shader, take this depth value, negate it and divide it by the Far Clipping plane.</p>
<pre class="brush: cpp;">output.Depth = 1.0f - ( -depth / FarClip );</pre>
<p>Now when you want to reconstruct this, we need to find the correct frustum corner inside the vertex shader. (Note: This code only applies if you are rendering a fullscreen quad)</p>
<h3>Preparing and Choosing the Right Corner</h3>
<p>The best way to do this is to pass along the array index as a 3rd value with your texture coordinates. If you do not want to modify the vertex type, you can also apply some maths to determine the right index.</p>
<p>For brevity I will assume that the index is provided with the texture coordinates.</p>
<p>Take that ray and multiply it by the camera World matrix, to move the ray into World space, then pass it to the pixel shader.</p>
<pre class="brush: cpp;">output.FrustRay = mul( FSQ_GetFrustumRay( tcri.z ), CamWorld );</pre>
<h3>Getting the Position</h3>
<p>Now that you have the ray, simply sample the depth texture for the depth value, and multiply it by the ray. Then take that and add it to the camera position to get the point in world space. (Rather than just a direction)</p>
<pre class="brush: cpp;">float depth = 1.0f - tex2D( depthSampler, tc ).x;
float3 pos = CamPosition + depth * frustRay;</pre>
<p>Now you have your position!</p>
<p>I will include the technique to do the same thing with arbitrary world geometry when I write an article on Point Lights or Spotlights. At the moment I am working on implementing shadows, and probably won’t touch those topics until I solve some pressing issues.</p>
<h3>Final Notes</h3>
<p>Here is a code sample for passing the index as a part of the texture coordinate value.</p>
<p>&#160;</p>
<pre class="brush: csharp;">private struct VertexPositionTexCoordRayIndex
{
    private Vector3 position;
    public Vector3 Position
    {
        get { return position; }
        set { position = value; }
    }

    private Vector3 texCoordRayIndex;
    public Vector3 TexCoordRayIndex
    {
        get { return texCoordRayIndex; }
        set { texCoordRayIndex = value; }
    }

    public static int SizeInBytes { get { return sizeof(float) * 6; } }

    public static readonly VertexElement[] VertexElements =
        new VertexElement[] {
            new VertexElement(0, 0, VertexElementFormat.Vector3, VertexElementMethod.Default, VertexElementUsage.Position, 0),
            new VertexElement(0, sizeof(float)*3, VertexElementFormat.Vector3, VertexElementMethod.Default, VertexElementUsage.TextureCoordinate, 0)
        };

    public VertexPositionTexCoordRayIndex(Vector3 position, Vector3 texcoordRayindex)
    {
        this.position = position;
        this.texCoordRayIndex = texcoordRayindex;
    }
}</pre>
<pre class="brush: csharp;">VertexPositionTexCoordRayIndex[] verts = new VertexPositionTexCoordRayIndex[4];
verts[0] = new VertexPositionTexCoordRayIndex(new Vector3(-1, 1, 1), new Vector3(0, 0, 0));
verts[1] = new VertexPositionTexCoordRayIndex(new Vector3(1, 1, 1), new Vector3(1, 0, 1));
verts[2] = new VertexPositionTexCoordRayIndex(new Vector3(-1, -1, 1), new Vector3(0, 1, 3));
verts[3] = new VertexPositionTexCoordRayIndex(new Vector3(1, -1, 1), new Vector3(1, 1, 2));</pre>
<p>&#160;</p>
<p>Remember that XNA provides the corners in a different order to just 1,2,3,4, so we can explicitly pass the correct index for the vertex we are working with here, and it will be chosen correctly in the shader.</p>
]]></content:encoded>
			<wfw:commentRss>http://mquandt.com/blog/2010/06/reconstructing-position-from-depth-for-fullscreen-quads/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Status June 2010</title>
		<link>http://mquandt.com/blog/2010/06/status-june-2010/</link>
		<comments>http://mquandt.com/blog/2010/06/status-june-2010/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 22:52:20 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[DirectX]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[light pre pass]]></category>
		<category><![CDATA[status]]></category>
		<category><![CDATA[techniques]]></category>
		<category><![CDATA[tutorials]]></category>

		<guid isPermaLink="false">http://mquandt.com/blog/2010/06/status-june-2010/</guid>
		<description><![CDATA[Hi all, not dead. Apologies for the lack of updates, I am in the process of finishing an internship required for my university course, and it is a challenge to find good time to tackle some XNA issues and write posts. I am currently working on Directional light shadows for my engine, I have cascaded &#8230; <a href="http://mquandt.com/blog/2010/06/status-june-2010/">Read more <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hi all, not dead.</p>
<p>Apologies for the lack of updates, I am in the process of finishing an internship required for my university course, and it is a challenge to find good time to tackle some XNA issues and write posts.</p>
<p>I am currently working on Directional light shadows for my engine, I have cascaded shadow maps implemented, and now I am just tackling some issues I have encountered, which is taking a while – I also need to find a good filtering method.</p>
<p>If I get bored of trying to fix those annoying issues, I will probably jump into re-implementing point lights, and spotlights, and write something about those.</p>
<p>Some housekeeping notes:</p>
<p>I encountered a pretty big issue with the “Reconstructing position from depth” technique, and I have taken that article down from the blog for now. At the moment my own code uses the old “Multiply my the Inverse of the View Projection matrix”, and probably will continue to until I have time to solve that problem.</p>
<p>I have also updated this blog to WordPress 3.0, so let me know if you encounter any issues.</p>
<p>Back to work.</p>
]]></content:encoded>
			<wfw:commentRss>http://mquandt.com/blog/2010/06/status-june-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[LPP] Ambient Lights</title>
		<link>http://mquandt.com/blog/2010/04/lpp-ambient-lights/</link>
		<comments>http://mquandt.com/blog/2010/04/lpp-ambient-lights/#comments</comments>
		<pubDate>Sat, 03 Apr 2010 01:32:01 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[DirectX]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[ambient lights]]></category>
		<category><![CDATA[light pre pass]]></category>

		<guid isPermaLink="false">http://mquandt.com/blog/2010/04/lpp-ambient-lights/</guid>
		<description><![CDATA[Ambient lights are used in modern games to fake the indirect illumination that exists in the real world. By adding a generally very weak light to the scene, we can avoid the 100% black shadows that really should not exist, all at a very low cost compared to proper indirect illumination or baked ambient light &#8230; <a href="http://mquandt.com/blog/2010/04/lpp-ambient-lights/">Read more <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ambient lights are used in modern games to fake the indirect illumination that exists in the real world. By adding a generally very weak light to the scene, we can avoid the 100% black shadows that really should not exist, all at a very low cost compared to proper indirect illumination or baked ambient light maps.</p>
<p>I have found that the simplest way to integrate these ambient lights into the Light Pre Pass system, and allow for other elements to change the lights throughout the game is to create a new light type that fits into the normal lighting model.</p>
<p>This is probably the simplest type out there, you just create a full screen quad and render it using a shader that writes the colour information directly to the light buffer. All we have to pass to the shader is the colour and intensity. (you could always pre-compute this, but beware of the byte-&gt;int32 auto promotion C# does)</p>
<p> <span id="more-101"></span>
<p>Here is the C# class:</p>
<pre class="brush: csharp;">public class AmbientLight
{
    public Color Color { get; set; }

    public bool Enabled { get; set; }

    private int intensity = 100;

    public int Intensity
    {
        get { return intensity; }
        set { intensity = value; }
    }

    private Effect shader;

    public AmbientLight(Color col, int intensity)
    {
        this.Color = col;
        this.Enabled = true;
        this.intensity = intensity;
    }

    public void LoadContent(ContentManager content)
    {
        shader = content.Load&lt;Effect&gt;(@&quot;Effects\Lights\l_ambient&quot;);
    }

    public void DrawLight(Renderer caller)
    {
        if (!Enabled)
            return;

        shader.Begin();
        shader.Parameters.TrySet(&quot;LightColor&quot;, Color.ToVector3());
        shader.Parameters.TrySet(&quot;Intensity&quot;, intensity);

        shader.CurrentTechnique.Passes[0].Begin();
        caller.FSQ.Draw();
        shader.CurrentTechnique.Passes[0].End();

        shader.End();
    }
}</pre>
<p>and the shader:</p>
<pre class="brush: cpp;">float3 LightColor;
float Intensity;

float4 vs_main(in float4 pos : POSITION) : POSITION
{
    return pos;
}

float4 ps_main() : COLOR
{
    return float4(LightColor * (Intensity / 100), 0);
}

technique AmbientLight
{
    pass p0
    {
        VertexShader = compile vs_2_0 vs_main();
        PixelShader = compile ps_2_0 ps_main();
    }
}</pre>
<p>I am in the middle of a crunch at work, and so future posts will be slow until it is all over. (That is why this one took a while to come out) I have not had the chance to do much work on my own XNA code, let alone tutorials. <img src='http://mquandt.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Thanks for your patience, I cannot wait to get back to XNA. (and I cannot wait for XNA 4.0 with HiDef)</p>
]]></content:encoded>
			<wfw:commentRss>http://mquandt.com/blog/2010/04/lpp-ambient-lights/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

