import bpy

MeshConter = 0
for me in bpy.data.scenes[0].objects:
if(me.type == "MESH"):
MeshConter = MeshConter + 1


ff = "C:\\Users\\Maxim\\Desktop\\Blender_Game_Models\\Blender_Game_Models\\" + bpy.path.basename(bpy.context.blend_data.filepath) + ".txt"
out = open(ff, 'w')
out.write(bpy.path.basename(bpy.context.blend_data.filepath))
out.write(str(" Nombre de Mesh: ") + str(MeshConter))

def get_pose_bone_matrix(pose_bone):
local_matrix = pose_bone.matrix_channel.to_3x3()
if pose_bone.parent is None:
return local_matrix
else:
return pose_bone.parent.matrix_channel.to_3x3().inverted() @ local_matrix

for me in bpy.data.scenes[0].objects:
if(me.type == "MESH" and me.name[:2] != "BB"):

out.write(str("\n_____________________________________________________________________\n"))
conter = 0
for f in me.data.polygons:
conter = conter + 1
out.write(str(conter))
conter2 = 0
for obj in bpy.data.scenes[0].objects:
if(obj.type == "ARMATURE"):
armature = obj
conter2 = 0
for pose_bone in armature.pose.bones:
conter2 = conter2 + 1
out.write(" Triangles and " + str(conter2) + " Bones and Mesh name is: " + me.name + "\n________________________________________________________________________\n")

out.write(str(me.location.x))
out.write(str(" "))
out.write(str(me.location.y))
out.write(str(" "))
out.write(str(me.location.z))
out.write(str(" : Object Location\n______________________________________________________________________\n"))


me.rotation_mode = 'QUATERNION'
out.write(str(me.rotation_quaternion.w))
out.write(str(" "))
out.write(str(me.rotation_quaternion.x))
out.write(str(" "))
out.write(str(me.rotation_quaternion.y))
out.write(str(" "))
out.write(str(me.rotation_quaternion.z))
out.write(str(" : Object Quaternion(w,x,y,z)\n_____________________________________________________________________\n"))

out.write(str(me.scale.x))
out.write(str(" "))
out.write(str(me.scale.y))
out.write(str(" "))
out.write(str(me.scale.z))
out.write(str(" : Object Scaling\n______________________________________________________________________________\n"))

out.write(str("++++++++++++++++++++++++++++++++++++++++++++++ Vertex Coordinates ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"))

for f in me.data.polygons:
for i in f.loop_indices:
l = me.data.loops[i]
v = me.data.vertices[l.vertex_index]
out.write(str(v.co.x))
out.write(str(" "))
out.write(str(v.co.y))
out.write(str(" "))
out.write(str(v.co.z))
out.write(str(" \n"))

out.write(str("++++++++++++++++++++++++++++++++++++++++++++++ UV Coordinates ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"))

for f in me.data.polygons:
for i in f.loop_indices:
l = me.data.loops[i]
v = me.data.vertices[l.vertex_index]
for j,ul in enumerate(me.data.uv_layers):
checkUV = True
out.write(str(ul.data[l.index].uv.x))
out.write(str(" "))
out.write(str(ul.data[l.index].uv.y))
out.write(str("\n"))

out.write(str("++++++++++++++++++++++++++++++++++++++++++++++ Normals Coordinates ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"))

for f in me.data.polygons:
if(f.use_smooth):
for i in f.loop_indices:
l = me.data.loops[i]
v = me.data.vertices[l.vertex_index]
out.write(str(v.normal.x))
out.write(str(" "))
out.write(str(v.normal.y))
out.write(str(" "))
out.write(str(v.normal.z))
out.write(str("\n"))
else:
out.write(str(f.normal.x) + " ")
out.write(str(f.normal.y) + " ")
out.write(str(f.normal.z) + "\n")

out.write(str(f.normal.x) + " ")
out.write(str(f.normal.y) + " ")
out.write(str(f.normal.z) + "\n")

out.write(str(f.normal.x) + " ")
out.write(str(f.normal.y) + " ")
out.write(str(f.normal.z) + "\n")

out.write(str("++++++++++++++++++++++++++++++++++++++++++++++ Material Index ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"))

for f in me.data.polygons:
out.write(str(f.material_index) + "\n")


out.write(str("++++++++++++++++++++++++++++++++++++++++++++++ Textures ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"))


for f in me.data.materials:
out.write(str(f.node_tree.nodes[2].image.name) + " ")

out.write(str("\n++++++++++++++++++++++++++++++++++++++++++++++ Animation ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"))

out.write(str("++++++++++++++++++++++++++++++++++++++++++++++ Bones Weight ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"))

for f in me.data.polygons:
for i in f.loop_indices: # <-- python Range object with the proper indices already set
l = me.data.loops[i] # The loop entry this polygon point refers to
v = me.data.vertices[l.vertex_index] # The vertex data that loop entry refers to
for gg in v.groups:
out.write(str(gg.group))
out.write(str(" "))
out.write(str(gg.weight))
out.write(str(" "))
out.write(str("\n"))

out.write(str("++++++++++++++++++++++++++++++++++++++++++++++ Mech Animation Data ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"))



conter4 = 0
for sc in bpy.data.scenes:
conter4 = conter4 + 1

out.write(str("\nNumber of Animations: "))
out.write(str(conter4))
out.write(str(" Animation Mech\n"))

for sc in bpy.data.scenes:
conter2 = 0
for frame in range(sc.frame_end):
conter2 = conter2 + 1

