Overview

Modeling File Formats

This document describes the .x and .xanim file formats. These files describe the model and the model animations and are output when exporting a 3ds Max model to be used in ESP. Refer to the sections Exporting a 3ds Max model and Importing a Model to ESP, in the Using Modeling Toolsdocument.

See Also

Table of Contents

  • Co-ordinate Systems
  • The .X File Format
  • The .Xanim File Format
  • Specific Material Editor Options

Co-ordinate Systems

Direct 3D (the underlying Microsoft technology supporting the simulation graphics) and 3ds Max; use different 3D co-ordinate systems. Transformation matrices are applied by the export tool to convert from one co-ordinate system to another.

To translate a model from 3ds Max (right-handed) to D3D (left-handed) the following two matrix transformations are applied:

To convert from right-hand to left-hand, use the transformation matrix:

[ 1 1 -1 1 ]
[ 1 1 -1 1 ]
[ -1 -1 1 1]
[ 1 1 -1 1 ]

This will result in the Z axis up, and the Y axis towards the camera, so rotate around the X axis to make Y up, and Z away from the camera, using the following transformation matrix:

[ 1 0 0 0 ]
[ 0 0 1 0 ]
[ 0 -1 0 0 ]
[ 0 0 0 1 ]

The .X File Format

The extensions to the .X file format for ESP consist of a number of template definitions that are used to handle specific information, particularly about materials, but also some elements of animations. This section describes only the templates that are extensions to the format. Refer to DirectX SDK documentation for descriptions of the standard templates. The additional templates are:

Material Templates

  • AllowBloom
  • AlphaData
  • AmbientLightScale
  • AmbientTextureFileName
  • BaseMaterialSkin
  • BaseMaterialSpecular
  • BlendConstantSetting
  • BlendDiffiuseByBaseAlpha
  • BlendDiffuseByInverseSpecularMapAlpha
  • BloomData
  • BumpTextureFileName
  • DetailTextureFileName
  • DiffuseTextureFileName
  • DisplacementTextureFileName
  • DoubleSidedMaterial
  • EmissiveBloom
  • EmissiveData
  • EmissiveTextureFileName
  • EnhancedParameters
  • ForceTextureAddressClampSetting
  • ForceTextureAddressWrapSetting
  • FresnelTextureFileName
  • FS10Material
  • NNumberTexture
  • NoSpecularBloom
  • ReflectionTextureFilename
  • ShininessTextureFilename
  • SpecularBloomFloor
  • SpecularTextureFileName

Animation Templates

  • AnimLinkName
  • BoneInfo
  • IKChain
  • JointConstraints
  • MeshSkinWeights
  • PartData
Notes
  1. Some of the descriptions of variables simply state the field is "Reserved" and any use of these fields will be unsupported in future versions.
  2. The GUIDs in the templates are used by the code to match the template definition with the template entries in the file, the template names are present to make the entries human-readable.

Material Templates

Refer to the oil rig sample file TestX.x for examples of the use of these templates.

Template AllowBloom

template AllowBloom {
<D66E37C9-9DFE-4092-8565-C6E4C3498235>
Boolean ;
}
Materials. Set by the check box Allow Bloom, see Material Editor screen 2. [ from OilRig ]
 
AllowBloom {
1;
}
AllowBloom Set to 1 if bloom effects are to be enabled for this material.

Template AlphaData

template AlphaData {
<10DB69F3-E0EE-4fb3-8055-63E539EF5885>
Boolean ZTestAlpha;
FLOAT AlphaTestValue;
STRING AlphaTestFunction;
Boolean FinalAlphaWrite;
FLOAT FinalAlphaWriteValue;
}
Materials. Corresponds to the Material Alpha Test group box, see Material Editor screen 3. [ from B737_800]
 
AlphaData {
1; // ZTest Alpha
134.130005; // Alpha test threshold
"Greater"; // Alpha test function
0; // Perform final alpha write
255.000000; // Final alpha value
}
ZTestAlpha Set to 1 to turn the feature on. The test alpha feature is used to provide see through effects for objects such as trees and fences. For example, if the AlphaTestValue is set at 0.5 and the AlphaTestFunction as Greater, then pixels with an alpha value greater than 0.5 will not have a value written to the Z-buffer, so that see-through will occur.
AlphaTestValue A value between 0.0 and 1.0 that is used in the test.
AlphaTestFunction One of:
Never
Less
Equal
LessEqual
Greater
NotEqual
GreaterEqual
Always
 
Never and Always are unlikely to be used, never writing a value to the Z-buffer, or always writing a value. They are included for consistency with the underlying DirectX system. By far the most used test function is "Greater".
FinalAlphaWrite Reserved for run-time use.
FinalAlphaWriteValue Reserved for run-time use.

Template AmbientLightScale

