[Bf-extensions-cvs] [09084da0] master: initial commit Camera Overscan T49068 T51145
meta-androcto
noreply at git.blender.org
Mon Apr 17 05:18:24 CEST 2017
Commit: 09084da08ee543602d96bebabc42965e38dd42bf
Author: meta-androcto
Date: Mon Apr 17 13:17:59 2017 +1000
Branches: master
https://developer.blender.org/rBAC09084da08ee543602d96bebabc42965e38dd42bf
initial commit Camera Overscan T49068 T51145
===================================================================
A camera_overscan.py
===================================================================
diff --git a/camera_overscan.py b/camera_overscan.py
new file mode 100644
index 00000000..dd1523bd
--- /dev/null
+++ b/camera_overscan.py
@@ -0,0 +1,190 @@
+# ##### 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 #####
+
+bl_info = {
+ "name": "Camera Overscan",
+ "author": "John Roper, Barnstorm VFX, Luca Scheller",
+ "version": (1, 2, 1),
+ "blender": (2, 7, 6),
+ "location": "Render Settings > Camera Overscan",
+ "description": "Render Overscan",
+ "warning": "",
+ "wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/Render/Camera_Overscan",
+ "tracker_url": "",
+ "category": "Render"}
+
+import bpy
+from bpy.types import (
+ Operator,
+ PropertyGroup,
+ )
+from bpy.props import (
+ BoolProperty,
+ IntProperty,
+ FloatProperty,
+ StringProperty,
+ PointerProperty,
+ )
+
+
+class CODuplicateCamera(Operator):
+ bl_idname = "scene.co_duplicate_camera"
+ bl_label = "Bake to New Camera"
+ bl_description = ("Make a new overscan camera with all the settings builtin\n"
+ "Needs an active Camera type in the Scene")
+
+ @classmethod
+ def poll(cls, context):
+ active_cam = getattr(context.scene, "camera", None)
+ return active_cam is not None
+
+ def execute(self, context):
+ active_cam = getattr(context.scene, "camera", None)
+ try:
+ if active_cam and active_cam.type == 'CAMERA':
+ cam_obj = active_cam.copy()
+ cam_obj.data = active_cam.data.copy()
+ cam_obj.name = "Camera_Overscan"
+ context.scene.objects.link(cam_obj)
+ except:
+ self.report({'WARNING'}, "Setting up a new Overscan Camera has failed")
+ return {'CANCELLED'}
+
+ return {'FINISHED'}
+
+
+def RO_Update(self, context):
+ scene = context.scene
+ overscan = scene.camera_overscan
+ render_settings = scene.render
+ active_camera = getattr(scene, "camera", None)
+ active_cam = getattr(active_camera, "data", None)
+
+ # Check if there is a camera type in the scene (Object as camera doesn't work)
+ if not active_cam or active_camera.type not in {'CAMERA'}:
+ return None
+
+ if overscan.RO_Activate:
+ if overscan.RO_Safe_SensorSize == -1:
+ # Safe Property Values
+ overscan.RO_Safe_Res_X = render_settings.resolution_x
+ overscan.RO_Safe_Res_Y = render_settings.resolution_y
+ overscan.RO_Safe_SensorSize = active_cam.sensor_width
+ overscan.RO_Safe_SensorFit = active_cam.sensor_fit
+
+ if overscan.RO_Custom_Res_X == 0 or overscan.RO_Custom_Res_Y == 0:
+ # avoid infinite recursion on props update
+ if overscan.RO_Custom_Res_X != render_settings.resolution_x:
+ overscan.RO_Custom_Res_X = render_settings.resolution_x
+ if overscan.RO_Custom_Res_Y != render_settings.resolution_y:
+ overscan.RO_Custom_Res_Y = render_settings.resolution_y
+
+ # Reset Property Values
+ active_cam.sensor_width = scene.camera_overscan.RO_Safe_SensorSize
+
+ # Calc Sensor Size
+ active_cam.sensor_fit = 'HORIZONTAL'
+ sensor_size_factor = overscan.RO_Custom_Res_X / overscan.RO_Safe_Res_X
+ Old_SensorSize = active_cam.sensor_width
+ New_SensorSize = Old_SensorSize * sensor_size_factor
+
+ # Set New Property Values
+ active_cam.sensor_width = New_SensorSize
+ render_settings.resolution_x = overscan.RO_Custom_Res_X
+ render_settings.resolution_y = overscan.RO_Custom_Res_Y
+
+ else:
+ if overscan.RO_Safe_SensorSize != -1:
+ # Set Property Values
+ render_settings.resolution_x = overscan.RO_Safe_Res_X
+ render_settings.resolution_y = overscan.RO_Safe_Res_Y
+ active_cam.sensor_width = overscan.RO_Safe_SensorSize
+ active_cam.sensor_fit = overscan.RO_Safe_SensorFit
+ overscan.RO_Safe_SensorSize = -1
+
+
+def RO_Menu(self, context):
+ scene = context.scene
+ overscan = scene.camera_overscan
+ layout = self.layout
+ row = layout.row()
+ active_cam = getattr(scene, "camera", None)
+
+ if active_cam and active_cam.type == 'CAMERA':
+ row.prop(overscan, 'RO_Activate', text="Use Overscan")
+ row_enable = row.row(align=True)
+ if not overscan.RO_Activate:
+ row_enable.enabled = False
+ row_enable.prop(overscan, 'RO_Custom_Res_X', text="X")
+ row_enable.prop(overscan, 'RO_Custom_Res_Y', text="Y")
+ row = layout.row()
+ if not overscan.RO_Activate:
+ row.enabled = False
+ row.operator("scene.co_duplicate_camera", icon="RENDER_STILL")
+ else:
+ row.label("No active Camera type in the Scene", icon='INFO')
+
+
+class camera_overscan_props(PropertyGroup):
+ RO_Activate = BoolProperty(
+ default=False,
+ description="Enable/Disable Camera Overscan\n"
+ "Affects the active Scene Camera only\n"
+ "(Objects as cameras are not supported)",
+ update=RO_Update
+ )
+ RO_Custom_Res_X = IntProperty(
+ default=0,
+ min=0,
+ max=65536,
+ update=RO_Update
+ )
+ RO_Custom_Res_Y = IntProperty(
+ default=0,
+ min=0,
+ max=65536,
+ update=RO_Update
+ )
+ RO_Safe_Res_X = FloatProperty()
+ RO_Safe_Res_Y = FloatProperty()
+
+ # the hard limit is sys.max which is too much, used 65536 instead
+ RO_Safe_SensorSize = FloatProperty(
+ default=-1,
+ min=-1,
+ max=65536
+ )
+ RO_Safe_SensorFit = StringProperty()
+
+
+def register():
+ bpy.utils.register_module(__name__)
+ bpy.types.RENDER_PT_dimensions.append(RO_Menu)
+ bpy.types.Scene.camera_overscan = PointerProperty(
+ type=camera_overscan_props
+ )
+
+
+def unregister():
+ bpy.utils.unregister_module(__name__)
+ bpy.types.RENDER_PT_dimensions.remove(RO_Menu)
+ del bpy.types.Scene.camera_overscan
+
+
+if __name__ == "__main__":
+ register()
More information about the Bf-extensions-cvs
mailing list