File Formats

From The Foundry MODO SDK wiki
Jump to: navigation, search

Preamble

THIS ARTICLE IS STILL WORK IN PROGRESS AS AT -- Sy (Synide) 13:54, 22 October 2012 (UTC)

Conventions

The following table describes some shorthand datatypes used in this article for the various file formats. For convenience, these are the same conventions used in the LWO2 documentation from NewTek. All binary datatypes are stored in Motorola byte order, also known as big endian or network order, with the most significant byte first.
Datatypes
Shorthand C Datatype Description
I1 char 1-byte integer
I2 short 2-byte integer
I4 long 4-byte integer
U1 unsigned char 1-byte unsigned integer
U2 unsigned short 2-byte unsigned integer
U4 unsigned long 4-byte unsigned integer
F4 float IEEE 4-byte floating point number
VEC12 F4[3] 3D coordinates are written as an XYZ vector in floating point format. The values are distances along the X, Y, and Z axes.
S0 char* NULL-terminated ASCII string (ie. string of characters ending in a zero byte). The string is padded to an even number of bytes with a NULL where necessary.
VX short or integer Variable length index, used to represent an index into a list. If the index is less than 0xFF00 (65,280), then this is a U2. Otherwise, the value should be read as a U4 and the high byte should be discarded.
ID4 long 4-byte identifier encapsulated in a long. This is usually a string of ASCII values, which can be generated with some bit-shifting and bitwise or’ing like so: (‘T’ << 24 | ‘E’ << 16 | ‘S’ << 8 | ‘T’).

Chunk Hierarchy

The various modo binary file formats described in this article are principally container files in the Interchange File Format (IFF) layout. They comprise a hierarchy of chunks and sub-chunks.
All chunks & sub-chunks have a ID4 Id and either a U4 or U2 Size attribute/property/field for chunks & sub-chunks respectively.
The Size attribute field denotes the amount of bytes that constitute the body of the chunk (or sub-chunk).
If the Size value is not an even number of bytes there will be an extra padding byte (usually a NULL value byte) that is NOT included in the Size count.
A stylized structure follows as :-
typedef struct stSubChunk {
    ID4          Id;
    U2           Size;
    char         Data[Size];
    if (Size & 1)
      char       PaddingByte;
} tSubChunk;
 
 
typedef struct stChunk {
    ID4          Id;
    U4           Size;
    char         Data[Size];
    if (Size & 1)
      char       PaddingByte;
} tChunk;
Some chunks and sub-chunks are optional, while some may appear zero or more times in the same part of a file. Attribute fields with dynamic sizes are marked with ?? and more information on these can be found in the chunk/sub-chunk detailed description.
NOTE: The Data[Size] of a Chunk is constructed from 1 or more SubChunks

Chunk Ordering

It is important to note that the order of the chunks matters when one chunk is referenced by another chunk. In these cases, the referenced chunk must come before the chunk that references it. For example, in LXOB files the LAYR chunk must come before the ITEM chunk that references it. Likewise PNTS & POLS chunks make reference to the preceding LAYR chunk. Some chunks may contain circular references like LINK sub-chunks and do not need to obey this rule.
Keep this rule in mind when referencing the hierarchy chart. Although it is ordered roughly by dependency, you need to be sure to respect the rules to avoid any compatibility problems when creating your own files.

LXOB Scene File

The LXOB file format is the standard Luxology scene file format for modo. It is a IFF chunked based format extended from the Lightwave LWO2 format. By default the file name extension for LXOB files used by modo is .lxo.

Hierarchy Summary

ToDo: chunk layout summary




Detailed Description


FORM

The file itself is a chunk with all other chunks/sub-chunks included in the body of the FORM chunk.
U4 ChunkSize. If this is zero, the file contents are larger than the maximum 32-bit unsigned int which is 2^32 bytes
U4 File Type. ie. LXOB, LXPR, LXPM, LXPE etc.
I1[ChunkSize] The data constituting the body of this chunk is represented and defined by the various chunks/sub-chunks following in this section.


VRSN

This chunk is present at the start of the file. It contains the major and minor version numbers of the file format, and the name of the application (with app version) that saved the file. If you write an application that saves an LXO, you should save your application’s name here. In modo 202, the major version is 1 and the minor version is 2. In 301, 3,1 in 501 3,0 on 601 3,1, in 701 4,0
U4 ChunkSize.
U4 Major version number.
U4 Minor version number.
S0 Application name that saved the file.


APPV

Nexus application version that created this file. Note: 801+ ??? Needs proper description ???
U4 ChunkSize.
U4 Major version number. eg. 8
U4 Minor version number. eg. 800 ??? Is this correct ???
U4 Unknown ??? Needs definition ???
U4 Build. eg. 70287
S0 Nexus level. eg. 'Nexus 8' ??? Needs proper description ???


THUM

This chunk contains a thumbnail image as uncompressed 8-bit per channel RGBA data. It is currently used only for presets.
U2 Image Width.
U2 Image Height.
U1 Image Channels (=4 for RGBA).
U1 Flags.
U1[] Image Data, width * height * channels bytes of pixels


