<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Spin-X Engine Community - Blogs</title>
		<link>http://community.spinxengine.com/blogs/</link>
		<description>Community for Spin-X Engine licensees and game developers to get support, discuss, blog, write articles, promote their projects and interact in various other ways with fellow developers.</description>
		<language>en</language>
		<lastBuildDate>Tue, 07 Sep 2010 21:57:09 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>60</ttl>
		<image>
			<url>http://community.spinxengine.com/images/misc/rss.jpg</url>
			<title>Spin-X Engine Community - Blogs</title>
			<link>http://community.spinxengine.com/blogs/</link>
		</image>
		<item>
			<title>To License Or Not To License</title>
			<link>http://community.spinxengine.com/blogs/jarkkol/16-license_not_license.html</link>
			<pubDate>Sat, 04 Sep 2010 13:19:56 GMT</pubDate>
			<description><![CDATA[_*Me Too!*_ 
 
It's no secret that many programmers who work in the game industry have desire to develop a  game engine from scratch for the next...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><u><b>Me Too!</b></u><br />
<br />
It's no secret that many programmers who work in the game industry have desire to develop a  game engine from scratch for the next game the company will be working on. It's a very interesting challenge, educational, nice addition to your portfolio if you manage to pull it off, the result will be exactly what you want (or so you can hope) and when you write the engine yourself you know it inside out. These are the common motivations that push programmers to develop this technology by themselves. Particularly if a team has technology leads with strong desires like these it's likely they will try to justify to the management of the company why development of their own technology instead of licensing is the best choice. These justifications may include things like:<br />
<br />
- It's a lot of money to invest something like 1M€ for a royalty-free high-profile game engine PER PROJECT when you can make one by yourself.<br />
- There will be technological and/or production advantages when using own technology.<br />
- The company may replicate the glory of id Software, Epic, Crytek and be able to license the technology and make tons of money off it.<br />
- Licensing existing technology may not be exactly what the project needs thus there's need to rewrite a lot of the engine code anyway to match the requirements of the project.<br />
- When developing the technology yourself you'll be expert with it thus gain in productivity in the long run.<br />
<br />
These are all valid points. However, because of the personal desires to develop a game engine, it's also easy to neglect the other side of the coin.<br />
<br />
<br />
<u><b>The Other Side</b></u><br />
<br />
Hiring programmers who have sufficient knowledge to develop a high-profile game engine from scratch is very VERY hard taking long time and if you are lucky to get some on board they come with a hefty price tag. Please don't hire inexperienced developers for such a critical task, because they will bring your project (or even company) down. Even if you license the technology and your team consists mostly of inexperienced programmers there are many ways to screw up the project anyway. Also if you plan to build a new team of experienced programmers to develop the engine it's a very risky proposition because the team doesn't have past experience in working together. However, if you have already a team of mostly experienced programmers who have successfully shipped a game project together you are in much better position.<br />
<br />
Don't get lured by superficial eye candy engine prototypes. Getting something that looks cool on the screen is much easier than building robust engine with solid production pipeline that's essential if you want to have any hope of shipping games in time and in budget. Eye candy demos that can be put together in only a few months can give totally false impression of how much work is actually required for developing a production-ready game engine.<br />
<br />
It'll take a lot of time to develop a game engine and pipeline to the level that is feasible for production, even for very experienced programmers with past experience in the engine development. This means that your game will be delayed by at least couple of years if you can't start the engine project a side from your game projects and tie your most talented programmers to work on it. Is that the price you are willing to pay? Don't buy into promises of having production quality engine and pipeline ready in a year. You can have SOMETHING ready in a year for production team to use, but the production team will pay the bill in productivity by struggling with a clumsy, crashing, feature lacking, immature monster, and wasting the time of your production team will cost you a lot.<br />
<br />
If we estimate that it takes 3 years for 10 programmers to make a production-ready engine and pipeline (yes, don't forget the pipeline), don't expect that you can scale your programming team to 30 programmers and make it in 1 year. It's no news that programming team productivity doesn't scale linearly with its size, particularly when building a game engine from scratch. There is a lot of infrastructure to be build for a game engine before programmers can start to work somewhat independently thus more productively, and building a solid engine infrastructure takes a lot of time. After the initial stretch of making the engine ready for production, you'll also need to keep maintaining and improving the existing engine, so the expenses of the engine development doesn't end there but you must keep your most talented programmers tied to the engine development for good to keep it competitive with licensed engines.<br />
<br />
Translating these estimates to the cost of an engine development, and each programmer costing something like 100k€/y for the company including all expenses, that's 3M€ initial investments and 2-3 years guaranteed delay in shipping the game, followed by 1M€/y for maintaining and improving the engine. Furthermore, there's no guarantees about the quality of the engine after 3 years of initial development, unlike if you license an engine which you can at least evaluate before investing money on it. Can your programming team actually pull it off and hit the expected quality bar set to 3 years into the future? Do they have the necessary experience to back up their promises?<br />
<br />
If it takes twice the time to develop a single game along with an engine developed in-house compared to licensing the engine and being productive from day one, what's the price of this delay? There is very good chance of missing deadlines due to many unforeseen problems in the risky technology development and production team working with unproven technology, which may lead to publisher/financier pulling the plug and thus becoming very pricy for the company. Worse, you don't have anyone outside the company to blame for the delays since it's all your work! By doubling the game development time, you have also halved the potential annual revenue your company generates from selling games. Does an in-house game engine give you such a big leverage in sales that it outweighs this loss in comparison to improving &amp; tailoring licensed technology?<br />
<br />
Something also to consider is that licensing a game engine doesn't only enable you to use the engine technology in your project, but also comes with several man-years worth of additional development support for your project in form of engine updates over the course of the project. Depending on the engine you may also have quite good support to get your team quickly up to speed and sort various issues in game development along the way. There may also be services provided for the engine licensees to get additional game specific features developed for it, thus providing a way to mitigate risks in your project, or options to integrate various add-on components to make the engine better fit for your project. Well built engine architectures give your programmers also a lot of flexibility regarding customizing the engine technology and tools for your games and developing technology which gives your game additional technological leverage.<br />
<br />
<br />
<u><b>Wrap Up</b></u><br />
<br />
I don't want to say that developing a custom engine is always a wrong choice, but that it can be a very pricy one driven by personal desires of the technical staff in the company, instead of something that necessarily makes much of a business sense. If you are well established developer running multiple simultaneous game projects and can afford to dedicate experienced programmers to the engine development, it can be a good choice and pay off over the long run. Because development of a game engine is very risky and long term endeavor requiring huge investment from the game company, it's better not to underestimate the effort, money and risks involved if you decide to take that route. So if your team is thinking of developing an in-house game engine, you should carefully consider both sides of the coin, because under unfavorable conditions taking engine development route can be pretty damn expensive or even fatal to the company.</blockquote>

 ]]></content:encoded>
			<dc:creator>JarkkoL</dc:creator>
			<guid isPermaLink="true">http://community.spinxengine.com/blogs/jarkkol/16-license_not_license.html</guid>
		</item>
		<item>
			<title>Spin-X Engine LOC progress</title>
			<link>http://community.spinxengine.com/blogs/jarkkol/15-spin-x_engine_loc_progress.html</link>
			<pubDate>Fri, 03 Sep 2010 11:46:04 GMT</pubDate>
			<description>Spin-X Engine has been in active development since late 2008 and below is a graph showing the progress in lines-of-code (LOC) since the beginning of...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Spin-X Engine has been in active development since late 2008 and below is a graph showing the progress in lines-of-code (LOC) since the beginning of 2009 when the engine was submitted to <a href="http://sourceforge.net/projects/spinxengine" target="_blank">SourceForge SVN server</a> for the first time. Currently the engine has a bit over 140kLOC, and as a reference UE3 had <a href="http://www.cs.princeton.edu/~dpw/popl/06/Tim-POPL.ppt" target="_blank">~250kLOC for Gears of War</a>. These numbers exclude external libraries used by the engines, such as image decoding and GUI libraries, which for Spin-X Engine add up to ~760kLOC. With the current progress the engine will reach GoW UE3 kLOC within 2-3 years. Of course kLOC number is only a rough estimate of the feature set of the engine but it gives an easily digestible sense of the size of the project.<br />
<br />
<div align="center"><img src="http://community.spinxengine.com/members/jarkkol-albums-blog_images-picture55-spinx_loc.png" border="0" alt="" /></div><br />
Here's also another graph showing the frequency of SVN commits of the engine for sake of it. In January 2010 the engine was moved to a private SVN server with occassional source code submits to public SourceForge server.<br />
<br />
<div align="center"><img src="http://community.spinxengine.com/members/jarkkol-albums-blog_images-picture56-sxe_submits.png" border="0" alt="" /></div><br />
Complete statistics XLSX file: <a href="http://community.spinxengine.com/attachments/audio_technology/57d1283514075-os_mp3_aac_libs-sxe_stats_zip"  title="Name:  sxe_stats.zip
Views: 3
Size:  19.7 KB">sxe_stats.zip</a></blockquote>

 ]]></content:encoded>
			<dc:creator>JarkkoL</dc:creator>
			<guid isPermaLink="true">http://community.spinxengine.com/blogs/jarkkol/15-spin-x_engine_loc_progress.html</guid>
		</item>
		<item>
			<title>We got a new logo in town!</title>
			<link>http://community.spinxengine.com/blogs/jarkkol/14-we_got_new_logo_town.html</link>
			<pubDate>Thu, 10 Jun 2010 18:40:08 GMT</pubDate>
			<description>Finally got a new logo for Profoundic Technologies, woot! 8D Hope you like it! 
 
