(→Keys) |
mNo edit summary Tag: rte-source |
||
(12 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
⚫ | {{ImportantName|PSA}} and [[PSK File Format|PSK]] binary files contain the raw animation and mesh information used to import skeletal animation art into the Unreal Engine. The PSA file contains the bone names, one or more sequence names, and for each sequence, its frame number N, and tracks of N rotations and N translations for each bone. In ''Mass Effect 3'', PSA data is included inside [[PCC File Format|PCC files]] and can be exported using [[PCC Editor 2]]. To learn how to export and edit PSA data from in-game files read the [[PSA Editing Tutorial]]. This page will be concerned with the specifics of the PSA binary format. |
||
− | {{Template:Warning|This page is currently being edited by [[User:Foggene|Foggene]] ([[User talk:Foggene|talk]]).}} |
||
− | == |
+ | ==File Structure== |
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
− | <br/><br/> |
||
− | ==File Structure== |
||
⚫ | |||
⚫ | |||
⚫ | |||
<div class="mw-collapsible-content"> |
<div class="mw-collapsible-content"> |
||
− | [[File:Psa_file.png| |
+ | [[File:Psa_file.png|710px]] |
− | </div |
+ | </div> |
+ | </div> |
||
− | |||
− | ==='''Chunk Header'''=== |
||
− | |||
⚫ | |||
+ | {{Subsection|Chunk Header}} |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
− | {| border="0" cellpadding="0" cellspacing="1" class="article-table mw-collapsible |
+ | {| border="0" cellpadding="0" cellspacing="1" class="article-table mw-collapsible" style="width: 320px;" |
|- |
|- |
||
! scope="col"|Bytes |
! scope="col"|Bytes |
||
Line 33: | Line 29: | ||
! scope="col"|Description |
! scope="col"|Description |
||
|- |
|- |
||
− | | 20 |
+ | | 20 |
| Char |
| Char |
||
| Chunk ID |
| Chunk ID |
||
Line 48: | Line 44: | ||
| Int32 |
| Int32 |
||
| Data Count |
| Data Count |
||
− | |} |
+ | |} |
+ | {{Subsection|Head}} |
||
− | ==='''Head'''=== |
||
⚫ | The {{ImportantName|Head}} data chunk is defined by its header as having zero size and zero elements (count). Since it contains no information, it derives that only the header chunk has useful meaning. The header chunk may act as a file header, but does not necessarily have to be the first chunk in the file. |
||
+ | {{Subsection|Bones}} |
||
⚫ | The |
||
⚫ | |||
− | |||
⚫ | |||
− | ==='''Bones'''=== |
||
− | |||
⚫ | |||
− | |||
⚫ | |||
|- |
|- |
||
! scope="col"|Bytes |
! scope="col"|Bytes |
||
Line 64: | Line 57: | ||
! scope="col"|Description |
! scope="col"|Description |
||
|- |
|- |
||
− | | 64 |
+ | | 64 |
| Char |
| Char |
||
| Bone name |
| Bone name |
||
Line 111: | Line 104: | ||
| 4 * Int32 |
| 4 * Int32 |
||
| Padding |
| Padding |
||
− | |} |
+ | |} |
+ | {{Subsection|Info}} |
||
− | ==='''Info'''=== |
||
⚫ | |||
− | |||
⚫ | |||
⚫ | |||
− | |||
⚫ | |||
|- |
|- |
||
! scope="col"|Bytes |
! scope="col"|Bytes |
||
Line 123: | Line 114: | ||
! scope="col"|Description |
! scope="col"|Description |
||
|- |
|- |
||
− | | 64 |
+ | | 64 |
| String |
| String |
||
| Sequence name |
| Sequence name |
||
Line 170: | Line 161: | ||
| Int32 |
| Int32 |
||
| Raw frame count |
| Raw frame count |
||
− | |} |
+ | |} |
+ | {{Subsection|Keys}} |
||
− | ==='''Keys'''=== |
||
⚫ | The raw {{ImportantName|Key Array}} holds all the keys for all the bones in all the specified sequences. For each info sequence in the {{ImportantName|Info}} array, there are <code>[bones count] </code> * <code>[frames keys count]</code>. These are in turn laid out as tracks of <code>[frame count]</code> keys for each bone in the order of the bones, as defined in the {{ImportantName|Bones}} data array. |
||
+ | Each key is defined as a 32 byte struct: |
||
⚫ | The raw |
||
⚫ | |||
− | |||
⚫ | |||
|- |
|- |
||
! scope="col"|Bytes |
! scope="col"|Bytes |
||
Line 182: | Line 173: | ||
! scope="col"|Description |
! scope="col"|Description |
||
|- |
|- |
||
− | | 4 |
+ | | 4 |
| Float |
| Float |
||
| Location X |
| Location X |
||
|- |
|- |
||
− | | 4 |
+ | | 4 |
| Float |
| Float |
||
| Location Y |
| Location Y |
||
|- |
|- |
||
− | | 4 |
+ | | 4 |
| Float |
| Float |
||
| Location Z |
| Location Z |
||
|- |
|- |
||
− | | 4 |
+ | | 4 |
| Float |
| Float |
||
| Rotation X |
| Rotation X |
||
|- |
|- |
||
− | | 4 |
+ | | 4 |
| Float |
| Float |
||
| Rotation Y |
| Rotation Y |
||
|- |
|- |
||
− | | 4 |
+ | | 4 |
| Float |
| Float |
||
| Rotation Z |
| Rotation Z |
||
|- |
|- |
||
− | | 4 |
+ | | 4 |
| Float |
| Float |
||
| Rotation W |
| Rotation W |
||
|- |
|- |
||
− | | 4 |
+ | | 4 |
| Float |
| Float |
||
| Time |
| Time |
||
− | |} |
+ | |} |
− | |||
− | ==ME3Explorer Classes== |
||
− | |||
− | {{Template:ToolSetClass|ME3Explorer > PSAViewer > PSAViewer.cs}}<br/> |
||
− | {{Template:ToolSetClass|ME3Explorer > Unreal > PSAFile.cs}}<br/> |
||
==References== |
==References== |
||
− | * |
+ | *[http://udn.epicgames.com/Two/BinaryFormatSpecifications.html EpicGames, Binary Format Specifications] |
− | * |
+ | *[http://www.gildor.org/projects/unactorx Gildor's ActorX Importer] |
+ | [[Category:Developer Resources|PSA File Format]] |
||
− | <br/><br/> |
||
+ | [[Category:File Formats|PSA File Format]] |
Latest revision as of 19:59, 1 March 2016
PSA and PSK binary files contain the raw animation and mesh information used to import skeletal animation art into the Unreal Engine. The PSA file contains the bone names, one or more sequence names, and for each sequence, its frame number N, and tracks of N rotations and N translations for each bone. In Mass Effect 3, PSA data is included inside PCC files and can be exported using PCC Editor 2. To learn how to export and edit PSA data from in-game files read the PSA Editing Tutorial. This page will be concerned with the specifics of the PSA binary format.
File Structure[]
PSA files are structured as a collection if header-data pairs, of which there are four known types: Head, Bones, Info, and Keys.
Chunk Header
The Chunk Header contains information about its companion data chunk: ID, type, size and count. There are four possible IDs, corresponding to each of the eight mesh objects:
- ANIMHEAD: Does not contain a data pair.
- BONENAMES: Array with the bone names.
- ANIMINFO: Array of animation sequence info chunks.
- ANIMKEYS: Array of raw keys.
Each header defined as a 32 byte struct:
Bytes | Type | Description |
---|---|---|
20 | Char | Chunk ID |
4 | Int32 | Type Flag |
4 | Int32 | Data Size |
4 | Int32 | Data Count |
Head
The Head data chunk is defined by its header as having zero size and zero elements (count). Since it contains no information, it derives that only the header chunk has useful meaning. The header chunk may act as a file header, but does not necessarily have to be the first chunk in the file.
Bones
The Bones data chunk contains an array of bone names. Each bone is defined as a 100 bytes struct.
Bytes | Type | Description |
---|---|---|
64 | Char | Bone name |
4 | Int32 | Flags |
4 | Int32 | Children |
4 | Int32 | Parent index |
4 | Float | Rotation X |
4 | Float | Rotation Y |
4 | Float | Rotation Z |
4 | Float | Rotation W |
4 | Float | Position X |
4 | Float | Position Y |
4 | Float | Position Z |
16 | 4 * Int32 | Padding |
Info
The Info data chunk contains an array of animation sequence info chunks. Each sequence is defined as a 228 bytes struct:
Bytes | Type | Description |
---|---|---|
64 | String | Sequence name |
64 | String | Sequence group |
4 | Int32 | Bone count |
4 | Int32 | Root include |
4 | Int32 | Compression style |
4 | Int32 | Key quotum |
4 | Float | Key reduction |
4 | Float | Track time |
4 | Float | Animation rate |
4 | Int32 | Start bone |
4 | Int32 | First raw frame |
4 | Int32 | Raw frame count |
Keys
The raw Key Array holds all the keys for all the bones in all the specified sequences. For each info sequence in the Info array, there are [bones count]
* [frames keys count]
. These are in turn laid out as tracks of [frame count]
keys for each bone in the order of the bones, as defined in the Bones data array.
Each key is defined as a 32 byte struct:
Bytes | Type | Description |
---|---|---|
4 | Float | Location X |
4 | Float | Location Y |
4 | Float | Location Z |
4 | Float | Rotation X |
4 | Float | Rotation Y |
4 | Float | Rotation Z |
4 | Float | Rotation W |
4 | Float | Time |