Changes

Jump to navigation Jump to search

FF8/FileFormat X

2,704 bytes added, 21:55, 23 December 2020
m
0 Default: fix size of animation frame
|-
| Texture
| 01 10 00 00 00 09 (Always)| Contains one .TIM texture , 8 BPP
|}
| 0
| uInt16
| Pointers count. Fixed (02 00 () '''[Unused in code)/ pointers count]'''
|-
| 2
| uInt16
| Relative jump to CameraSetting. Should be (08 00)
|-
| 4
| uInt16
| Relative jump to CameraAnimationCollection. Should be (20 00)
|-
| 6
| uInt16
| Camera data size (starting from 0) '''[unused in code]'''
|-
| 8
=====CameraAnimationSet=====
Seems to be 8 pointers in each set.
{| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;"
! style="background:rgb(204,204,204)" | Offset
|}
=====Camera Animation (WIP)== All this is based on best effort knowledge from reversing by Maki. I'm just trying to understand it.=== Control Word ===  
{| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;"
! style="background:rgb(204,204,204)" | Offset
|-
| 0
| uint8_tuint16_t (bit varies)| Animation IDMain controller. If 0xFFFFU END|}==== FOV ==== Control Word & 0b0000'0000'1100'0000U===== 1 Default ====={| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;"! style="background:rgb(204,204,204)" | Offset! style="background:rgb(204,204,204)" | Length! style="background:rgb(204,204,204)" | Description
|-
| 1None| uint8_tNone| Key Frame CountStart = 0x200
|-
| None| None| End = 0x200|}===== 2Same ====={| uint16_t border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;"! style="background:rgb(bit varies204,204,204)" | Offset! style="background:rgb(204,204,204)" | Main controllerLength! style="background:rgb(204, if '''0xFFFF''' then return204,204)" | Description
|-
| 40
| uint16_t
| Starting FOV usually ~280Start
|-
| 62
| uint16_t
| Ending FOV ~006Padding
|-
| 8None| None| End = Start|}===== 2 Different ====={| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;"! style="background:rgb(204,204,204)" | Offset! style="background:rgb(204,204,204)" | Length! style="background:rgb(204,204,204)" | Description|-| 0
| uint16_t
| Starting Camera Roll usually 0Start
|-
| 102
| uint16_t
| Stating Time usually 0Padding
|-
| 124
| uint16_t
| TimeEnd|} ==== ROLL ==== Control Word & 0b0000'0011'0000'0000U===== 0 Unknown ===== TODO===== 1 Default ====={| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;"! style="background:rgb(204,204,204)" | Offset! style="background:rgb(204,204,204)" | Length! style="background:rgb(204,204,204)" | Description
|-
| 14None| array<uint8_t,20>None| unknown bytesStart = 0x000
|-
| 34None| array<uint16_tNone| End = 0x000|}===== 2 Same ====={| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;"! style="background:rgb(204,204,204)" | Offset! style="background:rgb(204,204,32>204)" | Length! style="background:rgb(204,204,204)" | Start Frame OffsetsDescription
|-
| 980| array<int16_t,32>uint16_t| Camera World ZStart
|-
| 162None| array<int16_tNone| End = Start|}===== 2 Different ====={| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;"! style="background:rgb(204,204,204)" | Offset! style="background:rgb(204,204,32>204)" | Length! style="background:rgb(204,204,204)" | Camera World XDescription
|-
| 2260| array<int16_t,32>uint16_t| Camera World YStart
|-
| 2902| array<uint8_tuint16_t| End|} ==== LAYOUT ==== Control Word & 0b0000'0000'0000'0001U===== 0 Default ===== You'll loop through the data till the first value is less than 0. pushing back to a variable length container.{| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;"! style="background:rgb(204,204,204)" | Offset! style="background:rgb(204,32>204,204)" | Length! style="background:rgb(204,204,204)" | Is Frame Durations Shot ~ bool?Description
|-
| 3220| array<int16_t,32>| Camera Look At Zif < 0 break; could be related to time of frame.
|-
| 3862| array<int16_t16 bytes| Animation Frame|} ===== 1 Other ===== TODO===Time=== Time is calculated from number of frames. You basically set starting position World+lookat and ending position, then mark number of frames to interpolate between them. Every frame is one draw call and it costs 16. Starting time needs to be equal or higher for next animation frame to be read; If next frame==0xFFFF then it's all done.=== Animation Frame ==={| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;"! style="background:rgb(204,204,32>204)" | Offset! style="background:rgb(204,204,204)" | Length! style="background:rgb(204,204,204)" | Camera Look At XDescription
|-
| 4500| array<int16_t,32>uint16_t| Camera Look At Yis frame durations shot
|-
| 5142| arrayVertice<uint8_tuint16_t> (x,32>y,z)| Is Frame Ending Shots ~ bool?World
|-
| 5468| array<uint8_t,128>uint16_t| unknown bytesis frame ending shot
|-
| 67410| arrayVertice<uint8_t,128>| unknown bytes|-| 802| array<uint8_t,128uint16_t>| unknown bytes|-| 930| array<uint8_t(x,128>| unknown bytes|-| 1058| array<uint8_ty,34>z)| unknown bytesLook At
|}
Total bytes of struct is '''1092'''. Still much is unknown about this struct. I adjusted things from OpenVIII source code. Though some numbers weren't adding up. I know the total size. So I adjusted one of the unknown bytes arrays to fit in the span.
======Time======
Time is calculated from number of frames. You basically set starting position World+lookat and ending position, then mark number of frames to interpolate between them. Every frame is one draw call and it costs 16. Starting time needs to be equal or higher for next animation frame to be read; If next frame==0xFFFF then it's all done.
=====Dependency=====
=====Example: a0stg006.x: 0x5d8 -> 02 00 08 00 20 00 1. Get EOF-> *(0x5d8 + 8) -> 32=====
2a0stg006. x:<br>0x5d8 -> 02 00 08 00 20 00 # Get EOF-> *(0x5d8 + 8) -> 32# Jump to EOF -> 0x5d8 + 32 = 0x5F8 (This is now Camera Animation Collection) 3. # Get pointer to correct anim collection. In this case we will use AnimCollectionID == 0, so: *(0x5F8 + 0*2 + 2) -> 0x0c  4. # Jump to Anim collection data: 0x5F8 + 0x0c = 0x604 (This is now Camera Animation Set) 5. # Jump to Camera animation by cameraAnimSetID, let's take for example cameraAnimSetID == 7, so: *(0x604 + 7*2) -> 0x25E. Now carefully, jump by multiplying it by 2!  5a. ## 0x604 + (0x25E * 2) = 0xAC0
Therefore: a0stg006.x Camera animation 7 in camera collection 0 is at 0xAC0
=== Texture page calculation ===
Byte TPage = InputBytes[TexturePage_index] & 0F;
Bitwise TPage byte AND 0F, to delete first 4 bits
int TPageINT = TPage * 64;
For 16 bit TIM's, the texture page is 64 pixels wide
 
====Example====
For 24-bit TIM:
0xB2 byte is: 2*48 = 96
Unsure about this one. It could be 42.667 instead of 48. It takes 1.5x the space of 16 bit. I haven't seen a file that uses 24-bit yet.
 
For 16-bit TIM:
0xB2 byte is: 2*64= 128
 
For 8-bit TIM:
0xB2 byte is: 2*128 = 256
Byte TPage = InputBytes[TexturePage_index] & 0F; //Bitwise TPage byte AND 0F, to delete first For 4 bits int TPageINT = TPage * 128; //For 16 -bit TIM's, the texture page : 0xB2 byte is 128 sized: 2*256 = 512
Example:0xB2 byte Each time you half the number of bits you double the amount of data you can store in the same space. So the calculated Texture Page is:2*128 = 256different.
=== Face order / Translation/ triangulation ===
27
edits

Navigation menu