<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Game Modding Texture problems</title>
		<link>http://www.allegro.cc/forums/view/609320</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 31 Jan 2012 07:23:30 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve been trying at this over the past days and the solution evades me.</p><p>I&#39;m trying to mod Sonic Generations(released on Steam 2 months ago), to import the geometry stages from an old Xbox 360 game, Sonic Unleashed, which uses pretty much the same engine. The evidence is clearly there since I just copied and modified some of the stage files, and the geometry loads.</p><p>The problem is the texture mapping is all wrong. My question for the 3D techies here is, what could the problem be? Perhaps manually modifying the textures to be flipped or something could solve it? Or would I have to fix the UV mapping? It&#39;s all in binary format so it would require heavy hex editting to figure it out, so perhaps I can just do a batch conversion of the textures and fix it.</p><p>Here&#39;s an example of the issue, and the source texture to spot the problem:</p><p>This is a screencap of the original game(youtube video, bad quality):<br /><span class="remote-thumbnail"><span class="json">{"name":"605421","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/4\/d\/4d8617376de68568576f47d660865865.png","w":635,"h":462,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/4\/d\/4d8617376de68568576f47d660865865"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/4/d/4d8617376de68568576f47d660865865-240.jpg" alt="605421" width="240" height="174" /></span></p><p>And here it&#39;s ported over to the PC game:<br /><span class="remote-thumbnail"><span class="json">{"name":"605422","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/a\/7\/a74c7d94549817a72bb736b53d1913b4.png","w":1600,"h":900,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/a\/7\/a74c7d94549817a72bb736b53d1913b4"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/a/7/a74c7d94549817a72bb736b53d1913b4-240.jpg" alt="605422" width="240" height="135" /></span></p><p>I&#39;ve been focusing in those small colored strips to spot the texture problem. Here&#39;s the original texture:<br /><span class="remote-thumbnail"><span class="json">{"name":"605423","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/c\/4\/c456e387a103f0d76745efd70e3eedaf.png","w":1024,"h":512,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/c\/4\/c456e387a103f0d76745efd70e3eedaf"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/c/4/c456e387a103f0d76745efd70e3eedaf-240.jpg" alt="605423" width="240" height="120" /></span></p><p>As you can see, the original game just renders the &quot;Green&quot; part I marked below, but the PC game seems to render the &quot;Red&quot; section I marked.<br /><span class="remote-thumbnail"><span class="json">{"name":"605420","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/6\/8\/68eb799fed3a5bc0ede21cf3868600a8.png","w":1024,"h":512,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/6\/8\/68eb799fed3a5bc0ede21cf3868600a8"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/6/8/68eb799fed3a5bc0ede21cf3868600a8-240.jpg" alt="605420" width="240" height="120" /></span></p><p>Is there any texturing differences on the Xbox 360 I should be aware off?</p><p>EDIT: I can&#39;t say how accurate that &quot;red&quot; section I marked is. After all, it&#39;s not really different from any other tall rectangle you could mark in the texture. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><p>EDIT2: It seems rotating the image and keeping the same size, plus stretching and flipping fixed it. <img src="http://www.allegro.cc/forums/smileys/shocked.gif" alt=":o" /> I hope allegro 5 has dds support so I could write a batch utility.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Dario ff)</author>
		<pubDate>Tue, 17 Jan 2012 23:38:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m not aware of any difference in PC and XBox uv coordinates, but if you&#39;re modding a game then it&#39;s most likely a difference in the way the game is on PC and XBox...  </p><p>Honestly though, it looks like they are simply rotated as you said.  Have you tried rotating the textures or is that just too complex?</p><p>Also, the XBox 360 uses big-endian byte ordering and on the PC you have little-endian byte ordering.  Could be an endianness issue...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ron Novy)</author>
		<pubDate>Wed, 18 Jan 2012 08:08:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Curiously enough, a 90 degrees CW rotation and horizontal flip solves the problem for JUST a few textures. Luckily, it&#39;s the majority, but stuff such as skies for example don&#39;t need to be flipped. I think it&#39;s just weird handling by their engine or something...</p><p>Luckily, if I hadn&#39;t created this thread I wouldn&#39;t have noticed it tho. <img src="http://www.allegro.cc/forums/smileys/shocked.gif" alt=":o" /> Some weird magic is present on this site for problem solving...</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/609320/944445#target">Ron Novy</a> said:</div><div class="quote"><p>Also, the XBox 360 uses big-endian byte ordering and on the PC you have little-endian byte ordering.  Could be an endianness issue...</p></div></div><p>

That reminds me, I&#39;ve been also trying to port over the Havok binary files from the game. Apparently, they&#39;re saved specifically for the XBox 360(I&#39;ve seen the option on the SDK), and it&#39;s not compatible with the PC version... from looking over it, the only difference is the endianness in fact. I suppose I don&#39;t really have a way of converting the file without knowing the format, do I? It&#39;s closed source. <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" /> (And the file is pretty darned big, nearly 1 MB)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Dario ff)</author>
		<pubDate>Wed, 18 Jan 2012 08:22:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Oh no!  1MB. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />  Post it... I kind of like living in binary and I have the Havok SDK... Don&#39;t know why I have it, but I can take a look.  Can&#39;t be too crazy...  Is there a PC and Xbox version you can post from the different games?</p><p>Having worked on AATranslator I have helped work out a few file formats here and there.  I working on a new library for AAT right now but need a distraction for the moment...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ron Novy)</author>
		<pubDate>Wed, 18 Jan 2012 08:31:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><a href="http://www.allegro.cc/files/attachment/605425">This is the Xbox 360 hkx binary file from Sonic Unleashed</a>. It handles the level collision data. I&#39;ve downloaded the Havok SDK PC tools and they can&#39;t just open it, claiming it&#39;s not for the specified platform. According to their page, I would need a fully licensed Havok SDK for opening it(SAVING to the 360 version is possible, but not opening), but my guess is that it can probably be converted...</p><p>Since of course Sonic Unleashed was never released on PC, there&#39;s no PC version of those binary files to compare to. Generations uses a similar engine ported over to PC tho, so I took the chance to convert and compare the same binary hkx file. The (free) Havok content tool can open them since they were saved for the PC after all.</p><p><a href="http://www.allegro.cc/files/attachment/605427">Green Hill Zone PC HKX</a><br /><a href="http://www.allegro.cc/files/attachment/605426">Grenn Hill Zone PC HKX resaved to XBOX360 format</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Dario ff)</author>
		<pubDate>Wed, 18 Jan 2012 08:40:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well, so far the Green Hill Zone PC HKX resaved to XBOX360 format looks to be in little-endian as well, not sure why.  It is different, just no change in endianness...</p><p>[edit] You also seem to have an older version of the SDK then I do.  And some of my SDK programs are not working for some reason... <img src="http://www.allegro.cc/forums/smileys/angry.gif" alt="&gt;:(" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ron Novy)</author>
		<pubDate>Wed, 18 Jan 2012 09:02:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That&#39;s because I&#39;m a retard and uploaded the wrong binary file.</p><p><a href="http://www.allegro.cc/files/attachment/605428">Here&#39;s the real converted 360 file</a>. Double checked this time, I can&#39;t open it on the havok tools.</p><p>As for the older version, that&#39;s intentional because that&#39;s the version the game on the PC is using.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Dario ff)</author>
		<pubDate>Wed, 18 Jan 2012 09:08:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ahh... So I can confirm then, the byte at 0x11 determines endianness of the file.  That&#39;s the only thing I&#39;m really sure of here...</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">struct</span> hvk_head <span class="k2">{</span>
