<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE niftoolsxml>
<niftoolsxml version="0.7.0.0">
    <!--These are the version numbers marked as supported by NifSkope.
        The num argument is the numeric representation created by storing
        each part of the version in a byte.  For example, 4.0.0.2 is
        0x04000002 and 10.1.0.0 is 0x0A010000.-->

    <version num="2.3">Dark Age of Camelot</version>
    <version num="3.0">Star Trek: Bridge Commander</version>
    <version num="3.03">Dark Age of Camelot</version>
    <version num="3.1">Dark Age of Camelot, Star Trek: Bridge Commander</version>
    <version num="3.3.0.13">Oblivion</version>
    <version num="4.0.0.0">Freedom Force</version>
    <version num="4.0.0.2">Morrowind, Freedom Force</version>
    <version num="4.1.0.12">Dark Age of Camelot</version>
    <version num="4.2.0.2">Civilization IV</version>
    <version num="4.2.1.0">Dark Age of Camelot, Civilization IV</version>
    <version num="4.2.2.0">Dark Age of Camelot, Civilization IV, Empire Earth II, Culpa Innata</version>
    <version num="10.0.1.0">Zoo Tycoon 2, Civilization IV</version>
    <version num="10.0.1.2">Oblivion</version>
    <version num="10.0.1.3">?</version>
    <version num="10.1.0.0">Dark Age of Camelot, Civilization IV, Freedom Force vs. the 3rd Reich, Axis and Allies, Kohan 2, Entropia Universe, Wildlife Park 2, The Guild 2, NeoSteam</version>
    <version num="10.1.0.101">Oblivion</version>
    <version num="10.1.0.106">Oblivion</version>
    <version num="10.2.0.0">Civilization IV, Oblivion, Loki, Pro Cycling Manager, Prison Tycoon, Red Ocean, Wildlife Park 2</version>
    <version num="10.2.0.1">Worldshift</version>
    <version num="10.4.0.1">Worldshift</version>
    <version num="20.0.0.4">Civilization IV, Oblivion, Sid Meier's Railroads</version>
    <version num="20.0.0.5">Oblivion</version>
    <version num="20.1.0.3">Megami Tensei: Imagine</version>
    <version num="20.2.0.7">Emerge, Empire Earth III, Fallout 3</version>
    <version num="20.2.0.8">Emerge, Empire Earth III, Atlantica</version>
    <!-- version 20.3.0.1 is found in Props/GDCLargeContainer.nif-->
    <version num="20.3.0.1">Emerge</version>
    <!-- version 20.3.0.2 is found in PFX/fx_muzzle_flash_example.nif -->
    <version num="20.3.0.2">Emerge</version>
    <version num="20.3.0.3">Emerge</version>
    <version num="20.3.0.6">Emerge</version>
    <version num="20.3.0.9">Warhammer, Lazeska</version>

    <!--Basic Types-->

    <basic name="bool" count="1" niflibtype="bool" nifskopetype="bool">
        A boolean; 32-bit from 4.0.0.2, and 8-bit from 4.1.0.1 on.
    </basic>

    <basic name="byte" count="1" niflibtype="byte" nifskopetype="byte">
        An unsigned 8-bit integer.
    </basic>

    <basic name="uint" count="1" niflibtype="unsigned int" nifskopetype="uint">
        An unsigned 32-bit integer.
    </basic>

    <basic name="ushort" count="1" niflibtype="unsigned short" nifskopetype="ushort">
        An unsigned 16-bit integer.
    </basic>

    <basic name="int" count="1" niflibtype="int" nifskopetype="int">
        A signed 32-bit integer.
    </basic>

    <basic name="short" count="1" niflibtype="short" nifskopetype="short">
        A signed 16-bit integer.
    </basic>

    <basic name="BlockTypeIndex" count="0" niflibtype="unsigned short" nifskopetype="blocktypeindex">
        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="char" count="0" niflibtype="byte" nifskopetype="char">
        An 8-bit character.
    </basic>

    <basic name="FileVersion" count="0" niflibtype="unsigned int" nifskopetype="fileversion">
        A 32-bit integer that stores the version in hexadecimal format with each byte representing a number in the version string.

        Known 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="Flags" count="0" niflibtype="unsigned short" nifskopetype="flags">
        A 16-bit integer, used for bit flags.  Function varies by object type.
    </basic>

    <basic name="float" count="0" niflibtype="float" nifskopetype="float">
        A standard 32-bit floating point number.
    </basic>

    <basic name="HeaderString" count="0" niflibtype="HeaderString" nifskopetype="headerstring">
        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:  &#039;NetImmerse File Format&#039;
        Version &gt;= 10.1.0.0:  &#039;Gamebryo File Format&#039;
    </basic>

    <basic name="LineString" count="0" niflibtype="LineString" nifskopetype="linestring">
        A variable length string that ends with a newline character (0x0A).
    </basic>

    <basic name="Ptr" count="0" niflibtype="*" nifskopetype="uplink" istemplate="1">
        A signed 32-bit integer, referring to a object before this one in the hierarchy.  Examples:  Bones, gravity objects.
    </basic>

    <basic name="Ref" count="0" niflibtype="Ref" nifskopetype="link" istemplate="1">
        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" count="0" niflibtype="unsigned int" nifskopetype="stringoffset">
        A 32-bit unsigned integer, used to refer to strings in a NiStringPalette.
    </basic>

    <basic name="StringIndex" count="0" niflibtype="IndexString" nifskopetype="stringindex">
        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 compounts or niobjects.-->

    <enum name="AlphaFormat" storage="uint">
        An unsigned 32-bit integer, describing how transparency is handled in a texture.
        <option value="0" name="ALPHA_NONE">No alpha blending; the texture is fully opaque.</option>
        <option value="1" name="ALPHA_BINARY">Texture is either fully transparent or fully opaque.  There are no partially transparent areas.</option>
        <option value="2" name="ALPHA_SMOOTH">Full range of alpha values can be used from fully transparent to fully opaque including all partially transparent values in between.</option>
        <option value="3" name="ALPHA_DEFAULT">Use default setting.</option>
    </enum>

    <enum name="ApplyMode" storage="uint">
        An unsigned 32-bit integer, describing the apply mode of a texture.
        <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">PS2 Only.  Function Unknown.</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="UNKNOWN2_MAP">Unknown 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="UNKNOWN_KEY">Unknown.  Step function?</option>
    </enum>

    <enum name="LightMode" storage="uint">
        An unsigned 32-bit integer, describing how vertex colors influence lighting.
        <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="HavokMaterial" storage="uint">
        A material, used by havok shape objects.
        <option value="0" name="HAV_MAT_STONE">Stone</option>
        <option value="1" name="HAV_MAT_CLOTH">Cloth</option>
        <option value="2" name="HAV_MAT_DIRT">Dirt</option>
        <option value="3" name="HAV_MAT_GLASS">Glass</option>
        <option value="4" name="HAV_MAT_GRASS">Grass</option>
        <option value="5" name="HAV_MAT_METAL">Metal</option>
        <option value="6" name="HAV_MAT_ORGANIC">Organic</option>
        <option value="7" name="HAV_MAT_SKIN">Skin</option>
        <option value="8" name="HAV_MAT_WATER">Water</option>
        <option value="9" name="HAV_MAT_WOOD">Wood</option>
        <option value="10" name="HAV_MAT_HEAVY_STONE">Heavy Stone</option>
        <option value="11" name="HAV_MAT_HEAVY_METAL">Heavy Metal</option>
        <option value="12" name="HAV_MAT_HEAVY_WOOD">Heavy Wood</option>
        <option value="13" name="HAV_MAT_CHAIN">Chain</option>
        <option value="14" name="HAV_MAT_SNOW">Snow</option>
        <option value="15" name="HAV_MAT_STONE_STAIRS">Stone Stairs</option>
        <option value="16" name="HAV_MAT_CLOTH_STAIRS">Cloth Stairs</option>
        <option value="17" name="HAV_MAT_DIRT_STAIRS">Dirt Stairs</option>
        <option value="18" name="HAV_MAT_GLASS_STAIRS">Glass Stairs</option>
        <option value="19" name="HAV_MAT_GRASS_STAIRS">Grass Stairs</option>
        <option value="20" name="HAV_MAT_METAL_STAIRS">Metal Stairs</option>
        <option value="21" name="HAV_MAT_ORGANIC_STAIRS">Organic Stairs</option>
        <option value="22" name="HAV_MAT_SKIN_STAIRS">Skin Stairs</option>
        <option value="23" name="HAV_MAT_WATER_STAIRS">Water Stairs</option>
        <option value="24" name="HAV_MAT_WOOD_STAIRS">Wood Stairs</option>
        <option value="25" name="HAV_MAT_HEAVY_STONE_STAIRS">Heavy Stone Stairs</option>
        <option value="26" name="HAV_MAT_HEAVY_METAL_STAIRS">Heavy Metal Stairs</option>
        <option value="27" name="HAV_MAT_HEAVY_WOOD_STAIRS">Heavy Wood Stairs</option>
        <option value="28" name="HAV_MAT_CHAIN_STAIRS">Chain Stairs</option>
        <option value="29" name="HAV_MAT_SNOW_STAIRS">Snow Stairs</option>
        <option value="30" name="HAV_MAT_ELEVATOR">Elevator</option>
    </enum>

    <enum name="OblivionLayer" storage="byte">
        Sets mesh color in Oblivion Construction Set.  Anything higher than 57 is also null.
        <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="MipMapFormat" storage="uint">
        An unsigned 32-bit integer, describing how mipmaps are handled in a texture.
        <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="PixelFormat" storage="uint">
        Specifies the pixel format used by the NiPixelData object to store a texture.
        <option value="0" name="PX_FMT_RGB8">24-bit color: uses 8 bit to store each red, blue, and green component.</option>
        <option value="1" name="PX_FMT_RGBA8">32-bit color with alpha: uses 8 bits to store each red, blue, green, and alpha component.</option>
        <option value="2" name="PX_FMT_PAL8">8-bit palette index: uses 8 bits to store an index into the palette stored in a NiPallete object.</option>
        <option value="4" name="PX_FMT_DXT1">DXT1 compressed texture.</option>
        <option value="5" name="PX_FMT_DXT5">DXT5 compressed texture.</option>
        <option value="6" name="PX_FMT_DXT5_ALT">DXT5 compressed texture. It is not clear what the difference is with PX_FMT_DXT5.</option>
    </enum>

    <enum name="PixelLayout" storage="uint">
        An unsigned 32-bit integer, describing the color depth of a texture.
        <option value="0" name="PIX_LAY_PALETTISED">Texture is in 8-bit paletized format.</option>
        <option value="1" name="PIX_LAY_HIGH_COLOR_16">Texture is in 16-bit high color format.</option>
        <option value="2" name="PIX_LAY_TRUE_COLOR_32">Texture is in 32-bit true color format.</option>
        <option value="3" name="PIX_LAY_COMPRESSED">Texture is compressed.</option>
        <option value="4" name="PIX_LAY_BUMPMAP">Texture is a grayscale bump map.</option>
        <option value="5" name="PIX_LAY_PALETTISED_4">Texture is in 4-bit paletized format.</option>
        <option value="6" name="PIX_LAY_DEFAULT">Use default setting.</option>
    </enum>

    <enum name="TexClampMode" storage="uint">
        Specifies the availiable texture clamp modes.  That is, the behavior of pixels outside the range of the texture.
        <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">
        Specifies the availiable texture filter modes.  That is, the way pixels within a texture are blended together when textures are displayed on the screen at a size other than their original dimentions.
        <option value="0" name="FILTER_NEAREST">Simply uses the nearest pixel.  Very grainy.</option>
        <option value="1" name="FILTER_BILERP">Uses bilinear filtering.</option>
        <option value="2" name="FILTER_TRILERP">Uses trilinear filtering.</option>
        <option value="3" name="FILTER_NEAREST_MIPNEAREST">Uses the nearest pixel from the mipmap that is closest to the display size.</option>
        <option value="4" name="FILTER_NEAREST_MIPLERP">Blends the two mipmaps closest to the display size linearly, and then uses the nearest pixel from the result.</option>
        <option value="5" name="FILTER_BILERP_MIPNEAREST">Uses the closest mipmap to the display size and then uses bilinear filtering on the pixels.</option>
    </enum>

    <enum name="VertMode" storage="uint">
        An unsigned 32-bit integer, which describes how to apply vertex colors.
        <option value="0" name="VERT_MODE_SRC_IGNORE">Source Ignore.</option>
        <option value="1" name="VERT_MODE_SRC_EMISSIVE">Source Emissive.</option>
        <option value="2" name="VERT_MODE_SRC_AMB_DIF">Source 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&#039;s 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.
        <option value="0" name="ALWAYS_FACE_CAMERA">The billboard will always face the camera.</option>
        <option value="1" name="ROTATE_ABOUT_UP">The billboard will only rotate around the up axis.</option>
        <option value="2" name="RIGID_FACE_CAMERA">Rigid Face Camera.</option>
        <option value="3" name="ALWAYS_FACE_CENTER">Always Face Center.</option>
        <option value="4" name="RIGID_FACE_CENTER">Rigid Face Center.</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="StencilCompareMode" storage="uint">
        This enum contains the options for doing stencil buffer tests.
        <option value="0" name="TEST_NEVER">Test will allways return false. Nothing is drawn at all.</option>
        <option value="1" name="TEST_LESS">The test will only succeed if the pixel is nearer than the previous pixel.</option>
        <option value="2" name="TEST_EQUAL">Test will only succeed if the z value of the pixel to be drawn is equal to the value of the previous drawn pixel.</option>
        <option value="3" name="TEST_LESS_EQUAL">Test will succeed if the z value of the pixel to be drawn is smaller than or equal to the value in the Stencil Buffer.</option>
        <option value="4" name="TEST_GREATER">Opposite of TEST_LESS.</option>
        <option value="5" name="TEST_NOT_EQUAL">Test will succeed if the z value of the pixel to be drawn is NOT equal to the value of the previously drawn pixel.</option>
        <option value="6" name="TEST_GREATER_EQUAL">Opposite of TEST_LESS_EQUAL.</option>
        <option value="7" name="TEST_ALWAYS">Test will allways succeed. The Stencil Buffer value is ignored.</option>
    </enum>

    <enum name="ZCompareMode" storage="uint">
        This enum contains the options for doing z buffer tests.
        <option value="0" name="TEST_ALWAYS">Test will allways succeed. The Z Buffer value is ignored.</option>
        <option value="1" name="TEST_LESS">The test will only succeed if the pixel is nearer than the previous pixel.</option>
        <option value="2" name="TEST_EQUAL">Test will only succeed if the z value of the pixel to be drawn is equal to the value of the previous drawn pixel.</option>
        <option value="3" name="TEST_LESS_EQUAL">Test will succeed if the z value of the pixel to be drawn is smaller than or equal to the value in the Z Buffer.</option>
        <option value="4" name="TEST_GREATER">Opposite of TEST_LESS.</option>
        <option value="5" name="TEST_NOT_EQUAL">Test will succeed if the z value of the pixel to be drawn is NOT equal to the value of the previously drawn pixel.</option>
        <option value="6" name="TEST_GREATER_EQUAL">Opposite of TEST_LESS_EQUAL.</option>
        <option value="7" name="TEST_NEVER">Test will allways return false. Nothing is drawn at all.</option>
    </enum>

    <enum name="StencilAction" storage="uint">
        This enum defines the various actions used in conjunction with the stencil buffer.
        For a detailed description of the individual options please refer to the OpenGL docs.
        <option value="0" name="ACTION_KEEP" />
        <option value="1" name="ACTION_ZERO" />
        <option value="2" name="ACTION_REPLACE" />
        <option value="3" name="ACTION_INCREMENT" />
        <option value="4" name="ACTION_DECREMENT" />
        <option value="5" name="ACTION_INVERT" />
    </enum>

    <enum name="FaceDrawMode" storage="uint">
        This enum lists the different face culling options.
        <option value="0" name="DRAW_CCW_OR_BOTH">use application defaults?</option>
        <option value="1" name="DRAW_CCW">Draw counter clock wise faces, cull clock wise faces. This is the default for most (all?) Nif Games so far.</option>
        <option value="2" name="DRAW_CW">Draw clock wise faces, cull counter clock wise faces. This will flip all the faces.</option>
        <option value="3" name="DRAW_BOTH">Draw double sided faces.</option>
    </enum>

    <enum name="MotionSystem" storage="byte">
        The motion system. 4 (Box) is used for everything movable. 7 (Keyframed) is used on statics and animated stuff.

        <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">Simulation is performed using a sphere inertia tensor.</option>
        <option value="3" name="MO_SYS_SPHERE_INERTIA">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">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="DeactivatorType" storage="byte">
        <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="SolverDeactivation" storage="byte">
        A list of possible solver deactivation settings. This value defines how the
        solver deactivates objects. The solver works on a per object basis.
        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="MotionQuality" storage="byte">
        The motion type. Determines quality of motion?
        <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">Use this for fixed bodies. </option>
        <option value="2" name="MO_QUAL_KEYFRAMED">Use this for moving objects with infinite mass.</option>
        <option value="3" name="MO_QUAL_DEBRIS">Use this for all your debris objects</option>
        <option value="4" name="MO_QUAL_MOVING">Use this for moving bodies, which should not leave the world.</option>
        <option value="5" name="MO_QUAL_CRITICAL">Use this for all objects, which you cannot afford to tunnel through the world at all</option>
        <option value="6" name="MO_QUAL_BULLET">Use this for very fast objects </option>
        <option value="7" name="MO_QUAL_USER">For user.</option>
        <option value="8" name="MO_QUAL_CHARACTER">Use this for rigid body character controllers</option>
        <option value="9" name="MO_QUAL_KEYFRAMED_REPORT">
            Use this for moving objects with infinite mass which should report contact points and Toi-collisions against all other bodies, including other fixed and keyframed bodies.
        </option>
    </enum>

    <enum name="ForceType" storage="uint">
        The type of force?  May be more valid values.
        <option value="0" name="FORCE_PLANAR"></option>
        <option value="1" name="FORCE_SPHERICAL"></option>
        <option value="2" name="FORCE_UNKNOWN"></option>
    </enum>

    <enum name="TexTransform" storage="uint">
        Determines how a NiTextureTransformController animates the UV coordinates.
        <option value ="0" name="TT_TRANSLATE_U">Means this controller moves the U texture cooridnates.</option>
        <option value ="1" name="TT_TRANSLATE_V">Means this controller moves the V texture cooridnates.</option>
        <option value ="2" name="TT_ROTATE">Means this controller roates the UV texture cooridnates.</option>
        <option value ="3" name="TT_SCALE_U">Means this controller scales the U texture cooridnates.</option>
        <option value ="4" name="TT_SCALE_V">Means this controller scales the V texture cooridnates.</option>
    </enum>

    <enum name="DecayType" storage="uint">
        Determines decay function.  Used by NiPSysBombModifier.
        <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">
        Determines symetry type used by NiPSysBombModifier.
        <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="EffectType" storage="uint">
        The type of information that's store in a texture used by a NiTextureEffect.
        <option value="0" name="EFFECT_PROJECTED_LIGHT">Apply a projected light texture.</option>
        <option value="1" name="EFFECT_PROJECTED_SHADOW">Apply a projected shaddow texture.</option>
        <option value="2" name="EFFECT_ENVIRONMENT_MAP">Apply an environment map texture.</option>
        <option value="3" name="EFFECT_FOG_MAP">Apply a fog map 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 plannar 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.</option>
        <option value="4" name="CG_DIFFUSE_CUBE_MAP">Use Diffuse cube mapping.</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="TargetColor" storage="ushort">
        Used by NiPoint3InterpControllers 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="ConsistencyType" storage="ushort">
        Used by NiGeometryData to control the volatility of the mesh.  While they appear to be flags they behave as an enum.
        <option value="0" name="CT_MUTABLE">Mutable Mesh</option>
        <option value="16384" name="CT_STATIC">Static Mesh</option>
        <option value="32768" name="CT_VOLATILE">Volatile Mesh</option>
    </enum>

    <enum name="SortingMode" storage="uint">
        <option value="0" name="SORTING_INHERIT">Inherit</option>
        <option value="1" name="SORTING_OFF">Disable</option>
    </enum>

    <enum name="PropagationMode" storage="uint">
        <option value="0" name="PROPAGATE_ON_SUCCESS">On Success</option>
        <option value="1" name="PROPAGATE_ON_FAILURE">On Failure</option>
        <option value="2" name="PROPAGATE_ALWAYS">Always</option>
        <option value="3" name="PROPAGATE_NEVER">Never</option>
    </enum>

    <enum name="CollisionMode" storage="uint">
        <option value="0" name="CM_USE_OBB">Use Bounding Box</option>
        <option value="1" name="CM_USE_TRI">Use Triangles</option>
        <option value="2" name="CM_USE_ABV">Use Alternate Bounding Volumes</option>
        <option value="3" name="CM_NOTEST">No Test</option>
        <option value="4" name="CM_USE_NIBOUND">Use NiBound</option>
    </enum>

    <enum name="BoundVolumeType" storage="uint">
        <option value="-1" 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">
        <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">
        <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="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="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="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>

    <!--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" niflibtype="string" nifskopetype="sizedstring">
        A string of given length.
        <add name="Length" type="uint">The string length.</add>
        <add name="Value" type="char" arr1="Length">The string itself.</add>
    </compound>

    <compound name="string" niflibtype="IndexString" nifskopetype="string">
        A string type.
        <add name="String" type="SizedString" ver2="20.0.0.5">The normal string.</add>
        <add name="Index" type="StringIndex" ver1="20.1.0.3">The string index.</add>
    </compound>

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

    <compound name="ByteMatrix" nifskopetype="bytematrix">
        An array of bytes.
        <add name="Data Size 1" type="uint">The number of bytes in this array</add>
        <add name="Data Size 2" type="uint">The number of bytes in this array</add>
        <add name="Data" type="byte" arr1="Data Size 2" arr2="Data Size 1">The bytes which make up the array</add>
    </compound>

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

    <compound name="ByteColor3">
        <add name="r" type="byte">Red color component.</add>
        <add name="g" type="byte">Green color component.</add>
        <add name="b" type="byte">Blue color component.</add>
    </compound>

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

    <compound name="ByteColor4">
        <add name="r" type="byte">Red color component.</add>
        <add name="g" type="byte">Green color component.</add>
        <add name="b" type="byte">Blue color component.</add>
        <add name="a" type="byte">Alpha color component.</add>
    </compound>

    <compound name="FilePath" niflibtype="IndexString" nifskopetype="filepath">
        A string that contains the path to a file.
        <add name="String" type="SizedString" ver2="20.0.0.5">The normal string.</add>
        <add name="Index" type="StringIndex" ver1="20.1.0.3">The string index.</add>
    </compound>

    <compound name="Footer">
        The NIF file footer.
        <add name="Num Roots" type="uint" ver1="3.3.0.13">The number of root references.</add>
        <add name="Roots" type="Ref" template="NiObject" arr1="Num Roots" ver1="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).</add>
    </compound>

    <compound name="LODRange">
        The distance range where a specific level of detail applies.
        <add name="Near Extent" type="float">Begining of range.</add>
        <add name="Far Extent" type="float">End of Range.</add>
        <add name="Unknown Ints" type="uint" arr1="3" ver2="3.1">Unknown (0,0,0).</add>
    </compound>

    <compound name="MatchGroup">
        Group of vertex indices of vertices that match.
        <add name="Num Vertices" type="ushort">Number of vertices in this group.</add>
        <add name="Vertex Indices" type="ushort" arr1="Num Vertices">The vertex indices.</add>
    </compound>

    <compound name="Vector3" niflibtype="Vector3" nifskopetype="vector3">
        A vector in 3D space (x,y,z).
        <add name="x" type="float">First coordinate.</add>
        <add name="y" type="float">Second coordinate.</add>
        <add name="z" type="float">Third coordinate.</add>
    </compound>

    <compound name="Vector4" niflibtype="Vector4" nifskopetype="vector4">
        A 4-dimensional vector.
        <add name="x" type="float">First coordinate.</add>
        <add name="y" type="float">Second coordinate.</add>
        <add name="z" type="float">Third coordinate.</add>
        <add name="w" type="float">Fourth coordinate.</add>
    </compound>

    <compound name="Quaternion" niflibtype="Quaternion" nifskopetype="quaternion">
        A quaternion.
        <add name="w" type="float">The w-coordinate.</add>
        <add name="x" type="float">The x-coordinate.</add>
        <add name="y" type="float">The y-coordinate.</add>
        <add name="z" type="float">The z-coordinate.</add>
    </compound>

    <compound name="QuaternionXYZW" nifskopetype="quaternion_xyzw">
        A quaternion as it appears in the havok objects.
        <add name="x" type="float">The x-coordinate.</add>
        <add name="y" type="float">The y-coordinate.</add>
        <add name="z" type="float">The z-coordinate.</add>
        <add name="w" type="float">The w-coordinate.</add>
    </compound>

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

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

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

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

    <compound name="NodeGroup">
        A group of NiNodes references.
        <add name="Num Nodes" type="uint">Number of node references that follow.</add>
        <add name="Nodes" type="Ptr" template="NiNode" arr1="Num Nodes">The list of NiNode references.</add>
    </compound>
<!--
    <compound name="ns keylin" istemplate="1">
        Linear key type (!!! for NifSkope optimizer only, use key, keyrot, or keyvec for regular use).
        <add name="Time" type="float">Key time.</add>
        <add name="Value" type="TEMPLATE">The key value.</add>
    </compound>

    <compound name="ns keyarray" istemplate="1">
        Array of keys, not interpolated (!!! for NifSkope only, use keyarray for regular use).
        <add name="Num Keys" type="uint">Number of keys.</add>
        <add name="Keys" type="ns keylin" template="TEMPLATE" arr1="Num Keys">The keys.</add>
    </compound>

    <compound name="ns keytan" istemplate="1">
        Key with tangents (!!! for NifSkope only, use keyvec instead for regular purposes).
        <add name="Time" type="float">The key time.</add>
        <add name="Value" type="TEMPLATE">The key value.</add>
        <add name="Forward" type="TEMPLATE">Forward tangent.</add>
        <add name="Backward" type="TEMPLATE">Backward tangent.</add>
    </compound>
