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

<channel>
	<title>SteveStreeting.com &#187; Uncategorized</title>
	<atom:link href="http://www.stevestreeting.com/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.stevestreeting.com</link>
	<description>Man bites Ogre</description>
	<lastBuildDate>Sat, 24 Dec 2011 13:08:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>Parallel-split Shadow Maps are cool</title>
		<link>http://www.stevestreeting.com/2008/08/21/parallel-split-shadow-maps-are-cool/</link>
		<comments>http://www.stevestreeting.com/2008/08/21/parallel-split-shadow-maps-are-cool/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 13:35:34 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[OGRE]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ogre]]></category>
		<category><![CDATA[ogrespeedtree]]></category>
		<category><![CDATA[pssm]]></category>
		<category><![CDATA[shadows]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=910</guid>
		<description><![CDATA[We&#8217;re on the final home straight for Ogre 1.6 (aka Shoggoth), which should hit RC1 next week. One of the final features I wanted to squeeze in was support for Parallel-split Shadow Maps (PSSM), which uses multiple shadow maps per light in a hierarchical fashion to improve the quality while keeping the size down, particularly [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.stevestreeting.com/wp-content/uploads/2008/08/ogrespeedtree_pssm.jpg"><img class="alignright size-medium wp-image-911" title="ogrespeedtree_pssm" src="http://www.stevestreeting.com/wp-content/uploads/2008/08/ogrespeedtree_pssm-300x225.jpg" border="0" alt="OgreSpeedTree with PSSM" width="300" height="225" align="right" /></a>We&#8217;re on the final home straight for Ogre 1.6 (aka <a href="http://www.ogre3d.org/wiki/index.php/ShoggothNotes" target="_blank">Shoggoth</a>), which should hit RC1 next week. One of the final features I wanted to squeeze in was support for <a href="http://portal.acm.org/citation.cfm?id=1128923.1128975&amp;coll=GUIDE&amp;dl=GUIDE" target="_blank">Parallel-split Shadow Maps</a> (PSSM), which uses multiple shadow maps per light in a hierarchical fashion to improve the quality while keeping the size down, particularly in outdoor scenes using global directional light. If you&#8217;ve played Assassin&#8217;s Creed, you will have seen this technique in action already.</p>
<p>For example, the screenshot on the right there is using 3 shadow maps for the single directional light, the closest one being 1024&#215;1024, and the other two being 512&#215;512 &#8211; together they are 38% of the size of a single 2048&#215;2048 shadow map and yet provide greater detail. The 3 shadow textures are displayed for debug purposes on the right &#8211; notice that all 3 are using <a href="http://www.cg.tuwien.ac.at/research/vr/lispsm/" target="_blank">LiSPSM</a> projection to bias the texture precision toward the camera which also helps. If you look really closely on the full resolution shot, you can see the transition from the highest resolution shadow map to the second shadow map about halfway up the screen, it changes near the top of the closest tree shadow. It&#8217;s quite hard to see though, which is kinda the point <img src='http://www.stevestreeting.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>One of the challenges with supporting PSSM is that Ogre had previously assumed that there is a 1:1 mapping between lights and shadow maps, which clearly had to be overcome &#8211; this limitation also prevented easy use of dual parabaloid and full cubic shadow maps for point lights of course. It was one of those things that had been languishing on my TODO for a while, begging me to find some time for it, and that&#8217;s where it still was until Pang Lih-Hern (aka lf3thn4d) from Malaysia came along and did it for me <img src='http://www.stevestreeting.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  What a star! His initial patch allowed multiple shadow textures per light in a very sensible way, and he then implemented a PSSM facility on top of that, via our pluggable ShadowCameraSetup system (which he also extended in the patch to be aware of shadow map iteration). I adapted the PSSM code from his demo to be a little more flexible (it now handles any number of splits, and a more flexible split configuration) , so that setting it up goes something like this (simple projected shadows here, depth shadowmaps are also possible of course but let&#8217;s not overcomplicate it):</p>
<blockquote><p><code><br />
float shadowFarDistance = 3000;<br />
mSceneMgr-&gt;setShadowTechnique(SHADOWTYPE_TEXTURE_ADDITIVE_INTEGRATED);<br />
mSceneMgr-&gt;setShadowTextureCountPerLightType(Light::LT_DIRECTIONAL, 3);<br />
mSceneMgr-&gt;setShadowTextureCount(3);<br />
mSceneMgr-&gt;setShadowTextureConfig(0, 1024, 1024, PF_X8R8G8B8);<br />
mSceneMgr-&gt;setShadowTextureConfig(1, 512, 512, PF_X8R8G8B8);<br />
mSceneMgr-&gt;setShadowTextureConfig(2, 512, 512, PF_X8R8G8B8);<br />
PSSMShadowCameraSetup* pssm = new PSSMShadowCameraSetup();<br />
pssm-&gt;calculateSplitPoints(3, mCamera-&gt;getNearClipDistance(), shadowFarDistance);<br />
pssm-&gt;setSplitPadding(mCamera-&gt;getNearClipDistance());<br />
pssm-&gt;setOptimalAdjustFactor(0, 2);<br />
pssm-&gt;setOptimalAdjustFactor(1, 1);<br />
pssm-&gt;setOptimalAdjustFactor(2, 0.5);<br />
mSceneMgr-&gt;setShadowCameraSetup(ShadowCameraSetupPtr(pssm));<br />
mSceneMgr-&gt;setShadowFarDistance(shadowFarDistance);<br />
</code></p></blockquote>
<p>Notice that I used <a href="http://www.ogre3d.org/docs/manual/manual_69.html#SEC310" target="_blank">Integrated Shadows</a>, this is a requirement of PSSM since only shaders with integrated shadow support can decide on the fly which shadowmap to sample from.</p>
<p>My sincere thanks to lf3thn4d for helping us get this feature in to Ogre 1.6 (and to all those who send us patches in fact). If you want to see it and OgreSpeedTree in motion, there is a <a href="http://www.vimeo.com/1572168" target="_blank">video available</a>; that&#8217;s the low-quality streamed version but you can also <a href="http://www.vimeo.com/download/video:84925622?e=1219327383&amp;h=436d43fa2a99f085ddde0af20cdeebc5">download the higher resolution version</a> if you want.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2008/08/21/parallel-split-shadow-maps-are-cool/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Sleepless in &#8230; LA</title>
		<link>http://www.stevestreeting.com/2008/08/11/sleepless-in-la/</link>
		<comments>http://www.stevestreeting.com/2008/08/11/sleepless-in-la/#comments</comments>
		<pubDate>Mon, 11 Aug 2008 14:53:03 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[OGRE]]></category>
		<category><![CDATA[Travel]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[LA]]></category>
		<category><![CDATA[ogre]]></category>
		<category><![CDATA[siggraph]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=904</guid>
		<description><![CDATA[I arrived in LA either Saturday night or Sunday morning depending on whose watch you believe, and am coping with the inevitable jet lag. Working helps to some degree, since it keeps you active, until you hit that &#8216;wall&#8217; where suddenly your brain holds up it&#8217;s hands and says &#8220;I don&#8217;t care what the clock [...]]]></description>
			<content:encoded><![CDATA[<p>I arrived in LA either Saturday night or Sunday morning depending on whose watch you believe, and am coping with the inevitable jet lag. Working helps to some degree, since it keeps you active, until you hit that &#8216;wall&#8217; where suddenly your brain holds up it&#8217;s hands and says &#8220;I don&#8217;t care what the clock says, it&#8217;s 3am&#8221;, before grabbing its hat and coat and sodding off, leaving you a hollow shell looking at a screen full of C++ going &#8216;buh?&#8217;.</p>
<p>I&#8217;m staying in Torrance since that&#8217;s close to my client&#8217;s offices, but we&#8217;ll be heading downtown to get registered for Siggraph today I&#8217;m sure. I have a fair few things in my diary for the next few days so hopefully I&#8217;ll be lucid enough.</p>
<p>If you&#8217;re at Siggraph too and want to say hi, drop me an email (sinbad at ogre3d dot org or steve at torusknot dot com), I&#8217;ll check my email as often as I can. Alternatively you may find me on the &#8216;Works Zebra&#8217; stand on the AMD booth (#323) where I&#8217;ll <em>probably</em> be from 3:30pm Tuesday, 12:30pm Wednesday and 1pm Thursday. The company will also have a presence on the Vicon booth (#1101) at times although I don&#8217;t think I&#8217;ll be needed for that. Bear in mind I&#8217;m there for my clients while on booth duty though, so if you want to yak about Ogre &amp; unrelated TorusKnot stuff we&#8217;ll have to arrange to meet again later on.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2008/08/11/sleepless-in-la/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>LinkedIn OGRE Group</title>
		<link>http://www.stevestreeting.com/2008/07/10/linkedin-ogre-group/</link>
		<comments>http://www.stevestreeting.com/2008/07/10/linkedin-ogre-group/#comments</comments>
		<pubDate>Thu, 10 Jul 2008 15:17:21 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[OGRE]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[ogre]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=873</guid>
		<description><![CDATA[I consider LinkedIn to be one of the few genuinely useful things to come out of the whole Web 2.0 gold rush, since it&#8217;s a business-oriented, generally &#8216;fluffless&#8217; site (if I see one more virtual gift or stupid time-wasting Facebook application, I&#8217;ll lose all will to live) &#8211; as such I actually do use it [...]]]></description>
			<content:encoded><![CDATA[<p>I consider <a href="http://www.linkedin.com" target="_blank">LinkedIn</a> to be one of the few genuinely useful things to come out of the whole Web 2.0 gold rush, since it&#8217;s a business-oriented, generally &#8216;fluffless&#8217; site (if I see one more virtual gift or stupid time-wasting Facebook application, I&#8217;ll lose all will to live) &#8211; as such I actually do use it fairly regularly. I finally got around to creating an <a href="http://www.linkedin.com/groupInvitation?groupID=139012&amp;sharedKey=53B17B593990" target="_blank">OGRE Group</a> &#8211; feel free to join if you&#8217;re a professional OGRE user / contributor. I use LinkedIn to remind me who I can refer OGRE-related jobs to, so it might be worth your while <img src='http://www.stevestreeting.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2008/07/10/linkedin-ogre-group/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Memory, Man</title>
		<link>http://www.stevestreeting.com/2008/06/28/memory-man/</link>
		<comments>http://www.stevestreeting.com/2008/06/28/memory-man/#comments</comments>
		<pubDate>Sat, 28 Jun 2008 12:07:58 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[OGRE]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[allocators]]></category>
		<category><![CDATA[memory]]></category>
		<category><![CDATA[ogre]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=855</guid>
		<description><![CDATA[We&#8217;ve had &#8216;custom memory allocators&#8217; on our upcoming features list for a while. Last year a student did some work on this during the Summer of Code, but the system ended up being a little too ambitious with its use of templates and got a bit too costly in terms of the template instantiation requirements. [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve had &#8216;custom memory allocators&#8217; on our upcoming features list for a while. Last year a student did some work on this during the Summer of Code, but the system ended up being a little too ambitious with its use of templates and got a bit too costly in terms of the template instantiation requirements. Unfortunately the student never returned, so I picked up the baton recently, and I felt it was worth writing about some of the things I&#8217;ve done, since most of the C++ allocator discussions on the net are pretty shallow and only deal with the simple cases. This is quite a big and fairly technical discussion, so I&#8217;ve placed the bulk of it after the jump to spare those who don&#8217;t care about this sort of thing! <img src='http://www.stevestreeting.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span id="more-855"></span></p>
<p><strong>Why Custom Allocators?</strong></p>
<p>Two words: performance and flexibility. The default C/C++ runtime allocation routines are very general purpose and not really designed for high performance applications, and can suffer from fragmentation particularly when dealing with lots of small allocations. In addition, for some applications people want to be able to allocate memory from particular pools based on the type of allocation being made &#8211; think embedded systems and consoles for example which can have non-homogenous memory architectures.</p>
<p><strong>The Feature List</strong></p>
<p>I had a list of bullet points I wanted to tick off as part of this work, and I&#8217;m glad to say I think I&#8217;ve covered them all:</p>
<ul>
<li>Completely replaceable memory allocators for all heap allocations, for all classes, structures, primitive types and containers</li>
<li>Categorised memory usage for all allocations; category can influence the allocator used</li>
<li>Allocators compiled statically for performance, without requiring a user to change anything other than a single header file, but without dumbing things down to a single global type of allocator</li>
<li>Tracking of memory leaks, with file &amp; line number information</li>
<li>At least one example of using a custom allocator instead of the default malloc/free</li>
<li>Support for aligned memory allocation; both platform-specific SIMD alignment and user defined alignments</li>
</ul>
<p><strong>The simple approach</strong></p>
<p>If you search the net for information about C++ custom allocators, you&#8217;ll run into generally 3 examples:</p>
<ol>
<li>Implementing custom new/delete operators in a class</li>
<li>Overriding the global new/delete functions, possibly with macros to add debug functionality</li>
<li>Implementing allocator classes to replace std::allocator in STL containers</li>
</ol>
<p>Now, don&#8217;t get me wrong, there&#8217;s nothing wrong with these techniques; indeed I&#8217;ve used 1 and 3 in my implementation (2 is evil, for reasons I&#8217;ll discuss later). However, alone the base implementation doesn&#8217;t scale well or allow the level of flexibility I was looking for.</p>
<p><strong>My approach</strong></p>
<ol>
<li><strong>Allocation policy: </strong>this is a strategy for allocating memory; this is the basic fundamental building block of memory management. Implements (potentially aligned) allocation and deallocation. Any class at all can be an allocation policy so long as it implements the allocBytes and deallocBytes methods.</li>
<li><strong>AllocatedObject&lt;AllocPolicy&gt;</strong>: a base class for all classes with a virtual function table which need to use custom allocators. Defines custom new/delete operators which route the allocation via the templated AllocPolicy</li>
<li><strong>STLAllocator&lt;T, AllocPolicy&gt;</strong>: an STL-compatible allocator object which delegates requests for memory for STL containers of type T to the configured AllocPolicy class.</li>
<li><strong>Alloc/dealloc macros</strong>: in order to add file &amp; line number information in debug mode to allocations to assist tracking of leaks, macros are normally used (since functions and classes would hide this information). Some people redefine &#8216;new&#8217; and &#8216;delete&#8217;, and indeed that&#8217;s what our old leak tracker did (adapted from <a href="http://www.flipcode.com/archives/Presenting_A_Memory_Manager.shtml" target="_blank">Paul Nettle&#8217;s work</a>), but in practice this is a bad idea &#8211; it works if you only ever have to deal with your own codebase, but in a heterogenous environment with many libraries, it becomes hopelessly entangled far too quickly &#8211; either other libraries will try to do the same and clash, or there will be a mixed use of macro&#8217;d or unmacro&#8217;d new/deletes because of header inclusion order, etc. Instead, we use macros such as OGRE_NEW, OGRE_DELETE, OGRE_MALLOC etc. The downside is that we have to update our code to use them instead of it being automatic, but it&#8217;s far outweighed by predictability and it also resolves some knotty problems with mixed types too.</li>
</ol>
<p>No huge surprises there I hope. The nice thing about this is that you can quite easily implement a single class which implements allocBytes and deallocBytes and it can immediately serve most memory management contexts. However, we&#8217;re only just getting started. <img src='http://www.stevestreeting.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Category Support</strong></p>
<p>All allocations are done by specifying a memory category. At the base level, you&#8217;re expected to define classes that resolve the following policies, which are referred to in the OGRE code:</p>
<p><code>template &lt;MemoryCategory C&gt; class CategorisedAllocPolicy;<br />
template &lt;MemoryCategory C, size_t align = 0&gt; class CategorisedAlignAllocPolicy;<br />
</code></p>
<p>MemoryCategory is just an enum listing various usages, such as general purpose, geometry, animation, etc. CategorisedAllocPolicy is used to allocate unaligned memory in a given category, and CategorisedAlignAllocPolicy is used to allocate aligned memory &#8211; the default parameter of &#8217;0&#8242; for alignment actually means &#8216;use the default SIMD alignment for this platform&#8217;. The simplest possible example that we provide is this:</p>
<p><code>template &lt;MemoryCategory Cat&gt; class CategorisedAllocPolicy : public StdAllocPolicy{};<br />
template  &lt;MemoryCategory Cat, size_t align = 0&gt; class CategorisedAlignAllocPolicy : public StdAlignedAllocPolicy&lt;align&gt;{};<br />
</code><br />
This ignores the category and generates an implementation for all categories using the allocators StdAllocPolicy and StdAlignedAllocPolicy &#8211; both use the default system allocators. You can use full or partial template specialisation to provide different allocation policy implementations for different categories of memory, of course, something like this:<br />
<code><br />
template &lt;&gt; class CategorisedAllocPolicy&lt;MEMCATEGORY_SCENE_OBJECTS&gt; : public YourSceneObjectAllocPolicy{};<br />
template &lt;size_t align&gt; class CategorisedAlignAllocPolicy&lt;MEMCATEGORY_SCENE_OBJECTS, align&gt; : public YourSceneObjectAllocPolicy&lt;align&gt;{};</code></p>
<p>I&#8217;ll be providing one or two other custom allocation policies as alternative examples.</p>
<p><strong>The challenge of dealing with primitive types and non-virtual or external classes</strong></p>
<p>Ok, so the cases that most of the examples around the net tend to deal with are defining custom new/delete operators in your classes, and implementing a std::allocator compatible allocator for STL containers. We&#8217;ve done that, I won&#8217;t repeat the details here. But that&#8217;s only half the story.</p>
<p>A typical application has to allocate far more than that. It needs to allocate primitive types, such as ints and bools, potentially arrays of them. It also needs to deal with classes which have been made deliberately non-virtual, so are not appropriate to be conveniently derived from a class which provides standard allocator-aware new/delete operators (like our AllocatedObject). A good example of this in the Ogre source is Vector3 &#8211; it&#8217;s a class, but it&#8217;s deliberately non-virtual, because a virtual fuunction table adds a pointer overhead to every instance, and while small, when you&#8217;re dealing with classes that are essentially small value types, that one pointer could increase the size of each instance by a great deal &#8211; with Vector3 it would be a 33% increase for example. When you consider arrays of these types, this can soon add up and start adding extra cache misses you don&#8217;t need.</p>
<p>Sure, you could individually define custom new/delete operators for these small classes to avoid having to inherit the common implementation (and please, don&#8217;t suggest inheriting without a virtual destructor to get the implementations but with no virtual function table, that way leads to undefined behaviour according to the C++ standard), but not only is this code duplication, it won&#8217;t work for <em>real</em> primitive types, and also not for classes from external libraries. A more general purpose approach is needed.</p>
<p>At this point most people resort to global new/delete operators &#8211; sometimes wrapped in macros (hopefully not called new/delete of course). This works to a degree, again until you start using multiple libraries. As soon as more than one library / app has tried to globally override new/delete, all bets are off. Cue all sorts of linker clashes between the two, and that&#8217;s even if you managed to disentangle references to new/delete in header files to avoid cross-pollination of definitions, particularly if you used custom parameters to the new/delete operators as you generally need to do if you want leak tracking or variable allocators. Basically, it&#8217;s a nightmare and given that Ogre is supposed to be a good citizen in a multi-library setup, it just wasn&#8217;t a practical option.</p>
<p>So, I chose to do everything via safely-named macros. As well as the regular OGRE_NEW and OGRE_DELETE which provide debug functionality for full classes but otherwise just delegate back to new/delete, I also defined OGRE_NEW_T / OGRE_DELETE_T to handle allocator-aware memory management (and debugging) for primitives and classes we can&#8217;t or don&#8217;t want to add new/delete operators to. They require slightly more verbose code, but they&#8217;re unintrusive:<code><br />
</code></p>
<p><code>Vector3* v = OGRE_NEW_T(Vector3, MEMCATEGORY_GEOMETRY)(Vector3::UNIT_Y);<br />
OGRE_DELETE_T(v, Vector3, MEMCATEGORY_GEOMETRY);<br />
</code></p>
<p>Notice how I can use constructor args as usual; this would not be the case if I was using a malloc analog. What&#8217;s happening inside the macro is that it&#8217;s calling placement new ie memory is allocated via a custom allocator and then the object constructed inside it. I have to tell it the category, as opposed to that automatically being known by AllocatedObject-derived classes allocated via OGRE_NEW. I also have to tell it the same information when I destroy it with OGRE_DELETE_T &#8211; the category so that the same allocator can be used to free the memory (if there were different allocators for different categories, this is important), and the type so that the destructor can be called &#8211; because objects allocated with placement new have to have their destructor called manually. Note there&#8217;s a small hack here &#8211; if you know for sure that there&#8217;s no destructor, you can use OGRE_FREE instead which doesn&#8217;t call the destructor and doesn&#8217;t require the type again &#8211; this might be a good optimisation particularly for arrays (OGRE_NEW_ARRAY_T/OGRE_DELETE_ARRAY_T).</p>
<p>For primitive types with no required constructor or destructor, there is OGRE_ALLOC_T and OGRE_FREE:</p>
<p><code>long* pLong = OGRE_ALLOC_T(long, 10, MEMCATEGORY_GENERAL);<br />
OGRE_FREE(pLong, MEMCATEGORY_GENERAL);<br />
</code></p>
<p>As mentioned above if you have a single primitive type you need to use a constructor on, you can actually mix OGRE_NEW_T and OGRE_FREE because you want the constructor, but there is no destructor called &#8216;long&#8217;:</p>
<p><code>long* pLong = OGRE_NEW_T(long, MEMCATEGORY_GENERAL)(0);<br />
OGRE_FREE(pLong</code><code>, MEMCATEGORY_GENERAL</code><code>);<br />
</code></p>
<p>It might seem complex to have these different ways of allocating memory, but it&#8217;s entirely necessary to provide the full breadth of flexibility to be able to handle all types of categorised allocation without clash-inducing global new/delete operators. It&#8217;s important to note every one of these types of allocations functions identically in terms of memory leak tracing, debug line number information, and use of the allocator policies. That&#8217;s just not something you can achieve with just class-level new/delete operators and STL allocators without globally redefining new/delete (with all the inherent problems that causes).</p>
<p><strong>SharedPtr throws a spanner in the works</strong></p>
<p>This is all very well, but now that there&#8217;s several ways to allocate memory, via regular new, placement new or just via a raw byte allocation, if we then give this memory to a SharedPtr, it needs to know how to free it afterwards. SharedPtr now has an optional enum param to tell it whether to use OGRE_DELETE (regular delete operator), OGRE_DELETE_T (manually call destructor and free), or OGRE_FREE (just free memory) &#8211; it defaults to the first one for backwards compatibility.</p>
<p>The one limitation here is that memory allocated any other way than OGRE_NEW has to have been allocated via the MEMCATEGORY_GENERAL category. The simple reason for this is that alloc policies are bound statically, for speed &#8211; if we had to look up an allocation policy dynamically every time an allocation / deallocation was done it would slow things down. Thus, for classes which don&#8217;t have their own alloc policy bound (because they have their own new/delete operators via AllocatedObject), a single general one has to be compiled in to SharedPtr&#8217;s single destruction routine. Code which manually deallocates can use whatever it likes of course, since that code will statically resolve the allocator independently.</p>
<p><strong>Conclusion</strong></p>
<p>Phew &#8211; this has been quite in-depth I know but that&#8217;s the nature of it. I&#8217;ve spent a long time on these allocation routines, way longer than I expected, because I&#8217;ve been trying out loads of different approaches and figuring out what I thought was the best tradeoff of flexibility, speed and elegance. I&#8217;m sure it&#8217;s still not perfect, but I think it&#8217;s a lot more practical than the glib versions that tend to pop up when you look into custom allocators &#8211; the sorts that work perfectly fine if you have simple needs, you use all virtual classes, and you only have to worry about a single application source, but fall apart as soon as you have to worry about dealing with a wider variety of types, playing nicely with many different libraries, and need a way to allow people to customise allocation for different categories of memory use easily.</p>
<p>I still have quite a lot of code to go through, changing the explicit new/deletes to the correct macros and assigning categories where they&#8217;re missing, but I&#8217;m getting there!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2008/06/28/memory-man/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Pimp my Drums</title>
		<link>http://www.stevestreeting.com/2008/06/11/pimp-my-drums/</link>
		<comments>http://www.stevestreeting.com/2008/06/11/pimp-my-drums/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 21:19:10 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[Political]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[drum mods]]></category>
		<category><![CDATA[drum pads]]></category>
		<category><![CDATA[kick pedal]]></category>
		<category><![CDATA[rock band]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=839</guid>
		<description><![CDATA[My Rock Band drum mods arrived today, they took a week to arrive which isn&#8217;t bad considering they had to meander their way from the Land of the Free (ish) via regular US letter post. Drum Pads I decided to go for drum pads from RocPadz, which are basically just circular cut mouse mats with [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.stevestreeting.com/wp-content/uploads/2008/06/rocpadz.jpg"><img class="alignnone size-medium wp-image-840" title="rocpadz" src="http://www.stevestreeting.com/wp-content/uploads/2008/06/rocpadz-225x300.jpg" border="0" alt="" width="225" height="300" align="right" /> </a>My Rock Band drum mods arrived today, they took a week to arrive which isn&#8217;t bad considering they had to meander their way from the Land of the Free (ish) via regular US letter post.</p>
<p><a href="http://www.stevestreeting.com/wp-content/uploads/2008/06/rocpadz.jpg"> </a><strong>Drum Pads</strong><br />
<a href="http://www.stevestreeting.com/wp-content/uploads/2008/06/rocpadz.jpg"></a>I decided to go for drum pads from <a href="http://www.rocpadz.com/" target="_blank">RocPadz</a>, which are basically just circular cut mouse mats with a rigid back. I went with these for a number of reasons, such as that the neoprene rubber is hard wearing and long lasting (unlike foam pads which quickly lose their effect). These pads also scored highly in reviews for &#8216;bounce&#8217; which can make playing easier, and they were also rated highly for the QM drum set which I have. The other main contender was <a href="http://www.rockbanddrumsoft.com/" target="_blank">DrumSoft</a>, but while their pads are nice looking, they seemed a little too delicate for my liking &#8211; reviews were very keen to point out that you could rip the top surface if you weren&#8217;t careful during installation, which made me think they might not stand up to long-term abuse as well. The only downside to the RocPadz is that they&#8217;re a little expensive for 4 modified mouse mats &#8211; you could actually just buy yourself some regular office mouse mats, cut them to size and get some rubber glue to apply them with, but a combination of laziness and the fact that the dollar is weak meant I decided to just go with the prefabs.</p>
<p>Installation was very easy, they even supply you with a little alcohol swab to clean the pads with first which I thought was a nice touch. The result seems very good &#8211; the noise from the pads is definitely reduced, and the fact that the drum sticks bounce more really does feel better when playing. The only downside is that it seems to very slightly exacerbate the lack of sensitivity around the edge of the drum pads, which was already there anyway but seems slightly worse. However the middle area of the pads, where you had to play anyway to avoid missing notes, are not affected at all, they&#8217;ve still highly sensitive and a very light tap will trigger them. I hope to play more over the coming days.</p>
<p><strong>Kick Pedal</strong><br />
The kick pedal mod should be a familiar one by now, an aluminium plate from <a href="http://www.pedalmetals.com/" target="_blank">Pedal Metal</a>. I went with the billeted metal version because it looked nicer than the regular diamond-plate &#8211; yeah, I&#8217;m a sucker for aesthetics. I also paid a little more to get the hinge replacement bit too &#8211; I don&#8217;t need it yet, and haven&#8217;t <a href="http://www.stevestreeting.com/wp-content/uploads/2008/06/pedalmetal.jpg"><img class="alignnone size-medium wp-image-841" title="pedalmetal" src="http://www.stevestreeting.com/wp-content/uploads/2008/06/pedalmetal-300x225.jpg" border="0" alt="" width="300" height="225" align="right" /></a>installed it because it&#8217;s more fiddly &#8211; I figure I&#8217;ll keep it as an emergency reserve in case my hinge does break, so I don&#8217;t have to wait for a replacement.</p>
<p>Installation was easy, once you get over the fact that you&#8217;re invalidating your warranty by screwing stuff into your plastic pedal. But I figure the warranty on the pedal is pretty useless anyway, since it&#8217;s the one thing that is highly likely to keep breaking in it&#8217;s original form under any long period of stress (given the cost of the kit, it&#8217;s scandalous that it isn&#8217;t already reinforced with metal), so I might as well make it more robust myself. Once it&#8217;s on, while it doesn&#8217;t make any difference to the play experience itself, it&#8217;s nice not to have to worry so much about how hard you&#8217;re stomping it, particularly as I&#8217;m starting to play on Hard now which is bringing in some rapid-fire kick pedal action in places. The main thing is that it totally eliminates the rather disconcerting &#8216;flex&#8217; in the pedal if you pressed it between the hinge and the spring &#8211; this pedal ain&#8217;t for bending now.</p>
<p>So, I&#8217;m very happy with these mods &#8211; it&#8217;s yet more money down the throat of the ravenous Rock Band monster, but it&#8217;s so much gosh darned fun I really can&#8217;t hate it for it <img src='http://www.stevestreeting.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2008/06/11/pimp-my-drums/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Great assistance from NVIDIA &amp; Graphic Remedy</title>
		<link>http://www.stevestreeting.com/2008/06/04/great-assistance-from-nvidia-graphic-remedy/</link>
		<comments>http://www.stevestreeting.com/2008/06/04/great-assistance-from-nvidia-graphic-remedy/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 11:54:41 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[OGRE]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=828</guid>
		<description><![CDATA[I posted recently that we were having some mipmapping issues with NVIDIA&#8216;s newest drivers, the 175.x series, on both Windows and Linux when using GL. Thanks to help from the nice chaps at NVIDIA these issues are now resolved for the moment &#8211; there does indeed appear to be a bug in some aspects of [...]]]></description>
			<content:encoded><![CDATA[<p>I <a href="http://www.stevestreeting.com/2008/05/27/fighting-nvidia-17516-mipmapping-issues/" target="_self">posted recently</a> that we were having some mipmapping issues with <a href="http://www.nvidia.com" target="_blank">NVIDIA</a>&#8216;s newest drivers, the 175.x series, on both Windows and Linux when using GL. Thanks to help from the nice chaps at NVIDIA these issues are now resolved for the moment &#8211; there does indeed appear to be a bug in some aspects of the hardware mipmap generation implementation in these drivers, but the workarounds exposed a couple of bugs of our own in software mipmap generation code &#8211; which hasn&#8217;t been used by Ogre on most modern hardware for several years, since we&#8217;ve opted for hardware mipmap generation for a long time.</p>
<p>One was that we had been retrieving the internal format of a GL texture after construction using glGetTexLevelParameteriv with GL_INTERNAL_FORMAT, in accordance with recommendations. However we made a mistake in that for cubic textures we were passing the type enum GL_TEXTURE_CUBE_MAP instead of the <em>target</em> enum GL_TEXTURE_CUBE_MAP_POSITIVE_X et al. Subtle, and for whatever reason it must have worked fine on older drivers, but the 175.x drivers became more strict and were throwing an error. Unfortunately our other sin was that we weren&#8217;t checking the error code after that call (after all, what could go wrong with something that simple? <img src='http://www.stevestreeting.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ) so we completely missed it, and the internal format, which we then used later on to generate software mipmaps, was nonsense.</p>
<p>As it happens, I&#8217;ve been trying out <a href="http://www.gremedy.com/" target="_blank">Graphic Remedy&#8217;s gDEBugger</a> again recently &#8211; I&#8217;d previously tried it a couple of years ago and couldn&#8217;t get it to work properly with Ogre for some reason, and my post in their forum about it had gone without a resolution, so I let it expire without buying it. However, I really have come to miss having some way to easily diagnose GL issues, like you do with the D3D debug runtime (and various GL intercept / dump tools are ok, but generate so much data it&#8217;s hard to sift through it), and it&#8217;s clear to me that the error above may well have been highlighted by a tool such as this before the driver started to bork on it. So, I emailed GR to see if they&#8217;d be willing to give me an extended trial license and some assistance with resolving the problems I was having. They got back to me really quickly, and via our correspondence identified an issue that they will resolve in the next version of gDEBugger, but which I could also work around in Ogre for now. I haven&#8217;t had a lot of time with it yet but I intend to give it a workout over the next couple of weeks, and buy a permanent license if it turns out to be as useful as I expect.</p>
<p>I really appreciate being able to get help like this when I need it, I&#8217;m in debt to the people at NVIDIA (especially Kevin) and Graphic Remedy for the assistance. Thanks chaps!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2008/06/04/great-assistance-from-nvidia-graphic-remedy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>My thoughts on software design</title>
		<link>http://www.stevestreeting.com/2006/07/09/my-thoughts-on-software-design/</link>
		<comments>http://www.stevestreeting.com/2006/07/09/my-thoughts-on-software-design/#comments</comments>
		<pubDate>Sun, 09 Jul 2006 17:01:27 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[OGRE]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=361</guid>
		<description><![CDATA[I don&#8217;t claim to be an expert in software design, but I think I&#8217;ve learned a few things over the years. As I&#8217;ve wrestled with a few problems recently, I began to think about the approach that I generally take to the process of design. It&#8217;s influenced by books I&#8217;ve read, multiple projects that I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>I don&#8217;t claim to be an expert in software design, but I think I&#8217;ve learned a few things over the years. As I&#8217;ve wrestled with a few problems recently, I began to think about the approach that I generally take to the process of design. It&#8217;s influenced by books I&#8217;ve read, multiple projects that I&#8217;ve been involved in, and some of my gut feelings. You may agree or disagree, but I felt it would be good, even just for myself, to write down the tenets that I&#8217;ve come to regard as core to my design approach.<br />
<span id="more-361"></span><br />
<b>1. Step away from the computer</b><br />
Seriously. I&#8217;ve used a lot of modelling tools over the years, from early entity relationship diagram tools, through the birth of UML (I rejoiced when the &#8217;3 Amigos&#8217; finally decided to unify their notation), through to integrated round-trip engineering tools these days, and whilst they are very clever, and are great for recording and communicating a detailed design, but they are manifestly damaging when it comes to <i>early stage conceptual design</i>. Some people leap right into those tools as soon as they have a new problem to solve, and that scares me. These tools encourage you to think about detail and layout <b>way</b> too early, and lengthen the process of iterative high-level design purely because everything is so formalised. When you&#8217;ve put a lot of effort into documenting an embryonic design in detail in one of these tools, you don&#8217;t want to lose that effort, so you are less likely to trash it if it starts to look inappropriate. Plus it takes you longer to find that out because you spend too long driving the tool the way it wants to be driven (all those features cry out to be used). You might think that you can be strong enough not to be tempted by that, but even subconsciusly there&#8217;s going to be a little voice on your shoulder saying &#8216;you just spent 3 hours on that, surely you don&#8217;t want to toss it all away?&#8217;.</p>
<p>Your best conceptual design friend is a stack of paper (preferably recycled or, in my case, the backs of unwanted printouts), a HB pencil and a stout eraser. Oh, and a large paper bin, you&#8217;ll need that. There is nothing, <b>absolutely</b> nothing, faster for conceptual design than this, and I seriously doubt there ever will be, until of coruse they invent direct neural downloads. You&#8217;ll blast through ideas fast, you can link them up however you like, spatially arrange them, and easily discard them without feeling you&#8217;ve wasted too much time. Everything you do is exploration and requires no more effort than it merits. </p>
<p>So, don&#8217;t believe the hype from people trying to sell you design tools. Design is about what humans do best &#8211; deciding how best to tackle problems given a potentially abstract set of environmental conditions. The only tools you need are those that help you explore that, and the simpler the better. Get complex once you&#8217;ve decided on the approach by all means, but do that any earlier and it&#8217;s just slowing you down, and make doing the other things in this list harder.</p>
<p><b>2. Look at any problem from multiple directions</b><br />
Don&#8217;t just think of a feature from the perspective of how you want to use it now; study trends and decide how it might be used in the future, or what else you might use it for given a moderate conceptual twist. You can&#8217;t predict everything, but anticipating change and alternate usages will give you a better chance of picking a holistic approach, where your current intended usage is just a facet of a greater, more generalised implementation.</p>
<p><b>3. Look for patterns</b><br />
Almost every software engineering problem has been encountered before, in some guise or another. That means other people have already put a lot of thought into approaches (which may or may not be appropriate for your needs). Don&#8217;t come up with your own solution before exploring these, at the very least they may influence your eventual solution if you&#8217;re in the rare situation where none already exists.</p>
<p>This is one situation where being at the computer <i>may</i> help, if you don&#8217;t have a good grasp of a good number of design patterns already, and don&#8217;t have a good library on the subject. However, there is no tool that I&#8217;m aware of that can suggest a pattern for you, since drawing parallels with other data sets and pattern matching is something humans do very well, but machines very much less so. Also, blind internet searching can lead you astray, ince using patterns without appropriate context can be worse than not using them at all &#8211; every pattern comes with a set of parameters and suitability conditions that you really have to have a good grasp of. Your best bet is to read all the time &#8211; books like the Gang of Four, online articles etc, and re-read them regularly to keep them in your head so that you&#8217;re more likely to spot an appropriate pattern when you see it.</p>
<p><b>4. Always document your reasons for a design choice</b><br />
There&#8217;s no such thing as a perfect design, every design is a series of compromises based on the goals and constraints in each problem domain. Being explicit about your reasons for choosing one approach over another allows you to evaluate alternative approaches long after your mind has exited &#8216;the zone&#8217; on this particular issue.</p>
<p><b>5. Ruthlessly define scope</b><br />
Knowing where your boundaries are is one of the most important things in design. If a designer can&#8217;t tell you where their system &#8216;ends&#8217;, or imply that it does &#8216;everything&#8217;, then they should be very worried. If you can&#8217;t define what&#8217;s inside, and just as importantly what&#8217;s outside your scope, how on earth are you ever going know when you&#8217;re finished, or whether a feature belongs in your system or whether it belongs somewhere else? You can&#8217;t.</p>
<p>You absolutely must be able to draw a clean, unambiguous box around any system you design. That&#8217;s because every system in the world has to interact with other systems, and that box represents the interface points &#8211; anything going in or out of that system boundary needs an interface, and that&#8217;s one of the most important aspects of the design; many systems will live or die by how well they can be integrated with other systems. If you can&#8217;t clearly define what&#8217;s &#8216;inside&#8217; and what&#8217;s &#8216;outside&#8217; that box, you can&#8217;t possibly define the line that describes it, which means you can&#8217;t define consistent interfaces. What you end up with is a bleeding, feature-creeping system with ad-hoc integration points without any holistic design behind it. If you&#8217;ve ever had to integrate with a system that feels like that, you have my sympathies. </p>
<p><b>6. Plan for change, but realise your limits</b><br />
We all know that nothing stands still. That means we should try to design things flexibly so that they accept change readily. Using approaches like data-driven design, good abstraction of discrete concepts, dynamically customisable code (e.g. plugins) all help achieve that goal and are nearly always a good thing. But, you have to draw the line somewhere &#8211; there will be times when you have to make assumptions. That&#8217;s fine, so long as those assumptions are documented, and preferably they sit on your &#8216;scope boundary&#8217; &#8211; ie in your original scope definition you said you would allow for &#8216;x&#8217;, and no more (see previous point). Sometimes, you just have to stop somewhere, stick a flag in, and move on to something else.</p>
<p>Why not try to plan for all change? Well, you can&#8217;t, and your efforts in this area will yield diminishing returns. Change within a strongly cenceived scope is a good idea, but beyond that scope you should deal with change through refactoring, should you need to. Hopefully your scope is defined clearly enough that you can draw that line in the sand unambiguously (again, see previous point). </p>
<p><b>7. Don&#8217;t be afraid to change your mind</b><br />
Being wrong is fine, so long as you&#8217;re willing to realise and embrace it. Be aware that design is an optimisation process, and is often iterative &#8211; you&#8217;re trying to find the most appropriate design for the problem at hand, within the time constraints you have available. This means that even your best design may only be a local minimum; there may be other solutions which fit your needs better that are just over the next &#8216;bump&#8217;, you just might not be able to see them yet. </p>
<p>The previous points I&#8217;ve made are all in support of this point. Never assume you&#8217;ve got the best design yet, because you probably haven&#8217;t. Keeping agile in your design process (point 1), being as open-minded as possible (point 2), looking for accepted wisdom (point 3), putting a stake in the ground when you&#8217;ve made a particular choice (point 4), and knowing your scope for change (points 5 and 6) will all help you reflect when a potentially better option becomes available.</p>
<p>Maybe that&#8217;s given you a little insight into the way I go about design from a high level. Maybe not, or maybe you don&#8217;t care <img src='http://www.stevestreeting.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  But  there it is anyway. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2006/07/09/my-thoughts-on-software-design/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>What time is it? Tooth hurty.</title>
		<link>http://www.stevestreeting.com/2005/12/07/what-time-is-it-tooth-hurty/</link>
		<comments>http://www.stevestreeting.com/2005/12/07/what-time-is-it-tooth-hurty/#comments</comments>
		<pubDate>Wed, 07 Dec 2005 17:43:10 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=204</guid>
		<description><![CDATA[It was eleven o&#8217;clock last night and I&#8217;d just had a cup of tea. Pretty uneventful you&#8217;d think, Englishman has tea, perhaps had I been even more traditional there might have been some checkered pygamas and/or smoking jacket and a copy of The Times involved too, but no, just a good old steaming mug of [...]]]></description>
			<content:encoded><![CDATA[<p>It was eleven o&#8217;clock last night and I&#8217;d just had a cup of tea. Pretty uneventful you&#8217;d think, Englishman has tea, perhaps had I been even more traditional there might have been some checkered pygamas and/or smoking jacket and a copy of The Times involved too, but no, just a good old steaming mug of the brown nectar.</p>
<p>Until my tooth starting yelling blue murder &#8211; loudly. You wouldn&#8217;t have thought that a tooth had a good pair of lungs on it, but this one did. I have sensitive teeth anyway, so I assumed it was a cold day / hot drink thing at first, but this little blighter just wouldn&#8217;t shut up. Not being able to concentrate, I left the computer and had a bash at Mario Kart for half an hour or so to take my mind off it. Still hurt. So, I made an attempt to dull it with pain killers and hit the sack.</p>
<p>This morning it had mercifully calmed down, but I went to the dentist to get it checked out. The news is that the oldest hunk of metal in my head (yes, this filling dates from the time when you had to go to a blacksmith to get yer teeth sorted, so yer did) has started to become defective, and hence has a habit of leaking ostensibly harmless tea into rather sensitive nerve ending cluttered cavities. Damn.</p>
<p>So, tomorrow I have to return to have the thing refitted with a new and improved &#8216;Filling 2.0&#8242;, which I can only imagine these days includes a toungue-activated, flash-based MP3 player built in. Well, for the price they charge, it has to have something good, right?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2005/12/07/what-time-is-it-tooth-hurty/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Delays, delays</title>
		<link>http://www.stevestreeting.com/2005/11/21/delays-delays/</link>
		<comments>http://www.stevestreeting.com/2005/11/21/delays-delays/#comments</comments>
		<pubDate>Mon, 21 Nov 2005 17:01:23 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=194</guid>
		<description><![CDATA[I just got word from my supplier that Visual Studio 2005 Pro won&#8217;t be dispatched until 10 December now, which allegedly is due to shipping delays at Microsoft and as such will affect all suppliers in the UK. Darn. I have Express already obviously, but I&#8217;m still doing most of my work in 2002 since [...]]]></description>
			<content:encoded><![CDATA[<p>I just got word from my supplier that Visual Studio 2005 Pro won&#8217;t be dispatched until 10 December now, which allegedly is due to shipping delays at Microsoft and as such will affect all suppliers in the UK. Darn.</p>
<p>I have Express already obviously, but I&#8217;m still doing most of my work in 2002 since I can&#8217;t bear to be without my favorite plugins for too long. Let&#8217;s hope it arrives before Xmas, think of all those sad little faces on Christmas morning if Visual Studio 2005 doesn&#8217;t make it into their stockings. Santa just might end up on the business end of little Johnny&#8217;s next DDOS attack. Bless.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2005/11/21/delays-delays/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Another release out the door&#8230;</title>
		<link>http://www.stevestreeting.com/2005/11/20/another-release-out-the-door/</link>
		<comments>http://www.stevestreeting.com/2005/11/20/another-release-out-the-door/#comments</comments>
		<pubDate>Sun, 20 Nov 2005 20:51:49 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[OGRE]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=193</guid>
		<description><![CDATA[Well, that&#8217;s another OGRE release out the door, this time it&#8217;s 1.0.6, another maintenance release for Azathoth. Once again it&#8217;s packed full of bugfixes, which always gives me pause for thought &#8211; every time we do a maintenance release I think &#8216;right, there&#8217;s no way we&#8217;re going to build up that many fixes again in [...]]]></description>
			<content:encoded><![CDATA[<p>Well, that&#8217;s another OGRE release out the door, this time it&#8217;s 1.0.6, another maintenance release for Azathoth. Once again it&#8217;s packed full of bugfixes, which always gives me pause for thought &#8211; every time we do a maintenance release I think &#8216;right, there&#8217;s no way we&#8217;re going to build up that many fixes again in another 6 weeks&#8217;, but still we manage to. It sort of makes me uncomfortable that this many things still turn up, but it&#8217;s fair to say that the majority of the fixes this time were the less serious ones, such as safer behaviour when the user screws up, or memory leak removal in more unusual circumstances. OGRE has actually been extremely stable for some time, but each maintenance release makes it even more robust. This time we added support for VC++ 2005 and XSI v5 too.</p>
<p>Dagon is still waiting in the wings, targetted at the end of the year now although, as always, it&#8217;ll be done when it&#8217;s done &#8211; something that&#8217;s especially applicable when doing things in your spare time. My main goals are to implement shape exporting in XSI, for morph animation and facial animation, but it requires that I learn more about modelling those things in XSI first. I&#8217;ve already started making my way through the training DVD and it&#8217;s really quite fun. I wish I had more time to play around with XSI, it&#8217;s a really nice tool. </p>
<p>Given _mental_&#8217;s absence lately I&#8217;m may also going to need to pick up the point sprite work he was going to do, unless :wumpus: gets there first. People&#8217;s time is very unpredictable so we&#8217;ll see how it goes. I&#8217;d also like to do a HDR demo of some sort sometime since I messed about with HDR in OGRE for a client a little while back and would like to show it in action. </p>
<p>Of course along with all this I have Kadath in the background, which I really must get on with. I lost a fair amount of time due to some personal issues over the last couple of months, and pretty soon it&#8217;s going to be early 2006 which was my target for the first version. So, time to crack the whip some more.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2005/11/20/another-release-out-the-door/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

