F1 2016

Textures, recreate headers, conversions, algorithms and parsing of image files
mario
Posts: 16
Joined: Tue Aug 16, 2016 7:21 pm

F1 2016

Post by mario »

luigi -- you interested in some files from the new game? looks like formats have changed a bit.

Car skins (and it looks like track adverts and textures) are now someTeam_decal.tga.mipmaps files (around 16MB) -- tried scanning them with Ravioli and Dragon but no luck. I'm sure they have some kind of compression or something on them.

Game is looking gorgeous, but will be nice to add some proper liveries with alcohol adverts, etc. if you're able to open these!

PM me if you would like a sample file or two to test.
aluigi
Site Admin
Posts: 12984
Joined: Wed Jul 30, 2014 9:32 pm

Re: F1 2016

Post by aluigi »

Yeah sure, post some samples.
mario
Posts: 16
Joined: Tue Aug 16, 2016 7:21 pm

Re: F1 2016

Post by mario »

Sent
aluigi
Site Admin
Posts: 12984
Joined: Wed Jul 30, 2014 9:32 pm

Re: F1 2016

Post by aluigi »

There is no compression. They are just raw data.
I suggest you to post the samples here in the forum so that other users can check it (graphics is not my field).
mario
Posts: 16
Joined: Tue Aug 16, 2016 7:21 pm

Re: F1 2016

Post by mario »

Sure thing -- here you go


https://www.sendspace.com/file/0h8i13
Acewell
Posts: 706
Joined: Fri Aug 08, 2014 1:06 am

Re: F1 2016

Post by Acewell »

these aren't models but headerless dxt5 textures :)
there might be a separate file in the game files with header info for the textures
mario
Posts: 16
Joined: Tue Aug 16, 2016 7:21 pm

Re: F1 2016

Post by mario »

Acewell wrote:these aren't models but headerless dxt5 textures :)
there might be a separate file in the game files with header info for the textures


Not looking for models -- want to update liveries to add proper sponsors that are missing.

I can buy someone experienced a copy of the game if they want to take a look around.
Acewell
Posts: 706
Joined: Fri Aug 08, 2014 1:06 am

Re: F1 2016

Post by Acewell »

mario wrote:Not looking for models

this thread should be in "Graphic file formats" instead of "3D/2D models" where it gets proper attention then :)

don't have to buy the game again, look through your files for a possible text file that list header info, it
might be next to the images or else there isn't much you can do except for guessing the size and format.
mario
Posts: 16
Joined: Tue Aug 16, 2016 7:21 pm

Re: F1 2016

Post by mario »

Acewell wrote:
mario wrote:Not looking for models

this thread should be in "Graphic file formats" instead of "3D/2D models" where it gets proper attention then :)

don't have to buy the game again, look through your files for a possible text file that list header info, it
might be next to the images or else there isn't much you can do except for guessing the size and format.


luigi, can you move this to the proper forum then?
Acewell
Posts: 706
Joined: Fri Aug 08, 2014 1:06 am

Re: F1 2016

Post by Acewell »

this is your samples with dds headers :D
haas.7z
aluigi
Site Admin
Posts: 12984
Joined: Wed Jul 30, 2014 9:32 pm

Re: F1 2016

Post by aluigi »

moved in the correct section
mario
Posts: 16
Joined: Tue Aug 16, 2016 7:21 pm

Re: F1 2016

Post by mario »

Wow! That is awesome Acewell!

Is there a way to convert back?

Do you just need to add some code with a hex editor to be able to open the mipmaps files by telling it that it is a DDS DXT5?

Curious about this one especially. Would like to add the Martini logos that are not in the game because of ESRB.

I suspect the ERP files must contain the models.

There is an assetgroup file for each team that seems to have the code for which meshes to display for each car. I uploaded a sample. Maybe that needs to go back in the 3D forum.
Acewell
Posts: 706
Joined: Fri Aug 08, 2014 1:06 am

Re: F1 2016

Post by Acewell »

mario wrote:Is there a way to convert back?

there was really no conversion, the data was dxt anyway, i just add dds headers with Noesis
this way you can open them with Gimp or whatever and edit then save it out and remove the 128 byte
header and then rename the file to what it originally was and inject back into the game if want :D

i made a Noesis script that tries to detect the size and type based on the file size :D
tex_F12016_mipmaps.zip


edit
okay i improved the script to support all of your current samples :D
mario
Posts: 16
Joined: Tue Aug 16, 2016 7:21 pm