Image:...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Finally got a new logo for Profoundic Technologies, woot! 8D Hope you like it!<br />
<br />
<img src="http://community.spinxengine.com/members/jarkkol-albums-blog_images-picture54-profoundic_logo.png" border="0" alt="" /></blockquote>

 ]]></content:encoded>
			<dc:creator>JarkkoL</dc:creator>
			<guid isPermaLink="true">http://community.spinxengine.com/blogs/jarkkol/14-we_got_new_logo_town.html</guid>
		</item>
		<item>
			<title>Spin-X Editor level building</title>
			<link>http://community.spinxengine.com/blogs/jarkkol/13-spin-x_editor_level_building.html</link>
			<pubDate>Thu, 20 May 2010 07:53:24 GMT</pubDate>
			<description>Thought of making a short video about creating a level segment in Spin-X Editor for my upcoming music game. The video is a bit longer than I hoped at...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Thought of making a short video about creating a level segment in Spin-X Editor for my upcoming music game. The video is a bit longer than I hoped at ~18mins even after speeding it up 2x, but I couldn't work faster, sorry :) I had all the assets already setup in the editor so the work was mostly about placing objects into the level and tweaking some parameters. Anyway, if you are interested to get the general idea about level building in Spin-X Editor, this video is a good watch.<br />
<br />
<div align="center">
<object class="restrain" type="application/x-shockwave-flash" width="640" height="360" data="http://vimeo.com/moogaloop.swf?clip_id=11878104">
	<param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=11878104" />
	<param name="wmode" value="transparent" />
	<!--[if IE 6]>
	<embed width="640" height="360" type="application/x-shockwave-flash" src="http://vimeo.com/moogaloop.swf?clip_id=11878104" />
	<![endif]--></object>
 </div><br />
