Page 1 of 1

Trine 3 .fbi Textures

Posted: Thu Aug 20, 2015 7:21 pm
by vallex
Hi, all!
I try to decompress the Trine 3 textures:

Code: Select all

# comtype lzss
# comtype lzss0
comtype lz4
# and many other comtypes I've already tried
goto 33
get zsize long
get size long
get NAME filename
string NAME += ".dds"
clog NAME 41 zsize size
I uploaded compressed .fbi and decompressed .dds for example:
http://www.mediafire.com/download/2e0ns ... a_face.fbi
http://www.mediafire.com/download/j55p0 ... a_face.dds

(Decompressed I took by DX Ripper)

Can anyone help with this?

Re: Trine 3 .fbi Textures

Posted: Thu Aug 20, 2015 9:19 pm
by shakotay2
wrong subforum!

did you try all comtypes?

create a bat or cmd file with this line contained:
call comtype_scan2 D:\test\comtype_scan2.bms D:\test\zoya_face.fbi D:\test [10000000]

where D:\test is the folder which contains quickbms.exe, comtype_scan.bat, comtype_scan2.bms
and zoya_face.fbi, the file to be decompressed

(if one of the created *.dmp file has a size of 1,398,256 bytes it's very likely to contain the decompressed dds data)

Re: Trine 3 .fbi Textures

Posted: Thu Aug 20, 2015 11:08 pm
by vallex
Thanks for the advice, but - no result. The file is still compressed. Apparently they used their own algorithm, unfortunately..
The only algorithm that approximates the uncompressed file is number 231

Re: Trine 3 .fbi Textures

Posted: Fri Aug 21, 2015 12:22 pm
by vallex
Finaly I have this:
zoya_face.fbi.jpg
Can you help me?

Re: Trine 3 .fbi Textures

Posted: Fri Aug 21, 2015 3:09 pm
by shakotay2
nearest hit I had:
zoya_face_lz4_uncompressed.JPG

Re: Trine 3 .fbi Textures

Posted: Fri Aug 21, 2015 3:44 pm
by vallex
Мaybe dictionary can help, but I don't know how to use it in LZ4

Re: Trine 3 .fbi Textures

Posted: Tue Aug 25, 2015 9:23 pm
by vallex
My best shot until now after reordering the sequence of the bits:
zoya_face.fbi2.jpg

Re: Trine 3 .fbi Textures

Posted: Thu Aug 27, 2015 12:16 am
by vallex
I did it!
zoya_face_fbi.png
Maxscript code:

Code: Select all

--heapSize += 2000000000
fn LZ4_decompress input = (
	local i = 0, j = 0, n = input.count, out = #(), l, token, literals_length, end, offset, match_length, pos
	while i < n do (
		token = input[i+=1]
		literals_length = bit.shift token -4
		if literals_length > 0 do (
			l = literals_length + 240
			while l == 255 do (
				l = input[i+=1]
				literals_length += l
			)
			end = i + literals_length
			while i < end do out[j+=1] = input[i+=1]
		) 
		if i < n-1 do (
			offset = bit.or input[i+=1] (bit.shift input[i+=1] 8)
			if not (offset == 0 or offset > j) do (
				match_length = bit.and token 0xf
				l = match_length + 240
				while l == 255 and i<n do (
					l = input[i+=1]
					match_length += l
				)
				pos = j - offset
				end = j + match_length + 4
				while j < end do out[j+=1] = out[pos+=1]
			)
		)
	)
	out
)
fn convertTrine3Tex fbi = (
	if fbi == undefined do return false
	local u, f, magic, version, width, height, mip, floats, other, zsize, size, tmp, un, data
	local dir = getfilenamepath fbi, file = getfilenamefile fbi
	local dxt1 = 827611204, dxt3 = 861165636, dxt5 = 894720068, ati2 = 843666497
	local dxt = #(dxt1, dxt5, dxt5 ,ati2) 
	f = fopen fbi "rb"
	magic = readlong f
	if magic != 4017 do return false
	version = readshort f
	if version > 4 do return false
	staff = readshort f
	width = readshort f
	height = readshort f
	mip = readbyte f
	floats = [readfloat f, readfloat f, readfloat f, readfloat f]
	other = [readshort f, readshort f]
	zsize = readlong f
	size = readlong f
	if doesfileexist (dir + file + ".lz4") then (
		tmp = fopen (dir + file + ".lz4") "rb"
		un = for i=1 to size collect readbyte tmp #unsigned
		fclose tmp
	) else (
		data = for i=1 to zsize collect readbyte f #unsigned
		un = LZ4_decompress data
	)
	fclose f
	gc()
	u = fopen (dir + file + ".dds") "wb"
	writelong u 542327876
	writelong u 124
	writelong u 135175
	writelong u height
	writelong u width
	for i=1 to 2 do writelong u 0
	writelong u mip
	for i=1 to 11 do writelong u 0
	writelong u 32
	writelong u 4
	writelong u dxt[version]
	for i=1 to 5 do writelong u 0
	writelong u 4198408
	for i=1 to 4 do writelong u 0
	local all =un.count, b, p = 0, q = 0, r = 0
	case version of (
		1: ( -- DXT1
			b = all/4
			for i=1 to all/8 do (
				for j=0 to 1 do writebyte u un[i+j+p] #unsigned
				for j=0 to 1 do writebyte u un[i+b+j+p] #unsigned
				for j=0 to 3 do writebyte u un[i+b*2+j+q] #unsigned
				p += 1
				q += 3
			)
		)
		2: ( -- DXT5
			b = all/8
			for i=1 to all/16 do (
				writebyte u un[i] #unsigned
				writebyte u un[i+b/2] #unsigned
				for j=0 to 5 do writebyte u un[i+b+j+p] #unsigned
				for j=0 to 1 do writebyte u un[i+b*4+j+q] #unsigned
				for j=0 to 1 do writebyte u un[i+b*5+j+q] #unsigned
				for j=0 to 3 do writebyte u un[i+b*6+j+r] #unsigned
				p += 5
				q += 1
				r += 3
			)
		)
		3: ( -- DXT5 - Alpha Only
			b = all/8
			for i=1 to all/8 do (
				writebyte u un[i] #unsigned
				writebyte u un[i+b] #unsigned
				for j=0 to 5 do writebyte u un[i+b*2+j+p] #unsigned
				for j=0 to 7 do writebyte u 255 #unsigned
				p += 5
			)
		)
		4: ( -- ATI2
			b = all/16		
			for i=1 to all/16 do (
				writebyte u un[i] #unsigned
				writebyte u un[i+b] #unsigned
				for j=0 to 5 do writebyte u un[i+b*2+j+p] #unsigned
				writebyte u un[i+b*8] #unsigned
				writebyte u un[i+b*9] #unsigned
				for j=0 to 5 do writebyte u un[i+b*10+j+p] #unsigned
				p += 5
			)
		)
		default: for i in un do writebyte u i #unsigned
	)
	fclose u
)
convertTrine3Tex (getOpenFileName historyCategory:"Trine 3 Textures" types:"Trine 3 .fbi (*.fbi)")
/*
dir = getSavePath initialDir:@"d:\test\data\root\instance_base\entity\object\water\"
if dir != undefined and doesfileexist dir do (
	files = getAllFiles dir #(".fbi")
	for file in files do convertTrine3Tex file
)
*/

PS:
You can expect soon a script for importing Trine 3 .fbm models in 3D Studio Max. This is the reason to use this subforum

Re: Trine 3 .fbi Textures

Posted: Thu Aug 27, 2015 4:20 am
by ssringo
Nice work vallex. I'm not a fan of Trine but the visuals were fantastic. Might have to grab the game if the models are good.

Re: Trine 3 .fbi Textures

Posted: Mon Aug 31, 2015 8:17 pm
by vallex
I'm ready with .fbm model importer:

viewtopic.php?f=16&t=13269

Grab! :)

Re: Trine 3 .fbi Textures

Posted: Sat Aug 06, 2016 9:51 am
by ItsMeLenny
I'd like to convert this to python but am having a bit of trouble.
I know the Trine 1 and Trine 2 textures open in Blender and Gimp without any need to convert them to DDS.
Does this script uncompress and then convert to DDS on top of it?
I was able to convert the model importers to python.