OpenKh

This is a centralized place for the documentation and other discoveries about the internal working of Kingdom Hearts games.

View on GitHub

Kingdom Hearts II - COCT

COCT is a set of data to realize collision detection. The targets are player (also NPC) and map mesh model.

COCT file structure

CollisionMeshGroup: (Has: BBox, Links to sub CollisionMeshGroup)
CollisionMesh: (Has: BBox, Unk1, Unk2)
Collision: (Has: Unk1)
Vertex: Single triangle or quad represents shape of Collision
Plane: xyzd
BBox: minXYZ, maxXYZ
SurfaceFlags: uint32

.
└── CollisionMeshGroup (Has one or more CollisionMesh)
    └── CollisionMesh (Has one or more Collision)
        └── Collision (3 or 4 Vertex. One Plane. 0 or 1 BBox. One SurfaceFlags)
            ├── Vertex
            ├── Plane
            ├── BBox
            └── SurfaceFlags

Note: BBox is short for bounding-box.

Here is association of table number and named tables:

Table1: CollisionMeshGroup
Table2: CollisionMesh
Table3: Collision
Table4: Vertex
Table5: Plane
Table6: BBox
Table7: SurfaceFlags

File header

Offset Variable Type Description
0 char[4] The identifier of the file (Should be always 0x54434F43)
4 uint32_t Version: always 1
8 uint32_t Unknown
12 uint32_t Unknown
16 uint32_t Offset Header: always 0
20 uint32_t Length Header: always 0x50
24 uint32_t Offset Table1
28 uint32_t Length Table1
32 uint32_t Offset Table2
36 uint32_t Length Table2
40 uint32_t Offset Table3
44 uint32_t Length Table3
48 uint32_t Offset Table4
52 uint32_t Length Table4
56 uint32_t Offset Table5
60 uint32_t Length Table5
64 uint32_t Offset Table6
68 uint32_t Length Table6
72 uint32_t Offset Table7
76 uint32_t Length Table7

CollisionMeshGroup (Table1)

Offset Variable Type Description
0 int16_t Child1
2 int16_t Child2
4 int16_t Child3
6 int16_t Child4
8 int16_t Child5
10 int16_t Child6
12 int16_t Child7
14 int16_t Child8
16 int16_t MinX
18 int16_t MinY
20 int16_t MinZ
22 int16_t MaxX
24 int16_t MaxY
26 int16_t MaxZ
28 uint16_t First index to CollisionMesh (Table2)
30 uint16_t Last index to CollisionMesh (Table2)

Notes:

CollisionMesh (Table2)

Offset Variable Type Description
0 int16_t MinX
2 int16_t MinY
4 int16_t MinZ
6 int16_t MaxX
8 int16_t MaxY
10 int16_t MaxZ
12 uint16_t First index to Collision (Table3)
14 uint16_t Last index to Collision (Table3)
16 uint16_t Unknown
18 uint16_t Unknown

Note: (X,Y,Z) are inverted (-X,-Y,-Z).

Collision (Table3)

Offset Variable Type Description
0 int16_t Unknown
2 int16_t Vertex1
4 int16_t Vertex2
6 int16_t Vertex3
8 int16_t Vertex4: can be -1 in case of triangle
10 int16_t Index to Plane (Table5)
12 int16_t Index to BBox (Table6), otherwise use -1 is to apply Table2’s BBox
14 uint16_t Index to SurfaceFlags (Table7)

Notes:

Vertex

Offset Variable Type Description
0 float X
4 float Y
8 float Z
12 float W: always 1

Note: (X,Y,Z) are inverted (-X,-Y,-Z).

Plane

Offset Variable Type Description
0 float X
4 float Y
8 float Z
12 float D

Note: (X,Y,Z,D) are inverted (-X,-Y,-Z,-D).

BBox

Offset Variable Type Description
0 int16_t MinX
2 int16_t MinY
4 int16_t MinZ
6 int16_t MaxX
8 int16_t MaxY
10 int16_t MaxZ

Note: (X,Y,Z) are inverted (-X,-Y,-Z).

SurfaceFlags

Offset Variable Type Description
0 uint32_t Surface Flags

Bit fields:

Bit Working Description
0 partyStand  
1 entityFallOverride  
2 unkFallFlag1 seems to only affect the player
3 unkFallFlag2  
4 partyCollide  
5 objectCollide affects enemies and field objects like the skateboard
6 unk01_1  
7 attackCollide  
8 unk02_1  
9 unk02_2  
10 ledgeGrab  
11 dispBarrier  
12 dispMessage  
13 unk02_3  
14 unk02_4  
15 unk02_5  
16 unk03_1  
17 unk03_2  
18 unk03_3  
19 unk03_4  
20 unk03_5  
21 unk03_6  
22 unk03_7  
23 unk03_8  
24 unk04_1  
25 unk04_2  
26 unk04_3  
27 unk04_4  
28 unk04_5  
29 unk04_6  
30 unk04_7  
31 unk04_8