PRVW

This chunk contains a thumbnail image as compressed image data. It is currently used only for presets.
U2 Image Width.
U2 Image Height.
U4 Type (image pixel format?)
U4 Flags (1=PNG compression).
U1[] Compressed Image Data, padded if necessary to be an even number of bytes


DESC

This chunk is used by presets to contain the primary item type of the preset and a user-friendly description of the content.
S0 Type.
S0 Description.


ENCO

Encoding chunk. Describes the string encoding used by application for text strings stored in the file.
U4 ChunkSize.
U4
Encoding type.
U4 Description
0 System Default
1 ANSI
2 UTF-8
3 Shift-JIS (Japanese)
4 EUC-JP (Japanese)
5 EUC-KR (Korea KS C 5601)
6 GB2312 (Simplified Chinese)
7 BIG5 (Traditional Chinese)


TAGS

This chunk is present at the start of the file. It lists the tag strings that can be associated with polygons via the PTAG chunk.
U4 ChunkSize.
S0[] An array of Tag strings from 1 to N.


REFS

This chunk, if present, is usually found near the begining of the file. It will only be present if there are 'reference' scene items detailed later in the file.
U4 ChunkSize.
U4 Count of References present.
S0[] An array of strings from 1 to Count specifying the filespec to the reference scene file.
Sub-Chunks
IDEL
Todo: Needs description..
U2 ChunkSize.
U4 Index. more needed
S0 Reference Name within the scene.???
S0 Parent Item Name.???
S0 Something???
S0 Something???
S0 Something???


CHNM

Channel Names are repeated throughout the file. Rather than repeating them unnecessarily and increasing the file size, they are consolidated into this chunk. ITEM and ACTN chunks can then index into the array of channel names to get the appropriate string. The first string in the table is usually "unknown".
U4 ChunkSize.
U4 Count. The number of elements in the following array.
S0[] An array of Channel Name strings from 1 to Count.


LAYR

The LAYR chunk is used with mesh items that have a corresponding LAYR sub-chunk in their ITEM chunk. This is a combination of LWO2 data and newer LXO data. There may be zero or more of these chunks present in an LXOB file.
U4 ChunkSize.
U2 Legacy index for LWO2 compatibility.
U2 Flags. see below.
F4[3] Rotation pivot point location, which defines the center of rotation.
S0 Layer name. May be empty if the layer has not been named.
I2 Legacy parent index for LWO2 compatibility. This chunk attribute/property is always set to -1. Parentage is now defined by a LINK subchunk (with a graph of 'parent') on the ITEM chunk associated with this LAYR.
F4 Refinement level used when freezing subdivision meshes into polygons for rendering. The display refinement level is a per-system user setting and is not stored in the LXO.
F4 Refinement level used when freezing curves, represented as the maximum angle between adjacent linear segments.
F4[3] Scale pivot point location, which defines the center of scaling.
U4[6] Currently unused.
U4 Item reference for the mesh layer.
U2 Refinement level used when freezing spline patch surfaces.
U2[3] For future expansion.


PNTS

Lists (x, y, z) coordinate triples for a set of points.
The number of points in the chunk is just the chunk size divided by 12. The PNTS chunk must precede the POLS, VMAP and VMAD chunks that refer to it. These chunks list points using a zero-based index into this PNTS chunk. The coordinate system is left-handed, with +X to the right or east, +Y upward, and +Z forward or north. Coordinates in the PNTS chunk are relative to the pivot point of the layer.
U4 ChunkSize.
VEC12[ChunkSize/12] The XYZ positions of points. The number of points present is the ChunkSize / 12.


BBOX

Bounding Box chunk is an optional chunk that stores the minimum and maximum vectors are the lower and upper corners of the bounding box.
U4 ChunkSize.
VEC12 Minimum XYZ vector.
VEC12 Maximum XYZ vector.


VMPA

The ??? chunk is associated with every VMAP chunk and must precede it.
U4 ChunkSize.
U4 Something ???.
U4 Something ???.


VMAP

Vertex Map.
Associates a set of floating-point vectors with a set of points. VMAPs begin with a type, a dimension (vector length) and a name. These are followed by a list of vertex/vector pairs. The vertex is given as an index into the most recent PNTS chunk, in VX format. The vector contains dimension floating-point values. There can be any number of these chunks, but they should all have different types or names. A particular point index in the PNTS chunk may or may not have a VMAP value.
U4 ChunkSize.
ID4
Vertex Map Type.
ID4 Dimension Description
MORF 3 A relative offset vertex morph map.
NORM 3 A vertex normal map.
PICK 0 A vertex (or point) selection set map. The mare existense of the PNTS index indcates that point/vertex is part of this selection set.
RGB 3 A vertex colour map.
RGBA 4 A vertex colour map with alpha.
SPOT 3 A absolute offset vertex morph map.
TXUV 2 A vertex UV coordinate map.
WGHT 1 A vertex weight map.
TBAS 6 A vertex tangent basis map. Usually (if not always) this map contains no information. The useable info. is stored in the corresponding VMAD (discontinuous) vmap on a per vertex / per polygon basis.
U2 Dimension.
S0 Vertex map name.
VERTVALUES[] An array of vertex indexes and there associated float values.


