Files
3dequalizer-scripts/xg_reconstruct_tool.py

93 lines
3.5 KiB
Python

# 3DE4.script.hide: true
# 3DE4.script.startup: false
#
# Giovanni Di Grezia 2016
# http://www.xgiovio.com
#
import tde4
def operations (del_non_keyframes = False, triangulate = False, reelin = False, distortion = False , deform = False, inside_only = False):
cam = tde4.getCurrentCamera()
current_point_group = tde4.getCurrentPGroup()
selected_points = tde4.getPointList (current_point_group,1)
playback = tde4.getCameraPlaybackRange(cam)
firstframe = playback[0]
lastframe = playback[1]
if del_non_keyframes :
for point in selected_points :
k_pos = []
for frame in range (firstframe, lastframe + 1):
point_status = tde4.getPointStatus2D(current_point_group,point,cam,frame)
if point_status == "POINT_KEYFRAME" or point_status == "POINT_KEYFRAME_END":
pos = tde4.getPointPosition2D(current_point_group,point,cam,frame)
k_pos.append([frame,[ pos[0], pos[1] ] ])
tde4.deletePointCurve2D (current_point_group,point,cam)
for i in k_pos :
tde4.setPointPosition2D(current_point_group,point,cam,i[0],i[1])
if triangulate :
if len(k_pos) >= 2:
pos3d = tde4.calcPointPosition3D(current_point_group,point,cam)
tde4.setPointCalcPosition3D(current_point_group,point,pos3d)
tde4.setPointCalculated3D(current_point_group,point,1)
tde4.setPointCalculated3DStatus(current_point_group,point,"TRIANGULATED")
if reelin :
points_to_deform = {}
for frame in range (firstframe, lastframe + 1):
if distortion:
pos = tde4.calcPointBackProjection2D(current_point_group,point,cam,frame,1)
else:
pos = tde4.calcPointBackProjection2D(current_point_group,point,cam,frame,0)
if not deform:
if inside_only :
if frame >= k_pos[0][0] and frame <= k_pos[-1][0]:
tde4.setPointPosition2D(current_point_group,point,cam,frame,pos)
else:
tde4.setPointPosition2D(current_point_group,point,cam,frame,pos)
else:
points_to_deform[frame] = pos
if deform:
#update k_pos with offset from reelincurve
for i in k_pos:
reel_in_x = points_to_deform[i[0]][0]
reel_in_y = points_to_deform[i[0]][1]
k_pos_x = i[1][0]
k_pos_y = i[1][1]
offset_x = k_pos_x - reel_in_x
offset_y = k_pos_y - reel_in_y
i[1] = [offset_x,offset_y]
#extend keyframes to reelin range
k_pos_extended = []
if k_pos[0][0] != firstframe and not inside_only:
k_pos_extended.append([firstframe,k_pos[0][1]])
for i in k_pos:
k_pos_extended.append(i)
if k_pos[-1][0] != lastframe and not inside_only:
k_pos_extended.append([lastframe,k_pos[-1][1]])
for i in range(len(k_pos_extended) - 1):
f0 = k_pos_extended[i][0]
f1 = k_pos_extended[i+1][0]
xo0 = k_pos_extended[i][1][0]
yo0 = k_pos_extended[i][1][1]
xo1 = k_pos_extended[i+1][1][0]
yo1 = k_pos_extended[i+1][1][1]
# linear deform step
for f in range(f0, f1):
xoI = (xo0 + ((f - f0) * ((xo1 - xo0) / (f1 - f0))))
yoI = (yo0 + ((f - f0) * ((yo1 - yo0) / (f1 - f0))))
reelin_curve_x = points_to_deform[f][0]
reelin_curve_y = points_to_deform[f][1]
tde4.setPointPosition2D(current_point_group,point,cam,f,[reelin_curve_x + xoI, reelin_curve_y + yoI ] )
#lastkeyframe
reelin_curve_x = points_to_deform[f1][0]
reelin_curve_y = points_to_deform[f1][1]
tde4.setPointPosition2D(current_point_group,point,cam,f1,[reelin_curve_x + xo1, reelin_curve_y + yo1 ] )