Cheers, Jarkko</blockquote>

 ]]></content:encoded>
			<dc:creator>JarkkoL</dc:creator>
			<guid isPermaLink="true">http://community.spinxengine.com/blogs/jarkkol/13-spin-x_editor_level_building.html</guid>
		</item>
		<item>
			<title>New Game Screenshots!</title>
			<link>http://community.spinxengine.com/blogs/jarkkol/12-new_game_screenshots.html</link>
			<pubDate>Fri, 07 May 2010 15:36:42 GMT</pubDate>
			<description><![CDATA[Here are 3 new work-in-progress screenshots of an indie game for PC/Windows I'm currently working on. There are still many things to do, but I'm...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Here are 3 new work-in-progress screenshots of an indie game for PC/Windows I'm currently working on. There are still many things to do, but I'm hoping to release the game during this summer. This is a music/rhythm game like <a href="http://en.wikipedia.org/wiki/Dance_Dance_Revolution" target="_blank">DDR</a> or <a href="http://en.wikipedia.org/wiki/Guitarhero" target="_blank">Guitar Hero</a>, where by listening the beat of the music and playing by it helps you to score better in the game. You fly through levels as this little hummingbird seen in the pictures, collecting/following things distributed by the beat of the music while avoiding obstacles in the environment. The environment also lives by the music and for example in this &quot;mushroom&quot; theme, mushrooms and berries in the environment flash by the beats of music. The plan is to have couple of different themes shipped with the game to choose from and more available later as DLC through the game's website. The game will have ~20 different pieces of music, and more levels created for different popular/wish list music which will be also available as DLC.<br />
<br />
<div align="center"><img src="http://community.spinxengine.com/members/jarkkol-albums-temp-picture52-shot_20100507_01.jpg" border="0" alt="" /><br />
<br />
<img src="http://community.spinxengine.com/members/jarkkol-albums-temp-picture51-shot_20100507_02.jpg" border="0" alt="" /><br />
<br />
<img src="http://community.spinxengine.com/members/jarkkol-albums-temp-picture50-shot_20100507_03.jpg" border="0" alt="" /></div><br />
I'll release a gameplay video later once I got the game more polished. If you are registered and got comments or suggestions, feel free to write it below or send me <a href="mailto:jarkko@profoundic.com">email</a> :)<br />
<br />
<br />
Cheers, Jarkko</blockquote>

 ]]></content:encoded>
			<dc:creator>JarkkoL</dc:creator>
			<guid isPermaLink="true">http://community.spinxengine.com/blogs/jarkkol/12-new_game_screenshots.html</guid>
		</item>
		<item>
			<title>SXE in Parallel Universe</title>
			<link>http://community.spinxengine.com/blogs/jarkkol/11-sxe_parallel_universe.html</link>
			<pubDate>Thu, 29 Apr 2010 19:07:54 GMT</pubDate>
			<description><![CDATA[In order to see what kind of multi-core scalability potential Spin-X Engine has, I tested the job queue of the engine using Intel's free Parallel...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">In order to see what kind of multi-core scalability potential Spin-X Engine has, I tested the job queue of the engine using Intel's free <a href="http://paralleluniverse.intel.com" target="_blank">Parallel Universe</a> service. Parallel Universe portal lets you to upload executables through the web interface to the service, which runs and profiles the executables in different multi-core configurations ranging from 1 to 16 cores. After half an hour the service emails notification about the job completion with a link to the statistics page. This way you can check the scalability of simple non-interactive applications beyond the usual 4-core machines we mortal people usually have access to :)<br />
<br />
For my test case I used a modified version of the multi-threaded Mandelbrot fractal sample shown below that's available in samples/mp_mandelbrot directory of Spin-X Engine. This is a good test case in the sense that fractal calculation is <a href="http://en.wikipedia.org/wiki/Embarrassingly_parallel" target="_blank">embarrassingly parallel</a> task and well demonstrates basic multi-threading characteristics of the job-queue that's the heart of all parallelization in the engine. The test doesn't test the task dependency nor the load balancing features of the job-queue though, which are essential for optimizing the total game frame computation time in practice, but it still gives some idea how well the job-queue implementation scales with increasing number of available cores &amp; threads. It would be interesting to write more pragmatic test case though, which would also stress these features to give better idea about the real-world scalability.<br />
<br />
<div class="bbcode_container">
                <div class="bbcode_description">Code cpp:</div>
                <div class="bbcode_code" style="height:372px;"><div class="cpp" style="font-family:monospace;"><pre style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #339900;">#include &quot;core/mp/mp_job_queue.h&quot;</span>
<span style="color: #339900;">#include &quot;core/w32_fsys.h&quot;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> pfc<span style="color: #008080;">;</span>
<span style="color: #666666;">//----------------------------------------------------------------------------</span>
&nbsp;
&nbsp;
<span style="color: #666666;">//============================================================================</span>
<span style="color: #666666;">// image config</span>
<span style="color: #666666;">//============================================================================</span>
<span style="color: #0000ff;">enum</span> <span style="color: #008000;">&#123;</span>block_width<span style="color: #000080;">=</span><span style="color: #0000dd;">8</span>, block_height<span style="color: #000080;">=</span><span style="color: #0000dd;">8</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">enum</span> <span style="color: #008000;">&#123;</span>image_width<span style="color: #000080;">=</span><span style="color: #0000dd;">4096</span>, image_height<span style="color: #000080;">=</span><span style="color: #0000dd;">4096</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #666666;">//----</span>
<span style="color: #0000ff;">enum</span> <span style="color: #008000;">&#123;</span>num_horizontal_blocks<span style="color: #000080;">=</span>image_width<span style="color: #000040;">/</span>block_width<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">enum</span> <span style="color: #008000;">&#123;</span>num_vertical_blocks<span style="color: #000080;">=</span>image_height<span style="color: #000040;">/</span>block_height<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">double</span> g_delta_cr<span style="color: #000080;">=</span><span style="color:#800080;">0.0</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">double</span> g_delta_ci<span style="color: #000080;">=</span><span style="color:#800080;">0.0</span><span style="color: #008080;">;</span>
<span style="color: #666666;">//----------------------------------------------------------------------------</span>
&nbsp;
&nbsp;
<span style="color: #666666;">//============================================================================</span>
<span style="color: #666666;">// Mandelbrot fractal calculation</span>
<span style="color: #666666;">//============================================================================</span>
<span style="color: #0000ff;">struct</span> mandelbrot_block
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">double</span> start_cr, start_ci<span style="color: #008080;">;</span>
  uint8 <span style="color: #000040;">*</span>result<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #666666;">//----</span>
&nbsp;
<span style="color: #0000ff;">void</span> calculate_mandelbrot_block<span style="color: #008000;">&#40;</span>mandelbrot_block <span style="color: #000040;">*</span>block_<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// calculate Mandelbrot fractal image block</span>
  <span style="color: #0000ff;">double</span> ci<span style="color: #000080;">=</span>block_<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>start_ci<span style="color: #008080;">;</span>
  <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> y<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> y<span style="color: #000080;">&lt;</span>block_height<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>y<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    uint8 <span style="color: #000040;">*</span>res<span style="color: #000080;">=</span>block_<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>result<span style="color: #000040;">+</span>y<span style="color: #000040;">*</span>image_width<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">double</span> cr<span style="color: #000080;">=</span>block_<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>start_cr<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> x<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> x<span style="color: #000080;">&lt;</span>block_width<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>x<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
      <span style="color: #666666;">// calculate Mandelbrot fractal pixel</span>
      <span style="color: #0000ff;">double</span> zr<span style="color: #000080;">=</span>cr, zi<span style="color: #000080;">=</span>ci<span style="color: #008080;">;</span>
      <span style="color: #0000ff;">double</span> zr2, zi2<span style="color: #008080;">;</span>
      <span style="color: #0000ff;">enum</span> <span style="color: #008000;">&#123;</span>max_iterations<span style="color: #000080;">=</span><span style="color: #0000dd;">256</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">unsigned</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">do</span>
      <span style="color: #008000;">&#123;</span>
        zr2<span style="color: #000080;">=</span>zr<span style="color: #000040;">*</span>zr<span style="color: #008080;">;</span>
        zi2<span style="color: #000080;">=</span>zi<span style="color: #000040;">*</span>zi<span style="color: #008080;">;</span>
        zi<span style="color: #000080;">=</span><span style="color:#800080;">2.0</span><span style="color: #000040;">*</span>zr<span style="color: #000040;">*</span>zi<span style="color: #000040;">+</span>ci<span style="color: #008080;">;</span>
        zr<span style="color: #000080;">=</span>zr2<span style="color: #000040;">-</span>zi2<span style="color: #000040;">+</span>cr<span style="color: #008080;">;</span>
      <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>zr2<span style="color: #000040;">+</span>zi2<span style="color: #000080;">&lt;</span><span style="color:#800080;">4.0</span> <span style="color: #000040;">&amp;&amp;</span> <span style="color: #000040;">++</span>i<span style="color: #000080;">&lt;</span>max_iterations<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
      <span style="color: #666666;">// move to the next pixel</span>
      cr<span style="color: #000040;">+</span><span style="color: #000080;">=</span>g_delta_cr<span style="color: #008080;">;</span>
      <span style="color: #000040;">*</span>res<span style="color: #000040;">++</span><span style="color: #000080;">=</span>uint8<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #666666;">// move to the next line</span>
    ci<span style="color: #000040;">-</span><span style="color: #000080;">=</span>g_delta_ci<span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #666666;">//----------------------------------------------------------------------------</span>
&nbsp;
&nbsp;
<span style="color: #666666;">//============================================================================</span>
<span style="color: #666666;">// main</span>
<span style="color: #666666;">//============================================================================</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc_, <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>argv_<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  init_working_dir<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  w32_file_system fs<span style="color: #008080;">;</span>
  owner_data<span style="color: #000080;">&lt;</span>uint8<span style="color: #000080;">&gt;</span> image_mt<span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span>uint8<span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>PFC_MEM_ALLOC<span style="color: #008000;">&#40;</span>image_width<span style="color: #000040;">*</span>image_height<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
  <span style="color: #666666;">// Mandelbrot fractal setup</span>
  <span style="color: #0000ff;">double</span> mandelbrot_x<span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color:#800080;">2.0f</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">double</span> mandelbrot_y<span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">double</span> mandelbrot_width<span style="color: #000080;">=</span><span style="color:#800080;">3.0f</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">double</span> mandelbrot_height<span style="color: #000080;">=</span><span style="color:#800080;">2.0f</span><span style="color: #008080;">;</span>
  mandelbrot_y<span style="color: #000040;">+</span><span style="color: #000080;">=</span>mandelbrot_height<span style="color: #008080;">;</span>
&nbsp;
  <span style="color: #666666;">// setup image blocks and add jobs for multi-threaded test</span>
  <span style="color: #008000;">&#123;</span>
    mp_job_queue jq<span style="color: #008080;">;</span>
    e_jobtype_id jtid<span style="color: #000080;">=</span>jq.<span style="color: #007788;">create_job_type</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;calculate_mandelbrot&quot;</span>, <span style="color: #000040;">&amp;</span>calculate_mandelbrot_block<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">enum</span> <span style="color: #008000;">&#123;</span>num_blocks<span style="color: #000080;">=</span>num_horizontal_blocks<span style="color: #000040;">*</span>num_vertical_blocks<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
    owner_data<span style="color: #000080;">&lt;</span>mandelbrot_block<span style="color: #000080;">&gt;</span> blocks<span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span>mandelbrot_block<span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>PFC_MEM_ALLOC<span style="color: #008000;">&#40;</span>num_blocks<span style="color: #000040;">*</span><span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>mandelbrot_block<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">enum</span> <span style="color: #008000;">&#123;</span>num_fractals<span style="color: #000080;">=</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i<span style="color: #000080;">&lt;</span>num_fractals<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
      logf<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Calculating fractal %i/%i...<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, i<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>, num_fractals<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      g_delta_cr<span style="color: #000080;">=</span>mandelbrot_width<span style="color: #000040;">/</span>image_width<span style="color: #008080;">;</span>
      g_delta_ci<span style="color: #000080;">=</span>mandelbrot_height<span style="color: #000040;">/</span>image_width<span style="color: #008080;">;</span>
      <span style="color: #0000ff;">unsigned</span> bi<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
      jq.<span style="color: #007788;">begin_add_job</span><span style="color: #008000;">&#40;</span>jtid<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> by<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> by<span style="color: #000080;">&lt;</span>num_vertical_blocks<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>by<span style="color: #008000;">&#41;</span>
        <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> bx<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> bx<span style="color: #000080;">&lt;</span>num_horizontal_blocks<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>bx<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
          mandelbrot_block <span style="color: #000040;">&amp;</span>block<span style="color: #000080;">=</span>blocks.<span style="color: #007788;">data</span><span style="color: #008000;">&#91;</span>bi<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
          block.<span style="color: #007788;">start_cr</span><span style="color: #000080;">=</span>mandelbrot_x<span style="color: #000040;">+</span><span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>bx<span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span>mandelbrot_width<span style="color: #000040;">/</span>num_horizontal_blocks<span style="color: #008080;">;</span>
          block.<span style="color: #007788;">start_ci</span><span style="color: #000080;">=</span>mandelbrot_y<span style="color: #000040;">-</span><span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>by<span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span>mandelbrot_height<span style="color: #000040;">/</span>num_vertical_blocks<span style="color: #008080;">;</span>
          block.<span style="color: #007788;">result</span><span style="color: #000080;">=</span>image_mt.<span style="color: #007788;">data</span><span style="color: #000040;">+</span>bx<span style="color: #000040;">*</span>block_width<span style="color: #000040;">+</span>by<span style="color: #000040;">*</span>block_height<span style="color: #000040;">*</span>image_width<span style="color: #008080;">;</span>
          jq.<span style="color: #007788;">add_job</span><span style="color: #008000;">&#40;</span>jtid, <span style="color: #000040;">&amp;</span>block<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
      jq.<span style="color: #007788;">end_add_job</span><span style="color: #008000;">&#40;</span>jtid<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      jq.<span style="color: #007788;">wait_all_jobs</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
      mandelbrot_x<span style="color: #000040;">+</span><span style="color: #000080;">=</span>mandelbrot_width<span style="color: #000040;">*</span><span style="color:#800080;">0.05f</span><span style="color: #008080;">;</span>
      mandelbrot_y<span style="color: #000040;">-</span><span style="color: #000080;">=</span>mandelbrot_height<span style="color: #000040;">*</span><span style="color:#800080;">0.025f</span><span style="color: #008080;">;</span>
      mandelbrot_width<span style="color: #000040;">*</span><span style="color: #000080;">=</span><span style="color:#800080;">0.9f</span><span style="color: #008080;">;</span>
      mandelbrot_height<span style="color: #000040;">*</span><span style="color: #000080;">=</span><span style="color:#800080;">0.9f</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
  <span style="color: #008000;">&#125;</span>
  <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #666666;">//----------------------------------------------------------------------------</span></pre></div></div>
</div> <br />
The test calculates grayscale Mandelbrot fractal of 4096 x 4096 pixels, which is split to fixed size image blocks that are sent to the job-queue for calculation and which are further delegated to worker threads by the queue. The fractal is calculated 5 times during the entire test to make the test last ~1 minute in the single core mode on the test machine. After each of the 5 iterations job-queue is synced with <font face="Courier New">jq.wait_all_jobs();</font> call, but this should result only in some minor idle time for the worker threads during the test because the size of each task is quite small in relation to the entire fractal computation time.<br />
<br />
I tested few different sizes of image blocks ranging from 8x8 to 64x64 pixels to get an idea about the overhead the job-queue itself adds to the task scheduling. For 8x8 pixel blocks the test spawns total of 5 x 262,144 tasks each taking ~0.04ms in average to execute, while 64x64 pixel block test spawns total of 5 x 4,096 tasks each taking ~2.65ms in average based on the test results. For games which have the time budget of around 16-32ms per frame in order to run at 30-60 fps, tasks should be targeted to execute in around 1ms to reduce the amount of idle time at the sync point at end of the frame while minimizing the scheduling overhead. I believe this is a good general goal for task size even though the job-queue implementation in Spin-X Engine seems to impose very little overhead even on tiny tasks based on the results shown below. However, in the future architectures featuring tens or hundreds of cores splitting work to too small tasks potentially suffers from contention. Spin-X Engine job-queue implementation also tries to schedule long tasks and tasks with long dependency chains to be executed early in the frame to reduce the idle time at the sync point, so reducing the overall task size isn't as critical.<br />
<br />
<div align="center"><img src="http://community.spinxengine.com/members/jarkkol-albums-blog_images-picture46-jq_elapsed_time.png" border="0" alt="" /><br />
<img src="http://community.spinxengine.com/members/jarkkol-albums-blog_images-picture44-jq_concurrency.png" border="0" alt="" /><br />
<img src="http://community.spinxengine.com/members/jarkkol-albums-blog_images-picture45-jq_throughput.png" border="0" alt="" /></div><br />
Interestingly, the test case with 32x32 pixel blocks seems to perform consistently ~10% better than the other tests regardless of the number of cores. This could be due to a cache effect.</blockquote>

 ]]></content:encoded>
			<dc:creator>JarkkoL</dc:creator>
			<guid isPermaLink="true">http://community.spinxengine.com/blogs/jarkkol/11-sxe_parallel_universe.html</guid>
		</item>
		<item>
			<title>New Spin-X Engine public release</title>
			<link>http://community.spinxengine.com/blogs/jarkkol/10-new_spin-x_engine_public_release.html</link>
			<pubDate>Thu, 22 Apr 2010 13:09:35 GMT</pubDate>
			<description>New Spin-X Engine has been released to SourceForge. You can download SXE by using SVN client, such as TortoiseSVN (http://tortoisesvn.net), from...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">New Spin-X Engine has been released to SourceForge. You can download SXE by using SVN client, such as <a href="http://tortoisesvn.net" target="_blank">TortoiseSVN</a>, from SourceForge <a href="http://sourceforge.net/scm/?type=svn&amp;group_id=228361" target="_blank">SVN repository</a> or as a single downloadable <a href="http://spinxengine.svn.sourceforge.net/viewvc/spinxengine.tar.gz?view=tar" target="_blank">GNU tarball</a>. Note that this distribution includes source code and doesn't include executable, so you have to compile it yourself with Visual Studio 2008 to try it out. For changes since the previous release please see <a href="http://community.spinxengine.com/sxe_news_announcements/6-spin-x_engine_changes.html#post27" target="_blank">the changelist</a>.</blockquote>

 ]]></content:encoded>
			<dc:creator>JarkkoL</dc:creator>
			<guid isPermaLink="true">http://community.spinxengine.com/blogs/jarkkol/10-new_spin-x_engine_public_release.html</guid>
		</item>
		<item>
			<title>Rigid Body Physics in SXE</title>
			<link>http://community.spinxengine.com/blogs/jarkkol/9-rigid_body_physics_sxe.html</link>
			<pubDate>Mon, 19 Apr 2010 08:55:10 GMT</pubDate>
			<description>For physics simulation PhysX (http://www.nvidia.com/object/physx_new.html) by NVIDIA has been integrated to Spin-X Engine and will be available in...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">For physics simulation <a href="http://www.nvidia.com/object/physx_new.html" target="_blank">PhysX</a> by NVIDIA has been integrated to Spin-X Engine and will be available in the next public release. The engine also features a streamlined physics asset pipeline and tools to further adjust physics assets in the Spin-X Editor.<br />
<br />
Collision objects for static meshes are defined in your favourite 3D modelling application. Each static mesh can be composed of multiple collision object and each object is named so that it has &quot;CVOL&quot; string (short for &quot;collision volume&quot;) in the object name, which the engine interprets as being used solely for collision primitive definition. In the two images below I have split the mushroom to &quot;cap&quot; and &quot;stem&quot; collision object in <a href="http://www.luxology.com/modo" target="_blank">modo 401</a> and respectively named the objects to &quot;Mushroom Cap [CVOL]&quot; and &quot;Mushroom Stem [CVOL]&quot;. The 3 other objects define the 3 different LODs used for rendering the mesh at different distances and doesn't contribute to collision object definition.<br />
<br />
<div align="center"><img src="http://community.spinxengine.com/members/jarkkol-albums-blog_images-picture40-cvol_cap.jpg" border="0" alt="" /> <img src="http://community.spinxengine.com/members/jarkkol-albums-blog_images-picture39-cvol_stem.jpg" border="0" alt="" /></div><br />
Once the mesh is properly defined, it can be imported to Spin-X Editor. Upon object import different tight bounding volumes and collision primitives for the mesh are automatically created, which can be viewed by selecting the viewed bounding volume from the &quot;BVol&quot; drop-down menu in static mesh editor as shown below. The red bounding volumes are different types of bounding volumes enclosing the entire object (including LODs), while the green volumes display the collision primitives that were created for the collision objects defined in modo.<br />
<br />
<div align="center"><img src="http://community.spinxengine.com/members/jarkkol-albums-blog_images-picture41-bvols.jpg" border="0" alt="" /></div><br />
The primitive type (e.g. sphere, capsule, etc.) selected for each collision object depends on the primitives supported by the physics engine, which by default is set to an enclosing primitive which has the smallest surface area for each collision object. This can be overridden in object properties for each collision object individually, e.g. in the image below I have used object-oriented box (i.e. preferred shape = oobox) instead of capsule for the stem collision object. Because the collision geometry doesn't have to match the visual geometry, you can optionally create desired primitive object in the modelling app and Spin-X Engine will automatically use closest matching pimitive for it.<br />
<br />
<div align="center"><img src="http://community.spinxengine.com/members/jarkkol-albums-blog_images-picture42-coll_object.jpg" border="0" alt="" /></div><br />
To test rigid body collision in the engine I created a small physics scene in Spin-X Editor shown below:<br />
<br />
<div align="center"><img src="http://community.spinxengine.com/members/jarkkol-albums-blog_images-picture43-coll_scene.jpg" border="0" alt="" /></div><br />
And here's a short video clip showing the scene in action:<br />
<br />
<div align="center">
<object class="restrain" type="application/x-shockwave-flash" width="640" height="360" data="http://vimeo.com/moogaloop.swf?clip_id=11040663">
	<param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=11040663" />
	<param name="wmode" value="transparent" />
	<!--[if IE 6]>
	<embed width="640" height="360" type="application/x-shockwave-flash" src="http://vimeo.com/moogaloop.swf?clip_id=11040663" />
	<![endif]--></object>
 </div></blockquote>

 ]]></content:encoded>
			<dc:creator>JarkkoL</dc:creator>
			<guid isPermaLink="true">http://community.spinxengine.com/blogs/jarkkol/9-rigid_body_physics_sxe.html</guid>
		</item>
		<item>
			<title>Optimized EPOS bounding spheres</title>
			<link>http://community.spinxengine.com/blogs/jarkkol/8-optimized_epos_bounding_spheres.html</link>
			<pubDate>Sun, 28 Mar 2010 16:45:19 GMT</pubDate>
			<description><![CDATA[For calculating tight bounding spheres for objects I was checking out various algorithms and bumped into EPOS algorithm described in paper "Fast and...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">For calculating tight bounding spheres for objects I was checking out various algorithms and bumped into EPOS algorithm described in paper &quot;Fast and Tight Fitting Bounding Spheres&quot; [<a href="http://www.ep.liu.se/ecp/034/009/ecp083409.pdf" target="_blank">pdf</a>] by Thomas Larsson. According to the results in the paper EPOS algorithm seems to be a good alternative regarding performance &amp; accuracy of generating tight bounding spheres, so I decided to implement the algorithm for Spin-X Engine (available in the next public release in function <font face="Courier New">bounding_sphere_epos()</font>).<br />
<br />
In the EPOS paper there's a table describing the cost (in math ops) of projecting points to different pre-defined axes, but these can be further optimized by caching some of the results and reusing those results in the tests. The first obvious optimization is that component multiplication by 2 can be cached, which for EPOS-98 saves total of 45 multiplications with the expense of caching only 3 scalar values. Also component additions such as p.x+p.y or p.x-p.y are performed 5 times each for EPOS-98, and there are total of 6 of these addition pairs saving 6*5-6=24 additions with the expense of caching 6 values.<br />
<br />
Regarding the sphere tightness, all the different bounding sphere approximating algorithms I checked, EPOS included, seem to work by first defining the initial sphere by trying to find an axis with maximum spread of the points on it and then iterating through the points and expanding the sphere to include the old sphere and any point that's outside the sphere. I thought of changing this idea slightly and instead linearly iterating through the points and expanding the sphere with any point that's outside the sphere, find the most distant point and expanding the sphere with this point instead. It seemed like a better idea because the resulting sphere wouldn't be affected by the order of points in the array, and also because it should intuitively result in less expansions of the sphere thus a tighter sphere. Regarding performance this approach is quite efficient since only points outside the sphere in each iteration are tested again and there are usually very few points outside to be tested anyway. Also assuming this approach results in less sphere expansions, there's less ops to be executed for expanding the sphere.<br />
<br />
I wrote a little test with EPOS-98, which generated 100,000 different random point sets with random number of points in each ranging from 3 to 10,000 and compared the radiuses of the spheres using both approaches. In the best case the radius of the sphere using the &quot;furthest point&quot; approach was 3.5% smaller and in worst case 1.3% larger than by using the original &quot;linear expansion&quot; algorithm, so it seems like a worthy optimization to get a bit smaller spheres with virtually no cost for these bounding sphere algorithms which use the sphere expansion technique.</blockquote>

 ]]></content:encoded>
			<dc:creator>JarkkoL</dc:creator>
			<guid isPermaLink="true">http://community.spinxengine.com/blogs/jarkkol/8-optimized_epos_bounding_spheres.html</guid>
		</item>
		<item>
			<title>Font Editor, Yay!</title>
			<link>http://community.spinxengine.com/blogs/jarkkol/7-font_editor_yay.html</link>
			<pubDate>Sat, 20 Mar 2010 13:08:21 GMT</pubDate>
			<description><![CDATA[There's now a font editor added to Spin-X Editor that will be available in the next public release of Spin-X Engine! It's very easy to add your...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">There's now a font editor added to Spin-X Editor that will be available in the next public release of Spin-X Engine! It's very easy to add your custom bitmap fonts to your application, by first drawing the glyphs for a font in your favourite graphics editing software such as Photoshop, saving the glyph image for example as PNG and then importing the PNG file to the font editor. The editor extracts glyphs automatically from the image and generates tightly packed font texture and kerning information for rendering text by using the font. In the font editor you can tweak various properties for the font in the WYSIWYG editor, such as font material, kerning attributes and glyph spacing.<br />
<br />
Below is an example of a font texture that I created in Photoshop. This texture was created simply by using an existing font in Photoshop and with the text tool typing a single line of text listing all the characters I wanted to support with enough space between character to horizontally separate them from each other. Nice thing is that you can edit the glyphs of the font freely in Photoshop before importing them to the editor, so for the below font I used black stroke layer style on the white font to draw outline for glyphs. It's possible to split the glyphs to multiple rows as well, but I kept it all in one line so that the font baseline can be automatically robustly deduced. If glyphs are split to multiple rows it may be necessary to add a baseline marker to the beginning of each row to specify the baseline glyphs are laid on so that they line up properly vertically. This source image is over 5000px wide so it's shown quite tiny here because I had to downscale it quite a bit to show it in its entirety:<br />
<br />
<img src="http://community.spinxengine.com/members/jarkkol-albums-blog_images-picture28-font_text.jpg" border="0" alt="" /><br />
<br />
When the above image is imported to the font editor, the glyphs are extracted with proper texture coordinates and the below packed glyph bitmap is generated as the result and saved out as a TGA file. You can specify spacing between glyphs in the bitmap in the font editor settings. It may be necessary to use larger than the 1px default value if mip maps are generated for the texture and font is downscaled during rendering to avoid bleeding between characters. During import stage the editor automatically deduces proper power-of-2 texture dimensions so that all glyphs fit to a single texture atlas. The generated TGA bitmap file is then imported back to editor as shown below. If the font uses alpha channel change the texture format to use a pixel format that supports alpha, such as DXT3 shown here:<br />
<br />
<img src="http://community.spinxengine.com/members/jarkkol-albums-blog_images-picture31-font_text_ed.jpg" border="0" alt="" /><br />
<br />
Before the font can be rendered you must create a material for rendering. I used the basic transparent material for this font since it supports alpha blending and assigned the font texture shown above to the diffuse texture slot of the material and also defined peach color for the font in the material editor. The material defines how glyphs will be rendered, so it's also possible to use custom materials to render for example normal mapped fonts. No need to worry about wrong aspect ratio in the material editor because the texture is just stretched over a cube. You can always change the &quot;uv scaling&quot; to match the texture dimensions if you want to fix this, e.g. change y=2 to tile the texture twice in v direction, but it has no effect in the final font rendering.<br />
<br />
<img src="http://community.spinxengine.com/members/jarkkol-albums-blog_images-picture33-font_mat.jpg" border="0" alt="" /><br />
<br />
Now that the material for the font is created, it can be assigned to the material slot in the font editor and &quot;sample text&quot; defined in the font editor will appear in the preview window. Various properties for the font can be defined here, such as kerning precision for auto-kerning, which is used to define how glyphs are layed horizontally next to each other when the text is being rendered. Because of the kerning information extracted from the source font bitmap, for example the 'W' and 'A' glyphs in the example text can overlap horizontally and form more naturally flowing string of text. &quot;Glyph ascii chars&quot; defines a character string that matches characters in the font source bitmap so that when writing text the engine knows which glyph to use for which character. I just copied the string from Photoshop to this property. Currently there's only support for ASCII characters, but UNICODE support is trivial to add. &quot;Glyph ASCII remap&quot; defines remapping of characters as a string of character pairs, e.g. if a font texture defines glyphs only for capital letters to save texture space, then adding character pairs &quot;aAbBcC&quot; will map low-case 'a' characters to use glyph defined for capital 'A' character, etc. Because I defined glyphs for all characters I left this property empty. If there's no glyph defined for a character, the character will be skipped.<br />
<br />
<img src="http://community.spinxengine.com/members/jarkkol-albums-blog_images-picture34-font_ed.jpg" border="0" alt="" /><br />
<br />
The bitmap font and the font material can be loaded to your application with the regular load_object() calls for both and rendered with the exposed interfaces.<br />
<br />
So, that's about it and happy fonting! :)</blockquote>

 ]]></content:encoded>
			<dc:creator>JarkkoL</dc:creator>
			<guid isPermaLink="true">http://community.spinxengine.com/blogs/jarkkol/7-font_editor_yay.html</guid>
		</item>
		<item>
			<title>My first screenie</title>
			<link>http://community.spinxengine.com/blogs/jarkkol/6-my_first_screenie.html</link>
			<pubDate>Fri, 12 Feb 2010 22:20:25 GMT</pubDate>
			<description><![CDATA[Here's the first (and early) screenshot of the indie game I'm working on, rendered in Spin-X Editor. The gameplay still remains a mystery, but it...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Here's the first (and early) screenshot of the indie game I'm working on, rendered in Spin-X Editor. The gameplay still remains a mystery, but it should become more clear in the upcoming shots (:<br />
 <br />
<img src="http://www.spinxengine.com/screenshots/bg_20100212_01_lo.jpg" border="0" alt="" /><br />
 <br />
<font size="1">[</font><a href="http://www.spinxengine.com/screenshots/bg_20100212_01_hi.jpg" target="_blank"><font size="1">hi-res screenshot</font></a><font size="1">]</font></blockquote>

 ]]></content:encoded>
			<dc:creator>JarkkoL</dc:creator>
			<guid isPermaLink="true">http://community.spinxengine.com/blogs/jarkkol/6-my_first_screenie.html</guid>
		</item>
		<item>
			<title>Going Crazy...</title>
			<link>http://community.spinxengine.com/blogs/jarkkol/5-going_crazy.html</link>
			<pubDate>Tue, 09 Feb 2010 11:23:27 GMT</pubDate>
			<description>... with Crazybump (http://www.crazybump.com) - in a positive way :) Have been doing some texture/material work and Crazybump seems to produce very...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">... with <a href="http://www.crazybump.com" target="_blank">Crazybump</a> - in a positive way :) Have been doing some texture/material work and Crazybump seems to produce very nice results often even if you start normal map generation from a plain color texture. NVIDIA normal map plugin for Photoshop doesn't work with 64-bit version and is very limited in the way you can control the normal map generation anyway. I also tried xNormal that works with 64-bit Photoshop, but it has almost no control for tweaking the normal map generation. I usually keep Photoshop open while generating/processing normal maps/diffuse/occlusion textures in Crazybump and copy the images to PS via clip-board for some touch ups, composition &amp; resizing. Crazybump seems to be well worth the money, so if you need to produce normal maps you should definately check the evaluation version if you haven't yet.</blockquote>

 ]]></content:encoded>
			<dc:creator>JarkkoL</dc:creator>
			<guid isPermaLink="true">http://community.spinxengine.com/blogs/jarkkol/5-going_crazy.html</guid>
		</item>
		<item>
			<title>Support for modo LXO</title>
			<link>http://community.spinxengine.com/blogs/jarkkol/4-support_modo_lxo.html</link>
			<pubDate>Sat, 30 Jan 2010 20:03:51 GMT</pubDate>
			<description>Seems that Luxology (http://www.luxology.com) guys brought LightWave (http://www.newtek.com/lightwave) format with them when founding the new company...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Seems that <a href="http://www.luxology.com" target="_blank">Luxology</a> guys brought <a href="http://www.newtek.com/lightwave" target="_blank">LightWave</a> format with them when founding the new company since the LXO format is pretty much identical to LWO format :) Just changed LWO loader in Spin-X Engine to accept &quot;LXOB&quot; signature and rest of the loader is identical. Of course the loader skips all the fancy bits stored in the LXO file, but it's still able to load basic geometry. Clever move from Lux guys in the sense that adding basic LXO support to existing software is a breeze if it already supports LWO.</blockquote>

 ]]></content:encoded>
			<dc:creator>JarkkoL</dc:creator>
			<guid isPermaLink="true">http://community.spinxengine.com/blogs/jarkkol/4-support_modo_lxo.html</guid>
		</item>
		<item>
			<title>Starting an indie game project</title>
			<link>http://community.spinxengine.com/blogs/jarkkol/3-starting_indie_game_project.html</link>
			<pubDate>Wed, 27 Jan 2010 15:04:29 GMT</pubDate>
			<description>So I finally started to work on a small indie game I have had in plans for some time now, using Spin-X Engine of course :) The engine has been...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">So I finally started to work on a small indie game I have had in plans for some time now, using Spin-X Engine of course :) The engine has been matured to a level where it makes sense to start with a small game project and improve the engine as needed. I hope to keep the scope of the game fairly small of around 100 working days, but let see how it turns out as I have never completed a full game all by myself, so just have to see how many schedule stretching unforeseen issues I'll face. I try to release some shots/videos of the progress in my blog as well so stay tuned :)</blockquote>

 ]]></content:encoded>
			<dc:creator>JarkkoL</dc:creator>
			<guid isPermaLink="true">http://community.spinxengine.com/blogs/jarkkol/3-starting_indie_game_project.html</guid>
		</item>
		<item>
			<title>Test post</title>
			<link>http://community.spinxengine.com/blogs/damsku/2-test_post.html</link>
			<pubDate>Mon, 18 Jan 2010 22:35:39 GMT</pubDate>
			<description>*Hello* 
  
Nice little editing program here...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><b>Hello</b><br />
 <br />
Nice little editing program here...</blockquote>

 ]]></content:encoded>
			<dc:creator>damsku</dc:creator>
			<guid isPermaLink="true">http://community.spinxengine.com/blogs/damsku/2-test_post.html</guid>
		</item>
	</channel>
</rss>