VMAD

Discontinuous Vertex Map.
The VMAD chunk holds information about discontinuous vertex maps, which are often used for UVs. This includes the type, dimensions, name and an array of vertex values for 1 or more polygons.
U4 ChunkSize.
ID4
Vertex Map Type.
ID4 Dimension Description
MORF 3 A relative offset vertex morph map.
NORM 3 A vertex normal map.
RGB 3 A vertex colour map.
RGBA 4 A vertex colour map with alpha.
SPOT 3 A absolute offset vertex morph map.
TXUV 2 A vertex UV coordinate map.
WGHT 1 A vertex weight map.
TBAS 6 A vertex tangent basis map.
U2 Dimension.
S0 Vertex map name.
VERTPOLYVALUES[] An array of vertex/polygon indexes and dimension number of float values. Array(VX,VX,F4[n]).


VMED

Discontinuous Edge Map.
The VMED chunk holds dimension number of floating point values for a given edge. An edge is defined by 2 vertex indexes into the previous PNTS chunk.
U4 ChunkSize.
ID4
Vertex Map Type.
ID4 Dimension Description
SUBV 1 A subdivision edge weight map.
EPCK 0 A edge selection set map.
U2 Dimension.
S0 Vertex map name.
EDGEVALUES[] An array of vertex A, vertex B and dimension number of float values. Array(VX,VX,F4[n]).


POLS

A list of polygons of a given type for the current layer.
Each polygon is defined by a vertex count followed by a list of indexes into the most recent PNTS chunk. The maximum number of vertices is 1023. The 6 high-order bits of the vertex count are flag bits with different meanings for each polygon type. When reading POLS, remember to mask out the flags to obtain numverts. (For CURV polygon: The two low order flags are for continuity control point toggles. The four remaining high order flag bits are additional vertex count bits; this brings the maximum number of vertices for CURV polygons to 2^14 = 16383). When writing POLS, the vertex list for each polygon should begin at a convex vertex and proceed clockwise as seen from the visible side of the polygon. Polygons are single-sided (although double-sidedness is a possible surface property), and the normal is defined as the cross product of the first and last edges. As of 701 the HCRV & BCRV chunks have a seperate 'flags' U4 so the NoOfVerts count is a full U2. As of 801 the new 'LINE' chunk to define 'Polylines' was introduced and also has the seperate 'flags' U4.
U4 ChunkSize.
ID4 Polygon Type.
ID4 Description
FACE A standard polygon.
CURV Catmull-Rom curve.
LINE Polyline.
BEZR Bezier curve.
SPCH Spline patch, as generated by the patching tools.
TEXT Text polygons, as generated by the Text tool.
SUBD Subdivision surface polygons.
PSUB Catmull-Clark subdivision surface, Pixar Subdivision surface.
HCRV Hermite curve. As of 701 CURV is depricated in favour of HCRV.
BCRV Bezier curve. As of 701 BEZR is depricated in favour of BCRV.
Polygons[] An array of polygons. Eg. U2,VX[] or U2,U4,VX[].


PTAG

Associates tags of a given type with polygons in the most recent POLS chunk.
The polygon is identified by an index into the most recent POLS chunk, and the tag is given by an index into the TAGS chunk. Not all polygons will have a value for every tag type. The behavior for polygons lacking a given tag depends on the type of the polygon.
U4 ChunkSize.
ID4
Tag Type.
ID4 Description
MATR A material assignment.
PART The part the polygon belongs to. Parts are named groups of polygons within the current LAYR chunk. A polygon can belong to only one part.
PICK A selection set a polygon belong's too. A given polygon may belong to many PICK chunks simultaneously.
FONT If the most recent POLS chunk specifies polygons of type 'TEXT' then there will be a PTAG chunk of type 'FONT'. The 'TAGS' entry this chunk points too specifies the font details as a string.
JUST If the most recent POLS chunk specifies polygons of type 'TEXT' then there will be a PTAG chunk of type 'JUST'. The 'TAGS' entry this chunk points too specifies the justification of the text.
TEXT If the most recent POLS chunk specifies polygons of type 'TEXT' then there will be a PTAG chunk of type 'TEXT'. The 'TAGS' entry this chunk points too specifies the the actual text string that is to be displayed.
SMGP The smoothing group the polygon belongs to. Shading is only interpolated within a smoothing group, not across groups.
ptag[] An array of POLS index, TAGS index. Eg. (VX,U2)[]. Where the index value into the most recent POLS chunk is specified in VX format. Either a U2 or U4. And, the TAGS index is a U2 into the TAGS chunk at the start of the file.


ITEM

