mrmaller1905 Posted June 22, 2024 Posted June 22, 2024 I got no filenames from archives. What is *.RXX / *.PIX / *.PIT / *.XZP from Full Auto and can someone make a tool to unpack data from all file formats, and how can I get filenames? DLL injection is impossible and complex for Xbox 360 games. Samples: https://mega.nz/folder/5LxkUYiL#F_mXXUcH_Dneb1VU7zBcHg
UndercoverBoy833 Posted June 22, 2024 Posted June 22, 2024 to me, .rxx was music file according to the name of the song in it. but I also have no idea either
mrmaller1905 Posted May 10 Author Posted May 10 On 6/22/2024 at 4:29 PM, UndercoverBoy833 said: to me, .rxx was music file according to the name of the song in it. but I also have no idea either Do PIXs contain 3D models and are there tools that can extract them?
FullAuto_Enjoyer Posted May 18 Posted May 18 On 5/10/2025 at 2:15 AM, mrmaller1905 said: Do PIXs contain 3D models and are there tools that can extract them? dunno myself, like you I'm trying to grab the models and textures too. And the maps if that's possible, because I want to try to connect them all together so I can see what it'd look like as one big free roam city map
Engineers shak-otay Posted May 18 Engineers Posted May 18 On 5/10/2025 at 11:15 AM, mrmaller1905 said: Do PIXs contain 3D models and are there tools that can extract them? Looks compressed or encrypted (or both). You could try a comtype scan (see description of quickbms).
Engineers shak-otay Posted May 18 Engineers Posted May 18 (edited) Thanks! Using offzip with fa_t111.pix results in some .vap (textures?) and .dat files. Found some strings: Quote rtdXenon/fa_PRP_Sign_BillboardSideOfBuildingChunk fa_prp_sign_e_billboard_perpendicularbaseChunk28 fa_Sweatshop_garageChunk90 fa_Tanker_truckdmg_stacks One .dat checked: Face indices are a little bit annoying. This sub mesh built at least from 178 vertices: Edited May 18 by shak-otay 1
FullAuto_Enjoyer Posted May 18 Posted May 18 (edited) 1 hour ago, shak-otay said: Thanks! Using offzip with fa_t111.pix results in some .vap (textures?) and .dat files. Found some strings: One .dat checked: Face indices are a little bit annoying. This sub mesh built at least from 178 vertices: OH SHIT that's the destructible parts of one of the maps! great find! (T111 is the map Turnpike according to the files!) The vehicles have to be in one of those .pix then.... Edited May 18 by FullAuto_Enjoyer
Engineers h3x3r Posted May 18 Engineers Posted May 18 I'v found connection between x2m and textures.pit
Engineers shak-otay Posted May 18 Engineers Posted May 18 (edited) 15 hours ago, FullAuto_Enjoyer said: The vehicles have to be in one of those .pix then.... But in which one? I've collected 135 small point clouds from a .dat from fa_frontend.pix but can't make much sense of it: Other sub meshes with suiting face indices are not very impressive (Tfa_PRP_constructionBarrierChunk3, Debris) : fa_PRP_group_SmallPylon_A: Edited May 19 by shak-otay mesh correction
DKDave Posted May 18 Posted May 18 The models are in the .drp files, once extracted from the .pix archives. Textures are .x2m (not sure what format) Most models have several submeshes, so it will need proper analysis and a script to get all of the mesh data properly. Just a manual example of one submesh: 2
FullAuto_Enjoyer Posted May 19 Posted May 19 oh hell yea, that's epic. I wonder if there's any unused ones....
Engineers h3x3r Posted May 19 Engineers Posted May 19 I don't get it. Pointers are in LittleEndian but vertices + index is BigEndian. Also textures are 2 byte swap. Classic x360.
FullAuto_Enjoyer Posted May 19 Posted May 19 I'm gonna try and help poke around in them files, what's the steps I need to take to do so?
Engineers h3x3r Posted May 19 Engineers Posted May 19 (edited) Just wait on miracle to happen. Anyway here is struct of x2m. Already wrote Noesis script, but don't know how to read external file "textures.pit" where are stored textures with better resolution. //------------------------------------------------ //--- 010 Editor v14.0 Binary Template // // File: // Authors: // Version: // Purpose: // Category: // File Mask: // ID Bytes: // History: //------------------------------------------------ LittleEndian(); struct { uint32 RawDataSize; char Sign[9]; string File; uint16 TextureWidth_Low; uint16 TextureHeight_Low; uint16 TextureWidth_High; uint16 TextureHeight_High; ubyte Unknown_0,Unknown_1,Unknown_2,Unknown_3; uint32 Unknown_4; ubyte PixelFormat,Unknown_6,Unknown_7,Unknown_8; uint32 TextureData_Low; uint32 TextureData_High; uint32 TextureDataOffset_High; byte RawData[TextureData_Low]; }Texture; And here's generic BMS script for decompressed files from pix. Maybe it's not compatible with all files... ################################### get BaseFileName basename get Files uint32 for i = 0 < Files savepos InfoOffset get RawDataSize uint32 getdstring Dummy 0x09 get FileName string savepos RawOffset xmath InfoSize "RawOffset - InfoOffset" getdstring RawData RawDataSize string InfoFileName p= "%s/%s" BaseFileName FileName string RawFileName p= "%s/%s" BaseFileName FileName append 0 log InfoFileName InfoOffset InfoSize log RawFileName RawOffset RawDataSize next i Edited May 19 by h3x3r
mrmaller1905 Posted May 19 Author Posted May 19 20 minutes ago, h3x3r said: Just wait on miracle to happen. Anyway here is struct of x2m. Already wrote Noesis script, but don't know how to read external file "textures.pit" where are stored textures with better resolution. //------------------------------------------------ //--- 010 Editor v14.0 Binary Template // // File: // Authors: // Version: // Purpose: // Category: // File Mask: // ID Bytes: // History: //------------------------------------------------ LittleEndian(); struct { uint32 RawDataSize; char Sign[9]; string File; uint16 TextureWidth_Low; uint16 TextureHeight_Low; uint16 TextureWidth_High; uint16 TextureHeight_High; ubyte Unknown_0,Unknown_1,Unknown_2,Unknown_3; uint32 Unknown_4; ubyte PixelFormat,Unknown_6,Unknown_7,Unknown_8; uint32 TextureData_Low; uint32 TextureData_High; uint32 TextureDataOffset_High; byte RawData[TextureData_Low]; }Texture; And here's generic BMS script for decompressed files from pix. Maybe it's not compatible with all files... ################################### get BaseFileName basename get Files uint32 for i = 0 < Files savepos InfoOffset get RawDataSize uint32 getdstring Dummy 0x09 get FileName string savepos RawOffset xmath InfoSize "RawOffset - InfoOffset" getdstring RawData RawDataSize string InfoFileName p= "%s/%s" BaseFileName FileName string RawFileName p= "%s/%s" BaseFileName FileName append 0 log InfoFileName InfoOffset InfoSize log RawFileName RawOffset RawDataSize next i Can you also write a file format specification for Full Auto PIX files that are compressed with zlib?
FullAuto_Enjoyer Posted May 19 Posted May 19 35 minutes ago, h3x3r said: Just wait on miracle to happen. One can only hope for it
Engineers shak-otay Posted May 19 Engineers Posted May 19 (edited) For the meshes it's just to find start of face indices for the next sub mesh, since there's more vertices than 1280. (Offsets are different from DKDave's because I used offzip for unpacking.) This sub mesh uses shorts for uvs: ) There's floats interspersed (position offset maybe) before the face indices continue, after blue arrow: So the next submesh has 45 face indices (24 vertices) only: 3rd sub mesh: 4th sub mesh: (headlights' glasses skipped, 137 vertices) last one, maybe. 1967 vertices : Edited May 20 by shak-otay update
Engineers h3x3r Posted May 19 Engineers Posted May 19 3 hours ago, mrmaller1905 said: Can you also write a file format specification for Full Auto PIX files that are compressed with zlib? I don't think so... There is no TOC.
Solution DKDave Posted May 19 Solution Posted May 19 Here's a QuickBMS script to extract the .pix archives with proper names. You can analyse it and write a file spec from it. pix.zip 2 1
FullAuto_Enjoyer Posted May 19 Posted May 19 Finally, these great car models may be use for more than just their game they originate!
Engineers h3x3r Posted May 21 Engineers Posted May 21 Thanks to DKDave for initial script. Here's updated. Now it unpacks textures with better resolution. # Full Auto (XBox 360, 2006) # .PIX archive extract # QuickBMS script by DKDave, 2025 open FDSE "textures.pit" 1 Get TEMPNAME basename Get FILE_END asize Math OFFSET = 0 For A = 0 Goto OFFSET Get ZSIZE Long Get SIZE Long If ZSIZE = 0 Break Endif Padding 0x800 SavePos OFFSET CLog MEMORY_FILE OFFSET ZSIZE SIZE Goto 0 -1 Get FILES Long -1 # Process uncompressed data in memory file For B = 0 < FILES Get SIZE Long -1 SavePos STROFF -1 Get FILENAME String -1 SavePos OFFSET2 -1 Goto STROFF -1 Strlen STRLEN FILENAME -1 math STRLEN - 3 GetDString DUMMY STRLEN -1 Get EXT String -1 if EXT = "x2m" print "%EXT%" GetDString DUMMY 0x18 -1 Get TEXTURE_DATA_HIGH Long -1 Get TEXTURE_OFFSET_DATA_HIGH Long -1 Goto OFFSET2 -1 if TEXTURE_DATA_HIGH != 0 Log FILENAME TEXTURE_OFFSET_DATA_HIGH TEXTURE_DATA_HIGH 1 append -1 Log FILENAME OFFSET2 32 -1 else Log FILENAME OFFSET2 SIZE -1 endif else Log FILENAME OFFSET2 SIZE -1 endif Goto SIZE -1 SEEK_CUR Next B Math OFFSET + ZSIZE Next A And here's Noesis script for them... There may be another pixel format I don't have covered... from inc_noesis import * import noesis import rapi import os def registerNoesisTypes(): handle = noesis.register("Fullauto", ".x2m") noesis.setHandlerTypeCheck(handle, noepyCheckType) noesis.setHandlerLoadRGBA(handle, noepyLoadRGBA) noesis.logPopup() return 1 def noepyCheckType(data): bs = NoeBitStream(data) if len(data) < 20: return 0 return 1 def noepyLoadRGBA(data, texList): bs = NoeBitStream(data) BaseName = rapi.getExtensionlessName(rapi.getLocalFileName(rapi.getInputName())) cPos = bs.tell() bs.read(4) Check = bs.readUInt() bs.seek(cPos, NOESEEK_ABS) if Check == 0: TextureWidth = bs.readUShort() TextureHeight = bs.readUShort() bs.read(4) else: bs.read(4) TextureWidth = bs.readUShort() TextureHeight = bs.readUShort() Unknown_0 = bs.readUByte() Unknown_1 = bs.readUByte() Unknown_2 = bs.readUByte() Unknown_3 = bs.readUByte() Unknown_4 = bs.readUInt() PixelFormat = bs.readUByte() Unknown_6 = bs.readUByte() Unknown_7 = bs.readUByte() Unknown_8 = bs.readUByte() TextureData_Low = bs.readUInt() TextureData_High = bs.readUInt() TextureDataOffset_High = bs.readUInt() if Check != 0: data = bs.readBytes(TextureData_High) else: data = bs.readBytes(TextureData_Low) if PixelFormat == 82: data = rapi.imageUntile360DXT(rapi.swapEndianArray(data, 2), TextureWidth, TextureHeight, 8) texFmt = noesis.NOESISTEX_DXT1 print("Pixel Format > DXT1 >", PixelFormat) elif PixelFormat == 84: data = rapi.imageUntile360DXT(rapi.swapEndianArray(data, 2), TextureWidth, TextureHeight, 16) texFmt = noesis.NOESISTEX_DXT5 print("Pixel Format > DXT5 >", PixelFormat) elif PixelFormat == 113: data = rapi.imageUntile360DXT(data, TextureWidth, TextureHeight, 16) data = rapi.imageDecodeDXT(rapi.swapEndianArray(data, 2), TextureWidth, TextureHeight, noesis.FOURCC_ATI2) texFmt = noesis.NOESISTEX_RGBA32 print("Pixel Format > ATI2 >", PixelFormat) else: print("Unknown Pixel Format > ", PixelFormat) texList.append(NoeTexture(rapi.getInputName(), TextureWidth, TextureHeight, data, texFmt)) return 1
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now