June 22, 20242 yr Localization 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
June 22, 20242 yr Localization to me, .rxx was music file according to the name of the song in it. but I also have no idea either
May 10, 20251 yr Author Localization 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?
May 18, 20251 yr 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
May 18, 20251 yr Supporter 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).
May 18, 20251 yr Supporter 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, 20251 yr by shak-otay
May 18, 20251 yr 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, 20251 yr by FullAuto_Enjoyer
May 18, 20251 yr Supporter 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, 20251 yr by shak-otay mesh correction
May 18, 20251 yr 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:
May 19, 20251 yr Supporter I don't get it. Pointers are in LittleEndian but vertices + index is BigEndian. Also textures are 2 byte swap. Classic x360.
May 19, 20251 yr I'm gonna try and help poke around in them files, what's the steps I need to take to do so?
May 19, 20251 yr Supporter 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, 20251 yr by h3x3r
May 19, 20251 yr Author Localization 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?
May 19, 20251 yr 35 minutes ago, h3x3r said: Just wait on miracle to happen. One can only hope for it
May 19, 20251 yr Supporter 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, 20251 yr by shak-otay update
May 19, 20251 yr Supporter 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.
May 19, 20251 yr Solution 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
May 19, 20251 yr Finally, these great car models may be use for more than just their game they originate!
May 21, 20251 yr Supporter 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
February 24Feb 24 Localization Added support for PIX & the smallF.dat file in my extractor: https://github.com/smiRaphi/UniPyX it also extracts both x2m versions (small & big) if textures.pit is found in the same dir
Create an account or sign in to comment