template AmbientLightScale {
<4CC76AEB-E84F-4688-AB49-E1DC4B9273C7>
FLOAT AmbientLightScale;
}
Materials. Set by the Ambient light scale slider in Material Editor screen 2. [ from OilRig]
 
AmbientLightScale {
1.000000;
}
AmbientLightScale A value between 0.0 and 1.0. If this is set to 1.0 then full ambient light effects are applied to this material. However for bright materials, such as white, this can lead to white-out effects, so setting this value to lower value that 1.0 has a dulling effect on the ambient light.

Template AmbientTextureFileName

template AmbientTextureFileName {
<E00200E2-D4AB-481a-9B85-E20F9AE07402>
STRING filename;
}
FS9 Materials  
filename The ambient texture file. This was used in FS9 Materials to hold the emissive map, and will be overwritten if an FS10 Material map includes an EmissiveTextureFileName.

Template BaseMaterialSkin

template BaseMaterialSkin {
<B640F860-9E28-4cab-AD46-CACCE2A418AC>
Boolean AllowSkinning;
}
Materials. Set by the Skinned Mesh check box in the Enhanced Parameters group box in Material Editor screen 4 . BaseMaterialSkin {
0; // Skinned
}
AllowSkinning This is set to 1 if the object is skinned.

Template BaseMaterialSpecular

template BaseMaterialSpecular {
<E294ED4E-5C5A-4927-B19A-6A2D445FAF24>
Boolean AllowBaseMaterialSpecular;
}
Materials. Reset by the No Base Material Specular check box in the Enhanced Parameters group box in Material Editor screen 4 . BaseMaterialSpecular {
1; // AllowBaseMaterialSpecular
}
AllowBaseMaterialSpecular Set to 1 (the default) if specular effects are to apply to the base material.

Template BlendConstantSetting

template BlendConstantSetting {
<48EA96C3-588E-451d-B4BB-0C746C8380D9>
Boolean BlendConstant;
}
Materials. Set by the Blend Constant check box in the Enhanced Parameters group box in Material Editor screen 3. BlendConstantSetting {
0; // Blend constant
}
BlendConstant Reserved for run-time use.

Template BlendDiffuseByBaseAlpha

template BlendDiffuseByBaseAlpha {
<A623FA7C-37CB-4d17-B702-854E0DBDB467>
Boolean BlendDiffByBaseAlpha;
}
Materials. Set by the Blend diffuse by diffuse alpha check box in the Special Functionality group box, see Material Editor screen 2. BlendDiffuseByBaseAlpha {
0;
}
BlendDiffByBaseAlpha If this is set to 1 the diffuse color is multiplied by the diffuse alpha value.

Template BlendDiffuseByInverseSpecularMapAlpha

template BlendDiffuseByInverseSpecularMapAlpha {
<DAA68529-1C27-4182-9D97-E631A4759EA7>
Boolean BlendDiffuseByInvSpecAlpha;
}
Materials. Set by the Blend diffuse by inverse specular map alpha check box in the Special Functionality group box, see Material Editor screen 2. BlendDiffuseByInverseSpecularMapAlpha {
0;
}
BlendDiffuseByInvSpecAlpha If this is set to 1 the diffuse color is multiplied by the inverse (1.0 - value) of the specular alpha.

Template BloomData

template BloomData {
<58ED1E67-0D18-44EF-B676-40BB20C1EE88>
Boolean BloomCopy;
Boolean BloomModAlpha;
}
Materials. Set by the Bloom material by copying and Bloom material modulating alpha check boxes in the Bloom group box, see Material Editor screen 2. [ from generic Aurora ]
 
BloomData {
0; 1;
}
BloomCopy These two values are mutually exclusive, only one of BloomCopy or BloomModAlpha should be set.
If this is set to 1, the bloom color is a copy of the material color.
BloomModAlpha If this is set to 1, the bloom color is the result of the material color multiplied by its alpha value.

Template BumpTextureFileName

template BumpTextureFileName {
<E00200E2-D4AB-481a-9B85-E20F9AE07406>
STRING filename;
}
Materials  
filename The bump map file. Bump maps provide some 3D information of the surface so that lighting effects can give a more textured appearance.

Template DetailTextureFileName

template DetailTextureFileName {
<C223DC28-5C0E-41bc-9706-A30E023EF118>
STRING filename;
}
Materials  
filename Detail texture file. Used occasionally for such features as concrete paneling on runways, for example.

Template DiffuseTextureFileName

template DiffuseTextureFileName {
<E00200E2-D4AB-481a-9B85-E20F9AE07401>
STRING filename;
}
Materials DiffuseTextureFileName {
"oil_rig_texture_2.dds";
}
filename The most common texture file, providing the basic color map for the material. The recommended format for all texture files is the standard .dds, though non-standard .bmp files can be used.
 
If any of the TextureFileName entries use the virtual texture sheets for Virtual Cockpits that begin with the $ sign, then the filename entry must not include an extension.

