Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2011-11-07 16:55:18 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2011-11-07 16:55:18 +0400
commit27d42c63d9b507b1771ed5a7923c389c719b877b (patch)
tree8dd4ca61e197a7053633f62b4a5d8091957724c4 /release
parente122dc0748f6a4d77b236e26beba93e2a9a36bf0 (diff)
Camera tracking integration
=========================== Commiting camera tracking integration gsoc project into trunk. This commit includes: - Bundled version of libmv library (with some changes against official repo, re-sync with libmv repo a bit later) - New datatype ID called MovieClip which is optimized to work with movie clips (both of movie files and image sequences) and doing camera/motion tracking operations. - New editor called Clip Editor which is currently used for motion/tracking stuff only, but which can be easily extended to work with masks too. This editor supports: * Loading movie files/image sequences * Build proxies with different size for loaded movie clip, also supports building undistorted proxies to increase speed of playback in undistorted mode. * Manual lens distortion mode calibration using grid and grease pencil * Supervised 2D tracking using two different algorithms KLT and SAD. * Basic algorithm for feature detection * Camera motion solving. scene orientation - New constraints to "link" scene objects with solved motions from clip: * Follow Track (make object follow 2D motion of track with given name or parent object to reconstructed 3D position of track) * Camera Solver to make camera moving in the same way as reconstructed camera This commit NOT includes changes from tomato branch: - New nodes (they'll be commited as separated patch) - Automatic image offset guessing for image input node and image editor (need to do more tests and gather more feedback) - Code cleanup in libmv-capi. It's not so critical cleanup, just increasing readability and understanadability of code. Better to make this chaneg when Keir will finish his current patch. More details about this project can be found on this page: http://wiki.blender.org/index.php/User:Nazg-gul/GSoC-2011 Further development of small features would be done in trunk, bigger/experimental features would first be implemented in tomato branch.
Diffstat (limited to 'release')
-rw-r--r--release/datafiles/blender_icons.pngbin214916 -> 216116 bytes
-rw-r--r--release/scripts/modules/bpy_extras/keyconfig_utils.py4
-rw-r--r--release/scripts/presets/tracking_camera/Blender.py10
-rw-r--r--release/scripts/presets/tracking_camera/Canon_1100D.py10
-rw-r--r--release/scripts/presets/tracking_camera/Canon_1D.py10
-rw-r--r--release/scripts/presets/tracking_camera/Canon_1DS.py10
-rw-r--r--release/scripts/presets/tracking_camera/Canon_500D.py10
-rw-r--r--release/scripts/presets/tracking_camera/Canon_550D.py10
-rw-r--r--release/scripts/presets/tracking_camera/Canon_5D.py10
-rw-r--r--release/scripts/presets/tracking_camera/Canon_600D.py10
-rw-r--r--release/scripts/presets/tracking_camera/Canon_60D.py10
-rw-r--r--release/scripts/presets/tracking_camera/Canon_7D.py10
-rw-r--r--release/scripts/presets/tracking_camera/Nikon_D300S.py10
-rw-r--r--release/scripts/presets/tracking_camera/Nikon_D3100.py10
-rw-r--r--release/scripts/presets/tracking_camera/Nikon_D35.py10
-rw-r--r--release/scripts/presets/tracking_camera/Nikon_D5000.py10
-rw-r--r--release/scripts/presets/tracking_camera/Nikon_D5100.py10
-rw-r--r--release/scripts/presets/tracking_camera/Nikon_D7000.py10
-rw-r--r--release/scripts/presets/tracking_camera/Nikon_D90.py10
-rw-r--r--release/scripts/presets/tracking_camera/Red_Epic.py10
-rw-r--r--release/scripts/presets/tracking_camera/Red_One_2K.py10
-rw-r--r--release/scripts/presets/tracking_camera/Red_One_3K.py10
-rw-r--r--release/scripts/presets/tracking_camera/Red_One_4K.py10
-rw-r--r--release/scripts/presets/tracking_track_color/default.py5
-rw-r--r--release/scripts/presets/tracking_track_color/far_plane.py5
-rw-r--r--release/scripts/presets/tracking_track_color/near_plane.py5
-rw-r--r--release/scripts/startup/bl_operators/__init__.py1
-rw-r--r--release/scripts/startup/bl_operators/clip.py318
-rw-r--r--release/scripts/startup/bl_operators/presets.py41
-rw-r--r--release/scripts/startup/bl_ui/__init__.py1
-rw-r--r--release/scripts/startup/bl_ui/properties_object_constraint.py21
-rw-r--r--release/scripts/startup/bl_ui/properties_scene.py10
-rw-r--r--release/scripts/startup/bl_ui/space_clip.py885
-rw-r--r--release/scripts/startup/bl_ui/space_time.py1
-rw-r--r--release/scripts/startup/bl_ui/space_view3d.py46
35 files changed, 1549 insertions, 4 deletions
diff --git a/release/datafiles/blender_icons.png b/release/datafiles/blender_icons.png
index a68a1f8394c..c309ad11da2 100644
--- a/release/datafiles/blender_icons.png
+++ b/release/datafiles/blender_icons.png
Binary files differ
diff --git a/release/scripts/modules/bpy_extras/keyconfig_utils.py b/release/scripts/modules/bpy_extras/keyconfig_utils.py
index 6eb19c0ff05..fab6886b314 100644
--- a/release/scripts/modules/bpy_extras/keyconfig_utils.py
+++ b/release/scripts/modules/bpy_extras/keyconfig_utils.py
@@ -92,6 +92,10 @@ KM_HIERARCHY = [
('Script', 'SCRIPTS_WINDOW', 'WINDOW', []),
('Text', 'TEXT_EDITOR', 'WINDOW', []),
('Console', 'CONSOLE', 'WINDOW', []),
+ ('Clip', 'CLIP_EDITOR', 'WINDOW', [
+ ('Clip Editor', 'CLIP_EDITOR', 'WINDOW', []),
+ ('Clip Graph Editor', 'CLIP_EDITOR', 'WINDOW', []),
+ ]),
('View3D Gesture Circle', 'EMPTY', 'WINDOW', []),
('Gesture Border', 'EMPTY', 'WINDOW', []),
diff --git a/release/scripts/presets/tracking_camera/Blender.py b/release/scripts/presets/tracking_camera/Blender.py
new file mode 100644
index 00000000000..507cedac4fc
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Blender.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 32.0
+camera.units = 'MILLIMETERS'
+camera.focal_length = 35.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Canon_1100D.py b/release/scripts/presets/tracking_camera/Canon_1100D.py
new file mode 100644
index 00000000000..7ea78412f40
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Canon_1100D.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 22.2
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Canon_1D.py b/release/scripts/presets/tracking_camera/Canon_1D.py
new file mode 100644
index 00000000000..89590d3cc19
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Canon_1D.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 27.9
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Canon_1DS.py b/release/scripts/presets/tracking_camera/Canon_1DS.py
new file mode 100644
index 00000000000..7d9b6c8b390
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Canon_1DS.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 36.0
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Canon_500D.py b/release/scripts/presets/tracking_camera/Canon_500D.py
new file mode 100644
index 00000000000..3dd66c5b609
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Canon_500D.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 22.3
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Canon_550D.py b/release/scripts/presets/tracking_camera/Canon_550D.py
new file mode 100644
index 00000000000..3dd66c5b609
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Canon_550D.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 22.3
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Canon_5D.py b/release/scripts/presets/tracking_camera/Canon_5D.py
new file mode 100644
index 00000000000..7d9b6c8b390
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Canon_5D.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 36.0
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Canon_600D.py b/release/scripts/presets/tracking_camera/Canon_600D.py
new file mode 100644
index 00000000000..3dd66c5b609
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Canon_600D.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 22.3
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Canon_60D.py b/release/scripts/presets/tracking_camera/Canon_60D.py
new file mode 100644
index 00000000000..3dd66c5b609
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Canon_60D.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 22.3
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Canon_7D.py b/release/scripts/presets/tracking_camera/Canon_7D.py
new file mode 100644
index 00000000000..3dd66c5b609
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Canon_7D.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 22.3
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Nikon_D300S.py b/release/scripts/presets/tracking_camera/Nikon_D300S.py
new file mode 100644
index 00000000000..8db89189cd7
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Nikon_D300S.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 23.6
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Nikon_D3100.py b/release/scripts/presets/tracking_camera/Nikon_D3100.py
new file mode 100644
index 00000000000..a112dd22dd2
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Nikon_D3100.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 23.1
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Nikon_D35.py b/release/scripts/presets/tracking_camera/Nikon_D35.py
new file mode 100644
index 00000000000..7d9b6c8b390
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Nikon_D35.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 36.0
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Nikon_D5000.py b/release/scripts/presets/tracking_camera/Nikon_D5000.py
new file mode 100644
index 00000000000..8db89189cd7
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Nikon_D5000.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 23.6
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Nikon_D5100.py b/release/scripts/presets/tracking_camera/Nikon_D5100.py
new file mode 100644
index 00000000000..8db89189cd7
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Nikon_D5100.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 23.6
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Nikon_D7000.py b/release/scripts/presets/tracking_camera/Nikon_D7000.py
new file mode 100644
index 00000000000..8db89189cd7
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Nikon_D7000.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 23.6
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Nikon_D90.py b/release/scripts/presets/tracking_camera/Nikon_D90.py
new file mode 100644
index 00000000000..8db89189cd7
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Nikon_D90.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 23.6
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Red_Epic.py b/release/scripts/presets/tracking_camera/Red_Epic.py
new file mode 100644
index 00000000000..913b507d296
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Red_Epic.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 30.0
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Red_One_2K.py b/release/scripts/presets/tracking_camera/Red_One_2K.py
new file mode 100644
index 00000000000..0a52b377959
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Red_One_2K.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 11.1
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Red_One_3K.py b/release/scripts/presets/tracking_camera/Red_One_3K.py
new file mode 100644
index 00000000000..88c232bb944
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Red_One_3K.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 16.65
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_camera/Red_One_4K.py b/release/scripts/presets/tracking_camera/Red_One_4K.py
new file mode 100644
index 00000000000..7ea78412f40
--- /dev/null
+++ b/release/scripts/presets/tracking_camera/Red_One_4K.py
@@ -0,0 +1,10 @@
+import bpy
+camera = bpy.context.edit_movieclip.tracking.camera
+
+camera.sensor_width = 22.2
+camera.units = 'MILLIMETERS'
+camera.focal_length = 24.0
+camera.pixel_aspect = 1
+camera.k1 = 0.0
+camera.k2 = 0.0
+camera.k3 = 0.0
diff --git a/release/scripts/presets/tracking_track_color/default.py b/release/scripts/presets/tracking_track_color/default.py
new file mode 100644
index 00000000000..3213d6e0c83
--- /dev/null
+++ b/release/scripts/presets/tracking_track_color/default.py
@@ -0,0 +1,5 @@
+import bpy
+track = bpy.context.edit_movieclip.tracking.tracks.active
+
+track.color = (0.0, 0.0, 0.0)
+track.use_custom_color = False
diff --git a/release/scripts/presets/tracking_track_color/far_plane.py b/release/scripts/presets/tracking_track_color/far_plane.py
new file mode 100644
index 00000000000..579d5562642
--- /dev/null
+++ b/release/scripts/presets/tracking_track_color/far_plane.py
@@ -0,0 +1,5 @@
+import bpy
+track = bpy.context.edit_movieclip.tracking.tracks.active
+
+track.color = (0.0, 0.0, 1.0)
+track.use_custom_color = True
diff --git a/release/scripts/presets/tracking_track_color/near_plane.py b/release/scripts/presets/tracking_track_color/near_plane.py
new file mode 100644
index 00000000000..790429ce7a1
--- /dev/null
+++ b/release/scripts/presets/tracking_track_color/near_plane.py
@@ -0,0 +1,5 @@
+import bpy
+track = bpy.context.edit_movieclip.tracking.tracks.active
+
+track.color = (0.0, 1.0, 0.0)
+track.use_custom_color = True
diff --git a/release/scripts/startup/bl_operators/__init__.py b/release/scripts/startup/bl_operators/__init__.py
index c0e83cee9d6..06b4429d25c 100644
--- a/release/scripts/startup/bl_operators/__init__.py
+++ b/release/scripts/startup/bl_operators/__init__.py
@@ -25,6 +25,7 @@ if "bpy" in locals():
_modules = (
"add_mesh_torus",
"anim",
+ "clip",
"console",
"image",
"mesh",
diff --git a/release/scripts/startup/bl_operators/clip.py b/release/scripts/startup/bl_operators/clip.py
new file mode 100644
index 00000000000..d085b7ea105
--- /dev/null
+++ b/release/scripts/startup/bl_operators/clip.py
@@ -0,0 +1,318 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+import bpy
+import os
+import shutil
+from bpy.types import Operator
+from bpy_extras.io_utils import unpack_list
+
+
+class CLIP_OT_track_to_empty(Operator):
+ """Create an Empty object which will be copying movement of active track"""
+
+ bl_idname = "clip.track_to_empty"
+ bl_label = "2D Track to Empty"
+ bl_options = {'UNDO', 'REGISTER'}
+
+ @classmethod
+ def poll(cls, context):
+ if context.space_data.type != 'CLIP_EDITOR':
+ return False
+
+ sc = context.space_data
+ clip = sc.clip
+
+ return clip and clip.tracking.tracks.active
+
+ def execute(self, context):
+ sc = context.space_data
+ clip = sc.clip
+ track = clip.tracking.tracks.active
+ constraint = None
+ ob = None
+
+ ob = bpy.data.objects.new(name=track.name, object_data=None)
+ ob.select = True
+ bpy.context.scene.objects.link(ob)
+ bpy.context.scene.objects.active = ob
+
+ for con in ob.constraints:
+ if con.type == 'FOLLOW_TRACK':
+ constraint = con
+ break
+
+ if constraint is None:
+ constraint = ob.constraints.new(type='FOLLOW_TRACK')
+
+ constraint.clip = sc.clip
+ constraint.track = track.name
+ constraint.reference = 'TRACK'
+
+ return {'FINISHED'}
+
+
+class CLIP_OT_bundles_to_mesh(Operator):
+ """Create vertex cloud using coordinates of bundles"""
+
+ bl_idname = "clip.bundles_to_mesh"
+ bl_label = "Bundles to Mesh"
+ bl_options = {'UNDO', 'REGISTER'}
+
+ @classmethod
+ def poll(cls, context):
+ if context.space_data.type != 'CLIP_EDITOR':
+ return False
+
+ sc = context.space_data
+ clip = sc.clip
+
+ return clip
+
+ def execute(self, context):
+ sc = context.space_data
+ clip = sc.clip
+
+ new_verts = []
+
+ mesh = bpy.data.meshes.new(name="Bundles")
+ for track in clip.tracking.tracks:
+ if track.has_bundle:
+ new_verts.append(track.bundle)
+
+ if new_verts:
+ mesh.vertices.add(len(new_verts))
+ mesh.vertices.foreach_set("co", unpack_list(new_verts))
+
+ ob = bpy.data.objects.new(name="Bundles", object_data=mesh)
+
+ bpy.context.scene.objects.link(ob)
+
+ return {'FINISHED'}
+
+
+class CLIP_OT_delete_proxy(Operator):
+ """Delete movie clip proxy files from the hard drive"""
+
+ bl_idname = "clip.delete_proxy"
+ bl_label = "Delete Proxy"
+ bl_options = {'UNDO', 'REGISTER'}
+
+ @classmethod
+ def poll(cls, context):
+ sc = context.space_data
+
+ return sc.clip
+
+ def invoke(self, context, event):
+ wm = context.window_manager
+
+ return wm.invoke_confirm(self, event)
+
+ def _rmproxy(self, abspath):
+ if not os.path.exists(abspath):
+ return
+
+ if os.path.isdir(abspath):
+ shutil.rmtree(abspath)
+ else:
+ os.remove(abspath)
+
+ def execute(self, context):
+ sc = context.space_data
+ clip = sc.clip
+ if clip.use_proxy_custom_directory:
+ proxydir = clip.proxy.directory
+ else:
+ clipdir = os.path.dirname(clip.filepath)
+ proxydir = os.path.join(clipdir, 'BL_proxy')
+
+ clipfile = os.path.basename(clip.filepath)
+ proxy = os.path.join(proxydir, clipfile)
+ absproxy = bpy.path.abspath(proxy)
+
+ # proxy_<quality>[_undostorted]
+ for x in (25, 50, 75, 100):
+ d = os.path.join(absproxy, 'proxy_' + str(x))
+
+ self._rmproxy(d)
+ self._rmproxy(d + '_undistorted')
+ self._rmproxy(os.path.join(absproxy, 'proxy_' + str(x) + '.avi'))
+
+ tc = ('free_run.blen_tc', 'interp_free_run.blen_tc', \
+ 'record_run.blen_tc')
+
+ for x in tc:
+ self._rmproxy(os.path.join(absproxy, x))
+
+ # remove proxy per-clip directory
+ try:
+ os.rmdir(absproxy)
+ except OSError:
+ pass
+
+ # remove [custom] proxy directory if empty
+ try:
+ absdir = bpy.path.abspath(proxydir)
+ os.rmdir(absdir)
+ except OSError:
+ pass
+
+ return {'FINISHED'}
+
+
+class CLIP_OT_set_viewport_background(Operator):
+ """Set current movie clip as a camera background in 3D viewport"""
+
+ bl_idname = "clip.set_viewport_background"
+ bl_label = "Set as Background"
+ bl_options = {'UNDO', 'REGISTER'}
+
+ @classmethod
+ def poll(cls, context):
+ if context.space_data.type != 'CLIP_EDITOR':
+ return False
+
+ sc = context.space_data
+
+ return sc.clip
+
+ def _set_background(self, space_v3d, clip, user):
+ bgpic = None
+
+ for x in space_v3d.background_images:
+ if x.source == 'MOVIE':
+ bgpic = x
+ break
+
+ if not bgpic:
+ bgpic = space_v3d.background_images.add()
+
+ bgpic.source = 'MOVIE'
+ bgpic.clip = clip
+ bgpic.clip_user.proxy_render_size = user.proxy_render_size
+ bgpic.clip_user.use_render_undistorted = user.use_render_undistorted
+ bgpic.use_camera_clip = False
+ bgpic.view_axis = 'CAMERA'
+
+ space_v3d.show_background_images = True
+
+ def execute(self, context):
+ sc = context.space_data
+ clip = sc.clip
+
+ for area in context.window.screen.areas:
+ if area.type == 'VIEW_3D':
+ for space in area.spaces:
+ if space.type == 'VIEW_3D':
+ self._set_background(space, clip, sc.clip_user)
+
+ return {'FINISHED'}
+
+
+class CLIP_OT_constraint_to_fcurve(Operator):
+ """Create F-Curves for object which will copy object's movement caused by this constraint"""
+
+ bl_idname = "clip.constraint_to_fcurve"
+ bl_label = "Constraint to F-Curve"
+ bl_options = {'UNDO', 'REGISTER'}
+
+ def _bake_object(self, scene, ob):
+ con = None
+ clip = None
+ sfra = None
+ efra = None
+ frame_current = scene.frame_current
+ matrices = []
+
+ # Find constraint which would eb converting
+ # TODO: several camera solvers and track followers would fail,
+ # but can't think about eal workflow where it'll be useful
+ for x in ob.constraints:
+ if x.type in ('CAMERA_SOLVER', 'FOLLOW_TRACK'):
+ con = x
+
+ if not con:
+ return
+
+ if con.type == 'FOLLOW_TRACK' and con.reference == 'BUNDLE':
+ mat = ob.matrix_world.copy()
+ ob.constraints.remove(con)
+ ob.matrix_world = mat
+
+ return
+
+ # Get clip used for parenting
+ if con.use_active_clip:
+ clip = scene.active_clip
+ else:
+ clip = con.clip
+
+ if not clip:
+ return
+
+ # Find start and end frames
+ for track in clip.tracking.tracks:
+ if sfra is None:
+ sfra = track.markers[0].frame
+ else:
+ sfra = min(sfra, track.markers[0].frame)
+
+ if efra is None:
+ efra = track.markers[-1].frame
+ else:
+ efra = max(efra, track.markers[-1].frame)
+
+ if sfra is None or efra is None:
+ return
+
+ # Store object matrices
+ for x in range(sfra, efra+1):
+ scene.frame_set(x)
+ matrices.append(ob.matrix_world.copy())
+
+ ob.animation_data_create()
+
+ # Apply matrices on object and insert keyframes
+ i = 0
+ for x in range(sfra, efra+1):
+ scene.frame_set(x)
+ ob.matrix_world = matrices[i]
+
+ ob.keyframe_insert("location")
+
+ if ob.rotation_mode == 'QUATERNION':
+ ob.keyframe_insert("rotation_quaternion")
+ else:
+ ob.keyframe_insert("rotation_euler")
+
+ i += 1
+
+ ob.constraints.remove(con)
+
+ scene.frame_set(frame_current)
+
+ def execute(self, context):
+ scene = context.scene
+
+ for ob in scene.objects:
+ if ob.select:
+ self._bake_object(scene, ob)
+
+ return {'FINISHED'}
diff --git a/release/scripts/startup/bl_operators/presets.py b/release/scripts/startup/bl_operators/presets.py
index 21ac128f177..ac19bab4c66 100644
--- a/release/scripts/startup/bl_operators/presets.py
+++ b/release/scripts/startup/bl_operators/presets.py
@@ -319,6 +319,47 @@ class AddPresetInteraction(AddPresetBase, Operator):
preset_subdir = "interaction"
+class AddPresetTrackingCamera(AddPresetBase, Operator):
+ '''Add a Tracking Camera Intrinsics Preset'''
+ bl_idname = "clip.camera_preset_add"
+ bl_label = "Add Camera Preset"
+ preset_menu = "CLIP_MT_camera_presets"
+
+ preset_defines = [
+ "camera = bpy.context.edit_movieclip.tracking.camera"
+ ]
+
+ preset_values = [
+ "camera.sensor_width",
+ "camera.units",
+ "camera.focal_length",
+ "camera.pixel_aspect",
+ "camera.k1",
+ "camera.k2",
+ "camera.k3"
+ ]
+
+ preset_subdir = "tracking_camera"
+
+
+class AddPresetTrackingTrackColor(AddPresetBase, Operator):
+ '''Add a Clip Track Color Preset'''
+ bl_idname = "clip.track_color_preset_add"
+ bl_label = "Add Track Color Preset"
+ preset_menu = "CLIP_MT_track_color_presets"
+
+ preset_defines = [
+ "track = bpy.context.edit_movieclip.tracking.tracks"
+ ]
+
+ preset_values = [
+ "track.color",
+ "track.use_custom_color"
+ ]
+
+ preset_subdir = "tracking_track_color"
+
+
class AddPresetKeyconfig(AddPresetBase, Operator):
'''Add a Keyconfig Preset'''
bl_idname = "wm.keyconfig_preset_add"
diff --git a/release/scripts/startup/bl_ui/__init__.py b/release/scripts/startup/bl_ui/__init__.py
index 682341cbf2f..48aefa93a5c 100644
--- a/release/scripts/startup/bl_ui/__init__.py
+++ b/release/scripts/startup/bl_ui/__init__.py
@@ -52,6 +52,7 @@ _modules = (
"properties_scene",
"properties_texture",
"properties_world",
+ "space_clip",
"space_console",
"space_dopesheet",
"space_filebrowser",
diff --git a/release/scripts/startup/bl_ui/properties_object_constraint.py b/release/scripts/startup/bl_ui/properties_object_constraint.py
index dc19f58ca35..4def354741e 100644
--- a/release/scripts/startup/bl_ui/properties_object_constraint.py
+++ b/release/scripts/startup/bl_ui/properties_object_constraint.py
@@ -753,6 +753,27 @@ class ConstraintButtonsPanel():
col = layout.column()
col.prop(con, "rotation_range", text="Pivot When")
+ def FOLLOW_TRACK(self, context, layout, con):
+ layout.prop(con, "use_active_clip")
+
+ if not con.use_active_clip:
+ layout.prop(con, "clip")
+
+ layout.prop(con, "track")
+
+ row = layout.row()
+ row.prop(con, "reference", expand=True)
+
+ layout.operator("clip.constraint_to_fcurve")
+
+ def CAMERA_SOLVER(self, context, layout, con):
+ layout.prop(con, "use_active_clip")
+
+ if not con.use_active_clip:
+ layout.prop(con, "clip")
+
+ layout.operator("clip.constraint_to_fcurve")
+
def SCRIPT(self, context, layout, con):
layout.label("Blender 2.5 has no py-constraints")
diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py
index d3859a78bea..6e28c8b42f1 100644
--- a/release/scripts/startup/bl_ui/properties_scene.py
+++ b/release/scripts/startup/bl_ui/properties_scene.py
@@ -218,6 +218,16 @@ class SCENE_PT_simplify(SceneButtonsPanel, Panel):
col.prop(rd, "simplify_ao_sss", text="AO and SSS")
+class SCENE_PT_movie_clip(SceneButtonsPanel, Panel):
+ bl_label = "Movie Clip"
+
+ def draw(self, context):
+ layout = self.layout
+ scene = context.scene
+
+ layout.prop(scene, "active_clip", text="Active Clip")
+
+
class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel, Panel):
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
_context_path = "scene"
diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py
new file mode 100644
index 00000000000..09209017823
--- /dev/null
+++ b/release/scripts/startup/bl_ui/space_clip.py
@@ -0,0 +1,885 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+import bpy
+from bpy.types import Panel, Header, Menu
+
+
+class CLIP_HT_header(Header):
+ bl_space_type = 'CLIP_EDITOR'
+
+ def draw(self, context):
+ layout = self.layout
+
+ sc = context.space_data
+ clip = sc.clip
+
+ row = layout.row(align=True)
+ row.template_header()
+
+ if context.area.show_menus:
+ sub = row.row(align=True)
+ sub.menu("CLIP_MT_view")
+
+ if clip:
+ sub.menu("CLIP_MT_select")
+
+ sub.menu("CLIP_MT_clip")
+
+ if clip:
+ sub.menu("CLIP_MT_track")
+ sub.menu("CLIP_MT_reconstruction")
+
+ if clip:
+ layout.prop(sc, "mode", text="")
+ layout.prop(sc, "view", text="", expand=True)
+
+ if sc.view == 'GRAPH':
+ row = layout.row(align=True)
+
+ if sc.show_filters:
+ row.prop(sc, "show_filters", icon='DISCLOSURE_TRI_DOWN', text="Filters")
+ row.prop(sc, "show_graph_frames", icon='SEQUENCE', text="")
+ row.prop(sc, "show_graph_tracks", icon='ANIM', text="")
+ else:
+ row.prop(sc, "show_filters", icon='DISCLOSURE_TRI_RIGHT', text="Filters")
+
+ row = layout.row()
+ row.template_ID(sc, "clip", open='clip.open')
+
+ if clip:
+ r = clip.tracking.reconstruction
+
+ if r.is_valid:
+ layout.label(text="Average solve error: %.4f" %
+ (r.average_error))
+
+ layout.template_running_jobs()
+
+
+class CLIP_PT_tools_marker(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'TOOLS'
+ bl_label = "Marker"
+
+ @classmethod
+ def poll(cls, context):
+ sc = context.space_data
+ clip = sc.clip
+
+ return clip and sc.mode == 'TRACKING'
+
+ def draw(self, context):
+ layout = self.layout
+
+ col = layout.column(align=True)
+ col.operator("clip.add_marker_move")
+ col.operator("clip.detect_features")
+ col.operator("clip.delete_track")
+
+
+class CLIP_PT_tools_tracking(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'TOOLS'
+ bl_label = "Track"
+
+ @classmethod
+ def poll(cls, context):
+ sc = context.space_data
+ clip = sc.clip
+
+ return clip and sc.mode == 'TRACKING'
+
+ def draw(self, context):
+ layout = self.layout
+ clip = context.space_data.clip
+ settings = clip.tracking.settings
+
+ row = layout.row(align=True)
+
+ props = row.operator("clip.track_markers", text="", icon='FRAME_PREV')
+ props.backwards = True
+ props = row.operator("clip.track_markers", text="",
+ icon='PLAY_REVERSE')
+ props.backwards = True
+ props.sequence = True
+ props = row.operator("clip.track_markers", text="", icon='PLAY')
+ props.sequence = True
+ row.operator("clip.track_markers", text="", icon='FRAME_NEXT')
+
+ col = layout.column(align=True)
+ props = col.operator("clip.clear_track_path", text="Clear After")
+ props.action = 'REMAINED'
+
+ props = col.operator("clip.clear_track_path", text="Clear Before")
+ props.action = 'UPTO'
+
+ props = col.operator("clip.clear_track_path", text="Clear Track Path")
+ props.action = 'ALL'
+
+ layout.operator("clip.join_tracks")
+
+
+class CLIP_PT_tools_solving(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'TOOLS'
+ bl_label = "Solving"
+
+ @classmethod
+ def poll(cls, context):
+ sc = context.space_data
+ clip = sc.clip
+
+ return clip and sc.mode == 'TRACKING'
+
+ def draw(self, context):
+ layout = self.layout
+ clip = context.space_data.clip
+ settings = clip.tracking.settings
+
+ col = layout.column(align=True)
+ col.operator("clip.solve_camera")
+ col.operator("clip.clear_solution")
+
+ col = layout.column(align=True)
+ col.prop(settings, "keyframe_a")
+ col.prop(settings, "keyframe_b")
+
+
+class CLIP_PT_tools_cleanup(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'TOOLS'
+ bl_label = "Clean up"
+
+ @classmethod
+ def poll(cls, context):
+ sc = context.space_data
+ clip = sc.clip
+
+ return clip and sc.mode == 'TRACKING'
+
+ def draw(self, context):
+ layout = self.layout
+ clip = context.space_data.clip
+ settings = clip.tracking.settings
+
+ layout.operator("clip.clean_tracks")
+
+ layout.prop(settings, 'clean_frames', text="Frames")
+ layout.prop(settings, 'clean_error', text="Error")
+ layout.prop(settings, 'clean_action', text="")
+
+
+class CLIP_PT_tools_geometry(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'TOOLS'
+ bl_label = "Geometry"
+
+ @classmethod
+ def poll(cls, context):
+ sc = context.space_data
+ clip = sc.clip
+
+ return clip and sc.mode == 'RECONSTRUCTION'
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.operator("clip.bundles_to_mesh")
+ layout.operator("clip.track_to_empty")
+
+
+class CLIP_PT_tools_orientation(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'TOOLS'
+ bl_label = "Orientation"
+
+ @classmethod
+ def poll(cls, context):
+ sc = context.space_data
+ clip = sc.clip
+
+ return clip and sc.mode == 'RECONSTRUCTION'
+
+ def draw(self, context):
+ sc = context.space_data
+ layout = self.layout
+ settings = sc.clip.tracking.settings
+
+ col = layout.column(align=True)
+ col.label(text="Scene Orientation:")
+ col.operator("clip.set_floor")
+ col.operator("clip.set_origin")
+
+ row = col.row()
+ row.operator("clip.set_axis", text="Set X Axis").axis = 'X'
+ row.operator("clip.set_axis", text="Set Y Axis").axis = 'Y'
+
+ layout.separator()
+
+ col = layout.column()
+ col.operator("clip.set_scale")
+ col.prop(settings, "distance")
+
+
+class CLIP_PT_tools_grease_pencil(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'TOOLS'
+ bl_label = "Grease Pencil"
+
+ @classmethod
+ def poll(cls, context):
+ sc = context.space_data
+ clip = sc.clip
+
+ return clip and sc.mode == 'DISTORTION'
+
+ def draw(self, context):
+ layout = self.layout
+
+ col = layout.column(align=True)
+
+ row = col.row(align=True)
+ row.operator("gpencil.draw", text="Draw").mode = 'DRAW'
+ row.operator("gpencil.draw", text="Line").mode = 'DRAW_STRAIGHT'
+
+ row = col.row(align=True)
+ row.operator("gpencil.draw", text="Poly").mode = 'DRAW_POLY'
+ row.operator("gpencil.draw", text="Erase").mode = 'ERASER'
+
+ row = col.row()
+ row.prop(context.tool_settings, "use_grease_pencil_sessions")
+
+
+class CLIP_PT_track(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'UI'
+ bl_label = "Track"
+
+ @classmethod
+ def poll(cls, context):
+ sc = context.space_data
+ clip = sc.clip
+
+ return sc.mode == 'TRACKING' and clip
+
+ def draw(self, context):
+ layout = self.layout
+ sc = context.space_data
+ clip = context.space_data.clip
+ act_track = clip.tracking.tracks.active
+
+ if not act_track:
+ layout.active = False
+ layout.label(text="No active track")
+ return
+
+ row = layout.row()
+ row.prop(act_track, "name", text="")
+
+ sub = row.row(align=True)
+
+ sub.template_marker(sc, "clip", sc.clip_user, act_track, True)
+
+ icon = 'LOCKED' if act_track.lock else 'UNLOCKED'
+ sub.prop(act_track, "lock", text="", icon=icon)
+
+ layout.template_track(sc, "scopes")
+
+ row = layout.row(align=True)
+ row.prop(act_track, "use_red_channel", text="R", toggle=True)
+ row.prop(act_track, "use_green_channel", text="G", toggle=True)
+ row.prop(act_track, "use_blue_channel", text="B", toggle=True)
+
+ layout.separator()
+
+ row = layout.row(align=True)
+ label = bpy.types.CLIP_MT_track_color_presets.bl_label
+ row.menu('CLIP_MT_track_color_presets', text=label)
+ row.menu('CLIP_MT_track_color_specials', text="", icon="DOWNARROW_HLT")
+ row.operator("clip.track_color_preset_add", text="", icon="ZOOMIN")
+ props = row.operator("clip.track_color_preset_add",
+ text="", icon="ZOOMOUT")
+ props.remove_active = True
+
+ row = layout.row()
+ row.prop(act_track, "use_custom_color")
+ if act_track.use_custom_color:
+ row.prop(act_track, "color", text="")
+
+ if act_track.has_bundle:
+ label_text = "Average Error: %.4f" % (act_track.average_error)
+ layout.label(text=label_text)
+
+
+class CLIP_PT_tracking_camera(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'UI'
+ bl_label = "Camera Data"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ sc = context.space_data
+
+ return sc.mode in ['TRACKING', 'DISTORTION'] and sc.clip
+
+ def draw(self, context):
+ layout = self.layout
+
+ sc = context.space_data
+ clip = sc.clip
+
+ row = layout.row(align=True)
+ label = bpy.types.CLIP_MT_camera_presets.bl_label
+ row.menu('CLIP_MT_camera_presets', text=label)
+ row.operator("clip.camera_preset_add", text="", icon="ZOOMIN")
+ props = row.operator("clip.camera_preset_add", text="", icon="ZOOMOUT")
+ props.remove_active = True
+
+ row = layout.row(align=True)
+ sub = row.split(percentage=0.65)
+ if clip.tracking.camera.units == 'MILLIMETERS':
+ sub.prop(clip.tracking.camera, "focal_length")
+ else:
+ sub.prop(clip.tracking.camera, "focal_length_pixels")
+ sub.prop(clip.tracking.camera, "units", text="")
+
+ col = layout.column(align=True)
+ col.label(text="Sensor:")
+ col.prop(clip.tracking.camera, "sensor_width", text="Width")
+ col.prop(clip.tracking.camera, "pixel_aspect")
+
+ col = layout.column()
+ col.label(text="Principal Point")
+ row = col.row()
+ row.prop(clip.tracking.camera, "principal", text="")
+ col.operator("clip.set_center_principal", text="Center")
+
+ col = layout.column(align=True)
+ col.label(text="Undistortion:")
+ col.prop(clip.tracking.camera, "k1")
+ col.prop(clip.tracking.camera, "k2")
+ col.prop(clip.tracking.camera, "k3")
+
+
+class CLIP_PT_display(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'UI'
+ bl_label = "Display"
+
+ def draw(self, context):
+ layout = self.layout
+ sc = context.space_data
+
+ col = layout.column(align=True)
+
+ col.prop(sc, "show_marker_pattern", text="Pattern")
+ col.prop(sc, "show_marker_search", text="Search")
+ col.prop(sc, "show_pyramid_levels", text="Pyramid")
+
+ col.prop(sc, "show_track_path", text="Track Path")
+ row = col.row()
+ row.active = sc.show_track_path
+ row.prop(sc, "path_length", text="Length")
+
+ col.prop(sc, "show_disabled", "Disabled Tracks")
+ col.prop(sc, "show_bundles", text="Bundles")
+
+ col.prop(sc, "show_names", text="Track Names")
+ col.prop(sc, "show_tiny_markers", text="Tiny Markers")
+
+ col.prop(sc, "show_grease_pencil", text="Grease Pencil")
+ col.prop(sc, "use_mute_footage", text="Mute")
+
+ if sc.mode == 'DISTORTION':
+ col.prop(sc, "show_grid", text="Grid")
+ col.prop(sc, "use_manual_calibration")
+ elif sc.mode == 'RECONSTRUCTION':
+ col.prop(sc, "show_stable", text="Stable")
+
+ col.prop(sc, "lock_selection")
+
+ clip = sc.clip
+ if clip:
+ col.label(text="Display Aspect:")
+ col.prop(clip, "display_aspect", text="")
+
+
+class CLIP_PT_track_settings(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'UI'
+ bl_label = "Tracking Settings"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ sc = context.space_data
+
+ return sc.mode == 'TRACKING' and sc.clip
+
+ def draw(self, context):
+ layout = self.layout
+ clip = context.space_data.clip
+ settings = clip.tracking.settings
+
+ active = clip.tracking.tracks.active
+ if active:
+ layout.prop(active, "tracker")
+ if active.tracker == "KLT":
+ layout.prop(active, "pyramid_levels")
+ if active.tracker == "SAD":
+ layout.prop(active, "correlation_min")
+
+ layout.prop(settings, "frames_adjust")
+ layout.prop(settings, "speed")
+ layout.prop(settings, "frames_limit")
+ layout.prop(settings, "margin")
+
+
+class CLIP_PT_stabilization(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'UI'
+ bl_label = "2D Stabilization"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ sc = context.space_data
+
+ return sc.mode == 'RECONSTRUCTION' and sc.clip
+
+ def draw_header(self, context):
+ sc = context.space_data
+ tracking = sc.clip.tracking
+ stab = tracking.stabilization
+
+ self.layout.prop(stab, "use_2d_stabilization", text="")
+
+ def draw(self, context):
+ layout = self.layout
+ sc = context.space_data
+ tracking = sc.clip.tracking
+ stab = tracking.stabilization
+
+ layout.active = stab.use_2d_stabilization
+
+ row = layout.row()
+ row.template_list(stab, "tracks", stab, "active_track_index", rows=3)
+
+ sub = row.column(align=True)
+
+ sub.operator("clip.stabilize_2d_add", icon='ZOOMIN', text="")
+ sub.operator("clip.stabilize_2d_remove", icon='ZOOMOUT', text="")
+
+ sub.menu('CLIP_MT_stabilize_2d_specials', text="",
+ icon="DOWNARROW_HLT")
+
+ layout.prop(stab, "influence_location")
+
+ layout.separator()
+
+ layout.prop(stab, "use_autoscale")
+ col = layout.column()
+ col.active = stab.use_autoscale
+ col.prop(stab, "scale_max")
+ col.prop(stab, "influence_scale")
+
+ layout.separator()
+
+ layout.label(text="Rotation:")
+
+ row = layout.row(align=True)
+ row.prop_search(stab, "rotation_track", tracking, "tracks", text="")
+ row.operator("clip.stabilize_2d_set_rotation", text="", icon='ZOOMIN')
+
+ row = layout.row()
+ row.active = stab.rotation_track is not None
+ row.prop(stab, "influence_rotation")
+
+
+class CLIP_PT_marker(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'UI'
+ bl_label = "Marker"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ sc = context.space_data
+ clip = sc.clip
+
+ return sc.mode == 'TRACKING' and clip
+
+ def draw(self, context):
+ layout = self.layout
+ sc = context.space_data
+ clip = context.space_data.clip
+ act_track = clip.tracking.tracks.active
+
+ if act_track:
+ layout.template_marker(sc, "clip", sc.clip_user, act_track, False)
+ else:
+ layout.active = False
+ layout.label(text="No active track")
+
+
+class CLIP_PT_proxy(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'UI'
+ bl_label = "Proxy / Timecode"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ sc = context.space_data
+
+ return sc.clip
+
+ def draw_header(self, context):
+ sc = context.space_data
+
+ self.layout.prop(sc.clip, "use_proxy", text="")
+
+ def draw(self, context):
+ layout = self.layout
+ sc = context.space_data
+ clip = sc.clip
+
+ layout.active = clip.use_proxy
+
+ layout.label(text="Build Sizes:")
+
+ row = layout.row()
+ row.prop(clip.proxy, "build_25")
+ row.prop(clip.proxy, "build_50")
+
+ row = layout.row()
+ row.prop(clip.proxy, "build_75")
+ row.prop(clip.proxy, "build_100")
+
+ layout.prop(clip.proxy, "build_undistorted")
+
+ layout.prop(clip.proxy, "quality")
+
+ layout.prop(clip, 'use_proxy_custom_directory')
+ if clip.use_proxy_custom_directory:
+ layout.prop(clip.proxy, "directory")
+
+ layout.operator("clip.rebuild_proxy", text="Rebuild Proxy")
+
+ if clip.source == 'MOVIE':
+ col = layout.column()
+
+ col.label(text="Use timecode index:")
+ col.prop(clip.proxy, "timecode", text="")
+
+ col = layout.column()
+ col.label(text="Proxy render size:")
+
+ col.prop(sc.clip_user, "proxy_render_size", text="")
+ col.prop(sc.clip_user, "use_render_undistorted")
+
+
+class CLIP_PT_footage(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'UI'
+ bl_label = "Footage Settings"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ sc = context.space_data
+
+ return sc.clip
+
+ def draw(self, context):
+ layout = self.layout
+
+ sc = context.space_data
+ clip = sc.clip
+
+ if clip:
+ layout.template_movieclip(sc, "clip", compact=True)
+ else:
+ layout.operator("clip.open", icon='FILESEL')
+
+
+class CLIP_PT_tools_clip(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'TOOLS'
+ bl_label = "Clip"
+
+ @classmethod
+ def poll(cls, context):
+ sc = context.space_data
+
+ return sc.clip
+
+ def draw(self, context):
+ layout = self.layout
+ clip = context.space_data.clip
+
+ layout.operator("clip.set_viewport_background")
+
+
+class CLIP_MT_view(Menu):
+ bl_label = "View"
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.operator("clip.properties", icon='MENU_PANEL')
+ layout.operator("clip.tools", icon='MENU_PANEL')
+ layout.separator()
+
+ layout.operator("clip.view_selected")
+ layout.operator("clip.view_all")
+
+ layout.separator()
+ layout.operator("clip.view_zoom_in")
+ layout.operator("clip.view_zoom_out")
+
+ layout.separator()
+
+ ratios = ((1, 8), (1, 4), (1, 2), (1, 1), (2, 1), (4, 1), (8, 1))
+
+ for a, b in ratios:
+ text = "Zoom %d:%d" % (a, b)
+ layout.operator("clip.view_zoom_ratio", text=text).ratio = a / b
+
+ layout.separator()
+ layout.operator("screen.area_dupli")
+ layout.operator("screen.screen_full_area")
+
+
+class CLIP_MT_clip(Menu):
+ bl_label = "Clip"
+
+ def draw(self, context):
+ layout = self.layout
+
+ sc = context.space_data
+ clip = sc.clip
+
+ layout.operator("clip.open")
+
+ if clip:
+ layout.operator("clip.reload")
+ layout.menu("CLIP_MT_proxy")
+
+
+class CLIP_MT_proxy(Menu):
+ bl_label = "Proxy"
+
+ def draw(self, context):
+ layout = self.layout
+
+ sc = context.space_data
+ clip = sc.clip
+
+ layout.operator("clip.rebuild_proxy")
+ layout.operator("clip.delete_proxy")
+
+
+class CLIP_MT_track(Menu):
+ bl_label = "Track"
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.operator("clip.clear_solution")
+ layout.operator("clip.solve_camera")
+
+ layout.separator()
+ props = layout.operator("clip.clear_track_path", text="Clear After")
+ props.action = 'REMAINED'
+
+ props = layout.operator("clip.clear_track_path", text="Clear Before")
+ props.action = 'UPTO'
+
+ props = layout.operator("clip.clear_track_path", text="Clear Track Path")
+ props.action = 'ALL'
+
+ layout.separator()
+ layout.operator("clip.join_tracks")
+
+ layout.separator()
+ layout.operator("clip.clean_tracks")
+
+ layout.separator()
+ props = layout.operator("clip.track_markers",
+ text="Track Frame Backwards")
+ props.backwards = True
+
+ props = layout.operator("clip.track_markers", text="Track Backwards")
+ props.backwards = True
+ props.sequence = True
+
+ props = layout.operator("clip.track_markers", text="Track Forwards")
+ props.sequence = True
+ layout.operator("clip.track_markers", text="Track Frame Forwards")
+
+ layout.separator()
+ layout.operator("clip.delete_track")
+ layout.operator("clip.delete_marker")
+
+ layout.separator()
+ layout.operator("clip.add_marker_move")
+
+ layout.separator()
+ layout.menu("CLIP_MT_track_visibility")
+ layout.menu("CLIP_MT_track_transform")
+
+
+class CLIP_MT_reconstruction(Menu):
+ bl_label = "Reconstruction"
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.operator("clip.set_origin")
+ layout.operator("clip.set_floor")
+
+ layout.operator("clip.set_axis", text="Set X Asix").axis = "X"
+ layout.operator("clip.set_axis", text="Set Y Asix").axis = "Y"
+
+ layout.operator("clip.set_scale")
+
+ layout.separator()
+
+ layout.operator("clip.track_to_empty")
+ layout.operator("clip.bundles_to_mesh")
+
+
+class CLIP_MT_track_visibility(Menu):
+ bl_label = "Show/Hide"
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.operator("clip.hide_tracks_clear", text="Show Hidden")
+ layout.operator("clip.hide_tracks", text="Hide Selected")
+
+ props = layout.operator("clip.hide_tracks", text="Hide Unselected")
+ props.unselected = True
+
+
+class CLIP_MT_track_transform(Menu):
+ bl_label = "Transform"
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.operator("transform.translate")
+ layout.operator("transform.resize")
+
+
+class CLIP_MT_select(Menu):
+ bl_label = "Select"
+
+ def draw(self, context):
+ layout = self.layout
+
+ sc = context.space_data
+
+ layout.operator("clip.select_border")
+ layout.operator("clip.select_circle")
+
+ layout.separator()
+
+ layout.operator("clip.select_all", text="Select/Deselect all")
+ layout.operator("clip.select_all", text="Inverse").action = 'INVERT'
+
+ layout.menu("CLIP_MT_select_grouped")
+
+
+class CLIP_MT_select_grouped(Menu):
+ bl_label = "Select Grouped"
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.operator_enum("clip.select_grouped", "group")
+
+
+class CLIP_MT_tracking_specials(Menu):
+ bl_label = "Specials"
+
+ @classmethod
+ def poll(cls, context):
+ return context.space_data.clip
+
+ def draw(self, context):
+ layout = self.layout
+
+ props = layout.operator("clip.disable_markers", text="Enable Markers")
+ props.action = 'ENABLE'
+
+ props = layout.operator("clip.disable_markers", text="Disable markers")
+ props.action = 'DISABLE'
+
+ layout.separator()
+ layout.operator("clip.set_origin")
+
+ layout.separator()
+ layout.operator("clip.hide_tracks")
+ layout.operator("clip.hide_tracks_clear", text="Show Tracks")
+
+ layout.separator()
+ props = layout.operator("clip.lock_tracks", text="Lock Tracks")
+ props.action = 'LOCK'
+
+ props = layout.operator("clip.lock_tracks", text="Unlock Tracks")
+ props.action = 'UNLOCK'
+
+
+class CLIP_MT_camera_presets(Menu):
+ bl_label = "Camera Presets"
+ preset_subdir = "tracking_camera"
+ preset_operator = "script.execute_preset"
+ draw = bpy.types.Menu.draw_preset
+
+
+class CLIP_MT_track_color_presets(Menu):
+ bl_label = "Color Presets"
+ preset_subdir = "tracking_track_color"
+ preset_operator = "script.execute_preset"
+ draw = bpy.types.Menu.draw_preset
+
+
+class CLIP_MT_track_color_specials(Menu):
+ bl_label = "Track Color Specials"
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.operator('clip.track_copy_color', icon='COPY_ID')
+
+
+class CLIP_MT_stabilize_2d_specials(Menu):
+ bl_label = "Track Color Specials"
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.operator('clip.stabilize_2d_select')
+
+if __name__ == "__main__": # only for live edit.
+ bpy.utils.register_module(__name__)
diff --git a/release/scripts/startup/bl_ui/space_time.py b/release/scripts/startup/bl_ui/space_time.py
index 6f8e6a574ec..5209e8be597 100644
--- a/release/scripts/startup/bl_ui/space_time.py
+++ b/release/scripts/startup/bl_ui/space_time.py
@@ -177,6 +177,7 @@ class TIME_MT_playback(Menu):
layout.prop(screen, "use_play_image_editors")
layout.prop(screen, "use_play_sequence_editors")
layout.prop(screen, "use_play_node_editors")
+ layout.prop(screen, "use_play_clip_editors")
layout.separator()
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 7041e3f8c3d..9edb1ea1197 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -2164,6 +2164,16 @@ class VIEW3D_PT_view3d_display(Panel):
layout.separator()
+ layout.prop(view, "show_reconstruction")
+ if view.show_reconstruction:
+ layout.label(text="Bundle type:")
+ layout.prop(view, "bundle_draw_type", text="")
+ layout.prop(view, "bundle_draw_size")
+ layout.prop(view, "show_bundle_name")
+ layout.prop(view, "show_camera_path")
+
+ layout.separator()
+
region = view.region_quadview
layout.operator("screen.region_quadview", text="Toggle Quad View")
@@ -2269,8 +2279,10 @@ class VIEW3D_PT_background_image(Panel):
box = layout.box()
row = box.row(align=True)
row.prop(bg, "show_expanded", text="", emboss=False)
- if bg.image:
+ if bg.source == 'IMAGE' and bg.image:
row.prop(bg.image, "name", text="", emboss=False)
+ if bg.source == 'MOVIE' and bg.clip:
+ row.prop(bg.clip, "name", text="", emboss=False)
else:
row.label(text="Not Set")
row.operator("view3d.background_image_remove", text="", emboss=False, icon='X').index = i
@@ -2279,10 +2291,36 @@ class VIEW3D_PT_background_image(Panel):
if bg.show_expanded:
row = box.row()
- row.template_ID(bg, "image", open="image.open")
- if (bg.image):
- box.template_image(bg, "image", bg.image_user, compact=True)
+ row.prop(bg, "source", expand=True)
+
+ hasbg = False
+ if bg.source == 'IMAGE':
+ row = box.row()
+ row.template_ID(bg, "image", open="image.open")
+ if (bg.image):
+ box.template_image(bg, "image", bg.image_user, compact=True)
+ hasbg = True
+
+ elif bg.source == 'MOVIE':
+ has_clip = False
+ box.prop(bg, 'use_camera_clip')
+
+ column = box.column()
+ column.active = not bg.use_camera_clip
+ column.template_ID(bg, "clip", open="clip.open")
+
+ if bg.clip:
+ column.template_movieclip(bg, "clip", compact=True)
+
+ if bg.use_camera_clip or bg.clip:
+ hasbg = True
+
+ column = box.column()
+ column.active = hasbg
+ column.prop(bg.clip_user, "proxy_render_size", text="")
+ column.prop(bg.clip_user, "use_render_undistorted")
+ if hasbg:
box.prop(bg, "opacity", slider=True)
if bg.view_axis != 'CAMERA':
box.prop(bg, "size")