PlayStation(R)Mobile MDX file format is a file format which contains a model data.
Contents
MDX file can contain a model data with the following functions.
The default settings of the model data are as follows.
MDX file is structured as hierarchical blocks as follows.
File // File body (only in binary format)
Model // Model body
Bone // Hierarchical node
Part // Shape data
Mesh // Drawing mesh
Arrays // Vertex data
Material // Material settings
Layer // Texture mapping
Texture // Texture image
Motion // Animation set
FCurve // Animation curve
Below is an example of a simple model data in text format.
.MDS 1.00
Model "model-0" {
Bone "bone-0" {
Translate 0.000000 0.000000 0.000000
RotateYXZ 0.000000 0.000000 0.000000
DrawPart "part-0"
}
Part "part-0" {
Mesh "mesh-0" {
SetMaterial "material-0"
SetArrays "arrays-0"
DrawArrays TRIANGLES 3 1 0 1 2
}
Arrays "arrays-0" POSITION|NORMAL 0 3 {
0.000000 0.577350 0.000000 0.000000 0.000000 1.000000
-0.500000 -0.288675 0.000000 0.000000 0.000000 1.000000
0.500000 -0.288675 0.000000 0.000000 0.000000 1.000000
}
}
Material "material-0" {
Diffuse 0.000000 0.000000 1.000000
Specular 1.000000 1.000000 1.000000
Opacity 1.000000
Shininess 10.000000
}
}
MDX file is described by the combination of a header, blocks, and commands,
FormatSignature $version
BlockType $name $arg1 $arg2 ... {
CommandType $arg1 $arg2 ...
CommandType $arg1 $arg2 ...
BlockType $name $arg1 $arg2 ... {
CommandType $arg1 $arg2 ...
CommandType $arg1 $arg2 ...
}
BlockType $name $arg1 $arg2 ... {
$data0 $data1 $data2 ...
}
}
The types of the elements of command arguments, block arguments, and block data are as follows.
Type Data Example 1 Example 2 ref Reference to a block "bone-0" "Bone::bone-0" (with block type) enum Enumeration constant POSITION POSITION|NORMAL (logical or) string 8bit zero-terminated string "texture.png" float 32bit floating point number 10.0 half 16bit floating point number 10.0 int 32bit signed integer 10 uint 32bit unsigned integer 10 short 16bit signed integer 10 ushort 16bit unsigned integer 10 byte 8bit signed integer 10 ubyte 8bit unsigned integer 10
In text format, model data is stored in text expression.
In binary format, model data is stored in binary expression.
Header, blocks, and commands are stored in the following structures.
struct MdxHeader {
uint Signature ; // Format signature ( 0x2e4d4458 )
uint Version ; // Format version ( 0x312e3030 )
uint Style ; // Format style ( 0x0050534d )
uint Option ; // Format option ( 0x00000000 )
}
struct MdxBlock {
ushort Type ; // Block type
ushort NameEnd ; // End position of the block name
uint ArgsEnd ; // End position of the block argument
uint DataEnd ; // End position of the block data
uint ChildEnd ; // End position of the child elements
// Block name
// Block arguments
// Block data
// Child elements
}
struct MdxCommand {
ushort Type ; // Command type | 0x8000
ushort ArgsEnd ; // End position of the command arguments
// Command arguments
}
The positions of the values contained in the command arguments, block arguments, and block data are aligned in the size of each data type. Reference to a block is stored as the following bitfield value.
struct MdxReference {
uint Bits ;
// Type of the block
int Type { get { return (int)( Bits >> 16 ) & 0xffff ; } }
// Relative level of the block
int Level { get { return (int)( Bits >> 12 ) & 0x000f ; } }
// Block number in the blocks of the same type in the same tier.
int Index { get { return (int)( Bits >> 0 ) & 0x0fff ; } }
}
[Summary] Block representing a file body [Syntax] File $name { ... } [Arguments] string $name Block name [Elements] Model
[Summary] Block representing a model body [Syntax] Model $name { ... } [Arguments] string $name Block name [Elements] BoundingBox BoundingSphere Bone (can appear multiple time) Part (can appear multiple time) Material (can appear multiple time) Texture (can appear multiple time) Motion (can appear multiple time)
[Summary] Block representing a hierarchical node [Syntax] Bone $name { ... } [Arguments] string $name Block name [Elements] BoundingBox BoundingSphere ParentBone Visibility Pivot Translate Rotate* Scale BlendBone (can appear multiple time) DrawPart (can appear multiple time)
[Summary] Block representing a shape data [Syntax] Part $name { ... } [Arguments] string $name Block name [Elements] BoundingBox BoundingSphere Mesh (can appear multiple time) Arrays (can appear multiple time)
[Summary] Block representing a drawing mesh [Syntax] Mesh $name { ... } [Arguments] string $name Block name [Elements] BoundingBox BoundingSphere SetMaterial SetArrays BlendIndices DrawArrays (can appear multiple time)
[Summary] Block representing a vertex data [Syntax] Arrays $name $format $stride $count { ... } [Arguments] string $name Block name enum VertexFormat $format Vertex format int $stride Vertex stride int $count Vertex count [Data] Vertex data is structured as (data of one vertex x vertex count). ------------------------------------------------ Position Normal Color TexCoord Weights Indices // Data for one vertex Position Normal Color TexCoord Weights Indices // Data for one vertex Position Normal Color TexCoord Weights Indices // Data for one vertex ... ------------------------------------------------ The content of vertex data is defined by logical-or of vertex formats. Vertex formats and corresponding vertex elements are as follows ------------------------------------------------ POSITION float x 3 Position coordinate NORMAL float x 3 Normal vector COLOR float x 4 Vertex color TEXCOORD float x 2 Texture coordinate WEIGHTn float x n Blend weights INDICES ubyte x n Blend indices ------------------------------------------------
[Summary] Block representing a material settings [Syntax] Material $name { ... } [Arguments] string $name Block name [Elements] Diffuse Ambient Specular Emission Opacity Shininess Layer (can appear multiple time)
[Summary] Block representing a texture mapping [Syntax] Layer $name { ... } [Arguments] string $name Block name [Elements] SetTexture
[Summary] Block representing a texture image [Syntax] Texture $name { ... } [Arguments] string $name Block name [Elements] FileName FileImage UVTranslate UVScale
[Summary] Block representing an animation set [Syntax] Motion $name { ... } [Arguments] string $name Block name [Elements] FrameLoop FrameRate FrameRepeat Animate (can appear multiple time) FCurve (can appear multiple time)
[Summary] Block representing an animation curve [Syntax] FCurve $name $interp $extrap $dimCount $keyCount { ... } [Arguments] string $name Block name enum InterpType $interp Interpolation type enum ExtrapType $extrap Extrapolation type int $dimCount Dimension count int $keyCount Key-frame count [Data] Animation curve is structured as (data of one key-frame x key-frame count). Basically, frame and key value are stored in one key-frame. The count of elements is (dimension count + 1). ------------------------------------------------ Frame Values[n] // Data for one key-frame Frame Values[n] // Data for one key-frame Frame Values[n] // Data for one key-frame ... ------------------------------------------------ If the interpolation type is HERMITE, Y components of the tangent vectors are also stored in it. The element count is (dimension count * 3 + 1). ------------------------------------------------ Frame Values[n] InTangentY[n] OutTangentY[n] Frame Values[n] InTangentY[n] OutTangentY[n] Frame Values[n] InTangentY[n] OutTangentY[n] ... ------------------------------------------------ If the interpolation type is CUBIC, X components of the tangent vectors are also stored in it. The element count is (dimension count * 5 + 1). ------------------------------------------------ Frame Values[n] InTangentY[n] OutTangentY[n] InTangentX[n] OutTangentX[n] Frame Values[n] InTangentY[n] OutTangentY[n] InTangentX[n] OutTangentX[n] Frame Values[n] InTangentY[n] OutTangentY[n] InTangentX[n] OutTangentX[n] ... ------------------------------------------------
[Summary] Filename [Syntax] FileName $name [Arguments] string $name Filename
[Summary] File image [Syntax] FileImage $size $data ... [Arguments] uint $size Size (unit = byte) uint $data ... Data (every 32bit)
[Summary] Bounding box [Syntax] BoundingBox $minX $minY $minZ $maxX $maxY $maxZ [Arguments] float $minX Minimum X float $minY Minimum Y float $minZ Minimum Z float $maxX Maximum X float $maxY Maximum Y float $maxZ Maximum Z
[Summary] Bounding sphere [Syntax] BoundingSphere $centerX $centerY $centerZ $radius [Arguments] float $centerX Center X float $centerY Center Y float $centerZ Center Z float $radius Radius
[Summary] Parent bone [Syntax] ParentBone $bone [Arguments] ref Bone $bone Reference to the parent bone
[Summary] Visibility [Syntax] Visibility $visibility [Arguments] uint $visibility Visibility
[Summary] Pivot [Syntax] Pivot $x $y $z [Arguments] float $x X float $y Y float $z Z
[Summary] Translation [Syntax] Translate $x $y $z [Arguments] float $x X float $y Y float $z Z
[Summary] Rotation (quaternion) [Syntax] Rotate $x $y $z $w [Arguments] float $x X float $y Y float $z Z float $w W
[Summary] Rotation (euler angles) [Syntax] RotateXYZ $x $y $z RotateYZX $x $y $z RotateZXY $x $y $z RotateXZY $x $y $z RotateYXZ $x $y $z RotateZYX $x $y $z [Arguments] float $x X (unit = degree) float $y Y (unit = degree) float $z Z (unit = degree)
[Summary] Scaling [Syntax] Scale $x $y $z [Arguments] float $x X float $y Y float $z Z
[Summary] Vertex blend bone [Syntax] BlendBone $bone $m11 $m12 $m13 $m14 \ $m21 $m22 $m23 $m24 \ $m31 $m32 $m33 $m34 \ $m41 $m42 $m43 $m44 [Arguments] ref Bone $bone Reference to the vertex blend bone float $m11 ... $m14 Column 1 of the offset matrix float $m21 ... $m24 Column 2 of the offset matrix float $m31 ... $m34 Column 3 of the offset matrix float $m41 ... $m44 Column 4 of the offset matrix
[Summary] Drawing part [Syntax] DrawPart $part [Arguments] ref Part $part Reference to the drawing part
[Summary] Material settings [Syntax] SetMaterial $material [Arguments] ref Material $material Reference to the material settings
[Summary] Vertex data [Syntax] SetArrays $arrays [Arguments] ref Arrays $arrays Reference to the vertex data
[Summary] Vertex blend indices [Syntax] BlendIndices $count $index ... [Arguments] int $count Vertex blend count int $index ... Vertex blend indices
[Summary] Drawing primitive [Syntax] DrawArrays $mode $vertCount $primCount $index ... [Arguments] enum DrawMode $mode Drawing mode int $vertCount Vertex count int $primCount Primitive count ushort $index ... Vertex indices
[Summary] Diffuse color [Syntax] Diffuse $r $g $b [Arguments] float $r R float $g G float $b B
[Summary] Ambient color [Syntax] Ambient $r $g $b [Arguments] float $r R float $g G float $b B
[Summary] Specular color [Syntax] Specular $r $g $b [Arguments] float $r R float $g G float $b B
[Summary] Emission color [Syntax] Emission $r $g $b [Arguments] float $r R float $g G float $b B
[Summary] Opacity [Syntax] Opacity $opacity [Arguments] float $opacity Opacity
[Summary] Specular exponent [Syntax] Shininess $shininess [Arguments] float $shininess Specular exponent
[Summary] Texture image [Syntax] SetTexture $texture [Arguments] ref Texture $texture Reference to the texture image
[Summary] UV translation [Syntax] UVTranslate $u $v [Arguments] float $u U float $v V
[Summary] UV scaling [Syntax] UVScale $u $v [Arguments] float $u U float $v V
[Summary] Loop range [Syntax] FrameLoop $start $end [Arguments] $start Start frame $end End frame
[Summary] Frame rate [Syntax] FrameRate $fps [Arguments] float $fps Frame rate (unit = frames per second)
[Summary] Repeat mode [Syntax] FrameRepeat $mode [Arguments] enum RepeatMode $mode Repeat mode
[Summary] Animation [Syntax] Animate $block $command $option $fcurve [Arguments] ref Block $block Reference to the block enum CommandType $command Command type int $option Option ref FCurve $fcurve Reference to the animation curve
File = 0x0002 Model = 0x0010 Bone = 0x0011 Part = 0x0012 Mesh = 0x0013 Arrays = 0x0014 Material = 0x0016 Layer = 0x0017 Texture = 0x0018 Motion = 0x001b FCurve = 0x001c
FileName = 0x0080 FileImage = 0x0081 BoundingBox = 0x0082 BoundingSphere = 0x0083 ParentBone = 0x0440 Visibility = 0x0441 Pivot = 0x0442 Translate = 0x0443 Rotate = 0x0444 RotateXYZ = 0x0445 RotateYZX = 0x0446 RotateZXY = 0x0447 RotateXZY = 0x0448 RotateYXZ = 0x0449 RotateZYX = 0x044a Scale = 0x044b BlendBone = 0x0460 DrawPart = 0x047f SetMaterial = 0x04c0 SetArrays = 0x04c1 BlendIndices = 0x04c2 DrawArrays = 0x04e0 Diffuse = 0x0581 Ambient = 0x0582 Specular = 0x0583 Emission = 0x0584 Opacity = 0x0588 Shininess = 0x0589 SetTexture = 0x05c0 UVTranslate = 0x0621 UVScale = 0x0623 FrameLoop = 0x06c0 FrameRate = 0x06c1 FrameRepeat = 0x06c2 Animate = 0x06e0
POSITION = 1 << 0 NORMAL = 1 << 1 COLOR = 1 << 3 TEXCOORD = 1 << 5 WEIGHTn = n << 8 INDICES = 1 << 16
CONSTANT = 0x0000 LINEAR = 0x0001 HERMITE = 0x0002 CUBIC = 0x0003 SPHERICAL = 0x0004
HOLD = 0x0000 CYCLE = 0x0011 SHUTTLE = 0x0022 HOLD_HOLD = 0x0000 HOLD_CYCLE = 0x0001 HOLD_SHUTTLE = 0x0002 CYCLE_HOLD = 0x0010 CYCLE_CYCLE = 0x0011 CYCLE_SHUTTLE = 0x0012 SHUTTLE_HOLD = 0x0020 SHUTTLE_CYCLE = 0x0021 SHUTTLE_SHUTTLE = 0x0022
POINTS = 0x0000 LINES = 0x0001 LINE_STRIP = 0x0002 TRIANGLES = 0x0003 TRIANGLE_STRIP = 0x0004 TRIANGLE_FAN = 0x0005
HOLD = 0x0000 CYCLE = 0x0001