Difference between revisions of "Sort List Crash 2/3"

From Crash Bandicoot Hacking Wiki
Jump to navigation Jump to search
m (Descriptions for adding, removal, swapping nodes)
m
Line 97: Line 97:
  
 
<code>Format E: 001XXPPP PPPPPPPP</code>  
 
<code>Format E: 001XXPPP PPPPPPPP</code>  
* X = XOR mask,; the new polygon ID <code>WWW**PPP PPPPPPPP</code> = <code>WWW00PPP PPPPPPPP + ((SS^XX) << 11)</code>
+
* X = XOR mask; the new polygon ID <code>WWW**PPP PPPPPPPP</code> = <code>WWW00PPP PPPPPPPP + ((SS^XX) << 11)</code>
 
* P = Targeted polygon index
 
* P = Targeted polygon index

Revision as of 22:00, 5 July 2018

 Introduction

The sort lists in Crash 2/3 are for the most part similar to the ones found in Crash 1. Therefore it is recommended to read the extensive article about Sort Lists in Crash 1 first before reading this article.

 Format

Item 1/Item N: Main Source/Target List 

Offset Field Size Value
0x0 List Size (polygon ID count) 2 bytes c
0x2 List Type 2 bytes 0
0x4 Polygon IDs c x 2 bytes *

Polygon ID

Each Polygon ID has the following format:

*WWWSSPPPPPPPPPP

  • W = index of world model
  • S = state of the polygon
  • P = index of polygon in world model

Since scenery entries in Crash 2/3 have lists for both triangles and quads, the polygon state is used to differentiate between an index for a triangle (SS = 0) and a quad (SS = 1-3).

The polygon state also specifies whether to fully draw the quad or only half of it. A quad can be conceived as a combination of two triangles (ABC and BCD respectively) into a single polygon (ABCD). When only triangle ABC needs to be drawn, SS=1. Should only triangle BCD be drawn, SS=2. Finally, if the entire quad needs to be drawn, SS=3.

 Item 2 to N-1: Difference List

Offset Field Size Value
0x0 List Size minus 2 (in hwords) 2 bytes c + 2
0x2 List Type 2 bytes 1
0x4 Rel. Index of end of removing nodes minus 2Rel. Index of start of adding nodes minus 2 2 bytes a + 2
0x6 Rel. Index of end of adding nodes minus 2Rel. Index of start of swapping nodes minus 2 2 bytes r + 2
Nodes/List
0x8 Removing Nodes (a - 2) x 2 bytes *
0x8 + ((a - 2) x 2) Adding Nodes (r-a-2) x 2 bytes *
0x8 + ((r - 2) x 2) Swapping Nodes (c-r-a-2) x 2 bytes *

 Adding/Removing Nodes

Adding and Removing nodes have the same format:

CCCCNNNN NNNNNNNN (WWWSSPPP PPPPPPPP x (C+1))

  • C = add/skip count (this node contains C+1 polygon IDs, number of polygon IDs to add/skip)
  • N = add/skip index (the polygon IDs from this node will be added to the new list in a progression, or skipped and not added in a retrogression)
  • WSP = polygon ID(s) to add when inserting; other than in Crash 1 these polygon IDs in are the same as in the Source/Target lists since the copyflag functionality is abandoned in Crash 2/3.

 Swapping Nodes

Format A: 1BBBBAAA AAAAAAAA [01CCCCCC CCCDDDDD]

Format B: 0000AAAA AAAAAAAA 0000BBBB BBBBBBBB [01CCCCCC CCCDDDDD]

  • A = index of Polygon ID A
  • B = index of Polygon ID B relative to A + 1
  • C = index of Polygon ID C relative to A
  • D = index of Polygon ID D relative to C + 17

Besides these swapping node formats familiair from Crash 1, there is another type of 'swapping node' in Crash 2/3 that accounts for the swapping of polygon states. They always come after the formats A - D, at the end of the difference list. The swapping is really a XOR-operation on the SS-value of the polygon ID that it refers to.

Format E: 001XXPPP PPPPPPPP

  • X = XOR mask; the new polygon ID WWW**PPP PPPPPPPP = WWW00PPP PPPPPPPP + ((SS^XX) << 11)
  • P = Targeted polygon index