The LXOB file contains one ITEM chunk per item in the scene, which in turn contain various sub-chunks representing the item’s attributes. The ITEM chunk contains three fixed fields representing the type name, the user name for the item, and a reference ID.
U4 ChunkSize.
S0 Item Type Name. The type name of the item, such as camera or mesh.
S0 Item Name. The name the user has assigned to the item. This may be an empty string if a name has not been assigned.
U4 Item reference ID, unique within the file. This is used to reference the item from other items.
Sub-Chunks
PAKG
The ITEM.PAKG subchunk occurs when a user has added a package of channels to an ITEM. This type of subchunk is becomming more prevalent in recent .LXO's.
U2 ChunkSize.
S0 PackageName. The internal name of the package.
U4 Reserved. Always zero.
XREF
The XREF is an optional sub-chunk that identifies this item as an external reference item, and is only present if this item is indeed a reference.
U2 ChunkSize.
U4 Index for the sub-scene in the REFS chunk.
S0 Filename containing the source scene being referenced.
S0 Item identifier in the source scene.
LAYR
Optional layer sub-chunk contains layer-specific features for the item. This consists of a layer index, flag bits, and a wireframe/element color.
U2 ChunkSize.
U4 Index of the layer in the LAYR chunk.
U4
Flags describing layer-specific properties.
Mask Name Description
0 Visible True if the layer is visible in GL.
1 Hidden True if the layer is hidden in GL.
2 Foreground Set if this layer is the foreground layer.
3 Background Set if this layer is a background layer.
4 Bounding Box Set if this layer is displayed as a bounding box only.
8 Linear Subdiv UV's Set to use linear interpolation of UVs on subdivision surfaces.
The first four bits of the flags represent the item’s visibility, and may be set as follows. Note that it is possible for both the Visible and Hidden to be set, in which case the layer’s visibility is in a mixed state and the true visibility is determined by the layer’s children. Also note that an item may be neither a foreground nor a background item. In that case, it is not currently selected and thus not visible in GL. This is different from the Hidden/Visible state. An item can still be the foreground or background object and also be hidden.
U1[4] Four-element array representing the RGBA element (wireframe) color in the UI.
LINK
Item Link. There may be zero or more Item Link sub-chunks and relates one item to another item. Parenting is one kind of linking. LINK sub-chunks contain a graph type name, unique ID to the target item, and the index of the link.
U2 ChunkSize.
S0 GraphName. The name of the graph that this link belongs to, such as 'parent', 'deformers', etc..
I4 ItemIndexID. The Index ID of the item that this item is linked too.
I4 LinkIndex. The index of the link. For instance, a locator may have 3 child locators. This item maybe the third child locator linked to the parent. This 'LinkIndex' reflects that order. Another example is transform items where this LINK chunk details a 'xfrmcore' graph link and the 'LinkIndex' defines the order of the various transform items. Thus facilitating Order Of Operations.
CLNK
Channel Link. There may be zero or more CLNK sub-chunk's and relates a channel in one item to a channel in another item. This is commonly used to drive one channel's value to another channel's value.
U2 ChunkSize.
S0 Graph Name. The name of the graph that this link belongs to, such as 'chanLinks'.
S0 Channel From Name. Channel name of the 'from' channel. If '(none)', this is a channel-to item link.
U4 From Reference ID. The RefId of the 'from' item containing the 'from' channel.
S0 Channel name for the 'to' channel.
I4 'From' link index.
I4 'To' link index.
UCHN
User Channel. Is a custom user defined channel. All items have a set of standard channels that vary based on the item type. These can be further extended through the use of user channels, which allow for arbitrarily defined channels to be added to the end of the item's normal channel list. The UCHAN sub-chunk defines user channels. These channels behave just like other channels, and their values are stored in the file in the same way. Note that all UCHAN sub-chunks must come before any other channel chunks.
U2 ChunkSize.
S0 Channel Name. The name of the user channel, without any vector mode suffixes.
S0 Channel Type Name. The name of the channel's datatype (ExoType).
U4
Vector Mode.
Most channels are simple scalar channels, meaning they represent a single component. modo also supports vector mode channels. These are defined just like normal channels, but are actually created as two or more related channels with a standard suffix automatically applied to the base channel name. For example, a color channel named "mycolor" defined as an RGB vector implicitly creates three scalar channels identified as mycolor.r, mycolor.g and mycolor.b. Each of the component channels are accessed just like normal scalar channels.
Value Mode Description
0 Scalar The channel name has no suffixes applied, and only a single channel is created.
1 XY Two channels suffixed with .x and .y representing a two dimensional position, rotation or vector.
2 XYZ Three channels suffixed with .x, .y and .z representing a three dimensional position, rotation or vector.
3 RGB Three channels suffixed with .r, .g and .b representing a color.
4 RGBA Three channels suffixed with .r, .g, .b and .a representing a color plus an alpha.
U4 Flags. Currently always 0.
I4 Default Integer Value. Default value for integer channels.
F4 Default Float Value. Default value for floating point channels.
U2 Hint Count. Number of text hints in the hints array that follows. May be zero if there are no hints.
Hint[]
Hint. Optional, Zero to Hint Count number of Name/Value pairs.
S0 Name of the hint, restricted by standard text hint naming rules.
I4 Value of the hint.
CHNL
Scalar Channel. There may be Zero or more of these sub-chunks in a given ITEM chunk. The CHNL sub-chunk contains the name, type and value of an individual channel. These are commonly found in preset files and older LXO files without CHNM tables, while newer LXOs contain only CHAN chunks and matching CHNM tables.
U2 ChunkSize.
S0 Channel Name.
U2
Channel Data Type. Which may be one of the following values.
Value Datatype Description
1 I4 Signed integer.
2 F4 Floating point number.
3 S0 A padded NULL-terminated string. This is used for raw strings and for text hint discrete choices.
 ?? Channel Value. The type of this field is dependent on the above 'Channel Data Type' flag field. For example, if the flag field was 1, then the data type of this 'Value' field would be I4.
