From 98f9c1063e82874f189abadf4cda667939c4eeea Mon Sep 17 00:00:00 2001
From: Chris Foster <cdbfoster@gmail.com>
Date: Sun, 24 Oct 2010 19:05:34 +0000
Subject: [PATCH] Whew, a lot of changes.  Ditched efforts to translate
 matrices/quaternions between systems and instead applied a root matrix at the
 beginning of the exported file.  Fixed nasty bug in Full Animation with
 armatures.  Fixed Verbose mode output formatting.  Fixed issue with animating
 parented objects.  Checked with revision 32681.  Now version 1.9.  Version
 2.0 if no new bugs are found.

---
 io_export_directx_x.py | 204 ++++++++++++++++++++---------------------
 1 file changed, 101 insertions(+), 103 deletions(-)

diff --git a/io_export_directx_x.py b/io_export_directx_x.py
index c19f72667..b4d321189 100644
--- a/io_export_directx_x.py
+++ b/io_export_directx_x.py
@@ -18,9 +18,9 @@
 bl_addon_info = {
     "name": "Export DirectX Model Format (.x)",
     "author": "Chris Foster (Kira Vakaan)",
-    "version": (1,6),
+    "version": (1,9),
     "blender": (2, 5, 3),
-    "api": 31847,
+    "api": 32681,
     "location": "File > Export",
     "description": "Export to the DirectX Model Format (.x)",
     "warning": "",
@@ -91,13 +91,13 @@ def LegalName(Name):
 def ExportDirectX(Config):
     print("----------\nExporting to {}".format(Config.FilePath))
     if Config.Verbose:
-        print("Opening File...", end=" ")
+        print("Opening File...")
     Config.File = open(Config.FilePath, "w")
     if Config.Verbose:
         print("Done")
 
     if Config.Verbose:
-        print("Generating Object list for export...", end=" ")
+        print("Generating Object list for export...")
     if Config.ExportMode == 1:
         Config.ExportList = [Object for Object in Config.context.scene.objects
                              if Object.type in ("ARMATURE", "EMPTY", "MESH")
@@ -111,20 +111,12 @@ def ExportDirectX(Config):
         print("Done")
 
     if Config.Verbose:
-        print("Setting up...", end=" ")
+        print("Setting up...")
     Config.SystemMatrix = Matrix()
     if Config.RotateX:
         Config.SystemMatrix *= Matrix.Rotation(radians(-90), 4, "X")
     if Config.CoordinateSystem == 1:
         Config.SystemMatrix *= Matrix.Scale(-1, 4, Vector((0, 1, 0)))
-    Config.InverseSystemMatrix = Config.SystemMatrix.copy().invert()
-    
-    #Used for animating rotations
-    Config.SystemQuaternion = Quaternion((1,0,0,0))
-    if Config.RotateX:
-        Config.SystemQuaternion = Matrix.Rotation(radians(-90), 3, "X").to_quat()
-    Config.InverseSystemQuaternion = Config.SystemQuaternion.copy().inverse()
-    Config.FlipZ = -1 if Config.CoordinateSystem == 1 else 1
 
     if Config.ExportAnimation:
         CurrentFrame = bpy.context.scene.frame_current
@@ -133,23 +125,32 @@ def ExportDirectX(Config):
         print("Done")
 
     if Config.Verbose:
-        print("Writing Header...", end=" ")
+        print("Writing Header...")
     WriteHeader(Config)
     if Config.Verbose:
         print("Done")
 
     Config.Whitespace = 0
+    if Config.Verbose:
+        print("Writing Root Frame...")
+    WriteRootFrame(Config)
+    if Config.Verbose:
+        print("Done")
+    
     Config.ObjectList = []
     if Config.Verbose:
         print("Writing Objects...")
     WriteObjects(Config, Config.ExportList)
     if Config.Verbose:
         print("Done")
+    
+    Config.Whitespace -= 1
+    Config.File.write("{}}} //End of Root Frame\n".format("  " * Config.Whitespace))
 
     if Config.ExportAnimation:
         if Config.IncludeFrameRate:
             if Config.Verbose:
-                print("Writing Frame Rate...", end=" ")
+                print("Writing Frame Rate...")
             Config.File.write("{}AnimTicksPerSecond {{\n".format("  " * Config.Whitespace))
             Config.Whitespace += 1
             Config.File.write("{}{};\n".format("  " * Config.Whitespace, int(bpy.context.scene.render.fps / bpy.context.scene.render.fps_base)))
@@ -212,6 +213,18 @@ template SkinWeights {\n\
   Matrix4x4 matrixOffset;\n\
 }\n\n")
 
+def WriteRootFrame(Config):
+    Config.File.write("{}Frame Root {{\n".format("  " * Config.Whitespace))
+    Config.Whitespace += 1
+    
+    Config.File.write("{}FrameTransformMatrix {{\n".format("  " * Config.Whitespace))
+    Config.Whitespace += 1
+    Config.File.write("{}{:9f},{:9f},{:9f},{:9f},\n".format("  " * Config.Whitespace, Config.SystemMatrix[0][0], Config.SystemMatrix[0][1], Config.SystemMatrix[0][2], Config.SystemMatrix[0][3]))
+    Config.File.write("{}{:9f},{:9f},{:9f},{:9f},\n".format("  " * Config.Whitespace, Config.SystemMatrix[1][0], Config.SystemMatrix[1][1], Config.SystemMatrix[1][2], Config.SystemMatrix[1][3]))
+    Config.File.write("{}{:9f},{:9f},{:9f},{:9f},\n".format("  " * Config.Whitespace, Config.SystemMatrix[2][0], Config.SystemMatrix[2][1], Config.SystemMatrix[2][2], Config.SystemMatrix[2][3]))
+    Config.File.write("{}{:9f},{:9f},{:9f},{:9f};;\n".format("  " * Config.Whitespace, Config.SystemMatrix[3][0], Config.SystemMatrix[3][1], Config.SystemMatrix[3][2], Config.SystemMatrix[3][3]))
+    Config.Whitespace -= 1
+    Config.File.write("{}}}\n".format("  " * Config.Whitespace))
 
 def WriteObjects(Config, ObjectList):
     Config.ObjectList += ObjectList
@@ -223,10 +236,10 @@ def WriteObjects(Config, ObjectList):
 
         Config.Whitespace += 1
         if Config.Verbose:
-            print("    Writing Local Matrix...", end=" ")
+            print("    Writing Local Matrix...")
         WriteLocalMatrix(Config, Object)
         if Config.Verbose:
-            print("Done")
+            print("    Done")
 
         if Config.ExportArmatures and Object.type == "ARMATURE":
             Armature = Object.data
@@ -246,7 +259,7 @@ def WriteObjects(Config, ObjectList):
 
         if Object.type == "MESH":
             if Config.Verbose:
-                print("    Generating Mesh...", end=" ")
+                print("    Generating Mesh...")
             if Config.ApplyModifiers:
                 if Config.ExportArmatures:
                     #Create a copy of the object and remove all armature modifiers so an unshaped
@@ -260,7 +273,7 @@ def WriteObjects(Config, ObjectList):
             else:
                 Mesh = Object.create_mesh(bpy.context.scene, False, "PREVIEW")
             if Config.Verbose:
-                print("Done")
+                print("    Done")
                 print("    Writing Mesh...")
             WriteMesh(Config, Object, Mesh)
             if Config.Verbose:
@@ -276,7 +289,7 @@ def WriteObjects(Config, ObjectList):
 
 
 def WriteLocalMatrix(Config, Object):
-    LocalMatrix = Config.SystemMatrix * Object.matrix_local * Config.InverseSystemMatrix
+    LocalMatrix = Object.matrix_local
 
     Config.File.write("{}FrameTransformMatrix {{\n".format("  " * Config.Whitespace))
     Config.Whitespace += 1
@@ -292,21 +305,19 @@ def WriteArmatureBones(Config, Object, ChildList):
     PoseBones = Object.pose.bones
     for Bone in ChildList:
         if Config.Verbose:
-            print("      Writing Bone: {}...".format(Bone.name), end=" ")
+            print("      Writing Bone: {}...".format(Bone.name))
         Config.File.write("{}Frame {} {{\n".format("  " * Config.Whitespace, LegalName(Object.name) + "_" + LegalName(Bone.name)))
         Config.Whitespace += 1
 
         PoseBone = PoseBones[Bone.name]
 
         if Bone.parent:
-            BoneMatrix = (PoseBone.parent.matrix *
-                          Matrix.Rotation(radians(-90), 4, "X")).invert()
+            BoneMatrix = PoseBone.parent.matrix.copy().invert()
         else:
             BoneMatrix = Matrix()
 
-        BoneMatrix *= PoseBone.matrix * Matrix.Rotation(radians(-90), 4, "X")
-        BoneMatrix = Config.SystemMatrix * BoneMatrix * Config.InverseSystemMatrix
-
+        BoneMatrix *= PoseBone.matrix
+        
         Config.File.write("{}FrameTransformMatrix {{\n".format("  " * Config.Whitespace))
         Config.Whitespace += 1
         Config.File.write("{}{:9f},{:9f},{:9f},{:9f},\n".format("  " * Config.Whitespace, BoneMatrix[0][0], BoneMatrix[0][1], BoneMatrix[0][2], BoneMatrix[0][3]))
@@ -317,7 +328,7 @@ def WriteArmatureBones(Config, Object, ChildList):
         Config.File.write("{}}}\n".format("  " * Config.Whitespace))
 
         if Config.Verbose:
-            print("Done")
+            print("      Done")
         WriteArmatureBones(Config, Object, Bone.children)
         Config.Whitespace -= 1
 
@@ -329,28 +340,28 @@ def WriteMesh(Config, Object, Mesh):
     Config.Whitespace += 1
 
     if Config.Verbose:
-        print("      Writing Mesh Vertices...", end=" ")
+        print("      Writing Mesh Vertices...")
     WriteMeshVertices(Config, Mesh)
     if Config.Verbose:
-        print("Done\n      Writing Mesh Normals...", end=" ")
+        print("      Done\n      Writing Mesh Normals...")
     WriteMeshNormals(Config, Mesh)
     if Config.Verbose:
-        print("Done\n      Writing Mesh Materials...", end=" ")
+        print("      Done\n      Writing Mesh Materials...")
     WriteMeshMaterials(Config, Mesh)
     if Config.Verbose:
-        print("Done")
+        print("      Done")
     if Mesh.uv_textures:
         if Config.Verbose:
-            print("      Writing Mesh UV Coordinates...", end=" ")
+            print("      Writing Mesh UV Coordinates...")
         WriteMeshUVCoordinates(Config, Mesh)
         if Config.Verbose:
-            print("Done")
+            print("      Done")
     if Config.ExportArmatures:
         if Config.Verbose:
-            print("      Writing Mesh Skin Weights...", end=" ")
+            print("      Writing Mesh Skin Weights...")
         WriteMeshSkinWeights(Config, Object, Mesh)
         if Config.Verbose:
-            print("Done")
+            print("      Done")
 
     Config.Whitespace -= 1
     Config.File.write("{}}} //End of {} Mesh\n".format("  " * Config.Whitespace, LegalName(Mesh.name)))
@@ -367,7 +378,7 @@ def WriteMeshVertices(Config, Mesh):
         if Config.CoordinateSystem == 1:
             Vertices = Vertices[::-1]
         for Vertex in [Mesh.vertices[Vertex] for Vertex in Vertices]:
-            Position = Config.SystemMatrix * Vertex.co
+            Position = Vertex.co
             Config.File.write("{}{:9f};{:9f};{:9f};".format("  " * Config.Whitespace, Position[0], Position[1], Position[2]))
             Index += 1
             if Index == VertexCount:
@@ -404,9 +415,9 @@ def WriteMeshNormals(Config, Mesh):
             Vertices = Vertices[::-1]
         for Vertex in [Mesh.vertices[Vertex] for Vertex in Vertices]:
             if Face.use_smooth:
-                Normal = Config.SystemMatrix * Vertex.normal
+                Normal = Vertex.normal
             else:
-                Normal = Config.SystemMatrix * Face.normal
+                Normal = Face.normal
             if Config.FlipNormals:
                 Normal = -Normal
             Config.File.write("{}{:9f};{:9f};{:9f};".format("  " * Config.Whitespace, Normal[0], Normal[1], Normal[2]))
@@ -614,12 +625,10 @@ def WriteMeshSkinWeights(Config, Object, Mesh):
             #  - Armature Space to Bone Space (The bone matrix needs to be rotated 90 degrees to align with Blender's world axes)
             #This way, when BoneMatrix is transformed by the bone's Frame matrix, the vertices will be in their final world position.
             
-            BoneMatrix = (RestBone.matrix_local * Matrix.Rotation(radians(-90), 4, "X")).invert()
+            BoneMatrix = RestBone.matrix_local.copy().invert()
             BoneMatrix *= ArmatureObject.matrix_world.copy().invert()
             BoneMatrix *= Object.matrix_world
-
-            BoneMatrix = Config.SystemMatrix * BoneMatrix * Config.InverseSystemMatrix
-
+            
             Config.File.write("{}{:9f},{:9f},{:9f},{:9f},\n".format("  " * Config.Whitespace, BoneMatrix[0][0], BoneMatrix[0][1], BoneMatrix[0][2], BoneMatrix[0][3]))
             Config.File.write("{}{:9f},{:9f},{:9f},{:9f},\n".format("  " * Config.Whitespace, BoneMatrix[1][0], BoneMatrix[1][1], BoneMatrix[1][2], BoneMatrix[1][3]))
             Config.File.write("{}{:9f},{:9f},{:9f},{:9f},\n".format("  " * Config.Whitespace, BoneMatrix[2][0], BoneMatrix[2][1], BoneMatrix[2][2], BoneMatrix[2][3]))
@@ -653,7 +662,7 @@ def WriteKeyedAnimationSet(Config):
 
                 #Position
                 if Config.Verbose:
-                    print("    Writing Position...", end=" ")
+                    print("    Writing Position...")
                 AllKeyframes = set()
                 for Index, FCurve in enumerate(PositionFCurves):
                     if FCurve:
@@ -674,21 +683,20 @@ def WriteKeyedAnimationSet(Config):
                         Position[0] = ((PositionFCurves[0][Keyframe] if Keyframe in PositionFCurves[0] else Object.location[0]) if PositionFCurves[0] else Object.location[0])
                         Position[1] = ((PositionFCurves[1][Keyframe] if Keyframe in PositionFCurves[1] else Object.location[1]) if PositionFCurves[1] else Object.location[1])
                         Position[2] = ((PositionFCurves[2][Keyframe] if Keyframe in PositionFCurves[2] else Object.location[2]) if PositionFCurves[2] else Object.location[2])
-                        Position = Config.SystemMatrix * Position
                         Config.File.write("{}{}{:9f},{:9f},{:9f};;\n".format("  " * Config.Whitespace, (str(Keyframe - bpy.context.scene.frame_start) + ";3;").ljust(8), Position[0], Position[1], Position[2]))
                 else:
                     Config.File.write("{}2;\n{}1;\n".format("  " * Config.Whitespace, "  " * Config.Whitespace))
                     bpy.context.scene.frame_set(bpy.context.scene.frame_start)
-                    Position = Config.SystemMatrix * Object.location
+                    Position = Object.matrix_local.translation_part()
                     Config.File.write("{}{}{:9f},{:9f},{:9f};;\n".format("  " * Config.Whitespace, ("0;3;").ljust(8), Position[0], Position[1], Position[2]))
                 Config.Whitespace -= 1
                 Config.File.write("{}}}\n".format("  " * Config.Whitespace))
                 if Config.Verbose:
-                    print("Done")
+                    print("    Done")
 
                 #Rotation
                 if Config.Verbose:
-                    print("    Writing Rotation...", end=" ")
+                    print("    Writing Rotation...")
                 AllKeyframes = set()
                 for Index, FCurve in enumerate(RotationFCurves):
                     if FCurve:
@@ -709,21 +717,21 @@ def WriteKeyedAnimationSet(Config):
                         Rotation[0] = ((RotationFCurves[0][Keyframe] if Keyframe in RotationFCurves[0] else Object.rotation_euler[0]) if RotationFCurves[0] else Object.rotation_euler[0])
                         Rotation[1] = ((RotationFCurves[1][Keyframe] if Keyframe in RotationFCurves[1] else Object.rotation_euler[1]) if RotationFCurves[1] else Object.rotation_euler[1])
                         Rotation[2] = ((RotationFCurves[2][Keyframe] if Keyframe in RotationFCurves[2] else Object.rotation_euler[2]) if RotationFCurves[2] else Object.rotation_euler[2])
-                        Rotation = (Config.SystemMatrix * (Rotation.to_matrix().to_4x4()) * Config.InverseSystemMatrix).to_quat()
+                        Rotation = Rotation.to_quat()
                         Config.File.write("{}{}{:9f},{:9f},{:9f},{:9f};;\n".format("  " * Config.Whitespace, (str(Keyframe - bpy.context.scene.frame_start) + ";4;").ljust(8), - Rotation[0], Rotation[1], Rotation[2], Rotation[3]))
                 else:
                     Config.File.write("{}0;\n{}1;\n".format("  " * Config.Whitespace, "  " * Config.Whitespace))
                     bpy.context.scene.frame_set(bpy.context.scene.frame_start)
-                    Rotation = (Config.SystemMatrix * (Object.rotation_euler.to_matrix().to_4x4()) * Config.InverseSystemMatrix).to_quat()
+                    Rotation = Object.rotation_euler.to_quat()
                     Config.File.write("{}{}{:9f},{:9f},{:9f},{:9f};;\n".format("  " * Config.Whitespace, ("0;4;").ljust(8), -Rotation[0], Rotation[1], Rotation[2], Rotation[3]))
                 Config.Whitespace -= 1
                 Config.File.write("{}}}\n".format("  " * Config.Whitespace))
                 if Config.Verbose:
-                    print("Done")
+                    print("    Done")
 
                 #Scale
                 if Config.Verbose:
-                    print("    Writing Scale...", end=" ")
+                    print("    Writing Scale...")
                 AllKeyframes = set()
                 for Index, FCurve in enumerate(ScaleFCurves):
                     if FCurve:
@@ -744,17 +752,16 @@ def WriteKeyedAnimationSet(Config):
                         Scale[0] = ((ScaleFCurves[0][Keyframe] if Keyframe in ScaleFCurves[0] else Object.scale[0]) if ScaleFCurves[0] else Object.scale[0])
                         Scale[1] = ((ScaleFCurves[1][Keyframe] if Keyframe in ScaleFCurves[1] else Object.scale[1]) if ScaleFCurves[1] else Object.scale[1])
                         Scale[2] = ((ScaleFCurves[2][Keyframe] if Keyframe in ScaleFCurves[2] else Object.scale[2]) if ScaleFCurves[2] else Object.scale[2])
-                        Scale = Config.SystemMatrix * Scale
                         Config.File.write("{}{}{:9f},{:9f},{:9f};;\n".format("  " * Config.Whitespace, (str(Keyframe - bpy.context.scene.frame_start) + ";3;").ljust(8), Scale[0], Scale[1], Scale[2]))
                 else:
                     Config.File.write("{}1;\n{}1;\n".format("  " * Config.Whitespace, "  " * Config.Whitespace))
                     bpy.context.scene.frame_set(bpy.context.scene.frame_start)
-                    Scale = Config.SystemMatrix * Object.scale
+                    Scale = Object.matrix_local.scale_part()
                     Config.File.write("{}{}{:9f},{:9f},{:9f};;\n".format("  " * Config.Whitespace, ("0;3;").ljust(8), Scale[0], Scale[1], Scale[2]))
                 Config.Whitespace -= 1
                 Config.File.write("{}}}\n".format("  " * Config.Whitespace))
                 if Config.Verbose:
-                    print("Done")
+                    print("    Done")
 
                 Config.Whitespace -= 1
                 Config.File.write("{}}}\n".format("  " * Config.Whitespace))
@@ -790,7 +797,7 @@ def WriteKeyedAnimationSet(Config):
 
                     #Position
                     if Config.Verbose:
-                        print("        Writing Position...", end=" ")
+                        print("        Writing Position...")
                     AllKeyframes = set()
                     for Index, FCurve in enumerate(PositionFCurves):
                         if FCurve:
@@ -810,23 +817,21 @@ def WriteKeyedAnimationSet(Config):
                         bpy.context.scene.frame_set(Keyframe)
                         
                         if Bone.parent:
-                            PoseMatrix = (Bone.parent.matrix * Matrix.Rotation(radians(-90), 4, "X")).invert()
+                            PoseMatrix = Bone.parent.matrix.copy().invert()
                         else:
                             PoseMatrix = Matrix()
-                        PoseMatrix *= Bone.matrix * Matrix.Rotation(radians(-90), 4, "X")
-                        
-                        PoseMatrix = Config.SystemMatrix * PoseMatrix * Config.InverseSystemMatrix
+                        PoseMatrix *= Bone.matrix
                         
                         Position = PoseMatrix.translation_part()
                         Config.File.write("{}{}{:9f},{:9f},{:9f};;\n".format("  " * Config.Whitespace, (str(Keyframe - bpy.context.scene.frame_start) + ";3;").ljust(8), Position[0], Position[1], Position[2]))
                     Config.Whitespace -= 1
                     Config.File.write("{}}}\n".format("  " * Config.Whitespace))
                     if Config.Verbose:
-                        print("Done")
+                        print("        Done")
 
                     #Rotation
                     if Config.Verbose:
-                        print("        Writing Rotation...", end=" ")
+                        print("        Writing Rotation...")
                     AllKeyframes = set()
                     for Index, FCurve in enumerate(RotationFCurves):
                         if FCurve:
@@ -846,23 +851,21 @@ def WriteKeyedAnimationSet(Config):
                         bpy.context.scene.frame_set(Keyframe)
                         
                         if Bone.parent:
-                            PoseMatrix = (Bone.parent.matrix * Matrix.Rotation(radians(-90), 4, "X")).invert()
+                            PoseMatrix = Bone.parent.matrix.copy().invert()
                         else:
                             PoseMatrix = Matrix()
-                        PoseMatrix *= Bone.matrix * Matrix.Rotation(radians(-90), 4, "X")
-                        
-                        PoseMatrix = Config.SystemMatrix * PoseMatrix * Config.InverseSystemMatrix
+                        PoseMatrix *= Bone.matrix
                         
                         Rotation = PoseMatrix.rotation_part().to_quat()
                         Config.File.write("{}{}{:9f},{:9f},{:9f},{:9f};;\n".format("  " * Config.Whitespace, (str(Keyframe - bpy.context.scene.frame_start) + ";4;").ljust(8), -Rotation[0], Rotation[1], Rotation[2], Rotation[3]))
                     Config.Whitespace -= 1
                     Config.File.write("{}}}\n".format("  " * Config.Whitespace))
                     if Config.Verbose:
-                        print("Done")
+                        print("        Done")
 
                     #Scale
                     if Config.Verbose:
-                        print("        Writing Scale...", end=" ")
+                        print("        Writing Scale...")
                     AllKeyframes = set()
                     for Index, FCurve in enumerate(ScaleFCurves):
                         if FCurve:
@@ -882,19 +885,17 @@ def WriteKeyedAnimationSet(Config):
                         bpy.context.scene.frame_set(Keyframe)
                         
                         if Bone.parent:
-                            PoseMatrix = (Bone.parent.matrix * Matrix.Rotation(radians(-90), 4, "X")).invert()
+                            PoseMatrix = Bone.parent.matrix.copy().invert()
                         else:
                             PoseMatrix = Matrix()
-                        PoseMatrix *= Bone.matrix * Matrix.Rotation(radians(-90), 4, "X")
-                        
-                        PoseMatrix = Config.SystemMatrix * PoseMatrix * Config.InverseSystemMatrix
+                        PoseMatrix *= Bone.matrix
                         
                         Scale = PoseMatrix.scale_part()
                         Config.File.write("{}{}{:9f},{:9f},{:9f};;\n".format("  " * Config.Whitespace, (str(Keyframe - bpy.context.scene.frame_start) + ";3;").ljust(8), Scale[0], Scale[1], Scale[2]))
                     Config.Whitespace -= 1
                     Config.File.write("{}}}\n".format("  " * Config.Whitespace))
                     if Config.Verbose:
-                        print("Done")
+                        print("        Done")
 
                     Config.Whitespace -= 1
                     Config.File.write("{}}}\n".format("  " * Config.Whitespace))
@@ -907,8 +908,7 @@ def WriteKeyedAnimationSet(Config):
 
     Config.Whitespace -= 1
     Config.File.write("{}}} //End of AnimationSet\n".format("  " * Config.Whitespace))
-    
-    
+
 def WriteFullAnimationSet(Config):
     Config.File.write("{}AnimationSet {{\n".format("  " * Config.Whitespace))
     Config.Whitespace += 1
@@ -925,48 +925,48 @@ def WriteFullAnimationSet(Config):
         
         #Position
         if Config.Verbose:
-            print("    Writing Position...", end=" ")
+            print("    Writing Position...")
         Config.File.write("{}AnimationKey {{ //Position\n".format("  " * Config.Whitespace))
         Config.Whitespace += 1
         Config.File.write("{}2;\n{}{};\n".format("  " * Config.Whitespace, "  " * Config.Whitespace, KeyframeCount))
         for Frame in range(0, KeyframeCount):
             bpy.context.scene.frame_set(Frame + bpy.context.scene.frame_start)
-            Position = Config.SystemMatrix * Object.location
+            Position = Object.matrix_local.translation_part()
             Config.File.write("{}{}{:9f},{:9f},{:9f};;\n".format("  " * Config.Whitespace, (str(Frame) + ";3;").ljust(8), Position[0], Position[1], Position[2]))
         Config.Whitespace -= 1
         Config.File.write("{}}}\n".format("  " * Config.Whitespace))
         if Config.Verbose:
-            print("Done")
+            print("    Done")
         
         #Rotation
         if Config.Verbose:
-            print("    Writing Rotation...", end=" ")
+            print("    Writing Rotation...")
         Config.File.write("{}AnimationKey {{ //Rotation\n".format("  " * Config.Whitespace))
         Config.Whitespace += 1
         Config.File.write("{}0;\n{}{};\n".format("  " * Config.Whitespace, "  " * Config.Whitespace, KeyframeCount))
         for Frame in range(0, KeyframeCount):
             bpy.context.scene.frame_set(Frame + bpy.context.scene.frame_start)
-            Rotation = Config.SystemQuaternion.cross(Object.rotation_euler.to_quat().cross(Config.InverseSystemQuaternion))
-            Config.File.write("{}{}{:9f},{:9f},{:9f},{:9f};;\n".format("  " * Config.Whitespace, (str(Frame) + ";4;").ljust(8), Rotation[0], Rotation[1], Rotation[2], Config.FlipZ * Rotation[3]))
+            Rotation = Object.rotation_euler.to_quat()
+            Config.File.write("{}{}{:9f},{:9f},{:9f},{:9f};;\n".format("  " * Config.Whitespace, (str(Frame) + ";4;").ljust(8), -Rotation[0], Rotation[1], Rotation[2], Rotation[3]))
         Config.Whitespace -= 1
         Config.File.write("{}}}\n".format("  " * Config.Whitespace))
         if Config.Verbose:
-            print("Done")
+            print("    Done")
         
         #Scale
         if Config.Verbose:
-            print("    Writing Scale...", end=" ")
+            print("    Writing Scale...")
         Config.File.write("{}AnimationKey {{ //Scale\n".format("  " * Config.Whitespace))
         Config.Whitespace += 1
         Config.File.write("{}1;\n{}{};\n".format("  " * Config.Whitespace, "  " * Config.Whitespace, KeyframeCount))
         for Frame in range(0, KeyframeCount):
             bpy.context.scene.frame_set(Frame + bpy.context.scene.frame_start)
-            Scale = Config.SystemMatrix * Object.scale
+            Scale = Object.matrix_local.scale_part()
             Config.File.write("{}{}{:9f},{:9f},{:9f};;\n".format("  " * Config.Whitespace, (str(Frame) + ";3;").ljust(8), Scale[0], Scale[1], Scale[2]))
         Config.Whitespace -= 1
         Config.File.write("{}}}\n".format("  " * Config.Whitespace))
         if Config.Verbose:
-            print("Done")
+            print("    Done")
         
         Config.Whitespace -= 1
         Config.File.write("{}}}\n".format("  " * Config.Whitespace))
@@ -975,6 +975,7 @@ def WriteFullAnimationSet(Config):
             if Config.Verbose:
                 print("    Writing Armature Bone Animation Data...")
             PoseBones = Object.pose.bones
+            Bones = Object.data.bones
             for Bone in PoseBones:
                 if Config.Verbose:
                     print("      Writing Bone: {}...".format(Bone.name))
@@ -985,7 +986,7 @@ def WriteFullAnimationSet(Config):
                 
                 #Position
                 if Config.Verbose:
-                    print("        Writing Position...", end=" ")
+                    print("        Writing Position...")
                 Config.File.write("{}AnimationKey {{ //Position\n".format("  " * Config.Whitespace))
                 Config.Whitespace += 1
                 Config.File.write("{}2;\n{}{};\n".format("  " * Config.Whitespace, "  " * Config.Whitespace, KeyframeCount))
@@ -993,39 +994,38 @@ def WriteFullAnimationSet(Config):
                     bpy.context.scene.frame_set(Frame + bpy.context.scene.frame_start)
                     
                     if Bone.parent:
-                        PoseMatrix = (Bone.parent.matrix * Matrix.Rotation(radians(-90), 4, "X")).invert()
+                        PoseMatrix = Bone.parent.matrix.copy().invert()
                     else:
                         PoseMatrix = Matrix()
-                    PoseMatrix *= Bone.matrix * Matrix.Rotation(radians(-90), 4, "X")
-                    
-                    PoseMatrix = Config.SystemMatrix * PoseMatrix * Config.InverseSystemMatrix
+                    PoseMatrix *= Bone.matrix
                     
                     Position = PoseMatrix.translation_part()
                     Config.File.write("{}{}{:9f},{:9f},{:9f};;\n".format("  " * Config.Whitespace, (str(Frame) + ";3;").ljust(8), Position[0], Position[1], Position[2]))
                 Config.Whitespace -= 1
                 Config.File.write("{}}}\n".format("  " * Config.Whitespace))
                 if Config.Verbose:
-                    print("Done")
+                    print("        Done")
                 
                 #Rotation
                 if Config.Verbose:
-                    print("        Writing Rotation...", end=" ")
+                    print("        Writing Rotation...")
                 Config.File.write("{}AnimationKey {{ //Rotation\n".format("  " * Config.Whitespace))
                 Config.Whitespace += 1
                 Config.File.write("{}0;\n{}{};\n".format("  " * Config.Whitespace, "  " * Config.Whitespace, KeyframeCount))
                 for Frame in range(0, KeyframeCount):
                     bpy.context.scene.frame_set(Frame + bpy.context.scene.frame_start)
-                    #Whew! I'm sure this could be simplified.
-                    Rotation = Config.SystemQuaternion.cross(Matrix.Rotation(radians(90), 4, "X").to_quat().cross(Bone.rotation_quaternion.cross(Matrix.Rotation(radians(-90), 4, "X").to_quat().cross(Config.InverseSystemQuaternion))))
-                    Config.File.write("{}{}{:9f},{:9f},{:9f},{:9f};;\n".format("  " * Config.Whitespace, (str(Frame) + ";4;").ljust(8), Rotation[0], Rotation[1], Rotation[2], Config.FlipZ * Rotation[3]))
+                    
+                    Rotation = Bones[Bone.name].matrix.to_quat() * Bone.rotation_quaternion
+                    
+                    Config.File.write("{}{}{:9f},{:9f},{:9f},{:9f};;\n".format("  " * Config.Whitespace, (str(Frame) + ";4;").ljust(8), -Rotation[0], Rotation[1], Rotation[2], Rotation[3]))
                 Config.Whitespace -= 1
                 Config.File.write("{}}}\n".format("  " * Config.Whitespace))
                 if Config.Verbose:
-                    print("Done")
+                    print("        Done")
                 
                 #Scale
                 if Config.Verbose:
-                    print("        Writing Scale...", end=" ")
+                    print("        Writing Scale...")
                 Config.File.write("{}AnimationKey {{ //Scale\n".format("  " * Config.Whitespace, KeyframeCount))
                 Config.Whitespace += 1
                 Config.File.write("{}1;\n{}{};\n".format("  " * Config.Whitespace, "  " * Config.Whitespace, KeyframeCount))
@@ -1033,19 +1033,17 @@ def WriteFullAnimationSet(Config):
                     bpy.context.scene.frame_set(Frame + bpy.context.scene.frame_start)
                     
                     if Bone.parent:
-                        PoseMatrix = (Bone.parent.matrix * Matrix.Rotation(radians(-90), 4, "X")).invert()
+                        PoseMatrix = Bone.parent.matrix.copy().invert()
                     else:
                         PoseMatrix = Matrix()
-                    PoseMatrix *= Bone.matrix * Matrix.Rotation(radians(-90), 4, "X")
-                    
-                    PoseMatrix = Config.SystemMatrix * PoseMatrix * Config.InverseSystemMatrix
+                    PoseMatrix *= Bone.matrix
                     
                     Scale = PoseMatrix.scale_part()
                     Config.File.write("{}{}{:9f},{:9f},{:9f};;\n".format("  " * Config.Whitespace, (str(Frame) + ";3;").ljust(8), Scale[0], Scale[1], Scale[2])) 
                 Config.Whitespace -= 1
                 Config.File.write("{}}}\n".format("  " * Config.Whitespace))
                 if Config.Verbose:
-                    print("Done")
+                    print("        Done")
                 
                 Config.Whitespace -= 1
                 Config.File.write("{}}}\n".format("  " * Config.Whitespace))
@@ -1062,7 +1060,7 @@ def WriteFullAnimationSet(Config):
 
 def CloseFile(Config):
     if Config.Verbose:
-        print("Closing File...", end=" ")
+        print("Closing File...")
     Config.File.close()
     if Config.Verbose:
         print("Done")
@@ -1149,4 +1147,4 @@ def unregister():
 
 
 if __name__ == "__main__":
-    register()
+    register()
\ No newline at end of file
-- 
GitLab