Newer
Older
# ##### 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 #####
import bpy
from bpy.types import Operator
if obj.type == 'ARMATURE':
cam = None
for child in obj.children:
if child.type == 'CAMERA':
cam = child
break
if cam is not None:
return obj, cam
elif (obj.type == 'CAMERA'
and obj.parent is not None
and "rig_id" in obj.parent
and obj.parent["rig_id"].lower() in {"dolly_rig",
"crane_rig", "2d_rig"}):
return obj.parent, obj
return None, None
class CameraRigMixin():
@classmethod
def poll(cls, context):
if context.active_object is not None:
return get_rig_and_cam(context.active_object) != (None, None)
class ADD_CAMERA_RIGS_OT_set_scene_camera(Operator):
bl_idname = "add_camera_rigs.set_scene_camera"
bl_label = "Make Camera Active"
bl_description = "Makes the camera parented to this rig the active scene camera"
@classmethod
def poll(cls, context):
if context.active_object is not None:
rig, cam = get_rig_and_cam(context.active_object)
if cam is not None:
return cam is not context.scene.camera
return False
def execute(self, context):
rig, cam = get_rig_and_cam(context.active_object)
context.scene.camera = cam
return {'FINISHED'}
class ADD_CAMERA_RIGS_OT_add_marker_bind(Operator, CameraRigMixin):
bl_idname = "add_camera_rigs.add_marker_bind"
bl_label = "Add Marker and Bind Camera"
bl_description = "Add marker to current frame then bind rig camera to it (for camera switching)"
def execute(self, context):
rig, cam = get_rig_and_cam(context.active_object)
marker = context.scene.timeline_markers.new(
"cam_" + str(context.scene.frame_current),
frame=context.scene.frame_current
)
marker.camera = cam
class ADD_CAMERA_RIGS_OT_add_dof_object(Operator, CameraRigMixin):
bl_idname = "add_camera_rigs.add_dof_object"
bl_label = "Add DOF Object"
bl_description = "Create Empty and add as DOF Object"
def execute(self, context):
rig, cam = get_rig_and_cam(context.active_object)
bone = rig.data.bones['Aim_shape_rotation-MCH']
# Add Empty
empty_obj = bpy.data.objects.new("EmptyDOF", None)
context.scene.collection.objects.link(empty_obj)
# Parent to Aim Child bone
empty_obj.parent_type = "BONE"
empty_obj.parent_bone = "Aim_shape_rotation-MCH"
# Move to bone head
empty_obj.location = bone.head
# Make this new empty the dof_object
cam.data.dof.use_dof = True
cam.data.dof.focus_object = empty_obj
return {'FINISHED'}
classes = (
ADD_CAMERA_RIGS_OT_set_scene_camera,
ADD_CAMERA_RIGS_OT_add_marker_bind,
ADD_CAMERA_RIGS_OT_add_dof_object,
)
def register():
from bpy.utils import register_class
for cls in classes:
register_class(cls)
def unregister():
from bpy.utils import unregister_class
for cls in classes:
unregister_class(cls)