From 860e9710a56c137cc6cc8ddf1ce3d633d3fb8014 Mon Sep 17 00:00:00 2001 From: Pullusb Date: Sat, 30 Jan 2021 01:19:48 +0100 Subject: GPencil Tools: Add reset camera rotation feature Rotate canvas: Quick press/release of the shortcut now align camera with Global-Z. It was only possible in free navigation before. Timeline scrub: Now respect "limit to frame range" option if activated Pref register: Code cleanup --- greasepencil_tools/__init__.py | 2 +- greasepencil_tools/prefs.py | 13 ++++++++---- greasepencil_tools/rotate_canvas.py | 10 ++++++++- greasepencil_tools/timeline_scrub.py | 40 ++++++++++++++++++++++++++++-------- 4 files changed, 50 insertions(+), 15 deletions(-) (limited to 'greasepencil_tools') diff --git a/greasepencil_tools/__init__.py b/greasepencil_tools/__init__.py index e5135422..9ac882ba 100644 --- a/greasepencil_tools/__init__.py +++ b/greasepencil_tools/__init__.py @@ -21,7 +21,7 @@ bl_info = { "name": "Grease Pencil Tools", "description": "Extra tools for Grease Pencil", "author": "Samuel Bernou, Antonio Vazquez, Daniel Martinez Lara, Matias Mendiola", -"version": (1, 2, 1), +"version": (1, 2, 2), "blender": (2, 91, 0), "location": "Sidebar > Grease Pencil > Grease Pencil Tools", "warning": "", diff --git a/greasepencil_tools/prefs.py b/greasepencil_tools/prefs.py index b8b9894d..fff0f18c 100644 --- a/greasepencil_tools/prefs.py +++ b/greasepencil_tools/prefs.py @@ -245,14 +245,19 @@ def unregister_keymaps(): ### REGISTER --- +classes = ( + GPTS_timeline_settings, + GreasePencilAddonPrefs, +) + def register(): - bpy.utils.register_class(GPTS_timeline_settings) - bpy.utils.register_class(GreasePencilAddonPrefs) + for cls in classes: + bpy.utils.register_class(cls) # Force box deform running to false bpy.context.preferences.addons[os.path.splitext(__name__)[0]].preferences.boxdeform_running = False register_keymaps() def unregister(): unregister_keymaps() - bpy.utils.unregister_class(GreasePencilAddonPrefs) - bpy.utils.unregister_class(GPTS_timeline_settings) + for cls in reversed(classes): + bpy.utils.unregister_class(cls) diff --git a/greasepencil_tools/rotate_canvas.py b/greasepencil_tools/rotate_canvas.py index aec6e900..e2ada531 100644 --- a/greasepencil_tools/rotate_canvas.py +++ b/greasepencil_tools/rotate_canvas.py @@ -95,7 +95,15 @@ class RC_OT_RotateCanvas(bpy.types.Operator): if not self.angle: # self.report({'INFO'}, 'Reset') aim = context.space_data.region_3d.view_rotation @ mathutils.Vector((0.0, 0.0, 1.0))#view vector - context.space_data.region_3d.view_rotation = aim.to_track_quat('Z','Y')#track Z, up Y + z_up_quat = aim.to_track_quat('Z','Y')#track Z, up Y + if self.in_cam: + if self.cam.parent: + cam_quat = self.cam.parent.matrix_world.inverted().to_quaternion() @ z_up_quat + else: + cam_quat = z_up_quat + self.cam.rotation_euler = cam_quat.to_euler('XYZ') + else: + context.space_data.region_3d.view_rotation = z_up_quat self.execute(context) return {'FINISHED'} diff --git a/greasepencil_tools/timeline_scrub.py b/greasepencil_tools/timeline_scrub.py index 1f89f4d1..dfffdeaa 100644 --- a/greasepencil_tools/timeline_scrub.py +++ b/greasepencil_tools/timeline_scrub.py @@ -143,8 +143,17 @@ class GPTS_OT_time_scrub(bpy.types.Operator): self.snap_on = False self.mouse = (event.mouse_region_x, event.mouse_region_y) self.init_mouse_x = self.cursor_x = event.mouse_region_x + # self.init_mouse_y = event.mouse_region_y # only to display init frame text self.init_frame = self.new_frame = context.scene.frame_current + self.lock_range = context.scene.lock_frame_selection_to_range + if context.scene.use_preview_range: + self.f_start = context.scene.frame_preview_start + self.f_end = context.scene.frame_preview_end + else: + self.f_start = context.scene.frame_start + self.f_end = context.scene.frame_end + self.offset = 0 self.pos = [] @@ -181,17 +190,13 @@ class GPTS_OT_time_scrub(bpy.types.Operator): for frame in layer.frames: if frame.frame_number not in self.pos: self.pos.append(frame.frame_number) + # Add start and end to snap on - if context.scene.use_preview_range: - play_bounds = [context.scene.frame_preview_start, - context.scene.frame_preview_end] - else: - play_bounds = [context.scene.frame_start, context.scene.frame_end] + # Also snap on play bounds (sliced off for keyframe display) - self.pos += play_bounds - self.pos = np.asarray(self.pos) + self.pos += [self.f_start, self.f_end] # Disable Onion skin self.active_space_data = context.space_data @@ -240,9 +245,9 @@ class GPTS_OT_time_scrub(bpy.types.Operator): # Add start/end boundary bracket to HUD start_x = self.init_mouse_x + \ - (play_bounds[0] - self.init_frame) * self.px_step + (self.f_start - self.init_frame) * self.px_step end_x = self.init_mouse_x + \ - (play_bounds[1] - self.init_frame) * self.px_step + (self.f_end - self.init_frame) * self.px_step # start up = (start_x, my - (bound_h/2)) @@ -318,6 +323,15 @@ class GPTS_OT_time_scrub(bpy.types.Operator): self.batch_keyframes = batch_for_shader( shader, 'TRIS', {"pos": shaped_key}, indices=indices) + # Trim snapping list of frame outside of frame range if range lock activated + # (after drawing batch so those are still showed) + if self.lock_range: + self.pos = [i for i in self.pos if self.f_start <= i <= self.f_end] + + # convert frame list to array for numpy snap utility + self.pos = np.asarray(self.pos) + + args = (self, context) self.viewtype = None self.spacetype = 'WINDOW' # is PREVIEW for VSE, needed for handler remove @@ -371,6 +385,14 @@ class GPTS_OT_time_scrub(bpy.types.Operator): if self.snap_on or mod_snap: self.new_frame = nearest(self.pos, self.new_frame) + # frame range restriction + if self.lock_range: + if self.new_frame < self.f_start: + self.new_frame = self.f_start + elif self.new_frame > self.f_end: + self.new_frame = self.f_end + + # context.scene.frame_set(self.new_frame) context.scene.frame_current = self.new_frame # - recalculate offset to snap cursor to frame -- cgit v1.2.3