Ico

This game was developed by Team Ico, for the PS2

Use the following programs and scripts to convert the models from ICO into the .3ds format that can be imported into blender, 3d studio max, maya, wavefront and more.

First use the extractor below on the data.df file. There is a game data extractor []



http://aluigi.altervista.org/quickbms.htm Then use the script called icoModelConverter to open a .faceindex file Use the script on the commandline by doing the following: Go to commandprompt then type in the path to quickbms.exe followed by -w (must be a lowercase w), followed by the path to icoP2OandP2Cextractor.bms followed by the path to a .faceindex file from the first script (make sure the .vertexes files are in the same folder as well), followed by the folder where you want to save the 3ds file.
 * Use the script below called "icoP2OandP2Cextractor.bms", with the free program called Quickbms**
 * to extract just the models from the P2O and P2C extension files.**

Press enter, and the script will ask you to open another file. What it really wants to do is to have the name of the output, so type in any name such as model.3ds, and it will create a file called model.3ds that contains the model. You can then import the .3ds file in any program thats supports the .3ds format

For example: D:\black\quickbms\quickbms.exe -w D:\black\quickbms\IcoModelConverter.BMS D:\black\quickbms\_8.faceindex D:\black\quickbms



There is a game data extractor [] It is used on the data.df file.

In the Jampack demo disc version of ICO, the models are in files with the .p2o extension (after decompressing the data.df file with the tool above.

Format of .p2o files: Header Format: ASCII String: PS2O (50 53 32 4F in Hexadecimal) 4ByteIntegerOffset:ToObjectListEntrySubPointer 4ByteIntegerUnknown

Format of the ObjectListEntrySubPointer 4ByteIntegerPointer:ToObjectList

Format of the ObjectList: 128BytesOfZero ASCII String: OBJH (4F 42 4A 48 i Hexadecimal) 12BytesOfZero 4ByteIntegerOffset:ToVertexCoords 4ByteInteger#NumberofVertexCoords 8BytesOfZero 4ByteIntegerOffset:ToNormalMappingList 4ByteInteger#NumberofNormalMappingEntries 8BytesOfZero 4ByteIntegerOffset:ToTextureMappingList 4ByteInteger#NumberofTextureMappingEntries 8BytesOfZero 4ByteIntegerOffset:ToColorMappingList 4ByteInteger#NumberofColorMappingEntries 8BytesOfZero 4ByteIntegerOffset:ToTintMappingList 4ByteInteger#NumberofTintMappingEntries 8BytesOfZero 4ByteIntegerOffset:ToTextureList 4ByteInteger#NumberofTextureEntries 8BytesOfZero 16ByteUnknown(PossiblyAllZeroes) 4ByteIntegerPointer:ToObjectFormationList 4ByteInteger#NumberofObjectsToForm

VertexCoord section Format: {4ByteFloatingPointVertexes(X,Y,Z)+4ByteFloatingPointWeight}

NormalMapping Entry Format: {4ByteFloatingPointNormalMapping(X,Y,Z)+4ByteFloatingPointWeight}

TextureMapping Entry Format: {4ByteFloatingPointTextureMapping(U,V)+00 00 00 00 00 00 00 00}

ColorMapping Entry Format: {1ByteRED, 1ByteGreen, 1ByteBlue, FF}

TintMapping Entry Format: {TintForRed(1ByteRED, 1ByteGREEN, 1ByteBLUE, 80), TintForGreen(1ByteRED, 1ByteGREEN, 1ByteBLUE, 80), TintForBlue(1ByteRED, 1ByteGREEN, 1ByteBLUE, 80), 4ByteFloatingPointWeight}

TextureList Entry Format: {ASCII short name of texture, 00, ASCII path and name of texture, padding to bring this up till the 118th byte, 4ByteFloatWeight#1, 4ByteFloatWeight#2, 00 00 00 00}

Format of ObjectFormationList: {4ByteIntegerOffsetToObjectFormationEntry}

ObjectFormation Entry Format: These consists of Submeshes.

Submesh Format:

Submesh Header Format: 2ByteInteger#NumberofVertexesInSubmesh FF FF FF FF FF FF FF FF FF FF FF FF FF FF

Submesh Data Format: {4ByteIntegerUnknownArray, 2ByteIntegerVertex, 2ByteIntegerNormal, 2ByteIntegerTextureMap, 2ByteIntegerColorMap, 2ByteIntegerTint, 2ByteIntegerTexture}

The submeshes each are Tristrips. The last submesh is a terminator entry with no data just an ending header: 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF



The format for some types of models in memory in the released game is as following:

{4ByteFloatVertexes(X,Y,Z),4ByteFloatWeight,4ByteFloatNormalMaps(X,Y,Z), 4ByteFloatWeight,Unknown4Byte,4ByteFloatWeight,Unknown8Byte, 4ByteFloatUVcoords(U,V),4ByteFloatWeight,4ByteFloatWeight,16BytePlaceholder(?? ?? ?? [43] ?? ?? ?? [43] ?? ?? ?? [43] ?? ?? ?? 4?