<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE niftoolsxml>
<niftoolsxml version="0.9.1.0">
    <!-- The versions found in use by the engine which have any amount of decoding or support from nif.xml
            NOTE: Hypothetical versions such as those used in version conditions must NOT receive version tags.

        id = "VX_X_X_X": The unique identifier for this version. Can be used to generate C-style enums, etc.
        num = "X.X.X.X": The numeric representation created by storing each part of the version in a byte.
            Example:  4.0.0.2 == 0x04000002
                     10.1.0.0 == 0x0A010000.
        supported = "<boolean>": False if the XML does not fully support reading of this version.
        user = "<List[integer]>": The custom User Version(s) for a specific Version from a game/developer.
            Note: Grouping multiple user in a list means that these user produce identical NIF layout.
            Example: user="12"
                     user="0x20000 0x30000"
        bsver = "<List[integer]>": The custom Bethesda Version(s) for a specific Version and User Version.
            Note: Grouping multiple bsver in a list means that these bsver produce identical NIF layout.
            Example: bsver="34"
                     bsver="30 31 32 33"
        custom = "<boolean>": True when version contains extensions to the format not originating from Gamebryo.
            Note: A user or bsver of non-zero implies custom="true" and is not necessary.
        ext = "<List[string]>": Any custom NIF extensions associated with this version.
            Example: ext="bto btr"

        Content: A comma-separated list of games which use this version.
            `{{}}` around a game name denotes that this version is the primary version for that game.
            A version without any `{{}}` names implies that this version is "secondary".
            Note: A unique game name should only have `{{}}` around it once.
    -->

    <version id="V2_3" num="2.3" supported="false">Dark Age of Camelot</version>
    <version id="V3_0" num="3.0" supported="false">Star Trek: Bridge Commander</version>
    <version id="V3_03" num="3.03" supported="false">Dark Age of Camelot</version>
    <version id="V3_1" num="3.1" supported="false">Dark Age of Camelot, Star Trek: Bridge Commander</version>
    <version id="V3_3_0_13" num="3.3.0.13">{{Munch's Oddysee}}, Oblivion</version>
    <version id="V4_0_0_0" num="4.0.0.0">Freedom Force</version>
    <version id="V4_0_0_2" num="4.0.0.2">{{Morrowind}}, {{Freedom Force}}</version>
    <version id="V4_1_0_12" num="4.1.0.12">Dark Age of Camelot</version>
    <version id="V4_2_0_2" num="4.2.0.2">Civilization IV</version>
    <version id="V4_2_1_0" num="4.2.1.0">Dark Age of Camelot, Civilization IV</version>
    <version id="V4_2_2_0" num="4.2.2.0">{{Culpa Innata}}, Civilization IV, Dark Age of Camelot, Empire Earth II</version>
    <version id="V10_0_1_0" num="10.0.1.0">{{Zoo Tycoon 2}}, Civilization IV, Oblivion</version>
    <version id="V10_0_1_2" num="10.0.1.2" bsver="1 3">Oblivion</version>
    <version id="V10_1_0_0" num="10.1.0.0">{{Freedom Force vs. the 3rd Reich}}, {{Axis and Allies}}, {{Empire Earth II}}, {{Kohan 2}}, {{Sid Meier's Pirates!}}, Dark Age of Camelot, Civilization IV, Wildlife Park 2, The Guild 2, NeoSteam</version>
    <version id="V10_1_0_101" num="10.1.0.101" user="10" bsver="4">Oblivion</version>
    <version id="V10_1_0_106" num="10.1.0.106" user="10" bsver="5">Oblivion</version>
    <version id="V10_2_0_0" num="10.2.0.0" user="0">{{Pro Cycling Manager}}, {{Prison Tycoon}}, {{Red Ocean}}, {{Wildlife Park 2}}, Civilization IV, Loki</version>
    <version id="V10_2_0_0__1" num="10.2.0.0" user="1">{{Blood Bowl}}</version>
    <version id="V10_2_0_0__10" num="10.2.0.0" user="10" bsver="6 7 8 9">Oblivion</version>
    <version id="V10_2_0_1" num="10.2.0.1" custom="true">WorldShift</version>
    <version id="V10_3_0_1" num="10.3.0.1" custom="true">WorldShift</version>
    <version id="V10_4_0_1" num="10.4.0.1" custom="true">{{WorldShift}}</version>
    <version id="V20_0_0_4" num="20.0.0.4" user="0">{{Civilization IV}}, {{Sid Meier's Railroads}}, Florensia, Ragnarok Online 2, IRIS Online</version>
    <version id="V20_0_0_4__10" num="20.0.0.4" user="10" bsver="11">{{Oblivion KF}}</version>
    <version id="V20_0_0_4__11" num="20.0.0.4" user="11" bsver="11">Fallout 3</version>
    <version id="V20_0_0_5_OBL" num="20.0.0.5" user="10" bsver="11">{{Oblivion}}</version>
    <version id="V20_1_0_3" num="20.1.0.3">{{Shin Megami Tensei: Imagine}}</version>
    <version id="V20_2_0_7" num="20.2.0.7" user="0">{{Florensia}}, Empire Earth III, Atlantica Online, IRIS Online, Wizard101</version>
    <version id="V20_2_0_7__11_1" num="20.2.0.7" user="11" bsver="14">Fallout 3, Fallout NV</version>
    <version id="V20_2_0_7__11_2" num="20.2.0.7" user="11" bsver="16" ext="rdt">Fallout 3</version>
    <version id="V20_2_0_7__11_3" num="20.2.0.7" user="11" bsver="21">Fallout 3, Fallout NV</version>
    <version id="V20_2_0_7__11_4" num="20.2.0.7" user="11" bsver="24">Fallout 3, Fallout NV</version>
    <version id="V20_2_0_7__11_5" num="20.2.0.7" user="11" bsver="25">Fallout 3, Fallout NV</version>
    <version id="V20_2_0_7__11_6" num="20.2.0.7" user="11" bsver="26">Fallout 3, Fallout NV</version>
    <version id="V20_2_0_7__11_7" num="20.2.0.7" user="11" bsver="27 28">Fallout 3, Fallout NV</version>
    <version id="V20_2_0_7__11_8" num="20.2.0.7" user="11" bsver="30 31 32 33">Fallout 3, Fallout NV</version>
    <version id="V20_2_0_7_FO3" num="20.2.0.7" user="11" bsver="34" ext="rdt">{{Fallout 3}}, {{Fallout NV}}</version>
    <version id="V20_2_0_7_SKY" num="20.2.0.7" user="12" bsver="83" ext="bto btr">{{Skyrim}}</version>
    <version id="V20_2_0_7_SSE" num="20.2.0.7" user="12" bsver="100" ext="bto btr">{{Skyrim SE}}</version>
    <version id="V20_2_0_7_FO4" num="20.2.0.7" user="12" bsver="130" ext="bto btr">{{Fallout 4}}</version>
    <version id="V20_2_0_7_F76" num="20.2.0.7" user="12" bsver="155" ext="bto">{{Fallout 76}}</version>
    <version id="V20_2_0_8" num="20.2.0.8" ext="nifcache">{{Empire Earth III}}, {{FFT Online}}, Atlantica Online, IRIS Online, Wizard101</version>
    <version id="V20_3_0_1" num="20.3.0.1">Emerge</version>
    <version id="V20_3_0_2" num="20.3.0.2">Emerge</version>
    <version id="V20_3_0_3" num="20.3.0.3">Emerge</version>
    <version id="V20_3_0_6" num="20.3.0.6">Emerge</version>
    <version id="V20_3_0_9" num="20.3.0.9" user="0 0x10000" ext="nft item">{{Bully SE}}, Warhammer, Lazeska, Howling Sword, Ragnarok Online 2, Divinity 2 (0x10000)</version>
    <version id="V20_3_0_9_DIV2" num="20.3.0.9" user="0x20000 0x30000" ext="item">{{Divinity 2}}</version>
    <version id="V20_5_0_0" num="20.5.0.0">MicroVolts, KrazyRain</version>
    <version id="V20_6_0_0" num="20.6.0.0">{{MicroVolts}}, {{IRIS Online}}, {{Ragnarok Online 2}}, KrazyRain, Atlantica Online, Wizard101</version>
    <version id="V20_6_5_0_DEM" num="20.6.5.0" user="17" supported="false">Epic Mickey 2</version>
    <version id="V30_0_0_2" num="30.0.0.2">Emerge</version>
    <version id="V30_1_0_1" num="30.1.0.1">Emerge</version>
    <version id="V30_1_0_3" num="30.1.0.3">Rocksmith, Rocksmith 2014</version>
    <version id="V30_2_0_3" num="30.2.0.3">Ghost In The Shell: First Assault, MapleStory 2</version>

    <module name="NiMain" priority="0" />
    <module name="NiAnimation" priority="25" depends="NiMain" />
    <module name="NiParticle" priority="50" depends="NiMain NiAnimation" />
    <module name="NiMesh" priority="70" depends="NiMain NiAnimation" />
    <module name="NiPSParticle" priority="80" depends="NiMain NiMesh NiAnimation" />
    <module name="NiPhysX" priority="90" depends="NiMain NiMesh NiPSParticle" />
    <module name="NiLegacy" priority="99" depends="NiMain NiAnimation NiParticle" />
    <module name="BSMain" priority="100" depends="NiMain" custom="true" />
    <module name="BSAnimation" priority="125" depends="NiMain BSMain NiAnimation" custom="true" />
    <module name="BSParticle" priority="150" depends="NiMain NiParticle" custom="true" />
    <module name="BSHavok" priority="190" depends="NiMain" custom="true" />
    <module name="BSLegacy" priority="199" depends="NiMain NiLegacy" custom="true" />
    <module name="NiCustom" priority="255" depends="NiMain NiParticle" custom="true" />

    <token name="verexpr" attrs="vercond">
        Commonly used version expressions.
        NOTE: `string` should be wrapped in parentheses for string subsitutions in larger expressions.
        NOTE: BSVER 'Greater Than' Expressions only ever apply to BS i.e. BSVER GT 0.
        WARNING: BSVER 'Less Than' Expressions also apply to NI i.e. BSVER EQ 0.
        <verexpr token="#NISTREAM#" string="(#BSVER# #EQ# 0)">NiStream that are not Bethesda.</verexpr>
        <verexpr token="#BSSTREAM#" string="(#BSVER# #GT# 0)">NiStream that are Bethesda.</verexpr>
        <verexpr token="#NI_BS_LTE_16#" string="(#BSVER# #LTE# 16)">All NI + BS until BSVER 16.</verexpr>
        <verexpr token="#NI_BS_LT_FO3#" string="(#BSVER# #LT# 34)">All NI + BS before Fallout 3.</verexpr>
        <verexpr token="#NI_BS_LTE_FO3#" string="(#BSVER# #LTE# 34)">All NI + BS until Fallout 3.</verexpr>
        <verexpr token="#NI_BS_LT_SSE#" string="(#BSVER# #LT# 100)">All NI + BS before SSE.</verexpr>
        <verexpr token="#NI_BS_LT_FO4#" string="(#BSVER# #LT# 130)">All NI + BS before Fallout 4.</verexpr>
        <verexpr token="#NI_BS_LTE_FO4#" string="(#BSVER# #LTE# 130)">All NI + BS until Fallout 4.</verexpr>
        <verexpr token="#BS_GT_FO3#" string="(#BSVER# #GT# 34)">Skyrim, SSE, and Fallout 4</verexpr>
        <verexpr token="#BS_GTE_FO3#" string="(#BSVER# #GTE# 34)">FO3 and later.</verexpr>
        <verexpr token="#BS_GTE_SKY#" string="(#BSVER# #GTE# 83)">Skyrim and later.</verexpr>
        <verexpr token="#BS_GTE_SSE#" string="(#BSVER# #GTE# 100)">SSE and later.</verexpr>
        <verexpr token="#BS_SSE#" string="(#BSVER# #EQ# 100)">SSE only.</verexpr>
        <verexpr token="#BS_FO4#" string="(#BSVER# #EQ# 130)">Fallout 4 only.</verexpr>
        <verexpr token="#BS_GTE_FO4#" string="(#BSVER# #GTE# 130)">Fallout 4 and FO76.</verexpr>
        <verexpr token="#BS_F76#" string="(#BSVER# #EQ# 155)">Fallout 76 only.</verexpr>
        <verexpr token="#BS202#" string="((#VER# #EQ# 20.2.0.7) #AND# (#BSVER# #GT# 0))">Bethesda 20.2 only.</verexpr>
        <verexpr token="#DIVINITY2#" string="((#USER# #EQ# 0x20000) #OR# (#USER# #EQ# 0x30000))">Divinity 2</verexpr>
    </token>

    <token name="condexpr" attrs="cond">
        <condexpr token="#BSSTREAMHEADER#" string="(Version #EQ# 10.0.1.2) #OR# ((Version #EQ# 20.2.0.7) #OR# (Version #EQ# 20.0.0.5) #OR# ((Version #GTE# 10.1.0.0) #AND# (Version #LTE# 20.0.0.4) #AND# (User Version #LTE# 11))) #AND# (User Version #GTE# 3)" />
    </token>

    <token name="verset" attrs="versions">
        The set of versions that any Basic, Compound, NiObject, Enum, or Bitflags is restricted to.
        <verset token="#BETHESDA#" string="V10_0_1_2 V10_1_0_101 V10_1_0_106 V10_2_0_0__10 V20_0_0_4__10 V20_0_0_4__11 V20_0_0_5_OBL V20_2_0_7__11_1 V20_2_0_7__11_2 V20_2_0_7__11_3 V20_2_0_7__11_4 V20_2_0_7__11_5 V20_2_0_7__11_6 V20_2_0_7__11_7 V20_2_0_7__11_8 V20_2_0_7_FO3 V20_2_0_7_SKY V20_2_0_7_SSE V20_2_0_7_FO4 V20_2_0_7_F76" />
        <verset token="#FO3#" string="V20_0_0_4__11 V20_2_0_7__11_1 V20_2_0_7__11_2 V20_2_0_7__11_3 V20_2_0_7__11_4 V20_2_0_7__11_5 V20_2_0_7__11_6 V20_2_0_7__11_7 V20_2_0_7__11_8 V20_2_0_7_FO3" />
        <verset token="#SKY#" string="V20_2_0_7_SKY" />
        <verset token="#SSE#" string="V20_2_0_7_SSE" />
        <verset token="#FO4#" string="V20_2_0_7_FO4" />
        <verset token="#F76#" string="V20_2_0_7_F76" />
        <verset token="#FO3_AND_LATER#" string="V20_0_0_4__11 V20_2_0_7__11_1 V20_2_0_7__11_2 V20_2_0_7__11_3 V20_2_0_7__11_4 V20_2_0_7__11_5 V20_2_0_7__11_6 V20_2_0_7__11_7 V20_2_0_7__11_8 V20_2_0_7_FO3 V20_2_0_7_SKY V20_2_0_7_SSE V20_2_0_7_FO4 V20_2_0_7_F76" />
        <verset token="#SKY_AND_LATER#" string="V20_2_0_7_SKY V20_2_0_7_SSE V20_2_0_7_FO4 V20_2_0_7_F76" />
    </token>

    <token name="default" attrs="default">
        Commonly used default values.
        <default token="#UINT_MAX#" string="0xFFFFFFFF" />
        <default token="#USHRT_MAX#" string="0xFFFF" />
        <default token="#BYTE_MAX#" string="0xFF" />
        <default token="#INT_MAX#" string="2147483647" />
        <default token="#INT_MIN#" string="-2147483648" />
        <default token="#CHAR_MAX#" string="127" />
        <default token="#CHAR_MIN#" string="-128" />
        <default token="#VEC2_ONE#" string="1.0, 1.0" />
        <default token="#VEC3_ONE#" string="1.0, 1.0, 1.0" />
        <default token="#VEC3_ZERO#" string="0.0, 0.0, 0.0" />
        <default token="#VEC4_ONE#" string="1.0, 1.0, 1.0, 1.0" />
        <default token="#VEC4_ZERO#" string="0.0, 0.0, 0.0, 0.0" />
        <default token="#VEC4_1110#" string="1.0, 1.0, 1.0, 0.0" />
        <default token="#X_AXIS#" string="1.0, 0.0, 0.0" />
        <default token="#Y_AXIS#" string="0.0, 1.0, 0.0" />
        <default token="#Z_AXIS#" string="0.0, 0.0, 1.0" />
        <default token="#NEG_X_AXIS#" string="-1.0, 0.0, 0.0" />
        <default token="#NEG_Y_AXIS#" string="0.0, -1.0, 0.0" />
        <default token="#NEG_Z_AXIS#" string="0.0, 0.0, -1.0" />
        <default token="#FLT_MAX#" string="3.402823466e+38" />
        <default token="#FLT_MIN#" string="-3.402823466e+38" />
        <default token="#INV_FLT#" string="-3.402823466e+38" />
        <default token="#INV_VEC3#" string="-3.402823466e+38, -3.402823466e+38, -3.402823466e+38" />
        <default token="#INV_VEC4#" string="-3.402823466e+38, -3.402823466e+38, -3.402823466e+38, -3.402823466e+38" />
    </token>

    <token name="range" attrs="range">
        Commonly used range values.
        <range token="#F_POS#" string="0.0:" />
        <range token="#F_NEG#" string=":-0.0" />
        <range token="#F_PNZ#" string="0.000001:" />
        <range token="#F_NNZ#" string=":-0.000001" />
        <range token="#F_NRM#" string="-1.0:1.0" />
        <range token="#F_DEG#" string="-360.0:360.0" />
        <range token="#F0_1#" string="0.0:1.0" />
        <range token="#F0_PI#" string="0.0:3.1415926" />
        <range token="#F0_10#" string="0.0:10.0" />
        <range token="#F0_100#" string="0.0:100.0" />
        <range token="#F0_999#" string="0.0:999.0" />
        <range token="#F0_1000#" string="0.0:1000.0" />
        <range token="#F0_10000#" string="0.0:10000.0" />
        <range token="#FPM_1#" string="-1.0:1.0" />
        <range token="#FPM_PI#" string="-3.1415926:3.1415926" />
        <range token="#FPM_10#" string="-10.0:10.0" />
        <range token="#FPM_100#" string="-100.0:100.0" />
        <range token="#FPM_1000#" string="-1000.0:1000.0" />
    </token>

    <token name="global" attrs="vercond">
        Global Tokens.
        NOTE: These must be listed after the above tokens so that they replace last. For example, `verexpr` uses these tokens.
        <global token="#VER#" string="Version" />
        <global token="#USER#" string="User Version" />
        <global token="#BSVER#" string="BS Header\BS Version" />
    </token>

    <token name="operator" attrs="cond vercond length width arg">
        All Operators except for unary not (!), parentheses, and member of (\)
        NOTE: These can be ignored entirely by string substitution and dealt with directly.
        NOTE: These must be listed after the above tokens so that they replace last. For example, `verexpr` uses these tokens.
        <operator token="#ADD#" string="+" />
        <operator token="#SUB#" string="-" />
        <operator token="#MUL#" string="*" />
        <operator token="#DIV#" string="/" />
        <operator token="#AND#" string="&amp;&amp;" />
        <operator token="#OR#" string="||" />
        <operator token="#LT#" string="&lt;" />
        <operator token="#GT#" string="&gt;" />
        <operator token="#LTE#" string="&lt;=" />
        <operator token="#GTE#" string="&gt;=" />
        <operator token="#EQ#" string="==" />
        <operator token="#NEQ#" string="!=" />
        <operator token="#RSH#" string="&gt;&gt;" />
        <operator token="#LSH#" string="&lt;&lt;" />
        <operator token="#BITAND#" string="&amp;" />
        <operator token="#BITOR#" string="|" />
    </token>

    <!--Basic Types-->

    <basic name="uint64" integral="true" countable="true" size="8">
        An unsigned 64-bit integer.
    </basic>

    <basic name="int64" integral="true" countable="false" size="8">
        A signed 64-bit integer.
    </basic>

    <basic name="ulittle32" integral="true" countable="true" size="4">
        A little-endian unsigned 32-bit integer.
    </basic>

    <basic name="uint" integral="true" countable="true" size="4" convertible="uint64">
        An unsigned 32-bit integer.
    </basic>

    <basic name="int" integral="true" countable="false" size="4" convertible="int64">
        A signed 32-bit integer.
    </basic>

    <basic name="ushort" integral="true" countable="true" size="2" convertible="uint uint64">
        An unsigned 16-bit integer.
    </basic>

    <basic name="short" integral="true" countable="false" size="2" convertible="int int64">
        A signed 16-bit integer.
    </basic>

    <basic name="char" integral="true" countable="false" size="1" convertible="short int int64">
        An 8-bit character.
    </basic>

    <basic name="byte" boolean="true" integral="true" countable="true" size="1" convertible="ushort uint uint64">
        An unsigned 8-bit integer.
    </basic>

    <basic name="bool" boolean="true" integral="true" countable="false">
        A boolean; 32-bit from 4.0.0.2, and 8-bit from 4.1.0.1 on.
    </basic>

    <basic name="BlockTypeIndex" integral="true" countable="false" size="2">
        A 16-bit (signed?) integer, which is used in the header to refer to a particular object type in a object type string array.
        The upper bit appears to be a flag used for PhysX block types.
    </basic>

    <basic name="FileVersion" integral="true" countable="false" size="4">
        A 32-bit integer that stores the version in hexadecimal format with each byte representing a number in the version string.

        Some widely-used versions and their hex representation:
        4.0.0.2:    0x04000002
        4.1.0.12:   0x0401000C
        4.2.0.2:    0x04020002
        4.2.1.0:    0x04020100
        4.2.2.0:    0x04020200
        10.0.1.0:   0x0A000100
        10.1.0.0:   0x0A010000
        10.2.0.0:   0x0A020000
        20.0.0.4:   0x14000004
        20.0.0.5:   0x14000005
    </basic>

    <basic name="float" integral="false" size="4">
        A standard 32-bit floating point number.
    </basic>
    
    <basic name="hfloat" integral="false" size="2" convertible="float">
        A 16-bit floating point number.
    </basic>
    
    <basic name="HeaderString" integral="false">
        A variable length string that ends with a newline character (0x0A).  The string starts as follows depending on the version:

        Version &lt;= 10.0.1.0:  'NetImmerse File Format'
        Version &gt;= 10.1.0.0:  'Gamebryo File Format'
    </basic>

    <basic name="LineString" integral="false">
        A variable length string that ends with a newline character (0x0A).
    </basic>

    <basic name="Ptr" integral="true" countable="false" generic="true" size="4">
        A signed 32-bit integer, referring to a object before this one in the hierarchy.  Examples:  Bones, gravity objects.
    </basic>

    <basic name="Ref" integral="true" countable="false" generic="true" size="4">
        A signed 32-bit integer, used to refer to another object; -1 means no reference. These should always point down the hierarchy. Other types are used for indexes that point to objects higher up.
    </basic>

    <basic name="StringOffset" integral="true" countable="false" size="4">
        A 32-bit unsigned integer, used to refer to strings in a NiStringPalette.
    </basic>

    <basic name="NiFixedString" integral="true" countable="false" size="4">
        A 32-bit unsigned integer, used to refer to strings in the header.
    </basic>
    
    <!--Enumerations
        These are like C enums and consist of a list of options.  They can appear
        as parts of compounds or niobjects.-->

    <bitflags name="AccumFlags" storage="uint">
        Describes the options for the accum root on NiControllerSequence.
        <option bit="0" name="ACCUM_X_TRANS">X Translation will be accumulated.</option>
        <option bit="1" name="ACCUM_Y_TRANS">Y Translation will be accumulated.</option>
        <option bit="2" name="ACCUM_Z_TRANS">Z Translation will be accumulated.</option>
        <option bit="3" name="ACCUM_X_ROT">X Rotation will be accumulated.</option>
        <option bit="4" name="ACCUM_Y_ROT">Y Rotation will be accumulated.</option>
        <option bit="5" name="ACCUM_Z_ROT">Z Rotation will be accumulated.</option>
        <option bit="6" name="ACCUM_X_FRONT">+X is front facing. (Default)</option>
        <option bit="7" name="ACCUM_Y_FRONT">+Y is front facing.</option>
        <option bit="8" name="ACCUM_Z_FRONT">+Z is front facing.</option>
        <option bit="9" name="ACCUM_NEG_FRONT">-X is front facing.</option>
    </bitflags>

    <enum name="ApplyMode" storage="uint">
        Describes how the vertex colors are blended with the filtered texture color.
        <option value="0" name="APPLY_REPLACE">Replaces existing color</option>
        <option value="1" name="APPLY_DECAL">For placing images on the object like stickers.</option>
        <option value="2" name="APPLY_MODULATE">Modulates existing color. (Default)</option>
        <option value="3" name="APPLY_HILIGHT">PS2 Only.  Function Unknown.</option>
        <option value="4" name="APPLY_HILIGHT2">Parallax Flag in some Oblivion meshes.</option>
    </enum>

    <enum name="TexType" storage="uint">
        The type of texture.
        <option value="0" name="BASE_MAP">The basic texture used by most meshes.</option>
        <option value="1" name="DARK_MAP">Used to darken the model with false lighting.</option>
        <option value="2" name="DETAIL_MAP">Combined with base map for added detail.  Usually tiled over the mesh many times for close-up view.</option>
        <option value="3" name="GLOSS_MAP">Allows the specularity (glossyness) of an object to differ across its surface.</option>
        <option value="4" name="GLOW_MAP">Creates a glowing effect.  Basically an incandescence map.</option>
        <option value="5" name="BUMP_MAP">Used to make the object appear to have more detail than it really does.</option>
        <option value="6" name="NORMAL_MAP">Used to make the object appear to have more detail than it really does.</option>
        <option value="7" name="PARALLAX_MAP">Parallax map.</option>
        <option value="8" name="DECAL_0_MAP">For placing images on the object like stickers.</option>
        <option value="9" name="DECAL_1_MAP">For placing images on the object like stickers.</option>
        <option value="10" name="DECAL_2_MAP">For placing images on the object like stickers.</option>
        <option value="11" name="DECAL_3_MAP">For placing images on the object like stickers.</option>
    </enum>

    <enum name="KeyType" storage="uint">
        The type of animation interpolation (blending) that will be used on the associated key frames.
        <option value="1" name="LINEAR_KEY">Use linear interpolation.</option>
        <option value="2" name="QUADRATIC_KEY">Use quadratic interpolation.  Forward and back tangents will be stored.</option>
        <option value="3" name="TBC_KEY">Use Tension Bias Continuity interpolation.  Tension, bias, and continuity will be stored.</option>
        <option value="4" name="XYZ_ROTATION_KEY">For use only with rotation data.  Separate X, Y, and Z keys will be stored instead of using quaternions.</option>
        <option value="5" name="CONST_KEY">Step function. Used for visibility keys in NiBoolData.</option>
    </enum>

    <enum name="OblivionHavokMaterial" storage="uint" versions="#BETHESDA#">
        Bethesda Havok. Material descriptor for a Havok shape in Oblivion.
        <option value="0" name="OB_HAV_MAT_STONE">Stone</option>
        <option value="1" name="OB_HAV_MAT_CLOTH">Cloth</option>
        <option value="2" name="OB_HAV_MAT_DIRT">Dirt</option>
        <option value="3" name="OB_HAV_MAT_GLASS">Glass</option>
        <option value="4" name="OB_HAV_MAT_GRASS">Grass</option>
        <option value="5" name="OB_HAV_MAT_METAL">Metal</option>
        <option value="6" name="OB_HAV_MAT_ORGANIC">Organic</option>
        <option value="7" name="OB_HAV_MAT_SKIN">Skin</option>
        <option value="8" name="OB_HAV_MAT_WATER">Water</option>
        <option value="9" name="OB_HAV_MAT_WOOD">Wood</option>
        <option value="10" name="OB_HAV_MAT_HEAVY_STONE">Heavy Stone</option>
        <option value="11" name="OB_HAV_MAT_HEAVY_METAL">Heavy Metal</option>
        <option value="12" name="OB_HAV_MAT_HEAVY_WOOD">Heavy Wood</option>
        <option value="13" name="OB_HAV_MAT_CHAIN">Chain</option>
        <option value="14" name="OB_HAV_MAT_SNOW">Snow</option>
        <option value="15" name="OB_HAV_MAT_STONE_STAIRS">Stone Stairs</option>
        <option value="16" name="OB_HAV_MAT_CLOTH_STAIRS">Cloth Stairs</option>
        <option value="17" name="OB_HAV_MAT_DIRT_STAIRS">Dirt Stairs</option>
        <option value="18" name="OB_HAV_MAT_GLASS_STAIRS">Glass Stairs</option>
        <option value="19" name="OB_HAV_MAT_GRASS_STAIRS">Grass Stairs</option>
        <option value="20" name="OB_HAV_MAT_METAL_STAIRS">Metal Stairs</option>
        <option value="21" name="OB_HAV_MAT_ORGANIC_STAIRS">Organic Stairs</option>
        <option value="22" name="OB_HAV_MAT_SKIN_STAIRS">Skin Stairs</option>
        <option value="23" name="OB_HAV_MAT_WATER_STAIRS">Water Stairs</option>
        <option value="24" name="OB_HAV_MAT_WOOD_STAIRS">Wood Stairs</option>
        <option value="25" name="OB_HAV_MAT_HEAVY_STONE_STAIRS">Heavy Stone Stairs</option>
        <option value="26" name="OB_HAV_MAT_HEAVY_METAL_STAIRS">Heavy Metal Stairs</option>
        <option value="27" name="OB_HAV_MAT_HEAVY_WOOD_STAIRS">Heavy Wood Stairs</option>
        <option value="28" name="OB_HAV_MAT_CHAIN_STAIRS">Chain Stairs</option>
        <option value="29" name="OB_HAV_MAT_SNOW_STAIRS">Snow Stairs</option>
        <option value="30" name="OB_HAV_MAT_ELEVATOR">Elevator</option>
        <option value="31" name="OB_HAV_MAT_RUBBER">Rubber</option>
    </enum>

    <enum name="Fallout3HavokMaterial" storage="uint" versions="#BETHESDA#">
        Bethesda Havok. Material descriptor for a Havok shape in Fallout 3 and Fallout NV.
        <option value="0" name="FO_HAV_MAT_STONE">Stone</option>
        <option value="1" name="FO_HAV_MAT_CLOTH">Cloth</option>
        <option value="2" name="FO_HAV_MAT_DIRT">Dirt</option>
        <option value="3" name="FO_HAV_MAT_GLASS">Glass</option>
        <option value="4" name="FO_HAV_MAT_GRASS">Grass</option>
        <option value="5" name="FO_HAV_MAT_METAL">Metal</option>
        <option value="6" name="FO_HAV_MAT_ORGANIC">Organic</option>
        <option value="7" name="FO_HAV_MAT_SKIN">Skin</option>
        <option value="8" name="FO_HAV_MAT_WATER">Water</option>
        <option value="9" name="FO_HAV_MAT_WOOD">Wood</option>
        <option value="10" name="FO_HAV_MAT_HEAVY_STONE">Heavy Stone</option>
        <option value="11" name="FO_HAV_MAT_HEAVY_METAL">Heavy Metal</option>
        <option value="12" name="FO_HAV_MAT_HEAVY_WOOD">Heavy Wood</option>
        <option value="13" name="FO_HAV_MAT_CHAIN">Chain</option>
        <option value="14" name="FO_HAV_MAT_BOTTLECAP">Bottlecap</option>
        <option value="15" name="FO_HAV_MAT_ELEVATOR">Elevator</option>
        <option value="16" name="FO_HAV_MAT_HOLLOW_METAL">Hollow Metal</option>
        <option value="17" name="FO_HAV_MAT_SHEET_METAL">Sheet Metal</option>
        <option value="18" name="FO_HAV_MAT_SAND">Sand</option>
        <option value="19" name="FO_HAV_MAT_BROKEN_CONCRETE">Broken Concrete</option>
        <option value="20" name="FO_HAV_MAT_VEHICLE_BODY">Vehicle Body</option>
        <option value="21" name="FO_HAV_MAT_VEHICLE_PART_SOLID">Vehicle Part Solid</option>
        <option value="22" name="FO_HAV_MAT_VEHICLE_PART_HOLLOW">Vehicle Part Hollow</option>
        <option value="23" name="FO_HAV_MAT_BARREL">Barrel</option>
        <option value="24" name="FO_HAV_MAT_BOTTLE">Bottle</option>
        <option value="25" name="FO_HAV_MAT_SODA_CAN">Soda Can</option>
        <option value="26" name="FO_HAV_MAT_PISTOL">Pistol</option>
        <option value="27" name="FO_HAV_MAT_RIFLE">Rifle</option>
        <option value="28" name="FO_HAV_MAT_SHOPPING_CART">Shopping Cart</option>
        <option value="29" name="FO_HAV_MAT_LUNCHBOX">Lunchbox</option>
        <option value="30" name="FO_HAV_MAT_BABY_RATTLE">Baby Rattle</option>
        <option value="31" name="FO_HAV_MAT_RUBBER_BALL">Rubber Ball</option>
        <option value="32" name="FO_HAV_MAT_STONE_PLATFORM">Stone</option>
        <option value="33" name="FO_HAV_MAT_CLOTH_PLATFORM">Cloth</option>
        <option value="34" name="FO_HAV_MAT_DIRT_PLATFORM">Dirt</option>
        <option value="35" name="FO_HAV_MAT_GLASS_PLATFORM">Glass</option>
        <option value="36" name="FO_HAV_MAT_GRASS_PLATFORM">Grass</option>
        <option value="37" name="FO_HAV_MAT_METAL_PLATFORM">Metal</option>
        <option value="38" name="FO_HAV_MAT_ORGANIC_PLATFORM">Organic</option>
        <option value="39" name="FO_HAV_MAT_SKIN_PLATFORM">Skin</option>
        <option value="40" name="FO_HAV_MAT_WATER_PLATFORM">Water</option>
        <option value="41" name="FO_HAV_MAT_WOOD_PLATFORM">Wood</option>
        <option value="42" name="FO_HAV_MAT_HEAVY_STONE_PLATFORM">Heavy Stone</option>
        <option value="43" name="FO_HAV_MAT_HEAVY_METAL_PLATFORM">Heavy Metal</option>
        <option value="44" name="FO_HAV_MAT_HEAVY_WOOD_PLATFORM">Heavy Wood</option>
        <option value="45" name="FO_HAV_MAT_CHAIN_PLATFORM">Chain</option>
        <option value="46" name="FO_HAV_MAT_BOTTLECAP_PLATFORM">Bottlecap</option>
        <option value="47" name="FO_HAV_MAT_ELEVATOR_PLATFORM">Elevator</option>
        <option value="48" name="FO_HAV_MAT_HOLLOW_METAL_PLATFORM">Hollow Metal</option>
        <option value="49" name="FO_HAV_MAT_SHEET_METAL_PLATFORM">Sheet Metal</option>
        <option value="50" name="FO_HAV_MAT_SAND_PLATFORM">Sand</option>
        <option value="51" name="FO_HAV_MAT_BROKEN_CONCRETE_PLATFORM">Broken Concrete</option>
        <option value="52" name="FO_HAV_MAT_VEHICLE_BODY_PLATFORM">Vehicle Body</option>
        <option value="53" name="FO_HAV_MAT_VEHICLE_PART_SOLID_PLATFORM">Vehicle Part Solid</option>
        <option value="54" name="FO_HAV_MAT_VEHICLE_PART_HOLLOW_PLATFORM">Vehicle Part Hollow</option>
        <option value="55" name="FO_HAV_MAT_BARREL_PLATFORM">Barrel</option>
        <option value="56" name="FO_HAV_MAT_BOTTLE_PLATFORM">Bottle</option>
        <option value="57" name="FO_HAV_MAT_SODA_CAN_PLATFORM">Soda Can</option>
        <option value="58" name="FO_HAV_MAT_PISTOL_PLATFORM">Pistol</option>
        <option value="59" name="FO_HAV_MAT_RIFLE_PLATFORM">Rifle</option>
        <option value="60" name="FO_HAV_MAT_SHOPPING_CART_PLATFORM">Shopping Cart</option>
        <option value="61" name="FO_HAV_MAT_LUNCHBOX_PLATFORM">Lunchbox</option>
        <option value="62" name="FO_HAV_MAT_BABY_RATTLE_PLATFORM">Baby Rattle</option>
        <option value="63" name="FO_HAV_MAT_RUBBER_BALL_PLATFORM">Rubber Ball</option>
        <option value="64" name="FO_HAV_MAT_STONE_STAIRS">Stone</option>
        <option value="65" name="FO_HAV_MAT_CLOTH_STAIRS">Cloth</option>
        <option value="66" name="FO_HAV_MAT_DIRT_STAIRS">Dirt</option>
        <option value="67" name="FO_HAV_MAT_GLASS_STAIRS">Glass</option>
        <option value="68" name="FO_HAV_MAT_GRASS_STAIRS">Grass</option>
        <option value="69" name="FO_HAV_MAT_METAL_STAIRS">Metal</option>
        <option value="70" name="FO_HAV_MAT_ORGANIC_STAIRS">Organic</option>
        <option value="71" name="FO_HAV_MAT_SKIN_STAIRS">Skin</option>
        <option value="72" name="FO_HAV_MAT_WATER_STAIRS">Water</option>
        <option value="73" name="FO_HAV_MAT_WOOD_STAIRS">Wood</option>
        <option value="74" name="FO_HAV_MAT_HEAVY_STONE_STAIRS">Heavy Stone</option>
        <option value="75" name="FO_HAV_MAT_HEAVY_METAL_STAIRS">Heavy Metal</option>
        <option value="76" name="FO_HAV_MAT_HEAVY_WOOD_STAIRS">Heavy Wood</option>
        <option value="77" name="FO_HAV_MAT_CHAIN_STAIRS">Chain</option>
        <option value="78" name="FO_HAV_MAT_BOTTLECAP_STAIRS">Bottlecap</option>
        <option value="79" name="FO_HAV_MAT_ELEVATOR_STAIRS">Elevator</option>
        <option value="80" name="FO_HAV_MAT_HOLLOW_METAL_STAIRS">Hollow Metal</option>
        <option value="81" name="FO_HAV_MAT_SHEET_METAL_STAIRS">Sheet Metal</option>
        <option value="82" name="FO_HAV_MAT_SAND_STAIRS">Sand</option>
        <option value="83" name="FO_HAV_MAT_BROKEN_CONCRETE_STAIRS">Broken Concrete</option>
        <option value="84" name="FO_HAV_MAT_VEHICLE_BODY_STAIRS">Vehicle Body</option>
        <option value="85" name="FO_HAV_MAT_VEHICLE_PART_SOLID_STAIRS">Vehicle Part Solid</option>
        <option value="86" name="FO_HAV_MAT_VEHICLE_PART_HOLLOW_STAIRS">Vehicle Part Hollow</option>
        <option value="87" name="FO_HAV_MAT_BARREL_STAIRS">Barrel</option>
        <option value="88" name="FO_HAV_MAT_BOTTLE_STAIRS">Bottle</option>
        <option value="89" name="FO_HAV_MAT_SODA_CAN_STAIRS">Soda Can</option>
        <option value="90" name="FO_HAV_MAT_PISTOL_STAIRS">Pistol</option>
        <option value="91" name="FO_HAV_MAT_RIFLE_STAIRS">Rifle</option>
        <option value="92" name="FO_HAV_MAT_SHOPPING_CART_STAIRS">Shopping Cart</option>
        <option value="93" name="FO_HAV_MAT_LUNCHBOX_STAIRS">Lunchbox</option>
        <option value="94" name="FO_HAV_MAT_BABY_RATTLE_STAIRS">Baby Rattle</option>
        <option value="95" name="FO_HAV_MAT_RUBBER_BALL_STAIRS">Rubber Ball</option>
        <option value="96" name="FO_HAV_MAT_STONE_STAIRS_PLATFORM">Stone</option>
        <option value="97" name="FO_HAV_MAT_CLOTH_STAIRS_PLATFORM">Cloth</option>
        <option value="98" name="FO_HAV_MAT_DIRT_STAIRS_PLATFORM">Dirt</option>
        <option value="99" name="FO_HAV_MAT_GLASS_STAIRS_PLATFORM">Glass</option>
        <option value="100" name="FO_HAV_MAT_GRASS_STAIRS_PLATFORM">Grass</option>
        <option value="101" name="FO_HAV_MAT_METAL_STAIRS_PLATFORM">Metal</option>
        <option value="102" name="FO_HAV_MAT_ORGANIC_STAIRS_PLATFORM">Organic</option>
        <option value="103" name="FO_HAV_MAT_SKIN_STAIRS_PLATFORM">Skin</option>
        <option value="104" name="FO_HAV_MAT_WATER_STAIRS_PLATFORM">Water</option>
        <option value="105" name="FO_HAV_MAT_WOOD_STAIRS_PLATFORM">Wood</option>
        <option value="106" name="FO_HAV_MAT_HEAVY_STONE_STAIRS_PLATFORM">Heavy Stone</option>
        <option value="107" name="FO_HAV_MAT_HEAVY_METAL_STAIRS_PLATFORM">Heavy Metal</option>
        <option value="108" name="FO_HAV_MAT_HEAVY_WOOD_STAIRS_PLATFORM">Heavy Wood</option>
        <option value="109" name="FO_HAV_MAT_CHAIN_STAIRS_PLATFORM">Chain</option>
        <option value="110" name="FO_HAV_MAT_BOTTLECAP_STAIRS_PLATFORM">Bottlecap</option>
        <option value="111" name="FO_HAV_MAT_ELEVATOR_STAIRS_PLATFORM">Elevator</option>
        <option value="112" name="FO_HAV_MAT_HOLLOW_METAL_STAIRS_PLATFORM">Hollow Metal</option>
        <option value="113" name="FO_HAV_MAT_SHEET_METAL_STAIRS_PLATFORM">Sheet Metal</option>
        <option value="114" name="FO_HAV_MAT_SAND_STAIRS_PLATFORM">Sand</option>
        <option value="115" name="FO_HAV_MAT_BROKEN_CONCRETE_STAIRS_PLATFORM">Broken Concrete</option>
        <option value="116" name="FO_HAV_MAT_VEHICLE_BODY_STAIRS_PLATFORM">Vehicle Body</option>
        <option value="117" name="FO_HAV_MAT_VEHICLE_PART_SOLID_STAIRS_PLATFORM">Vehicle Part Solid</option>
        <option value="118" name="FO_HAV_MAT_VEHICLE_PART_HOLLOW_STAIRS_PLATFORM">Vehicle Part Hollow</option>
        <option value="119" name="FO_HAV_MAT_BARREL_STAIRS_PLATFORM">Barrel</option>
        <option value="120" name="FO_HAV_MAT_BOTTLE_STAIRS_PLATFORM">Bottle</option>
        <option value="121" name="FO_HAV_MAT_SODA_CAN_STAIRS_PLATFORM">Soda Can</option>
        <option value="122" name="FO_HAV_MAT_PISTOL_STAIRS_PLATFORM">Pistol</option>
        <option value="123" name="FO_HAV_MAT_RIFLE_STAIRS_PLATFORM">Rifle</option>
        <option value="124" name="FO_HAV_MAT_SHOPPING_CART_STAIRS_PLATFORM">Shopping Cart</option>
        <option value="125" name="FO_HAV_MAT_LUNCHBOX_STAIRS_PLATFORM">Lunchbox</option>
        <option value="126" name="FO_HAV_MAT_BABY_RATTLE_STAIRS_PLATFORM">Baby Rattle</option>
        <option value="127" name="FO_HAV_MAT_RUBBER_BALL_STAIRS_PLATFORM">Rubber Ball</option>
    </enum>

    <enum name="SkyrimHavokMaterial" storage="uint" versions="#SKY_AND_LATER#">
        Bethesda Havok. Material descriptor for a Havok shape in Skyrim.
        <option value="131151687" name="SKY_HAV_MAT_BROKEN_STONE">Broken Stone</option>
        <option value="365420259" name="SKY_HAV_MAT_LIGHT_WOOD">Light Wood</option>
        <option value="398949039" name="SKY_HAV_MAT_SNOW">Snow</option>
        <option value="428587608" name="SKY_HAV_MAT_GRAVEL">Gravel</option>
        <option value="438912228" name="SKY_HAV_MAT_MATERIAL_CHAIN_METAL">Material Chain Metal</option>
        <option value="493553910" name="SKY_HAV_MAT_BOTTLE">Bottle</option>
        <option value="500811281" name="SKY_HAV_MAT_WOOD">Wood</option>
        <option value="591247106" name="SKY_HAV_MAT_SKIN">Skin</option>
        <option value="617099282" name="SKY_HAV_MAT_UNKNOWN_617099282">Unknown in Creation Kit v1.9.32.0. Found in Dawnguard DLC in meshes\dlc01\clutter\dlc01deerskin.nif.</option>
        <option value="732141076" name="SKY_HAV_MAT_BARREL">Barrel</option>
        <option value="781661019" name="SKY_HAV_MAT_MATERIAL_CERAMIC_MEDIUM">Material Ceramic Medium</option>
        <option value="790784366" name="SKY_HAV_MAT_MATERIAL_BASKET">Material Basket</option>
        <option value="873356572" name="SKY_HAV_MAT_ICE">Ice</option>
        <option value="899511101" name="SKY_HAV_MAT_STAIRS_STONE">Stairs Stone</option>
        <option value="1024582599" name="SKY_HAV_MAT_WATER">Water</option>
        <option value="1028101969" name="SKY_HAV_MAT_UNKNOWN_1028101969">Unknown in Creation Kit v1.6.89.0. Found in actors\draugr\character assets\skeletons.nif.</option>
        <option value="1060167844" name="SKY_HAV_MAT_MATERIAL_BLADE_1HAND">Material Blade 1 Hand</option>
        <option value="1264672850" name="SKY_HAV_MAT_MATERIAL_BOOK">Material Book</option>
        <option value="1286705471" name="SKY_HAV_MAT_MATERIAL_CARPET">Material Carpet</option>
        <option value="1288358971" name="SKY_HAV_MAT_SOLID_METAL">Solid Metal</option>
        <option value="1305674443" name="SKY_HAV_MAT_MATERIAL_AXE_1HAND">Material Axe 1Hand</option>
        <option value="1440721808" name="SKY_HAV_MAT_UNKNOWN_1440721808">Unknown in Creation Kit v1.6.89.0. Found in armor\draugr\draugrbootsfemale_go.nif or armor\amuletsandrings\amuletgnd.nif.</option>
        <option value="1461712277" name="SKY_HAV_MAT_STAIRS_WOOD">Stairs Wood</option>
        <option value="1486385281" name="SKY_HAV_MAT_MUD">Mud</option>
        <option value="1550912982" name="SKY_HAV_MAT_MATERIAL_BOULDER_SMALL">Material Boulder Small</option>
        <option value="1560365355" name="SKY_HAV_MAT_STAIRS_SNOW">Stairs Snow</option>
        <option value="1570821952" name="SKY_HAV_MAT_HEAVY_STONE">Heavy Stone</option>
        <option value="1574477864" name="SKY_HAV_MAT_UNKNOWN_1574477864">Unknown in Creation Kit v1.6.89.0. Found in actors\dragon\character assets\skeleton.nif.</option>
        <option value="1591009235" name="SKY_HAV_MAT_UNKNOWN_1591009235">Unknown in Creation Kit v1.6.89.0. Found in trap objects or clutter\displaycases\displaycaselgangled01.nif or actors\deer\character assets\skeleton.nif.</option>
        <option value="1607128641" name="SKY_HAV_MAT_MATERIAL_BOWS_STAVES">Material Bows Staves</option>
        <option value="1803571212" name="SKY_HAV_MAT_MATERIAL_WOOD_AS_STAIRS">Material Wood As Stairs</option>
        <option value="1848600814" name="SKY_HAV_MAT_GRASS">Grass</option>
        <option value="1885326971" name="SKY_HAV_MAT_MATERIAL_BOULDER_LARGE">Material Boulder Large</option>
        <option value="1886078335" name="SKY_HAV_MAT_MATERIAL_STONE_AS_STAIRS">Material Stone As Stairs</option>
        <option value="2022742644" name="SKY_HAV_MAT_MATERIAL_BLADE_2HAND">Material Blade 2Hand</option>
        <option value="2025794648" name="SKY_HAV_MAT_MATERIAL_BOTTLE_SMALL">Material Bottle Small</option>
        <option value="2168343821" name="SKY_HAV_MAT_SAND">Sand</option>
        <option value="2229413539" name="SKY_HAV_MAT_HEAVY_METAL">Heavy Metal</option>
        <option value="2290050264" name="SKY_HAV_MAT_UNKNOWN_2290050264">Unknown in Creation Kit v1.9.32.0. Found in Dawnguard DLC in meshes\dlc01\clutter\dlc01sabrecatpelt.nif.</option>
        <option value="2518321175" name="SKY_HAV_MAT_DRAGON">Dragon</option>
        <option value="2617944780" name="SKY_HAV_MAT_MATERIAL_BLADE_1HAND_SMALL">Material Blade 1Hand Small</option>
        <option value="2632367422" name="SKY_HAV_MAT_MATERIAL_SKIN_SMALL">Material Skin Small</option>
        <option value="2892392795" name="SKY_HAV_MAT_STAIRS_BROKEN_STONE">Stairs Broken Stone</option>
        <option value="2965929619" name="SKY_HAV_MAT_MATERIAL_SKIN_LARGE">Material Skin Large</option>
        <option value="2974920155" name="SKY_HAV_MAT_ORGANIC">Organic</option>
        <option value="3049421844" name="SKY_HAV_MAT_MATERIAL_BONE">Material Bone</option>
        <option value="3070783559" name="SKY_HAV_MAT_HEAVY_WOOD">Heavy Wood</option>
        <option value="3074114406" name="SKY_HAV_MAT_MATERIAL_CHAIN">Material Chain</option>
        <option value="3106094762" name="SKY_HAV_MAT_DIRT">Dirt</option>
        <option value="3424720541" name="SKY_HAV_MAT_MATERIAL_ARMOR_LIGHT">Material Armor Light</option>
        <option value="3448167928" name="SKY_HAV_MAT_MATERIAL_SHIELD_LIGHT">Material Shield Light</option>
        <option value="3589100606" name="SKY_HAV_MAT_MATERIAL_COIN">Material Coin</option>
        <option value="3702389584" name="SKY_HAV_MAT_MATERIAL_SHIELD_HEAVY">Material Shield Heavy</option>
        <option value="3708432437" name="SKY_HAV_MAT_MATERIAL_ARMOR_HEAVY">Material Armor Heavy</option>
        <option value="3725505938" name="SKY_HAV_MAT_MATERIAL_ARROW">Material Arrow</option>
        <option value="3739830338" name="SKY_HAV_MAT_GLASS">Glass</option>
        <option value="3741512247" name="SKY_HAV_MAT_STONE">Stone</option>
        <option value="3839073443" name="SKY_HAV_MAT_CLOTH">Cloth</option>
        <option value="3969592277" name="SKY_HAV_MAT_MATERIAL_BLUNT_2HAND">Material Blunt 2Hand</option>
        <option value="4239621792" name="SKY_HAV_MAT_UNKNOWN_4239621792">Unknown in Creation Kit v1.9.32.0. Found in Dawnguard DLC in meshes\dlc01\prototype\dlc1protoswingingbridge.nif.</option>
        <option value="4283869410" name="SKY_HAV_MAT_MATERIAL_BOULDER_MEDIUM">Material Boulder Medium</option>
    </enum>

    <enum name="OblivionLayer" storage="byte" versions="#BETHESDA#">
        Bethesda Havok. Describes the collision layer a body belongs to in Oblivion.
        <option value="0" name="OL_UNIDENTIFIED">Unidentified (white)</option>
        <option value="1" name="OL_STATIC">Static (red)</option>
        <option value="2" name="OL_ANIM_STATIC">AnimStatic (magenta)</option>
        <option value="3" name="OL_TRANSPARENT">Transparent (light pink)</option>
        <option value="4" name="OL_CLUTTER">Clutter (light blue)</option>
        <option value="5" name="OL_WEAPON">Weapon (orange)</option>
        <option value="6" name="OL_PROJECTILE">Projectile (light orange)</option>
        <option value="7" name="OL_SPELL">Spell (cyan)</option>
        <option value="8" name="OL_BIPED">Biped (green) Seems to apply to all creatures/NPCs</option>
        <option value="9" name="OL_TREES">Trees (light brown)</option>
        <option value="10" name="OL_PROPS">Props (magenta)</option>
        <option value="11" name="OL_WATER">Water (cyan)</option>
        <option value="12" name="OL_TRIGGER">Trigger (light grey)</option>
        <option value="13" name="OL_TERRAIN">Terrain (light yellow)</option>
        <option value="14" name="OL_TRAP">Trap (light grey)</option>
        <option value="15" name="OL_NONCOLLIDABLE">NonCollidable (white)</option>
        <option value="16" name="OL_CLOUD_TRAP">CloudTrap (greenish grey)</option>
        <option value="17" name="OL_GROUND">Ground (none)</option>
        <option value="18" name="OL_PORTAL">Portal (green)</option>
        <option value="19" name="OL_STAIRS">Stairs (white)</option>
        <option value="20" name="OL_CHAR_CONTROLLER">CharController (yellow)</option>
        <option value="21" name="OL_AVOID_BOX">AvoidBox (dark yellow)</option>
        <option value="22" name="OL_UNKNOWN1">? (white)</option>
        <option value="23" name="OL_UNKNOWN2">? (white)</option>
        <option value="24" name="OL_CAMERA_PICK">CameraPick (white)</option>
        <option value="25" name="OL_ITEM_PICK">ItemPick (white)</option>
        <option value="26" name="OL_LINE_OF_SIGHT">LineOfSight (white)</option>
        <option value="27" name="OL_PATH_PICK">PathPick (white)</option>
        <option value="28" name="OL_CUSTOM_PICK_1">CustomPick1 (white)</option>
        <option value="29" name="OL_CUSTOM_PICK_2">CustomPick2 (white)</option>
        <option value="30" name="OL_SPELL_EXPLOSION">SpellExplosion (white)</option>
        <option value="31" name="OL_DROPPING_PICK">DroppingPick (white)</option>
        <option value="32" name="OL_OTHER">Other (white)</option>
        <option value="33" name="OL_HEAD">Head</option>
        <option value="34" name="OL_BODY">Body</option>
        <option value="35" name="OL_SPINE1">Spine1</option>
        <option value="36" name="OL_SPINE2">Spine2</option>
        <option value="37" name="OL_L_UPPER_ARM">LUpperArm</option>
        <option value="38" name="OL_L_FOREARM">LForeArm</option>
        <option value="39" name="OL_L_HAND">LHand</option>
        <option value="40" name="OL_L_THIGH">LThigh</option>
        <option value="41" name="OL_L_CALF">LCalf</option>
        <option value="42" name="OL_L_FOOT">LFoot</option>
        <option value="43" name="OL_R_UPPER_ARM">RUpperArm</option>
        <option value="44" name="OL_R_FOREARM">RForeArm</option>
        <option value="45" name="OL_R_HAND">RHand</option>
        <option value="46" name="OL_R_THIGH">RThigh</option>
        <option value="47" name="OL_R_CALF">RCalf</option>
        <option value="48" name="OL_R_FOOT">RFoot</option>
        <option value="49" name="OL_TAIL">Tail</option>
        <option value="50" name="OL_SIDE_WEAPON">SideWeapon</option>
        <option value="51" name="OL_SHIELD">Shield</option>
        <option value="52" name="OL_QUIVER">Quiver</option>
        <option value="53" name="OL_BACK_WEAPON">BackWeapon</option>
        <option value="54" name="OL_BACK_WEAPON2">BackWeapon (?)</option>
        <option value="55" name="OL_PONYTAIL">PonyTail</option>
        <option value="56" name="OL_WING">Wing</option>
        <option value="57" name="OL_NULL">Null</option>
    </enum>

    <enum name="Fallout3Layer" storage="byte" versions="#BETHESDA#">
        Bethesda Havok. Describes the collision layer a body belongs to in Fallout 3 and Fallout NV.
        <option value="0" name="FOL_UNIDENTIFIED">Unidentified (white)</option>
        <option value="1" name="FOL_STATIC">Static (red)</option>
        <option value="2" name="FOL_ANIM_STATIC">AnimStatic (magenta)</option>
        <option value="3" name="FOL_TRANSPARENT">Transparent (light pink)</option>
        <option value="4" name="FOL_CLUTTER">Clutter (light blue)</option>
        <option value="5" name="FOL_WEAPON">Weapon (orange)</option>
        <option value="6" name="FOL_PROJECTILE">Projectile (light orange)</option>
        <option value="7" name="FOL_SPELL">Spell (cyan)</option>
        <option value="8" name="FOL_BIPED">Biped (green) Seems to apply to all creatures/NPCs</option>
        <option value="9" name="FOL_TREES">Trees (light brown)</option>
        <option value="10" name="FOL_PROPS">Props (magenta)</option>
        <option value="11" name="FOL_WATER">Water (cyan)</option>
        <option value="12" name="FOL_TRIGGER">Trigger (light grey)</option>
        <option value="13" name="FOL_TERRAIN">Terrain (light yellow)</option>
        <option value="14" name="FOL_TRAP">Trap (light grey)</option>
        <option value="15" name="FOL_NONCOLLIDABLE">NonCollidable (white)</option>
        <option value="16" name="FOL_CLOUD_TRAP">CloudTrap (greenish grey)</option>
        <option value="17" name="FOL_GROUND">Ground (none)</option>
        <option value="18" name="FOL_PORTAL">Portal (green)</option>
        <option value="19" name="FOL_DEBRIS_SMALL">DebrisSmall (white)</option>
        <option value="20" name="FOL_DEBRIS_LARGE">DebrisLarge (white)</option>
        <option value="21" name="FOL_ACOUSTIC_SPACE">AcousticSpace (white)</option>
        <option value="22" name="FOL_ACTORZONE">Actorzone (white)</option>
        <option value="23" name="FOL_PROJECTILEZONE">Projectilezone (white)</option>
        <option value="24" name="FOL_GASTRAP">GasTrap (yellowish green)</option>
        <option value="25" name="FOL_SHELLCASING">ShellCasing (white)</option>
        <option value="26" name="FOL_TRANSPARENT_SMALL">TransparentSmall (white)</option>
        <option value="27" name="FOL_INVISIBLE_WALL">InvisibleWall (white)</option>
        <option value="28" name="FOL_TRANSPARENT_SMALL_ANIM">TransparentSmallAnim (white)</option>
        <option value="29" name="FOL_DEADBIP">Dead Biped (green)</option>
        <option value="30" name="FOL_CHARCONTROLLER">CharController (yellow)</option>
        <option value="31" name="FOL_AVOIDBOX">Avoidbox (orange)</option>
        <option value="32" name="FOL_COLLISIONBOX">Collisionbox (white)</option>
        <option value="33" name="FOL_CAMERASPHERE">Camerasphere (white)</option>
        <option value="34" name="FOL_DOORDETECTION">Doordetection (white)</option>
        <option value="35" name="FOL_CAMERAPICK">Camerapick (white)</option>
        <option value="36" name="FOL_ITEMPICK">Itempick (white)</option>
        <option value="37" name="FOL_LINEOFSIGHT">LineOfSight (white)</option>
        <option value="38" name="FOL_PATHPICK">Pathpick (white)</option>
        <option value="39" name="FOL_CUSTOMPICK1">Custompick1 (white)</option>
        <option value="40" name="FOL_CUSTOMPICK2">Custompick2 (white)</option>
        <option value="41" name="FOL_SPELLEXPLOSION">SpellExplosion (white)</option>
        <option value="42" name="FOL_DROPPINGPICK">Droppingpick (white)</option>
        <option value="43" name="FOL_NULL">Null (white)</option>
    </enum>

    <enum name="SkyrimLayer" storage="byte" versions="#SKY_AND_LATER#">
        Bethesda Havok. Describes the collision layer a body belongs to in Skyrim.
        <option value="0" name="SKYL_UNIDENTIFIED">Unidentified</option>
        <option value="1" name="SKYL_STATIC">Static</option>
        <option value="2" name="SKYL_ANIMSTATIC">Anim Static</option>
        <option value="3" name="SKYL_TRANSPARENT">Transparent</option>
        <option value="4" name="SKYL_CLUTTER">Clutter. Object with this layer will float on water surface.</option>
        <option value="5" name="SKYL_WEAPON">Weapon</option>
        <option value="6" name="SKYL_PROJECTILE">Projectile</option>
        <option value="7" name="SKYL_SPELL">Spell</option>
        <option value="8" name="SKYL_BIPED">Biped. Seems to apply to all creatures/NPCs</option>
        <option value="9" name="SKYL_TREES">Trees</option>
        <option value="10" name="SKYL_PROPS">Props</option>
        <option value="11" name="SKYL_WATER">Water</option>
        <option value="12" name="SKYL_TRIGGER">Trigger</option>
        <option value="13" name="SKYL_TERRAIN">Terrain</option>
        <option value="14" name="SKYL_TRAP">Trap</option>
        <option value="15" name="SKYL_NONCOLLIDABLE">NonCollidable</option>
        <option value="16" name="SKYL_CLOUD_TRAP">CloudTrap</option>
        <option value="17" name="SKYL_GROUND">Ground. It seems that produces no sound when collide.</option>
        <option value="18" name="SKYL_PORTAL">Portal</option>
        <option value="19" name="SKYL_DEBRIS_SMALL">Debris Small</option>
        <option value="20" name="SKYL_DEBRIS_LARGE">Debris Large</option>
        <option value="21" name="SKYL_ACOUSTIC_SPACE">Acoustic Space</option>
        <option value="22" name="SKYL_ACTORZONE">Actor Zone</option>
        <option value="23" name="SKYL_PROJECTILEZONE">Projectile Zone</option>
        <option value="24" name="SKYL_GASTRAP">Gas Trap</option>
        <option value="25" name="SKYL_SHELLCASING">Shell Casing</option>
        <option value="26" name="SKYL_TRANSPARENT_SMALL">Transparent Small</option>
        <option value="27" name="SKYL_INVISIBLE_WALL">Invisible Wall</option>
        <option value="28" name="SKYL_TRANSPARENT_SMALL_ANIM">Transparent Small Anim</option>
        <option value="29" name="SKYL_WARD">Ward</option>
        <option value="30" name="SKYL_CHARCONTROLLER">Char Controller</option>
        <option value="31" name="SKYL_STAIRHELPER">Stair Helper</option>
        <option value="32" name="SKYL_DEADBIP">Dead Bip</option>
        <option value="33" name="SKYL_BIPED_NO_CC">Biped No CC</option>
        <option value="34" name="SKYL_AVOIDBOX">Avoid Box</option>
        <option value="35" name="SKYL_COLLISIONBOX">Collision Box</option>
        <option value="36" name="SKYL_CAMERASHPERE">Camera Sphere</option>
        <option value="37" name="SKYL_DOORDETECTION">Door Detection</option>
        <option value="38" name="SKYL_CONEPROJECTILE">Cone Projectile</option>
        <option value="39" name="SKYL_CAMERAPICK">Camera Pick</option>
        <option value="40" name="SKYL_ITEMPICK">Item Pick</option>
        <option value="41" name="SKYL_LINEOFSIGHT">Line of Sight</option>
        <option value="42" name="SKYL_PATHPICK">Path Pick</option>
        <option value="43" name="SKYL_CUSTOMPICK1">Custom Pick 1</option>
        <option value="44" name="SKYL_CUSTOMPICK2">Custom Pick 2</option>
        <option value="45" name="SKYL_SPELLEXPLOSION">Spell Explosion</option>
        <option value="46" name="SKYL_DROPPINGPICK">Dropping Pick</option>
        <option value="47" name="SKYL_NULL">Null</option>
    </enum>

    <enum name="BipedPart" storage="byte">
        <option value="0" name="P_OTHER">Other</option>
        <option value="1" name="P_HEAD">Head</option>
        <option value="2" name="P_BODY">Body</option>
        <option value="3" name="P_SPINE1">Spine1</option>
        <option value="4" name="P_SPINE2">Spine2</option>
        <option value="5" name="P_L_UPPER_ARM">LUpperArm</option>
        <option value="6" name="P_L_FOREARM">LForeArm</option>
        <option value="7" name="P_L_HAND">LHand</option>
        <option value="8" name="P_L_THIGH">LThigh</option>
        <option value="9" name="P_L_CALF">LCalf</option>
        <option value="10" name="P_L_FOOT">LFoot</option>
        <option value="11" name="P_R_UPPER_ARM">RUpperArm</option>
        <option value="12" name="P_R_FOREARM">RForeArm</option>
        <option value="13" name="P_R_HAND">RHand</option>
        <option value="14" name="P_R_THIGH">RThigh</option>
        <option value="15" name="P_R_CALF">RCalf</option>
        <option value="16" name="P_R_FOOT">RFoot</option>
        <option value="17" name="P_TAIL">Tail</option>
        <option value="18" name="P_SHIELD">Shield</option>
        <option value="19" name="P_QUIVER">Quiver</option>
        <option value="20" name="P_WEAPON">Weapon</option>
        <option value="21" name="P_PONYTAIL">Ponytail</option>
        <option value="22" name="P_WING">Wing</option>
        <option value="23" name="P_PACK">Pack</option>
        <option value="24" name="P_CHAIN">Chain</option>
        <option value="25" name="P_ADDON_HEAD">AddonHead</option>
        <option value="26" name="P_ADDON_CHEST">AddonChest</option>
        <option value="27" name="P_ADDON_LEG">AddonLeg</option>
        <option value="28" name="P_ADDON_ARM">AddonArm</option>
    </enum>

    <enum name="hkMoppCodeBuildType" storage="byte" versions="#SKY_AND_LATER#">
        hkpMoppCode::BuildType
        A byte describing if MOPP Data is organized into chunks (PS3) or not (PC)
        <option value="0" name="BUILT_WITH_CHUNK_SUBDIVISION">Organized in chunks for PS3.</option>
        <option value="1" name="BUILT_WITHOUT_CHUNK_SUBDIVISION">Not organized in chunks for PC. (Default)</option>
        <option value="2" name="BUILD_NOT_SET">Build type not set yet.</option>
    </enum>

    <enum name="PlatformID" storage="uint" prefix="PLATFORM">
        Target platform for NiPersistentSrcTextureRendererData (later than 30.1).
        <option value="0" name="ANY" />
        <option value="1" name="XENON" />
        <option value="2" name="PS3" />
        <option value="3" name="DX9" />
        <option value="4" name="WII" />
        <option value="5" name="D3D10" />
    </enum>

    <enum name="RendererID" storage="uint" prefix="RENDERER">
        Target renderer for NiPersistentSrcTextureRendererData (until 30.1).
        <option value="0" name="XBOX360" />
        <option value="1" name="PS3" />
        <option value="2" name="DX9" />
        <option value="3" name="D3D10" />
        <option value="4" name="WII" />
        <option value="5" name="GENERIC" />
        <option value="6" name="D3D11" />
    </enum>

    <enum name="PixelFormat" storage="uint" prefix="PX">
        Describes the pixel format used by the NiPixelData object to store a texture.
        <option value="0" name="FMT_RGB">24-bit RGB. 8 bits per red, blue, and green component.</option>
        <option value="1" name="FMT_RGBA">32-bit RGB with alpha. 8 bits per red, blue, green, and alpha component.</option>
        <option value="2" name="FMT_PAL">8-bit palette index.</option>
        <option value="3" name="FMT_PALA">8-bit palette index with alpha.</option>
        <option value="4" name="FMT_DXT1">DXT1 compressed texture.</option>
        <option value="5" name="FMT_DXT3">DXT3 compressed texture.</option>
        <option value="6" name="FMT_DXT5">DXT5 compressed texture.</option>
        <option value="7" name="FMT_RGB24NONINT">(Deprecated) 24-bit noninterleaved texture, an old PS2 format.</option>
        <option value="8" name="FMT_BUMP">Uncompressed dU/dV gradient bump map.</option>
        <option value="9" name="FMT_BUMPLUMA">Uncompressed dU/dV gradient bump map with luma channel representing shininess.</option>
        <option value="10" name="FMT_RENDERSPEC">Generic descriptor for any renderer-specific format not described by other formats.</option>
        <option value="11" name="FMT_1CH">Generic descriptor for formats with 1 component.</option>
        <option value="12" name="FMT_2CH">Generic descriptor for formats with 2 components.</option>
        <option value="13" name="FMT_3CH">Generic descriptor for formats with 3 components.</option>
        <option value="14" name="FMT_4CH">Generic descriptor for formats with 4 components.</option>
        <option value="15" name="FMT_DEPTH_STENCIL">Indicates the NiPixelFormat is meant to be used on a depth/stencil surface.</option>
        <option value="16" name="FMT_UNKNOWN" />
    </enum>

    <enum name="PixelTiling" storage="uint" prefix="PX">
        Describes whether pixels have been tiled from their standard row-major format to a format optimized for a particular platform.
        <option value="0" name="TILE_NONE" />
        <option value="1" name="TILE_XENON" />
        <option value="2" name="TILE_WII" />
        <option value="3" name="TILE_NV_SWIZZLED" />
    </enum>

    <enum name="PixelComponent" storage="uint" prefix="PX">
        Describes the pixel format used by the NiPixelData object to store a texture.
        <option value="0" name="COMP_RED" />
        <option value="1" name="COMP_GREEN" />
        <option value="2" name="COMP_BLUE" />
        <option value="3" name="COMP_ALPHA" />
        <option value="4" name="COMP_COMPRESSED" />
        <option value="5" name="COMP_OFFSET_U" />
        <option value="6" name="COMP_OFFSET_V" />
        <option value="7" name="COMP_OFFSET_W" />
        <option value="8" name="COMP_OFFSET_Q" />
        <option value="9" name="COMP_LUMA" />
        <option value="10" name="COMP_HEIGHT" />
        <option value="11" name="COMP_VECTOR_X" />
        <option value="12" name="COMP_VECTOR_Y" />
        <option value="13" name="COMP_VECTOR_Z" />
        <option value="14" name="COMP_PADDING" />
        <option value="15" name="COMP_INTENSITY" />
        <option value="16" name="COMP_INDEX" />
        <option value="17" name="COMP_DEPTH" />
        <option value="18" name="COMP_STENCIL" />
        <option value="19" name="COMP_EMPTY" />
    </enum>

    <enum name="PixelRepresentation" storage="uint" prefix="PX">
        Describes how each pixel should be accessed on NiPixelFormat.
        <option value="0" name="REP_NORM_INT" />
        <option value="1" name="REP_HALF" />
        <option value="2" name="REP_FLOAT" />
        <option value="3" name="REP_INDEX" />
        <option value="4" name="REP_COMPRESSED" />
        <option value="5" name="REP_UNKNOWN" />
        <option value="6" name="REP_INT" />
    </enum>

    <enum name="PixelLayout" storage="uint" prefix="PX">
        Describes the color depth in an NiTexture.
        <option value="0" name="LAY_PALETTIZED_8">Texture is in 8-bit palettized format.</option>
        <option value="1" name="LAY_HIGH_COLOR_16">Texture is in 16-bit high color format.</option>
        <option value="2" name="LAY_TRUE_COLOR_32">Texture is in 32-bit true color format.</option>
        <option value="3" name="LAY_COMPRESSED">Texture is compressed.</option>
        <option value="4" name="LAY_BUMPMAP">Texture is a grayscale bump map.</option>
        <option value="5" name="LAY_PALETTIZED_4">Texture is in 4-bit palettized format.</option>
        <option value="6" name="LAY_DEFAULT">Use default setting.</option>
        <option value="7" name="LAY_SINGLE_COLOR_8" />
        <option value="8" name="LAY_SINGLE_COLOR_16" />
        <option value="9" name="LAY_SINGLE_COLOR_32" />
        <option value="10" name="LAY_DOUBLE_COLOR_32" />
        <option value="11" name="LAY_DOUBLE_COLOR_64" />
        <option value="12" name="LAY_FLOAT_COLOR_32" />
        <option value="13" name="LAY_FLOAT_COLOR_64" />
        <option value="14" name="LAY_FLOAT_COLOR_128" />
        <option value="15" name="LAY_SINGLE_COLOR_4" />
        <option value="16" name="LAY_DEPTH_24_X8" />
    </enum>

    <enum name="MipMapFormat" storage="uint">
        Describes how mipmaps are handled in an NiTexture.
        <option value="0" name="MIP_FMT_NO">Texture does not use mip maps.</option>
        <option value="1" name="MIP_FMT_YES">Texture uses mip maps.</option>
        <option value="2" name="MIP_FMT_DEFAULT">Use default setting.</option>
    </enum>

    <enum name="AlphaFormat" storage="uint">
        Describes how transparency is handled in an NiTexture.
        <option value="0" name="ALPHA_NONE">No alpha.</option>
        <option value="1" name="ALPHA_BINARY">1-bit alpha.</option>
        <option value="2" name="ALPHA_SMOOTH">Interpolated 4- or 8-bit alpha.</option>
        <option value="3" name="ALPHA_DEFAULT">Use default setting.</option>
    </enum>

    <enum name="TexClampMode" storage="uint">
        Describes the availiable texture clamp modes, i.e. the behavior of UV mapping outside the [0,1] range.
        <option value="0" name="CLAMP_S_CLAMP_T">Clamp in both directions.</option>
        <option value="1" name="CLAMP_S_WRAP_T">Clamp in the S(U) direction but wrap in the T(V) direction.</option>
        <option value="2" name="WRAP_S_CLAMP_T">Wrap in the S(U) direction but clamp in the T(V) direction.</option>
        <option value="3" name="WRAP_S_WRAP_T">Wrap in both directions.</option>
    </enum>

    <enum name="TexFilterMode" storage="uint">
        Describes the availiable texture filter modes, i.e. the way the pixels in a texture are displayed on screen.
        <option value="0" name="FILTER_NEAREST">Nearest neighbor. Uses nearest texel with no mipmapping.</option>
        <option value="1" name="FILTER_BILERP">Bilinear. Linear interpolation with no mipmapping.</option>
        <option value="2" name="FILTER_TRILERP">Trilinear. Linear intepolation between 8 texels (4 nearest texels between 2 nearest mip levels).</option>
        <option value="3" name="FILTER_NEAREST_MIPNEAREST">Nearest texel on nearest mip level.</option>
        <option value="4" name="FILTER_NEAREST_MIPLERP">Linear interpolates nearest texel between two nearest mip levels.</option>
        <option value="5" name="FILTER_BILERP_MIPNEAREST">Linear interpolates on nearest mip level.</option>
        <option value="6" name="FILTER_ANISOTROPIC">Anisotropic filtering. One or many trilinear samples depending on anisotropy.</option>
    </enum>

    <enum name="SourceVertexMode" storage="uint">
        Describes how to apply vertex colors for NiVertexColorProperty.
        <option value="0" name="VERT_MODE_SRC_IGNORE">Emissive, ambient, and diffuse colors are all specified by the NiMaterialProperty.</option>
        <option value="1" name="VERT_MODE_SRC_EMISSIVE">Emissive colors are specified by the source vertex colors. Ambient+Diffuse are specified by the NiMaterialProperty.</option>
        <option value="2" name="VERT_MODE_SRC_AMB_DIF">Ambient+Diffuse colors are specified by the source vertex colors. Emissive is specified by the NiMaterialProperty. (Default)</option>
    </enum>

    <enum name="LightingMode" storage="uint">
        Describes which lighting equation components influence the final vertex color for NiVertexColorProperty.
        <option value="0" name="LIGHT_MODE_EMISSIVE">Emissive.</option>
        <option value="1" name="LIGHT_MODE_EMI_AMB_DIF">Emissive + Ambient + Diffuse. (Default)</option>
    </enum>

    <enum name="CycleType" storage="uint">
        The animation cyle behavior.
        <option value="0" name="CYCLE_LOOP">Loop</option>
        <option value="1" name="CYCLE_REVERSE">Reverse</option>
        <option value="2" name="CYCLE_CLAMP">Clamp</option>
    </enum>

    <enum name="FieldType" storage="uint">
        The force field type.
        <option value="0" name="FIELD_WIND">Wind (fixed direction)</option>
        <option value="1" name="FIELD_POINT">Point (fixed origin)</option>
    </enum>

    <enum name="BillboardMode" storage="ushort">
        Determines the way the billboard will react to the camera.
        Billboard mode is stored in lowest 3 bits although Oblivion vanilla nifs uses values higher than 7.
        <option value="0" name="ALWAYS_FACE_CAMERA">Align billboard and camera forward vector. Minimized rotation.</option>
        <option value="1" name="ROTATE_ABOUT_UP">Align billboard and camera forward vector while allowing rotation around the up axis.</option>
        <option value="2" name="RIGID_FACE_CAMERA">Align billboard and camera forward vector. Non-minimized rotation.</option>
        <option value="3" name="ALWAYS_FACE_CENTER">Billboard forward vector always faces camera ceneter. Minimized rotation.</option>
        <option value="4" name="RIGID_FACE_CENTER">Billboard forward vector always faces camera ceneter. Non-minimized rotation.</option>
        <option value="5" name="BSROTATE_ABOUT_UP">The billboard will only rotate around its local Z axis (it always stays in its local X-Y plane).</option>
        <option value="9" name="ROTATE_ABOUT_UP2">The billboard will only rotate around the up axis (same as ROTATE_ABOUT_UP?).</option>
    </enum>

    <enum name="StencilTestFunc" storage="uint" prefix="STENCIL">
        Describes stencil buffer test modes for NiStencilProperty.
        <option value="0" name="TEST_NEVER">Always false. Ref value is ignored.</option>
        <option value="1" name="TEST_LESS">VRef ‹ VBuf</option>
        <option value="2" name="TEST_EQUAL">VRef = VBuf</option>
        <option value="3" name="TEST_LESS_EQUAL">VRef ≤ VBuf</option>
        <option value="4" name="TEST_GREATER">VRef › VBuf</option>
        <option value="5" name="TEST_NOT_EQUAL">VRef ≠ VBuf</option>
        <option value="6" name="TEST_GREATER_EQUAL">VRef ≥ VBuf</option>
        <option value="7" name="TEST_ALWAYS">Always true. Buffer is ignored.</option>
    </enum>

    <enum name="StencilAction" storage="uint">
        Describes the actions which can occur as a result of tests for NiStencilProperty.
        <option value="0" name="ACTION_KEEP">Keep the current value in the stencil buffer.</option>
        <option value="1" name="ACTION_ZERO">Write zero to the stencil buffer.</option>
        <option value="2" name="ACTION_REPLACE">Write the reference value to the stencil buffer.</option>
        <option value="3" name="ACTION_INCREMENT">Increment the value in the stencil buffer.</option>
        <option value="4" name="ACTION_DECREMENT">Decrement the value in the stencil buffer.</option>
        <option value="5" name="ACTION_INVERT">Bitwise invert the value in the stencil buffer.</option>
    </enum>

    <enum name="StencilDrawMode" storage="uint">
        Describes the face culling options for NiStencilProperty.
        <option value="0" name="DRAW_CCW_OR_BOTH">Application default, chooses between DRAW_CCW or DRAW_BOTH.</option>
        <option value="1" name="DRAW_CCW">Draw only the triangles whose vertices are ordered CCW with respect to the viewer. (Standard behavior)</option>
        <option value="2" name="DRAW_CW">Draw only the triangles whose vertices are ordered CW with respect to the viewer. (Effectively flips faces)</option>
        <option value="3" name="DRAW_BOTH">Draw all triangles, regardless of orientation. (Effectively force double-sided)</option>
    </enum>

    <enum name="TestFunction" storage="uint">
        Describes Z-buffer test modes for NiZBufferProperty.
        "Less than" = closer to camera, "Greater than" = further from camera.
        <option value="0" name="TEST_ALWAYS">Always true. Buffer is ignored.</option>
        <option value="1" name="TEST_LESS">VRef ‹ VBuf</option>
        <option value="2" name="TEST_EQUAL">VRef = VBuf</option>
        <option value="3" name="TEST_LESS_EQUAL">VRef ≤ VBuf</option>
        <option value="4" name="TEST_GREATER">VRef › VBuf</option>
        <option value="5" name="TEST_NOT_EQUAL">VRef ≠ VBuf</option>
        <option value="6" name="TEST_GREATER_EQUAL">VRef ≥ VBuf</option>
        <option value="7" name="TEST_NEVER">Always false. Ref value is ignored.</option>
    </enum>

    <enum name="AlphaFunction" storage="ushort" prefix="ALPHA">
        Describes alpha blend modes for NiAlphaProperty.
        <option value="0" name="ONE" />
        <option value="1" name="ZERO" />
        <option value="2" name="SRC_COLOR" />
        <option value="3" name="INV_SRC_COLOR" />
        <option value="4" name="DEST_COLOR" />
        <option value="5" name="INV_DEST_COLOR" />
        <option value="6" name="SRC_ALPHA" />
        <option value="7" name="INV_SRC_ALPHA" />
        <option value="8" name="DEST_ALPHA" />
        <option value="9" name="INV_DEST_ALPHA" />
        <option value="10" name="SRC_ALPHA_SATURATE" />
    </enum>

    <enum name="hkMotionType" storage="byte" versions="#BETHESDA#">
        hkpMotion::MotionType. Motion type of a rigid body determines what happens when it is simulated.
        <option value="0" name="MO_SYS_INVALID">Invalid</option>
        <option value="1" name="MO_SYS_DYNAMIC">A fully-simulated, movable rigid body. At construction time the engine checks the input inertia and selects MO_SYS_SPHERE_INERTIA or MO_SYS_BOX_INERTIA as appropriate.</option>
        <option value="2" name="MO_SYS_SPHERE_INERTIA">Simulation is performed using a sphere inertia tensor.</option>
        <option value="3" name="MO_SYS_SPHERE_STABILIZED">This is the same as MO_SYS_SPHERE_INERTIA, except that simulation of the rigid body is "softened".</option>
        <option value="4" name="MO_SYS_BOX_INERTIA">Simulation is performed using a box inertia tensor.</option>
        <option value="5" name="MO_SYS_BOX_STABILIZED">This is the same as MO_SYS_BOX_INERTIA, except that simulation of the rigid body is "softened".</option>
        <option value="6" name="MO_SYS_KEYFRAMED">Simulation is not performed as a normal rigid body. The keyframed rigid body has an infinite mass when viewed by the rest of the system. (used for creatures)</option>
        <option value="7" name="MO_SYS_FIXED">This motion type is used for the static elements of a game scene, e.g. the landscape. Faster than MO_SYS_KEYFRAMED at velocity 0. (used for weapons)</option>
        <option value="8" name="MO_SYS_THIN_BOX">A box inertia motion which is optimized for thin boxes and has less stability problems</option>
        <option value="9" name="MO_SYS_CHARACTER">A specialized motion used for character controllers</option>
    </enum>

    <enum name="hkDeactivatorType" storage="byte" versions="#BETHESDA#">
        hkpRigidBodyDeactivator::DeactivatorType. Deactivator Type determines which mechanism Havok will use to classify the body as deactivated.
        <option value="0" name="DEACTIVATOR_INVALID">Invalid</option>
        <option value="1" name="DEACTIVATOR_NEVER">This will force the rigid body to never deactivate.</option>
        <option value="2" name="DEACTIVATOR_SPATIAL">Tells Havok to use a spatial deactivation scheme. This makes use of high and low frequencies of positional motion to determine when deactivation should occur.</option>
    </enum>

    <enum name="hkSolverDeactivation" storage="byte" versions="#BETHESDA#">
        hkpRigidBodyCinfo::SolverDeactivation.
        A list of possible solver deactivation settings. This value defines how aggressively the solver deactivates objects.
        Note: Solver deactivation does not save CPU, but reduces creeping of movable objects in a pile quite dramatically.
        <option value="0" name="SOLVER_DEACTIVATION_INVALID">Invalid</option>
        <option value="1" name="SOLVER_DEACTIVATION_OFF">No solver deactivation.</option>
        <option value="2" name="SOLVER_DEACTIVATION_LOW">Very conservative deactivation, typically no visible artifacts.</option>
        <option value="3" name="SOLVER_DEACTIVATION_MEDIUM">Normal deactivation, no serious visible artifacts in most cases.</option>
        <option value="4" name="SOLVER_DEACTIVATION_HIGH">Fast deactivation, visible artifacts.</option>
        <option value="5" name="SOLVER_DEACTIVATION_MAX">Very fast deactivation, visible artifacts.</option>
    </enum>

    <enum name="hkQualityType" storage="byte" versions="#BETHESDA#">
        hkpCollidableQualityType. Describes the priority and quality of collisions for a body,
            e.g. you may expect critical game play objects to have solid high-priority collisions so that they never sink into ground,
            or may allow penetrations for visual debris objects.
        Notes:
            - Fixed and keyframed objects cannot interact with each other.
            - Debris can interpenetrate but still responds to Bullet hits.
            - Critical objects are forced to not interpenetrate.
            - Moving objects can interpenetrate slightly with other Moving or Debris objects but nothing else.
        <option value="0" name="MO_QUAL_INVALID">Automatically assigned to MO_QUAL_FIXED, MO_QUAL_KEYFRAMED or MO_QUAL_DEBRIS</option>
        <option value="1" name="MO_QUAL_FIXED">Static body.</option>
        <option value="2" name="MO_QUAL_KEYFRAMED">Animated body with infinite mass.</option>
        <option value="3" name="MO_QUAL_DEBRIS">Low importance bodies adding visual detail.</option>
        <option value="4" name="MO_QUAL_MOVING">Moving bodies which should not penetrate or leave the world, but can.</option>
        <option value="5" name="MO_QUAL_CRITICAL">Gameplay critical bodies which cannot penetrate or leave the world under any circumstance.</option>
        <option value="6" name="MO_QUAL_BULLET">Fast-moving bodies, such as projectiles.</option>
        <option value="7" name="MO_QUAL_USER">For user.</option>
        <option value="8" name="MO_QUAL_CHARACTER">For use with rigid body character controllers.</option>
        <option value="9" name="MO_QUAL_KEYFRAMED_REPORT">
            Moving bodies with infinite mass which should report contact points and TOI collisions against all other bodies.
        </option>
    </enum>

    <enum name="ForceType" storage="uint">
        Describes the type of gravitational force.
        <option value="0" name="FORCE_PLANAR"></option>
        <option value="1" name="FORCE_SPHERICAL"></option>
        <option value="2" name="FORCE_UNKNOWN"></option>
    </enum>

    <enum name="TransformMember" storage="uint">
        Describes which aspect of the NiTextureTransform the NiTextureTransformController will modify.
        <option value="0" name="TT_TRANSLATE_U">Control the translation of the U coordinates.</option>
        <option value="1" name="TT_TRANSLATE_V">Control the translation of the V coordinates.</option>
        <option value="2" name="TT_ROTATE">Control the rotation of the coordinates.</option>
        <option value="3" name="TT_SCALE_U">Control the scale of the U coordinates.</option>
        <option value="4" name="TT_SCALE_V">Control the scale of the V coordinates.</option>
    </enum>

    <enum name="DecayType" storage="uint">
        Describes the decay function of bomb forces.
        <option value="0" name="DECAY_NONE">No decay.</option>
        <option value="1" name="DECAY_LINEAR">Linear decay.</option>
        <option value="2" name="DECAY_EXPONENTIAL">Exponential decay.</option>
    </enum>

    <enum name="SymmetryType" storage="uint">
        Describes the symmetry type of bomb forces.
        <option value="0" name="SPHERICAL_SYMMETRY">Spherical Symmetry.</option>
        <option value="1" name="CYLINDRICAL_SYMMETRY">Cylindrical Symmetry.</option>
        <option value="2" name="PLANAR_SYMMETRY">Planar Symmetry.</option>
    </enum>

    <enum name="VelocityType" storage="uint">
        Controls the way the a particle mesh emitter determines the starting speed and direction of the particles that are emitted.
        <option value="0" name="VELOCITY_USE_NORMALS">Uses the normals of the meshes to determine staring velocity.</option>
        <option value="1" name="VELOCITY_USE_RANDOM">Starts particles with a random velocity.</option>
        <option value="2" name="VELOCITY_USE_DIRECTION">Uses the emission axis to determine initial particle direction?</option>
    </enum>

    <enum name="EmitFrom" storage="uint">
        Controls which parts of the mesh that the particles are emitted from.
        <option value="0" name="EMIT_FROM_VERTICES">Emit particles from the vertices of the mesh.</option>
        <option value="1" name="EMIT_FROM_FACE_CENTER">Emit particles from the center of the faces of the mesh.</option>
        <option value="2" name="EMIT_FROM_EDGE_CENTER">Emit particles from the center of the edges of the mesh.</option>
        <option value="3" name="EMIT_FROM_FACE_SURFACE">Perhaps randomly emit particles from anywhere on the faces of the mesh?</option>
        <option value="4" name="EMIT_FROM_EDGE_SURFACE">Perhaps randomly emit particles from anywhere on the edges of the mesh?</option>
    </enum>

    <enum name="TextureType" storage="uint">
        The type of information that is stored in a texture used by an NiTextureEffect.
        <option value="0" name="TEX_PROJECTED_LIGHT">Apply a projected light texture. Each light effect is summed before multiplying by the base texture.</option>
        <option value="1" name="TEX_PROJECTED_SHADOW">Apply a projected shadow texture. Each shadow effect is multiplied by the base texture.</option>
        <option value="2" name="TEX_ENVIRONMENT_MAP">Apply an environment map texture. Added to the base texture and light/shadow/decal maps.</option>
        <option value="3" name="TEX_FOG_MAP">Apply a fog map texture. Alpha channel is used to blend the color channel with the base texture.</option>
    </enum>

    <enum name="CoordGenType" storage="uint">
        Determines the way that UV texture coordinates are generated.
        <option value="0" name="CG_WORLD_PARALLEL">Use planar mapping.</option>
        <option value="1" name="CG_WORLD_PERSPECTIVE">Use perspective mapping.</option>
        <option value="2" name="CG_SPHERE_MAP">Use spherical mapping.</option>
        <option value="3" name="CG_SPECULAR_CUBE_MAP">Use specular cube mapping. For NiSourceCubeMap only.</option>
        <option value="4" name="CG_DIFFUSE_CUBE_MAP">Use diffuse cube mapping. For NiSourceCubeMap only.</option>
    </enum>

    <enum name="EndianType" storage="byte">
        <option value="0" name="ENDIAN_BIG">The numbers are stored in big endian format, such as those used by PowerPC Mac processors.</option>
        <option value="1" name="ENDIAN_LITTLE">The numbers are stored in little endian format, such as those used by Intel and AMD x86 processors.</option>
    </enum>

    <enum name="MaterialColor" storage="ushort">
        Used by NiMaterialColorControllers to select which type of color in the controlled object that will be animated.
        <option value="0" name="TC_AMBIENT">Control the ambient color.</option>
        <option value="1" name="TC_DIFFUSE">Control the diffuse color.</option>
        <option value="2" name="TC_SPECULAR">Control the specular color.</option>
        <option value="3" name="TC_SELF_ILLUM">Control the self illumination color.</option>
    </enum>

    <enum name="LightColor" storage="ushort">
        Used by NiLightColorControllers to select which type of color in the controlled object that will be animated.
        <option value="0" name="LC_DIFFUSE">Control the diffuse color.</option>
        <option value="1" name="LC_AMBIENT">Control the ambient color.</option>
    </enum>

    <enum name="ConsistencyType" storage="ushort">
        Used by NiGeometryData to control the volatility of the mesh.
        Consistency Type is masked to only the upper 4 bits (0xF000). Dirty mask is the lower 12 (0x0FFF) but only used at runtime.
        <option value="0x0000" name="CT_MUTABLE">Mutable Mesh</option>
        <option value="0x4000" name="CT_STATIC">Static Mesh</option>
        <option value="0x8000" name="CT_VOLATILE">Volatile Mesh</option>
    </enum>

    <enum name="SortingMode" storage="uint">
        Describes the way that NiSortAdjustNode modifies the sorting behavior for the subtree below it.
        <option value="0" name="SORTING_INHERIT">Inherit. Acts identical to NiNode.</option>
        <option value="1" name="SORTING_OFF">Disables sort on all geometry under this node.</option>
    </enum>

    <enum name="PropagationMode" storage="uint">
        The propagation mode controls scene graph traversal during collision detection operations for NiCollisionData.
        <option value="0" name="PROPAGATE_ON_SUCCESS">Propagation only occurs as a result of a successful collision.</option>
        <option value="1" name="PROPAGATE_ON_FAILURE">(Deprecated) Propagation only occurs as a result of a failed collision.</option>
        <option value="2" name="PROPAGATE_ALWAYS">Propagation always occurs regardless of collision result.</option>
        <option value="3" name="PROPAGATE_NEVER">Propagation never occurs regardless of collision result.</option>
    </enum>

    <enum name="CollisionMode" prefix="CM" storage="uint">
        The collision mode controls the type of collision operation that is to take place for NiCollisionData.
        <option value="0" name="USE_OBB">Use Bounding Box</option>
        <option value="1" name="USE_TRI">Use Triangles</option>
        <option value="2" name="USE_ABV">Use Alternate Bounding Volumes</option>
        <option value="3" name="NOTEST">Indicates that no collision test should be made.</option>
        <option value="4" name="USE_NIBOUND">Use NiBound</option>
    </enum>

    <enum name="BoundVolumeType" storage="uint">
        <option value="0xffffffff" name="BASE_BV">Default</option>
        <option value="0" name="SPHERE_BV">Sphere</option>
        <option value="1" name="BOX_BV">Box</option>
        <option value="2" name="CAPSULE_BV">Capsule</option>
        <option value="4" name="UNION_BV">Union</option>
        <option value="5" name="HALFSPACE_BV">Half Space</option>
    </enum>

    <enum name="hkResponseType" storage="byte" versions="#BETHESDA#">
        hkpMaterial::ResponseType
        <option value="0" name="RESPONSE_INVALID">Invalid Response</option>
        <option value="1" name="RESPONSE_SIMPLE_CONTACT">Do normal collision resolution</option>
        <option value="2" name="RESPONSE_REPORTING">No collision resolution is performed but listeners are called</option>
        <option value="3" name="RESPONSE_NONE">Do nothing, ignore all the results.</option>
    </enum>
    
    <enum name="BSDismemberBodyPartType" storage="ushort" versions="#BETHESDA#">
        Biped bodypart data used for visibility control of triangles.  Options are Fallout 3, except where marked for Skyrim (uses SBP prefix)
        Skyrim BP names are listed only for vanilla names, different creatures have different defnitions for naming.
        <option value="0" name="BP_TORSO">Torso</option>
        <option value="1" name="BP_HEAD">Head</option>
        <option value="2" name="BP_HEAD2">Head 2</option>
        <option value="3" name="BP_LEFTARM">Left Arm</option>
        <option value="4" name="BP_LEFTARM2">Left Arm 2</option>
        <option value="5" name="BP_RIGHTARM">Right Arm</option>
        <option value="6" name="BP_RIGHTARM2">Right Arm 2</option>
        <option value="7" name="BP_LEFTLEG">Left Leg</option>
        <option value="8" name="BP_LEFTLEG2">Left Leg 2</option>
        <option value="9" name="BP_LEFTLEG3">Left Leg 3</option>
        <option value="10" name="BP_RIGHTLEG">Right Leg</option>
        <option value="11" name="BP_RIGHTLEG2">Right Leg 2</option>
        <option value="12" name="BP_RIGHTLEG3">Right Leg 3</option>
        <option value="13" name="BP_BRAIN">Brain</option>
        
        <option value="30" name="SBP_30_HEAD">Skyrim, Head(Human), Body(Atronachs,Beasts), Mask(Dragonpriest)</option>
        <option value="31" name="SBP_31_HAIR">Skyrim, Hair(human), Far(Dragon), Mask2(Dragonpriest),SkinnedFX(Spriggan)</option>
        <option value="32" name="SBP_32_BODY">Skyrim, Main body, extras(Spriggan)</option>
        <option value="33" name="SBP_33_HANDS">Skyrim, Hands L/R, BodyToo(Dragonpriest), Legs(Draugr), Arms(Giant)</option>
        <option value="34" name="SBP_34_FOREARMS">Skyrim, Forearms L/R, Beard(Draugr)</option>
        <option value="35" name="SBP_35_AMULET">Skyrim, Amulet</option>
        <option value="36" name="SBP_36_RING">Skyrim, Ring</option>
        <option value="37" name="SBP_37_FEET">Skyrim, Feet L/R</option>
        <option value="38" name="SBP_38_CALVES">Skyrim, Calves L/R</option>
        <option value="39" name="SBP_39_SHIELD">Skyrim, Shield</option>
        <option value="40" name="SBP_40_TAIL">Skyrim, Tail(Argonian/Khajiit), Skeleton01(Dragon), FX01(AtronachStorm),FXMist (Dragonpriest), Spit(Chaurus,Spider),SmokeFins(IceWraith)</option>
        <option value="41" name="SBP_41_LONGHAIR">Skyrim, Long Hair(Human), Skeleton02(Dragon),FXParticles(Dragonpriest)</option>
        <option value="42" name="SBP_42_CIRCLET">Skyrim, Circlet(Human, MouthFireEffect(Dragon)</option>
        <option value="43" name="SBP_43_EARS">Skyrim, Ears</option>
        <option value="44" name="SBP_44_DRAGON_BLOODHEAD_OR_MOD_MOUTH">Skyrim, Bloodied dragon head, or NPC face/mouth</option>
        <option value="45" name="SBP_45_DRAGON_BLOODWINGL_OR_MOD_NECK">Skyrim, Left Bloodied dragon wing, Saddle(Horse), or NPC cape, scarf, shawl, neck-tie, etc.</option>
        <option value="46" name="SBP_46_DRAGON_BLOODWINGR_OR_MOD_CHEST_PRIMARY">Skyrim, Right Bloodied dragon wing, or NPC chest primary or outergarment</option>
        <option value="47" name="SBP_47_DRAGON_BLOODTAIL_OR_MOD_BACK">Skyrim, Bloodied dragon tail, or NPC backpack/wings/...</option>
        <option value="48" name="SBP_48_MOD_MISC1">Anything that does not fit in the list</option>
        <option value="49" name="SBP_49_MOD_PELVIS_PRIMARY">Pelvis primary or outergarment</option>
        <option value="50" name="SBP_50_DECAPITATEDHEAD">Skyrim, Decapitated Head</option>
        <option value="51" name="SBP_51_DECAPITATE">Skyrim, Decapitate, neck gore</option>
        <option value="52" name="SBP_52_MOD_PELVIS_SECONDARY">Pelvis secondary or undergarment</option>
        <option value="53" name="SBP_53_MOD_LEG_RIGHT">Leg primary or outergarment or right leg</option>
        <option value="54" name="SBP_54_MOD_LEG_LEFT">Leg secondary or undergarment or left leg</option>
        <option value="55" name="SBP_55_MOD_FACE_JEWELRY">Face alternate or jewelry</option>
        <option value="56" name="SBP_56_MOD_CHEST_SECONDARY">Chest secondary or undergarment</option>
        <option value="57" name="SBP_57_MOD_SHOULDER">Shoulder</option>
        <option value="58" name="SBP_58_MOD_ARM_LEFT">Arm secondary or undergarment or left arm</option>
        <option value="59" name="SBP_59_MOD_ARM_RIGHT">Arm primary or outergarment or right arm</option>
        <option value="60" name="SBP_60_MOD_MISC2">Anything that does not fit in the list</option>
        <option value="61" name="SBP_61_FX01">Skyrim, FX01(Humanoid)</option>
        
        <option value="101" name="BP_SECTIONCAP_HEAD">Section Cap | Head</option>
        <option value="102" name="BP_SECTIONCAP_HEAD2">Section Cap | Head 2</option>
        <option value="103" name="BP_SECTIONCAP_LEFTARM">Section Cap | Left Arm</option>
        <option value="104" name="BP_SECTIONCAP_LEFTARM2">Section Cap | Left Arm 2</option>
        <option value="105" name="BP_SECTIONCAP_RIGHTARM">Section Cap | Right Arm</option>
        <option value="106" name="BP_SECTIONCAP_RIGHTARM2">Section Cap | Right Arm 2</option>
        <option value="107" name="BP_SECTIONCAP_LEFTLEG">Section Cap | Left Leg</option>
        <option value="108" name="BP_SECTIONCAP_LEFTLEG2">Section Cap | Left Leg 2</option>
        <option value="109" name="BP_SECTIONCAP_LEFTLEG3">Section Cap | Left Leg 3</option>
        <option value="110" name="BP_SECTIONCAP_RIGHTLEG">Section Cap | Right Leg</option>
        <option value="111" name="BP_SECTIONCAP_RIGHTLEG2">Section Cap | Right Leg 2</option>
        <option value="112" name="BP_SECTIONCAP_RIGHTLEG3">Section Cap | Right Leg 3</option>
        <option value="113" name="BP_SECTIONCAP_BRAIN">Section Cap | Brain</option>
        
        <option value="130" name="SBP_130_HEAD">Skyrim, Head slot, use on full-face helmets</option>
        <option value="131" name="SBP_131_HAIR">Skyrim, Hair slot 1, use on hoods</option>
        <option value="141" name="SBP_141_LONGHAIR">Skyrim, Hair slot 2, use for longer hair</option>
        <option value="142" name="SBP_142_CIRCLET">Skyrim, Circlet slot 1, use for circlets</option>
        <option value="143" name="SBP_143_EARS">Skyrim, Ear slot</option>
        <option value="150" name="SBP_150_DECAPITATEDHEAD">Skyrim, neck gore on head side</option>

        <option value="201" name="BP_TORSOCAP_HEAD">Torso Cap | Head</option>
        <option value="202" name="BP_TORSOCAP_HEAD2">Torso Cap | Head 2</option>
        <option value="203" name="BP_TORSOCAP_LEFTARM">Torso Cap | Left Arm</option>
        <option value="204" name="BP_TORSOCAP_LEFTARM2">Torso Cap | Left Arm 2</option>
        <option value="205" name="BP_TORSOCAP_RIGHTARM">Torso Cap | Right Arm</option>
        <option value="206" name="BP_TORSOCAP_RIGHTARM2">Torso Cap | Right Arm 2</option>
        <option value="207" name="BP_TORSOCAP_LEFTLEG">Torso Cap | Left Leg</option>
        <option value="208" name="BP_TORSOCAP_LEFTLEG2">Torso Cap | Left Leg 2</option>
        <option value="209" name="BP_TORSOCAP_LEFTLEG3">Torso Cap | Left Leg 3</option>
        <option value="210" name="BP_TORSOCAP_RIGHTLEG">Torso Cap | Right Leg</option>
        <option value="211" name="BP_TORSOCAP_RIGHTLEG2">Torso Cap | Right Leg 2</option>
        <option value="212" name="BP_TORSOCAP_RIGHTLEG3">Torso Cap | Right Leg 3</option>
        <option value="213" name="BP_TORSOCAP_BRAIN">Torso Cap | Brain</option>

        <option value="230" name="SBP_230_HEAD">Skyrim, Head slot, use for neck on character head</option>

        <option value="1000" name="BP_TORSOSECTION_HEAD">Torso Section | Head</option>
        <option value="2000" name="BP_TORSOSECTION_HEAD2">Torso Section | Head 2</option>
        <option value="3000" name="BP_TORSOSECTION_LEFTARM">Torso Section | Left Arm</option>
        <option value="4000" name="BP_TORSOSECTION_LEFTARM2">Torso Section | Left Arm 2</option>
        <option value="5000" name="BP_TORSOSECTION_RIGHTARM">Torso Section | Right Arm</option>
        <option value="6000" name="BP_TORSOSECTION_RIGHTARM2">Torso Section | Right Arm 2</option>
        <option value="7000" name="BP_TORSOSECTION_LEFTLEG">Torso Section | Left Leg</option>
        <option value="8000" name="BP_TORSOSECTION_LEFTLEG2">Torso Section | Left Leg 2</option>
        <option value="9000" name="BP_TORSOSECTION_LEFTLEG3">Torso Section | Left Leg 3</option>
        <option value="10000" name="BP_TORSOSECTION_RIGHTLEG">Torso Section | Right Leg</option>
        <option value="11000" name="BP_TORSOSECTION_RIGHTLEG2">Torso Section | Right Leg 2</option>
        <option value="12000" name="BP_TORSOSECTION_RIGHTLEG3">Torso Section | Right Leg 3</option>
        <option value="13000" name="BP_TORSOSECTION_BRAIN">Torso Section | Brain</option>       
    </enum>
	
    <enum name="BSLightingShaderType" storage="uint" prefix="ST" versions="#SKY_AND_LATER#">
        Values for configuring the shader type in a BSLightingShaderProperty
        <option value="0" name="Default" />
        <option value="1" name="Environment Map">Enables EnvMap Mask(TS6), EnvMap Scale</option>
        <option value="2" name="Glow Shader">Enables Glow(TS3)</option>
        <option value="3" name="Parallax">Enables Height(TS4)</option>
        <option value="4" name="Face Tint">Enables Detail(TS4), Tint(TS7)</option>
        <option value="5" name="Skin Tint">Enables Skin Tint Color</option>
        <option value="6" name="Hair Tint">Enables Hair Tint Color</option>
        <option value="7" name="Parallax Occ">Enables Height(TS4), Max Passes, Scale. Unimplemented.</option>
        <option value="8" name="Multitexture Landscape" />
        <option value="9" name="LOD Landscape" />
        <option value="10" name="Snow" />
        <option value="11" name="MultiLayer Parallax">Enables EnvMap Mask(TS6), Layer(TS7), Parallax Layer Thickness, Parallax Refraction Scale, Parallax Inner Layer U Scale, Parallax Inner Layer V Scale, EnvMap Scale</option>
        <option value="12" name="Tree Anim" />
        <option value="13" name="LOD Objects" />
        <option value="14" name="Sparkle Snow">Enables SparkleParams</option>
        <option value="15" name="LOD Objects HD" />
        <option value="16" name="Eye Envmap">Enables EnvMap Mask(TS6), Eye EnvMap Scale</option>
        <option value="17" name="Cloud" />
        <option value="18" name="LOD Landscape Noise" />
        <option value="19" name="Multitexture Landscape LOD Blend" />
        <option value="20" name="FO4 Dismemberment" />
    </enum>

    <enum name="BSLightingShaderType155" storage="uint" prefix="ST" versions="#F76#">
        Values for configuring the shader type in a BSLightingShaderProperty
        <option value="0" name="Default" />
        <option value="2" name="Glow" />
        <option value="3" name="Face Tint" />
        <option value="4" name="Skin Tint" />
        <option value="5" name="Hair Tint" />
    </enum>

    <enum name="EffectShaderControlledVariable" storage="uint" prefix="ESCV" versions="#SKY_AND_LATER#">
        An unsigned 32-bit integer, describing which float variable in BSEffectShaderProperty to animate.
        <option value="0" name="EmissiveMultiple">EmissiveMultiple.</option>
        <option value="1" name="Falloff Start Angle">Falloff Start Angle (degrees).</option>
        <option value="2" name="Falloff Stop Angle">Falloff Stop Angle (degrees).</option>
        <option value="3" name="Falloff Start Opacity">Falloff Start Opacity.</option>
        <option value="4" name="Falloff Stop Opacity">Falloff Stop Opacity.</option>
        <option value="5" name="Alpha Transparency">Alpha Transparency (Emissive alpha?).</option>
        <option value="6" name="U Offset">U Offset.</option>
        <option value="7" name="U Scale">U Scale.</option>
        <option value="8" name="V Offset">V Offset.</option>
        <option value="9" name="V Scale">V Scale.</option>
        <option value="11" name="Unknown 11" />
        <option value="12" name="Unknown 12" />
        <option value="13" name="Unknown 13" />
        <option value="14" name="Unknown 14" />
    </enum>

    <enum name="EffectShaderControlledColor" storage="uint" prefix="ECSC" versions="#SKY_AND_LATER#">
        An unsigned 32-bit integer, describing which color in BSEffectShaderProperty to animate.
        <option value="0" name="Emissive Color">Emissive Color.</option>
    </enum>

    <enum name="LightingShaderControlledFloat" storage="uint" prefix="LSCF" versions="#SKY_AND_LATER#">
        An unsigned 32-bit integer, describing which float variable in BSLightingShaderProperty to animate.
        <option value="0" name="Refraction Strength">The amount of distortion.</option>
        <option value="4" name="Unknown 4" />
        <option value="8" name="Environment Map Scale">Environment Map Scale.</option>
        <option value="9" name="Glossiness">Glossiness.</option>
        <option value="10" name="Specular Strength">Specular Strength.</option>
        <option value="11" name="Emissive Multiple">Emissive Multiple.</option>
        <option value="12" name="Alpha">Alpha.</option>
        <option value="13" name="Unknown 13" />
        <option value="14" name="Unknown 14" />
        <option value="20" name="U Offset">U Offset.</option>
        <option value="21" name="U Scale">U Scale.</option>
        <option value="22" name="V Offset">V Offset.</option>
        <option value="23" name="V Scale">V Scale.</option>
    </enum>

    <enum name="LightingShaderControlledUShort" storage="uint" prefix="LSCU" versions="#SKY_AND_LATER#">
        An unsigned 32-bit integer, describing which integral value in BSLightingShaderProperty to animate.
        <option value="0" name="Unknown 1" />
        <option value="1" name="Unknown 2" />
    </enum>

    <enum name="LightingShaderControlledColor" storage="uint" prefix="LSCC" versions="#SKY_AND_LATER#">
        An unsigned 32-bit integer, describing which color in BSLightingShaderProperty to animate.
        <option value="0" name="Specular Color">Specular Color.</option>
        <option value="1" name="Emissive Color">Emissive Color.</option>
    </enum>

    <enum name="hkConstraintType" storage="uint" versions="#BETHESDA#">
        hkpConstraintData::ConstraintType. Describes the type of bhkConstraint.
        <option value="0" name="BallAndSocket">A ball and socket constraint.</option>
        <option value="1" name="Hinge">A hinge constraint.</option>
        <option value="2" name="Limited Hinge">A limited hinge constraint.</option>
        <option value="6" name="Prismatic">A prismatic constraint.</option>
        <option value="7" name="Ragdoll">A ragdoll constraint.</option>
        <option value="8" name="StiffSpring">A stiff spring constraint.</option>
        <option value="13" name="Malleable">A malleable constraint.</option>
    </enum>

    <enum name="FogFunction" storage="ushort">
        <option value="0" name="FOG_Z_LINEAR" />
        <option value="1" name="FOG_RANGE_SQ" />
        <option value="2" name="FOG_VERTEX_ALPHA" />
    </enum>

    <enum name="AnimType" storage="ushort">
        <option value="0" name="APP_TIME" />
        <option value="1" name="APP_INIT" />
    </enum>

    <enum name="DitherFlags" storage="ushort">
        Flags for NiDitherProperty
        <option value="0" name="DITHER_DISABLED" />
        <option value="1" name="DITHER_ENABLED" />
    </enum>

    <enum name="ShadeFlags" storage="ushort">
        Flags for NiShadeProperty
        <option value="0" name="SHADING_HARD" />
        <option value="1" name="SHADING_SMOOTH" />
    </enum>

    <enum name="SpecularFlags" storage="ushort">
        Flags for NiSpecularProperty
        <option value="0" name="SPECULAR_DISABLED" />
        <option value="1" name="SPECULAR_ENABLED" />
    </enum>

    <enum name="WireframeFlags" storage="ushort">
        Flags for NiWireframeProperty
        <option value="0" name="WIREFRAME_DISABLED" />
        <option value="1" name="WIREFRAME_ENABLED" />
    </enum>

    <enum name="GeomMorpherFlags" storage="ushort">
        Flags for NiGeomMorpherController
        <option value="0" name="UPDATE_NORMALS_DISABLED" />
        <option value="1" name="UPDATE_NORMALS_ENABLED" />
    </enum>

    <!-- Bitfields -->

    <bitfield name="TimeControllerFlags" storage="ushort">
        Flags for NiTimeController
        <member width="1" pos="0" mask="0x0001" name="Anim Type" type="AnimType" />
        <member width="2" pos="1" mask="0x0006" name="Cycle Type" type="CycleType" default="CYCLE_CLAMP" />
        <member width="1" pos="3" mask="0x0008" name="Active" type="bool" default="1" />
        <member width="1" pos="4" mask="0x0010" name="Play Backwards" type="bool" />
        <member width="1" pos="5" mask="0x0020" name="Manager Controlled" type="bool" />
        <member width="1" pos="6" mask="0x0040" name="Compute Scaled Time" type="bool" default="1" />
        <member width="1" pos="7" mask="0x0080" name="Forced Update" type="bool" />
    </bitfield>

    <bitfield name="AlphaFlags" storage="ushort">
        Flags for NiAlphaProperty
        <member width="1" pos="0" mask="0x0001" name="Alpha Blend" type="bool" />
        <member width="4" pos="1" mask="0x001E" name="Source Blend Mode" type="AlphaFunction" default="SRC_ALPHA" />
        <member width="4" pos="5" mask="0x01E0" name="Destination Blend Mode" type="AlphaFunction" default="INV_SRC_ALPHA" />
        <member width="1" pos="9" mask="0x0200" name="Alpha Test" type="bool" default="1" />
        <member width="3" pos="10" mask="0x1C00" name="Test Func" type="TestFunction" default="TEST_GREATER" />
        <member width="1" pos="13" mask="0x2000" name="No Sorter" type="bool" />
        <member width="1" pos="14" mask="0x4000" name="Clone Unique" type="bool">Bethesda-only. Always true for weapon blood after FO3.</member>
        <member width="1" pos="15" mask="0x8000" name="Editor Alpha Threshold" type="bool">Bethesda-only. True if the Alpha Threshold is externally controlled.</member>
    </bitfield>

    <bitfield name="FogFlags" storage="ushort">
        Flags for NiFogProperty
        <member width="1" pos="0" mask="0x0001" name="Enable" type="bool" />
        <member width="3" pos="1" mask="0x0006" name="Fog Function" type="FogFunction" />
    </bitfield>

    <bitfield name="StencilFlags" storage="ushort">
        Flags for NiStencilProperty
        <member width="1" pos="0" mask="0x0001" name="Enable" type="bool" />
        <member width="3" pos="1" mask="0x000E" name="Fail Action" type="StencilAction" default="ACTION_KEEP" />
        <member width="3" pos="4" mask="0x0070" name="ZFail Action" type="StencilAction" default="ACTION_KEEP" />
        <member width="3" pos="7" mask="0x0380" name="Pass Action" type="StencilAction" default="ACTION_INCREMENT" />
        <member width="2" pos="10" mask="0x0C00" name="Draw Mode" type="StencilDrawMode" default="DRAW_BOTH" />
        <member width="3" pos="12" mask="0xF000" name="Test Func" type="StencilTestFunc" default="TEST_GREATER" />
    </bitfield>

    <bitfield name="TexturingFlags" storage="ushort">
        Flags for NiTexturingProperty
        <member width="1" pos="0" mask="0x0001" name="Multitexture" type="bool" />
        <member width="3" pos="1" mask="0x000E" name="Apply Mode" type="ApplyMode" />
        <member width="8" pos="4" mask="0x0FF0" name="Decal Count" type="ushort" />
    </bitfield>

    <bitfield name="TexturingMapFlags" storage="ushort">
        Flags for NiTexturingProperty
        <member width="8" pos="0" mask="0x00FF" name="Texture Index" type="ushort" />
        <member width="4" pos="8" mask="0x0F00" name="Filter Mode" type="TexFilterMode" />
        <member width="4" pos="12" mask="0x3000" name="Clamp Mode" type="TexClampMode" />
    </bitfield>

    <bitfield name="VertexColorFlags" storage="ushort">
        Flags for NiVertexColorProperty
        <member width="3" pos="0" mask="0x0007" name="Color Mode" type="ushort" />
        <member width="1" pos="3" mask="0x0008" name="Lighting Mode" type="LightingMode" />
        <member width="2" pos="4" mask="0x0030" name="Source Vertex Mode" type="SourceVertexMode" />
    </bitfield>

    <bitfield name="ZBufferFlags" storage="ushort">
        Flags for NiZBufferProperty
        <member width="1" pos="0" mask="0x0001" name="ZBuffer Test" type="bool" />
        <member width="1" pos="1" mask="0x0002" name="ZBuffer Write" type="bool" />
        <member width="3" pos="2" mask="0x003C" name="Test Func" type="TestFunction" />
    </bitfield>

    <enum name="AGDConsistencyType" storage="byte">
        <option value="0" name="AGD_MUTABLE" />
        <option value="1" name="AGD_STATIC" />
        <option value="2" name="AGD_VOLATILE" />
    </enum>

    <bitfield name="NiAGDDataStreamFlags" storage="byte">
        Flags for NiAGDDataStream
        <member width="1" pos="0" mask="0x0001" name="Keep" type="bool" />
        <member width="3" pos="1" mask="0x0006" name="Consistency Type" type="AGDConsistencyType" default="AGD_MUTABLE" />
    </bitfield>

    <enum name="NiNBTMethod" storage="ushort">
        <option value="0" name="NBT_METHOD_NONE" />
        <option value="1" name="NBT_METHOD_NDL" />
        <option value="2" name="NBT_METHOD_MAX" />
        <option value="3" name="NBT_METHOD_ATI" />
    </enum>

    <bitfield name="NiGeometryDataFlags" storage="ushort">
        <member width="6" pos="0" mask="0x003F" name="Num UV Sets" type="bool" />
        <member width="6" pos="6" mask="0x0FC0" name="Havok Material" type="ushort">Unused for non-Bethesda, non-bhk NiGeometryData.</member>
        <member width="2" pos="12" mask="0xF000" name="NBT Method" type="NiNBTMethod" />
    </bitfield>

    <bitfield name="BSGeometryDataFlags" storage="ushort">
        <member width="6" pos="0" mask="0x0001" name="Has UV" type="bool" />
        <member width="6" pos="6" mask="0x0FC0" name="Havok Material" type="ushort" />
        <member width="1" pos="12" mask="0x1000" name="Has Tangents" type="bool" />
    </bitfield>

    <bitfield name="CollisionFilterFlags" storage="byte">
        <member width="5" pos="0" mask="0x001F" name="Biped Part" type="BipedPart">Used only if the Layer is 8 (or 32/33 for Skyrim and later).</member>
        <member width="1" pos="5" mask="0x0020" name="MOPP Scaled" type="bool" />
        <member width="1" pos="6" mask="0x0040" name="No Collision" type="bool" />
        <member width="1" pos="7" mask="0x0080" name="Linked Group" type="bool">If Layer is CHARCONTROLLER (CC), true means "CC Trigger Only".</member>
    </bitfield>


    <!--Compounds
        These are like C structures and are used as sub-parts of more complex
        classes when there are multiple pieces of data repeated in an array.-->

    <compound name="SizedString">
        A string of given length.
        <field name="Length" type="uint">The string length.</field>
        <field name="Value" type="char" length="Length">The string itself.</field>
    </compound>

    <compound name="SizedString16">
        A string of given length, using a ushort to store string length.
        <field name="Length" type="ushort">The string length.</field>
        <field name="Value" type="char" length="Length">The string itself.</field>
    </compound>

    <compound name="string">
        A string type.
        <field name="String" type="SizedString" until="20.0.0.5">The normal string.</field>
        <field name="Index" type="NiFixedString" since="20.1.0.3">The string index.</field>
    </compound>

    <compound name="NiTFixedStringMapItem" generic="true">
        Currently, #T# must be a basic type due to nif.xml restrictions.
        <field name="String" type="NiFixedString" />
        <field name="Value" type="#T#" />
    </compound>

    <compound name="NiTFixedStringMap" generic="true">
        A mapping or hash table between NiFixedString keys and a generic value.
        Currently, #T# must be a basic type due to nif.xml restrictions.
        <field name="Num Strings" type="uint" />
        <field name="Strings" type="NiTFixedStringMapItem" template="#T#" length="Num Strings" />
    </compound>

    <compound name="ByteArray">
        An array of bytes.
        <field name="Data Size" type="uint">The number of bytes in this array</field>
        <field name="Data" type="byte" length="Data Size">The bytes which make up the array</field>
    </compound>

    <compound name="ByteMatrix">
        An array of bytes.
        <field name="Data Size 1" type="uint">The number of bytes in this array</field>
        <field name="Data Size 2" type="uint">The number of bytes in this array</field>
        <field name="Data" type="byte" length="Data Size 2" width="Data Size 1">The bytes which make up the array</field>
    </compound>

    <compound name="Color3" size="12">
        A color without alpha (red, green, blue).
        <field name="r" type="float">Red color component.</field>
        <field name="g" type="float">Green color component.</field>
        <field name="b" type="float">Blue color component.</field>
    </compound>

    <compound name="ByteColor3" size="3" convertible="Color3">
        A color without alpha (red, green, blue).
        <field name="r" type="byte">Red color component.</field>
        <field name="g" type="byte">Green color component.</field>
        <field name="b" type="byte">Blue color component.</field>
    </compound>

    <compound name="Color4" size="16">
        A color with alpha (red, green, blue, alpha).
        <field name="r" type="float">Red component.</field>
        <field name="g" type="float">Green component.</field>
        <field name="b" type="float">Blue component.</field>
        <field name="a" type="float">Alpha.</field>
    </compound>

    <compound name="ByteColor4" size="4" convertible="Color4">
        A color with alpha (red, green, blue, alpha).
        <field name="r" type="byte">Red color component.</field>
        <field name="g" type="byte">Green color component.</field>
        <field name="b" type="byte">Blue color component.</field>
        <field name="a" type="byte">Alpha color component.</field>
    </compound>

    <compound name="FilePath">
        A string that contains the path to a file.
        <field name="String" type="SizedString" until="20.0.0.5">The normal string.</field>
        <field name="Index" type="NiFixedString" since="20.1.0.3">The string index.</field>
    </compound>

    <compound name="Footer">
        The NIF file footer.
        <field name="Num Roots" type="uint" since="3.3.0.13">The number of root references.</field>
        <field name="Roots" type="Ref" template="NiObject" length="Num Roots" since="3.3.0.13">List of root NIF objects. If there is a camera, for 1st person view, then this NIF object is referred to as well in this list, even if it is not a root object (usually we want the camera to be attached to the Bip Head node).</field>
    </compound>

    <compound name="LODRange">
        The distance range where a specific level of detail applies.
        <field name="Near Extent" type="float">Begining of range.</field>
        <field name="Far Extent" type="float">End of Range.</field>
        <field name="Unknown Ints" type="uint" length="3" until="3.1" />
    </compound>

    <compound name="MatchGroup">
        Group of vertex indices of vertices that match.
        <field name="Num Vertices" type="ushort">Number of vertices in this group.</field>
        <field name="Vertex Indices" type="ushort" length="Num Vertices">The vertex indices.</field>
    </compound>
    
    <compound name="Vector3" size="12">
        A vector in 3D space (x,y,z).
        <field name="x" type="float">First coordinate.</field>
        <field name="y" type="float">Second coordinate.</field>
        <field name="z" type="float">Third coordinate.</field>
    </compound>
    
    <compound name="HalfVector3" size="6" convertible="Vector3">
        A vector in 3D space (x,y,z).
        <field name="x" type="hfloat">First coordinate.</field>
        <field name="y" type="hfloat">Second coordinate.</field>
        <field name="z" type="hfloat">Third coordinate.</field>
    </compound>

    <compound name="ByteVector3" size="3" convertible="Vector3">
        A vector in 3D space (x,y,z).
        <field name="x" type="byte">First coordinate.</field>
        <field name="y" type="byte">Second coordinate.</field>
        <field name="z" type="byte">Third coordinate.</field>
    </compound>

    <compound name="Vector4" size="16">
        A 4-dimensional vector.
        <field name="x" type="float">First coordinate.</field>
        <field name="y" type="float">Second coordinate.</field>
        <field name="z" type="float">Third coordinate.</field>
        <field name="w" type="float">Fourth coordinate.</field>
    </compound>

    <compound name="Quaternion" size="16">
        A quaternion.
        <field name="w" type="float" default="1.0">The w-coordinate.</field>
        <field name="x" type="float" default="0.0">The x-coordinate.</field>
        <field name="y" type="float" default="0.0">The y-coordinate.</field>
        <field name="z" type="float" default="0.0">The z-coordinate.</field>
    </compound>

    <compound name="hkQuaternion" size="16" versions="#BETHESDA#">
        A quaternion as it appears in the havok objects.
        <field name="x" type="float" default="0.0">The x-coordinate.</field>
        <field name="y" type="float" default="0.0">The y-coordinate.</field>
        <field name="z" type="float" default="0.0">The z-coordinate.</field>
        <field name="w" type="float" default="1.0">The w-coordinate.</field>
    </compound>

    <compound name="Matrix22" size="16">
        A 2x2 matrix of float values.  Stored in OpenGL column-major format.
        <field name="m11" type="float" default="1.0">Member 1,1 (top left)</field>
        <field name="m21" type="float" default="0.0">Member 2,1 (bottom left)</field>
        <field name="m12" type="float" default="0.0">Member 1,2 (top right)</field>
        <field name="m22" type="float" default="1.0">Member 2,2 (bottom right)</field>
    </compound>

    <compound name="Matrix33" size="36">
        A 3x3 rotation matrix; M^T M=identity, det(M)=1.    Stored in OpenGL column-major format.
        <field name="m11" type="float" default="1.0">Member 1,1 (top left)</field>
        <field name="m21" type="float" default="0.0">Member 2,1</field>
        <field name="m31" type="float" default="0.0">Member 3,1 (bottom left)</field>
        <field name="m12" type="float" default="0.0">Member 1,2</field>
        <field name="m22" type="float" default="1.0">Member 2,2</field>
        <field name="m32" type="float" default="0.0">Member 3,2</field>
        <field name="m13" type="float" default="0.0">Member 1,3 (top right)</field>
        <field name="m23" type="float" default="0.0">Member 2,3</field>
        <field name="m33" type="float" default="1.0">Member 3,3 (bottom left)</field>
    </compound>

    <compound name="Matrix34" size="48">
        A 3x4 transformation matrix.
        <field name="m11" type="float" default="1.0">The (1,1) element.</field>
        <field name="m21" type="float" default="0.0">The (2,1) element.</field>
        <field name="m31" type="float" default="0.0">The (3,1) element.</field>
        <field name="m12" type="float" default="0.0">The (1,2) element.</field>
        <field name="m22" type="float" default="1.0">The (2,2) element.</field>
        <field name="m32" type="float" default="0.0">The (3,2) element.</field>
        <field name="m13" type="float" default="0.0">The (1,3) element.</field>
        <field name="m23" type="float" default="0.0">The (2,3) element.</field>
        <field name="m33" type="float" default="1.0">The (3,3) element.</field>
        <field name="m14" type="float" default="0.0">The (1,4) element.</field>
        <field name="m24" type="float" default="0.0">The (2,4) element.</field>
        <field name="m34" type="float" default="0.0">The (3,4) element.</field>
    </compound>

    <compound name="Matrix44" size="64">
        A 4x4 transformation matrix.
        <field name="m11" type="float" default="1.0">The (1,1) element.</field>
        <field name="m21" type="float" default="0.0">The (2,1) element.</field>
        <field name="m31" type="float" default="0.0">The (3,1) element.</field>
        <field name="m41" type="float" default="0.0">The (4,1) element.</field>
        <field name="m12" type="float" default="0.0">The (1,2) element.</field>
        <field name="m22" type="float" default="1.0">The (2,2) element.</field>
        <field name="m32" type="float" default="0.0">The (3,2) element.</field>
        <field name="m42" type="float" default="0.0">The (4,2) element.</field>
        <field name="m13" type="float" default="0.0">The (1,3) element.</field>
        <field name="m23" type="float" default="0.0">The (2,3) element.</field>
        <field name="m33" type="float" default="1.0">The (3,3) element.</field>
        <field name="m43" type="float" default="0.0">The (4,3) element.</field>
        <field name="m14" type="float" default="0.0">The (1,4) element.</field>
        <field name="m24" type="float" default="0.0">The (2,4) element.</field>
        <field name="m34" type="float" default="0.0">The (3,4) element.</field>
        <field name="m44" type="float" default="1.0">The (4,4) element.</field>
    </compound>

    <compound name="hkMatrix3" size="48" versions="#BETHESDA#">
        A 3x3 Havok matrix stored in 4x3 due to memory alignment.
        <field name="m11" type="float" default="1.0" />
        <field name="m12" type="float" />
        <field name="m13" type="float" />
        <field name="m14" type="float">Unused</field>
        <field name="m21" type="float" />
        <field name="m22" type="float" default="1.0" />
        <field name="m23" type="float" />
        <field name="m24" type="float">Unused</field>
        <field name="m31" type="float" />
        <field name="m32" type="float" />
        <field name="m33" type="float" default="1.0" />
        <field name="m34" type="float">Unused</field>
    </compound>

    <compound name="MipMap" size="12">
        Description of a mipmap within an NiPixelData object.
        <field name="Width" type="uint">Width of the mipmap image.</field>
        <field name="Height" type="uint">Height of the mipmap image.</field>
        <field name="Offset" type="uint">Offset into the pixel data array where this mipmap starts.</field>
    </compound>

    <compound name="NodeSet">
        A set of NiNode references.
        <field name="Num Nodes" type="uint">Number of node references that follow.</field>
        <field name="Nodes" type="Ptr" template="NiNode" length="Num Nodes">The list of NiNode references.</field>
    </compound>

    <compound name="ExportString">
        Specific to Bethesda-specific header export strings.
        <field name="Length" type="byte">The string length.</field>
        <field name="Value" type="char" length="Length">The string itself, null terminated (the null terminator is taken into account in the length byte).</field>
    </compound>

    <compound name="SkinInfo" size="8" since="V4_2_2_0">
        NiBoneLODController::SkinInfo. Reference to shape and skin instance.
        <field name="Shape" type="Ptr" template="NiTriBasedGeom" />
        <field name="Skin Instance" type="Ref" template="NiSkinInstance" />
    </compound>

    <compound name="SkinInfoSet" since="V4_2_2_0">
        A set of NiBoneLODController::SkinInfo.
        <field name="Num Skin Info" type="uint" />
        <field name="Skin Info" type="SkinInfo" length="Num Skin Info" />
    </compound>

    <compound name="BoneVertData" size="6">
        NiSkinData::BoneVertData. A vertex and its weight.
        <field name="Index" type="ushort">The vertex index, in the mesh.</field>
        <field name="Weight" type="float" range="#F0_1#">The vertex weight - between 0.0 and 1.0</field>
    </compound>

    <compound name="AVObject">
        Used in NiDefaultAVObjectPalette.
        <field name="Name" type="SizedString">Object name.</field>
        <field name="AV Object" type="Ptr" template="NiAVObject">Object reference.</field>
    </compound>

    <compound name="ControlledBlock">
        In a .kf file, this links to a controllable object, via its name (or for version 10.2.0.0 and up, a link and offset to a NiStringPalette that contains the name), and a sequence of interpolators that apply to this controllable object, via links.
        For Controller ID, NiInterpController::GetCtlrID() virtual function returns a string formatted specifically for the derived type.
        For Interpolator ID, NiInterpController::GetInterpolatorID() virtual function returns a string formatted specifically for the derived type.
        The string formats are documented on the relevant niobject blocks.
        <field name="Target Name" type="SizedString" until="10.1.0.103">Name of a controllable object in another NIF file.</field>
        <!-- NiControllerSequence::InterpArrayItem -->
        <field name="Interpolator" type="Ref" template="NiInterpolator" since="10.1.0.106" />
        <field name="Controller" type="Ref" template="NiTimeController" until="20.5.0.0" />
        <field name="Blend Interpolator" type="Ref" template="NiBlendInterpolator" since="10.1.0.104" until="10.1.0.110" />
        <field name="Blend Index" type="ushort" since="10.1.0.104" until="10.1.0.110" />
        <field name="Priority" type="byte" since="10.1.0.106" vercond="#BSSTREAM#">Idle animations tend to have low values for this, and high values tend to correspond with the important parts of the animations.</field>
        <!-- NiControllerSequence::IDTag, post-10.1.0.104 only -->
        <field name="Node Name" type="string" since="10.1.0.104" until="10.1.0.113">The name of the animated NiAVObject.</field>
        <field name="Property Type" type="string" since="10.1.0.104" until="10.1.0.113">The RTTI type of the NiProperty the controller is attached to, if applicable.</field>
        <field name="Controller Type" type="string" since="10.1.0.104" until="10.1.0.113">The RTTI type of the NiTimeController.</field>
        <field name="Controller ID" type="string" since="10.1.0.104" until="10.1.0.113">An ID that can uniquely identify the controller among others of the same type on the same NiObjectNET.</field>
        <field name="Interpolator ID" type="string" since="10.1.0.104" until="10.1.0.113">An ID that can uniquely identify the interpolator among others of the same type on the same NiObjectNET.</field>
        <!-- From 10.2 to 20.1 -->
        <field name="String Palette" type="Ref" template="NiStringPalette" since="10.2.0.0" until="20.1.0.0">Refers to the NiStringPalette which contains the name of the controlled NIF object.</field>
        <field name="Node Name Offset" type="StringOffset" since="10.2.0.0" until="20.1.0.0">Offset in NiStringPalette to the name of the animated NiAVObject.</field>
        <field name="Property Type Offset" type="StringOffset" since="10.2.0.0" until="20.1.0.0">Offset in NiStringPalette to the RTTI type of the NiProperty the controller is attached to, if applicable.</field>
        <field name="Controller Type Offset" type="StringOffset" since="10.2.0.0" until="20.1.0.0">Offset in NiStringPalette to the RTTI type of the NiTimeController.</field>
        <field name="Controller ID Offset" type="StringOffset" since="10.2.0.0" until="20.1.0.0">Offset in NiStringPalette to an ID that can uniquely identify the controller among others of the same type on the same NiObjectNET.</field>
        <field name="Interpolator ID Offset" type="StringOffset" since="10.2.0.0" until="20.1.0.0">Offset in NiStringPalette to an ID that can uniquely identify the interpolator among others of the same type on the same NiObjectNET.</field>
        <!-- After 20.1 -->
        <field name="Node Name" type="string" since="20.1.0.1">The name of the animated NiAVObject.</field>
        <field name="Property Type" type="string" since="20.1.0.1">The RTTI type of the NiProperty the controller is attached to, if applicable.</field>
        <field name="Controller Type" type="string" since="20.1.0.1">The RTTI type of the NiTimeController.</field>
        <field name="Controller ID" type="string" since="20.1.0.1">An ID that can uniquely identify the controller among others of the same type on the same NiObjectNET.</field>
        <field name="Interpolator ID" type="string" since="20.1.0.1">An ID that can uniquely identify the interpolator among others of the same type on the same NiObjectNET.</field>
    </compound>

    <compound name="BSStreamHeader" versions="#BETHESDA#">
    	Information about how the file was exported
        <field name="BS Version" type="ulittle32" />
        <field name="Author" type="ExportString" />
        <field name="Unknown Int" type="uint" cond="BS Version #GT# 130" />
        <field name="Process Script" type="ExportString" />
        <field name="Export Script" type="ExportString" />
        <field name="Max Filepath" type="ExportString" cond="BS Version == 130" />
    </compound>

    <!-- Don't use vercond in Header, it breaks niflib -->
    <compound name="Header">
        The NIF file header.
        <field name="Header String" type="HeaderString">'NetImmerse File Format x.x.x.x' (versions &lt;= 10.0.1.2) or 'Gamebryo File Format x.x.x.x' (versions &gt;= 10.1.0.0), with x.x.x.x the version written out. Ends with a newline character (0x0A).</field>
        <field name="Copyright" type="LineString" length="3" until="3.1.0.0" />
        <field name="Version" type="FileVersion" default="0x04000002" since="3.1.0.1">The NIF version, in hexadecimal notation: 0x04000002, 0x0401000C, 0x04020002, 0x04020100, 0x04020200, 0x0A000100, 0x0A010000, 0x0A020000, 0x14000004, ...</field>
        <field name="Endian Type" type="EndianType" default="ENDIAN_LITTLE" since="20.0.0.3">Determines the endianness of the data in the file.</field>
        <field name="User Version" type="ulittle32" since="10.0.1.8">An extra version number, for companies that decide to modify the file format.</field>
        <field name="Num Blocks" type="ulittle32" since="3.1.0.1">Number of file objects.</field>
        <field name="BS Header" type="BSStreamHeader" cond="#BSSTREAMHEADER#" />
        <field name="Metadata" type="ByteArray" since="30.0.0.0" />
        <field name="Num Block Types" type="ushort" since="5.0.0.1">Number of object types in this NIF file.</field>
        <field name="Block Types" type="SizedString" length="Num Block Types" since="5.0.0.1" cond="Version != 20.3.1.2">List of all object types used in this NIF file.</field>
        <field name="Block Type Hashes" type="uint" length="Num Block Types" since="20.3.1.2" until="20.3.1.2">List of all object types used in this NIF file.</field>
        <field name="Block Type Index" type="BlockTypeIndex" length="Num Blocks" since="5.0.0.1">Maps file objects on their corresponding type: first file object is of type object_types[object_type_index[0]], the second of object_types[object_type_index[1]], etc.</field>
        <field name="Block Size" type="uint" length="Num Blocks" since="20.2.0.5">Array of block sizes</field>
        <field name="Num Strings" type="uint" since="20.1.0.1">Number of strings.</field>
        <field name="Max String Length" type="uint" since="20.1.0.1">Maximum string length.</field>
        <field name="Strings" type="SizedString" length="Num Strings" since="20.1.0.1">Strings.</field>
        <field name="Num Groups" type="uint" default="0" since="5.0.0.6" />
        <field name="Groups" type="uint" length="Num Groups" since="5.0.0.6" />
    </compound>

    <compound name="StringPalette">
        A list of \\0 terminated strings.
        <field name="Palette" type="SizedString">A bunch of 0x00 seperated strings.</field>
        <field name="Length" type="uint">Length of the palette string is repeated here.</field>
    </compound>

    <compound name="TBC" size="12">
        Tension, bias, continuity.
        <field name="t" type="float">Tension.</field>
        <field name="b" type="float">Bias.</field>
        <field name="c" type="float">Continuity.</field>
    </compound>

    <compound name="Key" generic="true">
        A generic key with support for interpolation. Type 1 is normal linear interpolation, type 2 has forward and backward tangents, and type 3 has tension, bias and continuity arguments. Note that color4 and byte always seem to be of type 1.
        <field name="Time" type="float">Time of the key.</field>
        <field name="Value" type="#T#">The key value.</field>
        <field name="Forward" type="#T#" cond="#ARG# == 2">Key forward tangent.</field>
        <field name="Backward" type="#T#" cond="#ARG# == 2">The key backward tangent.</field>
        <field name="TBC" type="TBC" cond="#ARG# == 3">The TBC of the key.</field>
    </compound>

    <compound name="KeyGroup" generic="true">
        Array of vector keys (anything that can be interpolated, except rotations).
        <field name="Num Keys" type="uint">Number of keys in the array.</field>
        <field name="Interpolation" type="KeyType" cond="Num Keys != 0">The key type.</field>
        <field name="Keys" type="Key" arg="Interpolation" template="#T#" length="Num Keys">The keys.</field>
    </compound>

    <compound name="QuatKey" generic="true">
        A special version of the key type used for quaternions. Never has tangents. #T# should always be Quaternion.
        <field name="Time" type="float" until="10.1.0.0">Time the key applies.</field>
        <field name="Time" type="float" cond="#ARG# != 4" since="10.1.0.106">Time the key applies.</field>
        <field name="Value" type="#T#" cond="#ARG# != 4">Value of the key.</field>
        <field name="TBC" type="TBC" cond="#ARG# == 3">The TBC of the key.</field>
    </compound>

    <compound name="TexCoord" size="8">
        Texture coordinates (u,v). As in OpenGL; image origin is in the lower left corner.
        <field name="u" type="float" range="#FPM_100#">First coordinate.</field>
        <field name="v" type="float" range="#FPM_100#">Second coordinate.</field>
    </compound>
    
    <compound name="HalfTexCoord" size="4">
        Texture coordinates (u,v).
        <field name="u" type="hfloat" range="#FPM_10#">First coordinate.</field>
        <field name="v" type="hfloat" range="#FPM_10#">Second coordinate.</field>
    </compound>
    
    <enum name="TransformMethod" storage="uint" prefix="TM">
        Describes the order of scaling and rotation matrices. Translate, Scale, Rotation, Center are from TexDesc.
        Back = inverse of Center. FromMaya = inverse of the V axis with a positive translation along V of 1 unit.
        <option value="0" name="Maya Deprecated">Center * Rotation * Back * Translate * Scale</option>
        <option value="1" name="Max">Center * Scale * Rotation * Translate * Back</option>
        <option value="2" name="Maya">Center * Rotation * Back * FromMaya * Translate * Scale</option>
    </enum>

    <compound name="TexDesc">
        NiTexturingProperty::Map. Texture description.
        <field name="Image" type="Ref" template="NiImage" until="3.1">Link to the texture image.</field>
        <field name="Source" type="Ref" template="NiSourceTexture" since="3.3.0.13">NiSourceTexture object index.</field>
        <field name="Clamp Mode" type="TexClampMode" default="WRAP_S_WRAP_T" until="20.0.0.5">0=clamp S clamp T, 1=clamp S wrap T, 2=wrap S clamp T, 3=wrap S wrap T</field>
        <field name="Filter Mode" type="TexFilterMode" default="FILTER_TRILERP" until="20.0.0.5">0=nearest, 1=bilinear, 2=trilinear, 3=..., 4=..., 5=...</field>
        <field name="Flags" type="TexturingMapFlags" since="20.1.0.3">Texture mode flags; clamp and filter mode stored in upper byte with 0xYZ00 = clamp mode Y, filter mode Z.</field>
        <field name="Max Anisotropy" type="ushort" since="20.5.0.4" />
        <field name="UV Set" type="uint" default="0" until="20.0.0.5">The texture coordinate set in NiGeometryData that this texture slot will use.</field>
        <field name="PS2 L" type="short" default="0" until="10.4.0.1">L can range from 0 to 3 and are used to specify how fast a texture gets blurry.</field>
        <field name="PS2 K" type="short" default="-75" until="10.4.0.1">K is used as an offset into the mipmap levels and can range from -2047 to 2047. Positive values push the mipmap towards being blurry and negative values make the mipmap sharper.</field>
        <field name="Unknown Short 1" type="ushort" until="4.1.0.12" />
        <!-- NiTextureTransform -->
        <field name="Has Texture Transform" type="bool" default="false" since="10.1.0.0">Whether or not the texture coordinates are transformed.</field>
        <field name="Translation" type="TexCoord" cond="Has Texture Transform" since="10.1.0.0">The UV translation.</field>
        <field name="Scale" type="TexCoord" cond="Has Texture Transform" since="10.1.0.0" default="#VEC2_ONE#">The UV scale.</field>
        <field name="Rotation" type="float" default="0.0" cond="Has Texture Transform" since="10.1.0.0">The W axis rotation in texture space.</field>
        <field name="Transform Method" type="TransformMethod" cond="Has Texture Transform" since="10.1.0.0">Depending on the source, scaling can occur before or after rotation.</field>
        <field name="Center" type="TexCoord" cond="Has Texture Transform" since="10.1.0.0">The origin around which the texture rotates.</field>
    </compound>

    <compound name="ShaderTexDesc">
        NiTexturingProperty::ShaderMap. Shader texture description.
        <field name="Has Map" type="bool" />
        <field name="Map" type="TexDesc" cond="Has Map" />
        <field name="Map ID" type="uint" cond="Has Map">Unique identifier for the Gamebryo shader system.</field>
    </compound>

    <compound name="Triangle" size="6">
        List of three vertex indices.
        <field name="v1" type="ushort">First vertex index.</field>
        <field name="v2" type="ushort">Second vertex index.</field>
        <field name="v3" type="ushort">Third vertex index.</field>
    </compound>

    <bitflags name="VertexAttribute" storage="ushort" prefix="VF" versions="#SSE# #FO4# #F76#">
        The bits of BSVertexDesc that describe the enabled vertex attributes.
        <option bit="1" name="Vertex" />
        <option bit="2" name="UVs" />
        <option bit="3" name="UVs_2" />
        <option bit="4" name="Normals" />
        <option bit="5" name="Tangents" />
        <option bit="6" name="Vertex_Colors" />
        <option bit="7" name="Skinned" />
        <option bit="8" name="Land_Data" />
        <option bit="9" name="Eye_Data" />
        <option bit="10" name="Instance" />
        <option bit="11" name="Full_Precision" />
    </bitflags>

    <bitfield name="BSVertexDesc" storage="uint64" versions="#SSE# #FO4# #F76#">
        <member width="4" pos="0" mask="0xF" name="Vertex Data Size" type="uint" />
        <member width="4" pos="4" mask="0xF0" name="Dynamic Vertex Size" type="uint" />
        <member width="4" pos="8" mask="0xF00" name="UV1 Offset" type="uint" />
        <member width="4" pos="12" mask="0xF000" name="UV2 Offset" type="uint" />
        <member width="4" pos="16" mask="0xF0000" name="Normal Offset" type="uint" />
        <member width="4" pos="20" mask="0xF00000" name="Tangent Offset" type="uint" />
        <member width="4" pos="24" mask="0xF000000" name="Color Offset" type="uint" />
        <member width="4" pos="28" mask="0xF0000000" name="Skinning Data Offset" type="uint" />
        <member width="4" pos="32" mask="0xF00000000" name="Landscape Data Offset" type="uint" />
        <member width="4" pos="36" mask="0xF000000000" name="Eye Data Offset" type="uint" />
        <member width="4" pos="40" mask="0xF0000000000" name="Unused 01" type="uint" />
        <member width="12" pos="44" mask="0xFFF00000000000" name="Vertex Attributes" type="VertexAttribute" />
    </bitfield>

	<compound name="BSVertexData" versions="#SSE# #FO4# #F76#">
		<field name="Vertex" type="Vector3" cond="(#ARG# #BITAND# 0x401) == 0x401" />
		<field name="Bitangent X" type="float" cond="(#ARG# #BITAND# 0x411) == 0x411" />
		<field name="Unused W" type="uint" cond="(#ARG# #BITAND# 0x411) == 0x401" />

		<field name="Vertex" type="HalfVector3" cond="(#ARG# #BITAND# 0x401) == 0x1" />
		<field name="Bitangent X" type="hfloat" cond="(#ARG# #BITAND# 0x411) == 0x11" />
		<field name="Unused W" type="ushort" cond="(#ARG# #BITAND# 0x411) == 0x1" />

		<field name="UV" type="HalfTexCoord" cond="#ARG# #BITAND# 0x2" />
		<field name="Normal" type="ByteVector3" cond="#ARG# #BITAND# 0x8" />
		<field name="Bitangent Y" type="byte" cond="#ARG# #BITAND# 0x8" />
		<field name="Tangent" type="ByteVector3" cond="(#ARG# #BITAND# 0x18) == 0x18" />
		<field name="Bitangent Z" type="byte" cond="(#ARG# #BITAND# 0x18) == 0x18" />
		<field name="Vertex Colors" type="ByteColor4" cond="#ARG# #BITAND# 0x20" />
		<field name="Bone Weights" type="hfloat" length="4" cond="#ARG# #BITAND# 0x40" />
		<field name="Bone Indices" type="byte" length="4" cond="#ARG# #BITAND# 0x40" />
		<field name="Eye Data" type="float" cond="#ARG# #BITAND# 0x100" />
	</compound>

	<compound name="BSVertexDataSSE" versions="#SSE# #FO4#">
		<field name="Vertex" type="Vector3" cond="#ARG# #BITAND# 0x1" />
		<field name="Bitangent X" type="float" cond="(#ARG# #BITAND# 0x11) == 0x11" />
		<field name="Unused W" type="uint" cond="(#ARG# #BITAND# 0x11) == 0x1" />
		<field name="UV" type="HalfTexCoord" cond="#ARG# #BITAND# 0x2" />
		<field name="Normal" type="ByteVector3" cond="#ARG# #BITAND# 0x8" />
		<field name="Bitangent Y" type="byte" cond="#ARG# #BITAND# 0x8" />
		<field name="Tangent" type="ByteVector3" cond="(#ARG# #BITAND# 0x18) == 0x18" />
		<field name="Bitangent Z" type="byte" cond="(#ARG# #BITAND# 0x18) == 0x18" />
		<field name="Vertex Colors" type="ByteColor4" cond="#ARG# #BITAND# 0x20" />
		<field name="Bone Weights" type="hfloat" length="4" cond="#ARG# #BITAND# 0x40" />
		<field name="Bone Indices" type="byte" length="4" cond="#ARG# #BITAND# 0x40" />
		<field name="Eye Data" type="float" cond="#ARG# #BITAND# 0x100" />
	</compound>

    <compound name="SkinPartition" since="V4_2_1_0">
        Skinning data for a submesh, optimized for hardware skinning. Part of NiSkinPartition.
        <field name="Num Vertices" type="ushort">Number of vertices in this submesh.</field>
        <field name="Num Triangles" type="ushort" calc="(#LEN2[Strips]# #GT# 0) #THEN# (#LEN2[Strips]# - 2) #ELSE# (#LEN[Triangles]#)">Number of triangles in this submesh.</field>
        <field name="Num Bones" type="ushort">Number of bones influencing this submesh.</field>
        <field name="Num Strips" type="ushort">Number of strips in this submesh (zero if not stripped).</field>
        <field name="Num Weights Per Vertex" type="ushort" default="4">Number of weight coefficients per vertex. The Gamebryo engine seems to work well only if this number is equal to 4, even if there are less than 4 influences per vertex.</field>
        <field name="Bones" type="ushort" length="Num Bones">List of bones.</field>
        <field name="Has Vertex Map" type="bool" since="10.1.0.0">Do we have a vertex map?</field>
        <field name="Vertex Map" type="ushort" length="Num Vertices" until="10.0.1.2">Maps the weight/influence lists in this submesh to the vertices in the shape being skinned.</field>
        <field name="Vertex Map" type="ushort" length="Num Vertices" cond="Has Vertex Map" since="10.1.0.0">Maps the weight/influence lists in this submesh to the vertices in the shape being skinned.</field>
        <field name="Has Vertex Weights" type="bool" since="10.1.0.0">Do we have vertex weights?</field>
        <field name="Vertex Weights" type="float" length="Num Vertices" width="Num Weights Per Vertex" until="10.0.1.2">The vertex weights.</field>
        <field name="Vertex Weights" type="float" length="Num Vertices" width="Num Weights Per Vertex" cond="Has Vertex Weights" since="10.1.0.0">The vertex weights.</field>
        <field name="Strip Lengths" type="ushort" length="Num Strips">The strip lengths.</field>
        <field name="Has Faces" type="bool" calc="(#LEN[Strips]# #ADD# #LEN[Triangles]# #GT# 0) #THEN# 1 #ELSE# 0" since="10.1.0.0">Do we have triangle or strip data?</field>
        <field name="Strips" type="ushort" length="Num Strips" width="Strip Lengths" cond="Num Strips != 0" until="10.0.1.2">The strips.</field>
        <field name="Strips" type="ushort" length="Num Strips" width="Strip Lengths" cond="(Has Faces) #AND# (Num Strips != 0)" since="10.1.0.0">The strips.</field>
        <field name="Triangles" type="Triangle" length="Num Triangles" cond="Num Strips == 0" until="10.0.1.2">The triangles.</field>
        <field name="Triangles" type="Triangle" length="Num Triangles" cond="(Has Faces) #AND# (Num Strips == 0)" since="10.1.0.0">The triangles.</field>
        <field name="Has Bone Indices" type="bool">Do we have bone indices?</field>
        <field name="Bone Indices" type="byte" length="Num Vertices" width="Num Weights Per Vertex" cond="Has Bone Indices">Bone indices, they index into 'Bones'.</field>
        <field name="LOD Level" type="byte" since="20.2.0.7" until="20.2.0.7" vercond="#BS_GT_FO3#" />
        <field name="Global VB" type="bool" since="20.2.0.7" until="20.2.0.7" vercond="#BS_GT_FO3#" />
		<field name="Vertex Desc" type="BSVertexDesc" since="20.2.0.7" until="20.2.0.7" vercond="#BS_SSE#" />
		<field name="Triangles Copy" type="Triangle" length="Num Triangles" since="20.2.0.7" until="20.2.0.7" vercond="#BS_SSE#" />
    </compound>

    <compound name="NiPlane" size="16">
        A plane.
        <field name="Normal" type="Vector3">The plane normal.</field>
        <field name="Constant" type="float">The plane constant.</field>
    </compound>

    <compound name="NiBoundAABB" size="26">
        Divinity 2 specific NiBound extension.
        <field name="Num Corners" type="ushort" default="2" />
        <field name="Corners" type="Vector3" length="2">Corners are only non-zero if Num Corners is 2. Hardcoded to 2.</field>
    </compound>

    <compound name="NiBound">
        A sphere.
        <field name="Center" type="Vector3">The sphere's center.</field>
        <field name="Radius" type="float">The sphere's radius.</field>
        <field name="DIV2 AABB" type="NiBoundAABB" since="20.3.0.9" until="20.3.0.9" vercond="#DIVINITY2#" />
    </compound>

    <compound name="NiCurve3">
        A 3D curve made up of control points and knots.
        <field name="Degree" type="uint" />
        <field name="Num Control Points" type="uint" />
        <field name="Control Points" type="Vector3" length="Num Control Points" />
        <field name="Num Knots" type="uint" />
        <field name="Knots" type="float" length="Num Knots" />
    </compound>

    <compound name="NiQuatTransform">
        <field name="Translation" type="Vector3" />
        <field name="Rotation" type="Quaternion" />
        <field name="Scale" type="float" default="1.0" />
        <field name="TRS Valid" type="bool" length="3" until="10.1.0.109">Whether each transform component is valid.</field>
    </compound>

    <compound name="NiTransform" size="52">
        <field name="Rotation" type="Matrix33">The rotation part of the transformation matrix.</field>
        <field name="Translation" type="Vector3">The translation vector.</field>
        <field name="Scale" type="float" default="1.0">Scaling part (only uniform scaling is supported).</field>
    </compound>

	<bitflags name="FurnitureEntryPoints" storage="ushort" versions="#BETHESDA#">
		Bethesda Animation. Furniture entry points. It specifies the direction(s) from where the actor is able to enter (and leave) the position.
		<option bit="0" name="Front">front entry point</option>
		<option bit="1" name="Behind">behind entry point</option>
		<option bit="2" name="Right">right entry point</option>
		<option bit="3" name="Left">left entry point</option>
		<option bit="4" name="Up">up entry point - unknown function. Used on some beds in Skyrim, probably for blocking of sleeping position.</option>
	</bitflags>

	<enum name="AnimationType" storage="ushort" versions="#BETHESDA#">
		Bethesda Animation. Animation type used on this position. This specifies the function of this position.
		<option value="1" name="Sit">Actor use sit animation.</option>
		<option value="2" name="Sleep">Actor use sleep animation.</option>
		<option value="4" name="Lean">Used for lean animations?</option>
	</enum>

    <compound name="FurniturePosition" versions="#BETHESDA#">
        Bethesda Animation. Describes a furniture position?
        <field name="Offset" type="Vector3">Offset of furniture marker.</field>
        <field name="Orientation" type="ushort" vercond="#NI_BS_LTE_FO3#">Furniture marker orientation.</field>
        <field name="Position Ref 1" type="byte" vercond="#NI_BS_LTE_FO3#">Refers to a furnituremarkerxx.nif file. Always seems to be the same as Position Ref 2.</field>
        <field name="Position Ref 2" type="byte" vercond="#NI_BS_LTE_FO3#">Refers to a furnituremarkerxx.nif file. Always seems to be the same as Position Ref 1.</field>
        <field name="Heading" type="float" vercond="#BS_GT_FO3#">Similar to Orientation, in float form.</field>
        <field name="Animation Type" type="AnimationType" vercond="#BS_GT_FO3#" />
        <field name="Entry Properties" type="FurnitureEntryPoints" vercond="#BS_GT_FO3#" />
    </compound>

    <compound name="TriangleData" versions="#BETHESDA#">
        Bethesda Havok. A triangle with extra data used for physics.
        <field name="Triangle" type="Triangle">The triangle.</field>
        <field name="Welding Info" type="ushort">Additional havok information on how triangles are welded.</field>
        <field name="Normal" type="Vector3" until="20.0.0.5">This is the triangle's normal.</field>
    </compound>

    <compound name="Morph">
        Geometry morphing data component.
        <field name="Frame Name" type="string" since="10.1.0.106">Name of the frame.</field>
        <field name="Num Keys" type="uint" until="10.1.0.0">The number of morph keys that follow.</field>
        <field name="Interpolation" type="KeyType" until="10.1.0.0">Unlike most objects, the presense of this value is not conditional on there being keys.</field>
        <field name="Keys" type="Key" arg="Interpolation" template="float" length="Num Keys" until="10.1.0.0">The morph key frames.</field>
        <field name="Legacy Weight" type="float" since="10.1.0.104" until="20.1.0.2" vercond="#BSVER# #LT# 10" />
        <field name="Vectors" type="Vector3" length="#ARG#">Morph vectors.</field>
    </compound>

    <compound name="NiParticleInfo" size="40">
        Called NiPerParticleData in NiOldParticles.
        Holds the state of a particle at the time the system was saved.
        <field name="Velocity" type="Vector3">Particle direction and speed.</field>
        <field name="Rotation Axis" type="Vector3" until="10.4.0.1" />
        <field name="Age" type="float" />
        <field name="Life Span" type="float" />
        <field name="Last Update" type="float">Timestamp of the last update.</field>
        <field name="Spawn Generation" type="ushort" default="0" />
        <field name="Code" type="ushort">Usually matches array index</field>
    </compound>

    <compound name="BoneData">
        NiSkinData::BoneData. Skinning data component.
        <field name="Skin Transform" type="NiTransform">Offset of the skin from this bone in bind position.</field>
        <field name="Bounding Sphere" type="NiBound">Note that its a Sphere Containing Axis Aligned Box not a minimum volume Sphere</field>
        <field name="Num Vertices" type="ushort">Number of weighted vertices.</field>
        <field name="Vertex Weights" type="BoneVertData" length="Num Vertices" until="4.2.1.0">The vertex weights.</field>
        <field name="Vertex Weights" type="BoneVertData" length="Num Vertices" since="4.2.2.0" cond="#ARG# != 0">The vertex weights.</field>
    </compound>

    <compound name="HavokFilter" size="4" versions="#BETHESDA#">
        Bethesda Havok. Collision filter info representing Layer, Flags, Part Number, and Group all combined into one uint.
        <field name="Layer" suffix="OB" type="OblivionLayer" default="OL_STATIC" until="20.0.0.5" vercond="#BSVER# #LT# 16">The layer the collision belongs to.</field>
        <field name="Layer" suffix="FO" type="Fallout3Layer" default="FOL_STATIC" vercond="(#VER# == 20.2.0.7) #AND# #NI_BS_LTE_FO3#">The layer the collision belongs to.</field>
        <field name="Layer" suffix="SK" type="SkyrimLayer" default="SKYL_STATIC" vercond="(#VER# == 20.2.0.7) #AND# #BS_GT_FO3#">The layer the collision belongs to.</field>
        <field name="Flags" type="CollisionFilterFlags" default="0" />
        <field name="Group" type="ushort" />
    </compound>

    <compound name="HavokMaterial" versions="#BETHESDA#">
        Bethesda Havok. Material wrapper for varying material enums by game.
        <field name="Unknown Int" type="uint" until="10.0.1.2" />
        <field name="Material" suffix="OB" type="OblivionHavokMaterial" until="20.0.0.5" vercond="#BSVER# #LT# 16">The material of the shape.</field>
        <field name="Material" suffix="FO" type="Fallout3HavokMaterial" vercond="(#VER# == 20.2.0.7) #AND# #NI_BS_LTE_FO3#">The material of the shape.</field>
        <field name="Material" suffix="SK" type="SkyrimHavokMaterial" vercond="(#VER# == 20.2.0.7) #AND# #BS_GT_FO3#">The material of the shape.</field>
    </compound>

    <compound name="hkSubPartData" versions="#BETHESDA#">
        Bethesda Havok. Havok Information for packed TriStrip shapes.
        <field name="Havok Filter" type="HavokFilter" />
        <field name="Num Vertices" type="uint">The number of vertices that form this sub shape.</field>
        <field name="Material" type="HavokMaterial">The material of the subshape.</field>
    </compound>

    <compound name="hkAabb" versions="#BETHESDA#">
        Havok AABB using min/max coordinates instead of center/half extents.
        <field name="Min" type="Vector4">Coordinates of the corner with the lowest numerical values.</field>
        <field name="Max" type="Vector4">Coordinates of the corner with the highest numerical values.</field>
    </compound>

    <enum name="ConstraintPriority" storage="uint" versions="#BETHESDA#">
        hkpConstraintInstance::ConstraintPriority. Priority used for the constraint.
        Values 2, 4, and 5 are unused or internal use only.
        <option value="0" name="PRIORITY_INVALID" />
        <option value="1" name="PRIORITY_PSI">Constraint is only solved at regular physics time steps.</option>
        <option value="3" name="PRIORITY_TOI">Constraint is also solved at time of impact events.</option>
    </enum>

    <compound name="bhkConstraintCInfo" size="16" versions="#BETHESDA#">
        Bethesda extension of hkpConstraintInstance.
        <field name="Num Entities" type="uint" default="2">Always 2 (Hardcoded). Number of bodies affected by this constraint.</field>
        <field name="Entity A" type="Ptr" template="bhkEntity">The entity affected by this constraint.</field>
        <field name="Entity B" type="Ptr" template="bhkEntity">The entity affected by this constraint.</field>
        <field name="Priority" type="ConstraintPriority" default="PRIORITY_PSI">Either PSI or TOI priority. TOI is higher priority.</field>
    </compound>

    <compound name="bhkConstraintChainCInfo" versions="#BETHESDA#">
        Bethesda extension of hkpConstraintChainInstance.
        <field name="Num Chained Entities" type="uint" />
        <field name="Chained Entities" type="Ptr" template="bhkRigidBody" length="Num Chained Entities" />
        <field name="Constraint Info" type="bhkConstraintCInfo" />
    </compound>

    <compound name="bhkPositionConstraintMotor" size="25" versions="#BETHESDA#">
        Bethesda extension of hkpPositionConstraintMotor.
        A motor which tries to reach a desired position/angle given a max force and recovery speed.
        This motor is a good choice for driving a ragdoll to a given pose.
        <field name="Min Force" type="float" default="-1000000.0">Minimum motor force</field>
        <field name="Max Force" type="float" default="1000000.0">Maximum motor force</field>
        <field name="Tau" type="float" default="0.8">Relative stiffness</field>
        <field name="Damping" type="float" default="1.0">Motor damping value</field>
        <field name="Proportional Recovery Velocity" type="float" default="2.0">A factor of the current error to calculate the recovery velocity</field>
        <field name="Constant Recovery Velocity" type="float" default="1.0">A constant velocity which is used to recover from errors</field>
        <field name="Motor Enabled" type="bool" default="0">Is Motor enabled</field>
    </compound>

    <compound name="bhkVelocityConstraintMotor" size="18" versions="#BETHESDA#">
        Bethesda extension of hkpVelocityConstraintMotor. Tries to reach and keep a desired target velocity.
        <field name="Min Force" type="float" default="-1000000.0">Minimum motor force</field>
        <field name="Max Force" type="float" default="1000000.0">Maximum motor force</field>
        <field name="Tau" type="float" default="0.0">Relative stiffness</field>
        <field name="Target Velocity" type="float" default="0.0" />
        <field name="Use Velocity Target" type="bool" default="0" />
        <field name="Motor Enabled" type="bool" default="0">Is Motor enabled</field>
    </compound>

    <compound name="bhkSpringDamperConstraintMotor" size="17" versions="#BETHESDA#">
        Bethesda extension of hkpSpringDamperConstraintMotor.
        Tries to reach a given target position using an angular spring which has a spring constant.
        <field name="Min Force" type="float" default="-1000000.0">Minimum motor force</field>
        <field name="Max Force" type="float" default="1000000.0">Maximum motor force</field>
        <field name="Spring Constant" type="float" default="0.0">The spring constant in N/m</field>
        <field name="Spring Damping" type="float" default="0.0">The spring damping in Nsec/m</field>
        <field name="Motor Enabled" type="bool" default="0">Is Motor enabled</field>
    </compound>
    
    <enum name="hkMotorType" storage="byte" versions="#BETHESDA#">
        <option value="0" name="MOTOR_NONE" />
        <option value="1" name="MOTOR_POSITION" />
        <option value="2" name="MOTOR_VELOCITY" />
        <option value="3" name="MOTOR_SPRING" />
    </enum>

    <compound name="bhkConstraintMotorCInfo" versions="#BETHESDA#">
        hkConstraintCinfo::SaveMotor(). Not a Bethesda extension of hkpConstraintMotor, but a wrapper for its serialization function. 
        <field name="Type" type="hkMotorType" default="MOTOR_NONE" />
        <field name="Position Motor" type="bhkPositionConstraintMotor" cond="Type == 1" />
        <field name="Velocity Motor" type="bhkVelocityConstraintMotor" cond="Type == 2" />
        <field name="Spring Damper Motor" type="bhkSpringDamperConstraintMotor" cond="Type == 3" />
    </compound>

    <compound name="bhkRagdollConstraintCInfo" versions="#BETHESDA#">
        Serialization data for bhkRagdollConstraint.
        The area of movement can be represented as a main cone + 2 orthogonal cones which may subtract from the main cone volume depending on limits.
        <!-- Oblivion and Fallout 3, Havok 550 -->
        <field name="Pivot A" type="Vector4" vercond="#NI_BS_LTE_16#">The point where the constraint is attached to its parent rigidbody.</field>
        <field name="Plane A" type="Vector4" vercond="#NI_BS_LTE_16#">Defines the orthogonal plane in which the body can move, the orthogonal directions in which the shape can be controlled (the direction orthogonal on this one and Twist A).</field>
        <field name="Twist A" type="Vector4" vercond="#NI_BS_LTE_16#">Central directed axis of the cone in which the object can rotate. Orthogonal on Plane A.</field>
        <field name="Pivot B" type="Vector4" vercond="#NI_BS_LTE_16#">The point where the constraint is attached to the other rigidbody.</field>
        <field name="Plane B" type="Vector4" vercond="#NI_BS_LTE_16#">Defines the orthogonal plane in which the shape can be controlled (the direction orthogonal on this one and Twist B).</field>
        <field name="Twist B" type="Vector4" vercond="#NI_BS_LTE_16#">Central directed axis of the cone in which the object can rotate. Orthogonal on Plane B.</field>

        <!-- Fallout 3 and later, Havok 660 and 2010 -->
        <field name="Twist A" type="Vector4" vercond="!#NI_BS_LTE_16#">Central directed axis of the cone in which the object can rotate. Orthogonal on Plane A.</field>
        <field name="Plane A" type="Vector4" vercond="!#NI_BS_LTE_16#">Defines the orthogonal plane in which the body can move, the orthogonal directions in which the shape can be controlled (the direction orthogonal on this one and Twist A).</field>
        <field name="Motor A" type="Vector4" vercond="!#NI_BS_LTE_16#">Defines the orthogonal directions in which the shape can be controlled (namely in this direction, and in the direction orthogonal on this one and Twist A).</field>
        <field name="Pivot A" type="Vector4" vercond="!#NI_BS_LTE_16#">Point around which the object will rotate. Defines the orthogonal directions in which the shape can be controlled (namely in this direction, and in the direction orthogonal on this one and Twist A).</field>
        <field name="Twist B" type="Vector4" vercond="!#NI_BS_LTE_16#">Central directed axis of the cone in which the object can rotate. Orthogonal on Plane B.</field>
        <field name="Plane B" type="Vector4" vercond="!#NI_BS_LTE_16#">Defines the orthogonal plane in which the body can move, the orthogonal directions in which the shape can be controlled (the direction orthogonal on this one and Twist A).</field>
        <field name="Motor B" type="Vector4" vercond="!#NI_BS_LTE_16#">Defines the orthogonal directions in which the shape can be controlled (namely in this direction, and in the direction orthogonal on this one and Twist A).</field>
        <field name="Pivot B" type="Vector4" vercond="!#NI_BS_LTE_16#">Defines the orthogonal directions in which the shape can be controlled (namely in this direction, and in the direction orthogonal on this one and Twist A).</field>

        <field name="Cone Max Angle" type="float">Maximum angle the object can rotate around the vector orthogonal on Plane A and Twist A relative to the Twist A vector. Note that Cone Min Angle is not stored, but is simply minus this angle.</field>
        <field name="Plane Min Angle" type="float">Minimum angle the object can rotate around Plane A, relative to Twist A.</field>
        <field name="Plane Max Angle" type="float">Maximum angle the object can rotate around Plane A, relative to Twist A.</field>
        <field name="Twist Min Angle" type="float">Minimum angle the object can rotate around Twist A, relative to Plane A.</field>
        <field name="Twist Max Angle" type="float">Maximum angle the object can rotate around Twist A, relative to Plane A.</field>
        <field name="Max Friction" type="float">Maximum friction, typically 0 or 10. In Fallout 3, typically 100.</field>

        <field name="Motor" type="bhkConstraintMotorCInfo" since="20.2.0.7" vercond="!#NI_BS_LTE_16#" />
    </compound>

    <compound name="bhkLimitedHingeConstraintCInfo" versions="#BETHESDA#">
        Serialization data for bhkLimitedHingeConstraint.
        This constraint allows rotation about a specified axis, limited by specified boundaries.
    
        <!-- Oblivion and Fallout 3, Havok 550 -->
        <field name="Pivot A" type="Vector4" vercond="#NI_BS_LTE_16#">Pivot point around which the object will rotate.</field>
        <field name="Axis A" type="Vector4" vercond="#NI_BS_LTE_16#">Axis of rotation.</field>
        <field name="Perp Axis In A1" type="Vector4" vercond="#NI_BS_LTE_16#">Vector in the rotation plane which defines the zero angle.</field>
        <field name="Perp Axis In A2" type="Vector4" vercond="#NI_BS_LTE_16#">Vector in the rotation plane, orthogonal on the previous one, which defines the positive direction of rotation. This is always the vector product of Axis A and Perp Axis In A1.</field>
        <field name="Pivot B" type="Vector4" vercond="#NI_BS_LTE_16#">Pivot A in second entity coordinate system.</field>
        <field name="Axis B" type="Vector4" vercond="#NI_BS_LTE_16#">Axis A in second entity coordinate system.</field>
        <field name="Perp Axis In B2" type="Vector4" vercond="#NI_BS_LTE_16#">Perp Axis In A2 in second entity coordinate system.</field>

        <!-- Fallout 3 and later, Havok 660 and 2010
             In reality Havok loads these as Transform A and Transform B using hkTransform -->
        <field name="Axis A" type="Vector4" vercond="!#NI_BS_LTE_16#">Axis of rotation.</field>
        <field name="Perp Axis In A1" type="Vector4" vercond="!#NI_BS_LTE_16#">Vector in the rotation plane which defines the zero angle.</field>
        <field name="Perp Axis In A2" type="Vector4" vercond="!#NI_BS_LTE_16#">Vector in the rotation plane, orthogonal on the previous one, which defines the positive direction of rotation. This is always the vector product of Axis A and Perp Axis In A1.</field>
        <field name="Pivot A" type="Vector4" vercond="!#NI_BS_LTE_16#">Pivot point around which the object will rotate.</field>
        <field name="Axis B" type="Vector4" vercond="!#NI_BS_LTE_16#">Axis A in second entity coordinate system.</field>
        <field name="Perp Axis In B1" type="Vector4" vercond="!#NI_BS_LTE_16#">Perp Axis In A1 in second entity coordinate system.</field>
        <field name="Perp Axis In B2" type="Vector4" vercond="!#NI_BS_LTE_16#">Perp Axis In A2 in second entity coordinate system.</field>
        <field name="Pivot B" type="Vector4" vercond="!#NI_BS_LTE_16#">Pivot A in second entity coordinate system.</field>

        <field name="Min Angle" type="float">Minimum rotation angle.</field>
        <field name="Max Angle" type="float">Maximum rotation angle.</field>
        <field name="Max Friction" type="float">Maximum friction, typically either 0 or 10. In Fallout 3, typically 100.</field>

        <field name="Motor" type="bhkConstraintMotorCInfo" since="20.2.0.7" vercond="!#NI_BS_LTE_16#" />
    </compound>

    <compound name="bhkHingeConstraintCInfo" versions="#BETHESDA#">
        Serialization data for bhkHingeConstraint. A basic hinge with no angular limits or motor.
        <!-- Oblivion -->
        <field name="Pivot A" type="Vector4" until="20.0.0.5">Pivot point around which the object will rotate.</field>
        <field name="Perp Axis In A1" type="Vector4" until="20.0.0.5">Vector in the rotation plane which defines the zero angle.</field>
        <field name="Perp Axis In A2" type="Vector4" until="20.0.0.5">Vector in the rotation plane, orthogonal on the previous one, which defines the positive direction of rotation.</field>
        <field name="Pivot B" type="Vector4" until="20.0.0.5">Pivot A in second entity coordinate system.</field>
        <field name="Axis B" type="Vector4" until="20.0.0.5">Axis A (vector orthogonal on Perp Axes) in second entity coordinate system.</field>

        <!-- Fallout 3 -->
        <field name="Axis A" type="Vector4" since="20.2.0.7">Axis of rotation.</field>
        <field name="Perp Axis In A1" type="Vector4" since="20.2.0.7">Vector in the rotation plane which defines the zero angle.</field>
        <field name="Perp Axis In A2" type="Vector4" since="20.2.0.7">Vector in the rotation plane, orthogonal on the previous one, which defines the positive direction of rotation. This is always the vector product of Axis A and Perp Axis In A1.</field>
        <field name="Pivot A" type="Vector4" since="20.2.0.7">Pivot point around which the object will rotate.</field>
        <field name="Axis B" type="Vector4" since="20.2.0.7">Axis A in second entity coordinate system.</field>
        <field name="Perp Axis In B1" type="Vector4" since="20.2.0.7">Perp Axis In A1 in second entity coordinate system.</field>
        <field name="Perp Axis In B2" type="Vector4" since="20.2.0.7">Perp Axis In A2 in second entity coordinate system.</field>
        <field name="Pivot B" type="Vector4" since="20.2.0.7">Pivot A in second entity coordinate system.</field>
    </compound>

    <compound name="bhkBallAndSocketConstraintCInfo" size="32" versions="#BETHESDA#">
        Serialization data for bhkBallAndSocketConstraint.
        Point-to-point constraint that attempts to keep the pivot point of two bodies in the same space.
        <field name="Pivot A" type="Vector4">Constraint pivot in Entity A space.</field>
        <field name="Pivot B" type="Vector4">Constraint pivot in Entity B space.</field>
    </compound>

    <compound name="bhkPrismaticConstraintCInfo" versions="#BETHESDA#">
        Serialization data for bhkPrismaticConstraint.
        Creates a rail between two bodies that allows translation along a single axis with linear limits and a motor.
        All three rotation axes and the remaining two translation axes are fixed.
        <!-- Oblivion -->
        <field name="Pivot A" type="Vector4" until="20.0.0.5">Pivot.</field>
        <field name="Rotation A" type="Vector4" until="20.0.0.5">Rotation axis.</field>
        <field name="Plane A" type="Vector4" until="20.0.0.5">Plane normal. Describes the plane the object is able to move on.</field>
        <field name="Sliding A" type="Vector4" until="20.0.0.5">Describes the axis the object is able to travel along. Unit vector.</field>
        <field name="Sliding B" type="Vector4" until="20.0.0.5">Describes the axis the object is able to travel along in B coordinates. Unit vector.</field>
        <field name="Pivot B" type="Vector4" until="20.0.0.5">Pivot in B coordinates.</field>
        <field name="Rotation B" type="Vector4" until="20.0.0.5">Rotation axis.</field>
        <field name="Plane B" type="Vector4" until="20.0.0.5">Plane normal. Describes the plane the object is able to move on in B coordinates.</field>
        
        <!-- Fallout 3 and later, Havok 660 and 2010
             In reality Havok loads these as Transform A and Transform B using hkTransform -->
        <field name="Sliding A" type="Vector4" since="20.2.0.7">Describes the axis the object is able to travel along. Unit vector.</field>
        <field name="Rotation A" type="Vector4" since="20.2.0.7">Rotation axis.</field>
        <field name="Plane A" type="Vector4" since="20.2.0.7">Plane normal. Describes the plane the object is able to move on.</field>
        <field name="Pivot A" type="Vector4" since="20.2.0.7">Pivot.</field>
        <field name="Sliding B" type="Vector4" since="20.2.0.7">Describes the axis the object is able to travel along in B coordinates. Unit vector.</field>
        <field name="Rotation B" type="Vector4" since="20.2.0.7">Rotation axis.</field>
        <field name="Plane B" type="Vector4" since="20.2.0.7">Plane normal. Describes the plane the object is able to move on in B coordinates.</field>
        <field name="Pivot B" type="Vector4" since="20.2.0.7">Pivot in B coordinates.</field>

        <field name="Min Distance" type="float">Describe the min distance the object is able to travel.</field>
        <field name="Max Distance" type="float">Describe the max distance the object is able to travel.</field>
        <field name="Friction" type="float">Friction.</field>

        <field name="Motor" type="bhkConstraintMotorCInfo" since="20.2.0.7" vercond="!#NI_BS_LTE_16#" />
    </compound>

    <compound name="bhkStiffSpringConstraintCInfo" size="36" versions="#BETHESDA#">
        bhkStiffSpringConstraint serialization data. Holds two bodies at a specified distance from one another.
        <field name="Pivot A" type="Vector4" />
        <field name="Pivot B" type="Vector4" />
        <field name="Length" type="float" />
    </compound>

    <compound name="OldSkinData" size="18">
        Used to store skin weights in NiTriShapeSkinController.
        <field name="Vertex Weight" type="float">The amount that this bone affects the vertex.</field>
        <field name="Vertex Index" type="ushort">The index of the vertex that this weight applies to.</field>
        <field name="Unknown Vector" type="Vector3" />
    </compound>

    <enum name="ImageType" storage="uint">
        Determines how the raw image data is stored in NiRawImageData.
        <option value="1" name="RGB">Colors store red, blue, and green components.</option>
        <option value="2" name="RGBA">Colors store red, blue, green, and alpha components.</option>
    </enum>

    <compound name="BoxBV" size="60">
        Box Bounding Volume
        <field name="Center" type="Vector3" />
        <field name="Axis" type="Vector3" length="3" />
        <field name="Extent" type="Vector3" />
    </compound>

    <compound name="CapsuleBV" size="32">
        Capsule Bounding Volume
        <field name="Center" type="Vector3" />
        <field name="Origin" type="Vector3" />
        <field name="Extent" type="float" />
        <field name="Radius" type="float" />
    </compound>

    <compound name="HalfSpaceBV" size="28">
        <field name="Plane" type="NiPlane" />
        <field name="Center" type="Vector3" />
    </compound>

    <compound name="BoundingVolume">
        <field name="Collision Type" type="BoundVolumeType">Type of collision data.</field>
        <field name="Sphere" type="NiBound" cond="Collision Type == 0" />
        <field name="Box" type="BoxBV" cond="Collision Type == 1" />
        <field name="Capsule" type="CapsuleBV" cond="Collision Type == 2" />
        <!--<field name="Union BV" type="UnionBV" cond="Collision Type == 4" />-->
        <field name="Half Space" type="HalfSpaceBV" cond="Collision Type == 5" />
    </compound>

    <compound name="UnionBV">
        <field name="Num BV" type="uint" />
        <field name="Bounding Volumes" type="BoundingVolume" length="Num BV" />
    </compound>

    <compound name="MorphWeight" size="8">
        <field name="Interpolator" type="Ref" template="NiInterpolator" />
        <field name="Weight" type="float" />
    </compound>

    <compound name="BoneTransform" size="40">
        Transformation data for the bone at this index in bhkPoseArray.
        <field name="Translation" type="Vector3" />
        <field name="Rotation" type="hkQuaternion" />
        <field name="Scale" type="Vector3" />
    </compound>

    <compound name="BonePose" versions="#FO3_AND_LATER#">
        A list of transforms for each bone in bhkPoseArray.
        <field name="Num Transforms" type="uint" />
        <field name="Transforms" type="BoneTransform" length="Num Transforms" />
    </compound>

    <compound name="DecalVectorArray" versions="#FO3_AND_LATER#">
        Array of Vectors for Decal placement in BSDecalPlacementVectorExtraData.
        <field name="Num Vectors" type="ushort" />
        <field name="Points" type="Vector3" length="Num Vectors">Vector XYZ coords</field>
        <field name="Normals" type="Vector3" length="Num Vectors">Vector Normals</field>
    </compound>

    <bitflags name="BSPartFlag" storage="ushort" versions="#BETHESDA#">
        Editor flags for the Body Partitions. 
        <option bit="0" name="PF_EDITOR_VISIBLE">Visible in Editor</option>
        <option bit="8" name="PF_START_NET_BONESET">Start a new shared boneset.  It is expected this BoneSet and the following sets in the Skin Partition will have the same bones.</option>
    </bitflags>

    <compound name="BodyPartList" size="4" versions="#BETHESDA#">
        Body part list for DismemberSkinInstance
        <field name="Part Flag" type="BSPartFlag" default="257">Flags related to the Body Partition</field>
        <field name="Body Part" type="BSDismemberBodyPartType">Body Part Index</field>
    </compound>
    
    <compound name="BoneLOD" size="8" versions="#SKY_AND_LATER#">
        Stores Bone Level of Detail info in a BSBoneLODExtraData
        <field name="Distance" type="uint" />
        <field name="Bone Name" type="NiFixedString" />
    </compound>

    <compound name="bhkMeshMaterial" size="8" versions="#SKY_AND_LATER#">
        hkpBSMaterial, a subclass of hkpMeshMaterial. hkpMeshMaterial is a base class for material info for hkMeshShapes.
        <field name="Material" type="SkyrimHavokMaterial" />
        <field name="Filter" type="HavokFilter" />
    </compound>

    <compound name="bhkCMSBigTri" size="12" versions="#SKY_AND_LATER#">
        Bethesda extension of hkpCompressedMeshShape::BigTriangle. Triangles that don't fit the maximum size.
        <field name="Triangle" type="Triangle" />
        <field name="Material" type="uint" />
        <field name="Welding Info" type="ushort" />
    </compound>
    
    <compound name="bhkQsTransform" size="32" versions="#SKY_AND_LATER#">
        Bethesda extension of hkQsTransform. The scale vector is not serialized.
        <field name="Translation" type="Vector4">A vector that moves the chunk by the specified amount. W is not used.</field>
        <field name="Rotation" type="hkQuaternion">Rotation. Reference point for rotation is bhkRigidBody translation.</field>
    </compound>
    
    <compound name="bhkCMSChunk" versions="#SKY_AND_LATER#">
        Bethesda extension of hkpCompressedMeshShape::Chunk. A compressed chunk of hkpCompressedMeshShape geometry.
        <field name="Translation" type="Vector4" />
        <field name="Material Index" type="uint">Index of material in bhkCompressedMeshShapeData::Chunk Materials</field>
        <field name="Reference" type="ushort" default="#USHRT_MAX#">Index of another chunk in the chunks list.</field>
        <field name="Transform Index" type="ushort">Index of transformation in bhkCompressedMeshShapeData::Chunk Transforms</field>
        <field name="Num Vertices" type="uint" />
        <field name="Vertices" type="ushort" length="Num Vertices" />
        <field name="Num Indices" type="uint" />
        <field name="Indices" type="ushort" length="Num Indices" />
        <field name="Num Strips" type="uint" />
        <field name="Strips" type="ushort" length="Num Strips" />
        <field name="Num Welding Info" type="uint" />
        <field name="Welding Info" type="ushort" length="Num Welding Info" />
    </compound>

    <compound name="bhkMalleableConstraintCInfo" versions="#BETHESDA#">
        bhkMalleableConstraint serialization data. A constraint wrapper used to soften or harden constraints.
        <field name="Type" type="hkConstraintType">Type of constraint.</field>
        <field name="Constraint Info" type="bhkConstraintCInfo" />
        <field name="Ball and Socket" type="bhkBallAndSocketConstraintCInfo" cond="Type == 0" />
        <field name="Hinge" type="bhkHingeConstraintCInfo" cond="Type == 1" />
        <field name="Limited Hinge" type="bhkLimitedHingeConstraintCInfo" cond="Type == 2" />
        <field name="Prismatic" type="bhkPrismaticConstraintCInfo" cond="Type == 6" />
        <field name="Ragdoll" type="bhkRagdollConstraintCInfo" cond="Type == 7" />
        <field name="Stiff Spring" type="bhkStiffSpringConstraintCInfo" cond="Type == 8" />
        <field name="Tau" type="float" until="20.0.0.5" />
        <field name="Damping" type="float" until="20.0.0.5" />
        <field name="Strength" type="float" since="20.2.0.7" />
    </compound>

    <compound name="bhkWrappedConstraintData" versions="#BETHESDA#">
        A constraint wrapper for polymorphic hkpConstraintData serialization.
        <field name="Type" type="hkConstraintType">Type of constraint.</field>
        <field name="Constraint Info" type="bhkConstraintCInfo" />
        <field name="Ball and Socket" type="bhkBallAndSocketConstraintCInfo" cond="Type == 0" />
        <field name="Hinge" type="bhkHingeConstraintCInfo" cond="Type == 1" />
        <field name="Limited Hinge" type="bhkLimitedHingeConstraintCInfo" cond="Type == 2" />
        <field name="Prismatic" type="bhkPrismaticConstraintCInfo" cond="Type == 6" />
        <field name="Ragdoll" type="bhkRagdollConstraintCInfo" cond="Type == 7" />
        <field name="Stiff Spring" type="bhkStiffSpringConstraintCInfo" cond="Type == 8" />
        <field name="Malleable" type="bhkMalleableConstraintCInfo" cond="Type == 13" />
    </compound>

    <!-- NIF Objects
         These are the main units of data that NIF files are arranged in.
         They are like C classes and can contain many pieces of data.
         The only differences between these and compounds is that these
         are treated as object types by the NIF format and can inherit
         from other classes.-->

    <niobject name="NiObject" abstract="true" module="NiMain">
        Abstract object type.
    </niobject>

    <niobject name="Ni3dsAlphaAnimator" inherit="NiObject" module="NiLegacy" versions="V2_3">
        Unknown.
        <field name="Unknown 1" type="byte" length="40" />
        <field name="Parent" type="Ref" template="NiObject" />
        <field name="Num 1" type="uint" />
        <field name="Num 2" type="uint" />
        <field name="Unknown 2" type="uint" length="Num 1 * Num 2" width="2" />
    </niobject>

    <niobject name="Ni3dsAnimationNode" inherit="NiObject" module="NiLegacy" versions="V2_3">
        Unknown. Only found in 2.3 nifs.
        <field name="Name" type="SizedString">Name of this object.</field>
        <field name="Has Data" type="bool" />
        <field name="Unknown Floats 1" type="float" length="21" cond="Has Data" />
        <field name="Unknown Short" type="ushort" cond="Has Data" />
        <field name="Child" type="Ref" template="NiObject" cond="Has Data" />
        <field name="Unknown Floats 2" type="float" length="12" cond="Has Data" />
        <field name="Count" type="uint" cond="Has Data">A count.</field>
        <field name="Unknown Array" type="byte" length="Count" width="5" cond="Has Data" />
    </niobject>

    <niobject name="Ni3dsColorAnimator" inherit="NiObject" module="NiLegacy" versions="V2_3">
        Unknown!
        <field name="Unknown 1" type="byte" length="184" />
    </niobject>

    <niobject name="Ni3dsMorphShape" inherit="NiObject" module="NiLegacy" versions="V2_3">
        Unknown!
        <field name="Unknown 1" type="byte" length="14" />
    </niobject>

    <niobject name="Ni3dsParticleSystem" inherit="NiObject" module="NiLegacy" versions="V2_3">
        Unknown!
        <field name="Unknown 1" type="byte" length="14" />
    </niobject>

    <niobject name="Ni3dsPathController" inherit="NiObject" module="NiLegacy" versions="V2_3">
        Unknown!
        <field name="Unknown 1" type="byte" length="20" />
    </niobject>


    <niobject name="NiParticleModifier" abstract="true" inherit="NiObject" module="NiLegacy" until="V10_0_1_0">
        LEGACY (pre-10.1). Abstract base class for particle system modifiers.
        <field name="Next Modifier" type="Ref" template="NiParticleModifier">Next particle modifier.</field>
        <field name="Controller" type="Ptr" template="NiParticleSystemController" since="3.3.0.13">Points to the particle system controller parent.</field>
    </niobject>

    <niobject name="NiPSysCollider" abstract="true" inherit="NiObject" module="NiParticle">
        Particle system collider.
        <field name="Bounce" type="float" default="1.0">Amount of bounce for the collider.</field>
        <field name="Spawn on Collide" type="bool">Spawn particles on impact?</field>
        <field name="Die on Collide" type="bool">Kill particles on impact?</field>
        <field name="Spawn Modifier" type="Ref" template="NiPSysSpawnModifier">Spawner to use for the collider.</field>
        <field name="Parent" type="Ptr" template="NiPSysColliderManager">Link to parent.</field>
        <field name="Next Collider" type="Ref" template="NiPSysCollider">The next collider.</field>
        <field name="Collider Object" type="Ptr" template="NiAVObject">The object whose position and orientation are the basis of the collider.</field>
    </niobject>

    <enum name="BroadPhaseType" storage="byte" versions="#BETHESDA#">
        <option value="0" name="BROAD_PHASE_INVALID" />
        <option value="1" name="BROAD_PHASE_ENTITY" />
        <option value="2" name="BROAD_PHASE_PHANTOM" />
        <option value="3" name="BROAD_PHASE_BORDER" />
    </enum>

    <niobject name="bhkRefObject" abstract="true" inherit="NiObject" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkReferencedObject, the base for all classes in the Havok SDK.
    </niobject>

    <niobject name="bhkSerializable" abstract="true" inherit="bhkRefObject" module="BSHavok" versions="#BETHESDA#">
        Bethesda class to combine NiObject and hkReferencedObject so that Havok classes can be read/written with NiStream.
    </niobject>

    <compound name="bhkWorldObjCInfoProperty" size="12" versions="#BETHESDA#">
        hkWorldObjectCinfo::Property struct
        <field name="Data" type="uint" default="0" />
        <field name="Size" type="uint" default="0" />
        <field name="Capacity and Flags" type="uint" default="0x80000000" />
    </compound>

    <compound name="bhkWorldObjectCInfo">
        <field name="Unused 01" type="byte" length="4" binary="true" />
        <field name="Broad Phase Type" type="BroadPhaseType" default="BROAD_PHASE_ENTITY" />
        <field name="Unused 02" type="byte" length="3" binary="true" />
        <field name="Property" type="bhkWorldObjCInfoProperty" />
    </compound>

    <niobject name="bhkWorldObject" abstract="true" inherit="bhkSerializable" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpWorldObject, the base class for hkpEntity and hkpPhantom.
        <field name="Shape" type="Ref" template="bhkShape">The shape for this collision object.</field>
        <field name="Unknown Int" type="uint" until="10.0.1.2" />
        <field name="Havok Filter" type="HavokFilter" />
        <field name="World Object Info" type="bhkWorldObjectCInfo" />
    </niobject>

    <niobject name="bhkPhantom" abstract="true" inherit="bhkWorldObject" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpPhantom. A Phantom is the core non-physical object in the system.
        Receives events when an overlap with another phantom or an entity begins or ends.
    </niobject>

    <niobject name="bhkAabbPhantom" inherit="bhkPhantom" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpAabbPhantom. A non-physical object made up of only an AABB.
            - Very fast as they use only broadphase collision detection.
            - Used for triggers/regions where a shape is not necessary.
        <field name="Unused 01" type="byte" length="8" binary="true" />
        <field name="AABB" type="hkAabb" />
    </niobject>

    <niobject name="bhkShapePhantom" abstract="true" inherit="bhkPhantom" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpShapePhantom, a base for hkpSimpleShapePhantom and hkpCachingShapePhantom.
    </niobject>

    <niobject name="bhkSimpleShapePhantom" inherit="bhkShapePhantom" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpSimpleShapePhantom. A Phantom with arbitrary shape and transform.
        Does not do any narrowphase caching, in contrast to hkpCachingShapePhantom.
        <field name="Unused 01" type="byte" length="8" binary="true" />
        <field name="Transform" type="Matrix44" />
    </niobject>

    <compound name="bhkEntityCInfo">
        <field name="Collision Response" type="hkResponseType" default="RESPONSE_SIMPLE_CONTACT">How the body reacts to collisions. See hkResponseType for hkpWorld default implementations.</field>
        <field name="Unused 01" type="byte" />
        <field name="Process Contact Callback Delay" type="ushort" default="0xffff">Lowers the frequency for processContactCallbacks. A value of 5 means that a callback is raised every 5th frame. The default is once every 65535 frames.</field>
    </compound>

    <niobject name="bhkEntity" abstract="true" inherit="bhkWorldObject" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpEntity. An Entity is the core physical object in the system.
        <field name="Entity Info" type="bhkEntityCInfo" />
    </niobject>

    <compound name="bhkRigidBodyCInfo550_660">
        <field name="Unused 01" type="byte" length="4" binary="true" since="10.1.0.0" />
        <field name="Havok Filter" type="HavokFilter" since="10.1.0.0" />
        <field name="Unused 02" type="byte" length="4" binary="true" since="10.1.0.0" />
        <field name="Collision Response" type="hkResponseType" default="RESPONSE_SIMPLE_CONTACT" since="10.1.0.0" />
        <field name="Unused 03" type="byte" since="10.1.0.0" />
        <field name="Process Contact Callback Delay" type="ushort" default="0xffff" since="10.1.0.0" />
        <field name="Unused 04" type="byte" length="4" binary="true" />
        <field name="Translation" type="Vector4"> A vector that moves the body by the specified amount. Only enabled in bhkRigidBodyT objects.</field>
        <field name="Rotation" type="hkQuaternion">The rotation Yaw/Pitch/Roll to apply to the body. Only enabled in bhkRigidBodyT objects.</field>
        <field name="Linear Velocity" type="Vector4">Linear velocity.</field>
        <field name="Angular Velocity" type="Vector4">Angular velocity.</field>
        <field name="Inertia Tensor" type="hkMatrix3">Defines how the mass is distributed among the body, i.e. how difficult it is to rotate around any given axis.</field>
        <field name="Center" type="Vector4">The body's center of mass.</field>
        <field name="Mass" type="float" default="1.0">The body's mass in kg. A mass of zero represents an immovable object.</field>
        <field name="Linear Damping" type="float" default="0.1">Reduces the movement of the body over time. A value of 0.1 will remove 10% of the linear velocity every second.</field>
        <field name="Angular Damping" type="float" default="0.05">Reduces the movement of the body over time. A value of 0.05 will remove 5% of the angular velocity every second.</field>
        <field name="Friction" type="float" default="0.5">How smooth its surfaces is and how easily it will slide along other bodies.</field>
        <field name="Restitution" type="float" default="0.4">
            How "bouncy" the body is, i.e. how much energy it has after colliding. Less than 1.0 loses energy, greater than 1.0 gains energy.
            If the restitution is not 0.0 the object will need extra CPU for all new collisions.
        </field>
        <field name="Max Linear Velocity" type="float" default="104.4" since="10.1.0.0">Maximal linear velocity.</field>
        <field name="Max Angular Velocity" type="float" default="31.57" since="10.1.0.0">Maximal angular velocity.</field>
        <field name="Penetration Depth" type="float" default="0.15" since="10.1.0.0">
            The maximum allowed penetration for this object.
            This is a hint to the engine to see how much CPU the engine should invest to keep this object from penetrating.
            A good choice is 5% - 20% of the smallest diameter of the object.
        </field>
        <field name="Motion System" type="hkMotionType" default="MO_SYS_DYNAMIC">Motion system? Overrides Quality when on Keyframed?</field>
        <field name="Deactivator Type" type="hkDeactivatorType" default="DEACTIVATOR_NEVER">The initial deactivator type of the body.</field>
        <field name="Solver Deactivation" type="hkSolverDeactivation" default="SOLVER_DEACTIVATION_OFF">How aggressively the engine will try to zero the velocity for slow objects. This does not save CPU.</field>
        <field name="Quality Type" type="hkQualityType" default="MO_QUAL_FIXED">The type of interaction with other objects.</field>
        <field name="Unused 05" type="byte" length="12" binary="true" />
    </compound>

    <compound name="bhkRigidBodyCInfo2010">
        <field name="Unused 01" type="byte" length="4" binary="true" />
        <field name="Havok Filter" type="HavokFilter" />
        <field name="Unused 02" type="byte" length="4" binary="true" />
        <field name="Unknown Int 1" type="uint" />
        <field name="Collision Response" type="hkResponseType" default="RESPONSE_SIMPLE_CONTACT" />
        <field name="Unused 03" type="byte" />
        <field name="Process Contact Callback Delay" type="ushort" default="0xffff" />
        <field name="Translation" type="Vector4"> A vector that moves the body by the specified amount. Only enabled in bhkRigidBodyT objects.</field>
        <field name="Rotation" type="hkQuaternion">The rotation Yaw/Pitch/Roll to apply to the body. Only enabled in bhkRigidBodyT objects.</field>
        <field name="Linear Velocity" type="Vector4">Linear velocity.</field>
        <field name="Angular Velocity" type="Vector4">Angular velocity.</field>
        <field name="Inertia Tensor" type="hkMatrix3">Defines how the mass is distributed among the body, i.e. how difficult it is to rotate around any given axis.</field>
        <field name="Center" type="Vector4">The body's center of mass.</field>
        <field name="Mass" type="float" default="1.0">The body's mass in kg. A mass of zero represents an immovable object.</field>
        <field name="Linear Damping" type="float" default="0.1">Reduces the movement of the body over time. A value of 0.1 will remove 10% of the linear velocity every second.</field>
        <field name="Angular Damping" type="float" default="0.05">Reduces the movement of the body over time. A value of 0.05 will remove 5% of the angular velocity every second.</field>
        <field name="Time Factor" type="float" default="1.0" />
        <field name="Gravity Factor" type="float" default="1.0" />
        <field name="Friction" type="float" default="0.5">How smooth its surfaces is and how easily it will slide along other bodies.</field>
        <field name="Rolling Friction Multiplier" type="float" />
        <field name="Restitution" type="float" default="0.4">
            How "bouncy" the body is, i.e. how much energy it has after colliding. Less than 1.0 loses energy, greater than 1.0 gains energy.
            If the restitution is not 0.0 the object will need extra CPU for all new collisions.
        </field>
        <field name="Max Linear Velocity" type="float" default="104.4">Maximal linear velocity.</field>
        <field name="Max Angular Velocity" type="float" default="31.57">Maximal angular velocity.</field>
        <field name="Penetration Depth" type="float" default="0.15">
            The maximum allowed penetration for this object.
            This is a hint to the engine to see how much CPU the engine should invest to keep this object from penetrating.
            A good choice is 5% - 20% of the smallest diameter of the object.
        </field>
        <field name="Motion System" type="hkMotionType" default="MO_SYS_DYNAMIC">Motion system? Overrides Quality when on Keyframed?</field>
        <field name="Enable Deactivation" type="bool" default="1" />
        <field name="Solver Deactivation" type="hkSolverDeactivation" default="SOLVER_DEACTIVATION_OFF">How aggressively the engine will try to zero the velocity for slow objects. This does not save CPU.</field>
        <field name="Quality Type" type="hkQualityType" default="MO_QUAL_FIXED">The type of interaction with other objects.</field>
        <field name="Auto Remove Level" type="byte" />
        <field name="Response Modifier Flags" type="byte" />
        <field name="Num Shape Keys in Contact Point" type="byte" default="3" />
        <field name="Force Collided Onto PPU" type="bool" />
        <field name="Unused 04" type="byte" length="12" binary="true" />
    </compound>

    <compound name="bhkRigidBodyCInfo2014">
        <field name="Unused 01" type="byte" length="4" binary="true" />
        <field name="Havok Filter" type="HavokFilter" />
        <field name="Unused 02" type="byte" length="12" binary="true" />
        <field name="Translation" type="Vector4"> A vector that moves the body by the specified amount. Only enabled in bhkRigidBodyT objects.</field>
        <field name="Rotation" type="hkQuaternion">The rotation Yaw/Pitch/Roll to apply to the body. Only enabled in bhkRigidBodyT objects.</field>
        <field name="Linear Velocity" type="Vector4">Linear velocity.</field>
        <field name="Angular Velocity" type="Vector4">Angular velocity.</field>
        <field name="Inertia Tensor" type="hkMatrix3">Defines how the mass is distributed among the body, i.e. how difficult it is to rotate around any given axis.</field>
        <field name="Center" type="Vector4">The body's center of mass.</field>
        <field name="Mass" type="float" default="1.0">The body's mass in kg. A mass of zero represents an immovable object.</field>
        <field name="Linear Damping" type="float" default="0.1">Reduces the movement of the body over time. A value of 0.1 will remove 10% of the linear velocity every second.</field>
        <field name="Angular Damping" type="float" default="0.05">Reduces the movement of the body over time. A value of 0.05 will remove 5% of the angular velocity every second.</field>
        <field name="Gravity Factor" type="float" default="1.0"/>
        <field name="Friction" type="float" default="0.5">How smooth its surfaces is and how easily it will slide along other bodies.</field>
        <field name="Rolling Friction Multiplier" type="float" />
        <field name="Restitution" type="float" default="0.4">
            How "bouncy" the body is, i.e. how much energy it has after colliding. Less than 1.0 loses energy, greater than 1.0 gains energy.
            If the restitution is not 0.0 the object will need extra CPU for all new collisions.
        </field>
        <field name="Max Linear Velocity" type="float" default="104.4">Maximal linear velocity.</field>
        <field name="Max Angular Velocity" type="float" default="31.57">Maximal angular velocity.</field>
        <field name="Motion System" type="hkMotionType" default="MO_SYS_DYNAMIC">Motion system? Overrides Quality when on Keyframed?</field>
        <field name="Enable Deactivation" type="bool" default="1" />
        <field name="Solver Deactivation" type="hkSolverDeactivation" default="SOLVER_DEACTIVATION_OFF">How aggressively the engine will try to zero the velocity for slow objects. This does not save CPU.</field>
        <field name="Unused 03" type="byte" />
        <field name="Penetration Depth" type="float" default="0.15">
            The maximum allowed penetration for this object.
            This is a hint to the engine to see how much CPU the engine should invest to keep this object from penetrating.
            A good choice is 5% - 20% of the smallest diameter of the object.
        </field>
        <field name="Time Factor" type="float" />
        <field name="Unused 04" type="byte" length="4" />
        <field name="Collision Response" type="hkResponseType" />
        <field name="Unused 05" type="byte" />
        <field name="Process Contact Callback Delay 3" type="ushort" default="0xffff" />
        <field name="Quality Type" type="hkQualityType" default="MO_QUAL_FIXED" />
        <field name="Auto Remove Level" type="byte" />
        <field name="Response Modifier Flags" type="byte" />
        <field name="Num Shape Keys in Contact Point" type="byte" default="3" />
        <field name="Force Collided Onto PPU" type="bool" />
        <field name="Unused 06" type="byte" length="3" binary="true" />
    </compound>

    <niobject name="bhkRigidBody" inherit="bhkEntity" module="BSHavok" versions="#BETHESDA#">
        This is the default body type for all "normal" usable and static world objects. The "T" suffix
        marks this body as active for translation and rotation, a normal bhkRigidBody ignores those
        properties. Because the properties are equal, a bhkRigidBody may be renamed into a bhkRigidBodyT and vice-versa.
        <field name="Rigid Body Info" suffix="550_660" type="bhkRigidBodyCInfo550_660" vercond="#NI_BS_LTE_FO3#" />
        <field name="Rigid Body Info" suffix="2010" type="bhkRigidBodyCInfo2010" vercond="#BS_GTE_SKY# #AND# (!#BS_FO4#)" />
        <field name="Rigid Body Info" suffix="2014" type="bhkRigidBodyCInfo2014" vercond="#BS_FO4#" />
        <field name="Num Constraints" type="uint" />
        <field name="Constraints" type="Ref" template="bhkSerializable" length="Num Constraints" />
        <field name="Body Flags" type="uint" vercond="#BSVER# #LT# 76">1 = respond to wind</field>
        <field name="Body Flags" type="ushort" vercond="#BSVER# #GTE# 76">1 = respond to wind</field>
    </niobject>

    <niobject name="bhkRigidBodyT" inherit="bhkRigidBody" module="BSHavok" versions="#BETHESDA#">
        The "T" suffix marks this body as active for translation and rotation.
    </niobject>


    <niobject name="bhkAction" abstract="true" inherit="bhkSerializable" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpAction. hkpAction performs some action on a body or bodies during every simulation step.
    </niobject>

    <niobject name="bhkUnaryAction" abstract="true" inherit="bhkAction" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpUnaryAction. hkpUnaryAction performs an action on one body.
        <field name="Entity" type="Ptr" template="bhkRigidBody" />
        <field name="Unused 01" type="byte" length="8" binary="true" />
    </niobject>

    <niobject name="bhkBinaryAction" abstract="true" inherit="bhkAction" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpBinaryAction. hkpBinaryAction performs an action on two bodies.
        <field name="Entity A" type="Ptr" template="bhkRigidBody" />
        <field name="Entity B" type="Ptr" template="bhkRigidBody" />
        <field name="Unused 01" type="byte" length="8" binary="true" />
    </niobject>

    <niobject name="bhkConstraint" abstract="true" inherit="bhkSerializable" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpConstraintData. Base class for all constraints. 
        <field name="Constraint Info" type="bhkConstraintCInfo" />
    </niobject>

    <niobject name="bhkLimitedHingeConstraint" inherit="bhkConstraint" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpLimitedHingeConstraintData. Hinge constraint with limits and a motor.
        Enabling the motor will remove any friction.
        <field name="Constraint" type="bhkLimitedHingeConstraintCInfo" />
    </niobject>

    <niobject name="bhkMalleableConstraint" inherit="bhkConstraint" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpMalleableConstraintData. Constraint wrapper used to soften or harden constraints.
        Does not affect angular limits or angular motors.
        <field name="Constraint" type="bhkMalleableConstraintCInfo" />
    </niobject>

    <niobject name="bhkStiffSpringConstraint" inherit="bhkConstraint" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpStiffSpringConstraintData. Holds two bodies at a specified distance from one another.
        <field name="Constraint" type="bhkStiffSpringConstraintCInfo" />
    </niobject>

    <niobject name="bhkRagdollConstraint" inherit="bhkConstraint" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpRagdollConstraintData. Creates a joint between two bodies with 3 degrees of freedom and a motor.
        Enabling the motor will remove any friction.
        The area of movement can be represented as a main cone + 2 orthogonal cones which may subtract from the main cone volume depending on limits. 
        <field name="Constraint" type="bhkRagdollConstraintCInfo" />
    </niobject>

    <niobject name="bhkPrismaticConstraint" inherit="bhkConstraint" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpPrismaticConstraintData.
        Creates a rail between two bodies that allows translation along a single axis with linear limits and a motor.
        All three rotation axes and the remaining two translation axes are fixed.
        <field name="Constraint" type="bhkPrismaticConstraintCInfo" />
    </niobject>

    <niobject name="bhkHingeConstraint" inherit="bhkConstraint" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpHingeConstraintData. A basic hinge with no angular limits or motor.
        <field name="Constraint" type="bhkHingeConstraintCInfo" />
    </niobject>

    <niobject name="bhkBallAndSocketConstraint" inherit="bhkConstraint" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpBallAndSocketConstraintData.
        Point-to-point constraint that attempts to keep the pivot point of two bodies in the same space.
        <field name="Constraint" type="bhkBallAndSocketConstraintCInfo" />
    </niobject>

    <niobject name="bhkBallSocketConstraintChain" inherit="bhkSerializable" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpBallSocketChainData. A chain of ball and socket constraints.
        <field name="Num Pivots" type="uint" calc="#LEN[Pivots]# * 2">Should equal (Num Chained Entities - 1) * 2</field>
        <field name="Pivots" type="bhkBallAndSocketConstraintCInfo" length="Num Pivots / 2">Two pivot points A and B for each constraint.</field>
        <field name="Tau" type="float" default="1.0">High values are harder and more reactive, lower values are smoother.</field>
        <field name="Damping" type="float" default="0.6">Defines damping strength for the current velocity.</field>
        <field name="Constraint Force Mixing" type="float" default="1.1920929e-08">Restitution (amount of elasticity) of constraints. Added to the diagonal of the constraint matrix. A value of 0.0 can result in a division by zero with some chain configurations.</field>
        <field name="Max Error Distance" type="float" default="0.1">Maximum distance error in constraints allowed before stabilization algorithm kicks in. A smaller distance causes more resistance.</field>
        <field name="Constraint Chain Info" type="bhkConstraintChainCInfo" />
    </niobject>

    <niobject name="bhkShape" abstract="true" inherit="bhkSerializable" module="BSHavok" versions="#BETHESDA#">
        The base class for narrowphase collision detection objects.
        All narrowphase collision detection is performed between pairs of bhkShape objects by creating appropriate collision agents.
    </niobject>

    <niobject name="bhkTransformShape" inherit="bhkShape" module="BSHavok" versions="#BETHESDA#">
        Contains a bhkShape and an additional transform for that shape.
        <field name="Shape" type="Ref" template="bhkShape">The shape that this object transforms.</field>
        <field name="Material" type="HavokMaterial">The material of the shape.</field>
        <field name="Radius" type="float" />
        <field name="Unused 01" type="byte" length="8" binary="true" />
        <field name="Transform" type="Matrix44">A transform matrix.</field>
    </niobject>

    <niobject name="bhkConvexShapeBase" abstract="true" inherit="bhkShape" module="BSHavok" versions="#BETHESDA#">
        An imaginary abstract base to solve inheritance issues in nif.xml with Havok serialization not matching class hierarchy.
    </niobject>

    <niobject name="bhkSphereRepShape" abstract="true" inherit="bhkConvexShapeBase" module="BSHavok" versions="#BETHESDA#">
        An interface that produces a set of spheres that represent a simplified version of the shape.
        <field name="Material" type="HavokMaterial">The material of the shape.</field>
    </niobject>

    <niobject name="bhkConvexShape" abstract="true" inherit="bhkSphereRepShape" module="BSHavok" versions="#BETHESDA#">
        An interface that allows testing convex sets using the GJK algorithm. Also holds a radius value for creating a shell.
        <field name="Radius" type="float" default="0.05">The radius is used to create a thin shell that is used as the shape surface.</field>
    </niobject>

    <niobject name="bhkHeightFieldShape" abstract="true" inherit="bhkShape" module="BSHavok" versions="#BETHESDA#">
        An interface for a shape which can collide with an array of spheres.
        <field name="Material" type="HavokMaterial">The material of the shape.</field>
    </niobject>

    <niobject name="bhkPlaneShape" inherit="bhkHeightFieldShape" module="BSHavok" versions="#BETHESDA#">
        Contains a normal and distance from the origin, bounded by a given AABB.
        <field name="Unused 01" type="byte" length="12" binary="true" />
        <field name="Plane Normal" type="Vector3" />
        <field name="Plane Constant" type="float">Distance from the origin to the plane.</field>
        <field name="AABB Half Extents" type="Vector4" />
        <field name="AABB Center" type="Vector4" />
    </niobject>

    <niobject name="bhkSphereShape" inherit="bhkConvexShape" module="BSHavok" versions="#BETHESDA#">
        A sphere.
    </niobject>

    <niobject name="bhkCylinderShape" inherit="bhkConvexShape" module="BSHavok" versions="#BETHESDA#">
        A cylinder.
        <field name="Unused 01" type="byte" length="8" binary="true" />
        <field name="Vertex A" type="Vector4" />
        <field name="Vertex B" type="Vector4" />
        <field name="Cylinder Radius" type="float" />
        <field name="Unused 02" type="byte" length="12" binary="true" />
    </niobject>

    <niobject name="bhkCapsuleShape" inherit="bhkConvexShape" module="BSHavok" versions="#BETHESDA#">
        A capsule.
        <field name="Unused 01" type="byte" length="8" binary="true" />
        <field name="First Point" type="Vector3">First point on the capsule's axis.</field>
        <field name="Radius 1" type="float">Matches first capsule radius.</field>
        <field name="Second Point" type="Vector3">Second point on the capsule's axis.</field>
        <field name="Radius 2" type="float">Matches second capsule radius.</field>
    </niobject>

    <niobject name="bhkBoxShape" inherit="bhkConvexShape" module="BSHavok" versions="#BETHESDA#">
        A box.
        <field name="Unused 01" type="byte" length="8" binary="true" />
        <field name="Dimensions" type="Vector3">A cube stored in Half Extents. A unit cube (1.0, 1.0, 1.0) would be stored as 0.5, 0.5, 0.5.</field>
        <field name="Unused Float" type="float">Unused as Havok stores the Half Extents as hkVector4 with the W component unused.</field>
    </niobject>

    <niobject name="bhkConvexVerticesShape" inherit="bhkConvexShape" module="BSHavok" versions="#BETHESDA#">
        A convex shape built from vertices. Note that if the shape is used in
        a non-static object (such as clutter), then they will simply fall
        through ground when they are under a bhkListShape.
        <field name="Vertices Property" type="bhkWorldObjCInfoProperty" />
        <field name="Normals Property" type="bhkWorldObjCInfoProperty" />
        <field name="Num Vertices" type="uint">Number of vertices.</field>
        <field name="Vertices" type="Vector4" length="Num Vertices">Vertices. Fourth component is 0. Lexicographically sorted.</field>
        <field name="Num Normals" type="uint">The number of half spaces.</field>
        <field name="Normals" type="Vector4" length="Num Normals">Half spaces as determined by the set of vertices above. First three components define the normal pointing to the exterior, fourth component is the signed distance of the separating plane to the origin: it is minus the dot product of v and n, where v is any vertex on the separating plane, and n is the normal. Lexicographically sorted.</field>
    </niobject>

    <niobject name="bhkConvexTransformShape" inherit="bhkConvexShapeBase" module="BSHavok" versions="#BETHESDA#">
        Contains a bhkConvexShape and an additional transform for that shape.
        The advantage of using bhkConvexTransformShape over bhkTransformShape is that it does not require additional agents to be created as it is itself convex.
        <field name="Shape" type="Ref" template="bhkConvexShape">The shape that this object transforms.</field>
        <field name="Material" type="HavokMaterial">The material of the shape.</field>
        <field name="Radius" type="float" />
        <field name="Unused 01" type="byte" length="8" binary="true" />
        <field name="Transform" type="Matrix44">A transform matrix.</field>
    </niobject>

    <niobject name="bhkConvexSweepShape" inherit="bhkConvexShapeBase" module="BSHavok" versions="V10_0_1_0">
        <field name="Shape" type="Ref" template="bhkConvexShape" />
        <field name="Material" type="HavokMaterial" />
        <field name="Radius" type="float" />
        <field name="Unknown" type="Vector3" />
    </niobject>

    <niobject name="bhkMultiSphereShape" inherit="bhkSphereRepShape" module="BSHavok" versions="#BETHESDA#">
        A compound shape made up of spheres. This is useful as an approximation for complex shapes, as collision detection for spheres is very fast.
        However, if two bhkMultiSphereShape collide, every sphere needs to be checked against every other sphere.
            Example: 10 spheres colliding with 10 spheres will result in 100 collision checks.
            Therefore shapes like bhkCapsuleShape or bhkConvexVerticesShape should be preferred.
        <field name="Shape Property" type="bhkWorldObjCInfoProperty" />
        <field name="Num Spheres" type="uint" default="2" range="1:8" />
        <field name="Spheres" type="NiBound" length="Num Spheres">The spheres which make up the multi sphere shape. Max of 8.</field>
    </niobject>

    <niobject name="bhkBvTreeShape" abstract="true" inherit="bhkShape" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpBvTreeShape. hkpBvTreeShape adds a bounding volume tree to an hkpShapeCollection.
        A bounding volume tree is useful for testing collision between a moving object and large static geometry.
        <field name="Shape" type="Ref" template="bhkShape">The shape.</field>
    </niobject>

    <compound name="hkpMoppCode" versions="#BETHESDA#">
        <field name="Data Size" type="uint">Number of bytes for MOPP data.</field>
        <field name="Offset" type="Vector4" since="10.1.0.0">
            XYZ: Origin of the object in mopp coordinates. This is the minimum of all vertices in the packed shape along each axis, minus 0.1.
            W: The scaling factor to quantize the MOPP: the quantization factor is equal to 256*256 divided by this number.
               In Oblivion files, scale is taken equal to 256*256*254 / (size + 0.2) where size is the largest dimension of the bounding box of the packed shape.
        </field>
        <field name="Build Type" type="hkMoppCodeBuildType" vercond="#BS_GT_FO3#">Tells if MOPP Data was organized into smaller chunks (PS3) or not (PC)</field>
        <field name="Data" type="byte" binary="true" length="Data Size">The tree of bounding volume data.</field>
    </compound>

    <niobject name="bhkMoppBvTreeShape" inherit="bhkBvTreeShape" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpMoppBvTreeShape. hkpMoppBvTreeShape is a bounding volume tree using Havok-proprietary MOPP code.
        <field name="Unused 01" type="byte" length="12" binary="true" />
        <field name="Scale" type="float" default="1.0" />
        <field name="MOPP Code" type="hkpMoppCode" />
    </niobject>


    <niobject name="bhkShapeCollection" abstract="true" inherit="bhkShape" module="BSHavok" versions="#BETHESDA#">
        An interface to a collection of bhkShapes.
    </niobject>

    <niobject name="bhkListShape" inherit="bhkShapeCollection" module="BSHavok" versions="#BETHESDA#">
        A list of shapes.

        Shapes collected in a bhkListShape may not have the correct collision sound/FX due to HavokMaterial issues.
        Do not put a bhkPackedNiTriStripsShape in the Sub Shapes. Use a separate collision nodes without a list shape for those.
        <field name="Num Sub Shapes" type="uint" default="1" range="1:256" />
        <field name="Sub Shapes" type="Ref" template="bhkShape" length="Num Sub Shapes">List of shapes. Max of 256.</field>
        <field name="Material" type="HavokMaterial">The material of the shape.</field>
        <field name="Child Shape Property" type="bhkWorldObjCInfoProperty" />
        <field name="Child Filter Property" type="bhkWorldObjCInfoProperty" />
        <field name="Num Filters" type="uint" calc="#LEN[Sub Shapes]#" />
        <field name="Filters" type="HavokFilter" length="Num Filters">Always zeroed. Seemingly unused, or 0 for all values means no override.</field>
    </niobject>

    <niobject name="bhkMeshShape" inherit="bhkShape" module="BSHavok" versions="V10_0_1_0">
        Bethesda extension of hkpMeshShape, but using NiTriStripsData instead of Havok storage.
        Appears in one old Oblivion NIF, but only in certain distributions. NIF version 10.0.1.0 only.
        <field name="Unknown 01" type="uint" length="2" />
        <field name="Radius" type="float" />
        <field name="Unknown 02" type="uint" length="2" />
        <field name="Scale" type="Vector4" />
        <field name="Num Shape Properties" type="uint" />
        <field name="Shape Properties" type="bhkWorldObjCInfoProperty" length="Num Shape Properties" />
        <field name="Unknown 03" type="uint" length="3" />
        <field name="Num Strips Data" type="uint" until="10.0.1.0" />
        <field name="Strips Data" type="Ref" template="NiTriStripsData" length="Num Strips Data" until="10.0.1.0" />
    </niobject>

    <niobject name="bhkPackedNiTriStripsShape" inherit="bhkShapeCollection" module="BSHavok" versions="#BETHESDA#">
        Bethesda custom hkpShapeCollection using custom packed tri strips data.
        <field name="Num Sub Shapes" type="ushort" until="20.0.0.5" />
        <field name="Sub Shapes" type="hkSubPartData" length="Num Sub Shapes" until="20.0.0.5" />
        <field name="User Data" type="uint" default="0" />
        <field name="Unused 01" type="byte" length="4" binary="true" />
        <field name="Radius" type="float" default="0.1" />
        <field name="Unused 02" type="byte" length="4" binary="true" />
        <field name="Scale" type="Vector4" default="#VEC4_1110#" />
        <field name="Radius Copy" type="float" default="0.1">Same as radius</field>
        <field name="Scale Copy" type="Vector4" default="#VEC4_1110#">Same as scale.</field>
        <field name="Data" type="Ref" template="hkPackedNiTriStripsData" />
    </niobject>

    <niobject name="bhkNiTriStripsShape" inherit="bhkShapeCollection" module="BSHavok" versions="#BETHESDA#">
        Bethesda custom hkpShapeCollection using NiTriStripsData for geometry storage.
        <field name="Material" type="HavokMaterial">The material of the shape.</field>
        <field name="Radius" type="float" default="0.1" />
        <field name="Unused 01" type="byte" length="20" binary="true" />
        <field name="Grow By" type="uint" default="1" />
        <field name="Scale" type="Vector4" default="#VEC4_1110#" since="10.1.0.0" />
        <field name="Num Strips Data" type="uint" default="1" />
        <field name="Strips Data" type="Ref" template="NiTriStripsData" length="Num Strips Data" />
        <field name="Num Filters" type="uint" default="1" calc="#LEN[Strips Data]#" />
        <field name="Filters" type="HavokFilter" length="Num Filters" />
    </niobject>

    <niobject name="NiExtraData" inherit="NiObject" module="NiMain">
        A generic extra data object.
        <field name="Name" type="string" since="10.0.1.0" excludeT="BSExtraData">Name of this object.</field>
        <field name="Next Extra Data" type="Ref" template="NiExtraData" until="4.2.2.0">Block number of the next extra data object.</field>
        <field name="Extra Data" type="ByteArray" until="3.3.0.13">The extra data was sometimes stored as binary directly on NiExtraData.</field>
        <field name="Num Bytes" type="uint" since="4.0.0.0" until="4.2.2.0">Ignore binary data after 4.x as the child block will cover it.</field>
    </niobject>

    <niobject name="NiInterpolator" abstract="true" inherit="NiObject" module="NiAnimation">
        Abstract base class for all interpolators of bool, float, NiQuaternion, NiPoint3, NiColorA, and NiQuatTransform data.
    </niobject>

    <niobject name="NiKeyBasedInterpolator" abstract="true" inherit="NiInterpolator" module="NiAnimation">
        Abstract base class for interpolators that use NiAnimationKeys (Key, KeyGrp) for interpolation.
    </niobject>

    <niobject name="NiColorInterpolator" inherit="NiKeyBasedInterpolator" module="NiAnimation">
        Animates a color value over time.
        <field name="Value" type="Color4" default="#INV_VEC4#" />
        <field name="Data" type="Ref" template="NiColorData" />
    </niobject>

    <niobject name="NiFloatInterpolator" inherit="NiKeyBasedInterpolator" module="NiAnimation">
        Uses NiFloatKeys to animate a float value over time.
        <field name="Value" type="float" default="#INV_FLT#">Pose value if lacking NiFloatData.</field>
        <field name="Data" type="Ref" template="NiFloatData" />
    </niobject>

    <niobject name="NiTransformInterpolator" inherit="NiKeyBasedInterpolator" module="NiAnimation">
        An interpolator for transform keyframes.
        <field name="Transform" type="NiQuatTransform" />
        <field name="Data" type="Ref" template="NiTransformData" />
    </niobject>

    <niobject name="NiPoint3Interpolator" inherit="NiKeyBasedInterpolator" module="NiAnimation">
        Uses NiPosKeys to animate an NiPoint3 value over time.
        <field name="Value" type="Vector3" default="#INV_VEC3#">Pose value if lacking NiPosData.</field>
        <field name="Data" type="Ref" template="NiPosData" />
    </niobject>

    <bitflags name="PathFlags" storage="ushort" prefix="NIPI">
        <option bit="0" name="CVDataNeedsUpdate" />
        <option bit="1" name="CurveTypeOpen" />
        <option bit="2" name="AllowFlip" />
        <option bit="3" name="Bank" />
        <option bit="4" name="ConstantVelocity" />
        <option bit="5" name="Follow" />
        <option bit="6" name="Flip" />
    </bitflags>

    <niobject name="NiPathInterpolator" inherit="NiKeyBasedInterpolator" module="NiAnimation">
        Used to make an object follow a predefined spline path.
        <field name="Flags" type="PathFlags" default="3" />
        <field name="Bank Dir" type="int" default="1">-1 = Negative, 1 = Positive</field>
        <field name="Max Bank Angle" type="float">Max angle in radians.</field>
        <field name="Smoothing" type="float" />
        <field name="Follow Axis" type="short">0, 1, or 2 representing X, Y, or Z.</field>
        <field name="Path Data" type="Ref" template="NiPosData" />
        <field name="Percent Data" type="Ref" template="NiFloatData" />
    </niobject>

    <niobject name="NiBoolInterpolator" inherit="NiKeyBasedInterpolator" module="NiAnimation">
        Uses NiBoolKeys to animate a bool value over time.
        <field name="Value" type="bool" default="2">Pose value if lacking NiBoolData.</field>
        <field name="Data" type="Ref" template="NiBoolData" />
    </niobject>

    <niobject name="NiBoolTimelineInterpolator" inherit="NiBoolInterpolator" module="NiAnimation">
        Uses NiBoolKeys to animate a bool value over time.
        Unlike NiBoolInterpolator, it ensures that keys have not been missed between two updates.
    </niobject>

    <enum name="InterpBlendFlags" storage="byte">
        <option value="1" name="MANAGER_CONTROLLED">MANAGER_CONTROLLED</option>
    </enum>

    <compound name="InterpBlendItem">
        Interpolator item for array in NiBlendInterpolator.
        <field name="Interpolator" type="Ref" template="NiInterpolator">Reference to an interpolator.</field>
        <field name="Weight" type="float" />
        <field name="Normalized Weight" type="float" />
        <field name="Priority" type="int" until="10.1.0.109" />
        <field name="Priority" type="byte" since="10.1.0.110" />
        <field name="Ease Spinner" type="float" />
    </compound>

    <niobject name="NiBlendInterpolator" abstract="true" inherit="NiInterpolator" module="NiAnimation">
        Abstract base class for all NiInterpolators that blend the results of sub-interpolators together to compute a final weighted value.
        <field name="Flags" type="InterpBlendFlags" since="10.1.0.112" />
        <field name="Array Size" type="ushort" until="10.1.0.109" />
        <field name="Array Grow By" type="ushort" until="10.1.0.109" />
        <field name="Array Size" type="byte" since="10.1.0.110" />
        <field name="Weight Threshold" type="float" since="10.1.0.112" />
        <!-- Flags conds -->
        <field name="Interp Count" type="byte" cond="!(Flags #BITAND# 1)" since="10.1.0.112" />
        <field name="Single Index" type="byte" default="#BYTE_MAX#" cond="!(Flags #BITAND# 1)" since="10.1.0.112" />
        <field name="High Priority" type="char" default="#CHAR_MIN#" cond="!(Flags #BITAND# 1)" since="10.1.0.112" />
        <field name="Next High Priority" type="char" default="#CHAR_MIN#" cond="!(Flags #BITAND# 1)" since="10.1.0.112" />
        <field name="Single Time" type="float" default="#FLT_MIN#" cond="!(Flags #BITAND# 1)" since="10.1.0.112" />
        <field name="High Weights Sum" type="float" default="#FLT_MIN#" cond="!(Flags #BITAND# 1)" since="10.1.0.112" />
        <field name="Next High Weights Sum" type="float" default="#FLT_MIN#" cond="!(Flags #BITAND# 1)" since="10.1.0.112" />
        <field name="High Ease Spinner" type="float" default="#FLT_MIN#" cond="!(Flags #BITAND# 1)" since="10.1.0.112" />
        <field name="Interp Array Items" type="InterpBlendItem" length="Array Size" cond="!(Flags #BITAND# 1)" since="10.1.0.112" />
        <!-- /Flags conds -->
        <field name="Interp Array Items" type="InterpBlendItem" length="Array Size" until="10.1.0.111" />
        <field name="Manager Controlled" type="bool" until="10.1.0.111" />
        <field name="Weight Threshold" type="float" until="10.1.0.111" />
        <field name="Only Use Highest Weight" type="bool" until="10.1.0.111" />
        <field name="Interp Count" type="ushort" until="10.1.0.109" />
        <field name="Single Index" type="ushort" default="#USHRT_MAX#" until="10.1.0.109" />
        <field name="Interp Count" type="byte" since="10.1.0.110" until="10.1.0.111" />
        <field name="Single Index" type="byte" default="#BYTE_MAX#" since="10.1.0.110" until="10.1.0.111" />
        <field name="Single Interpolator" type="Ref" template="NiInterpolator" since="10.1.0.108" until="10.1.0.111" />
        <field name="Single Time" type="float" default="#FLT_MIN#" since="10.1.0.108" until="10.1.0.111" />
        <field name="High Priority" type="int" default="#INT_MIN#" until="10.1.0.109" />
        <field name="Next High Priority" type="int" default="#INT_MIN#" until="10.1.0.109" />
        <field name="High Priority" type="char" default="#CHAR_MIN#" since="10.1.0.110" until="10.1.0.111" />
        <field name="Next High Priority" type="char" default="#CHAR_MIN#" since="10.1.0.110" until="10.1.0.111" />
    </niobject>

    <niobject name="NiBSplineInterpolator" abstract="true" inherit="NiInterpolator" module="NiAnimation">
        Abstract base class for interpolators storing data via a B-spline.
        <field name="Start Time" type="float" default="#FLT_MAX#">Animation start time.</field>
        <field name="Stop Time" type="float" default="#FLT_MIN#">Animation stop time.</field>
        <field name="Spline Data" type="Ref" template="NiBSplineData" />
        <field name="Basis Data" type="Ref" template="NiBSplineBasisData" />
    </niobject>

    <compound name="LegacyExtraData" until="V2_3">
        Extra Data for pre-3.0 versions
        <field name="Has Extra Data" type="bool" />
        <field name="Extra Prop Name" cond="Has Extra Data" type="SizedString" />
        <field name="Extra Ref ID" cond="Has Extra Data" type="uint" />
        <field name="Extra String" cond="Has Extra Data" type="SizedString" />
        <field name="Unknown Byte 1" type="byte" />
    </compound>

    <niobject name="NiObjectNET" abstract="true" inherit="NiObject" module="NiMain">
        Abstract base class for NiObjects that support names, extra data, and time controllers.
        <field name="Shader Type" type="BSLightingShaderType" since="20.2.0.7" until="20.2.0.7" vercond="#BS_GTE_SKY# #AND# #NI_BS_LTE_FO4#" onlyT="BSLightingShaderProperty">Configures the main shader path</field>
        <field name="Name" type="string">Name of this controllable object, used to refer to the object in .kf files.</field>
        <field name="Legacy Extra Data" type="LegacyExtraData" until="2.3" />
        <field name="Extra Data" type="Ref" template="NiExtraData" since="3.0" until="4.2.2.0">Extra data object index. (The first in a chain)</field>
        <field name="Num Extra Data List" type="uint" since="10.0.1.0">The number of Extra Data objects referenced through the list.</field>
        <field name="Extra Data List" type="Ref" template="NiExtraData" length="Num Extra Data List" since="10.0.1.0">List of extra data indices.</field>
        <field name="Controller" type="Ref" template="NiTimeController" since="3.0">Controller object index. (The first in a chain)</field>
    </niobject>

    <niobject name="NiCollisionObject" inherit="NiObject" module="NiMain">
        This is the most common collision object found in NIF files. It acts as a real object that
        is visible and possibly (if the body allows for it) interactive. The node itself
        is simple, it only has three properties.
        For this type of collision object, bhkRigidBody or bhkRigidBodyT is generally used.
        <field name="Target" type="Ptr" template="NiAVObject">Index of the AV object referring to this collision object.</field>
    </niobject>

    <niobject name="NiCollisionData" inherit="NiCollisionObject" module="NiMain">
        Collision box.
        <field name="Propagation Mode" type="PropagationMode" default="PROPAGATE_ALWAYS" />
        <field name="Collision Mode" type="CollisionMode" default="NOTEST" since="10.1.0.0" />
        <field name="Use ABV" type="byte">Use Alternate Bounding Volume.</field>
        <field name="Bounding Volume" type="BoundingVolume" cond="Use ABV == 1" />
    </niobject>

    <bitflags name="bhkCOFlags" storage="ushort" prefix="BHKCO" versions="#BETHESDA#">
        bhkNiCollisionObject flags.
        0x100 and 0x200 are only for bhkBlendCollisionObject
        <option bit="0" name="ACTIVE" />
        <option bit="1" name="RESET_TRANS" />
        <option bit="2" name="NOTIFY" />
        <option bit="3" name="SET_LOCAL" />
        <option bit="4" name="DBG_DISPLAY" />
        <option bit="5" name="USE_VEL" />
        <option bit="6" name="RESET" />
        <option bit="7" name="SYNC_ON_UPDATE" />
        <option bit="8" name="BLEND_POS" />
        <option bit="9" name="ALWAYS_BLEND" />
        <option bit="10" name="ANIM_TARGETED" />
        <option bit="11" name="DISMEMBERED_LIMB" />
    </bitflags>

    <niobject name="bhkNiCollisionObject" abstract="true" inherit="NiCollisionObject" module="BSHavok">
        Abstract base class to merge NiCollisionObject with Bethesda Havok.
        <field name="Flags" type="bhkCOFlags" default="1">
            OB-FO3: Add 0x28 (SET_LOCAL | USE_VEL) for ANIM_STATIC layer objects.
            Post-FO3: Always add 0x80 (SYNC_ON_UPDATE).
            <default type="bhkCollisionObject" value="0x81" />
            <default type="bhkCollisionObject" value="0x1" versions="V20_2_0_7_FO3 V20_0_0_5_OBL" />
            <default type="bhkPCollisionObject" value="0x81" />
            <default type="bhkPCollisionObject" value="0x1" versions="V20_2_0_7_FO3 V20_0_0_5_OBL" />
            <default type="bhkSPCollisionObject" value="0x81" />
            <default type="bhkSPCollisionObject" value="0x1" versions="V20_2_0_7_FO3 V20_0_0_5_OBL" />
            <default type="bhkBlendCollisionObject" value="0x89" />
            <default type="bhkBlendCollisionObject" value="0x9" versions="V20_2_0_7_FO3 V20_0_0_5_OBL" />
        </field>
        <field name="Body" type="Ref" template="bhkWorldObject" />
    </niobject>

    <niobject name="bhkCollisionObject" inherit="bhkNiCollisionObject" module="BSHavok">
        Primary Bethesda Havok object.
    </niobject>

    <niobject name="bhkBlendCollisionObject" inherit="bhkCollisionObject" module="BSHavok">
        Bethesda Havok object used in skeletons.
        <field name="Heir Gain" type="float" default="1.0" />
        <field name="Vel Gain" type="float" default="1.0" />
        <field name="Unknown Float 1" type="float" vercond="#BSVER# #LT# 9" />
        <field name="Unknown Float 2" type="float" vercond="#BSVER# #LT# 9" />
    </niobject>

    <niobject name="bhkPCollisionObject" inherit="bhkNiCollisionObject" module="BSHavok">
        Bethesda Havok object for phantoms such as bhkAabbPhantom.
    </niobject>

    <niobject name="bhkSPCollisionObject" inherit="bhkPCollisionObject" module="BSHavok">
        Bethesda Havok object for shape phantoms such as bhkSimpleShapePhantom.
    </niobject>

    <niobject name="NiAVObject" abstract="true" inherit="NiObjectNET" module="NiMain">
        Abstract audio-visual base class from which all of Gamebryo's scene graph objects inherit.
        <field name="Flags" type="uint" default="0x8000E" vercond="#BSVER# #GT# 26">
            Basic flags for AV objects. For Bethesda streams above 26 only.
            ALL: FO4 lacks the 0x80000 flag always. Skyrim lacks it sometimes.
            BSTreeNode: 0x8080E (pre-FO4), 0x400E (FO4)
            BSLeafAnimNode: 0x808000E (pre-FO4), 0x500E (FO4)
            BSDamageStage, BSBlastNode: 0x8000F (pre-FO4), 0x2000000F (FO4)
            <default type="NiNode" value="0xE" />
            <default type="NiNode" value="0x8000E" versions="V20_2_0_7_FO3" />
            <default type="NiLight" value="0xE" />
            <default type="NiLight" value="0x8000E" versions="V20_2_0_7_FO3" />
            <default type="BSMultiBoundNode" value="0xE" />
            <default type="BSMultiBoundNode" value="0x8080E" versions="V20_2_0_7_FO3" />
            <default type="BSTriShape" value="0xE" />
            <default type="BSTriShape" value="0x8000E" versions="V20_2_0_7_SSE" />
            <default type="BSSubIndexTriShape" value="0xE" />
            <default type="BSMeshLODTriShape" value="0x100E" />
            <default type="BSFadeNode" value="0x8000E" />
            <default type="NiParticleSystem" value="0x8000E" />
            <default type="BSMasterParticleSystem" value="0x8000E" />
            <default type="NiParticleSystem" value="0xE" versions="V20_2_0_7_FO4" />
            <default type="BSMasterParticleSystem" value="0xE" versions="V20_2_0_7_FO4" />
            <default type="BSStripParticleSystem" value="0x8000E" />
            <default type="NiTriShape" value="0x8000E" />
            <default type="NiTriStrips" value="0x8000E" />
            <default type="BSSegmentedTriShape" value="0xE" />
            <default type="BSSegmentedTriShape" value="0x8000E" versions="V20_2_0_7_FO3" />
            <default type="BSLeafAnimNode" value="0x808000E" />
            <default type="BSLeafAnimNode" value="0x500E" versions="V20_2_0_7_FO4" />
            <default type="BSTreeNode" value="0x8080E" />
            <default type="BSTreeNode" value="0x400E" versions="V20_2_0_7_FO4" />
            <default type="BSDebrisNode" value="0x8000F" />
            <default type="BSBlastNode" value="0x8000F" />
            <default type="BSBlastNode" value="0x2000000F" versions="V20_2_0_7_FO4" />
            <default type="BSDamageStage" value="0x8000F" />
            <default type="BSDamageStage" value="0x2000000F" versions="V20_2_0_7_FO4" />
            <default type="BSOrderedNode" value="0x8200E" />
            <default type="BSOrderedNode" value="0x200E" versions="V20_2_0_7_FO4" />
            <default type="BSOrderedNode" value="0x8000E" versions="V20_2_0_7_FO3" />
            <default type="BSLODTriShape" value="0x800000E" versions="V20_2_0_7_SSE" />
            <default type="BSLODTriShape" value="0x808000E" versions="V20_2_0_7_SKY" />
        </field>
        <field name="Flags" type="ushort" since="3.0" vercond="#BSVER# #LTE# 26">Basic flags for AV objects.</field>
        <field name="Translation" type="Vector3">The translation vector.</field>
        <field name="Rotation" type="Matrix33">The rotation part of the transformation matrix.</field>
        <field name="Scale" type="float" default="1.0">Scaling part (only uniform scaling is supported).</field>
        <field name="Velocity" type="Vector3" until="4.2.2.0">Unknown function. Always seems to be (0, 0, 0)</field>
        <field name="Num Properties" type="uint" vercond="#NI_BS_LTE_FO3#" />
        <field name="Properties" type="Ref" template="NiProperty" length="Num Properties" vercond="#NI_BS_LTE_FO3#">All rendering properties attached to this object.</field>
        <field name="Unknown 1" type="uint" length="4" until="2.3" />
        <field name="Unknown 2" type="byte" until="2.3" />
        <field name="Has Bounding Volume" type="bool" since="3.0" until="4.2.2.0" />
        <field name="Bounding Volume" type="BoundingVolume" cond="Has Bounding Volume" since="3.0" until="4.2.2.0" />
        <field name="Collision Object" type="Ref" template="NiCollisionObject" since="10.0.1.0" />
    </niobject>

    <niobject name="NiDynamicEffect" abstract="true" inherit="NiAVObject" module="NiMain">
        Abstract base class for dynamic effects such as NiLights or projected texture effects.
        <field name="Switch State" type="bool" default="1" since="10.1.0.106" vercond="#NI_BS_LT_FO4#">If true, then the dynamic effect is applied to affected nodes during rendering.</field>
        <field name="Num Affected Nodes" type="uint" until="4.0.0.2" />
        <field name="Affected Nodes" type="Ptr" template="NiNode" length="Num Affected Nodes" until="3.3.0.13">If a node appears in this list, then its entire subtree will be affected by the effect.</field>
        <field name="Affected Node Pointers" type="uint" length="Num Affected Nodes" since="4.0.0.0" until="4.0.0.2">As of 4.0 the pointer hash is no longer stored alongside each NiObject on disk, yet this node list still refers to the pointer hashes. Cannot leave the type as Ptr because the link will be invalid.</field>
        <field name="Num Affected Nodes" type="uint" since="10.1.0.0" vercond="#NI_BS_LT_FO4#" />
        <field name="Affected Nodes" type="Ptr" template="NiNode" length="Num Affected Nodes" since="10.1.0.0" vercond="#NI_BS_LT_FO4#">If a node appears in this list, then its entire subtree will be affected by the effect.</field>
    </niobject>

    <niobject name="NiLight" abstract="true" inherit="NiDynamicEffect" module="NiMain">
        Abstract base class that represents light sources in a scene graph.
        For Bethesda Stream 130 (FO4), NiLight now directly inherits from NiAVObject.
        <field name="Dimmer" type="float" default="1.0">Scales the overall brightness of all light components.</field>
        <field name="Ambient Color" type="Color3" default="#VEC3_ZERO#" />
        <field name="Diffuse Color" type="Color3" default="#VEC3_ZERO#" />
        <field name="Specular Color" type="Color3" default="#VEC3_ZERO#" />
    </niobject>

    <niobject name="NiProperty" abstract="true" inherit="NiObjectNET" module="NiMain">
        Abstract base class representing all rendering properties. Subclasses are attached to NiAVObjects to control their rendering.
    </niobject>

    <niobject name="NiTransparentProperty" inherit="NiProperty" module="NiLegacy">
        Unknown
        <field name="Unknown" type="byte" length="6" />
    </niobject>

    <enum name="NiPSysModifierOrder" storage="uint">
        The set order for each derived class of NiPSysModifier.
        Note: For Skyrim, BSPSysStripUpdateModifier is 8000 and for FO3 it is 2500.
        <option value="0" name="ORDER_KILLOLDPARTICLES" />
        <option value="1" name="ORDER_BSLOD" />
        <option value="1000" name="ORDER_EMITTER" />
        <option value="2000" name="ORDER_SPAWN" />
        <option value="2500" name="ORDER_FO3_BSSTRIPUPDATE" />
        <option value="3000" name="ORDER_GENERAL" />
        <option value="4000" name="ORDER_FORCE" />
        <option value="5000" name="ORDER_COLLIDER" />
        <option value="6000" name="ORDER_POS_UPDATE" />
        <option value="6500" name="ORDER_POSTPOS_UPDATE" />
        <option value="6600" name="ORDER_WORLDSHIFT_PARTSPAWN" />
        <option value="7000" name="ORDER_BOUND_UPDATE" />
        <option value="8000" name="ORDER_SK_BSSTRIPUPDATE" />
    </enum>

    <niobject name="NiPSysModifier" abstract="true" inherit="NiObject" module="NiParticle">
        Abstract base class for all particle system modifiers.
        <field name="Name" type="string">Used to locate the modifier.</field>
        <field name="Order" type="NiPSysModifierOrder" default="ORDER_GENERAL">
            Modifier's priority in the particle modifier chain.
            <default type="NiPSysAgeDeathModifier" value="ORDER_KILLOLDPARTICLES" />
            <default type="NiPSysMeshEmitter" value="ORDER_EMITTER" />
            <default type="NiPSysVolumeEmitter" value="ORDER_EMITTER" />
            <default type="NiPSysSpawnModifier" value="ORDER_EMITTER" />
            <default type="NiPSysColorModifier" value="ORDER_GENERAL" />
            <default type="NiPSysGrowFadeModifier" value="ORDER_GENERAL" />
            <default type="NiPSysRotationModifier" value="ORDER_GENERAL" />
            <default type="NiPSysBombModifier" value="ORDER_FORCE" />
            <default type="NiPSysDragModifier" value="ORDER_FORCE" />
            <default type="NiPSysFieldModifier" value="ORDER_FORCE" />
            <default type="NiPSysGravityModifier" value="ORDER_FORCE" />
            <default type="NiPSysColliderManager" value="ORDER_COLLIDER" />
            <default type="NiPSysPositionModifier" value="ORDER_POS_UPDATE" />
            <default type="NiPSysMeshUpdateModifier" value="ORDER_POSTPOS_UPDATE" />
            <default type="NiPSysBoundUpdateModifier" value="ORDER_BOUND_UPDATE" />
            <default type="BSPSysInheritVelocityModifier" value="ORDER_EMITTER" />
            <default type="BSPSysScaleModifier" value="ORDER_GENERAL" />
            <default type="BSPSysSimpleColorModifier" value="ORDER_GENERAL" />
            <default type="BSPSysSubTexModifier" value="ORDER_GENERAL" />
            <default type="BSParentVelocityModifier" value="ORDER_GENERAL" />
            <default type="BSWindModifier" value="ORDER_FORCE" />
            <default type="BSPSysRecycleBoundModifier" value="ORDER_POSTPOS_UPDATE" />
            <default type="BSPSysLODModifier" value="ORDER_BSLOD" />
            <default type="BSPSysStripUpdateModifier" value="ORDER_FO3_BSSTRIPUPDATE" versions="V20_2_0_7_FO3" />
            <default type="BSPSysStripUpdateModifier" value="ORDER_SK_BSSTRIPUPDATE" versions="V20_2_0_7_SKY V20_2_0_7_SSE" />
            <default type="NiPSysPartSpawnModifier" value="ORDER_WORLDSHIFT_PARTSPAWN" />
        </field>
        <field name="Target" type="Ptr" template="NiParticleSystem">NiParticleSystem parent of this modifier.</field>
        <field name="Active" type="bool" default="1">Whether or not the modifier is active.</field>
    </niobject>

    <niobject name="NiPSysEmitter" abstract="true" inherit="NiPSysModifier" module="NiParticle">
        Abstract base class for all particle system emitters.
        <field name="Speed" type="float">Speed / Inertia of particle movement.</field>
        <field name="Speed Variation" type="float">Adds an amount of randomness to Speed.</field>
        <field name="Declination" type="float">Declination / First axis.</field>
        <field name="Declination Variation" type="float">Declination randomness / First axis.</field>
        <field name="Planar Angle" type="float">Planar Angle / Second axis.</field>
        <field name="Planar Angle Variation" type="float">Planar Angle randomness / Second axis .</field>
        <field name="Initial Color" type="Color4" default="#VEC4_ONE#">Defines color of a birthed particle.</field>
        <field name="Initial Radius" type="float" default="1.0">Size of a birthed particle.</field>
        <field name="Radius Variation" type="float" since="10.4.0.1">Particle Radius randomness.</field>
        <field name="Life Span" type="float">Duration until a particle dies.</field>
        <field name="Life Span Variation" type="float">Adds randomness to Life Span.</field>
    </niobject>

    <niobject name="NiPSysVolumeEmitter" abstract="true" inherit="NiPSysEmitter" module="NiParticle">
        Abstract base class for particle emitters that emit particles from a volume.
        <field name="Emitter Object" type="Ptr" template="NiNode" since="10.1.0.0">Node parent of this modifier?</field>
    </niobject>

    <niobject name="NiTimeController" abstract="true" inherit="NiObject" module="NiMain">
        Abstract base class that provides the base timing and update functionality for all the Gamebryo animation controllers.
        <field name="Next Controller" type="Ref" template="NiTimeController">Index of the next controller.</field>
        <field name="Flags" type="TimeControllerFlags" default="76" />
        <field name="Frequency" type="float" default="1.0">Frequency (is usually 1.0).</field>
        <field name="Phase" type="float">Phase (usually 0.0).</field>
        <field name="Start Time" type="float" default="#FLT_MAX#">Controller start time.</field>
        <field name="Stop Time" type="float" default="#FLT_MIN#">Controller stop time.</field>
        <field name="Target" type="Ptr" template="NiObjectNET" since="3.3.0.13">Controller target (object index of the first controllable ancestor of this object).</field>
        <field name="Unknown Integer" type="uint" until="3.1" />
    </niobject>


    <niobject name="NiInterpController" abstract="true" inherit="NiTimeController" module="NiAnimation">
        Abstract base class for all NiTimeController objects using NiInterpolator objects to animate their target objects.
        <field name="Manager Controlled" type="bool" since="10.1.0.104" until="10.1.0.108" />
    </niobject>

    <niobject name="NiMultiTargetTransformController" inherit="NiInterpController" module="NiAnimation">
        DEPRECATED (20.6)
        <field name="Num Extra Targets" type="ushort">The number of target pointers that follow.</field>
        <field name="Extra Targets" type="Ptr" template="NiAVObject" length="Num Extra Targets">NiNode Targets to be controlled.</field>
    </niobject>

    <niobject name="NiGeomMorpherController" inherit="NiInterpController" module="NiAnimation">
        DEPRECATED (20.5), replaced by NiMorphMeshModifier.
        Time controller for geometry morphing.
        <field name="Morpher Flags" type="GeomMorpherFlags" since="10.0.1.2" />
        <field name="Data" type="Ref" template="NiMorphData">Geometry morphing data index.</field>
        <field name="Always Update" type="byte" since="4.0.0.2" />
        <field name="Num Interpolators" type="uint" since="10.1.0.106" />
        <field name="Interpolators" type="Ref" template="NiInterpolator" length="Num Interpolators" since="10.1.0.106" until="20.0.0.5" />
        <field name="Interpolator Weights" type="MorphWeight" length="Num Interpolators" since="20.1.0.3" />
        <field name="Num Unknown Ints" type="uint" since="10.2.0.0" until="20.0.0.5" vercond="#BSVER# #GT# 9" />
        <field name="Unknown Ints" type="uint" length="Num Unknown Ints" since="10.2.0.0" until="20.0.0.5" vercond="#BSVER# #GT# 9" />
    </niobject>

    <niobject name="NiMorphController" inherit="NiInterpController" module="NiLegacy" until="V10_0_1_0">
        Unknown! Used by Daoc->'healing.nif'.
    </niobject>

    <niobject name="NiMorpherController" inherit="NiInterpController" module="NiAnimation">
        Unknown! Used by Daoc.
        <field name="Data" type="Ref" template="NiMorphData">This controller's data.</field>
    </niobject>

    <niobject name="NiSingleInterpController" abstract="true" inherit="NiInterpController" module="NiAnimation">
        Uses a single NiInterpolator to animate its target value.
        <field name="Interpolator" type="Ref" template="NiInterpolator" since="10.1.0.104" />
    </niobject>

    <niobject name="NiKeyframeController" inherit="NiSingleInterpController" module="NiAnimation">
        DEPRECATED (10.2), RENAMED (10.2) to NiTransformController
        A time controller object for animation key frames.
        <field name="Data" type="Ref" template="NiKeyframeData" until="10.1.0.103" />
    </niobject>

    <niobject name="NiTransformController" inherit="NiKeyframeController" module="NiAnimation">
        NiTransformController replaces NiKeyframeController.
    </niobject>

    <niobject name="NiPSysModifierCtlr" abstract="true" inherit="NiSingleInterpController" module="NiParticle">
        A particle system modifier controller.
        NiInterpController::GetCtlrID() string format:
            '%s'
        Where %s = Value of "Modifier Name"
        <field name="Modifier Name" type="string">Used to find the modifier pointer.</field>
    </niobject>

    <niobject name="NiPSysEmitterCtlr" inherit="NiPSysModifierCtlr" module="NiParticle">
        Particle system emitter controller.
        NiInterpController::GetInterpolatorID() string format:
            ['BirthRate', 'EmitterActive'] (for "Interpolator" and "Visibility Interpolator" respectively)
        <field name="Data" type="Ref" template="NiPSysEmitterCtlrData" until="10.1.0.103" />
        <field name="Visibility Interpolator" type="Ref" template="NiInterpolator" since="10.1.0.104" />
    </niobject>

    <niobject name="NiPSysModifierBoolCtlr" abstract="true" inherit="NiPSysModifierCtlr" module="NiParticle">
        A particle system modifier controller that animates a boolean value for particles.
    </niobject>

    <niobject name="NiPSysModifierActiveCtlr" inherit="NiPSysModifierBoolCtlr" module="NiParticle">
        A particle system modifier controller that animates active/inactive state for particles.
        <field name="Data" type="Ref" template="NiVisData" until="10.1.0.103" />
    </niobject>

    <niobject name="NiPSysModifierFloatCtlr" abstract="true" inherit="NiPSysModifierCtlr" module="NiParticle">
        A particle system modifier controller that animates a floating point value for particles.
        <field name="Data" type="Ref" template="NiFloatData" until="10.1.0.103" />
    </niobject>

    <niobject name="NiPSysEmitterDeclinationCtlr" inherit="NiPSysModifierFloatCtlr" module="NiParticle">
        Animates the declination value on an NiPSysEmitter object.
    </niobject>

    <niobject name="NiPSysEmitterDeclinationVarCtlr" inherit="NiPSysModifierFloatCtlr" module="NiParticle">
        Animates the declination variation value on an NiPSysEmitter object.
    </niobject>

    <niobject name="NiPSysEmitterInitialRadiusCtlr" inherit="NiPSysModifierFloatCtlr" module="NiParticle">
        Animates the size value on an NiPSysEmitter object.
    </niobject>

    <niobject name="NiPSysEmitterLifeSpanCtlr" inherit="NiPSysModifierFloatCtlr" module="NiParticle">
        Animates the lifespan value on an NiPSysEmitter object.
    </niobject>

    <niobject name="NiPSysEmitterSpeedCtlr" inherit="NiPSysModifierFloatCtlr" module="NiParticle">
        Animates the speed value on an NiPSysEmitter object.
    </niobject>

    <niobject name="NiPSysGravityStrengthCtlr" inherit="NiPSysModifierFloatCtlr" module="NiParticle">
        Animates the strength value of an NiPSysGravityModifier.
    </niobject>


    <niobject name="NiFloatInterpController" abstract="true" inherit="NiSingleInterpController" module="NiAnimation">
        Abstract base class for all NiInterpControllers that use an NiInterpolator to animate their target float value.
    </niobject>

    <niobject name="NiFlipController" inherit="NiFloatInterpController" module="NiAnimation">
        Changes the image a Map (TexDesc) will use. Uses a float interpolator to animate the texture index.
        Often used for performing flipbook animation.
        <field name="Texture Slot" type="TexType">Target texture slot (0=base, 4=glow).</field>
        <field name="Accum Time" type="float" since="3.3.0.13" until="10.1.0.103" />
        <field name="Delta" type="float" until="10.1.0.103">
            Time between two flips.
            delta = (start_time - stop_time) / sources.num_indices
        </field>
        <field name="Num Sources" type="uint" />
        <field name="Sources" type="Ref" template="NiSourceTexture" length="Num Sources" since="3.3.0.13">The texture sources.</field>
        <field name="Images" type="Ref" template="NiImage" length="Num Sources" until="3.1">The image sources</field>
    </niobject>

    <niobject name="NiAlphaController" inherit="NiFloatInterpController" module="NiAnimation">
        Animates the alpha value of a property using an interpolator.
        <field name="Data" type="Ref" template="NiFloatData" until="10.1.0.103" />
    </niobject>

    <niobject name="NiTextureTransformController" inherit="NiFloatInterpController" module="NiAnimation">
        Used to animate a single member of an NiTextureTransform.
        NiInterpController::GetCtlrID() string formats:
            ['%1-%2-TT_TRANSLATE_U', '%1-%2-TT_TRANSLATE_V', '%1-%2-TT_ROTATE', '%1-%2-TT_SCALE_U', '%1-%2-TT_SCALE_V']
        (Depending on "Operation" enumeration, %1 = Value of "Shader Map", %2 = Value of "Texture Slot")
        <field name="Shader Map" type="bool">Is the target map a shader map?</field>
        <field name="Texture Slot" type="TexType">The target texture slot.</field>
        <field name="Operation" type="TransformMember">Controls which aspect of the texture transform to modify.</field>
        <field name="Data" type="Ref" template="NiFloatData" until="10.1.0.103" />
    </niobject>

    <niobject name="NiLightDimmerController" inherit="NiFloatInterpController" module="NiAnimation">
        Animates the dimmer value of an NiLight.
    </niobject>

    <niobject name="NiBoolInterpController" abstract="true" inherit="NiSingleInterpController" module="NiAnimation">
        Abstract base class for all NiInterpControllers that use a NiInterpolator to animate their target boolean value.
    </niobject>

    <niobject name="NiVisController" inherit="NiBoolInterpController" module="NiAnimation">
        Animates the visibility of an NiAVObject.
        <field name="Data" type="Ref" template="NiVisData" until="10.1.0.103" />
    </niobject>

    <niobject name="NiPoint3InterpController" abstract="true" inherit="NiSingleInterpController" module="NiAnimation">
        Abstract base class for all NiInterpControllers that use an NiInterpolator to animate their target NiPoint3 value.
    </niobject>

    <niobject name="NiMaterialColorController" inherit="NiPoint3InterpController" module="NiAnimation">
        Time controller for material color. Flags are used for color selection in versions below 10.1.0.0.
        Bits 4-5: Target Color (00 = Ambient, 01 = Diffuse, 10 = Specular, 11 = Emissive)
        NiInterpController::GetCtlrID() string formats:
            ['AMB', 'DIFF', 'SPEC', 'SELF_ILLUM'] (Depending on "Target Color")
        <field name="Target Color" type="MaterialColor" since="10.1.0.0">Selects which color to control.</field>
        <field name="Data" type="Ref" template="NiPosData" until="10.1.0.103" />
    </niobject>

    <niobject name="NiLightColorController" inherit="NiPoint3InterpController" module="NiAnimation">
        Animates the ambient, diffuse and specular colors of an NiLight.
        NiInterpController::GetCtlrID() string formats:
            ['Diffuse', 'Ambient'] (Depending on "Target Color")
        <field name="Target Color" type="LightColor" since="10.1.0.0" />
        <field name="Data" type="Ref" template="NiPosData" until="10.1.0.103" />
    </niobject>


    <niobject name="NiExtraDataController" abstract="true" inherit="NiSingleInterpController" module="NiAnimation">
        Abstract base class for all extra data controllers.
        NiInterpController::GetCtlrID() string format:
            '%s'
        Where %s = Value of "Extra Data Name"
        <field name="Extra Data Name" type="string" since="10.2.0.0" />
    </niobject>

    <niobject name="NiColorExtraDataController" inherit="NiExtraDataController" module="NiAnimation">
        Animates an NiColorExtraData object attached to an NiAVObject.
    </niobject>

    <niobject name="NiFloatExtraDataController" inherit="NiExtraDataController" module="NiAnimation">
        Animates an NiFloatExtraData object attached to an NiAVObject.
        NiInterpController::GetCtlrID() string format is same as parent.
        <field name="Num Extra Bytes" type="byte" until="10.1.0.0">Number of extra bytes.</field>
        <field name="Unknown Bytes" type="byte" length="7" until="10.1.0.0" />
        <field name="Unknown Extra Bytes" type="byte" length="Num Extra Bytes" until="10.1.0.0" />
        <field name="Data" type="Ref" template="NiFloatData" until="10.1.0.103" />
    </niobject>

    <niobject name="NiFloatsExtraDataController" inherit="NiExtraDataController" module="NiAnimation">
        Animates an NiFloatsExtraData object attached to an NiAVObject.
        NiInterpController::GetCtlrID() string format:
            '%s[%d]'
        Where %s = Value of "Extra Data Name", %d = Value of "Floats Extra Data Index"
        <field name="Floats Extra Data Index" type="int" />
        <field name="Data" type="Ref" template="NiFloatData" until="10.1.0.103" />
    </niobject>

    <niobject name="NiFloatsExtraDataPoint3Controller" inherit="NiExtraDataController" module="NiAnimation">
        Animates an NiFloatsExtraData object attached to an NiAVObject.
        NiInterpController::GetCtlrID() string format:
            '%s[%d]'
        Where %s = Value of "Extra Data Name", %d = Value of "Floats Extra Data Index"
        <field name="Floats Extra Data Index" type="int" />
    </niobject>

    <niobject name="NiBoneLODController" inherit="NiTimeController" module="NiAnimation">
        DEPRECATED (20.5), Replaced by NiSkinningLODController.
        Level of detail controller for bones.  Priority is arranged from low to high.
        <field name="LOD" type="uint" />
        <field name="Num LODs" type="uint">Number of LODs.</field>
        <field name="Num Node Groups" type="uint">Number of node arrays.</field>
        <field name="Node Groups" type="NodeSet" length="Num LODs">A list of node sets (each set a sequence of bones).</field>
        <field name="Num Shape Groups" type="uint" since="4.2.2.0" vercond="#NISTREAM#">Number of shape groups.</field>
        <field name="Shape Groups 1" type="SkinInfoSet" length="Num Shape Groups" since="4.2.2.0" vercond="#NISTREAM#">List of shape groups.</field>
        <field name="Num Shape Groups 2" type="uint" since="4.2.2.0" vercond="#NISTREAM#">The size of the second list of shape groups.</field>
        <field name="Shape Groups 2" type="Ref" template="NiTriBasedGeom" length="Num Shape Groups 2" since="4.2.2.0" vercond="#NISTREAM#">Group of NiTriShape indices.</field>
    </niobject>

    <niobject name="NiBSBoneLODController" inherit="NiBoneLODController" module="BSAnimation">
        A simple LOD controller for bones.
    </niobject>
    
    <compound name="MaterialData">
        <field name="Has Shader" type="bool" since="10.0.1.0" until="20.1.0.3">Shader.</field>
        <field name="Shader Name" type="string" cond="Has Shader" since="10.0.1.0" until="20.1.0.3">The shader name.</field>
        <field name="Shader Extra Data" type="int" cond="Has Shader" since="10.0.1.0" until="20.1.0.3">Extra data associated with the shader. A value of -1 means the shader is the default implementation.</field>
        <field name="Num Materials" type="uint" since="20.2.0.5" />
        <field name="Material Name" type="NiFixedString" length="Num Materials" since="20.2.0.5">The name of the material.</field>
        <field name="Material Extra Data" type="int" length="Num Materials" since="20.2.0.5">Extra data associated with the material. A value of -1 means the material is the default implementation.</field>
        <field name="Active Material" type="int" default="-1" since="20.2.0.5">The index of the currently active material.</field>
        <field name="Cyanide Unknown" type="byte" default="255" since="10.2.0.0" until="10.2.0.0" vercond="#USER# == 1">Cyanide extension (Blood Bowl).</field>
        <field name="WorldShift Unknown" type="int" since="10.3.0.1" until="10.4.0.1" />
        <field name="Material Needs Update" type="bool" since="20.2.0.7">Whether the materials for this object always needs to be updated before rendering with them.</field>
    </compound>

    <niobject name="NiGeometry" abstract="true" inherit="NiAVObject" module="NiMain">
        Describes a visible scene element with vertices like a mesh, a particle system, lines, etc.
            Bethesda 20.2.0.7 NIFs: NiGeometry was changed to BSGeometry. 
            Most new blocks (e.g. BSTriShape) do not refer to NiGeometry except NiParticleSystem was changed to use BSGeometry.
            This causes massive inheritance problems so the rows below are doubled up to exclude NiParticleSystem for Bethesda Stream 100+
            and to add data exclusive to BSGeometry.
        <field name="Bounding Sphere" type="NiBound" since="20.2.0.7" until="20.2.0.7" vercond="#BS_GTE_SSE#" onlyT="NiParticleSystem" />
        <field name="Bound Min Max" type="float" length="6" since="20.2.0.7" until="20.2.0.7" vercond="#BS_F76#" onlyT="NiParticleSystem" />
        <field name="Skin" type="Ref" template="NiObject" since="20.2.0.7" until="20.2.0.7" vercond="#BS_GTE_SSE#" onlyT="NiParticleSystem" />
        <field name="Data" type="Ref" template="NiGeometryData" vercond="#NI_BS_LT_SSE#">Data index (NiTriShapeData/NiTriStripData).</field>
        <field name="Data" type="Ref" template="NiGeometryData" since="20.2.0.7" until="20.2.0.7" vercond="#BS_GTE_SSE#" excludeT="NiParticleSystem">Data index (NiTriShapeData/NiTriStripData).</field>
        <field name="Skin Instance" type="Ref" template="NiSkinInstance" since="3.3.0.13" vercond="#NI_BS_LT_SSE#" />
        <field name="Skin Instance" type="Ref" template="NiSkinInstance" since="20.2.0.7" until="20.2.0.7" vercond="#BS_GTE_SSE#" excludeT="NiParticleSystem" />
        <field name="Material Data" type="MaterialData" since="10.0.1.0" vercond="#NI_BS_LT_SSE#" />
        <field name="Material Data" type="MaterialData" since="20.2.0.7" until="20.2.0.7" vercond="#BS_GTE_SSE#" excludeT="NiParticleSystem" />
        <field name="Shader Property" type="Ref" template="BSShaderProperty" since="20.2.0.7" until="20.2.0.7" vercond="#BS_GT_FO3#" />
        <field name="Alpha Property" type="Ref" template="NiAlphaProperty" since="20.2.0.7" until="20.2.0.7" vercond="#BS_GT_FO3#" />
    </niobject>

    <niobject name="NiTriBasedGeom" abstract="true" inherit="NiGeometry" module="NiMain">
        Describes a mesh, built from triangles.
    </niobject>

    <niobject name="NiGeometryData" abstract="true" inherit="NiObject" module="NiMain">
        Mesh data: vertices, vertex normals, etc.
            Bethesda 20.2.0.7 NIFs: NiParticlesData no longer inherits from NiGeometryData and inherits NiObject directly. 
            "Num Vertices" is renamed to "BS Max Vertices" for Bethesda 20.2 because Vertices, Normals, Tangents, Colors, and UV arrays
            do not have length for NiPSysData regardless of "Num" or booleans.

        <field name="Group ID" type="int" since="10.1.0.114">Always zero.</field>
        <field name="Num Vertices" type="ushort" excludeT="NiPSysData">Number of vertices.</field>
        <field name="Num Vertices" type="ushort" onlyT="NiPSysData" vercond="#NI_BS_LT_FO3#">Number of vertices.</field>
        <field name="BS Max Vertices" type="ushort" onlyT="NiPSysData" since="20.2.0.7" until="20.2.0.7" vercond="#BS_GTE_FO3#">Bethesda uses this for max number of particles in NiPSysData.</field>
        <field name="Keep Flags" type="byte" since="10.1.0.0">Used with NiCollision objects when OBB or TRI is set.</field>
        <field name="Compress Flags" type="byte" since="10.1.0.0" />
        <field name="Has Vertices" type="bool" default="1">Is the vertex array present? (Always non-zero.)</field>
        <field name="Vertices" type="Vector3" length="Num Vertices" cond="Has Vertices">The mesh vertices.</field>
        <field name="Data Flags" type="NiGeometryDataFlags" since="10.0.1.0" vercond="!#BS202#" />
        <field name="BS Data Flags" type="BSGeometryDataFlags" vercond="#BS202#" />
        <field name="Material CRC" type="uint" since="20.2.0.7" until="20.2.0.7" vercond="#BS_GT_FO3#" />
        <field name="Has Normals" type="bool">Do we have lighting normals? These are essential for proper lighting: if not present, the model will only be influenced by ambient light.</field>
        <field name="Normals" type="Vector3" length="Num Vertices" cond="Has Normals">The lighting normals.</field>
        <field name="Tangents" type="Vector3" length="Num Vertices" cond="(Has Normals) #AND# ((Data Flags | BS Data Flags) #BITAND# 4096)" since="10.1.0.0">Tangent vectors.</field>
        <field name="Bitangents" type="Vector3" length="Num Vertices" cond="(Has Normals) #AND# ((Data Flags | BS Data Flags) #BITAND# 4096)" since="10.1.0.0">Bitangent vectors.</field>
        <field name="Has DIV2 Floats" type="bool" since="20.3.0.9" until="20.3.0.9" vercond="#DIVINITY2#" />
        <field name="DIV2 Floats" type="float" length="Num Vertices" since="20.3.0.9" until="20.3.0.9" vercond="#DIVINITY2#" cond="Has DIV2 Floats" />
        <field name="Bounding Sphere" type="NiBound" />
        <field name="Has Vertex Colors" type="bool">
            Do we have vertex colors? These are usually used to fine-tune the lighting of the model.

            Note: how vertex colors influence the model can be controlled by having a NiVertexColorProperty object as a property child of the root node. If this property object is not present, the vertex colors fine-tune lighting.

            Note 2: set to either 0 or 0xFFFFFFFF for NifTexture compatibility.
        </field>
        <field name="Vertex Colors" type="Color4" default="#VEC4_ONE#" length="Num Vertices" cond="Has Vertex Colors">The vertex colors.</field>
        <field name="Data Flags" type="NiGeometryDataFlags" until="4.2.2.0">The lower 6 bits of this field represent the number of UV texture sets. The rest is unused.</field>
        <field name="Has UV" type="bool" until="4.0.0.2">
            Do we have UV coordinates?

            Note: for compatibility with NifTexture, set this value to either 0x00000000 or 0xFFFFFFFF.
        </field>
        <field name="UV Sets" type="TexCoord" length="((Data Flags #BITAND# 63) | (BS Data Flags #BITAND# 1))" width="Num Vertices">The UV texture coordinates. They follow the OpenGL standard: some programs may require you to flip the second coordinate.</field>
        <field name="Consistency Flags" type="ConsistencyType" since="10.0.1.0" default="CT_MUTABLE">Consistency Flags</field>
        <field name="Additional Data" type="Ref" template="AbstractAdditionalGeometryData" since="20.0.0.4" />
    </niobject>

    <niobject name="AbstractAdditionalGeometryData" abstract="true" inherit="NiObject" module="NiMain">
    </niobject>

    <niobject name="NiTriBasedGeomData" abstract="true" inherit="NiGeometryData" module="NiMain">
        Describes a mesh, built from triangles.
        <field name="Num Triangles" type="ushort">Number of triangles.</field>
    </niobject>

    <niobject name="bhkBlendController" inherit="NiTimeController" module="BSHavok">
        Unknown. Is apparently only used in skeleton.nif files.
        <field name="Keys" type="uint">Seems to be always zero.</field>
    </niobject>

    <niobject name="BSBound" inherit="NiExtraData" module="BSMain" versions="#BETHESDA#">
        Bethesda-specific collision bounding box for skeletons.
        <field name="Center" type="Vector3">Center of the bounding box.</field>
        <field name="Dimensions" type="Vector3">Dimensions of the bounding box from center.</field>
    </niobject>

    <niobject name="BSFurnitureMarker" inherit="NiExtraData" module="BSMain" versions="#BETHESDA#">
        Unknown. Marks furniture sitting positions?
        <field name="Num Positions" type="uint" />
        <field name="Positions" type="FurniturePosition" length="Num Positions" />
    </niobject>

    <niobject name="BSParentVelocityModifier" inherit="NiPSysModifier" module="BSParticle" versions="#BETHESDA#">
        Particle modifier that adds a percentage of object space translation and rotation to particles born in world space.
        <field name="Damping" type="float">Amount of blending?</field>
    </niobject>

    <niobject name="BSPSysArrayEmitter" inherit="NiPSysVolumeEmitter" module="BSParticle" versions="#BETHESDA#">
        Particle emitter that uses a node, its children and subchildren to emit from.  Emission will be evenly spread along points from nodes leading to their direct parents/children only.
    </niobject>

    <niobject name="BSWindModifier" inherit="NiPSysModifier" module="BSParticle" versions="#BETHESDA#">
        Particle Modifier that uses the wind value from the gamedata to alter the path of particles.
        <field name="Strength" type="float" default="0.25">The amount of force wind will have on particles.</field>
    </niobject>

    <niobject name="hkPackedNiTriStripsData" inherit="bhkShapeCollection" module="BSHavok" versions="#BETHESDA#">
        Bethesda custom tri strips data block for bhkPackedNiTriStripsShape.
        <field name="Num Triangles" type="uint" />
        <field name="Triangles" type="TriangleData" length="Num Triangles" />
        <field name="Num Vertices" type="uint" />
        <field name="Compressed" type="bool" since="20.2.0.7" />
        <field name="Vertices" type="Vector3" length="Num Vertices" cond="Compressed == 0" />
        <field name="Compressed Vertices" type="HalfVector3" length="Num Vertices" cond="Compressed != 0">
            Compression on read may not be supported. Vertices may be packed in ushort that are not IEEE standard half-precision.
        </field>
        <field name="Num Sub Shapes" type="ushort" since="20.2.0.7" />
        <field name="Sub Shapes" type="hkSubPartData" length="Num Sub Shapes" since="20.2.0.7" />
    </niobject>

    <niobject name="NiAlphaProperty" inherit="NiProperty" module="NiMain">
        Transparency. Flags 0x00ED.
        <field name="Flags" type="AlphaFlags" default="4844" />
        <field name="Threshold" type="byte" default="128">Threshold for alpha testing</field>
        <field name="Unknown Short 1" type="ushort" until="2.3" />
        <field name="Unknown Int 2" type="uint" until="2.3" />
    </niobject>

    <niobject name="NiAmbientLight" inherit="NiLight" module="NiMain">
        Ambient light source.
    </niobject>

    <bitflags name="AspectFlags" storage="ushort" versions="#FO3_AND_LATER#">
        <option bit="0" name="Velocity Orientation" />
        <option bit="1" name="Initial Rotation from Velocity" />
        <option bit="8" name="Speed to Aspect Enabled" />
    </bitflags>

    <niobject name="NiParticlesData" inherit="NiGeometryData" module="NiMain">
        Generic rotating particles data object.
        Bethesda 20.2.0.7 NIFs: NiParticlesData no longer inherits from NiGeometryData and inherits NiObject directly.
        <field name="Num Particles" type="ushort" until="4.0.0.2">The maximum number of particles (matches the number of vertices).</field>
        <field name="Particle Radius" type="float" until="10.0.1.0">The particles' size.</field>
        <field name="Has Radii" type="bool" since="10.1.0.0">Is the particle size array present?</field>
        <field name="Radii" type="float" length="Num Vertices" cond="Has Radii" since="10.1.0.0" vercond="!#BS202#">The individual particle sizes.</field>
        <field name="Num Active" type="ushort">The number of active particles at the time the system was saved. This is also the number of valid entries in the following arrays.</field>
        <field name="Has Sizes" type="bool">Is the particle size array present?</field>
        <field name="Sizes" type="float" length="Num Vertices" cond="Has Sizes" vercond="!#BS202#">The individual particle sizes.</field>
        <field name="Has Rotations" type="bool" since="10.0.1.0">Is the particle rotation array present?</field>
        <field name="Rotations" type="Quaternion" length="Num Vertices" cond="Has Rotations" since="10.0.1.0" vercond="!#BS202#">The individual particle rotations.</field>
        <field name="Has Rotation Angles" type="bool" since="20.0.0.4">Are the angles of rotation present?</field>
        <field name="Rotation Angles" type="float" length="Num Vertices" cond="Has Rotation Angles" vercond="!#BS202#">Angles of rotation</field>
        <field name="Has Rotation Axes" type="bool" since="20.0.0.4">Are axes of rotation present?</field>
        <field name="Rotation Axes" type="Vector3" length="Num Vertices" cond="Has Rotation Axes" since="20.0.0.4" vercond="!#BS202#">Axes of rotation.</field>

        <field name="Has Texture Indices" type="bool" vercond="#BS202#" />
        <field name="Num Subtexture Offsets" type="uint" since="20.2.0.7" until="20.2.0.7" vercond="#BS_GT_FO3#">How many quads to use in BSPSysSubTexModifier for texture atlasing</field>
        <field name="Num Subtexture Offsets" type="byte" since="20.2.0.7" until="20.2.0.7" vercond="#BSSTREAM# #AND# #NI_BS_LTE_FO3#">2,4,8,16,32,64 are potential values. If "Has" was no then this should be 256, which represents a 16x16 framed image, which is invalid</field>
        <field name="Subtexture Offsets" type="Vector4" length="Num Subtexture Offsets" vercond="#BS202#">Defines UV offsets</field>
        <field name="Aspect Ratio" type="float" since="20.2.0.7" until="20.2.0.7" vercond="#BS_GT_FO3#">Sets aspect ratio for Subtexture Offset UV quads</field>
        <field name="Aspect Flags" type="AspectFlags" since="20.2.0.7" until="20.2.0.7" vercond="#BS_GT_FO3#" />
        <field name="Speed to Aspect Aspect 2" type="float" since="20.2.0.7" until="20.2.0.7" vercond="#BS_GT_FO3#" />
        <field name="Speed to Aspect Speed 1" type="float" since="20.2.0.7" until="20.2.0.7" vercond="#BS_GT_FO3#" />
        <field name="Speed to Aspect Speed 2" type="float" since="20.2.0.7" until="20.2.0.7" vercond="#BS_GT_FO3#" />
    </niobject>

    <niobject name="NiRotatingParticlesData" inherit="NiParticlesData" module="NiLegacy" until="V10_0_1_0">
        Rotating particles data object.
        <field name="Has Rotations 2" type="bool" until="4.2.2.0">Is the particle rotation array present?</field>
        <field name="Rotations 2" type="Quaternion" length="Num Vertices" cond="Has Rotations 2" until="4.2.2.0">The individual particle rotations.</field>
    </niobject>

    <niobject name="NiAutoNormalParticlesData" inherit="NiParticlesData" module="NiLegacy" until="V10_0_1_0">
        Particle system data object (with automatic normals?).
    </niobject>

    <niobject name="NiPSysData" inherit="NiParticlesData" module="NiParticle">
        Particle system data.
        <field name="Particle Info" type="NiParticleInfo" length="Num Vertices" vercond="!#BS202#" />
        <field name="Unknown Vector" type="Vector3" vercond="#BS_F76#" />
        <field name="Has Rotation Speeds" type="bool" since="20.0.0.2" />
        <field name="Rotation Speeds" type="float" length="Num Vertices" cond="Has Rotation Speeds" since="20.0.0.2" vercond="!#BS202#" />
        <field name="Num Added Particles" type="ushort" vercond="!#BS202#" />
        <field name="Added Particles Base" type="ushort" vercond="!#BS202#" />
    </niobject>
    
    <niobject name="NiMeshPSysData" inherit="NiPSysData" module="NiParticle">
        Particle meshes data.
        <field name="Default Pool Size" type="uint" since="10.2.0.0" />
        <field name="Fill Pools On Load" type="bool" since="10.2.0.0" />
        <field name="Num Generations" type="uint" since="10.2.0.0" />
        <field name="Generations" type="uint" since="10.2.0.0" length="Num Generations" />
        <field name="Particle Meshes" type="Ref" template="NiNode" />
    </niobject>

    <niobject name="NiBinaryExtraData" inherit="NiExtraData" module="NiMain">
        Binary extra data object. Used to store tangents and bitangents in Oblivion.
        <field name="Binary Data" type="ByteArray">The binary data.</field>
    </niobject>

    <niobject name="NiBinaryVoxelExtraData" inherit="NiExtraData" module="NiLegacy" until="V3_1">
        Voxel extra data object.
        <field name="Data" type="Ref" template="NiBinaryVoxelData" />
    </niobject>

    <niobject name="NiBinaryVoxelData" inherit="NiObject" module="NiLegacy" until="V3_1">
        Voxel data object.
        <field name="Unknown Short 1" type="ushort" />
        <field name="Unknown Short 2" type="ushort" />
        <field name="Unknown Short 3" type="ushort" />
        <field name="Unknown 7 Floats" type="float" length="7" />
        <field name="Unknown Bytes 1" type="byte" length="7" width="12" />
        <field name="Num Unknown Vectors" type="uint" />
        <field name="Unknown Vectors" type="Vector4" length="Num Unknown Vectors" />
        <field name="Num Unknown Bytes 2" type="uint" />
        <field name="Unknown Bytes 2" type="byte" length="Num Unknown Bytes 2" />
        <field name="Unknown 5 Ints" type="uint" length="5" />
    </niobject>

    <niobject name="NiBlendBoolInterpolator" inherit="NiBlendInterpolator" module="NiAnimation">
        Blends bool values together.
        <field name="Value" type="byte" default="2">The pose value. Invalid if using data.</field>
    </niobject>

    <niobject name="NiBlendFloatInterpolator" inherit="NiBlendInterpolator" module="NiAnimation">
        Blends float values together.
        <field name="Value" type="float" default="#INV_FLT#">The pose value. Invalid if using data.</field>
    </niobject>

    <niobject name="NiBlendPoint3Interpolator" inherit="NiBlendInterpolator" module="NiAnimation">
        Blends NiPoint3 values together.
        <field name="Value" type="Vector3" default="#INV_VEC3#">The pose value. Invalid if using data.</field>
    </niobject>

    <niobject name="NiBlendTransformInterpolator" inherit="NiBlendInterpolator" module="NiAnimation">
        Blends NiQuatTransform values together.
        <field name="Value" type="NiQuatTransform" until="10.1.0.109" />
    </niobject>

    <niobject name="NiBoolData" inherit="NiObject" module="NiAnimation">
        Wrapper for boolean animation keys.
        <field name="Data" type="KeyGroup" template="byte">The boolean keys.</field>
    </niobject>

    <niobject name="NiBooleanExtraData" inherit="NiExtraData" module="NiMain">
        Boolean extra data.
        <field name="Boolean Data" type="byte">The boolean extra data value.</field>
    </niobject>

    <niobject name="NiBSplineBasisData" inherit="NiObject" module="NiAnimation">
        Contains an NiBSplineBasis for use in interpolation of open, uniform B-Splines.
        <field name="Num Control Points" type="uint">The number of control points of the B-spline (number of frames of animation plus degree of B-spline minus one).</field>
    </niobject>

    <niobject name="NiBSplineFloatInterpolator" abstract="true" inherit="NiBSplineInterpolator" module="NiAnimation">
        Uses B-Splines to animate a float value over time.
        <field name="Value" type="float" default="#INV_FLT#">Base value when curve not defined.</field>
        <field name="Handle" type="uint" default="0xFFFF">Handle into the data. (USHRT_MAX for invalid handle.)</field>
    </niobject>

    <niobject name="NiBSplineCompFloatInterpolator" inherit="NiBSplineFloatInterpolator" module="NiAnimation">
        NiBSplineFloatInterpolator plus the information required for using compact control points.
        <field name="Float Offset" type="float" default="#FLT_MAX#" />
        <field name="Float Half Range" type="float" default="#FLT_MAX#" />
    </niobject>

    <niobject name="NiBSplinePoint3Interpolator" abstract="true" inherit="NiBSplineInterpolator" module="NiAnimation">
        Uses B-Splines to animate an NiPoint3 value over time.
        <field name="Value" type="Vector3" default="#INV_VEC3#">Base value when curve not defined.</field>
        <field name="Handle" type="uint" default="0xFFFF">Handle into the data. (USHRT_MAX for invalid handle.)</field>
    </niobject>

    <niobject name="NiBSplineCompPoint3Interpolator" inherit="NiBSplinePoint3Interpolator" module="NiAnimation">
        NiBSplinePoint3Interpolator plus the information required for using compact control points.
        <field name="Position Offset" type="float" default="#FLT_MAX#" />
        <field name="Position Half Range" type="float" default="#FLT_MAX#" />
    </niobject>

    <niobject name="NiBSplineTransformInterpolator" inherit="NiBSplineInterpolator" module="NiAnimation">
        Supports the animation of position, rotation, and scale using an NiQuatTransform.
        The NiQuatTransform can be an unchanging pose or interpolated from B-Spline control point channels.
        <field name="Transform" type="NiQuatTransform" />
        <field name="Translation Handle" type="uint" default="0xFFFF">Handle into the translation data. (USHRT_MAX for invalid handle.)</field>
        <field name="Rotation Handle" type="uint" default="0xFFFF">Handle into the rotation data. (USHRT_MAX for invalid handle.)</field>
        <field name="Scale Handle" type="uint" default="0xFFFF">Handle into the scale data. (USHRT_MAX for invalid handle.)</field>
    </niobject>

    <niobject name="NiBSplineCompTransformInterpolator" inherit="NiBSplineTransformInterpolator" module="NiAnimation">
        NiBSplineTransformInterpolator plus the information required for using compact control points.
        <field name="Translation Offset" type="float" default="#FLT_MAX#" />
        <field name="Translation Half Range" type="float" default="#FLT_MAX#" />
        <field name="Rotation Offset" type="float" default="#FLT_MAX#" />
        <field name="Rotation Half Range" type="float" default="#FLT_MAX#" />
        <field name="Scale Offset" type="float" default="#FLT_MAX#" />
        <field name="Scale Half Range" type="float" default="#FLT_MAX#" />
    </niobject>
	
	<niobject name="BSRotAccumTransfInterpolator" inherit="NiTransformInterpolator" module="BSAnimation" versions="#BETHESDA#">
	</niobject>

    <niobject name="NiBSplineData" inherit="NiObject" module="NiAnimation">
        Contains one or more sets of control points for use in interpolation of open, uniform B-Splines, stored as either float or compact.
        <field name="Num Float Control Points" type="uint" />
        <field name="Float Control Points" type="float" length="Num Float Control Points">Float values representing the control data.</field>
        <field name="Num Compact Control Points" type="uint" />
        <field name="Compact Control Points" type="short" length="Num Compact Control Points">Signed shorts representing the data from 0 to 1 (scaled by SHRT_MAX).</field>
    </niobject>

    <niobject name="NiCamera" inherit="NiAVObject" module="NiMain">
        Camera object.
        <field name="Camera Flags" type="ushort" since="10.1.0.0">Obsolete flags.</field>
        <field name="Frustum Left" type="float" default="-0.63707">Frustrum left.</field>
        <field name="Frustum Right" type="float" default="0.63707">Frustrum right.</field>
        <field name="Frustum Top" type="float" default="0.385714">Frustrum top.</field>
        <field name="Frustum Bottom" type="float" default="-0.385714">Frustrum bottom.</field>
        <field name="Frustum Near" type="float" default="1.0">Frustrum near.</field>
        <field name="Frustum Far" type="float" default="5000.0">Frustrum far.</field>
        <field name="Use Orthographic Projection" type="bool" since="10.1.0.0">Determines whether perspective is used.  Orthographic means no perspective.</field>
        <field name="Viewport Left" type="float">Viewport left.</field>
        <field name="Viewport Right" type="float" default="1.0">Viewport right.</field>
        <field name="Viewport Top" type="float" default="1.0">Viewport top.</field>
        <field name="Viewport Bottom" type="float">Viewport bottom.</field>
        <field name="LOD Adjust" type="float" default="1.0">Level of detail adjust.</field>
        <field name="Scene" type="Ref" template="NiAVObject" />
        <field name="Num Screen Polygons" type="uint" calc="0">Deprecated. Array is always zero length on disk write.</field>
        <field name="Num Screen Textures" type="uint" calc="0" since="4.2.1.0">Deprecated. Array is always zero length on disk write.</field>
        <field name="Unknown Int 3" type="uint" until="3.1" />
    </niobject>

    <niobject name="NiColorData" inherit="NiObject" module="NiAnimation">
        Wrapper for color animation keys.
        <field name="Data" type="KeyGroup" template="Color4">The color keys.</field>
    </niobject>

    <niobject name="NiColorExtraData" inherit="NiExtraData" module="NiMain">
        Extra data in the form of NiColorA (red, green, blue, alpha).
        <field name="Data" type="Color4">RGBA Color?</field>
    </niobject>

    <niobject name="NiControllerManager" inherit="NiTimeController" module="NiAnimation">
        Controls animation sequences on a specific branch of the scene graph.
        <field name="Cumulative" type="bool">Whether transformation accumulation is enabled. If accumulation is not enabled, the manager will treat all sequence data on the accumulation root as absolute data instead of relative delta values.</field>
        <field name="Num Controller Sequences" type="uint" />
        <field name="Controller Sequences" type="Ref" template="NiControllerSequence" length="Num Controller Sequences" />
        <field name="Object Palette" type="Ref" template="NiDefaultAVObjectPalette" />
    </niobject>

    <niobject name="NiSequence" inherit="NiObject" module="NiAnimation">
        Root node in NetImmerse .kf files (until version 10.0).
        <field name="Name" type="string">The sequence name by which the animation system finds and manages this sequence.</field>
        <field name="Accum Root Name" type="string" until="10.1.0.103">The name of the NiAVObject serving as the accumulation root. This is where all accumulated translations, scales, and rotations are applied.</field>
        <field name="Text Keys" type="Ref" template="NiTextKeyExtraData" until="10.1.0.103" />
        <field name="Num DIV2 Ints" type="uint" since="20.3.0.9" until="20.3.0.9" vercond="#DIVINITY2#" />
        <field name="DIV2 Ints" type="int" length="Num DIV2 Ints" since="20.3.0.9" until="20.3.0.9" vercond="#DIVINITY2#" />
        <field name="DIV2 Ref" type="Ref" template="NiObject" since="20.3.0.9" until="20.3.0.9" vercond="#DIVINITY2#" />
        <field name="Num Controlled Blocks" type="uint" />
        <field name="Array Grow By" type="uint" default="1" since="10.1.0.106" />
        <field name="Controlled Blocks" type="ControlledBlock" length="Num Controlled Blocks" />
    </niobject>

    <niobject name="NiControllerSequence" inherit="NiSequence" module="NiAnimation">
        Root node in Gamebryo .kf files (version 10.0.1.0 and up).
        <field name="Weight" type="float" default="1.0" since="10.1.0.106">The weight of a sequence describes how it blends with other sequences at the same priority.</field>
        <field name="Text Keys" type="Ref" template="NiTextKeyExtraData" since="10.1.0.106" />
        <field name="Cycle Type" type="CycleType" default="CYCLE_CLAMP" since="10.1.0.106" />
        <field name="Frequency" type="float" default="1.0" since="10.1.0.106" />
        <!-- Actually 10.3.0.1 but WorldShift 10.4.0.1 custom version acts like 10.3.0.1 -->
        <field name="Phase" type="float" since="10.1.0.106" until="10.4.0.1" />
        <field name="Start Time" type="float" default="#FLT_MAX#" since="10.1.0.106" />
        <field name="Stop Time" type="float" default="#FLT_MIN#" since="10.1.0.106" />
        <field name="Play Backwards" type="bool" since="10.1.0.106" until="10.1.0.106" />
        <field name="Manager" type="Ptr" template="NiControllerManager" since="10.1.0.106">The owner of this sequence.</field>
        <field name="Accum Root Name" type="string" since="10.1.0.106">The name of the NiAVObject serving as the accumulation root. This is where all accumulated translations, scales, and rotations are applied.</field>
        <field name="Accum Flags" type="AccumFlags" default="ACCUM_X_FRONT" since="20.3.0.8" />
        <field name="String Palette" type="Ref" template="NiStringPalette" since="10.1.0.113" until="20.1.0.0" />
        <field name="Anim Notes" type="Ref" template="BSAnimNotes" since="20.2.0.7" vercond="(#BSVER# #GTE# 24) #AND# (#BSVER# #LTE# 28)" />
        <field name="Num Anim Note Arrays" type="ushort" since="20.2.0.7" vercond="#BSVER# #GT# 28" />
        <field name="Anim Note Arrays" type="Ref" template="BSAnimNotes" length="Num Anim Note Arrays" since="20.2.0.7" vercond="#BSVER# #GT# 28" />
    </niobject>

    <niobject name="NiAVObjectPalette" abstract="true" inherit="NiObject" module="NiMain">
        Abstract base class for indexing NiAVObject by name.
    </niobject>

    <niobject name="NiDefaultAVObjectPalette" inherit="NiAVObjectPalette" module="NiMain">
        NiAVObjectPalette implementation. Used to quickly look up objects by name.
        <field name="Scene" type="Ptr" template="NiAVObject">Scene root of the object palette.</field>
        <field name="Num Objs" type="uint">Number of objects.</field>
        <field name="Objs" type="AVObject" length="Num Objs">The objects.</field>
    </niobject>

    <niobject name="NiDirectionalLight" inherit="NiLight" module="NiMain">
        Directional light source.
    </niobject>

    <niobject name="NiDitherProperty" inherit="NiProperty" module="NiMain">
        NiDitherProperty allows the application to turn the dithering of interpolated colors and fog values on and off.
        <field name="Flags" type="DitherFlags" />
    </niobject>

    <niobject name="NiRollController" inherit="NiSingleInterpController" module="NiAnimation" until="V20_5_0_0">
        DEPRECATED (10.2), REMOVED (20.5). Replaced by NiTransformController and NiLookAtInterpolator.
        <field name="Data" type="Ref" template="NiFloatData">The data for the controller.</field>
    </niobject>

    <niobject name="NiFloatData" inherit="NiObject" module="NiAnimation">
        Wrapper for 1D (one-dimensional) floating point animation keys.
        <field name="Data" type="KeyGroup" template="float">The keys.</field>
    </niobject>

    <niobject name="NiFloatExtraData" inherit="NiExtraData" module="NiMain">
        Extra float data.
        <field name="Float Data" type="float">The float data.</field>
    </niobject>

    <niobject name="NiFloatsExtraData" inherit="NiExtraData" module="NiMain">
        Extra float array data.
        <field name="Num Floats" type="uint">Number of floats in the next field.</field>
        <field name="Data" type="float" length="Num Floats">Float data.</field>
    </niobject>

    <niobject name="NiFogProperty" inherit="NiProperty" module="NiMain">
        NiFogProperty allows the application to enable, disable and control the appearance of fog.
        <field name="Flags" type="FogFlags" />
        <field name="Fog Depth" type="float" default="1.0">Depth of the fog in normalized units. 1.0 = begins at near plane. 0.5 = begins halfway between the near and far planes.</field>
        <field name="Fog Color" type="Color3" default="#VEC3_ZERO#">The color of the fog.</field>
    </niobject>

    <niobject name="NiGravity" inherit="NiParticleModifier" module="NiLegacy" until="V10_0_1_0">
        LEGACY (pre-10.1) particle modifier. Applies a gravitational field on the particles.
        <field name="Decay" type="float" since="3.3.0.13" />
        <field name="Force" type="float">The strength/force of this gravity.</field>
        <field name="Type" type="FieldType">The force field type.</field>
        <field name="Position" type="Vector3">The position of the mass point relative to the particle system.</field>
        <field name="Direction" type="Vector3">The direction of the applied acceleration.</field>
        <field name="Unknown 01" type="float" until="2.3" />
        <field name="Unknown 02" type="float" until="2.3" />
    </niobject>

    <niobject name="NiIntegerExtraData" inherit="NiExtraData" module="NiMain">
        Extra integer data.
        <field name="Integer Data" type="uint">The value of the extra data.</field>
    </niobject>

    <niobject name="BSXFlags" inherit="NiIntegerExtraData" module="BSMain" versions="#BETHESDA#">
        Controls animation and collision.  Integer holds flags:
        Bit 0 : enable havok, bAnimated(Skyrim)
        Bit 1 : enable collision, bHavok(Skyrim)
        Bit 2 : is skeleton nif?, bRagdoll(Skyrim)
        Bit 3 : enable animation, bComplex(Skyrim)
        Bit 4 : FlameNodes present, bAddon(Skyrim)
        Bit 5 : EditorMarkers present, bEditorMarker(Skyrim)
        Bit 6 : bDynamic(Skyrim)
        Bit 7 : bArticulated(Skyrim)
        Bit 8 : bIKTarget(Skyrim)/needsTransformUpdates
        Bit 9 : bExternalEmit(Skyrim)
        Bit 10: bMagicShaderParticles(Skyrim)
        Bit 11: bLights(Skyrim)
        Bit 12: bBreakable(Skyrim)
        Bit 13: bSearchedBreakable(Skyrim) .. Runtime only?
    </niobject>

    <niobject name="NiIntegersExtraData" inherit="NiExtraData" module="NiMain">
        Extra integer array data.
        <field name="Num Integers" type="uint">Number of integers.</field>
        <field name="Data" type="uint" length="Num Integers">Integers.</field>
    </niobject>

    <niobject name="BSKeyframeController" inherit="NiKeyframeController" module="BSAnimation" versions="#BETHESDA#">
        An extended keyframe controller.
        <field name="Data 2" type="Ref" template="NiKeyframeData">A link to more keyframe data.</field>
    </niobject>

    <niobject name="NiKeyframeData" inherit="NiObject" module="NiAnimation">
        DEPRECATED (10.2), RENAMED (10.2) to NiTransformData.
        Wrapper for transformation animation keys.
        <field name="Num Rotation Keys" type="uint">The number of quaternion rotation keys. If the rotation type is XYZ (type 4) then this *must* be set to 1, and in this case the actual number of keys is stored in the XYZ Rotations field.</field>
        <field name="Rotation Type" type="KeyType" cond="Num Rotation Keys != 0">The type of interpolation to use for rotation.  Can also be 4 to indicate that separate X, Y, and Z values are used for the rotation instead of Quaternions.</field>
        <field name="Quaternion Keys" type="QuatKey" arg="Rotation Type" template="Quaternion" length="Num Rotation Keys" cond="Rotation Type != 4">The rotation keys if Quaternion rotation is used.</field>
        <field name="Order" type="float" cond="Rotation Type == 4" until="10.1.0.0" />
        <field name="XYZ Rotations" type="KeyGroup" template="float" length="3" cond="Rotation Type == 4">Individual arrays of keys for rotating X, Y, and Z individually.</field>
        <field name="Translations" type="KeyGroup" template="Vector3">Translation keys.</field>
        <field name="Scales" type="KeyGroup" template="float">Scale keys.</field>
    </niobject>

    <bitflags name="LookAtFlags" storage="ushort">
        <option bit="0" name="LOOK_FLIP">Flip</option>
        <option bit="1" name="LOOK_Y_AXIS">Y-Axis</option>
        <option bit="2" name="LOOK_Z_AXIS">Z-Axis</option>
    </bitflags>

    <niobject name="NiLookAtController" inherit="NiTimeController" module="NiAnimation" until="V20_5_0_0">
        DEPRECATED (10.2), REMOVED (20.5)
        Replaced by NiTransformController and NiLookAtInterpolator.
        <field name="Look At Flags" type="LookAtFlags" since="10.1.0.0" />
        <field name="Look At" type="Ptr" template="NiNode" />
    </niobject>

    <niobject name="NiLookAtInterpolator" inherit="NiInterpolator" module="NiAnimation">
        NiLookAtInterpolator rotates an object so that it always faces a target object.
        <field name="Flags" type="LookAtFlags" />
        <field name="Look At" type="Ptr" template="NiNode" />
        <field name="Look At Name" type="string" />
        <field name="Transform" type="NiQuatTransform" until="20.4.0.12" />
        <field name="Interpolator: Translation" type="Ref" template="NiPoint3Interpolator" />
        <field name="Interpolator: Roll" type="Ref" template="NiFloatInterpolator" />
        <field name="Interpolator: Scale" type="Ref" template="NiFloatInterpolator" />
    </niobject>

    <niobject name="NiMaterialProperty" inherit="NiProperty" module="NiMain">
        Describes the surface properties of an object e.g. translucency, ambient color, diffuse color, emissive color, and specular color.
        <field name="Flags" type="ushort" since="3.0" until="10.0.1.2">Property flags.</field>
        <field name="Ambient Color" type="Color3" default="#VEC3_ONE#" vercond="#BSVER# #LT# 26">How much the material reflects ambient light.</field>
        <field name="Diffuse Color" type="Color3" default="#VEC3_ONE#" vercond="#BSVER# #LT# 26">How much the material reflects diffuse light.</field>
        <field name="Specular Color" type="Color3" default="#VEC3_ONE#">How much light the material reflects in a specular manner.</field>
        <field name="Emissive Color" type="Color3" default="#VEC3_ZERO#">How much light the material emits.</field>
        <field name="Glossiness" type="float" default="10.0">The material glossiness.</field>
        <field name="Alpha" type="float" default="1.0">The material transparency (1=non-transparant). Refer to a NiAlphaProperty object in this material's parent NiTriShape object, when alpha is not 1.</field>
        <field name="Emissive Mult" type="float" default="1.0" vercond="#BSVER# #GT# 21" />
    </niobject>

    <niobject name="NiMorphData" inherit="NiObject" module="NiAnimation">
        DEPRECATED (20.5), replaced by NiMorphMeshModifier.
        Geometry morphing data.
        <field name="Num Morphs" type="uint">Number of morphing object.</field>
        <field name="Num Vertices" type="uint">Number of vertices.</field>
        <field name="Relative Targets" type="byte" default="1">This byte is always 1 in all official files.</field>
        <field name="Morphs" type="Morph" arg="Num Vertices" length="Num Morphs">The geometry morphing objects.</field>
    </niobject>

    <niobject name="NiNode" inherit="NiAVObject" module="NiMain">
        Generic node object for grouping.
        <field name="Num Children" type="uint">The number of child objects.</field>
        <field name="Children" type="Ref" template="NiAVObject" length="Num Children">List of child node object indices.</field>
        <field name="Num Effects" type="uint" vercond="#NI_BS_LT_FO4#">The number of references to effect objects that follow.</field>
        <field name="Effects" type="Ref" template="NiDynamicEffect" length="Num Effects" vercond="#NI_BS_LT_FO4#">List of node effects. ADynamicEffect?</field>
    </niobject>

    <niobject name="NiBone" inherit="NiNode" module="NiLegacy">
        A NiNode used as a skeleton bone?
    </niobject>

    <niobject name="NiCollisionSwitch" inherit="NiNode" module="NiLegacy" until="V10_0_1_0">
        Found in Munch's Oddysee
    </niobject>

    <niobject name="AvoidNode" inherit="NiNode" module="BSLegacy" versions="V4_0_0_2">
        Morrowind specific.
    </niobject>

    <niobject name="FxWidget" inherit="NiNode" module="NiCustom" versions="V10_0_1_0">
        Firaxis-specific UI widgets?
        <field name="Unknown 3" type="byte" />
        <field name="Unknown 292 Bytes" type="byte" length="292" />
    </niobject>

    <niobject name="FxButton" inherit="FxWidget" module="NiCustom" versions="V10_0_1_0">
        Unknown.
    </niobject>

    <niobject name="FxRadioButton" inherit="FxWidget" module="NiCustom" versions="V10_0_1_0">
        Unknown.
        <field name="Unknown Int 1" type="uint" />
        <field name="Unknown Int 2" type="uint" />
        <field name="Unknown Int 3" type="uint" />
        <field name="Num Buttons" type="uint">Number of unknown links.</field>
        <field name="Buttons" type="Ptr" template="FxRadioButton" length="Num Buttons">Unknown pointers to other buttons.  Maybe other buttons in a group so they can be switch off if this one is switched on?</field>
    </niobject>

    <niobject name="NiBillboardNode" inherit="NiNode" module="NiMain">
        These nodes will always be rotated to face the camera creating a billboard effect for any attached objects.

        In pre-10.1.0.0 the Flags field is used for BillboardMode.
        Bit 0: hidden
        Bits 1-2: collision mode
        Bit 3: unknown (set in most official meshes)
        Bits 5-6: billboard mode

        Collision modes:
        00 NONE
        01 USE_TRIANGLES
        10 USE_OBBS
        11 CONTINUE

        Billboard modes:
        00 ALWAYS_FACE_CAMERA
        01 ROTATE_ABOUT_UP
        10 RIGID_FACE_CAMERA
        11 ALWAYS_FACE_CENTER
        <field name="Billboard Mode" type="BillboardMode" since="10.1.0.0">The way the billboard will react to the camera.</field>
    </niobject>

    <niobject name="NiBSAnimationNode" inherit="NiNode" module="BSLegacy" until="V10_0_1_0">
        Bethesda-specific extension of Node with animation properties stored in the flags, often 42?
    </niobject>

    <niobject name="NiBSParticleNode" inherit="NiNode" module="BSLegacy" until="V10_0_1_0">
        Unknown.
    </niobject>
    
    <bitflags name="NiSwitchFlags" storage="ushort">
        Flags for NiSwitchNode.
        <option bit="0" name="UpdateOnlyActiveChild">Update Only Active Child</option>
        <option bit="1" name="UpdateControllers">Update Controllers</option>
    </bitflags>

    <niobject name="NiSwitchNode" inherit="NiNode" module="NiMain">
        Represents groups of multiple scenegraph subtrees, only one of which (the "active child") is drawn at any given time.
        <field name="Switch Node Flags" type="NiSwitchFlags" default="3" since="10.1.0.0" />
        <field name="Index" type="uint" />
    </niobject>

    <niobject name="NiLODNode" inherit="NiSwitchNode" module="NiMain">
        Level of detail selector. Links to different levels of detail of the same model, used to switch a geometry at a specified distance.
        <field name="LOD Center" type="Vector3" since="4.0.0.2" until="10.0.1.0" />
        <field name="Num LOD Levels" type="uint" until="10.0.1.0" />
        <field name="LOD Levels" type="LODRange" length="Num LOD Levels" until="10.0.1.0" />
        <field name="LOD Level Data" type="Ref" template="NiLODData" since="10.1.0.0" />
    </niobject>

    <niobject name="NiPalette" inherit="NiObject" module="NiMain">
        NiPalette objects represent mappings from 8-bit indices to 24-bit RGB or 32-bit RGBA colors.
        <field name="Has Alpha" type="byte">Not boolean but used as one, always 8-bit.</field>
        <field name="Num Entries" type="uint" default="256">The number of palette entries. Always 256 but can also be 16.</field>
        <field name="Palette" type="ByteColor4" length="16" cond="Num Entries == 16">The color palette.</field>
        <field name="Palette" type="ByteColor4" length="256" cond="Num Entries != 16">The color palette.</field>
    </niobject>

    <niobject name="NiParticleBomb" inherit="NiParticleModifier" module="NiLegacy" until="V10_0_1_0">
        LEGACY (pre-10.1) particle modifier.
        <field name="Decay" type="float" />
        <field name="Duration" type="float" />
        <field name="DeltaV" type="float" />
        <field name="Start" type="float" />
        <field name="Decay Type" type="DecayType" />
        <field name="Symmetry Type" type="SymmetryType" since="4.1.0.12" />
        <field name="Position" type="Vector3">The position of the mass point relative to the particle system?</field>
        <field name="Direction" type="Vector3">The direction of the applied acceleration?</field>
    </niobject>

    <niobject name="NiParticleColorModifier" inherit="NiParticleModifier" module="NiLegacy" until="V10_0_1_0">
        LEGACY (pre-10.1) particle modifier.
        <field name="Color Data" type="Ref" template="NiColorData" />
    </niobject>

    <niobject name="NiParticleGrowFade" inherit="NiParticleModifier" module="NiLegacy" until="V10_0_1_0">
        LEGACY (pre-10.1) particle modifier.
        <field name="Grow" type="float">The time from the beginning of the particle lifetime during which the particle grows.</field>
        <field name="Fade" type="float">The time from the end of the particle lifetime during which the particle fades.</field>
    </niobject>

    <niobject name="NiParticleMeshModifier" inherit="NiParticleModifier" module="NiLegacy" until="V10_0_1_0">
        LEGACY (pre-10.1) particle modifier.
        <field name="Num Particle Meshes" type="uint" />
        <field name="Particle Meshes" length="Num Particle Meshes" type="Ref" template="NiAVObject" />
    </niobject>

    <niobject name="NiParticleRotation" inherit="NiParticleModifier" module="NiLegacy" until="V10_0_1_0">
        LEGACY (pre-10.1) particle modifier.
        <field name="Random Initial Axis" type="byte" />
        <field name="Initial Axis" type="Vector3" />
        <field name="Rotation Speed" type="float" />
    </niobject>

    <niobject name="NiParticles" inherit="NiGeometry" module="NiMain">
        Generic particle system node.
    </niobject>

    <niobject name="NiAutoNormalParticles" inherit="NiParticles" module="NiLegacy" until="V10_0_1_0">
        LEGACY (pre-10.1). NiParticles which do not house normals and generate them at runtime.
    </niobject>

    <niobject name="NiParticleMeshes" inherit="NiParticles" module="NiLegacy" until="V10_0_1_0">
        LEGACY (pre-10.1). Particle meshes.
    </niobject>

    <niobject name="NiParticleMeshesData" inherit="NiRotatingParticlesData" module="NiLegacy" until="V10_0_1_0">
        LEGACY (pre-10.1). Particle meshes data.
        <field name="Container Node" type="Ref" template="NiNode" />
    </niobject>

    <niobject name="NiParticleSystem" inherit="NiParticles" module="NiParticle">
        A particle system.
        Contains members to mimic inheritance shifts for Bethesda 20.2, where NiParticles switched to inheriting BSGeometry.
        Until inheritance shifts are supported, the members are on NiParticleSystem instead of NiParticles for module reasons.
        <field name="Vertex Desc" type="BSVertexDesc" vercond="#BS_GTE_SSE#" />
        <field name="Far Begin" type="ushort" vercond="#BS_GTE_SKY#" />
        <field name="Far End" type="ushort" vercond="#BS_GTE_SKY#" />
        <field name="Near Begin" type="ushort" vercond="#BS_GTE_SKY#" />
        <field name="Near End" type="ushort" vercond="#BS_GTE_SKY#" />
        <field name="Data" type="Ref" template="NiPSysData" vercond="#BS_GTE_SSE#" />

        <field name="World Space" type="bool" default="1" since="10.1.0.0">If true, Particles are birthed into world space.  If false, Particles are birthed into object space.</field>
        <field name="Num Modifiers" type="uint" since="10.1.0.0">The number of modifier references.</field>
        <field name="Modifiers" type="Ref" template="NiPSysModifier" length="Num Modifiers" since="10.1.0.0">The list of particle modifiers.</field>
    </niobject>

    <niobject name="NiMeshParticleSystem" inherit="NiParticleSystem" module="NiParticle">
        Particle system.
    </niobject>

    <niobject name="NiEmitterModifier" inherit="NiObject" module="NiLegacy" until="V10_0_1_0">
        <field name="Next Modifier" type="Ref" template="NiEmitterModifier" />
        <field name="Controller" type="Ptr" template="NiParticleSystemController" />
    </niobject>

    <niobject name="NiParticleSystemController" inherit="NiTimeController" module="NiLegacy" until="V10_0_1_0">
        A generic particle system time controller object.
        <field name="Old Speed" type="uint" until="3.1">Particle speed in old files</field>
        <field name="Speed" type="float" since="3.3.0.13">Particle speed</field>
        <field name="Speed Variation" type="float">Particle random speed modifier</field>
        <field name="Declination" type="float">
            vertical emit direction [radians]
            0.0 : up
            1.6 : horizontal
            3.1416 : down
        </field>
        <field name="Declination Variation" type="float">emitter's vertical opening angle [radians]</field>
        <field name="Planar Angle" type="float">horizontal emit direction</field>
        <field name="Planar Angle Variation" type="float">emitter's horizontal opening angle</field>
        <field name="Initial Normal" type="Vector3" default="#X_AXIS#" />
        <field name="Initial Color" type="Color4" default="#VEC4_ONE#" />
        <field name="Initial Size" type="float" default="1.0">Particle size</field>
        <field name="Emit Start Time" type="float">Particle emit start time</field>
        <field name="Emit Stop Time" type="float">Particle emit stop time</field>
        <field name="Reset Particle System" type="byte" since="3.3.0.13" />
        <field name="Old Emit Rate" type="uint" until="3.1">Particle emission rate in old files</field>
        <field name="Birth Rate" type="float" since="3.3.0.13">Particle emission rate (particles per second)</field>
        <field name="Lifetime" type="float">Particle lifetime</field>
        <field name="Lifetime Variation" type="float">Particle lifetime random modifier</field>
        <field name="Use Birth Rate" type="byte" since="3.3.0.13" />
        <field name="Spawn On Death" type="byte" since="3.3.0.13" />
        <field name="Emitter Dimensions" type="Vector3" />
        <field name="Emitter" type="Ptr" template="NiAVObject">The object which acts as the basis for the particle emitter.</field>
        <field name="Num Spawn Generations" type="ushort" default="1" since="3.3.0.13" />
        <field name="Percentage Spawned" type="float" default="1.0" since="3.3.0.13" />
        <field name="Spawn Multiplier" type="ushort" since="3.3.0.13" />
        <field name="Spawn Speed Chaos" type="float" since="3.3.0.13" />
        <field name="Spawn Dir Chaos" type="float" since="3.3.0.13" />
        <field name="Particle Velocity" type="Vector3" until="3.1">Particle velocity</field>
        <field name="Particle Unknown Vector" type="Vector3" until="3.1" />
        <field name="Particle Lifetime" type="float" until="3.1">The particle's age.</field>
        <field name="Particle Link" type="Ref" template="NiObject" until="3.1" />
        <field name="Particle Timestamp" type="uint" until="3.1">Timestamp of the last update.</field>
        <field name="Particle Unknown Short" type="ushort" until="3.1">Unknown short</field>
        <field name="Particle Vertex Id" type="ushort" until="3.1">Particle/vertex index matches array index</field>

        <field name="Num Particles" type="ushort" since="3.3.0.13">Size of the following array. (Maximum number of simultaneous active particles)</field>
        <field name="Num Valid" type="ushort" since="3.3.0.13">Number of valid entries in the following array. (Number of active particles at the time the system was saved)</field>
        <field name="Particles" type="NiParticleInfo" length="Num Particles" since="3.3.0.13" />
        <field name="Emitter Modifier" type="Ref" template="NiEmitterModifier" since="3.3.0.13" />
        <field name="Particle Modifier" type="Ref" template="NiParticleModifier">Link to some optional particle modifiers (NiGravity, NiParticleGrowFade, NiParticleBomb, ...)</field>
        <field name="Particle Collider" type="Ref" template="NiParticleCollider" />
        <field name="Static Target Bound" type="byte" since="3.3.0.15" />
        <field name="Color Data" type="Ref" template="NiColorData" until="3.1" />
        <field name="Unknown Float 1" type="float" until="3.1" />
        <field name="Unknown Floats 2" length="Particle Unknown Short" type="float" until="3.1" />
    </niobject>

    <niobject name="NiBSPArrayController" inherit="NiParticleSystemController" module="BSLegacy" until="V10_0_1_0">
        A particle system controller, used by BS in conjunction with NiBSParticleNode.
    </niobject>

    <niobject name="NiPathController" inherit="NiTimeController" module="NiAnimation" until="V20_5_0_0">
        DEPRECATED (10.2), REMOVED (20.5). Replaced by NiTransformController and NiPathInterpolator.
        Time controller for a path.
        <field name="Path Flags" type="PathFlags" since="10.1.0.0" />
        <field name="Bank Dir" type="int" default="1">-1 = Negative, 1 = Positive</field>
        <field name="Max Bank Angle" type="float">Max angle in radians.</field>
        <field name="Smoothing" type="float" />
        <field name="Follow Axis" type="short">0, 1, or 2 representing X, Y, or Z.</field>
        <field name="Path Data" type="Ref" template="NiPosData" />
        <field name="Percent Data" type="Ref" template="NiFloatData" />
    </niobject>

    <compound name="PixelFormatComponent">
        <field name="Type" type="PixelComponent">Component Type</field>
        <field name="Convention" type="PixelRepresentation">Data Storage Convention</field>
        <field name="Bits Per Channel" type="byte">Bits per component</field>
        <field name="Is Signed" type="bool" />
    </compound>

    <niobject name="NiPixelFormat" abstract="true" inherit="NiObject" module="NiMain">
        NiPixelFormat is not the parent to NiPixelData/NiPersistentSrcTextureRendererData,
        but actually a member class loaded at the top of each. The two classes are not related.
        However, faking this inheritance is useful for several things.
        <field name="Pixel Format" type="PixelFormat">The format of the pixels in this internally stored image.</field>
        <!-- Technically since 10.3.0.3, fudging for WorldShift custom version as no games have official 10.3 NIFs anyway. -->
        <field name="Red Mask" type="uint" until="10.4.0.1">0x000000ff (for 24bpp and 32bpp) or 0x00000000 (for 8bpp)</field>
        <field name="Green Mask" type="uint" until="10.4.0.1">0x0000ff00 (for 24bpp and 32bpp) or 0x00000000 (for 8bpp)</field>
        <field name="Blue Mask" type="uint" until="10.4.0.1">0x00ff0000 (for 24bpp and 32bpp) or 0x00000000 (for 8bpp)</field>
        <field name="Alpha Mask" type="uint" until="10.4.0.1">0xff000000 (for 32bpp) or 0x00000000 (for 24bpp and 8bpp)</field>
        <field name="Bits Per Pixel" type="uint" until="10.4.0.1">Bits per pixel, 0 (Compressed), 8, 24 or 32.</field>
        <field name="Old Fast Compare" type="byte" length="8" until="10.4.0.1">
            [96,8,130,0,0,65,0,0] if 24 bits per pixel
            [129,8,130,32,0,65,12,0] if 32 bits per pixel
            [34,0,0,0,0,0,0,0] if 8 bits per pixel
            [X,0,0,0,0,0,0,0] if 0 (Compressed) bits per pixel where X = PixelFormat
        </field>
        <field name="Tiling" type="PixelTiling" since="10.1.0.0" until="10.4.0.1">Seems to always be zero.</field>
        <field name="Bits Per Pixel" type="byte" since="10.4.0.2">Bits per pixel, 0 (Compressed), 8, 24 or 32.</field>
        <field name="Renderer Hint" type="uint" since="10.4.0.2" />
        <field name="Extra Data" type="uint" since="10.4.0.2" />
        <field name="Flags" type="byte" since="10.4.0.2" />
        <field name="Tiling" type="PixelTiling" since="10.4.0.2" />
        <field name="sRGB Space" type="bool" since="20.3.0.4" />
        <field name="Channels" type="PixelFormatComponent" length="4" since="10.4.0.2">Channel Data</field>
    </niobject>

    <niobject name="NiPersistentSrcTextureRendererData" inherit="NiPixelFormat" module="NiMain">
        <field name="Palette" type="Ref" template="NiPalette" />
        <field name="Num Mipmaps" type="uint" />
        <field name="Bytes Per Pixel" type="uint" />
        <field name="Mipmaps" type="MipMap" length="Num Mipmaps" />
        <field name="Num Pixels" type="uint" />
        <field name="Pad Num Pixels" type="uint" since="20.2.0.6" />
        <field name="Num Faces" type="uint" />
        <field name="Platform" type="PlatformID" until="30.1.0.0" />
        <field name="Renderer" type="RendererID" since="30.1.0.1" />
        <field name="Pixel Data" type="byte" binary="true" length="Num Pixels * Num Faces" />
    </niobject>

    <niobject name="NiPixelData" inherit="NiPixelFormat" module="NiMain">
        A texture.
        <field name="Palette" type="Ref" template="NiPalette" />
        <field name="Num Mipmaps" type="uint" />
        <field name="Bytes Per Pixel" type="uint" />
        <field name="Mipmaps" type="MipMap" length="Num Mipmaps" />
        <field name="Num Pixels" type="uint" />
        <!-- Technically since 10.3.0.6, fudging for WorldShift custom version as no games have official 10.3 NIFs anyway. -->
        <field name="Num Faces" type="uint" since="10.4.0.2" default="1" />
        <field name="Pixel Data" type="byte" binary="true" length="Num Pixels" until="10.4.0.1" />
        <field name="Pixel Data" type="byte" binary="true" length="Num Pixels * Num Faces" since="10.4.0.2" />
    </niobject>

    <niobject name="NiParticleCollider" inherit="NiParticleModifier" module="NiLegacy" until="V10_0_1_0">
        <field name="Bounce" type="float" />
        <field name="Spawn On Collide" type="bool" since="4.2.0.2" />
        <field name="Die On Collide" type="bool" since="4.2.0.2" />
    </niobject>

    <niobject name="NiPlanarCollider" inherit="NiParticleCollider" module="NiLegacy" until="V10_0_1_0">
        LEGACY (pre-10.1) particle modifier.
        <field name="Height" type="float" />
        <field name="Width" type="float" />
        <field name="Position" type="Vector3" />
        <field name="X Vector" type="Vector3" />
        <field name="Y Vector" type="Vector3" />
        <field name="Plane" type="NiPlane" />
    </niobject>

    <niobject name="NiPointLight" inherit="NiLight" module="NiMain">
        A point light.
        <field name="Constant Attenuation" type="float" />
        <field name="Linear Attenuation" type="float" default="1.0" />
        <field name="Quadratic Attenuation" type="float" />
    </niobject>

    <niobject name="NiPosData" inherit="NiObject" module="NiAnimation">
        Wrapper for position animation keys.
        <field name="Data" type="KeyGroup" template="Vector3" />
    </niobject>

    <niobject name="NiRotData" inherit="NiObject" module="NiAnimation">
        Wrapper for rotation animation keys.
        <field name="Num Rotation Keys" type="uint" />
        <field name="Rotation Type" type="KeyType" cond="Num Rotation Keys != 0" />
        <field name="Quaternion Keys" type="QuatKey" arg="Rotation Type" template="Quaternion" length="Num Rotation Keys" cond="Rotation Type != 4" />
        <field name="XYZ Rotations" type="KeyGroup" template="float" length="3" cond="Rotation Type == 4" />
    </niobject>

    <niobject name="NiPSysAgeDeathModifier" inherit="NiPSysModifier" module="NiParticle">
        Particle modifier that controls and updates the age of particles in the system.
        <field name="Spawn on Death" type="bool">Should the particles spawn on death?</field>
        <field name="Spawn Modifier" type="Ref" template="NiPSysSpawnModifier">The spawner to use on death.</field>
    </niobject>

    <niobject name="NiPSysBombModifier" inherit="NiPSysModifier" module="NiParticle">
        Particle modifier that applies an explosive force to particles.
        <field name="Bomb Object" type="Ptr" template="NiNode">The object whose position and orientation are the basis of the force.</field>
        <field name="Bomb Axis" type="Vector3">The local direction of the force.</field>
        <field name="Decay" type="float">How the bomb force will decrease with distance.</field>
        <field name="Delta V" type="float">The acceleration the bomb will apply to particles.</field>
        <field name="Decay Type" type="DecayType" />
        <field name="Symmetry Type" type="SymmetryType" />
    </niobject>

    <niobject name="NiPSysBoundUpdateModifier" inherit="NiPSysModifier" module="NiParticle">
        Particle modifier that creates and updates bound volumes.
        <field name="Update Skip" type="ushort">Optimize by only computing the bound of (1 / Update Skip) of the total particles each frame.</field>
    </niobject>

    <niobject name="NiPSysBoxEmitter" inherit="NiPSysVolumeEmitter" module="NiParticle">
        Particle emitter that uses points within a defined Box shape to emit from.
        <field name="Width" type="float" />
        <field name="Height" type="float" />
        <field name="Depth" type="float" />
    </niobject>

    <niobject name="NiPSysColliderManager" inherit="NiPSysModifier" module="NiParticle">
        Particle modifier that adds a defined shape to act as a collision object for particles to interact with.
        <field name="Collider" type="Ref" template="NiPSysCollider" />
    </niobject>

    <niobject name="NiPSysColorModifier" inherit="NiPSysModifier" module="NiParticle">
        Particle modifier that adds keyframe data to modify color/alpha values of particles over time.
        <field name="Data" type="Ref" template="NiColorData" />
    </niobject>

    <niobject name="NiPSysCylinderEmitter" inherit="NiPSysVolumeEmitter" module="NiParticle">
        Particle emitter that uses points within a defined Cylinder shape to emit from.
        <field name="Radius" type="float" />
        <field name="Height" type="float" />
    </niobject>

    <niobject name="NiPSysDragModifier" inherit="NiPSysModifier" module="NiParticle">
        Particle modifier that applies a linear drag force to particles.
        <field name="Drag Object" type="Ptr" template="NiAVObject">The object whose position and orientation are the basis of the force.</field>
        <field name="Drag Axis" type="Vector3" default="#X_AXIS#">The local direction of the force.</field>
        <field name="Percentage" type="float" default="0.05">The amount of drag to apply to particles.</field>
        <field name="Range" type="float" default="#FLT_MAX#">The distance up to which particles are fully affected.</field>
        <field name="Range Falloff" type="float" default="#FLT_MAX#">The distance at which particles cease to be affected.</field>
    </niobject>

    <niobject name="NiPSysEmitterCtlrData" inherit="NiObject" module="NiParticle">
        DEPRECATED (10.2). Particle system emitter controller data.
        <field name="Birth Rate Keys" type="KeyGroup" template="float" />
        <field name="Num Active Keys" type="uint" />
        <field name="Active Keys" type="Key" arg="1" template="byte" length="Num Active Keys" />
    </niobject>

    <niobject name="NiPSysGravityModifier" inherit="NiPSysModifier" module="NiParticle">
        Particle modifier that applies a gravitational force to particles.
        <field name="Gravity Object" type="Ptr" template="NiAVObject">The object whose position and orientation are the basis of the force.</field>
        <field name="Gravity Axis" type="Vector3" default="#X_AXIS#">The local direction of the force.</field>
        <field name="Decay" type="float">How the force diminishes by distance.</field>
        <field name="Strength" type="float" default="1.0">The acceleration of the force.</field>
        <field name="Force Type" type="ForceType">The type of gravitational force.</field>
        <field name="Turbulence" type="float">Adds a degree of randomness.</field>
        <field name="Turbulence Scale" type="float" default="1.0">Scale for turbulence.</field>
        <field name="World Aligned" type="bool" vercond="!#NI_BS_LTE_16#" />
    </niobject>

    <niobject name="NiPSysGrowFadeModifier" inherit="NiPSysModifier" module="NiParticle">
        Particle modifier that controls the time it takes to grow and shrink a particle.
        <field name="Grow Time" type="float">The time taken to grow from 0 to their specified size.</field>
        <field name="Grow Generation" type="ushort">Specifies the particle generation to which the grow effect should be applied. This is usually generation 0, so that newly created particles will grow.</field>
        <field name="Fade Time" type="float">The time taken to shrink from their specified size to 0.</field>
        <field name="Fade Generation" type="ushort">Specifies the particle generation to which the shrink effect should be applied. This is usually the highest supported generation for the particle system.</field>
        <field name="Base Scale" type="float" since="20.2.0.7" until="20.2.0.7" vercond="#BS_GTE_FO3#">A multiplier on the base particle scale.</field>
    </niobject>

    <niobject name="NiPSysMeshEmitter" inherit="NiPSysEmitter" module="NiParticle">
        Particle emitter that uses points on a specified mesh to emit from.
        <field name="Num Emitter Meshes" type="uint" />
        <field name="Emitter Meshes" type="Ptr" template="NiAVObject" length="Num Emitter Meshes">The meshes which are emitted from.</field>
        <field name="Initial Velocity Type" type="VelocityType">The method by which the initial particle velocity will be computed.</field>
        <field name="Emission Type" type="EmitFrom">The manner in which particles are emitted from the Emitter Meshes.</field>
        <field name="Emission Axis" type="Vector3" default="#X_AXIS#">The emission axis if VELOCITY_USE_DIRECTION.</field>
    </niobject>

    <niobject name="NiPSysMeshUpdateModifier" inherit="NiPSysModifier" module="NiParticle">
        Particle modifier that updates mesh particles using the age of each particle.
        <field name="Num Meshes" type="uint" />
        <field name="Meshes" type="Ref" template="NiAVObject" length="Num Meshes" />
    </niobject>
    
    <niobject name="BSPSysInheritVelocityModifier" inherit="NiPSysModifier" module="BSParticle" versions="#BETHESDA#">
        <field name="Inherit Object" type="Ptr" template="NiAVObject" />
        <field name="Chance To Inherit" type="float" default="100.0" />
        <field name="Velocity Multiplier" type="float" default="0.5" />
        <field name="Velocity Variation" type="float" />
    </niobject>
    
    <niobject name="BSPSysHavokUpdateModifier" inherit="NiPSysMeshUpdateModifier" module="BSParticle" versions="#BETHESDA#">
        <field name="Modifier" type="Ref" template="NiPSysModifier" />
    </niobject>

    <niobject name="BSPSysRecycleBoundModifier" inherit="NiPSysModifier" module="BSParticle" versions="#BETHESDA#">
        <field name="Bound Offset" type="Vector3" />
        <field name="Bound Extent" type="Vector3" />
        <field name="Bound Object" type="Ptr" template="NiAVObject" />
    </niobject> 
    
    <niobject name="BSPSysSubTexModifier" inherit="NiPSysModifier" module="BSParticle" versions="#BETHESDA#">
        Similar to a Flip Controller, this handles particle texture animation on a single texture atlas
        <field name="Start Frame" type="float">Starting frame/position on atlas</field>
        <field name="Start Frame Fudge" type="float" default="64.0">Random chance to start on a different frame?</field>
        <field name="End Frame" type="float" default="63.0">Ending frame/position on atlas</field>
        <field name="Loop Start Frame" type="float">Frame to start looping</field>
        <field name="Loop Start Frame Fudge" type="float" />
        <field name="Frame Count" type="float" default="30.0" />
        <field name="Frame Count Fudge" type="float" />
    </niobject>
    
    <niobject name="NiPSysPlanarCollider" inherit="NiPSysCollider" module="NiParticle">
        Particle Collider object which particles will interact with.
        <field name="Width" type="float">Width of the plane along the X Axis.</field>
        <field name="Height" type="float">Height of the plane along the Y Axis.</field>
        <field name="X Axis" type="Vector3">Axis defining a plane, relative to Collider Object.</field>
        <field name="Y Axis" type="Vector3">Axis defining a plane, relative to Collider Object.</field>
    </niobject>

    <niobject name="NiPSysSphericalCollider" inherit="NiPSysCollider" module="NiParticle">
        Particle Collider object which particles will interact with.
        <field name="Radius" type="float" />
    </niobject>

    <niobject name="NiPSysPositionModifier" inherit="NiPSysModifier" module="NiParticle">
        Particle modifier that updates the particle positions based on velocity and last update time.
    </niobject>

    <niobject name="NiPSysResetOnLoopCtlr" inherit="NiTimeController" module="NiParticle">
        Particle modifier that calls reset on a target upon looping.
    </niobject>

    <niobject name="NiPSysRotationModifier" inherit="NiPSysModifier" module="NiParticle">
        Particle modifier that adds rotations to particles.
        <field name="Rotation Speed" type="float">Initial Rotation Speed in radians per second.</field>
        <field name="Rotation Speed Variation" type="float" since="20.0.0.2">Distributes rotation speed over the range [Speed - Variation, Speed + Variation].</field>
        <field name="Unknown Vector" type="Vector4" vercond="#BS_F76#" />
        <field name="Unknown Byte" type="byte" vercond="#BS_F76#" />
        <field name="Rotation Angle" type="float" since="20.0.0.2">Initial Rotation Angle in radians.</field>
        <field name="Rotation Angle Variation" type="float" since="20.0.0.2">Distributes rotation angle over the range [Angle - Variation, Angle + Variation].</field>
        <field name="Random Rot Speed Sign" type="bool" since="20.0.0.2">Randomly negate the initial rotation speed?</field>
        <field name="Random Axis" type="bool" default="1">Assign a random axis to new particles?</field>
        <field name="Axis" type="Vector3" default="#X_AXIS#">Initial rotation axis.</field>
    </niobject>

    <niobject name="NiPSysSpawnModifier" inherit="NiPSysModifier" module="NiParticle">
        Particle modifier that spawns additional copies of a particle.
        <field name="Num Spawn Generations" type="ushort" default="0">Number of allowed generations for spawning. Particles whose generations are >= will not be spawned.</field>
        <field name="Percentage Spawned" type="float" default="1.0">The likelihood of a particular particle being spawned. Must be between 0.0 and 1.0.</field>
        <field name="Min Num to Spawn" type="ushort" default="1">The minimum particles to spawn for any given original particle.</field>
        <field name="Max Num to Spawn" type="ushort" default="1">The maximum particles to spawn for any given original particle.</field>
        <field name="Spawn Speed Variation" type="float">How much the spawned particle speed can vary.</field>
        <field name="Spawn Dir Variation" type="float">How much the spawned particle direction can vary.</field>
        <field name="Life Span" type="float">Lifespan assigned to spawned particles.</field>
        <field name="Life Span Variation" type="float">The amount the lifespan can vary.</field>
        <field name="WorldShift Spawn Speed Addition" type="float" since="10.2.0.1" until="10.4.0.1" />
    </niobject>

    <niobject name="NiPSysPartSpawnModifier" inherit="NiPSysModifier" module="NiCustom" versions="V10_2_0_1 V10_3_0_1 V10_4_0_1">
        WorldShift-specific Particle Spawn modifier
        <field name="Particles Per Second" type="float" default="40.0" />
        <field name="Time" type="float" default="#FLT_MIN#">Default of FLT_MIN would indicate End Time but it seems more like Frequency/Tick Rate or Start Time.</field>
        <field name="Spawner" type="Ref" template="NiPSysSpawnModifier" />
    </niobject>

    <niobject name="NiPSysSphereEmitter" inherit="NiPSysVolumeEmitter" module="NiParticle">
        Particle emitter that uses points within a sphere shape to emit from.
        <field name="Radius" type="float" />
    </niobject>

    <niobject name="NiPSysUpdateCtlr" inherit="NiTimeController" module="NiParticle">
        Particle system controller, tells the system to update its simulation.
    </niobject>

    <niobject name="NiPSysFieldModifier" abstract="true" inherit="NiPSysModifier" module="NiParticle">
        Base for all force field particle modifiers.
        <field name="Field Object" type="Ref" template="NiAVObject">The object whose position and orientation are the basis of the field.</field>
        <field name="Magnitude" type="float">Magnitude of the force.</field>
        <field name="Attenuation" type="float">How the magnitude diminishes with distance from the Field Object.</field>
        <field name="Use Max Distance" type="bool">Whether or not to use a distance from the Field Object after which there is no effect.</field>
        <field name="Max Distance" type="float">Maximum distance after which there is no effect.</field>
    </niobject>

    <niobject name="NiPSysVortexFieldModifier" inherit="NiPSysFieldModifier" module="NiParticle">
        Particle system modifier, implements a vortex field force for particles.
        <field name="Direction" type="Vector3">Direction of the vortex field in Field Object's space.</field>
    </niobject>

    <niobject name="NiPSysGravityFieldModifier" inherit="NiPSysFieldModifier" module="NiParticle">
        Particle system modifier, implements a gravity field force for particles.
        <field name="Direction" type="Vector3" default="#NEG_Y_AXIS#">Direction of the gravity field in Field Object's space.</field>
    </niobject>

    <niobject name="NiPSysDragFieldModifier" inherit="NiPSysFieldModifier" module="NiParticle">
        Particle system modifier, implements a drag field force for particles.
        <field name="Use Direction" type="bool">Whether or not the drag force applies only in the direction specified.</field>
        <field name="Direction" type="Vector3">Direction in which the force applies if Use Direction is true.</field>
    </niobject>

    <niobject name="NiPSysTurbulenceFieldModifier" inherit="NiPSysFieldModifier" module="NiParticle">
        Particle system modifier, implements a turbulence field force for particles.
        <field name="Frequency" type="float">How many turbulence updates per second.</field>
    </niobject>

    <niobject name="BSPSysLODModifier" inherit="NiPSysModifier" module="BSParticle" versions="#BETHESDA#">
        <field name="LOD Begin Distance" type="float" default="0.1" />
        <field name="LOD End Distance" type="float" default="0.7" />
        <field name="End Emit Scale" type="float" default="0.2" />
        <field name="End Size" type="float" default="1.0" />
    </niobject>
    
    <niobject name="BSPSysScaleModifier" inherit="NiPSysModifier" module="BSParticle" versions="#BETHESDA#">
        <field name="Num Scales" type="uint" />
        <field name="Scales" type="float" length="Num Scales" />
    </niobject>
    
    
    <niobject name="NiPSysFieldMagnitudeCtlr" inherit="NiPSysModifierFloatCtlr" module="NiParticle">
        Particle system controller for force field magnitude.
    </niobject>

    <niobject name="NiPSysFieldAttenuationCtlr" inherit="NiPSysModifierFloatCtlr" module="NiParticle">
        Particle system controller for force field attenuation.
    </niobject>

    <niobject name="NiPSysFieldMaxDistanceCtlr" inherit="NiPSysModifierFloatCtlr" module="NiParticle">
        Particle system controller for force field maximum distance.
    </niobject>

    <niobject name="NiPSysAirFieldAirFrictionCtlr" inherit="NiPSysModifierFloatCtlr" module="NiParticle">
        Particle system controller for air field air friction.
    </niobject>

    <niobject name="NiPSysAirFieldInheritVelocityCtlr" inherit="NiPSysModifierFloatCtlr" module="NiParticle">
        Particle system controller for air field inherit velocity.
    </niobject>

    <niobject name="NiPSysAirFieldSpreadCtlr" inherit="NiPSysModifierFloatCtlr" module="NiParticle">
        Particle system controller for air field spread.
    </niobject>

    <niobject name="NiPSysInitialRotSpeedCtlr" inherit="NiPSysModifierFloatCtlr" module="NiParticle">
        Particle system controller for emitter initial rotation speed.
    </niobject>

    <niobject name="NiPSysInitialRotSpeedVarCtlr" inherit="NiPSysModifierFloatCtlr" module="NiParticle">
        Particle system controller for emitter initial rotation speed variation.
    </niobject>

    <niobject name="NiPSysInitialRotAngleCtlr" inherit="NiPSysModifierFloatCtlr" module="NiParticle">
        Particle system controller for emitter initial rotation angle.
    </niobject>

    <niobject name="NiPSysInitialRotAngleVarCtlr" inherit="NiPSysModifierFloatCtlr" module="NiParticle">
        Particle system controller for emitter initial rotation angle variation.
    </niobject>

    <niobject name="NiPSysEmitterPlanarAngleCtlr" inherit="NiPSysModifierFloatCtlr" module="NiParticle">
        Particle system controller for emitter planar angle.
    </niobject>

    <niobject name="NiPSysEmitterPlanarAngleVarCtlr" inherit="NiPSysModifierFloatCtlr" module="NiParticle">
        Particle system controller for emitter planar angle variation.
    </niobject>

    <niobject name="NiPSysAirFieldModifier" inherit="NiPSysFieldModifier" module="NiParticle">
        Particle system modifier, updates the particle velocity to simulate the effects of air movements like wind, fans, or wake.
        <field name="Direction" type="Vector3" default="#NEG_X_AXIS#">Direction of the particle velocity</field>
        <field name="Air Friction" type="float" range="#F0_1#">How quickly particles will accelerate to the magnitude of the air field.</field>
        <field name="Inherit Velocity" type="float" range="#F0_1#">How much of the air field velocity will be added to the particle velocity.</field>
        <field name="Inherit Rotation" type="bool" />
        <field name="Component Only" type="bool" />
        <field name="Enable Spread" type="bool" />
        <field name="Spread" type="float" range="#F0_1#">The angle of the air field cone if Enable Spread is true.</field>
    </niobject>
    
    <niobject name="NiPSysTrailEmitter" inherit="NiPSysSphereEmitter" module="NiCustom">
        Guild 2-Specific node
        <field name="Trail Life Span" type="float" />
        <field name="Trail Life Span Var" type="float" />
        <field name="Num Trails" type="int" />
        <field name="Gravity Force" type="float" />
        <field name="Gravity Dir" type="Vector3" />
        <field name="Turbulence" type="float" />
        <field name="Repeat Time" type="float" />
    </niobject>

    <niobject name="NiLightIntensityController" inherit="NiFloatInterpController" module="NiAnimation">
        Unknown controller
    </niobject>

    <niobject name="NiPSysRadialFieldModifier" inherit="NiPSysFieldModifier" module="NiParticle">
        Particle system modifier, updates the particle velocity to simulate the effects of point gravity.
        <field name="Radial Type" type="float">If zero, no attenuation.</field>
    </niobject>

    <niobject name="NiLODData" abstract="true" inherit="NiObject" module="NiMain">
        Abstract class used for different types of LOD selections.
    </niobject>

    <niobject name="NiRangeLODData" inherit="NiLODData" module="NiMain">
        NiRangeLODData controls switching LOD levels based on Z depth from the camera to the NiLODNode.
        <field name="LOD Center" type="Vector3" />
        <field name="Num LOD Levels" type="uint" />
        <field name="LOD Levels" type="LODRange" length="Num LOD Levels" />
    </niobject>

    <niobject name="NiScreenLODData" inherit="NiLODData" module="NiMain">
        NiScreenLODData controls switching LOD levels based on proportion of the screen that a bound would include.
        <field name="Bounding Sphere" type="NiBound" />
        <field name="World Bounding Sphere" type="NiBound" />
        <field name="Num Proportions" type="uint" />
        <field name="Proportion Levels" type="float" length="Num Proportions" />
    </niobject>

    <niobject name="NiRotatingParticles" inherit="NiParticles" module="NiLegacy" until="V10_0_1_0">
        Unknown.
    </niobject>

    <niobject name="NiSequenceStreamHelper" inherit="NiObjectNET" module="NiAnimation" until="V20_2_0_8">
        DEPRECATED (pre-10.1), REMOVED (20.3).
        Keyframe animation root node, in .kf files.
    </niobject>

    <niobject name="NiShadeProperty" inherit="NiProperty" module="NiMain">
        Determines whether flat shading or smooth shading is used on a shape.
        <field name="Flags" type="ShadeFlags" default="SHADING_SMOOTH" vercond="#NI_BS_LTE_FO3#" />
    </niobject>

    <niobject name="NiSkinData" inherit="NiObject" module="NiMain">
        Skinning data.
        <field name="Skin Transform" type="NiTransform">Offset of the skin from this bone in bind position.</field>
        <field name="Num Bones" type="uint">Number of bones.</field>
        <field name="Skin Partition" type="Ref" template="NiSkinPartition" since="4.0.0.2" until="10.1.0.0">This optionally links a NiSkinPartition for hardware-acceleration information.</field>
        <field name="Has Vertex Weights" type="byte" since="4.2.1.0" default="1">Enables Vertex Weights for this NiSkinData.</field>
        <field name="Bone List" type="BoneData" length="Num Bones" arg="Has Vertex Weights">Contains offset data for each node that this skin is influenced by.</field>
    </niobject>

    <niobject name="NiSkinInstance" inherit="NiObject" module="NiMain">
        Skinning instance.
        <field name="Data" type="Ref" template="NiSkinData">Skinning data reference.</field>
        <field name="Skin Partition" type="Ref" template="NiSkinPartition" since="10.1.0.101">Refers to a NiSkinPartition objects, which partitions the mesh such that every vertex is only influenced by a limited number of bones.</field>
        <field name="Skeleton Root" type="Ptr" template="NiNode">Armature root node.</field>
        <field name="Num Bones" type="uint">The number of node bones referenced as influences.</field>
        <field name="Bones" type="Ptr" template="NiNode" length="Num Bones">List of all armature bones.</field>
    </niobject>

    <niobject name="NiTriShapeSkinController" inherit="NiTimeController" module="NiLegacy" until="V10_0_1_0">
        Old version of skinning instance.
        <field name="Num Bones" type="uint">The number of node bones referenced as influences.</field>
        <field name="Vertex Counts" type="uint" length="Num Bones">The number of vertex weights stored for each bone.</field>
        <field name="Bones" type="Ptr" template="NiBone" length="Num Bones">List of all armature bones.</field>
        <field name="Bone Data" type="OldSkinData" length="Num Bones" width="Vertex Counts">Contains skin weight data for each node that this skin is influenced by.</field>
    </niobject>

    <niobject name="NiSkinPartition" inherit="NiObject" module="NiMain">
        Skinning data, optimized for hardware skinning. The mesh is partitioned in submeshes such that each vertex of a submesh is influenced only by a limited and fixed number of bones.
        <field name="Num Partitions" type="uint" />
		<field name="Data Size" type="uint" calc="#LEN[Vertex Data]# #MUL# Vertex Size" since="20.2.0.7" until="20.2.0.7" vercond="#BS_SSE#" />
		<field name="Vertex Size" type="uint" calc="(Vertex Desc #BITAND# 0xF) #MUL# 4" since="20.2.0.7" until="20.2.0.7" vercond="#BS_SSE#" />
		<field name="Vertex Desc" type="BSVertexDesc" since="20.2.0.7" until="20.2.0.7" vercond="#BS_SSE#" />
		<field name="Vertex Data" type="BSVertexDataSSE" arg="Vertex Desc #RSH# 44" length="Data Size / Vertex Size" cond="Data Size #GT# 0" since="20.2.0.7" until="20.2.0.7" vercond="#BS_SSE#" />
		<field name="Partitions" type="SkinPartition" length="Num Partitions" />
    </niobject>

    <niobject name="NiTexture" abstract="true" inherit="NiObjectNET" module="NiMain">
        A texture.
    </niobject>

    <compound name="FormatPrefs" size="12">
        NiTexture::FormatPrefs. These preferences are a request to the renderer to use a format the most closely matches the settings and may be ignored.
        <field name="Pixel Layout" type="PixelLayout">Requests the way the image will be stored.</field>
        <field name="Use Mipmaps" type="MipMapFormat" default="MIP_FMT_DEFAULT">Requests if mipmaps are used or not.</field>
        <field name="Alpha Format" type="AlphaFormat" default="ALPHA_DEFAULT">Requests no alpha, 1-bit alpha, or </field>
    </compound>

    <niobject name="NiSourceTexture" inherit="NiTexture" module="NiMain">
        Describes texture source and properties.
        <field name="Use External" type="byte" default="1">Is the texture external?</field>
        <field name="Use Internal" type="byte" default="1" cond="Use External == 0" until="10.0.1.3" />
        <field name="File Name" type="FilePath" cond="Use External == 1">The external texture file name.</field>
        <field name="File Name" type="FilePath" cond="Use External == 0" since="10.1.0.0">The original source filename of the image embedded by the referred NiPixelData object.</field>
        <field name="Pixel Data" type="Ref" template="NiPixelFormat" cond="Use External == 1" since="10.1.0.0" />
        <field name="Pixel Data" type="Ref" template="NiPixelFormat" cond="Use External == 0 #AND# Use Internal == 1" until="10.0.1.3">NiPixelData or NiPersistentSrcTextureRendererData</field>
        <field name="Pixel Data" type="Ref" template="NiPixelFormat" cond="Use External == 0" since="10.0.1.4">NiPixelData or NiPersistentSrcTextureRendererData</field>
        <field name="Format Prefs" type="FormatPrefs">A set of preferences for the texture format. They are a request only and the renderer may ignore them.</field>
        <field name="Is Static" type="byte" default="1">If set, then the application cannot assume that any dynamic changes to the pixel data will show in the rendered image.</field>
        <field name="Direct Render" type="bool" default="1" since="10.1.0.103">A hint to the renderer that the texture can be loaded directly from a texture file into a renderer-specific resource, bypassing the NiPixelData object.</field>
        <field name="Persist Render Data" type="bool" default="0" since="20.2.0.4">Pixel Data is NiPersistentSrcTextureRendererData instead of NiPixelData.</field>
    </niobject>

    <niobject name="NiSpecularProperty" inherit="NiProperty" module="NiMain">
        Gives specularity to a shape. Flags 0x0001.
        <field name="Flags" type="SpecularFlags" />
    </niobject>

    <niobject name="NiSphericalCollider" inherit="NiParticleCollider" module="NiLegacy" until="V10_0_1_0">
        LEGACY (pre-10.1) particle modifier.
        <field name="Radius" type="float" />
        <field name="Position" type="Vector3" />
    </niobject>

    <niobject name="NiSpotLight" inherit="NiPointLight" module="NiMain">
        A spot.
        <field name="Outer Spot Angle" type="float" range="#F_DEG#" />
        <field name="Inner Spot Angle" type="float" range="#F_DEG#" since="20.2.0.5" />
        <field name="Exponent" type="float" default="1.0">Describes the distribution of light.</field>
    </niobject>

    <niobject name="NiStencilProperty" inherit="NiProperty" module="NiMain">
        Allows control of stencil testing.
        <field name="Flags" type="ushort" until="10.0.1.2">Property flags.</field>
        <field name="Stencil Enabled" type="byte" until="20.0.0.5">Enables or disables the stencil test.</field>
        <field name="Stencil Function" type="StencilTestFunc" until="20.0.0.5">Selects the compare mode function.</field>
        <field name="Stencil Ref" type="uint" until="20.0.0.5" />
        <field name="Stencil Mask" type="uint" default="#UINT_MAX#" until="20.0.0.5">A bit mask. The default is 0xffffffff.</field>
        <field name="Fail Action" type="StencilAction" until="20.0.0.5" />
        <field name="Z Fail Action" type="StencilAction" until="20.0.0.5" />
        <field name="Pass Action" type="StencilAction" until="20.0.0.5" />
        <field name="Draw Mode" default="DRAW_BOTH" type="StencilDrawMode" until="20.0.0.5">Used to enabled double sided faces. Default is 3 (DRAW_BOTH).</field>
        <field name="Flags" type="StencilFlags" default="19840" since="20.1.0.3" />
        <field name="Stencil Ref" type="uint" since="20.1.0.3" />
        <field name="Stencil Mask" type="uint" default="#UINT_MAX#" since="20.1.0.3">A bit mask. The default is 0xffffffff.</field>
    </niobject>

    <niobject name="NiStringExtraData" inherit="NiExtraData" module="NiMain">
        Extra data in the form of text.
        Used in various official or user-defined ways, e.g. preventing optimization on objects ("NiOptimizeKeep", "sgoKeep").
        <field name="String Data" type="string" since="4.0.0.0">The string.</field>
    </niobject>

    <niobject name="NiStringPalette" inherit="NiObject" module="NiMain">
        List of 0x00-seperated strings, which are names of controlled objects and controller types. Used in .kf files in conjunction with NiControllerSequence.
        <field name="Palette" type="StringPalette">A bunch of 0x00 seperated strings.</field>
    </niobject>

    <niobject name="NiStringsExtraData" inherit="NiExtraData" module="NiMain">
        Extra data in the form of a list of strings.
        <field name="Num Strings" type="uint" default="1">Number of strings.</field>
        <field name="Data" type="SizedString" length="Num Strings">The strings.</field>
    </niobject>

    <niobject name="NiTextKeyExtraData" inherit="NiExtraData" module="NiMain">
        Extra data that holds an array of NiTextKey objects for use in animation sequences.
        <field name="Num Text Keys" type="uint">The number of text keys that follow.</field>
        <field name="Text Keys" type="Key" arg="1" template="string" length="Num Text Keys">List of textual notes and at which time they take effect. Used for designating the start and stop of animations and the triggering of sounds.</field>
    </niobject>

    <niobject name="NiTextureEffect" inherit="NiDynamicEffect" module="NiMain">
        Represents an effect that uses projected textures such as projected lights (gobos), environment maps, and fog maps.
        <field name="Model Projection Matrix" type="Matrix33">Model projection matrix.  Always identity?</field>
        <field name="Model Projection Translation" type="Vector3">Model projection translation.  Always (0,0,0)?</field>
        <field name="Texture Filtering" type="TexFilterMode" default="FILTER_TRILERP">Texture Filtering mode.</field>
        <field name="Max Anisotropy" type="ushort" since="20.5.0.4" />
        <field name="Texture Clamping" type="TexClampMode" default="WRAP_S_WRAP_T">Texture Clamp mode.</field>
        <field name="Texture Type" default="TEX_ENVIRONMENT_MAP" type="TextureType">The type of effect that the texture is used for.</field>
        <field name="Coordinate Generation Type" default="CG_SPHERE_MAP" type="CoordGenType">The method that will be used to generate UV coordinates for the texture effect.</field>
        <field name="Image" type="Ref" template="NiImage" until="3.1">Image index.</field>
        <field name="Source Texture" type="Ref" template="NiSourceTexture" since="3.1">Source texture index.</field>
        <field name="Enable Plane" default="0" type="byte">Determines whether a clipping plane is used. Always 8-bit.</field>
        <field name="Plane" type="NiPlane" />
        <field name="PS2 L" type="short" default="0" until="10.2.0.0" />
        <field name="PS2 K" type="short" default="-75" until="10.2.0.0" />
        <field name="Unknown Short" type="ushort" until="4.1.0.12" default="0" />
    </niobject>

    <niobject name="NiTextureModeProperty" inherit="NiProperty" module="NiLegacy" until="V10_0_1_0">
        LEGACY (pre-10.1)
        <field name="Unknown Ints" type="uint" length="3" until="2.3" />
        <field name="Flags" type="ushort" since="3.0">Either 210 or 194.</field>
        <field name="PS2 L" type="short" default="0" since="3.1" until="10.2.0.0" />
        <field name="PS2 K" type="short" default="-75" since="3.1" until="10.2.0.0" />
    </niobject>

    <niobject name="NiImage" inherit="NiObject" module="NiLegacy" until="V10_0_1_0">
        LEGACY (pre-10.1)
        <field name="Use External" type="byte">0 if the texture is internal to the NIF file.</field>
        <field name="File Name" type="FilePath" cond="Use External != 0">The filepath to the texture.</field>
        <field name="Image Data" type="Ref" template="NiRawImageData" cond="Use External == 0">Link to the internally stored image data.</field>
        <field name="Unknown Int" type="uint" default="7" />
        <field name="Unknown Float" type="float" since="3.1" default="128.5" />
    </niobject>

    <niobject name="NiTextureProperty" inherit="NiProperty" module="NiLegacy" until="V10_0_1_0">
        LEGACY (pre-10.1)
        <field name="Unknown Ints 1" type="uint" length="2" until="2.3" />
        <field name="Flags" type="ushort" since="3.0">Property flags.</field>
        <field name="Image" type="Ref" template="NiImage">Link to the texture image.</field>
        <field name="Unknown Ints 2" type="uint" length="2" since="3.0" until="3.03" />
    </niobject>

    <niobject name="NiTexturingProperty" inherit="NiProperty" module="NiMain">
        Describes how a fragment shader should be configured for a given piece of geometry.
        <field name="Flags" type="ushort" until="10.0.1.2">Property flags.</field>
        <field name="Flags" type="TexturingFlags" since="20.1.0.2">Property flags.</field>
        <field name="Apply Mode" type="ApplyMode" default="APPLY_MODULATE" since="3.3.0.13" until="20.1.0.1">Determines how the texture will be applied.  Seems to have special functions in Oblivion.</field>
        <field name="Texture Count" type="uint" default="7">Number of textures.</field>
        <field name="Has Base Texture" type="bool" />
        <field name="Base Texture" type="TexDesc" cond="Has Base Texture" />
        <field name="Has Dark Texture" type="bool" />
        <field name="Dark Texture" type="TexDesc" cond="Has Dark Texture" />
        <field name="Has Detail Texture" type="bool" />
        <field name="Detail Texture" type="TexDesc" cond="Has Detail Texture" />
        <field name="Has Gloss Texture" type="bool" />
        <field name="Gloss Texture" type="TexDesc" cond="Has Gloss Texture" />
        <field name="Has Glow Texture" type="bool" />
        <field name="Glow Texture" type="TexDesc" cond="Has Glow Texture" />
        <field name="Has Bump Map Texture" type="bool" since="3.3.0.13" cond="Texture Count #GT# 5" />
        <field name="Bump Map Texture" type="TexDesc" since="3.3.0.13" cond="Has Bump Map Texture" />
        <field name="Bump Map Luma Scale" type="float" since="3.3.0.13" cond="Has Bump Map Texture" />
        <field name="Bump Map Luma Offset" type="float" since="3.3.0.13" cond="Has Bump Map Texture" />
        <field name="Bump Map Matrix" type="Matrix22" since="3.3.0.13" cond="Has Bump Map Texture" />
        <field name="Has Normal Texture" type="bool" cond="Texture Count #GT# 6" since="20.2.0.5" />
        <field name="Normal Texture" type="TexDesc" cond="Has Normal Texture" since="20.2.0.5" />
        <field name="Has Parallax Texture" type="bool" cond="Texture Count #GT# 7" since="20.2.0.5" />
        <field name="Parallax Texture" type="TexDesc" cond="Has Parallax Texture" since="20.2.0.5" />
        <field name="Parallax Offset" type="float" cond="Has Parallax Texture" since="20.2.0.5" />
        <field name="Has Decal 0 Texture" type="bool" cond="Texture Count #GT# 6" until="20.2.0.4" />
        <field name="Has Decal 0 Texture" type="bool" cond="Texture Count #GT# 8" since="20.2.0.5" />
        <field name="Decal 0 Texture" type="TexDesc" cond="Has Decal 0 Texture" />
        <field name="Has Decal 1 Texture" type="bool" cond="Texture Count #GT# 7" until="20.2.0.4" />
        <field name="Has Decal 1 Texture" type="bool" cond="Texture Count #GT# 9" since="20.2.0.5" />
        <field name="Decal 1 Texture" type="TexDesc" cond="Has Decal 1 Texture" />
        <field name="Has Decal 2 Texture" type="bool" cond="Texture Count #GT# 8" until="20.2.0.4" />
        <field name="Has Decal 2 Texture" type="bool" cond="Texture Count #GT# 10" since="20.2.0.5" />
        <field name="Decal 2 Texture" type="TexDesc" cond="Has Decal 2 Texture" />
        <field name="Has Decal 3 Texture" type="bool" cond="Texture Count #GT# 9" until="20.2.0.4" />
        <field name="Has Decal 3 Texture" type="bool" cond="Texture Count #GT# 11" since="20.2.0.5" />
        <field name="Decal 3 Texture" type="TexDesc" cond="Has Decal 3 Texture" />
        
        <field name="Num Shader Textures" type="uint" since="10.0.1.0" />
        <field name="Shader Textures" type="ShaderTexDesc" length="Num Shader Textures" since="10.0.1.0" />
    </niobject>

    <niobject name="NiMultiTextureProperty" inherit="NiTexturingProperty" module="NiLegacy" />

    <niobject name="NiTransformData" inherit="NiKeyframeData" module="NiAnimation">
        Wrapper for transformation animation keys.
    </niobject>

    <niobject name="NiTriShape" inherit="NiTriBasedGeom" module="NiMain">
        A shape node that refers to singular triangle data.
    </niobject>

    <niobject name="NiTriShapeData" inherit="NiTriBasedGeomData" module="NiMain">
        Holds mesh data using a list of singular triangles.
        <field name="Num Triangle Points" type="uint" range="0:196605">Num Triangles times 3.</field>
        <field name="Has Triangles" type="bool" since="10.1.0.0">Do we have triangle data?</field>
        <field name="Triangles" type="Triangle" length="Num Triangles" until="10.0.1.2">Triangle data.</field>
        <field name="Triangles" type="Triangle" length="Num Triangles" cond="Has Triangles" since="10.0.1.3">Triangle face data.</field>
        <field name="Num Match Groups" type="ushort" since="3.1">Number of shared normals groups.</field>
        <field name="Match Groups" type="MatchGroup" length="Num Match Groups" since="3.1">The shared normals.</field>
    </niobject>

    <niobject name="NiTriStrips" inherit="NiTriBasedGeom" module="NiMain">
        A shape node that refers to data organized into strips of triangles
    </niobject>

    <niobject name="NiTriStripsData" inherit="NiTriBasedGeomData" module="NiMain">
        Holds mesh data using strips of triangles.
        <field name="Num Strips" type="ushort" default="1" />
        <field name="Strip Lengths" type="ushort" length="Num Strips">The number of points in each triangle strip.</field>
        <field name="Has Points" type="bool" default="1" since="10.0.1.3">Do we have strip point data?</field>
        <field name="Points" type="ushort" length="Num Strips" width="Strip Lengths" until="10.0.1.2">The points in the Triangle strips.  Size is the sum of all entries in Strip Lengths.</field>
        <field name="Points" type="ushort" length="Num Strips" width="Strip Lengths" cond="Has Points" since="10.0.1.3">The points in the Triangle strips. Size is the sum of all entries in Strip Lengths.</field>
    </niobject>

    <niobject name="NiEnvMappedTriShape" inherit="NiObjectNET" module="NiLegacy" until="V10_0_1_0">
        Unknown
        <field name="Unknown 1" type="ushort" />
        <field name="Unknown Matrix" type="Matrix44" />
        <field name="Num Children" type="uint">The number of child objects.</field>
        <field name="Children" type="Ref" template="NiAVObject" length="Num Children">List of child node object indices.</field>
        <field name="Child 2" type="Ref" template="NiObject" />
        <field name="Child 3" type="Ref" template="NiObject" />
    </niobject>

    <niobject name="NiEnvMappedTriShapeData" inherit="NiTriShapeData" module="NiLegacy" until="V10_0_1_0">
        Holds mesh data using a list of singular triangles.
    </niobject>

    <niobject name="NiBezierTriangle4" inherit="NiObject" module="NiLegacy" until="V10_0_1_0">
        LEGACY (pre-10.1)
        Sub data of NiBezierMesh
        <field name="Unknown 1" type="uint" length="6" />
        <field name="Unknown 2" type="ushort" />
        <field name="Matrix" type="Matrix33" />
        <field name="Vector 1" type="Vector3" />
        <field name="Vector 2" type="Vector3" />
        <field name="Unknown 3" type="short" length="4" />
        <field name="Unknown 4" type="byte" />
        <field name="Unknown 5" type="uint" />
        <field name="Unknown 6" type="short" length="24" />
    </niobject>

    <niobject name="NiBezierMesh" inherit="NiAVObject" module="NiLegacy" until="V10_0_1_0">
        LEGACY (pre-10.1)
        Unknown
        <field name="Num Bezier Triangles" type="uint" />
        <field name="Bezier Triangle" type="Ref" template="NiBezierTriangle4" length="Num Bezier Triangles" />
        <field name="Unknown 3" type="uint" />
        <field name="Count 1" type="ushort" />
        <field name="Unknown 4" type="ushort" />
        <field name="Points 1" type="Vector3" length="Count 1" />
        <field name="Unknown 5" type="uint" />
        <field name="Points 2" type="float" length="Count 1" width="2" />
        <field name="Unknown 6" type="uint" />
        <field name="Count 2" type="ushort" />
        <field name="Data 2" type="ushort" length="Count 2" width="4" />
    </niobject>

    <niobject name="NiClod" inherit="NiTriBasedGeom" module="NiLegacy" until="V4_0_0_2">
        A shape node that holds continuous level of detail information.
        Seems to be specific to Freedom Force.
        Found in: Freedom Force, Spellbinder
    </niobject>

    <niobject name="NiClodData" inherit="NiTriBasedGeomData" module="NiLegacy" until="V4_0_0_2">
        Holds mesh data for continuous level of detail shapes.
        Presumably a progressive mesh with triangles specified by edge splits.
        Found in: Freedom Force, Spellbinder
        <field name="Unknown Shorts" type="ushort" />
        <field name="Unknown Count 1" type ="ushort" />
        <field name="Unknown Count 2" type ="ushort" />
        <field name="Unknown Count 3" type ="ushort" />
        <field name="Unknown Float" type="float" />
        <field name="Unknown Short" type="ushort" />
        <field name="Unknown Clod Shorts 1" type="ushort" length="Unknown Count 1" width="6" />
        <field name="Unknown Clod Shorts 2" type="ushort" length="Unknown Count 2" />
        <field name="Unknown Clod Shorts 3" type="ushort" length="Unknown Count 3" width="6" />
    </niobject>

    <niobject name="NiClodSkinInstance" inherit="NiSkinInstance" module="NiLegacy" until="V4_0_0_2">
        A copy of NiSkinInstance for use with NiClod meshes.
        Found in: Freedom Force, Spellbinder
    </niobject>

    <niobject name="NiUVController" inherit="NiTimeController" module="NiAnimation" until="V20_2_0_8">
        DEPRECATED (pre-10.1), REMOVED (20.3).
        Time controller for texture coordinates.
        <field name="Texture Set" type="ushort" />
        <field name="Data" type="Ref" template="NiUVData">Texture coordinate controller data index.</field>
    </niobject>

    <niobject name="NiUVData" inherit="NiObject" module="NiAnimation" until="V20_2_0_8">
        DEPRECATED (pre-10.1), REMOVED (20.3)
        Texture coordinate data.
        <field name="UV Groups" type="KeyGroup" template="float" length="4">
            Four UV data groups. Appear to be U translation, V translation, U scaling/tiling, V scaling/tiling.
        </field>
    </niobject>

    <niobject name="NiVectorExtraData" inherit="NiExtraData" module="NiMain">
        DEPRECATED (20.5).
        Extra data in the form of a vector (as x, y, z, w components).
        <field name="Vector Data" type="Vector4">The vector data.</field>
    </niobject>

    <niobject name="NiVertexColorProperty" inherit="NiProperty" module="NiMain">
        Property of vertex colors. This object is referred to by the root object of the NIF file whenever some NiTriShapeData object has vertex colors with non-default settings; if not present, vertex colors have vertex_mode=2 and lighting_mode=1.
        <field name="Flags" type="VertexColorFlags" />
        <field name="Vertex Mode" type="SourceVertexMode" until="20.0.0.5">In Flags from 20.1.0.3 on.</field>
        <field name="Lighting Mode" type="LightingMode" until="20.0.0.5">In Flags from 20.1.0.3 on.</field>
    </niobject>

    <niobject name="NiVertWeightsExtraData" inherit="NiExtraData" module="NiMain">
        DEPRECATED (10.x), REMOVED (?)
        Not used in skinning.
        Unsure of use - perhaps for morphing animation or gravity.
        <field name="Num Vertices" type="ushort">Number of vertices.</field>
        <field name="Weight" type="float" length="Num Vertices">The vertex weights.</field>
    </niobject>

    <niobject name="NiVisData" inherit="NiObject" module="NiAnimation">
        DEPRECATED (10.2), REMOVED (?), Replaced by NiBoolData.
        Visibility data for a controller.
        <field name="Num Keys" type="uint" />
        <field name="Keys" type="Key" arg="1" template="byte" length="Num Keys" />
    </niobject>

    <niobject name="NiWireframeProperty" inherit="NiProperty" module="NiMain">
        Allows applications to switch between drawing solid geometry or wireframe outlines.
        <field name="Flags" type="WireframeFlags" />
    </niobject>

    <niobject name="NiZBufferProperty" inherit="NiProperty" module="NiMain">
        Allows applications to set the test and write modes of the renderer's Z-buffer and to set the comparison function used for the Z-buffer test.
        <field name="Flags" type="ZBufferFlags" default="3" />
        <field name="Function" type="TestFunction" default="TEST_LESS_EQUAL" since="4.1.0.12" until="20.0.0.5">
            Z-Test function. In Flags from 20.1.0.3 on.
        </field>
    </niobject>

    <niobject name="RootCollisionNode" inherit="NiNode" module="BSLegacy" versions="V4_0_0_2">
        Morrowind-specific node for collision mesh.
    </niobject>

    <niobject name="NiRawImageData" inherit="NiObject" module="NiLegacy" until="V3_1">
        LEGACY (pre-10.1)
        Raw image data.
        <field name="Width" type="uint">Image width</field>
        <field name="Height" type="uint">Image height</field>
        <field name="Image Type" type="ImageType">The format of the raw image data.</field>
        <field name="RGB Image Data" type="ByteColor3" length="Width" width="Height" cond="Image Type == 1" >Image pixel data.</field>
        <field name="RGBA Image Data" type="ByteColor4" length="Width" width="Height" cond="Image Type == 2" >Image pixel data.</field>
    </niobject>
    
    <niobject name="NiAccumulator" abstract="true" inherit="NiObject" module="NiMain" />

    <niobject name="NiSortAdjustNode" inherit="NiNode" module="NiMain">
        Used to turn sorting off for individual subtrees in a scene. Useful if objects must be drawn in a fixed order.
        <field name="Sorting Mode" type="SortingMode" default="SORTING_INHERIT">Sorting</field>
        <field name="Accumulator" type="Ref" template="NiAccumulator" until="20.0.0.3" />
    </niobject>

    <niobject name="NiSourceCubeMap" inherit="NiSourceTexture" module="NiLegacy">
        Represents cube maps that are created from either a set of six image files, six blocks of pixel data, or a single pixel data with six faces.
    </niobject>

    <!-- NiPhysX -->

    <niobject name="NiPhysXScene" inherit="NiObjectNET" module="NiPhysX" since="V20_2_0_8">
        Object which manages a NxScene object and the Gamebryo objects that interact with it.
        <field name="Scene Transform" type="NiTransform" />
        <field name="PhysX to World Scale" type="float" default="1.0" />
        <field name="Num Props" type="uint" since="20.3.0.2" />
        <field name="Props" type="Ref" template="NiPhysXProp" length="Num Props" since="20.3.0.2" />
        <field name="Num Sources" type="uint" />
        <field name="Sources" type="Ref" template="NiPhysXSrc" length="Num Sources" />
        <field name="Num Dests" type="uint" />
        <field name="Dests" type="Ref" template="NiPhysXDest" length="Num Dests" />
        <field name="Num Modified Meshes" type="uint" since="20.4.0.0" />
        <field name="Modified Meshes" type="Ref" template="NiMesh" length="Num Modified Meshes" since="20.4.0.0" />
        <field name="Time Step" type="float" default="0.016666" since="20.2.0.8" />
        <field name="Keep Meshes" type="bool" since="20.2.0.8" until="20.3.0.1" />
        <field name="Num Sub Steps" type="uint" default="1" since="20.3.0.9" />
        <field name="Max Sub Steps" type="uint" default="8" since="20.3.0.9" />
        <field name="Snapshot" type="Ref" template="NiPhysXSceneDesc" />
        <field name="Flags" type="ushort" />
    </niobject>

    <enum name="NiSceneDescNxBroadPhaseType" storage="uint" prefix="NX" since="V20_2_0_8">
        <option value="0" name="BROADPHASE_QUADRATIC" />
        <option value="1" name="BROADPHASE_FULL" />
        <option value="2" name="BROADPHASE_COHERENT" />
    </enum>

    <enum name="NiSceneDescNxHwPipelineSpec" storage="uint" prefix="NX_HW" since="V20_2_0_8">
        <option value="0" name="RB_PIPELINE_HLP_ONLY" />
        <option value="1" name="PIPELINE_FULL" />
        <option value="2" name="PIPELINE_DEBUG" />
    </enum>

    <enum name="NiSceneDescNxHwSceneType" storage="uint" prefix="NX_HW" since="V20_2_0_8">
        <option value="0" name="SCENE_TYPE_RB" />
        <option value="1" name="SCENE_TYPE_FLUID" />
        <option value="2" name="SCENE_TYPE_FLUID_SOFTWARE" />
        <option value="3" name="SCENE_TYPE_CLOTH" />
    </enum>

    <enum name="NxTimeStepMethod" storage="uint" prefix="NX" since="V20_2_0_8">
        <option value="0" name="TIMESTEP_FIXED" />
        <option value="1" name="TIMESTEP_VARIABLE" />
        <option value="2" name="TIMESTEP_INHERIT" />
    </enum>

    <enum name="NxSimulationType" storage="uint" prefix="NX" since="V20_2_0_8">
        <option value="0" name="SIMULATION_SW" />
        <option value="1" name="SIMULATION_HW" />
    </enum>

    <enum name="NxBroadPhaseType" storage="uint" prefix="NX" since="V20_2_0_8">
        <option value="0" name="BP_TYPE_SAP_SINGLE" />
        <option value="1" name="BP_TYPE_SAP_MULTI" />
    </enum>

    <enum name="NxFilterOp" storage="uint" prefix="NX" since="V20_2_0_8">
        <option value="0" name="FILTEROP_AND" />
        <option value="1" name="FILTEROP_OR" />
        <option value="2" name="FILTEROP_XOR" />
        <option value="3" name="FILTEROP_NAND" />
        <option value="4" name="FILTEROP_NOR" />
        <option value="5" name="FILTEROP_NXOR" />
        <option value="6" name="FILTEROP_SWAP_AND" />
    </enum>

    <enum name="NxThreadPriority" storage="uint" prefix="NX" since="V20_2_0_8">
        <option value="0" name="TP_HIGH" />
        <option value="1" name="TP_ABOVE_NORMAL" />
        <option value="2" name="TP_NORMAL" />
        <option value="3" name="TP_BELOW_NORMAL" />
        <option value="4" name="TP_LOW" />
    </enum>

    <enum name="NxPruningStructure" storage="uint" prefix="NX" since="V20_2_0_8">
        <option value="0" name="PRUNING_NONE" />
        <option value="1" name="PRUNING_OCTREE" />
        <option value="2" name="PRUNING_QUADTREE" />
        <option value="3" name="PRUNING_DYNAMIC_AABB_TREE" />
        <option value="4" name="PRUNING_STATIC_AABB_TREE" />
    </enum>

    <enum name="NxCompartmentType" storage="uint" prefix="NX" since="V20_2_0_8">
        <option value="0" name="SCT_RIGIDBODY" />
        <option value="1" name="SCT_FLUID" />
        <option value="2" name="SCT_CLOTH" />
    </enum>

    <enum name="NxDeviceCode" storage="uint" prefix="NX_DC" since="V20_2_0_8">
        <option value="0" name="PPU_0" />
        <option value="1" name="PPU_1" />
        <option value="2" name="PPU_2" />
        <option value="3" name="PPU_3" />
        <option value="4" name="PPU_4" />
        <option value="5" name="PPU_5" />
        <option value="6" name="PPU_6" />
        <option value="7" name="PPU_7" />
        <option value="8" name="PPU_8" />
        <option value="4294901760" name="CPU" />
        <option value="4294901761" name="PPU_AUTO_ASSIGN" />
    </enum>

    <bitflags name="NxBodyFlag" storage="uint" prefix="NX_BF" since="V20_2_0_8">
        <option bit="0" name="DISABLE_GRAVITY" />
        <option bit="1" name="FROZEN_POS_X" />
        <option bit="2" name="FROZEN_POS_Y" />
        <option bit="3" name="FROZEN_POS_Z" />
        <option bit="4" name="FROZEN_ROT_X" />
        <option bit="5" name="FROZEN_ROT_Y" />
        <option bit="6" name="FROZEN_ROT_Z" />
        <option bit="7" name="KINEMATIC" />
        <option bit="8" name="VISUALIZATION" />
        <option bit="9" name="POSE_SLEEP_TEST" />
        <option bit="10" name="FILTER_SLEEP_VEL" />
        <option bit="11" name="ENERGY_SLEEP_TEST" />
    </bitflags>

    <compound name="NiPhysXMaterialDescMap" size="6" since="V20_2_0_8">
        <field name="Key" type="ushort" />
        <field name="Material" type="Ref" template="NiPhysXMaterialDesc" />
    </compound>

    <compound name="NxCompartmentDescMap" size="20" since="V20_2_0_8">
        <field name="ID" type="uint" />
        <field name="Type" type="NxCompartmentType" default="SCT_RIGIDBODY" />
        <field name="Device Code" type="NxDeviceCode" default="CPU" />
        <field name="Grid Hash Cell Size" type="float" default="100.0" />
        <field name="Grid Hash Table Power" type="uint" default="8" />
    </compound>

    <niobject name="NiPhysXSceneDesc" inherit="NiObject" module="NiPhysX" since="V20_2_0_8">
        Object which caches the properties of NxScene, stored as a snapshot in a NiPhysXScene.
        <field name="Broad Phase Type" type="NiSceneDescNxBroadPhaseType" until="20.2.0.7" />
        <field name="Gravity" type="Vector3" />
        <field name="Max Timestep" type="float" default="0.016666" />
        <field name="Max Iterations" type="uint" default="8" />
        <field name="Time Step Method" type="NxTimeStepMethod" default="TIMESTEP_FIXED" />
        <field name="Has Bound" type="bool" />
        <field name="Max Bounds Min" type="Vector3" cond="Has Bound" />
        <field name="Max Bounds Max" type="Vector3" cond="Has Bound" />
        <field name="Has Limits" type="bool" />
        <field name="Max Actors" type="uint" cond="Has Limits" />
        <field name="Max Bodies" type="uint" cond="Has Limits" />
        <field name="Max Static Shapes" type="uint" cond="Has Limits" />
        <field name="Max Dynamic Shapes" type="uint" cond="Has Limits" />
        <field name="Simulation Type" type="NxSimulationType" default="SIMULATION_SW" />
        <field name="HW Scene Type" type="NiSceneDescNxHwSceneType" until="20.2.0.8" />
        <field name="HW Pipeline Spec" type="NiSceneDescNxHwPipelineSpec" until="20.2.0.8" />
        <field name="Ground Plane" type="bool" />
        <field name="Bounds Plane" type="bool" />
        <field name="Collision Detection" type="bool" until="20.2.0.7" />
        <field name="Flags" type="uint" since="20.2.0.8" />
        <field name="Internal Thread Count" type="uint" since="20.2.0.8" />
        <field name="Background Thread Count" type="uint" since="20.2.0.8" />
        <field name="Thread Mask" type="uint" since="20.2.0.8" />
        <field name="Background Thread Priority" type="uint" since="20.5.0.3" />
        <field name="Background Thread Mask" type="uint" since="20.2.0.8" />
        <field name="Num HW Scenes" type="uint" since="20.3.0.1" until="20.3.0.5" />
        <field name="Sim Thread Stack Size" type="uint" since="20.3.0.1" />
        <field name="Sim Thread Priority" type="NxThreadPriority" default="TP_NORMAL" since="20.3.0.1" />
        <field name="Worker Thread Stack Size" type="uint" since="20.3.0.1" />
        <field name="Worker Thread Priority" type="NxThreadPriority" default="TP_NORMAL" since="20.3.0.1" />
        <field name="Up Axis" type="uint" since="20.3.0.1" />
        <field name="Subdivision Level" type="uint" default="5" since="20.3.0.1" />
        <field name="Static Structure" type="NxPruningStructure" default="PRUNING_NONE" since="20.3.0.1" />
        <field name="Dynamic Structure" type="NxPruningStructure" default="PRUNING_STATIC_AABB_TREE" since="20.3.0.1" />
        <field name="Dynamic Tree Rebuild Rate Hint" type="uint" since="20.5.0.3" />
        <field name="Broad Phase Type" type="NxBroadPhaseType" since="20.4.0.0" />
        <field name="Grid Cells X" type="uint" since="20.4.0.0" />
        <field name="Grid Cells Y" type="uint" since="20.4.0.0" />
        <field name="Num Actors" type="uint" until="20.3.0.1" />
        <field name="Actors" type="Ref" template="NiPhysXActorDesc" length="Num Actors" until="20.3.0.1" />
        <field name="Num Joints" type="uint" until="20.3.0.1" />
        <field name="Joints" type="Ref" template="NiPhysXJointDesc" length="Num Joints" until="20.3.0.1" />
        <field name="Num Materials" type="uint" until="20.3.0.1" />
        <field name="Materials" type="NiPhysXMaterialDescMap" length="Num Materials" until="20.3.0.1" />
        <field name="Group Collision Flags" type="bool" length="1024" />
        <field name="Filter Ops" type="NxFilterOp" length="3" />
        <field name="Filter Constants" type="uint" length="8" />
        <field name="Filter" type="bool" default="1" />
        <field name="Num States" type="uint" until="20.3.0.1" />
        <field name="Num Compartments" type="uint" since="20.3.0.6" />
        <field name="Compartments" type="NxCompartmentDescMap" length="Num Compartments" since="20.3.0.6" />
    </niobject>

    <niobject name="NiPhysXProp" inherit="NiObjectNET" module="NiPhysX" since="V20_2_0_8">
        A PhysX prop which holds information about PhysX actors in a Gamebryo scene
        <field name="PhysX to World Scale" type="float" default="1.0" />
        <field name="Num Sources" type="uint" />
        <field name="Sources" type="Ref" template="NiPhysXSrc" length="Num Sources" />
        <field name="Num Dests" type="uint" />
        <field name="Dests" type="Ref" template="NiPhysXDest" length="Num Dests" />
        <field name="Num Modified Meshes" type="uint" since="20.4.0.0" />
        <field name="Modified Meshes" type="Ref" template="NiMesh" length="Num Modified Meshes" since="20.4.0.0" />
        <field name="Temp Name" type="NiFixedString" since="30.1.0.2" until="30.2.0.2" />
        <field name="Keep Meshes" type="bool" />
        <field name="Snapshot" type="Ref" template="NiPhysXPropDesc" />
    </niobject>

    <niobject name="NiPhysXPropDesc" inherit="NiObject" module="NiPhysX" since="V20_2_0_8">
        For serialization of PhysX objects and to attach them to the scene.
        <field name="Num Actors" type="uint" />
        <field name="Actors" type="Ref" template="NiPhysXActorDesc" length="Num Actors" />
        <field name="Num Joints" type="uint" />
        <field name="Joints" type="Ref" template="NiPhysXJointDesc" length="Num Joints" />
        <field name="Num Clothes" type="uint" since="20.3.0.5" />
        <field name="Clothes" type="Ref" template="NiPhysXClothDesc" length="Num Clothes" since="20.3.0.5" />
        <field name="Num Materials" type="uint" />
        <field name="Materials" type="NiPhysXMaterialDescMap" length="Num Materials" />
        <field name="Num States" type="uint" />
        <field name="State Names" type="NiTFixedStringMap" template="uint" since="20.4.0.0" />
        <field name="Flags" type="byte" since="20.4.0.0" />
    </niobject>

    <niobject name="NiPhysXActorDesc" inherit="NiObject" module="NiPhysX" since="V20_2_0_8">
        For serializing NxActor objects.
        <field name="Actor Name" type="NiFixedString" />
        <field name="Num Poses" type="uint" />
        <field name="Poses" type="Matrix34" length="Num Poses" />
        <field name="Body Desc" type="Ref" template="NiPhysXBodyDesc" />
        <field name="Density" type="float" />
        <field name="Actor Flags" type="uint" />
        <field name="Actor Group" type="ushort" />
        <field name="Dominance Group" type="ushort" since="20.4.0.0" />
        <field name="Contact Report Flags" type="uint" since="20.4.0.0" />
        <field name="Force Field Material" type="ushort" since="20.4.0.0" />
        <field name="Dummy" type="uint" since="20.3.0.1" until="20.3.0.5" />
        <field name="Num Shape Descs" type="uint" />
        <field name="Shape Descriptions" type="Ref" template="NiPhysXShapeDesc" length="Num Shape Descs" />
        <field name="Actor Parent" type="Ref" template="NiPhysXActorDesc" />
        <field name="Source" type="Ref" template="NiPhysXRigidBodySrc" />
        <field name="Dest" type="Ref" template="NiPhysXRigidBodyDest" />
    </niobject>

    <compound name="PhysXBodyStoredVels" since="V20_2_0_8">
        <field name="Linear Velocity" type="Vector3" />
        <field name="Angular Velocity" type="Vector3" />
        <field name="Sleep" type="bool" since="30.2.0.3" />
    </compound>

    <niobject name="NiPhysXBodyDesc" inherit="NiObject" module="NiPhysX" since="V20_2_0_8">
        For serializing NxBodyDesc objects.
        <field name="Local Pose" type="Matrix34" />
        <field name="Space Inertia" type="Vector3" />
        <field name="Mass" type="float" />
        <field name="Num Vels" type="uint" />
        <field name="Vels" type="PhysXBodyStoredVels" length="Num Vels" />
        <field name="Wake Up Counter" type="float" default="0.4" />
        <field name="Linear Damping" type="float" />
        <field name="Angular Damping" type="float" default="0.05" />
        <field name="Max Angular Velocity" type="float" default="-1.0" />
        <field name="CCD Motion Threshold" type="float" />
        <field name="Flags" type="NxBodyFlag" default="0x900" />
        <field name="Sleep Linear Velocity" type="float" default="-1.0" />
        <field name="Sleep Angular Velocity" type="float" default="-1.0" />
        <field name="Solver Iteration Count" type="uint" default="4" />
        <field name="Sleep Energy Threshold" type="float" default="-1.0" since="20.3.0.0" />
        <field name="Sleep Damping" type="float" since="20.3.0.0" />
        <field name="Contact Report Threshold" type="float" default="#FLT_MAX#" since="20.4.0.0" />
    </niobject>

    <enum name="NxJointType" storage="uint" prefix="NX_JOINT" since="V20_2_0_8">
        <option value="0" name="PRISMATIC" />
        <option value="1" name="REVOLUTE" />
        <option value="2" name="CYLINDRICAL" />
        <option value="3" name="SPHERICAL" />
        <option value="4" name="POINT_ON_LINE" />
        <option value="5" name="POINT_IN_PLANE" />
        <option value="6" name="DISTANCE" />
        <option value="7" name="PULLEY" />
        <option value="8" name="FIXED" />
        <option value="9" name="D6" />
    </enum>

    <enum name="NxD6JointMotion" storage="uint" prefix="NX_D6JOINT" since="V20_2_0_8">
        <option value="0" name="MOTION_LOCKED" />
        <option value="1" name="MOTION_LIMITED" />
        <option value="2" name="MOTION_FREE" />
    </enum>

    <enum name="NxD6JointDriveType" storage="uint" prefix="NX_D6JOINT" since="V20_2_0_8">
        <option value="1" name="DRIVE_POSITION" />
        <option value="2" name="DRIVE_VELOCITY" />
    </enum>

    <enum name="NxJointProjectionMode" storage="uint" prefix="NX" since="V20_2_0_8">
        <option value="0" name="JPM_NONE"/>
        <option value="1" name="JPM_POINT_MINDIST" />
        <option value="2" name="JPM_LINEAR_MINDIST" />
    </enum>

    <compound name="NiPhysXJointActor" size="40" since="V20_2_0_8">
        <field name="Actor" type="Ref" template="NiPhysXActorDesc" />
        <field name="Local Normal" type="Vector3" />
        <field name="Local Axis" type="Vector3" />
        <field name="Local Anchor" type="Vector3" />
    </compound>

    <compound name="NxJointLimitSoftDesc" size="16" since="V20_2_0_8">
        <field name="Value" type="float" />
        <field name="Restitution" type="float" />
        <field name="Spring" type="float" />
        <field name="Damping" type="float" />
    </compound>

    <compound name="NxJointDriveDesc" size="16" since="V20_2_0_8">
        <field name="Drive Type" type="NxD6JointDriveType" />
        <field name="Spring" type="float" />
        <field name="Damping" type="float" />
        <field name="Force Limit" type="float" default="#FLT_MAX#" />
    </compound>

    <compound name="NiPhysXJointLimit" since="V20_2_0_8">
        <field name="Limit Plane Normal" type="Vector3" />
        <field name="Limit Plane D" type="float" />
        <field name="Limit Plane R" type="float" since="20.4.0.0" />
    </compound>

    <niobject name="NiPhysXJointDesc" abstract="true" inherit="NiObject" module="NiPhysX" since="V20_2_0_8">
        A PhysX Joint abstract base class.
        <field name="Joint Type" type="NxJointType" />
        <field name="Joint Name" type="NiFixedString" />
        <field name="Actors" type="NiPhysXJointActor" length="2" />
        <field name="Max Force" type="float" />
        <field name="Max Torque" type="float" />
        <field name="Solver Extrapolation Factor" type="float" since="20.5.0.3" />
        <field name="Use Acceleration Spring" type="uint" since="20.5.0.3" />
        <field name="Joint Flags" type="uint" />
        <field name="Limit Point" type="Vector3" />
        <field name="Num Limits" type="uint" />
        <field name="Limits" type="NiPhysXJointLimit" length="Num Limits" />
    </niobject>

    <niobject name="NiPhysXD6JointDesc" inherit="NiPhysXJointDesc" module="NiPhysX" since="V20_2_0_8">
        A 6DOF (6 degrees of freedom) joint.
        <field name="X Motion" type="NxD6JointMotion" default="MOTION_FREE" />
        <field name="Y Motion" type="NxD6JointMotion" default="MOTION_FREE" />
        <field name="Z Motion" type="NxD6JointMotion" default="MOTION_FREE" />
        <field name="Swing 1 Motion" type="NxD6JointMotion" default="MOTION_FREE" />
        <field name="Swing 2 Motion" type="NxD6JointMotion" default="MOTION_FREE" />
        <field name="Twist Motion" type="NxD6JointMotion" default="MOTION_FREE" />
        <field name="Linear Limit" type="NxJointLimitSoftDesc" />
        <field name="Swing 1 Limit" type="NxJointLimitSoftDesc" />
        <field name="Swing 2 Limit" type="NxJointLimitSoftDesc" />
        <field name="Twist Low Limit" type="NxJointLimitSoftDesc" />
        <field name="Twist High Limit" type="NxJointLimitSoftDesc" />
        <field name="X Drive" type="NxJointDriveDesc" />
        <field name="Y Drive" type="NxJointDriveDesc" />
        <field name="Z Drive" type="NxJointDriveDesc" />
        <field name="Swing Drive" type="NxJointDriveDesc" />
        <field name="Twist Drive" type="NxJointDriveDesc" />
        <field name="Slerp Drive" type="NxJointDriveDesc" />
        <field name="Drive Position" type="Vector3" />
        <field name="Drive Orientation" type="Quaternion" />
        <field name="Drive Linear Velocity" type="Vector3" />
        <field name="Drive Angular Velocity" type="Vector3" />
        <field name="Projection Mode" type="NxJointProjectionMode" />
        <field name="Projection Distance" type="float" default="0.1" />
        <field name="Projection Angle" type="float" default="0.0872" />
        <field name="Gear Ratio" type="float" default="1.0" />
        <field name="Flags" type="uint" />
    </niobject>

    <enum name="NxShapeType" storage="uint" prefix="NX" since="V20_2_0_8">
        <option value="0" name="SHAPE_PLANE" />
        <option value="1" name="SHAPE_SPHERE" />
        <option value="2" name="SHAPE_BOX" />
        <option value="3" name="SHAPE_CAPSULE" />
        <option value="4" name="SHAPE_WHEEL" />
        <option value="5" name="SHAPE_CONVEX" />
        <option value="6" name="SHAPE_MESH" />
        <option value="7" name="SHAPE_HEIGHTFIELD" />
        <option value="8" name="SHAPE_RAW_MESH" />
        <option value="9" name="SHAPE_COMPOUND" />
    </enum>

    <bitflags name="NxShapeFlag" storage="uint" prefix="NX_SF" since="V20_2_0_8">
        <option bit="0" name="TRIGGER_ON_ENTER" />
        <option bit="1" name="TRIGGER_ON_LEAVE" />
        <option bit="2" name="TRIGGER_ON_STAY" />
        <option bit="3" name="VISUALIZATION" />
        <option bit="4" name="DISABLE_COLLISION" />
        <option bit="5" name="FEATURE_INDICES" />
        <option bit="6" name="DISABLE_RAYCASTING" />
        <option bit="7" name="POINT_CONTACT_FORCE" />
        <option bit="8" name="FLUID_DRAIN" />
        <option bit="10" name="FLUID_DISABLE_COLLISION" />
        <option bit="11" name="FLUID_TWOWAY" />
        <option bit="12" name="DISABLE_RESPONSE" />
        <option bit="13" name="DYNAMIC_DYNAMIC_CCD" />
        <option bit="14" name="DISABLE_SCENE_QUERIES" />
        <option bit="15" name="CLOTH_DRAIN" />
        <option bit="16" name="CLOTH_DISABLE_COLLISION" />
        <option bit="17" name="CLOTH_TWOWAY" />
        <option bit="18" name="SOFTBODY_DRAIN" />
        <option bit="19" name="SOFTBODY_DISABLE_COLLISION" />
        <option bit="20" name="SOFTBODY_TWOWAY" />
    </bitflags>

    <compound name="NxPlane" size="16" since="V20_2_0_8">
        <field name="Val 1" type="float" />
        <field name="Point 1" type="Vector3" />
    </compound>

    <compound name="NxCapsule" size="12" since="V20_2_0_8">
        <field name="Val 1" type="float" />
        <field name="Val 2" type="float" />
        <field name="Capsule Flags" type="uint" />
    </compound>

    <niobject name="NiPhysXShapeDesc" inherit="NiObject" module="NiPhysX" since="V20_2_0_8">
        For serializing NxShapeDesc objects
        <field name="Shape Type" type="NxShapeType" />
        <field name="Local Pose" type="Matrix34" />
        <field name="Flags" type="NxShapeFlag" default="0x120008" />
        <field name="Collision Group" type="ushort" />
        <field name="Material Index" type="ushort" />
        <field name="Density" type="float" default="1.0" />
        <field name="Mass" type="float" default="-1.0" />
        <field name="Skin Width" type="float" default="-1.0" />
        <field name="Shape Name" type="NiFixedString" />
        <field name="Non Interacting Compartment Types" type="uint" since="20.4.0.0" />
        <field name="Collision Bits" type="uint" length="4" />
        <field name="Plane" type="NxPlane" cond="Shape Type == 0" />
        <field name="Sphere Radius" type="float" cond="Shape Type == 1" />
        <field name="Box Half Extents" type="Vector3" cond="Shape Type == 2" />
        <field name="Capsule" type="NxCapsule" cond="Shape Type == 3" />
        <field name="Mesh" type="Ref" template="NiPhysXMeshDesc" cond="(Shape Type == 5) || (Shape Type == 6)" />
    </niobject>

    <niobject name="NiPhysXMeshDesc" inherit="NiObject" module="NiPhysX" since="V20_2_0_8">
        Holds mesh data for streaming.
        <field name="Is Convex" type="bool" until="20.3.0.4" />
        <field name="Mesh Name" type="NiFixedString" />
        <field name="Mesh Data" type="ByteArray" />
        <field name="Back Compat Vertex Map Size" type="ushort" since="20.3.0.5" until="30.2.0.2" />
        <field name="Back Compat Vertex Map" type="ushort" length="Back Compat Vertex Map Size" since="20.3.0.5" until="30.2.0.2" />
        <field name="Mesh Flags" type="uint" />
        <field name="Mesh Paging Mode" type="uint" since="20.3.0.1" />
        <field name="Is Hardware" type="bool" since="20.3.0.2" until="20.3.0.4" />
        <field name="Flags" type="byte" since="20.3.0.5" />
    </niobject>

    <bitflags name="NxMaterialFlag" storage="uint" prefix="NX_MF" since="V20_2_0_8">
        <option bit="0" name="ANISOTROPIC" />
        <option bit="4" name="DISABLE_FRICTION" />
        <option bit="5" name="DISABLE_STRONG_FRICTION" />
    </bitflags>

    <compound name="NxSpringDesc" size="12" since="V20_2_0_8">
        <field name="Spring" type="float" />
        <field name="Damper" type="float" />
        <field name="Target Value" type="float" />
    </compound>

    <enum name="NxCombineMode" storage="uint" prefix="NX_CM" since="V20_2_0_8">
        <option value="0" name="AVERAGE" />
        <option value="1" name="MIN" />
        <option value="2" name="MULTIPLY" />
        <option value="3" name="MAX" />
    </enum>

    <compound name="NxMaterialDesc" since="V20_2_0_8">
        <field name="Dynamic Friction" type="float" />
        <field name="Static Friction" type="float" />
        <field name="Restitution" type="float" />
        <field name="Dynamic Friction V" type="float" />
        <field name="Static Friction V" type="float" />
        <field name="Direction of Anisotropy" type="Vector3" default="#X_AXIS#" />
        <field name="Flags" type="NxMaterialFlag" />
        <field name="Friction Combine Mode" type="NxCombineMode" />
        <field name="Restitution Combine Mode" type="NxCombineMode" />
        <field name="Has Spring" type="bool" until="20.2.3.0" />
        <field name="Spring" type="NxSpringDesc" until="20.2.3.0" cond="Has Spring" />
    </compound>

    <niobject name="NiPhysXMaterialDesc" inherit="NiObject" module="NiPhysX" since="V20_2_0_8">
        For serializing NxMaterialDesc objects.
        <field name="Index" type="ushort" />
        <field name="Num States" type="uint" />
        <field name="Material Descs" type="NxMaterialDesc" length="Num States" />
    </niobject>

    <bitflags name="NxClothFlag" storage="uint" prefix="NX_CLF" since="V20_2_0_8">
        <option bit="0" name="PRESSURE" />
        <option bit="1" name="STATIC" />
        <option bit="2" name="DISABLE_COLLISION" />
        <option bit="3" name="SELFCOLLISION" />
        <option bit="4" name="VISUALIZATION" />
        <option bit="5" name="GRAVITY" />
        <option bit="6" name="BENDING" />
        <option bit="7" name="BENDING_ORTHO" />
        <option bit="8" name="DAMPING" />
        <option bit="9" name="COLLISION_TWOWAY" />
        <option bit="11" name="TRIANGLE_COLLISION" />
        <option bit="12" name="TEARABLE" />
        <option bit="13" name="HARDWARE" />
        <option bit="14" name="COMDAMPING" />
        <option bit="15" name="VALIDBOUNDS" />
        <option bit="16" name="FLUID_COLLISION" />
        <option bit="17" name="DISABLE_DYNAMIC_CCD" />
        <option bit="18" name="ADHERE" />
    </bitflags>

    <compound name="PhysXClothState" since="V20_2_0_8">
        <field name="Pose" type="Matrix34" />
        <field name="Num Vertex Positions" type="ushort" />
        <field name="Vertex Positions" type="Vector3" length="Num Vertex Positions" />
        <field name="Num Tear Indices" type="ushort" />
        <field name="Tear Indices" type="ushort" length="Num Tear Indices" />
        <field name="Tear Split Planes" type="Vector3" length="Num Tear Indices" />
    </compound>

    <compound name="PhysXClothAttachmentPosition" since="V20_2_0_8">
        <field name="Vertex ID" type="uint" />
        <field name="Position" type="Vector3" />
        <field name="Flags" type="uint" />
    </compound>

    <compound name="PhysXClothAttachment" since="V20_2_0_8">
        <field name="Shape" type="Ref" template="NiPhysXShapeDesc" />
        <field name="Num Vertices" type="uint" />
        <field name="Flags" type="uint" cond="Num Vertices == 0" />
        <field name="Positions" type="PhysXClothAttachmentPosition" cond="Num Vertices #GT# 0" length="Num Vertices" />
    </compound>

    <niobject name="NiPhysXClothDesc" inherit="NiObject" module="NiPhysX" since="V20_2_0_8">
        For serializing NxClothDesc objects.
        <field name="Name" type="NiFixedString" />
        <field name="Mesh" type="Ref" template="NiPhysXMeshDesc" />
        <field name="Pose" type="Matrix34" until="20.3.0.9" />
        <field name="Thickness" type="float" default="0.01" />
        <field name="Self Collision Thickness" type="float" since="30.1.0.3" />
        <field name="Density" type="float" default="1.0" />
        <field name="Bending Stiffness" type="float" default="1.0" />
        <field name="Stretching Stiffness" type="float" default="1.0" />
        <field name="Damping Coefficient" type="float" default="0.5" />
        <field name="Hard Stretch Limitation Factor" type="float" since="30.1.0.3" />
        <field name="Friction" type="float" default="0.5" />
        <field name="Pressure" type="float" default="1.0" />
        <field name="Tear Factor" type="float" default="1.5" />
        <field name="Collision Response Coeff" type="float" default="0.2" />
        <field name="Attach Response Coeff" type="float" default="0.2" />
        <field name="Attach Tear Factor" type="float" default="1.5" />
        <field name="To Fluid Response Coeff" type="float" default="1.0" since="20.4.0.0" />
        <field name="From Fluid Response Coeff" type="float" default="1.0" since="20.4.0.0" />
        <field name="Min Adhere Velocity" type="float" default="1.0" since="20.4.0.0" />
        <field name="Relative Grid Spacing" type="float" default="0.25" since="20.4.0.0" />
        <field name="Solver Iterations" type="uint" default="5" />
        <field name="Hier Solver Iterations" type="uint" since="30.1.0.3" />
        <field name="External Acceleration" type="Vector3" />
        <field name="Wind Acceleration" type="Vector3" since="20.4.0.0" />
        <field name="Wake Up Counter" type="float" default="0.4" />
        <field name="Sleep Linear Velocity" type="float" default="-1.0" />
        <field name="Collision Group" type="ushort" />
        <field name="Collision Bits" type="uint" length="4" />
        <field name="Force Field Material" type="ushort" since="20.4.0.0" />
        <field name="Flags" type="NxClothFlag" default="0x20" />
        <field name="Vertex Map Size" type="ushort" since="30.2.0.3" />
        <field name="Vertex Map" type="ushort" length="Vertex Map Size" since="30.2.0.3" />
        <field name="Num States" type="uint" since="20.4.0.0" />
        <field name="States" type="PhysXClothState" length="Num States" since="20.4.0.0" />
        <field name="Num Attachments" type="uint" />
        <field name="Attachments" type="PhysXClothAttachment" length="Num Attachments" />
        <field name="Parent Actor" type="Ref" template="NiPhysXActorDesc" />
        <field name="Dest" type="Ref" template="NiPhysXDest" until="20.4.0.9" />
        <field name="Target Mesh" type="Ref" template="NiMesh" until="20.5.0.0" />
    </niobject>

    <niobject name="NiPhysXDest" abstract="true" inherit="NiObject" module="NiPhysX" since="V20_2_0_8">
        A destination is a link between a PhysX actor and a Gamebryo object being driven by the physics.
        <field name="Active" type="bool" default="1" />
        <field name="Interpolate" type="bool" />
    </niobject>

    <niobject name="NiPhysXRigidBodyDest" abstract="true" inherit="NiPhysXDest" module="NiPhysX" since="V20_2_0_8">
        Base for destinations that set a rigid body state.
    </niobject>

    <niobject name="NiPhysXTransformDest" inherit="NiPhysXRigidBodyDest" module="NiPhysX" since="V20_2_0_8">
        Connects PhysX rigid body actors to a scene node.
        <field name="Target" type="Ptr" template="NiAVObject" />
    </niobject>

    <niobject name="NiPhysXSrc" abstract="true" inherit="NiObject" module="NiPhysX" since="V20_2_0_8">
        A source is a link between a Gamebryo object and a PhysX actor.
        <field name="Active" type="bool" default="1" />
        <field name="Interpolate" type="bool" />
    </niobject>

    <niobject name="NiPhysXRigidBodySrc" abstract="true" inherit="NiPhysXSrc" module="NiPhysX" since="V20_2_0_8">
        Sets state of a rigid body PhysX actor.
        <field name="Source" type="Ptr" template="NiAVObject" />
    </niobject>

    <niobject name="NiPhysXKinematicSrc" inherit="NiPhysXRigidBodySrc" module="NiPhysX" since="V20_2_0_8">
        Sets state of kinematic PhysX actor.
    </niobject>

    <niobject name="NiPhysXDynamicSrc" inherit="NiPhysXRigidBodySrc" module="NiPhysX" since="V20_2_0_8">
        Sends Gamebryo scene state to a PhysX dynamic actor.
    </niobject>

    <niobject name="NiLines" inherit="NiTriBasedGeom" module="NiMain">
        Wireframe geometry.
    </niobject>

    <niobject name="NiLinesData" inherit="NiGeometryData" module="NiMain">
        Wireframe geometry data.
        <field name="Lines" type="bool" length="Num Vertices">Is vertex connected to other (next?) vertex?</field>
    </niobject>

    <compound name="Polygon" size="8">
        Two dimensional screen elements.
        <field name="Num Vertices" type="ushort" />
        <field name="Vertex Offset" type="ushort">Offset in vertex array.</field>
        <field name="Num Triangles" type="ushort" />
        <field name="Triangle Offset" type="ushort">Offset in indices array.</field>
    </compound>

    <niobject name="NiScreenElementsData" inherit="NiTriShapeData" module="NiMain">
        DEPRECATED (20.5), functionality included in NiMeshScreenElements.
        Two dimensional screen elements.
        <field name="Max Polygons" type="ushort" />
        <field name="Polygons" type="Polygon" length="Max Polygons" />
        <field name="Polygon Indices" type="ushort" length="Max Polygons" />
        <field name="Polygon Grow By" type="ushort" default="1" />
        <field name="Num Polygons" type="ushort" />
        <field name="Max Vertices" type="ushort" />
        <field name="Vertices Grow By" type="ushort" default="1" />
        <field name="Max Indices" type="ushort" />
        <field name="Indices Grow By" type="ushort" default="1" />
    </niobject>

    <niobject name="NiScreenElements" inherit="NiTriShape" module="NiMain">
        DEPRECATED (20.5), replaced by NiMeshScreenElements.
        Two dimensional screen elements.
    </niobject>

    <niobject name="NiRoomGroup" inherit="NiNode" module="NiMain">
        NiRoomGroup represents a set of connected rooms i.e. a game level.
        <field name="Shell" type="Ptr" template="NiNode">Object that represents the room group as seen from the outside.</field>
        <field name="Num Rooms" type="uint" />
        <field name="Rooms" type="Ptr" template="NiRoom" length="Num Rooms" />
    </niobject>

    <niobject name="NiWall" inherit="NiNode" module="NiMain" until="V3_3_0_13">
        <field name="Wall Plane" type="NiPlane" />
    </niobject>

    <niobject name="NiRoom" inherit="NiNode" module="NiMain">
        NiRoom objects represent cells in a cell-portal culling system.
        <field name="Num Walls" type="uint" />
        <field name="Walls" type="Ref" template="NiWall" length="Num Walls" until="3.3.0.13" />
        <field name="Wall Planes" type="NiPlane" length="Num Walls" since="4.0.0.0" />
        <field name="Num In Portals" type="uint" />
        <field name="In Portals" type="Ptr" template="NiPortal" length="Num In Portals">The portals which see into the room.</field>
        <field name="Num Out Portals" type="uint" />
        <field name="Out Portals" type="Ptr" template="NiPortal" length="Num Out Portals">The portals which see out of the room.</field>
        <field name="Num Fixtures" type="uint" />
        <field name="Fixtures" type="Ptr" template="NiAVObject" length="Num Fixtures">All geometry associated with the room. Seems to be Ref for legacy.</field>
    </niobject>

    <niobject name="NiPortal" inherit="NiAVObject" module="NiMain">
        NiPortal objects are grouping nodes that support aggressive visibility culling.
        They represent flat polygonal regions through which a part of a scene graph can be viewed.
        <field name="Portal Flags" type="ushort" />
        <field name="Plane Count" type="ushort">Unused in 20.x, possibly also 10.x.</field>
        <field name="Num Vertices" type="ushort" />
        <field name="Vertices" type="Vector3" length="Num Vertices" />
        <field name="Adjoiner" type="Ptr" template="NiNode">Root of the scenegraph which is to be seen through this portal.</field>
    </niobject>

    <niobject name="BSFadeNode" inherit="NiNode" module="BSMain" versions="#FO3_AND_LATER#">
        Bethesda-specific fade node.
    </niobject>

    <enum name="BSShaderType" storage="uint" versions="#FO3#">
        FO3 Shader Type
        <option value="0" name="SHADER_TALL_GRASS">Tall Grass Shader</option>
        <option value="1" name="SHADER_DEFAULT">Standard Lighting Shader</option>
        <option value="10" name="SHADER_SKY">Sky Shader</option>
		<option value="14" name="SHADER_SKIN">Skin Shader</option>
        <option value="17" name="SHADER_WATER">Water Shader</option>
        <option value="29" name="SHADER_LIGHTING30">Lighting 3.0 Shader</option>
        <option value="32" name="SHADER_TILE">Tiled Shader</option>
        <option value="33" name="SHADER_NOLIGHTING">No Lighting Shader</option>
    </enum>
    
    <bitflags name="BSShaderFlags" storage="uint" prefix="F3SF1" versions="#FO3#">
        Shader Property Flags
        <option bit="0" name="Specular">Enables Specularity</option>
        <option bit="1" name="Skinned">Required For Skinned Meshes</option>
        <option bit="2" name="LowDetail">Lowddetail (seems to use standard diff/norm/spec shader)</option>
        <option bit="3" name="Vertex_Alpha">Vertex Alpha</option>
        <option bit="4" name="Unknown_1">Unknown</option>
        <option bit="5" name="Single_Pass">Single Pass</option>
        <option bit="6" name="Empty">Unknown</option>
        <option bit="7" name="Environment_Mapping">Environment mapping (uses Envmap Scale)</option>
        <option bit="8" name="Alpha_Texture">Alpha Texture Requires NiAlphaProperty to Enable</option>
        <option bit="9" name="Unknown_2">Unknown</option>
        <option bit="10" name="FaceGen">FaceGen</option>
        <option bit="11" name="Parallax_Shader_Index_15">Parallax</option>
        <option bit="12" name="Unknown_3">Unknown/Crash</option>
        <option bit="13" name="Non_Projective_Shadows">Non-Projective Shadows</option>
        <option bit="14" name="Unknown_4">Unknown/Crash</option>
        <option bit="15" name="Refraction">Refraction (switches on refraction power)</option>
        <option bit="16" name="Fire_Refraction">Fire Refraction (switches on refraction power/period)</option>
        <option bit="17" name="Eye_Environment_Mapping">Eye Environment Mapping (does not use envmap light fade or envmap scale)</option>
        <option bit="18" name="Hair">Hair</option>
        <option bit="19" name="Dynamic_Alpha">Dynamic Alpha</option>
        <option bit="20" name="Localmap_Hide_Secret">Localmap Hide Secret</option>
        <option bit="21" name="Window_Environment_Mapping">Window Environment Mapping</option>
        <option bit="22" name="Tree_Billboard">Tree Billboard</option>
        <option bit="23" name="Shadow_Frustum">Shadow Frustum</option>
        <option bit="24" name="Multiple_Textures">Multiple Textures (base diff/norm become null)</option>
        <option bit="25" name="Remappable_Textures">usually seen w/texture animation</option>
        <option bit="26" name="Decal_Single_Pass">Decal</option>
        <option bit="27" name="Dynamic_Decal_Single_Pass">Dynamic Decal</option>
        <option bit="28" name="Parallax_Occulsion">Parallax Occlusion</option>
        <option bit="29" name="External_Emittance">External Emittance</option>
        <option bit="30" name="Shadow_Map">Shadow Map</option>
        <option bit="31" name="ZBuffer_Test">ZBuffer Test (1=on)</option>
    </bitflags>

    <bitflags name="BSShaderFlags2" storage="uint" prefix="F3SF2" versions="#FO3#">
        Shader Property Flags 2
        <option bit="0" name="ZBuffer_Write">ZBuffer Write</option>
        <option bit="1" name="LOD_Landscape">LOD Landscape</option>
        <option bit="2" name="LOD_Building">LOD Building</option>
        <option bit="3" name="No_Fade">No Fade</option>
        <option bit="4" name="Refraction_Tint">Refraction Tint</option>
        <option bit="5" name="Vertex_Colors">Has Vertex Colors</option>
        <option bit="6" name="Unknown1">Unknown</option>
        <option bit="7" name="First_Light_is_Point_Light">1st Light is Point Light</option>
        <option bit="8" name="Second_Light">2nd Light</option>
        <option bit="9" name="Third_Light">3rd Light</option>
        <option bit="10" name="Vertex_Lighting">Vertex Lighting</option>
        <option bit="11" name="Uniform_Scale">Uniform Scale</option>
        <option bit="12" name="Fit_Slope">Fit Slope</option>
        <option bit="13" name="Billboard_and_Envmap_Light_Fade">Billboard and Envmap Light Fade</option>
        <option bit="14" name="No_LOD_Land_Blend">No LOD Land Blend</option>
        <option bit="15" name="Envmap_Light_Fade">Envmap Light Fade</option>
        <option bit="16" name="Wireframe">Wireframe</option>
        <option bit="17" name="VATS_Selection">VATS Selection</option>
        <option bit="18" name="Show_in_Local_Map">Show in Local Map</option>
        <option bit="19" name="Premult_Alpha">Premult Alpha</option>
        <option bit="20" name="Skip_Normal_Maps">Skip Normal Maps</option>
        <option bit="21" name="Alpha_Decal">Alpha Decal</option>
        <option bit="22" name="No_Transparecny_Multisampling">No Transparency MultiSampling</option>
        <option bit="23" name="Unknown2">Unknown</option>
        <option bit="24" name="Unknown3">Unknown</option>
        <option bit="25" name="Unknown4">Unknown</option>
        <option bit="26" name="Unknown5">Unknown</option>
        <option bit="27" name="Unknown6">Unknown</option>
        <option bit="28" name="Unknown7">Unknown</option>
        <option bit="29" name="Unknown8">Unknown</option>
        <option bit="30" name="Unknown9">Unknown</option>
        <option bit="31" name="Unknown10">Unknown</option>
    </bitflags>
    
    <niobject name="BSShaderProperty" inherit="NiShadeProperty" module="BSMain" versions="#FO3_AND_LATER#">
        Bethesda-specific property.
        <field name="Shader Type" type="BSShaderType" default="SHADER_DEFAULT" vercond="#NI_BS_LTE_FO3#" />
        <field name="Shader Flags" type="BSShaderFlags" default="0x82000000" vercond="#NI_BS_LTE_FO3#" />
        <field name="Shader Flags 2" type="BSShaderFlags2" default="1" vercond="#NI_BS_LTE_FO3#" />
        <field name="Environment Map Scale" type="float" default="1.0" range="#F0_10#" vercond="#NI_BS_LTE_FO3#">Scales the intensity of the environment/cube map.</field>
    </niobject>

    <niobject name="BSShaderLightingProperty" abstract="true" inherit="BSShaderProperty" module="BSMain" versions="#FO3#">
        Bethesda-specific property.
        <field name="Texture Clamp Mode" type="TexClampMode" default="WRAP_S_WRAP_T" vercond="#NI_BS_LTE_FO3#">How to handle texture borders.</field>
    </niobject>

    <niobject name="BSShaderNoLightingProperty" inherit="BSShaderLightingProperty" module="BSMain" versions="#FO3#">
        Bethesda-specific property.
        <field name="File Name" type="SizedString">The texture glow map.</field>
        <field name="Falloff Start Angle" type="float" default="1.0" range="#F_NRM#" vercond="#BSVER# #GT# 26">At this cosine of angle falloff will be equal to Falloff Start Opacity</field>
        <field name="Falloff Stop Angle" type="float" default="0.0" range="#F_NRM#" vercond="#BSVER# #GT# 26">At this cosine of angle falloff will be equal to Falloff Stop Opacity</field>
        <field name="Falloff Start Opacity" type="float" default="1.0" range="#F0_1#" vercond="#BSVER# #GT# 26">Alpha falloff multiplier at start angle</field>
        <field name="Falloff Stop Opacity" type="float" default="0.0" range="#F0_1#" vercond="#BSVER# #GT# 26">Alpha falloff multiplier at end angle</field>
    </niobject>

    <niobject name="BSShaderPPLightingProperty" inherit="BSShaderLightingProperty" module="BSMain" versions="#FO3#">
        Bethesda-specific property.
        <field name="Texture Set" type="Ref" template="BSShaderTextureSet">Texture Set</field>
        <field name="Refraction Strength" type="float" default="0.0" range="#F0_1#" vercond="#BSVER# #GT# 14">The amount of distortion. **Not based on physically accurate refractive index** (0=none) (0-1)</field>
        <field name="Refraction Fire Period" type="int" default="0" range="#FPM_1000#" vercond="#BSVER# #GT# 14">Rate of texture movement for refraction shader.</field>
        <field name="Parallax Max Passes" type="float" default="4.0" range="1.0:320.0" vercond="#BSVER# #GT# 24">The number of passes the parallax shader can apply.</field>
        <field name="Parallax Scale" type="float" default="1.0" range="#F0_10#" vercond="#BSVER# #GT# 24">The strength of the parallax.</field>
        <!-- TODO: Find where this could have even come from as > 34 doesn't exist for this block. -->
        <field name="Emissive Color" type="Color4" vercond="#BS_GT_FO3#">Glow color and alpha</field>
    </niobject>

    <niobject name="BSEffectShaderPropertyFloatController" inherit="NiFloatInterpController" module="BSAnimation" versions="#SKY_AND_LATER#">
        This controller is used to animate float variables in BSEffectShaderProperty.
        <field name="Controlled Variable" type="EffectShaderControlledVariable">Which float variable in BSEffectShaderProperty to animate.</field>
    </niobject>
	
	<niobject name="BSEffectShaderPropertyColorController" inherit="NiPoint3InterpController" module="BSAnimation" versions="#SKY_AND_LATER#">
		This controller is used to animate colors in BSEffectShaderProperty.
		<field name="Controlled Color" type="EffectShaderControlledColor">Which color in BSEffectShaderProperty to animate.</field>
	</niobject>
	
	<niobject name="BSLightingShaderPropertyFloatController" inherit="NiFloatInterpController" module="BSAnimation" versions="#SKY_AND_LATER#">
		This controller is used to animate float variables in BSLightingShaderProperty.
		<field name="Controlled Variable" type="LightingShaderControlledFloat">Which float variable in BSLightingShaderProperty to animate.</field>
	</niobject>

	<niobject name="BSLightingShaderPropertyUShortController" inherit="NiFloatInterpController" module="BSAnimation" versions="#SKY_AND_LATER#">
		This controller is used to animate float variables in BSLightingShaderProperty.
		NOTE: FO4 CK reports this block as unsupported.
		<field name="Controlled Variable" type="LightingShaderControlledUShort">NOTE: FO4 CK reports this as unsupported. Which integral variable in BSLightingShaderProperty to animate.</field>
	</niobject>

	<niobject name="BSLightingShaderPropertyColorController" inherit="NiPoint3InterpController" module="BSAnimation" versions="#SKY_AND_LATER#">
		This controller is used to animate colors in BSLightingShaderProperty.
		<field name="Controlled Color" type="LightingShaderControlledColor">Which color in BSLightingShaderProperty to animate.</field>
	</niobject>	
	
	<niobject name="BSNiAlphaPropertyTestRefController" inherit="NiFloatInterpController" module="BSAnimation" versions="#BETHESDA#" />
	
	<niobject name="BSProceduralLightningController" inherit="NiTimeController" module="BSAnimation" versions="#BETHESDA#">
    Skyrim, Paired with dummy TriShapes, this controller generates lightning shapes for special effects.
    First interpolator controls Generation.
        <field name="Interpolator 1: Generation" type="Ref" template="NiInterpolator">References generation interpolator.</field>
		<field name="Interpolator 2: Mutation" type="Ref" template="NiInterpolator">References interpolator for Mutation of strips</field>
        <field name="Interpolator 3: Subdivision" type="Ref" template="NiInterpolator">References subdivision interpolator.</field>
        <field name="Interpolator 4: Num Branches" type="Ref" template="NiInterpolator">References branches interpolator.</field>
        <field name="Interpolator 5: Num Branches Var" type="Ref" template="NiInterpolator">References branches variation interpolator.</field>
        <field name="Interpolator 6: Length" type="Ref" template="NiInterpolator">References length interpolator.</field>
        <field name="Interpolator 7: Length Var" type="Ref" template="NiInterpolator">References length variation interpolator.</field>
        <field name="Interpolator 8: Width" type="Ref" template="NiInterpolator">References width interpolator.</field>
        <field name="Interpolator 9: Arc Offset" type="Ref" template="NiInterpolator">References interpolator for amplitude control. 0=straight, 50=wide</field>
        <field name="Subdivisions" type="ushort" default="6" range="0:12" />
        <field name="Num Branches" type="ushort" default="1" range="0:10" />
        <field name="Num Branches Variation" type="ushort" default="1" range="0:10" />
        <field name="Length" type="float" default="512.0" range="#F0_10000#">How far lightning will stretch to.</field>
        <field name="Length Variation" type="float" default="30.0" range="#F0_10000#">How far lightning variation will stretch to.</field>
        <field name="Width" type="float" default="16.0" range="#F0_100#">How wide the bolt will be.</field>
        <field name="Child Width Mult" type="float" default="0.75" range="#F0_10#">Influences forking behavior with a multiplier.</field>
        <field name="Arc Offset" type="float" default="20.0" range="#F0_1000#" />
        <field name="Fade Main Bolt" type="bool" default="1" />
        <field name="Fade Child Bolts" type="bool" default="1" />
        <field name="Animate Arc Offset" type="bool" default="1" />
        <field name="Shader Property" type="Ref" template="BSShaderProperty">Reference to a shader property.</field>
	</niobject>

   <niobject name="BSShaderTextureSet" inherit="NiObject" module="BSMain" versions="#BETHESDA#">
        Bethesda-specific Texture Set.
        <field name="Num Textures" type="uint" default="6" />
        <field name="Textures" type="SizedString" length="Num Textures">Textures.
            0: Diffuse
            1: Normal/Gloss
            2: Glow(SLSF2_Glow_Map)/Skin/Hair/Rim light(SLSF2_Rim_Lighting)
            3: Height/Parallax
            4: Environment
            5: Environment Mask
            6: Subsurface for Multilayer Parallax
            7: Back Lighting Map (SLSF2_Back_Lighting)
        </field>
    </niobject>

    <niobject name="WaterShaderProperty" inherit="BSShaderProperty" module="BSMain" versions="#FO3_AND_LATER#">
        Bethesda-specific property. Found in Fallout3
    </niobject>

    <enum name="SkyObjectType" storage="uint" versions="#BETHESDA#">
        Sets what sky function this object fulfills in BSSkyShaderProperty or SkyShaderProperty.
        <option value="0" name="BSSM_SKY_TEXTURE">BSSM_Sky_Texture</option>
        <option value="1" name="BSSM_SKY_SUNGLARE">BSSM_Sky_Sunglare</option>
        <option value="2" name="BSSM_SKY">BSSM_Sky</option>
        <option value="3" name="BSSM_SKY_CLOUDS">BSSM_Sky_Clouds</option>
        <option value="5" name="BSSM_SKY_STARS">BSSM_Sky_Stars</option>
        <option value="7" name="BSSM_SKY_MOON_STARS_MASK">BSSM_Sky_Moon_Stars_Mask</option>
    </enum>
    <niobject name="SkyShaderProperty" inherit="BSShaderLightingProperty" module="BSMain" versions="#BETHESDA#">
        Bethesda-specific property. Found in Fallout3
        <field name="File Name" type="SizedString">The texture.</field>
        <field name="Sky Object Type" type="SkyObjectType">Sky Object Type</field>
    </niobject>

    <niobject name="TileShaderProperty" inherit="BSShaderLightingProperty" module="BSMain" versions="#FO3#">
        Bethesda-specific property.
        <field name="File Name" type="SizedString">Texture file name</field>
    </niobject>

    <niobject name="DistantLODShaderProperty" inherit="BSShaderProperty" module="BSMain" versions="#BETHESDA#">
        Bethesda-specific property.
    </niobject>

    <niobject name="BSDistantTreeShaderProperty" inherit="BSShaderProperty" module="BSMain" versions="#FO3_AND_LATER#">
        Bethesda-specific property.
    </niobject>

    <niobject name="TallGrassShaderProperty" inherit="BSShaderProperty" module="BSMain" versions="#BETHESDA#">
        Bethesda-specific property.
        <field name="File Name" type="SizedString">Texture file name</field>
    </niobject>

    <niobject name="VolumetricFogShaderProperty" inherit="BSShaderProperty" module="BSMain" versions="#FO3_AND_LATER#">
        Bethesda-specific property.
    </niobject>

    <niobject name="HairShaderProperty" inherit="BSShaderProperty" module="BSMain" versions="#BETHESDA#">
        Bethesda-specific property.
    </niobject>

    <niobject name="Lighting30ShaderProperty" inherit="BSShaderPPLightingProperty" module="BSMain" versions="#BETHESDA#">
        Bethesda-specific property.
    </niobject>

    <bitflags name="SkyrimShaderPropertyFlags1" storage="uint" prefix="SLSF1" versions="#SKY# #SSE#">
        Skyrim Shader Property Flags 1
        <option bit="0" name="Specular">Enables Specularity</option>
        <option bit="1" name="Skinned">Required For Skinned Meshes.</option>
        <option bit="2" name="Temp_Refraction"></option>
        <option bit="3" name="Vertex_Alpha">Enables using alpha component of vertex colors.</option>
        <option bit="4" name="Greyscale_To_PaletteColor">in EffectShaderProperty</option>
        <option bit="5" name="Greyscale_To_PaletteAlpha">in EffectShaderProperty</option>
        <option bit="6" name="Use_Falloff">Use Falloff value in EffectShaderProperty</option>
        <option bit="7" name="Environment_Mapping">Environment mapping (uses Envmap Scale).</option>
        <option bit="8" name="Recieve_Shadows">Object can recieve shadows.</option>
        <option bit="9" name="Cast_Shadows">Can cast shadows</option>
        <option bit="10" name="Facegen_Detail_Map">Use a face detail map in the 4th texture slot.</option>
        <option bit="11" name="Parallax">Unused?</option>
        <option bit="12" name="Model_Space_Normals">Use Model space normals and an external Specular Map.</option>
        <option bit="13" name="Non_Projective_Shadows"></option>
        <option bit="14" name="Landscape"></option>
        <option bit="15" name="Refraction">Use normal map for refraction effect.</option>
        <option bit="16" name="Fire_Refraction"></option>
        <option bit="17" name="Eye_Environment_Mapping">Eye Environment Mapping (Must use the Eye shader and the model must be skinned)</option>
        <option bit="18" name="Hair_Soft_Lighting">Keeps from going too bright under lights (hair shader only)</option>
        <option bit="19" name="Screendoor_Alpha_Fade"></option>
        <option bit="20" name="Localmap_Hide_Secret">Object and anything it is positioned above will not render on local map view.</option>
        <option bit="21" name="FaceGen_RGB_Tint">Use tintmask for Face.</option>
        <option bit="22" name="Own_Emit">Provides its own emittance color. (will not absorb light/ambient color?)</option>
        <option bit="23" name="Projected_UV">Used for decalling?</option>
        <option bit="24" name="Multiple_Textures"></option>
        <option bit="25" name="Remappable_Textures"></option>
        <option bit="26" name="Decal"></option>
        <option bit="27" name="Dynamic_Decal"></option>
        <option bit="28" name="Parallax_Occlusion"></option>
        <option bit="29" name="External_Emittance"></option>
        <option bit="30" name="Soft_Effect"></option>
        <option bit="31" name="ZBuffer_Test">ZBuffer Test (1=on)</option>
    </bitflags>
    
    <bitflags name="SkyrimShaderPropertyFlags2" storage="uint" prefix="SLSF2" versions="#SKY# #SSE#">
        Skyrim Shader Property Flags 2
        <option bit="0" name="ZBuffer_Write">Enables writing to the Z-Buffer</option>
        <option bit="1" name="LOD_Landscape"></option>
        <option bit="2" name="LOD_Objects"></option>
        <option bit="3" name="No_Fade"></option>
        <option bit="4" name="Double_Sided">Double-sided rendering.</option>
        <option bit="5" name="Vertex_Colors">Has Vertex Colors.</option>
        <option bit="6" name="Glow_Map">Use Glow Map in the third texture slot.</option>
        <option bit="7" name="Assume_Shadowmask"></option>
        <option bit="8" name="Packed_Tangent"></option>
        <option bit="9" name="Multi_Index_Snow"></option>
        <option bit="10" name="Vertex_Lighting"></option>
        <option bit="11" name="Uniform_Scale"></option>
        <option bit="12" name="Fit_Slope"></option>
        <option bit="13" name="Billboard"></option>
        <option bit="14" name="No_LOD_Land_Blend"></option>
        <option bit="15" name="EnvMap_Light_Fade"></option>
        <option bit="16" name="Wireframe">Wireframe (Seems to only work on particles)</option>
        <option bit="17" name="Weapon_Blood">Used for blood decals on weapons.</option>
        <option bit="18" name="Hide_On_Local_Map">Similar to hide secret, but only for self?</option>
        <option bit="19" name="Premult_Alpha">Has Premultiplied Alpha</option>
        <option bit="20" name="Cloud_LOD"></option>
        <option bit="21" name="Anisotropic_Lighting">Hair only?</option>
        <option bit="22" name="No_Transparency_Multisampling"></option>
        <option bit="23" name="Unused01">Unused?</option>
        <option bit="24" name="Multi_Layer_Parallax">Use Multilayer (inner-layer) Map</option>
        <option bit="25" name="Soft_Lighting">Use Soft Lighting Map</option>
        <option bit="26" name="Rim_Lighting">Use Rim Lighting Map</option>
        <option bit="27" name="Back_Lighting">Use Back Lighting Map</option>
        <option bit="28" name="Unused02">Unused?</option>
        <option bit="29" name="Tree_Anim">Enables Vertex Animation, Flutter Animation</option>
        <option bit="30" name="Effect_Lighting"></option>
        <option bit="31" name="HD_LOD_Objects"></option>
    </bitflags>

    <bitflags name="Fallout4ShaderPropertyFlags1" storage="uint" prefix="F4SF1" versions="#FO4#">
        Fallout 4 Shader Property Flags 1
        <option bit="0" name="Specular" />
        <option bit="1" name="Skinned" />
        <option bit="2" name="Temp_Refraction" />
        <option bit="3" name="Vertex_Alpha" />
        <option bit="4" name="GreyscaleToPalette_Color" />
        <option bit="5" name="GreyscaleToPalette_Alpha" />
        <option bit="6" name="Use_Falloff" />
        <option bit="7" name="Environment_Mapping" />
        <option bit="8" name="RGB_Falloff" />
        <option bit="9" name="Cast_Shadows" />
        <option bit="10" name="Face" />
        <option bit="11" name="UI_Mask_Rects" />
        <option bit="12" name="Model_Space_Normals" />
        <option bit="13" name="Non_Projective_Shadows" />
        <option bit="14" name="Landscape" />
        <option bit="15" name="Refraction" />
        <option bit="16" name="Fire_Refraction" />
        <option bit="17" name="Eye_Environment_Mapping" />
        <option bit="18" name="Hair" />
        <option bit="19" name="Screendoor_Alpha_Fade" />
        <option bit="20" name="Localmap_Hide_Secret" />
        <option bit="21" name="Skin_Tint" />
        <option bit="22" name="Own_Emit" />
        <option bit="23" name="Projected_UV" />
        <option bit="24" name="Multiple_Textures" />
        <option bit="25" name="Tessellate" />
        <option bit="26" name="Decal" />
        <option bit="27" name="Dynamic_Decal" />
        <option bit="28" name="Character_Lighting" />
        <option bit="29" name="External_Emittance" />
        <option bit="30" name="Soft_Effect" />
        <option bit="31" name="ZBuffer_Test" />
    </bitflags>
    
    <bitflags name="Fallout4ShaderPropertyFlags2" storage="uint" prefix="F4SF2" versions="#FO4#">
        Fallout 4 Shader Property Flags 2
        <option bit="0" name="ZBuffer_Write" />
        <option bit="1" name="LOD_Landscape" />
        <option bit="2" name="LOD_Objects" />
        <option bit="3" name="No_Fade" />
        <option bit="4" name="Double_Sided" />
        <option bit="5" name="Vertex_Colors" />
        <option bit="6" name="Glow_Map" />
        <option bit="7" name="Transform_Changed" />
        <option bit="8" name="Dismemberment_Meatcuff" />
        <option bit="9" name="Tint" />
        <option bit="10" name="Grass_Vertex_Lighting" />
        <option bit="11" name="Grass_Uniform_Scale" />
        <option bit="12" name="Grass_Fit_Slope" />
        <option bit="13" name="Grass_Billboard" />
        <option bit="14" name="No_LOD_Land_Blend" />
        <option bit="15" name="Dismemberment" />
        <option bit="16" name="Wireframe" />
        <option bit="17" name="Weapon_Blood" />
        <option bit="18" name="Hide_On_Local_Map" />
        <option bit="19" name="Premult_Alpha" />
        <option bit="20" name="VATS_Target" />
        <option bit="21" name="Anisotropic_Lighting" />
        <option bit="22" name="Skew_Specular_Alpha" />
        <option bit="23" name="Menu_Screen" />
        <option bit="24" name="Multi_Layer_Parallax" />
        <option bit="25" name="Alpha_Test" />
        <option bit="26" name="Gradient_Remap" />
        <option bit="27" name="VATS_Target_Draw_All" />
        <option bit="28" name="Pipboy_Screen" />
        <option bit="29" name="Tree_Anim" />
        <option bit="30" name="Effect_Lighting" />
        <option bit="31" name="Refraction_Writes_Depth" />
    </bitflags>

    <compound name="BSTextureArray" versions="#F76#">
        <field name="Texture Array Width" type="uint" />
        <field name="Texture Array" type="SizedString" length="Texture Array Width" />
    </compound>

    <enum name="BSShaderCRC32" storage="uint" prefix="SF" versions="#F76#">
        <option name="CAST_SHADOWS" value="1563274220" />
        <option name="ZBUFFER_TEST" value="1740048692" />
        <option name="ZBUFFER_WRITE" value="3166356979" />
        <option name="TWO_SIDED" value="759557230" />
        <option name="VERTEXCOLORS" value="348504749" />
        <option name="PBR" value="731263983" />
        <option name="SKINNED" value="3744563888" />
        <option name="ENVMAP" value="2893749418" />
        <option name="VERTEX_ALPHA" value="2333069810" />
        <option name="FACE" value="314919375" />
        <option name="GRAYSCALE_TO_PALETTE_COLOR" value="442246519" />
        <option name="DECAL" value="3849131744" />
        <option name="DYNAMIC_DECAL" value="1576614759" />
        <option name="HAIRTINT" value="1264105798" />
        <option name="SKIN_TINT" value="1483897208" />
        <option name="EMIT_ENABLED" value="2262553490" />
        <option name="GLOWMAP" value="2399422528" />
        <option name="REFRACTION" value="1957349758" />
        <option name="REFRACTION_FALLOFF" value="902349195" />
        <option name="NOFADE" value="2994043788" />
        <option name="INVERTED_FADE_PATTERN" value="3030867718" />
        <option name="RGB_FALLOFF" value="3448946507" />
        <option name="EXTERNAL_EMITTANCE" value="2150459555" />
        <option name="MODELSPACENORMALS" value="2548465567" />
        <option name="TRANSFORM_CHANGED" value="3196772338" />
        <option name="EFFECT_LIGHTING" value="3473438218" />
        <option name="FALLOFF" value="3980660124" />
        <option name="SOFT_EFFECT" value="3503164976" />
        <option name="GRAYSCALE_TO_PALETTE_ALPHA" value="2901038324" />
        <option name="WEAPON_BLOOD" value="2078326675" />
        <option name="LOD_OBJECTS" value="2896726515" />
        <option name="NO_EXPOSURE" value="3707406987" />
    </enum>

    <compound name="BSSPWetnessParams" module="BSMain" versions="#FO4# #F76#">
        <field name="Spec Scale" type="float" default="-1.0" />
        <field name="Spec Power" type="float" default="-1.0" />
        <field name="Min Var" type="float" default="-1.0" />
        <field name="Env Map Scale" type="float" default="-1.0" vercond="#BS_FO4#" />
        <field name="Fresnel Power" type="float" default="-1.0" />
        <field name="Metalness" type="float" default="-1.0" />
        <field name="Unknown 1" type="float" default="-1.0" vercond="#BS_F76#" />
        <field name="Unknown 2" type="float" default="-1.0" vercond="#BS_F76#" />
    </compound>

    <compound name="BSSPLuminanceParams" module="BSMain" versions="#F76#">
        <field name="Lum Emittance" type="float" default="100.0" range="#F_POS#" />
        <field name="Exposure Offset" type="float" default="13.5" range="#F_POS#" />
        <field name="Final Exposure Min" type="float" default="2.0" range="#F_POS#" />
        <field name="Final Exposure Max" type="float" default="3.0" range="#F_POS#" />
    </compound>

    <compound name="BSSPTranslucencyParams" module="BSMain" versions="#F76#">
        <field name="Subsurface Color" type="Color3" />
        <field name="Transmissive Scale" type="float"/>
        <field name="Turbulence" type="float" />
        <field name="Thick Object" type="bool" />
        <field name="Mix Albedo" type="bool" />
    </compound>

    <niobject name="BSLightingShaderProperty" inherit="BSShaderProperty" module="BSMain" versions="#SKY_AND_LATER#">
        Bethesda shader property for Skyrim and later.
        <field name="Shader Flags 1" suffix="SK" type="SkyrimShaderPropertyFlags1" vercond="#NI_BS_LT_FO4#" default="0x82400301">Skyrim Shader Flags for setting render/shader options.</field>
        <field name="Shader Flags 2" suffix="SK" type="SkyrimShaderPropertyFlags2" vercond="#NI_BS_LT_FO4#" default="0x8021">Skyrim Shader Flags for setting render/shader options.</field>
        <field name="Shader Flags 1" suffix="FO4" type="Fallout4ShaderPropertyFlags1" vercond="#BS_FO4#" default="0x80400201">Fallout 4 Shader Flags. Mostly overridden if "Name" is a path to a BGSM/BGEM file.</field>
        <field name="Shader Flags 2" suffix="FO4" type="Fallout4ShaderPropertyFlags2" vercond="#BS_FO4#" default="1">Fallout 4 Shader Flags. Mostly overridden if "Name" is a path to a BGSM/BGEM file.</field>
        <field name="Shader Type" type="BSLightingShaderType155" vercond="#BS_F76#" />
        <field name="Num SF1" type="uint" vercond="#BS_F76#" />
        <field name="Num SF2" type="uint" vercond="#BS_F76#" />
        <field name="SF1" type="BSShaderCRC32" length="Num SF1" vercond="#BS_F76#" />
        <field name="SF2" type="BSShaderCRC32" length="Num SF2" vercond="#BS_F76#" />
        <field name="UV Offset" type="TexCoord">Offset UVs</field>
        <field name="UV Scale" type="TexCoord" default="#VEC2_ONE#">Offset UV Scale to repeat tiling textures, see above.</field>
        <field name="Texture Set" type="Ref" template="BSShaderTextureSet">Texture Set, can have override in an esm/esp</field>
        <field name="Emissive Color" type="Color3" default="#VEC3_ZERO#">Glow color and alpha</field>
        <field name="Emissive Multiple" type="float" default="1.0" range="#F0_10#">Multiplied emissive colors</field>
        <field name="Root Material" type="NiFixedString" vercond="#BS_GTE_FO4#" />
        <field name="Texture Clamp Mode" type="TexClampMode" default="WRAP_S_WRAP_T">How to handle texture borders.</field>
        <field name="Alpha" type="float" default="1.0" range="0.0:128.0">The material opacity (1=opaque). Greater than 1.0 is used to affect alpha falloff i.e. staying opaque longer based on vertex alpha and alpha mask.</field>
        <field name="Refraction Strength" type="float" range="#F0_1#">The amount of distortion. **Not based on physically accurate refractive index** (0=none)</field>
        <field name="Glossiness" type="float" default="80.0" range="#F0_999#" vercond="#NI_BS_LT_FO4#">The material specular power, or glossiness.</field>
        <field name="Smoothness" type="float" default="1.0" range="#F0_1#" vercond="#BS_GTE_FO4#">The base roughness, multiplied by the smoothness map.</field>
        <field name="Specular Color" type="Color3" default="#VEC3_ONE#">Adds a colored highlight.</field>
        <field name="Specular Strength" type="float" default="1.0" range="#F0_10#">Brightness of specular highlight. (0=not visible)</field>
        <field name="Lighting Effect 1" type="float" default="0.3" range="#F0_10#" vercond="#NI_BS_LT_FO4#">Controls strength for envmap/backlight/rim/softlight lighting effect?</field>
        <field name="Lighting Effect 2" type="float" default="2.0" range="#F0_1000#" vercond="#NI_BS_LT_FO4#">Controls strength for envmap/backlight/rim/softlight lighting effect?</field>
        <field name="Subsurface Rolloff" type="float" default="0.0" range="#F0_10#" vercond="#BS_FO4#" />
        <field name="Rimlight Power" type="float" default="#FLT_MAX#" vercond="#BS_FO4#" />
        <field name="Backlight Power" type="float" range="#F0_1000#" cond="Rimlight Power == 0x7F7FFFFF" vercond="#BS_FO4#" />
        <field name="Grayscale to Palette Scale" type="float" default="1.0" range="#F0_1#" vercond="#BS_GTE_FO4#" />
        <field name="Fresnel Power" type="float" default="5.0" range="#F_PNZ#" vercond="#BS_GTE_FO4#" />
        <field name="Wetness" type="BSSPWetnessParams" vercond="#BS_GTE_FO4#" />
        <field name="Luminance" type="BSSPLuminanceParams" vercond="#BS_F76#" />
        <field name="Do Translucency" type="bool" vercond="#BS_F76#" />
        <field name="Translucency" type="BSSPTranslucencyParams" vercond="#BS_F76#" cond="Do Translucency" />
        <field name="Has Texture Arrays" type="byte" vercond="#BS_F76#" />
        <field name="Num Texture Arrays" type="uint" vercond="#BS_F76#" cond="Has Texture Arrays" />
        <field name="Texture Arrays" type="BSTextureArray" length="Num Texture Arrays" vercond="#BS_F76#" cond="Has Texture Arrays" />
        <field name="Environment Map Scale" type="float" default="1.0" range="#F0_10#" cond="Shader Type == 1" vercond="#NI_BS_LTE_FO4#">Scales the intensity of the environment/cube map.</field>
        <field name="Use Screen Space Reflections" type="bool" cond="Shader Type == 1" vercond="#BS_FO4#" />
        <field name="Wetness Control: Use SSR" type="bool" cond="Shader Type == 1" vercond="#BS_FO4#" />
        <field name="Skin Tint Color" type="Color4" vercond="#BS_F76#" cond="Shader Type == 4" />
        <field name="Hair Tint Color" type="Color3" vercond="#BS_F76#" cond="Shader Type == 5" />
        <field name="Skin Tint Color" type="Color3" default="#VEC3_ONE#" vercond="#NI_BS_LTE_FO4#" cond="Shader Type == 5">Tints the base texture. Overridden by game settings.</field>
        <field name="Skin Tint Alpha" type="float" default="1.0" vercond="#BS_FO4#" cond="Shader Type == 5" />
        <field name="Hair Tint Color" type="Color3" default="#VEC3_ONE#" vercond="#NI_BS_LTE_FO4#" cond="Shader Type == 6">Tints the base texture. Overridden by game settings.</field>
        <field name="Max Passes" type="float" default="4.0" range="1.0:320.0" cond="Shader Type == 7" />
        <field name="Scale" type="float" default="1.0" range="#F0_10#" cond="Shader Type == 7" />
        <field name="Parallax Inner Layer Thickness" type="float" default="5.0" range="5.0:500.0" cond="Shader Type == 11">How far from the surface the inner layer appears to be.</field>
        <field name="Parallax Refraction Scale" type="float" default="0.25" range="#F0_1#" cond="Shader Type == 11">Depth of inner parallax layer effect.</field>
        <field name="Parallax Inner Layer Texture Scale" type="TexCoord" cond="Shader Type == 11">Scales the inner parallax layer texture.</field>
        <field name="Parallax Envmap Strength" type="float" default="1.0" range="#F0_10#" cond="Shader Type == 11">How strong the environment/cube map is.</field>
        <field name="Sparkle Parameters" type="Vector4" cond="Shader Type == 14">CK lists "snow material" when used.</field>
        <field name="Eye Cubemap Scale" type="float" default="1.3" range="#F0_10#" cond="Shader Type == 16">Eye cubemap scale</field>
        <field name="Left Eye Reflection Center" type="Vector3" cond="Shader Type == 16">Offset to set center for left eye cubemap</field>
        <field name="Right Eye Reflection Center" type="Vector3" cond="Shader Type == 16">Offset to set center for right eye cubemap</field>
    </niobject>

    <niobject name="BSEffectShaderProperty" inherit="BSShaderProperty" module="BSMain" versions="#SKY_AND_LATER#">
        Bethesda effect shader property for Skyrim and later.
        <field name="Shader Flags 1" suffix="SK" type="SkyrimShaderPropertyFlags1" default="0x80000000" vercond="#NI_BS_LT_FO4#" />
        <field name="Shader Flags 2" suffix="SK" type="SkyrimShaderPropertyFlags2" default="0x20" vercond="#NI_BS_LT_FO4#" />
        <field name="Shader Flags 1" suffix="FO4" type="Fallout4ShaderPropertyFlags1" default="0x80000000" vercond="#BS_FO4#" />
        <field name="Shader Flags 2" suffix="FO4" type="Fallout4ShaderPropertyFlags2" default="0x20" vercond="#BS_FO4#" />
        <field name="Num SF1" type="uint" vercond="#BS_F76#" />
        <field name="Num SF2" type="uint" vercond="#BS_F76#" />
        <field name="SF1" type="BSShaderCRC32" length="Num SF1" vercond="#BS_F76#" />
        <field name="SF2" type="BSShaderCRC32" length="Num SF2" vercond="#BS_F76#" />
        <field name="UV Offset" type="TexCoord">Offset UVs</field>
        <field name="UV Scale" type="TexCoord" default="#VEC2_ONE#">Offset UV Scale to repeat tiling textures</field>
        <field name="Source Texture"  type="SizedString">points to an external texture.</field>
        <!-- TODO: Next 4 bytes requires bitfield, read as single int -->
        <field name="Texture Clamp Mode" type="byte" default="3">How to handle texture borders.</field>
        <field name="Lighting Influence" type="byte" default="255" />
        <field name="Env Map Min LOD" type="byte" range="0:16" />
        <field name="Unused Byte" type="byte" />
        <field name="Falloff Start Angle" type="float" default="1.0" range="#F_NRM#">At this cosine of angle falloff will be equal to Falloff Start Opacity</field>
        <field name="Falloff Stop Angle" type="float" default="1.0" range="#F_NRM#">At this cosine of angle falloff will be equal to Falloff Stop Opacity</field>
        <field name="Falloff Start Opacity" type="float" range="#F0_1#">Alpha falloff multiplier at start angle</field>
        <field name="Falloff Stop Opacity" type="float" range="#F0_1#">Alpha falloff multiplier at end angle</field>
        <field name="Refraction Power" type="float" vercond="#BS_F76#" />
        <field name="Base Color" type="Color4" default="#VEC4_ONE#">Base color</field>
        <field name="Base Color Scale" type="float" default="1.0" range="0.0:360.0">Multiplier for Base Color (RGB part)</field>
        <field name="Soft Falloff Depth" type="float" default="100.0" range="0.0:9999.0" />
        <field name="Greyscale Texture"  type="SizedString">Points to an external texture, used as palette for SLSF1_Greyscale_To_PaletteColor/SLSF1_Greyscale_To_PaletteAlpha.</field>
        <field name="Env Map Texture" type="SizedString" vercond="#BS_GTE_FO4#" />
        <field name="Normal Texture" type="SizedString" vercond="#BS_GTE_FO4#" />
        <field name="Env Mask Texture" type="SizedString" vercond="#BS_GTE_FO4#" />
        <field name="Environment Map Scale" type="float" default="1.0" range="0.01:20.0" vercond="#BS_GTE_FO4#" />
        <field name="Reflectance Texture" type="SizedString" vercond="#BS_F76#" />
        <field name="Lighting Texture" type="SizedString" vercond="#BS_F76#" />
        <field name="Emittance Color" type="Color3" vercond="#BS_F76#" />
        <field name="Emit Gradient Texture" type="SizedString" vercond="#BS_F76#" />
        <field name="Luminance" type="BSSPLuminanceParams" vercond="#BS_F76#" />
    </niobject>
    
    <bitflags name="WaterShaderPropertyFlags" storage="uint" prefix="BSWSP" versions="#SKY_AND_LATER#">
        Skyrim water shader property flags
        <option bit="0" name="DISPLACEMENT" />
        <option bit="1" name="LOD" />
        <option bit="2" name="DEPTH" />
        <option bit="3" name="ACTOR_IN_WATER" />
        <option bit="4" name="ACTOR_IN_WATER_IS_MOVING" />
        <option bit="5" name="UNDERWATER" />
        <option bit="6" name="REFLECTIONS" />
        <option bit="7" name="REFRACTIONS" />
        <option bit="8" name="VERTEX_UV" />
        <option bit="9" name="VERTEX_ALPHA_DEPTH" />
        <option bit="10" name="PROCEDURAL" />
        <option bit="11" name="FOG" />
        <option bit="12" name="UPDATE_CONSTANTS" />
        <option bit="13" name="CUBEMAP" />
    </bitflags>
    
    <niobject name="BSWaterShaderProperty" inherit="BSShaderProperty" module="BSMain" versions="#SKY_AND_LATER#">
        Skyrim water shader property, different from "WaterShaderProperty" seen in Fallout.
        <field name="Shader Flags 1" type="SkyrimShaderPropertyFlags1" default="0x80000008" vercond="!#BS_F76#" />
        <field name="Shader Flags 2" type="SkyrimShaderPropertyFlags2" default="0x21" vercond="!#BS_F76#" />
        <field name="Num SF1" type="uint" vercond="#BS_F76#" />
        <field name="Num SF2" type="uint" vercond="#BS_F76#" />
        <field name="SF1" type="BSShaderCRC32" length="Num SF1" vercond="#BS_F76#" />
        <field name="SF2" type="BSShaderCRC32" length="Num SF2" vercond="#BS_F76#" />
        <field name="UV Offset" type="TexCoord">Offset UVs. Seems to be unused, but it fits with the other Skyrim shader properties.</field>
        <field name="UV Scale" type="TexCoord" default="#VEC2_ONE#">Offset UV Scale to repeat tiling textures, see above.</field>
        <field name="Water Shader Flags" type="WaterShaderPropertyFlags" default="0xC4" />
    </niobject>
    
    <niobject name="BSSkyShaderProperty" inherit="BSShaderProperty" module="BSMain" versions="#SKY_AND_LATER#">
        Skyrim Sky shader block.
        <field name="Shader Flags 1" type="SkyrimShaderPropertyFlags1" default="0x80000000" vercond="!#BS_F76#" />
        <field name="Shader Flags 2" type="SkyrimShaderPropertyFlags2" default="0x21" vercond="!#BS_F76#" />
        <field name="Num SF1" type="uint" vercond="#BS_F76#" />
        <field name="Num SF2" type="uint" vercond="#BS_F76#" />
        <field name="SF1" type="BSShaderCRC32" length="Num SF1" vercond="#BS_F76#" />
        <field name="SF2" type="BSShaderCRC32" length="Num SF2" vercond="#BS_F76#" />
        <field name="UV Offset" type="TexCoord">Offset UVs. Seems to be unused, but it fits with the other Skyrim shader properties.</field>
        <field name="UV Scale" type="TexCoord" default="#VEC2_ONE#">Offset UV Scale to repeat tiling textures, see above.</field>
        <field name="Source Texture" type="SizedString">points to an external texture.</field>
        <field name="Sky Object Type" type="SkyObjectType" default="BSSM_SKY_CLOUDS" />
    </niobject>

    <niobject name="BSDismemberSkinInstance" inherit="NiSkinInstance" module="BSMain" versions="#BETHESDA#">
        Bethesda-specific skin instance.
        <field name="Num Partitions" type="uint" default="1" />
        <field name="Partitions" type="BodyPartList" length="Num Partitions" />
    </niobject>

    <niobject name="BSDecalPlacementVectorExtraData" inherit="NiFloatExtraData" module="BSMain" versions="#FO3_AND_LATER#">
        Bethesda-specific extra data. Lists locations and normals on a mesh that are appropriate for decal placement.
        <field name="Num Vector Blocks" type="ushort" />
        <field name="Vector Blocks" type="DecalVectorArray" length="Num Vector Blocks" />
    </niobject>

    <niobject name="BSPSysSimpleColorModifier" inherit="NiPSysModifier" module="BSParticle" versions="#FO3_AND_LATER#">
        Bethesda-specific particle modifier.
        <field name="Fade In Percent" type="float" default="0.1" range="#F0_1#" />
        <field name="Fade Out Percent" type="float" default="0.9" range="#F0_1#" />
        <field name="Color 1 End Percent" type="float" range="#F0_1#" />
        <field name="Color 1 Start Percent" type="float" range="#F0_1#" />
        <field name="Color 2 End Percent" type="float" range="#F0_1#" />
        <field name="Color 2 Start Percent" type="float" default="1.0" range="#F0_1#" />
        <field name="Colors" type="Color4" length="3" />
        <field name="Unknown Shorts" type="ushort" length="26" vercond="#BS_F76#" />
    </niobject>


    <bitflags name="BSValueNodeFlags" storage="byte" versions="#FO3_AND_LATER#">
        Flags for BSValueNode.
        <option bit="0" name="BillboardWorldZ" />
        <option bit="1" name="UsePlayerAdjust" />
    </bitflags>

    <niobject name="BSValueNode" inherit="NiNode" module="BSMain" versions="#FO3_AND_LATER#">
        Bethesda-specific node. Found on fxFire effects
        <field name="Value" type="uint" />
        <field name="Value Node Flags" type="BSValueNodeFlags" />
    </niobject>


    <niobject name="BSStripParticleSystem" inherit="NiParticleSystem" module="BSParticle" versions="#FO3_AND_LATER#">
        Bethesda-Specific (mesh?) Particle System.
    </niobject>


    <niobject name="BSStripPSysData" inherit="NiPSysData" module="BSParticle" versions="#FO3_AND_LATER#">
        Bethesda-Specific (mesh?) Particle System Data.
        <field name="Max Point Count" type="ushort" />
        <field name="Start Cap Size" type="float" />
        <field name="End Cap Size" type="float" />
        <field name="Do Z Prepass" type="bool" />
    </niobject>


    <niobject name="BSPSysStripUpdateModifier" inherit="NiPSysModifier" module="BSParticle" versions="#FO3_AND_LATER#">
        Bethesda-Specific (mesh?) Particle System Modifier.
        <field name="Update Delta Time" type="float" default="0.033333" />
    </niobject>


    <niobject name="BSMaterialEmittanceMultController" inherit="NiFloatInterpController" module="BSAnimation" versions="#FO3#">
        Bethesda-Specific time controller.
    </niobject>



    <niobject name="BSMasterParticleSystem" inherit="NiNode" module="BSParticle" versions="#FO3_AND_LATER#">
        Bethesda-Specific particle system.
        <field name="Max Emitter Objects" type="ushort" default="20" />
        <field name="Num Particle Systems" type="uint" />
        <field name="Particle Systems" type="Ref" template="NiAVObject" length="Num Particle Systems" />

    </niobject>


    <niobject name="BSPSysMultiTargetEmitterCtlr" inherit="NiPSysEmitterCtlr" module="BSParticle" versions="#FO3_AND_LATER#">
        Particle system (multi?) emitter controller.
        <field name="Max Emitters" type="ushort" />
        <field name="Master Particle System" type="Ptr" template="BSMasterParticleSystem" />
    </niobject>


    <niobject name="BSRefractionStrengthController" inherit="NiFloatInterpController" module="BSAnimation" versions="#FO3#">
        Bethesda-Specific time controller.
    </niobject>


    <niobject name="BSOrderedNode" inherit="NiNode" module="BSMain" versions="#FO3_AND_LATER#">
        Bethesda-Specific node.
        <field name="Alpha Sort Bound" type="Vector4" />
        <field name="Static Bound" type="bool" default="1" />
    </niobject>


    <niobject name="BSRangeNode" inherit="NiNode" module="BSMain" versions="#FO3_AND_LATER#">
        Bethesda-Specific node.
        <field name="Min" type="byte" />
        <field name="Max" type="byte" />
        <field name="Current" type="byte" />
    </niobject>

    <niobject name="BSBlastNode" inherit="BSRangeNode" module="BSMain" versions="#FO3_AND_LATER#">
        Bethesda-Specific node.
    </niobject>

    <niobject name="BSDamageStage" inherit="BSBlastNode" module="BSMain" versions="#FO3_AND_LATER#">
        Bethesda-Specific node.
    </niobject>


    <niobject name="BSRefractionFirePeriodController" inherit="NiTimeController" module="BSAnimation" versions="#FO3#">
        Bethesda-specific time controller.
        <field name="Interpolator" type="Ref" template="NiInterpolator" />
    </niobject>

    <niobject name="bhkConvexListShape" inherit="bhkConvexShapeBase" module="BSHavok" versions="#FO3#">
        A list of shapes. However,
            - The sub shapes must ALL be convex: Sphere, Capsule, Cylinder, Convex Vertices, Convex Transform
            - The radius of all shapes must be identical
            - The number of sub shapes is restricted to 255
            - The number of vertices of each sub shape is restricted to 255

        For this reason you most likely cannot combine Sphere Shapes, Capsule Shapes, and Convex Vertices Shapes,
        as their Radius values differ in function. (Sphere/Capsule radius = physical size, CVS radius = padding/shell)
        
        Shapes collected in a bhkConvexListShape may not have the correct material noise.
        <field name="Num Sub Shapes" type="uint" default="1" range="1:255" />
        <field name="Sub Shapes" type="Ref" template="bhkConvexShapeBase" length="Num Sub Shapes">List of shapes. Max of 255.</field>
        <field name="Material" type="HavokMaterial">The material of the shape.</field>
        <field name="Radius" type="float" />
        <field name="Unknown Int 1" type="uint" />
        <field name="Unknown Float 1" type="float" />
        <field name="Child Shape Property" type="bhkWorldObjCInfoProperty" />
        <field name="Use Cached AABB" type="bool">If true, an AABB of the children's AABBs is used, which is faster but larger than building an AABB from each child.</field>
        <field name="Closest Point Min Distance" type="float">A distance which is used for getClosestPoint(). If the object being tested is closer, the children are recursed. Otherwise it returns this value.</field>
    </niobject>

    <compound name="BSTreadTransform" size="68" versions="#FO3_AND_LATER#">
        Bethesda-specific compound.
        <field name="Name" type="NiFixedString" />
        <field name="Transform 1" type="NiQuatTransform" />
        <field name="Transform 2" type="NiQuatTransform" />
    </compound>

    <niobject name="BSTreadTransfInterpolator" inherit="NiInterpolator" module="BSAnimation" versions="#FO3_AND_LATER#">
        Bethesda-specific interpolator.
        <field name="Num Tread Transforms" type="uint" />
        <field name="Tread Transforms" type="BSTreadTransform" length="Num Tread Transforms" />
        <field name="Data" type="Ref" template="NiFloatData" />
    </niobject>

    <enum name="AnimNoteType" storage="uint" versions="#FO3_AND_LATER#">
        Anim note types.
        <option value="0" name="ANT_INVALID">ANT_INVALID</option>
        <option value="1" name="ANT_GRABIK">ANT_GRABIK</option>
        <option value="2" name="ANT_LOOKIK">ANT_LOOKIK</option>
    </enum>

    <niobject name="BSAnimNote" inherit="NiObject" module="BSAnimation" versions="#FO3_AND_LATER#">
        Bethesda-specific object.
        <field name="Type" type="AnimNoteType">Type of this note.</field>
        <field name="Time" type="float">Location in time.</field>
        <field name="Arm" type="uint" cond="Type == 1" />
        <field name="Gain" type="float" cond="Type == 2" />
        <field name="State" type="uint" cond="Type == 2" />
    </niobject>

    <niobject name="BSAnimNotes" inherit="NiObject" module="BSAnimation" versions="#FO3_AND_LATER#">
        Bethesda-specific object.
        <field name="Num Anim Notes" type="ushort">Number of BSAnimNote objects.</field>
        <field name="Anim Notes" type="Ref" template="BSAnimNote" length="Num Anim Notes">BSAnimNote objects.</field>
    </niobject>

    <niobject name="bhkLiquidAction" inherit="bhkAction" module="BSHavok" versions="#FO3_AND_LATER#">
        Bethesda custom bhkUnaryAction. Does not hold a link to the body like other bhkUnaryActions however.
        <field name="Unused 01" type="byte" length="12" binary="true" />
        <field name="Initial Stick Force" type="float" default="25.0" />
        <field name="Stick Strength" type="float" default="100.0" />
        <field name="Neighbor Distance" type="float" default="128.0" />
        <field name="Neighbor Strength" type="float" default="500.0" />
    </niobject>

    <enum name="BSCPCullingType" storage="uint" prefix="BSCP" versions="#FO3_AND_LATER#">
        Culling modes for multi bound nodes.
        <option value="0" name="CULL_NORMAL">Normal</option>
        <option value="1" name="CULL_ALLPASS">All Pass</option>
        <option value="2" name="CULL_ALLFAIL">All Fail</option>
        <option value="3" name="CULL_IGNOREMULTIBOUNDS">Ignore Multi Bounds</option>
        <option value="4" name="CULL_FORCEMULTIBOUNDSNOUPDATE">Force Multi Bounds No Update</option>
    </enum>

    <niobject name="BSMultiBoundNode" inherit="NiNode" module="BSMain" versions="#FO3_AND_LATER#">
        Bethesda-specific node.
        <field name="Multi Bound" type="Ref" template="BSMultiBound" />
		<field name="Culling Mode" type="BSCPCullingType" default="CULL_ALLPASS" vercond="#BS_GTE_SKY#" />
    </niobject>

    <niobject name="BSMultiBound" inherit="NiObject" module="BSMain" versions="#FO3_AND_LATER#">
        Bethesda-specific object.
        <field name="Data" type="Ref" template="BSMultiBoundData" />
    </niobject>

    <niobject name="BSMultiBoundData" inherit="NiObject" module="BSMain" versions="#FO3_AND_LATER#">
        Abstract base type for bounding data.
    </niobject>

    <niobject name="BSMultiBoundOBB" inherit="BSMultiBoundData" module="BSMain" versions="#FO3_AND_LATER#">
        Oriented bounding box.
        <field name="Center" type="Vector3">Center of the box.</field>
        <field name="Size" type="Vector3">Size of the box along each axis.</field>
        <field name="Rotation" type="Matrix33">Rotation of the bounding box.</field>
    </niobject>
    
    <niobject name="BSMultiBoundSphere" inherit="BSMultiBoundData" module="BSMain" versions="#FO3_AND_LATER#">
        Bethesda-specific object.
        <field name="Center" type="Vector3" />
        <field name="Radius" type="float" />
    </niobject>

    <compound name="BSGeometrySubSegment" size="16" versions="#FO3_AND_LATER#">
        This is only defined because of recursion issues.
        <field name="Start Index" type="uint" />
        <field name="Num Primitives" type="uint" />
        <field name="Parent Array Index" type="uint" />
        <field name="Unused" type="uint" />
    </compound>

    <compound name="BSGeometrySegmentData" versions="#FO3_AND_LATER#">
        Bethesda-specific. Describes groups of triangles either segmented in a grid (for LOD) or by body part for skinned FO4 meshes.
        <field name="Flags" type="byte" vercond="#NI_BS_LT_FO4#" />
        <field name="Start Index" type="uint">Index = previous Index + previous Num Tris in Segment * 3</field>
        <field name="Num Primitives" type="uint">The number of triangles belonging to this segment</field>
        <field name="Parent Array Index" type="uint" vercond="#BS_GTE_FO4#" />
        <field name="Num Sub Segments" type="uint" vercond="#BS_GTE_FO4#" />
        <field name="Sub Segment" type="BSGeometrySubSegment" length="Num Sub Segments" vercond="#BS_GTE_FO4#" />
    </compound>

    <niobject name="BSSegmentedTriShape" inherit="NiTriShape" module="BSMain" versions="#FO3_AND_LATER#">
        Bethesda-specific AV object.
        <field name="Num Segments" type="uint" default="16">Number of segments in the square grid</field>
        <field name="Segment" type="BSGeometrySegmentData" length="Num Segments">Configuration of each segment</field>
    </niobject>

    <niobject name="BSMultiBoundAABB" inherit="BSMultiBoundData" module="BSMain" versions="#FO3_AND_LATER#">
        Bethesda-specific object.
        <field name="Position" type="Vector3">Position of the AABB's center</field>
        <field name="Extent" type="Vector3">Extent of the AABB in all directions</field>
    </niobject>

    <compound name="NiAGDDataStream">
        <field name="Type" type="uint">Type of data in this channel</field>
        <field name="Unit Size" type="uint">Number of bytes per element of this channel</field>
        <field name="Total Size" type="uint">Total number of bytes of this channel (num vertices times num bytes per element)</field>
        <field name="Stride" type="uint">Number of bytes per element in all channels together. Sum of num channel bytes per element over all block infos.</field>
        <field name="Block Index" type="uint">Unsure. The block in which this channel is stored? Usually there is only one block, and so this is zero.</field>
        <field name="Block Offset" type="uint">Offset (in bytes) of this channel. Sum of all num channel bytes per element of all preceeding block infos.</field>
        <field name="Flags" type="NiAGDDataStreamFlags" default="2" />
    </compound>

    <compound name="NiAGDDataBlock">
        <field name="Block Size" type="uint" />
        <field name="Num Blocks" type="uint" />
        <field name="Block Offsets" type="uint" length="Num Blocks" />
        <field name="Num Data" type="uint" />
        <field name="Data Sizes" type="uint" length="Num Data" />
        <field name="Data" type="byte" length="Num Data" width="Block Size" />
        <!-- NiBSPackedAGDDataBlock -->
        <field name="Shader Index" type="uint" cond="#ARG# == 1" />
        <field name="Total Size" type="uint" cond="#ARG# == 1" />
    </compound>

    <compound name="NiAGDDataBlocks">
        <field name="Has Data" type="bool" />
        <field name="Data Block" type="NiAGDDataBlock" cond="Has Data" arg="#ARG#" />
    </compound>

    <niobject name="NiAdditionalGeometryData" inherit="AbstractAdditionalGeometryData" module="NiMain">
        <field name="Num Vertices" type="ushort" />
        <field name="Num Block Infos" type="uint" />
        <field name="Block Infos" type="NiAGDDataStream" length="Num Block Infos" />
        <field name="Num Blocks" type="uint" />
        <field name="Blocks" type="NiAGDDataBlocks" arg="0" length="Num Blocks" />
    </niobject>

    <niobject name="BSPackedAdditionalGeometryData" inherit="AbstractAdditionalGeometryData" module="BSMain" versions="#BETHESDA#">
        No longer appears to occur in any vanilla files. Older versions of FNV had the block in nvdlc01vaultposter01.nif.
        <field name="Num Vertices" type="ushort" />
        <field name="Num Block Infos" type="uint" />
        <field name="Block Infos" type="NiAGDDataStream" length="Num Block Infos" />
        <field name="Num Blocks" type="uint">Usually there is exactly one block.</field>
        <field name="Blocks" type="NiAGDDataBlocks" arg="1" length="Num Blocks" />
    </niobject>

    <niobject name="BSWArray" inherit="NiExtraData" module="BSMain" versions="#FO3_AND_LATER#">
        Bethesda-specific extra data.
        <field name="Num Items" type="uint" />
        <field name="Items" type="int" length="Num Items" />
    </niobject>

    <niobject name="BSFrustumFOVController" inherit="NiFloatInterpController" module="BSAnimation" versions="#BETHESDA#">
        Bethesda-specific time controller.
    </niobject>

    <niobject name="BSDebrisNode" inherit="BSRangeNode" module="BSMain" versions="#FO3_AND_LATER#">
        Bethesda-Specific node.
    </niobject>

    <niobject name="bhkBreakableConstraint" inherit="bhkConstraint" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpBreakableConstraintData, a wrapper around hkpConstraintInstance.
        The constraint can "break" i.e. stop applying the forces to each body to keep them constrained.
        <field name="Constraint Data" type="bhkWrappedConstraintData">The wrapped constraint.</field>
        <field name="Threshold" type="float">The larger the value, the harder to "break" the constraint.</field>
        <field name="Remove When Broken" type="bool" default="0">No: Constraint stays active. Yes: Constraint gets removed when breaking threshold is exceeded.</field>
    </niobject>

    <niobject name="bhkOrientHingedBodyAction" inherit="bhkUnaryAction" module="BSHavok" versions="#BETHESDA#">
        Bethesda extension of hkpReorientAction (or similar). Will try to reorient a body to stay facing a given direction.
        <field name="Unused 02" type="byte" length="8" binary="true" />
        <field name="Hinge Axis LS" type="Vector4" default="#X_AXIS#" />
        <field name="Forward LS" type="Vector4" default="#Y_AXIS#" />
        <field name="Strength" type="float" default="1.0" />
        <field name="Damping" type="float" default="0.1" />
        <field name="Unused 03" type="byte" length="8" binary="true" />
    </niobject>

    <niobject name="bhkPoseArray" inherit="NiObject" module="BSHavok" versions="#FO3_AND_LATER#">
        Found in Fallout 3 .psa files, extra ragdoll info for NPCs/creatures. (usually idleanims\deathposes.psa)
        Defines different kill poses. The game selects the pose randomly and applies it to a skeleton immediately upon ragdolling.
        Poses can be previewed in GECK Object Window-Actor Data-Ragdoll and selecting Pose Matching tab.
        <field name="Num Bones" type="uint" />
        <field name="Bones" type="NiFixedString" length="Num Bones" />
        <field name="Num Poses" type="uint" />
        <field name="Poses" type="BonePose" length="Num Poses" />
    </niobject>

    <niobject name="bhkRagdollTemplate" inherit="NiExtraData" module="BSHavok" versions="#FO3_AND_LATER#">
        Found in Fallout 3, more ragdoll info?  (meshes\ragdollconstraint\*.rdt)
        <field name="Num Bones" type="uint" />
        <field name="Bones" type="Ref" template="NiObject" length="Num Bones" />
    </niobject>

    <niobject name="bhkRagdollTemplateData" inherit="NiObject" module="BSHavok" versions="#FO3_AND_LATER#">
        Data for bhkRagdollTemplate
        <field name="Name" type="NiFixedString" />
        <field name="Mass" type="float" default="9.0" />
        <field name="Restitution" type="float" default="0.8" />
        <field name="Friction" type="float" default="0.3" />
        <field name="Radius" type="float" default="1.0" />
        <field name="Material" type="HavokMaterial" />
        <field name="Num Constraints" type="uint" />
        <field name="Constraint" type="bhkWrappedConstraintData" length="Num Constraints" />
    </niobject>

    <compound name="Region" size="8" since="V20_5_0_0">
        A range of indices, which make up a region (such as a submesh).
        <field name="Start Index" type="uint" />
        <field name="Num Indices" type="uint" />
    </compound>

    <enum name="CloningBehavior" storage="uint" since="V20_5_0_0">
        Sets how objects are to be cloned.
        <option value="0" name="CLONING_SHARE">Share this object pointer with the newly cloned scene.</option>
        <option value="1" name="CLONING_COPY">Create an exact duplicate of this object for use with the newly cloned scene.</option>
        <option value="2" name="CLONING_BLANK_COPY">Create a copy of this object for use with the newly cloned stream, leaving some of the data to be written later.</option>
    </enum>

    <enum name="ComponentFormat" storage="uint" since="V20_5_0_0">
        The data format of components.
        <option value="0x00000000" name="F_UNKNOWN">Unknown, or don't care, format.</option>
        <option value="0x00010101" name="F_INT8_1"></option>
        <option value="0x00020102" name="F_INT8_2"></option>
        <option value="0x00030103" name="F_INT8_3"></option>
        <option value="0x00040104" name="F_INT8_4"></option>
        <option value="0x00010105" name="F_UINT8_1"></option>
        <option value="0x00020106" name="F_UINT8_2"></option>
        <option value="0x00030107" name="F_UINT8_3"></option>
        <option value="0x00040108" name="F_UINT8_4"></option>
        <option value="0x00010109" name="F_NORMINT8_1"></option>
        <option value="0x0002010A" name="F_NORMINT8_2"></option>
        <option value="0x0003010B" name="F_NORMINT8_3"></option>
        <option value="0x0004010C" name="F_NORMINT8_4"></option>
        <option value="0x0001010D" name="F_NORMUINT8_1"></option>
        <option value="0x0002010E" name="F_NORMUINT8_2"></option>
        <option value="0x0003010F" name="F_NORMUINT8_3"></option>
        <option value="0x00040110" name="F_NORMUINT8_4"></option>
        <option value="0x00010211" name="F_INT16_1"></option>
        <option value="0x00020212" name="F_INT16_2"></option>
        <option value="0x00030213" name="F_INT16_3"></option>
        <option value="0x00040214" name="F_INT16_4"></option>
        <option value="0x00010215" name="F_UINT16_1"></option>
        <option value="0x00020216" name="F_UINT16_2"></option>
        <option value="0x00030217" name="F_UINT16_3"></option>
        <option value="0x00040218" name="F_UINT16_4"></option>
        <option value="0x00010219" name="F_NORMINT16_1"></option>
        <option value="0x0002021A" name="F_NORMINT16_2"></option>
        <option value="0x0003021B" name="F_NORMINT16_3"></option>
        <option value="0x0004021C" name="F_NORMINT16_4"></option>
        <option value="0x0001021D" name="F_NORMUINT16_1"></option>
        <option value="0x0002021E" name="F_NORMUINT16_2"></option>
        <option value="0x0003021F" name="F_NORMUINT16_3"></option>
        <option value="0x00040220" name="F_NORMUINT16_4"></option>
        <option value="0x00010421" name="F_INT32_1"></option>
        <option value="0x00020422" name="F_INT32_2"></option>
        <option value="0x00030423" name="F_INT32_3"></option>
        <option value="0x00040424" name="F_INT32_4"></option>
        <option value="0x00010425" name="F_UINT32_1"></option>
        <option value="0x00020426" name="F_UINT32_2"></option>
        <option value="0x00030427" name="F_UINT32_3"></option>
        <option value="0x00040428" name="F_UINT32_4"></option>
        <option value="0x00010429" name="F_NORMINT32_1"></option>
        <option value="0x0002042A" name="F_NORMINT32_2"></option>
        <option value="0x0003042B" name="F_NORMINT32_3"></option>
        <option value="0x0004042C" name="F_NORMINT32_4"></option>
        <option value="0x0001042D" name="F_NORMUINT32_1"></option>
        <option value="0x0002042E" name="F_NORMUINT32_2"></option>
        <option value="0x0003042F" name="F_NORMUINT32_3"></option>
        <option value="0x00040430" name="F_NORMUINT32_4"></option>
        <option value="0x00010231" name="F_FLOAT16_1"></option>
        <option value="0x00020232" name="F_FLOAT16_2"></option>
        <option value="0x00030233" name="F_FLOAT16_3"></option>
        <option value="0x00040234" name="F_FLOAT16_4"></option>
        <option value="0x00010435" name="F_FLOAT32_1"></option>
        <option value="0x00020436" name="F_FLOAT32_2"></option>
        <option value="0x00030437" name="F_FLOAT32_3"></option>
        <option value="0x00040438" name="F_FLOAT32_4"></option>
        <option value="0x00010439" name="F_UINT_10_10_10_L1"></option>
        <option value="0x0001043A" name="F_NORMINT_10_10_10_L1"></option>
        <option value="0x0001043B" name="F_NORMINT_11_11_10"></option>
        <option value="0x0004013C" name="F_NORMUINT8_4_BGRA"></option>
        <option value="0x0001043D" name="F_NORMINT_10_10_10_2"></option>
        <option value="0x0001043E" name="F_UINT_10_10_10_2"></option>
    </enum>

    <enum name="DataStreamUsage" storage="uint" since="V20_5_0_0">
        Determines how a data stream is used?
        <option value="0" name="USAGE_VERTEX_INDEX"></option>
        <option value="1" name="USAGE_VERTEX"></option>
        <option value="2" name="USAGE_SHADER_CONSTANT"></option>
        <option value="3" name="USAGE_USER"></option>
    </enum>
    
    <bitflags name="DataStreamAccess" storage="uint" since="V20_5_0_0">
        Determines how the data stream is accessed?
        <option bit="0" name="CPU Read"></option>
        <option bit="1" name="CPU Write Static"></option>
        <option bit="2" name="CPU Write Mutable"></option>
        <option bit="3" name="CPU Write Volatile"></option>
        <option bit="4" name="GPU Read"></option>
        <option bit="5" name="GPU Write"></option>
        <option bit="6" name="CPU Write Static Inititialized"></option>
    </bitflags>


    <niobject name="NiDataStream" inherit="NiObject" module="NiMesh" since="V20_5_0_0">
        <field name="Usage" type="DataStreamUsage" abstract="true"></field>
        <field name="Access" type="DataStreamAccess" abstract="true"></field>
        <field name="Num Bytes" type="uint">The size in bytes of this data stream.</field>
        <field name="Cloning Behavior" type="CloningBehavior" default="CLONING_SHARE" />
        <field name="Num Regions" type="uint">Number of regions (such as submeshes).</field>
        <field name="Regions" type="Region" length="Num Regions">The regions in the mesh. Regions can be used to mark off submeshes which are independent draw calls.</field>
        <field name="Num Components" type="uint">Number of components of the data (matches corresponding field in MeshData).</field>
        <field name="Component Formats" type="ComponentFormat" length="Num Components">The format of each component in this data stream.</field>
        <field name="Data" type="byte" binary="true" length="Num Bytes" />
        <field name="Streamable" type="bool" default="1" />
    </niobject>

    <compound name="SemanticData" size="8" since="V20_5_0_0">
        <field name="Name" type="NiFixedString">
            Type of data (POSITION, POSITION_BP, INDEX, NORMAL, NORMAL_BP,
            TEXCOORD, BLENDINDICES, BLENDWEIGHT, BONE_PALETTE, COLOR, DISPLAYLIST,
            MORPH_POSITION, BINORMAL_BP, TANGENT_BP).
        </field>
        <field name="Index" type="uint" default="0">
            An extra index of the data. For example, if there are 3 uv maps,
            then the corresponding TEXCOORD data components would have indices
            0, 1, and 2, respectively.
        </field>
    </compound>

    <compound name="DataStreamRef" since="V20_5_0_0">
        <field name="Stream" type="Ref" template="NiDataStream">Reference to a data stream object which holds the data used by this reference.</field>
        <field name="Is Per Instance" type="bool" default="0">Sets whether this stream data is per-instance data for use in hardware instancing.</field>
        <field name="Num Submeshes" type="ushort" default="1">The number of submesh-to-region mappings that this data stream has.</field>
        <field name="Submesh To Region Map" type="ushort" length="Num Submeshes">A lookup table that maps submeshes to regions.</field>
        <field name="Num Components" type="uint" default="1" />
        <field name="Component Semantics" type="SemanticData" length="Num Components">Describes the semantic of each component.</field>
    </compound>

    <niobject name="NiRenderObject" abstract="true" inherit="NiAVObject" module="NiMain" since="V20_5_0_0">
        An object that can be rendered.
        <field name="Material Data" type="MaterialData">Per-material data.</field>
    </niobject>

    <enum name="MeshPrimitiveType" storage="uint" since="V20_5_0_0">
        Describes the type of primitives stored in a mesh object.
        <option value="0" name="MESH_PRIMITIVE_TRIANGLES">Triangle primitive type.</option>
        <option value="1" name="MESH_PRIMITIVE_TRISTRIPS">Triangle strip primitive type.</option>
        <option value="2" name="MESH_PRIMITIVE_LINES">Lines primitive type.</option>
        <option value="3" name="MESH_PRIMITIVE_LINESTRIPS">Line strip primitive type.</option>
        <option value="4" name="MESH_PRIMITIVE_QUADS">Quadrilateral primitive type.</option>
        <option value="5" name="MESH_PRIMITIVE_POINTS">Point primitive type.</option>
    </enum>

    <enum name="SyncPoint" storage="ushort" since="V20_5_0_0">
        A sync point corresponds to a particular stage in per-frame processing.
        <option value="0x8000" name="SYNC_ANY">Synchronize for any sync points that the modifier supports.</option>
        <option value="0x8010" name="SYNC_UPDATE">Synchronize when an object is updated.</option>
        <option value="0x8020" name="SYNC_POST_UPDATE">Synchronize when an entire scene graph has been updated.</option>
        <option value="0x8030" name="SYNC_VISIBLE">Synchronize when an object is determined to be potentially visible.</option>
        <option value="0x8040" name="SYNC_RENDER">Synchronize when an object is rendered.</option>
        <option value="0x8050" name="SYNC_PHYSICS_SIMULATE">Synchronize when a physics simulation step is about to begin.</option>
        <option value="0x8060" name="SYNC_PHYSICS_COMPLETED">Synchronize when a physics simulation step has produced results.</option>
        <option value="0x8070" name="SYNC_REFLECTIONS">Synchronize after all data necessary to calculate reflections is ready.</option>
    </enum>

    <niobject name="NiMeshModifier" abstract="true" inherit="NiObject" module="NiMesh">
        Base class for mesh modifiers.
        <field name="Num Submit Points" type="uint" />
        <field name="Submit Points" type="SyncPoint" length="Num Submit Points">The sync points supported by this mesh modifier for SubmitTasks.</field>
        <field name="Num Complete Points" type="uint" />
        <field name="Complete Points" type="SyncPoint" length="Num Complete Points">The sync points supported by this mesh modifier for CompleteTasks.</field>
    </niobject>

    <compound name="MeshDataEpicMickey" versions="V20_6_5_0_DEM">
        <field name="Unknown 1" type="int" />
        <field name="Unknown 2" type="int" />
        <field name="Unknown 3" type="int" vercond="#USER# #GT# 14" />
        <field name="Unknown 4" type="int" />
        <field name="Unknown 5" type="float" />
        <field name="Unknown 6" type="int" />
    </compound>

    <compound name="WeightDataEpicMickey" size="24" versions="V20_6_5_0_DEM">
        <field name="Bone Indices" type="int" length="3" />
        <field name="Weights" type="float" length="3" />
    </compound>

    <compound name="PartitionDataEpicMickey" size="28" versions="V20_6_5_0_DEM">
        <field name="Start" type="int" />
        <field name="End" type="int" />
        <field name="Weight Indices" type="ushort" length="10" />
    </compound>

    <compound name="ExtraMeshDataEpicMickey" versions="V20_6_5_0_DEM">
        <field name="Unknown 1" type="uint" />
        <field name="Num Unknown Floats" type="uint" />
        <field name="Unknown Floats 1" type="float" length="Num Unknown Floats" />
        <field name="Num Weights" type="uint" />
        <field name="Weights" type="WeightDataEpicMickey" length="Num Weights" />
        <field name="Vertex to Weight Map Size" type="uint" />
        <field name="Vertex to Weight Map" type="uint" length="Vertex to Weight Map Size" />
        <field name="Unknown Data Size" type="uint" />
        <field name="Unknown Data Width" type="uint" />
        <field name="Unknown Data" type="Vector3" length="Unknown Data Size" width="Unknown Data Width" />
        <field name="Unknown Indices" type="ushort" length="Unknown Data Size" />
        <field name="Num Mapped Primitives" type="ushort" vercond="#USER# #LT# 17">When non-zero, equal to the number of primitives.</field>
        <field name="Num Mapped Primitives" type="uint" vercond="#USER# == 17">When non-zero, equal to the number of primitives.</field>
        <field name="Mapped Primitives" type="byte" length="Num Mapped Primitives">Some integer associated with each primitive.</field>
        <field name="Partition Size" type="uint" />
        <field name="Partitions" type="PartitionDataEpicMickey" length="Partition Size" />
        <field name="Max Primitive Map Index" type="uint">The max value to appear in the Mapped Primitives array.</field>
    </compound>

    <niobject name="NiMesh" inherit="NiRenderObject" module="NiMesh" since="V20_5_0_0">
        <field name="Primitive Type" type="MeshPrimitiveType">The primitive type of the mesh, such as triangles or lines.</field>
        <field name="EM Data" type="MeshDataEpicMickey" since="20.6.5.0" until="20.6.5.0" />
        <field name="Num Submeshes" type="ushort">The number of submeshes contained in this mesh.</field>
        <field name="Instancing Enabled" type="bool">Sets whether hardware instancing is being used.</field>
        <field name="Bounding Sphere" type="NiBound">The combined bounding volume of all submeshes.</field>
        <field name="Num Datastreams" type="uint" />
        <field name="Datastreams" type="DataStreamRef" length="Num Datastreams" />
        <field name="Num Modifiers" type="uint" />
        <field name="Modifiers" type="Ref" template="NiMeshModifier" length="Num Modifiers" />
        <field name="Has Extra EM Data" type="bool" since="20.6.5.0" until="20.6.5.0" vercond="#USER# #GT# 9" />
        <field name="Extra EM Data" type="ExtraMeshDataEpicMickey" cond="Has Extra EM Data" since="20.6.5.0" until="20.6.5.0" vercond="#USER# #GT# 9" />
    </niobject>

    <niobject name="NiMorphWeightsController" inherit="NiInterpController" module="NiAnimation" since="V20_5_0_0">
        Manipulates a mesh with the semantic MORPHWEIGHTS using an NiMorphMeshModifier.
        <field name="Count" type="uint" />
        <field name="Num Interpolators" type="uint" />
        <field name="Interpolators" type="Ref" template="NiInterpolator" length="Num Interpolators" />
        <field name="Num Targets" type="uint" />
        <field name="Target Names" type="NiFixedString" length="Num Targets" />
    </niobject>

    <compound name="ElementReference" size="12" since="V20_5_0_0">
        <field name="Semantic" type="SemanticData">The element semantic.</field>
        <field name="Normalize Flag" type="uint">Whether or not to normalize the data.</field>
    </compound>

    <niobject name="NiMorphMeshModifier" inherit="NiMeshModifier" module="NiMesh" since="V20_5_0_0">
        Performs linear-weighted blending between a set of target data streams.
        <field name="Flags" type="byte">
            FLAG_RELATIVETARGETS = 0x01
            FLAG_UPDATENORMALS   = 0x02
            FLAG_NEEDSUPDATE     = 0x04
            FLAG_ALWAYSUPDATE    = 0x08
            FLAG_NEEDSCOMPLETION = 0x10
            FLAG_SKINNED         = 0x20
            FLAG_SWSKINNED       = 0x40
        </field>
        <field name="Num Targets" type="ushort">The number of morph targets.</field>
        <field name="Num Elements" type="uint">The number of morphing data stream elements.</field>
        <field name="Elements" type="ElementReference" length="Num Elements">Semantics and normalization of the morphing data stream elements.</field>
    </niobject>

    <niobject name="NiSkinningMeshModifier" inherit="NiMeshModifier" module="NiMesh" since="V20_5_0_0">
        <field name="Flags" type="ushort">
            USE_SOFTWARE_SKINNING = 0x0001
            RECOMPUTE_BOUNDS = 0x0002
        </field>
        <field name="Skeleton Root" type="Ptr" template="NiAVObject">The root bone of the skeleton.</field>
        <field name="Skeleton Transform" type="NiTransform">The transform that takes the root bone parent coordinate system into the skin coordinate system.</field>
        <field name="Num Bones" type="uint">The number of bones referenced by this mesh modifier.</field>
        <field name="Bones" type="Ptr" template="NiAVObject" length="Num Bones">Pointers to the bone nodes that affect this skin.</field>
        <field name="Bone Transforms" type="NiTransform" length="Num Bones">The transforms that go from bind-pose space to bone space.</field>
        <field name="Bone Bounds" type="NiBound" cond="Flags #BITAND# 2" length="Num Bones">The bounds of the bones.  Only stored if the RECOMPUTE_BOUNDS bit is set.</field>
    </niobject>

    <niobject name="NiMeshHWInstance" inherit="NiAVObject" module="NiMesh" since="V20_5_0_0">
        An instance of a hardware-instanced mesh in a scene graph.
        <field name="Master Mesh" type="Ref" template="NiMesh">The instanced mesh this object represents.</field>
        <field name="Mesh Modifier" type="Ref" template="NiInstancingMeshModifier" />
    </niobject>

    <niobject name="NiInstancingMeshModifier" inherit="NiMeshModifier" module="NiMesh" since="V20_5_0_0">
        Mesh modifier that provides per-frame instancing capabilities in Gamebryo.
        <field name="Has Instance Nodes" type="bool" />
        <field name="Per Instance Culling" type="bool" />
        <field name="Has Static Bounds" type="bool" />
        <field name="Affected Mesh" type="Ref" template="NiMesh" />
        <field name="Bounding Sphere" type="NiBound" cond="Has Static Bounds" />
        <field name="Num Instance Nodes" type="uint" cond="Has Instance Nodes" />
        <field name="Instance Nodes" type="Ref" template="NiMeshHWInstance" length="Num Instance Nodes" cond="Has Instance Nodes" />
    </niobject>

    <compound name="LODInfo">
        <field name="Num Bones" type="uint" />
        <field name="Num Active Skins" type="uint" />
        <field name="Skin Indices" type="uint" length="Num Active Skins" />
    </compound>

    <niobject name="NiSkinningLODController" inherit="NiTimeController" module="NiAnimation" since="V20_5_0_0">
        Defines the levels of detail for a given character and dictates the character's current LOD.
        <field name="Current LOD" type="uint" />
        <field name="Num Bones" type="uint" />
        <field name="Bones" type="Ref" template="NiNode" length="Num Bones" />
        <field name="Num Skins" type="uint" />
        <field name="Skins" type="Ref" template="NiMesh" length="Num Skins" />
        <field name="Num LOD Levels" type="uint" />
        <field name="LODs" type="LODInfo" length="Num LOD Levels" />
    </niobject>


    <!-- NiPS Particle System -->

    <compound name="PSSpawnRateKey" size="8" since="V20_5_0_0">
        <field name="Value" type="float" />
        <field name="Time" type="float" />
    </compound>

    <enum name="AlignMethod" storage="uint" since="V20_5_0_0">
        Describes the various methods that may be used to specify the orientation of the particles.
        <option value="0" name="ALIGN_INVALID" />
        <option value="1" name="ALIGN_PER_PARTICLE" />
        <option value="2" name="ALIGN_LOCAL_FIXED" />
        <option value="5" name="ALIGN_LOCAL_POSITION" />
        <option value="9" name="ALIGN_LOCAL_VELOCITY" />
        <option value="16" name="ALIGN_CAMERA" />
    </enum>

    <niobject name="NiPSParticleSystem" inherit="NiMesh" module="NiPSParticle" since="V20_5_0_0">
        Represents a particle system.
        <field name="Simulator" type="Ref" template="NiPSSimulator" />
        <field name="Generator" type="Ref" template="NiPSBoundUpdater" />
        <field name="Num Emitters" type="uint" />
        <field name="Emitters" type="Ref" template="NiPSEmitter" length="Num Emitters" />
        <field name="Num Spawners" type="uint" />
        <field name="Spawners" type="Ref" template="NiPSSpawner" length="Num Spawners" />
        <field name="Death Spawner" type="Ref" template="NiPSSpawner" />
        <field name="Max Num Particles" type="uint" />
        <field name="Has Colors" type="bool" />
        <field name="Has Rotations" type="bool" />
        <field name="Has Rotation Axes" type="bool" />
        <field name="Has Animated Textures" type="bool" since="20.6.1.0" />
        <field name="World Space" type="bool" default="1" />
        <field name="Normal Method" type="AlignMethod" default="ALIGN_CAMERA" since="20.6.1.0" />
        <field name="Normal Direction" type="Vector3" since="20.6.1.0" />
        <field name="Up Method" type="AlignMethod" default="ALIGN_CAMERA" since="20.6.1.0" />
        <field name="Up Direction" type="Vector3" since="20.6.1.0" />
        <field name="Living Spawner" type="Ref" template="NiPSSpawner" since="20.6.1.0" />
        <field name="Num Spawn Rate Keys" type="byte" since="20.6.1.0" />
        <field name="Spawn Rate Keys" type="PSSpawnRateKey" length="Num Spawn Rate Keys" since="20.6.1.0" />
        <field name="Pre RPI" type="bool" since="20.6.1.0" />
        <field name="DEM Unknown Int" type="uint" since="20.6.5.0" until="20.6.5.0" vercond="#USER# #GT# 14" />
        <field name="DEM Unknown Byte" type="byte" since="20.6.5.0" until="20.6.5.0" vercond="#USER# #GT# 14" />
    </niobject>

    <niobject name="NiPSMeshParticleSystem" inherit="NiPSParticleSystem" module="NiPSParticle" since="V20_5_0_0">
        Represents a particle system that uses mesh particles instead of sprite-based particles.
        <field name="Num Generations" type="uint" />
        <field name="Master Particles" type="Ref" template="NiAVObject" length="Num Generations" />
        <field name="Pool Size" type="uint" />
        <field name="Auto Fill Pools" type="bool" />
    </niobject>

    <!-- NiPS Generators -->

    <niobject name="NiPSFacingQuadGenerator" inherit="NiMeshModifier" module="NiPSParticle" since="V20_5_0_0">
        A mesh modifier that uses particle system data to generate camera-facing quads.
    </niobject>

    <niobject name="NiPSAlignedQuadGenerator" inherit="NiMeshModifier" module="NiPSParticle" since="V20_5_0_0">
        A mesh modifier that uses particle system data to generate aligned quads for each particle.
        <field name="Scale Amount U" type="float" />
        <field name="Scale Limit U" type="float" default="10000.0" />
        <field name="Scale Rest U" type="float" default="1.0" />
        <field name="Scale Amount V" type="float" />
        <field name="Scale Limit V" type="float" default="10000.0" />
        <field name="Scale Rest V" type="float" default="1.0" />
        <field name="Center U" type="float" />
        <field name="Center V" type="float" />
        <field name="UV Scrolling" type="bool" />
        <field name="Num Frames Across" type="ushort" default="1" />
        <field name="Num Frames Down" type="ushort" default="1" />
        <field name="Ping Pong" type="bool" />
        <field name="Initial Frame" type="ushort" />
        <field name="Initial Frame Variation" type="float" />
        <field name="Num Frames" type="ushort" />
        <field name="Num Frames Variation" type="float" />
        <field name="Initial Time" type="float" />
        <field name="Final Time" type="float" default="1.0" />
    </niobject>

    <!-- NiPS Simulators -->

    <niobject name="NiPSSimulator" inherit="NiMeshModifier" module="NiPSParticle" since="V20_5_0_0">
        The mesh modifier that performs all particle system simulation.
        <field name="Num Simulation Steps" type="uint" />
        <field name="Simulation Steps" type="Ref" template="NiPSSimulatorStep" length="Num Simulation Steps" />
    </niobject>

    <niobject name="NiPSSimulatorStep" abstract="true" inherit="NiObject" module="NiPSParticle" since="V20_5_0_0">
        Abstract base class for a single step in the particle system simulation process.  It has no seralized data.
    </niobject>

    <enum name="PSLoopBehavior" storage="uint" since="V20_5_0_0">
        <option name="PS_LOOP_CLAMP_BIRTH" value="0">Key times map such that the first key occurs at the birth of the particle, and times later than the last key get the last key value.</option>
        <option name="PS_LOOP_CLAMP_DEATH" value="1">Key times map such that the last key occurs at the death of the particle, and times before the initial key time get the value of the initial key.</option>
        <option name="PS_LOOP_AGESCALE" value="2">Scale the animation to fit the particle lifetime, so that the first key is age zero, and the last key comes at the particle death.</option>
        <option name="PS_LOOP_LOOP" value="3">The time is converted to one within the time range represented by the keys, as if the key sequence loops forever in the past and future.</option>
        <option name="PS_LOOP_REFLECT" value="4">The time is reflection looped, as if the keys played forward then backward the forward then backward etc for all time.</option>
    </enum>

    <niobject name="NiPSSimulatorGeneralStep" inherit="NiPSSimulatorStep" module="NiPSParticle" since="V20_5_0_0">
        Encapsulates a floodgate kernel that updates particle size, colors, and rotations.
        <field name="Num Size Keys" type="byte" since="20.6.1.0" />
        <field name="Size Keys" type="Key" template="float" arg="1" length="Num Size Keys" since="20.6.1.0">The particle size keys.</field>
        <field name="Size Loop Behavior" type="PSLoopBehavior" default="PS_LOOP_AGESCALE" since="20.6.1.0">The loop behavior for the size keys.</field>
        <field name="Num Color Keys" type="byte" />
        <field name="Color Keys" type="Key" template="ByteColor4" arg="1" length="Num Color Keys">The particle color keys.</field>
        <field name="Color Loop Behavior" type="PSLoopBehavior" default="PS_LOOP_AGESCALE" since="20.6.1.0">The loop behavior for the color keys.</field>
        <field name="Num Rotation Keys" type="byte" since="20.6.1.0" />
        <field name="Rotation Keys" type="QuatKey" template="Quaternion" arg="1" length="Num Rotation Keys" since="20.6.1.0">The particle rotation keys.</field>
        <field name="Rotation Loop Behavior" type="PSLoopBehavior" default="PS_LOOP_AGESCALE" since="20.6.1.0">The loop behavior for the rotation keys.</field>
        <field name="Grow Time" type="float"> The the amount of time over which a particle's size is ramped from 0.0 to 1.0 in seconds</field>
        <field name="Shrink Time" type="float">The the amount of time over which a particle's size is ramped from 1.0 to 0.0 in seconds</field>
        <field name="Grow Generation" type="ushort">Specifies the particle generation to which the grow effect should be applied. This is usually generation 0, so that newly created particles will grow.</field>
        <field name="Shrink Generation" type="ushort">Specifies the particle generation to which the shrink effect should be applied. This is usually the highest supported generation for the particle system, so that particles will shrink immediately before getting killed.</field>
        <field name="DEM Unknown Byte" type="byte" since="20.6.5.0" until="20.6.5.0" vercond="#USER# #GT# 14" />
    </niobject>

    <niobject name="NiPSSimulatorForcesStep" inherit="NiPSSimulatorStep" module="NiPSParticle" since="V20_5_0_0">
        Encapsulates a floodgate kernel that simulates particle forces.
        <field name="Num Forces" type="uint" />
        <field name="Forces" type="Ref" template="NiPSForce" length="Num Forces">The forces affecting the particle system.</field>
    </niobject>

    <niobject name="NiPSSimulatorCollidersStep" inherit="NiPSSimulatorStep" module="NiPSParticle" since="V20_5_0_0">
        Encapsulates a floodgate kernel that simulates particle colliders.
        <field name="Num Colliders" type="uint" />
        <field name="Colliders" type="Ref" template="NiPSCollider" length="Num Colliders">The colliders affecting the particle system.</field>
    </niobject>

    <niobject name="NiPSSimulatorMeshAlignStep" inherit="NiPSSimulatorStep" module="NiPSParticle" since="V20_5_0_0">
        Encapsulates a floodgate kernel that updates mesh particle alignment and transforms.
        <field name="Num Rotation Keys" type="byte" />
        <field name="Rotation Keys" type="QuatKey" template="Quaternion" arg="1" length="Num Rotation Keys">The particle rotation keys.</field>
        <field name="Rotation Loop Behavior" type="PSLoopBehavior">The loop behavior for the rotation keys.</field>
    </niobject>

    <niobject name="NiPSSimulatorFinalStep" inherit="NiPSSimulatorStep" module="NiPSParticle" since="V20_5_0_0">
        Encapsulates a floodgate kernel that updates particle positions and ages. As indicated by its name, this step should be attached last in the NiPSSimulator mesh modifier.
    </niobject>

    <niobject name="NiPSBoundUpdater" inherit="NiObject" module="NiPSParticle" since="V20_5_0_0">
        Updates the bounding volume for an NiPSParticleSystem object.
        <field name="Update Skip" type="ushort">Number of particle bounds to skip updating every frame. Higher = more updates each frame.</field>
    </niobject>

    <!-- NiPS Forces -->

    <enum name="PSForceType" storage="uint" since="V20_5_0_0">
        This is used by the Floodgate kernel to determine which NiPSForceHelpers functions to call.
        <option value="0" name="FORCE_BOMB" />
        <option value="1" name="FORCE_DRAG" />
        <option value="2" name="FORCE_AIR_FIELD" />
        <option value="3" name="FORCE_DRAG_FIELD" />
        <option value="4" name="FORCE_GRAVITY_FIELD" />
        <option value="5" name="FORCE_RADIAL_FIELD" />
        <option value="6" name="FORCE_TURBULENCE_FIELD" />
        <option value="7" name="FORCE_VORTEX_FIELD" />
        <option value="8" name="FORCE_GRAVITY" />
    </enum>

    <niobject name="NiPSForce" abstract="true" inherit="NiObject" module="NiPSParticle" since="V20_5_0_0">
        Abstract base class for all particle forces.
        <field name="Name" type="NiFixedString" />
        <field name="Type" type="PSForceType">
            The force type is set by each derived class and cannot be changed.
            <default type="NiPSBombForce" value="FORCE_BOMB" />
            <default type="NiPSDragForce" value="FORCE_DRAG" />
            <default type="NiPSAirFieldForce" value="FORCE_AIR_FIELD" />
            <default type="NiPSDragFieldForce" value="FORCE_DRAG_FIELD" />
            <default type="NiPSGravityFieldForce" value="FORCE_GRAVITY_FIELD" />
            <default type="NiPSRadialFieldForce" value="FORCE_RADIAL_FIELD" />
            <default type="NiPSTurbulenceFieldForce" value="FORCE_TURBULENCE_FIELD" />
            <default type="NiPSVortexFieldForce" value="FORCE_VORTEX_FIELD" />
            <default type="NiPSGravityForce" value="FORCE_GRAVITY" />
        </field>
        <field name="Active" type="bool" />
    </niobject>

    <niobject name="NiPSFieldForce" abstract="true" inherit="NiPSForce" module="NiPSParticle" since="V20_5_0_0">
        Abstract base class for all particle field forces.
        <field name="Field Object" type="Ref" template="NiAVObject" />
        <field name="Magnitude" type="float" />
        <field name="Attenuation" type="float" />
        <field name="Use Max Distance" type="bool" />
        <field name="Max Distance" type="float" />
    </niobject>

    <niobject name="NiPSDragForce" inherit="NiPSForce" module="NiPSParticle" since="V20_5_0_0">
        Applies a linear drag force to particles.
        <field name="Drag Axis" type="Vector3" default="#X_AXIS#" />
        <field name="Percentage" type="float" default="0.05" />
        <field name="Range" type="float" default="#FLT_MAX#" />
        <field name="Range Falloff" type="float" default="#FLT_MAX#" />
        <field name="Drag Object" type="Ptr" template="NiAVObject" />
    </niobject>

    <niobject name="NiPSGravityForce" inherit="NiPSForce" module="NiPSParticle" since="V20_5_0_0">
        Applies a gravitational force to particles.
        <field name="Gravity Axis" type="Vector3" default="#X_AXIS#" />
        <field name="Decay" type="float" />
        <field name="Strength" type="float" />
        <field name="Force Type" type="ForceType" />
        <field name="Turbulence" type="float" />
        <field name="Turbulence Scale" type="float" default="1.0" />
        <field name="Gravity Object" type="Ptr" template="NiAVObject" />
    </niobject>

    <niobject name="NiPSBombForce" inherit="NiPSForce" module="NiPSParticle" since="V20_5_0_0">
        Applies an explosive force to particles.
        <field name="Bomb Axis" type="Vector3" default="#X_AXIS#" />
        <field name="Decay" type="float" />
        <field name="Delta V" type="float" />
        <field name="Decay Type" type="DecayType" />
        <field name="Symmetry Type" type="SymmetryType" />
        <field name="Bomb Object" type="Ptr" template="NiAVObject" />
    </niobject>

    <niobject name="NiPSAirFieldForce" inherit="NiPSFieldForce" module="NiPSParticle" since="V20_5_0_0">
        Inside a field, updates particle velocity to simulate the effects of air movements.
        <field name="Direction" type="Vector3" />
        <field name="Air Friction" type="float" />
        <field name="Inherited Velocity" type="float" />
        <field name="Inherit Rotation" type="bool" />
        <field name="Enable Spread" type="bool" />
        <field name="Spread" type="float" />
    </niobject>

    <niobject name="NiPSGravityFieldForce" inherit="NiPSFieldForce" module="NiPSParticle" since="V20_5_0_0">
        Inside a field, updates particle velocity to simulate the effects of directional gravity.
        <field name="DEM Unknown Short" type="ushort" since="20.6.5.0" until="20.6.5.0" vercond="#USER# #GT# 14" />
        <field name="Direction" type="Vector3" default="#X_AXIS#" />
        <field name="DEM Unknown Byte" type="byte" since="20.6.5.0" until="20.6.5.0" vercond="#USER# #GT# 14" />
    </niobject>

    <niobject name="NiPSDragFieldForce" inherit="NiPSFieldForce" module="NiPSParticle" since="V20_5_0_0">
        Inside a field, updates particle velocity to simulate the effects of drag.
        <field name="Use Direction" type="bool" />
        <field name="Direction" type="Vector3" default="#X_AXIS#" />
    </niobject>

    <niobject name="NiPSRadialFieldForce" inherit="NiPSFieldForce" module="NiPSParticle" since="V20_5_0_0">
        Inside a field, updates particle velocity to simulate the effects of point gravity.
        <field name="Radial Factor" type="float" />
    </niobject>

    <niobject name="NiPSTurbulenceFieldForce" inherit="NiPSFieldForce" module="NiPSParticle" since="V20_5_0_0">
        Inside a field, updates particle velocity to simulate the effects of turbulence.
        <field name="Frequency" type="float" />
    </niobject>

    <niobject name="NiPSVortexFieldForce" inherit="NiPSFieldForce" module="NiPSParticle" since="V20_5_0_0">
        Inside a field, updates particle velocity to simulate the effects of a vortex.
        <field name="Direction" type="Vector3" default="#X_AXIS#" />
    </niobject>

    <!-- NiPS Emitters -->

    <niobject name="NiPSEmitter" abstract="true" inherit="NiObject" module="NiPSParticle" since="V20_5_0_0">
        Abstract base class for all particle emitters.
        <field name="Name" type="NiFixedString" />
        <field name="Speed" type="float" />
        <field name="Speed Var" type="float" />
        <field name="Speed Flip Ratio" type="float" since="20.6.1.0" />
        <field name="Declination" type="float" />
        <field name="Declination Var" type="float" />
        <field name="Planar Angle" type="float" />
        <field name="Planar Angle Var" type="float" />
        <field name="Color" type="ByteColor4" until="20.6.0.0" />
        <field name="Size" type="float" />
        <field name="Size Var" type="float" />
        <field name="Lifespan" type="float" />
        <field name="Lifespan Var" type="float" />
        <field name="Rotation Angle" type="float" />
        <field name="Rotation Angle Var" type="float" />
        <field name="Rotation Speed" type="float" />
        <field name="Rotation Speed Var" type="float" />
        <field name="Rotation Axis" type="Vector3" />
        <field name="Random Rot Speed Sign" type="bool" />
        <field name="Random Rot Axis" type="bool" />
        <field name="Unknown" type="bool" since="30.0.0.0" until="30.0.0.1" />
    </niobject>

    <niobject name="NiPSVolumeEmitter" abstract="true" inherit="NiPSEmitter" module="NiPSParticle" since="V20_5_0_0">
        Abstract base class for particle emitters that emit particles from a volume.
        <field name="DEM Unknown Byte" type="byte" since="20.6.5.0" until="20.6.5.0" vercond="#USER# #GT# 14" />
        <field name="Emitter Object" type="Ptr" template="NiAVObject" />
    </niobject>

    <niobject name="NiPSBoxEmitter" inherit="NiPSVolumeEmitter" module="NiPSParticle" since="V20_5_0_0">
        A particle emitter that emits particles from a rectangular volume.
        <field name="Emitter Width" type="float" />
        <field name="Emitter Height" type="float" />
        <field name="Emitter Depth" type="float" />
    </niobject>

    <niobject name="NiPSSphereEmitter" inherit="NiPSVolumeEmitter" module="NiPSParticle" since="V20_5_0_0">
        A particle emitter that emits particles from a spherical volume.
        <field name="Emitter Radius" type="float" />
    </niobject>

    <niobject name="NiPSCylinderEmitter" inherit="NiPSVolumeEmitter" module="NiPSParticle" since="V20_5_0_0">
        A particle emitter that emits particles from a cylindrical volume.
        <field name="Emitter Radius" type="float" />
        <field name="Emitter Height" type="float" />
    </niobject>

    <niobject name="NiPSTorusEmitter" inherit="NiPSVolumeEmitter" module="NiPSParticle" since="V20_5_0_0">
        A particle emitter that emits particles from a toroidal volume.
        <field name="Emitter Radius" type="float" />
        <field name="Emitter Section Radius" type="float" />
    </niobject>

    <niobject name="NiPSMeshEmitter" inherit="NiPSEmitter" module="NiPSParticle" since="V20_5_0_0">
        Emits particles from one or more NiMesh objects. A random mesh emitter is selected for each particle emission.
        <field name="Num Mesh Emitters" type="uint" />
        <field name="Mesh Emitters" type="Ptr" template="NiMesh" length="Num Mesh Emitters" />
        <field name="Emit Axis" type="Vector3" until="20.6.0.0" />
        <field name="Emitter Object" type="Ptr" template="NiAVObject" since="20.6.1.0" />
        <field name="Mesh Emission Type" type="EmitFrom" />
        <field name="Initial Velocity Type" type="VelocityType" />
    </niobject>

    <niobject name="NiPSCurveEmitter" inherit="NiPSEmitter" module="NiPSParticle" since="V20_5_0_0">
        Emits particles from a curve.
        <field name="Has Curve" type="bool" />
        <field name="Curve" type="NiCurve3" cond="Has Curve" />
        <field name="Curve Parent" type="Ptr" template="NiAVObject" />
        <field name="Emitter Object" type="Ptr" template="NiAVObject" />
    </niobject>

    <!-- NiPS Controllers -->

    <niobject name="NiPSEmitterCtlr" abstract="true" inherit="NiSingleInterpController" module="NiPSParticle" since="V20_5_0_0">
        Abstract base class for all particle emitter time controllers.
        <field name="Emitter Name" type="NiFixedString" />
    </niobject>

    <niobject name="NiPSEmitterFloatCtlr" abstract="true" inherit="NiPSEmitterCtlr" module="NiPSParticle" since="V20_5_0_0">
        Abstract base class for controllers that animate a floating point value on an NiPSEmitter object.
    </niobject>

    <niobject name="NiPSEmitParticlesCtlr" inherit="NiPSEmitterCtlr" module="NiPSParticle" since="V20_5_0_0">
        Animates particle emission and birth rate.
        <field name="Emitter Active Interpolator" type="Ref" template="NiInterpolator" />
    </niobject>

    <niobject name="NiPSForceCtlr" abstract="true" inherit="NiSingleInterpController" module="NiPSParticle" since="V20_5_0_0">
        Abstract base class for all particle force time controllers.
        <field name="Force Name" type="NiFixedString" />
    </niobject>

    <niobject name="NiPSForceBoolCtlr" abstract="true" inherit="NiPSForceCtlr" module="NiPSParticle" since="V20_5_0_0">
        Abstract base class for controllers that animate a Boolean value on an NiPSForce object.
    </niobject>

    <niobject name="NiPSForceFloatCtlr" abstract="true" inherit="NiPSForceCtlr" module="NiPSParticle" since="V20_5_0_0">
        Abstract base class for controllers that animate a floating point value on an NiPSForce object.
    </niobject>

    <niobject name="NiPSForceActiveCtlr" inherit="NiPSForceBoolCtlr" module="NiPSParticle" since="V20_5_0_0">
        Animates whether or not an NiPSForce object is active.
    </niobject>

    <niobject name="NiPSGravityStrengthCtlr" inherit="NiPSForceFloatCtlr" module="NiPSParticle" since="V20_5_0_0">
        Animates the strength value of an NiPSGravityForce object.
    </niobject>

    <niobject name="NiPSFieldAttenuationCtlr" inherit="NiPSForceFloatCtlr" module="NiPSParticle" since="V20_5_0_0">
        Animates the attenuation value of an NiPSFieldForce object.
    </niobject>

    <niobject name="NiPSFieldMagnitudeCtlr" inherit="NiPSForceFloatCtlr" module="NiPSParticle" since="V20_5_0_0">
        Animates the magnitude value of an NiPSFieldForce object.
    </niobject>

    <niobject name="NiPSFieldMaxDistanceCtlr" inherit="NiPSForceFloatCtlr" module="NiPSParticle" since="V20_5_0_0">
        Animates the max distance value of an NiPSFieldForce object.
    </niobject>

    <niobject name="NiPSEmitterSpeedCtlr" inherit="NiPSEmitterFloatCtlr" module="NiPSParticle" since="V20_5_0_0">
        Animates the speed value on an NiPSEmitter object.
    </niobject>

    <niobject name="NiPSEmitterRadiusCtlr" inherit="NiPSEmitterFloatCtlr" module="NiPSParticle" since="V20_5_0_0">
        Animates the size value on an NiPSEmitter object.
    </niobject>

    <niobject name="NiPSEmitterDeclinationCtlr" inherit="NiPSEmitterFloatCtlr" module="NiPSParticle" since="V20_5_0_0">
        Animates the declination value on an NiPSEmitter object.
    </niobject>

    <niobject name="NiPSEmitterDeclinationVarCtlr" inherit="NiPSEmitterFloatCtlr" module="NiPSParticle" since="V20_5_0_0">
        Animates the declination variation value on an NiPSEmitter object.
    </niobject>

    <niobject name="NiPSEmitterPlanarAngleCtlr" inherit="NiPSEmitterFloatCtlr" module="NiPSParticle" since="V20_5_0_0">
        Animates the planar angle value on an NiPSEmitter object.
    </niobject>

    <niobject name="NiPSEmitterPlanarAngleVarCtlr" inherit="NiPSEmitterFloatCtlr" module="NiPSParticle" since="V20_5_0_0">
        Animates the planar angle variation value on an NiPSEmitter object.
    </niobject>

    <niobject name="NiPSEmitterRotAngleCtlr" inherit="NiPSEmitterFloatCtlr" module="NiPSParticle" since="V20_5_0_0">
        Animates the rotation angle value on an NiPSEmitter object.
    </niobject>

    <niobject name="NiPSEmitterRotAngleVarCtlr" inherit="NiPSEmitterFloatCtlr" module="NiPSParticle" since="V20_5_0_0">
        Animates the rotation angle variation value on an NiPSEmitter object.
    </niobject>

    <niobject name="NiPSEmitterRotSpeedCtlr" inherit="NiPSEmitterFloatCtlr" module="NiPSParticle" since="V20_5_0_0">
        Animates the rotation speed value on an NiPSEmitter object.
    </niobject>

    <niobject name="NiPSEmitterRotSpeedVarCtlr" inherit="NiPSEmitterFloatCtlr" module="NiPSParticle" since="V20_5_0_0">
        Animates the rotation speed variation value on an NiPSEmitter object.
    </niobject>

    <niobject name="NiPSEmitterLifeSpanCtlr" inherit="NiPSEmitterFloatCtlr" module="NiPSParticle" since="V20_5_0_0">
        Animates the lifespan value on an NiPSEmitter object.
    </niobject>

    <niobject name="NiPSResetOnLoopCtlr" inherit="NiTimeController" module="NiPSParticle" since="V20_5_0_0">
        Calls ResetParticleSystem on an NiPSParticleSystem target upon looping.
    </niobject>

    <!-- NiPS Colliders -->

    <enum name="ColliderType" storage="uint" since="V20_5_0_0">
        This is used by the Floodgate kernel to determine which NiPSColliderHelpers functions to call.
        <option value="0" name="COLLIDER_PLANAR" />
        <option value="1" name="COLLIDER_SPHERICAL" />
    </enum>

    <niobject name="NiPSCollider" inherit="NiObject" module="NiPSParticle" since="V20_5_0_0">
        Abstract base class for all particle colliders.
        <field name="Spawner" type="Ref" template="NiPSSpawner" />
        <field name="Type" type="ColliderType" />
        <field name="Active" type="bool" />
        <field name="Bounce" type="float" default="1.0" />
        <field name="Spawn on Collide" type="bool" />
        <field name="Die on Collide" type="bool" />
    </niobject>

    <niobject name="NiPSPlanarCollider" inherit="NiPSCollider" module="NiPSParticle" since="V20_5_0_0">
        A planar collider for particles.
        <field name="Width" type="float" default="1.0" />
        <field name="Height" type="float" default="1.0" />
        <field name="X Axis" type="Vector3" default="#X_AXIS#" />
        <field name="Y Axis" type="Vector3" default="#Y_AXIS#" />
        <field name="Collider Object" type="Ptr" template="NiAVObject" />
    </niobject>

    <niobject name="NiPSSphericalCollider" inherit="NiPSCollider" module="NiPSParticle" since="V20_5_0_0">
        A spherical collider for particles.
        <field name="Radius" type="float" default="1.0" />
        <field name="Collider Object" type="Ptr" template="NiAVObject" />
    </niobject>

    <niobject name="NiPSSpawner" inherit="NiObject" module="NiPSParticle" since="V20_5_0_0">
        Creates a new particle whose initial parameters are based on an existing particle.
        <field name="Master Particle System" type="Ptr" template="NiPSParticleSystem" since="20.6.1.0" />
        <field name="Percentage Spawned" type="float" default="1.0" />
        <field name="Spawn Speed Factor" type="float" default="1.0" since="20.6.1.0" />
        <field name="Spawn Speed Factor Var" type="float" />
        <field name="Spawn Dir Chaos" type="float" />
        <field name="Life Span" type="float" />
        <field name="Life Span Var" type="float" />
        <field name="Num Spawn Generations" type="ushort" default="1" />
        <field name="Min to Spawn" type="uint" default="1" />
        <field name="Max to Spawn" type="uint" default="1" />
    </niobject>

    <!-- NiPhysXPS -->

    <niobject name="NiPhysXPSParticleSystem" inherit="NiPSParticleSystem" module="NiPhysX" since="V20_5_0_0">
        Implements Gamebryo particle systems that use PhysX actors for the particles
        <field name="Prop" type="Ptr" template="NiPhysXPSParticleSystemProp" />
        <field name="Dest" type="Ptr" template="NiPhysXPSParticleSystemDest" />
        <field name="Scene" type="Ptr" template="NiPhysXScene" />
        <field name="PhysX Flags" type="byte" />
        <field name="Default Actor Pool Size" type="uint" />
        <field name="Generation Pool Size" type="uint" />
        <field name="Actor Pool Center" type="Vector3" />
        <field name="Actor Pool Dimensions" type="Vector3" />
        <field name="Actor" type="Ptr" template="NiPhysXActorDesc" />
    </niobject>

    <niobject name="NiPhysXPSParticleSystemProp" inherit="NiPhysXProp" module="NiPhysX" since="V20_5_0_0">
        A PhysX prop which holds information about a PhysX particle system prop.
        <field name="Num Systems" type="uint" />
        <field name="Systems" type="Ptr" template="NiPhysXPSParticleSystem" length="Num Systems" />
    </niobject>

    <niobject name="NiPhysXPSParticleSystemDest" inherit="NiPhysXDest" module="NiPhysX" since="V20_5_0_0">
        An object which interfaces between the PhysX scene and the Gamebryo particle system.
        <field name="Target" type="Ptr" template="NiPSParticleSystem" />
    </niobject>

    <niobject name="NiPhysXPSSimulator" inherit="NiPSSimulator" module="NiPhysX" since="V20_5_0_0">
        Adds additional sync points to a NiPSSimulator mesh modifier.
    </niobject>

    <niobject name="NiPhysXPSSimulatorInitialStep" inherit="NiPSSimulatorStep" module="NiPhysX" since="V20_5_0_0">
        Used to set the post-simulation state of particles in a physics-enabled particle system.
    </niobject>

    <niobject name="NiPhysXPSSimulatorFinalStep" inherit="NiPSSimulatorStep" module="NiPhysX" since="V20_5_0_0">
        Used to push the results of the particle system update into the PhysX actors.
    </niobject>

    <!-- NiEvaluator -->

    <niobject name="NiEvaluator" abstract="true" inherit="NiObject" module="NiAnimation" since="V20_5_0_0">
        <field name="Node Name" type="NiFixedString">The name of the animated NiAVObject.</field>
        <field name="Property Type" type="NiFixedString">The RTTI type of the NiProperty the controller is attached to, if applicable.</field>
        <field name="Controller Type" type="NiFixedString">The RTTI type of the NiTimeController.</field>
        <field name="Controller ID" type="NiFixedString">An ID that can uniquely identify the controller among others of the same type on the same NiObjectNET.</field>
        <field name="Interpolator ID" type="NiFixedString">An ID that can uniquely identify the interpolator among others of the same type on the same NiObjectNET.</field>
        <field name="Channel Types" type="byte" length="4">
            Channel Indices are BASE/POS = 0, ROT = 1, SCALE = 2, FLAG = 3
            Channel Types are:
             INVALID = 0, COLOR, BOOL, FLOAT, POINT3, ROT = 5
            Any channel may be | 0x40 which means POSED
            The FLAG (3) channel flags affects the whole evaluator:
             REFERENCED = 0x1, TRANSFORM = 0x2, ALWAYSUPDATE = 0x4, SHUTDOWN = 0x8
        </field>
    </niobject>

    <niobject name="NiKeyBasedEvaluator" abstract="true" inherit="NiEvaluator" module="NiAnimation" since="V20_5_0_0" />

    <niobject name="NiBoolEvaluator" inherit="NiKeyBasedEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Data" type="Ref" template="NiBoolData" />
    </niobject>

    <niobject name="NiBoolTimelineEvaluator" inherit="NiBoolEvaluator" module="NiAnimation" since="V20_5_0_0" />

    <niobject name="NiColorEvaluator" inherit="NiKeyBasedEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Data" type="Ref" template="NiColorData" />
    </niobject>

    <niobject name="NiFloatEvaluator" inherit="NiKeyBasedEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Data" type="Ref" template="NiFloatData" />
    </niobject>

    <niobject name="NiPoint3Evaluator" inherit="NiKeyBasedEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Data" type="Ref" template="NiPosData" />
    </niobject>

    <niobject name="NiQuaternionEvaluator" inherit="NiKeyBasedEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Data" type="Ref" template="NiRotData" />
    </niobject>

    <niobject name="NiTransformEvaluator" inherit="NiKeyBasedEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Value" type="NiQuatTransform" />
        <field name="Data" type="Ref" template="NiTransformData" />
    </niobject>

    <niobject name="NiConstBoolEvaluator" inherit="NiEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Value" type="float" default="#INV_FLT#">For floating point as boolean, 0.0 indicates false and 1.0 indicates true.</field>
    </niobject>

    <niobject name="NiConstColorEvaluator" inherit="NiEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Value" type="Color4" default="#INV_VEC4#" />
    </niobject>

    <niobject name="NiConstFloatEvaluator" inherit="NiEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Value" type="float" default="#INV_FLT#" />
    </niobject>

    <niobject name="NiConstPoint3Evaluator" inherit="NiEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Value" type="Vector3" default="#INV_VEC3#" />
    </niobject>

    <niobject name="NiConstQuaternionEvaluator" inherit="NiEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Value" type="Quaternion" default="#INV_VEC4#" />
    </niobject>

    <niobject name="NiConstTransformEvaluator" inherit="NiEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Value" type="NiQuatTransform" />
    </niobject>

    <niobject name="NiBSplineEvaluator" inherit="NiEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Start Time" type="float" default="#FLT_MAX#" />
        <field name="End Time" type="float" default="#FLT_MIN#" />
        <field name="Data" type="Ref" template="NiBSplineData" />
        <field name="Basis Data" type="Ref" template="NiBSplineBasisData" />
    </niobject>

    <niobject name="NiBSplineColorEvaluator" inherit="NiBSplineEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Handle" type="uint" default="0xFFFF">Handle into the data. (USHRT_MAX for invalid handle.)</field>
    </niobject>

    <niobject name="NiBSplineCompColorEvaluator" inherit="NiBSplineColorEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Offset" type="float" default="#FLT_MAX#" />
        <field name="Half Range" type="float" default="#FLT_MAX#" />
    </niobject>

    <niobject name="NiBSplineFloatEvaluator" inherit="NiBSplineEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Handle" type="uint" default="0xFFFF">Handle into the data. (USHRT_MAX for invalid handle.)</field>
    </niobject>

    <niobject name="NiBSplineCompFloatEvaluator" inherit="NiBSplineFloatEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Offset" type="float" default="#FLT_MAX#" />
        <field name="Half Range" type="float" default="#FLT_MAX#" />
    </niobject>

    <niobject name="NiBSplinePoint3Evaluator" inherit="NiBSplineEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Handle" type="uint" default="0xFFFF">Handle into the data. (USHRT_MAX for invalid handle.)</field>
    </niobject>

    <niobject name="NiBSplineCompPoint3Evaluator" inherit="NiBSplinePoint3Evaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Offset" type="float" default="#FLT_MAX#" />
        <field name="Half Range" type="float" default="#FLT_MAX#" />
    </niobject>

    <niobject name="NiBSplineTransformEvaluator" inherit="NiBSplineEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Transform" type="NiQuatTransform" />
        <field name="Translation Handle" type="uint" default="0xFFFF">Handle into the translation data. (USHRT_MAX for invalid handle.)</field>
        <field name="Rotation Handle" type="uint" default="0xFFFF">Handle into the rotation data. (USHRT_MAX for invalid handle.)</field>
        <field name="Scale Handle" type="uint" default="0xFFFF">Handle into the scale data. (USHRT_MAX for invalid handle.)</field>
    </niobject>

    <niobject name="NiBSplineCompTransformEvaluator" inherit="NiBSplineTransformEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Translation Offset" type="float" default="#FLT_MAX#" />
        <field name="Translation Half Range" type="float" default="#FLT_MAX#" />
        <field name="Rotation Offset" type="float" default="#FLT_MAX#" />
        <field name="Rotation Half Range" type="float" default="#FLT_MAX#" />
        <field name="Scale Offset" type="float" default="#FLT_MAX#" />
        <field name="Scale Half Range" type="float" default="#FLT_MAX#" />
    </niobject>

    <niobject name="NiLookAtEvaluator" inherit="NiEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Flags" type="LookAtFlags" />
        <field name="Look At Name" type="NiFixedString" />
        <field name="Driven Name" type="NiFixedString" />
        <field name="Interpolator: Translation" type="Ref" template="NiPoint3Interpolator" />
        <field name="Interpolator: Roll" type="Ref" template="NiFloatInterpolator" />
        <field name="Interpolator: Scale" type="Ref" template="NiFloatInterpolator" />
    </niobject>

    <niobject name="NiPathEvaluator" inherit="NiKeyBasedEvaluator" module="NiAnimation" since="V20_5_0_0">
        <field name="Flags" type="PathFlags" default="3" />
        <field name="Bank Dir" type="int" default="1">-1 = Negative, 1 = Positive</field>
        <field name="Max Bank Angle" type="float">Max angle in radians.</field>
        <field name="Smoothing" type="float" />
        <field name="Follow Axis" type="short">0, 1, or 2 representing X, Y, or Z.</field>
        <field name="Path Data" type="Ref" template="NiPosData" />
        <field name="Percent Data" type="Ref" template="NiFloatData" />
    </niobject>

    <niobject name="NiSequenceData" inherit="NiObject" module="NiAnimation" since="V20_5_0_0">
        Root node in Gamebryo .kf files (20.5.0.1 and up).
        For 20.5.0.0, "NiSequenceData" is an alias for "NiControllerSequence" and this is not handled in nifxml.
        This was not found in any 20.5.0.0 KFs available and they instead use NiControllerSequence directly.
        After 20.5.0.1, Controlled Blocks are no longer used and instead the sequences uses NiEvaluator.
        <field name="Name" type="NiFixedString" />
        <field name="Num Controlled Blocks" type="uint" until="20.5.0.1" />
        <field name="Array Grow By" type="uint" until="20.5.0.1" />
        <field name="Controlled Blocks" type="ControlledBlock" length="Num Controlled Blocks" until="20.5.0.1" />
        <field name="Num Evaluators" type="uint" since="20.5.0.2" />
        <field name="Evaluators" type="Ref" template="NiEvaluator" length="Num Evaluators" since="20.5.0.2" />
        <field name="Text Keys" type="Ref" template="NiTextKeyExtraData" />
        <field name="Duration" type="float" />
        <field name="Cycle Type" type="CycleType" />
        <field name="Frequency" type="float" default="1.0" />
        <field name="Accum Root Name" type="NiFixedString">The name of the NiAVObject serving as the accumulation root. This is where all accumulated translations, scales, and rotations are applied.</field>
        <field name="Accum Flags" type="AccumFlags" default="ACCUM_X_FRONT" />
    </niobject>

    <bitflags name="NiShadowGeneratorFlags" storage="ushort">
        Flags for NiShadowGenerator.
        Bit Patterns:
            AUTO_CALC_NEARFAR = (AUTO_NEAR_DIST | AUTO_FAR_DIST) = 0xC0
            AUTO_CALC_FULL = (AUTO_NEAR_DIST | AUTO_FAR_DIST | AUTO_DIR_LIGHT_FRUSTUM_WIDTH | AUTO_DIR_LIGHT_FRUSTUM_POSITION) = 0x3C0
        <option bit="0" name="DIRTY_SHADOWMAP" />
        <option bit="1" name="DIRTY_RENDERVIEWS" />
        <option bit="2" name="GEN_STATIC" />
        <option bit="3" name="GEN_ACTIVE" />
        <option bit="4" name="RENDER_BACKFACES" />
        <option bit="5" name="STRICTLY_OBSERVE_SIZE_HINT" />
        <option bit="6" name="AUTO_NEAR_DIST" />
        <option bit="7" name="AUTO_FAR_DIST" />
        <option bit="8" name="AUTO_DIR_LIGHT_FRUSTUM_WIDTH" />
        <option bit="9" name="AUTO_DIR_LIGHT_FRUSTUM_POSITION" />
    </bitflags>

    <niobject name="NiShadowGenerator" inherit="NiObject" module="NiMain">
        An NiShadowGenerator object is attached to an NiDynamicEffect object to inform the shadowing system that the effect produces shadows.
        <field name="Name" type="string" default="NiStandardShadowTechnique" />
        <field name="Flags" type="NiShadowGeneratorFlags" default="0x3DB" />
        <field name="Num Shadow Casters" type="uint" />
        <field name="Shadow Casters" type="Ref" template="NiNode" length="Num Shadow Casters" />
        <field name="Num Shadow Receivers" type="uint" />
        <field name="Shadow Receivers" type="Ref" template="NiNode" length="Num Shadow Receivers" />
        <field name="Target" type="Ptr" template="NiDynamicEffect" />
        <field name="Depth Bias" type="float" />
        <field name="Size Hint" type="ushort" default="1024" />
        <field name="Near Clipping Distance" type="float" since="20.3.0.7" />
        <field name="Far Clipping Distance" type="float" since="20.3.0.7" />
        <field name="Directional Light Frustum Width" type="float" since="20.3.0.7" />
    </niobject>

    <niobject name="NiFurSpringController" inherit="NiTimeController" module="NiCustom" versions="V10_2_0_0__1">
        Blood Bowl Specific
        Used on things like hair/tails in conjunction with bones to animate them.
        <field name="Unknown Float" type="float"></field>
        <field name="Unknown Float 2" type="float"></field>
        <field name="Num Bones" type="uint">The number of node bones referenced as influences.</field>
        <field name="Bones" type="Ptr" template="NiNode" length="Num Bones">List of all armature bones.</field>
        <field name="Num Bones 2" type="uint">The number of node bones referenced as influences.</field>
        <field name="Bones 2" type="Ptr" template="NiNode" length="Num Bones 2">List of all armature bones.</field>
    </niobject>

    <niobject name="CStreamableAssetData" inherit="NiObject" module="NiCustom" versions="V20_3_0_9 V20_3_0_9_DIV2">
        Divinity 2 specific block
        <field name="Root" type="Ref" template="NiNode" />
        <field name="Has Data" type="bool" />
        <field name="Data" type="ByteArray" cond="Has Data" />
        <field name="Num Refs" type="uint" />
        <field name="Refs" type="Ref" template="NiObject" length="Num Refs" />
    </niobject>

    <niobject name="bhkCompressedMeshShape" inherit="bhkShape" module="BSHavok" versions="#SKY_AND_LATER#">
        Compressed collision mesh.
        <field name="Target" type="Ptr" template="NiAVObject">Points to root node?</field>
        <field name="User Data" type="uint" />
        <field name="Radius" type="float" default="0.005">A shell that is added around the shape.</field>
        <field name="Unknown Float 1" type="float" />
        <field name="Scale" type="Vector4" default="#VEC4_1110#">Scale</field>
        <field name="Radius Copy" type="float" default="0.005">A shell that is added around the shape.</field>
        <field name="Scale Copy" type="Vector4" default="#VEC4_1110#">Scale</field>
        <field name="Data" type="Ref" template="bhkCompressedMeshShapeData">The collision mesh data.</field>
    </niobject>

    <enum name="hkWeldingType" storage="byte" prefix="WT">
        hkpWeldingUtility::WeldingType
        <option value="0" name="ANTICLOCKWISE" />
        <!--<option value="4" name="CLOCKWISE" />-->
        <!--<option value="5" name="TWO_SIDED" />-->
        <!--<option value="6" name="NONE" />-->
    </enum>

    <enum name="bhkCMSMatType" storage="byte" prefix="CMS">
        hkpCompressedMeshShape::MaterialType
        <option value="1" name="SINGLE_VALUE_PER_CHUNK">Chunk builder makes sure that only chunks with the same material are created.</option>
        <!--<option value="2" name="ONE_BYTE_PER_TRIANGLE" />-->
        <!--<option value="3" name="TWO_BYTES_PER_TRIANGLE" />-->
        <!--<option value="4" name="FOUR_BYTES_PER_TRIANGLE" />-->
    </enum>

    <niobject name="bhkCompressedMeshShapeData" inherit="bhkRefObject" module="BSHavok" versions="#SKY_AND_LATER#">
         A compressed mesh shape for collision in Skyrim.
		<field name="Bits Per Index" type="uint" default="17">Number of bits in the shape-key reserved for a triangle index</field>
		<field name="Bits Per W Index" type="uint" default="18">Number of bits in the shape-key reserved for a triangle index and its winding</field>
		<field name="Mask W Index" type="uint" default="0x3FFFF">Mask used to get the triangle index and winding from a shape-key/</field>
		<field name="Mask Index" type="uint" default="0x1FFFF">Mask used to get the triangle index from a shape-key.</field>
		<field name="Error" type="float" default="0.001">Quantization error.</field>
		<field name="AABB" type="hkAabb" />
		<field name="Welding Type" type="hkWeldingType" default="ANTICLOCKWISE" />
		<field name="Material Type" type="bhkCMSMatType" default="SINGLE_VALUE_PER_CHUNK" />
		<field name="Num Materials 32" type="uint" />
		<field name="Materials 32" type="uint" length="Num Materials 32">Unused.</field>
		<field name="Num Materials 16" type="uint" />
		<field name="Materials 16" type="uint" length="Num Materials 16">Unused.</field>
		<field name="Num Materials 8" type="uint" />
		<field name="Materials 8" type="uint" length="Num Materials 8">Unused.</field>
		<field name="Num Materials" type="uint" default="1" />
		<field name="Chunk Materials" type="bhkMeshMaterial" length="Num Materials">Materials used by Chunks. Chunks refer to this table by index.</field>
		<field name="Num Named Materials" type="uint">Number of hkpNamedMeshMaterial. Unused.</field>
		<field name="Num Transforms" type="uint" default="1">Number of chunk transformations</field>
        <field name="Chunk Transforms" type="bhkQsTransform" length="Num Transforms">Transforms used by Chunks. Chunks refer to this table by index.</field>
		<field name="Num Big Verts" type="uint" />
		<field name="Big Verts" type="Vector4" length="Num Big Verts">Vertices paired with Big Tris (triangles that are too large for chunks)</field>
        <field name="Num Big Tris" type="uint" />
        <field name="Big Tris" type="bhkCMSBigTri" length="Num Big Tris">Triangles that are too large to fit in a chunk.</field>
        <field name="Num Chunks" type="uint" default="1" />
        <field name="Chunks" type="bhkCMSChunk" length="Num Chunks" />
        <field name="Num Convex Piece A" type="uint">Number of hkpCompressedMeshShape::ConvexPiece. Unused.</field>
	</niobject>
	
    <niobject name="BSInvMarker" inherit="NiExtraData" module="BSMain" versions="#SKY_AND_LATER#">
    Orientation marker for Skyrim's inventory view.
        How to show the nif in the player's inventory.
        Typically attached to the root node of the nif tree.
        If not present, then Skyrim will still show the nif in inventory,
        using the default values.
        Name should be 'INV' (without the quotes).
        For rotations, a short of "4712" appears as "4.712" but "959" appears as "0.959"  meshes\weapons\daedric\daedricbowskinned.nif
        <field name="Rotation X" type="ushort" default="4712"></field>
        <field name="Rotation Y" type="ushort" default="6283"></field>
        <field name="Rotation Z" type="ushort" default="0"></field>
        <field name="Zoom" type="float" default="1.0">Zoom factor.</field>
    </niobject>

	<niobject name="BSBoneLODExtraData" inherit="NiExtraData" module="BSMain" versions="#SKY_AND_LATER#">
    Unknown
		<field name="BoneLOD Count" type="uint" default="3">Number of bone entries</field>
        <field name="BoneLOD Info" type="BoneLOD" length="BoneLOD Count">Bone Entry</field>
	</niobject>
	
	<niobject name="BSBehaviorGraphExtraData" inherit="NiExtraData" module="BSMain" versions="#SKY_AND_LATER#">
    Links a nif with a Havok Behavior .hkx animation file
		<field name="Behaviour Graph File" type="NiFixedString">Name of the hkx file.</field>
		<field name="Controls Base Skeleton" type="bool">Unknown, has to do with blending appended bones onto an actor.</field>
	</niobject>

	<niobject name="BSLagBoneController" inherit="NiTimeController" module="BSAnimation" versions="#SKY_AND_LATER#">
    A controller that trails a bone behind an actor.
		<field name="Linear Velocity" type="float" default="3.0" range="0.0:500.0">How long it takes to rotate about an actor back to rest position.</field>
		<field name="Linear Rotation" type="float" default="1.0" range="0.0:15.0">How the bone lags rotation</field>
		<field name="Maximum Distance" type="float" default="400.0" range="#F0_1000#">How far bone will tail an actor.</field>
	</niobject>

	<niobject name="BSLODTriShape" inherit="NiTriBasedGeom" module="BSMain" versions="#SKY# #SSE#">
		A variation on NiTriShape, for visibility control over vertex groups.
		<field name="LOD0 Size" type="uint" />
		<field name="LOD1 Size" type="uint" />
		<field name="LOD2 Size" type="uint" />
	</niobject>

	<niobject name="BSFurnitureMarkerNode" inherit="BSFurnitureMarker" module="BSMain" versions="#SKY_AND_LATER#">
        Furniture Marker for actors
    </niobject>
	
    <niobject name="BSLeafAnimNode" inherit="NiNode" module="BSMain" versions="#BETHESDA#">
        Unknown, related to trees.
    </niobject>
    
    <niobject name="BSTreeNode" inherit="NiNode" module="BSMain" versions="#BETHESDA#">
        Node for handling Trees, Switches branch configurations for variation?
        <field name="Num Bones 1" type="uint" default="1" />
        <field name="Bones 1" type="Ref" length="Num Bones 1" template="NiNode" />
        <field name="Num Bones 2" type="uint" default="3" />
        <field name="Bones" type="Ref" length="Num Bones 2" template="NiNode" />
    </niobject>
    
    
    <!-- Fallout 4 Geometry -->
    
    <niobject name="BSTriShape" inherit="NiAVObject" module="BSMain" versions="#SSE# #FO4# #F76#">
        Fallout 4 Tri Shape
        <field name="Bounding Sphere" type="NiBound" />
        <field name="Bound Min Max" type="float" length="6" vercond="#BS_F76#" />
        <field name="Skin" type="Ref" template="NiObject" />
        <field name="Shader Property" type="Ref" template="BSShaderProperty" />
        <field name="Alpha Property" type="Ref" template="NiAlphaProperty" />
        <field name="Vertex Desc" type="BSVertexDesc" />
        <field name="Num Triangles" type="uint" vercond="#BS_GTE_FO4#" />
        <field name="Num Triangles" type="ushort" vercond="#NI_BS_LT_FO4#" />
        <field name="Num Vertices" type="ushort" />
        <field name="Data Size" type="uint" calc="((Vertex Desc #BITAND# 0xF) #MUL# Num Vertices #MUL# 4) #ADD# (Num Triangles #MUL# 6)" />
        <field name="Vertex Data" type="BSVertexData" length="Num Vertices" arg="Vertex Desc #RSH# 44" cond="Data Size #GT# 0" vercond="#BS_GTE_FO4#" />
        <field name="Vertex Data" type="BSVertexDataSSE" length="Num Vertices" arg="Vertex Desc #RSH# 44" cond="Data Size #GT# 0" vercond="#BS_SSE#" />
        <field name="Triangles" type="Triangle" length="Num Triangles" cond="Data Size #GT# 0" />
        <field name="Particle Data Size" type="uint" calc="(Num Vertices #MUL# 6) #ADD# (Num Triangles #MUL# 3)" vercond="#BS_SSE#" />
        <field name="Particle Vertices" type="HalfVector3" length="Num Vertices" cond="Particle Data Size #GT# 0" vercond="#BS_SSE#" />
        <field name="Particle Normals" type="HalfVector3" length="Num Vertices" cond="Particle Data Size #GT# 0" vercond="#BS_SSE#" />
        <field name="Particle Triangles" type="Triangle" length="Num Triangles" cond="Particle Data Size #GT# 0" vercond="#BS_SSE#" />
    </niobject>

    <niobject name="BSMeshLODTriShape" inherit="BSTriShape" module="BSMain" versions="#FO4#">
        Fallout 4 LOD Tri Shape
        <field name="LOD0 Size" type="uint" />
        <field name="LOD1 Size" type="uint" />
        <field name="LOD2 Size" type="uint" />
    </niobject>
    
    <compound name="BSGeometryPerSegmentSharedData" size="16" versions="#FO4# #F76#">
        <field name="User Index" type="uint">If Bone ID is 0xffffffff, this value refers to the Segment at the listed index. Otherwise this is the "Biped Object", which is like the body part types in Skyrim and earlier.</field>
        <field name="Bone ID" type="uint" default="#UINT_MAX#">A hash of the bone name string.</field>
        <field name="Num Cut Offsets" type="uint" range="0:8">Maximum of 8.</field>
        <field name="Cut Offsets" type="float" length="Num Cut Offsets" />
    </compound>

    <compound name="BSGeometrySegmentSharedData" versions="#FO4# #F76#">
        <field name="Num Segments" type="uint" />
        <field name="Total Segments" type="uint" />
        <field name="Segment Starts" type="uint" length="Num Segments" />
        <field name="Per Segment Data" type="BSGeometryPerSegmentSharedData" length="Total Segments" />>
        <field name="SSF File" type="SizedString16" />
    </compound>

    <niobject name="BSSubIndexTriShape" inherit="BSTriShape" module="BSMain" versions="#SSE# #FO4# #F76#">
        Fallout 4 Sub-Index Tri Shape
		<field name="Num Primitives" type="uint" calc="#LEN[Triangles]#" vercond="#BS_GTE_FO4#" cond="Data Size #GT# 0" />
		<field name="Num Segments" type="uint" vercond="#BS_GTE_FO4#" cond="Data Size #GT# 0" />
		<field name="Total Segments" type="uint" vercond="#BS_GTE_FO4#" cond="Data Size #GT# 0" />
		<field name="Segment" type="BSGeometrySegmentData" vercond="#BS_GTE_FO4#" length="Num Segments" cond="Data Size #GT# 0" />
		<field name="Segment Data" type="BSGeometrySegmentSharedData" vercond="#BS_GTE_FO4#" cond="(Num Segments #LT# Total Segments) #AND# (Data Size #GT# 0)" />
		<field name="Num Segments" type="uint" vercond="#BS_SSE#" />
		<field name="Segment" type="BSGeometrySegmentData" vercond="#BS_SSE#" length="Num Segments" />
    </niobject>
    
    <!-- Fallout 4 Physics -->

    <niobject name="bhkSystem" abstract="true" inherit="NiObject" module="BSHavok" versions="#FO4# #F76#">
        Fallout 4 Physics System
    </niobject>

    <niobject name="bhkNPCollisionObject" inherit="NiCollisionObject" module="BSHavok" versions="#FO4# #F76#">
        Fallout 4 Collision Object
        <field name="Flags" type="bhkCOFlags" default="0x80">
            Note: The CK Preview scenegraph reports these bits incorrectly.
        </field>
        <field name="Data" type="Ref" template="bhkSystem" />
        <field name="Body ID" type="uint" />
    </niobject>
    
    <niobject name="bhkPhysicsSystem" inherit="bhkSystem" module="BSHavok" versions="#FO4# #F76#">
        Fallout 4 Collision System
        <field name="Binary Data" type="ByteArray" />
    </niobject>

    <niobject name="bhkRagdollSystem" inherit="bhkSystem" module="BSHavok" versions="#FO4# #F76#">
        Fallout 4 Ragdoll System
        <field name="Binary Data" type="ByteArray" />
    </niobject>

    <niobject name="BSExtraData" inherit="NiExtraData" module="BSMain" versions="#FO4# #F76#">
        Fallout 4 Extra Data
    </niobject>

    <niobject name="BSClothExtraData" inherit="BSExtraData" module="BSMain" versions="#FO4# #F76#">
        Fallout 4 Cloth data
        <field name="Binary Data" type="ByteArray" />
    </niobject>
    
    <!-- Fallout 4 Skeleton -->

    <compound name="BSSkinBoneTrans" size="68" versions="#FO4# #F76#">
        Fallout 4 Bone Transform
        <field name="Bounding Sphere" type="NiBound" />
        <field name="Rotation" type="Matrix33" />
        <field name="Translation" type="Vector3" />
        <field name="Scale" type="float" />
    </compound>

    <niobject name="BSSkin::Instance" inherit="NiObject" module="BSMain" versions="#FO4# #F76#">
        Fallout 4 Skin Instance
        <field name="Skeleton Root" type="Ptr" template="NiAVObject" />
        <field name="Data" type="Ref" template="BSSkin::BoneData" />
        <field name="Num Bones" type="uint" />
        <field name="Bones" type="Ptr" template="NiNode" length="Num Bones" />
        <field name="Num Scales" type="uint" />
        <field name="Scales" type="Vector3" length="Num Scales" />
    </niobject>

    <niobject name="BSSkin::BoneData" inherit="NiObject" module="BSMain" versions="#FO4# #F76#">
        Fallout 4 Bone Data
        <field name="Num Bones" type="uint" />
        <field name="Bone List" type="BSSkinBoneTrans" length="Num Bones" />
    </niobject>

    <niobject name="BSPositionData" inherit="NiExtraData" module="BSMain" versions="#FO4# #F76#">
        Fallout 4 Positional Data
        <field name="Num Data" type="uint" />
        <field name="Data" type="hfloat" length="Num Data" />
    </niobject>

    <compound name="BSConnectPoint" versions="#FO4# #F76#">
        <field name="Parent" type="SizedString" default="WorkshopConnectPoints" />
        <field name="Name" type="SizedString" />
        <field name="Rotation" type="Quaternion" />
        <field name="Translation" type="Vector3" />
        <field name="Scale" type="float" default="1.0" />
    </compound>

    <niobject name="BSConnectPoint::Parents" inherit="NiExtraData" module="BSMain" versions="#FO4# #F76#">
        Fallout 4 Item Slot Parent
        <field name="Num Connect Points" type="uint" default="1" />
        <field name="Connect Points" type="BSConnectPoint" length="Num Connect Points" />
    </niobject>

    <niobject name="BSConnectPoint::Children" inherit="NiExtraData" module="BSMain" versions="#FO4# #F76#">
        Fallout 4 Item Slot Child
        <field name="Skinned" type="bool" />
        <field name="Num Points" type="uint" default="1" />
        <field name="Point Name" type="SizedString" length="Num Points" />
    </niobject>
    
    <niobject name="BSEyeCenterExtraData" inherit="NiExtraData" module="BSMain" versions="#FO4# #F76#">
        Fallout 4 Eye Center Data
        <field name="Num Data" type="uint" />
        <field name="Data" type="float" length="Num Data" />
    </niobject>
	
    <compound name="BSPackedGeomDataCombined" size="72" versions="#FO4# #F76#">
        <field name="Grayscale to Palette Scale" type="float" />
        <field name="Transform" type="NiTransform" />
        <field name="Bounding Sphere" type="NiBound" />
    </compound>

    <compound name="BSPackedGeomData" versions="#FO4# #F76#">
        <field name="Num Verts" type="uint" />
        <field name="LOD Levels" type="uint" />
        <field name="Tri Count LOD0" type="uint" />
        <field name="Tri Offset LOD0" type="uint" />
        <field name="Tri Count LOD1" type="uint" />
        <field name="Tri Offset LOD1" type="uint" />
        <field name="Tri Count LOD2" type="uint" />
        <field name="Tri Offset LOD2" type="uint" />
        <field name="Num Combined" type="uint" />
        <field name="Combined" type="BSPackedGeomDataCombined" length="Num Combined" />
        <field name="Vertex Desc" type="BSVertexDesc" />
        <field name="Vertex Data" type="BSVertexData" length="Num Verts" arg="Vertex Desc #RSH# 44" />
        <field name="Triangles" type="Triangle" length="Tri Count LOD0 + Tri Count LOD1 + Tri Count LOD2" />
    </compound>

    <compound name="BSPackedSharedGeomData" versions="#FO4# #F76#">
        <field name="Num Verts" type="uint" />
        <field name="LOD Levels" type="uint" />
        <field name="Tri Count LOD0" type="uint" />
        <field name="Tri Offset LOD0" type="uint" />
        <field name="Tri Count LOD1" type="uint" />
        <field name="Tri Offset LOD1" type="uint" />
        <field name="Tri Count LOD2" type="uint" />
        <field name="Tri Offset LOD2" type="uint" />
        <field name="Num Combined" type="uint" />
        <field name="Combined" type="BSPackedGeomDataCombined" length="Num Combined" />
        <field name="Vertex Desc" type="BSVertexDesc" />
    </compound>

    <compound name="BSPackedGeomObject" size="8" versions="#FO4# #F76#">
        This is the data necessary to access the shared geometry in a PSG/CSG file.
        <field name="Filename Hash" type="uint">BSCRC32 of the filename without the PSG/CSG extension.</field>
        <field name="Data Offset" type="uint">Offset of the geometry data in the PSG/CSG file.</field>
    </compound>

    <niobject name="BSPackedCombinedGeomDataExtra" inherit="NiExtraData" module="BSMain" versions="#FO4# #F76#">
        Fallout 4 Packed Combined Geometry Data.
        Geometry is baked into the file and given a list of transforms to position each copy.
        <field name="Vertex Desc" type="BSVertexDesc" />
        <field name="Num Vertices" type="uint" />
        <field name="Num Triangles" type="uint" />
        <field name="Unknown Flags 1" type="uint" />
        <field name="Unknown Flags 2" type="uint" />
        <field name="Num Data" type="uint" />
        <field name="Object Data" type="BSPackedGeomData" length="Num Data" />
    </niobject>

    <niobject name="BSPackedCombinedSharedGeomDataExtra" inherit="NiExtraData" module="BSMain" versions="#FO4# #F76#">
        Fallout 4 Packed Combined Shared Geometry Data.
        Geometry is NOT baked into the file. It is instead a reference to the geometry via a CSG filename hash and data offset.
        <field name="Vertex Desc" type="BSVertexDesc" />
        <field name="Num Vertices" type="uint" />
        <field name="Num Triangles" type="uint" />
        <field name="Unknown Flags 1" type="uint" />
        <field name="Unknown Flags 2" type="uint" />
        <field name="Num Data" type="uint" />
        <field name="Object" type="BSPackedGeomObject" length="Num Data" />
        <field name="Object Data" type="BSPackedSharedGeomData" length="Num Data" />
    </niobject>

    <!-- Fallout 4 Animation -->
    
    <niobject name="NiLightRadiusController" inherit="NiFloatInterpController" module="BSAnimation" versions="#FO4# #F76#">
    
    </niobject>
	
	<!-- Skyrim SE --> 

	<niobject name="BSDynamicTriShape" inherit="BSTriShape" module="BSMain" versions="#SSE#">
		<field name="Dynamic Data Size" type="uint" calc="Num Vertices #MUL# 16" />
		<field name="Vertices" type="Vector4" length="Dynamic Data Size / 16" />
	</niobject>
	
	<niobject name="BSDistantObjectLargeRefExtraData" inherit="NiExtraData" module="BSMain" versions="#SSE#">
        Large ref flag.
		<field name="Large Ref" type="bool" />
	</niobject>

    <niobject name="BSDistantObjectExtraData" inherit="NiExtraData" module="BSMain" versions="#F76#">
        Distant Object flags.
        <field name="Distant Object Flags" type="uint" />
    </niobject>

    <!-- FO76 -->

    <compound name="BSResourceID" module="BSMain" size="12" versions="#F76#">
        <field name="File Hash" type="uint" />
        <field name="Extension" type="char" length="4" />
        <field name="Directory Hash" type="uint" />
    </compound>

    <compound name="BSDistantObjectUnknown" module="BSMain" size="12" versions="#F76#">
        <field name="Unknown 1" type="uint64" />
        <field name="Unknown 2" type="uint" />
    </compound>

    <compound name="BSDistantObjectInstance" module="BSMain" versions="#F76#">
        <field name="Resource ID" type="BSResourceID" />
        <field name="Num Unknown Data" type="uint" />
        <field name="Unknown Data" type="BSDistantObjectUnknown" length="Num Unknown Data" />
        <field name="Num Transforms" type="uint" />
        <field name="Transforms" type="Matrix44" length="Num Transforms" />
    </compound>

    <compound name="BSShaderTextureArray" module="BSMain" versions="#F76#">
        <field name="Unknown Byte" type="byte" default="1" />
        <field name="Num Texture Arrays" type="uint" />
        <field name="Texture Arrays" type="BSTextureArray" length="Num Texture Arrays" />
    </compound>

    <niobject name="BSDistantObjectInstancedNode" inherit="BSMultiBoundNode" module="BSMain" versions="#F76#">
        <field name="Num Instances" type="uint" />
        <field name="Instances" type="BSDistantObjectInstance" length="Num Instances" />
        <field name="Texture Arrays" type="BSShaderTextureArray" length="3" />
    </niobject>

    <niobject name="BSCollisionQueryProxyExtraData" inherit="BSExtraData" module="BSMain" versions="#F76#">
        Fallout 76 Collision Query Proxy Data
        <field name="Binary Data" type="ByteArray" />
    </niobject>

</niftoolsxml>
