Sims 3:0x015A1849
From SimsWiki
				
								
				
				
																
				
				
				Sims 3:Main Page -> Sims 3:PackedFileTypes
Sims 3:Main Page -> Sims 3:RCOL
| Contents | 
Material Definition
This is a Sims_3:RCOL chunk.
Header
long     'GEOM'
long     Version              // 5
long     TailOffset
long     TailSectionSize   // (0x14, 0x44 observed)
long     EmbeddedID     //(0, 0x548394B9 observed)
if(EmbeddedID!=0) {
   long ChunkSize
   byte[ChunkSize]       // starts with 'MTNF'
   }
long   0                      //unknown purpose
long   0                      // unknown purpose
long   NumVerts
long   FCount                            // was named Version, but is number of vertex elements
block  VertexFormat[FCount]      // long, long, byte; documented below 9 bytes/vertex-element-count
struct VertexData[NumVerts]     // follows vertex format block, documented below
block  FaceFmt                         // long ItemCount, byte BytesPerFacepoint
long   NumFacePoints                // means faces*3
word [NumFacePoints][3]         // standard face index (three unsigned words per face) for 2-byte FaceFmt
Tail
long  flags
long  count1
long  bonehasharray[count1]  // 32-bit hash of used bone names.
long  numtgi
block references[numtgi]  // each is a TGI[sub]64[/sub], a 16-byte quantity, so size is 16*numtgi
                                    // references are to DDS textures and BONE file
VertexFormat
For each vertex count:
long DataType long SubType byte BytesPerElement
DataType
| 1 | Position | (3 float == 12 bytes) | 2 | Normal | (3 float == 12 bytes) | 3 | UV | (2 float == 8 bytes) | 
SubType
| 1 | floats | 2 | bytes | 4 | long | 
You calculate the offset of each element from the sum of the previous BytesPerElement
Examples
Known Vertex Formats:
Format 3 VertexData is: float PositionDelta[3] float NormalDelta[3] long VertID [28 bytes per vertex] Format 6 VertexData is: float Position[3] // XYZ, Y is UP float Normal[3] float UV[2] long Bone Assignments // a packed byte array, parsed lo order to high order float Weights[4] // first weight is lowest order byte of assignments, 0.0 (0L) weights are unassigned slots float Tangent Normal[3] [64 bytes per vertex] Format 7 VertexData is: float Position[3] // XYZ, Y is UP float Normal[3] float UV[2] long Bone Assignments // packed byte array float Weights[4] long VertID float Tangent Normal[3] [68 bytes per vertex] Format 8 VertexData is: float Position[3] // XYZ, Y is UP float Normal[3] float UV[2] long Tagval // color channel bytes long Bone Assignments // a packed byte array float Weights[4] long VertID float Tangent Normal[3] [72 bytes per vertex]
Reading Vertex Data Blocks
For each vertex, you need to loop through the VertexFormat as defined, and read the information in order.
The order can be completely arbitary, and varied in size.
Here is some example code in c# to do so:
for (int i = 0; i < numVerts; i++)
{
	for (int j = 0; j < vertexFormats.Count; j++)
	{
		float x = 0;
		float y = 0;
		float z = 0;
		vertexFormat vf = (vertexFormat)vertexFormats[j];
		switch (vf.dataType)
		{
			case 1:
				x = reader.ReadSingle();
				z = reader.ReadSingle();
				y = reader.ReadSingle();
				sb.AppendLine("  XYZ: " + x.ToString() + " " + y.ToString() + " " + z.ToString() );
				break;
			case 2:
				x = reader.ReadSingle();
				z = reader.ReadSingle();
				y = reader.ReadSingle();
				sb.AppendLine("  Normal: " + x.ToString() + " " + y.ToString() + " " + z.ToString() );
				break;
			case 3:
				float u = reader.ReadSingle();
				float v = reader.ReadSingle();
				sb.AppendLine("  UV: " + u.ToString() + " " + v.ToString() );
				break;
			case 4:
				sb.AppendLine("  Bone: " + reader.ReadUInt32().ToString() );
				break;
			case 5:
				float w1 = reader.ReadSingle();
				float w2 = reader.ReadSingle();
				float w3 = reader.ReadSingle();
				float w4 = reader.ReadSingle();
				sb.AppendLine("  Weights: " + w1.ToString() + " " + w2.ToString() + " "
					+ w3.ToString() + " " + w4.ToString() );
				break;
			case 6:
				x = reader.ReadSingle();
				z = reader.ReadSingle();
				y = reader.ReadSingle();
				sb.AppendLine("  Tangent Normal: " + x.ToString() + " " + y.ToString() + " " + z.ToString() );
				break;
			case 7:
				// Note, not splitting this up yet just reading an int
				sb.AppendLine("  TagVal: " + reader.ReadUInt32().ToString() );
				break;
			case 10:
				sb.AppendLine("  VertexID: " + reader.ReadUInt32().ToString() );
				break;
		}
	}
}
Note that basically we just look through the VertexFormat, and read the data in order. There is no fixed "vertex format" version, it's all controlled via the vertexformat data.
Sims 3:Main Page -> Sims 3:PackedFileTypes
Sims 3:Main Page -> Sims 3:RCOL
