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://sourceforge.net/projects/dfread2/files/






Use the script below called "icoP2OandP2Cextractor.bms", with the free program called Quickbms
http://aluigi.altervista.org/quickbms.htm
to extract just the models from the P2O and P2C extension files.

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.

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

icobuilding.jpg



chainico.jpg

There is a game data extractor http://sourceforge.net/projects/dfread2/files/
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

icosample.jpg

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?