Move 'render auto tile size' addon to main repo.
authorBastien Montagne <montagne29@wanadoo.fr>
Tue, 13 Jan 2015 20:45:52 +0000 (21:45 +0100)
committerBastien Montagne <montagne29@wanadoo.fr>
Tue, 13 Jan 2015 20:45:52 +0000 (21:45 +0100)
render_auto_tile_size.py [deleted file]

diff --git a/render_auto_tile_size.py b/render_auto_tile_size.py
deleted file mode 100644 (file)
index 576e86c..0000000
+++ /dev/null
@@ -1,319 +0,0 @@
-# BEGIN GPL LICENSE BLOCK #####\r
-#\r
-#  This program is free software; you can redistribute it and/or\r
-#  modify it under the terms of the GNU General Public License\r
-#  as published by the Free Software Foundation; either version 2\r
-#  of the License, or (at your option) any later version.\r
-#\r
-#  This program is distributed in the hope that it will be useful,\r
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
-#  GNU General Public License for more details.\r
-#\r
-#  You should have received a copy of the GNU General Public License\r
-#  along with this program; if not, write to the Free Software Foundation,\r
-#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
-#\r
-# END GPL LICENSE BLOCK #####\r
-\r
-bl_info = {\r
-    "name": "Auto Tile Size",\r
-    "description": "Estimate and set the tile size that will render the fastest",\r
-    "author": "Greg Zaal",\r
-    "version": (2, 7),\r
-    "blender": (2, 72, 0),\r
-    "location": "Render Settings > Performance",\r
-    "warning": "",\r
-    "wiki_url": "http://wiki.blender.org/index.php?title=Extensions:2.6/Py/Scripts/Render/Auto_Tile_Size",\r
-    "category": "Render",\r
-}\r
-\r
-\r
-import bpy\r
-from bpy.app.handlers import persistent\r
-from math import ceil, floor\r
-\r
-\r
-SUPPORTED_RENDER_ENGINES = {'CYCLES', 'BLENDER_RENDER'}\r
-TILE_SIZES = (\r
-    ('16', "16", "16 x 16"),\r
-    ('32', "32", "32 x 32"),\r
-    ('64', "64", "64 x 64"),\r
-    ('128', "128", "128 x 128"),\r
-    ('256', "256", "256 x 256"),\r
-    ('512', "512", "512 x 512"),\r
-    ('1024', "1024", "1024 x 1024"),\r
-)\r
-\r
-\r
-def _update_tile_size(self, context):\r
-    do_set_tile_size(context)\r
-\r
-\r
-class AutoTileSizeSettings(bpy.types.PropertyGroup):\r
-    gpu_choice = bpy.props.EnumProperty(\r
-        name="Target GPU Tile Size",\r
-        items=TILE_SIZES,\r
-        default='256',\r
-        description="Square dimentions of tiles",\r
-        update=_update_tile_size)\r
-\r
-    cpu_choice = bpy.props.EnumProperty(\r
-        name="Target CPU Tile Size",\r
-        items=TILE_SIZES,\r
-        default='32',\r
-        description="Square dimentions of tiles",\r
-        update=_update_tile_size)\r
-\r
-    bi_choice = bpy.props.EnumProperty(\r
-        name="Target CPU Tile Size",\r
-        items=TILE_SIZES,\r
-        default='64',\r
-        description="Square dimentions of tiles",\r
-        update=_update_tile_size)\r
-\r
-    # XXX There is no need for this to be an enum, a mere bool should be enough?\r
-    use_optimal = bpy.props.BoolProperty(\r
-        name="Optimal Tiles",\r
-        default=True,\r
-        description="Try to find a similar tile size for best performance, instead of using exact selected one",\r
-        update=_update_tile_size)\r
-\r
-    is_enabled = bpy.props.BoolProperty(\r
-        name="Auto Tile Size",\r
-        default=True,\r
-        description="Calculate the best tile size based on factors of the render size and the chosen target",\r
-        update=_update_tile_size)\r
-\r
-    use_advanced_ui = bpy.props.BoolProperty(\r
-        name="Advanced Settings",\r
-        default=False,\r
-        description="Show extra options for more control over the calculated tile size")\r
-\r
-    # Internally used props (not for GUI)\r
-    first_run = bpy.props.BoolProperty(default=True, options={'HIDDEN'})\r
-    threads_error = bpy.props.BoolProperty(options={'HIDDEN'})\r
-    prev_choice = bpy.props.StringProperty(default='', options={'HIDDEN'})\r
-    prev_engine = bpy.props.StringProperty(default='', options={'HIDDEN'})\r
-    prev_device = bpy.props.StringProperty(default='', options={'HIDDEN'})\r
-    prev_res = bpy.props.IntVectorProperty(default=(0, 0), size=2, options={'HIDDEN'})\r
-    prev_border = bpy.props.BoolProperty(default=False, options={'HIDDEN'})\r
-    prev_border_res = bpy.props.FloatVectorProperty(default=(0, 0, 0, 0), size=4, options={'HIDDEN'})\r
-    prev_actual_tile_size = bpy.props.IntVectorProperty(default=(0, 0), size=2, options={'HIDDEN'})\r
-    prev_threads = bpy.props.IntProperty(default=0, options={'HIDDEN'})\r
-\r
-\r
-def ats_poll(context):\r
-    scene = context.scene\r
-    if scene.render.engine not in SUPPORTED_RENDER_ENGINES or not scene.ats_settings.is_enabled:\r
-        return False\r
-    return True\r
-\r
-\r
-def ats_get_engine_is_gpu(engine, device, userpref):\r
-    return engine == 'CYCLES' and device == 'GPU' and userpref.system.compute_device_type != 'NONE'\r
-\r
-\r
-def ats_get_tilesize_prop(engine, device, userpref):\r
-    if ats_get_engine_is_gpu(engine, device, userpref):\r
-        return "gpu_choice"\r
-    elif engine == 'CYCLES':\r
-        return "cpu_choice"\r
-    return "bi_choice"\r
-\r
-\r
-@persistent\r
-def on_scene_update(scene):\r
-    context = bpy.context\r
-\r
-    if not ats_poll(context):\r
-        return\r
-\r
-    userpref = context.user_preferences\r
-\r
-    settings = scene.ats_settings\r
-    render = scene.render\r
-    engine = render.engine\r
-\r
-    # scene.cycles might not always exist (Cycles is an addon)...\r
-    device = scene.cycles.device if engine == 'CYCLES' else settings.prev_device\r
-    border = render.use_border\r
-    threads = render.threads\r
-\r
-    choice = getattr(settings, ats_get_tilesize_prop(engine, device, userpref))\r
-\r
-    res = get_actual_res(render)\r
-    actual_ts = (render.tile_x, render.tile_y)\r
-    border_res = (render.border_min_x, render.border_min_y, render.border_max_x, render.border_max_y)\r
-\r
-    # detect relevant changes in scene\r
-    do_change = (engine != settings.prev_engine or\r
-                 device != settings.prev_device or\r
-                 border != settings.prev_border or\r
-                 threads != settings.prev_threads or\r
-                 choice != settings.prev_choice or\r
-                 res != settings.prev_res[:] or\r
-                 border_res != settings.prev_border_res[:] or\r
-                 actual_ts != settings.prev_actual_tile_size[:])\r
-    if do_change:\r
-        do_set_tile_size(context)\r
-\r
-\r
-def get_actual_res(render):\r
-    rend_percent = render.resolution_percentage * 0.01\r
-    # floor is implicitly done by int conversion...\r
-    return (int(render.resolution_x * rend_percent), int(render.resolution_y * rend_percent))\r
-\r
-\r
-def do_set_tile_size(context):\r
-    if not ats_poll(context):\r
-        return False\r
-\r
-    scene = context.scene\r
-    userpref = context.user_preferences\r
-\r
-    settings = scene.ats_settings\r
-    render = scene.render\r
-    engine = render.engine\r
-    device = scene.cycles.device if engine == 'CYCLES' else settings.prev_device\r
-    border = render.use_border\r
-    threads = render.threads\r
-\r
-    realxres, realyres = xres, yres = res = get_actual_res(scene.render)\r
-\r
-    if border:\r
-        xres = round(xres * (render.border_max_x - render.border_min_x))\r
-        yres = round(yres * (render.border_max_y - render.border_min_y))\r
-\r
-    choice = getattr(settings, ats_get_tilesize_prop(engine, device, userpref))\r
-    target = int(choice)\r
-\r
-    numtiles_x = ceil(xres / target)\r
-    numtiles_y = ceil(yres / target)\r
-    if settings.use_optimal:\r
-        tile_x = ceil(xres / numtiles_x)\r
-        tile_y = ceil(yres / numtiles_y)\r
-    else:\r
-        tile_x = target\r
-        tile_y = target\r
-\r
-    print("Tile size: %dx%d (%dx%d tiles)" % (tile_x, tile_y, ceil(xres / tile_x), ceil(yres / tile_y)))\r
-\r
-    render.tile_x = tile_x\r
-    render.tile_y = tile_y\r
-\r
-    # Detect if there are fewer tiles than available threads\r
-    if ((numtiles_x * numtiles_y) < threads) and not ats_get_engine_is_gpu(engine, device, userpref):\r
-        settings.threads_error = True\r
-    else:\r
-        settings.threads_error = False\r
-\r
-    settings.prev_engine = engine\r
-    settings.prev_device = device\r
-    settings.prev_border = border\r
-    settings.prev_threads = threads\r
-    settings.prev_choice = choice\r
-    settings.prev_res = res\r
-    settings.prev_border_res = (render.border_min_x, render.border_min_y, render.border_max_x, render.border_max_y)\r
-    settings.prev_actual_tile_size = (tile_x, tile_y)\r
-    settings.first_run = False\r
-\r
-    return True\r
-\r
-\r
-class SetTileSize(bpy.types.Operator):\r
-    """The first render may not obey the tile-size set here"""\r
-    bl_idname = "render.autotilesize_set"\r
-    bl_label = "Set"\r
-\r
-    @classmethod\r
-    def poll(clss, context):\r
-        return ats_poll(context)\r
-\r
-    def execute(self, context):\r
-        if do_set_tile_size(context):\r
-            return {'FINISHED'}\r
-        return {'CANCELLED'}\r
-\r
-\r
-# ##### INTERFACE #####\r
-\r
-def ui_layout(engine, layout, context):\r
-    scene = context.scene\r
-    userpref = context.user_preferences\r
-\r
-    settings = scene.ats_settings\r
-    render = scene.render\r
-    engine = render.engine\r
-    device = scene.cycles.device if engine == 'CYCLES' else settings.prev_device\r
-\r
-    col = layout.column(align=True)\r
-    sub = col.column(align=True)\r
-    row = sub.row(align=True)\r
-    row.prop(settings, "is_enabled", toggle=True)\r
-    row.prop(settings, "use_advanced_ui", toggle=True, text="", icon='PREFERENCES')\r
-\r
-    sub = col.column(align=True)\r
-    sub.enabled = settings.is_enabled\r
-\r
-    if settings.use_advanced_ui:\r
-        sub.label("Target tile size:")\r
-\r
-        row = sub.row(align=True)\r
-        row.prop(settings, ats_get_tilesize_prop(engine, device, userpref), expand=True)\r
-        sub.prop(settings, "use_optimal", text="Calculate Optimal Size")\r
-\r
-    if settings.first_run:\r
-        sub = layout.column(align=True)\r
-        sub.operator("render.autotilesize_set", text="First-render fix", icon='ERROR')\r
-    elif settings.prev_device != device:\r
-        sub = layout.column(align=True)\r
-        sub.operator("render.autotilesize_set", text="Device changed - fix", icon='ERROR')\r
-\r
-    if (render.tile_x / render.tile_y > 2) or (render.tile_x / render.tile_y < 0.5):  # if not very square tile\r
-        sub.label(text="Warning: Tile size is not very square", icon='ERROR')\r
-        sub.label(text="    Try a slightly different resolution")\r
-        sub.label(text="    or choose \"Exact\" above")\r
-    if settings.threads_error:\r
-        sub.label(text="Warning: Fewer tiles than render threads", icon='ERROR')\r
-\r
-\r
-def menu_func_cycles(self, context):\r
-    ui_layout('CYCLES', self.layout, context)\r
-\r
-\r
-def menu_func_bi(self, context):\r
-    ui_layout('BLENDER_RENDER', self.layout, context)\r
-\r
-\r
-# ##### REGISTRATION #####\r
-\r
-def register():\r
-    bpy.utils.register_module(__name__)\r
-\r
-    bpy.types.Scene.ats_settings = bpy.props.PointerProperty(type=AutoTileSizeSettings)\r
-\r
-    # Note, the Cycles addon must be registered first, otherwise this panel doesn't exist - better be safe here!\r
-    cycles_panel = getattr(bpy.types, "CyclesRender_PT_performance", None)\r
-    if cycles_panel is not None:\r
-        cycles_panel.append(menu_func_cycles)\r
-\r
-    bpy.types.RENDER_PT_performance.append(menu_func_bi)\r
-    bpy.app.handlers.scene_update_post.append(on_scene_update)\r
-\r
-\r
-def unregister():\r
-    bpy.app.handlers.scene_update_post.remove(on_scene_update)\r
-    bpy.types.RENDER_PT_performance.remove(menu_func_bi)\r
-\r
-    cycles_panel = getattr(bpy.types, "CyclesRender_PT_performance", None)\r
-    if cycles_panel is not None:\r
-        cycles_panel.remove(menu_func_cycles)\r
-\r
-    del bpy.types.Scene.ats_settings\r
-\r
-    bpy.utils.unregister_module(__name__)\r
-\r
-\r
-if __name__ == "__main__":\r
-    register()\r