[Bf-extensions-cvs] [a61732a0] master: Storypencil: New Storyboard add-on base on grease pencil

Antonio Vazquez noreply at git.blender.org
Thu Dec 8 14:09:24 CET 2022


Commit: a61732a0aa9739b083f6288a8b319e3c6ece9243
Author: Antonio Vazquez
Date:   Wed Dec 7 19:43:12 2022 +0100
Branches: master
https://developer.blender.org/rBAa61732a0aa9739b083f6288a8b319e3c6ece9243

Storypencil: New Storyboard add-on base on grease pencil

This add-on was in addons-contrib and now has been moved
to official.

===================================================================

A	storypencil/__init__.py
A	storypencil/dopesheet_overlay.py
A	storypencil/render.py
A	storypencil/scene_tools.py
A	storypencil/synchro.py
A	storypencil/ui.py
A	storypencil/utils.py

===================================================================

diff --git a/storypencil/__init__.py b/storypencil/__init__.py
new file mode 100644
index 00000000..1abd0261
--- /dev/null
+++ b/storypencil/__init__.py
@@ -0,0 +1,239 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+# ----------------------------------------------
+# Define Addon info
+# ----------------------------------------------
+bl_info = {
+    "name": "Storypencil - Storyboard Tools",
+    "description": "Storyboard tools",
+    "author": "Antonio Vazquez, Matias Mendiola, Daniel Martinez Lara, Rodrigo Blaas",
+    "version": (1, 1, 1),
+    "blender": (3, 3, 0),
+    "location": "",
+    "warning": "",
+    "category": "Sequencer",
+}
+
+# ----------------------------------------------
+# Import modules
+# ----------------------------------------------
+if "bpy" in locals():
+    import importlib
+
+    importlib.reload(utils)
+    importlib.reload(synchro)
+    importlib.reload(dopesheet_overlay)
+    importlib.reload(scene_tools)
+    importlib.reload(render)
+    importlib.reload(ui)
+else:
+    from . import utils
+    from . import synchro
+    from . import dopesheet_overlay
+    from . import scene_tools
+    from . import render
+    from . import ui
+
+import bpy
+from bpy.types import (
+    Scene,
+    WindowManager,
+    WorkSpace,
+)
+from bpy.props import (
+    BoolProperty,
+    IntProperty,
+    PointerProperty,
+    StringProperty,
+    EnumProperty,
+)
+
+# --------------------------------------------------------------
+# Register all operators, props and panels
+# --------------------------------------------------------------
+classes = (
+    synchro.STORYPENCIL_PG_Settings,
+    scene_tools.STORYPENCIL_OT_Setup,
+    scene_tools.STORYPENCIL_OT_NewScene,
+    synchro.STORYPENCIL_OT_WindowBringFront,
+    synchro.STORYPENCIL_OT_WindowCloseOperator,
+    synchro.STORYPENCIL_OT_SyncToggleSecondary,
+    synchro.STORYPENCIL_OT_SetSyncMainOperator,
+    synchro.STORYPENCIL_OT_AddSecondaryWindowOperator,
+    synchro.STORYPENCIL_OT_Switch,
+    synchro.STORYPENCIL_OT_TabSwitch,
+    render.STORYPENCIL_OT_RenderAction,
+    ui.STORYPENCIL_PT_Settings,
+    ui.STORYPENCIL_PT_SettingsNew,
+    ui.STORYPENCIL_PT_RenderPanel,
+    ui.STORYPENCIL_PT_General,
+    ui.STORYPENCIL_MT_extra_options,
+)
+
+
+def save_mode(self, context):
+    wm = context.window_manager
+    wm['storypencil_use_new_window'] = context.scene.storypencil_use_new_window
+    # Close all secondary windows
+    if context.scene.storypencil_use_new_window is False:
+        c = context.copy()
+        for win in context.window_manager.windows:
+            # Don't close actual window
+            if win == context.window:
+                continue
+            win_id = str(win.as_pointer())
+            if win_id != wm.storypencil_settings.main_window_id and win.parent is None:
+                c["window"] = win
+                bpy.ops.wm.window_close(c)
+
+
+addon_keymaps = []
+def register_keymaps():
+    addon = bpy.context.window_manager.keyconfigs.addon
+    km = addon.keymaps.new(name="Sequencer", space_type="SEQUENCE_EDITOR")
+    kmi = km.keymap_items.new(
+        idname="storypencil.tabswitch",
+        type="TAB",
+        value="PRESS",
+        shift=False, ctrl=False, alt = False, oskey=False,
+        )
+
+    addon_keymaps.append((km, kmi))
+
+def unregister_keymaps():
+    for km, kmi in addon_keymaps:
+        km.keymap_items.remove(kmi)
+    addon_keymaps.clear()
+
+def register():
+    from bpy.utils import register_class
+    for cls in classes:
+        register_class(cls)
+    register_keymaps()
+
+    Scene.storypencil_scene_duration = IntProperty(
+        name="Scene Duration",
+        description="Default Duration for new Scene",
+        default=48,
+        min=1,
+        soft_max=250,
+    )
+
+    Scene.storypencil_use_new_window = BoolProperty(name="Open in new window",
+                                                    description="Use secondary main window to edit scenes",
+                                                    default=False,
+                                                    update=save_mode)
+
+    Scene.storypencil_main_workspace = PointerProperty(type=WorkSpace,
+                                                       description="Main Workspace used for editing Storyboard")
+    Scene.storypencil_main_scene = PointerProperty(type=Scene,
+                                                   description="Main Scene used for editing Storyboard")
+    Scene.storypencil_edit_workspace = PointerProperty(type=WorkSpace,
+                                                       description="Workspace used for changing drawings")
+
+    Scene.storypencil_base_scene = PointerProperty(type=Scene,
+                                                   description="Template Scene used for creating new scenes")
+
+    Scene.storypencil_render_render_path = StringProperty(name="Output Path", subtype='FILE_PATH', maxlen=256,
+                                                          description="Directory/name to save files")
+
+    Scene.storypencil_name_prefix = StringProperty(name="Scene Name Prefix", maxlen=20, default="")
+
+    Scene.storypencil_name_suffix = StringProperty(name="Scene Name Suffix", maxlen=20, default="")
+
+    Scene.storypencil_render_onlyselected = BoolProperty(name="Render only Selected Strips",
+                                                         description="Render only the selected strips",
+                                                         default=True)
+
+    Scene.storypencil_render_channel = IntProperty(name="Channel",
+                                                   description="Channel to set the new rendered video",
+                                                   default=5, min=1, max=128)
+
+    Scene.storypencil_add_render_strip = BoolProperty(name="Import Rendered Strips",
+                                                      description="Add a Strip with the render",
+                                                      default=True)
+
+    Scene.storypencil_render_step = IntProperty(name="Image Steps",
+                                                description="Minimum frames number to generate images between keyframes (0 to disable)",
+                                                default=0, min=0, max=128)
+
+    Scene.storypencil_render_numbering = EnumProperty(name="Image Numbering",
+                                                      items=(
+                                                            ('1', "Frame", "Use real frame number"),
+                                                            ('2', "Consecutive", "Use sequential numbering"),
+                                                            ),
+                                                      description="Defines how frame is named")
+
+    Scene.storypencil_add_render_byfolder = BoolProperty(name="Folder by Strip",
+                                                         description="Create a separated folder for each strip",
+                                                         default=True)
+
+    WindowManager.storypencil_settings = PointerProperty(
+        type=synchro.STORYPENCIL_PG_Settings,
+        name="Storypencil settings",
+        description="Storypencil tool settings",
+    )
+
+    # Append Handlers
+    bpy.app.handlers.frame_change_post.clear()
+    bpy.app.handlers.frame_change_post.append(synchro.on_frame_changed)
+    bpy.app.handlers.load_post.append(synchro.sync_autoconfig)
+
+    bpy.context.window_manager.storypencil_settings.active = False
+    bpy.context.window_manager.storypencil_settings.main_window_id = ""
+    bpy.context.window_manager.storypencil_settings.secondary_windows_ids = ""
+
+    # UI integration in dopesheet header
+    bpy.types.DOPESHEET_HT_header.append(synchro.draw_sync_header)
+    dopesheet_overlay.register()
+
+    synchro.sync_autoconfig()
+
+    # UI integration in VSE header
+    bpy.types.SEQUENCER_HT_header.remove(synchro.draw_sync_sequencer_header)
+    bpy.types.SEQUENCER_HT_header.append(synchro.draw_sync_sequencer_header)
+
+    bpy.types.SEQUENCER_MT_add.append(scene_tools.draw_new_scene)
+    bpy.types.VIEW3D_MT_draw_gpencil.append(scene_tools.setup_storyboard)
+
+
+def unregister():
+    unregister_keymaps()
+
+    from bpy.utils import unregister_class
+    for cls in reversed(classes):
+        unregister_class(cls)
+
+    # Remove Handlers
+    if bpy.app.handlers.frame_change_post:
+        bpy.app.handlers.frame_change_post.remove(synchro.on_frame_changed)
+    bpy.app.handlers.load_post.remove(synchro.sync_autoconfig)
+
+    # remove UI integration
+    bpy.types.DOPESHEET_HT_header.remove(synchro.draw_sync_header)
+    dopesheet_overlay.unregister()
+    bpy.types.SEQUENCER_HT_header.remove(synchro.draw_sync_sequencer_header)
+
+    bpy.types.SEQUENCER_MT_add.remove(scene_tools.draw_new_scene)
+    bpy.types.VIEW3D_MT_draw_gpencil.remove(scene_tools.setup_storyboard)
+
+    del Scene.storypencil_scene_duration
+    del WindowManager.storypencil_settings
+
+    del Scene.storypencil_base_scene
+    del Scene.storypencil_main_workspace
+    del Scene.storypencil_main_scene
+    del Scene.storypencil_edit_workspace
+
+    del Scene.storypencil_render_render_path
+    del Scene.storypencil_name_prefix
+    del Scene.storypencil_name_suffix
+    del Scene.storypencil_render_onlyselected
+    del Scene.storypencil_render_channel
+    del Scene.storypencil_render_step
+    del Scene.storypencil_add_render_strip
+    del Scene.storypencil_render_numbering
+    del Scene.storypencil_add_render_byfolder
+
+if __name__ == '__main__':
+    register()
diff --git a/storypencil/dopesheet_overlay.py b/storypencil/dopesheet_overlay.py
new file mode 100644
index 00000000..2c00d8e9
--- /dev/null
+++ b/storypencil/dopesheet_overlay.py
@@ -0,0 +1,179 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+import typing
+
+import bpy
+import gpu
+from gpu_extras.batch import batch_for_shader
+
+from .utils import (redraw_all_areas_by_type)
+from .synchro import (is_secondary_window, window_id, get_main_strip)
+
+Int3 = typing.Tuple[int, int, int]
+
+Float2 = typing.Tuple[float, float]
+Float3 = typing.Tuple[float, float

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list