-
Notifications
You must be signed in to change notification settings - Fork 70
0x01D10F34
#MLOD This is an RCOL chunk. ''LOD'' means ''Level of detail''.
This chunk is found in both MLOD and MODL files and it maps each mesh group to the appropriate parts of VRTF, VBUF, IBUF, SKIN and MATD chunks.
##Format
DWORD Tag // 'MLOD' DWORD Version // 0x00000201 DWORD // group_count repeat '''group_count''' times: DWORD // subset_bytes number of bytes after here in this repetition DWORD NameHash // FNV32 of the group name DWORD Material // MATD or MTST Private index DWORD VertexFormat // VRTF Private index DWORD VertexBuffer // VBUF Private index DWORD IndexBuffer // IBUF Private index DWORD Flags // PrimitiveType | (MeshFlags << 8) DWORD StreamOffset // VBUF offset in bytes DWORD StartVertex // 0 DWORD StartIndex // IBUF index DWORD MinVertexIndex // 0 DWORD VertexCount // DWORD PrimitiveCount // FLOAT[6] BoundingBox // MinX/MinY/MinZ/MaxX/MaxY/MaxZ for this group DWORD SkinController // SKIN Private index DWORD // bone_count repeat '''bone_count''' times: DWORD // bone hash name DWORD // MATD Private index //Special MATD that only has UVScale/UVOffset/PosScale/PosOffset and no ShaderName DWORD // geo_st_count repeat '''geo_st_count''' times: DWORD // geo_st name hash DWORD // VBUF starting index index of the first vertex of the geo_st DWORD // (IBUF starting index) * 3 index of the first polygon face of the geo_st DWORD // VBUF count number of vertices in the geo_st DWORD // IBUF count number of polygon faces in the geo_st if (version > 0x00000201) DWORD ParentNameHash // FNV32 of the ParentName, always 0 FLOAT[3] MirrorPlaneNormal // 3d normal vector specifying the direction of a mirror's reflection FLOAT MirrorPlaneOffset //offset along the normal vector if (version > 0x00000203) DWORD // So far always zero, but could be a count for a new list.
##Primitive Types
Id | Type |
---|---|
0x00000000 | PointList |
0x00000001 | LineList |
0x00000002 | LineStrip |
0x00000003 | TriangleList |
0x00000004 | TriangleFan |
0x00000005 | TriangleStrip |
0x00000006 | QuadList |
0x00000007 | DisplayList |
##Mesh Flags
Flag | Type |
---|---|
0x00000001 | BasinInterior |
0x00000002 | HDExteriorLit |
0x00000004 | PortalSide |
0x00000008 | DropShadow |
0x00000010 | ShadowCaster |
0x00000020 | Foundation |
0x00000040 | Pickable |
##Geometry States Geometry states are basically a way to make part of an object's mesh visible while the rest of it becomes invisible. The polygons and vertices that are visible in the geometry state are determined by the state's poly and vertex offsets and counts.
The purpose of geometry states is to sub-divide the mesh of a given group, allowing the model's visibility to be dynamically changed by the game through the function:
ScriptCore.World.ObjectSetGeometryVisibilityState(ObjectGuid objId, string geometryVisibilityState);
For most objects with geometry states, this function is commonly accessed through this function:
Sims3.Gameplay.Abstracts.GameObject.SetGeometryState(string state);
For some objects, the string argument is fnv32 hashed and matched to the corresponding '''geo_st name hash'''. However, in some cases, such as for the musicalInstrumentGuitar, it is unknown how some geometry states are located for the game. In the case of the guitar, two geometry states are given in the MLOD block:
0x4A9A1FD1 "guitarOnly" 0x019C3651 "standOnly"
However, the guitar's code uses the string "guitarAndStand" to combine the two states and get the complete mesh. How this is done is still unknown.
##UPDATE:
- The current theory is that when the hash of a geometry state name does not explicitly match any of the geometry states in the mesh's model, the entire model becomes visible.
- Also, the geometry state only affects the group that it is in. All other groups remain completely visible despite the current geometry state of one of the group.
- By creating what can be called a "zero" geometry state, with offset and count values all equal to zero, the group that the geometry state is can be hidden in the game when that state is entered.
- An example is the garden sprinkler, which has two groups, one of which contains the sprinkler and the "dome" that you see in build/buy mode, and the other containing only the dome itself.
- The group that contains only the dome has a single geometry state, "domeOff", which is a zero geometry state. When this state is entered, the dome disappears, and the scripts enter it whenever Live Mode is entered.
- When Build or Buy Mode is entered, the scripts enter the "domeOn" geometry state. Since this state is not explicitly defined in the model, entering this state causes the entire model, including the dome, to become visible.