out.write(str(str(conter2) + " Frames\n"))

armature = 0

arm_mat = 0

conter = 0

for obj in sc.objects:
if(obj.type == "ARMATURE"):
armature = obj
arm_mat = obj.matrix_world
out.write(str(armature.name))
out.write(str(" ::::::\n"))

if(conter4 > 0):
for frame in range(sc.frame_end):
sc.frame_set(frame)
bpy.data.scenes.update()

for pose_bone in armature.pose.bones:
out.write(str("Frames: "))
out.write(str(frame))
out.write(str(" Name: "))
out.write(str(pose_bone.name))
out.write(str(" Parent: "))
if(str(pose_bone.parent) != "None"): out.write(str(pose_bone.parent.name))
else: out.write(str(pose_bone.parent))
out.write(str(" Head: "))
out.write(str((pose_bone.head).x + armature.location.x / armature.scale.x))
out.write(str(" "))
out.write(str((pose_bone.head).y + armature.location.y / armature.scale.y))
out.write(str(" "))
out.write(str((pose_bone.head).z + armature.location.z / armature.scale.z))
out.write(str(" Tail: "))
out.write(str((pose_bone.tail).x))
out.write(str(" "))
out.write(str((pose_bone.tail).y))
out.write(str(" "))
out.write(str((pose_bone.tail).z))

pose_bone.rotation_mode = 'QUATERNION'
out.write(str(" Quaternion: "))
out.write(str((arm_mat @ pose_bone.matrix).to_quaternion().w))
out.write(str(" "))
out.write(str((arm_mat @ pose_bone.matrix).to_quaternion().x))
out.write(str(" "))
out.write(str((arm_mat @ pose_bone.matrix).to_quaternion().y))
out.write(str(" "))
out.write(str((arm_mat @ pose_bone.matrix).to_quaternion().z))
out.write(str(" World_Matrice: "))

pb = get_pose_bone_matrix(pose_bone)

out.write(str(((pb))[0][0]))
out.write(str(" "))
out.write(str(((pb))[0][1]))
out.write(str(" "))
out.write(str(((pb))[0][2]))
out.write(str(" "))
out.write(str((("0"))))
out.write(str(" "))

out.write(str(((pb))[1][0]))
out.write(str(" "))
out.write(str(((pb))[1][1]))
out.write(str(" "))
out.write(str(((pb))[1][2]))
out.write(str(" "))
out.write(str((("0"))))
out.write(str(" "))

out.write(str(((pb))[2][0]))
out.write(str(" "))
out.write(str(((pb))[2][1]))
out.write(str(" "))
out.write(str(((pb))[2][2]))
out.write(str(" "))
out.write(str((("0"))))
out.write(str(" "))

out.write(str((("0"))))
out.write(str(" "))
out.write(str((("0"))))
out.write(str(" "))
out.write(str((("0"))))
out.write(str(" "))
out.write(str((("1"))))
out.write(str(" "))

out.write(str(((pose_bone.matrix_channel.to_translation()))[0]))
out.write(str(" "))
out.write(str(((pose_bone.matrix_channel.to_translation()))[1]))
out.write(str(" "))
out.write(str(((pose_bone.matrix_channel.to_translation()))[2]))


out.write(str("\n"))




out.write(str("\n---------------------------------------------- End of Animation --------------------------------------------------------\n"))

for me in bpy.data.scenes[0].objects:
if(me.type == "MESH" and me.name[:2] == "BB"):

out.write(str("\n_____________________________________________________________________\n"))
conter = 0
for f in me.data.polygons:
conter = conter + 1
out.write(str(conter))
conter2 = 0

for obj in bpy.data.scenes[0].objects:
if(obj.type == "ARMATURE"):
armature = obj
conter2 = 0
for pose_bone in armature.pose.bones:
conter2 = conter2 + 1
out.write(" Triangles and " + str(conter2) + " Bones and Mesh name is: " + me.name + "\n________________________________________________________________________\n")

out.write(str(me.location.x))
out.write(str(" "))
out.write(str(me.location.y))
out.write(str(" "))
out.write(str(me.location.z))
out.write(str(" : Object Location\n______________________________________________________________________\n"))


me.rotation_mode = 'QUATERNION'
out.write(str(me.rotation_quaternion.w))
out.write(str(" "))
out.write(str(me.rotation_quaternion.x))
out.write(str(" "))
out.write(str(me.rotation_quaternion.y))
out.write(str(" "))
out.write(str(me.rotation_quaternion.z))
out.write(str(" : Object Quaternion(w,x,y,z)\n_____________________________________________________________________\n"))

out.write(str(me.scale.x))
out.write(str(" "))
out.write(str(me.scale.y))
out.write(str(" "))
out.write(str(me.scale.z))
out.write(str(" : Object Scaling\n______________________________________________________________________________\n"))

out.write(str("++++++++++++++++++++++++++++++++++++++++++++++ Vertex Coordinates ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"))

for f in me.data.polygons:
for i in f.loop_indices: # <-- python Range object with the proper indices already set
l = me.data.loops[i] # The loop entry this polygon point refers to
v = me.data.vertices[l.vertex_index] # The vertex data that loop entry refers to
out.write(str(v.co.x))
out.write(str(" "))
out.write(str(v.co.y))
out.write(str(" "))
out.write(str(v.co.z))
out.write(str(" \n"))



out.write(str("\n---------------------------------------------- End of File --------------------------------------------------------\n"))

out.close()