Difference between revisions of "MMH"

From Dragon Age Toolset Wiki
Jump to: navigation, search
m
(add schema)
Line 31: Line 31:
 
*Spherical
 
*Spherical
  
(coming soon)
+
See [http://www.oasis-open.org/committees/relax-ng/spec.html] for information on the RELAX NG 1.0 XML schema format.
 +
 
 +
<pre>
 +
<?xml version="1.0" encoding="UTF-8"?>
 +
<grammar ns="" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
 +
  <start>
 +
    <element name="ModelHierarchy">
 +
      <optional>
 +
        <attribute name="FXActorName">
 +
          <data type="NCName"/> <!-- An FXA file name -->
 +
        </attribute>
 +
      </optional>
 +
      <attribute name="ModelDataName">
 +
        <data type="NCName"/> <!-- an MSH file name -->
 +
      </attribute>
 +
      <attribute name="Name">
 +
        <data type="NCName"/> <!-- An MMH file name -->
 +
      </attribute>
 +
      <optional>
 +
        <attribute name="PreSimulateTime">
 +
          <data type="decimal"/> <!-- emitter presimulation time -->
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="ReferencedMeshes"/> <!-- List of names of referenced meshes. Most of the files I see this in have an empty string here, but some have one or more .msh files named with spaces separating them. For example: ReferencedMeshes="fx_l_plane.msh fx_l_plane.msh". Every file with ReferencedMeshes defined was exported by the VFX editor so this is a VFX thing.-->
 +
      </optional>
 +
      <optional>
 +
        <attribute name="RemoteMaterialAlpha">
 +
          <data type="decimal"/> <!-- if UseRemoteMaterial is true -->
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="RemoteMaterialDecalName">
 +
          <data type="NCName"/> <!-- if UseRemoteMaterial is true -->
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="RemoteMaterialFresnelFalloff">
 +
          <data type="decimal"/>  <!-- if UseRemoteMaterial is true -->
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="RemoteMaterialInvertFresnel">
 +
          <data type="integer"/>  <!-- if UseRemoteMaterial is true. A true/false value -->
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="RemoteMaterialTintColor"/> <!-- if UseRemoteMaterial is true. Four numbers separated by spaces -->
 +
      </optional>
 +
      <optional>
 +
        <attribute name="UseRemoteMaterial">
 +
          <data type="integer"/> <!-- a true/false value -->
 +
        </attribute>
 +
      </optional>
 +
      <choice>
 +
        <ref name="MeshHierarchy"/> <!-- MeshHierarchy is a deprecated synonym for "NodeMesh". -->
 +
        <ref name="Node"/>
 +
        <ref name="NodeMesh"/>
 +
      </choice>
 +
    </element>
 +
  </start>
 +
  <define name="NodeMesh">
 +
    <element name="NodeMesh">
 +
      <optional>
 +
        <attribute name="BonesUsed"/> <!-- list of integers. Bodies have a lot of bones listed, other body parts have fewer. Boots, armor, gloves, helmets, hair, eyes, etc. all have bonesused. -->
 +
      </optional>
 +
      <optional>
 +
        <attribute name="CastBakedShadow"> <!-- appears to be a true/false value -->
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="CastRuntimeShadow">  <!-- appears to be a true/false value -->
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="CutAway"> <!-- appears to be a true/false value -->
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="ID">
 +
          <data type="NCName"/> <!-- A short string that always seems to be "_" followed by two or three random-looking numbers and letters -->
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="IsVFXMesh"> <!-- if this mesh is categorized as a VFX Mesh, load in the MaterialColor parameter -->
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="MaterialColor"/> <!-- String with four values - RGBA -->
 +
      </optional>
 +
      <optional>
 +
        <attribute name="MaterialLibrary"> <!-- Strings like "CAI_Floor03.mao" and "CavesInterior.mal" - mao and mal are material editor file types -->
 +
          <data type="NCName"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="MaterialObject"> <!-- Some boots had things like "pn_boo_hvyd_l3" here, a piece of corridor named fca_corridor01_0 had separate nodemeshes with both "fca_master" and "BLK_Master". I think this is referring to material libraries create by the material editor -->
 +
          <data type="NMTOKEN"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="MeshGroupName"> <!-- A lot of very generic-sounding names like "Box23" and "Object9331", mixed with a few more meaningful names like "MshMain_CAV_CaiPlatform03_0" -->
 +
          <data type="NCName"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="MeshName"> <!-- the mesh file that the meshchunk is in. if this isn't set, it will default to the first mesh in the model (for backwards compatibility) -->
 +
          <data type="NCName"/>
 +
        </attribute>
 +
      </optional>
 +
      <attribute name="Name">
 +
        <data type="NCName"/>
 +
      </attribute>
 +
      <optional>
 +
        <attribute name="PunchThrough"> <!-- appears to be a true/false value -->
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="ReceiveBakedShadow"> <!-- appears to be a true/false value -->
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="ReceiveRuntimeShadow"> <!-- appears to be a true/false value -->
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="ReceiveShadow"> <!-- I didn't find this referenced in the source code - deprecated, perhaps? -->
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="ShadowCasting"> <!-- used to set GFF_MMH_MESH_CAST_RUNTIME_SHADOW in the source code, same as CastRuntimeShadow above - synonyms? -->
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="UseVariationTint">
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <zeroOrMore>
 +
        <choice>
 +
          <ref name="Attribute"/>
 +
          <ref name="BoundingBox"/> <!-- may be empty, or may contain something of the form <![CDATA[-8.00051 -32.0 -0.0103784 1.0 8.01207 0.0 30.0 1.0]]>  I believe this is the two corners (min and max) of the bounding box. -->
 +
          <ref name="CollisionObject"/>
 +
          <ref name="Export"/>
 +
          <ref name="Node"/>
 +
          <ref name="NodeCrustHierarchy"/>
 +
          <ref name="NodeMesh"/>
 +
          <ref name="NodePointLight"/>
 +
          <ref name="NodeWeapontrail"/>
 +
          <ref name="Rotation"/>
 +
          <ref name="Translation"/>
 +
          <element name="Scale">
 +
            <data type="decimal"/>
 +
          </element>
 +
        </choice>
 +
      </zeroOrMore>
 +
      <choice>
 +
        <ref name="NodeAmbientLight"/>
 +
        <ref name="NodeUsePoint"/>
 +
        <zeroOrMore>
 +
          <ref name="NodeEmitter"/>
 +
        </zeroOrMore>
 +
      </choice>
 +
    </element>
 +
  </define>
 +
  <define name="Node">
 +
    <element name="Node">
 +
      <optional>
 +
        <attribute name="BoneIndex">
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <attribute name="Name">
 +
        <data type="NMTOKEN"/>
 +
      </attribute>
 +
      <optional>
 +
        <attribute name="SoundMaterialType">
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <zeroOrMore>
 +
        <choice>
 +
          <ref name="BoundingBox"/>
 +
          <ref name="CollisionObject"/>
 +
          <ref name="Export"/>
 +
          <ref name="Node"/>
 +
          <ref name="NodeCrustHierarchy"/>
 +
          <ref name="NodeEmitter"/>
 +
          <ref name="NodeEmitterGroup"/>
 +
          <ref name="NodeEmitterTarget"/>
 +
          <ref name="NodeLightProbe"/>
 +
          <ref name="NodeMesh"/>
 +
          <ref name="NodePointLight"/>
 +
          <ref name="NodeUsePoint"/>
 +
          <ref name="NodeWeapontrail"/>
 +
          <ref name="Rotation"/>
 +
          <ref name="Translation"/>
 +
          <element name="NodeCloth">
 +
            <attribute name="AttachmentResponseCoefficient">
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="AttachmentTearFactor">
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="BendingStiffness">
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="CF_BENDING">
 +
              <data type="integer"/>
 +
            </attribute>
 +
            <attribute name="CF_BENDING_ORTHO">
 +
              <data type="integer"/>
 +
            </attribute>
 +
            <attribute name="CF_COLLISION_TWOWAY">
 +
              <data type="integer"/>
 +
            </attribute>
 +
            <attribute name="CF_COMDAMPING">
 +
              <data type="integer"/>
 +
            </attribute>
 +
            <attribute name="CF_DAMPING">
 +
              <data type="integer"/>
 +
            </attribute>
 +
            <attribute name="CF_DISABLE_COLLISION">
 +
              <data type="integer"/>
 +
            </attribute>
 +
            <attribute name="CF_GRAVITY">
 +
              <data type="integer"/>
 +
            </attribute>
 +
            <attribute name="CF_HARDWARE">
 +
              <data type="integer"/>
 +
            </attribute>
 +
            <attribute name="CF_PRESSURE">
 +
              <data type="integer"/>
 +
            </attribute>
 +
            <attribute name="CF_SELFCOLLISION">
 +
              <data type="integer"/>
 +
            </attribute>
 +
            <attribute name="CF_STATIC">
 +
              <data type="integer"/>
 +
            </attribute>
 +
            <attribute name="CF_TEARABLE">
 +
              <data type="integer"/>
 +
            </attribute>
 +
            <attribute name="CF_VISUALIZATION">
 +
              <data type="integer"/>
 +
            </attribute>
 +
            <attribute name="CollisionResponseCoefficient">
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="DampingCoefficient">
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="Density">
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="Fadeable">
 +
              <data type="boolean"/>
 +
            </attribute>
 +
            <attribute name="Friction">
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="GROUP_MASK_NONWALKABLE">
 +
              <data type="boolean"/>
 +
            </attribute>
 +
            <optional>
 +
              <attribute name="GROUP_MASK_STATICGEOMETRY">
 +
                <data type="boolean"/>
 +
              </attribute>
 +
            </optional>
 +
            <attribute name="GustingDirectionAxisRatio"/> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
 +
            <attribute name="GustingDirectionChange"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="GustingMaxDuration"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="GustingMaxInterval"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="GustingMaxStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="GustingMinDuration"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="GustingMinInterval"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="GustingMinStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="ID">
 +
              <data type="NCName"/>
 +
            </attribute>
 +
            <attribute name="MaterialLibrary">
 +
              <data type="NCName"/>
 +
            </attribute>
 +
            <attribute name="MaterialObject">
 +
              <data type="NCName"/>
 +
            </attribute>
 +
            <attribute name="MeshGroupName">
 +
              <data type="NCName"/>
 +
            </attribute>
 +
            <attribute name="Name">
 +
              <data type="NCName"/>
 +
            </attribute>
 +
            <attribute name="Pressure">
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="SleepLinearVelocity">
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="SolverIterations">
 +
              <data type="integer"/>
 +
            </attribute>
 +
            <attribute name="SpeedTreeWindDirection">  <!-- removed, no longer supported by resource exporter. see bug 114919 -->
 +
              <data type="boolean"/>
 +
            </attribute>
 +
            <attribute name="SpeedTreeWindParams"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
 +
              <data type="boolean"/>
 +
            </attribute>
 +
            <attribute name="SpeedTreeWindStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
 +
              <data type="boolean"/>
 +
            </attribute>
 +
            <attribute name="SpeedTreeWindUpdateTime"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="StretchingStiffness">
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="TearFactor">
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="Thickness">
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="WakeUpCounter">
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="WindDirection"/> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
 +
            <attribute name="WindEnabled"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
 +
              <data type="boolean"/>
 +
            </attribute>
 +
            <attribute name="WindResponse"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="WindResponseLimit"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <attribute name="WindSpace"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
 +
              <data type="NCName"/>
 +
            </attribute>
 +
            <attribute name="WindStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
 +
              <data type="decimal"/>
 +
            </attribute>
 +
            <ref name="Attribute"/>
 +
            <zeroOrMore>
 +
              <ref name="Export"/>
 +
            </zeroOrMore>
 +
            <ref name="Translation"/>
 +
            <ref name="Rotation"/>
 +
            <element name="ClothAttachments">
 +
              <element name="ClothAttachment">
 +
                <attribute name="TearableAttachment">
 +
                  <data type="integer"/>
 +
                </attribute>
 +
                <attribute name="TwoWayAttachment">
 +
                  <data type="integer"/>
 +
                </attribute>
 +
                <attribute name="Type">
 +
                  <data type="NCName"/>
 +
                </attribute>
 +
              </element>
 +
            </element>
 +
            <element name="MeshGroup">
 +
              <attribute name="Name">
 +
                <data type="NCName"/>
 +
              </attribute>
 +
              <oneOrMore>
 +
                <ref name="Data"/>
 +
              </oneOrMore>
 +
            </element>
 +
          </element>
 +
          <element name="NodeSnaptoPoint">
 +
            <attribute name="Name">
 +
              <data type="NCName"/>
 +
            </attribute>
 +
            <zeroOrMore>
 +
              <ref name="Export"/>
 +
            </zeroOrMore>
 +
            <ref name="Translation"/>
 +
            <ref name="Rotation"/>
 +
          </element>
 +
        </choice>
 +
      </zeroOrMore>
 +
      <optional>
 +
        <ref name="NodeAmbientLight"/>
 +
      </optional>
 +
    </element>
 +
  </define>
 +
  <define name="MeshHierarchy"> <!-- MeshHierarchy is a deprecated synonym for "NodeMesh". Only 14 files still use it out of nearly 8000 in our internal sources. -->
 +
    <element name="MeshHierarchy">
 +
      <attribute name="Name">
 +
        <data type="NCName"/>
 +
      </attribute>
 +
      <optional>
 +
        <ref name="BoundingBox"/>
 +
        <oneOrMore>
 +
          <choice>
 +
            <ref name="MeshHierarchy"/>
 +
            <ref name="Rotation"/>
 +
            <ref name="Translation"/>
 +
          </choice>
 +
        </oneOrMore>
 +
      </optional>
 +
      <choice>
 +
        <ref name="NodeLightProbe"/>
 +
        <zeroOrMore>
 +
          <ref name="NodeEmitter"/>
 +
        </zeroOrMore>
 +
      </choice>
 +
    </element>
 +
  </define>
 +
  <define name="NodeCrustHierarchy">
 +
    <element name="NodeCrustHierarchy">
 +
      <attribute name="HookID">
 +
        <data type="integer"/>
 +
      </attribute>
 +
      <attribute name="Name">
 +
        <data type="NCName"/>
 +
      </attribute>
 +
      <zeroOrMore>
 +
        <ref name="Export"/>
 +
      </zeroOrMore>
 +
      <optional>
 +
        <ref name="Translation"/>
 +
        <ref name="Rotation"/>
 +
      </optional>
 +
      <zeroOrMore>
 +
        <choice>
 +
          <ref name="Node"/>
 +
          <ref name="NodeEmitter"/>
 +
          <ref name="NodeEmitterGroup"/>
 +
          <ref name="NodeEmitterTarget"/>
 +
          <ref name="NodePointLight"/>
 +
        </choice>
 +
      </zeroOrMore>
 +
      <optional>
 +
        <ref name="NodeMesh"/>
 +
      </optional>
 +
    </element>
 +
  </define>
 +
  <define name="Export">
 +
    <element name="Export">
 +
      <attribute name="ControllerType">
 +
        <data type="NCName"/>
 +
      </attribute>
 +
      <attribute name="ExportName">
 +
        <data type="NMTOKEN"/>
 +
      </attribute>
 +
      <optional>
 +
        <attribute name="MaterialColor"/> <!-- String with four values - RGBA -->
 +
      </optional>
 +
      <attribute name="TagName">
 +
        <data type="NCName"/>
 +
      </attribute>
 +
    </element>
 +
  </define>
 +
  <define name="BoundingBox">
 +
    <element name="BoundingBox"> <!-- Vector4f min, Vector4f max -->
 +
      <text/>
 +
    </element>
 +
  </define>
 +
  <define name="Translation">
 +
    <element name="Translation">
 +
      <optional>
 +
        <attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces -->
 +
      </optional>
 +
      <optional>
 +
        <attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces -->
 +
      </optional>
 +
      <text/>
 +
    </element>
 +
  </define>
 +
  <define name="Rotation">
 +
    <element name="Rotation"> <!-- Quaternionf -->
 +
      <text/>
 +
    </element>
 +
  </define>
 +
  <define name="CollisionObject">
 +
    <element name="CollisionObject">
 +
      <optional>
 +
        <attribute name="Kinematic">
 +
          <data type="boolean"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="Static">
 +
          <data type="boolean"/>
 +
        </attribute>
 +
      </optional>
 +
      <oneOrMore>
 +
        <element name="Shape">
 +
          <attribute name="AllowEmitterSpawn">
 +
            <data type="integer"/>
 +
          </attribute>
 +
          <optional>
 +
            <attribute name="DimX">
 +
              <data type="decimal"/>
 +
            </attribute>
 +
          </optional>
 +
          <optional>
 +
            <attribute name="DimY">
 +
              <data type="double"/>
 +
            </attribute>
 +
          </optional>
 +
          <optional>
 +
            <attribute name="DimZ">
 +
              <data type="decimal"/>
 +
            </attribute>
 +
          </optional>
 +
          <attribute name="Fadeable">
 +
            <data type="boolean"/>
 +
          </attribute>
 +
          <optional>
 +
            <attribute name="GROUP_MASK_CREATURES">
 +
              <data type="boolean"/>
 +
            </attribute>
 +
          </optional>
 +
          <optional>
 +
            <attribute name="GROUP_MASK_ITEMS">
 +
              <data type="boolean"/>
 +
            </attribute>
 +
          </optional>
 +
          <optional>
 +
            <attribute name="GROUP_MASK_NONWALKABLE">
 +
              <data type="boolean"/>
 +
            </attribute>
 +
          </optional>
 +
          <optional>
 +
            <attribute name="GROUP_MASK_PLACEABLES">
 +
              <data type="boolean"/>
 +
            </attribute>
 +
          </optional>
 +
          <optional>
 +
            <attribute name="GROUP_MASK_STATICGEOMETRY">
 +
              <data type="boolean"/>
 +
            </attribute>
 +
          </optional>
 +
          <optional>
 +
            <attribute name="GROUP_MASK_TERRAIN_WALL">
 +
              <data type="boolean"/>
 +
            </attribute>
 +
          </optional>
 +
          <optional>
 +
            <attribute name="GROUP_MASK_TRIGGERS">
 +
              <data type="boolean"/>
 +
            </attribute>
 +
          </optional>
 +
          <optional>
 +
            <attribute name="GROUP_MASK_WALKABLE">
 +
              <data type="boolean"/>
 +
            </attribute>
 +
          </optional>
 +
          <optional>
 +
            <attribute name="Height">
 +
              <data type="double"/>
 +
            </attribute>
 +
          </optional>
 +
          <attribute name="Name">
 +
            <data type="NCName"/>
 +
          </attribute>
 +
          <attribute name="Position"/> <!-- Vector4f -->
 +
          <optional>
 +
            <attribute name="Radius">
 +
              <data type="decimal"/>
 +
            </attribute>
 +
          </optional>
 +
          <attribute name="Rotation"/> <!-- Quaternionf -->
 +
          <attribute name="Type">
 +
            <data type="NCName"/>
 +
          </attribute>
 +
          <optional>
 +
            <element name="VertexData">
 +
              <attribute name="length">
 +
                <data type="integer"/>
 +
              </attribute>
 +
              <text/>
 +
            </element>
 +
            <element name="IndexData"> <!-- UINT16? don't know what this one's for, ask for clarification -->
 +
              <text/>
 +
            </element>
 +
          </optional>
 +
        </element>
 +
      </oneOrMore>
 +
    </element>
 +
  </define>
 +
  <define name="NodePointLight">
 +
    <element name="NodePointLight">
 +
      <optional>
 +
        <attribute name="AffectsDomain"> <!-- A search through the existing files has this as either "1" or "2", no other values. I don't know what these domains represent. -->
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <attribute name="Color"/> <!-- string of four numbers, separated by spaces. -->
 +
      <optional>
 +
        <attribute name="IntensityPeriod">
 +
          <data type="decimal"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="IntensityPeriodDelta">
 +
          <data type="decimal"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="IntensityVariation">
 +
          <data type="decimal"/>
 +
        </attribute>
 +
      </optional>
 +
      <attribute name="IsStatic">
 +
        <data type="integer"/>
 +
      </attribute>
 +
      <attribute name="Name">
 +
        <data type="NCName"/>
 +
      </attribute>
 +
      <attribute name="Radius">
 +
        <data type="decimal"/>
 +
      </attribute>
 +
      <optional>
 +
        <attribute name="UseVariationTint"> <!-- true/false, I believe -->
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <oneOrMore>
 +
        <choice>
 +
          <ref name="Export"/>
 +
          <ref name="Rotation"/>
 +
          <ref name="Translation"/>
 +
        </choice>
 +
      </oneOrMore>
 +
    </element>
 +
  </define>
 +
  <define name="NodeWeapontrail">
 +
    <element name="NodeWeapontrail">
 +
      <attribute name="Duration">
 +
        <data type="decimal"/>
 +
      </attribute>
 +
      <attribute name="MaterialObject"> <!-- All appear to be in either weapontrail_streaks or weapontrail_arrow -->
 +
        <data type="NCName"/>
 +
      </attribute>
 +
      <attribute name="Name">
 +
        <data type="NCName"/>
 +
      </attribute>
 +
      <attribute name="SegmentLength">
 +
        <data type="decimal"/>
 +
      </attribute>
 +
      <ref name="Translation"/>
 +
      <ref name="Rotation"/>
 +
    </element>
 +
  </define>
 +
  <define name="Attribute">
 +
    <element name="Attribute">
 +
      <attribute name="AttributeName"> <!-- This attribute's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files) -->
 +
        <data type="NCName"/>
 +
      </attribute>
 +
      <attribute name="SourceName">
 +
        <data type="NCName"/> <!-- This attribute's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files)-->
 +
      </attribute>
 +
    </element>
 +
  </define>
 +
  <define name="NodeUsePoint">
 +
    <element name="NodeUsePoint">
 +
      <attribute name="Name"> <!-- All seem to be of the form "UserPoint##", where ## is a zero-padded low number  (highest I've seen is 14) -->
 +
        <data type="NCName"/>
 +
      </attribute>
 +
      <attribute name="Type"> <!-- "Front", "Back", "Right", "Left" are options. Most items seem to get by with just nodeusepoints of front and back, a few have all four types of nodeusepoint. -->
 +
        <data type="NCName"/>
 +
      </attribute>
 +
      <zeroOrMore>
 +
        <ref name="Export"/>
 +
      </zeroOrMore>
 +
      <ref name="Translation"/>
 +
      <ref name="Rotation"/>
 +
      <optional>
 +
        <ref name="NodeCrustHierarchy"/>
 +
      </optional>
 +
    </element>
 +
  </define>
 +
  <define name="NodeAmbientLight">
 +
    <element name="NodeAmbientLight"> <!-- Only 5 files had one of these; lightrig_day01.mmh.xml, lightrig_int01.mmh.xml, lightrig_night01.mmh.xml, tools_ambient.mmh.xml, and tools_bulb_ambient.mmh.xml. -->
 +
      <attribute name="Color"/> <!-- string of four numbers, separated by spaces. "0.0705882 0.0862745 0.0980392 1.0" for the three lightrigs, "0.498039 0.498039 0.498039 1.0" for the two tools -->
 +
      <attribute name="Name"><!-- "BWDA_OmniLight04" for the three lightrigs, "BWDA_OmniLight01" for the two tools. -->
 +
        <data type="NCName"/>
 +
      </attribute>
 +
      <attribute name="Radius"> <!-- 5.0 for the three lightrigs, "1e+007" for the two tools -->
 +
        <data type="double"/>
 +
      </attribute>
 +
      <zeroOrMore>
 +
        <ref name="Export"/>
 +
      </zeroOrMore>
 +
      <ref name="Translation"/>
 +
      <ref name="Rotation"/>
 +
    </element>
 +
  </define>
 +
  <define name="NodeEmitter">
 +
    <element name="NodeEmitter">
 +
      <attribute name="Acceleration">
 +
        <data type="decimal"/>
 +
      </attribute>
 +
      <optional>
 +
        <attribute name="AgeMapColorMultiplier"/> <!-- string of four numbers, separated by spaces. -->
 +
      </optional>
 +
      <optional>
 +
        <attribute name="AgeMapScaleXMultiplier">
 +
          <data type="decimal"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="AgeMapScaleYMultiplier">
 +
          <data type="decimal"/>
 +
        </attribute>
 +
      </optional>
 +
      <attribute name="Birthrate">
 +
        <data type="decimal"/>
 +
      </attribute>
 +
      <attribute name="BirthrateInParticlesPerMeter">
 +
        <data type="integer"/>
 +
      </attribute>
 +
      <attribute name="BirthrateRange">
 +
        <data type="decimal"/>
 +
      </attribute>
 +
      <optional>
 +
        <attribute name="Bounciness">
 +
          <data type="decimal"/>
 +
        </attribute>
 +
      </optional>
 +
      <attribute name="EmitterType">
 +
        <data type="NCName"/>
 +
      </attribute>
 +
      <attribute name="EnableParticleCollisions">
 +
        <data type="integer"/>
 +
      </attribute>
 +
      <optional>
 +
        <attribute name="FlipbookColumns">
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="FlipbookRows">
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="FlipbookType"/> <!-- UINT8 nFlipbookType = FLIPBOOKTYPE_NONE = 0;  if (a_sFlipbookType.CompareNoCase(L"ContactSheet")) nFlipbookType = FLIPBOOKTYPE_CONTACT_SHEET = 1; if (a_sFlipbookType.CompareNoCase(L"Volume")) nFlipbookType = FLIPBOOKTYPE_VOLUME = 2;-->
 +
      </optional>
 +
      <optional>
 +
        <attribute name="FramesPerSecond">
 +
          <data type="decimal"/>
 +
        </attribute>
 +
      </optional>
 +
      <attribute name="GravityMultiplier">
 +
        <data type="decimal"/>
 +
      </attribute>
 +
      <attribute name="InheritVelocityInsteadOfPosition">
 +
        <data type="integer"/>
 +
      </attribute>
 +
      <optional>
 +
        <attribute name="InitialRotation">
 +
          <data type="decimal"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="InitialRotationRange">
 +
          <data type="decimal"/>
 +
        </attribute>
 +
      </optional>
 +
      <attribute name="InitialRotationSpeed">
 +
        <data type="decimal"/>
 +
      </attribute>
 +
      <attribute name="InitialRotationSpeedRange">
 +
        <data type="decimal"/>
 +
      </attribute>
 +
      <attribute name="InitialSpeed">
 +
        <data type="decimal"/>
 +
      </attribute>
 +
      <attribute name="InitialSpeedRange">
 +
        <data type="decimal"/>
 +
      </attribute>
 +
      <optional>
 +
        <attribute name="InvMovementSpreadUpdateDelay">
 +
          <data type="decimal"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="KillParticleWhenTargetHit">
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="LOD">
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <attribute name="Life">
 +
        <data type="decimal"/>
 +
      </attribute>
 +
      <optional>
 +
        <attribute name="LifeRange">
 +
          <data type="decimal"/>
 +
        </attribute>
 +
      </optional>
 +
      <attribute name="LinkParticlesTogether">
 +
        <data type="integer"/>
 +
      </attribute>
 +
      <attribute name="MaterialLibrary">
 +
        <data type="NCName"/>
 +
      </attribute>
 +
      <attribute name="MaterialObject">
 +
        <data type="NMTOKEN"/>
 +
      </attribute>
 +
      <optional>
 +
        <attribute name="MeshParticleModel">
 +
          <data type="NMTOKEN"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces -->
 +
      </optional>
 +
      <optional>
 +
        <attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces -->
 +
      </optional>
 +
      <attribute name="MovementSpread"/> <!-- Two floating point values, representing movementspread X and movementspread Y -->
 +
      <optional>
 +
        <attribute name="MovementSpreadUpdateDelay">
 +
          <data type="decimal"/>
 +
        </attribute>
 +
      </optional>
 +
      <attribute name="Name">
 +
        <data type="NMTOKEN"/>
 +
      </attribute>
 +
      <optional>
 +
        <attribute name="ObjectSpaceAcceleration">
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <attribute name="OrientationBehaviour">
 +
        <data type="NCName"/>
 +
      </attribute>
 +
      <attribute name="ParticleInheritance">
 +
        <data type="NCName"/>
 +
      </attribute>
 +
      <attribute name="ParticlesAffectedByWind">
 +
        <data type="integer"/>
 +
      </attribute>
 +
      <attribute name="ParticlesFollowPath">
 +
        <data type="integer"/>
 +
      </attribute>
 +
      <optional>
 +
        <attribute name="PhysicsEmitter">
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="PhysicsObjectSpawn">
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="RandomInitialRotation">
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="RandomStartFrame">
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <attribute name="RotationalAcceleration">
 +
        <data type="decimal"/>
 +
      </attribute>
 +
      <attribute name="ScaleRange">
 +
        <data type="decimal"/>
 +
      </attribute>
 +
      <optional>
 +
        <attribute name="SpawnDirectionTracksTarget">
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <attribute name="SpawnSpread"/> <!-- Two floating point values, representing spawnspread X and spawnspread Y -->
 +
      <optional>
 +
        <attribute name="SplatEmitter">
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="TargetAttraction">
 +
          <data type="decimal"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="TargetName">
 +
          <data type="NMTOKEN"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="TargetRadius">
 +
          <data type="decimal"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="UVDistributionSize">
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <attribute name="UpdateOnlyWhenVisible">
 +
        <data type="integer"/>
 +
      </attribute>
 +
      <optional>
 +
        <attribute name="UseVariationTint">
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="UserParamName"/> <!-- ECString, not sure if there's any special formatting here -->
 +
      </optional>
 +
      <optional>
 +
        <attribute name="VertexFormat">
 +
          <data type="NCName"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="WorldAxisAcceleration"/> <!-- Three numbers separated by spaces -->
 +
      </optional>
 +
      <oneOrMore>
 +
        <choice>
 +
          <ref name="Export"/>
 +
          <ref name="Rotation"/>
 +
          <ref name="Translation"/>
 +
          <element name="EmitterAttachments">
 +
            <optional>
 +
              <attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces -->
 +
            </optional>
 +
            <optional>
 +
              <attribute name="MeshParticleUpAxis"/>  <!-- Three numbers separated by spaces -->
 +
            </optional>
 +
            <element name="EmitterAttachment">
 +
              <optional>
 +
                <attribute name="Name">
 +
                  <data type="NCName"/>
 +
                </attribute>
 +
              </optional>
 +
              <optional>
 +
                <attribute name="SpawnOnSurface">
 +
                  <data type="integer"/>
 +
                </attribute>
 +
              </optional>
 +
              <attribute name="Type">
 +
                <data type="NCName"/>
 +
              </attribute>
 +
              <optional>
 +
                <attribute name="UseNormalForVelocity">
 +
                  <data type="integer"/>
 +
                </attribute>
 +
              </optional>
 +
            </element>
 +
          </element>
 +
          <element name="SpawnVolume">
 +
            <optional>
 +
              <attribute name="Axis"/>
 +
            </optional>
 +
            <attribute name="InvertSpawnVolumeNormals">
 +
              <data type="integer"/>
 +
            </attribute>
 +
            <optional>
 +
              <attribute name="Length">
 +
                <data type="decimal"/>
 +
              </attribute>
 +
            </optional>
 +
            <optional>
 +
              <attribute name="MaxCorner"/>  <!-- Three numbers separated by spaces -->
 +
            </optional>
 +
            <optional>
 +
              <attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces -->
 +
            </optional>
 +
            <optional>
 +
              <attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces -->
 +
            </optional>
 +
            <optional>
 +
              <attribute name="MinCorner"/> <!-- Three numbers separated by spaces -->
 +
            </optional>
 +
            <optional>
 +
              <attribute name="Radius">
 +
                <data type="decimal"/>
 +
              </attribute>
 +
            </optional>
 +
            <optional>
 +
              <attribute name="SpawnVolumeType">
 +
                <data type="NCName"/>
 +
              </attribute>
 +
            </optional>
 +
            <attribute name="SpawnWithinVolume">
 +
              <data type="integer"/>
 +
            </attribute>
 +
            <optional>
 +
              <attribute name="UseVolumeNormalsForDirection">
 +
                <data type="integer"/>
 +
              </attribute>
 +
            </optional>
 +
            <zeroOrMore>
 +
              <ref name="Data"/>
 +
            </zeroOrMore>
 +
          </element>
 +
        </choice>
 +
      </oneOrMore>
 +
      <optional>
 +
        <element name="SplatParticle">
 +
          <optional>
 +
            <attribute name="AgeMapColorMultiplier"/> <!-- four numbers separated by spaces -->
 +
          </optional>
 +
          <optional>
 +
            <attribute name="FlipbookColumns">
 +
              <data type="integer"/>
 +
            </attribute>
 +
          </optional>
 +
          <optional>
 +
            <attribute name="FlipbookRows">
 +
              <data type="integer"/>
 +
            </attribute>
 +
          </optional>
 +
          <optional>
 +
            <attribute name="FlipbookType">
 +
              <data type="NCName"/>
 +
            </attribute>
 +
          </optional>
 +
          <optional>
 +
            <attribute name="FramesPerSecond">
 +
              <data type="integer"/>
 +
            </attribute>
 +
          </optional>
 +
          <attribute name="Height">
 +
            <data type="decimal"/>
 +
          </attribute>
 +
          <optional>
 +
            <attribute name="HoldLastFrame">
 +
              <data type="integer"/>
 +
            </attribute>
 +
          </optional>
 +
          <attribute name="Lifespan">
 +
            <data type="integer"/>
 +
          </attribute>
 +
          <attribute name="MaterialObject">
 +
            <data type="NCName"/>
 +
          </attribute>
 +
          <attribute name="NumSamplesH">
 +
            <data type="integer"/>
 +
          </attribute>
 +
          <attribute name="NumSamplesW">
 +
            <data type="integer"/>
 +
          </attribute>
 +
          <attribute name="OrientationRangeRadians">
 +
            <data type="integer"/>
 +
          </attribute>
 +
          <optional>
 +
            <attribute name="RandomStartFrame">
 +
              <data type="integer"/>
 +
            </attribute>
 +
          </optional>
 +
          <attribute name="Width">
 +
            <data type="decimal"/>
 +
          </attribute>
 +
          <optional>
 +
            <ref name="Export"/>
 +
          </optional>
 +
          <ref name="AgeMap"/>
 +
        </element>
 +
      </optional>
 +
      <ref name="AgeMap"/>
 +
    </element>
 +
  </define>
 +
  <define name="Data">
 +
    <element name="Data">
 +
      <optional>
 +
        <attribute name="ElementCount">
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="IndexCount">
 +
          <data type="integer"/>
 +
        </attribute>
 +
      </optional>
 +
      <optional>
 +
        <attribute name="IndexType">
 +
          <data type="NCName"/>
 +
        </attribute>
 +
      </optional>
 +
      <attribute name="Semantic">
 +
        <data type="NCName"/>
 +
      </attribute>
 +
      <optional>
 +
        <attribute name="Type">
 +
          <data type="NCName"/>
 +
        </attribute>
 +
      </optional>
 +
      <text/>
 +
    </element>
 +
  </define>
 +
  <define name="NodeEmitterGroup">
 +
    <element name="NodeEmitterGroup">
 +
      <attribute name="MaterialObject">
 +
        <data type="NCName"/>
 +
      </attribute>
 +
      <attribute name="Name">
 +
        <data type="NMTOKEN"/>
 +
      </attribute>
 +
      <ref name="Translation"/>
 +
      <ref name="Rotation"/>
 +
      <zeroOrMore>
 +
        <ref name="NodeEmitter"/>
 +
      </zeroOrMore>
 +
    </element>
 +
  </define>
 +
  <define name="NodeEmitterTarget">
 +
    <element name="NodeEmitterTarget">
 +
      <attribute name="Name">
 +
        <data type="NCName"/>
 +
      </attribute>
 +
      <ref name="Translation"/>
 +
      <ref name="Rotation"/>
 +
      <zeroOrMore>
 +
        <ref name="Export"/>
 +
      </zeroOrMore>
 +
    </element>
 +
  </define>
 +
  <define name="NodeLightProbe">
 +
    <element name="NodeLightProbe">
 +
      <attribute name="Name">
 +
        <data type="NCName"/>
 +
      </attribute>
 +
      <ref name="Translation"/>
 +
      <ref name="Rotation"/>
 +
      <optional>
 +
        <element name="ReflectionMap">
 +
          <attribute name="ResName">
 +
            <data type="NCName"/>
 +
          </attribute>
 +
        </element>
 +
        <element name="IrradianceMap">
 +
          <attribute name="ResName">
 +
            <data type="NCName"/>
 +
          </attribute>
 +
        </element>
 +
      </optional>
 +
    </element>
 +
  </define>
 +
  <define name="AgeMap">
 +
    <element name="AgeMap">
 +
      <attribute name="Count">
 +
        <data type="integer"/>
 +
      </attribute>
 +
      <oneOrMore>
 +
        <element name="AgeMapElement">
 +
          <attribute name="Alpha">
 +
            <data type="decimal"/>
 +
          </attribute>
 +
          <attribute name="Color"/>
 +
          <attribute name="PercentLifeElapsed">
 +
            <data type="decimal"/>
 +
          </attribute>
 +
          <optional>
 +
            <attribute name="RotationSpeedMultiplier">
 +
              <data type="decimal"/>
 +
            </attribute>
 +
          </optional>
 +
          <attribute name="XScale">
 +
            <data type="decimal"/>
 +
          </attribute>
 +
          <attribute name="YScale">
 +
            <data type="decimal"/>
 +
          </attribute>
 +
        </element>
 +
      </oneOrMore>
 +
    </element>
 +
  </define>
 +
</grammar>
 +
</pre>
  
 
[[Category:File types]]
 
[[Category:File types]]

Revision as of 21:23, 21 September 2009

MMH ("Model Mesh Heirarchy") files are used to describe a wide variety of physical objects that appear in Dragon Age levels. It includes props, visual effects, creature models, weapon models, and so forth.

MMH files are defined by XML files named with the .mmh.xml extension. BioWare generated these XML files using 3DSMax plugins that have some legal encumberances preventing their distribution, but the specifications for .mmh.xml will be released and it is hoped that converters will be able to be written for other file formats.

The XML file is then run through the GraphicsProcessorMMH.exe program (found in the Dragon Age\Toolset\export_processors directory) to produce a binary file that is used by the game. The game can actually use the XML file directly, but this has poor performance (it runs it through GraphicsProcessorMMH every time the object is loaded) and should only be used for testing purposes.

GraphicsProcessorMMH [-outdir <out-dir>] [-platform <x360,pc,ps3>] [options] [-indir<input-directory> / <input-file>]

Other options include:

-byteswapgff[Undocumented]

This is the command line you'll typically need:

GraphicsProcessorMMH -outdir %ls -platform pc %ls.mmh.xml

MMH files reference MSH (mesh) files to define the actual triangles and vertexes used in models.

mmh.xml schema

Joint types:

  • Cylindrical
  • 6DOF
  • Distance
  • Fixed
  • PointInPlane
  • PointOnLine
  • Prismatic
  • Pulley
  • Revolute
  • Spherical

See [1] for information on the RELAX NG 1.0 XML schema format.

<?xml version="1.0" encoding="UTF-8"?>
<grammar ns="" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <start>
    <element name="ModelHierarchy">
      <optional>
        <attribute name="FXActorName">
          <data type="NCName"/> <!-- An FXA file name -->
        </attribute>
      </optional>
      <attribute name="ModelDataName">
        <data type="NCName"/> <!-- an MSH file name -->
      </attribute>
      <attribute name="Name">
        <data type="NCName"/> <!-- An MMH file name -->
      </attribute>
      <optional>
        <attribute name="PreSimulateTime">
          <data type="decimal"/> <!-- emitter presimulation time -->
        </attribute>
      </optional>
      <optional>
        <attribute name="ReferencedMeshes"/> <!-- List of names of referenced meshes. Most of the files I see this in have an empty string here, but some have one or more .msh files named with spaces separating them. For example: ReferencedMeshes="fx_l_plane.msh fx_l_plane.msh". Every file with ReferencedMeshes defined was exported by the VFX editor so this is a VFX thing.-->
      </optional>
      <optional>
        <attribute name="RemoteMaterialAlpha">
          <data type="decimal"/> <!-- if UseRemoteMaterial is true -->
        </attribute>
      </optional>
      <optional>
        <attribute name="RemoteMaterialDecalName">
          <data type="NCName"/> <!-- if UseRemoteMaterial is true -->
        </attribute>
      </optional>
      <optional>
        <attribute name="RemoteMaterialFresnelFalloff">
          <data type="decimal"/>  <!-- if UseRemoteMaterial is true -->
        </attribute>
      </optional>
      <optional>
        <attribute name="RemoteMaterialInvertFresnel">
          <data type="integer"/>  <!-- if UseRemoteMaterial is true. A true/false value -->
        </attribute>
      </optional>
      <optional>
        <attribute name="RemoteMaterialTintColor"/> <!-- if UseRemoteMaterial is true. Four numbers separated by spaces -->
      </optional>
      <optional>
        <attribute name="UseRemoteMaterial">
          <data type="integer"/> <!-- a true/false value -->
        </attribute>
      </optional>
      <choice>
        <ref name="MeshHierarchy"/> <!-- MeshHierarchy is a deprecated synonym for "NodeMesh". -->
        <ref name="Node"/>
        <ref name="NodeMesh"/>
      </choice>
    </element>
  </start>
  <define name="NodeMesh">
    <element name="NodeMesh">
      <optional>
        <attribute name="BonesUsed"/> <!-- list of integers. Bodies have a lot of bones listed, other body parts have fewer. Boots, armor, gloves, helmets, hair, eyes, etc. all have bonesused. -->
      </optional>
      <optional>
        <attribute name="CastBakedShadow"> <!-- appears to be a true/false value -->
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="CastRuntimeShadow">  <!-- appears to be a true/false value -->
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="CutAway"> <!-- appears to be a true/false value -->
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="ID">
          <data type="NCName"/> <!-- A short string that always seems to be "_" followed by two or three random-looking numbers and letters -->
        </attribute>
      </optional>
      <optional>
        <attribute name="IsVFXMesh"> <!-- if this mesh is categorized as a VFX Mesh, load in the MaterialColor parameter -->
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="MaterialColor"/> <!-- String with four values - RGBA -->
      </optional>
      <optional>
        <attribute name="MaterialLibrary"> <!-- Strings like "CAI_Floor03.mao" and "CavesInterior.mal" - mao and mal are material editor file types -->
          <data type="NCName"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="MaterialObject"> <!-- Some boots had things like "pn_boo_hvyd_l3" here, a piece of corridor named fca_corridor01_0 had separate nodemeshes with both "fca_master" and "BLK_Master". I think this is referring to material libraries create by the material editor -->
          <data type="NMTOKEN"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="MeshGroupName"> <!-- A lot of very generic-sounding names like "Box23" and "Object9331", mixed with a few more meaningful names like "MshMain_CAV_CaiPlatform03_0" -->
          <data type="NCName"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="MeshName"> <!-- the mesh file that the meshchunk is in. if this isn't set, it will default to the first mesh in the model (for backwards compatibility) -->
          <data type="NCName"/>
        </attribute>
      </optional>
      <attribute name="Name">
        <data type="NCName"/>
      </attribute>
      <optional>
        <attribute name="PunchThrough"> <!-- appears to be a true/false value -->
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="ReceiveBakedShadow"> <!-- appears to be a true/false value -->
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="ReceiveRuntimeShadow"> <!-- appears to be a true/false value -->
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="ReceiveShadow"> <!-- I didn't find this referenced in the source code - deprecated, perhaps? -->
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="ShadowCasting"> <!-- used to set GFF_MMH_MESH_CAST_RUNTIME_SHADOW in the source code, same as CastRuntimeShadow above - synonyms? -->
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="UseVariationTint">
          <data type="integer"/>
        </attribute>
      </optional>
      <zeroOrMore>
        <choice>
          <ref name="Attribute"/>
          <ref name="BoundingBox"/> <!-- may be empty, or may contain something of the form <![CDATA[-8.00051 -32.0 -0.0103784 1.0 8.01207 0.0 30.0 1.0]]>  I believe this is the two corners (min and max) of the bounding box. -->
          <ref name="CollisionObject"/>
          <ref name="Export"/>
          <ref name="Node"/>
          <ref name="NodeCrustHierarchy"/>
          <ref name="NodeMesh"/>
          <ref name="NodePointLight"/>
          <ref name="NodeWeapontrail"/>
          <ref name="Rotation"/>
          <ref name="Translation"/>
          <element name="Scale">
            <data type="decimal"/>
          </element>
        </choice>
      </zeroOrMore>
      <choice>
        <ref name="NodeAmbientLight"/>
        <ref name="NodeUsePoint"/>
        <zeroOrMore>
          <ref name="NodeEmitter"/>
        </zeroOrMore>
      </choice>
    </element>
  </define>
  <define name="Node">
    <element name="Node">
      <optional>
        <attribute name="BoneIndex">
          <data type="integer"/>
        </attribute>
      </optional>
      <attribute name="Name">
        <data type="NMTOKEN"/>
      </attribute>
      <optional>
        <attribute name="SoundMaterialType">
          <data type="integer"/>
        </attribute>
      </optional>
      <zeroOrMore>
        <choice>
          <ref name="BoundingBox"/>
          <ref name="CollisionObject"/>
          <ref name="Export"/>
          <ref name="Node"/>
          <ref name="NodeCrustHierarchy"/>
          <ref name="NodeEmitter"/>
          <ref name="NodeEmitterGroup"/>
          <ref name="NodeEmitterTarget"/>
          <ref name="NodeLightProbe"/>
          <ref name="NodeMesh"/>
          <ref name="NodePointLight"/>
          <ref name="NodeUsePoint"/>
          <ref name="NodeWeapontrail"/>
          <ref name="Rotation"/>
          <ref name="Translation"/>
          <element name="NodeCloth">
            <attribute name="AttachmentResponseCoefficient">
              <data type="decimal"/>
            </attribute>
            <attribute name="AttachmentTearFactor">
              <data type="decimal"/>
            </attribute>
            <attribute name="BendingStiffness">
              <data type="decimal"/>
            </attribute>
            <attribute name="CF_BENDING">
              <data type="integer"/>
            </attribute>
            <attribute name="CF_BENDING_ORTHO">
              <data type="integer"/>
            </attribute>
            <attribute name="CF_COLLISION_TWOWAY">
              <data type="integer"/>
            </attribute>
            <attribute name="CF_COMDAMPING">
              <data type="integer"/>
            </attribute>
            <attribute name="CF_DAMPING">
              <data type="integer"/>
            </attribute>
            <attribute name="CF_DISABLE_COLLISION">
              <data type="integer"/>
            </attribute>
            <attribute name="CF_GRAVITY">
              <data type="integer"/>
            </attribute>
            <attribute name="CF_HARDWARE">
              <data type="integer"/>
            </attribute>
            <attribute name="CF_PRESSURE">
              <data type="integer"/>
            </attribute>
            <attribute name="CF_SELFCOLLISION">
              <data type="integer"/>
            </attribute>
            <attribute name="CF_STATIC">
              <data type="integer"/>
            </attribute>
            <attribute name="CF_TEARABLE">
              <data type="integer"/>
            </attribute>
            <attribute name="CF_VISUALIZATION">
              <data type="integer"/>
            </attribute>
            <attribute name="CollisionResponseCoefficient">
              <data type="decimal"/>
            </attribute>
            <attribute name="DampingCoefficient">
              <data type="decimal"/>
            </attribute>
            <attribute name="Density">
              <data type="decimal"/>
            </attribute>
            <attribute name="Fadeable">
              <data type="boolean"/>
            </attribute>
            <attribute name="Friction">
              <data type="decimal"/>
            </attribute>
            <attribute name="GROUP_MASK_NONWALKABLE">
              <data type="boolean"/>
            </attribute>
            <optional>
              <attribute name="GROUP_MASK_STATICGEOMETRY">
                <data type="boolean"/>
              </attribute>
            </optional>
            <attribute name="GustingDirectionAxisRatio"/> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
            <attribute name="GustingDirectionChange"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
              <data type="decimal"/>
            </attribute>
            <attribute name="GustingMaxDuration"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
              <data type="decimal"/>
            </attribute>
            <attribute name="GustingMaxInterval"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
              <data type="decimal"/>
            </attribute>
            <attribute name="GustingMaxStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
              <data type="decimal"/>
            </attribute>
            <attribute name="GustingMinDuration"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
              <data type="decimal"/>
            </attribute>
            <attribute name="GustingMinInterval"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
              <data type="decimal"/>
            </attribute>
            <attribute name="GustingMinStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
              <data type="decimal"/>
            </attribute>
            <attribute name="ID">
              <data type="NCName"/>
            </attribute>
            <attribute name="MaterialLibrary">
              <data type="NCName"/>
            </attribute>
            <attribute name="MaterialObject">
              <data type="NCName"/>
            </attribute>
            <attribute name="MeshGroupName">
              <data type="NCName"/>
            </attribute>
            <attribute name="Name">
              <data type="NCName"/>
            </attribute>
            <attribute name="Pressure">
              <data type="decimal"/>
            </attribute>
            <attribute name="SleepLinearVelocity">
              <data type="decimal"/>
            </attribute>
            <attribute name="SolverIterations">
              <data type="integer"/>
            </attribute>
            <attribute name="SpeedTreeWindDirection">  <!-- removed, no longer supported by resource exporter. see bug 114919 -->
              <data type="boolean"/>
            </attribute>
            <attribute name="SpeedTreeWindParams"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
              <data type="boolean"/>
            </attribute>
            <attribute name="SpeedTreeWindStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
              <data type="boolean"/>
            </attribute>
            <attribute name="SpeedTreeWindUpdateTime"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
              <data type="decimal"/>
            </attribute>
            <attribute name="StretchingStiffness">
              <data type="decimal"/>
            </attribute>
            <attribute name="TearFactor">
              <data type="decimal"/>
            </attribute>
            <attribute name="Thickness">
              <data type="decimal"/>
            </attribute>
            <attribute name="WakeUpCounter">
              <data type="decimal"/>
            </attribute>
            <attribute name="WindDirection"/> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
            <attribute name="WindEnabled"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
              <data type="boolean"/>
            </attribute>
            <attribute name="WindResponse"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
              <data type="decimal"/>
            </attribute>
            <attribute name="WindResponseLimit"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
              <data type="decimal"/>
            </attribute>
            <attribute name="WindSpace"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
              <data type="NCName"/>
            </attribute>
            <attribute name="WindStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 -->
              <data type="decimal"/>
            </attribute>
            <ref name="Attribute"/>
            <zeroOrMore>
              <ref name="Export"/>
            </zeroOrMore>
            <ref name="Translation"/>
            <ref name="Rotation"/>
            <element name="ClothAttachments">
              <element name="ClothAttachment">
                <attribute name="TearableAttachment">
                  <data type="integer"/>
                </attribute>
                <attribute name="TwoWayAttachment">
                  <data type="integer"/>
                </attribute>
                <attribute name="Type">
                  <data type="NCName"/>
                </attribute>
              </element>
            </element>
            <element name="MeshGroup">
              <attribute name="Name">
                <data type="NCName"/>
              </attribute>
              <oneOrMore>
                <ref name="Data"/>
              </oneOrMore>
            </element>
          </element>
          <element name="NodeSnaptoPoint">
            <attribute name="Name">
              <data type="NCName"/>
            </attribute>
            <zeroOrMore>
              <ref name="Export"/>
            </zeroOrMore>
            <ref name="Translation"/>
            <ref name="Rotation"/>
          </element>
        </choice>
      </zeroOrMore>
      <optional>
        <ref name="NodeAmbientLight"/>
      </optional>
    </element>
  </define>
  <define name="MeshHierarchy"> <!-- MeshHierarchy is a deprecated synonym for "NodeMesh". Only 14 files still use it out of nearly 8000 in our internal sources. -->
    <element name="MeshHierarchy">
      <attribute name="Name">
        <data type="NCName"/>
      </attribute>
      <optional>
        <ref name="BoundingBox"/>
        <oneOrMore>
          <choice>
            <ref name="MeshHierarchy"/>
            <ref name="Rotation"/>
            <ref name="Translation"/>
          </choice>
        </oneOrMore>
      </optional>
      <choice>
        <ref name="NodeLightProbe"/>
        <zeroOrMore>
          <ref name="NodeEmitter"/>
        </zeroOrMore>
      </choice>
    </element>
  </define>
  <define name="NodeCrustHierarchy">
    <element name="NodeCrustHierarchy">
      <attribute name="HookID">
        <data type="integer"/>
      </attribute>
      <attribute name="Name">
        <data type="NCName"/>
      </attribute>
      <zeroOrMore>
        <ref name="Export"/>
      </zeroOrMore>
      <optional>
        <ref name="Translation"/>
        <ref name="Rotation"/>
      </optional>
      <zeroOrMore>
        <choice>
          <ref name="Node"/>
          <ref name="NodeEmitter"/>
          <ref name="NodeEmitterGroup"/>
          <ref name="NodeEmitterTarget"/>
          <ref name="NodePointLight"/>
        </choice>
      </zeroOrMore>
      <optional>
        <ref name="NodeMesh"/>
      </optional>
    </element>
  </define>
  <define name="Export">
    <element name="Export">
      <attribute name="ControllerType">
        <data type="NCName"/>
      </attribute>
      <attribute name="ExportName">
        <data type="NMTOKEN"/>
      </attribute>
      <optional>
        <attribute name="MaterialColor"/> <!-- String with four values - RGBA -->
      </optional>
      <attribute name="TagName">
        <data type="NCName"/>
      </attribute>
    </element>
  </define>
  <define name="BoundingBox">
    <element name="BoundingBox"> <!-- Vector4f min, Vector4f max -->
      <text/>
    </element>
  </define>
  <define name="Translation">
    <element name="Translation">
      <optional>
        <attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces -->
      </optional>
      <optional>
        <attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces -->
      </optional>
      <text/>
    </element>
  </define>
  <define name="Rotation">
    <element name="Rotation"> <!-- Quaternionf -->
      <text/>
    </element>
  </define>
  <define name="CollisionObject">
    <element name="CollisionObject">
      <optional>
        <attribute name="Kinematic">
          <data type="boolean"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="Static">
          <data type="boolean"/>
        </attribute>
      </optional>
      <oneOrMore>
        <element name="Shape">
          <attribute name="AllowEmitterSpawn">
            <data type="integer"/>
          </attribute>
          <optional>
            <attribute name="DimX">
              <data type="decimal"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="DimY">
              <data type="double"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="DimZ">
              <data type="decimal"/>
            </attribute>
          </optional>
          <attribute name="Fadeable">
            <data type="boolean"/>
          </attribute>
          <optional>
            <attribute name="GROUP_MASK_CREATURES">
              <data type="boolean"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="GROUP_MASK_ITEMS">
              <data type="boolean"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="GROUP_MASK_NONWALKABLE">
              <data type="boolean"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="GROUP_MASK_PLACEABLES">
              <data type="boolean"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="GROUP_MASK_STATICGEOMETRY">
              <data type="boolean"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="GROUP_MASK_TERRAIN_WALL">
              <data type="boolean"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="GROUP_MASK_TRIGGERS">
              <data type="boolean"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="GROUP_MASK_WALKABLE">
              <data type="boolean"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="Height">
              <data type="double"/>
            </attribute>
          </optional>
          <attribute name="Name">
            <data type="NCName"/>
          </attribute>
          <attribute name="Position"/> <!-- Vector4f -->
          <optional>
            <attribute name="Radius">
              <data type="decimal"/>
            </attribute>
          </optional>
          <attribute name="Rotation"/> <!-- Quaternionf -->
          <attribute name="Type">
            <data type="NCName"/>
          </attribute>
          <optional>
            <element name="VertexData">
              <attribute name="length">
                <data type="integer"/>
              </attribute>
              <text/>
            </element>
            <element name="IndexData"> <!-- UINT16? don't know what this one's for, ask for clarification -->
              <text/>
            </element>
          </optional>
        </element>
      </oneOrMore>
    </element>
  </define>
  <define name="NodePointLight">
    <element name="NodePointLight">
      <optional>
        <attribute name="AffectsDomain"> <!-- A search through the existing files has this as either "1" or "2", no other values. I don't know what these domains represent. -->
          <data type="integer"/>
        </attribute>
      </optional>
      <attribute name="Color"/> <!-- string of four numbers, separated by spaces. -->
      <optional>
        <attribute name="IntensityPeriod">
          <data type="decimal"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="IntensityPeriodDelta">
          <data type="decimal"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="IntensityVariation">
          <data type="decimal"/>
        </attribute>
      </optional>
      <attribute name="IsStatic">
        <data type="integer"/>
      </attribute>
      <attribute name="Name">
        <data type="NCName"/>
      </attribute>
      <attribute name="Radius">
        <data type="decimal"/>
      </attribute>
      <optional>
        <attribute name="UseVariationTint"> <!-- true/false, I believe -->
          <data type="integer"/>
        </attribute>
      </optional>
      <oneOrMore>
        <choice>
          <ref name="Export"/>
          <ref name="Rotation"/>
          <ref name="Translation"/>
        </choice>
      </oneOrMore>
    </element>
  </define>
  <define name="NodeWeapontrail">
    <element name="NodeWeapontrail">
      <attribute name="Duration">
        <data type="decimal"/>
      </attribute>
      <attribute name="MaterialObject"> <!-- All appear to be in either weapontrail_streaks or weapontrail_arrow -->
        <data type="NCName"/>
      </attribute>
      <attribute name="Name">
        <data type="NCName"/>
      </attribute>
      <attribute name="SegmentLength">
        <data type="decimal"/>
      </attribute>
      <ref name="Translation"/>
      <ref name="Rotation"/>
    </element>
  </define>
  <define name="Attribute">
    <element name="Attribute">
      <attribute name="AttributeName"> <!-- This attribute's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files) -->
        <data type="NCName"/>
      </attribute>
      <attribute name="SourceName">
        <data type="NCName"/> <!-- This attribute's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files)-->
      </attribute>
    </element>
  </define>
  <define name="NodeUsePoint">
    <element name="NodeUsePoint">
      <attribute name="Name"> <!-- All seem to be of the form "UserPoint##", where ## is a zero-padded low number  (highest I've seen is 14) -->
        <data type="NCName"/>
      </attribute>
      <attribute name="Type"> <!-- "Front", "Back", "Right", "Left" are options. Most items seem to get by with just nodeusepoints of front and back, a few have all four types of nodeusepoint. -->
        <data type="NCName"/>
      </attribute>
      <zeroOrMore>
        <ref name="Export"/>
      </zeroOrMore>
      <ref name="Translation"/>
      <ref name="Rotation"/>
      <optional>
        <ref name="NodeCrustHierarchy"/>
      </optional>
    </element>
  </define>
  <define name="NodeAmbientLight">
    <element name="NodeAmbientLight"> <!-- Only 5 files had one of these; lightrig_day01.mmh.xml, lightrig_int01.mmh.xml, lightrig_night01.mmh.xml, tools_ambient.mmh.xml, and tools_bulb_ambient.mmh.xml. -->
      <attribute name="Color"/> <!-- string of four numbers, separated by spaces. "0.0705882 0.0862745 0.0980392 1.0" for the three lightrigs, "0.498039 0.498039 0.498039 1.0" for the two tools -->
      <attribute name="Name"><!-- "BWDA_OmniLight04" for the three lightrigs, "BWDA_OmniLight01" for the two tools. -->
        <data type="NCName"/>
      </attribute>
      <attribute name="Radius"> <!-- 5.0 for the three lightrigs, "1e+007" for the two tools -->
        <data type="double"/>
      </attribute>
      <zeroOrMore>
        <ref name="Export"/>
      </zeroOrMore>
      <ref name="Translation"/>
      <ref name="Rotation"/>
    </element>
  </define>
  <define name="NodeEmitter">
    <element name="NodeEmitter">
      <attribute name="Acceleration">
        <data type="decimal"/>
      </attribute>
      <optional>
        <attribute name="AgeMapColorMultiplier"/> <!-- string of four numbers, separated by spaces. -->
      </optional>
      <optional>
        <attribute name="AgeMapScaleXMultiplier">
          <data type="decimal"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="AgeMapScaleYMultiplier">
          <data type="decimal"/>
        </attribute>
      </optional>
      <attribute name="Birthrate">
        <data type="decimal"/>
      </attribute>
      <attribute name="BirthrateInParticlesPerMeter">
        <data type="integer"/>
      </attribute>
      <attribute name="BirthrateRange">
        <data type="decimal"/>
      </attribute>
      <optional>
        <attribute name="Bounciness">
          <data type="decimal"/>
        </attribute>
      </optional>
      <attribute name="EmitterType">
        <data type="NCName"/>
      </attribute>
      <attribute name="EnableParticleCollisions">
        <data type="integer"/>
      </attribute>
      <optional>
        <attribute name="FlipbookColumns">
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="FlipbookRows">
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="FlipbookType"/> <!-- UINT8 nFlipbookType = FLIPBOOKTYPE_NONE = 0;  if (a_sFlipbookType.CompareNoCase(L"ContactSheet")) nFlipbookType = FLIPBOOKTYPE_CONTACT_SHEET = 1; if (a_sFlipbookType.CompareNoCase(L"Volume")) nFlipbookType = FLIPBOOKTYPE_VOLUME = 2;-->
      </optional>
      <optional>
        <attribute name="FramesPerSecond">
          <data type="decimal"/>
        </attribute>
      </optional>
      <attribute name="GravityMultiplier">
        <data type="decimal"/>
      </attribute>
      <attribute name="InheritVelocityInsteadOfPosition">
        <data type="integer"/>
      </attribute>
      <optional>
        <attribute name="InitialRotation">
          <data type="decimal"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="InitialRotationRange">
          <data type="decimal"/>
        </attribute>
      </optional>
      <attribute name="InitialRotationSpeed">
        <data type="decimal"/>
      </attribute>
      <attribute name="InitialRotationSpeedRange">
        <data type="decimal"/>
      </attribute>
      <attribute name="InitialSpeed">
        <data type="decimal"/>
      </attribute>
      <attribute name="InitialSpeedRange">
        <data type="decimal"/>
      </attribute>
      <optional>
        <attribute name="InvMovementSpreadUpdateDelay">
          <data type="decimal"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="KillParticleWhenTargetHit">
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="LOD">
          <data type="integer"/>
        </attribute>
      </optional>
      <attribute name="Life">
        <data type="decimal"/>
      </attribute>
      <optional>
        <attribute name="LifeRange">
          <data type="decimal"/>
        </attribute>
      </optional>
      <attribute name="LinkParticlesTogether">
        <data type="integer"/>
      </attribute>
      <attribute name="MaterialLibrary">
        <data type="NCName"/>
      </attribute>
      <attribute name="MaterialObject">
        <data type="NMTOKEN"/>
      </attribute>
      <optional>
        <attribute name="MeshParticleModel">
          <data type="NMTOKEN"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces -->
      </optional>
      <optional>
        <attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces -->
      </optional>
      <attribute name="MovementSpread"/> <!-- Two floating point values, representing movementspread X and movementspread Y -->
      <optional>
        <attribute name="MovementSpreadUpdateDelay">
          <data type="decimal"/>
        </attribute>
      </optional>
      <attribute name="Name">
        <data type="NMTOKEN"/>
      </attribute>
      <optional>
        <attribute name="ObjectSpaceAcceleration">
          <data type="integer"/>
        </attribute>
      </optional>
      <attribute name="OrientationBehaviour">
        <data type="NCName"/>
      </attribute>
      <attribute name="ParticleInheritance">
        <data type="NCName"/>
      </attribute>
      <attribute name="ParticlesAffectedByWind">
        <data type="integer"/>
      </attribute>
      <attribute name="ParticlesFollowPath">
        <data type="integer"/>
      </attribute>
      <optional>
        <attribute name="PhysicsEmitter">
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="PhysicsObjectSpawn">
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="RandomInitialRotation">
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="RandomStartFrame">
          <data type="integer"/>
        </attribute>
      </optional>
      <attribute name="RotationalAcceleration">
        <data type="decimal"/>
      </attribute>
      <attribute name="ScaleRange">
        <data type="decimal"/>
      </attribute>
      <optional>
        <attribute name="SpawnDirectionTracksTarget">
          <data type="integer"/>
        </attribute>
      </optional>
      <attribute name="SpawnSpread"/> <!-- Two floating point values, representing spawnspread X and spawnspread Y -->
      <optional>
        <attribute name="SplatEmitter">
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="TargetAttraction">
          <data type="decimal"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="TargetName">
          <data type="NMTOKEN"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="TargetRadius">
          <data type="decimal"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="UVDistributionSize">
          <data type="integer"/>
        </attribute>
      </optional>
      <attribute name="UpdateOnlyWhenVisible">
        <data type="integer"/>
      </attribute>
      <optional>
        <attribute name="UseVariationTint">
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="UserParamName"/> <!-- ECString, not sure if there's any special formatting here -->
      </optional>
      <optional>
        <attribute name="VertexFormat">
          <data type="NCName"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="WorldAxisAcceleration"/> <!-- Three numbers separated by spaces -->
      </optional>
      <oneOrMore>
        <choice>
          <ref name="Export"/>
          <ref name="Rotation"/>
          <ref name="Translation"/>
          <element name="EmitterAttachments">
            <optional>
              <attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces -->
            </optional>
            <optional>
              <attribute name="MeshParticleUpAxis"/>  <!-- Three numbers separated by spaces -->
            </optional>
            <element name="EmitterAttachment">
              <optional>
                <attribute name="Name">
                  <data type="NCName"/>
                </attribute>
              </optional>
              <optional>
                <attribute name="SpawnOnSurface">
                  <data type="integer"/>
                </attribute>
              </optional>
              <attribute name="Type">
                <data type="NCName"/>
              </attribute>
              <optional>
                <attribute name="UseNormalForVelocity">
                  <data type="integer"/>
                </attribute>
              </optional>
            </element>
          </element>
          <element name="SpawnVolume">
            <optional>
              <attribute name="Axis"/>
            </optional>
            <attribute name="InvertSpawnVolumeNormals">
              <data type="integer"/>
            </attribute>
            <optional>
              <attribute name="Length">
                <data type="decimal"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="MaxCorner"/>  <!-- Three numbers separated by spaces -->
            </optional>
            <optional>
              <attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces -->
            </optional>
            <optional>
              <attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces -->
            </optional>
            <optional>
              <attribute name="MinCorner"/> <!-- Three numbers separated by spaces -->
            </optional>
            <optional>
              <attribute name="Radius">
                <data type="decimal"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="SpawnVolumeType">
                <data type="NCName"/>
              </attribute>
            </optional>
            <attribute name="SpawnWithinVolume">
              <data type="integer"/>
            </attribute>
            <optional>
              <attribute name="UseVolumeNormalsForDirection">
                <data type="integer"/>
              </attribute>
            </optional>
            <zeroOrMore>
              <ref name="Data"/>
            </zeroOrMore>
          </element>
        </choice>
      </oneOrMore>
      <optional>
        <element name="SplatParticle">
          <optional>
            <attribute name="AgeMapColorMultiplier"/> <!-- four numbers separated by spaces -->
          </optional>
          <optional>
            <attribute name="FlipbookColumns">
              <data type="integer"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="FlipbookRows">
              <data type="integer"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="FlipbookType">
              <data type="NCName"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="FramesPerSecond">
              <data type="integer"/>
            </attribute>
          </optional>
          <attribute name="Height">
            <data type="decimal"/>
          </attribute>
          <optional>
            <attribute name="HoldLastFrame">
              <data type="integer"/>
            </attribute>
          </optional>
          <attribute name="Lifespan">
            <data type="integer"/>
          </attribute>
          <attribute name="MaterialObject">
            <data type="NCName"/>
          </attribute>
          <attribute name="NumSamplesH">
            <data type="integer"/>
          </attribute>
          <attribute name="NumSamplesW">
            <data type="integer"/>
          </attribute>
          <attribute name="OrientationRangeRadians">
            <data type="integer"/>
          </attribute>
          <optional>
            <attribute name="RandomStartFrame">
              <data type="integer"/>
            </attribute>
          </optional>
          <attribute name="Width">
            <data type="decimal"/>
          </attribute>
          <optional>
            <ref name="Export"/>
          </optional>
          <ref name="AgeMap"/>
        </element>
      </optional>
      <ref name="AgeMap"/>
    </element>
  </define>
  <define name="Data">
    <element name="Data">
      <optional>
        <attribute name="ElementCount">
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="IndexCount">
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="IndexType">
          <data type="NCName"/>
        </attribute>
      </optional>
      <attribute name="Semantic">
        <data type="NCName"/>
      </attribute>
      <optional>
        <attribute name="Type">
          <data type="NCName"/>
        </attribute>
      </optional>
      <text/>
    </element>
  </define>
  <define name="NodeEmitterGroup">
    <element name="NodeEmitterGroup">
      <attribute name="MaterialObject">
        <data type="NCName"/>
      </attribute>
      <attribute name="Name">
        <data type="NMTOKEN"/>
      </attribute>
      <ref name="Translation"/>
      <ref name="Rotation"/>
      <zeroOrMore>
        <ref name="NodeEmitter"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="NodeEmitterTarget">
    <element name="NodeEmitterTarget">
      <attribute name="Name">
        <data type="NCName"/>
      </attribute>
      <ref name="Translation"/>
      <ref name="Rotation"/>
      <zeroOrMore>
        <ref name="Export"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="NodeLightProbe">
    <element name="NodeLightProbe">
      <attribute name="Name">
        <data type="NCName"/>
      </attribute>
      <ref name="Translation"/>
      <ref name="Rotation"/>
      <optional>
        <element name="ReflectionMap">
          <attribute name="ResName">
            <data type="NCName"/>
          </attribute>
        </element>
        <element name="IrradianceMap">
          <attribute name="ResName">
            <data type="NCName"/>
          </attribute>
        </element>
      </optional>
    </element>
  </define>
  <define name="AgeMap">
    <element name="AgeMap">
      <attribute name="Count">
        <data type="integer"/>
      </attribute>
      <oneOrMore>
        <element name="AgeMapElement">
          <attribute name="Alpha">
            <data type="decimal"/>
          </attribute>
          <attribute name="Color"/>
          <attribute name="PercentLifeElapsed">
            <data type="decimal"/>
          </attribute>
          <optional>
            <attribute name="RotationSpeedMultiplier">
              <data type="decimal"/>
            </attribute>
          </optional>
          <attribute name="XScale">
            <data type="decimal"/>
          </attribute>
          <attribute name="YScale">
            <data type="decimal"/>
          </attribute>
        </element>
      </oneOrMore>
    </element>
  </define>
</grammar>