CHNV
Vector Channel. There may be zero or more of these sub-chunks in a given ITEM chunk. The CHNV chuck represents the values of a channel vector. This is a combination of three channel values, usually RGB or XYZ. The chuck has the base name, datatype, array dimensions, and an array of values. Zero or more of these may be present in an ITEM chunk. These are commonly found in preset files and older LXO files without CHNM tables. They are becoming more prevalent in newer LXO's where packages added to item's may have channels that are vectors. Such as a F4[3] channel denoting an offset on a glItemShape package attched to a ITEM.
U2 ChunkSize.
S0 Channel Name. The base name of the channel. This is the channel name minus the vector component.
U2
Channel Data Type. Which may be one of the following values.
Value Datatype Description
1 I4 Signed integer.
2 F4 Floating point number.
3 S0 A padded NULL-terminated string. This is used for raw strings and for text hint discrete choices.
U2 Vector Count. The number of elements in the vector. 3 for XYZ or RGB, four for RGBA, etc.
 ??[] Channel Value. An array of name/value pairs. The underlying type of the value component of the pair is dependent on the 'Channel Data Type' field above. For example, a commonly occuring CHNV sub-chunk is for the 'wireColor' channel on an item. The 'Channel Name' would be 'wireColor'. The 'Channel Data Type' flag would be 2 (for float). The 'Vector Count' would be 3, for each component .r, .g & .b. And the array of name/value pairs would be 3 pairs of [S0,F4]. Namely, [R,<somevalue>], [G,somevalue] & [B,somevalue].
CHNS
String Channel. There may be zero or more 'String Channel' sub-chunk's present for an ITEM chunk and it represents a string channel containing the channel name and the string value. These are commonly found in preset files and older LXO files without CHNM tables, while newer LXOs contain only CHAN chunks and matching CHNM tables.
U2 ChunkSize.
S0 Channel Name.
S0 Channel Value.
GRAD
Gradient Channel. The GRAD sub-chunk contains the values of a gradient channel, which consists of the channel name and the index of a related envelope (ENVL) chunk. Zero or more of these may be present in an ITEM chunk.
U2 ChunkSize.
S0 Channel Name.
VX Envelope Index. Index of the envelope (ENVL) chunk relating to this gradient channel.
U4
Envelope Interpolation Flags. Which may be one of the following values.
The flag determines how the path between keyframes is resolved.
Value Description
0 Curve.
1 Linear.
2 Stepped.
CHAN
Channel Value. The CHAN sub-chunk is a newer, more generalized mechanism used to represent a channel value. The channel name is looked up by index in the CHNM chunk. The value’s type is determined by the U2 type field. Zero or more of these may be present in an ITEM chunk.
U2 ChunkSize.
VX Index into the CHNM (Channel Names) Chunk.
U2
Channel Data Type. Which may be one of the following values. NOTE: If an associated envelope datatype then this ITEM.CHAN should be looked up in the ACTN.scene chunk.
Value Description
1 Integer.
2 Float.
3 String representing an integer text hint.
17 Integer with an envelope.
18 Float with an envelope.
19 String representing an integer text hint with an envelope.
 ?? Channel Value. The datatype of this field is determined by the above 'Channel Data Type' field.
