PRECISE_RENDER_BORDER_ADJUST_V1-3.PY 6.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. ######################################################################################################
  2. # A simple add-on to allows the user to precisly place the border render region (Ctrl+B in cam view) #
  3. # using numerical input, witch can be animated #
  4. # Actualy uncommented (see further version) #
  5. # Author: Lapineige #
  6. # License: GPL v3 #
  7. ######################################################################################################
  8. ############# Add-on description (used by Blender)
  9. bl_info = {
  10. "name": "Precise Render Border Adjust",
  11. "description": 'Allows to modify and animate the "Border Render" region with numerical input.',
  12. "author": "Lapineige",
  13. "version": (1, 3),
  14. "blender": (2, 71, 0),
  15. "location": "Properties > Render > Precise Render Border Adjust (panel)",
  16. "warning": "", # used for warning icon and text in addons panel
  17. "wiki_url": "http://le-terrier-de-lapineige.over-blog.com/2014/07/precise-render-border-adjust-mon-add-on-pour-positionner-precisement-le-border-render.html",
  18. "tracker_url": "http://blenderclan.tuxfamily.org/html/modules/newbb/viewtopic.php?topic_id=42159",
  19. "category": "Render"}
  20. ##############
  21. import bpy
  22. bpy.types.Scene.x_min_pixels = bpy.props.IntProperty(min=0, description="Minimum X value (in pixel) for the render border")
  23. bpy.types.Scene.x_max_pixels = bpy.props.IntProperty(min=0, description="Maximum X value (in pixel) for the render border")
  24. bpy.types.Scene.y_min_pixels = bpy.props.IntProperty(min=0, description="Minimum Y value (in pixel) for the render border")
  25. bpy.types.Scene.y_max_pixels = bpy.props.IntProperty(min=0, description="Maximum Y value (in pixel) for the render border")
  26. class PreciseRenderBorderAdjust(bpy.types.Panel):
  27. """Creates the tools in a Panel, in the scene context of the properties editor"""
  28. bl_label = "Precise Render Border Adjust"
  29. bl_idname = "Precise_Render_Border_Adjust"
  30. bl_space_type = 'PROPERTIES'
  31. bl_region_type = 'WINDOW'
  32. bl_context = "render"
  33. def draw(self, context):
  34. layout = self.layout
  35. scene = context.scene
  36. if not scene.render.use_border:
  37. sub = layout.split(percentage=0.7)
  38. sub.label(icon="ERROR", text="Border Render not activated:")
  39. sub.prop(scene.render, "use_border")
  40. sub = layout.column()
  41. row = sub.row()
  42. row.label(text="")
  43. row.prop(scene.render, "border_max_y", text="Max", slider=True)
  44. row.label(text="")
  45. row = sub.row(align=True)
  46. row.prop(scene.render, "border_min_x", text="Min", slider=True)
  47. row.prop(scene.render, "border_max_x", text="Max", slider=True)
  48. row = sub.row()
  49. row.label(text="")
  50. row.prop(scene.render, "border_min_y", text="Min", slider=True)
  51. row.label(text="")
  52. row = layout.row()
  53. row.label(text="Convert values to pixels:")
  54. row.operator("render.bordertopixels", text="Border -> Pixels")
  55. layout.label(text="Pixels position X:")
  56. row = layout.row(align=True)
  57. row.prop(scene, "x_min_pixels", text="Min")
  58. row.prop(scene, "x_max_pixels", text="Max")
  59. layout.label(text="Pixels position Y:")
  60. row = layout.row(align=True)
  61. row.prop(scene, "y_min_pixels", text="Min")
  62. row.prop(scene, "y_max_pixels", text="Max")
  63. layout.label(icon="INFO", text="Don't forget to apply pixels values")
  64. row = layout.row()
  65. row.operator("render.pixelstoborder", text="Pixels -> Border")
  66. class PixelsToBorder(bpy.types.Operator):
  67. """ Convert the pixel value into the proportion needed by the Blender native property """
  68. bl_idname = "render.pixelstoborder"
  69. bl_label = "Convert Pixels to Border proportion"
  70. @classmethod
  71. def poll(cls, context):
  72. return True
  73. def execute(self, context):
  74. C = bpy.context
  75. X = C.scene.render.resolution_x
  76. Y = C.scene.render.resolution_y
  77. C.scene.render.border_min_x = C.scene.x_min_pixels / X
  78. C.scene.render.border_max_x = C.scene.x_max_pixels / X
  79. C.scene.render.border_min_y = C.scene.y_min_pixels / Y
  80. C.scene.render.border_max_y = C.scene.y_max_pixels / Y
  81. if C.scene.x_min_pixels > X:
  82. C.scene.x_min_pixels = X
  83. if C.scene.x_max_pixels > X:
  84. C.scene.x_max_pixels = X
  85. if C.scene.y_min_pixels > Y:
  86. C.scene.y_min_pixels = Y
  87. if C.scene.y_max_pixels > Y:
  88. C.scene.y_max_pixels = Y
  89. return {'FINISHED'}
  90. class BorderToPixels(bpy.types.Operator):
  91. """ Convert the Blender native property value to pixels"""
  92. bl_idname = "render.bordertopixels"
  93. bl_label = "Convert border values to pixels"
  94. @classmethod
  95. def poll(cls, context):
  96. return True
  97. def execute(self, context):
  98. C = bpy.context
  99. X = C.scene.render.resolution_x
  100. Y = C.scene.render.resolution_y
  101. C.scene.x_min_pixels = int(C.scene.render.border_min_x * X)
  102. C.scene.x_max_pixels = int(C.scene.render.border_max_x * X)
  103. C.scene.y_min_pixels = int(C.scene.render.border_min_y * Y)
  104. C.scene.y_max_pixels = int(C.scene.render.border_max_y * Y)
  105. return {'FINISHED'}
  106. def register():
  107. bpy.utils.register_class(PreciseRenderBorderAdjust)
  108. bpy.utils.register_class(PixelsToBorder)
  109. bpy.utils.register_class(BorderToPixels)
  110. def unregister():
  111. bpy.utils.unregister_class(PreciseRenderBorderAdjust)
  112. bpy.utils.unregister_class(PixelsToBorder)
  113. bpy.utils.unregister_class(BorderToPixels)
  114. if __name__ == "__main__":
  115. C = bpy.context
  116. X = C.scene.render.resolution_x
  117. Y = C.scene.render.resolution_y
  118. C.scene.x_min_pixels = 0
  119. C.scene.x_max_pixels = X
  120. C.scene.y_min_pixels = 0
  121. C.scene.y_max_pixels = Y
  122. register()