April 19, 20242 yr Localization What is .iff from Project IGI and can someone make an IFF plugin for Blender or Noesis, and do IFFs contain skeletons or animations? I've asked NEWME0 (Artiom Rotari) on GitHub but he won't create a 3D model or skeleton viewer: https://github.com/NEWME0/Project-IGI/issues/21 I tried Artiom's binary template for IGI 1 IFF but it failed: https://github.com/Jones-HM/project-igi-research-data/blob/f9bd5c32e239465305e3add1cc1d760368ba89a6/Templates/IGI1/IGI1_IFF.bt 000iff.rar Edited May 17, 20251 yr by mrmaller1905
December 14, 2025Dec 14 Author Localization In case who are interested in parsing and converting bones and animations from IGI 1 .iff files, here is the 010 Editor binary template. IFF.bt Edited December 14, 2025Dec 14 by mrmaller1905
December 14, 2025Dec 14 Supporter You were told to check for the models first and I found that wasn't finished. Now seems you're trying to do the second step before the first one and I fear that won't work. edit: since I don't have the 010 editor I used the pfp py project and got this skeleton with 33 bones: subChunk[2] = struct { fourcc = Char[4] ('TLST') size = UInt(396 [0000018c]) bone_pos = struct[33] bone_pos[0] = struct { px = Float(0.0) py = Float(0.0) pz = Float(0.0) } bone_pos[1] = struct { px = Float(-0.5138922929763794) py = Float(183.35211181640625) pz = Float(553.5579833984375) } bone_pos[2] = struct { px = Float(0.1523585021495819) py = Float(-377.4803771972656) pz = Float(1280.41357421875) } bone_pos[3] = struct { px = Float(0.07410892099142075) py = Float(96.04873657226562) pz = Float(631.0419921875) } bone_pos[4] = struct { px = Float(-3.967119118897244e-05) py = Float(103.25892639160156) pz = Float(352.92730712890625) } bone_pos[5] = struct { px = Float(-1.018150806427002) py = Float(97.74694061279297) pz = Float(891.6131591796875) } bone_pos[6] = struct { px = Float(-0.11346861720085144) py = Float(76.36090850830078) pz = Float(121.43697357177734) } bone_pos[7] = struct { px = Float(3.710103192133829e-05) py = Float(454.25048828125) pz = Float(-358.7002258300781) } bone_pos[8] = struct { px = Float(-873.77099609375) py = Float(180.32762145996094) pz = Float(-380.1419677734375) } bone_pos[9] = struct { px = Float(-498.6019592285156) py = Float(-220.04612731933594) pz = Float(-1074.8599853515625) } bone_pos[10] = struct { px = Float(-476.04119873046875) py = Float(213.7456512451172) pz = Float(-980.4103393554688) } bone_pos[11] = struct { px = Float(-231.91920471191406) py = Float(-0.0029697269201278687) pz = Float(-439.615478515625) } bone_pos[12] = struct { px = Float(-11.216732025146484) py = Float(0.00010558709618635476) pz = Float(-200.45413208007812) } bone_pos[13] = struct { px = Float(-15.135907173156738) py = Float(-5.449031596072018e-05) pz = Float(-306.6474304199219) } bone_pos[14] = struct { px = Float(877.7891235351562) py = Float(180.32720947265625) pz = Float(-380.14031982421875) } bone_pos[15] = struct { px = Float(494.1496276855469) py = Float(-220.12353515625) pz = Float(-1074.810791015625) } bone_pos[16] = struct { px = Float(468.0498962402344) py = Float(213.82183837890625) pz = Float(-985.9440307617188) } bone_pos[17] = struct { px = Float(232.67367553710938) py = Float(-0.00010443734936416149) pz = Float(-433.71722412109375) } bone_pos[18] = struct { px = Float(13.601054191589355) py = Float(0.0003244699619244784) pz = Float(-200.13710021972656) } bone_pos[19] = struct { px = Float(2.6307296752929688) py = Float(-0.00010907361138379201) pz = Float(-307.5419921875) } bone_pos[20] = struct { px = Float(5.440348148345947) py = Float(725.950439453125) pz = Float(-228.98277282714844) } bone_pos[21] = struct { px = Float(9.466634219279513e-05) py = Float(2103.57861328125) pz = Float(392.4938659667969) } bone_pos[22] = struct { px = Float(8.082063141046092e-05) py = Float(1614.331787109375) pz = Float(1297.79296875) } bone_pos[23] = struct { px = Float(-430.3789978027344) py = Float(94.9665756225586) pz = Float(-44.37565231323242) } bone_pos[24] = struct { px = Float(-0.8461065888404846) py = Float(208.38644409179688) pz = Float(-1737.64599609375) } bone_pos[25] = struct { px = Float(79.94613647460938) py = Float(-363.0055236816406) pz = Float(-1827.7457275390625) } bone_pos[26] = struct { px = Float(-23.128799438476562) py = Float(390.8931579589844) pz = Float(-163.42630004882812) } bone_pos[27] = struct { px = Float(-30.827518463134766) py = Float(738.0623168945312) pz = Float(-258.8499755859375) } bone_pos[28] = struct { px = Float(435.3146667480469) py = Float(94.96534729003906) pz = Float(-44.37565231323242) } bone_pos[29] = struct { px = Float(3.454439401626587) py = Float(208.38644409179688) pz = Float(-1737.650146484375) } bone_pos[30] = struct { px = Float(-79.11219024658203) py = Float(-363.0055236816406) pz = Float(-1827.7415771484375) } bone_pos[31] = struct { px = Float(16.629308700561523) py = Float(390.8931579589844) pz = Float(-163.42630004882812) } bone_pos[32] = struct { px = Float(10.211040496826172) py = Float(738.0623168945312) pz = Float(-258.8499755859375) } _skipped = Char[0] ('') } I see frames with translation data but have no idea how to connect them to the bones: subChunk[2] = struct { fourcc = Char[4] ('BOTD') size = UInt(200 [000000c8]) translationData = struct[5] translationData[0] = struct { px = Float(7.546019554138184) py = Float(3.9196670055389404) pz = Float(3812.746337890625) time = Float(0.0) unk = Float[6] } translationData[1] = struct { px = Float(7.546060562133789) py = Float(1915.4722900390625) pz = Float(3615.44873046875) time = Float(640.0) unk = Float[6] } translationData[2] = struct { px = Float(7.5461015701293945) py = Float(5260.68994140625) pz = Float(3812.746826171875) time = Float(1760.0) unk = Float[6] } translationData[3] = struct { px = Float(7.546142578125) py = Float(7172.2421875) pz = Float(3615.448974609375) time = Float(2400.0) unk = Float[6] } translationData[4] = struct { px = Float(7.5461835861206055) py = Float(10039.5712890625) pz = Float(3812.746826171875) time = Float(3520.0) unk = Float[6] } _skipped = Char[0] ('') } For all reading here randomly, concerning an animation viewer for iff files this is the answer from DotCube1 on Apr 15, 2024 Quote No cause there are 2 major problems IFF can't be converted straight to animation. Either you can convert it into .BEF file to view it in plain format or convert it in .XAF file to import it into 3DS Max. Second problem is that till you don't convert the models to load them into a 3d editor animations are no use so I suggest you to work on models Edited December 15, 2025Dec 15 by shak-otay
April 13Apr 13 Author Localization Here is the IGI 1 .IFF converter script in Python. Have you tried this? IGI_IFF_CONV.7z
April 13Apr 13 Supporter Well, 4 months later it's too hard for me to focus on this again, sorry. (My 'job' here is basically to help people help themselves.)
Create an account or sign in to comment