<span class="number">  2</span>    <span class="k1">char</span>    o0x00_57E0E05710C0C010<span class="k2">[</span><span class="n">8</span><span class="k2">]</span><span class="k2">;</span> <span class="c">// Always the same 8 bytes...</span>
<span class="number">  3</span>    int32   o0x08_unknown<span class="k2">;</span>             <span class="c">// ??? endianness switches.</span>
<span class="number">  4</span>    int32   o0x0C_unknown<span class="k2">;</span>             <span class="c">// ??? endianness switches.</span>
<span class="number">  5</span>    <span class="k1">char</span>    o0x10_flag_bytes<span class="k2">[</span><span class="n">4</span><span class="k2">]</span><span class="k2">;</span>       <span class="c">// 0x11 identifies endianness...</span>
<span class="number">  6</span>    int32   o0x14_unknown<span class="k2">[</span><span class="n">5</span><span class="k2">]</span><span class="k2">;</span>          <span class="c">// ??? 5 integers. endianness switches.</span>
<span class="number">  7</span>    <span class="k1">char</span>    o0x28_havoklibname<span class="k2">[</span><span class="n">24</span><span class="k2">]</span><span class="k2">;</span>    <span class="c">// Anything after byte 15 seems to have no affect.</span>
<span class="number">  8</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span><span class="c">/* 3 sections starting after hvk_head... */</span>
<span class="number"> 11</span><span class="k1">struct</span> hvk_section <span class="k2">{</span>
<span class="number"> 12</span>    <span class="k1">char</span> name<span class="k2">[</span><span class="n">16</span><span class="k2">]</span><span class="k2">;</span>        <span class="c">// Section name.  __classnames__, __types__ or __data__</span>
<span class="number"> 13</span>    int32 o0x10_000000ff<span class="k2">;</span> <span class="c">// ??? Not affected by endianness.</span>
<span class="number"> 14</span>    int32 offset<span class="k2">;</span>         <span class="c">// Literal file offset to data for this section.  Is affected by endianness.</span>
<span class="number"> 15</span>    int32 sub_offset<span class="k2">[</span><span class="n">6</span><span class="k2">]</span><span class="k2">;</span>  <span class="c">// Offset to sub section. affected by endianness.</span>
<span class="number"> 16</span>                          <span class="c">// Literal file offset to subsection 'x' is 'offset + sub_offset[x]'</span>
<span class="number"> 17</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 18</span>
<span class="number"> 19</span><span class="c">/* Class names */</span>
<span class="number"> 20</span><span class="k1">struct</span> hvk_classname <span class="k2">{</span>
<span class="number"> 21</span>    int32 o0x00<span class="k2">;</span>          <span class="c">// ?? Affected by endianness.</span>
<span class="number"> 22</span>    <span class="k1">char</span>  o0x04_0x09<span class="k2">;</span>     <span class="c">// ?? Always seems to be '0x09' which may indicate that you need to read a null terminated string.</span>
<span class="number"> 23</span>    <span class="k1">char</span> <span class="k3">*</span>o0x05<span class="k2">;</span>          <span class="c">// Null terminated string.</span>
<span class="number"> 24</span><span class="k2">}</span><span class="k2">;</span>
</div></div><p>

Trying to figure out where to go from there... Have to do some other stuff right now though...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ron Novy)</author>
		<pubDate>Wed, 18 Jan 2012 10:00:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If it&#39;s confusing rows with columns in the image, I&#39;d suspect much more than endianness.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Wed, 18 Jan 2012 10:02:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Edited the structure <span class="source-code">hvk_section</span> in my post above.  It actually gets a lot easier the more you dig into the format.  It&#39;s even easier if you know what data is already there.  Right now my Havok SDK doesn&#39;t seem to be working.  It could be because the computer I&#39;m trying to run it on is about 10 years old now...</p><p>As long as you double check the endianness between the PC and 360 version you should be able to create a nice conversion utility...  Just can&#39;t work on it anymore myself right now... Need to sleep.  Lots to do tomorrow... <img src="http://www.allegro.cc/forums/smileys/sad.gif" alt=":(" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ron Novy)</author>
		<pubDate>Wed, 18 Jan 2012 12:49:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Wow, thanks for that. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /> Do you think switching the byte at 0x11 could probably make it load up if you modified the header to be compatible with the PC version? <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" /> Well perhaps their reader will only accept little endian on PC, but I wouldn&#39;t have problem writing a conversion utility. I&#39;m just a little dumb at trying to figure out file formats.</p><p>The Havok reader won&#39;t load up on your PC if you haven&#39;t installed it. If it&#39;s a folder from an old installation, it won&#39;t work. It needs some system dlls, so a proper reinstall should do the trick. AFAIK, any new version will read the old versions without any trouble. These collision files don&#39;t really have much visual data to preview on their tool tho, it&#39;s just loads and loads of vertexes(someone who was researching them told me it was a set ammount of objects, and depending on that the vertex data would be interpreted).</p><p>Given that it&#39;s the same game engine underneath, switching the endianness at the right spots where it&#39;s affect, and a compatible header, should make it work. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>EDIT: I IS DERP.