CHNC
Custom channel value sub-chunk. Zero or more of these may be present in an ITEM chunk. Often these channels will equate to a persisted struct.
U2 ChunkSize.
U1[ChunkSize] Arbitrary byte array of custom data. NOTE: Often the ChunkSize of this sub-chunk will be a non-even amount of bytes, therefore the actual chunk size will have an additional padding-byte which is not counted in the ChunkSize.
ITAG
Item Tag Channel. Items can be tagged with arbitrary strings, which are stored in ITAG sub-chunks. Zero or more of these may be present in an ITEM chunk.
U2 ChunkSize.
ID4 Tag type, such as CMNT, DESC or CUE, etc.
S0 Channel Value. This may be an empty string for some tags.
UNIQ
Unique Identifier. This sub-chunk defines the absolute internal unique name indentifier for this item.
U2 ChunkSize.
S0 Identifier.
UIDX
User Interface Unique Index. An item can have 3 names. The ITEM.UNIQ sub-chunk defines the absolute internal scene unique name. The ITEM.Username attribute defines a modo user defined name, if any. If no ITEM.Username is specified by the user the composite synthetically generated name is defined by the Item-Type plus this UIDX value appended as a suffix. The synthetic name formatting is subject to message table & user preference settings. For instance, a locator item-type has a message table username of 'Locator' and if the modo user's preference settings (Preferences>Defaults>Application>Item Index Style) was 'Item2' then the composite name would be formated as 'Locator<ITEM.UIDX.Index>'. And, thus providing a unqiue user-friendly UI name for the internal scene unique name of say 'locator106'.
U2 ChunkSize.
U4 Index.
VNAM
Visible Name. The user-visible name of the item. If the item has not been explicitly been renamed, a 'synthetic name' is created (e.g. "Mesh (37)" or "Floor (Material)")
U2 ChunkSize.
S0 Name.
BCHN
'B' Channel. Ostensibly used with procedural 'Mesh Operations' in modo 10+ series. Identifies an 'operation' type and a reference index ID that relates to a 'DATA' chunk (usually located at the end of the file).
U2 ChunkSize.
S0 Operation Type.
U4 'DATA' chunk index ID. Identifies the appropriate 'DATA' chunk that conatins the value type and value data for this operation type.


ENVL

The ENVL chunk describes an envelope applied to an item. In modo, envelopes define the keys of gradients and for normal keyframed animation. Note that this is not the same as the LWO2 envelope chunk. The envelope contains three sub-chunks representing the spline, TANI, TANO and KEY, as well as the behavior chunks PRE and POST. The spline type used in modo is a variation on the bezier spline. The specific implementation is not currently documented, but it should be close enough to standard bezier curves for you to use that at the moment.
U4 ChunkSize.
VX Envelope Index. Note: It is either U2 or U4 in size.
U4 Envelope Type.
Sub-Chunks
TANI
The TANI, Incoming tangent is a sub-chunk of the ENVL chunk and it contains information about the incoming tangent of the spline.
U2 ChunkSize.
U2
Slope Type. May be any of the following type values.
Value Description
0 Manual
1 Automatic
2 Linear In
3 Linear Out
4 Flat
U2
Weight Type. May be either manual or automatic.
Value Description
0 Manual
1 Automatic
F4 Weight.
F4 Slope.
F4 Value.
TANO
TANO similarly contains the outgoing tangent. This is used only for broken keys.
U2 ChunkSize.
U4
Broken Key Flags. Describes which values are discontinuous. May be any combination of the following values.
Value Description
0 Value
1 Slope
2 Weight
U2
Slope Type. May be any of the following type values.
Value Description
0 Manual
1 Automatic
2 Linear In
3 Linear Out
4 Flat
U2
Weight Type. May be either manual or automatic.
Value Description
0 Manual
1 Automatic
F4 Weight.
F4 Slope.
F4 Value.
KEY
This is the key value itself, which includes a key and an input value for the gradient. It also contains the FLAG sub-sub-chunk. (Depricated)
U2 ChunkSize.
F4 Input value for the gradient.
F4 Value for the key.
PRE
Behaviour before the first key.
U2 ChunkSize.
U2
Pre Behaviour Type. May be 1 of the following values.
Mask Name Description
0 Reset The default value.
1 Constant Hold the value of the nearest keyframe.
2 Repeat Repeat the envelope from the first to last keyframe.
3 Oscillate Similar to repeat, but runs the envelope forward and backward alternately.
4 Offset Repeat Similar to repeat, but the values are offset each cycle by the difference between the first and last keyframes.
5 Linear Linear interpolation derived from the slope of the nearest keyframe.
6 None Indicates that the envelope does not exist before or after the keyframe range, and the parent action's values should be used.
POST
Behaviour after the last key.
U2 ChunkSize.
U2
Post Behaviour Type. May be 1 of the following values.
Mask Name Description
0 Reset The default value.
1 Constant Hold the value of the nearest keyframe.
2 Repeat Repeat the envelope from the first to last keyframe.
3 Oscillate Similar to repeat, but runs the envelope forward and backward alternately.
4 Offset Repeat Similar to repeat, but the values are offset each cycle by the difference between the first and last keyframes.
5 Linear Linear interpolation derived from the slope of the nearest keyframe.
6 None Indicates that the envelope does not exist before or after the keyframe range, and the parent action's values should be used.


ACTN

