|
|
|
|
@ -38,124 +38,150 @@ class AFX_Track_Exporter:
|
|
|
|
|
name_start = file_path.find(file_name)
|
|
|
|
|
path = file_path[0:name_start]
|
|
|
|
|
return path
|
|
|
|
|
|
|
|
|
|
def write_afx_keyframe_header(self, data, type_index):
|
|
|
|
|
#print("WRITE_AFX_KEYFRAME_HEADER Data: ",data)
|
|
|
|
|
t = AFXtx.strings["header_types"][type_index]
|
|
|
|
|
clip = bpy.context.space_data.clip
|
|
|
|
|
scene = bpy.context.scene
|
|
|
|
|
fps = scene.render.fps
|
|
|
|
|
source_aspect = clip.display_aspect[0]/clip.display_aspect[1]
|
|
|
|
|
comp_aspect = scene.render.pixel_aspect_x/scene.render.pixel_aspect_y
|
|
|
|
|
|
|
|
|
|
if t == "main":
|
|
|
|
|
header = AFXtx.strings["main"]+"\n\n\t"+AFXtx.strings["units"]+"\t"+str(fps)+"\n"
|
|
|
|
|
header = header + "\t"+AFXtx.strings["width"]+"\t"+str(clip.size[0])+"\n"
|
|
|
|
|
header = header + "\t"+AFXtx.strings["height"]+"\t"+str(clip.size[1])+"\n"
|
|
|
|
|
header = header + "\t"+AFXtx.strings["source_aspect"]+"\t"+str(source_aspect)+"\n"
|
|
|
|
|
header = header + "\t"+AFXtx.strings["comp_aspect"]+"\t"+str(comp_aspect)+"\n\n"
|
|
|
|
|
elif t == "pos":
|
|
|
|
|
header = AFXtx.strings["position"]+"\n\t"+AFXtx.strings["position_units"]+"\n"
|
|
|
|
|
elif t == "rot":
|
|
|
|
|
header = AFXtx.strings["rotation"]+"\n\t"+AFXtx.strings["rotation_units"]+"\n"
|
|
|
|
|
elif t == "sca":
|
|
|
|
|
header = AFXtx.strings["scale"]+"\n\t"+AFXtx.strings["scale_units"]+"\n"
|
|
|
|
|
elif t == "end":
|
|
|
|
|
header = "\n"+AFXtx.strings["end"]
|
|
|
|
|
|
|
|
|
|
#print("HEADER: ", data)
|
|
|
|
|
data = str(data) + header
|
|
|
|
|
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
#file.write(header)
|
|
|
|
|
|
|
|
|
|
AFXtx = AFX_Track_Exporter()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def write_afx_keyframe_header(file, type_index):
|
|
|
|
|
|
|
|
|
|
t = AFXtx.strings["header_types"][type_index]
|
|
|
|
|
clip = bpy.context.space_data.clip
|
|
|
|
|
scene = bpy.context.scene
|
|
|
|
|
fps = scene.render.fps
|
|
|
|
|
source_aspect = clip.display_aspect[0]/clip.display_aspect[1]
|
|
|
|
|
comp_aspect = scene.render.pixel_aspect_x/scene.render.pixel_aspect_y
|
|
|
|
|
|
|
|
|
|
if t == "main":
|
|
|
|
|
header = AFXtx.strings["main"]+"\n\n\t"+AFXtx.strings["units"]+"\t"+str(fps)+"\n"
|
|
|
|
|
header = header + "\t"+AFXtx.strings["width"]+"\t"+str(clip.size[0])+"\n"
|
|
|
|
|
header = header + "\t"+AFXtx.strings["height"]+"\t"+str(clip.size[1])+"\n"
|
|
|
|
|
header = header + "\t"+AFXtx.strings["source_aspect"]+"\t"+str(source_aspect)+"\n"
|
|
|
|
|
header = header + "\t"+AFXtx.strings["comp_aspect"]+"\t"+str(comp_aspect)+"\n\n"
|
|
|
|
|
elif t == "pos":
|
|
|
|
|
header = AFXtx.strings["position"]+"\n\t"+AFXtx.strings["position_units"]+"\n"
|
|
|
|
|
elif t == "rot":
|
|
|
|
|
header = AFXtx.strings["rotation"]+"\n\t"+AFXtx.strings["rotation_units"]+"\n"
|
|
|
|
|
elif t == "sca":
|
|
|
|
|
header = AFXtx.strings["scale"]+"\n\t"+AFXtx.strings["scale_units"]+"\n"
|
|
|
|
|
elif t == "end":
|
|
|
|
|
header = "\n"+AFXtx.strings["end"]
|
|
|
|
|
|
|
|
|
|
file.write(header)
|
|
|
|
|
def write_afx_cp_keyframe_header(self, data, type_index, corner):
|
|
|
|
|
#print("WRITE_AFX_CP_KEYFRAME_HEADER Data: ",data)
|
|
|
|
|
|
|
|
|
|
t = AFXtx.strings["header_types"][type_index]
|
|
|
|
|
if t == "c_pin":
|
|
|
|
|
header = AFXtx.strings["corner_pin"]+"\t"+corner+"\n\t"+AFXtx.strings["corner_pin_units"]+"\n"
|
|
|
|
|
|
|
|
|
|
data = data + header
|
|
|
|
|
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
#file.write(header)
|
|
|
|
|
|
|
|
|
|
def calc_pos_from_corners(self, corners):
|
|
|
|
|
sumX = 0.0
|
|
|
|
|
sumY = 0.0
|
|
|
|
|
for i in range(4):
|
|
|
|
|
sumX += corners[i][0]
|
|
|
|
|
sumY += corners[i][1]
|
|
|
|
|
x = sumX/4
|
|
|
|
|
y = 1-(sumY/4) ## Y down
|
|
|
|
|
return [x,y]
|
|
|
|
|
|
|
|
|
|
def write_afx_cp_keyframe_header(file, type_index, corner):
|
|
|
|
|
|
|
|
|
|
t = AFXtx.strings["header_types"][type_index]
|
|
|
|
|
if t == "c_pin":
|
|
|
|
|
header = AFXtx.strings["corner_pin"]+"\t"+corner+"\n\t"+AFXtx.strings["corner_pin_units"]+"\n"
|
|
|
|
|
|
|
|
|
|
file.write(header)
|
|
|
|
|
def write_afx_pos_keyframe_header(self, data):
|
|
|
|
|
#print("WRITE_AFX_POS_KEYFRAME_HEADER Data: ",data)
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def calc_pos_from_corners(corners):
|
|
|
|
|
sumX = 0.0
|
|
|
|
|
sumY = 0.0
|
|
|
|
|
for i in range(4):
|
|
|
|
|
sumX += corners[i][0]
|
|
|
|
|
sumY += corners[i][1]
|
|
|
|
|
x = sumX/4
|
|
|
|
|
y = 1-(sumY/4) ## Y down
|
|
|
|
|
return [x,y]
|
|
|
|
|
def writeRawMarkers(self, data):
|
|
|
|
|
#print("WRITERAWMARKERS Data: ",data)
|
|
|
|
|
for frame in plane_track.markers:
|
|
|
|
|
#print(dir(frame))
|
|
|
|
|
for current_corner in range(4): ## the corners are stored ina float4 0 = Lower Left, 1 = Lower Right, 2 = Upper Right, 3 = Upper Left)
|
|
|
|
|
for current_component in range(2): ## the location of the corner are stored in a float2 x,y
|
|
|
|
|
|
|
|
|
|
current_point = frame.corners[current_corner][current_component]
|
|
|
|
|
|
|
|
|
|
def write_afx_pos_keyframe_header(file):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def writeRawMarkers(file):
|
|
|
|
|
for frame in plane_track.markers:
|
|
|
|
|
print(dir(frame))
|
|
|
|
|
for current_corner in range(4): ## the corners are stored ina float4 0 = Lower Left, 1 = Lower Right, 2 = Upper Right, 3 = Upper Left)
|
|
|
|
|
for current_component in range(2): ## the location of the corner are stored in a float2 x,y
|
|
|
|
|
|
|
|
|
|
current_point = frame.corners[current_corner][current_component]
|
|
|
|
|
data = data + " "
|
|
|
|
|
data = data + "\n"
|
|
|
|
|
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
def write_pos_data(self, data):
|
|
|
|
|
#print("WRITE_POS Data: ",data)
|
|
|
|
|
for marker in range(len(plane_track.markers)):
|
|
|
|
|
n_format = "{0:.3f}"
|
|
|
|
|
size = clip.size
|
|
|
|
|
frame = plane_track.markers[marker].frame
|
|
|
|
|
pos = calc_pos_from_corners(plane_track.markers[marker].corners)
|
|
|
|
|
x = str(n_format.format(pos[0]*clip.size[0]))
|
|
|
|
|
y = str(n_format.format(pos[1]*clip.size[1]))
|
|
|
|
|
z = "0"
|
|
|
|
|
line = "\t"+str(frame)+"\t"+x+"\t"+y+"\t"+"0"+"\n"
|
|
|
|
|
|
|
|
|
|
data = data + line
|
|
|
|
|
data = data + "\n"
|
|
|
|
|
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
file.write(" ")
|
|
|
|
|
file.write("\n")
|
|
|
|
|
file.close()
|
|
|
|
|
|
|
|
|
|
def write_pos_data(file):
|
|
|
|
|
for marker in range(len(plane_track.markers)):
|
|
|
|
|
def write_cp_data(self, data, plane_track):
|
|
|
|
|
|
|
|
|
|
clip = bpy.context.space_data.clip
|
|
|
|
|
n_format = "{0:.3f}"
|
|
|
|
|
size = clip.size
|
|
|
|
|
frame = plane_track.markers[marker].frame
|
|
|
|
|
pos = calc_pos_from_corners(plane_track.markers[marker].corners)
|
|
|
|
|
x = str(n_format.format(pos[0]*clip.size[0]))
|
|
|
|
|
y = str(n_format.format(pos[1]*clip.size[1]))
|
|
|
|
|
z = "0"
|
|
|
|
|
line = "\t"+str(frame)+"\t"+x+"\t"+y+"\t"+"0"+"\n"
|
|
|
|
|
file.write(line)
|
|
|
|
|
file.write("\n")
|
|
|
|
|
for corner in range(4):
|
|
|
|
|
|
|
|
|
|
def write_cp_data(file, plane_track):
|
|
|
|
|
clip = bpy.context.space_data.clip
|
|
|
|
|
n_format = "{0:.3f}"
|
|
|
|
|
for corner in range(4):
|
|
|
|
|
data = data + AFXtx.write_afx_cp_keyframe_header(data,4,AFXtx.strings["corner_names"][corner])
|
|
|
|
|
|
|
|
|
|
write_afx_cp_keyframe_header(file,4,AFXtx.strings["corner_names"][corner])
|
|
|
|
|
for marker in range(len(plane_track.markers)):
|
|
|
|
|
frame = plane_track.markers[marker].frame
|
|
|
|
|
x = str(n_format.format(plane_track.markers[marker].corners[corner][0]*clip.size[0]))
|
|
|
|
|
y = str(n_format.format((1-plane_track.markers[marker].corners[corner][1])*clip.size[1]))
|
|
|
|
|
line = "\t"+str(frame)+"\t"+x+"\t"+y+"\n"
|
|
|
|
|
|
|
|
|
|
data = data +line
|
|
|
|
|
data = data + "\n"
|
|
|
|
|
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
def write_pos_from_single_track(self, data,track):
|
|
|
|
|
#print("WRITE_POS_FROM_SINGLE_TRACK Data: ",data)
|
|
|
|
|
for marker in range(len(track.markers)):
|
|
|
|
|
n_format = "{0:.3f}"
|
|
|
|
|
clip = bpy.context.space_data.clip
|
|
|
|
|
size = clip.size
|
|
|
|
|
frame = track.markers[marker].frame
|
|
|
|
|
pos = track.markers[marker].co
|
|
|
|
|
x = str(n_format.format(pos[0]*clip.size[0]))
|
|
|
|
|
y = str(n_format.format((1-pos[1])*clip.size[1]))
|
|
|
|
|
z = "0"
|
|
|
|
|
line = "\t"+str(frame)+"\t"+x+"\t"+y+"\t"+"0"+"\n"
|
|
|
|
|
|
|
|
|
|
data = data +line
|
|
|
|
|
data = data + "\n"
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
for marker in range(len(plane_track.markers)):
|
|
|
|
|
frame = plane_track.markers[marker].frame
|
|
|
|
|
x = str(n_format.format(plane_track.markers[marker].corners[corner][0]*clip.size[0]))
|
|
|
|
|
y = str(n_format.format((1-plane_track.markers[marker].corners[corner][1])*clip.size[1]))
|
|
|
|
|
line = "\t"+str(frame)+"\t"+x+"\t"+y+"\n"
|
|
|
|
|
file.write(line)
|
|
|
|
|
file.write("\n")
|
|
|
|
|
|
|
|
|
|
def write_pos_from_single_track(file,track):
|
|
|
|
|
for marker in range(len(track.markers)):
|
|
|
|
|
def write_cp_data_from_track(self,data):
|
|
|
|
|
#print("WRITE_CP_DATA_FROM_TRACK Data: ",data)
|
|
|
|
|
n_format = "{0:.3f}"
|
|
|
|
|
clip = bpy.context.space_data.clip
|
|
|
|
|
size = clip.size
|
|
|
|
|
frame = track.markers[marker].frame
|
|
|
|
|
pos = track.markers[marker].co
|
|
|
|
|
x = str(n_format.format(pos[0]*clip.size[0]))
|
|
|
|
|
y = str(n_format.format((1-pos[1])*clip.size[1]))
|
|
|
|
|
z = "0"
|
|
|
|
|
line = "\t"+str(frame)+"\t"+x+"\t"+y+"\t"+"0"+"\n"
|
|
|
|
|
file.write(line)
|
|
|
|
|
file.write("\n")
|
|
|
|
|
for corner in range(4):
|
|
|
|
|
|
|
|
|
|
AFXtx.write_afx_cp_keyframe_header(data,4,AFXtx.strings["corner_names"][corner])
|
|
|
|
|
|
|
|
|
|
for marker in range(len(track.markers)):
|
|
|
|
|
frame = track.markers[marker].frame
|
|
|
|
|
x = str(n_format.format((track.markers[marker].co[0]+track.markers[marker].pattern_corners[corner][0])*clip.size[0]))
|
|
|
|
|
y = str(n_format.format((1-(track.markers[marker].co[1]+track.markers[marker].pattern_corners[corner][1]))*clip.size[1]))
|
|
|
|
|
line = "\t"+str(frame)+"\t"+x+"\t"+y+"\n"
|
|
|
|
|
|
|
|
|
|
data = data +line
|
|
|
|
|
data = data + "\n"
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
def write_cp_data_from_track(file):
|
|
|
|
|
n_format = "{0:.3f}"
|
|
|
|
|
for corner in range(4):
|
|
|
|
|
|
|
|
|
|
write_afx_cp_keyframe_header(file,4,AFXtx.strings["corner_names"][corner])
|
|
|
|
|
|
|
|
|
|
for marker in range(len(track.markers)):
|
|
|
|
|
frame = track.markers[marker].frame
|
|
|
|
|
x = str(n_format.format((track.markers[marker].co[0]+track.markers[marker].pattern_corners[corner][0])*clip.size[0]))
|
|
|
|
|
y = str(n_format.format((1-(track.markers[marker].co[1]+track.markers[marker].pattern_corners[corner][1]))*clip.size[1]))
|
|
|
|
|
line = "\t"+str(frame)+"\t"+x+"\t"+y+"\n"
|
|
|
|
|
file.write(line)
|
|
|
|
|
file.write("\n")
|
|
|
|
|
AFXtx = AFX_Track_Exporter()
|
|
|
|
|
|
|
|
|
|
class TrackerExportPanel(bpy.types.Panel):
|
|
|
|
|
"""Creates a Panel in the Object properties window"""
|
|
|
|
|
@ -187,34 +213,45 @@ class TrackerExportPanel(bpy.types.Panel):
|
|
|
|
|
layout.label(text="Select a track or a plane Track to export")
|
|
|
|
|
|
|
|
|
|
def init_file():
|
|
|
|
|
path = AFXtx.getFilePath()
|
|
|
|
|
file=open(path+"plane_tracks2.txt","w")
|
|
|
|
|
write_afx_keyframe_header(file,0)
|
|
|
|
|
return file
|
|
|
|
|
data = ""
|
|
|
|
|
#path = AFXtx.getFilePath()
|
|
|
|
|
#file=open(path+"plane_tracks2.txt","w")
|
|
|
|
|
data = data + AFXtx.write_afx_keyframe_header(data,0)
|
|
|
|
|
#return file
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
def finalize_file(file):
|
|
|
|
|
write_afx_keyframe_header(file,6)
|
|
|
|
|
file.close()
|
|
|
|
|
def finalize_file(data):
|
|
|
|
|
#print("FINALIZE DATA: ", data)
|
|
|
|
|
data = data + AFXtx.write_afx_keyframe_header(data,6)
|
|
|
|
|
return data
|
|
|
|
|
#file.close()
|
|
|
|
|
|
|
|
|
|
def export_track(context):
|
|
|
|
|
|
|
|
|
|
clip = bpy.context.space_data.clip
|
|
|
|
|
active_track = clip.tracking.tracks.active
|
|
|
|
|
txt_data = ""
|
|
|
|
|
fp = init_file()
|
|
|
|
|
data = init_file()
|
|
|
|
|
|
|
|
|
|
write_afx_keyframe_header(fp,1)
|
|
|
|
|
write_pos_from_single_track(fp,active_track)
|
|
|
|
|
finalize_file(fp)
|
|
|
|
|
data = data + AFXtx.write_afx_keyframe_header(data,1)
|
|
|
|
|
|
|
|
|
|
data = data + AFXtx.write_pos_from_single_track(data,active_track)
|
|
|
|
|
|
|
|
|
|
data = finalize_file(data)
|
|
|
|
|
|
|
|
|
|
bpy.context.window_manager.clipboard = data
|
|
|
|
|
#print("FINAL DATA: \n\n", data)
|
|
|
|
|
|
|
|
|
|
def export_plane_track(context):
|
|
|
|
|
|
|
|
|
|
clip = bpy.context.space_data.clip
|
|
|
|
|
active_plane_track = clip.tracking.plane_tracks.active
|
|
|
|
|
fp = init_file()
|
|
|
|
|
write_afx_keyframe_header(fp,1)
|
|
|
|
|
write_cp_data(fp,active_plane_track)
|
|
|
|
|
finalize_file(fp)
|
|
|
|
|
data = init_file()
|
|
|
|
|
#data = AFXtx.write_afx_keyframe_header(data,1)
|
|
|
|
|
data = AFXtx.write_cp_data(data,active_plane_track)
|
|
|
|
|
data = finalize_file(data)
|
|
|
|
|
|
|
|
|
|
bpy.context.window_manager.clipboard = data
|
|
|
|
|
#print("FINAL DATA: \n\n", data)
|
|
|
|
|
|
|
|
|
|
class ExportTrack(bpy.types.Operator):
|
|
|
|
|
"""Tooltip"""
|
|
|
|
|
@ -254,4 +291,4 @@ def unregister():
|
|
|
|
|
bpy.utils.unregister_class(ExportPlaneTrack)
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
register()
|
|
|
|
|
register()
|