<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://hedgedocs.com/index.php?action=history&amp;feed=atom&amp;title=NN_Chunk_Format_-_MOTION</id>
	<title>NN Chunk Format - MOTION - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://hedgedocs.com/index.php?action=history&amp;feed=atom&amp;title=NN_Chunk_Format_-_MOTION"/>
	<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=NN_Chunk_Format_-_MOTION&amp;action=history"/>
	<updated>2026-04-17T08:11:10Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://hedgedocs.com/index.php?title=NN_Chunk_Format_-_MOTION&amp;diff=192&amp;oldid=prev</id>
		<title>PTKay: Created page with &quot;== NNF_MOTIONTYPE == Types and flags for a NNS_MOTION struct.&lt;syntaxhighlight lang=&quot;cpp&quot;&gt; enum NNF_MOTIONTYPE : uint32_t {   // -- Masks --    // Apply this mask to get the Motion Type.   NND_MOTIONTYPE_CATEGORY_MASK = 31,    // Apply this mask to get the Repeat Type.   NND_MOTIONTYPE_REPEAT_MASK = 0x1F0040U,     // -- Motion Types --    NND_MOTIONTYPE_NODE = 1,   NND_MOTIONTYPE_CAMERA = 2,   NND_MOTIONTYPE_LIGHT = 4,   NND_MOTIONT...&quot;</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=NN_Chunk_Format_-_MOTION&amp;diff=192&amp;oldid=prev"/>
		<updated>2025-02-21T10:48:48Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;== NNF_MOTIONTYPE == Types and flags for a &lt;a href=&quot;/index.php/NN_Chunk_Format_-_MOTION#NNS_MOTION&quot; title=&quot;NN Chunk Format - MOTION&quot;&gt;NNS_MOTION&lt;/a&gt; struct.&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt; enum NNF_MOTIONTYPE : uint32_t {   // -- Masks --    // Apply this mask to get the Motion Type.   NND_MOTIONTYPE_CATEGORY_MASK = 31,    // Apply this mask to get the Repeat Type.   NND_MOTIONTYPE_REPEAT_MASK = 0x1F0040U,     // -- Motion Types --    NND_MOTIONTYPE_NODE = 1,   NND_MOTIONTYPE_CAMERA = 2,   NND_MOTIONTYPE_LIGHT = 4,   NND_MOTIONT...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== NNF_MOTIONTYPE ==&lt;br /&gt;
Types and flags for a [[NN Chunk Format - MOTION#NNS MOTION|NNS_MOTION]] struct.&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum NNF_MOTIONTYPE : uint32_t&lt;br /&gt;
{&lt;br /&gt;
  // -- Masks --&lt;br /&gt;
&lt;br /&gt;
  // Apply this mask to get the Motion Type.&lt;br /&gt;
  NND_MOTIONTYPE_CATEGORY_MASK = 31,&lt;br /&gt;
&lt;br /&gt;
  // Apply this mask to get the Repeat Type.&lt;br /&gt;
  NND_MOTIONTYPE_REPEAT_MASK = 0x1F0040U,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // -- Motion Types --&lt;br /&gt;
&lt;br /&gt;
  NND_MOTIONTYPE_NODE = 1,&lt;br /&gt;
  NND_MOTIONTYPE_CAMERA = 2,&lt;br /&gt;
  NND_MOTIONTYPE_LIGHT = 4,&lt;br /&gt;
  NND_MOTIONTYPE_MORPH = 8,&lt;br /&gt;
  NND_MOTIONTYPE_MATERIAL = 16,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // -- Repeat Types --&lt;br /&gt;
&lt;br /&gt;
  // The motion is paused, until it is triggered by the game.&lt;br /&gt;
  NND_MOTIONTYPE_TRIGGER = 64,&lt;br /&gt;
&lt;br /&gt;
  // The motion plays one time, and never again.&lt;br /&gt;
  NND_MOTIONTYPE_NOREPEAT = 0x10000U,&lt;br /&gt;
&lt;br /&gt;
  // TODO: Find out the difference between this and NOREPEAT ?&lt;br /&gt;
  NND_MOTIONTYPE_CONSTREPEAT = 0x20000U,&lt;br /&gt;
&lt;br /&gt;
  // The motion plays, then it repeats itself from the beginning, forever.&lt;br /&gt;
  NND_MOTIONTYPE_REPEAT = 0x40000U,&lt;br /&gt;
&lt;br /&gt;
  // The motion plays, then it repeats itself in reverse, then forwards again, forever.&lt;br /&gt;
  NND_MOTIONTYPE_MIRROR = 0x80000U,&lt;br /&gt;
&lt;br /&gt;
  // Unknown. This type does not seem to be supported by any games?&lt;br /&gt;
  NND_MOTIONTYPE_OFFSET = 0x100000U,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // -- Flags --&lt;br /&gt;
&lt;br /&gt;
  // Specifies that this motion uses version 2 of the motion format.&lt;br /&gt;
  // NOTE: This is the only version which we&amp;#039;ve seen be used so far.&lt;br /&gt;
  NND_MOTIONTYPE_VERSION2 = 0x10000000U&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NNS_MOTION ==&lt;br /&gt;
{{Notice|type=note|content=This is the root struct for all MOTION data chunks.}}&lt;br /&gt;
A motion is an animation of something. It&amp;#039;s made up of one or more submotions, which represent the actual animation data.&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct NNS_MOTION&lt;br /&gt;
{&lt;br /&gt;
  // Types and flags.&lt;br /&gt;
  NNF_MOTIONTYPE fType;&lt;br /&gt;
&lt;br /&gt;
  // The frame this motion starts playing at.&lt;br /&gt;
  float StartFrame;&lt;br /&gt;
&lt;br /&gt;
  // The frame this motion stops playing at.&lt;br /&gt;
  float EndFrame;&lt;br /&gt;
&lt;br /&gt;
  // The number of elements in the [pSubmotion] array.&lt;br /&gt;
  uint32_t nSubmotion;&lt;br /&gt;
&lt;br /&gt;
  // An array of NNS_SUBMOTION structs.&lt;br /&gt;
  NNS_SUBMOTION* pSubmotion;&lt;br /&gt;
&lt;br /&gt;
  // How many frames of the motion are shown each second.&lt;br /&gt;
  // NOTE: This field is only present if NND_MOTIONTYPE_VERSION2&lt;br /&gt;
  // is set in [fType].&lt;br /&gt;
  float FrameRate;&lt;br /&gt;
&lt;br /&gt;
  // Reserved value that was never used; always 0.&lt;br /&gt;
  // NOTE: This field is only present if NND_MOTIONTYPE_VERSION2&lt;br /&gt;
  // is set in [fType].&lt;br /&gt;
  uint32_t Reserved0;&lt;br /&gt;
&lt;br /&gt;
  // Reserved value that was never used; always 0.&lt;br /&gt;
  // NOTE: This field is only present if NND_MOTIONTYPE_VERSION2&lt;br /&gt;
  // is set in [fType].&lt;br /&gt;
  uint32_t Reserved1;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Macros used by Text-Form files:&lt;br /&gt;
#define MOTION(fType, StartFrame, EndFrame, nSubmotion, pSubmotion) \&lt;br /&gt;
  { fType, StartFrame, EndFrame, nSubmotion, pSubmotion, 30.0f, 0, 0 }&lt;br /&gt;
&lt;br /&gt;
#define MOT_TYPE(fType) (fType)&lt;br /&gt;
#define MOT_START_KEYFRAME(StartFrame) (StartFrame)&lt;br /&gt;
#define MOT_END_KEYFRAME(EndFrame) (EndFrame)&lt;br /&gt;
#define MOT_N_SUBMOT(nSubmotion) (nSubmotion)&lt;br /&gt;
#define MOT_SUBMOTLIST(pSubmotion) (pSubmotion)&lt;br /&gt;
&lt;br /&gt;
#define MOTION2(fType, StartFrame, EndFrame, nSubmotion, pSubmotion, FrameRate, Reserved0, Reserved1) \&lt;br /&gt;
  { fType, StartFrame, EndFrame, nSubmotion, pSubmotion, FrameRate, Reserved0, Reserved1 }&lt;br /&gt;
&lt;br /&gt;
// NOTE: MOT_TYPE, MOT_NSUBMOT, and MOT_SUBMOTLIST are still used by V2.&lt;br /&gt;
&lt;br /&gt;
#define MOT_START_FRAME(StartFrame) (StartFrame) // Used instead of MOT_START_KEYFRAME for V2&lt;br /&gt;
#define MOT_END_FRAME(EndFrame) (EndFrame) // Used instead of MOT_END_KEYFRAME for V2&lt;br /&gt;
#define MOT_FRAMERATE(FrameRate) (FrameRate)&lt;br /&gt;
#define MOT_RSV0(Reserved0) (Reserved0)&lt;br /&gt;
#define MOT_RSV1(Reserved1) (Reserved1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NNF_SUBMOTION_TYPE ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum NNF_SUBMOTION_TYPE : uint32_t&lt;br /&gt;
{&lt;br /&gt;
  // -- Frame Types --&lt;br /&gt;
&lt;br /&gt;
  // The frame index is stored as a float.&lt;br /&gt;
  NND_SMOTTYPE_FRAME_FLOAT = 1,&lt;br /&gt;
  // The frame index is stored as an int16_t.&lt;br /&gt;
  NND_SMOTTYPE_FRAME_SINT16 = 2,&lt;br /&gt;
  // Apply this mask to get the Frame Type.&lt;br /&gt;
  NND_SMOTTYPE_FRAME_MASK = 3,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // -- Angle Types --&lt;br /&gt;
&lt;br /&gt;
  // This value represents an angle as a float which represents&lt;br /&gt;
  // the rotation in radians. Use NNM_RADtoDEG from the&lt;br /&gt;
  // &amp;quot;Common Definitions&amp;quot; page to translate this value into a&lt;br /&gt;
  // float which represents the rotation in degrees.&lt;br /&gt;
  //&lt;br /&gt;
  // NOTE: This value is never used, to our knowledge, in any games.&lt;br /&gt;
  NND_SMOTTYPE_ANGLE_RADIAN = 4,&lt;br /&gt;
&lt;br /&gt;
  // This value represents an angle as a fixed-point int32_t.&lt;br /&gt;
  // Use NNM_A32toDEG() from the &amp;quot;Common Definitions&amp;quot; page to&lt;br /&gt;
  // translate this value into a float which represents the&lt;br /&gt;
  // rotation in degrees.&lt;br /&gt;
  NND_SMOTTYPE_ANGLE_ANGLE32 = 8,&lt;br /&gt;
&lt;br /&gt;
  // This value represents an angle as a fixed-point int16_t.&lt;br /&gt;
  // Use NNM_A16toDEG() from the &amp;quot;Common Definitions&amp;quot; page to&lt;br /&gt;
  // translate this value into a float which represents the&lt;br /&gt;
  // rotation in degrees.&lt;br /&gt;
  NND_SMOTTYPE_ANGLE_ANGLE16 = 0x10,&lt;br /&gt;
&lt;br /&gt;
  // Apply this mask to get the Angle Type.&lt;br /&gt;
  NND_SMOTTYPE_ANGLE_MASK = 0x1C,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // -- Value Types --&lt;br /&gt;
&lt;br /&gt;
  // Apply this mask to get the Value Type.&lt;br /&gt;
  NND_SMOTTYPE_VALUETYPE_MASK = 0xFFFFFF00U,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // -- Translation Value Types --&lt;br /&gt;
  // These value types can be applied to a node, a light, or a camera.&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_TRANSLATION_X = 0x100U,&lt;br /&gt;
  NND_SMOTTYPE_TRANSLATION_Y = 0x200U,&lt;br /&gt;
  NND_SMOTTYPE_TRANSLATION_Z = 0x400U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_TRANSLATION_XYZ = (&lt;br /&gt;
    NND_SMOTTYPE_TRANSLATION_X |&lt;br /&gt;
    NND_SMOTTYPE_TRANSLATION_Y |&lt;br /&gt;
    NND_SMOTTYPE_TRANSLATION_Z&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
  // Apply this mask to get the Translation Value Type.&lt;br /&gt;
  NND_SMOTTYPE_TRANSLATION_MASK = 0x700U,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // -- Rotation Value Types --&lt;br /&gt;
  // These value types can be applied to a node, a light, or a camera.&lt;br /&gt;
&lt;br /&gt;
  // The value affects the euler angles rotation along the X axis.&lt;br /&gt;
  NND_SMOTTYPE_ROTATION_X = 0x800U,&lt;br /&gt;
&lt;br /&gt;
  // The value affects the euler angles rotation along the Y axis.&lt;br /&gt;
  NND_SMOTTYPE_ROTATION_Y = 0x1000U,&lt;br /&gt;
&lt;br /&gt;
  // The value affects the euler angles rotation along the Z axis.&lt;br /&gt;
  NND_SMOTTYPE_ROTATION_Z = 0x2000U,&lt;br /&gt;
&lt;br /&gt;
  // The value affects the euler angles rotation along all axes.&lt;br /&gt;
  NND_SMOTTYPE_ROTATION_XYZ = (&lt;br /&gt;
    NND_SMOTTYPE_ROTATION_X |&lt;br /&gt;
    NND_SMOTTYPE_ROTATION_Y |&lt;br /&gt;
    NND_SMOTTYPE_ROTATION_Z&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
  // The value affects the quaternion rotation.&lt;br /&gt;
  NND_SMOTTYPE_QUATERNION = 0x4000U,&lt;br /&gt;
&lt;br /&gt;
  // Apply this mask to get the Rotation Value Type.&lt;br /&gt;
  NND_SMOTTYPE_ROTATION_MASK = 0x7800U,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // -- Scaling Value Types --&lt;br /&gt;
  // These value types can only be applied to a node.&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_SCALING_X = 0x8000U,&lt;br /&gt;
  NND_SMOTTYPE_SCALING_Y = 0x10000U,&lt;br /&gt;
  NND_SMOTTYPE_SCALING_Z = 0x20000U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_SCALING_XYZ = (&lt;br /&gt;
    NND_SMOTTYPE_SCALING_X |&lt;br /&gt;
    NND_SMOTTYPE_SCALING_Y |&lt;br /&gt;
    NND_SMOTTYPE_SCALING_Z&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
  // Apply this mask to get the Scaling Value Type.&lt;br /&gt;
  NND_SMOTTYPE_SCALING_MASK = 0x38000U,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // -- Other Node Value Types --&lt;br /&gt;
  // These value types can only be applied to a node.&lt;br /&gt;
&lt;br /&gt;
  // The value is uint32_t user data; its purpose depends on the game.&lt;br /&gt;
  NND_SMOTTYPE_USER_UINT32 = 0x40000U,&lt;br /&gt;
&lt;br /&gt;
  // The value is float user data; its purpose depends on the game.&lt;br /&gt;
  NND_SMOTTYPE_USER_FLOAT = 0x80000U,&lt;br /&gt;
&lt;br /&gt;
  // Apply this mask to get the User Data Value Type.&lt;br /&gt;
  NND_SMOTTYPE_USER_MASK = 0xC0000U,&lt;br /&gt;
&lt;br /&gt;
  // The value affects whether the node is hidden or not (it acts like a boolean).&lt;br /&gt;
  NND_SMOTTYPE_NODEHIDE = 0x100000U,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // -- Target Value Types --&lt;br /&gt;
  // These value types can be applied to a light, or a camera.&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_TARGET_X = 0x40000U,&lt;br /&gt;
  NND_SMOTTYPE_TARGET_Y = 0x80000U,&lt;br /&gt;
  NND_SMOTTYPE_TARGET_Z = 0x100000U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_TARGET_XYZ = (NND_SMOTTYPE_TARGET_X |&lt;br /&gt;
      NND_SMOTTYPE_TARGET_Y | NND_SMOTTYPE_TARGET_Z),&lt;br /&gt;
&lt;br /&gt;
  // Apply this mask to get the Target Value Type.&lt;br /&gt;
  NND_SMOTTYPE_TARGET_MASK = 0x1C0000U,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // -- Camera Value Types --&lt;br /&gt;
  // These value types can only be applied to a camera.&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_ROLL = 0x200000U,&lt;br /&gt;
  NND_SMOTTYPE_UPTARGET_X = 0x400000U,&lt;br /&gt;
  NND_SMOTTYPE_UPTARGET_Y = 0x800000U,&lt;br /&gt;
  NND_SMOTTYPE_UPTARGET_Z = 0x1000000U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_UPTARGET_XYZ = (NND_SMOTTYPE_UPTARGET_X |&lt;br /&gt;
      NND_SMOTTYPE_UPTARGET_Y | NND_SMOTTYPE_UPTARGET_Z),&lt;br /&gt;
&lt;br /&gt;
  // Apply this mask to get the Up Target Value Type.&lt;br /&gt;
  NND_SMOTTYPE_UPTARGET_MASK = 0x1C00000U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_UPVECTOR_X = 0x2000000U,&lt;br /&gt;
  NND_SMOTTYPE_UPVECTOR_Y = 0x4000000U,&lt;br /&gt;
  NND_SMOTTYPE_UPVECTOR_Z = 0x8000000U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_UPVECTOR_XYZ = (NND_SMOTTYPE_UPVECTOR_X |&lt;br /&gt;
      NND_SMOTTYPE_UPVECTOR_Y | NND_SMOTTYPE_UPVECTOR_Z),&lt;br /&gt;
&lt;br /&gt;
  // Apply this mask to get the Up Vector Value Type.&lt;br /&gt;
  NND_SMOTTYPE_UPVECTOR_MASK = 0xE000000U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_FOVY = 0x10000000U,&lt;br /&gt;
  NND_SMOTTYPE_ZNEAR = 0x20000000U,&lt;br /&gt;
  NND_SMOTTYPE_ZFAR = 0x40000000U,&lt;br /&gt;
  NND_SMOTTYPE_ASPECT = 0x80000000U,&lt;br /&gt;
&lt;br /&gt;
  // -- Light Value Types --&lt;br /&gt;
  // These values can only be applied to a light.&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_LIGHT_COLOR_R = 0x200000U,&lt;br /&gt;
  NND_SMOTTYPE_LIGHT_COLOR_G = 0x400000U,&lt;br /&gt;
  NND_SMOTTYPE_LIGHT_COLOR_B = 0x800000U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_LIGHT_COLOR_RGB = (NND_SMOTTYPE_LIGHT_COLOR_R |&lt;br /&gt;
      NND_SMOTTYPE_LIGHT_COLOR_G | NND_SMOTTYPE_LIGHT_COLOR_B),&lt;br /&gt;
&lt;br /&gt;
  // Apply this mask to get the Light Color Value Type.&lt;br /&gt;
  NND_SMOTTYPE_LIGHT_COLOR_MASK = 0xE00000U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_LIGHT_ALPHA = 0x1000000U,&lt;br /&gt;
  NND_SMOTTYPE_LIGHT_INTENSITY = 0x2000000U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_FALLOFF_START = 0x4000000U,&lt;br /&gt;
  NND_SMOTTYPE_FALLOFF_END = 0x8000000U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_INNER_ANGLE = 0x10000000U,&lt;br /&gt;
  NND_SMOTTYPE_OUTER_ANGLE = 0x20000000U,&lt;br /&gt;
  NND_SMOTTYPE_INNER_RANGE = 0x40000000U,&lt;br /&gt;
  NND_SMOTTYPE_OUTER_RANGE = 0x80000000U,&lt;br /&gt;
&lt;br /&gt;
  // -- Morph types --&lt;br /&gt;
  // These values can only be applied to a morph.&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_MORPH_WEIGHT = 0x1000000U,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // -- Material types --&lt;br /&gt;
  // These values can only be applied to a material.&lt;br /&gt;
&lt;br /&gt;
  // TODO&lt;br /&gt;
  NND_SMOTTYPE_HIDE = 0x100U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_DIFFUSE_R = 0x200U,&lt;br /&gt;
  NND_SMOTTYPE_DIFFUSE_G = 0x400U,&lt;br /&gt;
  NND_SMOTTYPE_DIFFUSE_B = 0x800U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_DIFFUSE_RGB = (NND_SMOTTYPE_DIFFUSE_R |&lt;br /&gt;
      NND_SMOTTYPE_DIFFUSE_G | NND_SMOTTYPE_DIFFUSE_B),&lt;br /&gt;
&lt;br /&gt;
  // Apply this mask to get the Diffuse Value Type.&lt;br /&gt;
  NND_SMOTTYPE_DIFFUSE_MASK = 0xE00U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_ALPHA = 0x1000U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_SPECULAR_R = 0x2000U,&lt;br /&gt;
  NND_SMOTTYPE_SPECULAR_G = 0x4000U,&lt;br /&gt;
  NND_SMOTTYPE_SPECULAR_B = 0x8000U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_SPECULAR_RGB = (NND_SMOTTYPE_SPECULAR_R |&lt;br /&gt;
      NND_SMOTTYPE_SPECULAR_G | NND_SMOTTYPE_SPECULAR_B),&lt;br /&gt;
&lt;br /&gt;
  // Apply this mask to get the Specular Value Type.&lt;br /&gt;
  NND_SMOTTYPE_SPECULAR_MASK = 0xE000U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_SPECULAR_LEVEL = 0x10000U,&lt;br /&gt;
  NND_SMOTTYPE_SPECULAR_GLOSS = 0x20000U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_AMBIENT_R = 0x40000U,&lt;br /&gt;
  NND_SMOTTYPE_AMBIENT_G = 0x80000U,&lt;br /&gt;
  NND_SMOTTYPE_AMBIENT_B = 0x100000U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_AMBIENT_RGB = (NND_SMOTTYPE_AMBIENT_R |&lt;br /&gt;
      NND_SMOTTYPE_AMBIENT_G | NND_SMOTTYPE_AMBIENT_B),&lt;br /&gt;
&lt;br /&gt;
  // Apply this mask to get the Ambient Value Type.&lt;br /&gt;
  NND_SMOTTYPE_AMBIENT_MASK = 0x1C0000U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_TEXTURE_INDEX = 0x200000U,&lt;br /&gt;
  NND_SMOTTYPE_TEXTURE_BLEND = 0x400000U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTTYPE_OFFSET_U = 0x800000U,&lt;br /&gt;
  NND_SMOTTYPE_OFFSET_V = 0x1000000U,&lt;br /&gt;
  NND_SMOTTYPE_OFFSET_UV = (NND_SMOTTYPE_OFFSET_U | NND_SMOTTYPE_OFFSET_V),&lt;br /&gt;
&lt;br /&gt;
  // Apply this mask to get the Offset Value Type.&lt;br /&gt;
  NND_SMOTTYPE_OFFSET_MASK = 0x1800000U,&lt;br /&gt;
&lt;br /&gt;
  // Apply this mask to get the Texture Value Type.&lt;br /&gt;
  NND_SMOTTYPE_TEXTURE_MASK = 0x1E00000U,&lt;br /&gt;
&lt;br /&gt;
  // TODO&lt;br /&gt;
  NND_SMOTTYPE_MATCLBK_USER = 0x2000000U&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NNF_SMOTIPTYPE ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum NNF_SMOTIPTYPE : uint32_t&lt;br /&gt;
{&lt;br /&gt;
  // -- Interpolation type --&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTIPTYPE_SPLINE = 1,&lt;br /&gt;
  NND_SMOTIPTYPE_LINEAR = 2,&lt;br /&gt;
  NND_SMOTIPTYPE_CONSTANT = 4,&lt;br /&gt;
  NND_SMOTIPTYPE_BEZIER = 16,&lt;br /&gt;
  NND_SMOTIPTYPE_SI_SPLINE = 32,&lt;br /&gt;
  NND_SMOTIPTYPE_TRIGGER = 64,&lt;br /&gt;
  NND_SMOTIPTYPE_QUAT_LERP = 512,&lt;br /&gt;
  NND_SMOTIPTYPE_QUAT_SLERP = 1024,&lt;br /&gt;
  NND_SMOTIPTYPE_QUAT_SQUAD = 3072,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTIPTYPE_IP_MASK = 3703,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // -- Repeat type --&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTIPTYPE_NOREPEAT = 65536U,&lt;br /&gt;
  NND_SMOTIPTYPE_CONSTREPEAT = 131072U,&lt;br /&gt;
  NND_SMOTIPTYPE_REPEAT = 262144U,&lt;br /&gt;
  NND_SMOTIPTYPE_MIRROR = 524288U,&lt;br /&gt;
  NND_SMOTIPTYPE_OFFSET = 1048576U,&lt;br /&gt;
&lt;br /&gt;
  NND_SMOTIPTYPE_REPEAT_MASK = 2031616U,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NNS_SUBMOTION ==&lt;br /&gt;
A submotion represents actual animation data, for some aspect of something (e.g. the X rotation of a node).&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct NNS_SUBMOTION&lt;br /&gt;
{&lt;br /&gt;
  // Types and flags.&lt;br /&gt;
  NNF_SUBMOTION_TYPE fType;&lt;br /&gt;
&lt;br /&gt;
  // Types and flags related to how this submotion is interpolated.&lt;br /&gt;
  NNF_SMOTIPTYPE fIPType;&lt;br /&gt;
&lt;br /&gt;
  union&lt;br /&gt;
  {&lt;br /&gt;
    // The index of the thing (node, material, etc.) being animated.&lt;br /&gt;
    int32_t Id;&lt;br /&gt;
&lt;br /&gt;
    // Sub-indices to something. I&amp;#039;m not sure exactly how this works&lt;br /&gt;
    // or how the game decides whether to use these vs. [Id] directly?&lt;br /&gt;
    struct&lt;br /&gt;
    {&lt;br /&gt;
      int16_t Id0;&lt;br /&gt;
      int16_t Id1;&lt;br /&gt;
    };&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  // The frame of the motion that this submotion starts playing at.&lt;br /&gt;
  float StartFrame;&lt;br /&gt;
&lt;br /&gt;
  // The frame of the motion that this submotion stops playing at.&lt;br /&gt;
  float EndFrame;&lt;br /&gt;
&lt;br /&gt;
  // The first frame that has a keyFrame assigned to it within this submotion.&lt;br /&gt;
  float StartKeyFrame;&lt;br /&gt;
&lt;br /&gt;
  // The last frame that has a keyFrame assigned to it within this submotion.&lt;br /&gt;
  float EndKeyFrame;&lt;br /&gt;
&lt;br /&gt;
  // The number of keyFrames in the [pKeyList] array.&lt;br /&gt;
  int32_t nKeyFrame;&lt;br /&gt;
&lt;br /&gt;
  // The size of each individual keyFrame within the [pKeyList] array. */&lt;br /&gt;
  int32_t KeySize;&lt;br /&gt;
&lt;br /&gt;
  // An array of keyFrames. The type of each individual&lt;br /&gt;
  // keyFrame varies based on the value of [fType].&lt;br /&gt;
  // Refer to the &amp;quot;Motion Keys&amp;quot; section below.&lt;br /&gt;
  void* pKeyList;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Macros used by Text-Form files:&lt;br /&gt;
#define SUBMOT(fType, fIPType, Id, StartFrame, EndFrame, StartKeyFrame, EndKeyFrame, nKeyFrame, KeySize, pKeyList) \&lt;br /&gt;
  { fType, fIPType, Id, StartFrame, EndFrame, StartKeyFrame, EndKeyFrame, nKeyFrame, KeySize, pKeyList }&lt;br /&gt;
&lt;br /&gt;
#define SMOT_TYPE(fType) (fType)&lt;br /&gt;
#define SMOT_IPTYPE(fIPType) (fIPType)&lt;br /&gt;
#define SMOT_ID(Id) (Id)&lt;br /&gt;
&lt;br /&gt;
#ifdef IS_PLATFORM_BIG_ENDIAN // Replace this with your own check&lt;br /&gt;
  #define SMOT_SUBID0_SUBID1(Id0, Id1) \&lt;br /&gt;
    (((Id0) &amp;lt;&amp;lt; 16) | (Id1))&lt;br /&gt;
#else&lt;br /&gt;
  #define SMOT_SUBID0_SUBID1(Id0, Id1) \&lt;br /&gt;
    (((Id1) &amp;lt;&amp;lt; 16) | (Id0))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#define SMOT_STARTFRAME(StartFrame) (StartFrame)&lt;br /&gt;
#define SMOT_ENDFRAME(EndFrame) (EndFrame)&lt;br /&gt;
#define SMOT_STARTKEY(StartKeyFrame) (StartKeyFrame)&lt;br /&gt;
#define SMOT_ENDKEY(EndKeyFrame) (EndKeyFrame)&lt;br /&gt;
#define SMOT_N_KEYFRAME(nKeyFrame) (nKeyFrame)&lt;br /&gt;
#define SMOT_KEYSIZE(KeySize) (KeySize)&lt;br /&gt;
#define SMOT_KEYLIST(pKeyList) (pKeyList)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Motion Keys ===&lt;br /&gt;
The &amp;lt;code&amp;gt;pKeyList&amp;lt;/code&amp;gt; field of the submotion points to an array of keyFrames.&lt;br /&gt;
&lt;br /&gt;
Each keyFrame is represented with a &amp;quot;motion key&amp;quot;, which is simply a struct that represents the transformation that should be made by this specific keyFrame.&lt;br /&gt;
&lt;br /&gt;
The type of the motion key struct that is used depends on the values of both the &amp;lt;code&amp;gt;fType&amp;lt;/code&amp;gt;, and the &amp;lt;code&amp;gt;fIPType&amp;lt;/code&amp;gt; fields in the submotion.&lt;br /&gt;
&lt;br /&gt;
As such, there are very many types of motion key structs.&lt;br /&gt;
&lt;br /&gt;
Not every game which uses Sega NN actually supports all of these types.&lt;br /&gt;
&lt;br /&gt;
Futher, not every possible combination of the &amp;lt;code&amp;gt;fType&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;fIPType&amp;lt;/code&amp;gt; fields even has a corresponding motion key struct for it; though most do.&lt;br /&gt;
&lt;br /&gt;
The combinations that do not have a corresponding motion key struct for them are not supported by any existing NN games at the time of writing, though they theoretically could be supported in future titles.&lt;br /&gt;
&lt;br /&gt;
What follows, is a list of every known supported motion key struct:&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  NNS_VECTOR2D In;&lt;br /&gt;
  NNS_VECTOR2D Out;&lt;br /&gt;
}&lt;br /&gt;
NNS_MOTION_BEZIER_HANDLE;&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  float In;&lt;br /&gt;
  float Out;&lt;br /&gt;
}&lt;br /&gt;
NNS_MOTION_SI_SPLINE_HANDLE;&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  float Frame;&lt;br /&gt;
  float Value;&lt;br /&gt;
}&lt;br /&gt;
NNS_MOTION_KEY_FLOAT,&lt;br /&gt;
NNS_MOTION_KEY_TRANSLATION_X,&lt;br /&gt;
NNS_MOTION_KEY_TRANSLATION_Y,&lt;br /&gt;
NNS_MOTION_KEY_TRANSLATION_Z,&lt;br /&gt;
NNS_MOTION_KEY_SCALING_X,&lt;br /&gt;
NNS_MOTION_KEY_SCALING_Y,&lt;br /&gt;
NNS_MOTION_KEY_SCALING_Z,&lt;br /&gt;
NNS_MOTION_KEY_USER_FLOAT,&lt;br /&gt;
NNS_MOTION_KEY_MORPH_WEIGHT,&lt;br /&gt;
NNS_MOTION_KEY_TARGET_X,&lt;br /&gt;
NNS_MOTION_KEY_TARGET_Y,&lt;br /&gt;
NNS_MOTION_KEY_TARGET_Z,&lt;br /&gt;
NNS_MOTION_KEY_UPTARGET_X,&lt;br /&gt;
NNS_MOTION_KEY_UPTARGET_Y,&lt;br /&gt;
NNS_MOTION_KEY_UPTARGET_Z,&lt;br /&gt;
NNS_MOTION_KEY_UPVECTOR_X,&lt;br /&gt;
NNS_MOTION_KEY_UPVECTOR_Y,&lt;br /&gt;
NNS_MOTION_KEY_UPVECTOR_Z,&lt;br /&gt;
NNS_MOTION_KEY_ZNEAR,&lt;br /&gt;
NNS_MOTION_KEY_ZFAR,&lt;br /&gt;
NNS_MOTION_KEY_ASPECT,&lt;br /&gt;
NNS_MOTION_KEY_DIFFUSE_R,&lt;br /&gt;
NNS_MOTION_KEY_DIFFUSE_G,&lt;br /&gt;
NNS_MOTION_KEY_DIFFUSE_B,&lt;br /&gt;
NNS_MOTION_KEY_ALPHA,&lt;br /&gt;
NNS_MOTION_KEY_SPECULAR_R,&lt;br /&gt;
NNS_MOTION_KEY_SPECULAR_G,&lt;br /&gt;
NNS_MOTION_KEY_SPECULAR_B,&lt;br /&gt;
NNS_MOTION_KEY_SPECULAR_LEVEL,&lt;br /&gt;
NNS_MOTION_KEY_SPECULAR_GLOSS,&lt;br /&gt;
NNS_MOTION_KEY_AMBIENT_R,&lt;br /&gt;
NNS_MOTION_KEY_AMBIENT_G,&lt;br /&gt;
NNS_MOTION_KEY_AMBIENT_B,&lt;br /&gt;
NNS_MOTION_KEY_TEXTURE_BLEND,&lt;br /&gt;
NNS_MOTION_KEY_OFFSET_U,&lt;br /&gt;
NNS_MOTION_KEY_OFFSET_V,&lt;br /&gt;
NNS_MOTION_KEY_LIGHT_COLOR_R,&lt;br /&gt;
NNS_MOTION_KEY_LIGHT_COLOR_G,&lt;br /&gt;
NNS_MOTION_KEY_LIGHT_COLOR_B,&lt;br /&gt;
NNS_MOTION_KEY_LIGHT_INTENSITY,&lt;br /&gt;
NNS_MOTION_KEY_FALLOFF_START,&lt;br /&gt;
NNS_MOTION_KEY_FALLOFF_END,&lt;br /&gt;
NNS_MOTION_KEY_INNER_RANGE,&lt;br /&gt;
NNS_MOTION_KEY_OUTER_RANGE;&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  float Frame;&lt;br /&gt;
  float Value;&lt;br /&gt;
  NNS_MOTION_BEZIER_HANDLE Bhandle;&lt;br /&gt;
}&lt;br /&gt;
NNS_MOTION_KEY_FLOAT_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_TRANSLATION_X_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_TRANSLATION_Y_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_TRANSLATION_Z_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_SCALING_X_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_SCALING_Y_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_SCALING_Z_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_USER_FLOAT_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_MORPH_WEIGHT_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_TARGET_X_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_TARGET_Y_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_TARGET_Z_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_UPTARGET_X_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_UPTARGET_Y_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_UPTARGET_Z_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_UPVECTOR_X_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_UPVECTOR_Y_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_UPVECTOR_Z_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_ZNEAR_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_ZFAR_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_ASPECT_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_DIFFUSE_R_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_DIFFUSE_G_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_DIFFUSE_B_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_ALPHA_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_SPECULAR_R_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_SPECULAR_G_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_SPECULAR_B_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_SPECULAR_LEVEL_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_SPECULAR_GLOSS_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_AMBIENT_R_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_AMBIENT_G_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_AMBIENT_B_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_TEXTURE_BLEND_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_OFFSET_U_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_OFFSET_V_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_LIGHT_COLOR_R_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_LIGHT_COLOR_G_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_LIGHT_COLOR_B_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_LIGHT_INTENSITY_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_FALLOFF_START_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_FALLOFF_END_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_INNER_RANGE_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_OUTER_RANGE_BEZIER;&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  float Frame;&lt;br /&gt;
  float Value;&lt;br /&gt;
  NNS_MOTION_SI_SPLINE_HANDLE Shandle;&lt;br /&gt;
}&lt;br /&gt;
NNS_MOTION_KEY_FLOAT_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_TRANSLATION_X_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_TRANSLATION_Y_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_TRANSLATION_Z_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_SCALING_X_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_SCALING_Y_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_SCALING_Z_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_USER_FLOAT_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_MORPH_WEIGHT_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_TARGET_X_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_TARGET_Y_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_TARGET_Z_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_UPTARGET_X_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_UPTARGET_Y_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_UPTARGET_Z_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_UPVECTOR_X_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_UPVECTOR_Y_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_UPVECTOR_Z_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_ZNEAR_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_ZFAR_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_ASPECT_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_DIFFUSE_R_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_DIFFUSE_G_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_DIFFUSE_B_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_ALPHA_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_SPECULAR_R_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_SPECULAR_G_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_SPECULAR_B_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_SPECULAR_LEVEL_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_SPECULAR_GLOSS_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_AMBIENT_R_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_AMBIENT_G_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_AMBIENT_B_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_TEXTURE_BLEND_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_OFFSET_U_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_OFFSET_V_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_LIGHT_COLOR_R_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_LIGHT_COLOR_G_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_LIGHT_COLOR_B_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_LIGHT_INTENSITY_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_FALLOFF_START_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_FALLOFF_END_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_INNER_RANGE_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_OUTER_RANGE_SI_SPLINE;&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  float Frame;&lt;br /&gt;
  NNS_TEXCOORD Value;&lt;br /&gt;
}&lt;br /&gt;
NNS_MOTION_KEY_TEXCOORD,&lt;br /&gt;
NNS_MOTION_KEY_OFFSET_UV;&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  float Frame;&lt;br /&gt;
  NNS_VECTOR Value;&lt;br /&gt;
}&lt;br /&gt;
NNS_MOTION_KEY_FLOAT3,&lt;br /&gt;
NNS_MOTION_KEY_TRANSLATION_XYZ,&lt;br /&gt;
NNS_MOTION_KEY_TARGET_XYZ,&lt;br /&gt;
NNS_MOTION_KEY_UPTARGET_XYZ,&lt;br /&gt;
NNS_MOTION_KEY_UPVECTOR_XYZ,&lt;br /&gt;
NNS_MOTION_KEY_SCALING_XYZ;&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  float Frame;&lt;br /&gt;
  NNS_RGB Value;&lt;br /&gt;
}&lt;br /&gt;
NNS_MOTION_KEY_COLOR_RGB,&lt;br /&gt;
NNS_MOTION_KEY_DIFFUSE_RGB,&lt;br /&gt;
NNS_MOTION_KEY_SPECULAR_RGB,&lt;br /&gt;
NNS_MOTION_KEY_AMBIENT_RGB,&lt;br /&gt;
NNS_MOTION_KEY_LIGHT_COLOR_RGB;&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  float Frame;&lt;br /&gt;
  NNS_QUATERNION Value;&lt;br /&gt;
}&lt;br /&gt;
NNS_MOTION_KEY_QUATERNION,&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_QUAT;&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  float Frame;&lt;br /&gt;
  int32_t Value;&lt;br /&gt;
}&lt;br /&gt;
NNS_MOTION_KEY_ANGLE32,&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_X,&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_Y,&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_Z,&lt;br /&gt;
NNS_MOTION_KEY_ROLL,&lt;br /&gt;
NNS_MOTION_KEY_FOVY,&lt;br /&gt;
NNS_MOTION_KEY_INNER_ANGLE,&lt;br /&gt;
NNS_MOTION_KEY_OUTER_ANGLE;&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  float Frame;&lt;br /&gt;
  int32_t Value;&lt;br /&gt;
  NNS_MOTION_BEZIER_HANDLE Bhandle;&lt;br /&gt;
}&lt;br /&gt;
NNS_MOTION_KEY_ANGLE32_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_X_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_Y_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_Z_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_ROLL_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_FOVY_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_INNER_ANGLE_BEZIER,&lt;br /&gt;
NNS_MOTION_KEY_OUTER_ANGLE_BEZIER;&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  float Frame;&lt;br /&gt;
  int32_t Value;&lt;br /&gt;
  NNS_MOTION_SI_SPLINE_HANDLE Shandle;&lt;br /&gt;
}&lt;br /&gt;
NNS_MOTION_KEY_ANGLE32_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_X_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_Y_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_Z_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_ROLL_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_FOVY_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_INNER_ANGLE_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_OUTER_ANGLE_SI_SPLINE;&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  float Frame;&lt;br /&gt;
  int32_t Value;&lt;br /&gt;
}&lt;br /&gt;
NNS_MOTION_KEY_SINT32,&lt;br /&gt;
NNS_MOTION_KEY_HIDE,&lt;br /&gt;
NNS_MOTION_KEY_TEXTURE_INDEX,&lt;br /&gt;
NNS_MOTION_KEY_NODEHIDE;&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  float Frame;&lt;br /&gt;
  uint32_t Value;&lt;br /&gt;
}&lt;br /&gt;
NNS_MOTION_KEY_UINT32,&lt;br /&gt;
NNS_MOTION_KEY_MATCLBK_USER,&lt;br /&gt;
NNS_MOTION_KEY_USER_UINT32;&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  float Frame;&lt;br /&gt;
  NNS_ROTATE_A32 Value;&lt;br /&gt;
}&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_A32,&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_XYZ;&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  int16_t Frame;&lt;br /&gt;
  int16_t Value;&lt;br /&gt;
}&lt;br /&gt;
NNS_MOTION_KEY_ANGLE16,&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_X_A16,&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_Y_A16,&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_Z_A16,&lt;br /&gt;
NNS_MOTION_KEY_ROLL_A16,&lt;br /&gt;
NNS_MOTION_KEY_FOVY_A16,&lt;br /&gt;
NNS_MOTION_KEY_INNER_ANGLE_A16,&lt;br /&gt;
NNS_MOTION_KEY_OUTER_ANGLE_A16;&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  int16_t Frame;&lt;br /&gt;
  int16_t Value;&lt;br /&gt;
  NNS_MOTION_SI_SPLINE_HANDLE Shandle;&lt;br /&gt;
}&lt;br /&gt;
NNS_MOTION_KEY_ANGLE16_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_X_A16_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_Y_A16_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_Z_A16_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_ROLL_A16_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_FOVY_A16_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_INNER_ANGLE_A16_SI_SPLINE,&lt;br /&gt;
NNS_MOTION_KEY_OUTER_ANGLE_A16_SI_SPLINE;&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  int16_t Frame;&lt;br /&gt;
  NNS_ROTATE_A16 Value;&lt;br /&gt;
}&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_A16,&lt;br /&gt;
NNS_MOTION_KEY_ROTATION_XYZ_A16;&lt;br /&gt;
&lt;br /&gt;
// Macros used by Text-Form files:&lt;br /&gt;
#define MOTKEY(Frame, Value) { Frame, Value }&lt;br /&gt;
#define MOTKEY_SISP(Frame, Value, Shandle) { Frame, Value, Shandle }&lt;br /&gt;
#define MOTKEY_BZR(Frame, Value, Bhandle) { Frame, Value, Bhandle }&lt;br /&gt;
&lt;br /&gt;
#define MFRM_FLT(Frame) (Frame)&lt;br /&gt;
#define MFRM_S16(Frame) (Frame)&lt;br /&gt;
&lt;br /&gt;
#define SISP_IN(deg) (deg)&lt;br /&gt;
#define SISP_OUT(deg) (deg)&lt;br /&gt;
#define SISP_IN_A32(deg) (NNM_DEGtoA32FLT(deg))&lt;br /&gt;
#define SISP_OUT_A32(deg) (NNM_DEGtoA32FLT(deg))&lt;br /&gt;
#define SISP_IN_A16(deg) (NNM_DEGtoA16FLT(deg))&lt;br /&gt;
#define SISP_OUT_A16(deg) (NNM_DEGtoA16FLT(deg))&lt;br /&gt;
&lt;br /&gt;
#define MHDL_SISP(In, Out) { In, Out }&lt;br /&gt;
&lt;br /&gt;
#define BZR_IN(x, y) { (x), (y) }&lt;br /&gt;
#define BZR_OUT(x, y) { (x), (y) }&lt;br /&gt;
#define BZR_IN_A32(x, deg) { (x), NNM_DEGtoA32FLT(deg) }&lt;br /&gt;
#define BZR_OUT_A32(x, deg) { (x), NNM_DEGtoA32FLT(deg) }&lt;br /&gt;
&lt;br /&gt;
#define MHDL_BZR(In, Out) { In, Out }&lt;br /&gt;
&lt;br /&gt;
#define MVAL_FLT(val) (val)&lt;br /&gt;
#define MVAL_FLT_2(x, y) { x, y }&lt;br /&gt;
#define MVAL_FLT_3(x, y, z) { x, y, z }&lt;br /&gt;
#define MVAL_FLT_4(x, y, z, w) { x, y, z, w }&lt;br /&gt;
#define MVAL_A32(deg) (NNM_DEGtoA32(deg))&lt;br /&gt;
#define MVAL_A32_3(x, y, z) { NNM_DEGtoA32(x), NNM_DEGtoA32(y), NNM_DEGtoA32(z) }&lt;br /&gt;
#define MVAL_S32(val) (val)&lt;br /&gt;
#define MVAL_S32_3(x, y, z) { x, y, z }&lt;br /&gt;
#define MVAL_A16(deg) (NNM_DEGtoA16(deg))&lt;br /&gt;
#define MVAL_A16_3(x, y, z) { NNM_DEGtoA16(x), NNM_DEGtoA16(y), NNM_DEGtoA16(z) }&lt;br /&gt;
#define MVAL_U32(val) (val)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>PTKay</name></author>
	</entry>
</feed>