bl_info = {
    "name": "Tile Render",
    "blender": (2, 93, 0),
    "category": "Render",
    "location": "Properties > Render > Tile Render",
    "author": "Daniel Roberts",
    "warning": "",
    "version": (0, 1),
    "description": "Render an image as separate tiles!",
}

import bpy
addon_keymaps = []
currentTileX = -1
currentTileY = 0
tilesX = 3
tilesY = 3
print("RunScript")

def nextTile():
    global currentTileX
    global currentTileY
    global tilesX
    global tilesY
    currentTileX += 1
    if currentTileX > (tilesX - 1):
        if currentTileY < (tilesY - 1):
            currentTileY += 1
            currentTileX = 0
        else:
            currentTileY = 0
            currentTileX = 0

def previousTile():
    global currentTileX
    global currentTileY
    global tilesX
    global tilesY
    currentTileX -= 1
    if currentTileX < 0:
        if currentTileY > 0:
            currentTileY -= 1
            currentTileX = tilesX - 1
        else:
            currentTileY = tilesY - 1
            currentTileX = tilesX - 1

class SetTileForward(bpy.types.Operator):
    """Select next tile to render (F10)"""
    bl_idname = "render_tile.set_forward"
    bl_label = "Next Render Tile"
    bl_options = {'REGISTER', 'UNDO'}

    def execute(self, context):
        
        area = bpy.context.area.type
        bpy.context.area.type = 'VIEW_3D'
        bpy.context.area.spaces[0].region_3d.view_perspective = 'CAMERA'
        bpy.ops.view3d.view_center_camera()
        nextTile()
        bpy.context.scene.render.use_border = True
        bpy.context.scene.render.border_min_x = (1 / tilesX) * (currentTileX)
        bpy.context.scene.render.border_min_y = ((1 / tilesY) * (currentTileY+1) * -1) + 1
        bpy.context.scene.render.border_max_x = (1 / tilesX) * (currentTileX+1)
        bpy.context.scene.render.border_max_y = ((1 / tilesY) * (currentTileY)) * -1 + 1
        bpy.context.area.type = area
        
        return {'FINISHED'}

class SetTileBackward(bpy.types.Operator):
    """Select previous tile to render (Ctrl F10)"""
    bl_idname = "render_tile.set_backward"
    bl_label = "Previous Render Tile"
    bl_options = {'REGISTER', 'UNDO'}

    def execute(self, context):
        
        area = bpy.context.area.type
        bpy.context.area.type = 'VIEW_3D'
        bpy.context.area.spaces[0].region_3d.view_perspective = 'CAMERA'
        bpy.ops.view3d.view_center_camera()
        previousTile()
        bpy.context.scene.render.use_border = True
        bpy.context.scene.render.border_min_x = (1 / tilesX) * (currentTileX)
        bpy.context.scene.render.border_min_y = ((1 / tilesY) * (currentTileY+1) * -1) + 1
        bpy.context.scene.render.border_max_x = (1 / tilesX) * (currentTileX+1)
        bpy.context.scene.render.border_max_y = ((1 / tilesY) * (currentTileY)) * -1 + 1
        bpy.context.area.type = area
        
        return {'FINISHED'}

class RenderTilePanel(bpy.types.Panel):
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_label = 'Tile Render'
    bl_context = 'render'
    
    def draw(self, context):
        layout = self.layout
        #split = layout.split()
        col = layout.row(align=True)
        col.operator(SetTileBackward.bl_idname, icon="BACK")
        col.operator(SetTileForward.bl_idname, icon="FORWARD")

def menu_func(self, context):
    self.layout.menu(RenderTilePanel.bl_idname)

def register():
    #Draw and register
    bpy.utils.register_class(SetTileBackward)
    bpy.utils.register_class(SetTileForward)
    bpy.utils.register_class(RenderTilePanel)
    #Keymaps
    wm = bpy.context.window_manager
    kc = wm.keyconfigs.addon
    if kc:
        km = wm.keyconfigs.addon.keymaps.new(name='Image', space_type='IMAGE_EDITOR')
        kmi = km.keymap_items.new(SetTileForward.bl_idname, 'F10', 'PRESS', ctrl=False, shift=False)
        kmi = km.keymap_items.new(SetTileBackward.bl_idname, 'F10', 'PRESS', ctrl=False, shift=True)
        addon_keymaps.append((km, kmi))

def unregister():
    #Keymaps
    for km, kmi in addon_keymaps:
        km.keymap_items.remove(kmi)
    addon_keymaps.clear()
    #Erase and unregister
    bpy.utils.unregister_class(SetTileBackward)
    bpy.utils.unregister_class(RenderTilePanel)

if __name__ == "__main__":
    register()