The ACTN chunk describes an 'Action Layer' which is a mechanism for storing one or more items' channel values in differing states. There are currently three default 'application action layer' types , 'edit', 'scene' and 'setup'. Also, there may be 1 or more additional user created action layers of type 'scene'.
U4 ChunkSize.
S0 ActionLayerName. At least the three default action layers of edit, scene & setup plus any user defined action layers.
S0 ActionLayerType, either 'edit', 'scene' or 'setup'. The 'scene' action layer type is a slightly awkward name for the action layer type that identifies items within the scene with animated channels. The 'setup' action layer type identifies items with setup channel values. The 'edit' action layer type identifies items with edited channel values where the time slider has not yet been altered by the modo user at the time of saving the .lx? file. The setup & scene action layers allow for a start & end state for channel values facilitating animation.
U4 ActionLayerIndex. The zero based Index ID of this action layer.
Sub-Chunks
ITEM
The ACTN.ITEM sub-chunk identifies the main ITEM chunk that following ACTN sub-chunks are related too. Until the next ACT.ITEM sub-chunk.
U2 ChunkSize.
U4 Item reference ID, unique within the file.
CHAN
The ACTN.CHAN sub-chunk relates to the most recent ACTN.ITEM sub-chunk. It is similar in all respects to the ITEM.CHAN sub-chunk except it has an extra VX field that identifies the Envelope associated with this ACTN.CHAN.
U2 ChunkSize.
VX Index into the CHNM (Channel Names) Chunk.
U2
Channel Data Type. Which may be one of the following values.
Value Description
1 Integer.
2 Float.
3 String representing an integer text hint.
17 Integer with an envelope.
18 Float with an envelope.
19 String representing an integer text hint with an envelope.
VX Index of the associated ENVL (envelope) chunk.
 ?? Channel Value. The datatype of this field is determined by the above 'Channel Data Type' field.
GRAD
The ACTN.GRAD sub-chunk relates to the most recent ACTN.ITEM sub-chunk and contains the values of a gradient channel, which consists of the channel name (CHNM) index and the index of a related envelope (ENVL) chunk. Zero or more of these may be present in an ACTN chunk.
U2 ChunkSize.
VX Index into the CHNM (Channel Names) Chunk.
VX Envelope Index. Index of the envelope (ENVL) chunk relating to this gradient channel.
U4
Envelope Interpolation Flags. Which may be one of the following values.
The flag determines how the path between keyframes is resolved.
Value Description
0 Curve.
1 Linear.
2 Stepped.
CHNS
The ACTN.CHNS sub-chunk relates to the most recent ACTN.ITEM sub-chunk. It is similar in all respects to the ITEM.CHNS sub-chunk except it has an extra VX field that identifies the index into the CHNM (Channel Names) chunk. Also, although the 'S0' channel name field is still present, it is no longer used in preference to the index variation.
U2 ChunkSize.
S0 Channel Name.
VX Index into the CHNM (Channel Names) Chunk.
S0 Channel Value.


ANNI

The ANNI chunk describes...
U4 ChunkSize.
Sub-Chunks
AAIT
The ANNI.AAIT sub-chunk identifies...
U2 ChunkSize.
U4 Item reference ID, unique within the file.
AASE
The ANNI.AASE sub-chunk identifies...
U2 ChunkSize.
U2 LoopMode. Describes the...
U2 MuteState. Describes the...
U2 ScrubState. Describes the...
F4 StartTime. Describes the...


BAKE

The BAKE chunk is essentially a summary chunk describing the number & frequency of 'static mesh' triangle surface definitions that have been saved to the file to represent an animation sequence in a similar fashion to MDD. Most commonly resulting from an Alembic importation to modo.
U4 ChunkSize.
U4 Reference ID.
U4 Samples count. The number of
F4 Start time.
F4 Samples per second.
S0 Bake name. ???
S0 Bake name. ???


3GRP

The 3GRP chunk is the first in a series of chunks that detail modo's triangle surface 'static mesh'.
U4 ChunkSize.
U4 Tri-Surf count. The number of triangle surf definitions that constitute the 'static mesh'. A triangle surface definition is a grouping of a following 3SRF chunk, VRTS chunk, a TRIS chunk, 1 or more VVEC chunks & a TTGS chunk.
U4 Item reference ID. The unique ID of the ITEM chunk associated with this 3GRP chunk.
U4 Flags.


3SRF

The 3SRF chunk is the second in a series of chunks that detail a 'static mesh' item and relates to the most recent 3GRP chunk. It is essentially a summary statistics chunk detailing the number of verts, tri's, vertex vectors, tags & flags for the triangle surfaces that constitute the 'static mesh'.
U4 ChunkSize.
U4 VertexCount. The number of vertices' present in the triangle surface. This value will be consistent with a following 'VRTS' chunk.
U4 TrinagleCount. The number of triangles present in the triangle surface. This value will be consistent with a following 'TRIS' chunk.
U4 VertexVectorCount. The number of vertex vectors associated with this triangle surface. This value will be consistent with number of following VVEC chunks.
U4 TagsCount. The number of tags strings detailed in a following TTGS, triangle surface tags chunk.
U4 Flags.


VRTS

The VRTS chunk is the third in a series of chunks that detail a 'static mesh' item and relates to the most recent 3SRF chunk. It details 3 float values (xyz) for the count of vertices' from the most recent 3SRF.
U4 ChunkSize.
VEC12[3SRF.VertCount] An array of F4[3] (three float values) denoting XYZ position of 3SRF.VertexCount number of vertices.