Template DisplacementTextureFileName

template DisplacementTextureFileName {
<E00200E2-D4AB-481a-9B85-E20F9AE07407>
STRING filename;
}
Not used.  
filename Reserved.

Template DoubleSidedMaterial

template DoubleSidedMaterial {
<B1C6C3B0-DD1A-417b-919A-B04BAD6AE06D>
Boolean DoubleSided;
}
Materials. Set by the Double sided check box in the Enhanced Parameters group box, see Material Editor screen 4 . DoubleSidedMaterial {
0; // Double sided
}
DoubleSided Set to 1 if the material is double-sided. This means that the texture is visible from both sides (such as a tree texture), not just the side that the normal extends from. However, as lighting effects depend on the normal, this setting should usually be used with the Assume Vertical Normal setting checked.

Template EmissiveBloom

template EmissiveBloom {
<5FF8D7A2-30B5-41bc-A891-28A427D78246>
Boolean AllowEmissiveBloom;
}
Materials. Set by the Allow Emissive Bloom check box- see Material Editor screen 2. EmissiveBloom {
0; // AllowEmissiveBloom
}
AllowEmissiveBloom Set to 1 to allow emissive bloom from the material. Typically this would be on a very bright object, such as a neon sign.

Template EmissiveData

template EmissiveData {
<A02EF480-3ED3-433d-A71D-5CAC4775757A>
STRING EmissiveBlend;
}
Materials. Set in the Emissive Mode drop-down list, see Material Editor screen 3. EmissiveData {
"Blended"; // Emissive mode
}
EmissiveBlend Emissive mode is one of:
 
Additive
AdditiveNightOnly
Blend
MultiplyBlend
AdditiveUserControlled
AdditiveNightOnlyUserControlled
BlendUserControlled
MultiplyBlendUserControlled
 
The additive modes add the emissive data to the diffuse date (Addtive applies all the time, AdditiveNightOnly only applies at night time). The Blend mode linear interpolates between the two sets of data, the MultiplyBlend mode is applied progressively as it gets darker, and is typically used to add colored tints to light colored gauge elements. The UserControlled modes indicate that the effect is only to be applied when the Panel lights switch of the aircraft is on.

Template EmissiveTextureFileName

template EmissiveTextureFileName {
<E00200E2-D4AB-481a-9B85-E20F9AE07403>
STRING filename;
}
Materials  
filename The emissive texture file. This entry will overwrite any value in the AmbientTextureFileName. Emissive textures provide information on the light given off by the material.

Template EnhancedParameters

template EnhancedParameters {
<99CAD20D-DCC5-4ad4-ADAE-ED3CDE30CC02>
Boolean AssumeVerticalNormal;
Boolean ZWriteAlpha;
Boolean NoZWrite;
Boolean VolumeShadow;
Boolean NoShadow;
Boolean PrelitVertices;
}
Materials. Set in the Enhanced Parameters group box, see Material Editor screen 4 . EnhancedParameters {
0; // Assume vertical normal
0; // Z-Write alpha
0; // No Z-Write
0; // Volume shadow
0; // No shadow
0; // Prelit vertices
}
AssumeVerticalNormal Set if lighting effects should be applied as if the normal was vertical. Applies particularly to Double Sided textures.
ZWriteAlpha Set to 1 if any setting in the alpha channel is set in the Z-buffer.
NoZWrite Set to 1 if none of the material sets any value in the Z-buffer.
VolumeShadow Set to 1 if the material should create a volume shadow.
NoShadow Set to 1 if the material should not create any shadow.
PrelitVertices Reserved for run-time use.

Template ForceTextureAddressClampSetting

template ForceTextureAddressClampSetting {
<DB108D57-A3A8-4b76-8CB0-8379CDDEC074>
Boolean ForceTextureAddressClamp;
}
Materials. Set by the Force Texture Address Clamp check box in the Enhanced Parameters group box, see Material Editor screen 4 . ForceTextureAddressClampSetting {
0; // Force texture address clamp
}
ForceTextureAddressClamp Set to 1 to force texture address clamping. In this case textures are not repeated across an object, but instead the last pixel is repeated across the rest of the object. Often this pixel is transparent, otherwise a smearing effect is the result. This is used particularly when triangular areas of a texture have been defined.
It is mutually exclusive to the ForceTextureAddressWrapSetting.

Template ForceTextureAddressWrapSetting

template ForceTextureAddressWrapSetting {
<046EE84C-7977-4a11-AA2B-C79FF5391EDD>
Boolean ForceTextureAddressWrap;
}
Materials. Set by the Force Texture Address Wrap check box in the Enhanced Parameters group box, see Material Editor screen 4 . ForceTextureAddressWrapSetting {
0; // Force texture address wrap
}
ForceTextureAddressWrap Set to 1 if the texture is to be repeated across the face of the object (the default).
Mutually exclusive to the ForceTextureAddressClampSetting.

