Difference between revisions of "Sims 3:0x015A1849"
HugeLunatic (Talk | contribs) (→DataType) |
|||
(27 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
− | {{ | + | {{TS3AdvancedModdingHeader}} |
+ | {{TS3Resource | ||
+ | |name=Body Geometry - GEOM | ||
+ | |typeid= 0x015A1849 | ||
+ | |expansion=The Sims 3 | ||
+ | }} | ||
+ | <br clear="all"> | ||
+ | __NOTOC__ | ||
=Overview= | =Overview= | ||
Line 8: | Line 15: | ||
DWORD tgi offset // see [[Sims 3:Key table]] | DWORD tgi offset // see [[Sims 3:Key table]] | ||
DWORD tgi size // see [[Sims 3:Key table]] | DWORD tgi size // see [[Sims 3:Key table]] | ||
− | DWORD EmbeddedID // 0, | + | DWORD EmbeddedID // if no embedded material, will be 0 |
+ | // otherwise, if the "morphskin" or "morphskincloth" shaders are used in the material, it will be the FNV32 hash of "SimSkin", | ||
+ | // and if the "morpheye" shader is used, it will be the FNV32 hash of "SimEyes" | ||
--if (EmbeddedID != 0): | --if (EmbeddedID != 0): | ||
DWORD ChunkSize | DWORD ChunkSize | ||
--insert MTNF chunk // follows the same format of MTNF from [[Sims 3:0x01D0E75D]], starting at the 'MTNF' tag | --insert MTNF chunk // follows the same format of MTNF from [[Sims 3:0x01D0E75D]], starting at the 'MTNF' tag | ||
− | DWORD | + | DWORD mergeGroup |
− | DWORD | + | DWORD sortOrder // often zero |
DWORD NumVerts // Number of vertices | DWORD NumVerts // Number of vertices | ||
Line 23: | Line 32: | ||
--insert Vertex Data // [[#Vertex_Data|see below]] | --insert Vertex Data // [[#Vertex_Data|see below]] | ||
− | DWORD ItemCount | + | DWORD ItemCount // will usually be 1 (hardcoded in pipeline exporter), but sometimes other numbers |
--repetition ItemCount: | --repetition ItemCount: | ||
BYTE BytesPerFacePoint | BYTE BytesPerFacePoint | ||
− | DWORD NumFacePoints | + | DWORD NumFacePoints |
--repetition NumFacePoints: | --repetition NumFacePoints: | ||
− | + | BYTE[BytesPerFacePoint] // Given that ItemCount is 1, BytesPerFacePoint is 2, this is a list of WORDs | |
+ | // Each set of three forms a face. | ||
− | DWORD | + | DWORD index // to a [[Sims_3:0x00AE6C67|Skin Controller(0x00AE6C67)]] |
DWORD count1 | DWORD count1 | ||
Line 38: | Line 48: | ||
--insert TGI Block List // see [[Sims 3:Key table]] | --insert TGI Block List // see [[Sims 3:Key table]] | ||
+ | ==Quirks== | ||
+ | This format is packaged in a [[Sims_3:RCOL|RCOL]] container, however doesn't adhere to the same standards that most do. | ||
+ | |||
+ | * Declares a null resource key(00000000:00000000:0000000000000000) making it harder for tools to generically infer what type it is. | ||
+ | * Contains a "Standard" [[Sims_3:Key_table|TGI List]], rather than using the built-in [[Sims_3:RCOL|RCOL]] external references | ||
+ | * Due to using the standard list rather than the scoped [[Sims_3:RCOL|RCOL]] list, references made in the [[Sims_3:0x01D0E75D|MTNF]] are interpreted differently | ||
+ | * Pets EP introduced animal meshes that tend to have more than 1 uv-channel per mesh(uncommon or non-existent in previous human meshes) | ||
==Vertex Format== | ==Vertex Format== | ||
Line 53: | Line 70: | ||
|3||UV||(2 float == 8 bytes) | |3||UV||(2 float == 8 bytes) | ||
|- | |- | ||
− | |4||Bone Assignment||( | + | |4||Bone Assignment||(4 bytes) |
|- | |- | ||
|5||Weights||(4 float == 16 bytes) | |5||Weights||(4 float == 16 bytes) | ||
Line 61: | Line 78: | ||
|7||TagVal||(4 packed bytes) -- colour channel data | |7||TagVal||(4 packed bytes) -- colour channel data | ||
|- | |- | ||
− | |10||VertexID||( | + | |10||VertexID||(dword == 4 bytes) |
|- | |- | ||
|} | |} | ||
===SubType=== | ===SubType=== | ||
− | {| border="1" | + | {| class="wikitable" border="1" |
− | | | + | |- |
|1||floats | |1||floats | ||
− | | | + | |- |
|2||bytes | |2||bytes | ||
− | | | + | |- |
− | |4|| | + | |3||color |
− | | | + | |- |
+ | |4||dword | ||
+ | |- | ||
|} | |} | ||
You calculate the offset of each element from the sum of the previous BytesPerElement | You calculate the offset of each element from the sum of the previous BytesPerElement | ||
Line 80: | Line 99: | ||
==Vertex Data== | ==Vertex Data== | ||
− | Data for the known Vertex Formats follows. | + | <!--Data for the known Vertex Formats follows. |
===Format 3=== | ===Format 3=== | ||
float PositionDelta[3] | float PositionDelta[3] | ||
Line 115: | Line 134: | ||
long VertID | long VertID | ||
float Tangent Normal[3] | float Tangent Normal[3] | ||
− | [72 bytes per vertex] | + | [72 bytes per vertex]--> |
===Reading Vertex Data Blocks=== | ===Reading Vertex Data Blocks=== | ||
Line 183: | Line 202: | ||
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. | 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. | ||
− | {{ | + | {{TS3AdvancedModdingHeader}} |
Latest revision as of 04:04, 26 January 2012
Modding Reference by Category | |
---|---|
Sims 3 :DBPF | File Types | RCOL(Scene) | Catalog Resource | String Table | Key Table | TS3 Programmer's Reference |
Body Geometry - GEOM | ||
---|---|---|
TypeID: | 0x015A1849 | |
Game Version: | The Sims 3 |
[edit] Overview
This is a Sims 3:RCOL chunk for Body Geometry.
[edit] Format
DWORD 'GEOM' DWORD Version // 5 DWORD tgi offset // see Sims 3:Key table DWORD tgi size // see Sims 3:Key table DWORD EmbeddedID // if no embedded material, will be 0 // otherwise, if the "morphskin" or "morphskincloth" shaders are used in the material, it will be the FNV32 hash of "SimSkin", // and if the "morpheye" shader is used, it will be the FNV32 hash of "SimEyes" --if (EmbeddedID != 0): DWORD ChunkSize --insert MTNF chunk // follows the same format of MTNF from Sims 3:0x01D0E75D, starting at the 'MTNF' tag DWORD mergeGroup DWORD sortOrder // often zero DWORD NumVerts // Number of vertices DWORD FCount // Number of vertex elements --repetition FCount: --insert Vertex Format // see below --repetition NumVerts: --insert Vertex Data // see below DWORD ItemCount // will usually be 1 (hardcoded in pipeline exporter), but sometimes other numbers --repetition ItemCount: BYTE BytesPerFacePoint DWORD NumFacePoints --repetition NumFacePoints: BYTE[BytesPerFacePoint] // Given that ItemCount is 1, BytesPerFacePoint is 2, this is a list of WORDs // Each set of three forms a face. DWORD index // to a Skin Controller(0x00AE6C67) DWORD count1 --repetition count1: DWORD bonehasharray // 32-bit hash of used bone names. --insert TGI Block List // see Sims 3:Key table
[edit] Quirks
This format is packaged in a RCOL container, however doesn't adhere to the same standards that most do.
- Declares a null resource key(00000000:00000000:0000000000000000) making it harder for tools to generically infer what type it is.
- Contains a "Standard" TGI List, rather than using the built-in RCOL external references
- Due to using the standard list rather than the scoped RCOL list, references made in the MTNF are interpreted differently
- Pets EP introduced animal meshes that tend to have more than 1 uv-channel per mesh(uncommon or non-existent in previous human meshes)
[edit] Vertex Format
DWORD DataType DWORD SubType BYTE BytesPerElement
[edit] DataType
1 | Position | (3 float == 12 bytes) |
2 | Normal | (3 float == 12 bytes) |
3 | UV | (2 float == 8 bytes) |
4 | Bone Assignment | (4 bytes) |
5 | Weights | (4 float == 16 bytes) |
6 | Tangent Normal | (3 float == 12 bytes) |
7 | TagVal | (4 packed bytes) -- colour channel data |
10 | VertexID | (dword == 4 bytes) |
[edit] SubType
1 | floats |
2 | bytes |
3 | color |
4 | dword |
You calculate the offset of each element from the sum of the previous BytesPerElement
Based on contributions from karybdis and atavera
[edit] Vertex Data
[edit] 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.
Modding Reference by Category | |
---|---|
Sims 3 :DBPF | File Types | RCOL(Scene) | Catalog Resource | String Table | Key Table | TS3 Programmer's Reference |