<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://hedgedocs.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AdelQue</id>
	<title>HedgeDocs - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://hedgedocs.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AdelQue"/>
	<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php/Special:Contributions/AdelQue"/>
	<updated>2026-04-13T16:35:53Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PXD&amp;diff=1396</id>
		<title>PXD</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PXD&amp;diff=1396"/>
		<updated>2026-03-03T05:05:38Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=This page is unfinished.}}&lt;br /&gt;
&lt;br /&gt;
===== If you are looking for tools to edit &amp;lt;code&amp;gt;.pxd&amp;lt;/code&amp;gt; files, see [[PXD Animation Tools|PXD Animation Tools.]] =====&lt;br /&gt;
&lt;br /&gt;
== PXD Files ==&lt;br /&gt;
Hedgehog Engine 2 games from [[Mario &amp;amp; Sonic at the Tokyo 2020 Olympic Games|Tokyo 2020 Olympic Games]] to [[Shadow Generations]] contain skeleton and skeletal animation files with the file extensions &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; respectively, stored in a [[BINA]] container. Skeletons contain pose data that usually result in a T-Pose, bone and parent indices, and bone names. Animations contain playback metadata such as frame rate and frame count, track count, and either compressed animation pose data using [https://github.com/nfrechette/acl ACL compression,] or raw uncompressed pose data that use bone and frame indices to specify keyframed transforms, with linear interpolation between keyframes. For both skeletons and animations, position and rotation data for each bone is an absolute transform relative to the parent position, whereas scales are inherited from their respective parents locally, and have no effect on their positions. &lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Animation files are stored in a [[BINA]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt; identified as &amp;lt;code&amp;gt;PXAN&amp;lt;/code&amp;gt;, possibly for &amp;quot;PXD Animation&amp;quot; or similar:&lt;br /&gt;
&lt;br /&gt;
=== PXAN Header ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct Header {&lt;br /&gt;
	char[4] magic;		// &#039;NAXP&#039;&lt;br /&gt;
	uint32_t version;	// Always 0x200&lt;br /&gt;
	uint8_t additive;	// 0x01 if additive, else 0x00&lt;br /&gt;
	uint8_t compressed;	// 0x08 if ACL compressed, 0x00 if uncompressed&lt;br /&gt;
	char[6];			// Null alignment to 8 bytes&lt;br /&gt;
	uint64_t metadata_offset;	// Offset to metadata, always 0x18&lt;br /&gt;
	float duration;				// Duration of the animation in seconds, calculated as ((frame_count - 1) / FPS)&lt;br /&gt;
	uint32_t frame_count;	&lt;br /&gt;
	uint32_t track_count;		// Bone count&lt;br /&gt;
	uint64_t skel_anim_offset;	// Offset for character&#039;s skeletal animation, always 0x40 if compressed, 0x38 if uncompressed&lt;br /&gt;
	uint64_t root_anim_offset;	// Offset for root motion animation, 0x00 if no root motion is present, aligned to 16 bytes&lt;br /&gt;
	if (compressed == 0x08)&lt;br /&gt;
	char[8];		// Null alignment to 0x10 bytes for ACL data. &lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ACL Data: ===&lt;br /&gt;
All Hedgehog Engine 2 games that utilize the ACL library appear to use v2.0.0, first seen in [[Sonic Origins]], and unchanged in any implementation since then. [https://github.com/nfrechette/acl/tree/a54c5c2781be9f14b840a60f8dd8ec6c5065885d/docs See the ACL docs for more info.] If &amp;lt;code&amp;gt;compressed == 0x08&amp;lt;/code&amp;gt;, skeletal animations and root motion animations are compressed. &lt;br /&gt;
&lt;br /&gt;
==== Compressed Data: ====&lt;br /&gt;
Below is a high level overview of the stored ACL chunk data:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct ACLData {&lt;br /&gt;
	uint32_t acl_chunk_size;&lt;br /&gt;
	int32_t acl_hash;&lt;br /&gt;
&lt;br /&gt;
	uint32_t acl_tag;		// Identifies ACL buffer type, always 0xAC11AC11 to mark compressed_tracks&lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/buffer_tag.h#L49&lt;br /&gt;
&lt;br /&gt;
	uint16_t acl_version;	// ACL Version Enum Identifier. 0x07 indicates v2.0.0, the only version observed in any HE2 game.&lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/compressed_tracks_version.h#L71&lt;br /&gt;
&lt;br /&gt;
	char acl_padding;		// always 0x00&lt;br /&gt;
	uint8_t acl_track_type;	// ACL Track Type Enum. 0x0C indicates qvvf, the only track type observed in any HE2 game. &lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/track_types.h#L68&lt;br /&gt;
&lt;br /&gt;
	uint32_t track_count;	// Bone count if skeletal animation, 0x01 if root motion. Should match header track_count if skeletal. &lt;br /&gt;
	uint32_t sample_count;	// Frame count, should match header frame_count.&lt;br /&gt;
	float32 sample_rate;	// Playback FPS of animation, should equal header ((frame_count - 1) / duration)&lt;br /&gt;
	char[acl_chunk_size - 0x1C] acl_data;   // String of compressed ACL data&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;At the end of an ACL chunk, if it is a skeletal animation chunk and root motion is present in the file, the chunk will be null padded to 16 bytes. If the ACL chunk is a root motion chunk or a skeletal animation with no associated root motion chunk in the file, the chunk will be null padded to 4 bytes. The last ACL chunk is immediately followed by the BINA offset table. &lt;br /&gt;
&lt;br /&gt;
==== Raw/Decompressed Track List: ====&lt;br /&gt;
The index lookup for which transform set belongs to which bone can be found in the skeleton file [[PXD#.skl.pxd Structure|(see .skl.pxd Structure)]]. Each bone uses an [https://github.com/nfrechette/rtm RTM] [https://github.com/nfrechette/rtm/blob/7c9a61e32744ee9ff2978328d0e585635fd55615/includes/rtm/types.h#L393 qvvf] struct for transformation. Though the &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; element of each vector has no bearing on the final animation, the games usually store a value in there anyways and appears to have an effect on compression:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct qvvf&lt;br /&gt;
{&lt;br /&gt;
	quatf rotation;			// XYZW Quaternion&lt;br /&gt;
	vector4f translation;	// XYZW Vector, W is undefined but appears to be bone length&lt;br /&gt;
	vector4f scale;			// XYZW Vector, W is undefined and always 1.0&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Native Uncompressed Data: ===&lt;br /&gt;
{{Notice|type=note|content=This section could use a less confusing explanation.}}&lt;br /&gt;
Alternatively to compressed ACL track data, the PXAN structure can store individual components (rotation, translation, scale) of any given track at any frame, and linearly interpolate between them independently. This system was first seen in the [[Mario &amp;amp; Sonic at the Rio 2016 Olympic Games|M&amp;amp;S Tokyo 2020 Olympic Games]] as the exclusive method of storing animations. ACL compression may have an advantage in reducing the file size of many of these animations but—though rare—uncompressed animations have been observed in subsequent games for certain animations, presumably to combat any potential jitter during close up cutscenes or similar situations. Though the actual end data contained in this method is simple, the structure can end up like a spider&#039;s nest at first glance:&lt;br /&gt;
&lt;br /&gt;
==== Track Offset Tables: ====&lt;br /&gt;
The first struct array found in the file is a track table for each bone. Within it, for each transform type (translation, rotation, scale), there is a keyframe count, offset pointing to a frame table, and offset pointing to an array of transforms. &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct TrackTableOffsets {&lt;br /&gt;
	uint64_t pos_key_count;			// Total number of translation keyframes for this bone&lt;br /&gt;
	uint64_t pos_table_offset;		// Offset for this bone&#039;s translation frame table&lt;br /&gt;
	uint64_t pos_values_offset;		// Starting offset for this bone&#039;s array of translation values&lt;br /&gt;
&lt;br /&gt;
	uint64_t rot_key_count;			// Total number of rotation keyframes for this bone&lt;br /&gt;
	uint64_t rot_table_offset;		// Offset for this bone&#039;s rotation frame table&lt;br /&gt;
	uint64_t rot_values_offset;		// Starting offset for this bone&#039;s array of rotation values&lt;br /&gt;
&lt;br /&gt;
	uint64_t scale_key_count;		// Total number of scale keyframes for this bone&lt;br /&gt;
	uint64_t scale_table_offset;	// Offset for this bone&#039;s scale frame table&lt;br /&gt;
	uint64_t scale_values_offset;	// Starting offset for this bone&#039;s array of scale values&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
TrackTableOffsets TrackTables[track_count];		// One for each bone, track_count from PXAN header&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Frame Tables and Transforms: ====&lt;br /&gt;
Each transform type will get a frame table as &amp;lt;code&amp;gt;uint16_t[key_count] keys;&amp;lt;/code&amp;gt; where each value is the frame that the keyframe will be inserted to, and transform array &amp;lt;code&amp;gt;vector4f[key_count] transforms; // XYZW floats&amp;lt;/code&amp;gt; that will correspond to the frame with the matching array index. Unlike in ACL decompressed tracks, native uncompressed tracks&#039; &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; component for translation and scale is always &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;. Both of these element arrays will be null aligned to 16 bytes.&lt;br /&gt;
&lt;br /&gt;
==== Posing and Transform Inheritance: ====&lt;br /&gt;
Each bone&#039;s transformation is stored as an object space (AKA &#039;Pose Space&#039; or &#039;Model Space&#039;) transform relative to its parent bone&#039;s final transformation. That means, regardless of what the reset pose or bone orientations are in the model&#039;s skeleton, the stored values of any given frame will completely overwrite any pose previously present. &lt;br /&gt;
&lt;br /&gt;
However, there are two quirks that are unlike most interchange formats for 3D animations:&lt;br /&gt;
&lt;br /&gt;
# Scale inheritance is a simple local space copy of the parent&#039;s local space scale. There is no shearing or skewing of any kind.&lt;br /&gt;
#* &amp;lt;sub&amp;gt;In Blender, a bone&#039;s scale inheritance mode can be changed from `Full` to `Aligned` to achieve this effect&amp;lt;/sub&amp;gt;&lt;br /&gt;
# Calculating the position and rotation of any given bone is to be done independent of any scale values.&lt;br /&gt;
&lt;br /&gt;
When reading in-game, though scales from recursive parents are inherited and multiplied, translation is completely unaffected in any capacity, unintuitively. Therefore, before applying any object space transformation in a setting where parent scale is assumed to affect the child bone&#039;s location, each bone&#039;s final scale must be calculated and applied by multiplying its and each recursive parent&#039;s scales together. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Trivia&#039;&#039;&#039;: &#039;&#039;The inheritance and relationships behavior for bone transform values have been found to be identical to all previous HE games that used Havok, possibly indicating that Sonic Team&#039;s custom implementation of animation playback and posing is loosely based on Havok&#039;s &amp;lt;code&amp;gt;hka&amp;lt;/code&amp;gt; functions.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Skeleton files are stored in a [[BINA]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;lt;sub&amp;gt;TODO...&amp;lt;/sub&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Thanks ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/Turk645 Turk645:] Original uncompressed PXD blender importer scripts&lt;br /&gt;
* [https://github.com/WistfulHopes WistfulHopes:] ACL tools, blender export scripts&lt;br /&gt;
* [https://github.com/ik-01 ik-01]: Format and game code research, filling in gaps for unknown values&lt;br /&gt;
* [https://github.com/AdelQue AdelQue:] Format research, math relations and bone inheritance behaviors&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PXD_Animation_Tools&amp;diff=1395</id>
		<title>PXD Animation Tools</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PXD_Animation_Tools&amp;diff=1395"/>
		<updated>2026-03-03T04:52:07Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Updated format and links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToolInfobox|title=PXD Animation Tools|author=WistfulHopes, AdelQue, Turk645|website=https://github.com/WistfulHopes/FrontiersAnimDecompress|download=https://github.com/WistfulHopes/FrontiersAnimDecompress/releases/latest|image=FrontiersAnimDecompressPreview.gif}}&lt;br /&gt;
&lt;br /&gt;
[https://github.com/WistfulHopes/PXDAnimationTools PXD Animations Tools] (formerly known as &amp;quot;FrontiersAnimDecompress&amp;quot; and &amp;quot;Frontiers Animation Tools&amp;quot;) is a [https://www.blender.org/ Blender] add-on for importing and exporting animation [[PXD|&amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt;]] and skeleton [[PXD|&amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt;]] files from various Hedgehog Engine 2 games. The tool officially supports most Hedgehog Engine 2 titles including [[Mario &amp;amp; Sonic at the Tokyo 2020 Olympic Games]], [[Sonic Origins]], [[Sonic Frontiers]], and [[Shadow Generations]]. &lt;br /&gt;
&lt;br /&gt;
The add-on can currently perform compressed/uncompressed batch animation imports, compressed batch animation exports, skeleton reorientation, and officially supports Blender versions from 3.6 to 4.5 (as a legacy add-on in 4.2+). The add-on is Windows-only as it uses a DLL for [https://github.com/nfrechette/acl ACL] compression and decompression.&lt;br /&gt;
&lt;br /&gt;
More technical info about the supported file formats can be found on the [[PXD|dedicated PXD page.]] &lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
The latest version of the tool at any point can be found [https://github.com/WistfulHopes/PXDAnimationTools/releases/latest/ here.] The add-on should be installed as a zip file without extraction.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
====== A guide for animation editing using this tool can be found in [[Skeletal Animation Editing|Guide:Skeletal Animation Editing]]. ======&lt;br /&gt;
&lt;br /&gt;
=== Text Overview: ===&lt;br /&gt;
A skeleton needs to be imported into the scene, and this skeleton must be selected in the viewport in order to import or export an animation. The add-on currently only reads bone indices from the animation file, so an animation can only be imported over the skeleton that it was originally made for. Batch functions can be found in the right ribbon of the viewport&#039;s sidebar, in the &amp;quot;PXD Animation&amp;quot; category under the &amp;quot;Animation&amp;quot; tab.&lt;br /&gt;
&lt;br /&gt;
As long as all the bones&#039; scale inheritance mode in your skeleton is set to &amp;quot;Aligned&amp;quot;, and any targets for scale-modifying constraints follow the same inheritance mode, the skeleton should generally export exactly as you see in the viewport.&lt;br /&gt;
&lt;br /&gt;
Per-animation settings (such as FPS and frame range) can be found in the &amp;quot;Action Editor&amp;quot; under the Dope Sheet editor. PXD specific settings may currently not show up for any animation that wasn&#039;t imported, or duplicated off of an imported animation.&lt;br /&gt;
&lt;br /&gt;
When exporting custom skeletons, ensure that all bone names only contain alphanumeric characters. With the exception of underscores &amp;quot;_&amp;quot;, any special characters (such as &amp;quot;.&amp;quot; commonly auto-added to many duplicated resources in Blender) in bone names may cause a crash in-game upon loading.&lt;br /&gt;
&lt;br /&gt;
In order to have a default game skeleton support mirroring in Blender, a skeleton must be imported using YX orientation (a togglable option in all import/export dialogues). If the skeleton is imported with this setting, all subsequent import/export operations from this add-on must enable YX orientation as well. If it is not properly called out, results in-game will not turn out as expected.&lt;br /&gt;
&lt;br /&gt;
During batch operations, Blender may freeze and become unresponsive. The external Blender console window can (and should) be open so you may view a readout of the import progress instead of assuming the program is crashing. It is not recommended to batch imports hundreds of animations at a time. Depending on your hardware, you may want to play with a group of about 50 at a time or maybe up to 200 if you have a higher end system. &lt;br /&gt;
&lt;br /&gt;
== History: ==&lt;br /&gt;
The PXD formats were first supported by Blender add-on scripts that allowed model importing and skeleton importing for the files first found in the 2020 Olympic game in Blender 2.82.&amp;lt;ref&amp;gt;https://github.com/Turk645/Hedgehog-Engine-2-Mesh-Blender-Importer&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From Origins onward, animation data was identified to be compressed by ACL. An application called &amp;quot;FrontiersAnimDecompress.exe&amp;quot; was later created, which was used to dump decompressed track data (labeled as &amp;lt;code&amp;gt;.outanim&amp;lt;/code&amp;gt; files) from these newly compressed formats.&amp;lt;ref&amp;gt;https://github.com/WistfulHopes/PXDAnimationTools/tree/c835209172b14468a07e5cae75d05fd4a595e35e&amp;lt;/ref&amp;gt; Included with the app were supplemental Blender scripts for importing from the dumped track data (modified from Turk645&#039;s original scripts), as well as custom scripts for exporting custom skeletons and raw track data that could later be recompressed.&lt;br /&gt;
&lt;br /&gt;
The application was eventually modified into a DLL, and supplemental scripts were rewritten as one packaged add-on, so standalone conversion was no longer necessary.&amp;lt;ref&amp;gt;https://github.com/AdelQue/FrontiersAnimDecompress/releases/tag/v2.0.0&amp;lt;/ref&amp;gt; Notable additions included batch processing, corrected scaling, skeleton reorientation for mirror support, and root motion.&lt;br /&gt;
&lt;br /&gt;
Handling of raw track data was recently found to be identical across all Hedgehog Engine titles. The method in this add-on to achieve correct scaling can be reused for other Hedgehog Engine games stored in Havok animation formats.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    This page was last edited on 11 January &lt;br /&gt;
&lt;br /&gt;
[[Category:Animation]]&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Skeletal_Animation_Editing&amp;diff=1394</id>
		<title>Skeletal Animation Editing</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Skeletal_Animation_Editing&amp;diff=1394"/>
		<updated>2026-03-03T04:46:42Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Added Video&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is an introductory page that will describe how to edit skeletal animations from Hedgehog Engine 2 games that utilize the &amp;lt;code&amp;gt;.pxd&amp;lt;/code&amp;gt; file formats.  &lt;br /&gt;
&lt;br /&gt;
== Video Tutorial ==&lt;br /&gt;
&lt;br /&gt;
=== Getting Started + Basic Animation Import + Export ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://youtu.be/sVKX8YvePZY&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Written Tutorial ==&lt;br /&gt;
&#039;&#039;&amp;lt;sub&amp;gt;NOTE: Work in progress!&amp;lt;/sub&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Required Tools ===&lt;br /&gt;
&lt;br /&gt;
* [https://www.blender.org/ Blender] &lt;br /&gt;
&lt;br /&gt;
* [https://github.com/WistfulHopes/FrontiersAnimDecompress/ PXD Animation Tools add-on for Blender]&lt;br /&gt;
* [https://hedge-dev.github.io/HedgehogEngineBlenderIO/index.html Hedgehog Engine I/O extension for Blender] &amp;lt;small&amp;gt;(for having a model to animate with)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
==== Blender ====&lt;br /&gt;
&lt;br /&gt;
* Download and run the setup executable of the latest supported version of Blender (version 4.5 as of this wiki page) from either the [https://www.blender.org/download/ official site] or from the [https://store.steampowered.com/app/365670/Blender/ official Steam page] if you&#039;d like to stay automatically updated.&lt;br /&gt;
&lt;br /&gt;
==== PXD Animation Tools ====&lt;br /&gt;
&lt;br /&gt;
* Download &amp;lt;code&amp;gt;PXDAnimationTools.zip&amp;lt;/code&amp;gt; from the tool&#039;s [https://github.com/WistfulHopes/PXDAnimationTools/releases/latest/ latest GitHub release page.]&lt;br /&gt;
&lt;br /&gt;
* Run Blender.&lt;br /&gt;
* In the upper left corner, navigate to &amp;lt;code&amp;gt;Edit &amp;gt; Preferences...&amp;lt;/code&amp;gt;&lt;br /&gt;
* On the left pane of the preferences window, select the &amp;lt;code&amp;gt;Add-ons&amp;lt;/code&amp;gt; tab.&lt;br /&gt;
* In the upper-right side of the window, select the &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; shaped drop-down button, then select &amp;lt;code&amp;gt;Install from disk...&amp;lt;/code&amp;gt;&lt;br /&gt;
* Navigate to and select the downloaded &amp;lt;code&amp;gt;PXDAnimationTools.zip&amp;lt;/code&amp;gt; file, then click the &amp;lt;code&amp;gt;Install from Disk&amp;lt;/code&amp;gt; button.&lt;br /&gt;
* You should now see an add-on entry for &amp;lt;code&amp;gt;Hedgehog Engine PXD Animation Tools&amp;lt;/code&amp;gt; with a ticked checkbox to the left.&lt;br /&gt;
* The tool is now installed, and the preferences window may now be closed.&lt;br /&gt;
&lt;br /&gt;
==== Hedgehog Engine I/O ====&lt;br /&gt;
&lt;br /&gt;
* Please see the [https://hedge-dev.github.io/HedgehogEngineBlenderIO/getting_started/installation.html#installing-the-addon dedicated installation page for HEIO.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:PXD Animation Editing}}&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PXD_Animation_Tools&amp;diff=1389</id>
		<title>PXD Animation Tools</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PXD_Animation_Tools&amp;diff=1389"/>
		<updated>2026-03-02T02:30:58Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Updated Title&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToolInfobox|title=PXD Animation Tools|author=WistfulHopes, AdelQue, Turk645|website=https://github.com/WistfulHopes/FrontiersAnimDecompress|download=https://github.com/WistfulHopes/FrontiersAnimDecompress/releases/latest|image=FrontiersAnimDecompressPreview.gif}}&lt;br /&gt;
&lt;br /&gt;
[https://github.com/WistfulHopes/PXDAnimationTools PXD Animations Tools] (formerly known as &amp;quot;FrontiersAnimDecompress&amp;quot; and &amp;quot;Frontiers Animation Tools&amp;quot;) is a [https://www.blender.org/ Blender] add-on for importing and exporting animation ([[PXD|*.anm.pxd]]) and skeleton ([[PXD|*.skl.pxd]]) files from various Hedgehog Engine 2 games. The tool officially supports most Hedgehog Engine 2 titles including [[Mario &amp;amp; Sonic at the Tokyo 2020 Olympic Games]], [[Sonic Origins]], [[Sonic Frontiers]], and [[Shadow Generations]]. &lt;br /&gt;
&lt;br /&gt;
The add-on can currently perform compressed/uncompressed batch animation imports, compressed batch animation exports, skeleton reorientation, and officially supports Blender versions from 3.6 to 4.5 (as a legacy add-on in 4.2+). The add-on is Windows-only as it uses a DLL for [https://github.com/nfrechette/acl ACL] compression and decompression.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
The latest version of the tool at any point can be found [https://github.com/WistfulHopes/PXDAnimationTools/releases/latest/ here.] The add-on should be installed as a zip file without extraction.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Video: ===&lt;br /&gt;
A video tutorial for basic usage of the add-on can be found [https://youtu.be/sVKX8YvePZY here.]&lt;br /&gt;
&lt;br /&gt;
=== Text Overview: ===&lt;br /&gt;
A skeleton needs to be imported into the scene, and this skeleton must be selected in the viewport in order to import or export an animation. The add-on currently only reads bone indices from the animation file, so an animation can only be imported over the skeleton that it was originally made for. Batch functions can be found in the right ribbon of the viewport&#039;s sidebar, in the &amp;quot;PXD Animation&amp;quot; category under the &amp;quot;Animation&amp;quot; tab.&lt;br /&gt;
&lt;br /&gt;
As long as all the bones&#039; scale inheritance mode in your skeleton is set to &amp;quot;Aligned&amp;quot;, and any targets for scale-modifying constraints follow the same inheritance mode, the skeleton should generally export exactly as you see in the viewport.&lt;br /&gt;
&lt;br /&gt;
Per-animation settings (such as FPS and frame range) can be found in the &amp;quot;Action Editor&amp;quot; under the Dope Sheet editor. PXD specific settings may currently not show up for any animation that wasn&#039;t imported, or duplicated off of an imported animation.&lt;br /&gt;
&lt;br /&gt;
When exporting custom skeletons, ensure that all bone names only contain alphanumeric characters. With the exception of underscores &amp;quot;_&amp;quot;, any special characters (such as &amp;quot;.&amp;quot; commonly auto-added to many duplicated resources in Blender) in bone names may cause a crash in-game upon loading.&lt;br /&gt;
&lt;br /&gt;
In order to have a default game skeleton support mirroring in Blender, a skeleton must be imported using YX orientation (a togglable option in all import/export dialogues). If the skeleton is imported with this setting, all subsequent import/export operations from this add-on must enable YX orientation as well. If it is not properly called out, results in-game will not turn out as expected.&lt;br /&gt;
&lt;br /&gt;
During batch operations, Blender may freeze and become unresponsive. The external Blender console window can (and should) be open so you may view a readout of the import progress instead of assuming the program is crashing. It is not recommended to batch imports hundreds of animations at a time. Depending on your hardware, you may want to play with a group of about 50 at a time or maybe up to 200 if you have a higher end system. &lt;br /&gt;
&lt;br /&gt;
== History: ==&lt;br /&gt;
The PXD formats were first supported by Blender add-on scripts that allowed model importing and skeleton importing for the files first found in the 2020 Olympic game in Blender 2.82.&amp;lt;ref&amp;gt;https://github.com/Turk645/Hedgehog-Engine-2-Mesh-Blender-Importer&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From Origins onward, animation data was identified to be compressed by ACL. An application called &amp;quot;FrontiersAnimDecompress.exe&amp;quot; was later created, which was used to dump decompressed track data (labeled as *.outanim files) from these newly compressed formats.&amp;lt;ref&amp;gt;https://github.com/WistfulHopes/PXDAnimationTools/tree/c835209172b14468a07e5cae75d05fd4a595e35e&amp;lt;/ref&amp;gt; Included with the app were supplemental Blender scripts for importing from the dumped track data (modified from Turk645&#039;s original scripts), as well as custom scripts for exporting custom skeletons and raw track data that could later be recompressed.&lt;br /&gt;
&lt;br /&gt;
The application was eventually modified into a DLL, and supplemental scripts were rewritten as one packaged add-on, so standalone conversion was no longer necessary.&amp;lt;ref&amp;gt;https://github.com/AdelQue/FrontiersAnimDecompress/releases/tag/v2.0.0&amp;lt;/ref&amp;gt; Notable additions included batch processing, corrected scaling, skeleton reorientation for mirror support, and root motion.&lt;br /&gt;
&lt;br /&gt;
Handling of raw track data was recently found to be identical across all Hedgehog Engine titles. The method in this add-on to achieve correct scaling can be reused for other Hedgehog Engine games stored in Havok animation formats.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    This page was last edited on 11 January &lt;br /&gt;
&lt;br /&gt;
[[Category:Animation]]&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Frontiers_Animation_Tools&amp;diff=1388</id>
		<title>Frontiers Animation Tools</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Frontiers_Animation_Tools&amp;diff=1388"/>
		<updated>2026-03-02T02:30:02Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: AdelQue moved page Frontiers Animation Tools to PXD Animation Tools over redirect: Tool Name Changed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[PXD Animation Tools]]&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PXD_Animation_Tools&amp;diff=1387</id>
		<title>PXD Animation Tools</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PXD_Animation_Tools&amp;diff=1387"/>
		<updated>2026-03-02T02:30:02Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: AdelQue moved page Frontiers Animation Tools to PXD Animation Tools over redirect: Tool Name Changed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:PXD Animation Tools}}&lt;br /&gt;
&lt;br /&gt;
= PXD Animation Tools =&lt;br /&gt;
{{ToolInfobox|title=PXD Animation Tools|author=WistfulHopes, AdelQue, Turk645|website=https://github.com/WistfulHopes/FrontiersAnimDecompress|download=https://github.com/WistfulHopes/FrontiersAnimDecompress/releases/latest|image=FrontiersAnimDecompressPreview.gif}}&lt;br /&gt;
&lt;br /&gt;
[https://github.com/WistfulHopes/PXDAnimationTools PXD Animations Tools] (formerly known as &amp;quot;FrontiersAnimDecompress&amp;quot; and &amp;quot;Frontiers Animation Tools&amp;quot;) is a [https://www.blender.org/ Blender] add-on for importing and exporting animation ([[PXD|*.anm.pxd]]) and skeleton ([[PXD|*.skl.pxd]]) files from various Hedgehog Engine 2 games. The tool officially supports most Hedgehog Engine 2 titles including [[Mario &amp;amp; Sonic at the Tokyo 2020 Olympic Games]], [[Sonic Origins]], [[Sonic Frontiers]], and [[Shadow Generations]]. &lt;br /&gt;
&lt;br /&gt;
The add-on can currently perform compressed/uncompressed batch animation imports, compressed batch animation exports, skeleton reorientation, and officially supports Blender versions from 3.6 to 4.5 (as a legacy add-on in 4.2+). The add-on is Windows-only as it uses a DLL for [https://github.com/nfrechette/acl ACL] compression and decompression.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
The latest version of the tool at any point can be found [https://github.com/WistfulHopes/PXDAnimationTools/releases/latest/ here.] The add-on should be installed as a zip file without extraction.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Video: ===&lt;br /&gt;
A video tutorial for basic usage of the add-on can be found [https://youtu.be/sVKX8YvePZY here.]&lt;br /&gt;
&lt;br /&gt;
=== Text Overview: ===&lt;br /&gt;
A skeleton needs to be imported into the scene, and this skeleton must be selected in the viewport in order to import or export an animation. The add-on currently only reads bone indices from the animation file, so an animation can only be imported over the skeleton that it was originally made for. Batch functions can be found in the right ribbon of the viewport&#039;s sidebar, in the &amp;quot;PXD Animation&amp;quot; category under the &amp;quot;Animation&amp;quot; tab.&lt;br /&gt;
&lt;br /&gt;
As long as all the bones&#039; scale inheritance mode in your skeleton is set to &amp;quot;Aligned&amp;quot;, and any targets for scale-modifying constraints follow the same inheritance mode, the skeleton should generally export exactly as you see in the viewport.&lt;br /&gt;
&lt;br /&gt;
Per-animation settings (such as FPS and frame range) can be found in the &amp;quot;Action Editor&amp;quot; under the Dope Sheet editor. PXD specific settings may currently not show up for any animation that wasn&#039;t imported, or duplicated off of an imported animation.&lt;br /&gt;
&lt;br /&gt;
When exporting custom skeletons, ensure that all bone names only contain alphanumeric characters. With the exception of underscores &amp;quot;_&amp;quot;, any special characters (such as &amp;quot;.&amp;quot; commonly auto-added to many duplicated resources in Blender) in bone names may cause a crash in-game upon loading.&lt;br /&gt;
&lt;br /&gt;
In order to have a default game skeleton support mirroring in Blender, a skeleton must be imported using YX orientation (a togglable option in all import/export dialogues). If the skeleton is imported with this setting, all subsequent import/export operations from this add-on must enable YX orientation as well. If it is not properly called out, results in-game will not turn out as expected.&lt;br /&gt;
&lt;br /&gt;
During batch operations, Blender may freeze and become unresponsive. The external Blender console window can (and should) be open so you may view a readout of the import progress instead of assuming the program is crashing. It is not recommended to batch imports hundreds of animations at a time. Depending on your hardware, you may want to play with a group of about 50 at a time or maybe up to 200 if you have a higher end system. &lt;br /&gt;
&lt;br /&gt;
== History: ==&lt;br /&gt;
The PXD formats were first supported by Blender add-on scripts that allowed model importing and skeleton importing for the files first found in the 2020 Olympic game in Blender 2.82.&amp;lt;ref&amp;gt;https://github.com/Turk645/Hedgehog-Engine-2-Mesh-Blender-Importer&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From Origins onward, animation data was identified to be compressed by ACL. An application called &amp;quot;FrontiersAnimDecompress.exe&amp;quot; was later created, which was used to dump decompressed track data (labeled as *.outanim files) from these newly compressed formats.&amp;lt;ref&amp;gt;https://github.com/WistfulHopes/PXDAnimationTools/tree/c835209172b14468a07e5cae75d05fd4a595e35e&amp;lt;/ref&amp;gt; Included with the app were supplemental Blender scripts for importing from the dumped track data (modified from Turk645&#039;s original scripts), as well as custom scripts for exporting custom skeletons and raw track data that could later be recompressed.&lt;br /&gt;
&lt;br /&gt;
The application was eventually modified into a DLL, and supplemental scripts were rewritten as one packaged add-on, so standalone conversion was no longer necessary.&amp;lt;ref&amp;gt;https://github.com/AdelQue/FrontiersAnimDecompress/releases/tag/v2.0.0&amp;lt;/ref&amp;gt; Notable additions included batch processing, corrected scaling, skeleton reorientation for mirror support, and root motion.&lt;br /&gt;
&lt;br /&gt;
Handling of raw track data was recently found to be identical across all Hedgehog Engine titles. The method in this add-on to achieve correct scaling can be reused for other Hedgehog Engine games stored in Havok animation formats.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    This page was last edited on 11 January &lt;br /&gt;
&lt;br /&gt;
[[Category:Animation]]&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PXD_Animation_Tools&amp;diff=1385</id>
		<title>PXD Animation Tools</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PXD_Animation_Tools&amp;diff=1385"/>
		<updated>2026-03-02T02:21:57Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Updated Page Title&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:PXD Animation Tools}}&lt;br /&gt;
&lt;br /&gt;
= PXD Animation Tools =&lt;br /&gt;
{{ToolInfobox|title=PXD Animation Tools|author=WistfulHopes, AdelQue, Turk645|website=https://github.com/WistfulHopes/FrontiersAnimDecompress|download=https://github.com/WistfulHopes/FrontiersAnimDecompress/releases/latest|image=FrontiersAnimDecompressPreview.gif}}&lt;br /&gt;
&lt;br /&gt;
[https://github.com/WistfulHopes/PXDAnimationTools PXD Animations Tools] (formerly known as &amp;quot;FrontiersAnimDecompress&amp;quot; and &amp;quot;Frontiers Animation Tools&amp;quot;) is a [https://www.blender.org/ Blender] add-on for importing and exporting animation ([[PXD|*.anm.pxd]]) and skeleton ([[PXD|*.skl.pxd]]) files from various Hedgehog Engine 2 games. The tool officially supports most Hedgehog Engine 2 titles including [[Mario &amp;amp; Sonic at the Tokyo 2020 Olympic Games]], [[Sonic Origins]], [[Sonic Frontiers]], and [[Shadow Generations]]. &lt;br /&gt;
&lt;br /&gt;
The add-on can currently perform compressed/uncompressed batch animation imports, compressed batch animation exports, skeleton reorientation, and officially supports Blender versions from 3.6 to 4.5 (as a legacy add-on in 4.2+). The add-on is Windows-only as it uses a DLL for [https://github.com/nfrechette/acl ACL] compression and decompression.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
The latest version of the tool at any point can be found [https://github.com/WistfulHopes/PXDAnimationTools/releases/latest/ here.] The add-on should be installed as a zip file without extraction.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Video: ===&lt;br /&gt;
A video tutorial for basic usage of the add-on can be found [https://youtu.be/sVKX8YvePZY here.]&lt;br /&gt;
&lt;br /&gt;
=== Text Overview: ===&lt;br /&gt;
A skeleton needs to be imported into the scene, and this skeleton must be selected in the viewport in order to import or export an animation. The add-on currently only reads bone indices from the animation file, so an animation can only be imported over the skeleton that it was originally made for. Batch functions can be found in the right ribbon of the viewport&#039;s sidebar, in the &amp;quot;PXD Animation&amp;quot; category under the &amp;quot;Animation&amp;quot; tab.&lt;br /&gt;
&lt;br /&gt;
As long as all the bones&#039; scale inheritance mode in your skeleton is set to &amp;quot;Aligned&amp;quot;, and any targets for scale-modifying constraints follow the same inheritance mode, the skeleton should generally export exactly as you see in the viewport.&lt;br /&gt;
&lt;br /&gt;
Per-animation settings (such as FPS and frame range) can be found in the &amp;quot;Action Editor&amp;quot; under the Dope Sheet editor. PXD specific settings may currently not show up for any animation that wasn&#039;t imported, or duplicated off of an imported animation.&lt;br /&gt;
&lt;br /&gt;
When exporting custom skeletons, ensure that all bone names only contain alphanumeric characters. With the exception of underscores &amp;quot;_&amp;quot;, any special characters (such as &amp;quot;.&amp;quot; commonly auto-added to many duplicated resources in Blender) in bone names may cause a crash in-game upon loading.&lt;br /&gt;
&lt;br /&gt;
In order to have a default game skeleton support mirroring in Blender, a skeleton must be imported using YX orientation (a togglable option in all import/export dialogues). If the skeleton is imported with this setting, all subsequent import/export operations from this add-on must enable YX orientation as well. If it is not properly called out, results in-game will not turn out as expected.&lt;br /&gt;
&lt;br /&gt;
During batch operations, Blender may freeze and become unresponsive. The external Blender console window can (and should) be open so you may view a readout of the import progress instead of assuming the program is crashing. It is not recommended to batch imports hundreds of animations at a time. Depending on your hardware, you may want to play with a group of about 50 at a time or maybe up to 200 if you have a higher end system. &lt;br /&gt;
&lt;br /&gt;
== History: ==&lt;br /&gt;
The PXD formats were first supported by Blender add-on scripts that allowed model importing and skeleton importing for the files first found in the 2020 Olympic game in Blender 2.82.&amp;lt;ref&amp;gt;https://github.com/Turk645/Hedgehog-Engine-2-Mesh-Blender-Importer&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From Origins onward, animation data was identified to be compressed by ACL. An application called &amp;quot;FrontiersAnimDecompress.exe&amp;quot; was later created, which was used to dump decompressed track data (labeled as *.outanim files) from these newly compressed formats.&amp;lt;ref&amp;gt;https://github.com/WistfulHopes/PXDAnimationTools/tree/c835209172b14468a07e5cae75d05fd4a595e35e&amp;lt;/ref&amp;gt; Included with the app were supplemental Blender scripts for importing from the dumped track data (modified from Turk645&#039;s original scripts), as well as custom scripts for exporting custom skeletons and raw track data that could later be recompressed.&lt;br /&gt;
&lt;br /&gt;
The application was eventually modified into a DLL, and supplemental scripts were rewritten as one packaged add-on, so standalone conversion was no longer necessary.&amp;lt;ref&amp;gt;https://github.com/AdelQue/FrontiersAnimDecompress/releases/tag/v2.0.0&amp;lt;/ref&amp;gt; Notable additions included batch processing, corrected scaling, skeleton reorientation for mirror support, and root motion.&lt;br /&gt;
&lt;br /&gt;
Handling of raw track data was recently found to be identical across all Hedgehog Engine titles. The method in this add-on to achieve correct scaling can be reused for other Hedgehog Engine games stored in Havok animation formats.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    This page was last edited on 11 January &lt;br /&gt;
&lt;br /&gt;
[[Category:Animation]]&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PXD_Animation_Tools&amp;diff=1384</id>
		<title>PXD Animation Tools</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PXD_Animation_Tools&amp;diff=1384"/>
		<updated>2026-03-02T02:20:24Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: More stuff&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= PXD Animation Tools =&lt;br /&gt;
{{ToolInfobox|title=PXD Animation Tools|author=WistfulHopes, AdelQue, Turk645|website=https://github.com/WistfulHopes/FrontiersAnimDecompress|download=https://github.com/WistfulHopes/FrontiersAnimDecompress/releases/latest|image=FrontiersAnimDecompressPreview.gif}}&lt;br /&gt;
&lt;br /&gt;
[https://github.com/WistfulHopes/PXDAnimationTools PXD Animations Tools] (formerly known as &amp;quot;FrontiersAnimDecompress&amp;quot; and &amp;quot;Frontiers Animation Tools&amp;quot;) is a [https://www.blender.org/ Blender] add-on for importing and exporting animation ([[PXD|*.anm.pxd]]) and skeleton ([[PXD|*.skl.pxd]]) files from various Hedgehog Engine 2 games. The tool officially supports most Hedgehog Engine 2 titles including [[Mario &amp;amp; Sonic at the Tokyo 2020 Olympic Games]], [[Sonic Origins]], [[Sonic Frontiers]], and [[Shadow Generations]]. &lt;br /&gt;
&lt;br /&gt;
The add-on can currently perform compressed/uncompressed batch animation imports, compressed batch animation exports, skeleton reorientation, and officially supports Blender versions from 3.6 to 4.5 (as a legacy add-on in 4.2+). The add-on is Windows-only as it uses a DLL for [https://github.com/nfrechette/acl ACL] compression and decompression.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
The latest version of the tool at any point can be found [https://github.com/WistfulHopes/PXDAnimationTools/releases/latest/ here.] The add-on should be installed as a zip file without extraction.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Video: ===&lt;br /&gt;
A video tutorial for basic usage of the add-on can be found [https://youtu.be/sVKX8YvePZY here.]&lt;br /&gt;
&lt;br /&gt;
=== Text Overview: ===&lt;br /&gt;
A skeleton needs to be imported into the scene, and this skeleton must be selected in the viewport in order to import or export an animation. The add-on currently only reads bone indices from the animation file, so an animation can only be imported over the skeleton that it was originally made for. Batch functions can be found in the right ribbon of the viewport&#039;s sidebar, in the &amp;quot;PXD Animation&amp;quot; category under the &amp;quot;Animation&amp;quot; tab.&lt;br /&gt;
&lt;br /&gt;
As long as all the bones&#039; scale inheritance mode in your skeleton is set to &amp;quot;Aligned&amp;quot;, and any targets for scale-modifying constraints follow the same inheritance mode, the skeleton should generally export exactly as you see in the viewport.&lt;br /&gt;
&lt;br /&gt;
Per-animation settings (such as FPS and frame range) can be found in the &amp;quot;Action Editor&amp;quot; under the Dope Sheet editor. PXD specific settings may currently not show up for any animation that wasn&#039;t imported, or duplicated off of an imported animation.&lt;br /&gt;
&lt;br /&gt;
When exporting custom skeletons, ensure that all bone names only contain alphanumeric characters. With the exception of underscores &amp;quot;_&amp;quot;, any special characters (such as &amp;quot;.&amp;quot; commonly auto-added to many duplicated resources in Blender) in bone names may cause a crash in-game upon loading.&lt;br /&gt;
&lt;br /&gt;
In order to have a default game skeleton support mirroring in Blender, a skeleton must be imported using YX orientation (a togglable option in all import/export dialogues). If the skeleton is imported with this setting, all subsequent import/export operations from this add-on must enable YX orientation as well. If it is not properly called out, results in-game will not turn out as expected.&lt;br /&gt;
&lt;br /&gt;
During batch operations, Blender may freeze and become unresponsive. The external Blender console window can (and should) be open so you may view a readout of the import progress instead of assuming the program is crashing. It is not recommended to batch imports hundreds of animations at a time. Depending on your hardware, you may want to play with a group of about 50 at a time or maybe up to 200 if you have a higher end system. &lt;br /&gt;
&lt;br /&gt;
== History: ==&lt;br /&gt;
The PXD formats were first supported by Blender add-on scripts that allowed model importing and skeleton importing for the files first found in the 2020 Olympic game in Blender 2.82.&amp;lt;ref&amp;gt;https://github.com/Turk645/Hedgehog-Engine-2-Mesh-Blender-Importer&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From Origins onward, animation data was identified to be compressed by ACL. An application called &amp;quot;FrontiersAnimDecompress.exe&amp;quot; was later created, which was used to dump decompressed track data (labeled as *.outanim files) from these newly compressed formats.&amp;lt;ref&amp;gt;https://github.com/WistfulHopes/PXDAnimationTools/tree/c835209172b14468a07e5cae75d05fd4a595e35e&amp;lt;/ref&amp;gt; Included with the app were supplemental Blender scripts for importing from the dumped track data (modified from Turk645&#039;s original scripts), as well as custom scripts for exporting custom skeletons and raw track data that could later be recompressed.&lt;br /&gt;
&lt;br /&gt;
The application was eventually modified into a DLL, and supplemental scripts were rewritten as one packaged add-on, so standalone conversion was no longer necessary.&amp;lt;ref&amp;gt;https://github.com/AdelQue/FrontiersAnimDecompress/releases/tag/v2.0.0&amp;lt;/ref&amp;gt; Notable additions included batch processing, corrected scaling, skeleton reorientation for mirror support, and root motion.&lt;br /&gt;
&lt;br /&gt;
Handling of raw track data was recently found to be identical across all Hedgehog Engine titles. The method in this add-on to achieve correct scaling can be reused for other Hedgehog Engine games stored in Havok animation formats.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    This page was last edited on 11 January &lt;br /&gt;
&lt;br /&gt;
[[Category:Animation]]&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Skeletal_Animation_Editing&amp;diff=619</id>
		<title>Skeletal Animation Editing</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Skeletal_Animation_Editing&amp;diff=619"/>
		<updated>2025-06-04T02:59:47Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is an introductory page that will describe how to edit skeletal animations from Hedgehog Engine 2 games that utilize the &amp;lt;code&amp;gt;.pxd&amp;lt;/code&amp;gt; file formats. &lt;br /&gt;
&lt;br /&gt;
=== Required Tools ===&lt;br /&gt;
&lt;br /&gt;
* [https://www.blender.org/ Blender] &lt;br /&gt;
&lt;br /&gt;
* [https://github.com/WistfulHopes/FrontiersAnimDecompress/ PXD Animation Tools add-on for Blender]&lt;br /&gt;
* [https://hedge-dev.github.io/HedgehogEngineBlenderIO/index.html Hedgehog Engine I/O extension for Blender] &amp;lt;small&amp;gt;(for having a model to animate with)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
==== Blender ====&lt;br /&gt;
&lt;br /&gt;
* Download and run the setup executable of the latest supported version of Blender (version 4.4.x as of this wiki page) from either the [https://www.blender.org/download/ official site] or from the [https://store.steampowered.com/app/365670/Blender/ official Steam page] if you&#039;d like to stay automatically updated.&lt;br /&gt;
&lt;br /&gt;
==== PXD Animation Tools ====&lt;br /&gt;
&lt;br /&gt;
* Download &amp;lt;code&amp;gt;PXDAnimationTools.zip&amp;lt;/code&amp;gt; from the tool&#039;s [https://github.com/WistfulHopes/PXDAnimationTools/releases/latest/ latest GitHub release page.]&lt;br /&gt;
&lt;br /&gt;
* Run Blender.&lt;br /&gt;
* In the upper left corner, navigate to &amp;lt;code&amp;gt;Edit &amp;gt; Preferences...&amp;lt;/code&amp;gt;&lt;br /&gt;
* On the left pane of the preferences window, select the &amp;lt;code&amp;gt;Add-ons&amp;lt;/code&amp;gt; tab.&lt;br /&gt;
* In the upper-right side of the window, select the &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; shaped drop-down button, then select &amp;lt;code&amp;gt;Install from disk...&amp;lt;/code&amp;gt;&lt;br /&gt;
* Navigate to and select the downloaded &amp;lt;code&amp;gt;PXDAnimationTools.zip&amp;lt;/code&amp;gt; file, then click the &amp;lt;code&amp;gt;Install from Disk&amp;lt;/code&amp;gt; button.&lt;br /&gt;
* You should now see an add-on entry for &amp;lt;code&amp;gt;Hedgehog Engine PXD Animation Tools&amp;lt;/code&amp;gt; with a ticked checkbox to the left.&lt;br /&gt;
* The tool is now installed, and the preferences window may now be closed.&lt;br /&gt;
&lt;br /&gt;
==== Hedgehog Engine I/O ====&lt;br /&gt;
&lt;br /&gt;
* Please see the [https://hedge-dev.github.io/HedgehogEngineBlenderIO/getting_started/installation.html#installing-the-addon dedicated installation page for HEIO.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:PXD Animation Editing}}&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Skeletal_Animation_Editing&amp;diff=618</id>
		<title>Skeletal Animation Editing</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Skeletal_Animation_Editing&amp;diff=618"/>
		<updated>2025-06-04T02:59:37Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is an introductory page that will describe how to edit skeletal animations from Hedgehog Engine 2 games that utilize the &amp;lt;code&amp;gt;.pxd&amp;lt;/code&amp;gt; file formats. &lt;br /&gt;
&lt;br /&gt;
=== Required Tools: ===&lt;br /&gt;
&lt;br /&gt;
* [https://www.blender.org/ Blender] &lt;br /&gt;
&lt;br /&gt;
* [https://github.com/WistfulHopes/FrontiersAnimDecompress/ PXD Animation Tools add-on for Blender]&lt;br /&gt;
* [https://hedge-dev.github.io/HedgehogEngineBlenderIO/index.html Hedgehog Engine I/O extension for Blender] &amp;lt;small&amp;gt;(for having a model to animate with)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
==== Blender ====&lt;br /&gt;
&lt;br /&gt;
* Download and run the setup executable of the latest supported version of Blender (version 4.4.x as of this wiki page) from either the [https://www.blender.org/download/ official site] or from the [https://store.steampowered.com/app/365670/Blender/ official Steam page] if you&#039;d like to stay automatically updated.&lt;br /&gt;
&lt;br /&gt;
==== PXD Animation Tools ====&lt;br /&gt;
&lt;br /&gt;
* Download &amp;lt;code&amp;gt;PXDAnimationTools.zip&amp;lt;/code&amp;gt; from the tool&#039;s [https://github.com/WistfulHopes/PXDAnimationTools/releases/latest/ latest GitHub release page.]&lt;br /&gt;
&lt;br /&gt;
* Run Blender.&lt;br /&gt;
* In the upper left corner, navigate to &amp;lt;code&amp;gt;Edit &amp;gt; Preferences...&amp;lt;/code&amp;gt;&lt;br /&gt;
* On the left pane of the preferences window, select the &amp;lt;code&amp;gt;Add-ons&amp;lt;/code&amp;gt; tab.&lt;br /&gt;
* In the upper-right side of the window, select the &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; shaped drop-down button, then select &amp;lt;code&amp;gt;Install from disk...&amp;lt;/code&amp;gt;&lt;br /&gt;
* Navigate to and select the downloaded &amp;lt;code&amp;gt;PXDAnimationTools.zip&amp;lt;/code&amp;gt; file, then click the &amp;lt;code&amp;gt;Install from Disk&amp;lt;/code&amp;gt; button.&lt;br /&gt;
* You should now see an add-on entry for &amp;lt;code&amp;gt;Hedgehog Engine PXD Animation Tools&amp;lt;/code&amp;gt; with a ticked checkbox to the left.&lt;br /&gt;
* The tool is now installed, and the preferences window may now be closed.&lt;br /&gt;
&lt;br /&gt;
==== Hedgehog Engine I/O ====&lt;br /&gt;
&lt;br /&gt;
* Please see the [https://hedge-dev.github.io/HedgehogEngineBlenderIO/getting_started/installation.html#installing-the-addon dedicated installation page for HEIO.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:PXD Animation Editing}}&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Skeletal_Animation_Editing&amp;diff=617</id>
		<title>Skeletal Animation Editing</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Skeletal_Animation_Editing&amp;diff=617"/>
		<updated>2025-06-04T02:59:13Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Created page with &amp;quot;This page is an introductory page that will describe how to edit skeletal animations from Hedgehog Engine 2 games that utilize the &amp;lt;code&amp;gt;.pxd&amp;lt;/code&amp;gt; file formats.   === Required Tools: ===  * [https://www.blender.org/ Blender]   * [https://github.com/WistfulHopes/FrontiersAnimDecompress/ PXD Animation Tools add-on for Blender] * [https://hedge-dev.github.io/HedgehogEngineBlenderIO/index.html Hedgehog Engine I/O extension for Blender] &amp;lt;small&amp;gt;(for having a model to animate...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is an introductory page that will describe how to edit skeletal animations from Hedgehog Engine 2 games that utilize the &amp;lt;code&amp;gt;.pxd&amp;lt;/code&amp;gt; file formats. &lt;br /&gt;
&lt;br /&gt;
=== Required Tools: ===&lt;br /&gt;
&lt;br /&gt;
* [https://www.blender.org/ Blender] &lt;br /&gt;
&lt;br /&gt;
* [https://github.com/WistfulHopes/FrontiersAnimDecompress/ PXD Animation Tools add-on for Blender]&lt;br /&gt;
* [https://hedge-dev.github.io/HedgehogEngineBlenderIO/index.html Hedgehog Engine I/O extension for Blender] &amp;lt;small&amp;gt;(for having a model to animate with)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation: ===&lt;br /&gt;
&lt;br /&gt;
==== Blender: ====&lt;br /&gt;
&lt;br /&gt;
* Download and run the setup executable of the latest supported version of Blender (version 4.4.x as of this wiki page) from either the [https://www.blender.org/download/ official site] or from the [https://store.steampowered.com/app/365670/Blender/ official Steam page] if you&#039;d like to stay automatically updated.&lt;br /&gt;
&lt;br /&gt;
==== PXD Animation Tools: ====&lt;br /&gt;
&lt;br /&gt;
* Download &amp;lt;code&amp;gt;PXDAnimationTools.zip&amp;lt;/code&amp;gt; from the tool&#039;s [https://github.com/WistfulHopes/PXDAnimationTools/releases/latest/ latest GitHub release page.]&lt;br /&gt;
&lt;br /&gt;
* Run Blender.&lt;br /&gt;
* In the upper left corner, navigate to &amp;lt;code&amp;gt;Edit &amp;gt; Preferences...&amp;lt;/code&amp;gt;&lt;br /&gt;
* On the left pane of the preferences window, select the &amp;lt;code&amp;gt;Add-ons&amp;lt;/code&amp;gt; tab.&lt;br /&gt;
* In the upper-right side of the window, select the &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; shaped drop-down button, then select &amp;lt;code&amp;gt;Install from disk...&amp;lt;/code&amp;gt;&lt;br /&gt;
* Navigate to and select the downloaded &amp;lt;code&amp;gt;PXDAnimationTools.zip&amp;lt;/code&amp;gt; file, then click the &amp;lt;code&amp;gt;Install from Disk&amp;lt;/code&amp;gt; button.&lt;br /&gt;
* You should now see an add-on entry for &amp;lt;code&amp;gt;Hedgehog Engine PXD Animation Tools&amp;lt;/code&amp;gt; with a ticked checkbox to the left.&lt;br /&gt;
* The tool is now installed, and the preferences window may now be closed.&lt;br /&gt;
&lt;br /&gt;
==== Hedgehog Engine I/O: ====&lt;br /&gt;
&lt;br /&gt;
* Please see the [https://hedge-dev.github.io/HedgehogEngineBlenderIO/getting_started/installation.html#installing-the-addon dedicated installation page for HEIO.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:PXD Animation Editing}}&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Sonic_Frontiers&amp;diff=616</id>
		<title>Sonic Frontiers</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Sonic_Frontiers&amp;diff=616"/>
		<updated>2025-06-04T02:30:48Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tools ==&lt;br /&gt;
&lt;br /&gt;
=== Animation ===&lt;br /&gt;
* [[Frontiers Animation Tools]]&lt;br /&gt;
&lt;br /&gt;
== Guides ==&lt;br /&gt;
&lt;br /&gt;
=== Animation ===&lt;br /&gt;
&lt;br /&gt;
* [[Skeletal Animation Editing|Skeletal Animation Editing: Introduction]]&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== Game ===&lt;br /&gt;
* [[Sonic Frontiers DLCs|DLCs]]&lt;br /&gt;
* [[Sonic Frontiers Stage IDs|Stage IDs]]&lt;br /&gt;
* [[Sonic Frontiers Enemy Internal Names|Enemy Internal Names]]&lt;br /&gt;
* [[Sonic Frontiers Script Functions|Script Functions]]&lt;br /&gt;
&lt;br /&gt;
=== File Formats ===&lt;br /&gt;
* [[Sonic Frontiers RFL|Reflection Data]] (.rfl)&lt;br /&gt;
&lt;br /&gt;
=== Objects ===&lt;br /&gt;
* [[Sonic Frontiers Gismos|Gismos]]&lt;br /&gt;
&lt;br /&gt;
== Discoveries ==&lt;br /&gt;
N/A&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PXD&amp;diff=497</id>
		<title>PXD</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PXD&amp;diff=497"/>
		<updated>2025-04-16T23:55:48Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Corrected Olympic game&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=This page is unfinished.}}&lt;br /&gt;
&lt;br /&gt;
== PXD Files ==&lt;br /&gt;
Hedgehog Engine 2 games from [[Mario &amp;amp; Sonic at the Tokyo 2020 Olympic Games|Tokyo 2020 Olympic Games]] to [[Shadow Generations]] contain skeleton and skeletal animation files with the file extensions &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; respectively, stored in a [[BINA]] container. Skeletons contain pose data that usually result in a T-Pose, bone and parent indices, and bone names. Animations contain playback metadata such as frame rate and frame count, track count, and either compressed animation pose data using [https://github.com/nfrechette/acl ACL compression,] or raw uncompressed pose data that use bone and frame indices to specify keyframed transforms, with linear interpolation between keyframes. For both skeletons and animations, position and rotation data for each bone is an absolute transform relative to the parent position, whereas scales are inherited from their respective parents locally, and have no effect on their positions. &lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Animation files are stored in a [[BINA]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt; identified as &amp;lt;code&amp;gt;PXAN&amp;lt;/code&amp;gt;, possibly for &amp;quot;PXD Animation&amp;quot; or similar:&lt;br /&gt;
&lt;br /&gt;
=== PXAN Header ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct Header {&lt;br /&gt;
	char[4] magic;		// &#039;NAXP&#039;&lt;br /&gt;
	uint32_t version;	// Always 0x200&lt;br /&gt;
	uint8_t additive;	// 0x01 if additive, else 0x00&lt;br /&gt;
	uint8_t compressed;	// 0x08 if ACL compressed, 0x00 if uncompressed&lt;br /&gt;
	char[6];			// Null alignment to 8 bytes&lt;br /&gt;
	uint64_t metadata_offset;	// Offset to metadata, always 0x18&lt;br /&gt;
	float duration;				// Duration of the animation in seconds, calculated as ((frame_count - 1) / FPS)&lt;br /&gt;
	uint32_t frame_count;	&lt;br /&gt;
	uint32_t track_count;		// Bone count&lt;br /&gt;
	uint64_t skel_anim_offset;	// Offset for character&#039;s skeletal animation, always 0x40 if compressed, 0x38 if uncompressed&lt;br /&gt;
	uint64_t root_anim_offset;	// Offset for root motion animation, 0x00 if no root motion is present, aligned to 16 bytes&lt;br /&gt;
	if (compressed == 0x08)&lt;br /&gt;
	char[8];		// Null alignment to 0x10 bytes for ACL data. &lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ACL Data: ===&lt;br /&gt;
All Hedgehog Engine 2 games that utilize the ACL library appear to use v2.0.0, first seen in [[Sonic Origins]], and unchanged in any implementation since then. [https://github.com/nfrechette/acl/tree/a54c5c2781be9f14b840a60f8dd8ec6c5065885d/docs See the ACL docs for more info.] If &amp;lt;code&amp;gt;compressed == 0x08&amp;lt;/code&amp;gt;, skeletal animations and root motion animations are compressed. &lt;br /&gt;
&lt;br /&gt;
==== Compressed Data: ====&lt;br /&gt;
Below is a high level overview of the stored ACL chunk data:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct ACLData {&lt;br /&gt;
	uint32_t acl_chunk_size;&lt;br /&gt;
	int32_t acl_hash;&lt;br /&gt;
&lt;br /&gt;
	uint32_t acl_tag;		// Identifies ACL buffer type, always 0xAC11AC11 to mark compressed_tracks&lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/buffer_tag.h#L49&lt;br /&gt;
&lt;br /&gt;
	uint16_t acl_version;	// ACL Version Enum Identifier. 0x07 indicates v2.0.0, the only version observed in any HE2 game.&lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/compressed_tracks_version.h#L71&lt;br /&gt;
&lt;br /&gt;
	char acl_padding;		// always 0x00&lt;br /&gt;
	uint8_t acl_track_type;	// ACL Track Type Enum. 0x0C indicates qvvf, the only track type observed in any HE2 game. &lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/track_types.h#L68&lt;br /&gt;
&lt;br /&gt;
	uint32_t track_count;	// Bone count if skeletal animation, 0x01 if root motion. Should match header track_count if skeletal. &lt;br /&gt;
	uint32_t sample_count;	// Frame count, should match header frame_count.&lt;br /&gt;
	float32 sample_rate;	// Playback FPS of animation, should equal header ((frame_count - 1) / duration)&lt;br /&gt;
	char[acl_chunk_size - 0x1C] acl_data;   // String of compressed ACL data&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;At the end of an ACL chunk, if it is a skeletal animation chunk and root motion is present in the file, the chunk will be null padded to 16 bytes. If the ACL chunk is a root motion chunk or a skeletal animation with no associated root motion chunk in the file, the chunk will be null padded to 4 bytes. The last ACL chunk is immediately followed by the BINA offset table. &lt;br /&gt;
&lt;br /&gt;
==== Raw/Decompressed Track List: ====&lt;br /&gt;
The index lookup for which transform set belongs to which bone can be found in the skeleton file [[PXD#.skl.pxd Structure|(see .skl.pxd Structure)]]. Each bone uses an [https://github.com/nfrechette/rtm RTM] [https://github.com/nfrechette/rtm/blob/7c9a61e32744ee9ff2978328d0e585635fd55615/includes/rtm/types.h#L393 qvvf] struct for transformation. Though the &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; element of each vector has no bearing on the final animation, the games usually store a value in there anyways and appears to have an effect on compression:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct qvvf&lt;br /&gt;
{&lt;br /&gt;
	quatf rotation;			// XYZW Quaternion&lt;br /&gt;
	vector4f translation;	// XYZW Vector, W is undefined but appears to be bone length&lt;br /&gt;
	vector4f scale;			// XYZW Vector, W is undefined and always 1.0&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Native Uncompressed Data: ===&lt;br /&gt;
{{Notice|type=note|content=This section could use a less confusing explanation.}}&lt;br /&gt;
Alternatively to compressed ACL track data, the PXAN structure can store individual components (rotation, translation, scale) of any given track at any frame, and linearly interpolate between them independently. This system was first seen in the [[Mario &amp;amp; Sonic at the Rio 2016 Olympic Games|M&amp;amp;S Tokyo 2020 Olympic Games]] as the exclusive method of storing animations. ACL compression may have an advantage in reducing the file size of many of these animations but—though rare—uncompressed animations have been observed in subsequent games for certain animations, presumably to combat any potential jitter during close up cutscenes or similar situations. Though the actual end data contained in this method is simple, the structure can end up like a spider&#039;s nest at first glance:&lt;br /&gt;
&lt;br /&gt;
==== Track Offset Tables: ====&lt;br /&gt;
The first struct array found in the file is a track table for each bone. Within it, for each transform type (translation, rotation, scale), there is a keyframe count, offset pointing to a frame table, and offset pointing to an array of transforms. &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct TrackTableOffsets {&lt;br /&gt;
	uint64_t pos_key_count;			// Total number of translation keyframes for this bone&lt;br /&gt;
	uint64_t pos_table_offset;		// Offset for this bone&#039;s translation frame table&lt;br /&gt;
	uint64_t pos_values_offset;		// Starting offset for this bone&#039;s array of translation values&lt;br /&gt;
&lt;br /&gt;
	uint64_t rot_key_count;			// Total number of rotation keyframes for this bone&lt;br /&gt;
	uint64_t rot_table_offset;		// Offset for this bone&#039;s rotation frame table&lt;br /&gt;
	uint64_t rot_values_offset;		// Starting offset for this bone&#039;s array of rotation values&lt;br /&gt;
&lt;br /&gt;
	uint64_t scale_key_count;		// Total number of scale keyframes for this bone&lt;br /&gt;
	uint64_t scale_table_offset;	// Offset for this bone&#039;s scale frame table&lt;br /&gt;
	uint64_t scale_values_offset;	// Starting offset for this bone&#039;s array of scale values&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
TrackTableOffsets TrackTables[track_count];		// One for each bone, track_count from PXAN header&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Frame Tables and Transforms: ====&lt;br /&gt;
Each transform type will get a frame table as &amp;lt;code&amp;gt;uint16_t[key_count] keys;&amp;lt;/code&amp;gt; where each value is the frame that the keyframe will be inserted to, and transform array &amp;lt;code&amp;gt;vector4f[key_count] transforms; // XYZW floats&amp;lt;/code&amp;gt; that will correspond to the frame with the matching array index. Unlike in ACL decompressed tracks, native uncompressed tracks&#039; &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; component for translation and scale is always &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;. Both of these element arrays will be null aligned to 16 bytes.&lt;br /&gt;
&lt;br /&gt;
==== Posing and Transform Inheritance: ====&lt;br /&gt;
Each bone&#039;s transformation is stored as an object space (AKA &#039;Pose Space&#039; or &#039;Model Space&#039;) transform relative to its parent bone&#039;s final transformation. That means, regardless of what the reset pose or bone orientations are in the model&#039;s skeleton, the stored values of any given frame will completely overwrite any pose previously present. &lt;br /&gt;
&lt;br /&gt;
However, there are two quirks that are unlike most interchange formats for 3D animations:&lt;br /&gt;
&lt;br /&gt;
# Scale inheritance is a simple local space copy of the parent&#039;s local space scale. There is no shearing or skewing of any kind.&lt;br /&gt;
#* &amp;lt;sub&amp;gt;In Blender, a bone&#039;s scale inheritance mode can be changed from `Full` to `Aligned` to achieve this effect&amp;lt;/sub&amp;gt;&lt;br /&gt;
# Calculating the position and rotation of any given bone is to be done independent of any scale values.&lt;br /&gt;
&lt;br /&gt;
When reading in-game, though scales from recursive parents are inherited and multiplied, translation is completely unaffected in any capacity, unintuitively. Therefore, before applying any object space transformation in a setting where parent scale is assumed to affect the child bone&#039;s location, each bone&#039;s final scale must be calculated and applied by multiplying its and each recursive parent&#039;s scales together. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Trivia&#039;&#039;&#039;: &#039;&#039;The inheritance and relationships behavior for bone transform values have been found to be identical to all previous HE games that used Havok, possibly indicating that Sonic Team&#039;s custom implementation of animation playback and posing is loosely based on Havok&#039;s &amp;lt;code&amp;gt;hka&amp;lt;/code&amp;gt; functions.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Skeleton files are stored in a [[BINA]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;lt;sub&amp;gt;TODO...&amp;lt;/sub&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Thanks ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/Turk645 Turk645:] Original uncompressed PXD blender importer scripts&lt;br /&gt;
* [https://github.com/WistfulHopes WistfulHopes:] ACL tools, blender export scripts&lt;br /&gt;
* [https://github.com/ik-01 ik-01]: Format and game code research, filling in gaps for unknown values&lt;br /&gt;
* [https://github.com/AdelQue AdelQue:] Format research, math relations and bone inheritance behaviors&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PBA&amp;diff=493</id>
		<title>PBA</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PBA&amp;diff=493"/>
		<updated>2025-04-12T07:54:06Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=WIP Page, just adding to start}}&lt;br /&gt;
[[File:PBA cloth demonstration.gif|alt=Depicted in Blender using built-in cloth simulation, and bones constrained to corresponding vertex group|thumb|&amp;lt;code&amp;gt;chr_sage.pba&amp;lt;/code&amp;gt; contains a node for a cloth mesh made up of only vertices and edges, interconnected in such a way to maintain shape with internal springs|325x325px]]&lt;br /&gt;
Physics Based Animation ( &amp;lt;code&amp;gt;.pba&amp;lt;/code&amp;gt; ) files are bone physics files first found in [[Sonic Frontiers]], and first regularly used in [[Shadow Generations|Shadow Generations.]] The system is capable of using bouncy bones/jiggle physics, rag-doll physics, and cloth simulation. The format is still relatively unknown and has only been brute forced through hex analysis more than code analysis, and there are unfortunately not many examples files to reference. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+List of known PBA file examples&lt;br /&gt;
!Game&lt;br /&gt;
!Filename&lt;br /&gt;
!Description&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|rangers&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_big.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Big&#039;s fishing line and lure&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|rangers&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_knucklesdrill.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Knuckles&#039; drill tail&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|rangers&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_kodama01.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Plant toppers on Koco variants&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|rangers&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_sage.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Dress cloth physics and self collisions with legs&lt;br /&gt;
|Unused. This is the only known file with a cloth node, and unknown if self collisions were ever in a working state when ported to Shadow Generations&lt;br /&gt;
|-&lt;br /&gt;
|rangers&lt;br /&gt;
|&amp;lt;code&amp;gt;enm_wolf01.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Wolf tail&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|rangers&lt;br /&gt;
|&amp;lt;code&amp;gt;mbo_tracker01.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Tracker&#039;s brain stem&lt;br /&gt;
|Only used PBA file in Frontiers&lt;br /&gt;
|-&lt;br /&gt;
|miller&lt;br /&gt;
|&amp;lt;code&amp;gt;bos_metaloverload.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Metal Overlord&#039;s pipes/tubes&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|miller&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_big.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Big&#039;s fishing line, hook and lure&lt;br /&gt;
|Has collision and more bones than Frontiers version&lt;br /&gt;
|-&lt;br /&gt;
|miller&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_shadow.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Shadow&#039;s head quills&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|miller&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_shadow_dameba.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Ameba Doom Morph&#039;s tentacles and legs&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|miller&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_shadow_dwing.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Doom Wings entirety&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|miller&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_terios.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Terios&#039;s head quills&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Binary Structure ==&lt;br /&gt;
TODO: Decipher, clean up, explain 0_0 might have lots of wrong info!&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//------------------------------------------------&lt;br /&gt;
//--- 010 Editor v12.0.1 Binary Template&lt;br /&gt;
//&lt;br /&gt;
//      File: &lt;br /&gt;
//   Authors: Ashrindy, AdelQ&lt;br /&gt;
//   Version: 0.0.1&lt;br /&gt;
//   Purpose: Shadow Gens PhysicalSkeleton&lt;br /&gt;
//  Category: &lt;br /&gt;
// File Mask: *.pba&lt;br /&gt;
//  ID Bytes: &lt;br /&gt;
//   History: &lt;br /&gt;
//------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;../include.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local uint64 dataPos;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    Vector4 rows[4];&lt;br /&gt;
}Matrix4x4&amp;lt;optimize=false&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    byte UnkB1; // Always 2 or 1, unknown flag&lt;br /&gt;
    byte UnkB2; // Always 0 or 1, unknown flag&lt;br /&gt;
    byte UnkB3[2];  // Padding?&lt;br /&gt;
    float Unk_f[4];    // Upper/Lower limits of something?&lt;br /&gt;
}LimitsStruct&amp;lt;optimize=false&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset BoneName;&lt;br /&gt;
    int unk; // if this is related to collision, this could be an enum for the collision shape&lt;br /&gt;
    float unk2; // Physics dampening? Lower values make bones wobble for longer&lt;br /&gt;
    Matrix4x4 mat;  // Most likely not a matrix, has parameters that affect gravity, stretch, etc, and possibly capsule/collision bounds(?) but still working through&lt;br /&gt;
}CollisionStruct&amp;lt;optimize=false&amp;gt;;   // Has params that affect physics intensity still, maybe general physics&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset BoneName;&lt;br /&gt;
    byte Unk1[4]; // All known examples are 01 01 14 00. could be bitflags by the looks of it&lt;br /&gt;
    int16 LocalParentBoneIndex;    // FF FF if no bone parent&lt;br /&gt;
    int16 LocalBoneIndex;&lt;br /&gt;
    int16 RealParentBoneIndex; // Usually the parent of this bone on the real skeleton, but can be any bone in practice. Perhaps a reference for the offset transform?&lt;br /&gt;
    int16 Unk3;&lt;br /&gt;
    LimitsStruct Limits[6]; // Unknown what these limits line up to (Pos to Neg X, Pos to Neg Y, etc)&lt;br /&gt;
    float Unk4&amp;lt;hidden=true&amp;gt;; // Align&lt;br /&gt;
    Matrix4x4 mat;  // Possibly bone offset matrix relative to RealParentBoneIndex? A: Two quaternions in row 2 and 4?&lt;br /&gt;
}&lt;br /&gt;
JiggleStruct&amp;lt;optimize=false&amp;gt;; // Handles bone chain relations for bendy/jiggle physics, as well as presumably transform limits&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    // Starting point needs to align to 16 bytes&lt;br /&gt;
    local uint64 CurPos = FTell();&lt;br /&gt;
    local uint64 AlignCheck = CurPos % 0x10;&lt;br /&gt;
    if (AlignCheck)&lt;br /&gt;
        FSeek(CurPos + 0x10 - AlignCheck);&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset BoneName;&lt;br /&gt;
    float unk0; // All known examples = 0.01&lt;br /&gt;
    int16 unk1&amp;lt;hidden=true&amp;gt;; // Always FF FF&lt;br /&gt;
    int16 if_pinned;    // 1 if no parent present. Possibly this bone controls corresponding vertex if 1, versus vertex controls cooresponding bone if 0&lt;br /&gt;
    int16 child_idx;    // FF if no child&lt;br /&gt;
    int16 parent_idx;   // FF if no parent&lt;br /&gt;
    int16 unk2[2]&amp;lt;hidden=true&amp;gt;;  // Always FF FF&lt;br /&gt;
    int16 left_idx;&lt;br /&gt;
    int16 right_idx;&lt;br /&gt;
}cloth_node&amp;lt;optimize=false&amp;gt;;    // Defines up to 4 neighboring bones in a cloth bone grid&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    int16 verts[2];&lt;br /&gt;
    float edge_length;&lt;br /&gt;
    float unk_factor;   // Normalized, lateral direct connections = 0.5, lateral skip connections = 0.3, vertical direct connections = 1.0. Maybe a stretch/shrink factor?&lt;br /&gt;
}cloth_edges&amp;lt;optimize=false&amp;gt;;   // Cloth sim edge mesh&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset cloth_name;&lt;br /&gt;
    float unk1[10];&lt;br /&gt;
    int16 unk_count1[2];&lt;br /&gt;
    int32 cloth_node_count;&lt;br /&gt;
    int32 cloth_edge_count;&lt;br /&gt;
    int32 unk3&amp;lt;hidden=true&amp;gt;; // Align&lt;br /&gt;
    int64 cloth_node_ptr;&lt;br /&gt;
    int64 cloth_edge_ptr;&lt;br /&gt;
    local int64 prePos = FTell();&lt;br /&gt;
    FSeek(cloth_node_ptr + dataPos);&lt;br /&gt;
    cloth_node bones[cloth_node_count];&lt;br /&gt;
    FSeek(cloth_edge_ptr + dataPos);&lt;br /&gt;
    cloth_edges edges[cloth_edge_count];&lt;br /&gt;
    FSeek(prePos);&lt;br /&gt;
}ClothStruct&amp;lt;optimize=false&amp;gt;;   &lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    char signature[4]&amp;lt;name=&amp;quot;Signature&amp;quot;&amp;gt;;&lt;br /&gt;
    int version &amp;lt;format=hex, name=&amp;quot;Version&amp;quot;&amp;gt;;&lt;br /&gt;
    StringOffset SkeletonName;&lt;br /&gt;
    uint32 CollisionCount;&lt;br /&gt;
    uint32 JiggleCount;&lt;br /&gt;
    uint64 CollisionOffset;&lt;br /&gt;
    uint64 JiggleOffset;&lt;br /&gt;
    uint32 ClothCount;&lt;br /&gt;
    uint32 UnkCount;&lt;br /&gt;
    uint64 ClothOffset;&lt;br /&gt;
    uint64 UnkOffset;&lt;br /&gt;
    FSeek(CollisionOffset + dataPos);&lt;br /&gt;
    CollisionStruct CollisionStructs[CollisionCount];&lt;br /&gt;
    FSeek(JiggleOffset + dataPos);&lt;br /&gt;
    JiggleStruct JiggleStructs[JiggleCount];&lt;br /&gt;
    FSeek(ClothOffset + dataPos);&lt;br /&gt;
    ClothStruct ClothStructs[ClothCount];&lt;br /&gt;
}&lt;br /&gt;
ResPhysicalSkeleton&amp;lt;open=true&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
ResBinaryFile file(&amp;quot;ResPhysicalSkeleton&amp;quot;)&amp;lt;name=Str(&amp;quot;%s&amp;quot;, FileNameGetBase(GetFileName()))&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PBA&amp;diff=492</id>
		<title>PBA</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PBA&amp;diff=492"/>
		<updated>2025-04-12T07:53:31Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=WIP Page, just adding to start}}&lt;br /&gt;
[[File:PBA cloth demonstration.gif|alt=Depicted in Blender using built-in cloth simulation, and bones constrained to corresponding vertex group|thumb|&amp;lt;code&amp;gt;chr_sage.pba&amp;lt;/code&amp;gt; contains a node for a cloth mesh made up of only vertices and edges, interconnected in such a way to maintain shape with internal springs|325x325px]]&lt;br /&gt;
Physics Based Animation ( &amp;lt;code&amp;gt;.pba&amp;lt;/code&amp;gt; ) files are bone physics files first found in [[Sonic Frontiers]], and first regularly used in [[Shadow Generations|Shadow Generations.]] The system is capable of using bouncy bones/jiggle physics, rag-doll physics, and cloth simulation. The format is still relatively unknown and has only been brute forced through hex analysis more than code analysis, and there are unfortunately not many examples files to reference. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
|+List of known PBA file examples&lt;br /&gt;
!Game&lt;br /&gt;
!Filename&lt;br /&gt;
!Description&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|rangers&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_big.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Big&#039;s fishing line and lure&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|rangers&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_knucklesdrill.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Knuckles&#039; drill tail&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|rangers&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_kodama01.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Plant toppers on Koco variants&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|rangers&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_sage.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Dress cloth physics and self collisions with legs&lt;br /&gt;
|Unused. This is the only known file with a cloth node, and unknown if self collisions were ever in a working state when ported to Shadow Generations&lt;br /&gt;
|-&lt;br /&gt;
|rangers&lt;br /&gt;
|&amp;lt;code&amp;gt;enm_wolf01.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Wolf tail&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|rangers&lt;br /&gt;
|&amp;lt;code&amp;gt;mbo_tracker01.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Tracker&#039;s brain stem&lt;br /&gt;
|Only used PBA file in Frontiers&lt;br /&gt;
|-&lt;br /&gt;
|miller&lt;br /&gt;
|&amp;lt;code&amp;gt;bos_metaloverload.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Metal Overlord&#039;s pipes/tubes&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|miller&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_big.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Big&#039;s fishing line, hook and lure&lt;br /&gt;
|Has collision and more bones than Frontiers version&lt;br /&gt;
|-&lt;br /&gt;
|miller&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_shadow.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Shadow&#039;s head quills&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|miller&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_shadow_dameba.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Ameba Doom Morph&#039;s tentacles and legs&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|miller&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_shadow_dwing.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Doom Wings entirety&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|miller&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_terios.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Terios&#039;s head quills&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Binary Structure ==&lt;br /&gt;
TODO: Decipher, clean up, explain 0_0 might have lots of wrong info!&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//------------------------------------------------&lt;br /&gt;
//--- 010 Editor v12.0.1 Binary Template&lt;br /&gt;
//&lt;br /&gt;
//      File: &lt;br /&gt;
//   Authors: Ashrindy, AdelQ&lt;br /&gt;
//   Version: 0.0.1&lt;br /&gt;
//   Purpose: Shadow Gens PhysicalSkeleton&lt;br /&gt;
//  Category: &lt;br /&gt;
// File Mask: *.pba&lt;br /&gt;
//  ID Bytes: &lt;br /&gt;
//   History: &lt;br /&gt;
//------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;../include.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local uint64 dataPos;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    Vector4 rows[4];&lt;br /&gt;
}Matrix4x4&amp;lt;optimize=false&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    byte UnkB1; // Always 2 or 1, unknown flag&lt;br /&gt;
    byte UnkB2; // Always 0 or 1, unknown flag&lt;br /&gt;
    byte UnkB3[2];  // Padding?&lt;br /&gt;
    float Unk_f[4];    // Upper/Lower limits of something?&lt;br /&gt;
}LimitsStruct&amp;lt;optimize=false&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset BoneName;&lt;br /&gt;
    int unk; // if this is related to collision, this could be an enum for the collision shape&lt;br /&gt;
    float unk2; // Physics dampening? Lower values make bones wobble for longer&lt;br /&gt;
    Matrix4x4 mat;  // Most likely not a matrix, has parameters that affect gravity, stretch, etc, and possibly capsule/collision bounds(?) but still working through&lt;br /&gt;
}CollisionStruct&amp;lt;optimize=false&amp;gt;;   // Has params that affect physics intensity still, maybe general physics&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset BoneName;&lt;br /&gt;
    byte Unk1[4]; // All known examples are 01 01 14 00. could be bitflags by the looks of it&lt;br /&gt;
    int16 LocalParentBoneIndex;    // FF FF if no bone parent&lt;br /&gt;
    int16 LocalBoneIndex;&lt;br /&gt;
    int16 RealParentBoneIndex; // Usually the parent of this bone on the real skeleton, but can be any bone in practice. Perhaps a reference for the offset transform?&lt;br /&gt;
    int16 Unk3;&lt;br /&gt;
    LimitsStruct Limits[6]; // Unknown what these limits line up to (Pos to Neg X, Pos to Neg Y, etc)&lt;br /&gt;
    float Unk4&amp;lt;hidden=true&amp;gt;; // Align&lt;br /&gt;
    Matrix4x4 mat;  // Possibly bone offset matrix relative to RealParentBoneIndex? A: Two quaternions in row 2 and 4?&lt;br /&gt;
}&lt;br /&gt;
JiggleStruct&amp;lt;optimize=false&amp;gt;; // Handles bone chain relations for bendy/jiggle physics, as well as presumably transform limits&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    // Starting point needs to align to 16 bytes&lt;br /&gt;
    local uint64 CurPos = FTell();&lt;br /&gt;
    local uint64 AlignCheck = CurPos % 0x10;&lt;br /&gt;
    if (AlignCheck)&lt;br /&gt;
        FSeek(CurPos + 0x10 - AlignCheck);&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset BoneName;&lt;br /&gt;
    float unk0; // All known examples = 0.01&lt;br /&gt;
    int16 unk1&amp;lt;hidden=true&amp;gt;; // Always FF FF&lt;br /&gt;
    int16 if_pinned;    // 1 if no parent present. Possibly this bone controls corresponding vertex if 1, versus vertex controls cooresponding bone if 0&lt;br /&gt;
    int16 child_idx;    // FF if no child&lt;br /&gt;
    int16 parent_idx;   // FF if no parent&lt;br /&gt;
    int16 unk2[2]&amp;lt;hidden=true&amp;gt;;  // Always FF FF&lt;br /&gt;
    int16 left_idx;&lt;br /&gt;
    int16 right_idx;&lt;br /&gt;
}cloth_node&amp;lt;optimize=false&amp;gt;;    // Defines up to 4 neighboring bones in a cloth bone grid&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    int16 verts[2];&lt;br /&gt;
    float edge_length;&lt;br /&gt;
    float unk_factor;   // Normalized, lateral direct connections = 0.5, lateral skip connections = 0.3, vertical direct connections = 1.0. Maybe a stretch/shrink factor?&lt;br /&gt;
}cloth_edges&amp;lt;optimize=false&amp;gt;;   // Cloth sim edge mesh&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset cloth_name;&lt;br /&gt;
    float unk1[10];&lt;br /&gt;
    int16 unk_count1[2];&lt;br /&gt;
    int32 cloth_node_count;&lt;br /&gt;
    int32 cloth_edge_count;&lt;br /&gt;
    int32 unk3&amp;lt;hidden=true&amp;gt;; // Align&lt;br /&gt;
    int64 cloth_node_ptr;&lt;br /&gt;
    int64 cloth_edge_ptr;&lt;br /&gt;
    local int64 prePos = FTell();&lt;br /&gt;
    FSeek(cloth_node_ptr + dataPos);&lt;br /&gt;
    cloth_node bones[cloth_node_count];&lt;br /&gt;
    FSeek(cloth_edge_ptr + dataPos);&lt;br /&gt;
    cloth_edges edges[cloth_edge_count];&lt;br /&gt;
    FSeek(prePos);&lt;br /&gt;
}ClothStruct&amp;lt;optimize=false&amp;gt;;   &lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    char signature[4]&amp;lt;name=&amp;quot;Signature&amp;quot;&amp;gt;;&lt;br /&gt;
    int version &amp;lt;format=hex, name=&amp;quot;Version&amp;quot;&amp;gt;;&lt;br /&gt;
    StringOffset SkeletonName;&lt;br /&gt;
    uint32 CollisionCount;&lt;br /&gt;
    uint32 JiggleCount;&lt;br /&gt;
    uint64 CollisionOffset;&lt;br /&gt;
    uint64 JiggleOffset;&lt;br /&gt;
    uint32 ClothCount;&lt;br /&gt;
    uint32 UnkCount;&lt;br /&gt;
    uint64 ClothOffset;&lt;br /&gt;
    uint64 UnkOffset;&lt;br /&gt;
    FSeek(CollisionOffset + dataPos);&lt;br /&gt;
    CollisionStruct CollisionStructs[CollisionCount];&lt;br /&gt;
    FSeek(JiggleOffset + dataPos);&lt;br /&gt;
    JiggleStruct JiggleStructs[JiggleCount];&lt;br /&gt;
    FSeek(ClothOffset + dataPos);&lt;br /&gt;
    ClothStruct ClothStructs[ClothCount];&lt;br /&gt;
}&lt;br /&gt;
ResPhysicalSkeleton&amp;lt;open=true&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
ResBinaryFile file(&amp;quot;ResPhysicalSkeleton&amp;quot;)&amp;lt;name=Str(&amp;quot;%s&amp;quot;, FileNameGetBase(GetFileName()))&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PBA&amp;diff=491</id>
		<title>PBA</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PBA&amp;diff=491"/>
		<updated>2025-04-12T07:31:30Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=WIP Page, just adding to start}}&lt;br /&gt;
[[File:PBA cloth demonstration.gif|alt=Depicted in Blender using built-in cloth simulation, and bones constrained to corresponding vertex group|thumb|&amp;lt;code&amp;gt;chr_sage.pba&amp;lt;/code&amp;gt; contains a node for a cloth mesh made up of only vertices and edges, interconnected in such a way to maintain shape with internal springs|325x325px]]&lt;br /&gt;
PBA files are bone physics files first found in [[Sonic Frontiers]], and first regularly used in [[Shadow Generations|Shadow Generations.]] The system is capable of using bouncy bones/jiggle physics, rag-doll physics, and cloth simulation. The format is still relatively unknown and has only been brute forced through hex analysis more than code analysis, and there are unfortunately not many examples files to reference. The below template has lots of unknowns and potentially wrong info.&lt;br /&gt;
&lt;br /&gt;
== Binary Structure ==&lt;br /&gt;
TODO: Decipher, clean up, explain 0_0&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//------------------------------------------------&lt;br /&gt;
//--- 010 Editor v12.0.1 Binary Template&lt;br /&gt;
//&lt;br /&gt;
//      File: &lt;br /&gt;
//   Authors: Ashrindy, AdelQ&lt;br /&gt;
//   Version: 0.0.1&lt;br /&gt;
//   Purpose: Shadow Gens PhysicalSkeleton&lt;br /&gt;
//  Category: &lt;br /&gt;
// File Mask: *.pba&lt;br /&gt;
//  ID Bytes: &lt;br /&gt;
//   History: &lt;br /&gt;
//------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;../include.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local uint64 dataPos;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    Vector4 rows[4];&lt;br /&gt;
}Matrix4x4&amp;lt;optimize=false&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    byte UnkB1; // Always 2 or 1, unknown flag&lt;br /&gt;
    byte UnkB2; // Always 0 or 1, unknown flag&lt;br /&gt;
    byte UnkB3[2];  // Padding?&lt;br /&gt;
    float Unk_f[4];    // Upper/Lower limits of something?&lt;br /&gt;
}LimitsStruct&amp;lt;optimize=false&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset BoneName;&lt;br /&gt;
    int unk; // if this is related to collision, this could be an enum for the collision shape&lt;br /&gt;
    float unk2; // Physics dampening? Lower values make bones wobble for longer&lt;br /&gt;
    Matrix4x4 mat;  // Most likely not a matrix, has parameters that affect gravity, stretch, etc, and possibly capsule/collision bounds(?) but still working through&lt;br /&gt;
}CollisionStruct&amp;lt;optimize=false&amp;gt;;   // Has params that affect physics intensity still, maybe general physics&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset BoneName;&lt;br /&gt;
    byte Unk1[4]; // All known examples are 01 01 14 00. could be bitflags by the looks of it&lt;br /&gt;
    int16 LocalParentBoneIndex;    // FF FF if no bone parent&lt;br /&gt;
    int16 LocalBoneIndex;&lt;br /&gt;
    int16 RealParentBoneIndex; // Usually the parent of this bone on the real skeleton, but can be any bone in practice. Perhaps a reference for the offset transform?&lt;br /&gt;
    int16 Unk3;&lt;br /&gt;
    LimitsStruct Limits[6]; // Unknown what these limits line up to (Pos to Neg X, Pos to Neg Y, etc)&lt;br /&gt;
    float Unk4&amp;lt;hidden=true&amp;gt;; // Align&lt;br /&gt;
    Matrix4x4 mat;  // Possibly bone offset matrix relative to RealParentBoneIndex? A: Two quaternions in row 2 and 4?&lt;br /&gt;
}&lt;br /&gt;
JiggleStruct&amp;lt;optimize=false&amp;gt;; // Handles bone chain relations for bendy/jiggle physics, as well as presumably transform limits&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    // Starting point needs to align to 16 bytes&lt;br /&gt;
    local uint64 CurPos = FTell();&lt;br /&gt;
    local uint64 AlignCheck = CurPos % 0x10;&lt;br /&gt;
    if (AlignCheck)&lt;br /&gt;
        FSeek(CurPos + 0x10 - AlignCheck);&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset BoneName;&lt;br /&gt;
    float unk0; // All known examples = 0.01&lt;br /&gt;
    int16 unk1&amp;lt;hidden=true&amp;gt;; // Always FF FF&lt;br /&gt;
    int16 if_pinned;    // 1 if no parent present. Possibly this bone controls corresponding vertex if 1, versus vertex controls cooresponding bone if 0&lt;br /&gt;
    int16 child_idx;    // FF if no child&lt;br /&gt;
    int16 parent_idx;   // FF if no parent&lt;br /&gt;
    int16 unk2[2]&amp;lt;hidden=true&amp;gt;;  // Always FF FF&lt;br /&gt;
    int16 left_idx;&lt;br /&gt;
    int16 right_idx;&lt;br /&gt;
}cloth_node&amp;lt;optimize=false&amp;gt;;    // Defines up to 4 neighboring bones in a cloth bone grid&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    int16 verts[2];&lt;br /&gt;
    float edge_length;&lt;br /&gt;
    float unk_factor;   // Normalized, lateral direct connections = 0.5, lateral skip connections = 0.3, vertical direct connections = 1.0. Maybe a stretch/shrink factor?&lt;br /&gt;
}cloth_edges&amp;lt;optimize=false&amp;gt;;   // Cloth sim edge mesh&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset cloth_name;&lt;br /&gt;
    float unk1[10];&lt;br /&gt;
    int16 unk_count1[2];&lt;br /&gt;
    int32 cloth_node_count;&lt;br /&gt;
    int32 cloth_edge_count;&lt;br /&gt;
    int32 unk3&amp;lt;hidden=true&amp;gt;; // Align&lt;br /&gt;
    int64 cloth_node_ptr;&lt;br /&gt;
    int64 cloth_edge_ptr;&lt;br /&gt;
    local int64 prePos = FTell();&lt;br /&gt;
    FSeek(cloth_node_ptr + dataPos);&lt;br /&gt;
    cloth_node bones[cloth_node_count];&lt;br /&gt;
    FSeek(cloth_edge_ptr + dataPos);&lt;br /&gt;
    cloth_edges edges[cloth_edge_count];&lt;br /&gt;
    FSeek(prePos);&lt;br /&gt;
}ClothStruct&amp;lt;optimize=false&amp;gt;;   &lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    char signature[4]&amp;lt;name=&amp;quot;Signature&amp;quot;&amp;gt;;&lt;br /&gt;
    int version &amp;lt;format=hex, name=&amp;quot;Version&amp;quot;&amp;gt;;&lt;br /&gt;
    StringOffset SkeletonName;&lt;br /&gt;
    uint32 CollisionCount;&lt;br /&gt;
    uint32 JiggleCount;&lt;br /&gt;
    uint64 CollisionOffset;&lt;br /&gt;
    uint64 JiggleOffset;&lt;br /&gt;
    uint32 ClothCount;&lt;br /&gt;
    uint32 UnkCount;&lt;br /&gt;
    uint64 ClothOffset;&lt;br /&gt;
    uint64 UnkOffset;&lt;br /&gt;
    FSeek(CollisionOffset + dataPos);&lt;br /&gt;
    CollisionStruct CollisionStructs[CollisionCount];&lt;br /&gt;
    FSeek(JiggleOffset + dataPos);&lt;br /&gt;
    JiggleStruct JiggleStructs[JiggleCount];&lt;br /&gt;
    FSeek(ClothOffset + dataPos);&lt;br /&gt;
    ClothStruct ClothStructs[ClothCount];&lt;br /&gt;
}&lt;br /&gt;
ResPhysicalSkeleton&amp;lt;open=true&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
ResBinaryFile file(&amp;quot;ResPhysicalSkeleton&amp;quot;)&amp;lt;name=Str(&amp;quot;%s&amp;quot;, FileNameGetBase(GetFileName()))&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PBA&amp;diff=490</id>
		<title>PBA</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PBA&amp;diff=490"/>
		<updated>2025-04-12T07:29:51Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=WIP Page, just adding to start}}&lt;br /&gt;
[[File:PBA cloth demonstration.gif|alt=Depicted in Blender using built-in cloth simulation, and bones constrained to corresponding vertex group|thumb|&amp;lt;code&amp;gt;chr_sage.pba&amp;lt;/code&amp;gt; contains a node for a cloth mesh made up of only vertices and edges, interconnected in such a way to maintain shape with internal springs]]  &lt;br /&gt;
&lt;br /&gt;
PBA files are bone physics files first found in [[Sonic Frontiers]], and first regularly used in [[Shadow Generations|Shadow Generations.]] The system is capable of using bouncy bones/jiggle physics, rag-doll physics, and cloth simulation. The format is still relatively unknown and has only been brute forced through hex analysis more than code analysis, and there are unfortunately not many examples files to reference. The below template has lots of unknowns and potentially wrong info.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO: Cleanup:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//------------------------------------------------&lt;br /&gt;
//--- 010 Editor v12.0.1 Binary Template&lt;br /&gt;
//&lt;br /&gt;
//      File: &lt;br /&gt;
//   Authors: Ashrindy, AdelQ&lt;br /&gt;
//   Version: 0.0.1&lt;br /&gt;
//   Purpose: Shadow Gens PhysicalSkeleton&lt;br /&gt;
//  Category: &lt;br /&gt;
// File Mask: *.pba&lt;br /&gt;
//  ID Bytes: &lt;br /&gt;
//   History: &lt;br /&gt;
//------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;../include.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local uint64 dataPos;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    Vector4 rows[4];&lt;br /&gt;
}Matrix4x4&amp;lt;optimize=false&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    byte UnkB1; // Always 2 or 1, unknown flag&lt;br /&gt;
    byte UnkB2; // Always 0 or 1, unknown flag&lt;br /&gt;
    byte UnkB3[2];  // Padding?&lt;br /&gt;
    float Unk_f[4];    // Upper/Lower limits of something?&lt;br /&gt;
}LimitsStruct&amp;lt;optimize=false&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset BoneName;&lt;br /&gt;
    int unk; // if this is related to collision, this could be an enum for the collision shape&lt;br /&gt;
    float unk2; // Physics dampening? Lower values make bones wobble for longer&lt;br /&gt;
    Matrix4x4 mat;  // Most likely not a matrix, has parameters that affect gravity, stretch, etc, and possibly capsule/collision bounds(?) but still working through&lt;br /&gt;
}CollisionStruct&amp;lt;optimize=false&amp;gt;;   // Has params that affect physics intensity still, maybe general physics&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset BoneName;&lt;br /&gt;
    byte Unk1[4]; // All known examples are 01 01 14 00. could be bitflags by the looks of it&lt;br /&gt;
    int16 LocalParentBoneIndex;    // FF FF if no bone parent&lt;br /&gt;
    int16 LocalBoneIndex;&lt;br /&gt;
    int16 RealParentBoneIndex; // Usually the parent of this bone on the real skeleton, but can be any bone in practice. Perhaps a reference for the offset transform?&lt;br /&gt;
    int16 Unk3;&lt;br /&gt;
    LimitsStruct Limits[6]; // Unknown what these limits line up to (Pos to Neg X, Pos to Neg Y, etc)&lt;br /&gt;
    float Unk4&amp;lt;hidden=true&amp;gt;; // Align&lt;br /&gt;
    Matrix4x4 mat;  // Possibly bone offset matrix relative to RealParentBoneIndex? A: Two quaternions in row 2 and 4?&lt;br /&gt;
}&lt;br /&gt;
JiggleStruct&amp;lt;optimize=false&amp;gt;; // Handles bone chain relations for bendy/jiggle physics, as well as presumably transform limits&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    // Starting point needs to align to 16 bytes&lt;br /&gt;
    local uint64 CurPos = FTell();&lt;br /&gt;
    local uint64 AlignCheck = CurPos % 0x10;&lt;br /&gt;
    if (AlignCheck)&lt;br /&gt;
        FSeek(CurPos + 0x10 - AlignCheck);&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset BoneName;&lt;br /&gt;
    float unk0; // All known examples = 0.01&lt;br /&gt;
    int16 unk1&amp;lt;hidden=true&amp;gt;; // Always FF FF&lt;br /&gt;
    int16 if_pinned;    // 1 if no parent present. Possibly this bone controls corresponding vertex if 1, versus vertex controls cooresponding bone if 0&lt;br /&gt;
    int16 child_idx;    // FF if no child&lt;br /&gt;
    int16 parent_idx;   // FF if no parent&lt;br /&gt;
    int16 unk2[2]&amp;lt;hidden=true&amp;gt;;  // Always FF FF&lt;br /&gt;
    int16 left_idx;&lt;br /&gt;
    int16 right_idx;&lt;br /&gt;
}cloth_node&amp;lt;optimize=false&amp;gt;;    // Defines up to 4 neighboring bones in a cloth bone grid&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    int16 verts[2];&lt;br /&gt;
    float edge_length;&lt;br /&gt;
    float unk_factor;   // Normalized, lateral direct connections = 0.5, lateral skip connections = 0.3, vertical direct connections = 1.0. Maybe a stretch/shrink factor?&lt;br /&gt;
}cloth_edges&amp;lt;optimize=false&amp;gt;;   // Cloth sim edge mesh&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset cloth_name;&lt;br /&gt;
    float unk1[10];&lt;br /&gt;
    int16 unk_count1[2];&lt;br /&gt;
    int32 cloth_node_count;&lt;br /&gt;
    int32 cloth_edge_count;&lt;br /&gt;
    int32 unk3&amp;lt;hidden=true&amp;gt;; // Align&lt;br /&gt;
    int64 cloth_node_ptr;&lt;br /&gt;
    int64 cloth_edge_ptr;&lt;br /&gt;
    local int64 prePos = FTell();&lt;br /&gt;
    FSeek(cloth_node_ptr + dataPos);&lt;br /&gt;
    cloth_node bones[cloth_node_count];&lt;br /&gt;
    FSeek(cloth_edge_ptr + dataPos);&lt;br /&gt;
    cloth_edges edges[cloth_edge_count];&lt;br /&gt;
    FSeek(prePos);&lt;br /&gt;
}ClothStruct&amp;lt;optimize=false&amp;gt;;   &lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    char signature[4]&amp;lt;name=&amp;quot;Signature&amp;quot;&amp;gt;;&lt;br /&gt;
    int version &amp;lt;format=hex, name=&amp;quot;Version&amp;quot;&amp;gt;;&lt;br /&gt;
    StringOffset SkeletonName;&lt;br /&gt;
    uint32 CollisionCount;&lt;br /&gt;
    uint32 JiggleCount;&lt;br /&gt;
    uint64 CollisionOffset;&lt;br /&gt;
    uint64 JiggleOffset;&lt;br /&gt;
    uint32 ClothCount;&lt;br /&gt;
    uint32 UnkCount;&lt;br /&gt;
    uint64 ClothOffset;&lt;br /&gt;
    uint64 UnkOffset;&lt;br /&gt;
    FSeek(CollisionOffset + dataPos);&lt;br /&gt;
    CollisionStruct CollisionStructs[CollisionCount];&lt;br /&gt;
    FSeek(JiggleOffset + dataPos);&lt;br /&gt;
    JiggleStruct JiggleStructs[JiggleCount];&lt;br /&gt;
    FSeek(ClothOffset + dataPos);&lt;br /&gt;
    ClothStruct ClothStructs[ClothCount];&lt;br /&gt;
}&lt;br /&gt;
ResPhysicalSkeleton&amp;lt;open=true&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
ResBinaryFile file(&amp;quot;ResPhysicalSkeleton&amp;quot;)&amp;lt;name=Str(&amp;quot;%s&amp;quot;, FileNameGetBase(GetFileName()))&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=File:PBA_cloth_demonstration.gif&amp;diff=489</id>
		<title>File:PBA cloth demonstration.gif</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=File:PBA_cloth_demonstration.gif&amp;diff=489"/>
		<updated>2025-04-12T07:21:59Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;chr_sage.pba applied to applicable chr_sage.skl.pxd bones for cloth physics&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PXD&amp;diff=483</id>
		<title>PXD</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PXD&amp;diff=483"/>
		<updated>2025-04-08T09:14:01Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=This page is unfinished.}}&lt;br /&gt;
&lt;br /&gt;
== PXD Files ==&lt;br /&gt;
Hedgehog Engine 2 games from [[Mario &amp;amp; Sonic at the Rio 2016 Olympic Games|Rio 2016 Olympics]] to [[Shadow Generations]] contain skeleton and skeletal animation files with the file extensions &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; respectively, stored in a [[BINA]] container. Skeletons contain pose data that usually result in a T-Pose, bone and parent indices, and bone names. Animations contain playback metadata such as frame rate and frame count, track count, and either compressed animation pose data using [https://github.com/nfrechette/acl ACL compression,] or raw uncompressed pose data that use bone and frame indices to specify keyframed transforms, with linear interpolation between keyframes. For both skeletons and animations, position and rotation data for each bone is an absolute transform relative to the parent position, whereas scales are inherited from their respective parents locally, and have no effect on their positions. &lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Animation files are stored in a [[BINA]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt; identified as &amp;lt;code&amp;gt;PXAN&amp;lt;/code&amp;gt;, possibly for &amp;quot;PXD Animation&amp;quot; or similar:&lt;br /&gt;
&lt;br /&gt;
=== PXAN Header ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct Header {&lt;br /&gt;
	char[4] magic;		// &#039;NAXP&#039;&lt;br /&gt;
	uint32_t version;	// Always 0x200&lt;br /&gt;
	uint8_t additive;	// 0x01 if additive, else 0x00&lt;br /&gt;
	uint8_t compressed;	// 0x08 if ACL compressed, 0x00 if uncompressed&lt;br /&gt;
	char[6];			// Null alignment to 8 bytes&lt;br /&gt;
	uint64_t metadata_offset;	// Offset to metadata, always 0x18&lt;br /&gt;
	float duration;				// Duration of the animation in seconds, calculated as ((frame_count - 1) / FPS)&lt;br /&gt;
	uint32_t frame_count;	&lt;br /&gt;
	uint32_t track_count;		// Bone count&lt;br /&gt;
	uint64_t skel_anim_offset;	// Offset for character&#039;s skeletal animation, always 0x40 if compressed, 0x38 if uncompressed&lt;br /&gt;
	uint64_t root_anim_offset;	// Offset for root motion animation, 0x00 if no root motion is present, aligned to 16 bytes&lt;br /&gt;
	if (compressed == 0x08)&lt;br /&gt;
	char[8];		// Null alignment to 0x10 bytes for ACL data. &lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ACL Data: ===&lt;br /&gt;
All Hedgehog Engine 2 games that utilize the ACL library appear to use v2.0.0, first seen in [[Sonic Origins]], and unchanged in any implementation since then. [https://github.com/nfrechette/acl/tree/a54c5c2781be9f14b840a60f8dd8ec6c5065885d/docs See the ACL docs for more info.] If &amp;lt;code&amp;gt;compressed == 0x08&amp;lt;/code&amp;gt;, skeletal animations and root motion animations are compressed. &lt;br /&gt;
&lt;br /&gt;
==== Compressed Data: ====&lt;br /&gt;
Below is a high level overview of the stored ACL chunk data:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct ACLData {&lt;br /&gt;
	uint32_t acl_chunk_size;&lt;br /&gt;
	int32_t acl_hash;&lt;br /&gt;
&lt;br /&gt;
	uint32_t acl_tag;		// Identifies ACL buffer type, always 0xAC11AC11 to mark compressed_tracks&lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/buffer_tag.h#L49&lt;br /&gt;
&lt;br /&gt;
	uint16_t acl_version;	// ACL Version Enum Identifier. 0x07 indicates v2.0.0, the only version observed in any HE2 game.&lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/compressed_tracks_version.h#L71&lt;br /&gt;
&lt;br /&gt;
	char acl_padding;		// always 0x00&lt;br /&gt;
	uint8_t acl_track_type;	// ACL Track Type Enum. 0x0C indicates qvvf, the only track type observed in any HE2 game. &lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/track_types.h#L68&lt;br /&gt;
&lt;br /&gt;
	uint32_t track_count;	// Bone count if skeletal animation, 0x01 if root motion. Should match header track_count if skeletal. &lt;br /&gt;
	uint32_t sample_count;	// Frame count, should match header frame_count.&lt;br /&gt;
	float32 sample_rate;	// Playback FPS of animation, should equal header ((frame_count - 1) / duration)&lt;br /&gt;
	char[acl_chunk_size - 0x1C] acl_data;   // String of compressed ACL data&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;At the end of an ACL chunk, if it is a skeletal animation chunk and root motion is present in the file, the chunk will be null padded to 16 bytes. If the ACL chunk is a root motion chunk or a skeletal animation with no associated root motion chunk in the file, the chunk will be null padded to 4 bytes. The last ACL chunk is immediately followed by the BINA offset table. &lt;br /&gt;
&lt;br /&gt;
==== Raw/Decompressed Track List: ====&lt;br /&gt;
The index lookup for which transform set belongs to which bone can be found in the skeleton file [[PXD#.skl.pxd Structure|(see .skl.pxd Structure)]]. Each bone uses an [https://github.com/nfrechette/rtm RTM] [https://github.com/nfrechette/rtm/blob/7c9a61e32744ee9ff2978328d0e585635fd55615/includes/rtm/types.h#L393 qvvf] struct for transformation. Though the &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; element of each vector has no bearing on the final animation, the games usually store a value in there anyways and appears to have an effect on compression:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct qvvf&lt;br /&gt;
{&lt;br /&gt;
	quatf rotation;			// XYZW Quaternion&lt;br /&gt;
	vector4f translation;	// XYZW Vector, W is undefined but appears to be bone length&lt;br /&gt;
	vector4f scale;			// XYZW Vector, W is undefined and always 1.0&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Native Uncompressed Data: ===&lt;br /&gt;
{{Notice|type=note|content=This section could use a less confusing explanation.}}&lt;br /&gt;
Alternatively to compressed ACL track data, the PXAN structure can store individual components (rotation, translation, scale) of any given track at any frame, and linearly interpolate between them independently. This system was first seen in the [[Mario &amp;amp; Sonic at the Rio 2016 Olympic Games|M&amp;amp;S 2016 Rio Olympic Games]] as the exclusive method of storing animations. ACL compression may have an advantage in reducing the file size of many of these animations but—though rare—uncompressed animations have been observed in subsequent games for certain animations, presumably to combat any potential jitter during close up cutscenes or similar situations. Though the actual end data contained in this method is simple, the structure can end up like a spider&#039;s nest at first glance:&lt;br /&gt;
&lt;br /&gt;
==== Track Offset Tables: ====&lt;br /&gt;
The first struct array found in the file is a track table for each bone. Within it, for each transform type (translation, rotation, scale), there is a keyframe count, offset pointing to a frame table, and offset pointing to an array of transforms. &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct TrackTableOffsets {&lt;br /&gt;
	uint64_t pos_key_count;			// Total number of translation keyframes for this bone&lt;br /&gt;
	uint64_t pos_table_offset;		// Offset for this bone&#039;s translation frame table&lt;br /&gt;
	uint64_t pos_values_offset;		// Starting offset for this bone&#039;s array of translation values&lt;br /&gt;
&lt;br /&gt;
	uint64_t rot_key_count;			// Total number of rotation keyframes for this bone&lt;br /&gt;
	uint64_t rot_table_offset;		// Offset for this bone&#039;s rotation frame table&lt;br /&gt;
	uint64_t rot_values_offset;		// Starting offset for this bone&#039;s array of rotation values&lt;br /&gt;
&lt;br /&gt;
	uint64_t scale_key_count;		// Total number of scale keyframes for this bone&lt;br /&gt;
	uint64_t scale_table_offset;	// Offset for this bone&#039;s scale frame table&lt;br /&gt;
	uint64_t scale_values_offset;	// Starting offset for this bone&#039;s array of scale values&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
TrackTableOffsets TrackTables[track_count];		// One for each bone, track_count from PXAN header&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Frame Tables and Transforms: ====&lt;br /&gt;
Each transform type will get a frame table as &amp;lt;code&amp;gt;uint16_t[key_count] keys;&amp;lt;/code&amp;gt; where each value is the frame that the keyframe will be inserted to, and transform array &amp;lt;code&amp;gt;vector4f[key_count] transforms; // XYZW floats&amp;lt;/code&amp;gt; that will correspond to the frame with the matching array index. Unlike in ACL decompressed tracks, native uncompressed tracks&#039; &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; component for translation and scale is always &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;. Both of these element arrays will be null aligned to 16 bytes.&lt;br /&gt;
&lt;br /&gt;
==== Posing and Transform Inheritance: ====&lt;br /&gt;
Each bone&#039;s transformation is stored as an object space (AKA &#039;Pose Space&#039; or &#039;Model Space&#039;) transform relative to its parent bone&#039;s final transformation. That means, regardless of what the reset pose or bone orientations are in the model&#039;s skeleton, the stored values of any given frame will completely overwrite any pose previously present. &lt;br /&gt;
&lt;br /&gt;
However, there are two quirks that are unlike most interchange formats for 3D animations:&lt;br /&gt;
&lt;br /&gt;
# Scale inheritance is a simple local space copy of the parent&#039;s local space scale. There is no shearing or skewing of any kind.&lt;br /&gt;
#* &amp;lt;sub&amp;gt;In Blender, a bone&#039;s scale inheritance mode can be changed from `Full` to `Aligned` to achieve this effect&amp;lt;/sub&amp;gt;&lt;br /&gt;
# Calculating the position and rotation of any given bone is to be done independent of any scale values.&lt;br /&gt;
&lt;br /&gt;
When reading in-game, though scales from recursive parents are inherited and multiplied, translation is completely unaffected in any capacity, unintuitively. Therefore, before applying any object space transformation in a setting where parent scale is assumed to affect the child bone&#039;s location, each bone&#039;s final scale must be calculated and applied by multiplying its and each recursive parent&#039;s scales together. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Trivia&#039;&#039;&#039;: &#039;&#039;The inheritance and relationships behavior for bone transform values have been found to be identical to all previous HE games that used Havok, possibly indicating that Sonic Team&#039;s custom implementation of animation playback and posing is loosely based on Havok&#039;s &amp;lt;code&amp;gt;hka&amp;lt;/code&amp;gt; functions.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Skeleton files are stored in a [[BINA]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;lt;sub&amp;gt;TODO...&amp;lt;/sub&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Thanks ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/Turk645 Turk645:] Original uncompressed PXD blender importer scripts&lt;br /&gt;
* [https://github.com/WistfulHopes WistfulHopes:] ACL tools, blender export scripts&lt;br /&gt;
* [https://github.com/ik-01 ik-01]: Format and game code research, filling in gaps for unknown values&lt;br /&gt;
* [https://github.com/AdelQue AdelQue:] Format research, math relations and bone inheritance behaviors&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PXD&amp;diff=482</id>
		<title>PXD</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PXD&amp;diff=482"/>
		<updated>2025-04-08T08:57:01Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=This page is unfinished.}}&lt;br /&gt;
&lt;br /&gt;
== PXD Files ==&lt;br /&gt;
Hedgehog Engine 2 games from [[Mario &amp;amp; Sonic at the Rio 2016 Olympic Games|Rio 2016 Olympics]] to [[Shadow Generations]] contain skeleton and skeletal animation files with the file extensions &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; respectively, stored in a [[BINA]] container. Skeletons contain pose data that usually result in a T-Pose, bone and parent indices, and bone names. Animations contain playback metadata such as frame rate and frame count, track count, and either compressed animation pose data using [https://github.com/nfrechette/acl ACL compression,] or raw uncompressed pose data that use bone and frame indices to specify keyframed transforms, with linear interpolation between keyframes. For both skeletons and animations, position and rotation data for each bone is an absolute transform relative to the parent position, whereas scales are inherited from their respective parents locally, and have no effect on their positions. &lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Animation files are stored in a [[BINA]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt; identified as &amp;lt;code&amp;gt;PXAN&amp;lt;/code&amp;gt;, possibly for &amp;quot;PXD Animation&amp;quot; or similar:&lt;br /&gt;
&lt;br /&gt;
=== PXAN Header ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct Header {&lt;br /&gt;
	char[4] magic;		// &#039;NAXP&#039;&lt;br /&gt;
	uint32_t version;	// Always 0x200&lt;br /&gt;
	uint8_t additive;	// 0x01 if additive, else 0x00&lt;br /&gt;
	uint8_t compressed;	// 0x08 if ACL compressed, 0x00 if uncompressed&lt;br /&gt;
	char[6];			// Null alignment to 8 bytes&lt;br /&gt;
	uint64_t metadata_offset;	// Offset to metadata, always 0x18&lt;br /&gt;
	float duration;				// Duration of the animation in seconds, calculated as ((frame_count - 1) / FPS)&lt;br /&gt;
	uint32_t frame_count;	&lt;br /&gt;
	uint32_t track_count;		// Bone count&lt;br /&gt;
	uint64_t skel_anim_offset;	// Offset for character&#039;s skeletal animation, always 0x40 if compressed, 0x38 if uncompressed&lt;br /&gt;
	uint64_t root_anim_offset;	// Offset for root motion animation, 0x00 if no root motion is present, aligned to 16 bytes&lt;br /&gt;
	if (compressed == 0x08)&lt;br /&gt;
	char[8];		// Null alignment to 0x10 bytes for ACL data. &lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ACL Data: ===&lt;br /&gt;
All Hedgehog Engine 2 games that utilize the ACL library appear to use v2.0.0, first seen in [[Sonic Origins]], and unchanged in any implementation since then. [https://github.com/nfrechette/acl/tree/a54c5c2781be9f14b840a60f8dd8ec6c5065885d/docs See the ACL docs for more info.] If &amp;lt;code&amp;gt;compressed == 0x08&amp;lt;/code&amp;gt;, skeletal animations and root motion animations are compressed. &lt;br /&gt;
&lt;br /&gt;
==== Compressed Data: ====&lt;br /&gt;
Below is a high level overview of the stored ACL chunk data:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct ACLData {&lt;br /&gt;
	uint32_t acl_chunk_size;&lt;br /&gt;
	int32_t acl_hash;&lt;br /&gt;
&lt;br /&gt;
	uint32_t acl_tag;		// Identifies ACL buffer type, always 0xAC11AC11 to mark compressed_tracks&lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/buffer_tag.h#L49&lt;br /&gt;
&lt;br /&gt;
	uint16_t acl_version;	// ACL Version Enum Identifier. 0x07 indicates v2.0.0, the only version observed in any HE2 game.&lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/compressed_tracks_version.h#L71&lt;br /&gt;
&lt;br /&gt;
	char acl_padding;		// always 0x00&lt;br /&gt;
	uint8_t acl_track_type;	// ACL Track Type Enum. 0x0C indicates qvvf, the only track type observed in any HE2 game. &lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/track_types.h#L68&lt;br /&gt;
&lt;br /&gt;
	uint32_t track_count;	// Bone count if skeletal animation, 0x01 if root motion. Should match header track_count if skeletal. &lt;br /&gt;
	uint32_t sample_count;	// Frame count, should match header frame_count.&lt;br /&gt;
	float32 sample_rate;	// Playback FPS of animation, should equal header ((frame_count - 1) / duration)&lt;br /&gt;
	char[acl_chunk_size - 0x1C] acl_data;   // String of compressed ACL data&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;At the end of an ACL chunk, if it is a skeletal animation chunk and root motion is present in the file, the chunk will be null padded to 16 bytes. If the ACL chunk is a root motion chunk or a skeletal animation with no associated root motion chunk in the file, the chunk will be null padded to 4 bytes. The last ACL chunk is immediately followed by the BINA offset table. &lt;br /&gt;
&lt;br /&gt;
==== Raw/Decompressed Track List: ====&lt;br /&gt;
The index lookup for which transform set belongs to which bone can be found in the skeleton file [[PXD#.skl.pxd Structure|(see .skl.pxd Structure)]]. Each bone uses an [https://github.com/nfrechette/rtm RTM] [https://github.com/nfrechette/rtm/blob/7c9a61e32744ee9ff2978328d0e585635fd55615/includes/rtm/types.h#L393 qvvf] struct for transformation. Though the &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; element of each vector has no bearing on the final animation, the games usually store a value in there anyways and appears to have an effect on compression:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct qvvf&lt;br /&gt;
{&lt;br /&gt;
	quatf rotation;			// XYZW Quaternion&lt;br /&gt;
	vector4f translation;	// XYZW Vector, W is undefined but appears to be bone length&lt;br /&gt;
	vector4f scale;			// XYZW Vector, W is undefined and always 1.0&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Native Uncompressed Data: ===&lt;br /&gt;
{{Notice|type=note|content=This section could use a less confusing explanation.}}&lt;br /&gt;
Alternatively to compressed ACL track data, the PXAN structure can store individual components (rotation, translation, scale) of any given track at any frame, and linearly interpolate between them independently. This system was first seen in the [[Mario &amp;amp; Sonic at the Rio 2016 Olympic Games|M&amp;amp;S 2016 Rio Olympic Games]] as the exclusive method of storing animations. ACL compression may have an advantage in reducing the file size of many of these animations but—though rare—uncompressed animations have been observed in subsequent games for certain animations, presumably to combat any potential jitter during close up cutscenes or similar situations. Though the actual end data contained in this method is simple, the structure can end up like a spider&#039;s nest at first glance:&lt;br /&gt;
&lt;br /&gt;
==== Track Offset Tables: ====&lt;br /&gt;
The first struct array found in the file is a track table for each bone. Within it, for each transform type (translation, rotation, scale), there is a keyframe count, offset pointing to a frame table, and offset pointing to an array of transforms. &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct TrackTableOffsets {&lt;br /&gt;
	uint64_t pos_key_count;			// Total number of translation keyframes for this bone&lt;br /&gt;
	uint64_t pos_table_offset;		// Offset for this bone&#039;s translation frame table&lt;br /&gt;
	uint64_t pos_values_offset;		// Starting offset for this bone&#039;s array of translation values&lt;br /&gt;
&lt;br /&gt;
	uint64_t rot_key_count;			// Total number of rotation keyframes for this bone&lt;br /&gt;
	uint64_t rot_table_offset;		// Offset for this bone&#039;s rotation frame table&lt;br /&gt;
	uint64_t rot_values_offset;		// Starting offset for this bone&#039;s array of rotation values&lt;br /&gt;
&lt;br /&gt;
	uint64_t scale_key_count;		// Total number of scale keyframes for this bone&lt;br /&gt;
	uint64_t scale_table_offset;	// Offset for this bone&#039;s scale frame table&lt;br /&gt;
	uint64_t scale_values_offset;	// Starting offset for this bone&#039;s array of scale values&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
TrackTableOffsets TrackTables[track_count];		// One for each bone, track_count from PXAN header&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Frame Tables and Transforms: ====&lt;br /&gt;
Each transform type will get a frame table as &amp;lt;code&amp;gt;uint16_t[key_count] keys;&amp;lt;/code&amp;gt; where each value is the frame that the keyframe will be inserted to, and transform array &amp;lt;code&amp;gt;vector4f[key_count] transforms; // XYZW floats&amp;lt;/code&amp;gt; that will correspond to the frame with the matching array index. Unlike in ACL decompressed tracks, native uncompressed tracks&#039; &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; component is always &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;. Both of these element arrays will be null aligned to 16 bytes.&lt;br /&gt;
&lt;br /&gt;
==== Posing and Transform Inheritance: ====&lt;br /&gt;
Each bone&#039;s transformation is stored as an object space (AKA &#039;Pose Space&#039; or &#039;Model Space&#039;) transform relative to its parent bone&#039;s final transformation. That means, regardless of what the reset pose or bone orientations are in the model&#039;s skeleton, the stored values of any given frame will completely overwrite any pose previously present. &lt;br /&gt;
&lt;br /&gt;
However, there are two quirks that are unlike most interchange formats for 3D animations:&lt;br /&gt;
&lt;br /&gt;
# Scale inheritance is a simple local space copy of the parent&#039;s local space scale. There is no shearing or skewing of any kind.&lt;br /&gt;
#* &amp;lt;sub&amp;gt;In Blender, a bone&#039;s scale inheritance mode can be changed from `Full` to `Aligned` to achieve this effect&amp;lt;/sub&amp;gt;&lt;br /&gt;
# Calculating the position and rotation of any given bone is to be done independent of any scale values.&lt;br /&gt;
&lt;br /&gt;
When reading in-game, though scales from recursive parents are inherited and multiplied, translation is completely unaffected in any capacity, unintuitively. Therefore, before applying any object space transformation in a setting where parent scale is assumed to affect the child bone&#039;s location, each bone&#039;s final scale must be calculated and applied by multiplying its and each recursive parent&#039;s scales together. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Trivia&#039;&#039;&#039;: &#039;&#039;The inheritance and relationships behavior for bone transform values have been found to be identical to all previous HE games that used Havok, possibly indicating that Sonic Team&#039;s custom implementation of animation playback and posing is loosely based on Havok&#039;s &amp;lt;code&amp;gt;hka&amp;lt;/code&amp;gt; functions.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Skeleton files are stored in a [[BINA]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;lt;sub&amp;gt;TODO...&amp;lt;/sub&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Thanks ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/Turk645 Turk645:] Original uncompressed PXD blender importer scripts&lt;br /&gt;
* [https://github.com/WistfulHopes WistfulHopes:] ACL tools, blender export scripts&lt;br /&gt;
* [https://github.com/ik-01 ik-01]: Format and game code research, filling in gaps for unknown values&lt;br /&gt;
* [https://github.com/AdelQue AdelQue:] Format research, math relations and bone inheritance behaviors&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PXD&amp;diff=481</id>
		<title>PXD</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PXD&amp;diff=481"/>
		<updated>2025-04-08T08:42:22Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=This page is unfinished.}}&lt;br /&gt;
&lt;br /&gt;
== PXD Files ==&lt;br /&gt;
Hedgehog Engine 2 games from [[Mario &amp;amp; Sonic at the Rio 2016 Olympic Games|Rio 2016 Olympics]] to [[Shadow Generations]] contain skeleton and skeletal animation files with the file extensions &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; respectively, stored in a [[BINA]] container. Skeletons contain pose data that usually result in a T-Pose, bone and parent indices, and bone names. Animations contain playback metadata such as frame rate and frame count, track count, and either compressed animation pose data using [https://github.com/nfrechette/acl ACL compression,] or raw uncompressed pose data that use bone and frame indices to specify keyframed transforms, with linear interpolation between keyframes. For both skeletons and animations, position and rotation data for each bone is an absolute transform relative to the parent position, whereas scales are inherited from their respective parents locally, and have no effect on their positions. &lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Animation files are stored in a [[BINA]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt; identified as &amp;lt;code&amp;gt;PXAN&amp;lt;/code&amp;gt;, possibly for &amp;quot;PXD Animation&amp;quot; or similar:&lt;br /&gt;
&lt;br /&gt;
=== PXAN Header ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct Header {&lt;br /&gt;
	char[4] magic;		// &#039;NAXP&#039;&lt;br /&gt;
	uint32_t version;	// Always 0x200&lt;br /&gt;
	uint8_t additive;	// 0x01 if additive, else 0x00&lt;br /&gt;
	uint8_t compressed;	// 0x08 if ACL compressed, 0x00 if uncompressed&lt;br /&gt;
	char[6];			// Null alignment to 8 bytes&lt;br /&gt;
	uint64_t metadata_offset;	// Offset to metadata, always 0x18&lt;br /&gt;
	float duration;				// Duration of the animation in seconds, calculated as ((frame_count - 1) / FPS)&lt;br /&gt;
	uint32_t frame_count;	&lt;br /&gt;
	uint32_t track_count;		// Bone count&lt;br /&gt;
	uint64_t skel_anim_offset;	// Offset for character&#039;s skeletal animation, always 0x40 if compressed, 0x38 if uncompressed&lt;br /&gt;
	uint64_t root_anim_offset;	// Offset for root motion animation, 0x00 if no root motion is present, aligned to 16 bytes&lt;br /&gt;
	if (compressed == 0x08)&lt;br /&gt;
	char[8];		// Null alignment to 0x10 bytes for ACL data. &lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ACL Data: ===&lt;br /&gt;
All Hedgehog Engine 2 games that utilize the ACL library appear to use v2.0.0, first seen in [[Sonic Origins]], and unchanged in any implementation since then. [https://github.com/nfrechette/acl/tree/a54c5c2781be9f14b840a60f8dd8ec6c5065885d/docs See the ACL docs for more info.] If &amp;lt;code&amp;gt;compressed == 0x08&amp;lt;/code&amp;gt;, skeletal animations and root motion animations are compressed. &lt;br /&gt;
&lt;br /&gt;
==== Compressed Data: ====&lt;br /&gt;
Below is a high level overview of the stored ACL chunk data:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct ACLData {&lt;br /&gt;
	uint32_t acl_chunk_size;&lt;br /&gt;
	int32_t acl_hash;&lt;br /&gt;
&lt;br /&gt;
	uint32_t acl_tag;		// Identifies ACL buffer type, always 0xAC11AC11 to mark compressed_tracks&lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/buffer_tag.h#L49&lt;br /&gt;
&lt;br /&gt;
	uint16_t acl_version;	// ACL Version Enum Identifier. 0x07 indicates v2.0.0, the only version observed in any HE2 game.&lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/compressed_tracks_version.h#L71&lt;br /&gt;
&lt;br /&gt;
	char acl_padding;		// always 0x00&lt;br /&gt;
	uint8_t acl_track_type;	// ACL Track Type Enum. 0x0C indicates qvvf, the only track type observed in any HE2 game. &lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/track_types.h#L68&lt;br /&gt;
&lt;br /&gt;
	uint32_t track_count;	// Bone count if skeletal animation, 0x01 if root motion. Should match header track_count if skeletal. &lt;br /&gt;
	uint32_t sample_count;	// Frame count, should match header frame_count.&lt;br /&gt;
	float32 sample_rate;	// Playback FPS of animation, should equal header ((frame_count - 1) / duration)&lt;br /&gt;
	char[acl_chunk_size - 0x1C] acl_data;   // String of compressed ACL data&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;At the end of an ACL chunk, if it is a skeletal animation chunk and root motion is present in the file, the chunk will be null padded to 16 bytes. If the ACL chunk is a root motion chunk or a skeletal animation with no associated root motion chunk in the file, the chunk will be null padded to 4 bytes. The last ACL chunk is immediately followed by the BINA offset table. &lt;br /&gt;
&lt;br /&gt;
==== Raw/Decompressed Track List: ====&lt;br /&gt;
The index lookup for which transform set belongs to which bone can be found in the skeleton file [[PXD#.skl.pxd Structure|(see .skl.pxd Structure)]]. Each bone uses an [https://github.com/nfrechette/rtm RTM] [https://github.com/nfrechette/rtm/blob/7c9a61e32744ee9ff2978328d0e585635fd55615/includes/rtm/types.h#L393 qvvf] struct for transformation. Though the &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; element of each vector has no bearing on the final animation, the games usually store a value in there anyways and appears to have an effect on compression:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct qvvf&lt;br /&gt;
{&lt;br /&gt;
	quatf rotation;			// XYZW Quaternion&lt;br /&gt;
	vector4f translation;	// XYZW Vector, W is undefined but appears to be bone length&lt;br /&gt;
	vector4f scale;			// XYZW Vector, W is undefined and always 1.0&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Native Uncompressed Data: ===&lt;br /&gt;
{{Notice|type=note|content=This section could use a less confusing explanation.}}&lt;br /&gt;
Alternatively to compressed ACL track data, the PXAN structure can store individual components (rotation, translation, scale) of any given track at any frame, and linearly interpolate between them independently. This system was first seen in the [[Mario &amp;amp; Sonic at the Rio 2016 Olympic Games|M&amp;amp;S 2016 Rio Olympic Games]] as the exclusive method of storing animations. ACL compression may have an advantage in reducing the file size of many of these animations but—though rare—uncompressed animations have been observed in subsequent games for certain animations, presumably to combat any potential jitter during close up cutscenes or similar situations. Though the actual end data contained in this method is simple, the structure can end up like a spider&#039;s nest at first glance:&lt;br /&gt;
&lt;br /&gt;
==== Track Offset Tables: ====&lt;br /&gt;
The first struct array found in the file is a track table for each bone. Within it, for each transform type (translation, rotation, scale), there is a keyframe count, offset pointing to a frame table, and offset pointing to an array of transforms. &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct TrackTableOffsets {&lt;br /&gt;
	uint64_t pos_key_count;			// Total number of translation keyframes for this bone&lt;br /&gt;
	uint64_t pos_table_offset;		// Offset for this bone&#039;s translation frame table&lt;br /&gt;
	uint64_t pos_values_offset;		// Starting offset for this bone&#039;s array of translation values&lt;br /&gt;
&lt;br /&gt;
	uint64_t rot_key_count;			// Total number of rotation keyframes for this bone&lt;br /&gt;
	uint64_t rot_table_offset;		// Offset for this bone&#039;s rotation frame table&lt;br /&gt;
	uint64_t rot_values_offset;		// Starting offset for this bone&#039;s array of rotation values&lt;br /&gt;
&lt;br /&gt;
	uint64_t scale_key_count;		// Total number of scale keyframes for this bone&lt;br /&gt;
	uint64_t scale_table_offset;	// Offset for this bone&#039;s scale frame table&lt;br /&gt;
	uint64_t scale_values_offset;	// Starting offset for this bone&#039;s array of scale values&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
TrackTableOffsets TrackTables[track_count];		// One for each bone, track_count from PXAN header&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Frame Tables and Transforms: ====&lt;br /&gt;
Each transform type will get a frame table as &amp;lt;code&amp;gt;uint16_t[key_count] keys;&amp;lt;/code&amp;gt; where each value is the frame that the keyframe will be inserted to, and transform array &amp;lt;code&amp;gt;vector4f[key_count] transforms; // XYZW floats&amp;lt;/code&amp;gt; that will correspond to the frame with the matching array index. Unlike in ACL decompressed tracks, native uncompressed tracks&#039; &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; component is always &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;. Both of these element arrays will be null aligned to 16 bytes.&lt;br /&gt;
&lt;br /&gt;
==== Posing and Transform Inheritance: ====&lt;br /&gt;
Each bone&#039;s transformation is stored as an object space (AKA &#039;Pose Space&#039; or &#039;Model Space&#039;) transform relative to its parent bone&#039;s final transformation. That means, regardless of what the reset pose or bone orientations are in the model&#039;s skeleton, the stored values of any given frame will completely overwrite any pose previously present. &lt;br /&gt;
&lt;br /&gt;
However, there are two quirks that are unlike most interchange formats for 3D animations:&lt;br /&gt;
&lt;br /&gt;
# Scale inheritance is a simple local space copy of the parent&#039;s local space scale. There is no shearing or skewing of any kind.&lt;br /&gt;
#* &amp;lt;sub&amp;gt;In Blender, a bone&#039;s scale inheritance mode can be changed from `Full` to `Aligned` to achieve this effect&amp;lt;/sub&amp;gt;&lt;br /&gt;
# Calculating the position and rotation of any given bone is to be done independent of any scale values.&lt;br /&gt;
&lt;br /&gt;
When reading in-game, though scales from recursive parents are inherited and multiplied, translation is completely unaffected in any capacity, unintuitively. Therefore, before applying any object space transformation in a setting where parent scale is assumed to affect the child bone&#039;s location, each bone&#039;s final scale must be calculated and applied by multiplying its and each recursive parent&#039;s scales together. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Trivia&#039;&#039;&#039;: &#039;&#039;The inheritance and relationships behavior for bone transform values have been found to be identical to all previous HE games that used Havok, possibly indicating that Sonic Team&#039;s custom implementation of animation playback and posing is loosely based on Havok&#039;s &amp;lt;code&amp;gt;hka&amp;lt;/code&amp;gt; functions.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Skeleton files are stored in a [[BINA]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;lt;sub&amp;gt;TODO...&amp;lt;/sub&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Thanks ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/Turk645 Turk645:] Original uncompressed PXD blender importer scripts&lt;br /&gt;
* [https://github.com/WistfulHopes WistfulHopes:] ACL tools, blender export scripts&lt;br /&gt;
* [https://github.com/ik-01 ik-01]: Format and game code research, filling in gaps for unknown values&lt;br /&gt;
* [https://github.com/AdelQue AdelQue:] Format research, math relations and bone inheritance behaviors&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PXD&amp;diff=480</id>
		<title>PXD</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PXD&amp;diff=480"/>
		<updated>2025-04-08T08:40:39Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Add Thanks&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=This page is unfinished.}}&lt;br /&gt;
&lt;br /&gt;
== PXD Files ==&lt;br /&gt;
Hedgehog Engine 2 games from [[Mario &amp;amp; Sonic at the Rio 2016 Olympic Games|Rio 2016 Olympics]] to [[Shadow Generations]] contain skeleton and skeletal animation files with the file extensions &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; respectively, stored in a [[BINA]] container. Skeletons contain pose data that usually result in a T-Pose, bone and parent indices, and bone names. Animations contain playback metadata such as frame rate and frame count, track count, and either compressed animation pose data using [https://github.com/nfrechette/acl ACL compression,] or raw uncompressed pose data that use bone and frame indices to specify keyframed transforms, with linear interpolation between keyframes. For both skeletons and animations, position and rotation data for each bone is an absolute transform relative to the parent position, whereas scales are inherited from their respective parents locally, and have no effect on their positions. &lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Animation files are stored in a [[BINA]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt; identified as &amp;lt;code&amp;gt;PXAN&amp;lt;/code&amp;gt;, possibly for &amp;quot;PXD Animation&amp;quot; or similar:&lt;br /&gt;
&lt;br /&gt;
=== PXAN Header ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct Header {&lt;br /&gt;
	char[4] magic;		// &#039;NAXP&#039;&lt;br /&gt;
	uint32_t version;	// Always 0x200&lt;br /&gt;
	uint8_t additive;	// 0x01 if additive, else 0x00&lt;br /&gt;
	uint8_t compressed;	// 0x08 if ACL compressed, 0x00 if uncompressed&lt;br /&gt;
	char[6];			// Null alignment to 8 bytes&lt;br /&gt;
	uint64_t metadata_offset;	// Offset to metadata, always 0x18&lt;br /&gt;
	float duration;				// Duration of the animation in seconds, calculated as ((frame_count - 1) / FPS)&lt;br /&gt;
	uint32_t frame_count;	&lt;br /&gt;
	uint32_t track_count;		// Bone count&lt;br /&gt;
	uint64_t skel_anim_offset;	// Offset for character&#039;s skeletal animation, always 0x40 if compressed, 0x38 if uncompressed&lt;br /&gt;
	uint64_t root_anim_offset;	// Offset for root motion animation, 0x00 if no root motion is present, aligned to 16 bytes&lt;br /&gt;
	if (compressed == 0x08)&lt;br /&gt;
	char[8];		// Null alignment to 0x10 bytes for ACL data. &lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ACL Data: ===&lt;br /&gt;
All Hedgehog Engine 2 games that utilize the ACL library appear to use v2.0.0, first seen in [[Sonic Origins]], and unchanged in any implementation since then. [https://github.com/nfrechette/acl/tree/a54c5c2781be9f14b840a60f8dd8ec6c5065885d/docs See the ACL docs for more info.] If &amp;lt;code&amp;gt;compressed == 0x08&amp;lt;/code&amp;gt;, skeletal animations and root motion animations are compressed. &lt;br /&gt;
&lt;br /&gt;
==== Compressed Data: ====&lt;br /&gt;
Below is a high level overview of the stored ACL chunk data:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct ACLData {&lt;br /&gt;
	uint32_t acl_chunk_size;&lt;br /&gt;
	int32_t acl_hash;&lt;br /&gt;
&lt;br /&gt;
	uint32_t acl_tag;		// Identifies ACL buffer type, always 0xAC11AC11 to mark compressed_tracks&lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/buffer_tag.h#L49&lt;br /&gt;
&lt;br /&gt;
	uint16_t acl_version;	// ACL Version Enum Identifier. 0x07 indicates v2.0.0, the only version observed in any HE2 game.&lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/compressed_tracks_version.h#L71&lt;br /&gt;
&lt;br /&gt;
	char acl_padding;		// always 0x00&lt;br /&gt;
	uint8_t acl_track_type;	// ACL Track Type Enum. 0x0C indicates qvvf, the only track type observed in any HE2 game. &lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/track_types.h#L68&lt;br /&gt;
&lt;br /&gt;
	uint32_t track_count;	// Bone count if skeletal animation, 0x01 if root motion. Should match header track_count if skeletal. &lt;br /&gt;
	uint32_t sample_count;	// Frame count, should match header frame_count.&lt;br /&gt;
	float32 sample_rate;	// Playback FPS of animation, should equal header ((frame_count - 1) / duration)&lt;br /&gt;
	char[acl_chunk_size - 0x1C] acl_data;   // String of compressed ACL data&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;At the end of an ACL chunk, if it is a skeletal animation chunk and root motion is present in the file, the chunk will be null padded to 16 bytes. If the ACL chunk is a root motion chunk or a skeletal animation with no associated root motion chunk in the file, the chunk will be null padded to 4 bytes. The last ACL chunk is immediately followed by the BINA offset table. &lt;br /&gt;
&lt;br /&gt;
==== Raw/Decompressed Track List: ====&lt;br /&gt;
The index lookup for which transform set belongs to which bone can be found in the skeleton file [[PXD#.skl.pxd Structure|(see .skl.pxd Structure)]]. Each bone uses an [https://github.com/nfrechette/rtm RTM] [https://github.com/nfrechette/rtm/blob/7c9a61e32744ee9ff2978328d0e585635fd55615/includes/rtm/types.h#L393 qvvf] struct for transformation. Though the &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; element of each vector has no bearing on the final animation, the games usually store a value in there anyways and appears to have an effect on compression:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct qvvf&lt;br /&gt;
{&lt;br /&gt;
	quatf rotation;			// XYZW Quaternion&lt;br /&gt;
	vector4f translation;	// XYZW Vector, W is undefined but appears to be bone length&lt;br /&gt;
	vector4f scale;			// XYZW Vector, W is undefined and always 1.0&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Native Uncompressed Data: ===&lt;br /&gt;
{{Notice|type=note|content=This section could use a less confusing explanation.}}&lt;br /&gt;
Alternatively to compressed ACL track data, the PXAN structure can store individual components (rotation, translation, scale) of any given track at any frame, and linearly interpolate between them independently. This system was first seen in the [[Mario &amp;amp; Sonic at the Rio 2016 Olympic Games|M&amp;amp;S 2016 Rio Olympic Games]] as the exclusive method of storing animations. ACL compression may have an advantage in reducing the file size of many of these animations but—though rare—uncompressed animations have been observed in subsequent games for certain animations, presumably to combat any potential jitter during close up cutscenes or similar situations. Though the actual end data contained in this method is simple, the structure can end up like a spider&#039;s nest at first glance:&lt;br /&gt;
&lt;br /&gt;
==== Track Offset Tables: ====&lt;br /&gt;
The first struct array found in the file is a track table for each bone. Within it, for each transform type (translation, rotation, scale), there is a keyframe count, offset pointing to a frame table, and offset pointing to an array of transforms. &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct TrackTableOffsets {&lt;br /&gt;
	uint64_t pos_key_count;			// Total number of translation keyframes for this bone&lt;br /&gt;
	uint64_t pos_table_offset;		// Offset for this bone&#039;s translation frame table&lt;br /&gt;
	uint64_t pos_values_offset;		// Starting offset for this bone&#039;s array of translation values&lt;br /&gt;
&lt;br /&gt;
	uint64_t rot_key_count;			// Total number of rotation keyframes for this bone&lt;br /&gt;
	uint64_t rot_table_offset;		// Offset for this bone&#039;s rotation frame table&lt;br /&gt;
	uint64_t rot_values_offset;		// Starting offset for this bone&#039;s array of rotation values&lt;br /&gt;
&lt;br /&gt;
	uint64_t scale_key_count;		// Total number of scale keyframes for this bone&lt;br /&gt;
	uint64_t scale_table_offset;	// Offset for this bone&#039;s scale frame table&lt;br /&gt;
	uint64_t scale_values_offset;	// Starting offset for this bone&#039;s array of scale values&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
TrackTableOffsets TrackTables[track_count];		// One for each bone, track_count from PXAN header&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Frame Tables and Transforms: ====&lt;br /&gt;
Each transform type will get a frame table as &amp;lt;code&amp;gt;uint16_t[key_count] keys;&amp;lt;/code&amp;gt; where each value is the frame that the keyframe will be inserted to, and transform array &amp;lt;code&amp;gt;vector4f[key_count] transforms; // XYZW floats&amp;lt;/code&amp;gt; that will correspond to the frame with the matching array index. Unlike in ACL decompressed tracks, native uncompressed tracks&#039; &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; component is always &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;. Both of these element arrays will be null aligned to 16 bytes.&lt;br /&gt;
&lt;br /&gt;
Posing and Transform Inheritance:&lt;br /&gt;
&lt;br /&gt;
Each bone&#039;s transformation is stored as an object space (AKA &#039;Pose Space&#039; or &#039;Model Space&#039;) transform relative to its parent bone&#039;s final transformation. That means, regardless of what the reset pose or bone orientations are in the model&#039;s skeleton, the stored values of any given frame will completely overwrite any pose previously present. &lt;br /&gt;
&lt;br /&gt;
However, there are two quirks that are unlike most interchange formats for 3D animations:&lt;br /&gt;
&lt;br /&gt;
# Scale inheritance is a simple local space copy of the parent&#039;s local space scale. There is no shearing or skewing of any kind.&lt;br /&gt;
#* &amp;lt;sub&amp;gt;In Blender, a bone&#039;s scale inheritance mode can be changed from `Full` to `Aligned` to achieve this effect&amp;lt;/sub&amp;gt;&lt;br /&gt;
# Calculating the position and rotation of any given bone is to be done independent of any scale values.&lt;br /&gt;
&lt;br /&gt;
When reading in-game, though scales from recursive parents are inherited and multiplied, translation is completely unaffected in any capacity, unintuitively. Therefore, before applying any object space transformation in a setting where parent scale is assumed to affect the child bone&#039;s location, each bone&#039;s final scale must be calculated and applied by multiplying its and each recursive parent&#039;s scales together. &lt;br /&gt;
&lt;br /&gt;
Trivia: The inheritance and relationships behavior for bone transform values are identical to all previous HE games that used Havok, possibly indicating that Sonic Team&#039;s custom implementation of animation playback and posing is loosely based on Havok&#039;s &amp;lt;code&amp;gt;hkaPose&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Skeleton files are stored in a [[BINA]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;lt;sub&amp;gt;TODO...&amp;lt;/sub&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Thanks ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/Turk645 Turk645:] Original uncompressed PXD blender importer scripts&lt;br /&gt;
* [https://github.com/WistfulHopes WistfulHopes:] ACL tools, blender export scripts&lt;br /&gt;
* [https://github.com/ik-01 ik-01]: Format and game code research, filling in gaps for unknown values&lt;br /&gt;
* [https://github.com/AdelQue AdelQue:] Format research, math relations and bone inheritance behaviors&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PBA&amp;diff=477</id>
		<title>PBA</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PBA&amp;diff=477"/>
		<updated>2025-04-08T08:07:19Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Created page with &amp;quot;{{Notice|type=warn|content=WIP Page, just adding to start}}  PBA files are bone physics files first found in Sonic Frontiers, and first regularly used in Shadow Generations. The system is capable of using bouncy bones/jiggle physics, ragdolling, and cloth simulation. The format is still relatively unknown and has only been brute forced through hex analysis more than code analysis, and there are unfortunately not many examples files to reference...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=WIP Page, just adding to start}}&lt;br /&gt;
&lt;br /&gt;
PBA files are bone physics files first found in [[Sonic Frontiers]], and first regularly used in [[Shadow Generations|Shadow Generations.]] The system is capable of using bouncy bones/jiggle physics, ragdolling, and cloth simulation. The format is still relatively unknown and has only been brute forced through hex analysis more than code analysis, and there are unfortunately not many examples files to reference. The below template has lots of unknowns and potentially wrong info. &lt;br /&gt;
&lt;br /&gt;
TODO: Cleanup:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//------------------------------------------------&lt;br /&gt;
//--- 010 Editor v12.0.1 Binary Template&lt;br /&gt;
//&lt;br /&gt;
//      File: &lt;br /&gt;
//   Authors: Ashrindy, AdelQ&lt;br /&gt;
//   Version: 0.0.1&lt;br /&gt;
//   Purpose: Shadow Gens PhysicalSkeleton&lt;br /&gt;
//  Category: &lt;br /&gt;
// File Mask: *.pba&lt;br /&gt;
//  ID Bytes: &lt;br /&gt;
//   History: &lt;br /&gt;
//------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;../include.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local uint64 dataPos;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    Vector4 rows[4];&lt;br /&gt;
}Matrix4x4&amp;lt;optimize=false&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    byte UnkB1; // Always 2 or 1, unknown flag&lt;br /&gt;
    byte UnkB2; // Always 0 or 1, unknown flag&lt;br /&gt;
    byte UnkB3[2];  // Padding?&lt;br /&gt;
    float Unk_f[4];    // Upper/Lower limits of something?&lt;br /&gt;
}LimitsStruct&amp;lt;optimize=false&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset BoneName;&lt;br /&gt;
    int unk; // if this is related to collision, this could be an enum for the collision shape&lt;br /&gt;
    float unk2; // Physics dampening? Lower values make bones wobble for longer&lt;br /&gt;
    Matrix4x4 mat;  // Most likely not a matrix, has parameters that affect gravity, stretch, etc, and possibly capsule/collision bounds(?) but still working through&lt;br /&gt;
}CollisionStruct&amp;lt;optimize=false&amp;gt;;   // Has params that affect physics intensity still, maybe general physics&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset BoneName;&lt;br /&gt;
    byte Unk1[4]; // All known examples are 01 01 14 00. could be bitflags by the looks of it&lt;br /&gt;
    int16 LocalParentBoneIndex;    // FF FF if no bone parent&lt;br /&gt;
    int16 LocalBoneIndex;&lt;br /&gt;
    int16 RealParentBoneIndex; // Usually the parent of this bone on the real skeleton, but can be any bone in practice. Perhaps a reference for the offset transform?&lt;br /&gt;
    int16 Unk3;&lt;br /&gt;
    LimitsStruct Limits[6]; // Unknown what these limits line up to (Pos to Neg X, Pos to Neg Y, etc)&lt;br /&gt;
    float Unk4&amp;lt;hidden=true&amp;gt;; // Align&lt;br /&gt;
    Matrix4x4 mat;  // Possibly bone offset matrix relative to RealParentBoneIndex? A: Two quaternions in row 2 and 4?&lt;br /&gt;
}&lt;br /&gt;
JiggleStruct&amp;lt;optimize=false&amp;gt;; // Handles bone chain relations for bendy/jiggle physics, as well as presumably transform limits&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    // Starting point needs to align to 16 bytes&lt;br /&gt;
    local uint64 CurPos = FTell();&lt;br /&gt;
    local uint64 AlignCheck = CurPos % 0x10;&lt;br /&gt;
    if (AlignCheck)&lt;br /&gt;
        FSeek(CurPos + 0x10 - AlignCheck);&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset BoneName;&lt;br /&gt;
    float unk0; // All known examples = 0.01&lt;br /&gt;
    int16 unk1&amp;lt;hidden=true&amp;gt;; // Always FF FF&lt;br /&gt;
    int16 if_pinned;    // 1 if no parent present. Possibly this bone controls corresponding vertex if 1, versus vertex controls cooresponding bone if 0&lt;br /&gt;
    int16 child_idx;    // FF if no child&lt;br /&gt;
    int16 parent_idx;   // FF if no parent&lt;br /&gt;
    int16 unk2[2]&amp;lt;hidden=true&amp;gt;;  // Always FF FF&lt;br /&gt;
    int16 left_idx;&lt;br /&gt;
    int16 right_idx;&lt;br /&gt;
}cloth_node&amp;lt;optimize=false&amp;gt;;    // Defines up to 4 neighboring bones in a cloth bone grid&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    int16 verts[2];&lt;br /&gt;
    float edge_length;&lt;br /&gt;
    float unk_factor;   // Normalized, lateral direct connections = 0.5, lateral skip connections = 0.3, vertical direct connections = 1.0. Maybe a stretch/shrink factor?&lt;br /&gt;
}cloth_edges&amp;lt;optimize=false&amp;gt;;   // Lagrangian cloth sim edge mesh&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset cloth_name;&lt;br /&gt;
    float unk1[10];&lt;br /&gt;
    int16 unk_count1[2];&lt;br /&gt;
    int32 cloth_node_count;&lt;br /&gt;
    int32 cloth_edge_count;&lt;br /&gt;
    int32 unk3&amp;lt;hidden=true&amp;gt;; // Align&lt;br /&gt;
    int64 cloth_node_ptr;&lt;br /&gt;
    int64 cloth_edge_ptr;&lt;br /&gt;
    local int64 prePos = FTell();&lt;br /&gt;
    FSeek(cloth_node_ptr + dataPos);&lt;br /&gt;
    cloth_node bones[cloth_node_count];&lt;br /&gt;
    FSeek(cloth_edge_ptr + dataPos);&lt;br /&gt;
    cloth_edges edges[cloth_edge_count];&lt;br /&gt;
    FSeek(prePos);&lt;br /&gt;
}ClothStruct&amp;lt;optimize=false&amp;gt;;   &lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    char signature[4]&amp;lt;name=&amp;quot;Signature&amp;quot;&amp;gt;;&lt;br /&gt;
    int version &amp;lt;format=hex, name=&amp;quot;Version&amp;quot;&amp;gt;;&lt;br /&gt;
    StringOffset SkeletonName;&lt;br /&gt;
    uint32 CollisionCount;&lt;br /&gt;
    uint32 JiggleCount;&lt;br /&gt;
    uint64 CollisionOffset;&lt;br /&gt;
    uint64 JiggleOffset;&lt;br /&gt;
    uint32 ClothCount;&lt;br /&gt;
    uint32 UnkCount;&lt;br /&gt;
    uint64 ClothOffset;&lt;br /&gt;
    uint64 UnkOffset;&lt;br /&gt;
    FSeek(CollisionOffset + dataPos);&lt;br /&gt;
    CollisionStruct CollisionStructs[CollisionCount];&lt;br /&gt;
    FSeek(JiggleOffset + dataPos);&lt;br /&gt;
    JiggleStruct JiggleStructs[JiggleCount];&lt;br /&gt;
    FSeek(ClothOffset + dataPos);&lt;br /&gt;
    ClothStruct ClothStructs[ClothCount];&lt;br /&gt;
}&lt;br /&gt;
ResPhysicalSkeleton&amp;lt;open=true&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
ResBinaryFile file(&amp;quot;ResPhysicalSkeleton&amp;quot;)&amp;lt;name=Str(&amp;quot;%s&amp;quot;, FileNameGetBase(GetFileName()))&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Documentation&amp;diff=476</id>
		<title>Documentation</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Documentation&amp;diff=476"/>
		<updated>2025-04-08T08:00:35Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This section lists documentation pages for resources you&#039;ll find in Sonic games. You&#039;ll find information about certain file formats and other general game resources.&lt;br /&gt;
&lt;br /&gt;
== Set-Data ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[HSON Format|HSON]] (Hedgehog Set Object Notation)&lt;br /&gt;
|Universal object placement representation format.&lt;br /&gt;
|&amp;lt;code&amp;gt;.hson&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User Interface ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[NCP File Format|NCP]] (Ninja CellSpriteDraw Project)&lt;br /&gt;
|Describes a user interface in most Hedgehog Engine games.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;code&amp;gt;.xncp&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.yncp&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.gncp&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.sncp&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* [[Kunai]]&lt;br /&gt;
* [[Shuriken]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Archives ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[NN Chunk Format|NN Chunk]]&lt;br /&gt;
|Generic container format.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[PXD|PXD Animation]]&lt;br /&gt;
|Skeleton and skeletal animation format in Hedgehog Engine 2 Games&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt;&lt;br /&gt;
|[[Frontiers Animation Tools]]&lt;br /&gt;
|-&lt;br /&gt;
|[[PBA|PBA Skeleton]]&lt;br /&gt;
|Physics Based Animation Skeleton for Hedgehog Engine 2 Games&lt;br /&gt;
|&amp;lt;code&amp;gt;.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Documentation&amp;diff=475</id>
		<title>Documentation</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Documentation&amp;diff=475"/>
		<updated>2025-04-08T08:00:15Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This section lists documentation pages for resources you&#039;ll find in Sonic games. You&#039;ll find information about certain file formats and other general game resources.&lt;br /&gt;
&lt;br /&gt;
== Set-Data ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[HSON Format|HSON]] (Hedgehog Set Object Notation)&lt;br /&gt;
|Universal object placement representation format.&lt;br /&gt;
|&amp;lt;code&amp;gt;.hson&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User Interface ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[NCP File Format|NCP]] (Ninja CellSpriteDraw Project)&lt;br /&gt;
|Describes a user interface in most Hedgehog Engine games.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;code&amp;gt;.xncp&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.yncp&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.gncp&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.sncp&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* [[Kunai]]&lt;br /&gt;
* [[Shuriken]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Archives ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[NN Chunk Format|NN Chunk]]&lt;br /&gt;
|Generic container format.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[PXD|PXD Animation]]&lt;br /&gt;
|Skeleton and skeletal animation format in Hedgehog Engine 2 Games&lt;br /&gt;
|&amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt;&lt;br /&gt;
|[[Frontiers Animation Tools]]&lt;br /&gt;
|-&lt;br /&gt;
|[[PBA|PBA Skeleton]]&lt;br /&gt;
|Physics Based Animation Skeleton for Hedgehog Engine 2 Games&lt;br /&gt;
|&amp;lt;code&amp;gt;.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Documentation&amp;diff=474</id>
		<title>Documentation</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Documentation&amp;diff=474"/>
		<updated>2025-04-08T07:59:51Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This section lists documentation pages for resources you&#039;ll find in Sonic games. You&#039;ll find information about certain file formats and other general game resources.&lt;br /&gt;
&lt;br /&gt;
== Set-Data ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[HSON Format|HSON]] (Hedgehog Set Object Notation)&lt;br /&gt;
|Universal object placement representation format.&lt;br /&gt;
|&amp;lt;code&amp;gt;.hson&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User Interface ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[NCP File Format|NCP]] (Ninja CellSpriteDraw Project)&lt;br /&gt;
|Describes a user interface in most Hedgehog Engine games.&lt;br /&gt;
|&amp;lt;code&amp;gt;.xncp&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;.yncp&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;.gncp&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;.sncp&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* [[Kunai]]&lt;br /&gt;
* [[Shuriken]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Archives ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[NN Chunk Format|NN Chunk]]&lt;br /&gt;
|Generic container format.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[PXD|PXD Animation]]&lt;br /&gt;
|Skeleton and skeletal animation format in Hedgehog Engine 2 Games&lt;br /&gt;
|&amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt;&lt;br /&gt;
|[[Frontiers Animation Tools]]&lt;br /&gt;
|-&lt;br /&gt;
|[[PBA|PBA Skeleton]]&lt;br /&gt;
|Physics Based Animation Skeleton for Hedgehog Engine 2 Games&lt;br /&gt;
|&amp;lt;code&amp;gt;.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Documentation&amp;diff=473</id>
		<title>Documentation</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Documentation&amp;diff=473"/>
		<updated>2025-04-08T07:59:26Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This section lists documentation pages for resources you&#039;ll find in Sonic games. You&#039;ll find information about certain file formats and other general game resources.&lt;br /&gt;
&lt;br /&gt;
== Set-Data ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[HSON Format|HSON]] (Hedgehog Set Object Notation)&lt;br /&gt;
|Universal object placement representation format.&lt;br /&gt;
|&amp;lt;code&amp;gt;.hson&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User Interface ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[NCP File Format|NCP]] (Ninja CellSpriteDraw Project)&lt;br /&gt;
|Describes a user interface in most Hedgehog Engine games.&lt;br /&gt;
|&amp;lt;code&amp;gt;.xncp&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;.yncp&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;.gncp&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;.sncp&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* [[Kunai]]&lt;br /&gt;
* [[Shuriken]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Archives ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[NN Chunk Format|NN Chunk]]&lt;br /&gt;
|Generic container format.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[PXD|PXD Animation]]&lt;br /&gt;
|Skeleton and skeletal animation format in Hedgehog Engine 2 Games&lt;br /&gt;
|&amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt;&lt;br /&gt;
|[[Frontiers Animation Tools]]&lt;br /&gt;
|-&lt;br /&gt;
|[[PBA|PBA Skeleton]]&lt;br /&gt;
|Physics Based Animation Skeleton for Hedgehog Engine 2 Games&lt;br /&gt;
|&amp;lt;code&amp;gt;.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Documentation&amp;diff=472</id>
		<title>Documentation</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Documentation&amp;diff=472"/>
		<updated>2025-04-08T07:56:06Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This section lists documentation pages for resources you&#039;ll find in Sonic games. You&#039;ll find information about certain file formats and other general game resources.&lt;br /&gt;
&lt;br /&gt;
== Set-Data ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[HSON Format|HSON]] (Hedgehog Set Object Notation)&lt;br /&gt;
|Universal object placement representation format.&lt;br /&gt;
|&amp;lt;code&amp;gt;.hson&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User Interface ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[NCP File Format|NCP]] (Ninja CellSpriteDraw Project)&lt;br /&gt;
|Describes a user interface in most Hedgehog Engine games.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;small&amp;gt;&amp;lt;code&amp;gt;.xncp&amp;lt;/code&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
* &amp;lt;small&amp;gt;&amp;lt;code&amp;gt;.yncp&amp;lt;/code&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
* &amp;lt;small&amp;gt;&amp;lt;code&amp;gt;.gncp&amp;lt;/code&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
* &amp;lt;small&amp;gt;&amp;lt;code&amp;gt;.sncp&amp;lt;/code&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* [[Kunai]]&lt;br /&gt;
* [[Shuriken]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Archives ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[NN Chunk Format|NN Chunk]]&lt;br /&gt;
|Generic container format.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[PXD|PXD Animation]]&lt;br /&gt;
|Skeletal animation format in Hedgehog Engine 2 Games&lt;br /&gt;
|&amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |[[Frontiers Animation Tools]]&lt;br /&gt;
|-&lt;br /&gt;
|[[PXD|PXD Skeleton]]&lt;br /&gt;
|Skeleton format in Hedgehog Engine 2 Games&lt;br /&gt;
|&amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[PBA|PBA Skeleton]]&lt;br /&gt;
|Physics Based Animation Skeleton for Hedgehog Engine 2 Games&lt;br /&gt;
|&amp;lt;code&amp;gt;.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Documentation&amp;diff=471</id>
		<title>Documentation</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Documentation&amp;diff=471"/>
		<updated>2025-04-08T07:55:42Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This section lists documentation pages for resources you&#039;ll find in Sonic games. You&#039;ll find information about certain file formats and other general game resources.&lt;br /&gt;
&lt;br /&gt;
== Set-Data ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[HSON Format|HSON]] (Hedgehog Set Object Notation)&lt;br /&gt;
|Universal object placement representation format.&lt;br /&gt;
|&amp;lt;code&amp;gt;.hson&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User Interface ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[NCP File Format|NCP]] (Ninja CellSpriteDraw Project)&lt;br /&gt;
|Describes a user interface in most Hedgehog Engine games.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;small&amp;gt;&amp;lt;code&amp;gt;.xncp&amp;lt;/code&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
* &amp;lt;small&amp;gt;&amp;lt;code&amp;gt;.yncp&amp;lt;/code&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
* &amp;lt;small&amp;gt;&amp;lt;code&amp;gt;.gncp&amp;lt;/code&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
* &amp;lt;small&amp;gt;&amp;lt;code&amp;gt;.sncp&amp;lt;/code&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* [[Kunai]]&lt;br /&gt;
* [[Shuriken]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Archives ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[NN Chunk Format|NN Chunk]]&lt;br /&gt;
|Generic container format.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[PXD|PXD Animation]]&lt;br /&gt;
|Skeletal animation format in Hedgehog Engine 2 Games&lt;br /&gt;
|&amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |[[Frontiers Animation Tools]]&lt;br /&gt;
|-&lt;br /&gt;
|[[PXD|PXD Skeleton]]&lt;br /&gt;
|Skeleton format in Hedgehog Engine 2 Games&lt;br /&gt;
|&amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[PBA|PBA Skeleton]]&lt;br /&gt;
|Physics Based Animation Skeleton for Hedgehog Engine 2 Games&lt;br /&gt;
|&amp;lt;code&amp;gt;.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Documentation&amp;diff=469</id>
		<title>Documentation</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Documentation&amp;diff=469"/>
		<updated>2025-04-08T07:51:49Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Add PBA&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This section lists documentation pages for resources you&#039;ll find in Sonic games. You&#039;ll find information about certain file formats and other general game resources.&lt;br /&gt;
&lt;br /&gt;
== Set-Data ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[HSON Format|HSON]] (Hedgehog Set Object Notation)&lt;br /&gt;
|Universal object placement representation format.&lt;br /&gt;
|&amp;lt;code&amp;gt;.hson&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User Interface ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[NCP File Format|NCP]] (Ninja CellSpriteDraw Project)&lt;br /&gt;
|Describes a user interface in most Hedgehog Engine games.&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;small&amp;gt;.xncp&amp;lt;/small&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;small&amp;gt;.yncp&amp;lt;/small&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;small&amp;gt;.gncp&amp;lt;/small&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;small&amp;gt;.sncp&amp;lt;/small&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* [[Kunai]]&lt;br /&gt;
* [[Shuriken]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Archives ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[NN Chunk Format|NN Chunk]]&lt;br /&gt;
|Generic container format.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[PXD|PXD Animation]]&lt;br /&gt;
|Skeletal animation format in Hedgehog Engine 2 Games&lt;br /&gt;
|&amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |[[Frontiers Animation Tools]]&lt;br /&gt;
|-&lt;br /&gt;
|[[PXD|PXD Skeleton]]&lt;br /&gt;
|Skeleton format in Hedgehog Engine 2 Games&lt;br /&gt;
|&amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[PBA|PBA Skeleton]]&lt;br /&gt;
|Physics Based Animation Skeleton for Hedgehog Engine 2 Games&lt;br /&gt;
|&amp;lt;code&amp;gt;.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Sonic_Frontiers&amp;diff=465</id>
		<title>Sonic Frontiers</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Sonic_Frontiers&amp;diff=465"/>
		<updated>2025-04-08T07:49:44Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Add Animation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tools ==&lt;br /&gt;
&lt;br /&gt;
==== Animation ====&lt;br /&gt;
&lt;br /&gt;
* [[Frontiers Animation Tools]]&lt;br /&gt;
&lt;br /&gt;
== Guides ==&lt;br /&gt;
N/A&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
==== Game ====&lt;br /&gt;
* [[Sonic Frontiers DLCs|DLCs]]&lt;br /&gt;
* [[Sonic Frontiers Stage IDs|Stage IDs]]&lt;br /&gt;
* [[Sonic Frontiers Enemy Internal Names|Enemy Internal Names]]&lt;br /&gt;
* [[Sonic Frontiers Script Functions|Script Functions]]&lt;br /&gt;
&lt;br /&gt;
==== File Formats ====&lt;br /&gt;
&lt;br /&gt;
* [[Sonic Frontiers RFL|Reflection Data &amp;lt;code&amp;gt;.rfl&amp;lt;/code&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==== Objects ====&lt;br /&gt;
&lt;br /&gt;
* [[Sonic Frontiers Gismos|Gismos]]&lt;br /&gt;
&lt;br /&gt;
== Discoveries ==&lt;br /&gt;
N/A&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Shadow_Generations&amp;diff=464</id>
		<title>Shadow Generations</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Shadow_Generations&amp;diff=464"/>
		<updated>2025-04-08T07:49:32Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Add Animation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
=== Animation ===&lt;br /&gt;
&lt;br /&gt;
* [[Frontiers Animation Tools]]&lt;br /&gt;
&lt;br /&gt;
== Guides ==&lt;br /&gt;
N/A&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
==== Game ====&lt;br /&gt;
* [[Shadow Generations Stage IDs|Stage IDs]]&lt;br /&gt;
* [[Shadow Generations Event IDs|Event IDs]]&lt;br /&gt;
&lt;br /&gt;
== Discoveries ==&lt;br /&gt;
N/A&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Guides&amp;diff=463</id>
		<title>Guides</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Guides&amp;diff=463"/>
		<updated>2025-04-08T07:41:33Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: It&amp;#039;s not immediately obvious from the home page that the list of games go to lists of guides. Adding redirect in case a direct link becomes necessary&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Games]]&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PXD&amp;diff=462</id>
		<title>PXD</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PXD&amp;diff=462"/>
		<updated>2025-04-08T07:37:46Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Added uncompressed animation section, cleaned up&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=This page is unfinished.}}&lt;br /&gt;
&lt;br /&gt;
== PXD Files ==&lt;br /&gt;
Hedgehog Engine 2 games from [[Mario &amp;amp; Sonic at the Rio 2016 Olympic Games|Rio 2016 Olympics]] to [[Shadow Generations]] contain skeleton and skeletal animation files with the file extensions &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; respectively, stored in a [[BINA]] container. Skeletons contain pose data that usually result in a T-Pose, bone and parent indices, and bone names. Animations contain playback metadata such as frame rate and frame count, track count, and either compressed animation pose data using [https://github.com/nfrechette/acl ACL compression,] or raw uncompressed pose data that use bone and frame indices to specify keyframed transforms, with linear interpolation between keyframes. For both skeletons and animations, position and rotation data for each bone is an absolute transform relative to the parent position, whereas scales are inherited from their respective parents locally, and have no effect on their positions. &lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Animation files are stored in a [[BINA]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt; identified as &amp;lt;code&amp;gt;PXAN&amp;lt;/code&amp;gt;, possibly for &amp;quot;PXD Animation&amp;quot; or similar:&lt;br /&gt;
&lt;br /&gt;
=== PXAN Header ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct Header {&lt;br /&gt;
	char[4] magic;		// &#039;NAXP&#039;&lt;br /&gt;
	uint32_t version;	// Always 0x200&lt;br /&gt;
	uint8_t additive;	// 0x01 if additive, else 0x00&lt;br /&gt;
	uint8_t compressed;	// 0x08 if ACL compressed, 0x00 if uncompressed&lt;br /&gt;
	char[6];			// Null alignment to 8 bytes&lt;br /&gt;
	uint64_t metadata_offset;	// Offset to metadata, always 0x18&lt;br /&gt;
	float duration;				// Duration of the animation in seconds, calculated as ((frame_count - 1) / FPS)&lt;br /&gt;
	uint32_t frame_count;	&lt;br /&gt;
	uint32_t track_count;		// Bone count&lt;br /&gt;
	uint64_t skel_anim_offset;	// Offset for character&#039;s skeletal animation, always 0x40 if compressed, 0x38 if uncompressed&lt;br /&gt;
	uint64_t root_anim_offset;	// Offset for root motion animation, 0x00 if no root motion is present, aligned to 16 bytes&lt;br /&gt;
	if (compressed == 0x08)&lt;br /&gt;
	char[8];		// Null alignment to 0x10 bytes for ACL data. &lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ACL Data: ===&lt;br /&gt;
All Hedgehog Engine 2 games that utilize the ACL library appear to use v2.0.0, first seen in [[Sonic Origins]], and unchanged in any implementation since then. [https://github.com/nfrechette/acl/tree/a54c5c2781be9f14b840a60f8dd8ec6c5065885d/docs See the ACL docs for more info.] If &amp;lt;code&amp;gt;compressed == 0x08&amp;lt;/code&amp;gt;, skeletal animations and root motion animations are compressed. &lt;br /&gt;
&lt;br /&gt;
==== Compressed Data: ====&lt;br /&gt;
Below is a high level overview of the stored ACL chunk data:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct ACLData {&lt;br /&gt;
	uint32_t acl_chunk_size;&lt;br /&gt;
	int32_t acl_hash;&lt;br /&gt;
&lt;br /&gt;
	uint32_t acl_tag;		// Identifies ACL buffer type, always 0xAC11AC11 to mark compressed_tracks&lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/buffer_tag.h#L49&lt;br /&gt;
&lt;br /&gt;
	uint16_t acl_version;	// ACL Version Enum Identifier. 0x07 indicates v2.0.0, the only version observed in any HE2 game.&lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/compressed_tracks_version.h#L71&lt;br /&gt;
&lt;br /&gt;
	char acl_padding;		// always 0x00&lt;br /&gt;
	uint8_t acl_track_type;	// ACL Track Type Enum. 0x0C indicates qvvf, the only track type observed in any HE2 game. &lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/track_types.h#L68&lt;br /&gt;
&lt;br /&gt;
	uint32_t track_count;	// Bone count if skeletal animation, 0x01 if root motion. Should match header track_count if skeletal. &lt;br /&gt;
	uint32_t sample_count;	// Frame count, should match header frame_count.&lt;br /&gt;
	float32 sample_rate;	// Playback FPS of animation, should equal header ((frame_count - 1) / duration)&lt;br /&gt;
	char[acl_chunk_size - 0x1C] acl_data;   // String of compressed ACL data&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;At the end of an ACL chunk, if it is a skeletal animation chunk and root motion is present in the file, the chunk will be null padded to 16 bytes. If the ACL chunk is a root motion chunk or a skeletal animation with no associated root motion chunk in the file, the chunk will be null padded to 4 bytes. The last ACL chunk is immediately followed by the BINA offset table. &lt;br /&gt;
&lt;br /&gt;
==== Raw/Decompressed Track List: ====&lt;br /&gt;
The index lookup for which transform set belongs to which bone can be found in the skeleton file [[PXD#.skl.pxd Structure|(see .skl.pxd Structure)]]. Each bone uses an [https://github.com/nfrechette/rtm RTM] [https://github.com/nfrechette/rtm/blob/7c9a61e32744ee9ff2978328d0e585635fd55615/includes/rtm/types.h#L393 qvvf] struct for transformation. Though the &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; element of each vector has no bearing on the final animation, the games usually store a value in there anyways and appears to have an effect on compression:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct qvvf&lt;br /&gt;
{&lt;br /&gt;
	quatf rotation;			// XYZW Quaternion&lt;br /&gt;
	vector4f translation;	// XYZW Vector, W is undefined but appears to be bone length&lt;br /&gt;
	vector4f scale;			// XYZW Vector, W is undefined and always 1.0&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Native Uncompressed Data: ===&lt;br /&gt;
{{Notice|type=note|content=This section could use a less confusing explanation.}}&lt;br /&gt;
&amp;lt;sub&amp;gt;Alternatively to compressed ACL track data, the PXAN structure can store individual components (rotation, translation, scale) of any given track at any frame, and linearly interpolate between them independently. This system was first seen in the [[Mario &amp;amp; Sonic at the Rio 2016 Olympic Games|M&amp;amp;S 2016 Rio Olympic Games]] as the exclusive method of storing animations. ACL compression may have an advantage in reducing the file size of many of these animations but—though rare—uncompressed animations have been observed in subsequent games for certain animations, presumably to combat any potential jitter during close up cutscenes or similar situations. Though the actual end data contained in this method is simple, the structure can end up like a spider&#039;s nest at first glance:&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Track Offset Tables: ====&lt;br /&gt;
The first struct array found in the file is a track table for each bone. Within it, for each transform type (translation, rotation, scale), there is a keyframe count, offset pointing to a frame table, and offset pointing to an array of transforms. &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct TrackTableOffsets {&lt;br /&gt;
	uint64_t pos_key_count;			// Total number of translation keyframes for this bone&lt;br /&gt;
	uint64_t pos_table_offset;		// Offset for this bone&#039;s translation frame table&lt;br /&gt;
	uint64_t pos_values_offset;		// Starting offset for this bone&#039;s array of translation values&lt;br /&gt;
&lt;br /&gt;
	uint64_t rot_key_count;			// Total number of rotation keyframes for this bone&lt;br /&gt;
	uint64_t rot_table_offset;		// Offset for this bone&#039;s rotation frame table&lt;br /&gt;
	uint64_t rot_values_offset;		// Starting offset for this bone&#039;s array of rotation values&lt;br /&gt;
&lt;br /&gt;
	uint64_t scale_key_count;		// Total number of scale keyframes for this bone&lt;br /&gt;
	uint64_t scale_table_offset;	// Offset for this bone&#039;s scale frame table&lt;br /&gt;
	uint64_t scale_values_offset;	// Starting offset for this bone&#039;s array of scale values&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
TrackTableOffsets TrackTables[track_count];		// One for each bone, track_count from PXAN header&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Frame Tables and Transforms: ====&lt;br /&gt;
Each transform type will get a frame table as &amp;lt;code&amp;gt;uint16_t[key_count] keys;&amp;lt;/code&amp;gt; where each value is the frame that the keyframe will be inserted to, and transform array &amp;lt;code&amp;gt;vector4f[key_count] transforms; // XYZW floats&amp;lt;/code&amp;gt; that will correspond to the frame with the matching array index. Unlike in ACL decompressed tracks, native uncompressed tracks&#039; &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; component is always &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;. Both of these element arrays will be null aligned to 16 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Posing and Transform Inheritance: ===&lt;br /&gt;
Each bone&#039;s transformation is stored as an object space (AKA &#039;Pose Space&#039; or &#039;Model Space&#039;) transform relative to its parent bone&#039;s final transformation. That means, regardless of what the reset pose or bone orientations are in the model&#039;s skeleton, the stored values of any given frame will completely overwrite any pose previously present. &lt;br /&gt;
&lt;br /&gt;
However, there are two quirks that are unlike most interchange formats for 3D animations:&lt;br /&gt;
&lt;br /&gt;
1.) Scale inheritance is a simple local space copy of the parent&#039;s local space scale. There is no shearing or skewing of any kind. &amp;lt;!-- In Blender, a bone&#039;s scale inheritance mode can be changed from `Full` to `Aligned` to achieve this effect --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2.) Calculating the position and rotation of any given bone is to be done independent of any scale values. &lt;br /&gt;
&lt;br /&gt;
When reading in-game, though scales from recursive parents are inherited and multiplied, translation is completely unaffected in any capacity, unintuitively. Therefore, before applying any object space transformation in a setting where parent scale is assumed to affect the child bone&#039;s location, each bone&#039;s final scale must be calculated and applied by multiplying its and each recursive parent&#039;s scales together. &lt;br /&gt;
&lt;br /&gt;
Trivia: The inheritance and relationships behavior for bone transform values are identical to all previous HE games that used Havok, possibly indicating that Sonic Team&#039;s custom implementation of animation playback and posing is loosely based on Havok&#039;s &amp;lt;code&amp;gt;hkaPose&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Skeleton files are stored in a [[BINA]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;lt;sub&amp;gt;TODO...&amp;lt;/sub&amp;gt;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Games&amp;diff=461</id>
		<title>Games</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Games&amp;diff=461"/>
		<updated>2025-04-08T05:30:10Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Added dead link for consistency from another page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This section lists Sonic games by their engine, alongside their internal name. In this page, you&#039;re also able to access the game&#039;s own HedgeDocs page, which contains game specific guides, tools, and documentation.&lt;br /&gt;
&lt;br /&gt;
== Hedgehog Engine ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Unleashed|Sonic Unleashed (Sonic World Adventure)]]&lt;br /&gt;
|SWA&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Colors]]&lt;br /&gt;
|sonic2010&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Generations]]&lt;br /&gt;
|BlueBlur&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Lost World]]&lt;br /&gt;
|sonic2013&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Colors: Ultimate*&lt;br /&gt;
|Rainbow&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Generations (SONIC X SHADOW GENERATIONS)&lt;br /&gt;
|miller_g&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&amp;lt;small&amp;gt;* Sonic Colors: Ultimate also makes use of a forked version of Godot 3.&amp;lt;/small&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Hedgehog Engine 2 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
|-&lt;br /&gt;
|[[Mario &amp;amp; Sonic at the Rio 2016 Olympic Games]]&lt;br /&gt;
|unison&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Forces]]&lt;br /&gt;
|wars&lt;br /&gt;
|-&lt;br /&gt;
|Olympic Games Tokyo 2020 - The Official Video Game&lt;br /&gt;
|musashi&lt;br /&gt;
|-&lt;br /&gt;
|Mario &amp;amp; Sonic at the Tokyo 2020 Olympic Games&lt;br /&gt;
|rings&lt;br /&gt;
|-&lt;br /&gt;
|(New) Sakura Wars&lt;br /&gt;
|arukas&lt;br /&gt;
|-&lt;br /&gt;
|Puyo Puyo Tetris 2&lt;br /&gt;
|tenpex&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Origins*&lt;br /&gt;
|hite&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Frontiers]]&lt;br /&gt;
|rangers&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Frontiers: Digital Art Book with Mini Digital Soundtrack&lt;br /&gt;
|rangers_artbook&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Origins Plus*&lt;br /&gt;
|hiteplus&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Superstars - Digital Artbook and mini-OST&lt;br /&gt;
|orion_artbook&lt;br /&gt;
|-&lt;br /&gt;
|[[Shadow Generations]] / SONIC X SHADOW GENERATIONS&lt;br /&gt;
|miller&lt;br /&gt;
|-&lt;br /&gt;
|SONIC X SHADOW GENERATIONS: Art Book with Mini Soundtrack&lt;br /&gt;
|miller_das&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&amp;lt;small&amp;gt;* Sonic Origins (Plus) also makes use of Retro Engine v5U.&amp;lt;/small&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== SEGA NN ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic the Hedgehog (2006)|SONIC THE HEDGEHOG]]&lt;br /&gt;
|SonicNext / marathon&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Documentation&amp;diff=460</id>
		<title>Documentation</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Documentation&amp;diff=460"/>
		<updated>2025-04-06T01:32:43Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Added PXD Links, code blocked extensions to be better readable&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This section lists documentation pages for resources you&#039;ll find in Sonic games. You&#039;ll find information about certain file formats and other general game resources.&lt;br /&gt;
&lt;br /&gt;
== Set-Data ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[HSON Format|HSON]] (Hedgehog Set Object Notation)&lt;br /&gt;
|Universal object placement representation format.&lt;br /&gt;
|&amp;lt;code&amp;gt;.hson&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User Interface ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[NCP File Format|NCP]] (Ninja CellSpriteDraw Project)&lt;br /&gt;
|Describes a user interface in most Hedgehog Engine games.&lt;br /&gt;
|&amp;lt;code&amp;gt;.xncp&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;.yncp&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;.gncp&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;.sncp&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* [[Kunai]]&lt;br /&gt;
* [[Shuriken]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Archives ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[NN Chunk Format|NN Chunk]]&lt;br /&gt;
|Generic container format.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[PXD|PXD Animation]]&lt;br /&gt;
|Skeletal animation format in Hedgehog Engine 2 Games&lt;br /&gt;
|&amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |[[Frontiers Animation Tools]]&lt;br /&gt;
|-&lt;br /&gt;
|[[PXD|PXD Skeleton]]&lt;br /&gt;
|Skeleton format in Hedgehog Engine 2 Games&lt;br /&gt;
|&amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PXD&amp;diff=459</id>
		<title>PXD</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PXD&amp;diff=459"/>
		<updated>2025-04-06T01:26:55Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Added unfinished warning&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=This page is unfinished.}}&lt;br /&gt;
&lt;br /&gt;
== PXD Files ==&lt;br /&gt;
Hedgehog Engine 2 games from 2016 Olympics to Shadow Generations contain skeleton and skeletal animation files with the file extensions &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; respectively, stored in a [[BINA]] container. Skeletons contain pose data that usually result in a T-Pose, bone and parent indices, and bone names. Animations contain playback metadata such as frame rate and frame count, track count, and either compressed animation pose data using [https://github.com/nfrechette/acl ACL compression,] or raw uncompressed pose data that use bone and frame indices to specify keyframed transforms, with linear interpolation between keyframes. For both skeletons and animations, position and rotation data for each bone is an absolute transform relative to the parent position, whereas scales are inherited from their respective parents locally, and have no effect on their positions. &lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Animation files are stored in a [[BINA]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
=== Header: ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct Header {&lt;br /&gt;
    char[4] magic;  // &#039;NAXP&#039;&lt;br /&gt;
    uint32_t version;   // Always 0x200&lt;br /&gt;
    uint8_t additive;      // 0x01 if additive, else 0x00&lt;br /&gt;
    uint8_t compressed;    // 0x08 if ACL compressed, 0x00 if uncompressed&lt;br /&gt;
    char[6];            // 0x00 align to 8 bytes&lt;br /&gt;
    uint64_t metadata_offset;    // Offset to metadata, always 0x18&lt;br /&gt;
    float32 duration;         // Duration of the animation in seconds, calculated as ((frame_count-1) / FPS)&lt;br /&gt;
    uint32_t frame_count;   // Frame count&lt;br /&gt;
    uint32_t track_count;   // Bone count&lt;br /&gt;
    uint64_t skel_anim_offset;  // Offset for character&#039;s skeletal animation, always 0x40 if compressed, 0x38 if uncompressed&lt;br /&gt;
    uint64_t root_anim_offset;  // Offset for root motion animation, 0x00 if no root motion is present, aligned to 16 bytes&lt;br /&gt;
    if (compressed)&lt;br /&gt;
        char[8];    // Likely alignment to 16 bytes for ACL data. Always 0x00 if compressed&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ACL Data: ===&lt;br /&gt;
All Hedgehog Engine 2 games that utilize the ACL library appear to use v2.0.0. [https://github.com/nfrechette/acl/tree/a54c5c2781be9f14b840a60f8dd8ec6c5065885d/docs See the ACL docs for more info.] If &amp;lt;code&amp;gt;compressed == 0x08&amp;lt;/code&amp;gt;, skeletal animations and root motion animations are compressed. &lt;br /&gt;
&lt;br /&gt;
==== Compressed Data: ====&lt;br /&gt;
Below is a high level overview of the stored ACL chunk data:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;uint32_t acl_chunk_size;  // Total size of chunk&lt;br /&gt;
int32_t acl_hash;   // Hash&lt;br /&gt;
uint32_t acl_tag;   // Identifies ACL buffer type, always 0xAC11AC11 to mark compressed_tracks&lt;br /&gt;
// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/buffer_tag.h#L49&lt;br /&gt;
&lt;br /&gt;
uint16_t acl_version;   // ACL Version Enum Identifier. 0x07 indicates v2.0.0, the only version observed in any Hedgehog Engine 2 game.&lt;br /&gt;
// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/compressed_tracks_version.h#L71&lt;br /&gt;
&lt;br /&gt;
char acl_padding;   // always 0x00&lt;br /&gt;
uint8_t acl_track_type;    // ACL Track Type Enum. 0x0C indicates qvvf, the only track type observed in any Hedgehog Engine 2 game. &lt;br /&gt;
// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/track_types.h#L68&lt;br /&gt;
&lt;br /&gt;
uint32_t track_count;   // Bone count if skeletal animation, 0x01 if root motion. Should match header track_count if skeletal. &lt;br /&gt;
uint32_t sample_count;   // Frame count, should match header frame_count.&lt;br /&gt;
float32 sample_rate;   // Playback FPS of animation, should equal header ((frame_count - 1) / duration)&lt;br /&gt;
char[acl_chunk_size - 0x1C] acl_data;   // String of compressed ACL data&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Raw/Decompressed Track List: ====&lt;br /&gt;
&#039;&#039;&amp;lt;sub&amp;gt;TODO...&amp;lt;/sub&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Uncompressed Animation Data: ===&lt;br /&gt;
&#039;&#039;&amp;lt;sub&amp;gt;TODO...&amp;lt;/sub&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Skeleton files are stored in a [[BINA]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;lt;sub&amp;gt;TODO...&amp;lt;/sub&amp;gt;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PXD&amp;diff=458</id>
		<title>PXD</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PXD&amp;diff=458"/>
		<updated>2025-04-06T01:24:59Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Started PXD Documentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PXD Files ==&lt;br /&gt;
Hedgehog Engine 2 games from 2016 Olympics to Shadow Generations contain skeleton and skeletal animation files with the file extensions &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; respectively, stored in a [[BINA]] container. Skeletons contain pose data that usually result in a T-Pose, bone and parent indices, and bone names. Animations contain playback metadata such as frame rate and frame count, track count, and either compressed animation pose data using [https://github.com/nfrechette/acl ACL compression,] or raw uncompressed pose data that use bone and frame indices to specify keyframed transforms, with linear interpolation between keyframes. For both skeletons and animations, position and rotation data for each bone is an absolute transform relative to the parent position, whereas scales are inherited from their respective parents locally, and have no effect on their positions. &lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Animation files are stored in a [[BINA]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
=== Header: ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct Header {&lt;br /&gt;
    char[4] magic;  // &#039;NAXP&#039;&lt;br /&gt;
    uint32_t version;   // Always 0x200&lt;br /&gt;
    uint8_t additive;      // 0x01 if additive, else 0x00&lt;br /&gt;
    uint8_t compressed;    // 0x08 if ACL compressed, 0x00 if uncompressed&lt;br /&gt;
    char[6];            // 0x00 align to 8 bytes&lt;br /&gt;
    uint64_t metadata_offset;    // Offset to metadata, always 0x18&lt;br /&gt;
    float32 duration;         // Duration of the animation in seconds, calculated as ((frame_count-1) / FPS)&lt;br /&gt;
    uint32_t frame_count;   // Frame count&lt;br /&gt;
    uint32_t track_count;   // Bone count&lt;br /&gt;
    uint64_t skel_anim_offset;  // Offset for character&#039;s skeletal animation, always 0x40 if compressed, 0x38 if uncompressed&lt;br /&gt;
    uint64_t root_anim_offset;  // Offset for root motion animation, 0x00 if no root motion is present, aligned to 16 bytes&lt;br /&gt;
    if (compressed)&lt;br /&gt;
        char[8];    // Likely alignment to 16 bytes for ACL data. Always 0x00 if compressed&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ACL Data: ===&lt;br /&gt;
All Hedgehog Engine 2 games that utilize the ACL library appear to use v2.0.0. [https://github.com/nfrechette/acl/tree/a54c5c2781be9f14b840a60f8dd8ec6c5065885d/docs See the ACL docs for more info.] If &amp;lt;code&amp;gt;compressed == 0x08&amp;lt;/code&amp;gt;, skeletal animations and root motion animations are compressed. &lt;br /&gt;
&lt;br /&gt;
==== Compressed Data: ====&lt;br /&gt;
Below is a high level overview of the stored ACL chunk data:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;uint32_t acl_chunk_size;  // Total size of chunk&lt;br /&gt;
int32_t acl_hash;   // Hash&lt;br /&gt;
uint32_t acl_tag;   // Identifies ACL buffer type, always 0xAC11AC11 to mark compressed_tracks&lt;br /&gt;
// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/buffer_tag.h#L49&lt;br /&gt;
&lt;br /&gt;
uint16_t acl_version;   // ACL Version Enum Identifier. 0x07 indicates v2.0.0, the only version observed in any Hedgehog Engine 2 game.&lt;br /&gt;
// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/compressed_tracks_version.h#L71&lt;br /&gt;
&lt;br /&gt;
char acl_padding;   // always 0x00&lt;br /&gt;
uint8_t acl_track_type;    // ACL Track Type Enum. 0x0C indicates qvvf, the only track type observed in any Hedgehog Engine 2 game. &lt;br /&gt;
// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/track_types.h#L68&lt;br /&gt;
&lt;br /&gt;
uint32_t track_count;   // Bone count if skeletal animation, 0x01 if root motion. Should match header track_count if skeletal. &lt;br /&gt;
uint32_t sample_count;   // Frame count, should match header frame_count.&lt;br /&gt;
float32 sample_rate;   // Playback FPS of animation, should equal header ((frame_count - 1) / duration)&lt;br /&gt;
char[acl_chunk_size - 0x1C] acl_data;   // String of compressed ACL data&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Raw/Decompressed Track List: ====&lt;br /&gt;
&#039;&#039;&amp;lt;sub&amp;gt;TODO...&amp;lt;/sub&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Uncompressed Animation Data: ===&lt;br /&gt;
&#039;&#039;&amp;lt;sub&amp;gt;TODO...&amp;lt;/sub&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Skeleton files are stored in a [[BINA]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;lt;sub&amp;gt;TODO...&amp;lt;/sub&amp;gt;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=FrontiersAnimDecompress&amp;diff=457</id>
		<title>FrontiersAnimDecompress</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=FrontiersAnimDecompress&amp;diff=457"/>
		<updated>2025-04-05T23:50:48Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Created Redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Frontiers Animation Tools]]&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Tools&amp;diff=456</id>
		<title>Tools</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Tools&amp;diff=456"/>
		<updated>2025-04-05T23:49:46Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Added FrontiersAnimDecompress&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This section contains tools that aren&#039;t specific to any Sonic game. Below you can see the tools divided by the engine they target and their purpose.&lt;br /&gt;
&lt;br /&gt;
== Various Engines ==&lt;br /&gt;
&lt;br /&gt;
=== Audio ===&lt;br /&gt;
&lt;br /&gt;
* [[SonicAudioTools]]&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
* [[KwasTools (Hedgehog Engine)|io_kwastools]] (.cam-anim, .uv-anim)&lt;br /&gt;
&lt;br /&gt;
== Hedgehog Engine ==&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
* [[Frontiers Animation Tools]]&lt;br /&gt;
&lt;br /&gt;
=== Archives ===&lt;br /&gt;
&lt;br /&gt;
* [[PackCpk]] (.cpk)&lt;br /&gt;
* [[YACpkTool]] (.cpk)&lt;br /&gt;
&lt;br /&gt;
* [[HedgeArchiveEditor]] (.ar, .pfd, .pac)&lt;br /&gt;
* [[HedgeArcPack]] (.ar, .pfd, .pac)&lt;br /&gt;
* [[ar0pack-ar0unpack]] (.ar, .pfd)&lt;br /&gt;
&lt;br /&gt;
=== Collision ===&lt;br /&gt;
* [[Havok Converter]] (*.hkx)&lt;br /&gt;
&lt;br /&gt;
=== Lighting ===&lt;br /&gt;
* [[HedgeGI]]&lt;br /&gt;
* [[SonicLightTools]]&lt;br /&gt;
&lt;br /&gt;
=== Models ===&lt;br /&gt;
&lt;br /&gt;
* [[terrain2fbx]] (.terrain-model)&lt;br /&gt;
* [[terrain2fbx-png]] (.terrain-model)&lt;br /&gt;
&lt;br /&gt;
=== Text ===&lt;br /&gt;
* [[Converse]] (.fco / .fte)&lt;br /&gt;
=== UI ===&lt;br /&gt;
* [[Shuriken]] (.xncp / .yncp)&lt;br /&gt;
* [[Kunai]] (.xncp / .yncp / .gncp / .sncp)&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PXD_Animation_Tools&amp;diff=455</id>
		<title>PXD Animation Tools</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PXD_Animation_Tools&amp;diff=455"/>
		<updated>2025-04-05T23:49:24Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Created page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToolInfobox|title=Frontiers Animation Tools|author=WistfulHopes, AdelQue, Turk645|website=https://github.com/WistfulHopes/FrontiersAnimDecompress|download=https://github.com/WistfulHopes/FrontiersAnimDecompress/releases/latest|image=FrontiersAnimDecompressPreview.gif}}&lt;br /&gt;
&lt;br /&gt;
Frontiers Animation Tools (or FrontiersAnimDecompress) is a Blender add-on that allows the editing of Hedgehog Engine 2 skeletal animations.&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=File:FrontiersAnimDecompressPreview.gif&amp;diff=454</id>
		<title>File:FrontiersAnimDecompressPreview.gif</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=File:FrontiersAnimDecompressPreview.gif&amp;diff=454"/>
		<updated>2025-04-05T23:48:30Z</updated>

		<summary type="html">&lt;p&gt;AdelQue: Preview of Frontiers Animation Tools animation playback in Blender&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Preview of Frontiers Animation Tools animation playback in Blender&lt;/div&gt;</summary>
		<author><name>AdelQue</name></author>
	</entry>
</feed>