Re: F1 2016

Post by mario »

Thanks for making the code easy to follow. I've updated it additionally to support even more discovered texture sizes. I'll let you know what else I find. There are still several I haven't tried yet but I can guess pretty well now that I read through your code!

Code: Select all

from inc_noesis import *
import os

def registerNoesisTypes():
   handle = noesis.register("F1 2016 (headerless textures)", ".mipmaps")
   noesis.setHandlerTypeCheck(handle, noeCheckGeneric)
   noesis.setHandlerLoadRGBA(handle, F1LoadRGBA)
   #noesis.logPopup()
   return 1

def F1LoadRGBA(data, texList):
   datasize = len(data)
   print(datasize, "datasize")
   bs = NoeBitStream(data)
   data = bs.readBytes(datasize) 
   fileName = os.path.basename(rapi.getInputName())   #get file name + ext without path
   if datasize == 688128:
      imgWidth = 1024                   
      imgHeight = 1024                 
      texFmt = noesis.NOESISTEX_DXT1
   elif datasize == 2785280:
      imgWidth = 2048                   
      imgHeight = 2048                 
      texFmt = noesis.NOESISTEX_DXT1
   elif datasize == 699008:
      imgWidth = 1024                   
      imgHeight = 512                 
      texFmt = noesis.NOESISTEX_DXT5
   elif datasize == 349504:
      imgWidth = 512                   
      imgHeight = 512                 
      texFmt = noesis.NOESISTEX_DXT5
   elif datasize == 327680:
      imgWidth = 512                   
      imgHeight = 512                 
      texFmt = noesis.NOESISTEX_DXT5
   #ATI2 normal maps
   elif "_nm" in fileName:
      imgWidth = 1024                   
      imgHeight = 1024                 
      data = rapi.imageDecodeDXT(data, imgWidth, imgHeight, noesis.FOURCC_ATI2)
      texFmt = noesis.NOESISTEX_RGBA32
   elif datasize == 1376256:
      imgWidth = 1024                   
      imgHeight = 1024                 
      texFmt = noesis.NOESISTEX_DXT5
   elif datasize == 5570560:
      imgWidth = 2048                   
      imgHeight = 2048                 
      texFmt = noesis.NOESISTEX_DXT5
   elif datasize == 16777216:
      imgWidth = 4096                   
      imgHeight = 4096                 
      texFmt = noesis.NOESISTEX_DXT5
   elif datasize == 11173888:
      imgWidth = 4096                   
      imgHeight = 2048                 
      texFmt = noesis.NOESISTEX_DXT5      
   elif datasize == 655360:
      imgWidth =  1024                   
      imgHeight = 512                 
      texFmt = noesis.NOESISTEX_DXT5         
   elif datasize == 1310720:
      imgWidth = 2048                 
      imgHeight = 512                 
      texFmt = noesis.NOESISTEX_DXT5         
   elif datasize == 2621440:
      imgWidth = 4096                   
      imgHeight = 512                 
      texFmt = noesis.NOESISTEX_DXT5   
   elif datasize == 5242880:
      imgWidth = 5120                 
      imgHeight = 1024                 
      texFmt = noesis.NOESISTEX_DXT5
   elif datasize == 2752512:
      imgWidth = 2048                 
      imgHeight = 1024                 
      texFmt = noesis.NOESISTEX_DXT5            

      
      
      
   #unknown, not handled
   else:
      print("WARNING: Unhandled image format")
      return None
   texList.append(NoeTexture(rapi.getInputName(), imgWidth, imgHeight, data, texFmt))
   return 1
shouldbethere
Posts: 1
Joined: Sun Aug 21, 2016 11:16 pm

Re: F1 2016

Post by shouldbethere »

Thank you so much for the script Acewell!

I have been able to open all the files I wanted to however when removing the header, renaming, and loading my edited mipmaps in game they aren't what they should be.
I've only edited the helmet, but as you can see it doesn't look right.

I've used Gimp and dxtbmp saving it in dxt5

20160822002013_1.jpg


Any suggestions?

Or am I just doing something obvious wrong? :?
Acewell
Posts: 706
Joined: Fri Aug 08, 2014 1:06 am

Re: F1 2016

Post by Acewell »

i couldn't tell you, modding games is not my area.
i would at least make sure the modified texture is the same file size as the original
and that you retain any alpha channels, mipmaps etc
CW17
Posts: 1
Joined: Tue Aug 23, 2016 7:14 am

