Skip to content
This repository has been archived by the owner on Jan 24, 2024. It is now read-only.

0x01D10F34

orangemittens edited this page Jul 20, 2014 · 6 revisions

#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.
Clone this wiki locally