</p><div class="spoiler"><p>
Turns out the headers do hold some relevant information which would probably save you a stupid ammount of research... <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><p>Here&#39;s a folder of the <a href="http://www.allegro.cc/files/attachment/605432">headers</a>. Some relevant files: hkPackfileHeader.h, hkPackfileSectionHeader.h. I guess there might be a way after all. <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" /></p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>
<span class="number">  2</span><span class="p">#ifndef HKSERIALIZE_SERIALIZE_BINARY_HKPACKFILEHEADER_XML_H</span>
<span class="number">  3</span><span class="p">#define HKSERIALIZE_SERIALIZE_BINARY_HKPACKFILEHEADER_XML_H</span>
<span class="number">  4</span>
<span class="number">  5</span>
<span class="number">  6</span><span class="c">/// hkPackfileHeader meta information</span>
<span class="number">  7</span><span class="k1">extern</span> <span class="k1">const</span> <span class="k1">class</span> hkClass hkPackfileHeaderClass<span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span><span class="c">/// The header of a binary packfile.</span>
<span class="number"> 10</span><span class="k1">class</span> hkPackfileHeader
<span class="number"> 11</span><span class="k2">{</span>
<span class="number"> 12</span>  <span class="c">//+version(1)</span>
<span class="number"> 13</span>  public:
<span class="number"> 14</span>
<span class="number"> 15</span>    HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR<span class="k2">(</span>HK_MEMORY_CLASS_SERIALIZE, hkPackfileHeader<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>    HK_DECLARE_REFLECTION<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>  
<span class="number"> 18</span>      <span class="c">/// Default constructor</span>
<span class="number"> 19</span>    hkPackfileHeader<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 20</span>    <span class="k2">{</span>
<span class="number"> 21</span>      hkString::memSet<span class="k2">(</span><span class="k1">this</span>, <span class="k3">-</span><span class="n">1</span>, <span class="k1">sizeof</span><span class="k2">(</span><span class="k3">*</span><span class="k1">this</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>      m_magic<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> <span class="n">0x57e0e057</span><span class="k2">;</span> <span class="c">// both endian agnostic (byte symmetric)</span>
<span class="number"> 23</span>      m_magic<span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span> <span class="n">0x10c0c010</span><span class="k2">;</span>
<span class="number"> 24</span>      m_contentsVersion<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 25</span>      m_flags <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> <span class="c">// Set to 1 when a packfile is loaded in-place to signify that the packfile is loaded</span>
<span class="number"> 26</span>    <span class="k2">}</span>
<span class="number"> 27</span>    
<span class="number"> 28</span>  public:
<span class="number"> 29</span>    
<span class="number"> 30</span>      <span class="c">/// Magic file identifier. See constructor for values.</span>
<span class="number"> 31</span>    hkInt32 m_magic<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 32</span>    
<span class="number"> 33</span>      <span class="c">/// This is a user settable tag.</span>
<span class="number"> 34</span>    hkInt32 m_userTag<span class="k2">;</span>
<span class="number"> 35</span>    
<span class="number"> 36</span>      <span class="c">/// Binary file version. Currently 9</span>
<span class="number"> 37</span>    hkInt32 m_fileVersion<span class="k2">;</span>
<span class="number"> 38</span>    
<span class="number"> 39</span>      <span class="c">/// The structure layout rules used by this file.</span>
<span class="number"> 40</span>    hkUint8 m_layoutRules<span class="k2">[</span><span class="n">4</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 41</span>    
<span class="number"> 42</span>      <span class="c">/// Number of packfilesections following this header.</span>
<span class="number"> 43</span>    hkInt32 m_numSections<span class="k2">;</span>
<span class="number"> 44</span>    
<span class="number"> 45</span>      <span class="c">/// Where the content's data structure is (section and offset within that section).</span>
<span class="number"> 46</span>    hkInt32 m_contentsSectionIndex<span class="k2">;</span>
<span class="number"> 47</span>    hkInt32 m_contentsSectionOffset<span class="k2">;</span>
<span class="number"> 48</span>
<span class="number"> 49</span>      <span class="c">/// Where the content's class name is (section and offset within that section).</span>
<span class="number"> 50</span>    hkInt32 m_contentsClassNameSectionIndex<span class="k2">;</span>
<span class="number"> 51</span>    hkInt32 m_contentsClassNameSectionOffset<span class="k2">;</span>
<span class="number"> 52</span>
<span class="number"> 53</span>      <span class="c">/// Future expansion</span>
<span class="number"> 54</span>    <span class="k1">char</span> m_contentsVersion<span class="k2">[</span><span class="n">16</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 55</span>
<span class="number"> 56</span>      <span class="c">///</span>
<span class="number"> 57</span>    hkInt32 m_flags<span class="k2">;</span>
<span class="number"> 58</span>    hkInt32 m_pad<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 59</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 60</span>
<span class="number"> 61</span><span class="p">#endif // HKSERIALIZE_SERIALIZE_BINARY_HKPACKFILEHEADER_XML_H</span>
</div></div><p>

</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span>
<span class="number">   2</span><span class="p">#ifndef HKSERIALIZE_SERIALIZE_BINARY_HKPACKFILESECTIONHEADER_XML_H</span>
<span class="number">   3</span><span class="p">#define HKSERIALIZE_SERIALIZE_BINARY_HKPACKFILESECTIONHEADER_XML_H</span>
<span class="number">   4</span>
<span class="number">   5</span><span class="p">#include &lt;Common/Serialize/Resource/hkResource.h&gt;</span>
<span class="number">   6</span>
<span class="number">   7</span><span class="c">/// hkPackfileSectionHeader meta information</span>
<span class="number">   8</span><span class="k1">extern</span> <span class="k1">const</span> <span class="k1">class</span> hkClass hkPackfileSectionHeaderClass<span class="k2">;</span>
<span class="number">   9</span>
<span class="number">  10</span><span class="c">/// Packfiles are composed of several sections.</span>
<span class="number">  11</span><span class="c">/// A section contains several areas</span>
<span class="number">  12</span><span class="c">/// | data | local | global | finish | exports | imports |</span>
<span class="number">  13</span><span class="c">/// data: the user usable data.</span>
<span class="number">  14</span><span class="c">/// local: pointer patches within this section (src,dst).</span>
<span class="number">  15</span><span class="c">/// global: pointer patches to locations within this packfile (src,(section,dst)).</span>
<span class="number">  16</span><span class="c">/// finish: offset and typename of all objects for finish functions (src, typename).</span>
<span class="number">  17</span><span class="c">/// exports: named objects (src,name).</span>
<span class="number">  18</span><span class="c">/// imports: named pointer patches outside this packfile (src,name).</span>
<span class="number">  19</span><span class="k1">class</span> hkPackfileSectionHeader
<span class="number">  20</span><span class="k2">{</span>
<span class="number">  21</span>  public:
<span class="number">  22</span>
<span class="number">  23</span>    HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR<span class="k2">(</span>HK_MEMORY_CLASS_SERIALIZE, hkPackfileSectionHeader<span class="k2">)</span><span class="k2">;</span>
<span class="number">  24</span>    HK_DECLARE_REFLECTION<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  25</span>  
<span class="number">  26</span>      <span class="c">/// Default constructor</span>
<span class="number">  27</span>    hkPackfileSectionHeader<span class="k2">(</span><span class="k2">)</span>
<span class="number">  28</span>    <span class="k2">{</span>
<span class="number">  29</span>      hkString::memSet<span class="k2">(</span><span class="k1">this</span>,<span class="n">0</span>,<span class="k1">sizeof</span><span class="k2">(</span><span class="k1">this</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  30</span>    <span class="k2">}</span>
<span class="number">  31</span>    
<span class="number">  32</span>    <span class="k1">void</span><span class="k3">*</span> getStart<span class="k2">(</span> <span class="k1">void</span><span class="k3">*</span> absoluteStart <span class="k2">)</span>
<span class="number">  33</span>    <span class="k2">{</span>
<span class="number">  34</span>      <span class="k1">return</span> hkAddByteOffset<span class="k2">(</span>absoluteStart, m_absoluteDataStart<span class="k2">)</span><span class="k2">;</span>
<span class="number">  35</span>    <span class="k2">}</span>
<span class="number">  36</span>
<span class="number">  37</span>      <span class="c">/// Size in bytes of data part</span>
<span class="number">  38</span>    <span class="k1">int</span> getDataSize<span class="k2">(</span><span class="k2">)</span> <span class="k1">const</span>
<span class="number">  39</span>    <span class="k2">{</span>
<span class="number">  40</span>      <span class="k1">return</span> m_localFixupsOffset<span class="k2">;</span>
<span class="number">  41</span>    <span class="k2">}</span>
<span class="number">  42</span>      <span class="c">/// Size in bytes of intra section pointer patches</span>
<span class="number">  43</span>    <span class="k1">int</span> getLocalSize<span class="k2">(</span><span class="k2">)</span> <span class="k1">const</span>
<span class="number">  44</span>    <span class="k2">{</span>
<span class="number">  45</span>      <span class="k1">return</span> m_globalFixupsOffset <span class="k3">-</span> m_localFixupsOffset<span class="k2">;</span>
<span class="number">  46</span>    <span class="k2">}</span>
<span class="number">  47</span>      <span class="c">/// Size in bytes of inter section pointer patches</span>
<span class="number">  48</span>    <span class="k1">int</span> getGlobalSize<span class="k2">(</span><span class="k2">)</span> <span class="k1">const</span>
<span class="number">  49</span>    <span class="k2">{</span>
<span class="number">  50</span>      <span class="k1">return</span> m_virtualFixupsOffset <span class="k3">-</span> m_globalFixupsOffset<span class="k2">;</span>
<span class="number">  51</span>    <span class="k2">}</span>
<span class="number">  52</span>      <span class="c">/// Size in bytes of finishing table.</span>
<span class="number">  53</span>    <span class="k1">int</span> getFinishSize<span class="k2">(</span><span class="k2">)</span> <span class="k1">const</span>
<span class="number">  54</span>    <span class="k2">{</span>
<span class="number">  55</span>      <span class="k1">return</span> m_exportsOffset <span class="k3">-</span> m_virtualFixupsOffset<span class="k2">;</span>
<span class="number">  56</span>    <span class="k2">}</span>
<span class="number">  57</span>      <span class="c">/// Size in bytes of exports table.</span>
<span class="number">  58</span>    <span class="k1">int</span> getExportsSize<span class="k2">(</span><span class="k2">)</span> <span class="k1">const</span>
<span class="number">  59</span>    <span class="k2">{</span>
<span class="number">  60</span>      <span class="k1">return</span> m_importsOffset <span class="k3">-</span> m_exportsOffset<span class="k2">;</span>
<span class="number">  61</span>    <span class="k2">}</span>
<span class="number">  62</span>      <span class="c">/// Size in bytes of imports table.</span>
<span class="number">  63</span>    <span class="k1">int</span> getImportsSize<span class="k2">(</span><span class="k2">)</span> <span class="k1">const</span>
<span class="number">  64</span>    <span class="k2">{</span>
<span class="number">  65</span>      <span class="k1">return</span> m_endOffset <span class="k3">-</span> m_importsOffset<span class="k2">;</span>
<span class="number">  66</span>    <span class="k2">}</span>
<span class="number">  67</span>    
<span class="number">  68</span>      <span class="c">/// Extract exports from the given section.</span>
<span class="number">  69</span>    <span class="k1">void</span> getExports<span class="k2">(</span> <span class="k1">const</span> <span class="k1">void</span><span class="k3">*</span> sectionBegin, hkArray<span class="k3">&lt;</span>hkResource::Export&gt;<span class="k3">&amp;</span> exports <span class="k2">)</span> <span class="k1">const</span><span class="k2">;</span>
<span class="number">  70</span>
<span class="number">  71</span>      <span class="c">/// Extract imports from the given section.</span>
<span class="number">  72</span>    <span class="k1">void</span> getImports<span class="k2">(</span> <span class="k1">const</span> <span class="k1">void</span><span class="k3">*</span> sectionBegin, hkArray<span class="k3">&lt;</span>hkResource::Import&gt;<span class="k3">&amp;</span> imports <span class="k2">)</span> <span class="k1">const</span><span class="k2">;</span>
<span class="number">  73</span>
<span class="number">  74</span>  public:
<span class="number">  75</span>    
<span class="number">  76</span>      <span class="c">/// </span>
<span class="number">  77</span>    <span class="k1">char</span> m_sectionTag<span class="k2">[</span><span class="n">19</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  78</span>    
<span class="number">  79</span>      <span class="c">/// </span>
<span class="number">  80</span>    <span class="k1">char</span> m_nullByte<span class="k2">;</span>
<span class="number">  81</span>    
<span class="number">  82</span>      <span class="c">/// Absolute file offset of where this sections data begins.</span>
<span class="number">  83</span>    hkInt32 m_absoluteDataStart<span class="k2">;</span>
<span class="number">  84</span>    
<span class="number">  85</span>      <span class="c">/// Offset of local fixups from absoluteDataStart.</span>
<span class="number">  86</span>    hkInt32 m_localFixupsOffset<span class="k2">;</span>
<span class="number">  87</span>    
<span class="number">  88</span>      <span class="c">/// Offset of global fixups from absoluteDataStart.</span>
<span class="number">  89</span>    hkInt32 m_globalFixupsOffset<span class="k2">;</span>
<span class="number">  90</span>    
<span class="number">  91</span>      <span class="c">/// Offset of virtual fixups from absoluteDataStart.</span>
<span class="number">  92</span>    hkInt32 m_virtualFixupsOffset<span class="k2">;</span>
<span class="number">  93</span>    
<span class="number">  94</span>      <span class="c">/// Offset of exports from absoluteDataStart.</span>
<span class="number">  95</span>    hkInt32 m_exportsOffset<span class="k2">;</span>
<span class="number">  96</span>    
<span class="number">  97</span>      <span class="c">/// Offset of imports from absoluteDataStart.</span>
<span class="number">  98</span>    hkInt32 m_importsOffset<span class="k2">;</span>
<span class="number">  99</span>    
<span class="number"> 100</span>      <span class="c">/// Offset of the end of section. Also the section size.</span>
<span class="number"> 101</span>    hkInt32 m_endOffset<span class="k2">;</span>
<span class="number"> 102</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 103</span>
<span class="number"> 104</span><span class="p">#endif // HKSERIALIZE_SERIALIZE_BINARY_HKPACKFILESECTIONHEADER_XML_H</span>
</div></div><p>
</p></div><p>

</p><h3>EDIT #2:</h3><p>

I haven&#39;t got much time to crack on the format yet, but I got the header to be recognized by the Havok content tools as compatible at least. It won&#39;t say &quot;wrong platform for packfile&quot; now, but it will fail to load. Here&#39;s the little application I wrote for converting the havok header and the section headers. Now I need to figure out what all these offsets mean. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><p><b>main.cpp</b>
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">   2</span>
<span class="number">   3</span><span class="k1">using</span> <span class="k1">namespace</span> std<span class="k2">;</span>
<span class="number">   4</span>
<span class="number">   5</span>
<span class="number">   6</span><span class="k1">inline</span> <span class="k1">void</span> int32_endian_swap<span class="k2">(</span><span class="k1">int</span><span class="k3">&amp;</span> x<span class="k2">)</span> <span class="k2">{</span>
<span class="number">   7</span>    x <span class="k3">=</span> <span class="k2">(</span>x&gt;&gt;24<span class="k2">)</span> <span class="k3">|</span>
<span class="number">   8</span>        <span class="k2">(</span><span class="k2">(</span>x<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="n">8</span><span class="k2">)</span> <span class="k3">&amp;</span> <span class="n">0x00FF0000</span><span class="k2">)</span> <span class="k3">|</span>
<span class="number">   9</span>        <span class="k2">(</span><span class="k2">(</span>x&gt;&gt;8<span class="k2">)</span> <span class="k3">&amp;</span> <span class="n">0x0000FF00</span><span class="k2">)</span> <span class="k3">|</span>
<span class="number">  10</span>        <span class="k2">(</span>x<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="n">24</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  11</span><span class="k2">}</span>
<span class="number">  12</span>
<span class="number">  13</span>
<span class="number">  14</span>
<span class="number">  15</span><span class="k1">class</span> hkPackfileHeader_conv <span class="k2">{</span>
<span class="number">  16</span>  <span class="c">//+version(1)</span>
<span class="number">  17</span>  public:
<span class="number">  18</span>      <span class="c">/// Default constructor</span>
<span class="number">  19</span>    hkPackfileHeader_conv<span class="k2">(</span><span class="k2">)</span>
<span class="number">  20</span>    <span class="k2">{</span>
<span class="number">  21</span>      m_magic<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> <span class="n">0x57e0e057</span><span class="k2">;</span> <span class="c">// both endian agnostic (byte symmetric)</span>
<span class="number">  22</span>      m_magic<span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span> <span class="n">0x10c0c010</span><span class="k2">;</span>
<span class="number">  23</span>      m_contentsVersion<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  24</span>      m_flags <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> <span class="c">// Set to 1 when a packfile is loaded in-place to signify that the packfile is loaded</span>
<span class="number">  25</span>    <span class="k2">}</span>
<span class="number">  26</span>
<span class="number">  27</span>  public:
<span class="number">  28</span>
<span class="number">  29</span>      <span class="c">/// Magic file identifier. See constructor for values.</span>
<span class="number">  30</span>    <span class="k1">int</span> m_magic<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  31</span>
<span class="number">  32</span>      <span class="c">/// This is a user settable tag.</span>
<span class="number">  33</span>    <span class="k1">int</span>  m_userTag<span class="k2">;</span>
<span class="number">  34</span>
<span class="number">  35</span>      <span class="c">/// Binary file version. Currently 9</span>
<span class="number">  36</span>    <span class="k1">int</span>  m_fileVersion<span class="k2">;</span>
<span class="number">  37</span>
<span class="number">  38</span>      <span class="c">/// The structure layout rules used by this file.</span>
<span class="number">  39</span>    <span class="k1">unsigned</span> <span class="k1">char</span> m_layoutRules<span class="k2">[</span><span class="n">4</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  40</span>
<span class="number">  41</span>      <span class="c">/// Number of packfilesections following this header.</span>
<span class="number">  42</span>    <span class="k1">int</span> m_numSections<span class="k2">;</span>
<span class="number">  43</span>
<span class="number">  44</span>      <span class="c">/// Where the content's data structure is (section and offset within that section).</span>
<span class="number">  45</span>    <span class="k1">int</span> m_contentsSectionIndex<span class="k2">;</span>
<span class="number">  46</span>    <span class="k1">int</span> m_contentsSectionOffset<span class="k2">;</span>
<span class="number">  47</span>
<span class="number">  48</span>      <span class="c">/// Where the content's class name is (section and offset within that section).</span>
<span class="number">  49</span>    <span class="k1">int</span> m_contentsClassNameSectionIndex<span class="k2">;</span>
<span class="number">  50</span>    <span class="k1">int</span> m_contentsClassNameSectionOffset<span class="k2">;</span>
<span class="number">  51</span>
<span class="number">  52</span>      <span class="c">/// Future expansion</span>
<span class="number">  53</span>    <span class="k1">char</span> m_contentsVersion<span class="k2">[</span><span class="n">16</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  54</span>
<span class="number">  55</span>      <span class="c">///</span>
<span class="number">  56</span>    <span class="k1">int</span> m_flags<span class="k2">;</span>
<span class="number">  57</span>    <span class="k1">int</span> m_pad<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  58</span>
<span class="number">  59</span>    <span class="k1">void</span> convertToPC<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  60</span>        m_userTag<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number">  61</span>        int32_endian_swap<span class="k2">(</span>m_fileVersion<span class="k2">)</span><span class="k2">;</span>
<span class="number">  62</span>        m_layoutRules<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> <span class="n">4</span><span class="k2">;</span>
<span class="number">  63</span>        m_layoutRules<span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">  64</span>        m_layoutRules<span class="k2">[</span><span class="n">2</span><span class="k2">]</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  65</span>        m_layoutRules<span class="k2">[</span><span class="n">3</span><span class="k2">]</span> <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">  66</span>
<span class="number">  67</span>        int32_endian_swap<span class="k2">(</span>m_numSections<span class="k2">)</span><span class="k2">;</span>
<span class="number">  68</span>        int32_endian_swap<span class="k2">(</span>m_contentsSectionIndex<span class="k2">)</span><span class="k2">;</span>
<span class="number">  69</span>        int32_endian_swap<span class="k2">(</span>m_contentsSectionOffset<span class="k2">)</span><span class="k2">;</span>
<span class="number">  70</span>
<span class="number">  71</span>        int32_endian_swap<span class="k2">(</span>m_contentsClassNameSectionIndex<span class="k2">)</span><span class="k2">;</span>
<span class="number">  72</span>        int32_endian_swap<span class="k2">(</span>m_contentsClassNameSectionOffset<span class="k2">)</span><span class="k2">;</span>
<span class="number">  73</span>
<span class="number">  74</span>        int32_endian_swap<span class="k2">(</span>m_flags<span class="k2">)</span><span class="k2">;</span>
<span class="number">  75</span>    <span class="k2">}</span>
<span class="number">  76</span>
<span class="number">  77</span>    <span class="k1">void</span> print<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  78</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"File number sections: %d\n"</span>, m_numSections<span class="k2">)</span><span class="k2">;</span>
<span class="number">  79</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Content Section Index: %d\n"</span>, m_contentsSectionIndex<span class="k2">)</span><span class="k2">;</span>
<span class="number">  80</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Content Section Offset: %d\n"</span>, m_contentsSectionOffset<span class="k2">)</span><span class="k2">;</span>
<span class="number">  81</span>
<span class="number">  82</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Content Class Section Index: %d\n"</span>, m_contentsClassNameSectionIndex<span class="k2">)</span><span class="k2">;</span>
<span class="number">  83</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Content Class Section Offset: %d\n"</span>, m_contentsClassNameSectionOffset<span class="k2">)</span><span class="k2">;</span>
<span class="number">  84</span>    <span class="k2">}</span>
<span class="number">  85</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  86</span>
<span class="number">  87</span>
<span class="number">  88</span>
<span class="number">  89</span><span class="c">/// Packfiles are composed of several sections.</span>
<span class="number">  90</span><span class="c">/// A section contains several areas</span>
<span class="number">  91</span><span class="c">/// | data | local | global | finish | exports | imports |</span>
<span class="number">  92</span><span class="c">/// data: the user usable data.</span>
<span class="number">  93</span><span class="c">/// local: pointer patches within this section (src,dst).</span>
<span class="number">  94</span><span class="c">/// global: pointer patches to locations within this packfile (src,(section,dst)).</span>
<span class="number">  95</span><span class="c">/// finish: offset and typename of all objects for finish functions (src, typename).</span>
<span class="number">  96</span><span class="c">/// exports: named objects (src,name).</span>
<span class="number">  97</span><span class="c">/// imports: named pointer patches outside this packfile (src,name).</span>
<span class="number">  98</span><span class="k1">class</span> hkPackfileSectionHeader_conv <span class="k2">{</span>
<span class="number">  99</span>  public:
<span class="number"> 100</span>
<span class="number"> 101</span>      <span class="c">/// Default constructor</span>
<span class="number"> 102</span>    hkPackfileSectionHeader_conv<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 103</span>    <span class="k2">{</span>
<span class="number"> 104</span>
<span class="number"> 105</span>    <span class="k2">}</span>
<span class="number"> 106</span>
<span class="number"> 107</span>      <span class="c">/// Size in bytes of data part</span>
<span class="number"> 108</span>    <span class="k1">int</span> getDataSize<span class="k2">(</span><span class="k2">)</span> <span class="k1">const</span>
<span class="number"> 109</span>    <span class="k2">{</span>
<span class="number"> 110</span>      <span class="k1">return</span> m_localFixupsOffset<span class="k2">;</span>
<span class="number"> 111</span>    <span class="k2">}</span>
<span class="number"> 112</span>      <span class="c">/// Size in bytes of intra section pointer patches</span>
<span class="number"> 113</span>    <span class="k1">int</span> getLocalSize<span class="k2">(</span><span class="k2">)</span> <span class="k1">const</span>
<span class="number"> 114</span>    <span class="k2">{</span>
<span class="number"> 115</span>      <span class="k1">return</span> m_globalFixupsOffset <span class="k3">-</span> m_localFixupsOffset<span class="k2">;</span>
<span class="number"> 116</span>    <span class="k2">}</span>
<span class="number"> 117</span>      <span class="c">/// Size in bytes of inter section pointer patches</span>
<span class="number"> 118</span>    <span class="k1">int</span> getGlobalSize<span class="k2">(</span><span class="k2">)</span> <span class="k1">const</span>
<span class="number"> 119</span>    <span class="k2">{</span>
<span class="number"> 120</span>      <span class="k1">return</span> m_virtualFixupsOffset <span class="k3">-</span> m_globalFixupsOffset<span class="k2">;</span>
<span class="number"> 121</span>    <span class="k2">}</span>
<span class="number"> 122</span>      <span class="c">/// Size in bytes of finishing table.</span>
<span class="number"> 123</span>    <span class="k1">int</span> getFinishSize<span class="k2">(</span><span class="k2">)</span> <span class="k1">const</span>
<span class="number"> 124</span>    <span class="k2">{</span>
<span class="number"> 125</span>      <span class="k1">return</span> m_exportsOffset <span class="k3">-</span> m_virtualFixupsOffset<span class="k2">;</span>
<span class="number"> 126</span>    <span class="k2">}</span>
<span class="number"> 127</span>      <span class="c">/// Size in bytes of exports table.</span>
<span class="number"> 128</span>    <span class="k1">int</span> getExportsSize<span class="k2">(</span><span class="k2">)</span> <span class="k1">const</span>
<span class="number"> 129</span>    <span class="k2">{</span>
<span class="number"> 130</span>      <span class="k1">return</span> m_importsOffset <span class="k3">-</span> m_exportsOffset<span class="k2">;</span>
<span class="number"> 131</span>    <span class="k2">}</span>
<span class="number"> 132</span>      <span class="c">/// Size in bytes of imports table.</span>
<span class="number"> 133</span>    <span class="k1">int</span> getImportsSize<span class="k2">(</span><span class="k2">)</span> <span class="k1">const</span>
<span class="number"> 134</span>    <span class="k2">{</span>
<span class="number"> 135</span>      <span class="k1">return</span> m_endOffset <span class="k3">-</span> m_importsOffset<span class="k2">;</span>
<span class="number"> 136</span>    <span class="k2">}</span>
<span class="number"> 137</span>
<span class="number"> 138</span>  public:
<span class="number"> 139</span>
<span class="number"> 140</span>        <span class="c">///</span>
<span class="number"> 141</span>    <span class="k1">char</span> m_sectionTag<span class="k2">[</span><span class="n">19</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 142</span>
<span class="number"> 143</span>        <span class="c">///</span>
<span class="number"> 144</span>    <span class="k1">char</span> m_nullByte<span class="k2">;</span>
<span class="number"> 145</span>
<span class="number"> 146</span>        <span class="c">/// Absolute file offset of where this sections data begins.</span>
<span class="number"> 147</span>    <span class="k1">int</span> m_absoluteDataStart<span class="k2">;</span>
<span class="number"> 148</span>
<span class="number"> 149</span>        <span class="c">/// Offset of local fixups from absoluteDataStart.</span>
<span class="number"> 150</span>    <span class="k1">int</span> m_localFixupsOffset<span class="k2">;</span>
<span class="number"> 151</span>
<span class="number"> 152</span>        <span class="c">/// Offset of global fixups from absoluteDataStart.</span>
<span class="number"> 153</span>    <span class="k1">int</span> m_globalFixupsOffset<span class="k2">;</span>
<span class="number"> 154</span>
<span class="number"> 155</span>        <span class="c">/// Offset of virtual fixups from absoluteDataStart.</span>
<span class="number"> 156</span>    <span class="k1">int</span> m_virtualFixupsOffset<span class="k2">;</span>
<span class="number"> 157</span>
<span class="number"> 158</span>        <span class="c">/// Offset of exports from absoluteDataStart.</span>
<span class="number"> 159</span>    <span class="k1">int</span> m_exportsOffset<span class="k2">;</span>
<span class="number"> 160</span>
<span class="number"> 161</span>        <span class="c">/// Offset of imports from absoluteDataStart.</span>
<span class="number"> 162</span>    <span class="k1">int</span> m_importsOffset<span class="k2">;</span>
<span class="number"> 163</span>
<span class="number"> 164</span>        <span class="c">/// Offset of the end of section. Also the section size.</span>
<span class="number"> 165</span>    <span class="k1">int</span> m_endOffset<span class="k2">;</span>
<span class="number"> 166</span>
<span class="number"> 167</span>    <span class="k1">void</span> convertToPC<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 168</span>        int32_endian_swap<span class="k2">(</span>m_absoluteDataStart<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 169</span>        int32_endian_swap<span class="k2">(</span>m_localFixupsOffset<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 170</span>        int32_endian_swap<span class="k2">(</span>m_globalFixupsOffset<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 171</span>        int32_endian_swap<span class="k2">(</span>m_virtualFixupsOffset<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 172</span>        int32_endian_swap<span class="k2">(</span>m_exportsOffset<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 173</span>        int32_endian_swap<span class="k2">(</span>m_importsOffset<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 174</span>        int32_endian_swap<span class="k2">(</span>m_endOffset<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 175</span>    <span class="k2">}</span>
<span class="number"> 176</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 177</span>
<span class="number"> 178</span>
<span class="number"> 179</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 180</span><span class="k2">{</span>
<span class="number"> 181</span>    <span class="k1">char</span> <span class="k3">*</span>data<span class="k3">=</span>NULL<span class="k2">;</span>
<span class="number"> 182</span>
<span class="number"> 183</span>    FILE <span class="k3">*</span>src<span class="k3">=</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_337.html" target="_blank">fopen</a><span class="k2">(</span><span class="s">"source.hkx"</span>, <span class="s">"rb"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 184</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>src<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 185</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Couldn't open %s, file doesn't exist.\n"</span>, <span class="s">"source.hkx"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 186</span>        <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 187</span>    <span class="k2">}</span>
<span class="number"> 188</span>
<span class="number"> 189</span>    FILE <span class="k3">*</span>dest<span class="k3">=</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_337.html" target="_blank">fopen</a><span class="k2">(</span><span class="s">"out.hkx"</span>, <span class="s">"wb"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 190</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>dest<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 191</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Couldn't create %s for writing, is the directory write-protected?\n"</span>, <span class="s">"out.hkx"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 192</span>        <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 193</span>    <span class="k2">}</span>
<span class="number"> 194</span>
<span class="number"> 195</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_354.html" target="_blank">fseek</a><span class="k2">(</span>src, <span class="n">0</span>L, SEEK_END<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 196</span>    <span class="k1">int</span> sz <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_366.html" target="_blank">ftell</a><span class="k2">(</span>src<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 197</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_354.html" target="_blank">fseek</a><span class="k2">(</span>src, <span class="n">0</span>L, SEEK_SET<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 198</span>
<span class="number"> 199</span>
<span class="number"> 200</span>    hkPackfileHeader_conv header<span class="k2">;</span>
<span class="number"> 201</span>
<span class="number"> 202</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_349.html" target="_blank">fread</a><span class="k2">(</span><span class="k3">&amp;</span>header, <span class="k1">sizeof</span><span class="k2">(</span>hkPackfileHeader_conv<span class="k2">)</span>, <span class="n">1</span>, src<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 203</span>    header.convertToPC<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 204</span>
<span class="number"> 205</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_371.html" target="_blank">fwrite</a><span class="k2">(</span><span class="k3">&amp;</span>header, <span class="k1">sizeof</span><span class="k2">(</span>hkPackfileHeader_conv<span class="k2">)</span>, <span class="n">1</span>, dest<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 206</span>
<span class="number"> 207</span>    <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> i<span class="k3">&lt;</span>header.m_numSections<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 208</span>        hkPackfileSectionHeader_conv section_header<span class="k2">;</span>
<span class="number"> 209</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_349.html" target="_blank">fread</a><span class="k2">(</span><span class="k3">&amp;</span>section_header, <span class="k1">sizeof</span><span class="k2">(</span>hkPackfileSectionHeader_conv<span class="k2">)</span>, <span class="n">1</span>, src<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 210</span>        section_header.convertToPC<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 211</span>
<span class="number"> 212</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_371.html" target="_blank">fwrite</a><span class="k2">(</span><span class="k3">&amp;</span>section_header, <span class="k1">sizeof</span><span class="k2">(</span>hkPackfileSectionHeader_conv<span class="k2">)</span>, <span class="n">1</span>, dest<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 213</span>    <span class="k2">}</span>
<span class="number"> 214</span>
<span class="number"> 215</span>    header.print<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 216</span>
<span class="number"> 217</span>    sz-<span class="k3">=</span><span class="k1">sizeof</span><span class="k2">(</span>hkPackfileSectionHeader_conv<span class="k2">)</span><span class="k3">*</span>header.m_numSections <span class="k3">+</span> <span class="k1">sizeof</span><span class="k2">(</span>hkPackfileHeader_conv<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 218</span>
<span class="number"> 219</span>    data<span class="k3">=</span><span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span><span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a><span class="k2">(</span>sz<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 220</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_349.html" target="_blank">fread</a><span class="k2">(</span>data, sz, <span class="n">1</span>, src<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 221</span>
<span class="number"> 222</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_371.html" target="_blank">fwrite</a><span class="k2">(</span>data, sz, <span class="n">1</span>, dest<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 223</span>
<span class="number"> 224</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_308.html" target="_blank">fclose</a><span class="k2">(</span>src<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 225</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_308.html" target="_blank">fclose</a><span class="k2">(</span>dest<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 226</span>
<span class="number"> 227</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 228</span><span class="k2">}</span>
</div></div><p>

I forced the layout rules to be 4101 to be recognized as a PC header. It takes a *source.hkx*(the xbox 360 havok file) and writes to <b>out.hkx</b>.</p><p>I&#39;m gonna try to read the classnames now, but the order seems different than the PC one. And so do some of the int32s before it. Some were affected by endiannes, but others seem totally different values. <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" /> Not sure if they&#39;re even offsets anyway, some of them seem to have negative values. Or perhaps they&#39;re just unsigned...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Dario ff)</author>
		<pubDate>Sat, 21 Jan 2012 19:14:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Arg.  I don&#39;t seem to have those header files... well I can&#39;t seem to find them.  A quick look in that shows header files in &quot;Packfile/Binary&quot; which does look interesting though...  Haven&#39;t had any time to work on it myself though.  Still working on this other library.</p><p>Yes, those values before the class names are probably some kind of ID and not offsets.  The differences would probably be due to different versions of the SDK creating the files... That&#39;s my guess at least... </p><p>I&#39;m guessing that if you can find every int16, int32 and int64 that needs swapping and just swap them then it should be ok as long as you change the endianness flag in the header.  No need to really find out what anything does until another problem comes up...</p><p>Not sure if it was mentioned already, but another thing I noticed was that each section was aligned on a 16 byte boundary.  The character 0xff was used to fill in any gaps...</p><p>Anyway, it looks like you&#39;ve made some progress at least. Have to go again.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ron Novy)</author>
		<pubDate>Sun, 22 Jan 2012 06:49:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I gave up on trying to convert the file. Instead, I decided on researching how to import a brand new collision mesh into the game.</p><p>And I succeeded. \o/ Blessed be the Havok Content tools:<br /><div class="media-player youtube"><div style="margin: 1em 2em; background: url(/images/movie.png); width: 180px; height: 100px; text-align: center;"><a href="http://www.allegro.cc//www.youtube.com/watch?v=8h78rtaMN5w" target="_blank"><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/object/c/b/cb47f43c44faad3d261d9eedb3622a37.jpg" border="0" alt="video" title="Click to play video" /></a></div></div></p><p>There&#39;s still the problematic texture/lighting problems, but at least it&#39;s playable.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Dario ff)</author>
		<pubDate>Wed, 25 Jan 2012 23:54:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ha... That&#39;s awesome.  I liked that quote at the end of the video. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><p>[edit]<br />The blue lighting is probably a difference in color depth... I think that maybe the console version is in 16-bit mode and the PC is in either 24 or 32 bit.  The color values that are stored in the file are probably 32-bit integers in both, but using only the needed bits.  This would make things look more blue/green in a higher bit depth.  Just a theory though...  <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ron Novy)</author>
		<pubDate>Fri, 27 Jan 2012 11:27:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think the bit depth color theory is actually right for the Global Illumination textures.</p><p>After struggling with them for a while, I figured out that they need to be uv-flipped as well. But they are big textures which hold several sub-textures most of the time.</p><p>So I looked at a little binary file next to them called &quot;atlasinfo&quot;. Thanks to your previous binary guessing efforts, I learned from that and REd the whole structure. It contained the UV coords of each sub-texture, so I just swapped the U with V in there and walla!</p><p><div class="media-player youtube"><div style="margin: 1em 2em; background: url(/images/movie.png); width: 180px; height: 100px; text-align: center;"><a href="http://www.allegro.cc//www.youtube.com/watch?v=idEplp9mDNM" target="_blank"><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/object/f/6/f64d6438ded45f19fdba518ba6dbe9b9.jpg" border="0" alt="video" title="Click to play video" /></a></div></div></p><p>Now the global illumination AND the textures are correctly mapped. The only thing left to figure out so far is the Shadow casting but, the stage shouldn&#39;t look this dark. How could I convert the texture to the right color values if it perhaps was orignally 16-bit, and now must be switched to 32-bit? The final color should look as if it was lit by the same intensity as you can see in the rest of the objects.</p><p>If it&#39;s something doable in Photoshop 7 with automated batch, even better. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /> Otherwise I&#39;ll have to rely on Allegro.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Dario ff)</author>
		<pubDate>Mon, 30 Jan 2012 22:31:02 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Nice job. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/609320/946097#target">Dario ff</a> said:</div><div class="quote"><p>How could I convert the texture to the right color values if it perhaps was originally 16-bit, and now must be switched to 32-bit?</p></div></div><p>

Well, if each texture is it&#39;s own individual file then it could be easy.  You might change the format to 32-bit and multiply each color value by 8 if they are still too dark.  The value for the green component might need to be multiplied by 4 if it was actually 565 16-bit color...</p><p>If each texture is inside a larger file then it might be more difficult.  You&#39;d need to figure out the structures of that file and create a new one with the new textures.</p><p>It could just be some color values near the UV coordinates that need shifting too, but all this is just theory without knowing more about the game files.</p><p>[edit]<br /><s>It actually looks more blue then red or green, but the green seems to be brighter then the other colors when it&#39;s on screen...  

It could also be a color table or color ramp stored somewhere.  The values for that would probably be 1024 bytes, words or dwords.  Just something to look out for...</s></p><p>[edit2]<br />Strike all that... I turned the brightness up on my monitor and then it looks perfect.  The images might be stored as 32-bit but with only 5-bits for each component being used... It might have been done that way to keep alpha maps there...  Or they are 16-bit and just need to be converted to 32-bit....<br />Ok. I&#39;m done. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ron Novy)</author>
		<pubDate>Tue, 31 Jan 2012 07:23:30 +0000</pubDate>
	</item>
</rss>
