<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Nick Randolph's .NET Travels</title><link>http://community.softteq.com/blogs/nick/default.aspx</link><description>Continually looking for the yellow brick road so I can catch me a wizard....Join me as I explore the world of cool devices, neat technology and uber geeks. I spend most of my time talking about Microsoft related technologies such as the .NET Framework, SQL Server, Windows Mobile, SQL Server Compact Edition but I also discuss the current IT industry, the movers and shakers, and trends I observe from time to time.</description><dc:language>en</dc:language><generator>CommunityServer 2007 (Build: 20416.853)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/NickRandolphsDotNetTravels" /><feedburner:info uri="nickrandolphsdotnettravels" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><image><link>http://community.softteq.com/blogs/nick</link><url>http://community.softteq.com/Themes/default/images/nick_photo.jpg</url><title>Nick Randolph</title></image><feedburner:emailServiceId>NickRandolphsDotNetTravels</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><title>Windows Phone 7 series, Silverlight, XNA, Compact Framework, Background Processing and… Symbian S60</title><link>http://feedproxy.google.com/~r/NickRandolphsDotNetTravels/~3/HkvuUB0KyI0/windows-phone-7-series-silverlight-xna-compact-framework-background-processing-and-symbian-s60.aspx</link><pubDate>Tue, 16 Mar 2010 11:12:29 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:1651</guid><dc:creator>nick</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.softteq.com/blogs/nick/rsscomments.aspx?PostID=1651</wfw:commentRss><comments>http://community.softteq.com/blogs/nick/archive/2010/03/16/windows-phone-7-series-silverlight-xna-compact-framework-background-processing-and-symbian-s60.aspx#comments</comments><description>&lt;p&gt;So here are a few things I found interesting from the first day of MIX:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;- Windows Phone 7 series…. duh, well yes that one was obvious. It seems that nearly everyone is talking about it. In case you’ve been living in a hole somewhere you’ll have noticed that the development story is Silverlight and XNA for this platform&lt;/p&gt;    &lt;p&gt;- Compact Framework v3.7. If you inspect System.Environment.OSVersion in the emulator you’ll see that it reports version Microsoft Windows CE 7.0.6077. This is confirmed by this post that talks about the &lt;a href="http://blogs.msdn.com/abhinaba/archive/2010/03/13/windows-phone-7-series-programming-model.aspx"&gt;WP7 Programming Model&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;- Background Processing – That’s right, if you’re application is a good phone citizen (as defined by Microsoft of course) and you don’t consume too many resources your application will continue to operate in the background. This is demonstrable in the emulator if you create a background thread that increments a counter or prints a debug statement – when your application looses focus it will continue to increment/print.&lt;/p&gt;    &lt;p&gt;- Symbian S60 support for Silverlight (in-browser model). The Silverlight model for WP7 is entirely out of browser. In fact your Silverlight application will be deployed via Marketplace and will not have any contact as such with the browser. S60 support, as discussed in the post &lt;a href="http://blogs.msdn.com/abhinaba/archive/2010/03/14/silverlight-on-nokia-s60-platform.aspx"&gt;Silverlight on Nokia S60 platform&lt;/a&gt;, is in-browser and is only a very limited subset of Silverlight 2. The obvious questions here are whether WP7 will get SL in-browser support (they’ve already been talking about Flash inclusion but why not SL) and which other platforms will be next to get in-browser support.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I’m sure there will be plenty more bits emerging from MIX over the coming days.&lt;/p&gt;&lt;img src="http://community.softteq.com/aggbug.aspx?PostID=1651" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=HkvuUB0KyI0:EVIQ1nANi80:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=HkvuUB0KyI0:EVIQ1nANi80:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=HkvuUB0KyI0:EVIQ1nANi80:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=HkvuUB0KyI0:EVIQ1nANi80:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=HkvuUB0KyI0:EVIQ1nANi80:LN8Vd79RFGo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=LN8Vd79RFGo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=HkvuUB0KyI0:EVIQ1nANi80:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=HkvuUB0KyI0:EVIQ1nANi80:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://community.softteq.com/blogs/nick/archive/2010/03/16/windows-phone-7-series-silverlight-xna-compact-framework-background-processing-and-symbian-s60.aspx</feedburner:origLink></item><item><title>Windows Phone 7 series Developer Preview…. Virtual Machine Fail</title><link>http://feedproxy.google.com/~r/NickRandolphsDotNetTravels/~3/H1SVUDlucFU/windows-phone-7-series-developer-preview-virtual-machine-fail.aspx</link><pubDate>Mon, 15 Mar 2010 18:37:26 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:1650</guid><dc:creator>nick</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.softteq.com/blogs/nick/rsscomments.aspx?PostID=1650</wfw:commentRss><comments>http://community.softteq.com/blogs/nick/archive/2010/03/15/windows-phone-7-series-developer-preview-virtual-machine-fail.aspx#comments</comments><description>&lt;p&gt;Having sat through the MIX keynote I was excited to see the announcement of the Windows Phone 7 series development tools.&amp;#160; These can all be downloaded from &lt;a href="http://developer.windowsphone.com"&gt;http://developer.windowsphone.com&lt;/a&gt;.&amp;#160; The downloads are only compatible with VS2010 RC and so installing these on my main machine (which I haven’t had a chance to upgrade from the beta) is going to be a major effort.&amp;#160; I thought I’d go an install them on one of my many virtual machines I have running on my Hyper-V server – FAIL… According to the &lt;a href="http://download.microsoft.com/download/D/9/2/D926FB38-BB43-4D87-AE5A-1A3391279FAC/ReleaseNotes.htm"&gt;release notes&lt;/a&gt; this is not a supported option. I also noticed that round-tripping between VS and Blend is not supported – doesn’t that defeat the whole purpose?&lt;/p&gt;  &lt;blockquote&gt;   &lt;h3&gt;Scenarios Not Supported&lt;/h3&gt;    &lt;ul&gt;     &lt;li&gt;Opening Windows Phone projects in Expression Blend® is not supported, except for Expression Blend 4 Beta with “MICROSOFT EXPRESSION BLEND ADD-IN PREVIEW FOR WINDOWS PHONE.” &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Round-trip editing of the Windows Phone projects between Expression Blend and Visual Studio is not supported.&lt;/strong&gt; &lt;/li&gt;      &lt;li&gt;Windows XP and Windows Server® are not supported. &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Virtual PC and Hyper-V™ are not supported.&lt;/strong&gt; &lt;/li&gt;   &lt;/ul&gt; &lt;/blockquote&gt;  &lt;p&gt;I’m actually guessing the issue with Virtual PC/Hyper-V is to do with the emulator, rather than the actual developer experience. This is something that we saw with very old versions of the Windows Mobile emulator where they couldn’t be run in a virtual machine – this was fixed when the emulator was moved to true ARM emulation.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Update: &lt;/strong&gt;I’ve just finished installing the tools on a VM and the emulator, whilst slow to load the first time did in fact load and run my hello world application. Big kudos to Microsoft – the tooling looks great so far. &lt;/p&gt;  &lt;p&gt;Also, don’t forget to check out the following discussion documents on the platform and designing for Windows Phone 7 series.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://go.microsoft.com/?linkid=9713249"&gt;Application Platform Overview for Windows Phone&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://go.microsoft.com/?linkid=9713252"&gt;Windows Phone UI Design and Interaction Guide&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://go.microsoft.com/?linkid=9713253"&gt;Designing Web Sites for Phone Browsers&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;img src="http://community.softteq.com/aggbug.aspx?PostID=1650" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=H1SVUDlucFU:qy8xiCWibpg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=H1SVUDlucFU:qy8xiCWibpg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=H1SVUDlucFU:qy8xiCWibpg:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=H1SVUDlucFU:qy8xiCWibpg:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=H1SVUDlucFU:qy8xiCWibpg:LN8Vd79RFGo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=LN8Vd79RFGo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=H1SVUDlucFU:qy8xiCWibpg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=H1SVUDlucFU:qy8xiCWibpg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://community.softteq.com/blogs/nick/archive/2010/03/15/windows-phone-7-series-developer-preview-virtual-machine-fail.aspx</feedburner:origLink></item><item><title>Jamie Oliver live in Centennial Park with food from Sydney Picnics</title><link>http://feedproxy.google.com/~r/NickRandolphsDotNetTravels/~3/ldbFrL23y3c/jamie-oliver-live-in-centennial-park-with-food-from-sydney-picnics.aspx</link><pubDate>Sun, 14 Mar 2010 12:49:31 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:1648</guid><dc:creator>nick</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.softteq.com/blogs/nick/rsscomments.aspx?PostID=1648</wfw:commentRss><comments>http://community.softteq.com/blogs/nick/archive/2010/03/14/jamie-oliver-live-in-centennial-park-with-food-from-sydney-picnics.aspx#comments</comments><description>&lt;p&gt;We just got back from a fantastic evening watching &lt;a href="http://www.jamieoliver.com/"&gt;Jamie Oliver&lt;/a&gt; prepare some gourmet delights on the stage in Centennial Park. He’s got such a great stage presence. Between him, the audience and his good mate, &lt;a href="http://www.benodonoghue.com/"&gt;Ben O’Donoghue&lt;/a&gt;, Jamie brought the full song-and-dance production to Sydney, delivering an evening that will be remembered for a while to come.&lt;/p&gt;  &lt;p&gt;&lt;img style="display:inline;margin-left:0px;margin-right:0px;" title="Next image &amp;gt;&amp;gt;" align="left" src="http://www.sydneypicnic.com.au/images/gallery/P1010154.jpg" width="239" height="180" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Normally at these event you’re left drooling as all the best food ends up being created and eaten on stage by those fortunate enough to make themselves noticed at the front of the event. Not to be left feeling hungry we came prepared and had our own picnic courtesy of the &lt;a href="http://www.sydneypicnic.com.au"&gt;Sydney Picnic Co&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;After looking around at a number of different picnic providers I settled on the Sydney Picnic Co because they seemed to have the same idea about food as I do – it’s there to be enjoyed rather than to just fill you up. The selection of cold meats, wild onions, risoni and of course the Valrhona chocolate pots made for an amazing feast from which none of us went hungry. In fact we got a picnic sized for 4 and walked away with enough food for lunch tomorrow (and yes, there’s going to be some arguing over who gets what….).&lt;/p&gt;  &lt;p&gt;Anyhow, a big thanks to the Sydney Picnic Co for making a great event and unforgettable experience. If you’re looking to do a picnic in the park or at the beach I can’t recommend them enough!&lt;/p&gt;&lt;img src="http://community.softteq.com/aggbug.aspx?PostID=1648" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=ldbFrL23y3c:a9TrgFLtwIs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=ldbFrL23y3c:a9TrgFLtwIs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=ldbFrL23y3c:a9TrgFLtwIs:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=ldbFrL23y3c:a9TrgFLtwIs:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=ldbFrL23y3c:a9TrgFLtwIs:LN8Vd79RFGo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=LN8Vd79RFGo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=ldbFrL23y3c:a9TrgFLtwIs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=ldbFrL23y3c:a9TrgFLtwIs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://community.softteq.com/blogs/nick/archive/2010/03/14/jamie-oliver-live-in-centennial-park-with-food-from-sydney-picnics.aspx</feedburner:origLink></item><item><title>Windows Phone 7 – Will it be everything Microsoft wants it to be?</title><link>http://feedproxy.google.com/~r/NickRandolphsDotNetTravels/~3/1l2oIZAg9nQ/windows-phone-7-will-it-be-everything-microsoft-wants-it-to-be.aspx</link><pubDate>Fri, 12 Mar 2010 06:35:29 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:1646</guid><dc:creator>nick</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.softteq.com/blogs/nick/rsscomments.aspx?PostID=1646</wfw:commentRss><comments>http://community.softteq.com/blogs/nick/archive/2010/03/11/windows-phone-7-will-it-be-everything-microsoft-wants-it-to-be.aspx#comments</comments><description>&lt;p&gt;Charlie Kindel’s &lt;a href="http://feedproxy.google.com/~r/ckindel/~3/U4QgL6t6TYA/looking-into-the-future-last-year.aspx"&gt;posted about some internal planning&lt;/a&gt; that the team did as part of building Windows Phone 7 series. I’m assuming that this isn’t an ordered list but I’m also guessing that this was the order the points were on some list somewhere (perhaps as they were written on a whiteboard during a brainstorming session). If this is the case, it’s concerning that “&lt;em&gt;It’s easy to build beautiful applications users just love&amp;quot; &lt;/em&gt;falls at the bottom of the list.&lt;/p&gt;  &lt;p&gt;For those that are familiar with Windows Mobile development you’ll have gone through the list and gone yep, yep, yep to most of the points. Most of these points we could achieve on the current Windows Mobile platform (perhaps with the exception of protecting the developers IP and until recently a single marketplace). Where Windows Mobile sucks is the ability to generate awesome applications that users really want to use – it’s not impossible by the way, just hard to do. Actually, it’s hard to do this full stop. I’d almost stake my life on it that despite Microsoft’s attempt at making it easy to build “beautiful” applications, beauty is definitely in the eye of the beholder and we are going to get some hideous creations appearing on the marketplace.&lt;/p&gt;  &lt;p&gt;I’m looking forward to MIX next week when we’ll hear just how great we can my Windows Phone 7 series applications.&lt;/p&gt;&lt;img src="http://community.softteq.com/aggbug.aspx?PostID=1646" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=1l2oIZAg9nQ:UpXOaHocuj0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=1l2oIZAg9nQ:UpXOaHocuj0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=1l2oIZAg9nQ:UpXOaHocuj0:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=1l2oIZAg9nQ:UpXOaHocuj0:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=1l2oIZAg9nQ:UpXOaHocuj0:LN8Vd79RFGo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=LN8Vd79RFGo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=1l2oIZAg9nQ:UpXOaHocuj0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=1l2oIZAg9nQ:UpXOaHocuj0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://community.softteq.com/blogs/nick/archive/2010/03/11/windows-phone-7-will-it-be-everything-microsoft-wants-it-to-be.aspx</feedburner:origLink></item><item><title>OpenGL: More on Transforms</title><link>http://feedproxy.google.com/~r/NickRandolphsDotNetTravels/~3/aCJzWEOdtZo/opengl-more-on-transforms.aspx</link><pubDate>Tue, 09 Mar 2010 13:58:19 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:1645</guid><dc:creator>nick</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.softteq.com/blogs/nick/rsscomments.aspx?PostID=1645</wfw:commentRss><comments>http://community.softteq.com/blogs/nick/archive/2010/03/09/opengl-more-on-transforms.aspx#comments</comments><description>&lt;p&gt;In &lt;a title="OpenGL- Rotate, Scale and Translate" href="http://community.softteq.com/blogs/nick/archive/2010/03/08/opengl-rotate-scale-and-translate.aspx"&gt;OpenGL- Rotate, Scale and Translate&lt;/a&gt; I took a very simple example of transforming some text but what happens if you want to do something more complex. For example you want to have a pair of strings that you can transform around the screen together (ie not have to worry about transforming individually. To do this we can use a form of layering in our rendering where each layer can contain any number of items that will be rendered together. Each layer can be transformed with the resulting transform being applied to each item in the layer.&lt;/p&gt;  &lt;p&gt;We’re going to start off by defining an abstract class called ScreenWidget. I’ve used widget because I couldn’t think of a more “correct” name to call items that are going to be displayed on the screen. If there is a better name, do tell me as I’m keen to stick with a vocabulary that is well understood.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;abstract class ScreenWidget       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public Vector3f Position { get; set; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public Vector3f Anchor { get; set; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public Vector3f Scale { get; set; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public float Angle { get; set; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public Vector3f RotationAxis { get; set; } &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public ScreenWidget()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Scale = new Vector3f(1, 1, 1);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RotationAxis = new Vector3f(0,0,1);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public unsafe void Draw()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; gl.PushMatrix();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; gl.Translatef(Position.X, Position.Y, Position.Z);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; gl.Scalef(Scale.X, Scale.Y, Scale.Z);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; gl.Rotatef(Angle, RotationAxis.X, RotationAxis.Y, RotationAxis.Z);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; gl.Translatef(-Anchor.X, -Anchor.Y, -Anchor.Z); &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DrawComponents();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; gl.PopMatrix();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; protected abstract void DrawComponents(); &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public virtual void Setup() {} &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public virtual void Update(float secondsSinceLastUpdate){}       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In the ScreenWidget class we can see that it tracks values for position, anchor, scale, angle and rotation axis. It’s worth noting that the position is actually the position of the anchor point within the containing widget. If the widget isn’t nested within another widget then the position will be the position of the anchor point on the screen. &lt;/p&gt;  &lt;p&gt;The Draw method on the ScreenWidget is called in order to render all items contained within the widget to the screen. Before doing so it applies a sequence of transforms to scale, rotate and position the widget correctly with respect to its containing widget (and thus subsequently the screen). &lt;/p&gt;  &lt;p&gt;What’s interesting is that all these transforms and the call to DrawComponents (which by the way is what an overriding class has to implement in order to actually render items to the screen) are wrapped in a pair of PushMatrix and PopMatrix method calls.&amp;#160; Essentially this ensures that the OpenGL model matrix (ie the matrix that is used to transform items being rendered) is the same when the method ends as when the method started – failure to do this may lead to unexpected results with items being incorrectly positioned, scaled or rotated further on during rendering. PushMatrix pushes the current matrix onto a temporary stack, whilst PopMatrix pops the top matrix on the stack off and makes it the current matrix.&lt;/p&gt;  &lt;p&gt;We’ll start by creating the simplest of widgets, the TextWidget:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;class TextWidget:ScreenWidget       &lt;br /&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; OpenGLFont font;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; GlyphRun title;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public override void Setup()        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; font = new OpenGLFont(new Font(FontFamily.GenericSerif, 12, FontStyle.Regular));        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; title = new GlyphRun(font, &amp;quot;Hello World!&amp;quot;, new Size(int.MaxValue, int.MaxValue), OpenGLTextAlignment.Left, true);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Anchor = new Vector3f(title.Size.Width / 2, title.Size.Height / 2, 0);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; protected override void DrawComponents()        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; title.Draw();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;}&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;As you can see the TextWidget simply creates a GlyphRun object that can be draw during the DrawComponents method. Also note that the Anchor property has been set based on the size of the title. This will ensure that if this widget is rotated or scaled it will be done based on the centre of the text, rather than a corner.&lt;/p&gt;  &lt;p&gt;Next is a simple container widget, funnily enough called ContainerWidget:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;class ContainerWidget : ScreenWidget       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TextWidget text;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TextWidget text2;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void Setup()        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; text = new TextWidget();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; text.Position = new Vector3f(10,10, 0);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; text.Angle = 30;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; text.Setup(); &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; text2 = new TextWidget();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; text2.Position = new Vector3f(20, 20, 0);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; text2.Angle = 50;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; text2.Setup();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; protected override void DrawComponents()        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; text.Draw();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; text2.Draw();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;You can see that the two TextWidget instances have been position and rotated by different amounts. Before we can see this we’ll need to go back to our MainForm and create an instance of the ContainerWidget.&amp;#160; The Draw method will then be called on this instance in order to draw the two nested GlyphRuns.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;public partial class MainForm : ApplicationForm       &lt;br /&gt;{ &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; public MainForm()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InitializeComponent();&amp;#160; &lt;br /&gt;&lt;/em&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; ContainerWidget widget;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; protected override void SetupScene()        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; base.SetupScene(); &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widget = new ContainerWidget();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widget.Position = new Vector3f(0, 0, 0);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widget.Setup();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; protected override void DrawScene()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; base.DrawScene(); &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widget.Draw(); &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/em&gt;&lt;em&gt;} &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; protected override void UpdateScene(float secondsSinceLastUpdate)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; base.UpdateScene(secondsSinceLastUpdate); &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widget.Update(secondsSinceLastUpdate);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;}&lt;/em&gt;&lt;/p&gt;   &lt;em&gt;&lt;/em&gt;&lt;/blockquote&gt;  &lt;p&gt;As you can see this keeps both the MainForm and the ContainerWidget very clean in terms of the code than needs to be written to display elements. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.softteq.com/blogs/nick/image_6CA76584.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://community.softteq.com/blogs/nick/image_thumb_5BFF44C9.png" width="184" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This image isn’t particularly great as the two pieces of text are mostly off screen. So lets modify just the position of the ContainerWidget in the DrawScene method of the MainForm:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;gl.PushMatrix();       &lt;br /&gt;gl.Translatef(100.0f, 100.0f, 0);        &lt;br /&gt;widget.Draw();        &lt;br /&gt;gl.PopMatrix();&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This gives a much clearer picture of the two pieces of text but note that we only needed to translate the container widget.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.softteq.com/blogs/nick/image_688CF1E5.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://community.softteq.com/blogs/nick/image_thumb_27123F8C.png" width="184" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://community.softteq.com/aggbug.aspx?PostID=1645" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=aCJzWEOdtZo:KBizhlFPk78:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=aCJzWEOdtZo:KBizhlFPk78:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=aCJzWEOdtZo:KBizhlFPk78:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=aCJzWEOdtZo:KBizhlFPk78:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=aCJzWEOdtZo:KBizhlFPk78:LN8Vd79RFGo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=LN8Vd79RFGo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=aCJzWEOdtZo:KBizhlFPk78:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=aCJzWEOdtZo:KBizhlFPk78:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://community.softteq.com/blogs/nick/archive/2010/03/09/opengl-more-on-transforms.aspx</feedburner:origLink></item><item><title>OpenGL: Rotate, Scale and Translate</title><link>http://feedproxy.google.com/~r/NickRandolphsDotNetTravels/~3/_SzWwWiE7eE/opengl-rotate-scale-and-translate.aspx</link><pubDate>Tue, 09 Mar 2010 04:28:49 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:1642</guid><dc:creator>nick</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.softteq.com/blogs/nick/rsscomments.aspx?PostID=1642</wfw:commentRss><comments>http://community.softteq.com/blogs/nick/archive/2010/03/08/opengl-rotate-scale-and-translate.aspx#comments</comments><description>&lt;p&gt;In my previous post, &lt;a title="OpenGL ES Wrapper- Your First Application" href="http://community.softteq.com/blogs/nick/archive/2010/03/08/opengl-es-wrapper-your-first-application.aspx"&gt;OpenGL ES Wrapper- Your First Application&lt;/a&gt;, you would have seen that we were creating a GlyphRun that we then draw. This is actually a wrapper class that handles all the processing required to draw the text on the screen. However, it doesn’t handle the positioning of the text on the screen – by default it is located at the origin ie (0,0,0).&lt;/p&gt;  &lt;p&gt;To move this text around the screen we can specify an amount to translate, scale or even rotate the text by using the appropriate OpenGL commands. One thing to note here is that the order in which you do these operations may change the result you see. For example in the following images the original text (first image) is translated by (50,50,0) and then rotate around the z axis by 40 degrees. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.softteq.com/blogs/nick/image_66A728CA.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://community.softteq.com/blogs/nick/image_thumb_46E82935.png" width="184" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Now apply translation and rotation – note the order of the gl.Translate and gl.Rotate method calls.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;gl.Translatef(50.0f,50.0f,0);        &lt;br /&gt;gl.Rotatef(40.0f,0,0,1.0f);         &lt;br /&gt;title.Draw(); &lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://community.softteq.com/blogs/nick/image_37651766.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://community.softteq.com/blogs/nick/image_thumb_2E950F1A.png" width="184" height="244" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;Now apply translation and rotation in the other order.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;gl.Rotatef(40.0f,0,0,1.0f);      &lt;br /&gt;&lt;em&gt;&lt;em&gt;gl.Translatef(50.0f,50.0f,0);          &lt;br /&gt;&lt;/em&gt;&lt;/em&gt;&lt;em&gt;title.Draw(); &lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://community.softteq.com/blogs/nick/image_28D9F574.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://community.softteq.com/blogs/nick/image_thumb_6B6990EC.png" width="184" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You can see that the order that rotate and translate are applied makes a difference. Interestingly they almost appear in the wrong order. In the second image the original image has been translated by (50,50,0) then rotated to get the text to where it appears, whilst in the previous image the text has been rotated by 40 and then translated. This is a result of the way OpenGL uses matrix multiplication to apply transforms to what you are drawing. Each time you issue a transform the corresponding matrix is multiplied against the current matrix to calculate the position of the items you drawing.&lt;/p&gt;  &lt;p&gt;The other thing you’ll notice is that the text appears to be rotating around the top left corner of the text. To get it to rotate around the centre of the text, you need to apply a translate function to position the text with its centre at the origin, prior to rotating it and then translating it back into it’s final position. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.softteq.com/blogs/nick/image_57DC314B.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://community.softteq.com/blogs/nick/image_thumb_444ED1AA.png" width="184" height="244" /&gt;&lt;/a&gt; &lt;a href="http://community.softteq.com/blogs/nick/image_6DE29CDD.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://community.softteq.com/blogs/nick/image_thumb_44F787D4.png" width="184" height="244" /&gt;&lt;/a&gt; &lt;a href="http://community.softteq.com/blogs/nick/image_09577914.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://community.softteq.com/blogs/nick/image_thumb_5B1D7D59.png" width="184" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Update &lt;/strong&gt;– here’s the code for doing this additional translation (again, note the order that they’re done in)&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;gl.Translatef(50.0f, 50.0f, 0);        &lt;br /&gt;gl.Rotatef(40.0f, 0, 0, 1.0f);        &lt;br /&gt;gl.Translatef(-title.Size.Width/2, -title.Size.Height/2, 0);        &lt;br /&gt;title.Draw();&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://community.softteq.com/aggbug.aspx?PostID=1642" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=_SzWwWiE7eE:tuq9Fg-i-Cw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=_SzWwWiE7eE:tuq9Fg-i-Cw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=_SzWwWiE7eE:tuq9Fg-i-Cw:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=_SzWwWiE7eE:tuq9Fg-i-Cw:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=_SzWwWiE7eE:tuq9Fg-i-Cw:LN8Vd79RFGo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=LN8Vd79RFGo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=_SzWwWiE7eE:tuq9Fg-i-Cw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=_SzWwWiE7eE:tuq9Fg-i-Cw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://community.softteq.com/blogs/nick/archive/2010/03/08/opengl-rotate-scale-and-translate.aspx</feedburner:origLink></item><item><title>OpenGL ES Wrapper: Your First Application</title><link>http://feedproxy.google.com/~r/NickRandolphsDotNetTravels/~3/9VqEjXCnNXU/opengl-es-wrapper-your-first-application.aspx</link><pubDate>Mon, 08 Mar 2010 13:12:42 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:1640</guid><dc:creator>nick</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://community.softteq.com/blogs/nick/rsscomments.aspx?PostID=1640</wfw:commentRss><comments>http://community.softteq.com/blogs/nick/archive/2010/03/08/opengl-es-wrapper-your-first-application.aspx#comments</comments><description>&lt;p&gt;In my previous post on &lt;a href="http://community.softteq.com/blogs/nick/archive/2010/03/06/getting-started-with-opengl-on-windows-mobile.aspx"&gt;Getting Started with OpenGL on Windows Mobile&lt;/a&gt; I talked about taking the existing OpenGL ES wrapper by &lt;a href="http://www.koushikdutta.com/2008/08/net-compact-framework-wrapper-for.html"&gt;Koushik Dutta&lt;/a&gt; and extending it to make it easier to work with.&amp;#160; In this, and subsequent posts, I’ll show you how you can take this wrapper and start building out an application.&lt;/p&gt;  &lt;p&gt;To get started create a new Smart Device project in Visual Studio 2008.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.softteq.com/blogs/nick/image_65ADA81C.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://community.softteq.com/blogs/nick/image_thumb_430969A1.png" width="265" height="169" /&gt;&lt;/a&gt; &lt;a href="http://community.softteq.com/blogs/nick/image_12FF1820.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://community.softteq.com/blogs/nick/image_thumb_443DDCB3.png" width="299" height="163" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Note that I’ve created this against the Windows Mobile 5 SDK – if you can find a legacy device still running WM5 which supports OpenGL then this application will still run. I only bother building against the later SDKs if I particularly need one of the few features that were added since WM5.&lt;/p&gt;  &lt;p&gt;Next, copy the two OpenGL projects from the &lt;a href="http://community.softteq.com/blogs/nick/OpenGLESWrapper_1CAE450A.zip"&gt;this link&lt;/a&gt; into your solution folder and add them to your solution within Visual Studio. Also, go ahead and add a project reference from your application to both OpenGL projects.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.softteq.com/blogs/nick/image_5B1CAE2F.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://community.softteq.com/blogs/nick/image_thumb_4B2D696B.png" width="179" height="304" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You won’t be needing the designer support for your form but you do need some of the initialization values set in the Form1.designer.cs file. It’s up to you whether you move the InitializeComponent method from your Form1.designer.cs file into your Form1.cs, and then delete Form1.designer.cs, or just leave the designer.cs file there and ignore it. &lt;/p&gt;  &lt;p&gt;At this stage I’d recommend renaming Form1 to something more descriptive. In this case my application is only going to have a single form so I have used MainForm. In the MainForm.cs file I’ve modified the class to inherit from ApplicationForm, rather than just Form – this gives me all the OpenGL initialization I talked about previously, as well as some virtual methods that can be implemented to setup, draw and update the current scene:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;public partial class MainForm : ApplicationForm       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public MainForm()        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InitializeComponent();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; protected override void SetupScene()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; base.SetupScene();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; protected override void DrawScene()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; base.DrawScene();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; protected override void UpdateScene(float secondsSinceLastUpdate)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; base.UpdateScene(secondsSinceLastUpdate);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In this case we’re going to simply implement Hello World by creating a Font and GlyphRun in the SetupScene method:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;OpenGLFont font;       &lt;br /&gt;GlyphRun title;        &lt;br /&gt;protected override void SetupScene()        &lt;br /&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; base.SetupScene(); &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; font = new OpenGLFont(new Font(FontFamily.GenericSerif, 12, FontStyle.Regular));       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; title = new GlyphRun(font, &amp;quot;Hello World!&amp;quot;, new Size(int.MaxValue, int.MaxValue), OpenGLTextAlignment.Left, true);        &lt;br /&gt;}&lt;/em&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Then to draw the text on the screen, simply update the Draw method:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;protected override void DrawScene()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; base.DrawScene(); &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; title.Draw();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.softteq.com/blogs/nick/image_28F55DE5.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://community.softteq.com/blogs/nick/image_thumb_6E99E803.png" width="184" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Not the worlds greatest demo, but surprisingly simple for an OpenGL application. In the next post we’ll start to investigate what you can really do with OpenGL that you can’t do easily with traditional Windows Forms application.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Note: &lt;/strong&gt;In the InitializeOpenGL function within ApplicationForm you need to include the following call otherwise your text will appear as a solid white rectangle:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;gl.BlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA);&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://community.softteq.com/aggbug.aspx?PostID=1640" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=9VqEjXCnNXU:g2OY6r-xMqg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=9VqEjXCnNXU:g2OY6r-xMqg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=9VqEjXCnNXU:g2OY6r-xMqg:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=9VqEjXCnNXU:g2OY6r-xMqg:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=9VqEjXCnNXU:g2OY6r-xMqg:LN8Vd79RFGo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=LN8Vd79RFGo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=9VqEjXCnNXU:g2OY6r-xMqg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=9VqEjXCnNXU:g2OY6r-xMqg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://community.softteq.com/blogs/nick/archive/2010/03/08/opengl-es-wrapper-your-first-application.aspx</feedburner:origLink></item><item><title>Getting Started with OpenGL on Windows Mobile</title><link>http://feedproxy.google.com/~r/NickRandolphsDotNetTravels/~3/NKlK7aFOb6w/getting-started-with-opengl-on-windows-mobile.aspx</link><pubDate>Sun, 07 Mar 2010 00:52:54 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:1638</guid><dc:creator>nick</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://community.softteq.com/blogs/nick/rsscomments.aspx?PostID=1638</wfw:commentRss><comments>http://community.softteq.com/blogs/nick/archive/2010/03/06/getting-started-with-opengl-on-windows-mobile.aspx#comments</comments><description>&lt;p&gt;There are a number of good posts on working with OpenGL on Windows Mobile via the .NET Compact Framework but one thing I’ve noticed is that they don’t really try to wrap the OpenGL functionality in a way that makes it reusable as an application/game framework. Mostly the logic for rendering was intermingled with windows forms logic, such as OnPaint, which was intermingled with logic for updating the current scene. If you look at say XNA you notice that the model is very simple – essentially they have a single run loop consisting of Update and Draw. I set out to update the OpenGL ES wrapper initially provided by &lt;a href="http://www.koushikdutta.com/2008/08/net-compact-framework-wrapper-for.html"&gt;Koushik Dutta&lt;/a&gt; and since extended with some great examples across at &lt;a href="http://forum.xda-developers.com/showthread.php?t=511363"&gt;XDA Developers&lt;/a&gt;. Here’s what I came up with to start with.&lt;/p&gt;  &lt;p&gt;If you grab the &lt;a href="http://www.koushikdutta.com/2008/08/net-compact-framework-wrapper-for.html"&gt;OpenGL ES wrapper&lt;/a&gt; you will notice that at its core is essentially a single Windows Form that handles the OnPaint method in order to draw using OpenGL primitives. Nearly all the computation and rendering is done in this method. In the constructor and subsequent initialization methods there are a number of OpenGL ES calls in order to setup the display, surface and context required in order for OpenGL to draw to the screen. In order to create a reusable framework that would be a starting point for any project undertaken in OpenGL all this code would have to be wrapped in a way that it doesn’t need to be duplicated for each project.&lt;/p&gt;  &lt;p&gt;I decided to go down the path of creating an abstract form which I called the ApplicationForm. This form has three virtual methods that the overriding form needs to implement:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;protected virtual void SetupScene(){} &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;protected virtual void UpdateScene(float secondsSinceLastUpdate){} &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;protected virtual void DrawScene(){}&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;As you can imagine these form the basis of the Draw-Update rendering loop. Of course SetupScene is called prior to the first iteration of this loop to ensure the scene is correctly setup before the first call to Draw. Unlike some implementations which rely on a For/While loop and DoEvents (to allow windows events to be processed) I went with the approach that works in conjunction with the existing windows message pump. When the form needs to be painted the OnPaint method is invoked:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;protected override void OnPaint(PaintEventArgs e)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; base.OnPaint(e); &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Draw the current scene       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RunDrawScene(); &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; egl.SwapBuffers(_display, _surface);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; gl.Clear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT); &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Update the current scene       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RunUpdateScene();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;As you can see this does a single pass of the rendering loop.&amp;#160; What’s interesting is the implementation of the RunUpdateScene method:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;private void RunUpdateScene()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Check for running instance - exit if already running        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Interlocked.CompareExchange(ref isUpdating, 1, 0) == 1)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Only instance running, so create the thread in which to       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // invoke the UpdateScene method        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ThreadPool.QueueUserWorkItem((async) =&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Calculate the time in seconds since last update        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var seconds = (float)Environment.TickCount/1000.0f;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var diff = 0.0f;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (this.lastUpdate &amp;gt; 0)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; diff = seconds - this.lastUpdate;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.lastUpdate = seconds; &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Invoke the virtual UpdateScene method       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; UpdateScene(diff);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; finally        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Make sure this method can be re-entered        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Interlocked.Decrement(ref isUpdating); &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Invoke &amp;quot;Invalidate&amp;quot; on the control which will cause       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // the control to be refreshed (ie OnPaint called) leading        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // to another iteration of Draw and Update        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.BeginInvoke((Action)(() =&amp;gt; { Invalidate(); }));        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Essentially this method wraps the actual call to UpdateScene for three reasons:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;To ensure only one instance of UpdateScene is being invoked at any time&lt;/li&gt;    &lt;li&gt;To push the call to UpdateScene onto a separate thread. This prevents the UI from blocking whilst it’s in running.&lt;/li&gt;    &lt;li&gt;To invoke Invalidate once UpdateScene has completed. This ensures that OnPaint will be invoked again and that the draw-update loop will be invoked again.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;In the next post I’ll show you how to get started with this wrapper by overriding the ApplicationForm.&amp;#160; In the meantime, try it yourself….&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:8eb9d37f-1541-4f29-b6f4-1eea890d4876:58f79f73-3bd0-460a-9d93-f199b6d76fdb" class="wlWriterEditableSmartContent"&gt;&lt;p&gt;&lt;div&gt;&lt;a href="http://community.softteq.com/blogs/nick/OpenGLESWrapper_1CAE450A.zip" target="_self"&gt;OpenGLESWrapper.zip&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://community.softteq.com/aggbug.aspx?PostID=1638" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=NKlK7aFOb6w:koiAZWHjNys:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=NKlK7aFOb6w:koiAZWHjNys:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=NKlK7aFOb6w:koiAZWHjNys:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=NKlK7aFOb6w:koiAZWHjNys:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=NKlK7aFOb6w:koiAZWHjNys:LN8Vd79RFGo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=LN8Vd79RFGo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=NKlK7aFOb6w:koiAZWHjNys:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=NKlK7aFOb6w:koiAZWHjNys:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://community.softteq.com/blogs/nick/archive/2010/03/06/getting-started-with-opengl-on-windows-mobile.aspx</feedburner:origLink></item><item><title>Breaking Changes: Windows Phone 7 series Development Story</title><link>http://feedproxy.google.com/~r/NickRandolphsDotNetTravels/~3/QdHhY2ZpUoA/breaking-changes-windows-phone-7-series-development-story.aspx</link><pubDate>Fri, 05 Mar 2010 21:47:39 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:1637</guid><dc:creator>nick</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.softteq.com/blogs/nick/rsscomments.aspx?PostID=1637</wfw:commentRss><comments>http://community.softteq.com/blogs/nick/archive/2010/03/05/breaking-changes-windows-phone-7-series-development-story.aspx#comments</comments><description>&lt;p&gt;Well the cat’s out of the bag… actually no all that’s happened is that Microsoft has confirmed that one of the cats that was in the bag is now dead: The rumour that legacy applications will run on Windows Phone 7 series is officially dead with Charlie Kindel confirming the lack of backwards compatibility in a post entitled &lt;a title="http://blogs.msdn.com/ckindel/archive/2010/03/04/different-means-better-with-the-new-windows-phone-developer-experience.aspx" href="http://blogs.msdn.com/ckindel/archive/2010/03/04/different-means-better-with-the-new-windows-phone-developer-experience.aspx"&gt;Different Means Better with the new Windows Phone Developer Experience&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;What’s interesting is just how well the whole Windows Phone 7 series announcements have been. If you look at other blogs from Microsoft, they all have similar posts talking about the decisions that were made in order to give developers an awesome platform to start building applications on. For example the following blogs all have posts coinciding with Charlie’s post:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Andre Vrignaud: &lt;a href="http://www.ozymandias.com"&gt;www.ozymandias.com&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;&lt;a&gt;Break with the Past, Bright New Future: Windows Phone Application Development Platform built on XNA and Silverlight&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Christian Schormann: &lt;u&gt;&lt;a href="http://electricbeach.org/?page_id=2"&gt;electricbeach.org&lt;/a&gt;&lt;/u&gt; &lt;/p&gt;    &lt;p&gt;&lt;a&gt;Windows Phone 7 Series for Designers and Developers&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Shawn Hargreaves: &lt;a href="http://blogs.msdn.com/shawnhar"&gt;blogs.msdn.com/shawnhar&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;&lt;a&gt;Backward compatibility&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Anand Iyer: &lt;a href="http://www.artificialignorance.net/blog"&gt;www.artificialignorance.net/blog&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;&lt;a&gt;Windows Phone 7 Series – Developers, Developers, Developers&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Michael Klucher: &lt;a href="http://klucher.com"&gt;klucher.com&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;&lt;a&gt;Gaming Development for the Go!&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Also confirmed in a twitter Q&amp;amp;A at &lt;a href="http://twitter.com/wp7dev"&gt;@WP7dev&lt;/a&gt; was support for both Silverlight and XNA development for Windows Phone 7 series. Hopefully this will provide a much more consistent rapid development environment for building phone applications whilst still making them perform. &lt;/p&gt;  &lt;p&gt;Currently on Windows Mobile we have a number of technologies to choose from, none of which provide a great experience to both developer and consumer without a lot of cycles invested in making your application look good. The worst part about this is not the cycles spent working out what the application should look like (eg working with a designer to make it look awesome), it’s the wasted cycles having to code it from the ground up each time.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Native C++&lt;/strong&gt;: Sure you can do nearly anything you want but you take a major productivity hit. Not to mention building a team of top notch c++ developers is becoming very difficult.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;WinForms&lt;/strong&gt;: This just sux for anything other than a mundane LOB application. Sure you can use some of the transparency tools out there to get stylish buttons, or override OnPaint to DIY it to make it look reasonable but you aren’t really going to be doing much in the way of animations, rotating elements etc.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Direct3D&lt;/strong&gt;: Well this is a technology flop in so far as there is little hardware rendering support out there on a lot of devices. Best to ignore this one….&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;OpenGL&lt;/strong&gt;: This is an interesting beast. You can write all your code in C#, yet you have the power of doing nearly any sort of animation, rotation, translation, in fact there is a lot you can do with vectors, triangles and quads. Documentation on getting started and troubleshooting is a little light on but once you get things up and running the results are quite good. You do of course have to think in matrices, projections etc which for those not familiar with these constructs can pose a bit of a learning barrier.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So, if you were going to build a mobile application today, what would you do….. Well contrary to Charlie’s post in which he suggests that developers will continue to build for Windows Mobile, I suspect the reality is that nearly every mobile developer out there will start building Windows Phone 7 series applications as soon as the tooling arrives.&lt;/p&gt;&lt;img src="http://community.softteq.com/aggbug.aspx?PostID=1637" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=QdHhY2ZpUoA:T-dOGEuD_78:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=QdHhY2ZpUoA:T-dOGEuD_78:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=QdHhY2ZpUoA:T-dOGEuD_78:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=QdHhY2ZpUoA:T-dOGEuD_78:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=QdHhY2ZpUoA:T-dOGEuD_78:LN8Vd79RFGo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=LN8Vd79RFGo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=QdHhY2ZpUoA:T-dOGEuD_78:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=QdHhY2ZpUoA:T-dOGEuD_78:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://community.softteq.com/blogs/nick/archive/2010/03/05/breaking-changes-windows-phone-7-series-development-story.aspx</feedburner:origLink></item><item><title>OData SyncClient for MIX</title><link>http://feedproxy.google.com/~r/NickRandolphsDotNetTravels/~3/fzOS_uRPX7k/odata-syncclient-for-mix.aspx</link><pubDate>Tue, 02 Mar 2010 22:14:19 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:1636</guid><dc:creator>nick</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.softteq.com/blogs/nick/rsscomments.aspx?PostID=1636</wfw:commentRss><comments>http://community.softteq.com/blogs/nick/archive/2010/03/02/odata-syncclient-for-mix.aspx#comments</comments><description>&lt;p&gt;Yesterday &lt;a href="http://twitter.com/ckindel"&gt;Charlie Kindel&lt;/a&gt; tweeted about this &lt;a href="http://live.visitmix.com/SyncClient"&gt;session planner&lt;/a&gt; that can be used for MIX. What’s really interesting about this Silverlight application is that it has the ability to synchronise data and work offline.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.softteq.com/blogs/nick/image_1C33A450.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://community.softteq.com/blogs/nick/image_thumb_5E0A63D1.png" width="350" height="281" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Having noticed this (which you can hardly miss given the “Sync” icon in the top right corner) I wondered if there was a session on Sync.&amp;#160; Sure enough there is a session called “Building Offline Web Apps Using Microsoft Sync Framework” with the following abstract:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Come learn about offline web applications and how they can provide a better experience to your users.&amp;#160; Windows Azure, Microsoft SQL Azure, and Sync Framework are the core technologies that enable web developers to create offlien applications. See how to use these three technologies to produce great applications.&amp;#160; We also introduce our upcoming support for offline Microsoft Silverlight clients and show you how you will have the flexibility to use any platform for your offline applications, device or desktop.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Coming from “mobile-land” where we take doing synchronisation (whether it be DIY webservices, RDA, Merge, Sync Services) for granted the idea that finally web developers might get the concept of offline applications is quite laughable. But, leaving that aside what interested me is what this “upcoming support for Silverlight” is going to be – well they kind of let the cat out of the bag with the session builder. Whilst there is a pseudo attempt at hiding what’s going on in the sync (I’m guessing more out of privacy concerns rather than hiding the sync technology) this is easily broken using Fiddler (you’ll have to enable https tracing in Fiddler and add the Fiddler certificate to your trusted cert list – see &lt;a title="http://www.fiddler2.com/Fiddler/help/httpsdecryption.asp" href="http://www.fiddler2.com/Fiddler/help/httpsdecryption.asp"&gt;http://www.fiddler2.com/Fiddler/help/httpsdecryption.asp&lt;/a&gt; for instructions).&lt;/p&gt;  &lt;p&gt;A typical sync session looks like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.softteq.com/blogs/nick/image_42192ED9.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://community.softteq.com/blogs/nick/image_thumb_38DCF398.png" width="409" height="310" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Notice that each request to either GetChanges or UploadChanges has the same suffix:&lt;/p&gt;  &lt;p&gt;/ODataSync.svc/GetChanges/377d1869-e69a-4b67-9ddd-392169e9b06e?userToken=d39ea0f0e5104c4aad457b897a7b4b62&lt;/p&gt;  &lt;p&gt;/ODataSync.svc/UploadChanges/377d1869-e69a-4b67-9ddd-392169e9b06e?userToken=d39ea0f0e5104c4aad457b897a7b4b62&lt;/p&gt;  &lt;p&gt;The response to the first GetChanges call (which doesn’t contain any data) looks something like:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.softteq.com/blogs/nick/image_7BF84BF8.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://community.softteq.com/blogs/nick/image_thumb_40C4702D.png" width="376" height="251" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In this we can see that there is an anchor and then there are a list of entries.&amp;#160; Each entry, under the content node, contains a series of properties.&amp;#160; As you can see sync is using odata to transport entity information.&lt;/p&gt;  &lt;p&gt;Each successive GetChanges call sends the anchor back to the server – I’m guessing this anchor value is used to track the synchronization state of the client with the server.&lt;/p&gt;  &lt;p&gt;“eyJLbm93bGVkZ2VCbG9iIjoiQUFBQUJRQUFBQUFBQUFBQkFBQUFBQUFBQUFVQUFCQUFBQUFDTjMwWWFlYWFTMmVkM1RraGFlbXdidGxzQU1rZkowNyt1MHNWYXE1YVBDNEFBQUFZQUFBUUFTZ0NBQUFCQUFBQUZRQUFBQUVBQUFBQkFBQUFBQUFBQUJjQUFBQUJBQUFBRmdBQUFBRUFBd0FBQUFBQUFBQUFBQUFBQUJrQkFBQUFBQT09IiwiVGFibGVXYXRlcm1hcmtzIjpbeyJLZXkiOiJTY2hlZHVsZUl0ZW0iLCJWYWx1ZSI6MTcwNTZ9XX0=”&lt;/p&gt;  &lt;p&gt;Of course, the session planner must be storing data in Silverlight’s isolated storage.&amp;#160; After a little poking I managed to find some of the data being stored:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;{&amp;quot;Anchor&amp;quot;:&amp;quot;eyJLbm93bGVkZ2VCbG9iIjoiQUFBQUJRQUFBQUFBQUFBQkFBQUFBQUFBQUFVQUFCQUFBQUFDTjMwWWFlYWFTMmVkM1RraGFlbXdidGxzQU1rZkowNyt1MHNWYXE1YVBDNEFBQUFZQUFBUUFTZ0NBQUFCQUFBQUZRQUFBQUlBQUFBQkFBQUFBQUFBQUFFQUFBQUNBQUFBQUFBQUFBQUFBRWswQUFBQUFRQUFBQUFBQUVrekFBQUFGd0FBQUFFQUFBQVdBQUFBQVFBREFBQUFBQUVBQUFBQUFBQUFHUUVBQUFBQSIsIlRhYmxlV2F0ZXJtYXJrcyI6W119&amp;quot;,&amp;quot;Data&amp;quot;:[{&amp;quot;Key&amp;quot;:&amp;quot;speaker&amp;quot;,&amp;quot;Value&amp;quot;:[{&amp;quot;__type&amp;quot;:&amp;quot;ItemChangeOfDbSpeakerzgKIiSuC:#Microsoft.Synchronization.Offline&amp;quot;,&amp;quot;IsCreate&amp;quot;:false,&amp;quot;IsDirty&amp;quot;:false,&amp;quot;IsTombstone&amp;quot;:false,&amp;quot;Item&amp;quot;:{&amp;quot;Bio&amp;quot;:&amp;quot;Beginning life as an art student, then after a stint in the military joining the world of technology, Adam Kinney feels right at home in that sweet spot between Designer and Developer. Always at least a part-time evangelist, Adam has traveled the trail of UI technologies. First HTML\/CSS, then Flash, WPF and now Silverlight, the one client technology to rule them all, he has enjoyed learning, experimenting and teaching them all.\r\nAdam’s current focus is Expression Blend, the first interactive design tool that’s really made him happy as a designer and developer.&amp;quot;,&amp;quot;SpeakerDisplayName&amp;quot;:&amp;quot;Adam Kinney&amp;quot;,&amp;quot;SpeakerFirstName&amp;quot;:&amp;quot;Adam&amp;quot;,&amp;quot;SpeakerID&amp;quot;:&amp;quot;b5056969-1f9f-4268-8cbd-64a2fcb7080f&amp;quot;,&amp;quot;SpeakerLastName&amp;quot;:&amp;quot;Kinney&amp;quot;,&amp;quot;SpeakerName&amp;quot;:&amp;quot;Adam-Kinney&amp;quot;}},{&amp;quot;__type&amp;quot;:&amp;quot;ItemChangeOfDbSpeakerzgKIiSuC:#Microsoft.Synchronization.Offline&amp;quot;,&amp;quot;IsCreate&amp;quot;:false,&amp;quot;IsDirty&amp;quot;:false,&amp;quot;IsTombstone&amp;quot;:false,&amp;quot;Item&amp;quot;:{&amp;quot;Bio&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;SpeakerDisplayName&amp;quot;:&amp;quot;Akash Patel&amp;quot;,&amp;quot;SpeakerFirstName&amp;quot;:&amp;quot;Akash&amp;quot;,&amp;quot;SpeakerID&amp;quot;:&amp;quot;cd381f2f-cdca-469a-a937-dae1ad6f72d6&amp;quot;,&amp;quot;SpeakerLastName&amp;quot;:&amp;quot;Patel&amp;quot;,&amp;quot;SpeakerName&amp;quot;:&amp;quot;Akash-Patel&amp;quot;}},&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Sure enough as you can see the anchor is being persisted, along with a series of entities. There are typical fields that you’d expect with synchronization such as IsCreate, IsDirty, IsTombstone but very little in the way of date time or versioning stamps. This again points towards the server doing the bulk of the synchronization logic.&lt;/p&gt;  &lt;p&gt;Well that’s enough poking around with the session builder for one day – I can’t wait to see this session at MIX and see what the sync team have been working on.&lt;/p&gt;&lt;img src="http://community.softteq.com/aggbug.aspx?PostID=1636" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=fzOS_uRPX7k:4mG6kUxrT-U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=fzOS_uRPX7k:4mG6kUxrT-U:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=fzOS_uRPX7k:4mG6kUxrT-U:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=fzOS_uRPX7k:4mG6kUxrT-U:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=fzOS_uRPX7k:4mG6kUxrT-U:LN8Vd79RFGo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=LN8Vd79RFGo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=fzOS_uRPX7k:4mG6kUxrT-U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=fzOS_uRPX7k:4mG6kUxrT-U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://community.softteq.com/blogs/nick/archive/2010/03/02/odata-syncclient-for-mix.aspx</feedburner:origLink></item><item><title>LINQ to SQL generator fails due to custom code</title><link>http://feedproxy.google.com/~r/NickRandolphsDotNetTravels/~3/o_lNAU1UMqc/linq-to-sql-generator-fails-due-to-custom-code.aspx</link><pubDate>Mon, 01 Mar 2010 04:21:12 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:1634</guid><dc:creator>nick</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://community.softteq.com/blogs/nick/rsscomments.aspx?PostID=1634</wfw:commentRss><comments>http://community.softteq.com/blogs/nick/archive/2010/02/28/linq-to-sql-generator-fails-due-to-custom-code.aspx#comments</comments><description>&lt;p&gt;Today I decided to do something quite innocuous, or so I thought, on an existing application that happened to use LINQ to SQL. I needed to add an additional field to an existing table which I did quite easily via SSMS. However, when I came to update the LINQ to SQL model file I ran into all sorts of issues. The easiest way I’ve found in the past to update the LINQ to SQL model is to simply delete the table that you need to update and drag it onto the design surface from Server Explorer. Normally this updates the model and doesn’t usually break anything (unless you say delete a field that is in use in your code in which case the compile error is an artefact you want). &lt;/p&gt;  &lt;p&gt;Today this process seemed to go completely haywire for no reason. I was getting 10-15 compile errors – since I was just adding a field I shouldn’t have seen any. Thinking that I’d broken something accidentally I reverted back to the version in subversion and tried again. Same result. Looking in Solution Explorer it was clear why these errors were being generated – there was no .designer.cs file to go alongside the .dbml LINQ to SQL model file.&lt;/p&gt;  &lt;p&gt;I right-click on the dbml file in Solution Explorer and selected “Run Custom Tool” (for those unfamiliar with the Visual Studio custom tool model this is essentially an external executable that is called to automatically create or modify files in your solution – in this case create the .designer.cs file). This time I at least got an error message:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.softteq.com/blogs/nick/image_6BAF4438.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://community.softteq.com/blogs/nick/image_thumb_10605BB0.png" width="310" height="123" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Error: &lt;strong&gt;The custom tool ‘MSLinqToSQLGenerator’ failed. Unsepecifed error&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Interestingly it also opened up a file in which I had added some custom properties for my LINQ to SQL entities. I found that if I excluded this file from my solution I was again able to run the custom tool to generate the .designer.cs file. So, in order to make schema changes from now on I need to:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;-Exclude my custom properties file&lt;/p&gt;    &lt;p&gt;-Make changes to my LINQ to SQL model&lt;/p&gt;    &lt;p&gt;-Run the Custom tool to generate the .designer.cs file – this is automatically run if you save or close the model designer&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Update: &lt;/strong&gt;Actually, you need to do a build of the project that contains the LINQ to SQL model prior to adding the custom properties file back into the project. Otherwise Visual Studio decides to nuke the .designer.cs file again.&lt;/p&gt;    &lt;p&gt;-Include my custom properties files&lt;/p&gt;    &lt;p&gt;-Rebuild my solution.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Hope this helps anyone else seeing the same issue&lt;/p&gt;&lt;img src="http://community.softteq.com/aggbug.aspx?PostID=1634" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=o_lNAU1UMqc:Ysn6jMEfHZs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=o_lNAU1UMqc:Ysn6jMEfHZs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=o_lNAU1UMqc:Ysn6jMEfHZs:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=o_lNAU1UMqc:Ysn6jMEfHZs:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=o_lNAU1UMqc:Ysn6jMEfHZs:LN8Vd79RFGo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=LN8Vd79RFGo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=o_lNAU1UMqc:Ysn6jMEfHZs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=o_lNAU1UMqc:Ysn6jMEfHZs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://community.softteq.com/blogs/nick/archive/2010/02/28/linq-to-sql-generator-fails-due-to-custom-code.aspx</feedburner:origLink></item><item><title>Does Windows Mobile 6 Smell (part II)?</title><link>http://feedproxy.google.com/~r/NickRandolphsDotNetTravels/~3/PAgcfb9u6P8/does-windows-mobile-6-smell-part-ii.aspx</link><pubDate>Sat, 27 Feb 2010 06:49:41 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:1632</guid><dc:creator>nick</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://community.softteq.com/blogs/nick/rsscomments.aspx?PostID=1632</wfw:commentRss><comments>http://community.softteq.com/blogs/nick/archive/2010/02/26/does-windows-mobile-6-smell-part-ii.aspx#comments</comments><description>&lt;p&gt;In my &lt;a href="http://community.softteq.com/blogs/nick/archive/2010/02/25/does-windows-mobile-6-smell.aspx"&gt;previous post&lt;/a&gt; I talked about Microsoft and the enterprise and how it had help shape Windows Mobile 6.x. Now I want to look at some of the implications of this strategy, specifically looking at how the attitude towards touch input has changed over time.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Touch v’s Non-Touch v’s Multi-Touch&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;One of the things that really differentiated Windows Mobile was it’s ability to work on multiple different form factors, from your non-touch txt friendly devices with keyboards through to your candy bar devices through to your pda-style devices with on-screen keyboards. Track back a few years and you would have seen the names Pocket PC and Smartphone being used to describe devices with and without a touch interface. With a move to align the two operating systems these came to be known as Windows Mobile Professional and Windows Mobile Standard – personally I think this did more than confuse the market who were already confused by the double use of the word Smartphone.&lt;/p&gt;  &lt;p&gt;But this post wasn’t supposed to be a Windows Mobile history lesson, instead it was to look at our opinions on touch have evolved. If you recall back to the Pocket PC days there were very few people who actually used “touch” to interact with their device. Most uses whipped out their stylus and used that to push and poke at the screen. They would tap at the on-screen keyboard or even learn how to use the quirky text recognition capabilities of the device. This process was quite painful, particularly if you were responding to a text message or email. This is in part why both hardware keyboards and the Smartphone increased in popularity – both these addressed the problem of how to quickly navigate and type on the device.&lt;/p&gt;  &lt;p&gt;The challenge with a physical keyboard is that no matter how to position it you end up with a tiny keyboard that simply adds weight and size to the device. Text entry, whilst quickest using a full qwerty keyboard was still a far shy from entering it on the desktop and often the extra hassle of sliding out a keyboard, waiting for the screen to reorientate and then entering text was enough to put off a lot of users.&lt;/p&gt;  &lt;p&gt;The challenge with Smartphone is that it just sux – ok, you have me, I’m not a Smartphone advocate. Whilst I find that the interface is quick to navigate nearly all the applications are somewhat lacking or clumsy to use.&amp;#160; Take internet explorer for example – you either have a little arrow cursor that you drag around the screen using a dpad or you jump from link to link, often making the text of the website very difficult to read. Personally I’ve never liked this style of device and it was scary a couple of years ago because it seemed that 90% of all new devices being released by OEMs were a Smartphone, rather than having a touch screen.&lt;/p&gt;  &lt;p&gt;From a development perspective we saw the convergence of Smartphone and Pocket PC into Windows Mobile as a good thing. It meant we could build a single application that would work on both styles of devices. Unfortunately, this is a bit like building a desktop application and running it on the device – great idea, but results in an aweful user experience as either the desktop application is limited to display what’s available on the device (ie small screen real estate) or the application has to scale down to fit to the device (resulting in small controls that are hard to use). Guidance from Microsoft even suggested that developers should build to target Smartphone so it will work on both devices.&lt;/p&gt;  &lt;p&gt;This whole topic became even more interesting when Apple released the iPhone and multi-touch came into the mainstream. Unfortunately the Windows Mobile team failed to get it and released 6, 6.1 and 6.5 without any support for multi-touch.&amp;#160; In fact it’s only been with the release of the HTC HD2 that we’ve even seen capacitive screens for Windows Mobile which would effectively allow multi-touch. I believe this was because there was a misunderstanding on how users wanted to use their device. Too much research focussed on looking at ways to improve what users were currently doing (eg using a stylus), rather than exploring more innovative ways for the users to do things (eg making all controls larger so that the user can use touch instead of a stylus).&lt;/p&gt;  &lt;p&gt;Now, finally Microsoft has awoken and we are seeing a new era of devices and operating systems heavily geared towards making touch (and I’m sure in the future multi-touch). Windows Mobile 6.5.3 has restyled controls, repositioned Start menu and Ok buttons, specifically geared to making it easy to navigate with touch and gestures. Windows Phone 7 series is all about touch, swipe, gesture and motion in general. It’s clear to see that this is the way forward and that the old Blackberry style non-touch devices are a thing of the past.&lt;/p&gt;&lt;img src="http://community.softteq.com/aggbug.aspx?PostID=1632" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=PAgcfb9u6P8:zewPEdk2CTw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=PAgcfb9u6P8:zewPEdk2CTw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=PAgcfb9u6P8:zewPEdk2CTw:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=PAgcfb9u6P8:zewPEdk2CTw:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=PAgcfb9u6P8:zewPEdk2CTw:LN8Vd79RFGo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=LN8Vd79RFGo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=PAgcfb9u6P8:zewPEdk2CTw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=PAgcfb9u6P8:zewPEdk2CTw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://community.softteq.com/blogs/nick/archive/2010/02/26/does-windows-mobile-6-smell-part-ii.aspx</feedburner:origLink></item><item><title>Does Windows Mobile 6 Smell?</title><link>http://feedproxy.google.com/~r/NickRandolphsDotNetTravels/~3/aihs3lvxckM/does-windows-mobile-6-smell.aspx</link><pubDate>Thu, 25 Feb 2010 22:12:25 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:1630</guid><dc:creator>nick</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://community.softteq.com/blogs/nick/rsscomments.aspx?PostID=1630</wfw:commentRss><comments>http://community.softteq.com/blogs/nick/archive/2010/02/25/does-windows-mobile-6-smell.aspx#comments</comments><description>&lt;p&gt;If you ask most users what they think of Windows Mobile they either don’t know what it is (most non-techie consumers) or they shudder saying that slow, overly complex phone that I never use now I have…. Anyone would think that Windows Mobile smells. I’d like to put forward some points that at least explains why it looks and smells the way it is. You may even decide to give the current generation of Windows Mobile 6.5.3 devices a go.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Microsoft and the Enterprise&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I think the first point I’d like to make is that I doubt at any stage Microsoft decided that the end user wasn’t the highest priority when designing and building Windows Mobile. The whole “end-user-first” message that’s coming from Microsoft is just another re-hash of the “Age of User Experience” message that we saw a couple of years ago. What I do buy is that Microsoft has changed focus on which end user they’re putting first, or at least, what end user activities should come first. &lt;/p&gt;  &lt;p&gt;In the past the design of Windows Mobile was geared towards an end user who worked for an enterprise, was connected to Exchange server and the reason for having a device was to make phone calls, send sms, triage email, work with contacts, calendar and tasks to get their work done. Now we’re seeing a new era where Windows Phone 7 is about supporting end users in every facet of their lives – helping them stay in contact, entertain them, help them relax, get work done, oh and of course make a phone call. Actually the latter seems to have been almost an after thoughts as there is not even a hardware call and/or hang up button according to the specs released by Microsoft last week.&lt;/p&gt;  &lt;p&gt;So I guess the question has to be asked as to why the focus was on the enterprise user? Microsoft’s entry into the mobile phone market came as an extension of their embedded operating system. In fact Windows Mobile is essentially Windows CE in a specified configuration, with additional modules, such as Office Mobile and of course a phone stack. As such it seemed logical for them to enter this space in order to support enterprise users. &lt;/p&gt;  &lt;p&gt;Once in this space it appears that Microsoft saw RIM as one of the main competitors with their Blackberry devices. Those familiar with Microsoft codenames will know that &lt;a href="http://en.wikipedia.org/wiki/List_of_Microsoft_codenames"&gt;Crossbow&lt;/a&gt; was one of the code names used internally for one of the previous versions of Windows Mobile – this happens (probably coincidentally) to be the &lt;a href="http://www.dowagro.com/au/prod/crossbow.htm"&gt;name of a pesticide&lt;/a&gt; that can be used to get ride of the blackberry plant (ref Website). The Blackberry OS has traditionally been menu centric, so as long as Windows Mobile only had as single “Start” menu it was considered to be a safe bet. Also, since Blackberries didn’t have touch screens, supporting touch (rather than stylus, and definitely not multi-touch) input wasn’t really considered a core use case. Again the result was that Windows Mobile continued to evolve towards a dpad/keyboard driven interface – in the enterprise this resulted in some very effective office worker devices that could be used to rapidly triage email but they weren’t the nicest consumer devices.&lt;/p&gt;  &lt;p&gt;More on this discussion in future posts….&lt;/p&gt;&lt;img src="http://community.softteq.com/aggbug.aspx?PostID=1630" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=aihs3lvxckM:RncA97TJOJk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=aihs3lvxckM:RncA97TJOJk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=aihs3lvxckM:RncA97TJOJk:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=aihs3lvxckM:RncA97TJOJk:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=aihs3lvxckM:RncA97TJOJk:LN8Vd79RFGo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=LN8Vd79RFGo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=aihs3lvxckM:RncA97TJOJk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=aihs3lvxckM:RncA97TJOJk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://community.softteq.com/blogs/nick/archive/2010/02/25/does-windows-mobile-6-smell.aspx</feedburner:origLink></item><item><title>Windows Phone 7 Series Development – What Do You Want?</title><link>http://feedproxy.google.com/~r/NickRandolphsDotNetTravels/~3/ByB6_bxv_LI/windows-phone-7-series-development-what-do-you-want.aspx</link><pubDate>Thu, 25 Feb 2010 12:35:09 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:1628</guid><dc:creator>nick</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://community.softteq.com/blogs/nick/rsscomments.aspx?PostID=1628</wfw:commentRss><comments>http://community.softteq.com/blogs/nick/archive/2010/02/25/windows-phone-7-series-development-what-do-you-want.aspx#comments</comments><description>&lt;p&gt;Since it’s announcement over a week ago the question on all our lips is “what’s the development story going to be?” Whilst there has been countless rumours regarding support for Silverlight (perhaps third time’s like for this can of worms….) and XNA it won’t be until &lt;a href="http://live.visitmix.com/"&gt;MIX&lt;/a&gt; that we’re going get a good look at what Microsoft has in store for us mobile developers going forward.&lt;/p&gt;  &lt;p&gt;In the meantime, I took a little bit of time out to think about the current generation of development tools. Now, I’m going to overlook the obvious failing around stylish controls for building Windows Mobile applications (which in my opinion is one of the fundamental reasons the iPhone is trumping Windows Mobile applications at the moment, after all it sure as hell isn’t the development language!). What I’m interested in is the development/debugging/testing/deployment story, so here’s a list of the tools/frameworks etc that we have at the moment. I’ll start this list but I suspect it may have to be continued as I remember things that I’ve omitted. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Microsoft&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;IDE - Visual Studio&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;- Support for Native, C# and VB.NET development      &lt;br /&gt;- Visual Designer for Forms and Controls, including designer skin       &lt;br /&gt;- Intellisense, Code completion       &lt;br /&gt;- Debuggin support       &lt;br /&gt;&amp;gt;&amp;gt; Breakpoints       &lt;br /&gt;&amp;gt;&amp;gt; Watches and variable inspection       &lt;br /&gt;&amp;gt;&amp;gt; Datatips       &lt;br /&gt;&amp;gt;&amp;gt; Step through/over&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Managed Frameworks&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;- .NET Compact Framework      &lt;br /&gt;- Windows Mobile managed libraries       &lt;br /&gt;&amp;gt;&amp;gt; POOM (contacts, calendar, email, tasks)       &lt;br /&gt;&amp;gt;&amp;gt; Camera       &lt;br /&gt;&amp;gt;&amp;gt; Contact picker       &lt;br /&gt;&amp;gt;&amp;gt; State and Notification Broker       &lt;br /&gt;[missing APIs could be p/invoked to native APIs]       &lt;br /&gt;- Rich networking stack (sockets &amp;amp; httprequest)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Data Story&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;- SQL Server Compact      &lt;br /&gt;- Multiple Synchronization Frameworks (RDA, Merge Replication, Sync Services)       &lt;br /&gt;- Designer support for connecting to web services&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Support Tools&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;- Device Emulator      &lt;br /&gt;&amp;gt;&amp;gt; Able to change configuration       &lt;br /&gt;&amp;gt;&amp;gt; Able to adjust system state       &lt;br /&gt;&amp;gt;&amp;gt; Able to connect to ActiveSync/WMDC to simulate docking real device       &lt;br /&gt;- Cellular Emulator       &lt;br /&gt;- Hopper&amp;#160; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;3rd Party&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;- &lt;a href="http://www.opennetcf.com/cf/products/sdf.ocf"&gt;Smart Devices Framework&lt;/a&gt; (OpenNETCF)&lt;/p&gt;  &lt;p&gt;- &lt;a href="http://inthehand.com/content/Products.aspx"&gt;Mobile In The Hand&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;- &lt;a href="http://mobile.codeplex.com/"&gt;Mobile Client Software Factory&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;- &lt;a href="http://www1.orientationaware.net/home.html"&gt;Orientation Aware Control&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;- &lt;a href="http://nlog-project.org/download.html"&gt;NLog&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;With this list in mind, what do you feel is missing? If your answer is nothing, then think harder – after all there must be a reason why Windows Mobile 6.x was failing to attract users and developers alike.&lt;/p&gt;&lt;img src="http://community.softteq.com/aggbug.aspx?PostID=1628" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=ByB6_bxv_LI:Rgvw8VI0HPY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=ByB6_bxv_LI:Rgvw8VI0HPY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=ByB6_bxv_LI:Rgvw8VI0HPY:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=ByB6_bxv_LI:Rgvw8VI0HPY:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=ByB6_bxv_LI:Rgvw8VI0HPY:LN8Vd79RFGo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=LN8Vd79RFGo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=ByB6_bxv_LI:Rgvw8VI0HPY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=ByB6_bxv_LI:Rgvw8VI0HPY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://community.softteq.com/blogs/nick/archive/2010/02/25/windows-phone-7-series-development-what-do-you-want.aspx</feedburner:origLink></item><item><title>Motorola Devour is yet another average Android device</title><link>http://feedproxy.google.com/~r/NickRandolphsDotNetTravels/~3/armEs8ncXm4/motorola-devour-is-yet-another-average-android-device.aspx</link><pubDate>Wed, 24 Feb 2010 22:59:11 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:1626</guid><dc:creator>nick</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://community.softteq.com/blogs/nick/rsscomments.aspx?PostID=1626</wfw:commentRss><comments>http://community.softteq.com/blogs/nick/archive/2010/02/24/motorola-devour-is-yet-another-average-android-device.aspx#comments</comments><description>&lt;p&gt;On the way from the airport into the Melbourne CBD I read the &lt;a href="http://blogs.zdnet.com/gadgetreviews/?p=12500%20"&gt;ZDNet Review of the Motorola Devour&lt;/a&gt; and I think it confirms my view that Android, whilst perhaps a great operating system for OEMs to build on, lacks anything at all that would draw me to the platform. The Devour seems an overly unimpressive device both in terms of the hardware spec and the software. &lt;/p&gt;  &lt;p&gt;From looking at the hardware I can’t get away from the feeling that Android devices, pretty much across the board, have been designed with your average “google-loving-geek-boy” in mind. The ZDNet review comments that the design of the Devour could be considered “retro” (from &lt;a href="http://www.wired.com/gadgetlab/2010/02/hands-on-motorola-devour/"&gt;&lt;em&gt;Wired’s Priya Ganapati&lt;/em&gt;&lt;/a&gt;) and that it’s the “next chapter of Motorola’s signature industrial design” but I think the hardware appears chunky and uncomfortable, and lacks any sense of true style.&lt;/p&gt;  &lt;p&gt;From the software perspective it of course features the standard Android home screen featuring icons (urgh, so last year – get with the program, it’s all about square updating tiles now…. we’ll probably come back to that to determine whether Microsoft’s gamble pays off there). What’s interesting is that like other Android devices it supports the latest version of Google Maps. With Google increasingly leaning towards providing the latest features (such as navigation) only on the version of Google Maps for Android, it will be interesting to see what other players like Microsoft bring to the table.&lt;/p&gt;  &lt;p&gt;[As an aside – the recently released &lt;a title="Download details- Windows Mobile 6.5.3 DTK" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c0213f68-2e01-4e5c-a8b2-35e081dcf1ca&amp;amp;displaylang=en"&gt;Windows Mobile 6.5.3 DTK&lt;/a&gt; includes a mapping framework sample.&amp;#160; The sample is written in native code but has a managed wrapper so can be used in either a native or .NET Compact Framework application. This sample is a great starting point for anyone wanting to build an application making use of mapping on the Windows Mobile platform. No information yet as to whether there will be a similar control/framework for Windows Phone 7 series development. More to come on this topic…]&lt;/p&gt;&lt;img src="http://community.softteq.com/aggbug.aspx?PostID=1626" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=armEs8ncXm4:nYjEz3yodlU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=armEs8ncXm4:nYjEz3yodlU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=armEs8ncXm4:nYjEz3yodlU:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=armEs8ncXm4:nYjEz3yodlU:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=armEs8ncXm4:nYjEz3yodlU:LN8Vd79RFGo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?d=LN8Vd79RFGo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?a=armEs8ncXm4:nYjEz3yodlU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NickRandolphsDotNetTravels?i=armEs8ncXm4:nYjEz3yodlU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://community.softteq.com/blogs/nick/archive/2010/02/24/motorola-devour-is-yet-another-average-android-device.aspx</feedburner:origLink></item></channel></rss>