Template FresnelTextureFileName

template FresnelTextureFileName {
<C16742E5-974D-4576-870D-2047C79DF7A9>
STRING filename;
}
Materials  
filename The Fresnel ramp file. Fresnel ramps store how color changes depending on the angle of the viewer.

Template FS10Material

template FS10Material {
<16B4B490-C327-42e3-8A71-0FA35C817EA2>
ColorRGBA FallbackDiffuse;
ColorRGB Specular;
FLOAT Power;
FLOAT DetailScale;
FLOAT BumpScale;
FLOAT EnvironmentLevelScale;
Boolean bUseGlobalEnv;
Boolean bModEnvInvDiffuseAlpha;
Boolean bModEnvSpecularMapAlpha;
Boolean bFresnelDiffuse;
Boolean bFresnelSpecular;
Boolean bFresnelEnvironment;
Boolean bUsePrecipitation;
Boolean bPrecipOffset;
FLOAT PrecipOffset;
FLOAT SpecMapPowerScale;
STRING SrcBlend;
STRING DstBlend;
[...]
}
Materials. FS10Material {
0.588235; 0.588235; 0.588235; 1.000000;; // Diffuse component

0.900000; 0.900000; 0.900000;; // Specular component

0.000000; // Specular power

1.000000; 1.000000; // Detail and bump scales

0.200000; // Scale environment level factor

0; // Do not use global environment
0; // Do not blend env by inv diffuse alpha
0; // Do not blend env by specular map alpha

0; 0; 0; // Fresnel - diffuse = NO, Specular = NO, Env = NO

0; 0; 0.000000; // Precipitation - Use = NO, Offset = NO

64.000000; // Specular Map Power Scale

"One"; "Zero"; // Src/Dest blend
FallbackDiffuse If no texture is supplied, this is the color that will be used for the material. Refer to the Framebuffer Blend group box of Material Editor screen 3.
Specular The default specular RGB color to use if there is no specular map.
Power The power of the specular effect of the material. The more reflective the material the higher the power should be.
DetailScale Multipliers that apply to the detail map, how often it is to be repeated for each repetition of the texture. See the Other Texture Info group box of Material Editor screen 1.
BumpScale Multipliers that apply to the bump map, how often it is to be repeated for each repetition of the texture.
EnvironmentLevelScale Scalar value, from 0.0 to 1.0, for how visible the environment map should be.
bUseGlobalEnv Set to 0 if there is a custom environment map or the global environment map is to be turned off. See the Special Functionality group box of Material Editor screen 1.
bModEnvInvDiffuseAlpha Set to 1 to blend the environment map with the inverse of the diffuse alpha.
bModEnvSpecularMapAlpha Set to 1 to blend the environment map with the specular map alpha.
bFresnelDiffuse
bFresnelSpecular
bFresnelEnvironment
Three boolean values, set to 1 if the fresnel ramp applies to the diffuse, specular and environment maps. See the Fresnel Ramp group box of Material Editor screen 1.
bUsePrecipitiation Refer to the Precipitation group box of Material Editor screen 1. Set this value to 1 if the precipitation values are to apply to this material. Typically this makes the material more reflective if it is raining.
bPrecipOffset Set to 1 if the precipitation offset value is to apply.
PrecipOffset A value between 0 and 255 specifying the additional specular power of the material when it is raining.
SpecMapPowerScale A value between 0 and 255 indicating how intense a bright spot is created when the sun is shining directly on the surface. A high value will result in a more intense bright spot. Typically the highest value assigned is around 120. See the Special Functionality group box of Material Editor screen 1.
SrcBlend
Source and destination blends are both one of:
Zero
One
SrcColor
InvSrcColor
SrcAlpha
InvSrcAlpha
DestAlpha
InvDestAlpha
DestColor
InvDestColor
The most common combinations of source and destination blend are
1. One, Zero
meaning the result is all of the source color and none of the destination color - the destination color is what is present behind the surface of the source.
2. SrcAlpha, InvSrcAlpha
meaning the transparency of the source material is applied along with the opaqueness of the destination.
Refer to the Framebuffer Blend group box of Material Editor screen 3.
DstBlend See SrcBlend.
[...] Indicates that a FS10Material can contain additional information.

Template NNumberTexture

template NNumberTexture {
<E49E744A-CDBE-40c1-9C89-4A46BEB44D33>
Boolean IsNNumberTexture;
}
Unused.  
IsNNumberTexture Reserved for future use.

Template NoSpecularBloom

template NoSpecularBloom {
<BCE314D2-15DB-4ffd-9F6F-0763B2A4616F>
Boolean AllowSpecularBloom;
}
Materials. Set by the No specular bloom check box of the Bloom group box, see Material Editor screen 2. NoSpecularBloom {
1; // AllowSpecularBloom
}
AllowSpecularBloom Set to 0 to prevent specular bloom (default is 1).

Template ReflectionTextureFileName

template ReflectionTextureFileName {
<E00200E2-D4AB-481a-9B85-E20F9AE07404>
STRING filename;
}
Materials  
filename The Environment map file. Environment maps provide details of the reflective qualities of the material.

Template ShininessTextureFileName

template ShininessTextureFileName {
<E00200E2-D4AB-481a-9B85-E20F9AE07405>
STRING filename;
}
Unused.  
filename Reserved.

Template SpecularBloomFloor

template SpecularBloomFloor {
<21195174-A31D-47ed-BE5A-04ACAD4C3544>
FLOAT SpecularBloomFloor;
}
Materials. Set by the Specular Bloom Floor slider in the Bloom group box, see Material Editor screen 2. SpecularBloomFloor {
0.900000;
}
SpecularBloomFloor A value between 0.0 and 1.0. The results of the specular light calculations must exceed this value for bloom effects to be applied.

Template SpecularTextureFileName

template SpecularTextureFileName {
<DF64E0D7-4FFA-4634-9DA0-3EF2FAA081CE>
STRING filename;
}
Materials  
filename The specular color map file. Specular color settings define how a material reacts to a light source, often the Sun.

Specific Material Editor Options

Animation Templates

Refer to the oil rig sample file TestX.x for examples of the use of these templates. Note that there is a limit of 128 bones per model, and a limit of 22 connected bones. Any one vertex of a model can be influenced by a maximum of four bones. Models will fail if they exceed these limits.

  • AnimLinkName
  • BoneInfo
  • IKChain
  • JointConstraints
  • MeshSkinWeights
  • PartData

Template AnimLinkName

template AnimLinkName {
<0057EC91-F96B-4f5e-9CFB-0E305F39DA1A>
STRING linkName;
}
Animation. AnimLinkName { //Bone04
"Bone04";
}
linkName The name links the animation to the bone. A bone is named in the BoneInfo template.

Template BoneInfo

template BoneInfo {
<1FF0AE59-4B0B-4dfe-88F2-91D58E395767>
STRING boneName;
}
Animation. BoneInfo { //Bone04
"Bone04";
}
boneName The name of the bone. The name is used in the AnimLinkName, IKChain and MeshSkinWeights templates.

Template IKChain

template IKChain {
<2684B333-AAB2-45d9-87D8-6E2BB22616AD>
STRING chainName;
STRING startNode;
STRING endNode;
}
Animation. Refer also to the Jetway document.
 
IKChain IK_WheelsGroundLock {
"IK_WheelsGroundLock";
"Bone07";
"Bone09";
}
 
IKChain IK_MainHandle {
"IK_MainHandle";
"Bone02";
"Bone05";
}
 
IKChain IK_SecondaryHandle {
"IK_SecondaryHandle";
"Bone05";
"Bone06";
}
chainName The name of the chain.
startNode The node (BoneInfo name) that starts the chain.
endNode The node (BoneInfo name) that ends the chain.

Template JointConstraint

template ConstraintInfo {
<8713D495-C538-44dc-AE54-1097E7C93D13>
Boolean bActive;
Boolean bLimited;
FLOAT fUpperLimit;
FLOAT fLowerLimit;
}
 

template JointConstraint {
<BE433CF1-BCC0-43f8-9FE5-DB0556414426>
array ConstraintInfo Rotation[3];
array ConstraintInfo Translation[3];
}
Animation. The examples come from the model of the Jetway.
 
JointConstraint { //Bone06
1, 0, 0.000000, 0.000000;
1, 0, 0.000000, 0.000000;
1, 0, 0.000000, 0.000000;
0, 0, 0.000000, 0.000000;
0, 0, 0.000000, 0.000000;
0, 0, 0.000000, 0.000000;
}
 
JointConstraint { //Bone07
0, 0, 0.000000, 0.000000;
1, 1, 1.818633, 0.841249;
0, 0, 0.000000, 0.000000;
0, 0, 0.000000, 0.000000;
0, 0, 0.000000, 0.000000;
0, 0, 0.000000, 0.000000;
}
 
JointConstraint { //Bone08
0, 0, 0.000000, 0.000000;
0, 0, 0.000000, 0.000000;
0, 0, 0.000000, 0.000000;
1, 1, 6.000000, 0.600000;
0, 0, 6.000000, 0.600000;
0, 0, 6.000000, 0.600000;
}
 
JointConstraint { //Bone09
0, 0, 0.000000, 0.000000;
0, 0, 0.000000, 0.000000;
0, 0, 0.000000, 0.000000;
0, 0, 0.000000, 0.000000;
0, 0, 0.000000, 0.000000;
0, 0, 0.000000, 0.000000;
}
bActive Set to 1 if the joint can move, or 0 if there is no movement.
bLimited Set to 1 if the movement of the joint is limited.
fUpperLimit If the movement is a rotation, this is the upper limit of movement in radians. If the movement is a translation, the upper limit in meters of movement along the axis.
fLowerLimit If the movement is a rotation, this is the lower limit of movement in radians. If the movement is a translation, the lower limit in meters of movement along the axis.
Rotation Note that the exported rotation order is YZX
Translation The export order is XYZ.

Template MeshSkinWeights

template SkinWeight {
<C3B5EDF9-7345-463d-96D7-6386E2EC4030>
STRING boneRef;
FLOAT weight;
}

template SkinWeightGroup {
<E7B502DB-0C05-4288-A025-80762E19E0AB>
DWORD nWeights;
array SkinWeight skinWeights[nWeights];
}
 
 
template MeshSkinWeights {
<C7E2131A-30F3-4eb9-AACC-E0AE11D8FE62>
DWORD nVertices;
array SkinWeightGroup skinWeights[nVertices];
}
Animation. MeshSkinWeights { // Mesh skin weights for flag_100
56;
2;
"Bone01", 0.400000;
"Bone02", 0.600000;
2;
"Bone01", 0.400000;
"Bone02", 0.600000;
3;
"Bone03", 0.000000;
"Bone02", 0.700000;
"Bone01", 0.300000;
2;
"Bone01", 0.400000;
"Bone02", 0.600000;
..........
2;
"Bone03", 0.000000;
"Bone04", 1.000000;
2;
"Bone03", 0.000000;
"Bone04", 1.000000;
1;
"Bone04", 1.000000;
2;
"Bone04", 0.900000;
"Bone01", 0.100000;
} // End mesh skin weights for flag_100
nVertices The total number of skinWeight entries, which should match the number of vertices of the object. All the vertices are skinned vertices if the object has any skinning.
nWeights The number of weights for the entry. There is a minimum of 1 and a maximum of 4 weight entries per vertex. The entries match the vertex order..
boneRef The name of the bone that the weight applies to.
weight The relative weight that the bone has in influencing the movement of the skinned vertex. All weight entries should add up to 1.0.

Template PartData

template PartData {
<79B183BA-7E70-44d1-914A-23B304CA91E5>
DWORD nByteCount;
array BYTE XMLData[ nByteCount ];
}
Encoding XML data for attach points, platforms, visibility entries, mouse rectangles, and no-crash entries, into the X file. See table of PartData examples below.
nByteCount The number of elements in the following list.
XMLData A null terminated list of ASCII codes that match the XML entry. These entries include attach points, attached objects, no-crash settings and platforms.

PartData Examples

Attachpoint <?xml version="1.0" encoding="ISO-8859-1" ?> <FSMakeMdlData version="9.0"> <Attachpoint name="attachpt_Steam_Med_1"> <AttachedObject> <Effect effectName="fx_Steam_Med" effectParams=""/> </AttachedObject> </Attachpoint> </FSMakeMdlData>
Frame frm-attachpt_Steam_Med_1 {
PartData {
236;
60, 63, 120, 109, 108, 32, 118, 101, 114, 115,
105, 111, 110, 61, 34, 49, 46, 48, 34, 32,
101, 110, 99, 111, 100, 105, 110, 103, 61, 34,
73, 83, 79, 45, 56, 56, 53, 57, 45, 49,
34, 32, 63, 62, 32, 60, 70, 83, 77, 97,
107, 101, 77, 100, 108, 68, 97, 116, 97, 32,
118, 101, 114, 115, 105, 111, 110, 61, 34, 57,
46, 48, 34, 62, 32, 60, 65, 116, 116, 97,
99, 104, 112, 111, 105, 110, 116, 32, 110, 97,
109, 101, 61, 34, 97, 116, 116, 97, 99, 104,
112, 116, 95, 83, 116, 101, 97, 109, 95, 77,
101, 100, 95, 49, 34, 62, 32, 60, 65, 116,
116, 97, 99, 104, 101, 100, 79, 98, 106, 101,
99, 116, 62, 32, 60, 69, 102, 102, 101, 99,
116, 32, 101, 102, 102, 101, 99, 116, 78, 97,
109, 101, 61, 34, 102, 120, 95, 83, 116, 101,
97, 109, 95, 77, 101, 100, 34, 32, 101, 102,
102, 101, 99, 116, 80, 97, 114, 97, 109, 115,
61, 34, 34, 47, 62, 32, 60, 47, 65, 116,
116, 97, 99, 104, 101, 100, 79, 98, 106, 101,
99, 116, 62, 32, 60, 47, 65, 116, 116, 97,
99, 104, 112, 111, 105, 110, 116, 62, 32, 60,
47, 70, 83, 77, 97, 107, 101, 77, 100, 108,
68, 97, 116, 97, 62, 0;
} // End PartData
The example shows an attach point with an attached effect. It is also possible to attach a library object to the attach point, with the statement:
 
<AttachedObject>
<LibraryObject name="GUID" scale="1.0" />
</AttachedObject>
 
Examples of attached library objects would be hazard lights, rotating radar dishes, and so on.
 
All of the geometry for the attach point is removed and only the root point is retained.
Platform <?xml version="1.0" encoding="ISO-8859-1" ?> <FSMakeMdlData version="9.0"> <Platform name="platform_CONCRETE_0" surfaceType="CONCRETE" >
</Platform> </FSMakeMdlData>

Frame frm-platform_CONCRETE_0 {
PartData {
166;
60, 63, 120, 109, 108, 32, 118, 101, 114, 115,
105, 111, 110, 61, 34, 49, 46, 48, 34, 32,
101, 110, 99, 111, 100, 105, 110, 103, 61, 34,
73, 83, 79, 45, 56, 56, 53, 57, 45, 49,
34, 32, 63, 62, 32, 60, 70, 83, 77, 97,
107, 101, 77, 100, 108, 68, 97, 116, 97, 32,
118, 101, 114, 115, 105, 111, 110, 61, 34, 57,
46, 48, 34, 62, 32, 60, 80, 108, 97, 116,
102, 111, 114, 109, 32, 110, 97, 109, 101, 61,
34, 112, 108, 97, 116, 102, 111, 114, 109, 95,
67, 79, 78, 67, 82, 69, 84, 69, 95, 48,
34, 32, 115, 117, 114, 102, 97, 99, 101, 84,
121, 112, 101, 61, 34, 67, 79, 78, 67, 82,
69, 84, 69, 34, 32, 62, 32, 60, 47, 80,
108, 97, 116, 102, 111, 114, 109, 62, 32, 60,
47, 70, 83, 77, 97, 107, 101, 77, 100, 108,
68, 97, 116, 97, 62, 0;
} // End PartData
When specifying that a part is a platform, it is implied that the part also has the </NoCrash> attribute set.
 
Platforms cannot have an animated part at any point in their parent hierarchy.
 
The surfaceType entry must be one of:
 
ASPHALT,
BITUMINOUS
BRICK
CONCRETE
CORAL
DIRT
FOREST
GRASS
GRASS_BUMPY
GRAVEL
HARD_TURF
ICE
LONG_GRASS
MACADAM
OIL_TREATED
PLANKS
SAND
SHALE
SHORT_GRASS
SNOW
STEEL_MATS
TARMAC
URBAN
WATER
WRIGHT_FLYER_TRACK
 
Note that this list does not exactly match the surface types used by the BGL compiler.
MouseRect <?xml version="1.0" encoding="ISO-8859-1" ?> <FSMakeMdlData version="9.0"> <MouseRect name="lever_pfd_mfd_select_4"> </MouseRect> </FSMakeMdlData> Frame frm-lever-pfd-mfd-select_4_1 {
PartData {
147;
60, 63, 120, 109, 108, 32, 118, 101, 114, 115,
105, 111, 110, 61, 34, 49, 46, 48, 34, 32,
101, 110, 99, 111, 100, 105, 110, 103, 61, 34,
73, 83, 79, 45, 56, 56, 53, 57, 45, 49,
34, 32, 63, 62, 32, 60, 70, 83, 77, 97,
107, 101, 77, 100, 108, 68, 97, 116, 97, 32,
118, 101, 114, 115, 105, 111, 110, 61, 34, 57,
46, 48, 34, 62, 32, 60, 77, 111, 117, 115,
101, 82, 101, 99, 116, 32, 110, 97, 109, 101,
61, 34, 108, 101, 118, 101, 114, 95, 112, 102,
100, 95, 109, 102, 100, 95, 115, 101, 108, 101,
99, 116, 95, 52, 34, 62, 32, 60, 47, 77,
111, 117, 115, 101, 82, 101, 99, 116, 62, 32,
60, 47, 70, 83, 77, 97, 107, 101, 77, 100,
108, 68, 97, 116, 97, 62, 0;
} // End PartData

 
Visibility <?xml version="1.0" encoding="ISO-8859-1" ?> <FSMakeMdlData version="9.0"> <Visibility name="prop1_blurred"> </Visibility> </FSMakeMdlData> Frame frm-N1_1_blurred_50 {
PartData {
140;
60, 63, 120, 109, 108, 32, 118, 101, 114, 115,
105, 111, 110, 61, 34, 49, 46, 48, 34, 32,
101, 110, 99, 111, 100, 105, 110, 103, 61, 34,
73, 83, 79, 45, 56, 56, 53, 57, 45, 49,
34, 32, 63, 62, 32, 60, 70, 83, 77, 97,
107, 101, 77, 100, 108, 68, 97, 116, 97, 32,
118, 101, 114, 115, 105, 111, 110, 61, 34, 57,
46, 48, 34, 62, 32, 60, 86, 105, 115, 105,
98, 105, 108, 105, 116, 121, 32, 110, 97, 109,
101, 61, 34, 112, 114, 111, 112, 49, 95, 98,
108, 117, 114, 114, 101, 100, 34, 62, 32, 60,
47, 86, 105, 115, 105, 98, 105, 108, 105, 116,
121, 62, 32, 60, 47, 70, 83, 77, 97, 107,
101, 77, 100, 108, 68, 97, 116, 97, 62, 0;
} // End PartData
 
NoCrash <?xml version="1.0" encoding="ISO-8859-1" ?> <FSMakeMdlData version="9.0"> </NoCrash> </FSMakeMdlData> No examples. If a NoCrash entry is made for a part, then a collision between an aircraft and the part will not result in a crash. Platforms automatically have NoCrash attributes set.

The .Xanim File Format

The .xanim file is output when exporting a model that contains animations from 3ds Max. Some of the information in it is copied across from Modeldef.xml, a file that is used by the 3ds Max tools, but not by the simulation. The entries in Modeldef.xml are described in the Creating a New Animation section of the Using Modeling Toolsdocument. Refer also to the TestX.xanim file supplied with the OilRig sample of the Modeling SDK.

<Anim Describes an animation. There will be one Anim entry for each named animation used by the model.
 
The properties information all comes from the Modeldef.xml file. The name ("Ambient" in the example) is the friendly name used for the animation, the guid is its unique identifier, the length the length of the animation in frames. The type can either be Standard or Sim. The typeParam can be empty or contain one or both of AutoPlay and Random.
 
If the type of the animation is Sim then the typeParam2 identifies the script code from Modeldef.xml that is to be run when the animation is triggered. As a naming convention, this script often has the same name as the animation itself.
<Anim name="Ambient" guid="A6F1C5D0-BEF6-449e-BAF8-FB777F27808F" length="60.000000"
type="Standard" typeParam="AutoPlay,Random" typeParam2="">

 
<Anim name="r_tire_still_key" guid="6114e2ca-5fb8-4d20-a880-56945094247f" length="100.000000"   type="Sim" typeParam="AutoPlay" typeParam2="r_tire_still_key">
<AnimStream Each animation consists of one or more AnimStream entries. The name can be one of: Rotation, Position or Event. No other names (animation types) are currently supported. The id numbers are simply 0, 2 and 3 for these three types of animation. The partName identifies the 3ds Max model part, and the length is in frames. <AnimStream name="Rotation" id="0" partName="Bone02" length="60.000000">
 
<AnimStream name="Position" id="2" partName="CraneSmallRig_Hook_100" length="400.000000">
 
<AnimStream name="Event" id="3" partName="WhaleMovement01" length="1136638.500000">
<Keyframe An animation stream consists of a large number, usually, of Keyframe entries. The content of each entry depends on whether the animation is a rotation, position or event.
 
For all types the time entry identifies the frame when the rotation, translation or event is to occur.
 
For rotations the type is always "Quaternion" and the four numbers identify the x,y,z vector relative to the position of the part at frame 0, and the rotation in radians. Quaternion math is described on a number of websites including:
 
http://en.wikipedia.org/wiki/Quaternion
 
For position (usually called translation) entries the type is always "Vector" and the w entry in the x,y,z,w list of numbers is ignored. The x,y,z represent relative offsets to the position of the part at frame 0. The units of the movement are the units of the model (usually meters).
 
For events, the type is always "Event" and the data contains a string in the format:
CCCC;parameters
where CCCC identifies the type of event. Currently only VFX0 is supported, which triggers a special effect. Following the semicolon are the special effects parameters: the name of the effect file and the name of the attach point.
 
[Rotation]
 
<Keyframe time="0.000000" type="Quaternion" data="0.000000;0.000000;0.000000;1.000000"/>
<Keyframe time="1.016667" type="Quaternion" data="0.000000;-0.029964;0.000000;0.999551"/>
<Keyframe time="2.033333" type="Quaternion" data="-0.000000;-0.060049;-0.000000;0.998195"/>
<Keyframe time="3.050000" type="Quaternion" data="0.000000;-0.089631;0.000000;0.995975"/>

 
[Position]
 
<Keyframe time="0.000000" type="Vector" data="0.000000;0.000000;-0.000000;0.0"/>
<Keyframe time="28.000000" type="Vector" data="0.024544;-0.000454;0.000061;0.0"/>
<Keyframe time="32.000000" type="Vector" data="0.039199;-0.001118;0.000172;0.0"/>
<Keyframe time="36.000000" type="Vector" data="0.065167;-0.000076;0.000401;0.0"/>

 
[Event]
<Keyframe time="302.000000" type="Event" data="VFX0;fx_blowHole,attachpt_blowHole"/>
<Keyframe time="1638.000000" type="Event" data="VFX0;fx_blowHole,attachpt_blowHole"/>