Difference between revisions of "Sims 3:0x01D0E723"
(25 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
− | + | {{TS3AdvancedModdingHeader}} | |
− | <br | + | {{TS3Resource |
− | + | |name=Vertex Format - VRTF | |
− | == | + | |typeid= 0x01D0E723 |
+ | |expansion=The Sims 3 | ||
+ | }} | ||
+ | <br clear="all"> | ||
+ | ==Format== | ||
This is a [[Sims 3:RCOL]] chunk found embedded in [[Sims 3:0x01661233|MODL]] and [[Sims 3:0x01D10F34|MLOD]] resources. | This is a [[Sims 3:RCOL]] chunk found embedded in [[Sims 3:0x01661233|MODL]] and [[Sims 3:0x01D10F34|MLOD]] resources. | ||
− | DWORD // 'VRTF' | + | DWORD Tag // 'VRTF' |
− | + | DWORD Version // 00000002 | |
− | + | DWORD Stride // Vertex data length (Bytes per vertex) | |
− | [[Sims 3: | + | DWORD Count |
− | + | DWORD IsExtendedFormat// boolean, always false but were it true the byte fields ahead would be DWORDs | |
+ | |||
+ | --repetition Count packed [http://msdn.microsoft.com/en-us/library/bb172630(VS.85).aspx D3DVERTEXELEMENT]: | ||
+ | BYTE [[#Element_Usages|Usage]] | ||
+ | BYTE UsageIndex //some elements can appear more than once, each time the index increases | ||
+ | BYTE [[#Element_Formats|Format]] | ||
+ | BYTE Offset // Offset into the vertex declaration for the data | ||
+ | |||
+ | ==Element Usages== | ||
+ | Usages, and the formats they are usually paired with. | ||
+ | {| class="wikitable" border="1" ! colspan="3" | ||
+ | |- | ||
+ | !Id | ||
+ | ![http://msdn.microsoft.com/en-us/library/bb172534%28v=VS.85%29.aspx Type] | ||
+ | !Element Formats | ||
+ | |- | ||
+ | |0x00 || Position || Float3, Short4 | ||
+ | |- | ||
+ | |0x01 || Normal || ColorUByte4 | ||
+ | |- | ||
+ | |0x02 || UV || Float2, Float4, Short2, Short4 | ||
+ | |- | ||
+ | |0x03 || BlendIndex || UByte4 | ||
+ | |- | ||
+ | |0x04 || BlendWeight || ColorUByte4 | ||
+ | |- | ||
+ | |0x05 || Tangent || ColorUByte4 | ||
+ | |- | ||
+ | |0x06 || Color || ColorUByte4 | ||
+ | |} | ||
+ | |||
+ | ==Element Formats== | ||
+ | List of formats, and how to read them | ||
+ | {| class="wikitable" border="1" ! colspan="3" | ||
+ | |- | ||
+ | !Id | ||
+ | !Used by | ||
+ | ![http://msdn.microsoft.com/en-us/library/bb172533%28v=VS.85%29.aspx Type] | ||
+ | ! | ||
+ | ![[Sims 3:0x01D0E6FB#Swizzle Commands|SwizzleCommands]] | ||
+ | |- | ||
+ | |0x00 || || Float || 1 float || 1x(Swizzle32) | ||
+ | |- | ||
+ | |0x01 || UV || Float2 || 2 floats || 2x(Swizzle32) | ||
+ | |- | ||
+ | |0x02 || Position || Float3 || 3 floats || 3x(Swizzle32) | ||
+ | |- | ||
+ | |0x03 || UV || Float4 || 4 floats || 4x(Swizzle32) | ||
+ | |- | ||
+ | |0x04 || BlendIndex || UByte4 || 4 bytes || 1x(Swizzle32) | ||
+ | |- | ||
+ | |0x05 || Normal, BlendWeight, Tangent, Color || ColorUByte4 || 3 floats in 4 bytes. Order is little-endian, use the low order byte (4th) as an unsigned scaler value. For each remaining signed byte, if negative, add it, if positive, subtract it, then multiple the result by 1/scaler, or by 1/127 if scaler is 0 | ||
+ | |||
+ | This entry needs explaining more clearly. | ||
+ | In [http://en.wikipedia.org/wiki/Endianness#Endianness_and_hardware Little-endian], the low order byte is first, not fourth. | ||
+ | The statements "add it" and "subtract it" do not explain what "it" is. | ||
+ | Here and subsequently: "multiply by 1/xxx" - why not just "divide by xxx"? | ||
+ | [[User:Pljones|Pljones]] 23:07, 17 January 2011 (UTC) | ||
+ | |||
+ | OK, here's my explanation (this generates values that match Wes Howe's tool fairly well): | ||
+ | :There are two methods, a general one and one for BlendWeight only, that are slightly different. | ||
+ | :*The order of the three floats is the reverse order of the first three bytes, with the fourth byte being a scaling factor. | ||
+ | :*Generate the scaling factor by subtracting the fourth byte from 255; if the result is zero, use 128 (or, for BlendWeight 256) instead. | ||
+ | :*Each float is generated by taking each byte, subtracting 128 (except if BlendWeight) and then dividing by the scaling factor. | ||
+ | [[User:Pljones|Pljones]] 22:08, 18 January 2011 (UTC) | ||
+ | || 1x(Swizzle32) | ||
+ | |- | ||
+ | |0x06 || UV || Short2 || | ||
+ | 2 floats in two words. | ||
+ | :*Non-UV usage: Divide by 32767. | ||
+ | :*UV usage: See below. | ||
+ | || 1x(Swizzle16x2) | ||
+ | |- | ||
+ | |0x07 || Position, UV || Short4 || | ||
+ | 3 floats in four words. | ||
+ | :*Non-UV usage: The fourth word is an unsigned scalar (or use 32767 if zero). Divide by this scalar. | ||
+ | :*UV usage: See below. | ||
+ | || 2x(Swizzle16x2) | ||
+ | |- | ||
+ | |0x08 || || UByte4N || || 1x(Swizzle32) | ||
+ | |- | ||
+ | |0x09 || || Short2N || || 1x(Swizzle16x2) | ||
+ | |- | ||
+ | |0x0A || || Short4N || || 2x(Swizzle16x2) | ||
+ | |- | ||
+ | |0x0B || || UShort2N || || 1x(Swizzle16x2) | ||
+ | |- | ||
+ | |0x0C || || UShort4N || | ||
+ | 3 floats in four words. | ||
+ | :*Non-UV usage: The fourth word is an unsigned scalar (or use 512 if zero). Divide by this scalar. | ||
+ | :*UV usage: See below. | ||
+ | || 2x(Swizzle16x2) | ||
+ | |- | ||
+ | |0x0D || || Dec3N || || 1x(Swizzle32) | ||
+ | |- | ||
+ | |0x0E || || UDec3N || || 1x(Swizzle32) | ||
+ | |- | ||
+ | |0x0F || || Float16_2 || || 1x(Swizzle16x2) | ||
+ | |- | ||
+ | |0x10 || || Float16_4 || || 2x(Swizzle16x2) | ||
+ | |- | ||
+ | |} | ||
+ | For UV usage, multiply by the [[Sims 3:0x01D0E75D|MATD]] ShaderData entry for UVScales, element 0. If no such value exists, divide by 32767. | ||
+ | |||
+ | |||
+ | Based on contributions from delphy, karybdis and atavera | ||
+ | |||
+ | {{TS3AdvancedModdingHeader}} |
Latest revision as of 12:23, 26 March 2011
Modding Reference by Category | |
---|---|
Sims 3 :DBPF | File Types | RCOL(Scene) | Catalog Resource | String Table | Key Table | TS3 Programmer's Reference |
Vertex Format - VRTF | ||
---|---|---|
TypeID: | 0x01D0E723 | |
Game Version: | The Sims 3 |
[edit] Format
This is a Sims 3:RCOL chunk found embedded in MODL and MLOD resources.
DWORD Tag // 'VRTF' DWORD Version // 00000002 DWORD Stride // Vertex data length (Bytes per vertex) DWORD Count DWORD IsExtendedFormat// boolean, always false but were it true the byte fields ahead would be DWORDs --repetition Count packed D3DVERTEXELEMENT: BYTE Usage BYTE UsageIndex //some elements can appear more than once, each time the index increases BYTE Format BYTE Offset // Offset into the vertex declaration for the data
[edit] Element Usages
Usages, and the formats they are usually paired with.
Id | Type | Element Formats |
---|---|---|
0x00 | Position | Float3, Short4 |
0x01 | Normal | ColorUByte4 |
0x02 | UV | Float2, Float4, Short2, Short4 |
0x03 | BlendIndex | UByte4 |
0x04 | BlendWeight | ColorUByte4 |
0x05 | Tangent | ColorUByte4 |
0x06 | Color | ColorUByte4 |
[edit] Element Formats
List of formats, and how to read them
Id | Used by | Type | SwizzleCommands | |
---|---|---|---|---|
0x00 | Float | 1 float | 1x(Swizzle32) | |
0x01 | UV | Float2 | 2 floats | 2x(Swizzle32) |
0x02 | Position | Float3 | 3 floats | 3x(Swizzle32) |
0x03 | UV | Float4 | 4 floats | 4x(Swizzle32) |
0x04 | BlendIndex | UByte4 | 4 bytes | 1x(Swizzle32) |
0x05 | Normal, BlendWeight, Tangent, Color | ColorUByte4 | 3 floats in 4 bytes. Order is little-endian, use the low order byte (4th) as an unsigned scaler value. For each remaining signed byte, if negative, add it, if positive, subtract it, then multiple the result by 1/scaler, or by 1/127 if scaler is 0
This entry needs explaining more clearly. In Little-endian, the low order byte is first, not fourth. The statements "add it" and "subtract it" do not explain what "it" is. Here and subsequently: "multiply by 1/xxx" - why not just "divide by xxx"? Pljones 23:07, 17 January 2011 (UTC) OK, here's my explanation (this generates values that match Wes Howe's tool fairly well):
Pljones 22:08, 18 January 2011 (UTC) |
1x(Swizzle32) |
0x06 | UV | Short2 |
2 floats in two words.
|
1x(Swizzle16x2) |
0x07 | Position, UV | Short4 |
3 floats in four words.
|
2x(Swizzle16x2) |
0x08 | UByte4N | 1x(Swizzle32) | ||
0x09 | Short2N | 1x(Swizzle16x2) | ||
0x0A | Short4N | 2x(Swizzle16x2) | ||
0x0B | UShort2N | 1x(Swizzle16x2) | ||
0x0C | UShort4N |
3 floats in four words.
|
2x(Swizzle16x2) | |
0x0D | Dec3N | 1x(Swizzle32) | ||
0x0E | UDec3N | 1x(Swizzle32) | ||
0x0F | Float16_2 | 1x(Swizzle16x2) | ||
0x10 | Float16_4 | 2x(Swizzle16x2) |
For UV usage, multiply by the MATD ShaderData entry for UVScales, element 0. If no such value exists, divide by 32767.
Based on contributions from delphy, karybdis and atavera
Modding Reference by Category | |
---|---|
Sims 3 :DBPF | File Types | RCOL(Scene) | Catalog Resource | String Table | Key Table | TS3 Programmer's Reference |