Difference between revisions of "Sims 3:0x01D0E723"

From SimsWiki
Jump to: navigation, search
 
(21 intermediate revisions by 4 users not shown)
Line 1: Line 1:
[[Sims 3:Main Page]] -> [[Sims 3:PackedFileTypes]]
+
{{TS3AdvancedModdingHeader}}
<br/>[[Sims 3:Main Page]] -> [[Sims 3:RCOL]]
+
{{TS3Resource
<hr/>
+
|name=Vertex Format - VRTF
==Vertex Format ==
+
|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 // 00000002
+
  DWORD Version // 00000002
  DWORD // Vertex data length (Bytes)
+
  DWORD Stride // Vertex data length (Bytes per vertex)
  DWORD // Declaration count
+
  DWORD Count
  DWORD // Unknown (0)
+
  DWORD IsExtendedFormat// boolean, always false but were it true the byte fields ahead would be DWORDs
 
   
 
   
  For each count vertex declaration, a packed form of [http://msdn.microsoft.com/en-us/library/bb172630(VS.85).aspx D3DVERTEXELEMENT]
+
  --repetition Count packed [http://msdn.microsoft.com/en-us/library/bb172630(VS.85).aspx D3DVERTEXELEMENT]:
BYTE Usage // 0=position, 1=normal, 2=UV, 3=assignment, 4=skin weight, 5=tangent
+
BYTE [[#Element_Usages|Usage]]
BYTE UsageIndex
+
BYTE UsageIndex //some elements can appear more than once, each time the index increases
BYTE Type // compression format (see below)
+
BYTE [[#Element_Formats|Format]]
BYTE Offset // Offset into the vertex declaration for the data
+
BYTE Offset // Offset into the vertex declaration for the data
  
Compression formats:
+
==Element Usages==
07 = 3 floats in 4 words. The fourth word is an unsigned scaler, multiply each signed word by 1/scaler (or use 512 if zero)
+
Usages, and the formats they are usually paired with.
06 = 2 floats in two words. Multiply the signed values by 1/32767
+
{| class="wikitable" border="1" ! colspan="3"
05 = 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
+
|-
04 = 4 small ints.
+
!Id
<hr/>
+
![http://msdn.microsoft.com/en-us/library/bb172534%28v=VS.85%29.aspx Type]
[[Sims 3:Main Page]] -> [[Sims 3:PackedFileTypes]]
+
!Element Formats
<br/>[[Sims 3:Main Page]] -> [[Sims 3:RCOL]]
+
|-
 +
|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):

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.

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 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 

Personal tools
Namespaces

Variants
Actions
Navigation
game select
Toolbox