Re: F1 2016

Post by CW17 »

Any chance anyone can update the code to include helmets, when I try to export with Noesis It goes to the unknown format warning and doesn't export.
The helmet files are 10,912 KB
Here is one of the helmet files http://www.filedropper.com/jensonbuttonhelmetdtga
Cheers for the Help
*EDIT*
I think I figured it out, here's the updated script:

Code: Select all

from inc_noesis import *
import os

def registerNoesisTypes():
   handle = noesis.register("F1 2016 (headerless textures)", ".mipmaps")
   noesis.setHandlerTypeCheck(handle, noeCheckGeneric)
   noesis.setHandlerLoadRGBA(handle, F1LoadRGBA)
   #noesis.logPopup()
   return 1

def F1LoadRGBA(data, texList):
   datasize = len(data)
   print(datasize, "datasize")
   bs = NoeBitStream(data)
   data = bs.readBytes(datasize)
   fileName = os.path.basename(rapi.getInputName())  #get file name + ext without path
   if datasize == 688128:
     imgWidth = 1024 
     imgHeight = 1024 
     texFmt = noesis.NOESISTEX_DXT1 
   elif datasize == 2785280:
     imgWidth = 2048 
     imgHeight = 2048 
     texFmt = noesis.NOESISTEX_DXT1
   elif datasize == 699008:
     imgWidth = 1024 
     imgHeight = 512 
     texFmt = noesis.NOESISTEX_DXT5
   elif datasize == 349504:
     imgWidth = 512 
     imgHeight = 512 
     texFmt = noesis.NOESISTEX_DXT5
   elif datasize == 327680:
     imgWidth = 512 
     imgHeight = 512 
     texFmt = noesis.NOESISTEX_DXT5
   #ATI2 normal maps
   elif "_nm" in fileName:
     imgWidth = 1024 
     imgHeight = 1024 
     data = rapi.imageDecodeDXT(data, imgWidth, imgHeight, noesis.FOURCC_ATI2)
     texFmt = noesis.NOESISTEX_RGBA32
   elif datasize == 1376256:
     imgWidth = 1024 
     imgHeight = 1024 
     texFmt = noesis.NOESISTEX_DXT5
   elif datasize == 5570560:
     imgWidth = 2048 
     imgHeight = 2048 
     texFmt = noesis.NOESISTEX_DXT5
   elif datasize == 16777216:
     imgWidth = 4096 
     imgHeight = 4096 
     texFmt = noesis.NOESISTEX_DXT5
   elif datasize == 11173888:
     imgWidth = 4096 
     imgHeight = 4096 
     texFmt = noesis.NOESISTEX_DXT1   
   elif datasize == 655360:
     imgWidth =  1024 
     imgHeight = 512 
     texFmt = noesis.NOESISTEX_DXT5     
   elif datasize == 1310720:
     imgWidth = 2048 
     imgHeight = 512 
     texFmt = noesis.NOESISTEX_DXT5     
   elif datasize == 2621440:
     imgWidth = 4096 
     imgHeight = 512 
     texFmt = noesis.NOESISTEX_DXT5 
   elif datasize == 5242880:
     imgWidth = 5120 
     imgHeight = 1024 
     texFmt = noesis.NOESISTEX_DXT5
   elif datasize == 2752512:
     imgWidth = 2048 
     imgHeight = 1024 
     texFmt = noesis.NOESISTEX_DXT5
   elif datasize == 348160:
     imgWidth = 512 
     imgHeight = 512 
     texFmt = noesis.NOESISTEX_DXT1
   elif datasize == 2795520:
     imgWidth = 2048 
     imgHeight = 2048 
     texFmt = noesis.NOESISTEX_DXT1
   elif datasize == 5591040:
     imgWidth = 2048 
     imgHeight = 2048 
     texFmt = noesis.NOESISTEX_DXT1
   elif datasize == 698368:
     imgWidth = 512 
     imgHeight = 512 
     texFmt = noesis.NOESISTEX_DXT1

   
   
   
   #unknown, not handled
   else:
     print("WARNING: Unhandled image format")
     return None
   texList.append(NoeTexture(rapi.getInputName(), imgWidth, imgHeight, data, texFmt))
   return 1
mario
Posts: 16
Joined: Tue Aug 16, 2016 7:21 pm

Re: F1 2016

Post by mario »

great job, CW17! Like Acewell said, his formats were reasonable guesses, as are mine. Glad we can work together to improve upon the great plugin he has provided us!