TRIS

The TRIS chunk is the fourth in a series of chunks that detail a 'static mesh' item and relates to the most recent 3SRF chunk. It details 3 U4 values for the count of triangles from the most recent 3SRF.
U4 ChunkSize.
(U4[3])[3SRF.TriCount] An array of U4[3] (three unsigned long values) denoting the 3 indices from the most recent VRTS chunk xyz point positions and thereby facilitating the definition of a triangle.


VVEC

The VVEC chunk is the fifth in a series of chunks that detail a 'static mesh' item and relates to the most recent 3SRF chunk. They essentially contain the exact same sort of information as a 'VMAP' for a 'mesh' but are specifically detailed for 3SRF (triangle surface) items. These VVEC chunks can vary in size and makeup depending on the dimensionality required. For instance a 'normal' map VVEC will describe 3 floating point values for each point in the VRTS chunk associated with this 3SRF. A 'uv' VVEC chunk will describe 2 floating point values for each vertex. NOTE. These VVEC chunks can be inefficient in so much that the similar VMAP for MESH items only define values the user specified for particular vertices whereas VVEC chunks describe values for the total 3SRF.VertexCount irrespective of whether they had a value or not. If a user had numerous VMAPs defined for a MESH prior to converting it to a 'static mesh' item then the resulting VVECs can (and often do) contain much surpurfluous data.
U4 ChunkSize.
ID4
Vertex Vector Type.
ID4 Dimension Description
MORF 3 A relative offset vertex morph map.
NORM 3 A vertex normal map.
PICK 0 A vertex (or point) selection set map. The mare existense of the PNTS index indcates that point/vertex is part of this selection set.
RGB 3 A vertex colour map.
RGBA 4 A vertex colour map with alpha.
SPOT 3 A absolute offset vertex morph map.
TXUV 2 A vertex UV coordinate map.
WGHT 1 A vertex weight map.
U2 Dimension.
S0 Vertex vector name.
VERTVALUES[] An array of VVEC.Dimension values for 3SRF.VertexCount vertices.


TTGS

The TTGS chunk is the sixth in a series of chunks that detail a 'static mesh' item and relates to the most recent 3SRF chunk. These are essentially the same as PTAG's, polygon tags.
U4 ChunkSize.
(ID4,S0)[3SRF.TagsCount] An array of ID4,S0 (PTAG ID4's and S0 strings) for 3SRF.TagsCount. Usually only 'MATR' & 'PART' are detailed.
Tag Type.
ID4 Description
MATR A material assignment.
PART The part the polygon belongs to. Parts are named groups of polygons within the current LAYR chunk. A polygon can belong to only one part.
PICK A selection set a polygon belong's too. A given polygon may belong to many PICK chunks simultaneously.
FONT If the most recent POLS chunk specifies polygons of type 'TEXT' then there will be a PTAG chunk of type 'FONT'. The 'TAGS' entry this chunk points too specifies the font details as a string.
JUST If the most recent POLS chunk specifies polygons of type 'TEXT' then there will be a PTAG chunk of type 'JUST'. The 'TAGS' entry this chunk points too specifies the justification of the text.
TEXT If the most recent POLS chunk specifies polygons of type 'TEXT' then there will be a PTAG chunk of type 'TEXT'. The 'TAGS' entry this chunk points too specifies the the actual text string that is to be displayed.
SMGP The smoothing group the polygon belongs to. Shading is only interpolated within a smoothing group, not across groups.

DATA

The DATA chunk is a general chunk in that it contains a name/value pair. The name identifying the 'type' by which the the value data is interpreted.
U4 ChunkSize.
U4 Index. An index indentifying this 'DATA' chunk which is referenced from a 'ITEM.BCHN' subchunk.
U4 Unknown.
S0 Value Type. A string describing how one interprets the followng 'value' string. eg. '+intrange' would indentify that the following 'value' string be interpreted as a range of integer values.
S0 Value. A string defining the 'value'. It should be processed in accordance with the preceeding 'type' string.

LXPR Preset File

The LXPR file format is a subset of the standard LXOB format. It commonly represents item presets for materials, lights, or anything other than mesh items.
By default the file name extension for LXPR files is .lxp.
ToDo: chunk layout summary
ToDo: chunk details



LXPM Mesh Layer Preset File

The LXPM file format is a subset of the standard LXOB format. It contains a single mesh item and necessary shading items and can be dropped into a scene or used as a source with the Mesh Paint tool.
By default the file name extension for LXPM files is .lxl.
ToDo: chunk layout summary
ToDo: chunk details

LXPE Environment Preset File

The LXPE file format is a subset of the standard LXOB format. It is basically an entire scene that is intended to serve as a background that can be swapped out quickly and cleanly. It can contain meshes and basically any other type of item. It is commonly mistaken for an Item Preset (.lxp) for an Environment type item..
By default the file name extension for LXPE files is .lxe.
ToDo: chunk layout summary
ToDo: chunk details



eof