-->
    <compound name="ShortString" ver1="10.1.0.0" niflibtype="ShortString" nifskopetype="shortstring">
        Another string format, for short strings.  Specific to Bethesda-specific header tags.
        <add name="Length" type="byte">The string length.</add>
        <add name="Value" type="char" arr1="Length">The string itself, null terminated (the null terminator is taken into account in the length byte).</add>
    </compound>

    <compound name="SkinShape">
        Reference to shape and skin instance.
        <add name="Shape" type="Ptr" template="NiTriBasedGeom">The shape.</add>
        <add name="Skin Instance" type="Ref" template="NiSkinInstance">Skinning instance for the shape?</add>
    </compound>

    <compound name="SkinShapeGroup" ver1="10.0.1.0">
        Unknown.
        <add name="Num Link Pairs" type="uint">Counts unknown.</add>
        <add name="Link Pairs" type="SkinShape" arr1="Num Link Pairs">
            First link is a NiTriShape object.
            Second link is a NiSkinInstance object.
        </add>
    </compound>

    <compound name="SkinWeight">
        A weighted vertex.
        <add name="Index" type="ushort">The vertex index, in the mesh.</add>
        <add name="Weight" type="float">The vertex weight - between 0.0 and 1.0</add>
    </compound>

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

    <compound name="ControllerLink" ver1="10.2.0.0">
        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.
        <add name="Target Name" type="string" ver2="10.1.0.0">Name of a controllable object in another NIF file.</add>
        <add name="Controller" type="Ref" template="NiTimeController" ver2="10.1.0.0">Link to a controller.</add>
        <add name="Interpolator" type="Ref" template="NiInterpolator" ver1="10.1.0.106">Link to an interpolator.</add>
        <add name="Controller" type="Ref" template="NiTimeController" ver1="10.1.0.106">Unknown link. Usually -1.</add>
        <add name="Unknown Link 2" type="Ref" template="NiObject" ver1="10.1.0.106" ver2="10.1.0.106">Unknown.</add>
        <add name="Unknown Short 0" type="ushort" ver1="10.1.0.106" ver2="10.1.0.106">Unknown.</add>
        <add name="Priority" type="byte" ver1="10.1.0.106" vercond="(User Version == 10) || (User Version == 11)">Idle animations tend to have low values for this, and NIF objects that have high values tend to correspond with the important parts of the animation.</add>
        <add name="String Palette" type="Ref" template="NiStringPalette" ver1="10.2.0.0" ver2="20.0.0.5">Refers to the NiStringPalette which contains the name of the controlled NIF object.</add>
        <add name="Node Name" type="string" ver1="10.1.0.106" ver2="10.1.0.106">The name of the animated node.</add>
        <add name="Node Name" type="string" ver1="20.1.0.3">The name of the animated node.</add>
        <add name="Node Name Offset" type="StringOffset" ver1="10.2.0.0" ver2="20.0.0.5">Offset in the string palette where the name of the controlled node (NiNode, NiTriShape, ...) starts.</add>
        <add name="Property Type" type="string" ver1="10.1.0.106" ver2="10.1.0.106">Name of the property (NiMaterialProperty, ...), if this controller controls a property.</add>
        <add name="Property Type" type="string" ver1="20.1.0.3">Name of the property (NiMaterialProperty, ...), if this controller controls a property.</add>
        <add name="Property Type Offset" type="StringOffset" ver1="10.2.0.0" ver2="20.0.0.5">Offset in the string palette where the property (NiMaterialProperty, ...) starts, if this controller controls a property. Otherwise, -1.</add>
        <add name="Controller Type" type="string" ver1="10.1.0.106" ver2="10.1.0.106">Probably the object type name of the controller in the NIF file that is child of the controlled object.</add>
        <add name="Controller Type" type="string" ver1="20.1.0.3">Probably the object type name of the controller in the NIF file that is child of the controlled object.</add>
        <add name="Controller Type Offset" type="StringOffset" ver1="10.2.0.0" ver2="20.0.0.5">Apparently the offset in the string palette of some type of controller related to Interpolator (for example, a &#039;NiTransformInterpolator&#039; will have here a &#039;NiTransformController&#039;, etc.). Sometimes the type of controller that links to the interpolator. Probably it refers to the controller in the NIF file that is child of the controlled object, via its type name.</add>
        <add name="Variable 1" type="string" ver1="10.1.0.106" ver2="10.1.0.106">Some variable string (such as &#039;SELF_ILLUM&#039;, &#039;0-0-TT_TRANSLATE_U&#039;, &#039;tongue_out&#039;, etc.).</add>
        <add name="Variable 1" type="string" ver1="20.1.0.3">Some variable string (such as &#039;SELF_ILLUM&#039;, &#039;0-0-TT_TRANSLATE_U&#039;, &#039;tongue_out&#039;, etc.).</add>
        <add name="Variable 1 Offset" type="StringOffset" ver1="10.2.0.0" ver2="20.0.0.5">Offset in the string palette where some variable string starts (such as &#039;SELF_ILLUM&#039;, &#039;0-0-TT_TRANSLATE_U&#039;, &#039;tongue_out&#039;, etc.). Usually, -1.</add>
        <add name="Variable 2" type="string" ver1="10.1.0.106" ver2="10.1.0.106">Another variable string, apparently used for particle system controllers.</add>
        <add name="Variable 2" type="string" ver1="20.1.0.3">Another variable string, apparently used for particle system controllers.</add>
        <add name="Variable 2 Offset" type="StringOffset" ver1="10.2.0.0" ver2="20.0.0.5">Offset in the string palette where some variable string starts (so far only &#039;EmitterActive&#039; and &#039;BirthRate&#039; have been observed in official files, used for particle system controllers). Usually, -1.</add>
    </compound>

    <compound name="ExportInfo" ver1="10.0.1.2">
        <add name="Unknown" type="uint" ver2="10.0.1.2" default="3">Probably the number of strings that follow.</add>
        <add name="Creator" type="ShortString">Could be the name of the creator of the NIF file?</add>
        <add name="Export Info 1" type="ShortString">Unknown. Can be something like &#039;TriStrip Process Script&#039;.</add>
        <add name="Export Info 2" type="ShortString">Unknown. Possibly the selected option of the export script. Can be something like &#039;Default Export Script&#039;.</add>
    </compound>

	<!-- Don't use vercond in Header, it breaks niflib -->
    <compound name="Header">
        The NIF file header.
        <add name="Header String" type="HeaderString">&#039;NetImmerse File Format x.x.x.x&#039; (versions &lt;= 10.0.1.2) or &#039;Gamebryo File Format x.x.x.x&#039; (versions &gt;= 10.1.0.0), with x.x.x.x the version written out. Ends with a newline character (0x0A).</add>
        <add name="Copyright" type="LineString" arr1="3" ver2="3.1" />
        <add name="Version" type="FileVersion" default="0x04000002" ver1="3.3.0.13">The NIF version, in hexadecimal notation: 0x04000002, 0x0401000C, 0x04020002, 0x04020100, 0x04020200, 0x0A000100, 0x0A010000, 0x0A020000, 0x14000004, ...</add>
        <add name="Endian Type" type="EndianType" default="ENDIAN_LITTLE" ver1="20.0.0.4">Determines the endianness of the data in the file.</add>
        <add name="User Version" type="uint" ver1="10.1.0.0">An extra version number, for companies that decide to modify the file format.</add>
        <add name="Num Blocks" type="uint" ver1="3.3.0.13">Number of file objects.</add>
        <add name="User Version 2" type="uint" default="0" cond="(User Version == 10) || (User Version == 11)" ver1="10.1.0.0">This also appears to be the extra user version number and must be set in some circumstances.</add>
        <add name="Export Info" type="ExportInfo" ver1="10.0.1.2" ver2="10.0.1.2" />
        <add name="Export Info" type="ExportInfo" ver1="10.1.0.0" cond="(User Version == 10) || (User Version == 11)" />
        <add name="Num Block Types" type="ushort" ver1="10.0.1.0">Number of object types in this NIF file.</add>
        <add name="Block Types" type="SizedString" arr1="Num Block Types" ver1="10.0.1.0">List of all object types used in this NIF file.</add>
        <add name="Block Type Index" type="BlockTypeIndex" arr1="Num Blocks" ver1="10.0.1.0">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.</add>
        <add name="Block Size" type="uint" arr1="Num Blocks" ver1="20.2.0.7">Array of block sizes?</add>
        <add name="Num Strings" type="uint" ver1="20.1.0.3">Number of strings.</add>
        <add name="Max String Length" type="uint" ver1="20.1.0.3">Maximum string length.</add>
        <add name="Strings" type="SizedString" arr1="Num Strings" ver1="20.1.0.3">Strings.</add>
        <add name="Unknown Int 2" type="uint" default="0" ver1="10.0.1.0">Unknown.</add>
    </compound>

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

    <compound name="TBC" nifskopetype="vector3">
        Tension, bias, continuity.
        <add name="t" type="float">Tension.</add>
        <add name="b" type="float">Bias.</add>
        <add name="c" type="float">Continuity.</add>
    </compound>

    <compound name="Key" niflibtype="Key" istemplate="1">
        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.
        <add name="Time" type="float">Time of the key.</add>
        <add name="Value" type="TEMPLATE">The key value.</add>
        <add name="Forward" type="TEMPLATE" cond="ARG == 2">Key forward tangent.</add>
        <add name="Backward" type="TEMPLATE" cond="ARG == 2">The key backward tangent.</add>
        <add name="TBC" type="TBC" cond="ARG == 3">The key&#039;s TBC.</add>
    </compound>

    <compound name="KeyGroup" istemplate="1">
        Array of vector keys (anything that can be interpolated, except rotations).
        <add name="Num Keys" type="uint">Number of keys in the array.</add>
        <add name="Interpolation" type="KeyType" cond="Num Keys != 0">The key type.</add>
        <add name="Keys" type="Key" arg="Interpolation" template="TEMPLATE" arr1="Num Keys">The keys.</add>
    </compound>
<!-- 
    <compound name="ns keytbc" istemplate="1">
        A TBC key (!!! for NifSkope only, use keyvec for regular purposes).
        <add name="Time" type="float">The key time.</add>
        <add name="Value" type="TEMPLATE">The key value.</add>
        <add name="TBC" type="TBC">Tension, bias, continuity.</add>
    </compound>

    <compound name="ns keyvecarray" istemplate="1">
        Array of interpolable keys (!!! for NifSkope only, use keyvecarray for regular use).
        <add name="Num Keys" type="uint">Number of keys.</add>
        <add name="Key Type" type="uint" cond="Num Keys != 0">The key type (1, 2, or 3).</add>
        <add name="Keys" type="ns keylin" template="TEMPLATE" arr1="Num Keys" cond="Key Type == 1">Linearly interpolated keys.</add>
        <add name="Keys" type="ns keytan" template="TEMPLATE" arr1="Num Keys" cond="Key Type == 2">Interpolated keys, using tangents.</add>
        <add name="Keys" type="ns keytbc" template="TEMPLATE" arr1="Num Keys" cond="Key Type == 3">Keys, interpolated with tension, bias, continuity.</add>
        <add name="Keys" type="ns keylin" template="TEMPLATE" arr1="Num Keys" cond="Key Type == 5">Another type of linear key?</add>
    </compound>

    <compound name="ns keyrotsub">
        Rotation subkey (!!! Nifskope only).
        <add name="Time" type="float" ver2="10.1.0.0">Time.</add>
        <add name="Sub Keys" type="ns keyvecarray" template="float" arr1="3">The sub keys, one for every axis.</add>
    </compound>

    <compound name="ns keyrotarray" istemplate="1">
        Array of rotation keys (!!! for NifSkope only, use keyrotarray for regular use).
        <add name="Num Keys" type="uint">Number of rotation keys.</add>
        <add name="Key Type" type="uint" cond="Num Keys != 0">The key type (1, 2, 3, or 4).</add>
        <add name="Keys" type="ns keylin" template="TEMPLATE" arr1="Num Keys" cond="Key Type == 1">Linear keys.</add>
        <add name="Keys" type="ns keylin" template="TEMPLATE" arr1="Num Keys" cond="Key Type == 2">Linear keys (yes, rotations don&#039;t have type 2 tangent keys!).</add>
        <add name="Keys" type="ns keytbc" template="TEMPLATE" arr1="Num Keys" cond="Key Type == 3">TBC keys.</add>
        <add name="Keys Sub" type="ns keyrotsub" arr1="Num Keys" cond="Key Type == 4">Special rotation keys (3 float arrays, one for each axis).</add>
    </compound>

    <compound name="ns keyvecarraytyp" istemplate="1">
        Array of interpolable keys (!!! for NifSkope only, use keyvecarraytyp for regular use)
        <add name="Num Keys" type="uint">Number of keys</add>
        <add name="Key Type" type="uint">The key type (1, 2, 3)</add>
        <add name="Keys" type="ns keylin" template="TEMPLATE" arr1="Num Keys" cond="Key Type == 1">Linearly interpolated keys.</add>
        <add name="Keys" type="ns keytan" template="TEMPLATE" arr1="Num Keys" cond="Key Type == 2">Interpolated keys, using tangents.</add>
        <add name="Keys" type="ns keytbc" template="TEMPLATE" arr1="Num Keys" cond="Key Type == 3">Keys, interpolated with tension, bias, continuity.</add>
    </compound>
-->
    <compound name="QuatKey" niflibtype="Key" istemplate="1">
        A special version of the key type used for quaternions.  Never has tangents.
        <add name="Time" type="float" ver2="10.1.0.0">Time the key applies.</add>
        <add name="Time" type="float" cond="ARG != 4" ver1="10.1.0.106">Time the key applies.</add>
        <add name="Value" type="TEMPLATE" cond="ARG != 4">Value of the key.</add>
        <add name="TBC" type="TBC" cond="ARG == 3">The TBC of the key.</add>
    </compound>

    <compound name="RotationKeyArray" istemplate="1">
        Rotation key array.
        <add name="Num Keys" type="uint">Number of keys.</add>
        <add name="Key Type" type="KeyType" cond="Num Keys != 0">Key type (LINEAR_KEY, QUADRATIC_KEY, TBC_KEY, or XYZ_ROTATION_KEY).</add>
        <add name="Keys" type="QuatKey" arg="Key Type" template="TEMPLATE" arr1="Num Keys">The rotation keys.</add>
    </compound>

    <compound name="TexCoord" niflibtype="TexCoord" nifskopetype="vector2">
        Texture coordinates (u,v). As in OpenGL; image origin is in the lower left corner.
        <add name="u" type="float">First coordinate.</add>
        <add name="v" type="float">Second coordinate.</add>
    </compound>

    <compound name="TexDesc">
        Texture description.
        <add name="Source" type="Ref" template="NiSourceTexture">NiSourceTexture object index.</add>
        <add name="Clamp Mode" type="TexClampMode" default="WRAP_S_WRAP_T" ver2="20.0.0.5">0=clamp S clamp T, 1=clamp S wrap T, 2=wrap S clamp T, 3=wrap S wrap T</add>
        <add name="Filter Mode" type="TexFilterMode" default="FILTER_TRILERP" ver2="20.0.0.5">0=nearest, 1=bilinear, 2=trilinear, 3=..., 4=..., 5=...</add>
        <add name="Flags" type="Flags" ver1="20.1.0.3">Texture mode flags. Presumably stores Clamp Mode and Filter Mode?</add>
        <add name="UV Set" type="uint" default="0" ver2="20.0.0.5">The texture coordinate set in NiGeometryData that this texture slot will use.</add>
        <add name="PS2 L" type="short" default="0" ver2="10.4.0.1">PS2 only; from the Freedom Force docs, &quot;L values can range from 0 to 3 and are used to specify how fast a texture gets blurry&quot;.</add>
        <add name="PS2 K" type="short" default="-75" ver2="10.4.0.1">PS2 only; from the Freedom Force docs, &quot;The K value 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.&quot; -75 for most v4.0.0.2 meshes.</add>
        <add name="Unknown1" type="ushort" ver2="4.1.0.12">Unknown, 0 or 0x0101?</add>
        <add name="Has Texture Transform" type="bool" default="false" ver1="10.1.0.0">Determines whether or not the texture&#039;s coordinates are transformed.</add>
        <add name="Translation" type="TexCoord" cond="Has Texture Transform != 0" ver1="10.1.0.0">The amount to translate the texture coordinates in each direction?</add>
        <add name="Tiling" type="TexCoord" cond="Has Texture Transform != 0" ver1="10.1.0.0" default="1.0, 1.0">The number of times the texture is tiled in each direction?</add>
        <add name="W Rotation" type="float" default="0.0" cond="Has Texture Transform != 0" ver1="10.1.0.0">2D Rotation of texture image around third W axis after U and V.</add>
        <add name="Transform Type?" type="uint" default="0" cond="Has Texture Transform != 0" ver1="10.1.0.0">The texture transform type?  Doesn&#039;t seem to do anything.</add>
        <add name="Center Offset" type="TexCoord" cond="Has Texture Transform != 0" ver1="10.1.0.0">The offset from the origin?</add>
    </compound>

    <compound name="ShaderTexDesc" ver1="10.0.1.0">
        An extended texture description for shader textures.
        <add name="Is Used" type="bool">Is it used?</add>
        <add name="Texture Data" type="TexDesc" cond="Is Used != 0">The texture data.</add>
        <add name="Map Index" type="uint" cond="Is Used != 0">Map Index</add>
    </compound>

    <compound name="TexSource">
        A texture source.
        <add name="Use External" type="byte">Is the texture external?</add>
        <add name="File Name" type="FilePath" cond="Use External == 1">
            The external texture file name.

            Note: all original morrowind nifs use name.ext only for addressing the textures, but most mods use something like textures/[subdir/]name.ext. This is due to a feature in Morrowind resource manager: it loads name.ext, textures/name.ext and textures/subdir/name.ext but NOT subdir/name.ext.
        </add>
        <add name="Unknown Link" type="Ref" template="NiObject" cond="Use External == 1" ver1="10.1.0.0">Unknown.</add>
        <add name="Unknown Byte" type="byte" cond="Use External == 0" ver2="10.0.1.0">Unknown.</add>
        <add name="File Name" type="FilePath" cond="Use External == 0" ver1="10.1.0.0">The original source filename of the image embedded by the referred NiPixelData object.</add>
        <add name="Pixel Data" type="Ref" template="NiPixelData" cond="Use External == 0">Pixel data object index.</add>
    </compound>

    <compound name="Triangle" niflibtype="Triangle" nifskopetype="triangle">
        List of three vertex indices.
        <add name="v1" type="ushort">First vertex index.</add>
        <add name="v2" type="ushort">Second vertex index.</add>
        <add name="v3" type="ushort">Third vertex index.</add>
    </compound>

    <compound name="SkinPartition" ver1="4.2.1.0">
        Skinning data for a submesh, optimized for hardware skinning. Part of NiSkinPartition.
        <add name="Num Vertices" type="ushort">Number of vertices in this submesh.</add>
        <add name="Num Triangles" type="ushort">Number of triangles in this submesh.</add>
        <add name="Num Bones" type="ushort">Number of bones influencing this submesh.</add>
        <add name="Num Strips" type="ushort">Number of strips in this submesh (zero if not stripped).</add>
        <add name="Num Weights Per Vertex" type="ushort">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.</add>
        <add name="Bones" type="ushort" arr1="Num Bones">List of bones.</add>
        <add name="Has Vertex Map" type="byte" ver1="10.1.0.0">Do we have a vertex map?</add>
        <add name="Vertex Map" type="ushort" arr1="Num Vertices" ver2="10.0.1.2">Maps the weight/influence lists in this submesh to the vertices in the shape being skinned.</add>
        <add name="Vertex Map" type="ushort" arr1="Num Vertices" cond="Has Vertex Map != 0" ver1="10.1.0.0">Maps the weight/influence lists in this submesh to the vertices in the shape being skinned.</add>
        <add name="Has Vertex Weights" type="bool" ver1="10.1.0.0">Do we have vertex weights?</add>
        <add name="Vertex Weights" type="float" arr1="Num Vertices" arr2="Num Weights Per Vertex" ver2="10.0.1.2">The vertex weights.</add>
        <add name="Vertex Weights" type="float" arr1="Num Vertices" arr2="Num Weights Per Vertex" cond="Has Vertex Weights != 0" ver1="10.1.0.0">The vertex weights.</add>
        <add name="Strip Lengths" type="ushort" arr1="Num Strips">The strip lengths.</add>
        <add name="Has Faces" type="byte" ver1="10.1.0.0">Do we have triangle or strip data?</add>
        <add name="Strips" type="ushort" arr1="Num Strips" arr2="Strip Lengths" cond="Num Strips != 0" ver2="10.0.1.2">The strips.</add>
        <add name="Strips" type="ushort" arr1="Num Strips" arr2="Strip Lengths" cond="(Has Faces != 0) &amp;&amp; (Num Strips != 0)" ver1="10.1.0.0">The strips.</add>
        <add name="Triangles" type="Triangle" arr1="Num Triangles" cond="Num Strips == 0" ver2="10.0.1.2">The triangles.</add>
        <add name="Triangles" type="Triangle" arr1="Num Triangles" cond="(Has Faces != 0) &amp;&amp; (Num Strips == 0)" ver1="10.1.0.0">The triangles.</add>
        <add name="Has Bone Indices" type="byte">Do we have bone indices?</add>
        <add name="Bone Indices" type="byte" arr1="Num Vertices" arr2="Num Weights Per Vertex" cond="Has Bone Indices != 0">Bone indices, they index into &#039;Bones&#039;.</add>
    </compound>

    <compound name="BoundingBox">
        Bounding box.
        <add name="Unknown Int" type="uint" default="1">Usually 1.</add>
        <add name="Translation" type="Vector3">Translation vector.</add>
        <add name="Rotation" type="Matrix33">Rotation matrix.</add>
        <add name="Radius" type="Vector3">Radius, per direction.</add>
    </compound>

    <compound name="FurniturePosition">
        Describes a furniture position?
        <add name="Offset" type="Vector3">Offset of furniture marker.</add>
        <add name="Orientation" type="ushort">Furniture marker orientation.</add>
        <add name="Position Ref 1" type="byte">Refers to a furnituremarkerxx.nif file. Always seems to be the same as Position Ref 2.</add>
        <add name="Position Ref 2" type="byte">Refers to a furnituremarkerxx.nif file. Always seems to be the same as Position Ref 1.</add>
    </compound>

    <compound name="hkTriangle">
        A triangle with extra data used for physics.
        <add name="Triangle" type="Triangle">The triangle.</add>
        <add name="Welding Info" type="ushort">Additional havok information on how triangles are welded.</add>
        <add name="Normal" type="Vector3" ver2="20.0.0.5">This is the triangle's normal.</add>
    </compound>

    <compound name="Morph">
        Geometry morphing data component.
        <add name="Frame Name" type="string" ver1="10.1.0.106">Name of the frame.</add>
        <add name="Num Keys" type="uint" ver2="10.1.0.0">The number of morph keys that follow.</add>
        <add name="Interpolation" type="KeyType" ver2="10.1.0.0">Unlike most objects, the presense of this value is not conditional on there being keys.</add>
        <add name="Keys" type="Key" arg="Interpolation" template="float" arr1="Num Keys" ver2="10.1.0.0">The morph key frames.</add>
        <add name="Unknown Int" type="uint" ver1="10.1.0.106" ver2="10.2.0.0">Unknown.</add>
        <add name="Unknown Int" type="uint" ver1="20.0.0.4" ver2="20.1.0.3" userver="0">Unknown.</add>
        <add name="Vectors" type="Vector3" arr1="ARG">Morph vectors.</add>
    </compound>

    <compound name="Particle">
        particle array entry
        <add name="Velocity" type="Vector3">Particle velocity</add>
        <add name="Unknown Vector" type="Vector3">Unknown</add>
        <add name="Lifetime" type="float">The particle&#039;s age.</add>
        <add name="Lifespan" type="float">Maximum age of the particle.</add>
        <add name="Timestamp" type="float">Timestamp of the last update.</add>
        <add name="Unknown Short" type="ushort" default="0">Unknown short</add>
        <add name="Vertex ID" type="ushort">Particle/vertex index matches array index</add>
    </compound>

    <compound name="SkinData">
        Skinning data component.
        <add name="Rotation" type="Matrix33">Rotation offset of the skin from this bone in bind position.</add>
        <add name="Translation" type="Vector3">Translation offset of the skin from this bone in bind position.</add>
        <add name="Scale" type="float">Scale offset of the skin from this bone in bind position. (Assumption - this is always 1.0 so far)</add>
        <add name="Bounding Sphere Offset" type="Vector3">Translation offset of a bounding sphere holding all vertices. (Note that its a Sphere Containing Axis Aligned Box not a minimum volume Sphere)</add>
        <add name="Bounding Sphere Radius" type="float">Radius for bounding sphere holding all vertices.</add>
        <add name="Num Vertices" type="ushort">Number of weighted vertices.</add>
        <add name="Vertex Weights" type="SkinWeight" arr1="Num Vertices" ver2="4.2.1.0">The vertex weights.</add>
        <add name="Vertex Weights" type="SkinWeight" arr1="Num Vertices" ver1="4.2.2.0" cond="ARG != 0">The vertex weights.</add>
    </compound>

    <compound name="SphereBV">
        A sphere.
        <add name="Center" type="Vector3">The sphere's center.</add>
        <add name="Radius" type="float">The sphere's radius.</add>
    </compound>

    <compound name="OblivionColFilter">
        Oblivion's ColFilter property for Havok.
        <add name="Layer" type="OblivionLayer">Sets mesh color in Oblivion Construction Set.</add>
        <add name="Col Filter" type="byte">The first bit sets the LINK property and controls whether this body is physically linked to others. The next bit turns collision off. Then, the next bit sets the SCALED property in Oblivion. The next five bits make up the number of this part in a linked body list.</add>
        <add name="Unknown Short" type="ushort">Unknown.</add>
    </compound>

    <compound name="OblivionSubShape">
        Havok Information for packed TriStrip shapes.
        <add name="Layer" type="OblivionLayer">Sets mesh color in Oblivion Construction Set.</add>
        <add name="Col Filter" type="byte">The first bit sets the LINK property and controls whether this body is physically linked to others. The next bit turns collision off. Then, the next bit sets the SCALED property in Oblivion. The next five bits make up the number of this part in a linked body list.</add>
        <add name="Unknown Short" type="ushort">Unknown. Perhaps the vertex wielding type?</add>
        <add name="Num Vertices" type="uint">The number of vertices that form this sub shape.</add>
        <add name="Material" type="HavokMaterial">The material of the subshape.</add>
    </compound>

    <compound name="RagdollDescriptor">
        This constraint defines a cone in which an object can rotate. The shape of the cone can be controlled in two (orthogonal) directions.
        <add name="Pivot A" type="Vector4">Point around which the object will rotate.</add>
        <add name="Plane A" type="Vector4">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).</add>
        <add name="Twist A" type="Vector4">Central directed axis of the cone in which the object can rotate. Orthogonal on Plane A.</add>
        <add name="Pivot B" type="Vector4">Pivot A in second entity coordinate system.</add>
        <add name="Plane B" type="Vector4">Plane A in second entity coordinate system.</add>
        <add name="Twist B" type="Vector4">Twist A in second entity coordinate system.</add>
        <add 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.</add>
        <add name="Plane Min Angle" type="float">Minimum angle the object can rotate around Plane A, relative to Twist A.</add>
        <add name="Plane Max Angle" type="float">Maximum angle the object can rotate around Plane A, relative to Twist A.</add>
        <add name="Twist Min Angle" type="float">Minimum angle the object can rotate around Twist A, relative to Plane A.</add>
        <add name="Twist Max Angle" type="float">Maximum angle the object can rotate around Twist A, relative to Plane A.</add>
        <add name="Max Friction" type="float">Maximum friction, typically 0 or 10.</add>
        <add name="Unknown Float 1" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Float 2" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Float 3" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Float 4" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Float 5" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Float 6" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Float 7" type="float" ver1="20.2.0.7">Unknown</add>
    </compound>

    <compound name="LimitedHingeDescriptor">
        <add name="Pivot A" type="Vector4">Pivot point around which the object will rotate.</add>
        <add name="Axle A" type="Vector4">Axis of rotation.</add>
        <add name="Perp2 Axle In A1" type="Vector4">Vector in the rotation plane which defines the zero angle.</add>
        <add name="Perp2 Axle In A2" type="Vector4">Vector in the rotation plane, orthogonal on the previous one, which defines the positive direction of rotation. This is always the vector product of Axle A and Perp2 Axle In A1.</add>
        <add name="Pivot B" type="Vector4">Pivot A in second entity coordinate system.</add>
        <add name="Axle B" type="Vector4">Axle A in second entity coordinate system.</add>
        <add name="Perp2 Axle In B2" type="Vector4">Perp2 Axle In A2 in second entity coordinate system.</add>
        <add name="Min Angle" type="float">Minimum rotation angle.</add>
        <add name="Max Angle" type="float">Maximum rotation angle.</add>
        <add name="Max Friction" type="float">Maximum friction, typically either 0 or 10.</add>
        <add name="Unknown Float 1" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Float 2" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Float 3" type="float" ver1="20.2.0.7">Unknown</add>
    </compound>

    <compound name="HingeDescriptor">
        <add name="Pivot A" type="Vector4">Pivot point around which the object will rotate.</add>
        <add name="Perp2 Axle In A1" type="Vector4">Vector in the rotation plane which defines the zero angle.</add>
        <add name="Perp2 Axle In A2" type="Vector4">Vector in the rotation plane, orthogonal on the previous one, which defines the positive direction of rotation.</add>
        <add name="Pivot B" type="Vector4">Pivot A in second entity coordinate system.</add>
        <add name="Axle B" type="Vector4">Axle A (vector orthogonal on Perp2 Axles) in second entity coordinate system.</add>
        <add name="Unknown Float 1" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 2" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 3" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 4" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 5" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 6" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 7" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 8" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 9" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 10" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Byte 1" type="byte" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Byte 2" type="byte" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Byte 3" type="byte" ver1="20.2.0.7">Unknown</add>
    </compound>

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

    <compound name="MultiTextureElement">
        <add name="Has Image" type="bool">Looks like a memory address, so probably a bool.</add>
        <add name="Image" type="Ref" template="NiImage" cond="Has Image">Link to the texture image.</add>
        <add name="Clamp?" type="TexClampMode" cond="Has Image" default="WRAP_S_WRAP_T">May be texture clamp mode.</add>
        <add name="Filter?" type="TexFilterMode" cond="Has Image" default="FILTER_TRILERP">May be texture filter mode.</add>
        <add name="UV Set?" type="uint" cond="Has Image" default="1">This may be the UV set counting from 1 instead of zero.</add>
        <add name="PS2 L" type="short" cond="Has Image" default="0" ver1="3.03" ver2="10.2.0.0">0?</add>
        <add name="PS2 K" type="short" cond="Has Image" default="-75" ver1="3.03" ver2="10.2.0.0">-75?</add>
        <add name="Unknown Short 3" type="short" cond="Has Image" default="0" ver1="3.03">Unknown.  Usually 0 but sometimes 257</add>
    </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">
        Box Bounding Volume
        <add name="Center" type="Vector3">Center</add>
        <add name="Axis" type="Vector3" arr1="3">Axis</add>
        <add name="Extent" type="float" arr1="3">Extent</add>
    </compound>

    <compound name="CapsuleBV">
        Capsule Bounding Volume
        <add name="Center" type="Vector3">Center</add>
        <add name="Origin" type="Vector3">Origin</add>
        <!--<add name="Direction" type="Vector3">Direction</add>
      <add name="Radius" type="float">Radius</add>-->
        <!-- direction and radius seem not present in ffvt3r 10.1.0.0 nifs 
      instead, there's two floats -->
        <add name="Unknown Float 1" type="float">Unknown.</add>
        <add name="Unknown Float 2" type="float">Unknown.</add>
    </compound>

    <compound name="HalfSpaceBV">
        <add name="Normal" type="Vector3">Normal</add>
        <add name="Center" type="Vector3">Center</add>
    </compound>

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

    <compound name="UnionBV">
        <add name="Num BV" type="uint">Number of Bounding Volumes.</add>
        <add name="Bounding Volumes" type="BoundingVolume" arr1="Num BV">Bounding Volume.</add>
    </compound>

    <compound name="MorphWeight">
        <add name="Interpolator" type="Ref" template="NiInterpolator">Interpolator</add>
        <add name="Weight?" type="float">Weight</add>
    </compound>

    <compound name="ArkTexture">
        A texture reference used by NiArkTextureExtraData.
        <add name="Texture Name" type="string" />
        <add name="Unknown Int 3" type="int" />
        <add name="Unknown Int 4" type="int" />
        <add name="Texturing Property" type="Ref" template="NiTexturingProperty"/>
        <add name="Unknown Bytes" type="byte" arr1="9" />
    </compound>

    <compound name="InertiaMatrix" niflibtype="InertiaMatrix">
        An inertia matrix.
        <add name="m11" type="float" />
        <add name="m12" type="float" />
        <add name="m13" type="float" />
        <add name="m14" type="float">Zero</add>
        <add name="m21" type="float" />
        <add name="m22" type="float" />
        <add name="m23" type="float" />
        <add name="m24" type="float">Zero</add>
        <add name="m31" type="float" />
        <add name="m32" type="float" />
        <add name="m33" type="float" />
        <add name="m34" type="float">Zero</add>
    </compound>

    <compound name="DecalVectorArray">
        Array of Vectors for Decal placement in BSDecalPlacementVectorExtraData.
        <add name="Num Vectors" type="short">Number of sets</add>
        <add name="Points" type="Vector3" arr1="Num Vectors">Vector XYZ coords</add>
        <add name="Normals" type="Vector3" arr1="Num Vectors">Vector Normals</add>
    </compound>

    <bitflags name="BSPartFlag" storage="ushort">
        Editor flags for the Body Partitions.
        <option value="0" name="EDITOR VISIBLE">Visible in Editor</option>
        <option value="8" name="START NEW 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">
        Body part list for DismemberSkinInstance
        <add name="Part Flag" type="BSPartFlag" default="257">Flags related to the Body Partition</add>
        <add name="Body Part" type="BSDismemberBodyPartType">Body Part Index</add>
    </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="1">
        Abstract object type.
    </niobject>

    <niobject name="Ni3dsAlphaAnimator" abstract="0" ver2="2.3" inherit="NiObject">
        Unknown!
        <add name="Unknown 1" type="byte" arr1="40">Unknown.</add>
        <add name="Parent" type="Ref" template="NiObject">The parent?</add>
        <add name="Num 1" type="uint">Unknown.</add>
        <add name="Num 2" type="uint">Unknown.</add>
        <add name="Unknown 2" type="uint" arr1="Num 1" arr2="Num 2" arr3="2">Unknown.</add>
    </niobject>

    <niobject name="Ni3dsAnimationNode" abstract="0" ver2="2.3" inherit="NiObject">
        Unknown!
        <add name="Name" type="string">Name of this object.</add>
        <add name="Has Data" type="uint">Unknown.</add>
        <add name="Unknown Floats 1" type="float" arr1="21" cond="Has Data">Unknown. Matrix?</add>
        <add name="Unknown Short" type="ushort" cond="Has Data">Unknown.</add>
        <add name="Child" type="Ref" template="NiObject" cond="Has Data">Child?</add>
        <add name="Unknown Floats 2" type="float" arr1="12" cond="Has Data">Unknown.</add>
        <add name="Count" type="uint" cond="Has Data">A count.</add>
        <add name="Unknown Array" type="byte" arr1="Count" arr2="5" cond="Has Data">Unknown.</add>
    </niobject>

    <niobject name="Ni3dsColorAnimator" abstract="0" ver2="2.3" inherit="NiObject">
        Unknown!
        <add name="Unknown 1" type="byte" arr1="184">Unknown.</add>
    </niobject>

    <niobject name="Ni3dsMorphShape" abstract="0" ver2="2.3" inherit="NiObject">
        Unknown!
        <add name="Unknown 1" type="byte" arr1="14">Unknown.</add>
    </niobject>

    <niobject name="Ni3dsParticleSystem" abstract="0" ver2="2.3" inherit="NiObject">
        Unknown!
        <add name="Unknown 1" type="byte" arr1="14">Unknown.</add>
    </niobject>

    <niobject name="Ni3dsPathController" abstract="0" ver2="2.3" inherit="NiObject">
        Unknown!
        <add name="Unknown 1" type="byte" arr1="20">Unknown.</add>
    </niobject>


    <niobject name="NiParticleModifier" abstract="1" inherit="NiObject">
        A particle system modifier.
        <add name="Next Modifier" type="Ref" template="NiParticleModifier">Next particle modifier.</add>
        <add name="Controller" type="Ptr" template="NiParticleSystemController" ver1="4.0.0.2">Points to the particle system controller parent.</add>
    </niobject>

    <niobject name="NiPSysCollider" abstract="1" inherit="NiObject">
        Particle system collider.
        <add name="Bounce" type="float">Defines amount of bounce the collider object has.</add>
        <add name="Spawn on Collide" type="bool">Unknown.</add>
        <add name="Die on Collide" type="bool">Kill particles on impact if set to yes.</add>
        <add name="Spawn Modifier" type="Ref" template="NiPSysSpawnModifier">Link to NiPSysSpawnModifier object?</add>
        <add name="Parent" type="Ptr" template="NiObject">Link to parent.</add>
        <add name="Next Collider" type="Ref" template="NiObject">The next collider.</add>
        <add name="Collider Object" type="Ptr" template="NiNode">Links to a NiNode that will define where in object space the collider is located/oriented.</add>
    </niobject>

    <niobject name="bhkRefObject" abstract="1" inherit="NiObject">
        The base type of most Bethesda-specific Havok-related NIF objects.
    </niobject>

    <niobject name="bhkSerializable" abstract="1" inherit="bhkRefObject">
        Havok objects that can be saved and loaded from disk?
    </niobject>

    <niobject name="bhkWorldObject" abstract="1" inherit="bhkSerializable">
        Havok objects that have a position in the world?
        <add name="Shape" type="Ref" template="bhkShape"> Link to the body for this collision object.</add>
        <add name="Layer" type="OblivionLayer" default="OL_STATIC">Sets mesh color in Oblivion Construction Set.</add>
        <add name="Col Filter" type="byte" default="0">The first bit sets the LINK property and controls whether this body is physically linked to others. The next bit turns collision off. Then, the next bit sets the SCALED property in Oblivion. The next five bits make up the number of this part in a linked body list.</add>
        <add name="Unknown Short" type="ushort">Unknown.</add>
    </niobject>

    <niobject name="bhkPhantom" abstract="1" inherit="bhkWorldObject">
        Havok object that do not react with other objects when they collide (causing deflection, etc.) but still trigger collision notifications to the game.  Possible uses are traps, portals, AI fields, etc.
    </niobject>

    <niobject name="bhkShapePhantom" abstract="1" inherit="bhkPhantom">
        A Havok phantom that uses a Havok shape object for its collision volume instead of just a bounding box.
    </niobject>

    <niobject name="bhkSimpleShapePhantom" abstract="0" inherit="bhkShapePhantom">
        Unknown shape.
        <add name="Unkown Floats" type="float" arr1="7">Unknown.</add>
        <add name="Unknown Floats 2" type="float" arr1="3" arr2="5">Unknown. (1,0,0,0,0) x 3.</add>
        <add name="Unknown Float" type="float">Unknown.</add>
    </niobject>

    <niobject name="bhkEntity" abstract="1" inherit="bhkWorldObject">
        A havok node, describes physical properties.
    </niobject>

    <niobject name="bhkRigidBody" abstract="0" inherit="bhkEntity" ver1="20.0.0.4">
        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.
        <add name="Unknown 5 Floats" type="float" arr1="5">Unknown.</add>
        <add name="Unknown 4 Shorts" type="ushort" arr1="4">Unknown.</add>
        <add name="Layer Copy" type="OblivionLayer" default="1">Copy of Layer value?</add>
        <add name="Col Filter Copy" type="byte" default="0">Copy of Col Filter value?</add>
        <add name="Unknown 7 Shorts" type="ushort" arr1="7" default="0 21280 2481 62977 65535 44 0">Unknown.</add>
        <add name="Translation" type="Vector4"> A vector that moves the body by the specified amount. Only enabled in bhkRigidBodyT objects.</add>
        <add name="Rotation" type="QuaternionXYZW">The rotation Yaw/Pitch/Roll to apply to the body. Only enabled in bhkRigidBodyT objects.</add>
        <add name="Linear Velocity" type="Vector4">Linear velocity.</add>
        <add name="Angular Velocity" type="Vector4">Angular velocity.</add>
        <add name="Inertia" type="InertiaMatrix">Defines how the mass is distributed among the body.</add>
        <add name="Center" type="Vector4"> This seems to be used to relocate the object's center of mass. Useful for balancing objects in contraints.</add>
        <add name="Mass" type="float" default="1.0">The body's mass in kg. A mass of zero represents an immovable object.</add>
        <add name="Linear Damping" type="float" default="0.1"> Damping value for linear movement. A value that is too small fixes the object in place.</add>
        <add name="Angular Damping" type="float" default="0.05"> Damping value for angular movement.</add>
        <add name="Friction" type="float" default="0.3">The body&#039;s friction.</add>
        <add name="Restitution" type="float" default="0.3">
            The body&#039;s restitution (elasticity).
            If the restitution is not 0.0 the object will need extra CPU for all new collisions.
            Try to set restitution to 0 for maximum performance (e.g. collapsing buildings)
        </add>
        <add name="Max Linear Velocity" type="float" default="250.0">Maximal linear velocity.</add>
        <add name="Max Angular Velocity" type="float" default="31.4159">Maximal angular velocity. Pi x 10?</add>
        <add 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.
        </add>
        <add name="Motion System" type="MotionSystem" default="1">Motion system? Overrides Quality when on Keyframed?</add>
        <add name="Unknown Byte 1" type="byte" default="1"> Usually set to 1 for fixed objects, or set to 2 for moving ones.  Seems to always be same as Unknown Byte 2.</add>
        <add name="Unknown Byte 2" type="byte" default="1">Usually set to 1 for fixed objects, or set to 2 for moving ones.  Seems to always be same as Unknown Byte 1.</add>
        <add name="Quality Type" type="MotionQuality" default="1">The motion type. Determines quality of motion?</add>
        <add name="Unknown Int 6" type="uint">Unknown.</add>
        <add name="Unknown Int 7" type="uint">Unknown.</add>
        <add name="Unknown Int 8" type="uint">Unknown.</add>
        <add name="Num Constraints" type="uint"> The number of constraints this object is bound to.</add>
        <add name="Constraints" type="Ref" template="bhkSerializable" arr1="Num Constraints">Unknown.</add>
        <add name="Unknown Int 9" type="uint">0 = do not respond to wind, 1 = respond to wind (?)</add>
    </niobject>

    <niobject name="bhkRigidBodyT" abstract="0" inherit="bhkRigidBody" ver1="20.0.0.5">
        Unknown.
    </niobject>

    <niobject name="bhkConstraint" abstract="1" inherit="bhkSerializable">
        Describes a physical constraint.
        <add name="Num Entities" type="uint">Number of bodies affected by this constraint.</add>
        <add name="Entities" type="Ptr" template="bhkEntity" arr1="Num Entities">The entities affected by this constraint.</add>
        <add name="Priority" type="uint" default="1">Usually 1. Higher values indicate higher priority of this constraint?</add>
    </niobject>

    <niobject name="bhkLimitedHingeConstraint" abstract="0" inherit="bhkConstraint" ver1="20.0.0.5">
        Hinge constraint.
        <add name="Limited Hinge" type="LimitedHingeDescriptor">Describes a limited hinge constraint</add>
        <add name="Unknown Float 1" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Is Death Pose" type="byte" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 1" type="int" cond="Is Death Pose" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 2" type="int" cond="Is Death Pose" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 3" type="int" cond="Is Death Pose" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 4" type="int" cond="Is Death Pose" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 5" type="int" cond="Is Death Pose" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 6" type="int" cond="Is Death Pose" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Byte 1" type="byte" cond="Is Death Pose" ver1="20.2.0.7">Unknown</add>
    </niobject>

    <niobject name="bhkMalleableConstraint" abstract="0" inherit="bhkConstraint">
        A malleable constraint.
        <add name="Type" type="uint">Type of constraint.</add>
        <add name="Unknown Int 2" type="uint">Unknown.</add>
        <add name="Unknown Link 1" type="Ref" template="NiObject">Usually -1?</add>
        <add name="Unknown Link 2" type="Ref" template="NiObject">Usually -1?</add>
        <add name="Unknown Int 3" type="uint">Unknown. 1?</add>
        <add name="Hinge" type="HingeDescriptor" cond="Type == 1" />
        <add name="Ragdoll" type="RagdollDescriptor" cond="Type == 7" />
        <add name="Limited Hinge" type="LimitedHingeDescriptor" cond="Type == 2" />
        <add name="Tau" type="float" />
        <add name="Unknown Byte 1" type="byte" ver1="20.2.0.7">Unknown</add>
        <add name="Damping" type="float" />
    </niobject>

    <niobject name="bhkStiffSpringConstraint" abstract="0" inherit="bhkConstraint">
        A spring constraint.
        <add name="Pivot A" type="Vector4">Pivot A.</add>
        <add name="Pivot B" type="Vector4">Pivot B.</add>
        <add name="Length" type="float">Length.</add>
    </niobject>

    <niobject name="bhkRagdollConstraint" abstract="0" inherit="bhkConstraint" ver1="20.0.0.5">
        Ragdoll constraint.
        <add name="Ragdoll" type="RagdollDescriptor">Ragdoll constraint.</add>
        <add name="Unknown Float 1" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Is Death Pose" type="byte" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 1" type="int" cond="Is Death Pose" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 2" type="int" cond="Is Death Pose" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 3" type="int" cond="Is Death Pose" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 4" type="int" cond="Is Death Pose" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 5" type="int" cond="Is Death Pose" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Int 6" type="int" cond="Is Death Pose" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Byte 1" type="byte" cond="Is Death Pose" ver1="20.2.0.7">Unknown</add>
    </niobject>

    <niobject name="bhkPrismaticConstraint" abstract="0" inherit="bhkConstraint" ver1="20.0.0.5">
        A prismatic constraint.
        <add name="Pivot A" type="Vector4" >Pivot A.</add>
        <add name="Rotation" type="Vector4" arr1="4">4x4 rotation matrix, rotates the child entity.</add>
        <add name="Pivot B" type="Vector4" >Pivot B.</add>
        <add name="Sliding Axis" type="Vector4" >Describes the axis the object is able to travel along. Unit vector.</add>
        <add name="Plane" type="Vector4" >Plane normal. Describes the plane the object is able to move on.</add>
        <add name="Min Distance" type="float" >Describe the min distance the object is able to travel.</add>
        <add name="Max Distance" type="float" >Describe the max distance the object is able to travel.</add>
        <add name="Friction" type="float" >Friction.</add>
        <add name="Unknown Byte 1" type="byte" ver1="20.2.0.7">Unknown</add>
    </niobject>

    <niobject name="bhkHingeConstraint" abstract="0" inherit="bhkConstraint" ver1="20.0.0.5">
        A hinge constraint.
        <add name="Hinge" type="HingeDescriptor">Hinge constraing.</add>
        <add name="Unknown Float 1" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Unknown Byte 1" type="byte" ver1="20.2.0.7">Unknown</add>
    </niobject>


    <niobject name="bhkShape" abstract="1" inherit="bhkSerializable">
        A Havok Shape?
    </niobject>

    <niobject name="bhkTransformShape" abstract="0" inherit="bhkShape">
        Transforms a shape.
        <add name="Shape" type="Ref" template="bhkShape">The shape that this object transforms.</add>
        <add name="Material" type="HavokMaterial">The shape&#039;s material.</add>
        <add name="Unknown Float 1" type="float">Unknown.</add>
        <add name="Unknown 8 Bytes" type="byte" arr1="8">Unknown.</add>
        <add name="Transform" type="Matrix44">A transform matrix.</add>
    </niobject>

    <niobject name="bhkSphereRepShape" abstract="1" inherit="bhkShape">
        A havok shape, perhaps with a bounding sphere for quick rejection in addition to more detailed shape data?
        <add name="Material" type="HavokMaterial">The shape&#039;s material.</add>
        <add name="Radius" type="float">The radius of the sphere that encloses the shape.</add>
    </niobject>

    <niobject name="bhkConvexShape" abstract="1" inherit="bhkSphereRepShape">
        A havok shape.
    </niobject>

    <niobject name="bhkSphereShape" abstract="0" inherit="bhkConvexShape" ver1="20.0.0.5">
        A sphere.

    </niobject>

    <niobject name="bhkCapsuleShape" abstract="0" inherit="bhkConvexShape" ver1="20.0.0.5">
        A capsule.
        <add name="Unknown 8 Bytes" type="byte" arr1="8">Unknown.</add>
        <add name="First Point" type="Vector3">First point on the capsule's axis.</add>
        <add name="Radius 1" type="float">Matches first capsule radius.</add>
        <add name="Second Point" type="Vector3">Second point on the capsule's axis.</add>
        <add name="Radius 2" type="float">Matches second capsule radius.</add>
    </niobject>

    <niobject name="bhkBoxShape" abstract="0" inherit="bhkConvexShape" ver1="20.0.0.5">
        A box.
        <add name="Unknown 8 Bytes" type="byte" arr1="8">Unknown.</add>
        <add name="Dimensions" type="Vector3">Looks like this could be the box size.</add>
        <add name="Minimum Size" type="float">The smallest of the three sizes. Might be used for optimization.</add>
    </niobject>

    <niobject name="bhkConvexVerticesShape" abstract="0" inherit="bhkConvexShape" ver1="20.0.0.5">
        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.
        <add name="Unknown 6 Floats" type="float" arr1="6">Unknown. Must be (0.0,0.0,-0.0,0.0,0.0,-0.0) for arrow detection to work (mind the minus signs, -0.0 is 0x80000000 in hex).</add>
        <add name="Num Vertices" type="uint">Number of vertices.</add>
        <add name="Vertices" type="Vector4" arr1="Num Vertices">Vertices. Fourth component is 0. Lexicographically sorted.</add>
        <add name="Num Normals" type="uint">The number of half spaces.</add>
        <add name="Normals" type="Vector4" arr1="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.</add>
    </niobject>

    <!--Should inherit from bhkConvexShape according to hierarchy, but seems to be exactly the same as bhkTransformShape.-->
    <niobject name="bhkConvexTransformShape" abstract="0" inherit="bhkTransformShape" ver1="20.0.0.5">
        A convex transformed shape?
    </niobject>

    <niobject name="bhkMultiSphereShape" abstract="0" inherit="bhkSphereRepShape" ver1="20.0.0.5">
        Unknown.
        <add name="Unknown Float 1" type="float">Unknown.</add>
        <add name="Unknown Float 2" type="float">Unknown.</add>
        <add name="Num Spheres" type="uint">The number of spheres in this multi sphere shape.</add>
        <add name="Spheres" type="SphereBV" arr1="Num Spheres">This array holds the spheres which make up the multi sphere shape.</add>
    </niobject>

    <niobject name="bhkBvTreeShape" abstract="1" inherit="bhkShape">
        A tree-like Havok data structure stored in an assembly-like binary code?
    </niobject>

    <niobject name="bhkMoppBvTreeShape" abstract="0" inherit="bhkBvTreeShape">
        Memory optimized partial polytope bounding volume tree shape (not an entity).
        <add name="Shape" type="Ref" template="bhkShape">The shape.</add>
        <add name="Material" type="HavokMaterial">The shape's material.</add>
        <add name="Unknown 8 Bytes" type="byte" arr1="8">Unknown bytes, probably MOPP Header.</add>
        <add name="Unknown Float" type="float" default="1.0">Unknown float, might be scale.</add>
        <add name="MOPP Data Size" type="uint">Number of bytes for MOPP data.</add>
        <add name="Origin" type="Vector3">Origin of the object in mopp coordinates. This is the minimum of all vertices in the packed shape along each axis, minus 0.1.</add>
        <add name="Scale" type="float">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.</add>
        <add name="MOPP Data" type="byte" nifskopetype="blob" arr1="MOPP Data Size">The tree of bounding volume data.</add>
    </niobject>


    <niobject name="bhkShapeCollection" abstract="1" inherit="bhkShape">
        Havok collision object that uses multiple shapes?
    </niobject>

    <niobject name="bhkListShape" abstract="0" inherit="bhkShapeCollection">
        A list of shapes.

        Do not put a bhkPackedNiTriStripsShape in the Sub Shapes. Use a
        separate collision nodes without a list shape for those.

        Also, shapes collected in a bhkListShape may not have the correct
        walking noise, so only use it for non-walkable objects.
        <add name="Num Sub Shapes" type="uint">The number of sub shapes referenced.</add>
        <add name="Sub Shapes" type="Ref" template="bhkShape" arr1="Num Sub Shapes">List of shapes.</add>
        <add name="Material" type="HavokMaterial">The shape&#039;s material.</add>
        <add name="Unknown Floats" type="float" arr1="6">Unknown. Set to (0.0,0.0,-0.0,0.0,0.0,-0.0), where -0.0 is 0x80000000 in hex.</add>
        <add name="Num Unknown Ints" type="uint">Count.</add>
        <add name="Unknown Ints" type="uint" arr1="Num Unknown Ints">Unknown.</add>
    </niobject>

    <!--
    bhkMeshShape appears in some old Oblivion nifs, for instance
    meshes/architecture/basementsections/ungrdltraphingedoor.nif 
    but only in some distributions of Oblivion

    XXX not completely decoded, also the 4 dummy separator bytes seem
    to be missing from nifs that have this block
    -->
    <niobject name="bhkMeshShape" abstract="0" inherit="bhkShape"> 	 
      <add name="Unknown 1" type="int" arr1="8" /><!-- arr1="9" if no separator --> 
      <add name="Num Unknown Floats" type="int" /> 	 
      <add name="Unknown Floats" type="float" arr1="Num Unknown Floats" arr2="3" /> 	 
      <add name="Unknown 2" type="int" arr1="3" />
      <add name="Num Strips Data" type="uint" ver2="10.0.1.0">The number of strips data objects referenced.</add> 	 
      <add name="Strips Data" type="Ref" template="NiTriStripsData" arr1="Num Strips Data" ver2="10.0.1.0">Refers to a bunch of NiTriStripsData objects that make up this shape.</add> 	 
    </niobject>

    <niobject name="bhkPackedNiTriStripsShape" abstract="0" inherit="bhkShapeCollection" ver1="20.0.0.5">
        A shape constructed from strips data.
        <add name="Num Sub Shapes" type="ushort" ver2="20.0.0.5">Number of subparts.</add>
        <add name="Sub Shapes" type="OblivionSubShape" arr1="Num Sub Shapes" ver2="20.0.0.5">The subparts.</add>
        <add name="Unknown Floats" type="float" arr1="9">Unknown. A rotation matrix?</add>
        <add name="Scale" type="float" default="1.0">Scale.</add>
        <add name="Unknown Floats 2" type="float" arr1="3">Unknown. Translation?</add>
        <add name="Data" type="Ref" template="hkPackedNiTriStripsData">A link to the shape&#039;s NiTriStripsData.</add>
    </niobject>

    <niobject name="bhkNiTriStripsShape" abstract="0" inherit="bhkShapeCollection">
        A shape constructed from a bunch of strips.
        <add name="Material" type="HavokMaterial">The shape&#039;s material.</add>
        <add name="Unknown Float 1" type="float" default="0.1">Unknown.</add>
        <add name="Unknown Int 1" type="uint" default="0x004ABE60">Unknown.</add>
        <add name="Unknown Ints 1" type="uint" arr1="4">Unknown.</add>
        <add name="Unknown Int 2" type="uint" default="1">Unknown</add>
        <add name="Scale" type="Vector3" default="1.0, 1.0, 1.0">Scale. Usually (1.0, 1.0, 1.0).</add>
        <add name="Unknown Int 3" type="uint">Unknown.</add>
        <add name="Num Strips Data" type="uint">The number of strips data objects referenced.</add>
        <add name="Strips Data" type="Ref" template="NiTriStripsData" arr1="Num Strips Data">Refers to a bunch of NiTriStripsData objects that make up this shape.</add>
        <add name="Num Data Layers" type="uint">Number of Havok Layers, equal to Number of strips data objects.</add>
        <add name="Data Layers" type="OblivionColFilter" arr1="Num Data Layers">Havok Layers for each strip data.</add>
    </niobject>

    <niobject name="NiExtraData" abstract="1" inherit="NiObject">
        A generic extra data object.
        <add name="Name" type="string" ver1="10.0.1.0">Name of this object.</add>
        <add name="Next Extra Data" type="Ref" template="NiExtraData" ver2="4.2.2.0">Block number of the next extra data object.</add>
    </niobject>

    <niobject name="NiInterpolator" abstract="1" inherit="NiObject" ver1="10.2.0.0">
        Interpolator objects - function unknown.
    </niobject>

    <niobject name="NiKeyBasedInterpolator" abstract="1" inherit="NiInterpolator" ver1="10.2.0.0">
        Interpolator objects that use keys?
    </niobject>

    <niobject name="NiFloatInterpolator" abstract="0" inherit="NiKeyBasedInterpolator" ver1="10.2.0.0">
        Unknown.
        <add name="Float Value" type="float">Value when posed?  At time 0?</add>
        <add name="Data" type="Ref" template="NiFloatData">Float data?</add>
    </niobject>

    <niobject name="NiTransformInterpolator" abstract="0" inherit="NiKeyBasedInterpolator" ver1="10.2.0.0">
        An interpolator for transform keyframes.
        <add name="Translation" type="Vector3">Translate.</add>
        <add name="Rotation" type="Quaternion">Rotation.</add>
        <add name="Scale" type="float">Scale.</add>
        <add name="Unknown Bytes" type="byte" arr1="3" ver1="10.1.0.106" ver2="10.1.0.106">Unknown.</add>
        <add name="Data" type="Ref" template="NiTransformData">Refers to NiTransformData.</add>
    </niobject>

    <niobject name="NiPoint3Interpolator" abstract="0" inherit="NiKeyBasedInterpolator" ver1="10.2.0.0">
        Unknown.
        <add name="Point 3 Value" type="Vector3">Value when posed?  Value at time 0?</add>
        <add name="Data" type="Ref" template="NiPosData">Reference to NiPosData.</add>
    </niobject>

    <niobject name="NiPathInterpolator" abstract="0" inherit="NiKeyBasedInterpolator" ver1="20.0.0.5">
        Unknown interpolator.
        <add name="Unknown Short" type="ushort">Unknown.</add>
        <add name="Unknown Int" type="uint">Unknown.</add>
        <add name="Unknown Float 1" type="float">Unknown.</add>
        <add name="Unknown Float 2" type="float">Unknown.</add>
        <add name="Unknown Short 2" type="ushort">Unknown. Zero.</add>
        <add name="Pos Data" type="Ref" template="NiPosData">Links to NiPosData.</add>
        <add name="Float Data" type="Ref" template="NiFloatData">Links to NiFloatData.</add>
    </niobject>

    <niobject name="NiBoolInterpolator" abstract="0" inherit="NiKeyBasedInterpolator" ver1="10.2.0.0">
        Unknown.
        <add name="Bool Value" type="bool">Value when posed?  At time 0?</add>
        <add name="Data" type="Ref" template="NiBoolData">Refers to a NiBoolData object.</add>
    </niobject>

    <niobject name="NiBoolTimelineInterpolator" abstract="0" inherit="NiBoolInterpolator" ver1="20.0.0.5">
        Unknown.
    </niobject>

    <niobject name="NiBlendInterpolator" abstract="1" inherit="NiInterpolator" ver1="20.0.0.5">
        An extended type of interpolater.
        <add name="Unknown Short" type="ushort">Unknown.</add>
        <add name="Unknown Int" type="uint">Unknown.</add>
    </niobject>

    <niobject name="NiBSplineInterpolator" abstract="1" inherit="NiInterpolator">
        For interpolators storing data via a B-spline.
        <add name="Start Time" type="float">Animation start time.</add>
        <add name="Stop Time" type="float">Animation stop time.</add>
        <add name="Spline Data" type="Ref" template="NiBSplineData">Refers to NiBSplineData.</add>
        <add name="Basis Data" type="Ref" template="NiBSplineBasisData">Refers to NiBSPlineBasisData.</add>
    </niobject>

    <niobject name="NiObjectNET" abstract="1" inherit="NiObject">
        An object that can be controlled by a controller.
        <add name="Name" type="string">Name of this controllable object, used to refer to the object in .kf files.</add>
        <add name="Has Old Extra Data" type="uint" ver2="2.3">Extra data for pre-3.0 versions.</add>
        <add name="Old Extra Prop Name" cond="Has Old Extra Data" ver2="2.3" type="string">(=NiStringExtraData)</add>
        <add name="Old Extra Internal Id" cond="Has Old Extra Data" ver2="2.3" type="uint">ref</add>
        <add name="Old Extra String" cond="Has Old Extra Data" ver2="2.3" type="string">Extra string data.</add>
        <add name="Unknown Byte" type="byte" ver2="2.3">Always 0.</add>
        <add name="Extra Data" type="Ref" template="NiExtraData" ver1="3.0" ver2="4.2.2.0">Extra data object index. (The first in a chain)</add>
        <add name="Num Extra Data List" type="uint" ver1="10.0.1.0">The number of Extra Data objects referenced through the list.</add>
        <add name="Extra Data List" type="Ref" template="NiExtraData" arr1="Num Extra Data List" ver1="10.0.1.0">List of extra data indices.</add>
        <add name="Controller" type="Ref" template="NiTimeController" ver1="3.0">Controller object index. (The first in a chain)</add>
    </niobject>

    <niobject name="NiCollisionObject" abstract="0" inherit="NiObject" ver1="20.0.0.5">
        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.
        <add name="Target" type="Ptr" template="NiAVObject">Index of the AV object referring to this collision object.</add>
    </niobject>

    <niobject name="NiCollisionData" abstract="0" inherit="NiCollisionObject" ver1="10.0.1.0">
        Collision box.
        <add name="Propagation Mode" type="PropagationMode">Propagation Mode</add>
        <add name="Collision Mode" type="CollisionMode" ver1="10.1.0.0">Collision Mode</add>
        <add name="Use ABV" type="byte">Use Alternate Bounding Volume.</add>
        <add name="Bounding Volume" type="BoundingVolume" cond="Use ABV == 1">Collision data.</add>
    </niobject>

    <niobject name="bhkNiCollisionObject" abstract="1" inherit="NiCollisionObject">
        Havok related collision object?
        <add name="Flags" type="ushort" default="1">
            Set to "1" for most objects. Bits: 0=Active 2=Notify 3=Set Local 6=Reset
        </add>
        <add name="Body" type="Ref" template="NiObject">Links to the collision object data</add>
    </niobject>

    <niobject name="bhkCollisionObject" abstract="0" inherit="bhkNiCollisionObject">
        Havok related collision object?
    </niobject>

    <niobject name="bhkBlendCollisionObject" abstract="0" inherit="bhkCollisionObject" ver1="20.0.0.5">
        Unknown.
        <add name="Unknown Float 1" type="float">Blending parameter?</add>
        <add name="Unknown Float 2" type="float">Another blending parameter?</add>
    </niobject>

    <niobject name="bhkPCollisionObject" abstract="0" inherit="bhkNiCollisionObject" ver1="20.0.0.5">
        Unknown.
    </niobject>

    <niobject name="bhkSPCollisionObject" abstract="0" inherit="bhkPCollisionObject" ver1="20.0.0.5">
        Unknown.
    </niobject>

    <niobject name="NiAVObject" abstract="1" inherit="NiObjectNET">
        Generic node object.
        <add name="Flags" type="Flags" ver1="3.0">Some flags; commonly 0x000C or 0x000A.</add>
        <add name="Unknown Short 1" type="ushort" default="8" ver1="20.2.0.7" vercond="(User Version == 11) &amp;&amp; (User Version 2 > 26)" >Unknown Flag</add>
        <add name="Translation" type="Vector3">The translation vector.</add>
        <add name="Rotation" type="Matrix33">The rotation part of the transformation matrix.</add>
        <add name="Scale" type="float" default="1.0">Scaling part (only uniform scaling is supported).</add>
        <add name="Velocity" type="Vector3" ver2="4.2.2.0">Unknown function. Always seems to be (0, 0, 0)</add>
        <add name="Num Properties" type="uint">The number of property objects referenced.</add>
        <add name="Properties" type="Ref" template="NiProperty" arr1="Num Properties">List of node properties.</add>
        <add name="Unknown 1" type="uint" arr1="4" ver2="2.3">Always 2,0,2,0.</add>
        <add name="Unknown 2" type="byte" ver2="2.3">0 or 1.</add>
        <add name="Has Bounding Box" type="bool" ver1="3.0" ver2="4.2.2.0">Do we have a bounding box?</add>
        <add name="Bounding Box" type="BoundingBox" cond="Has Bounding Box != 0" ver1="3.0" ver2="4.2.2.0">The bounding box.</add>
        <add name="Collision Object" type="Ref" template="NiCollisionObject" ver1="10.0.1.0">Refers to NiCollisionObject, which is usually a bounding box or other simple collision shape.  In Oblivion this links the Havok objects.</add>
    </niobject>

    <niobject name="NiDynamicEffect" abstract="1" inherit="NiAVObject">
        A dynamic effect such as a light or environment map.
        <add name="Switch State" type="bool" ver1="10.1.0.106">Turns effect on and off?  Switches list to list of unaffected nodes?</add>
        <add name="Num Affected Node List Pointers" type="uint" ver2="4.0.0.2">The number of affected nodes referenced.</add>
        <add name="Num Affected Nodes" type="uint" ver1="10.1.0.0">The number of affected nodes referenced.</add>
        <add name="Affected Node List Pointers" type="uint" arr1="Num Affected Node List Pointers" ver2="4.0.0.2">This is probably the list of affected nodes. For some reason i do not know the max exporter seems to write pointers instead of links. But it doesn&#039;t matter because at least in version 4.0.0.2 the list is automagically updated by the engine during the load stage.</add>
        <add name="Affected Nodes" type="Ref" template="NiAVObject" arr1="Num Affected Nodes" ver1="10.1.0.0">The list of affected nodes?</add>
    </niobject>

    <niobject name="NiLight" abstract="1" inherit="NiDynamicEffect">
        Light source.
        <add name="Dimmer" type="float">Dimmer.</add>
        <add name="Ambient Color" type="Color3">Ambient color.</add>
        <add name="Diffuse Color" type="Color3">Diffuse color.</add>
        <add name="Specular Color" type="Color3">Specular color.</add>
    </niobject>

    <niobject name="NiProperty" abstract="1" inherit="NiObjectNET">
        A generic property object.
    </niobject>

    <niobject name="NiTransparentProperty" abstract="0" ver1="3.1" ver2="3.1" inherit="NiProperty">
        Unknown
        <add name="Unknown" type="byte" arr1="6">Unknown.</add>
    </niobject>

    <niobject name="NiPSysModifier" abstract="1" inherit="NiObject" ver1="10.1.0.0">
        Generic particle system modifier object.
        <add name="Name" type="string">The object name.</add>
        <add name="Order" type="uint">Modifier ID in the particle modifier chain (always a multiple of 1000)?</add>
        <add name="Target" type="Ptr" template="NiParticleSystem">NiParticleSystem parent of this modifier.</add>
        <add name="Active" type="bool">Whether the modifier is currently in effect?  Usually true.</add>
    </niobject>

    <niobject name="NiPSysEmitter" abstract="1" inherit="NiPSysModifier" ver1="10.1.0.0">
        A particle emitter?
        <add name="Speed" type="float">Speed / Inertia of particle movement.</add>
        <add name="Speed Variation" type="float">Adds an amount of randomness to Speed.</add>
        <add name="Declination" type="float">Declination / First axis.</add>
        <add name="Declination Variation" type="float">Declination randomness / First axis.</add>
        <add name="Planar Angle" type="float">Planar Angle / Second axis.</add>
        <add name="Planar Angle Variation" type="float">Planar Angle randomness / Second axis .</add>
        <add name="Initial Color" type="Color4">Defines color of a birthed particle.</add>
        <add name="Initial Radius" type="float">Size of a birthed particle.</add>
        <add name="Radius Variation" type="float" ver1="10.4.0.1">Particle Radius randomness.</add>
        <add name="Life Span" type="float">Duration until a particle dies.</add>
        <add name="Life Span Variation" type="float">Adds randomness to Life Span.</add>
    </niobject>

    <niobject name="NiPSysVolumeEmitter" abstract="1" inherit="NiPSysEmitter" ver1="10.1.0.0">
        An emitter that emits meshes?
        <add name="Emitter Object" type="Ptr" template="NiNode" ver1="10.1.0.0">Node parent of this modifier?</add>
    </niobject>

    <niobject name="NiTimeController" abstract="1" inherit="NiObject">
        A generic time controller object.
        <add name="Next Controller" type="Ref" template="NiTimeController">Index of the next controller.</add>
        <add name="Flags" type="Flags">
            Controller flags (usually 0x000C). Probably controls loops.
            Bit 0 : Anim type, 0=APP_TIME 1=APP_INIT
            Bit 1-2 : Cycle type  00=Loop 01=Reverse 10=Loop
            Bit 3 : Active
            Bit 4 : Play backwards
        </add>
        <add name="Frequency" type="float">Frequency (is usually 1.0).</add>
        <add name="Phase" type="float">Phase (usually 0.0).</add>
        <add name="Start Time" type="float">Controller start time.</add>
        <add name="Stop Time" type="float">Controller stop time.</add>
        <add name="Target" type="Ptr" template="NiObjectNET" ver1="3.3.0.13">Controller target (object index of the first controllable ancestor of this object).</add>
        <add name="Unknown Integer" type="uint" ver2="3.1">Unknown integer.</add>
    </niobject>


    <niobject name="NiInterpController" abstract="1" inherit="NiTimeController">
        A controller capable of interpolation?
    </niobject>

    <niobject name="NiMultiTargetTransformController" abstract="0" inherit="NiInterpController" ver1="10.2.0.0">
        Unknown.
        <add name="Num Extra Targets" type="ushort">The number of target pointers that follow.</add>
        <add name="Extra Targets" type="Ptr" template="NiAVObject" arr1="Num Extra Targets">NiNode Targets to be controlled.</add>
    </niobject>

    <niobject name="NiGeomMorpherController" abstract="0" inherit="NiInterpController">
        Time controller for geometry morphing.
        <add name="Extra Flags" type="Flags" ver1="10.0.1.2">Unknown.</add>
        <add name="Unknown 2" type="byte" ver1="10.1.0.106" ver2="10.1.0.106">Unknown.</add>
        <add name="Data" type="Ref" template="NiMorphData">Geometry morphing data index.</add>
        <add name="Always Update" type="byte">Always Update</add>
        <add name="Num Interpolators" type="uint" ver1="10.1.0.106">The number of interpolator objects.</add>
        <add name="Interpolators" type="Ref" template="NiInterpolator" arr1="Num Interpolators" ver1="10.1.0.106" ver2="20.2.0.6">List of interpolators.</add>
        <add name="Interpolator Weights" type="MorphWeight" arr1="Num Interpolators" ver1="20.2.0.7">Weighted Interpolators?</add>
        <add name="Num Unknown Ints" type="uint" ver1="20.0.0.4" ver2="20.0.0.5" vercond="(User Version == 10) || (User Version == 11)">A count.</add>
        <add name="Unknown Ints" type="uint" arr1="Num Unknown Ints" ver1="20.0.0.4" ver2="20.0.0.5" vercond="(User Version == 10) || (User Version == 11)">Unknown.</add>
    </niobject>

    <niobject name="NiMorphController" abstract="0" inherit="NiInterpController" ver2="3.03">
        Unknown! Used by Daoc->'healing.nif'.
    </niobject>

    <niobject name="NiMorpherController" abstract="0" inherit="NiInterpController" ver2="3.1">
        Unknown! Used by Daoc.
        <add name="Data" type="Ref" template="NiMorphData">This controller's data.</add>
    </niobject>

    <niobject name="NiSingleInterpController" abstract="1" inherit="NiInterpController">
        A controller referring to a single interpolator.
        <add name="Interpolator" type="Ref" template="NiInterpolator" ver1="10.2.0.0">Link to interpolator.</add>
    </niobject>

    <niobject name="NiKeyframeController" abstract="0" inherit="NiSingleInterpController">
        A time controller object for animation key frames.
        <add name="Data" type="Ref" template="NiKeyframeData" ver2="10.1.0.0">Keyframe controller data index.</add>
    </niobject>

    <niobject name="NiTransformController" abstract="0" inherit="NiKeyframeController" ver1="10.2.0.0">
        NiTransformController replaces the NiKeyframeController.
    </niobject>

    <niobject name="NiPSysModifierCtlr" abstract="1" inherit="NiSingleInterpController" ver1="10.2.0.0">
        A particle system modifier controller.
        <add name="Modifier Name" type="string">Refers to modifier object by its name?</add>
    </niobject>

    <niobject name="NiPSysEmitterCtlr" abstract="0" inherit="NiPSysModifierCtlr" ver1="10.1.0.0">
        Particle system emitter controller.
        <add name="Data" type="Ref" template="NiPSysEmitterCtlrData" ver2="10.1.0.0">This controller's data</add>
        <add name="Visibility Interpolator" type="Ref" template="NiInterpolator" ver1="10.2.0.0">Links to a bool interpolator. Controls emitter&#039;s visibility status?</add>
    </niobject>

    <niobject name="NiPSysModifierBoolCtlr" abstract="1" inherit="NiPSysModifierCtlr" ver1="10.2.0.0">
        A particle system modifier controller that deals with boolean data?
    </niobject>

    <niobject name="NiPSysModifierActiveCtlr" abstract="0" inherit="NiPSysModifierBoolCtlr" ver1="20.0.0.5">
        Unknown.
        <add name="Data" type="Ref" template="NiVisData" ver2="10.1.0.0">This controller's data.</add>
    </niobject>

    <niobject name="NiPSysModifierFloatCtlr" abstract="1" inherit="NiPSysModifierCtlr" ver1="10.2.0.0">
        A particle system modifier controller that deals with floating point data?
        <add name="Data" type="Ref" template="NiFloatData" ver2="10.1.0.0">This controller's data.</add>
    </niobject>

    <niobject name="NiPSysEmitterDeclinationCtlr" abstract="0" inherit="NiPSysModifierFloatCtlr" ver1="10.1.0.0">
        Unknown.
    </niobject>

    <niobject name="NiPSysEmitterDeclinationVarCtlr" abstract="0" inherit="NiPSysModifierFloatCtlr" ver1="20.0.0.4">
        Unknown.
    </niobject>

    <niobject name="NiPSysEmitterInitialRadiusCtlr" abstract="0" inherit="NiPSysModifierFloatCtlr" ver1="10.1.0.0">
        Unknown.
    </niobject>

    <niobject name="NiPSysEmitterLifeSpanCtlr" abstract="0" inherit="NiPSysModifierFloatCtlr" ver1="20.0.0.5">
        Unknown.
    </niobject>

    <niobject name="NiPSysEmitterSpeedCtlr" abstract="0" inherit="NiPSysModifierFloatCtlr" ver1="20.0.0.5">
        Unknown.
    </niobject>

    <niobject name="NiPSysGravityStrengthCtlr" abstract="0" inherit="NiPSysModifierFloatCtlr" ver1="20.0.0.5">
        Unknown.
    </niobject>


    <niobject name="NiFloatInterpController" abstract="1" inherit="NiSingleInterpController" ver1="10.2.0.0">
        A controller that interpolates floating point numbers?
    </niobject>

    <niobject name="NiFlipController" abstract="0" inherit="NiFloatInterpController">
        Texture flipping controller.
        <add name="Texture Slot" type="TexType">Target texture slot (0=base, 4=glow).</add>
        <add name="Unknown Int 2" type="uint" ver1="4.0.0.0" ver2="10.1.0.0">0?</add>
        <add name="Delta" type="float" ver2="10.1.0.0">
            Time between two flips.
            delta = (start_time - stop_time) / sources.num_indices
        </add>
        <add name="Num Sources" type="uint">The number of source objects.</add>
        <add name="Sources" type="Ref" template="NiSourceTexture" arr1="Num Sources" ver1="4.0.0.0">The texture sources.</add>
        <add name="Images" type="Ref" template="NiImage" arr1="Num Sources" ver2="3.1">The image sources</add>
    </niobject>

    <niobject name="NiAlphaController" abstract="0" inherit="NiFloatInterpController">
        Time controller for transparency.
        <add name="Data" type="Ref" template="NiFloatData" ver2="10.1.0.0">Alpha controller data index.</add>
    </niobject>

    <niobject name="NiTextureTransformController" abstract="0" inherit="NiFloatInterpController" ver1="10.1.0.0">
        Texture transformation controller. The target texture slot should have "Has Texture Transform" enabled.
        <add name="Unknown2" type="byte">Unknown.</add>
        <add name="Texture Slot" type="TexType"> The target texture slot.</add>
        <add name="Operation" type="TexTransform">Determines how this controller animates the UV Coordinates.</add>
        <add name="Data" type="Ref" template="NiFloatData" ver2="10.1.0.0">Link to NiFloatData.</add>
    </niobject>

    <niobject name="NiLightDimmerController" abstract="0" inherit="NiFloatInterpController" ver1="20.0.0.4">
        Unknown controller.
    </niobject>

    <niobject name="NiBoolInterpController" abstract="1" inherit="NiSingleInterpController" ver1="10.2.0.0">
        A controller that interpolates floating point numbers?
    </niobject>

    <niobject name="NiVisController" abstract="0" inherit="NiBoolInterpController">
        Time controller for visibility.
        <add name="Data" type="Ref" template="NiVisData" ver2="10.1.0.0">Visibility controller data object index.</add>
    </niobject>

    <niobject name="NiPoint3InterpController" abstract="1" inherit="NiSingleInterpController" ver1="10.2.0.0">
        A controller that interpolates point 3 data?
        <add name="Target Color" type="TargetColor" ver1="10.1.0.0">Selects which color to control.</add>
        <add name="Data" type="Ref" template="NiPosData" ver2="10.1.0.0">Material color controller data object index. Points to NiPosData.</add>
    </niobject>

    <niobject name="NiMaterialColorController" abstract="0" inherit="NiPoint3InterpController">
        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)
    </niobject>

    <niobject name="NiLightColorController" abstract="0" inherit="NiPoint3InterpController" ver1="4.2.0.2">
        Light color animation controller.
    </niobject>


    <niobject name="NiExtraDataController" abstract="1" inherit="NiSingleInterpController" ver1="10.2.0.0">
        An controller for extra data.
    </niobject>

    <niobject name="NiFloatExtraDataController" abstract="0" inherit="NiExtraDataController" ver1="10.1.0.0">
        Unknown.
        <add name="Controller Data" type="string" ver1="10.2.0.0">Refers to a NiFloatExtraData name.</add>
        <add name="Num Extra Bytes" type="byte" ver2="10.1.0.0">Number of extra bytes.</add>
        <add name="Unknown Bytes" type="byte" arr1="7" ver2="10.1.0.0">Unknown.</add>
        <add name="Unknown Extra Bytes" type="byte" arr1="Num Extra Bytes" ver2="10.1.0.0">Unknown.</add>
    </niobject>

    <niobject name="NiBoneLODController" abstract="0" inherit="NiTimeController" ver1="4.2.2.0">
        Level of detail controller for bones.  Priority is arranged from low to high.
        <add name="Unknown Int 1" type="uint">Unknown.</add>
        <add name="Num Node Groups" type="uint">Number of node groups.</add>
        <add name="Num Node Groups 2" type="uint">Number of node groups.</add>
        <add name="Node Groups" type="NodeGroup" arr1="Num Node Groups">A list of node groups (each group a sequence of bones).</add>
        <add name="Num Shape Groups" type="uint" ver1="4.2.2.0" userver="0">Number of shape groups.</add>
        <add name="Shape Groups 1" type="SkinShapeGroup" arr1="Num Shape Groups"  ver1="4.2.2.0" userver="0">List of shape groups.</add>
        <add name="Num Shape Groups 2" type="uint"  ver1="4.2.2.0" userver="0">The size of the second list of shape groups.</add>
        <add name="Shape Groups 2" type="Ref" template="NiTriBasedGeom" arr1="Num Shape Groups 2"  ver1="4.2.2.0" userver="0">Group of NiTriShape indices.</add>
    </niobject>

    <niobject name="NiBSBoneLODController" abstract="0" inherit="NiBoneLODController">
        A simple LOD controller for bones.
    </niobject>

    <niobject name="NiGeometry" abstract="1" inherit="NiAVObject">
        Describes a visible scene element with vertices like a mesh, a particle system, lines, etc.
        <add name="Data" type="Ref" template="NiGeometryData">Data index (NiTriShapeData/NiTriStripData).</add>
        <add name="Skin Instance" type="Ref" template="NiSkinInstance" ver1="3.3.0.13">Skin instance index.</add>
        <add name="Num Materials" type="uint" ver1="20.2.0.7">Num Materials</add>
        <add name="Material Name" type="string" arr1="Num Materials" ver1="20.2.0.7">Unknown string.  Shader?</add>
        <add name="Material Extra Data" type="int" arr1="Num Materials" ver1="20.2.0.7">Unknown integer; often -1. (Is this a link, array index?)</add>
        <add name="Active Material" type="int" ver1="20.2.0.7" default="0">Active Material; often -1. (Is this a link, array index?)</add>
        <add name="Has Shader" type="bool" ver1="10.0.1.0" ver2="20.1.0.3">Shader.</add>
        <add name="Shader Name" type="string" cond="Has Shader != 0" ver1="10.0.1.0" ver2="20.1.0.3">The shader name.</add>
        <add name="Unknown Integer" type="int" cond="Has Shader != 0" ver1="10.0.1.0" ver2="20.1.0.3">Unknown value, usually -1. (Not a link)</add>
        <add name="Unknown Byte" type="byte" default="255" userver="1">Cyanide extension (only in version 10.2.0.0?).</add>
        <add name="Unknown Integer 2" type="int" ver1="10.4.0.1" ver2="10.4.0.1">Unknown.</add>
        <add name="Dirty Flag" type="bool" ver1="20.2.0.7">Dirty Flag?</add>
    </niobject>

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

    <niobject name="NiGeometryData" abstract="1" inherit="NiObject">
        Mesh data: vertices, vertex normals, etc.
        <add name="Unknown Int" type="int" ver1="10.2.0.0">Unknown identifier. Always 0.</add>
        <add name="Num Vertices" type="ushort">Number of vertices. For NiPSysData this is max particles.</add>
        <add name="Keep Flags" type="byte" ver1="10.1.0.0">Used with NiCollision objects when OBB or TRI is set.</add>
        <add name="Compress Flags" type="byte" ver1="10.1.0.0">Unknown.</add>
        <add name="Has Vertices" type="bool" default="1">Is the vertex array present? (Always non-zero.)</add>
        <add name="Vertices" type="Vector3" arr1="Num Vertices" cond="Has Vertices != 0">The mesh vertices.</add>
        <add name="Num UV Sets" type="ushort" vercond="((Version >= 10.0.1.0) &amp;&amp; (!((Version >= 20.2.0.7) &amp;&amp; (User Version == 11))))">Methods for saving binormals and tangents saved in upper byte.  Texture flags in lower byte.</add>
        <add name="BS Num UV Sets" type="ushort" vercond="((Version >= 20.2.0.7) &amp;&amp; (User Version == 11))">Bethesda's version of this field for nif versions 20.2.0.7 and up. Only a single bit denotes whether uv's are present. For example, see meshes/architecture/megaton/megatonrampturn45sml.nif in Fallout 3.</add>
        <add 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.</add>
        <add name="Normals" type="Vector3" arr1="Num Vertices" cond="Has Normals != 0">The lighting normals.</add>
        <add name="Tangents" type="Vector3" arr1="Num Vertices" cond="(Has Normals != 0) &amp;&amp; ((Num UV Sets &amp; 61440) | (BS Num UV Sets &amp; 61440))" ver1="10.1.0.0">Tangent vectors.</add>
        <add name="Bitangents" type="Vector3" arr1="Num Vertices" cond="(Has Normals != 0) &amp;&amp; ((Num UV Sets &amp; 61440) | (BS Num UV Sets &amp; 61440))" ver1="10.1.0.0">Bitangent vectors.</add>
        <add name="Center" type="Vector3">Center of the bounding box (smallest box that contains all vertices) of the mesh.</add>
        <add name="Radius" type="float">Radius of the mesh: maximal Euclidean distance between the center and all vertices.</add>
        <add 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.
        </add>
        <add name="Vertex Colors" type="Color4" arr1="Num Vertices" cond="Has Vertex Colors != 0">The vertex colors.</add>
        <add name="Num UV Sets" type="ushort" ver2="4.2.2.0">The lower 6 (or less?) bits of this field represent the number of UV texture sets. The other bits are probably flag bits. For versions 10.1.0.0 and up, if bit 12 is set then extra vectors are present after the normals.</add>
        <add name="Has UV" type="bool" ver2="4.0.0.2">
            Do we have UV coordinates?

            Note: for compatibility with NifTexture, set this value to either 0x00000000 or 0xFFFFFFFF.
        </add>
        <add name="UV Sets" type="TexCoord" arr1="(Num UV Sets &amp; 63) | (BS Num UV Sets &amp; 1)" arr2="Num Vertices">The UV texture coordinates. They follow the OpenGL standard: some programs may require you to flip the second coordinate.</add>
        <add name="Consistency Flags" type="ConsistencyType" ver1="10.0.1.0" default="0">Consistency Flags</add>
        <add name="Additional Data" type="Ref" template="NiAdditionalGeometryData" ver1="20.0.0.4">Unknown.</add>
    </niobject>

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

    <niobject name="bhkBlendController" abstract="0" inherit="NiTimeController" ver1="20.0.0.5">
        Unknown. Is apparently only used in skeleton.nif files.
        <add name="Unknown Int" type="uint">Seems to be always zero.</add>
    </niobject>

    <niobject name="BSBound" abstract="0" inherit="NiExtraData" ver1="20.0.0.5">
        Bethesda-specific collision bounding box for skeletons.
        <add name="Center" type="Vector3">Center of the bounding box.</add>
        <add name="Dimensions" type="Vector3">Dimensions of the bounding box from center.</add>
    </niobject>

    <niobject name="BSFurnitureMarker" abstract="0" inherit="NiExtraData" ver1="20.0.0.5">
        Unknown. Marks furniture sitting positions?
        <add name="Num Positions" type="uint">Number of positions.</add>
        <add name="Positions" type="FurniturePosition" arr1="Num Positions">Unknown. Probably has something to do with the furniture positions?</add>
    </niobject>

    <niobject name="BSParentVelocityModifier" abstract="0" inherit="NiPSysModifier" ver1="20.0.0.5">
        Particle modifier that adds a blend of object space translation and rotation to particles born in world space.
        <add name="Damping" type="float">Amount of blending?</add>
    </niobject>

    <niobject name="BSPSysArrayEmitter" abstract="0" inherit="NiPSysVolumeEmitter" ver1="20.0.0.5">
        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" abstract="0" inherit="NiPSysModifier" ver1="20.0.0.5">
        Particle Modifier that uses the wind value from the gamedata to alter the path of particles.
        <add name="Strength" type="float">The amount of force wind will have on particles.</add>
    </niobject>

    <niobject name="hkPackedNiTriStripsData" abstract="0" inherit="bhkShapeCollection" ver1="20.0.0.5">
        NiTriStripsData for havok data?
        <add name="Num Triangles" type="uint">Number of triangles?</add>
        <add name="Triangles" type="hkTriangle" arr1="Num Triangles">The physics triangles?</add>
        <add name="Num Vertices" type="uint">Number of vertices.</add>
        <add name="Unknown Byte 1" type="byte" ver1="20.2.0.7">Unknown.</add>
        <add name="Vertices" type="Vector3" arr1="Num Vertices">The vertices?</add>
        <add name="Num Sub Shapes" type="ushort" ver1="20.2.0.7">Number of subparts.</add>
        <add name="Sub Shapes" type="OblivionSubShape" arr1="Num Sub Shapes" ver1="20.2.0.7">The subparts.</add>
    </niobject>

    <niobject name="NiAlphaProperty" abstract="0" inherit="NiProperty">
        Transparency. Flags 0x00ED.
        <add name="Flags" type="Flags" default="237">
            Bit 0 : alpha blending enable
            Bits 1-4 : source blend mode
            Bits 5-8 : destination blend mode
            Bit 9 : alpha test enable
            Bit 10-12 : alpha test mode
            Bit 13 : no sorter flag ( disables triangle sorting )

            blend modes (glBlendFunc):
            0000 GL_ONE
            0001 GL_ZERO
            0010 GL_SRC_COLOR
            0011 GL_ONE_MINUS_SRC_COLOR
            0100 GL_DST_COLOR
            0101 GL_ONE_MINUS_DST_COLOR
            0110 GL_SRC_ALPHA
            0111 GL_ONE_MINUS_SRC_ALPHA
            1000 GL_DST_ALPHA
            1001 GL_ONE_MINUS_DST_ALPHA
            1010 GL_SRC_ALPHA_SATURATE

            test modes (glAlphaFunc):
            000 GL_ALWAYS
            001 GL_LESS
            010 GL_EQUAL
            011 GL_LEQUAL
            100 GL_GREATER
            101 GL_NOTEQUAL
            110 GL_GEQUAL
            111 GL_NEVER
        </add>
        <add name="Threshold" type="byte">Threshold for alpha testing (see: glAlphaFunc)</add>
    </niobject>

    <niobject name="NiAmbientLight" abstract="0" inherit="NiLight">
        Ambient light source.
    </niobject>

    <niobject name="NiParticlesData" abstract="0" inherit="NiGeometryData">
        Generic rotating particles data object.
        <add name="Num Particles" type="ushort" ver2="4.0.0.2">The maximum number of particles (matches the number of vertices).</add>
        <add name="Particle Radius" type="float" ver2="10.0.1.0">The particles&#039; size.</add>
        <add name="Has Radii" type="bool" ver1="10.1.0.0">Is the particle size array present?</add>
        <add name="Radii" type="float" arr1="Num Vertices" cond="Has Radii != 0" ver1="10.1.0.0" vercond="!((Version >= 20.2.0.7) &amp;&amp; (User Version == 11))">The individual particel sizes.</add>
        <add 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.</add>
        <add name="Has Sizes" type="bool">Is the particle size array present?</add>
        <add name="Sizes" type="float" arr1="Num Vertices" cond="Has Sizes != 0" vercond="!((Version >= 20.2.0.7) &amp;&amp; (User Version == 11))">The individual particel sizes.</add>
        <add name="Has Rotations" type="bool" ver1="10.0.1.0">Is the particle rotation array present?</add>
        <add name="Rotations" type="Quaternion" arr1="Num Vertices" cond="Has Rotations != 0" ver1="10.0.1.0" vercond="!((Version >= 20.2.0.7) &amp;&amp; (User Version == 11))">The individual particle rotations.</add>
        <add name="Has Rotation Angles" type="bool" ver1="20.0.0.4">Are the angles of rotation present?</add>
        <add name="Rotation Angles" type="float" arr1="Num Vertices" cond="Has Rotation Angles != 0" vercond="!((Version >= 20.2.0.7) &amp;&amp; (User Version == 11))">Angles of rotation</add>
        <add name="Has Rotation Axes" type="bool" ver1="20.0.0.4">Are axes of rotation present?</add>
        <add name="Rotation Axes" type="Vector3" arr1="Num Vertices" cond="Has Rotation Axes != 0" ver1="20.0.0.4" vercond="!((Version >= 20.2.0.7) &amp;&amp; (User Version == 11))">Unknown</add>

        <add name="Has Unknown Stuff 1" type="bool" vercond="(Version >= 20.2.0.7) &amp;&amp; (User Version == 11)">Unknown ushort</add>
        <add name="Num Unknown Stuff 1" type="short" vercond="(Version >= 20.2.0.7) &amp;&amp; (User Version == 11)">Unknown</add>
        <add name="Unknown Stuff 1" type="Vector4" arr1="Num Unknown Stuff 1" cond="Has Unknown Stuff 1 != 0" vercond="(Version >= 20.2.0.7) &amp;&amp; (User Version == 11)">Unknown</add>
    </niobject>

    <niobject name="NiRotatingParticlesData" abstract="0" inherit="NiParticlesData">
        Rotating particles data object.
        <add name="Has Rotations 2" type="bool" ver2="4.2.2.0">Is the particle rotation array present?</add>
        <add name="Rotations 2" type="Quaternion" arr1="Num Vertices" cond="Has Rotations 2 != 0" ver2="4.2.2.0">The individual particle rotations.</add>
    </niobject>

    <niobject name="NiAutoNormalParticlesData" abstract="0" inherit="NiParticlesData" ver2="4.2.2.0">
        Particle system data object (with automatic normals?).
    </niobject>

    <compound name="ParticleDesc">
        Particle Description.
        <add name="Translation" type="Vector3">Unknown.</add>
        <add name="Unknown Floats 1" type="float" arr1="3" ver2="10.4.0.1">Unknown.</add>
        <add name="Unknown Float 1" type="float" default="0.9">Unknown.</add>
        <add name="Unknown Float 2" type="float" default="0.9">Unknown.</add>
        <add name="Unknown Float 3" type="float" default="3.0">Unknown.</add>
        <add name="Unknown Int 1" type="int">Unknown.</add>
    </compound>

    <niobject name="NiPSysData" abstract="0" inherit="NiRotatingParticlesData" ver1="10.0.1.0">
        Particle system data.
        <add name="Particle Descriptions" type="ParticleDesc" arr1="Num Vertices" vercond="!((Version >= 20.2.0.7) &amp;&amp; (User Version == 11))">Unknown.</add>
        <add name="Has Unknown Floats 3" type="bool" ver1="20.0.0.4" vercond="!((Version >= 20.2.0.7) &amp;&amp; (User Version == 11))">Unknown.</add>
        <add name="Unknown Floats 3" type="float" arr1="Num Vertices" cond="Has Unknown Floats 3 != 0" ver1="20.0.0.4" vercond="!((Version >= 20.2.0.7) &amp;&amp; (User Version == 11))">Unknown.</add>
        <add name="Unknown Short 1" type="ushort" vercond="!((Version >= 20.2.0.7) &amp;&amp; (User Version == 11))">Unknown.</add>
        <add name="Unknown Short 2" type="ushort" vercond="!((Version >= 20.2.0.7) &amp;&amp; (User Version == 11))">Unknown.</add>
    </niobject>

    <niobject name="NiMeshPSysData" abstract="0" inherit="NiPSysData" ver1="10.1.0.0">
        Particle meshes data.
        <add name="Unknown Int 2" type="uint" ver1="10.2.0.0">Unknown. Possible vertex count but probably not.</add>
        <add name="Unknown Byte 3" type="byte" default="0" ver1="10.2.0.0">Unknown. 0?</add>
        <add name="Num Unknown Ints 1" type="uint" ver1="10.2.0.0">Unknown.</add>
        <add name="Unknown Ints 1" type="uint" ver1="10.2.0.0" arr1="Num Unknown Ints 1">Unknown integers</add>
        <add name="Unknown Node" type="Ref" template="NiNode">Unknown NiNode.</add>
    </niobject>

    <niobject name="NiBinaryExtraData" abstract="0" inherit="NiExtraData" ver1="10.1.0.0">
        Binary extra data object. Used to store normals and binormals in Oblivion.
        <add name="Binary Data" type="ByteArray">The binary data.</add>
    </niobject>

    <niobject name="NiBinaryVoxelExtraData" abstract="0" inherit="NiExtraData" ver1="3.1">
        Voxel extra data object.
        <add name="Unknown Int" type="uint" default="0">Unknown.  0?</add>
        <add name="Data" type="Ref" template="NiBinaryVoxelData">Link to binary voxel data.</add>
    </niobject>

    <niobject name="NiBinaryVoxelData" abstract="0" inherit="NiObject" ver1="3.1">
        Voxel data object.
        <add name="Unknown Short 1" type="ushort">Unknown.</add>
        <add name="Unknown Short 2" type="ushort">Unknown.</add>
        <add name="Unknown Short 3" type="ushort">Unknown. Is this^3 the Unknown Bytes 1 size?</add>
        <add name="Unknown 7 Floats" type="float" arr1="7">Unknown.</add>
        <add name="Unknown Bytes 1" type="byte" arr1="7" arr2="12">Unknown. Always a multiple of 7.</add>
        <add name="Num Unknown Vectors" type="uint">Unknown.</add>
        <add name="Unknown Vectors" type="Vector4" arr1="Num Unknown Vectors">Vectors on the unit sphere.</add>
        <add name="Num Unknown Bytes 2" type="uint">Unknown.</add>
        <add name="Unknown Bytes 2" type="byte" arr1="Num Unknown Bytes 2">Unknown.</add>
        <add name="Unknown 5 Ints" type="uint" arr1="5">Unknown.</add>
    </niobject>

    <niobject name="NiBlendBoolInterpolator" abstract="0" inherit="NiBlendInterpolator" ver1="20.0.0.5">
        An interpolator for a bool.
        <add name="Bool Value" type="byte">The interpolated bool?</add>
    </niobject>

    <niobject name="NiBlendFloatInterpolator" abstract="0" inherit="NiBlendInterpolator" ver1="20.0.0.5">
        An interpolator for a float.
        <add name="Float Value" type="float">The interpolated float?</add>
    </niobject>

    <niobject name="NiBlendPoint3Interpolator" abstract="0" inherit="NiBlendInterpolator" ver1="20.0.0.5">
        Interpolates a point?
        <add name="Point Value" type="Vector3">The interpolated point?</add>
    </niobject>

    <niobject name="NiBlendTransformInterpolator" abstract="0" inherit="NiBlendInterpolator" ver1="20.0.0.5">
        Unknown.
    </niobject>

    <niobject name="NiBoolData" abstract="0" inherit="NiObject" ver1="10.2.0.0">
        Timed boolean data.
        <add name="Data" type="KeyGroup" template="byte">The boolean keys.</add>
    </niobject>

    <niobject name="NiBooleanExtraData" abstract="0" inherit="NiExtraData" ver1="10.0.1.0">
        Boolean extra data.
        <add name="Boolean Data" type="byte">The boolean extra data value.</add>
    </niobject>

    <niobject name="NiBSplineBasisData" abstract="0" inherit="NiObject" ver1="20.0.0.4">
        Stores the number of control points of a B-spline.
        <add 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).</add>
    </niobject>

    <niobject name="NiBSplineFloatInterpolator" abstract="1" inherit="NiBSplineInterpolator" ver1="20.0.0.4">
        Unknown.
    </niobject>

    <niobject name="NiBSplineCompFloatInterpolator" abstract="0" inherit="NiBSplineFloatInterpolator" ver1="20.0.0.4">
        Unknown.
        <add name="Base" type="float">Base value when curve not defined.</add>
        <add name="Offset" type="uint">Starting offset for the data. (USHRT_MAX for no data.)</add>
        <add name="Bias" type="float">Bias</add>
        <add name="Multiplier" type="float">Multiplier</add>
    </niobject>

    <niobject name="NiBSplinePoint3Interpolator" abstract="1" inherit="NiBSplineInterpolator" ver1="20.0.0.4">
        Unknown.
        <add name="Unknown Floats" type="float" arr1="6">Unknown.</add>
    </niobject>

    <niobject name="NiBSplineCompPoint3Interpolator" abstract="0" inherit="NiBSplinePoint3Interpolator" ver1="20.0.0.4">
        Unknown.
    </niobject>

    <niobject name="NiBSplineTransformInterpolator" abstract="0" inherit="NiBSplineInterpolator" ver1="20.0.0.4">
        An interpolator for storing transform keyframes via a B-spline.
        <add name="Translation" type="Vector3">Base translation when translate curve not defined.</add>
        <add name="Rotation" type="Quaternion">Base rotation when rotation curve not defined.</add>
        <add name="Scale" type="float">Base scale when scale curve not defined.</add>
        <add name="Translation Offset" type="uint">Starting offset for the translation data. (USHRT_MAX for no data.)</add>
        <add name="Rotation Offset" type="uint">Starting offset for the rotation data. (USHRT_MAX for no data.)</add>
        <add name="Scale Offset" type="uint">Starting offset for the scale data. (USHRT_MAX for no data.)</add>
    </niobject>

    <niobject name="NiBSplineCompTransformInterpolator" abstract="0" inherit="NiBSplineTransformInterpolator" ver1="20.0.0.4">
        An interpolator for storing transform keyframes via a compressed
        B-spline (that is, using shorts rather than floats in the B-spline
        data).
        <add name="Translation Bias" type="float">Translation Bias</add>
        <add name="Translation Multiplier" type="float">Translation Multiplier</add>
        <add name="Rotation Bias" type="float">Rotation Bias</add>
        <add name="Rotation Multiplier" type="float">Rotation Multiplier</add>
        <add name="Scale Bias" type="float">Scale Bias</add>
        <add name="Scale Multiplier" type="float">Scale Multiplier</add>
    </niobject>

    <niobject name="NiBSplineData" abstract="0" inherit="NiObject" ver1="20.0.0.4">
        B-spline data points as floats, or as shorts for compressed B-splines.
        <add name="Num Float Control Points" type="uint">Number of Float Data Points</add>
        <add name="Float Control Points" type="float" arr1="Num Float Control Points">Float values representing the control data.</add>
        <add name="Num Short Control Points" type="uint">Number of Short Data Points</add>
        <add name="Short Control Points" type="short" arr1="Num Short Control Points">Signed shorts representing the data from 0 to 1 (scaled by SHRT_MAX).</add>
    </niobject>

    <niobject name="NiCamera" abstract="0" inherit="NiAVObject">
        Camera object.
        <add name="Unknown Short" type="ushort" ver1="10.1.0.0">Unknown.</add>
        <add name="Frustum Left" type="float">Frustrum left.</add>
        <add name="Frustum Right" type="float">Frustrum right.</add>
        <add name="Frustum Top" type="float">Frustrum top.</add>
        <add name="Frustum Bottom" type="float">Frustrum bottom.</add>
        <add name="Frustum Near" type="float">Frustrum near.</add>
        <add name="Frustum Far" type="float">Frustrum far.</add>
        <add name="Use Orthographic Projection" type="bool" ver1="10.1.0.0">Determines whether perspective is used.  Orthographic means no perspective.</add>
        <add name="Viewport Left" type="float">Viewport left.</add>
        <add name="Viewport Right" type="float">Viewport right.</add>
        <add name="Viewport Top" type="float">Viewport top.</add>
        <add name="Viewport Bottom" type="float">Viewport bottom.</add>
        <add name="LOD Adjust" type="float">Level of detail adjust.</add>
        <add name="Unknown Link" type="Ref" template="NiObject">Unknown.</add>
        <add name="Unknown Int" type="uint">Unknown.  Changing value crashes viewer.</add>
        <add name="Unknown Int 2" type="uint" ver1="4.2.1.0">Unknown.  Changing value crashes viewer.</add>
        <add name="Unknown Int 3" type ="uint" ver2="3.1">Unknown.</add>
    </niobject>

    <niobject name="NiColorData" abstract="0" inherit="NiObject">
        Color data for material color controller.
        <add name="Data" type="KeyGroup" template="Color4">The color keys.</add>
    </niobject>

    <niobject name="NiColorExtraData" abstract="0" inherit="NiExtraData" ver1="10.4.0.1">
        Unknown.
        <add name="Data" type="Color4">RGBA Color?</add>
    </niobject>

    <niobject name="NiControllerManager" abstract="0" inherit="NiTimeController" ver1="20.0.0.5">
        Unknown. Root of all controllers?
        <add name="Cumulative" type="bool">Designates whether animation sequences are cumulative?</add>
        <add name="Num Controller Sequences" type="uint">The number of controller sequence objects.</add>
        <add name="Controller Sequences" type="Ref" template="NiControllerSequence" arr1="Num Controller Sequences">Refers to a list of NiControllerSequence object.</add>
        <add name="Object Palette" type="Ref" template="NiDefaultAVObjectPalette">Refers to a NiDefaultAVObjectPalette.</add>
    </niobject>

    <niobject name="NiSequence" abstract="0" inherit="NiObject" ver1="4.2.2.0">
        Root node used in some Empire Earth II .kf files (version 4.2.2.0).
        <add name="Name" type="string">Name of this object. This is also the name of the action associated with this file. For instance, if the original NIF file is called &quot;demon.nif&quot; and this animation file contains an attack sequence, then the file would be called &quot;demon_attack1.kf&quot; and this field would contain the string &quot;attack1&quot;.</add>
        <add name="Text Keys Name" type="string" ver2="10.1.0.0">Name of following referenced NiTextKeyExtraData class.</add>
        <add name="Text Keys" type="Ref" template="NiTextKeyExtraData" ver2="10.1.0.0">Link to NiTextKeyExtraData.</add>
        <add name="Num Controlled Blocks" type="uint">Number of controlled objects.</add>
        <add name="Unknown Int 1" type="uint" ver1="10.1.0.106">Unknown.</add>
        <add name="Controlled Blocks" type="ControllerLink" arr1="Num Controlled Blocks">Refers to controlled objects.</add>
    </niobject>

    <niobject name="NiControllerSequence" abstract="0" inherit="NiSequence" ver1="10.0.1.0">
        Root node in .kf files (version 10.0.1.0 and up).
        <add name="Weight" type="float" default="1.0" ver1="10.1.0.106">Weight/priority of animation?</add>
        <add name="Text Keys" type="Ref" template="NiTextKeyExtraData" ver1="10.1.0.106">Link to NiTextKeyExtraData. Replaces the other Text Keys field in versions 10.1.0.106 and up.</add>
        <add name="Cycle Type" type="CycleType" ver1="10.1.0.106">Anim cycle type? Is part of &quot;Flags&quot; in other objects?</add>
        <add name="Unknown Int 0" type="uint" ver1="10.1.0.106" ver2="10.1.0.106">Unknown.</add>
        <add name="Frequency" type="float" ver1="10.1.0.106">The animation frequency.</add>
        <add name="Start Time" type="float" ver1="10.1.0.106">The controller sequence start time?</add>
        <add name="Unknown Float 2" type="float" ver1="10.2.0.0" ver2="10.4.0.1">Unknown.</add>
        <add name="Stop Time" type="float" ver1="10.1.0.106">The controller sequence stop time?</add>
        <add name="Unknown Byte" type="byte" ver1="10.1.0.106" ver2="10.1.0.106">Unknown.</add>
        <add name="Manager" type="Ptr" template="NiControllerManager" ver1="10.1.0.106">Refers to NiControllerManager which references this object, if any.</add>
        <add name="Target Name" type="string" ver1="10.1.0.106">Name of target node Controller acts on.</add>
        <add name="String Palette" type="Ref" template="NiStringPalette" ver1="10.2.0.0" ver2="20.0.0.5">Refers to NiStringPalette.</add>
        <add name="Unknown Short 1" type="short" ver1="20.2.0.7" vercond="(User Version == 11) &amp;&amp; (User Version 2 >= 24)">Unknown</add>
        <add name="Unknown Short 2" type="short" ver1="20.2.0.7" vercond="(User Version == 11) &amp;&amp; (User Version 2 >= 24) &amp;&amp; (User Version 2 &lt;= 28)">Unknown</add>
        <add name="Unknown Int 3" type="uint" ver1="20.3.0.9" ver2="20.3.0.9">Unknown, found in some Lazeska .KFs (seems to be 64 when present). Conditions are unknown.</add>
    </niobject>

    <niobject name="NiAVObjectPalette" abstract="1" inherit="NiObject">
        Unknown.
    </niobject>

    <niobject name="NiDefaultAVObjectPalette" abstract="0" inherit="NiAVObjectPalette">
        Unknown. Refers to a list of objects. Used by NiControllerManager.
        <add name="Unknown Int" type="uint">Unknown.</add>
        <add name="Num Objs" type="uint">Number of objects.</add>
        <add name="Objs" type="AVObject" arr1="Num Objs">The objects.</add>
    </niobject>

    <niobject name="NiDirectionalLight" abstract="0" inherit="NiLight">
        Directional light source.
    </niobject>

    <niobject name="NiDitherProperty" abstract="0" inherit="NiProperty">
        Unknown.
        <add name="Flags" type="Flags">1&#039;s Bit: Enable dithering</add>
    </niobject>

    <niobject name="NiRollController" abstract="0" inherit="NiSingleInterpController">
        Unknown.
        <add name="Data" type="Ref" template="NiFloatData">The data for the controller.</add>
    </niobject>

    <niobject name="NiFloatData" abstract="0" inherit="NiObject">
        Possibly the 1D position along a 3D path.
        <add name="Data" type="KeyGroup" template="float">The keys.</add>
    </niobject>

    <niobject name="NiFloatExtraData" abstract="0" inherit="NiExtraData" ver1="10.4.0.1">
        Float extra data.
        <add name="Float Data" type="float">The float data.</add>
    </niobject>

    <niobject name="NiFloatsExtraData" abstract="0" inherit="NiExtraData" ver1="20.0.0.4">
        Unknown.
        <add name="Num Floats" type="uint">Number of floats in the next field.</add>
        <add name="Data" type="float" arr1="Num Floats">Float data.</add>
    </niobject>

    <niobject name="NiFogProperty" abstract="0" inherit="NiProperty" ver1="10.1.0.0">
        Describes... fog?
        <add name="Flags" type="Flags">
            1&#039;s bit: Enables Fog
            2&#039;s bit: Sets Fog Function to FOG_RANGE_SQ
            4&#039;s bit: Sets Fog Function to FOG_VERTEX_ALPHA

            If 2&#039;s and 4&#039;s bit are not set, but fog is enabled, Fog function is FOG_Z_LINEAR.
        </add>
        <add name="Fog Depth" type="float">The thickness of the fog?  Default is 1.0</add>
        <add name="Fog Color" type="Color3">The color of the fog.</add>
    </niobject>

    <niobject name="NiGravity" abstract="0" inherit="NiParticleModifier">
        A particle modifier; applies a gravitational field on the particles.
        <add name="Unknown Float 1" type="float" ver1="4.0.0.2">Unknown.</add>
        <add name="Force" type="float">The strength/force of this gravity.</add>
        <add name="Type" type="FieldType">The force field&#039;s type.</add>
        <add name="Position" type="Vector3">The position of the mass point relative to the particle system. (TODO: check for versions &lt;= 3.1)</add>
        <add name="Direction" type="Vector3">The direction of the applied acceleration.</add>
    </niobject>

    <niobject name="NiIntegerExtraData" abstract="0" inherit="NiExtraData" ver1="10.0.1.0">
        Extra integer data.
        <add name="Integer Data" type="uint">The value of the extra data.</add>
    </niobject>

    <niobject name="BSXFlags" abstract="0" inherit="NiIntegerExtraData" ver1="20.0.0.5">
        Controls animation and collision.  Integer holds flags:
        Bit 0 : enable animation
        Bit 1 : enable collision
        Bit 2 : is skeleton nif?
        Bit 3 : toggable? unknown, set to 1 on oblivion signs
        Bit 4 : FlameNodes present
        Bit 5 : EditorMarkers present
    </niobject>

    <niobject name="NiIntegersExtraData" abstract="0" inherit="NiExtraData" ver1="10.1.0.0">
        Integers data.
        <add name="Num Integers" type="uint">Number of integers.</add>
        <add name="Data" type="uint" arr1="Num Integers">Integers.</add>
    </niobject>

    <niobject name="BSKeyframeController" abstract="0" inherit="NiKeyframeController" ver1="10.0.1.2">
        An extended keyframe controller.
        <add name="Data 2" type="Ref" template="NiKeyframeData">A link to more keyframe data.</add>
    </niobject>

    <niobject name="NiKeyframeData" abstract="0" inherit="NiObject">
        Keyframes for mesh animation.
        <add name="Num Rotation Keys" type="uint">The number of rotation keys.</add>
        <add name="Rotation Type" type="KeyType" default="0" 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.</add>
        <add name="Quaternion Keys" type="QuatKey" arg="Rotation Type" template="Quaternion" arr1="Num Rotation Keys" cond="Rotation Type != 4">The rotation keys if Quaternion rotation is used.</add>
        <add name="Unknown Float" type="float" cond="Rotation Type == 4" ver2="10.1.0.0">Possibly a vestigial time value?  Doesn&#039;t appear to be significant.</add>
        <add name="XYZ Rotations" type="KeyGroup" template="float" arr1="3" cond="Rotation Type == 4">Individual arrays of keys for rotating X, Y, and Z individually.</add>
        <add name="Translations" type="KeyGroup" template="Vector3">Translation keys.</add>
        <add name="Scales" type="KeyGroup" template="float">Scale keys.</add>
    </niobject>

    <niobject name="NiLookAtController" abstract="0" inherit="NiTimeController" ver1="4.1.0.12">
        Unknown. Start time is 3.4e+38 and stop time is -3.4e+38.
        <add name="Unknown1" type="ushort" ver1="10.1.0.0">Unknown.</add>
        <add name="Look At Node" type="Ref" template="NiNode">Link to the node to look at?</add>
    </niobject>

    <niobject name="NiLookAtInterpolator" abstract="0" inherit="NiInterpolator" ver1="10.2.0.0">
        Unknown.
        <add name="Unknown Short" type="ushort">Unknown.</add>
        <add name="Look At" type="Ref" template="NiNode">Refers to a Node to focus on.</add>
        <add name="Target" type="string">Target node name.</add>
        <add name="Translation" type="Vector3">Translate.</add>
        <add name="Rotation" type="Quaternion">Rotation.</add>
        <add name="Scale" type="float">Scale.</add>
        <add name="Unknown Link 1" type="Ref" template="NiPoint3Interpolator">Refers to NiPoint3Interpolator.</add>
        <add name="Unknown Link 2" type="Ref" template="NiFloatInterpolator">Refers to a NiFloatInterpolator.</add>
        <add name="Unknown Link 3" type="Ref" template="NiFloatInterpolator">Refers to a NiFloatInterpolator.</add>
    </niobject>

    <niobject name="NiMaterialProperty" abstract="0" inherit="NiProperty">
        Describes the material shading properties.
        <add name="Flags" type="Flags" ver2="10.0.1.2">Property flags.</add>
        <add name="Ambient Color" type="Color3" vercond="!((Version == 20.2.0.7) &amp;&amp; (User Version == 11) &amp;&amp; (User Version 2 > 21))">How much the material reflects ambient light.</add>
        <add name="Diffuse Color" type="Color3" vercond="!((Version == 20.2.0.7) &amp;&amp; (User Version == 11) &amp;&amp; (User Version 2 > 21))">How much the material reflects diffuse light.</add>
        <add name="Specular Color" type="Color3">How much light the material reflects in a specular manner.</add>
        <add name="Emissive Color" type="Color3">How much light the material emits.</add>
        <add name="Glossiness" type="float">The material&#039;s glossiness.</add>
        <add name="Alpha" type="float">The material transparency (1=non-transparant). Refer to a NiAlphaProperty object in this material&#039;s parent NiTriShape object, when alpha is not 1.</add>
        <add name="Emit Multi" type="float" default="1.0" vercond="(Version == 20.2.0.7) &amp;&amp; (User Version == 11) &amp;&amp; (User Version 2 > 21)">Unknown</add>
    </niobject>

    <niobject name="NiMorphData" abstract="0" inherit="NiObject">
        Geometry morphing data.
        <add name="Num Morphs" type="uint">Number of morphing object.</add>
        <add name="Num Vertices" type="uint">Number of vertices.</add>
        <add name="Relative Targets" type="byte" default="1">This byte is always 1 in all official files.</add>
        <add name="Morphs" type="Morph" arg="Num Vertices" arr1="Num Morphs">The geometry morphing objects.</add>
    </niobject>

    <niobject name="NiNode" abstract="0" inherit="NiAVObject">
        Generic node object for grouping.
        <add name="Num Children" type="uint">The number of child objects.</add>
        <add name="Children" type="Ref" template="NiAVObject" arr1="Num Children">List of child node object indices.</add>
        <add name="Num Effects" type="uint">The number of references to effect objects that follow.</add>
        <add name="Effects" type="Ref" template="NiDynamicEffect" arr1="Num Effects">List of node effects. ADynamicEffect?</add>
    </niobject>

    <niobject name="NiBone" abstract="0" inherit="NiNode" ver2="3.03">
        A NiNode used as a skeleton bone?
    </niobject>

    <niobject name="AvoidNode" abstract="0" inherit="NiNode">
        Morrowind specific?
    </niobject>

    <niobject name="FxWidget" abstract="0" inherit="NiNode" ver1="10.0.1.0">
        Firaxis-specific UI widgets?
        <add name="Unknown1" type="byte">Unknown.</add>
        <add name="Unknown 292 Bytes" type="byte" arr1="292">Looks like 9 links and some string data.</add>
    </niobject>

    <niobject name="FxButton" abstract="0" inherit="FxWidget" ver1="10.0.1.0">
        Unknown.
    </niobject>

    <niobject name="FxRadioButton" abstract="0" inherit="FxWidget" ver1="10.0.1.0">
        Unknown.
        <add name="Unknown Int 1" type="uint">Unknown.</add>
        <add name="Unknown Int  2" type="uint">Unknown.</add>
        <add name="Unknown Int 3" type="uint">Unknown.</add>
        <add name="Num Buttons" type="uint">Number of unknown links.</add>
        <add name="Buttons" type="Ptr" template="FxRadioButton" arr1="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?</add>
    </niobject>

    <niobject name="NiBillboardNode" abstract="0" inherit="NiNode">
        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
        <add name="Billboard Mode" type="BillboardMode" ver1="10.1.0.0">The way the billboard will react to the camera.</add>
    </niobject>

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

    <niobject name="NiBSParticleNode" abstract="0" inherit="NiNode">
        Unknown.
    </niobject>

    <niobject name="NiSwitchNode" abstract="0" inherit="NiNode">
        A node used to switch between branches, such as for LOD levels?
        <add name="Unknown Flags 1" type="ushort" ver1="10.1.0.0">Flags</add>
        <add name="Unknown Int 1" type="int">Index?</add>
    </niobject>

    <niobject name="NiLODNode" abstract="0" inherit="NiSwitchNode" ver1="3.1">
        Level of detail selector. Links to different levels of detail of the same model, used to switch a geometry at a specified distance.
        <!--<add name="Unknown 4 Bytes" type="byte" arr1="4">Unknown.  0,0,0,0 or 1,0,0,0.</add>-->
        <add name="LOD Center" type="Vector3" ver1="4.0.0.2" ver2="10.0.1.0">Point to calculate distance from for switching?</add>
        <add name="Num LOD Levels" type="uint" ver2="10.0.1.0">Number of levels of detail.</add>
        <add name="LOD Levels" type="LODRange" arr1="Num LOD Levels" ver2="10.0.1.0">The ranges of distance that each level of detail applies in.</add>
        <!--<add name="Unknown Short" type="ushort" ver1="10.1.0.0">Zero?</add>-->
        <add name="LOD Level Data" type="Ref" template="NiLODData"  ver1="10.1.0.0">Refers to LOD level information, either distance or screen size based.</add>
    </niobject>

    <niobject name="NiPalette" abstract="0" inherit="NiObject" ver1="4.2.2.0">
        A color palette.
        <add name="Unknown Byte" type="byte">Unknown, Usually = 0.</add>
        <add name="Num Entries" type="uint">The number of palette entries.  Always = 256.</add>
        <add name="Palette" type="ByteColor4" arr1="256">The color palette.</add>
    </niobject>

    <niobject name="NiParticleBomb" abstract="0" inherit="NiParticleModifier" ver1="3.03">
        A particle modifier.
        <add name="Decay?" type="float">Unknown.</add>
        <add name="Duration?" type="float">Unknown.</add>
        <add name="DeltaV?" type="float">Unknown.</add>
        <add name="Start?" type="float">Unknown.</add>
        <add name="Decay Type?" type="DecayType">Unknown.</add>
        <add name="Symmetry Type?" type="SymmetryType" ver1="4.1.0.12">Unknown.</add>
        <add name="Position?" type="Vector3">The position of the mass point relative to the particle system?</add>
        <add name="Direction?" type="Vector3">The direction of the applied acceleration?</add>
    </niobject>

    <niobject name="NiParticleColorModifier" abstract="0" inherit="NiParticleModifier">
        Unknown.
        <add name="Color Data" type="Ref" template="NiColorData">Color data index.</add>
    </niobject>

    <niobject name="NiParticleGrowFade" abstract="0" inherit="NiParticleModifier">
        This particle system modifier controls the particle size. If it is present the particles start with size 0.0 . Then they grow to their original size and stay there until they fade to zero size again at the end of their lifetime cycle.
        <add name="Grow" type="float">The time from the beginning of the particle lifetime during which the particle grows.</add>
        <add name="Fade" type="float">The time from the end of the particle lifetime during which the particle fades.</add>
    </niobject>

    <niobject name="NiParticleMeshModifier" abstract="0" inherit="NiParticleModifier" ver1="4.1.0.12">
        Unknown.
        <add name="Num Particle Meshes" type="uint">The number of particle mesh references that follow.</add>
        <add name="Particle Meshes" arr1="Num Particle Meshes" type="Ref" template="NiAVObject">Links to nodes of particle meshes?</add>
    </niobject>

    <niobject name="NiParticleRotation" abstract="0" inherit="NiParticleModifier">
        Unknown.
        <add name="Random Initial Axis?" type="byte">Unknown.</add>
        <add name="Initial Axis?" type="Vector3">Unknown.</add>
        <add name="Rotation Speed?" type="float">Unknown.</add>
    </niobject>

    <niobject name="NiParticles" abstract="0" inherit="NiGeometry">
        Generic particle system node.
    </niobject>

    <niobject name="NiAutoNormalParticles" abstract="0" inherit="NiParticles">
        Unknown.
    </niobject>

    <niobject name="NiParticleMeshes" abstract="0" inherit="NiParticles" ver1="4.1.0.12">
        Mesh particle node?
    </niobject>

    <niobject name="NiParticleMeshesData" abstract="0" inherit="NiRotatingParticlesData" ver1="4.1.0.12">
        Particle meshes data.
        <add name="Unknown Link 2" type="Ref" template="NiAVObject">Refers to the mesh that makes up a particle?</add>
    </niobject>

    <niobject name="NiParticleSystem" abstract="0" inherit="NiParticles" ver1="10.1.0.0">
        A particle system.
        <add name="World Space" type="bool" ver1="10.1.0.0">If true, Particles are birthed into world space.  If false, Particles are birthed into object space.</add>
        <add name="Num Modifiers" type="uint" ver1="10.1.0.0">The number of modifier references.</add>
        <add name="Modifiers" type="Ref" template="NiPSysModifier" arr1="Num Modifiers" ver1="10.1.0.0">The list of particle modifiers.</add>
    </niobject>

    <niobject name="NiMeshParticleSystem" abstract="0" inherit="NiParticleSystem" ver1="10.2.0.0">
        Particle system.
    </niobject>

    <niobject name="NiParticleSystemController" abstract="0" inherit="NiTimeController">
        A generic particle system time controller object.
        <add name="Old Speed" type="uint" ver2="3.1">Particle speed in old files</add>
        <add name="Speed" type="float" ver1="3.3.0.13">Particle speed</add>
        <add name="Speed Random" type="float">Particle random speed modifier</add>
        <add name="Vertical Direction" type="float">
            vertical emit direction [radians]
            0.0 : up
            1.6 : horizontal
            3.1416 : down
        </add>
        <add name="Vertical Angle" type="float">emitter&#039;s vertical opening angle [radians]</add>
        <add name="Horizontal Direction" type="float">horizontal emit direction</add>
        <add name="Horizontal Angle" type="float">emitter&#039;s horizontal opening angle</add>
        <add name="Unknown Normal?" type="Vector3">Unknown.</add>
        <add name="Unknown Color?" type="Color4">Unknown.</add>
        <add name="Size" type="float">Particle size</add>
        <add name="Emit Start Time" type="float">Particle emit start time</add>
        <add name="Emit Stop Time" type="float">Particle emit stop time</add>
        <add name="Unknown Byte" type="byte" ver1="4.0.0.2">Unknown byte, (=0)</add>
        <add name="Old Emit Rate" type="uint" ver2="3.1">Particle emission rate in old files</add>
        <add name="Emit Rate" type="float" ver1="3.3.0.13">Particle emission rate (particles per second)</add>
        <add name="Lifetime" type="float">Particle lifetime</add>
        <add name="Lifetime Random" type="float">Particle lifetime random modifier</add>
        <add name="Emit Flags" type="ushort" ver1="4.0.0.2">Bit 0: Emit Rate toggle bit (0 = auto adjust, 1 = use Emit Rate value)</add>
        <add name="Start Random" type="Vector3">Particle random start translation vector</add>
        <add name="Emitter" type="Ptr" template="NiObject">This index targets the particle emitter object (TODO: find out what type of object this refers to).</add>
        <add name="Unknown Short 2?" type="ushort" ver1="4.0.0.2">? short=0 ?</add>
        <add name="Unknown Float 13?" type="float" ver1="4.0.0.2">? float=1.0 ?</add>
        <add name="Unknown Int 1?" type="uint" ver1="4.0.0.2">? int=1 ?</add>
        <add name="Unknown Int 2?" type="uint" ver1="4.0.0.2">? int=0 ?</add>
        <add name="Unknown Short 3?" type="ushort" ver1="4.0.0.2">? short=0 ?</add>
        <!-- <add name="Particle" type="Particle" ver2="3.1">The particle (older NIF versions only have a single particle per controller?)</add> -->
        <add name="Particle Velocity" type="Vector3" ver2="3.1">Particle velocity</add>
        <add name="Particle Unknown Vector" type="Vector3" ver2="3.1">Unknown</add>
        <add name="Particle Lifetime" type="float" ver2="3.1">The particle&#039;s age.</add>
        <add name="Particle Link" type="Ref" template="NiObject" ver2="3.1" />
        <add name="Particle Timestamp" type="uint" ver2="3.1">Timestamp of the last update.</add>
        <add name="Particle Unknown Short" type="ushort" ver2="3.1">Unknown short</add>
        <add name="Particle Vertex Id" type="ushort" ver2="3.1">Particle/vertex index matches array index</add>

        <add name="Num Particles" type="ushort" ver1="4.0.0.2">Size of the following array. (Maximum number of simultaneous active particles)</add>
        <add name="Num Valid" type="ushort" ver1="4.0.0.2">Number of valid entries in the following array. (Number of active particles at the time the system was saved)</add>
        <add name="Particles" type="Particle" arr1="Num Particles" ver1="4.0.0.2">Individual particle modifiers?</add>
        <add name="Unknown Link" type="Ref" template="NiObject" ver1="4.0.0.2">unknown int (=0xffffffff)</add>
        <add name="Particle Extra" type="Ref" template="NiParticleModifier">Link to some optional particle modifiers (NiGravity, NiParticleGrowFade, NiParticleBomb, ...)</add>
        <add name="Unknown Link 2" type="Ref" template="NiObject">Unknown int (=0xffffffff)</add>
        <add name="Trailer" type="byte" ver1="4.0.0.2">Trailing null byte</add>
        <add name="Color Data" type="Ref" template="NiColorData" ver2="3.1" />
        <add name="Unknown Float 1" type="float" ver2="3.1" />
        <add name="Unknown Floats 2" arr1="Particle Unknown Short" type="float" ver2="3.1" />
    </niobject>

    <niobject name="NiBSPArrayController" abstract="0" inherit="NiParticleSystemController">
        A particle system controller, used by BS in conjunction with NiBSParticleNode.
    </niobject>

    <niobject name="NiPathController" abstract="0" inherit="NiTimeController">
        Time controller for a path.
        <add name="Unknown Short 2" type="ushort" ver1="10.1.0.0">Unknown.</add>
        <add name="Unknown Int 1" type="uint">Unknown, always 1?</add>
        <add name="Unknown Int 2" type="uint">Unknown, often 0? Could be a float?</add>
        <add name="Unknown Int 3" type="uint">Unknown, often 0? Could be a float?</add>
        <add name="Unknown Short" type="ushort">Unknown, always 0?</add>
        <add name="Pos Data" type="Ref" template="NiPosData">Path controller data index (position data). ?</add>
        <add name="Float Data" type="Ref" template="NiFloatData">Path controller data index (float data). ?</add>
    </niobject>

    <enum name="ChannelType" storage="uint">
        <option value="0" name="CHNL_RED">Red</option>
        <option value="1" name="CHNL_GREEN">Green</option>
        <option value="2" name="CHNL_BLUE">Blue</option>
        <option value="3" name="CHNL_ALPHA">Alpha</option>
        <option value="4" name="CHNL_COMPRESSED">Compressed</option>
        <option value="16" name="CHNL_INDEX">Index</option>
        <option value="19" name="CHNL_EMPTY">Empty</option>
    </enum>

    <enum name="ChannelConvention" storage="uint">
        <option value="0" name="CC_FIXED">Fixed</option>
        <option value="3" name="CC_INDEX">Palettized</option>
        <option value="4" name="CC_COMPRESSED">Compressed</option>
        <option value="5" name="CC_EMPTY">Empty</option>
    </enum>

    <compound name="ChannelData">
        Channel data
        <add name="Type" type="ChannelType">Channel Type</add>
        <add name="Convention" type="ChannelConvention">Data Storage Convention</add>
        <add name="Bits Per Channel" type="byte">Bits per channel</add>
        <add name="Unknown Byte 1" type="byte">Unknown</add>
    </compound>

    <niobject name="ATextureRenderData" abstract="1" inherit="NiObject">
        <add name="Pixel Format" type="PixelFormat">The format of the pixels in this internally stored image.</add>
        <add name="Red Mask" type="uint" ver2="10.2.0.0">0x000000ff (for 24bpp and 32bpp) or 0x00000000 (for 8bpp)</add>
        <add name="Green Mask" type="uint" ver2="10.2.0.0">0x0000ff00 (for 24bpp and 32bpp) or 0x00000000 (for 8bpp)</add>
        <add name="Blue Mask" type="uint" ver2="10.2.0.0">0x00ff0000 (for 24bpp and 32bpp) or 0x00000000 (for 8bpp)</add>
        <add name="Alpha Mask" type="uint" ver2="10.2.0.0">0xff000000 (for 32bpp) or 0x00000000 (for 24bpp and 8bpp)</add>
        <add name="Bits Per Pixel" type="byte" ver2="10.2.0.0">Bits per pixel, 0 (?), 8, 24 or 32.</add>
        <add name="Unknown 3 Bytes" type="byte" arr1="3" ver2="10.2.0.0">Zero?</add>
        <add name="Unknown 8 Bytes" type="byte" arr1="8" ver2="10.2.0.0">
            [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
            [4,0,0,0,0,0,0,0] if 0 (?) bits per pixel
        </add>
        <add name="Unknown Int" type="uint" ver1="10.1.0.0" ver2="10.2.0.0">Seems to always be zero.</add>
        <add name="Bits Per Pixel" type="byte" ver1="20.0.0.4">Bits per pixel, 0 (?), 8, 24 or 32.</add>
        <add name="Unknown Int 2" type="int" ver1="20.0.0.4">Unknown.  Could be reference pointer.</add>
        <add name="Unknown Int 3" type="uint" ver1="20.0.0.4">Seems to always be zero.</add>
        <add name="Flags" type="byte" ver1="20.0.0.4">Flags</add>
        <add name="Unknown Int 4" type="uint" ver1="20.0.0.4">Seems to always be zero.</add>
        <add name="Unknown Byte 1" type="byte" ver1="20.3.0.6">Unknown.</add>
        <add name="Channels" type="ChannelData" arr1="4" ver1="20.0.0.4">Channel Data</add>
        <add name="Palette" type="Ref" template="NiPalette">Link to NiPalette, for 8-bit textures.</add>
        <add name="Num Mipmaps" type="uint">Number of mipmaps in the texture.</add>
        <add name="Bytes Per Pixel" type="uint">Bytes per pixel (Bits Per Pixel / 8).</add>
        <add name="Mipmaps" type="MipMap" arr1="Num Mipmaps">Mipmap descriptions (width, height, offset).</add>
    </niobject>

    <niobject name="NiPersistentSrcTextureRendererData" inherit="ATextureRenderData">
        <add name="Num Pixels" type="uint">Unknown</add>
        <add name="Unknown Int 6" type="uint">Unknown</add>
        <add name="Num Faces" type="uint">Unknown</add>
        <add name="Unknown Int 7" type="uint">Unknown</add>
        <add name="Pixel Data" type="byte"  nifskopetype="blob" arr1="Num Faces" arr2="Num Pixels">Raw pixel data holding the mipmaps.  Mipmap zero is the full-size texture and they get smaller by half as the number increases.</add>
    </niobject>

    <niobject name="NiPixelData" abstract="0" inherit="ATextureRenderData">
        A texture.
        <add name="Pixel Data" type="ByteArray" ver2="10.2.0.0">Raw pixel data holding the mipmaps.  Mipmap zero is the full-size texture and they get smaller by half as the number increases.</add>
        <add name="Pixel Data Matrix" type="ByteMatrix" ver1="20.0.0.4" >Raw pixel data holding the mipmaps.  Mipmap zero is the full-size texture and they get smaller by half as the number increases.</add>
    </niobject>

    <niobject name="NiPlanarCollider" abstract="0" inherit="NiParticleModifier">
        Unknown.
        <add name="Unknown Short" type="ushort" ver1="10.0.1.0">Usually 0?</add>
        <add name="Unknown Float 1" type="float">Unknown.</add>
        <add name="Unknown Float 2" type="float">Unknown.</add>
        <add name="Unknown Short 2" type="ushort" ver1="4.2.2.0" ver2="4.2.2.0">Unknown.</add>
        <add name="Unknown Float 3" type="float">Unknown.</add>
        <add name="Unknown Float 4" type="float">Unknown.</add>
        <add name="Unknown Float 5" type="float">Unknown.</add>
        <add name="Unknown Float 6" type="float">Unknown.</add>
        <add name="Unknown Float 7" type="float">Unknown.</add>
        <add name="Unknown Float 8" type="float">Unknown.</add>
        <add name="Unknown Float 9" type="float">Unknown.</add>
        <add name="Unknown Float 10" type="float">Unknown.</add>
        <add name="Unknown Float 11" type="float">Unknown.</add>
        <add name="Unknown Float 12" type="float">Unknown.</add>
        <add name="Unknown Float 13" type="float">Unknown.</add>
        <add name="Unknown Float 14" type="float">Unknown.</add>
        <add name="Unknown Float 15" type="float">Unknown.</add>
        <add name="Unknown Float 16" type="float">Unknown.</add>
    </niobject>

    <niobject name="NiPointLight" abstract="0" inherit="NiLight">
        A point light.
        <add name="Constant Attenuation" type="float">Constant Attenuation</add>
        <add name="Linear Attenuation" type="float">Linear Attenuation</add>
        <add name="Quadratic Attenuation" type="float">Quadratic Attenuation (see glLight)</add>
    </niobject>

    <niobject name="NiPosData" abstract="0" inherit="NiObject">
        Position data.
        <add name="Data" type="KeyGroup" template="Vector3">The position keys.</add>
    </niobject>

    <niobject name="NiPSysAgeDeathModifier" abstract="0" inherit="NiPSysModifier" ver1="10.1.0.0">
        Unknown particle modifier.
        <add name="Spawn on Death" type="bool">Unknown.</add>
        <add name="Spawn Modifier" type="Ref" template="NiPSysSpawnModifier">Link to NiPSysSpawnModifier object?</add>
    </niobject>

    <niobject name="NiPSysBombModifier" abstract="0" inherit="NiPSysModifier" ver1="20.0.0.5">
        Particle modifier that uses a NiNode to use as a "Bomb Object" to alter the path of particles.
        <add name="Bomb Object" type="Ptr" template="NiNode">Link to a NiNode for bomb to function.</add>
        <add name="Bomb Axis" type="Vector3">Orientation of bomb object.</add>
        <add name="Decay" type="float">Falloff rate of the bomb object.</add>
        <add name="Delta V" type="float">DeltaV /  Strength?</add>
        <add name="Decay Type" type="DecayType">Decay type</add>
        <add name="Symmetry Type" type="SymmetryType">Shape/symmetry of the bomb object.</add>
    </niobject>

    <niobject name="NiPSysBoundUpdateModifier" abstract="0" inherit="NiPSysModifier" ver1="10.1.0.0">
        Unknown particle system modifier.
        <add name="Update Skip" type="ushort">Unknown.</add>
    </niobject>

    <niobject name="NiPSysBoxEmitter" abstract="0" inherit="NiPSysVolumeEmitter" ver1="10.1.0.0">
        Particle emitter that uses points within a defined Box shape to emit from..
        <add name="Width" type="float">Defines the Width of the box area.</add>
        <add name="Height" type="float">Defines the Height of the box area.</add>
        <add name="Depth" type="float">Defines the Depth of the box area.</add>
    </niobject>

    <niobject name="NiPSysColliderManager" abstract="0" inherit="NiPSysModifier" ver1="10.2.0.0">
        Particle modifier that adds a defined shape to act as a collision object for particles to interact with.
        <add name="Collider" type="Ref" template="NiPSysCollider">Link to a NiPSysPlanarCollider or NiPSysSphericalCollider.</add>
    </niobject>

    <niobject name="NiPSysColorModifier" abstract="0" inherit="NiPSysModifier" ver1="10.1.0.0">
        Particle modifier that adds keyframe data to modify color/alpha values of particles over time.
        <add name="Data" type="Ref" template="NiColorData">Refers to NiColorData object.</add>
    </niobject>

    <niobject name="NiPSysCylinderEmitter" abstract="0" inherit="NiPSysVolumeEmitter" ver1="10.1.0.0">
        Particle emitter that uses points within a defined Cylinder shape to emit from.
        <add name="Radius" type="float">Radius of the cylinder shape.</add>
        <add name="Height" type="float">Height of the cylinders shape.</add>
    </niobject>

    <niobject name="NiPSysDragModifier" abstract="0" inherit="NiPSysModifier" ver1="20.0.0.5">
        Unknown.
        <add name="Parent" type="Ptr" template="NiObject">Parent reference.</add>
        <add name="Drag Axis" type="Vector3">The drag axis.</add>
        <add name="Percentage" type="float">Drag percentage.</add>
        <add name="Range" type="float">The range.</add>
        <add name="Range Falloff" type="float">The range falloff.</add>
    </niobject>

    <niobject name="NiPSysEmitterCtlrData" abstract="0" inherit="NiObject" ver1="10.1.0.0">
        Particle system emitter controller data.
        <add name="Float Keys?" type="KeyGroup" template="float">Unknown.</add>
        <add name="Num Visibility Keys?" type="uint">Number of keys.</add>
        <add name="Visibility Keys?" type="Key" arg="1" template="byte" arr1="Num Visibility Keys?">Unknown.</add>
    </niobject>

    <niobject name="NiPSysGravityModifier" abstract="0" inherit="NiPSysModifier" ver1="10.1.0.0">
        Adds gravity to a particle system, when linked to a NiNode to use as a Gravity Object.
        <add name="Gravity Object" type="Ptr" template="NiNode">Refers to a NiNode for gravity location.</add>
        <add name="Gravity Axis" type="Vector3">Orientation of gravity.</add>
        <add name="Decay" type="float">Falloff range.</add>
        <add name="Strength" type="float">The strength of gravity.</add>
        <add name="Force Type" type="ForceType">Planar or Spherical type</add>
        <add name="Turbulence" type="float">Adds a degree of randomness.</add>
        <add name="Turbulence Scale" type="float" default="1.0">Range for turbulence.</add>
        <add name="Unknown Byte" type="byte" ver1="20.2.0.7" userver="11">Unknown</add>
    </niobject>

    <niobject name="NiPSysGrowFadeModifier" abstract="0" inherit="NiPSysModifier" ver1="10.1.0.0">
        Particle modifier that controls the time it takes to grow a particle from Size=0 to the specified Size in the emitter, and then back to 0.  This modifer has no control over alpha settings.
        <add name="Grow Time" type="float">Time in seconds to fade in.</add>
        <add name="Grow Generation" type="ushort">Unknown.</add>
        <add name="Fade Time" type="float">Time in seconds to fade out.</add>
        <add name="Fade Generation" type="ushort">Unknown.</add>
        <add name="Base Scale" type="float" ver1="20.2.0.7" userver="11">Unknown</add>
    </niobject>

    <niobject name="NiPSysMeshEmitter" abstract="0" inherit="NiPSysEmitter" ver1="20.0.0.5">
        Particle emitter that uses points on a specified mesh to emit from.
        <add name="Num Emitter Meshes" type="uint">The number of references to emitter meshes that follow.</add>
        <add name="Emitter Meshes" type="Ref" template="NiTriBasedGeom" arr1="Num Emitter Meshes">Links to meshes used for emitting.</add>
        <add name="Initial Velocity Type" type="VelocityType">The way the particles get their initial direction and speed.</add>
        <add name="Emission Type" type="EmitFrom">The parts of the mesh that the particles emit from.</add>
        <add name="Emission Axis" type="Vector3">The emission axis.</add>
    </niobject>

    <niobject name="NiPSysMeshUpdateModifier" abstract="0" inherit="NiPSysModifier" ver1="10.2.0.0">
        Unknown.
        <add name="Num Meshes" type="uint">The number of object references that follow.</add>
        <add name="Meshes" type="Ref" template="NiAVObject" arr1="Num Meshes">Group of target NiNodes or NiTriShapes?</add>
    </niobject>

    <niobject name="NiPSysPlanarCollider" abstract="0" inherit="NiPSysCollider" ver1="10.2.0.0">
        Particle Collider object which particles will interact with.
        <add name="Width" type="float">Defines the width of the plane.</add>
        <add name="Height" type="float">Defines the height of the plane.</add>
        <add name="X Axis" type="Vector3">Defines Orientation.</add>
        <add name="Y Axis" type="Vector3">Defines Orientation.</add>
    </niobject>

    <niobject name="NiPSysSphericalCollider" abstract="0" inherit="NiPSysCollider" ver1="10.2.0.0">
        Particle Collider object which particles will interact with.
        <add name="Radius" type="float">Defines the radius of the sphere object.</add>
    </niobject>

    <niobject name="NiPSysPositionModifier" abstract="0" inherit="NiPSysModifier" ver1="10.1.0.0">
        Unknown particle system modifier.
    </niobject>

    <niobject name="NiPSysResetOnLoopCtlr" abstract="0" inherit="NiTimeController" ver1="10.2.0.0">
        Unknown.
    </niobject>

    <niobject name="NiPSysRotationModifier" abstract="0" inherit="NiPSysModifier" ver1="10.1.0.0">
        Particle modifier that adds rotations to particles.
        <add name="Initial Rotation Speed" type="float">The initial speed of rotation.</add>
        <add name="Initial Rotation Speed Variation" type="float" ver1="20.0.0.4">Adds a ranged randomness to rotation speed.</add>
        <add name="Initial Rotation Angle" type="float" ver1="20.0.0.4">Sets the intial angle for particles to be birthed in.</add>
        <add name="Initial Rotation Angle Variation" type="float" ver1="20.0.0.4">Adds a random range to Initial angle.</add>
        <add name="Random Rot Speed Sign" type="bool" ver1="20.0.0.4">Unknown</add>
        <add name="Random Initial Axis" type="bool">Unknown.</add>
        <add name="Initial Axis" type="Vector3">Unknown.</add>
    </niobject>

    <niobject name="NiPSysSpawnModifier" abstract="0" inherit="NiPSysModifier" ver1="10.1.0.0">
        Unknown particle modifier.
        <add name="Num Spawn Generations" type="ushort">Unknown.</add>
        <add name="Percentage Spawned" type="float">Unknown.</add>
        <add name="Min Num to Spawn" type="ushort">Unknown.</add>
        <add name="Max Num to Spawn" type="ushort">Unknown.</add>
        <add name="Spawn Speed Chaos" type="float">Unknown.</add>
        <add name="Spawn Dir Chaos" type="float">Unknown.</add>
        <add name="Life Span" type="float">Unknown.</add>
        <add name="Life Span Variation" type="float">Unknown.</add>
        <add name="Unknown int" type="int" ver1="10.4.0.1" ver2="10.4.0.1">Unknown</add>
    </niobject>

    <niobject name="NiPSysSphereEmitter" abstract="0" inherit="NiPSysVolumeEmitter" ver1="20.0.0.4">
        Particle emitter that uses points within a sphere shape to emit from.
        <add name="Radius" type="float">The radius of the sphere shape</add>
    </niobject>

    <niobject name="NiPSysUpdateCtlr" abstract="0" inherit="NiTimeController">
        Particle system controller, used for ???.
    </niobject>

    <niobject name="NiPSysFieldModifier" abstract="1" inherit="NiPSysModifier">
        Base for all force field particle modifiers.
        <add name="Field Object" type="Ref" template="NiAVObject">Force Field Object</add>
        <add name="Magnitude" type="float">Magnitude of the force</add>
        <add name="Attenuation" type="float">Controls how quick the field diminishes</add>
        <add name="Unknown Boolean 1" type="bool">Unknown</add>
        <add name="Unknown Float 1" type="float">Unknown value, perhaps maximum effect distance</add>
    </niobject>

    <niobject name="NiPSysVortexFieldModifier" inherit="NiPSysFieldModifier">
        Particle system modifier, used for controlling the particle velocity in force field.
        <add name="Direction" type="Vector3">Direction of the particle velocity</add>
    </niobject>

    <niobject name="NiPSysGravityFieldModifier" inherit="NiPSysFieldModifier">
        Particle system modifier, used for controlling the particle velocity in gravity field.
        <add name="Direction" type="Vector3">Direction of the particle velocity</add>
    </niobject>

    <niobject name="NiPSysDragFieldModifier" inherit="NiPSysFieldModifier">
        Particle system modifier, used for controlling the particle velocity in drag space warp.
        <add name="Use Direction?" type="bool">Whether to use the direction field?</add>
        <add name="Direction" type="Vector3">Direction of the particle velocity</add>
    </niobject>

    <niobject name="NiPSysTurbulenceFieldModifier" inherit="NiPSysFieldModifier">
        Particle system modifier, used for controlling the particle velocity in drag space warp.
        <add name="Unknown Float 2" type="float">Unknown</add>
    </niobject>

    <niobject name="NiPSysFieldMagnitudeCtlr" inherit="NiPSysModifierFloatCtlr">
        Particle system controller, used for ???.
    </niobject>

    <niobject name="NiPSysAirFieldModifier" inherit="NiPSysFieldModifier">
        Particle system modifier, used for controlling the particle velocity in a field like wind.
        <add name="Direction" type="Vector3">Direction of the particle velocity</add>
        <add name="Unknown Float 2" type="float">Unknown</add>
        <add name="Unknown Float 3" type="float">Unknown</add>
        <add name="Unknown Boolean 1" type="bool">Unknown</add>
        <add name="Unknown Boolean 2" type="bool">Unknown</add>
        <add name="Unknown Boolean 3" type="bool">Unknown</add>
        <add name="Unknown Float 4" type="float">Unknown</add>
    </niobject>
    
    <niobject name="NiPSysTrailEmitter" abstract="0" inherit="NiPSysEmitter">
        Guild 2-Specific node
        <add name="Unknown Int 1" type="int">Unknown</add>
        <add name="Unknown Float 1" type="float">Unknown</add>
        <add name="Unknown Float 2" type="float">Unknown</add>
        <add name="Unknown Float 3" type="float">Unknown</add>
        <add name="Unknown Int 2" type="int">Unknown</add>
        <add name="Unknown Float 4" type="float">Unknown</add>
        <add name="Unknown Int 3" type="int">Unknown</add>
        <add name="Unknown Float 5" type="float">Unknown</add>
        <add name="Unknown Int 4" type="int">Unknown</add>
        <add name="Unknown Float 6" type="float">Unknown</add>
        <add name="Unknown Float 7" type="float">Unknown</add>
    </niobject>

    <niobject name="NiLightIntensityController" inherit="NiFloatInterpController" ver1="10.2.0.0" ver2="10.2.0.0">
        Unknown controller
    </niobject>

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

    <niobject name="NiRangeLODData" abstract="0" inherit="NiLODData">
        Describes levels of detail based on distance of object from camera.
        <add name="LOD Center" type="Vector3">?</add>
        <add name="Num LOD Levels" type="uint">Number of levels of detail.</add>
        <add name="LOD Levels" type="LODRange" arr1="Num LOD Levels">The ranges of distance that each level of detail applies in.</add>
    </niobject>

    <niobject name="NiScreenLODData" abstract="0" inherit="NiLODData" ver1="10.1.0.0">
        Describes levels of detail based on size of object on screen?
        <add name="Bound Center" type="Vector3">The center of the bounding sphere?</add>
        <add name="Bound Radius" type="float">The radius of the bounding sphere?</add>
        <add name="World Center" type="Vector3">The center of the bounding sphere in world space?</add>
        <add name="World Radius" type="float">The radius of the bounding sphere in world space?</add>
        <add name="Proportion Count" type="uint">The number of screen size based LOD levels.</add>
        <add name="Proportion Levels" type="float" arr1="Proportion Count">The LOD levels based on proportion of screen size?</add>
    </niobject>

    <niobject name="NiRotatingParticles" abstract="0" inherit="NiParticles">
        Unknown.
    </niobject>

    <niobject name="NiSequenceStreamHelper" abstract="0" inherit="NiObjectNET">
        Keyframe animation root node, in .kf files.
    </niobject>

    <niobject name="NiShadeProperty" abstract="0" inherit="NiProperty">
        Determines whether flat shading or smooth shading is used on a shape.
        <add name="Flags" type="Flags">
            1&#039;s Bit:  Enable smooth phong shading on this shape.

            If 1&#039;s bit is not set, hard-edged flat shading will be used on this shape.
        </add>
    </niobject>

    <niobject name="NiSkinData" abstract="0" inherit="NiObject">
        Skinning data.
        <add name="Rotation" type="Matrix33">
            The overall rotation offset of the skin from this bone in the bind position.
            (This is a guess, it has always been the identity matrix so far)
        </add>
        <add name="Translation" type="Vector3">The overall translation offset of the skin from this bone in the bind position. (This is a guess, it has always been (0.0, 0.0, 0.0) so far)</add>
        <add name="Scale" type="float">The scale offset of the skin from this bone in the bind position. (This is an assumption - it has always been 1.0 so far)</add>
        <add name="Num Bones" type="uint">Number of bones.</add>
        <add name="Skin Partition" type="Ref" template="NiSkinPartition" ver1="4.0.0.2" ver2="10.1.0.0">This optionally links a NiSkinPartition for hardware-acceleration information.</add>
        <add name="Has Vertex Weights" type="byte" ver1="4.2.1.0" default="1">Enables Vertex Weights for this NiSkinData.</add>
        <add name="Bone List" type="SkinData" arr1="Num Bones" arg="Has Vertex Weights">Contains offset data for each node that this skin is influenced by.</add>
    </niobject>

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

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

    <niobject name="NiClodSkinInstance" abstract="0" inherit="NiSkinInstance">
        A copy of NISkinInstance for use with NiClod meshes.
    </niobject>

    <niobject name="NiSkinPartition" abstract="0" inherit="NiObject" ver1="4.2.1.0">
        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.
        <add name="Num Skin Partition Blocks" type="uint">Unknown.</add>
        <add name="Skin Partition Blocks" type="SkinPartition" arr1="Num Skin Partition Blocks">Skin partition objects.</add>
    </niobject>

    <niobject name="NiTexture" abstract="1" inherit="NiObjectNET">
        A texture.
    </niobject>

    <niobject name="NiSourceTexture" abstract="0" inherit="NiTexture">
        Describes texture source and properties.
        <add name="Use External" type="byte" default="1">Is the texture external?</add>
        <add name="File Name" type="FilePath" cond="Use External == 1">The external texture file name.</add>
        <add name="Unknown Link" type="Ref" template="NiObject" cond="Use External == 1" ver1="10.1.0.0">Unknown.</add>
        <add name="Unknown Byte" type="byte" default="1" cond="Use External == 0" ver2="10.0.1.0">Unknown. Seems to be set if Pixel Data is present?</add>
        <add name="File Name" type="FilePath" cond="Use External == 0" ver1="10.1.0.0">The original source filename of the image embedded by the referred NiPixelData object.</add>
        <add name="Pixel Data" type="Ref" template="ATextureRenderData" cond="Use External == 0">Pixel data object index. NiPixelData or NiPersistentSrcTextureRendererData</add>
        <add name="Pixel Layout" type="PixelLayout" default="PIX_LAY_PALETTISED_4">Specifies the way the image will be stored.</add>
        <add name="Use Mipmaps" type="MipMapFormat" default="MIP_FMT_DEFAULT">Specifies whether mip maps are used.</add>
        <add name="Alpha Format" type="AlphaFormat" default="ALPHA_DEFAULT"> Note: the NiTriShape linked to this object must have a NiAlphaProperty in its list of properties to enable material and/or texture transparency.</add>
        <add name="Is Static" type="byte" default="1">Is Static?</add>
        <add name="Direct Render" type="bool" default="1" ver1="10.1.0.106">Load direct to renderer</add>
        <add name="Persist Render Data" type="bool" default="0" ver1="20.2.0.7">Render data is persistant</add>
    </niobject>

    <niobject name="NiSpecularProperty" abstract="0" inherit="NiProperty">
        Gives specularity to a shape. Flags 0x0001.
        <add name="Flags" type="Flags">1&#039;s Bit = Enable specular lighting on this shape.</add>
    </niobject>

    <niobject name="NiSphericalCollider" abstract="0" inherit="NiParticleModifier" ver1="4.0.0.2">
        Unknown.
        <add name="Unknown Float 1" type="float">Unknown.</add>
        <add name="Unknown Short 1" type="ushort">Unknown.</add>
        <add name="Unknown Float 2" type="float">Unknown.</add>
        <add name="Unknown Short 2" type="ushort" ver2="4.2.0.2">Unknown.</add>
        <add name="Unknown Float 3" type="float" ver1="4.2.1.0">Unknown.</add>
        <add name="Unknown Float 4" type="float">Unknown.</add>
        <add name="Unknown Float 5" type="float">Unknown.</add>
    </niobject>

    <niobject name="NiSpotLight" abstract="0" inherit="NiPointLight" ver1="20.0.0.4">
        A spot.
        <add name="Cutoff Angle" type="float">The opening angle of the spot.</add>
        <add name="Unknown Float" type="float" ver1="20.2.0.7">Unknown</add>
        <add name="Exponent" type="float">Describes the distribution of light. (see: glLight)</add>
    </niobject>

    <niobject name="NiStencilProperty" abstract="0" inherit="NiProperty" ver1="4.1.0.12">
        Allows control of stencil testing.
        <add name="Flags" type="Flags" ver2="10.0.1.2">Property flags.</add>
        <add name="Stencil Enabled" type="byte" ver2="20.0.0.5">Enables or disables the stencil test.</add>
        <add name="Stencil Function" type="StencilCompareMode" ver2="20.0.0.5">Selects the compare mode function (see: glStencilFunc).</add>
        <add name="Stencil Ref" type="uint" ver2="20.0.0.5">Unknown.  Default is 0.</add>
        <add name="Stencil Mask" type="uint" default="4294967295" ver2="20.0.0.5">A bit mask. The default is 0xffffffff.</add>
        <add name="Fail Action" type="StencilAction" ver2="20.0.0.5"/>
        <add name="Z Fail Action" type="StencilAction" ver2="20.0.0.5"/>
        <add name="Pass Action" type="StencilAction" ver2="20.0.0.5"/>
        <add name="Draw Mode" default="DRAW_BOTH" type="FaceDrawMode" ver2="20.0.0.5">Used to enabled double sided faces. Default is 3 (DRAW_BOTH).</add>
        <add name="Flags" type="Flags" default="19840" ver1="20.1.0.3">
            Property flags:
            Bit 0: Stencil Enable
            Bits 1-3: Fail Action
            Bits 4-6: Z Fail Action
            Bits 7-9: Pass Action
            Bits 10-11: Draw Mode
            Bits 12-14: Stencil Function
        </add>
        <add name="Stencil Ref" type="uint" ver1="20.1.0.3">Unknown.  Default is 0.</add>
        <add name="Stencil Mask" type="uint" default="4294967295" ver1="20.1.0.3">A bit mask. The default is 0xffffffff.</add>
    </niobject>

    <niobject name="NiStringExtraData" abstract="0" inherit="NiExtraData">
        Apparently commands for an optimizer instructing it to keep things it would normally discard.
        Also refers to NiNode objects (through their name) in animation .kf files.
        <add name="Bytes Remaining" type="uint" ver2="4.2.2.0">The number of bytes left in the record.  Equals the length of the following string + 4.</add>
        <add name="String Data" type="string">The string.</add>
    </niobject>

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

    <niobject name="NiStringsExtraData" abstract="0" inherit="NiExtraData">
        List of strings; for example, a list of all bone names.
        <add name="Num Strings" type="uint">Number of strings.</add>
        <add name="Data" type="string" arr1="Num Strings">The strings.</add>
    </niobject>

    <niobject name="NiTextKeyExtraData" abstract="0" inherit="NiExtraData">
        Extra data, used to name different animation sequences.
        <add name="Unknown Int 1" type="uint" ver2="4.2.2.0">Unknown.  Always equals zero in all official files.</add>
        <add name="Num Text Keys" type="uint">The number of text keys that follow.</add>
        <add name="Text Keys" type="Key" arg="1" template="string" arr1="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.</add>
    </niobject>

    <niobject name="NiTextureEffect" abstract="0" inherit="NiDynamicEffect">
        Enables environment mapping. Should be in both the children list and effects list of the NiTriShape object. For Morrowind: the bump map can be used to bump the environment map (note that the bump map is ignored if no NiTextureEffect object is present).
        <add name="Model Projection Matrix" type="Matrix33">Model projection matrix.  Always identity?</add>
        <add name="Model Projection Transform" type="Vector3">Model projection transform.  Always (0,0,0)?</add>
        <add name="Texture Filtering" type="TexFilterMode" default="FILTER_TRILERP">Texture Filtering mode.</add>
        <add name="Texture Clamping" type="TexClampMode" default="WRAP_S_WRAP_T">Texture Clamp mode.</add>
        <add name="Texture Type" default="EFFECT_ENVIRONMENT_MAP" type="EffectType">The type of effect that the texture is used for.</add>
        <add name="Coordinate Generation Type" default="CG_SPHERE_MAP" type="CoordGenType">The method that will be used to generate UV coordinates for the texture effect.</add>
        <add name="Image" type="Ref" template="NiImage" ver2="3.1">Image index.</add>
        <add name="Source Texture" type="Ref" template="NiSourceTexture" ver1="4.0.0.0">Source texture index.</add>
        <add name="Clipping Plane" default="0" type="byte">Determines whether a clipping plane is used.  0 means that a plane is not used.</add>
        <add name="Unknown Vector" type="Vector3" default="1.0, 0.0, 0.0">Unknown: (1,0,0)?</add>
        <add name="Unknown Float" type="float">Unknown. 0?</add>
        <add name="PS2 L" type="short" default="0" ver2="10.2.0.0">0?</add>
        <add name="PS2 K" type="short" default="-75" ver2="10.2.0.0">-75?</add>
        <add name="Unknown Short" type="ushort" ver2="4.1.0.12">Unknown: 0.</add>
    </niobject>

    <niobject name="NiTextureModeProperty" abstract="0" inherit="NiProperty" ver1="3.0" ver2="3.1">
        Unknown
        <add name="Unknown Short" type="short">Unknown. Either 210 or 194.</add>
        <add name="PS2 L" type="short" default="0" ver1="3.1" ver2="10.2.0.0">0?</add>
        <add name="PS2 K" type="short" default="-75" ver1="3.1" ver2="10.2.0.0">-75?</add>
    </niobject>

    <niobject name="NiImage" abstract="0" inherit="NiObject" ver1="3.0" ver2="3.1">
        <add name="External" type="byte">0 if the texture is internal to the NIF file.</add>
        <add name="File Name" type="FilePath" cond="External != 0">The filepath to the texture.</add>
        <add name="Image Data" type="Ref" template="NiRawImageData" cond="External == 0">Link to the internally stored image data.</add>
        <add name="Unknown Int" type="uint" default="7">Unknown.  Often seems to be 7. Perhaps m_uiMipLevels?</add>
        <add name="Unknown Float" type="float" ver1="3.1" default="128.5">Unknown.  Perhaps fImageScale?</add>
    </niobject>

    <niobject name="NiTextureProperty" abstract="0" inherit="NiProperty" ver1="3.0" ver2="3.1">
        <add name="Flags" type="Flags">Property flags.</add>
        <add name="Image" type="Ref" template="NiImage">Link to the texture image.</add>
        <add name="Unknown Int 1" type ="uint" ver2="3.03">Unknown.  0?</add>
        <add name="Unknown Int 2" type ="uint" ver2="3.03">Unknown.  0xFFFFFFFF?</add>
    </niobject>

    <niobject name="NiMultiTextureProperty" abstract="0" inherit="NiProperty" ver1="3.1" ver2="3.1">
        (note: not quite complete yet... but already reads most of the DAoC ones)
        <add name="Flags" type="Flags">Property flags.</add>
        <add name="Unknown Int" type="uint">Unknown. Always 5 for DAoC files, and always 6 for Bridge Commander.  Seems to have nothing to do with the number of Texture Element slots that follow.</add>
        <add name="Texture Elements" type="MultiTextureElement" arr1="5">Describes the various textures used by this mutli-texture property.  Each slot probably has special meaning like thoes in NiTexturingProperty.</add>
    </niobject>

    <niobject name="NiTexturingProperty" abstract="0" inherit="NiProperty">
        Describes an object&#039;s textures.
        <add name="Flags" type="Flags" ver2="10.0.1.2">Property flags.</add>
        <add name="Flags" type="Flags" ver1="20.1.0.3">Property flags.</add>
        <add name="Apply Mode" type="ApplyMode" default="APPLY_MODULATE" ver2="20.0.0.5">Determines how the texture will be applied.  Seems to have special functions in Oblivion.</add>
        <add name="Texture Count" type="uint" default="7">Number of textures. Always 7 in versions &lt; 20.0.0.4. Can also be 8 in &gt;= 20.0.0.4.</add>
        <add name="Has Base Texture" type="bool">Do we have a base texture?</add>
        <add name="Base Texture" type="TexDesc" cond="Has Base Texture != 0">The base texture.</add>
        <add name="Has Dark Texture" type="bool">Do we have a dark texture?</add>
        <add name="Dark Texture" type="TexDesc" cond="Has Dark Texture != 0">The dark texture.</add>
        <add name="Has Detail Texture" type="bool">Do we have a detail texture?</add>
        <add name="Detail Texture" type="TexDesc" cond="Has Detail Texture != 0">The detail texture.</add>
        <add name="Has Gloss Texture" type="bool">Do we have a gloss texture?</add>
        <add name="Gloss Texture" type="TexDesc" cond="Has Gloss Texture != 0">The gloss texture.</add>
        <add name="Has Glow Texture" type="bool">Do we have a glow texture?</add>
        <add name="Glow Texture" type="TexDesc" cond="Has Glow Texture != 0">The glowing texture.</add>
        <add name="Has Bump Map Texture" type="bool">Do we have a bump map texture?</add>
        <add name="Bump Map Texture" type="TexDesc" cond="Has Bump Map Texture != 0">The bump map texture.</add>
        <add name="Bump Map Luma Scale" type="float" cond="Has Bump Map Texture != 0">Unknown.</add>
        <add name="Bump Map Luma Offset" type="float" cond="Has Bump Map Texture != 0">Unknown.</add>
        <add name="Bump Map Matrix" type="Matrix22" cond="Has Bump Map Texture != 0">Unknown.</add>
        <add name="Has Normal Texture" type="bool" ver1="20.2.0.7">Do we have a normal texture?  (Noraml guess based on file suffix in sample files)</add>
        <add name="Normal Texture" type="TexDesc" cond="Has Normal Texture != 0" ver1="20.2.0.7">Normal texture.</add>
        <add name="Has Unknown2 Texture" type="bool" ver1="20.2.0.7">Do we have a unknown texture 2?</add>
        <add name="Unknown2 Texture" type="TexDesc" cond="Has Unknown2 Texture != 0" ver1="20.2.0.7">Unknown texture 2.</add>
        <add name="Unknown2 Float" type="float" cond="Has Unknown2 Texture != 0">Unknown.</add>
        <add name="Has Decal 0 Texture" type="bool">Do we have a decal 0 texture?</add>
        <add name="Decal 0 Texture" type="TexDesc" cond="Has Decal 0 Texture != 0">The decal texture.</add>
        <add name="Has Decal 1 Texture" type="bool" cond="Texture Count &gt;= 8" ver2="20.1.0.3">Do we have a decal 1 texture?</add>
        <add name="Has Decal 1 Texture" type="bool" cond="Texture Count &gt;= 10" ver1="20.2.0.7">Do we have a decal 1 texture?</add>
        <add name="Decal 1 Texture" type="TexDesc" cond="Has Decal 1 Texture != 0">Another decal texture.</add>
        <add name="Has Decal 2 Texture" type="bool" cond="Texture Count &gt;= 9" ver2="20.1.0.3">Do we have a decal 2 texture?</add>
        <add name="Has Decal 2 Texture" type="bool" cond="Texture Count &gt;= 11" ver1="20.2.0.7">Do we have a decal 2 texture?</add>
        <add name="Decal 2 Texture" type="TexDesc" cond="Has Decal 2 Texture != 0">Another decal texture.</add>
        <add name="Has Decal 3 Texture" type="bool" cond="Texture Count &gt;= 10" ver2="20.1.0.3">Do we have a decal 3 texture?</add>
        <add name="Has Decal 3 Texture" type="bool" cond="Texture Count &gt;= 12" ver1="20.2.0.7">Do we have a decal 3 texture?</add>
        <add name="Decal 3 Texture" type="TexDesc" cond="Has Decal 3 Texture != 0">Another decal texture. Who knows the limit.</add>
        <add name="Num Shader Textures" type="uint" ver1="10.0.1.0">Number of Shader textures that follow.</add>
        <add name="Shader Textures" type="ShaderTexDesc" arr1="Num Shader Textures" ver1="10.0.1.0">Shader textures.</add>
    </niobject>

    <niobject name="NiTransformData" abstract="0" inherit="NiKeyframeData" ver1="10.2.0.0">
        Mesh animation keyframe data.
    </niobject>

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

    <niobject name="NiTriShapeData" abstract="0" inherit="NiTriBasedGeomData">
        Holds mesh data using a list of singular triangles.
        <add name="Num Triangle Points" type="uint">Num Triangles times 3.</add>
        <add name="Has Triangles" type="bool" ver1="10.1.0.0">Do we have triangle data?</add>
        <add name="Triangles" type="Triangle" arr1="Num Triangles" ver2="10.0.1.2">Triangle data.</add>
        <add name="Triangles" type="Triangle" arr1="Num Triangles" cond="Has Triangles != 0" ver1="10.0.1.3">Triangle face data.</add>
        <add name="Num Match Groups" type="ushort" ver1="3.1">Number of shared normals groups.</add>
        <add name="Match Groups" type="MatchGroup" arr1="Num Match Groups" ver1="3.1">The shared normals.</add>
    </niobject>

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

    <niobject name="NiTriStripsData" abstract="0" inherit="NiTriBasedGeomData" ver1="4.1.0.12">
        Holds mesh data using strips of triangles.
        <add name="Num Strips" type="ushort">Number of OpenGL triangle strips that are present.</add>
        <add name="Strip Lengths" type="ushort" arr1="Num Strips">The number of points in each triangle strip.</add>
        <add name="Has Points" type="bool" ver1="10.0.1.3">Do we have strip point data?</add>
        <add name="Points" type="ushort" arr1="Num Strips" arr2="Strip Lengths" ver2="10.0.1.2">The points in the Triangle strips.  Size is the sum of all entries in Strip Lengths.</add>
        <add name="Points" type="ushort" arr1="Num Strips" arr2="Strip Lengths" cond="Has Points != 0" ver1="10.0.1.3">The points in the Triangle strips. Size is the sum of all entries in Strip Lengths.</add>
    </niobject>

    <niobject name="NiEnvMappedTriShape" abstract="0" ver1="3.1" ver2="3.1" inherit="NiObjectNET">
        Unknown
        <add name="Unknown 1" type="ushort">unknown (=4 - 5)</add>
        <add name="Unknown Matrix" type="Matrix44">unknown</add>
        <add name="Num Children" type="uint">The number of child objects.</add>
        <add name="Children" type="Ref" template="NiAVObject" arr1="Num Children">List of child node object indices.</add>
        <add name="Child 2" type="Ref" template="NiObject">unknown</add>
        <add name="Child 3" type="Ref" template="NiObject">unknown</add>
    </niobject>

    <!--
    <niobject name="NiEnvMappedTriShapeData" abstract="0" ver1="3.1" ver2="3.1" inherit="NiTriBasedGeomData">
        Holds mesh data using a list of singular triangles.
        <add name="Num Triangle Points" type="uint">Num Triangles times 3.</add>
        <add name="Has Triangles" type="bool">Do we have triangle data?</add>
        <add name="Triangles" type="Triangle" arr1="Num Triangles" cond="Has Triangles != 0">Triangle face data.</add>
        <add name="Num Match Groups" type="ushort">Number of shared normals groups.</add>
        <add name="Match Groups" type="MatchGroup" arr1="Num Match Groups">The shared normals.</add>
    </niobject>
    -->
    <niobject name="NiEnvMappedTriShapeData" abstract="0" ver1="3.1" ver2="3.1" inherit="NiTriShapeData">
        Holds mesh data using a list of singular triangles.
    </niobject>

    <niobject name="NiBezierTriangle4" abstract="0" inherit="NiObject">
        Sub data of NiBezierMesh
        <add name="Unknown 1" type="uint" arr1="6">unknown</add>
        <add name="Unknown 2" type="ushort">unknown</add>
        <add name="Matrix" type="Matrix33">unknown</add>
        <add name="Vector 1" type="Vector3">unknown</add>
        <add name="Vector 2" type="Vector3">unknown</add>
        <add name="Unknown 3" type="short" arr1="4">unknown</add>
        <add name="Unknown 4" type="byte">unknown</add>
        <add name="Unknown 5" type="uint">unknown</add>
        <add name="Unknown 6" type="short" arr1="24">unknown</add>
    </niobject>

    <niobject name="NiBezierMesh" abstract="0" inherit="NiAVObject">
        Unknown
        <add name="Num Bezier Triangles" type="uint">references.</add>
        <add name="Bezier Triangle" type="Ref" template="NiBezierTriangle4" arr1="Num Bezier Triangles">unknown</add>
        <add name="Unknown 1" type="uint">Unknown.</add>
        <add name="Count 1" type="ushort">Data count.</add>
        <add name="Unknown 2" type="ushort">Unknown.</add>
        <add name="Points 1" type="Vector3" arr1="Count 1">data.</add>
        <add name="Unknown 3" type="uint">Unknown (illegal link?).</add>
        <add name="Points 2" type="float" arr1="Count 1" arr2="2">data.</add>
        <add name="Unknown 4" type="uint">unknown</add>
        <add name="Count 2" type="ushort">data count 2.</add>
        <add name="Data 2" type="ushort" arr1="Count 2" arr2="4">data count.</add>
    </niobject>



    <niobject name="NiClod" abstract="0" inherit="NiTriBasedGeom">
        A shape node that holds continuous level of detail information.
        Seems to be specific to Freedom Force.
    </niobject>

    <niobject name="NiClodData" abstract="0" inherit="NiTriBasedGeomData">
        Holds mesh data for continuous level of detail shapes.
        Pesumably a progressive mesh with triangles specified by edge splits.
        Seems to be specific to Freedom Force.
        The structure of this is uncertain and highly experimental at this point.
        No file with this data can currently be read properly.
        <add name="Unknown Shorts" type="ushort"></add>
        <add name="Unknown Count 1" type ="ushort"></add>
        <add name="Unknown Count 2" type ="ushort"></add>
        <add name="Unknown Count 3" type ="ushort"></add>
        <add name="Unknown Float" type="float"></add>
        <add name="Unknown Short" type="ushort"></add>
        <add name="Unknown Clod Shorts 1" type="ushort" arr1="Unknown Count 1" arr2="6"></add>
        <add name="Unknown Clod Shorts 2" type ="ushort" arr1="Unknown Count 2"></add>
        <add name="Unknown Clod Shorts 3" type ="ushort" arr1="Unknown Count 3" arr2="6"></add>
    </niobject>

    <niobject name="NiUVController" abstract="0" inherit="NiTimeController">
        Time controller for texture coordinates.
        <add name="Unknown Short" type="ushort">Always 0?</add>
        <add name="Data" type="Ref" template="NiUVData">Texture coordinate controller data index.</add>
    </niobject>

    <niobject name="NiUVData" abstract="0" inherit="NiObject">
        Texture coordinate data.
        <add name="UV Groups" type="KeyGroup" template="float" arr1="4">
            Four UV data groups. Appear to be U translation, V translation, U scaling/tiling, V scaling/tiling.
        </add>
    </niobject>

    <niobject name="NiVectorExtraData" abstract="0" inherit="NiExtraData" ver1="10.1.0.0">
        Extra vector data.
        <add name="Vector Data" type="Vector3">The vector data.</add>
        <add name="Unknown Float" type="float">Not sure whether this comes before or after the vector data.</add>
    </niobject>

    <niobject name="NiVertexColorProperty" abstract="0" inherit="NiProperty">
        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.
        <add name="Flags" type="Flags">
            Property flags. Appears to be unused until 20.1.0.3.

            Bits 0-2: Unknown
            Bit 3: Lighting Mode?
            Bits 4-5: Vertex Mode?
        </add>
        <add name="Vertex Mode" type="VertMode" ver2="20.0.0.5">
            Determines how vertex and material colors are mixed.
            related gl function: glColorMaterial
            In Flags from version 20.1.0.3 onwards.
        </add>
        <add name="Lighting Mode" type="LightMode" ver2="20.0.0.5">The light mode. In Flags from 20.1.0.3 on.</add>
    </niobject>

    <niobject name="NiVertWeightsExtraData" abstract="0" inherit="NiExtraData">
        Not used in skinning.
        Unsure of use - perhaps for morphing animation or gravity.
        <add name="Num Bytes" type="uint">Number of bytes in this data object.</add>
        <add name="Num Vertices" type="ushort">Number of vertices.</add>
        <add name="Weight" type="float" arr1="Num Vertices">The vertex weights.</add>
    </niobject>

    <niobject name="NiVisData" abstract="0" inherit="NiObject">
        Visibility data for a controller.
        <add name="Num Keys" type="uint">The number of visibility keys that follow.</add>
        <add name="Keys" type="Key" arg="1" template="byte" arr1="Num Keys">The visibility keys.</add>
    </niobject>

    <niobject name="NiWireframeProperty" abstract="0" inherit="NiProperty">
        Unknown.
        <add name="Flags" type="Flags">
            Property flags.
            0 - Wireframe Mode Disabled
            1 - Wireframe Mode Enabled
        </add>
    </niobject>

    <niobject name="NiZBufferProperty" abstract="0" inherit="NiProperty">
        This Property controls the Z buffer (OpenGL: depth buffer).
        <add name="Flags" type="Flags" default="3">
            Bit 0 enables the z test
            Bit 1 controls wether the Z buffer is read only (0) or read/write (1)
        </add>
        <add name="Function" type="ZCompareMode" default="TEST_LESS_EQUAL" ver1="4.1.0.12" ver2="20.0.0.5">
            Z-Test function (see: glDepthFunc). In Flags from 20.1.0.3 on.
        </add>
    </niobject>

    <niobject name="RootCollisionNode" abstract="0" inherit="NiNode">
        Morrowind-specific node for collision mesh.
    </niobject>

    <niobject name="NiRawImageData" abstract="0" inherit="NiObject" ver1="3.1" ver2="3.1">
        Raw image data.
        <add name="Width" type="uint">Image width</add>
        <add name="Height" type="uint">Image height</add>
        <add name="Image Type" type="ImageType">The format of the raw image data.</add>
        <add name="RGB Image Data" type="ByteColor3" arr1="Width" arr2="Height" cond="Image Type == 1" >Image pixel data.</add>
        <add name="RGBA Image Data" type="ByteColor4" arr1="Width" arr2="Height" cond="Image Type == 2" >Image pixel data.</add>
    </niobject>

    <niobject name="NiSortAdjustNode" abstract="0" inherit="NiNode" ver1="10.2.0.0">
        Unknown node.  Found in Loki.
        <add name="Sorting Mode" type="SortingMode" default="SORTING_INHERIT">Sorting</add>
        <add name="Unknown Int 2" type="int" default="-1" ver2="10.2.0.0">Unknown.</add>
    </niobject>

    <niobject name="NiSourceCubeMap" abstract="0" inherit="NiSourceTexture">
        Unknown node.  Found in Emerge Demo.
    </niobject>

    <niobject name="NiPhysXProp" abstract="0" inherit="NiObjectNET" ver1="20.1.0.7">
        Unknown PhysX node.
        <add name="Unknown Float 1" type="float">Unknown</add>
        <add name="Unknown Int 1" type="uint">Unknown</add>
        <add name="Unknown Refs 1" type="Ref" template="NiObject" arr1="Unknown Int 1">Unknown</add>
        <add name="Num Dests" type="int">Number of NiPhysXTransformDest references</add>
        <add name="Transform Dests" type="Ref" template="NiPhysXTransformDest" arr1="Num Dests">Unknown</add>
        <add name="Unknown Byte" type="byte">Unknown</add>
        <add name="Prop Description" type="Ref" template="NiPhysXPropDesc">PhysX Property Description.</add>
    </niobject>

    <compound name="physXMaterialRef">
        <add name="Number" type="byte">Unknown</add>
        <add name="Unknown Byte 1" type="byte">Unknown</add>
        <add name="Material Desc" type="Ref" template="NiPhysXMaterialDesc" >PhysX Material Description</add>
    </compound>

    <niobject name="NiPhysXPropDesc" abstract="0" inherit="NiObject" ver1="20.1.0.7">
        Unknown PhysX node.
        <add name="Num Dests" type="int">Number of NiPhysXActorDesc references</add>
        <add name="Actor Descs" type="Ref" template="NiPhysXActorDesc" arr1="Num Dests">Unknown</add>
        <add name="Num Joints" type="uint">Unknown</add>
        <add name="Joint Descs" type="Ref" template="NiPhysXD6JointDesc" arr1="Num Joints">PhysX Joint Descriptions</add>
        <add name="Unknown Int 1" type="int">Unknown</add>
        <add name="Num Materials" type="uint">Unknown</add>
        <add name="Material Descs" type="physXMaterialRef"  arr1="Num Materials">PhysX Material Descriptions</add>
        <add name="Unknown Int 2" type="uint">Unknown</add>
    </niobject>

    <niobject name="NiPhysXActorDesc" abstract="0" inherit="NiObject" ver1="20.1.0.7">
        Unknown PhysX node.
        <add name="Unknown Int 1" type="int">Unknown</add>
        <add name="Unknown Int 2" type="int">Unknown</add>
        <add name="Unknown Quat 1" type="Quaternion">Unknown</add>
        <add name="Unknown Quat 2" type="Quaternion">Unknown</add>
        <add name="Unknown Quat 3" type="Quaternion">Unknown</add>
        <add name="Unknown Ref 0" type="Ref" template="NiPhysXBodyDesc">Unknown</add>
        <add name="Unknown Int 4" type="float">Unknown</add>
        <add name="Unknown Int 5" type="int">Unknown</add>
        <add name="Unknown Byte 1" type="byte">Unknown</add>
        <add name="Unknown Byte 2" type="byte">Unknown</add>
        <add name="Unknown Int 6" type="int">Unknown</add>
        <add name="Shape Description" type="Ref" template="NiPhysXShapeDesc">PhysX Shape Description</add>
        <add name="Unknown Ref 1" type="Ref" template="NiObject">Unknown</add>
        <add name="Unknown Ref 2" type="Ref" template="NiObject">Unknown</add>
        <add name="Unknown Refs 3" type="Ref" template="NiObject" arr1="Unknown Int 6">Unknown</add>
    </niobject>

    <niobject name="NiPhysXBodyDesc" inherit="NiObject" ver1="20.3.0.6">
        Unknown PhysX node.
        <add name="Unknown Bytes" type="byte" arr1="136" ver1="20.3.0.6">Unknown</add>
    </niobject>

    <niobject name="NiPhysXD6JointDesc" inherit="NiObject" ver1="20.3.0.6">
        Unknown PhysX node.
        <add name="Unknown Bytes" type="byte" arr1="388" ver1="20.3.0.6">Unknown</add>
    </niobject>

    <niobject name="NiPhysXShapeDesc" abstract="0" inherit="NiObject" ver1="20.1.0.7">
        Unknown PhysX node.
        <add name="Unknown Int 1" type="int">Unknown</add>
        <add name="Unknown Quat 1" type="Quaternion">Unknown</add>
        <add name="Unknown Quat 2" type="Quaternion">Unknown</add>
        <add name="Unknown Quat 3" type="Quaternion">Unknown</add>
        <add name="Unknown Short 1" type="short">Unknown</add>
        <add name="Unknown Int 2" type="int">Unknown</add>
        <add name="Unknown Short 2" type="short">Unknown</add>
        <add name="Unknown Float 1" type="float">Unknown</add>
        <add name="Unknown Float 2" type="float">Unknown</add>
        <add name="Unknown Float 3" type="float">Unknown</add>
        <add name="Unknown Int 3" type="int">Unknown</add>
        <add name="Unknown Int 4" type="int">Unknown</add>
        <add name="Unknown Int 5" type="int">Unknown</add>
        <add name="Unknown Int 7" type="int">Unknown</add>
        <add name="Unknown Int 8" type="int">Unknown</add>
        <add name="Unknown Bytes 1" type="byte" arr1="8" ver1="20.3.0.6">Unknown. Wrong, but better than nothing.</add>
        <add name="Mesh Description" type="Ref" template="NiPhysXMeshDesc">PhysX Mesh Description</add>
        <!-- todo: fix invalid link failure on Ficus.nif from the emerge demo -->
    </niobject>

    <niobject name="NiPhysXMeshDesc" abstract="0" inherit="NiObject" ver1="20.1.0.7">
        Unknown PhysX node.
        <add name="Unknown Short 1" type="short">Unknown</add>
        <add name="Unknown Float 1" type="float">Unknown</add>
        <add name="Unknown Short 2" type="short">Unknown</add>
        <add name="Unknown Bytes 1" type="byte" arr1="3">NXS</add>
        <add name="Unknown Byte 1" type="byte">Unknown</add>
        <add name="Unknown Bytes 1" type="byte" arr1="4">MESH</add>
        <add name="Unknown Bytes 2" type="byte" arr1="8">Unknown</add>
        <add name="Unknown Float 2" type="float">Unknown</add>
        <add name="Unknown Int 1" type="int">Unknown</add>
        <add name="Unknown Int 2" type="int">Unknown</add>
        <add name="Num Vertices" type="int">Number of mesh vertices</add>
        <add name="Unknown Int 4" type="int">Unknown</add>
        <add name="Vertices" type="Vector3" arr1="Num Vertices">Vertices</add>
        <add name="Unknown Bytes 3" type="byte" arr1="982">Unknown</add>
        <add name="Unknown Shorts 1" type="short" arr1="368">Unknown</add>
        <add name="Unknown Ints 1" type="uint" arr1="3328">Unknown</add>
        <add name="Unknown Byte 2" type="byte">Unknown</add>
    </niobject>

    <niobject name="NiPhysXMaterialDesc" abstract="0" inherit="NiObject" ver1="20.1.0.7">
        Unknown node.
        <add name="Unknown Int" type="uint" arr1="12">Unknown</add>
        <add name="Unknown Byte 1" type="byte">Unknown</add>
        <add name="Unknown Byte 2" type="byte">Unknown</add>
    </niobject>

    <niobject name="NiPhysXKinematicSrc" inherit="NiObject" ver1="20.1.0.7">
        Unknown PhysX node.
        <add name="Unknown Bytes" type="byte" arr1="6" ver1="20.3.0.6">Unknown</add>
    </niobject>

    <niobject name="NiPhysXTransformDest" inherit="NiObject" ver1="20.1.0.7">
        Unknown PhysX node.
        <add name="Unknown Byte 1" type="byte">Unknown. =1?</add>
        <add name="Unknown Byte 2" type="byte">Unknown. =0</add>
        <add name="Node" type="Ptr" template="NiNode" >Affected node?</add>

    </niobject>

    <niobject name="NiArkAnimationExtraData" inherit="NiExtraData">
        Unknown node.
        <add name="Unknown Ints" type="int" arr1="4" />
        <add name="Unknown Bytes" type="byte" arr1="37" ver2="4.1.0.12" />
    </niobject>

    <niobject name="NiArkImporterExtraData" inherit="NiExtraData">
        Unknown node.
        <add name="Unknown Int 1" type="int" />
        <add name="Unknown Int 2" type="int" ver2="4.1.0.12" />
        <add name="Importer Name" type="string">Contains a string like &quot;Gamebryo_1_1&quot; or &quot;4.1.0.12&quot;</add>
        <add name="Unknown Bytes" type="byte" arr1="13" />
        <add name="Unknown Floats" type="float" arr1="7" />
    </niobject>

    <niobject name="NiArkTextureExtraData" inherit="NiExtraData">
        Unknown node.
        <add name="Unknown Ints 1" type="int" arr1="2" />
        <add name="Unknown Byte" type="byte" />
        <add name="Unknown Int 2" type="int" ver2="4.1.0.12" />
        <add name="Num Textures" type="int" />
        <add name="Textures" type="ArkTexture" arr1="Num Textures" />
    </niobject>

    <niobject name="NiArkViewportInfoExtraData" inherit="NiExtraData">
        Unknown node.
        <add name="Unknown Bytes" type="byte" arr1="13" />
    </niobject>

    <niobject name="NiArkShaderExtraData" inherit="NiExtraData">
        Unknown node.
        <add name="Unknown Int" type="int" />
        <add name="Unknown String" type="string" />
    </niobject>

    <niobject name="NiLines" inherit="NiTriBasedGeom" ver1="4.2.2.0">
        Wireframe geometry.
    </niobject>

    <niobject name="NiLinesData" inherit="NiGeometryData" ver1="4.2.2.0">
        Wireframe geometry data.
        <add name="Lines" type="bool" arr1="Num Vertices">Is vertex connected to other (next?) vertex?</add>
    </niobject>

    <compound name="Polygon">
        Two dimensional screen elements.
        <add name="Num Vertices" type="ushort">Number of vertices in this polygon</add>
        <add name="Vertex Offset" type="ushort">Vertex Offset</add>
        <add name="Num Triangles" type="ushort">Number of faces in this polygon</add>
        <add name="Triangle Offset" type="ushort">Triangle offset in shape</add>
    </compound>

    <niobject name="NiScreenElementsData" inherit="NiTriShapeData">
        Two dimensional screen elements.
        <add name="Max Polygons" type="ushort">Maximum number of polygons?</add>
        <add name="Polygons" type="Polygon" arr1="Max Polygons">Polygons</add>
        <add name="Polygon Indices" type="ushort" arr1="Max Polygons">Polygon Indices</add>
        <add name="Unknown UShort 1" type="ushort" default="1">Unknown</add>
        <add name="Num Polygons" type="ushort">Number of Polygons actually in use</add>
        <add name="Used Vertices" type="ushort">Number of in-use vertices</add>
        <add name="Unknown UShort 2" type="ushort" default="1">Unknown</add>
        <add name="Used Triangle Points" type="ushort">Number of in-use triangles</add>
        <add name="Unknown UShort 3" type="ushort" default="1">Maximum number of faces</add>
    </niobject>

    <niobject name="NiScreenElements" inherit="NiTriShape">
        Two dimensional screen elements.
    </niobject>

    <niobject name="NiRoomGroup" inherit="NiNode">
        Grouping node for nodes in a Portal
        <add name="Shell Link" type="Ptr" template="NiNode" >Outer Shell Geometry Node?</add>
        <add name="Num Rooms" type="int">Number of rooms in this group</add>
        <add name="Rooms" type="Ptr" template="NiRoom" arr1="Num Rooms">Rooms associated with this group.</add>
    </niobject>

    <niobject name="NiRoom" inherit="NiNode">
        Grouping node for nodes in a Portal
        <add name="Num Walls" type="int">Number of walls in a room?</add>
        <add name="Wall Plane" type="Vector4" arr1="Num Walls">Face normal and unknown value.</add>
        <add name="Num In Portals" type="int">Number of doors into room</add>
        <add name="In Portals" type="Ptr" template="NiPortal" arr1="Num In Portals">Number of portals into room</add>
        <add name="Num Portals 2" type="int">Number of doors out of room</add>
        <add name="Portals 2" type="Ptr" template="NiPortal" arr1="Num Portals 2">Number of portals out of room</add>
        <add name="Num Items" type="int">Number of unknowns</add>
        <add name="Items" type="Ptr" template="NiAVObject" arr1="Num Items">All geometry associated with room.</add>
    </niobject>

    <niobject name="NiPortal" inherit="NiAVObject">
        A Portal
        <add name="Unknown Flags" type="Flags">Unknown flags.</add>
        <add name="Unknown Short 1" type="short">Unknown</add>
        <add name="Num Vertices" type="ushort">Number of vertices in this polygon</add>
        <add name="Vertices" type="Vector3" arr1="Num Vertices">Vertices</add>
        <add name="Target" type="Ptr" template="NiNode">Target portal or room</add>
    </niobject>

    <!-- Red Ocean Custom Objects
    <niobject name="Object" inherit="NiNode" ver1="10.2.0.0">
        Red Ocean Object class
        <add name="Unknown Short 1" type="short">Unknown</add>
        <add name="Unknown Link 1" type="Ref" template="NiObject">Unknown</add>
        <add name="Unknown Short 2" type="short">Unknown</add>
        <add name="Unknown Short 3" type="short">Unknown</add>
        <add name="Unknown Float 1" type="float">Unknown</add>
    </niobject>
    
    <niobject name="BoundingBoxExtraData" inherit="NiExtraData" ver1="10.2.0.0">
        Red Ocean Bounding Box
        <add name="Flags" type="Flags">Unknown</add>
        <add name="Center?" type="Vector3">Center of box?</add>
        <add name="Extent?" type="Vector3">Extents of box?</add>
    </niobject>
    
    <niobject name="Door" inherit="Object" ver1="10.2.0.0">
        Red Ocean Object class
        <add name="Unknown Short 1" type="short">Unknown</add>
        <add name="Unknown Float 1" type="float">Unknowns</add>
        <add name="Unknown Float 2" type="float">Unknowns</add>
        <add name="Unknown Short 2" type="short">Unknown</add>
        <add name="Unknown Int 1" type="int">Unknown</add>
        <add name="Unknown Short 3" type="short">Unknown</add>
        <add name="Unknown Bool 1" type="bool">Unknown</add>
        <add name="Unknown Short 4" type="short">Unknown</add>
        <add name="Unknown Float 3" type="float">Unknowns</add>
    </niobject>
    -->
    <niobject name="BSFadeNode" abstract="0" inherit="NiNode" ver1="20.2.0.7" userver="11">
        Bethesda-specific fade node.
    </niobject>

    <enum name="BSShaderType" storage="uint">
        The type of animation interpolation (blending) that will be used on the associated key frames.
        <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">
        Shader Property Flags
		<option value="0" name="ZBUFFER TEST">ZBuffer Test (1=on)</option>
		<option value="1" name="SHADOW MAP">Shadow Map</option>
		<option value="2" name="EXTERNAL EMITTANCE">External Emittance</option>
		<option value="3" name="PARALLAX OCCLUSION">Parallax Occlusion</option>
		<option value="4" name="DYNAMIC DECAL">Dynamic Decal</option>
		<option value="5" name="DECAL">Decal</option>
		<option value="6" name="UNKNOWN 6">Unknown\Light fade? (if 0 and envmap is on, "envmap light fade" is not present)</option>
		<option value="7" name="MULTIPLE TEXTURES">Multiple Textures (base diff/norm become null)</option>
		<option value="8" name="SHADOW FRUSTUM">Shadow Frustum</option>
		<option value="9" name="TREE BILLBOARD">Tree Billboard</option>
		<option value="10" name="WINDOW ENVIRONMENT MAPPING">Window Environment Mapping</option>
		<option value="11" name="LOCALMAP HIDE SECRET">Localmap Hide Secret</option>
		<option value="12" name="DYNAMIC ALPHA">Dynamic Alpha</option>
		<option value="13" name="HAIR">Hair</option>
		<option value="14" name="EYE ENVIRONMENT MAPPING">Eye Environment Mapping (does not use envmap light fade or envmap scale)</option>
		<option value="15" name="FIRE REFRACTION">Fire Refraction (switches on refraction power/period)</option>
		<option value="16" name="REFRACTION">Refraction (switches on refraction power)</option>
		<option value="17" name="UNKNOWN 17">Unknown/Crash</option>
		<option value="18" name="NON PROJECTIVE SHADOWS">Non-Projective Shadows</option>
		<option value="19" name="UNKNOWN 19">Unknown/Crash</option>
		<option value="20" name="PARALLAX">Parallax</option>
		<option value="21" name="FACEGEN SKIN">Facegen\Skin</option>
		<option value="22" name="UNKNOWN 22">Unknown (Always 0?)</option>
		<option value="23" name="UNKNOWN 23">Unknown (usually 1)</option>
		<option value="24" name="ENVIRONMENT MAPPING">Environment mapping (uses Envmap Scale)</option>
		<option value="25" name="EMPTY" default="1">EMPTY (usually seen w/texture animation)</option>
		<option value="26" name="SINGLE PASS">Single Pass (uses same default shader path as diff/norm/spec setup BSSM_ADTS10)</option>
		<option value="27" name="UNKNOWN 27">Unknown (Always 0?)</option>
		<option value="28" name="VERTEX ALPHA">Vertex Alpha</option>
		<option value="29" name="LOWDDETAIL">Lowddetail (seems to use standard diff/norm/spec shader)</option>
		<option value="30" name="SKINNED">Skinned.</option>
		<option value="31" name="UNKNOWN 31" default="1">Unknown</option>
    </bitflags>
    
    <niobject name="BSShaderProperty" abstract="0" inherit="NiProperty" ver1="20.2.0.7">
        Bethesda-specific Property node
        <add name="Flags" type="Flags" default="1">Unknown</add>
        <add name="Shader Type" type="BSShaderType" default="SHADER_DEFAULT">Unknown (Set to 0x21 for NoLighting, 0x11 for Water)</add>
        <add name="Shader Flags" type="BSShaderFlags" default="0x82000000">Shader Property Flags</add>
        <add name="Unknown Int 2" type="int" default="1">Unknown</add>
        <add name="Envmap Scale" type="float" default="1.0">Unknown</add>
    </niobject>

    <niobject name="BSShaderLightingProperty" abstract="1" inherit="BSShaderProperty" ver1="20.2.0.7" userver="11">
        Bethesda-specific property.
        <add name="Unknown Int 3" type="int" default="3">Unknown</add>
    </niobject>

    <niobject name="BSShaderNoLightingProperty" abstract="0" inherit="BSShaderLightingProperty" ver1="20.2.0.7" userver="11">
        Bethesda-specific property.
        <add name="File Name" type="SizedString">The texture glow map.</add>
        <add name="Unknown Float 2" type="float" default="1.0" vercond="(User Version == 11) &amp;&amp; (User Version 2 &gt; 26)">Unknown</add>
        <add name="Unknown Float 3" type="float" default="0.0" vercond="(User Version == 11) &amp;&amp; (User Version 2 &gt; 26)">
            Normally what appears to be a junk value (0xB33BBD2E). Appears to be related to glow when Unk Flags is (0x82000148).
        </add>
        <add name="Unknown Float 4" type="float" default="1.0" vercond="(User Version == 11) &amp;&amp; (User Version 2 &gt; 26)">Unknown</add>
        <add name="Unknown Float 5" type="float" default="0.0" vercond="(User Version == 11) &amp;&amp; (User Version 2 &gt; 26)">Unknown</add>
    </niobject>

    <niobject name="BSShaderPPLightingProperty" abstract="0" inherit="BSShaderLightingProperty" ver1="20.2.0.7" userver="11">
        Bethesda-specific Shade node.
        <add name="Texture Set" type="Ref" template="BSShaderTextureSet">Texture Set</add>
        <add name="Unknown Float 2" type="float" default="0.0" vercond="(User Version == 11) &amp;&amp; (User Version 2 &gt; 14)">Unknown</add>
        <add name="Refraction Period" type="int" default="0" vercond="(User Version == 11) &amp;&amp; (User Version 2 &gt; 14)">Rate of texture movement for refraction shader.</add>
        <add name="Unknown Float 4" type="float" default="4.0" vercond="(User Version == 11) &amp;&amp; (User Version 2 &gt; 24)">Unknown</add>
        <add name="Unknown Float 5" type="float" default="1.0" vercond="(User Version == 11) &amp;&amp; (User Version 2 &gt; 24)">Unknown</add>
    </niobject>
    
    <niobject name="BSShaderTextureSet" abstract="0" inherit="NiObject" ver1="20.2.0.7" userver="11">
        Bethesda-specific Texture Set.
        <add name="Num Textures" type="int" default="6">Number of Textures</add>
        <add name="Textures" type="SizedString" arr1="Num Textures">Textures.
            0: Diffuse
            1: Normal/Gloss
            2: Environment Mask
            3: Glow/Skin/Hair
            4: Height
            5: Environment
        </add>
    </niobject>

    <niobject name="WaterShaderProperty" abstract="0" inherit="BSShaderProperty" ver1="20.2.0.7" userver="11">
        Bethesda-specific node? Found in Fallout3
    </niobject>

    <niobject name="SkyShaderProperty" abstract="0" inherit="BSShaderProperty" ver1="20.2.0.7" userver="11">
        Bethesda-specific node? Found in Fallout3
        <add name="Unknown Int 4" type="int">Unknown</add>
        <add name="File Name" type="SizedString">The texture.</add>
        <add name="Unknown Int 5" type="int" default="3">Unknown</add>
    </niobject>

    <niobject name="TileShaderProperty" abstract="0" inherit="BSShaderLightingProperty" ver1="20.2.0.7" userver="11">
        Bethesda-specific node.
        <add name="File Name" type="SizedString">Texture file name</add>
    </niobject>

    <niobject name="DistantLODShaderProperty" abstract="0" inherit="BSShaderProperty" ver1="20.2.0.7" userver="11">
        Bethesda-specific node.
    </niobject>

    <niobject name="BSDistantTreeShaderProperty" abstract="0" inherit="BSShaderProperty" ver1="20.2.0.7" userver="11">
        Bethesda-specific node.
    </niobject>

    <niobject name="TallGrassShaderProperty" abstract="0" inherit="BSShaderProperty" ver1="20.2.0.7" userver="11">
        Bethesda-specific node.
        <add name="File Name" type="SizedString">Texture file name</add>
    </niobject>

    <niobject name="VolumetricFogShaderProperty" abstract="0" inherit="BSShaderProperty" ver1="20.2.0.7" userver="11">
        Bethesda-specific node.
    </niobject>

    <niobject name="HairShaderProperty" abstract="0" inherit="BSShaderProperty" ver1="20.2.0.7" userver="11">
        Bethesda-specific node.
    </niobject>

    <niobject name="Lighting30ShaderProperty" abstract="0" inherit="BSShaderPPLightingProperty" ver1="20.2.0.7" userver="11">
        Bethesda-specific node.
    </niobject>

    <niobject name="BSDismemberSkinInstance" abstract="0" inherit="NiSkinInstance" ver1="20.2.0.7" userver="11">
        Bethesda-specific node.
        <add name="Num Partitions" type="int">Unknown</add>

        <add name="Partitions" type="BodyPartList" arr1="Num Partitions">Unknown</add>
    </niobject>

    <niobject name="BSDecalPlacementVectorExtraData" inherit="NiExtraData" ver1="20.2.0.7" userver="11">
        Bethesda-specific node. (for dynamic decal projection?)
        <add name="Unknown Float 1" type="float">Unknown</add>
        <add name="Num Vector Blocks" type="short">Number of groups</add>
        <add name="Vector Blocks" type="DecalVectorArray" arr1="Num Vector Blocks">Number of Blocks</add>
    </niobject>

    <niobject name="BSPSysSimpleColorModifier" inherit="NiPSysModifier" ver1="20.2.0.7" userver="11">
        Bethesda-Specific Particle node.
        <add name="Fade In Percent" type="float">Unknown</add>
        <add name="Fade out Percent" type="float">Unknown</add>
        <add name="Color 1 End Percent" type="float">Unknown</add>
        <add name="Color 1 Start Percent" type="float">Unknown</add>
        <add name="Color 2 End Percent" type="float">Unknown</add>
        <add name="Color 2 Start Percent" type="float">Unknown</add>
        <add name="Colors" type="Color4" arr1="3">Colors</add>
    </niobject>


    <niobject name="BSValueNode" inherit="NiNode" ver1="20.2.0.7" userver="11">
        Bethesda-Specific node. Found on fxFire effects
        <add name="Value" type="int">Value</add>
        <add name="Unknown byte" type="byte">Unknown</add>
    </niobject>


    <niobject name="BSStripParticleSystem" inherit="NiParticleSystem" ver1="20.2.0.7" userver="11">
        Bethesda-Specific (mesh?) Particle System.
    </niobject>


    <niobject name="BSStripPSysData" inherit="NiPSysData" ver1="20.2.0.7" userver="11">
        Bethesda-Specific (mesh?) Particle System Data.
        <add name="Unknown Short 1" type="short">Unknown</add>
        <add name="Unknown byte 1" type="byte">Unknown</add>
        <add name="Unknown Int 2" type="int">Unknown</add>
        <add name="Unknown Int 3" type="int">Unknown</add>
    </niobject>


    <niobject name="BSPSysStripUpdateModifier" inherit="NiPSysModifier" ver1="20.2.0.7" userver="11">
        Bethesda-Specific (mesh?) Particle System Modifier.
        <add name="Update Delta Time" type="float">Unknown</add>
    </niobject>


    <niobject name="BSMaterialEmittanceMultController" inherit="NiFloatInterpController" ver1="20.2.0.7" userver="11">
        Bethesda-Specific node.
    </niobject>



    <niobject name="BSMasterParticleSystem" inherit="NiNode" ver1="20.2.0.7" userver="11">
        Bethesda-Specific node.
        <add name="Max Emitter Objects" type="ushort">Unknown</add>
        <add name="Num Particle Systems" type="int">Unknown</add>
        <add name="Particle Systems" type="Ref" template="NiAVObject" arr1="Num Particle Systems">Unknown</add>

    </niobject>


    <niobject name="BSPSysMultiTargetEmitterCtlr" inherit="NiPSysModifierCtlr" ver1="20.2.0.7" userver="11">
        Particle system (multi?) emitter controller.
        <add name="Data" type="Ref" template="NiPSysEmitterCtlrData" ver2="10.1.0.0">This controller's data</add>
        <add name="Visibility Interpolator" type="Ref" template="NiInterpolator" ver1="10.2.0.0">Links to a bool interpolator. Controls emitter&#039;s visibility status?</add>
        <add name="Unknown Short 1" type="short">Unknown</add>
        <add name="Unknown Int 1" type="int">Unknown</add>
    </niobject>


    <niobject name="BSRefractionStrengthController" inherit="NiFloatInterpController" ver1="20.2.0.7" userver="11">
        Bethesda-Specific node.
    </niobject>


    <niobject name="BSOrderedNode" inherit="NiNode" ver1="20.2.0.7" userver="11">
        Bethesda-Specific node.
        <add name="Alpha Sort Bound" type="Vector4">Unknown</add>
        <add name="Is Static Bound" type="byte">Unknown</add>
    </niobject>


    <niobject name="BSBlastNode" inherit="NiNode" ver1="20.2.0.7" userver="11">
        Bethesda-Specific node.
        <add name="Unknown Byte 1" type="byte">Unknown</add>
        <add name="Unknown Short 2" type="short">Unknown</add><!-- Unknown Short 1 already used in NiNode -->
    </niobject>


    <niobject name="BSDamageStage" inherit="NiNode" ver1="20.2.0.7" userver="11">
        Bethesda-Specific node.
        <add name="Unknown Byte 1" type="byte">Unknown</add>
        <add name="Unknown Short 2" type="short">Unknown</add><!-- Unknown Short 1 already used in NiNode -->
    </niobject>


    <niobject name="BSRefractionFirePeriodController" abstract="0" inherit="NiTimeController" ver1="20.2.0.7" userver="11">
        Bethesda-specific node.
    </niobject>

    <niobject name="bhkConvexListShape" abstract="0" inherit="bhkShape">
        A havok shape.
        A list of shapes.

        Do not put a bhkPackedNiTriStripsShape in the Sub Shapes. Use a
        separate collision nodes without a list shape for those.

        Also, shapes collected in a bhkListShape may not have the correct
        walking noise, so only use it for non-walkable objects.
        <add name="Num Sub Shapes" type="uint">The number of sub shapes referenced.</add>
        <add name="Sub Shapes" type="Ref" template="bhkShape" arr1="Num Sub Shapes">List of shapes.</add>
        <add name="Material" type="HavokMaterial">The shape&#039;s material.</add>
        <add name="Unknown Floats" type="float" arr1="6" default="0.0 0.0 -0.0 0.0 0.0 -0.0">Unknown. Set to (0.0,0.0,-0.0,0.0,0.0,-0.0), where -0.0 is 0x80000000 in hex.</add>
        <add name="Unknown Byte 1" type="byte" >Unknown Flag</add>
        <add name="Unknown Float 1" type="float">Unknown Flag</add>
    </niobject>

    <compound name="BSTreadTransfSubInfo">
        Bethesda-specific node.
        <add name="Unknown Int 1" type="int">Unknown</add>
        <add name="Unknown Int 2" type="int">Unknown</add>
        <add name="Unknown Int 3" type="int">Unknown</add>
        <add name="Unknown Int 4" type="int">Unknown</add>
        <add name="Unknown Int 5" type="int">Unknown</add>
        <add name="Unknown Int 6" type="int">Unknown</add>
        <add name="Unknown Int 7" type="int">Unknown</add>
        <add name="Unknown Int 8" type="int">Unknown</add>
    </compound>

    <compound name="BSTreadTransfInfo">
        Bethesda-specific node.
        <add name="Unknown Float 1" type="float">Unknown Flag</add>
        <add name="Data" type="BSTreadTransfSubInfo" arr1="2">Data</add>
    </compound>

    <niobject name="BSTreadTransfInterpolator" abstract="0" inherit="NiInterpolator">
        Bethesda-specific node.
        <add name="Num Transfers" type="int">Unknown</add>
        <add name="Tread Transfer Info" type="BSTreadTransfInfo" arr1="Num Transfers">Unknown</add>
        <add name="Unknown Int 1" type="int">Unknown</add>
    </niobject>

    <niobject name="BSAnimNotes" abstract="0" inherit="NiObject">
        Bethesda-specific node.
        <add name="Unknown Short 1" type="short">Unknown</add>
    </niobject>

    <niobject name="bhkLiquidAction" inherit="bhkSerializable">
        Bethesda-specific node.
        <add name="Unknown Int 1" type="int">Unknown Flag</add>
        <add name="Unknown Int 2" type="int">Unknown Flag</add>
        <add name="Unknown Int 3" type="int">Unknown Flag</add>
        <add name="Unknown Float 1" type="float">Unknown Flag</add>
        <add name="Unknown Float 2" type="float">Unknown Flag</add>
        <add name="Unknown Float 3" type="float">Unknown Flag</add>
        <add name="Unknown Float 4" type="float">Unknown Flag</add>
    </niobject>

    <niobject name="BSMultiBoundNode" inherit="NiNode">
        Bethesda-specific node.
        <add name="Multi Bound" type="Ref" template="BSMultiBound">Unknown.</add>
    </niobject>

    <niobject name="BSMultiBound" inherit="NiObject">
        Bethesda-specific node.
        <add name="Data" type="Ref" template="BSMultiBoundData">Unknown.</add>
    </niobject>

    <niobject name="BSMultiBoundData" inherit="NiObject">
        Abstract base type for bounding data.
    </niobject>

    <niobject name="BSMultiBoundSphere" inherit="BSMultiBoundData">
        Bethesda-specific node.
        <add name="Unknown Int 1" type="int">Unknown Flag</add>
        <add name="Unknown Int 2" type="int">Unknown Flag</add>
        <add name="Unknown Int 3" type="int">Unknown Flag</add>
        <add name="Radius" type="float">Radius</add>
    </niobject>

    <compound name="BSSegmentedTriangle">
        Bethesda-specific node.
        <add name="Unknown Int 1" type="int" >Unknown</add>
        <add name="Unknown Int 2" type="int" >Unknown</add>
        <add name="Unknown Byte 1" type="byte" >Unknown</add>
    </compound>

    <niobject name="BSSegmentedTriShape" inherit="NiTriShape">
        Bethesda-specific node.
        <add name="Num Seg Triangles" type="int" >Unknown</add>
        <add name="Seg Triangles" type="BSSegmentedTriangle" arr1="Num Seg Triangles">Unknown</add>
    </niobject>

    <niobject name="BSMultiBoundAABB" inherit="BSMultiBoundData">
        Bethesda-specific node.
        <add name="Unknown Floats 1" type="float" arr1="6">Unknown</add>
    </niobject>

    <compound name="AdditionalDataInfo">
        <add name="Data Type" type="int" >Type of data</add>
        <add name="Block Size" type="int" >Size of Block</add>
        <add name="Num Blocks" type="int" >Unknown</add>
        <add name="Block Size 2" type="int" >Unknown</add>
        <add name="Block Index" type="int" >Unknown</add>
        <add name="Unknown Int 1" type="int" >Unknown</add>
        <add name="Unknown Byte 1" type="byte" >Unknown</add>
    </compound>

    <compound name="AdditionalDataBlock">
        <add name="Has Data" type="bool">Has data</add>
        <add name="Block Size" type="int" cond="Has Data">Size of Block</add>
        <add name="Num Blocks" type="int" cond="Has Data">Unknown</add>
        <add name="Block Offsets" type="int" arr1="Num Blocks" cond="Has Data">Unknown</add>

        <add name="Num Data" type="int" cond="Has Data">Unknown</add>
        <add name="Data Sizes" type="int" arr1="Num Data" cond="Has Data">Unknown</add>
        <add name="Data" type="byte" arr1="Num Data" arr2="Block Size" cond="Has Data">Unknown</add>
    </compound>

    <niobject name="NiAdditionalGeometryData" inherit="NiObject">
        <add name="Num Vertices" type="ushort">Number of vertices</add>
        <add name="Num Block Infos" type="uint">Information about additional data blocks</add>
        <add name="Block Infos" type="AdditionalDataInfo" arr1="Num Block Infos">Number of additional data blocks</add>
        <add name="Num Blocks" type="int">Number of additional data blocks</add>
        <add name="Blocks" type="AdditionalDataBlock" arr1="Num Blocks">Number of additional data blocks</add>
    </niobject>


    <niobject name="BSWArray" inherit="NiExtraData">
        Bethesda-specific node.
        <add name="Num Items" type="int">Unknown</add>
        <add name="Items" type="int" arr1="Num Items">Unknown</add>
    </niobject>

    <niobject name="bhkAabbPhantom" inherit="bhkShapePhantom">
        Bethesda-specific node.
        <add name="Unknown Ints 1" type="int" arr1="15" />
    </niobject>

    <niobject name="BSFrustumFOVController" inherit="NiTimeController">
        Bethesda-specific node.
        <add name="Interpolator" type="Ref" template="NiFloatInterpolator">Frustrum field of view animation interpolater and data.</add>
    </niobject>

    <niobject name="BSDebrisNode" inherit="NiNode" ver1="20.2.0.7" userver="11">
        Bethesda-Specific node.
        <add name="Unknown byte 1" type="byte">Unknown</add>
        <add name="Unknown Short 1" type="short">Unknown</add>
    </niobject>

    <niobject name="bhkBreakableConstraint" abstract="0" inherit="bhkConstraint" ver1="20.0.0.5">
        Bethesda-Specific node.
        <add name="Unknown Ints 1" type="int" arr1="41" />
        <add name="Unknown Short 1" type="short">Unknown</add>
    </niobject>

    <niobject name="bhkOrientHingedBodyAction" abstract="0" inherit="bhkSerializable" ver1="20.0.0.5">
        Bethesda-Specific node.
        <add name="Unknown Ints 1" type="int" arr1="17" />
    </niobject>

</niftoolsxml>
