depth move - UI cahnge and changelog file
1.2.0: - feat: New depth move operator that handle both perspective and orthographic cam - feat: Realign, added drawing plane checkbox to autoset to Front after realign - UI: Reorganised realign panel - UI: Switched part of the sidebar items to columns intead of basic layout to gain space - doc: Added changelog file (moved list from readme) - doc: relative link to changelog and FR_readme in main readmegpv2
parent
bf85582f28
commit
3594c4812d
|
@ -0,0 +1,281 @@
|
||||||
|
# Changelog
|
||||||
|
|
||||||
|
1.2.0:
|
||||||
|
|
||||||
|
- feat: New depth move operator that handle both perspective and orthographic cam
|
||||||
|
- feat: Realign, added drawing plane checkbox to autoset to Front after realign
|
||||||
|
- UI: Reorganised realign panel
|
||||||
|
- UI: Switched part of the sidebar items to columns intead of basic layout to gain space
|
||||||
|
- doc: Added changelog file (moved list from readme)
|
||||||
|
- doc: relative link to changelog and FR_readme in main readme
|
||||||
|
|
||||||
|
1.1.0:
|
||||||
|
|
||||||
|
- Important change : Remap relative is now disabled by default in addon preferences
|
||||||
|
- feat: Add realign operator in sidebar with reproject as true by default
|
||||||
|
- UI: Batch reproject all frames is now in menus. Same places as native reproject
|
||||||
|
|
||||||
|
1.0.9:
|
||||||
|
|
||||||
|
- feat: Reproject all frames operator
|
||||||
|
|
||||||
|
1.0.8:
|
||||||
|
|
||||||
|
- feat: Keyframe jump filter added in UI to change general behavior. Keymap own jump filter can override this new global settings if specified
|
||||||
|
|
||||||
|
1.0.7:
|
||||||
|
|
||||||
|
- feat: Keyframe jump filter by type. User can now choose if the shortcut should jump on a specific keyframe type (All by default)
|
||||||
|
|
||||||
|
1.0.5:
|
||||||
|
|
||||||
|
- GP copy-paste : Pasted stroke are now selected (allow to use it to quickly rip/split strokes with cut/paste on the same layer)
|
||||||
|
|
||||||
|
1.0.4:
|
||||||
|
|
||||||
|
- UI: Better cam ref exposition in Toolbox panel
|
||||||
|
- Access to opacity
|
||||||
|
- merge activation bool with source type icon
|
||||||
|
- feat: Added a clear active frame operator (`gp.clear_active_frame` to add manually in keymaps)
|
||||||
|
|
||||||
|
1.0.3:
|
||||||
|
|
||||||
|
- feat: add "Append Materials To Selected" to material submenu. Append materials to other selected GP objects if there aren't there.
|
||||||
|
|
||||||
|
1.0.2:
|
||||||
|
|
||||||
|
- pref: Added option to disable always remap relative on save in addon-preference
|
||||||
|
|
||||||
|
1.0.1:
|
||||||
|
|
||||||
|
- fix: copy paste problems
|
||||||
|
- Get points uv_properties (used for brushed points)
|
||||||
|
- Trigger an update on each pasted strokes, recalculate badly drawn uv and fills (works in 2.93+)
|
||||||
|
|
||||||
|
1.0.0:
|
||||||
|
|
||||||
|
- Compatible with official grease pencil tools
|
||||||
|
- removed box deform and rotate canvas that existed in other
|
||||||
|
|
||||||
|
0.9.3:
|
||||||
|
|
||||||
|
- feat: keyframe jump keys are now auto-binded
|
||||||
|
- UI: added keyframe jump customisation in addon pref
|
||||||
|
- code: split keyframe jump in a separate file with his new key updater
|
||||||
|
|
||||||
|
0.9.2:
|
||||||
|
|
||||||
|
- doc: Correct download link (important, bugged the addon install) + update
|
||||||
|
- code: added tracker url
|
||||||
|
- updater: remove updater temp file, reset minimum version, turn off verbose mode
|
||||||
|
|
||||||
|
0.9.1:
|
||||||
|
|
||||||
|
- Public release
|
||||||
|
- prefs: added fps as part of project settings
|
||||||
|
- check file use pref fps value (previously used harcoded 24fps value)
|
||||||
|
- cleanup: Remove wip GMIC-bridge tools that need to be done separately (if needed)
|
||||||
|
- update: apply changes in integrated copy-paste from the last version of standalone addon
|
||||||
|
- doc: Added fully-detailed french readme
|
||||||
|
|
||||||
|
|
||||||
|
0.8.0:
|
||||||
|
|
||||||
|
- feat: Added background_rendering playblast, derivating from Tonton's playblaster
|
||||||
|
- stripped associated properties from properties.py and passed as wm props.
|
||||||
|
|
||||||
|
0.7.2:
|
||||||
|
|
||||||
|
- fix: Palette importer bug
|
||||||
|
|
||||||
|
0.7.0:
|
||||||
|
|
||||||
|
- feat: auto create empty frame on color layer
|
||||||
|
|
||||||
|
0.6.3:
|
||||||
|
|
||||||
|
- shortcut: added 1,2,3 to change sculpt mask mode (like native edit mode shortcut)
|
||||||
|
|
||||||
|
0.6.2:
|
||||||
|
|
||||||
|
- feat: colorisation, Option to change stop lines length
|
||||||
|
- Change behavior of `cursor_snap` ops when a non-GP object is selected to mode: `surface project`
|
||||||
|
- Minor refactor for submodule register
|
||||||
|
|
||||||
|
0.6.1:
|
||||||
|
|
||||||
|
- feat: render objects grouped, one anim render with all ticked object using manual output name
|
||||||
|
|
||||||
|
0.6.0:
|
||||||
|
|
||||||
|
- feat: Include GP clipoard's "In place" custom cut/copy/paste using OS clipboard
|
||||||
|
|
||||||
|
0.5.9:
|
||||||
|
|
||||||
|
- feat: render exporter
|
||||||
|
- Render a selection of GP object isolated from the rest
|
||||||
|
- added exclusions names for GP object listing
|
||||||
|
- setup settings and output according to a name
|
||||||
|
- open render folder
|
||||||
|
- check file: set onion skin keyframe filter to 'All_type' on all GP datablock
|
||||||
|
- check file: set scene resolution to settings in prefs (default 2048x1080)
|
||||||
|
|
||||||
|
0.5.8:
|
||||||
|
|
||||||
|
- feat: GP material append on active object from single blend file
|
||||||
|
|
||||||
|
0.5.7:
|
||||||
|
|
||||||
|
- Added warning message for cursor snapping
|
||||||
|
|
||||||
|
0.5.5 - 0.5.6:
|
||||||
|
|
||||||
|
- check file: added check for placement an projection mode for Gpencil.
|
||||||
|
- add a slider to change edit_lines_opacity globally for all GP data at once
|
||||||
|
- check file: auto-check additive drawing (to avoid empty frame with "only selected channel" in Dopesheet)
|
||||||
|
|
||||||
|
0.5.4:
|
||||||
|
|
||||||
|
- feat: anim manager in his own GP_toolbox submenu:
|
||||||
|
- button to list disabled anim (allow to quickly check state of the scene)
|
||||||
|
- disable/enable all fcurve in for GP object or other object separately to paint
|
||||||
|
- shift clic to target selection only
|
||||||
|
- check file: added disabled fcurved counter alert with detail in console
|
||||||
|
|
||||||
|
0.5.3:
|
||||||
|
|
||||||
|
- fix: broken obj cam (add custom prop on objcam to track wich was main cam)
|
||||||
|
- check file option: change select active tool (choice added in addon preferences)
|
||||||
|
|
||||||
|
0.5.2:
|
||||||
|
|
||||||
|
- Revert back obj_cam operator for following object (native lock view follow only translation)
|
||||||
|
- Changed method for canvas rotation to more robust rotate axis.
|
||||||
|
- Add operators on link checker to open containing folder/file of link
|
||||||
|
- Refactor: file checkers in their own file
|
||||||
|
|
||||||
|
0.5.1:
|
||||||
|
|
||||||
|
- fix: error when empty material slot on GP object.
|
||||||
|
- fix: cursor snap on GP canvas when GP is parented
|
||||||
|
- change: Deleted obj cam (and related set view) operator
|
||||||
|
- change: blacker note background for playblast (stamp_background)
|
||||||
|
- feat: Always playblast from main camera (if in draw_cam)
|
||||||
|
- feat: Handler added to Remap relative on save (pre)
|
||||||
|
- ops: Check for broken links with porposition to find missing files
|
||||||
|
- ops: Added basic hardcoded file checker
|
||||||
|
- Lock main cam
|
||||||
|
- set scene percentage at 100
|
||||||
|
- set show slider and sync range
|
||||||
|
- set fps to 24
|
||||||
|
|
||||||
|
0.4.6:
|
||||||
|
|
||||||
|
- feat: basic Palette manager with base material check and warning
|
||||||
|
|
||||||
|
0.4.5:
|
||||||
|
|
||||||
|
- open blender config folder from addon preference
|
||||||
|
- fix: obj cam parent on selected object
|
||||||
|
- added wip rotate canvas axis file. still not ready to replace current canvas rotate:
|
||||||
|
- freeview : bug when rotating free viewfrom cardianl views
|
||||||
|
- camview: potential bug when cam is parented with some specific angle (could not reproduce)
|
||||||
|
|
||||||
|
|
||||||
|
0.4.4:
|
||||||
|
|
||||||
|
- feat: added cursor follow handlers and UI toggle
|
||||||
|
|
||||||
|
0.4.3:
|
||||||
|
|
||||||
|
- change playblast out to 'images' and add playblast as name prefix
|
||||||
|
|
||||||
|
0.4.2:
|
||||||
|
|
||||||
|
- feat: GP canvas cursor snap wiht new `view3d.cusor_snap` operator
|
||||||
|
- fix: canvas rotate works with parented camera !
|
||||||
|
- wip: added an attmpt to replicate camera rotate modal with view matrix but no luck.
|
||||||
|
|
||||||
|
0.4.1:
|
||||||
|
|
||||||
|
- feat: Alternative cameras: parent to main cam (roll without affecting main cam), parent to active object at current view (follow current Grease pencil object)
|
||||||
|
|
||||||
|
0.4.0:
|
||||||
|
|
||||||
|
- Added a standalone working version of box_deform (stripped preferences keeping only best configuration with autoswap)
|
||||||
|
|
||||||
|
0.3.8:
|
||||||
|
|
||||||
|
- UI: expose onion skin in interface
|
||||||
|
- UI: expose autolock in interface
|
||||||
|
- UI : putted tint layers in a submenu
|
||||||
|
- code: refactor, pushed most of class register in their owner file
|
||||||
|
- tool: tool to rename current or all grease pencil datablock with different name than container object
|
||||||
|
|
||||||
|
0.3.7:
|
||||||
|
|
||||||
|
- UI: new interface with tabs for addon preferences
|
||||||
|
- UI: possible to disable color panel from preference (might be deleted if unusable)
|
||||||
|
- docs: change readme changelog format and correct doc
|
||||||
|
|
||||||
|
0.3.6:
|
||||||
|
|
||||||
|
- UI: Stoplines : add a button for quickly set stoplines visibility.
|
||||||
|
|
||||||
|
0.3.5:
|
||||||
|
|
||||||
|
- Fix : No more camera rotation undo when ctrl+Z on next stroke (canvas rotate push and undo)
|
||||||
|
- Fix: Enter key added to valid object-breakdown modal.
|
||||||
|
|
||||||
|
0.3.3:
|
||||||
|
|
||||||
|
- version 1 beta (stable) of line gap closing tools for better bucket fill tool performance with UI
|
||||||
|
|
||||||
|
0.3.3:
|
||||||
|
|
||||||
|
- version 1 beta of gmic colorize
|
||||||
|
- variant of `screen.gp_keyframe_jump` through keymap seetings
|
||||||
|
|
||||||
|
0.3.0:
|
||||||
|
|
||||||
|
- new homemade [breakdowner operator for object](https://blenderartists.org/t/pose-mode-animation-tools-for-object-mode/1221322) mode with auto keymap : Shift + E
|
||||||
|
- GP cutter shortcut ops to map with `wm.temp_cutter` (with "Any" as press mode) or `wm.sticky_cutter` (Modal sticky-key version)
|
||||||
|
|
||||||
|
0.2.3:
|
||||||
|
|
||||||
|
- add operator to `screen.gp_keyframe_jump`
|
||||||
|
- add shortcut to rotate canvas
|
||||||
|
- fix duplicate class
|
||||||
|
|
||||||
|
0.2.2:
|
||||||
|
|
||||||
|
- separated props resolution_percentage parameter
|
||||||
|
- playblast options for launching folder and opening folder
|
||||||
|
|
||||||
|
0.2.1:
|
||||||
|
|
||||||
|
- playblast feature
|
||||||
|
- Button to go zoom 100% or fit screen
|
||||||
|
- display scene resolution with res indicator
|
||||||
|
- Fix reference panel : works with video and display in a box layout.
|
||||||
|
- close pseudo-color panel by default (plan to move it to Gpencil tab)
|
||||||
|
|
||||||
|
0.2.0:
|
||||||
|
|
||||||
|
- UI: Toggle camera background images from Toolbox panel
|
||||||
|
- UI: quick access to passepartout
|
||||||
|
- Feature: option to use namespace for pseudo color
|
||||||
|
|
||||||
|
0.1.5:
|
||||||
|
|
||||||
|
- added CGC-auto-updater
|
||||||
|
|
||||||
|
0.1.3:
|
||||||
|
|
||||||
|
- flip cam x
|
||||||
|
- inital stage of overlay toggle (need pref/multiple pref)
|
||||||
|
|
||||||
|
0.1.2:
|
||||||
|
|
||||||
|
- subpanel of GP data (instead of direct append)
|
||||||
|
- initial commit with GP pseudo color
|
|
@ -0,0 +1,120 @@
|
||||||
|
import bpy
|
||||||
|
from mathutils import Vector
|
||||||
|
|
||||||
|
class ODM_OT_depth_move(bpy.types.Operator):
|
||||||
|
bl_idname = "object.depth_proportional_move"
|
||||||
|
bl_label = "Depth move"
|
||||||
|
bl_description = "Move object in the depth from camera POV while retaining same size in framing"
|
||||||
|
bl_options = {"REGISTER", "UNDO"}
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
return context.object and context.object.type != 'CAMERA' # and context.scene.camera
|
||||||
|
|
||||||
|
def invoke(self, context, event):
|
||||||
|
self.init_mouse_x = event.mouse_x
|
||||||
|
self.cam = bpy.context.scene.camera
|
||||||
|
if not self.cam:
|
||||||
|
self.report({'ERROR'}, 'No active camera')
|
||||||
|
return {"CANCELLED"}
|
||||||
|
|
||||||
|
self.cam_pos = self.cam.matrix_world.translation
|
||||||
|
self.mode = 'distance'
|
||||||
|
self.objects = [o for o in context.selected_objects if o.type != 'CAMERA']
|
||||||
|
self.init_mats = [o.matrix_world.copy() for o in self.objects]
|
||||||
|
|
||||||
|
if self.cam.data.type == 'ORTHO':
|
||||||
|
context.area.header_text_set(f'Move factor: 0.00')
|
||||||
|
# distance is view vector based
|
||||||
|
self.view_vector = Vector((0,0,-1))
|
||||||
|
self.view_vector.rotate(self.cam.matrix_world)
|
||||||
|
else:
|
||||||
|
self.init_vecs = [o.matrix_world.translation - self.cam_pos for o in self.objects]
|
||||||
|
self.init_dists = [v.length for v in self.init_vecs]
|
||||||
|
context.area.header_text_set(f'Move factor: 0.00 | Mode: {self.mode} (M to switch)')
|
||||||
|
|
||||||
|
context.window_manager.modal_handler_add(self)
|
||||||
|
return {'RUNNING_MODAL'}
|
||||||
|
|
||||||
|
def modal(self, context, event):
|
||||||
|
if self.mode == 'distance':
|
||||||
|
factor = 0.1
|
||||||
|
if event.shift:
|
||||||
|
factor = 0.01
|
||||||
|
|
||||||
|
else:
|
||||||
|
# Smaller factor for proportional dist
|
||||||
|
factor = 0.01
|
||||||
|
if event.shift:
|
||||||
|
factor = 0.001
|
||||||
|
|
||||||
|
if event.type in {'MOUSEMOVE'}:
|
||||||
|
diff = (event.mouse_x - self.init_mouse_x) * factor
|
||||||
|
|
||||||
|
if self.cam.data.type == 'ORTHO':
|
||||||
|
# just push in view vector direction
|
||||||
|
context.area.header_text_set(f'Move factor: {diff:.2f}')
|
||||||
|
for i, obj in enumerate(self.objects):
|
||||||
|
new_vec = self.init_mats[i].translation + (self.view_vector * diff)
|
||||||
|
obj.matrix_world.translation = new_vec
|
||||||
|
else:
|
||||||
|
# Push from camera point and scale accordingly
|
||||||
|
context.area.header_text_set(f'Move factor: {diff:.2f} | Mode: {self.mode} (M to switch)')
|
||||||
|
|
||||||
|
for i, obj in enumerate(self.objects):
|
||||||
|
if self.mode == 'distance':
|
||||||
|
## move with the same length for everyone
|
||||||
|
new_vec = self.init_vecs[i] + (self.init_vecs[i].normalized() * diff)
|
||||||
|
|
||||||
|
else:
|
||||||
|
## move with proportional factor from individual distance vector to camera
|
||||||
|
new_vec = self.init_vecs[i] + (self.init_vecs[i] * diff)
|
||||||
|
|
||||||
|
obj.matrix_world.translation = self.cam_pos + new_vec
|
||||||
|
dist_percentage = new_vec.length / self.init_dists[i]
|
||||||
|
|
||||||
|
obj.scale = self.init_mats[i].to_scale() * dist_percentage
|
||||||
|
|
||||||
|
if event.type in {'M'} and event.value == 'PRESS':
|
||||||
|
# Switch mode
|
||||||
|
self.mode = 'distance' if self.mode == 'proportional' else 'proportional'
|
||||||
|
|
||||||
|
if event.type in {'LEFTMOUSE'} and event.value == 'PRESS':
|
||||||
|
context.area.header_text_set(None)
|
||||||
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
if event.type in {'RIGHTMOUSE', 'ESC'} and event.value == 'PRESS':
|
||||||
|
for i, obj in enumerate(self.objects):
|
||||||
|
obj.matrix_world = self.init_mats[i]
|
||||||
|
context.area.header_text_set(None)
|
||||||
|
return {"CANCELLED"}
|
||||||
|
|
||||||
|
return {"RUNNING_MODAL"}
|
||||||
|
|
||||||
|
""" # Own standalone panel
|
||||||
|
class ODM_PT_sudden_depth_panel(bpy.types.Panel):
|
||||||
|
bl_space_type = "VIEW_3D"
|
||||||
|
bl_region_type = "UI"
|
||||||
|
bl_category = "Gpencil"
|
||||||
|
bl_label = "Depth move"
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
row = layout.row()
|
||||||
|
row.operator('object.depth_proportional_move', text='Depth move', icon='TRANSFORM_ORIGINS')
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
### --- REGISTER ---
|
||||||
|
|
||||||
|
classes=(
|
||||||
|
ODM_OT_depth_move,
|
||||||
|
)
|
||||||
|
|
||||||
|
def register():
|
||||||
|
for cls in classes:
|
||||||
|
bpy.utils.register_class(cls)
|
||||||
|
|
||||||
|
def unregister():
|
||||||
|
for cls in reversed(classes):
|
||||||
|
bpy.utils.unregister_class(cls)
|
|
@ -225,6 +225,9 @@ class GPTB_OT_realign(bpy.types.Operator):
|
||||||
name='All Strokes', default=True,
|
name='All Strokes', default=True,
|
||||||
description='Hided and locked layer will also be reprojected')
|
description='Hided and locked layer will also be reprojected')
|
||||||
|
|
||||||
|
set_draw_axis : bpy.props.BoolProperty(
|
||||||
|
name='Set draw axis to Front', default=True,
|
||||||
|
description='Set the gpencil draw plane axis to Front')
|
||||||
## add option to bake strokes if rotation anim is not constant ? might generate too many Keyframes
|
## add option to bake strokes if rotation anim is not constant ? might generate too many Keyframes
|
||||||
|
|
||||||
def invoke(self, context, event):
|
def invoke(self, context, event):
|
||||||
|
@ -248,17 +251,41 @@ class GPTB_OT_realign(bpy.types.Operator):
|
||||||
|
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
layout.label(text='Realign the GP : Front axis facing active camera')
|
layout.label(text='Realign the GP object : Front axis facing active camera')
|
||||||
if self.alert:
|
if self.alert:
|
||||||
layout.label(text=self.alert, icon='ERROR')
|
layout.label(text=self.alert, icon='ERROR')
|
||||||
layout.label(text='(rotations key will be overwritten to face camera)')
|
layout.label(text='(rotations key will be overwritten to face camera)')
|
||||||
layout.separator()
|
|
||||||
layout.prop(self, "reproject")
|
# layout.separator()
|
||||||
|
box = layout.box()
|
||||||
|
box.prop(self, "reproject")
|
||||||
if self.reproject:
|
if self.reproject:
|
||||||
layout.label(text='After Realigning, reproject each frames on front axis')
|
box.label(text='After Realigning, reproject each frames on front axis')
|
||||||
if not context.region_data.view_perspective == 'CAMERA':
|
if not context.region_data.view_perspective == 'CAMERA':
|
||||||
layout.label(text='Not in camera ! (reprojection is made from view)', icon='ERROR')
|
box.label(text='Not in camera ! (reprojection is made from view)', icon='ERROR')
|
||||||
layout.prop(self, "all_strokes")
|
box.prop(self, "all_strokes")
|
||||||
|
if not self.all_strokes:
|
||||||
|
box.label(text='Only visible and unlocked layers will be reprojected', icon='INFO')
|
||||||
|
|
||||||
|
axis = context.scene.tool_settings.gpencil_sculpt.lock_axis
|
||||||
|
if axis != 'AXIS_Y':
|
||||||
|
orient = {
|
||||||
|
'VIEW' : ['View', 'RESTRICT_VIEW_ON'],
|
||||||
|
# 'AXIS_Y': ['front (X-Z)', 'AXIS_FRONT'], #
|
||||||
|
'AXIS_X': ['side (Y-Z)', 'AXIS_SIDE'],
|
||||||
|
'AXIS_Z': ['top (X-Y)', 'AXIS_TOP'],
|
||||||
|
'CURSOR': ['Cursor', 'PIVOT_CURSOR'],
|
||||||
|
}
|
||||||
|
|
||||||
|
box = layout.box()
|
||||||
|
box.label(text=f'Current drawing plane : {orient[axis][0]}', icon=orient[axis][1])
|
||||||
|
box.prop(self, "set_draw_axis")
|
||||||
|
|
||||||
|
|
||||||
|
def exit(self, context, frame):
|
||||||
|
context.scene.frame_current = frame
|
||||||
|
if context.scene.tool_settings.gpencil_sculpt.lock_axis != 'AXIS_Y' and self.set_draw_axis:
|
||||||
|
context.scene.tool_settings.gpencil_sculpt.lock_axis = 'AXIS_Y'
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
t0 = time()
|
t0 = time()
|
||||||
|
@ -268,17 +295,13 @@ class GPTB_OT_realign(bpy.types.Operator):
|
||||||
if o.animation_data and o.animation_data.action:
|
if o.animation_data and o.animation_data.action:
|
||||||
if o.animation_data.action.fcurves.find('rotation_euler') or o.animation_data.action.fcurves.find('rotation_quaternion'):
|
if o.animation_data.action.fcurves.find('rotation_euler') or o.animation_data.action.fcurves.find('rotation_quaternion'):
|
||||||
align_all_frames(reproject=self.reproject)
|
align_all_frames(reproject=self.reproject)
|
||||||
|
|
||||||
bpy.context.scene.frame_current = oframe
|
|
||||||
print(f'\nAnim realign ({time()-t0:.2f}s)')
|
print(f'\nAnim realign ({time()-t0:.2f}s)')
|
||||||
|
self.exit(context, oframe)
|
||||||
return
|
return
|
||||||
|
|
||||||
align_global(reproject=self.reproject)
|
align_global(reproject=self.reproject)
|
||||||
|
|
||||||
context.scene.frame_current = oframe
|
|
||||||
|
|
||||||
print(f'\nGlobal Realign ({time()-t0:.2f}s)')
|
print(f'\nGlobal Realign ({time()-t0:.2f}s)')
|
||||||
|
self.exit(context, oframe)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
|
|
279
README.md
279
README.md
|
@ -6,7 +6,7 @@ Blender addon - Various tool to help with grease pencil in animation productions
|
||||||
|
|
||||||
**[Demo video](https://www.youtube.com/watch?v=Htgao_uPWNs)**
|
**[Demo video](https://www.youtube.com/watch?v=Htgao_uPWNs)**
|
||||||
|
|
||||||
**[Readme Doc in French (Documentation en Français et plus détaillée)](https://gitlab.com/autour-de-minuit/blender/gp_toolbox/-/blob/master/README_FR.md)**
|
**[Readme Doc in French (Documentation en Français et plus détaillée)](README_FR.md)**
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ In material submenu you have mutliple new entry:
|
||||||
|
|
||||||
Panel in sidebar : 3D view > sidebar 'N' > Gpencil
|
Panel in sidebar : 3D view > sidebar 'N' > Gpencil
|
||||||
|
|
||||||
|
<!--
|
||||||
## Todo:
|
## Todo:
|
||||||
|
|
||||||
- Allow to render resolution from cam name
|
- Allow to render resolution from cam name
|
||||||
|
@ -105,280 +105,9 @@ Panel in sidebar : 3D view > sidebar 'N' > Gpencil
|
||||||
|
|
||||||
- Move automatically view to match GP Front (depending on Gpencil view settings)
|
- Move automatically view to match GP Front (depending on Gpencil view settings)
|
||||||
|
|
||||||
- move GP keyframes selection and Object keyframe selection simultaneouly (Already Done by Tom Viguier at [Andarta](https://gitlab.com/andarta-pictures)
|
- move GP keyframes selection and Object keyframe selection simultaneouly (Already Done by Tom Viguier at [Andarta](https://gitlab.com/andarta-pictures) -->
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Changelog:
|
Consult [Changelog here](CHANGELOG.md)
|
||||||
|
|
||||||
1.1.0:
|
|
||||||
|
|
||||||
- Important change : Remap relative is now disabled by default in addon preferences
|
|
||||||
- feat: Add realign operator in sidebar with reproject as true by default
|
|
||||||
- UI: Batch reproject all frames is now in menus. Same places as native reproject
|
|
||||||
|
|
||||||
1.0.9:
|
|
||||||
|
|
||||||
- feat: Reproject all frames operator
|
|
||||||
|
|
||||||
1.0.8:
|
|
||||||
|
|
||||||
- feat: Keyframe jump filter added in UI to change general behavior. Keymap own jump filter can override this new global settings if specified
|
|
||||||
|
|
||||||
1.0.7:
|
|
||||||
|
|
||||||
- feat: Keyframe jump filter by type. User can now choose if the shortcut should jump on a specific keyframe type (All by default)
|
|
||||||
|
|
||||||
1.0.5:
|
|
||||||
|
|
||||||
- GP copy-paste : Pasted stroke are now selected (allow to use it to quickly rip/split strokes with cut/paste on the same layer)
|
|
||||||
|
|
||||||
1.0.4:
|
|
||||||
|
|
||||||
- UI: Better cam ref exposition in Toolbox panel
|
|
||||||
- Access to opacity
|
|
||||||
- merge activation bool with source type icon
|
|
||||||
- feat: Added a clear active frame operator (`gp.clear_active_frame` to add manually in keymaps)
|
|
||||||
|
|
||||||
1.0.3:
|
|
||||||
|
|
||||||
- feat: add "Append Materials To Selected" to material submenu. Append materials to other selected GP objects if there aren't there.
|
|
||||||
|
|
||||||
1.0.2:
|
|
||||||
|
|
||||||
- pref: Added option to disable always remap relative on save in addon-preference
|
|
||||||
|
|
||||||
1.0.1:
|
|
||||||
|
|
||||||
- fix: copy paste problems
|
|
||||||
- Get points uv_properties (used for brushed points)
|
|
||||||
- Trigger an update on each pasted strokes, recalculate badly drawn uv and fills (works in 2.93+)
|
|
||||||
|
|
||||||
1.0.0:
|
|
||||||
|
|
||||||
- Compatible with official grease pencil tools
|
|
||||||
- removed box deform and rotate canvas that existed in other
|
|
||||||
|
|
||||||
0.9.3:
|
|
||||||
|
|
||||||
- feat: keyframe jump keys are now auto-binded
|
|
||||||
- UI: added keyframe jump customisation in addon pref
|
|
||||||
- code: split keyframe jump in a separate file with his new key updater
|
|
||||||
|
|
||||||
0.9.2:
|
|
||||||
|
|
||||||
- doc: Correct download link (important, bugged the addon install) + update
|
|
||||||
- code: added tracker url
|
|
||||||
- updater: remove updater temp file, reset minimum version, turn off verbose mode
|
|
||||||
|
|
||||||
0.9.1:
|
|
||||||
|
|
||||||
- Public release
|
|
||||||
- prefs: added fps as part of project settings
|
|
||||||
- check file use pref fps value (previously used harcoded 24fps value)
|
|
||||||
- cleanup: Remove wip GMIC-bridge tools that need to be done separately (if needed)
|
|
||||||
- update: apply changes in integrated copy-paste from the last version of standalone addon
|
|
||||||
- doc: Added fully-detailed french readme
|
|
||||||
|
|
||||||
|
|
||||||
0.8.0:
|
|
||||||
|
|
||||||
- feat: Added background_rendering playblast, derivating from Tonton's playblaster
|
|
||||||
- stripped associated properties from properties.py and passed as wm props.
|
|
||||||
|
|
||||||
0.7.2:
|
|
||||||
|
|
||||||
- fix: Palette importer bug
|
|
||||||
|
|
||||||
0.7.0:
|
|
||||||
|
|
||||||
- feat: auto create empty frame on color layer
|
|
||||||
|
|
||||||
0.6.3:
|
|
||||||
|
|
||||||
- shortcut: added 1,2,3 to change sculpt mask mode (like native edit mode shortcut)
|
|
||||||
|
|
||||||
0.6.2:
|
|
||||||
|
|
||||||
- feat: colorisation, Option to change stop lines length
|
|
||||||
- Change behavior of `cursor_snap` ops when a non-GP object is selected to mode: `surface project`
|
|
||||||
- Minor refactor for submodule register
|
|
||||||
|
|
||||||
0.6.1:
|
|
||||||
|
|
||||||
- feat: render objects grouped, one anim render with all ticked object using manual output name
|
|
||||||
|
|
||||||
0.6.0:
|
|
||||||
|
|
||||||
- feat: Include GP clipoard's "In place" custom cut/copy/paste using OS clipboard
|
|
||||||
|
|
||||||
0.5.9:
|
|
||||||
|
|
||||||
- feat: render exporter
|
|
||||||
- Render a selection of GP object isolated from the rest
|
|
||||||
- added exclusions names for GP object listing
|
|
||||||
- setup settings and output according to a name
|
|
||||||
- open render folder
|
|
||||||
- check file: set onion skin keyframe filter to 'All_type' on all GP datablock
|
|
||||||
- check file: set scene resolution to settings in prefs (default 2048x1080)
|
|
||||||
|
|
||||||
0.5.8:
|
|
||||||
|
|
||||||
- feat: GP material append on active object from single blend file
|
|
||||||
|
|
||||||
0.5.7:
|
|
||||||
|
|
||||||
- Added warning message for cursor snapping
|
|
||||||
|
|
||||||
0.5.5 - 0.5.6:
|
|
||||||
|
|
||||||
- check file: added check for placement an projection mode for Gpencil.
|
|
||||||
- add a slider to change edit_lines_opacity globally for all GP data at once
|
|
||||||
- check file: auto-check additive drawing (to avoid empty frame with "only selected channel" in Dopesheet)
|
|
||||||
|
|
||||||
0.5.4:
|
|
||||||
|
|
||||||
- feat: anim manager in his own GP_toolbox submenu:
|
|
||||||
- button to list disabled anim (allow to quickly check state of the scene)
|
|
||||||
- disable/enable all fcurve in for GP object or other object separately to paint
|
|
||||||
- shift clic to target selection only
|
|
||||||
- check file: added disabled fcurved counter alert with detail in console
|
|
||||||
|
|
||||||
0.5.3:
|
|
||||||
|
|
||||||
- fix: broken obj cam (add custom prop on objcam to track wich was main cam)
|
|
||||||
- check file option: change select active tool (choice added in addon preferences)
|
|
||||||
|
|
||||||
0.5.2:
|
|
||||||
|
|
||||||
- Revert back obj_cam operator for following object (native lock view follow only translation)
|
|
||||||
- Changed method for canvas rotation to more robust rotate axis.
|
|
||||||
- Add operators on link checker to open containing folder/file of link
|
|
||||||
- Refactor: file checkers in their own file
|
|
||||||
|
|
||||||
0.5.1:
|
|
||||||
|
|
||||||
- fix: error when empty material slot on GP object.
|
|
||||||
- fix: cursor snap on GP canvas when GP is parented
|
|
||||||
- change: Deleted obj cam (and related set view) operator
|
|
||||||
- change: blacker note background for playblast (stamp_background)
|
|
||||||
- feat: Always playblast from main camera (if in draw_cam)
|
|
||||||
- feat: Handler added to Remap relative on save (pre)
|
|
||||||
- ops: Check for broken links with porposition to find missing files
|
|
||||||
- ops: Added basic hardcoded file checker
|
|
||||||
- Lock main cam
|
|
||||||
- set scene percentage at 100
|
|
||||||
- set show slider and sync range
|
|
||||||
- set fps to 24
|
|
||||||
|
|
||||||
0.4.6:
|
|
||||||
|
|
||||||
- feat: basic Palette manager with base material check and warning
|
|
||||||
|
|
||||||
0.4.5:
|
|
||||||
|
|
||||||
- open blender config folder from addon preference
|
|
||||||
- fix: obj cam parent on selected object
|
|
||||||
- added wip rotate canvas axis file. still not ready to replace current canvas rotate:
|
|
||||||
- freeview : bug when rotating free viewfrom cardianl views
|
|
||||||
- camview: potential bug when cam is parented with some specific angle (could not reproduce)
|
|
||||||
|
|
||||||
|
|
||||||
0.4.4:
|
|
||||||
|
|
||||||
- feat: added cursor follow handlers and UI toggle
|
|
||||||
|
|
||||||
0.4.3:
|
|
||||||
|
|
||||||
- change playblast out to 'images' and add playblast as name prefix
|
|
||||||
|
|
||||||
0.4.2:
|
|
||||||
|
|
||||||
- feat: GP canvas cursor snap wiht new `view3d.cusor_snap` operator
|
|
||||||
- fix: canvas rotate works with parented camera !
|
|
||||||
- wip: added an attmpt to replicate camera rotate modal with view matrix but no luck.
|
|
||||||
|
|
||||||
0.4.1:
|
|
||||||
|
|
||||||
- feat: Alternative cameras: parent to main cam (roll without affecting main cam), parent to active object at current view (follow current Grease pencil object)
|
|
||||||
|
|
||||||
0.4.0:
|
|
||||||
|
|
||||||
- Added a standalone working version of box_deform (stripped preferences keeping only best configuration with autoswap)
|
|
||||||
|
|
||||||
0.3.8:
|
|
||||||
|
|
||||||
- UI: expose onion skin in interface
|
|
||||||
- UI: expose autolock in interface
|
|
||||||
- UI : putted tint layers in a submenu
|
|
||||||
- code: refactor, pushed most of class register in their owner file
|
|
||||||
- tool: tool to rename current or all grease pencil datablock with different name than container object
|
|
||||||
|
|
||||||
0.3.7:
|
|
||||||
|
|
||||||
- UI: new interface with tabs for addon preferences
|
|
||||||
- UI: possible to disable color panel from preference (might be deleted if unusable)
|
|
||||||
- docs: change readme changelog format and correct doc
|
|
||||||
|
|
||||||
0.3.6:
|
|
||||||
|
|
||||||
- UI: Stoplines : add a button for quickly set stoplines visibility.
|
|
||||||
|
|
||||||
0.3.5:
|
|
||||||
|
|
||||||
- Fix : No more camera rotation undo when ctrl+Z on next stroke (canvas rotate push and undo)
|
|
||||||
- Fix: Enter key added to valid object-breakdown modal.
|
|
||||||
|
|
||||||
0.3.3:
|
|
||||||
|
|
||||||
- version 1 beta (stable) of line gap closing tools for better bucket fill tool performance with UI
|
|
||||||
|
|
||||||
0.3.3:
|
|
||||||
|
|
||||||
- version 1 beta of gmic colorize
|
|
||||||
- variant of `screen.gp_keyframe_jump` through keymap seetings
|
|
||||||
|
|
||||||
0.3.0:
|
|
||||||
|
|
||||||
- new homemade [breakdowner operator for object](https://blenderartists.org/t/pose-mode-animation-tools-for-object-mode/1221322) mode with auto keymap : Shift + E
|
|
||||||
- GP cutter shortcut ops to map with `wm.temp_cutter` (with "Any" as press mode) or `wm.sticky_cutter` (Modal sticky-key version)
|
|
||||||
|
|
||||||
0.2.3:
|
|
||||||
|
|
||||||
- add operator to `screen.gp_keyframe_jump`
|
|
||||||
- add shortcut to rotate canvas
|
|
||||||
- fix duplicate class
|
|
||||||
|
|
||||||
0.2.2:
|
|
||||||
|
|
||||||
- separated props resolution_percentage parameter
|
|
||||||
- playblast options for launching folder and opening folder
|
|
||||||
|
|
||||||
0.2.1:
|
|
||||||
|
|
||||||
- playblast feature
|
|
||||||
- Button to go zoom 100% or fit screen
|
|
||||||
- display scene resolution with res indicator
|
|
||||||
- Fix reference panel : works with video and display in a box layout.
|
|
||||||
- close pseudo-color panel by default (plan to move it to Gpencil tab)
|
|
||||||
|
|
||||||
0.2.0:
|
|
||||||
|
|
||||||
- UI: Toggle camera background images from Toolbox panel
|
|
||||||
- UI: quick access to passepartout
|
|
||||||
- Feature: option to use namespace for pseudo color
|
|
||||||
|
|
||||||
0.1.5:
|
|
||||||
|
|
||||||
- added CGC-auto-updater
|
|
||||||
|
|
||||||
0.1.3:
|
|
||||||
|
|
||||||
- flip cam x
|
|
||||||
- inital stage of overlay toggle (need pref/multiple pref)
|
|
||||||
|
|
||||||
0.1.2:
|
|
||||||
|
|
||||||
- subpanel of GP data (instead of direct append)
|
|
||||||
- initial commit with GP pseudo color
|
|
|
@ -148,4 +148,8 @@ pour set : Résolution du film, dossier palette, render settings
|
||||||
|
|
||||||
- Déplacer les clés de dopesheet en même temps que les clés de GP (Déjà Créer par Tom Viguier sur [Andarta](https://gitlab.com/andarta-pictures)
|
- Déplacer les clés de dopesheet en même temps que les clés de GP (Déjà Créer par Tom Viguier sur [Andarta](https://gitlab.com/andarta-pictures)
|
||||||
|
|
||||||
- Meilleure table lumineuse (grosse réflexion et travail en perspective)
|
- Meilleure table lumineuse (grosse réflexion et travail en perspective)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[Liste des changements ici](CHANGELOG.md)
|
28
UI_tools.py
28
UI_tools.py
|
@ -139,17 +139,19 @@ class GPTB_PT_sidebar_panel(bpy.types.Panel):
|
||||||
# row = layout.row(align=False)
|
# row = layout.row(align=False)
|
||||||
## maybe remove cursor_follow icon that look like
|
## maybe remove cursor_follow icon that look like
|
||||||
text, icon = ('Cursor Follow On', 'PIVOT_CURSOR') if context.scene.gptoolprops.cursor_follow else ('Cursor Follow Off', 'CURSOR')
|
text, icon = ('Cursor Follow On', 'PIVOT_CURSOR') if context.scene.gptoolprops.cursor_follow else ('Cursor Follow Off', 'CURSOR')
|
||||||
|
|
||||||
layout.prop(context.scene.gptoolprops, 'cursor_follow', text=text, icon=icon)
|
layout.prop(context.scene.gptoolprops, 'cursor_follow', text=text, icon=icon)
|
||||||
layout.prop(context.space_data.overlay, 'use_gpencil_onion_skin')
|
col = layout.column()
|
||||||
|
col.prop(context.space_data.overlay, 'use_gpencil_onion_skin')
|
||||||
|
|
||||||
|
|
||||||
if context.object and context.object.type == 'GPENCIL':
|
if context.object and context.object.type == 'GPENCIL':
|
||||||
layout.prop(context.object.data, 'use_autolock_layers')
|
col.prop(context.object.data, 'use_autolock_layers')
|
||||||
layout.prop(context.object, 'show_in_front', text='X-ray')#default text "In Front"
|
col.prop(context.object, 'show_in_front', text='X-ray')#default text "In Front"
|
||||||
|
|
||||||
## rename datablock temporary layout
|
## rename datablock temporary layout
|
||||||
if context.object.name != context.object.data.name:
|
if context.object.name != context.object.data.name:
|
||||||
box = layout.box()
|
box = col.box()
|
||||||
box.label(text='different name for object and data:', icon='INFO')
|
box.label(text='different name for object and data:', icon='INFO')
|
||||||
row = box.row(align=False)
|
row = box.row(align=False)
|
||||||
row.operator('gp.rename_data_from_obj').rename_all = False
|
row.operator('gp.rename_data_from_obj').rename_all = False
|
||||||
|
@ -157,24 +159,28 @@ class GPTB_PT_sidebar_panel(bpy.types.Panel):
|
||||||
|
|
||||||
## Check base palette
|
## Check base palette
|
||||||
if not all(x in [m.name for m in context.object.data.materials if m] for x in ("line", "invisible")):
|
if not all(x in [m.name for m in context.object.data.materials if m] for x in ("line", "invisible")):
|
||||||
box = layout.box()
|
box = col.box()
|
||||||
box.label(text='Missing base material setup', icon='INFO')
|
box.label(text='Missing base material setup', icon='INFO')
|
||||||
box.operator('gp.load_default_palette')
|
box.operator('gp.load_default_palette')
|
||||||
|
|
||||||
else:
|
else:
|
||||||
layout.label(text='No GP object selected')
|
col.label(text='No GP object selected')
|
||||||
|
|
||||||
|
|
||||||
layout.prop(context.scene.gptoolprops, 'edit_lines_opacity')
|
col.prop(context.scene.gptoolprops, 'edit_lines_opacity')
|
||||||
|
|
||||||
|
row = col.row(align=True)
|
||||||
## realign / reproject
|
## realign / reproject
|
||||||
layout.operator('gp.realign')
|
row.operator('gp.realign', icon='AXIS_FRONT')
|
||||||
# layout.operator('gp.batch_reproject_all_frames') # text=Batch Reproject
|
## move in depth
|
||||||
|
row.operator('object.depth_proportional_move', text='Depth move', icon='TRANSFORM_ORIGINS')
|
||||||
|
|
||||||
|
## col.operator('gp.batch_reproject_all_frames') # text=Batch Reproject # added to context menu
|
||||||
## Create empty frame on layer (ops stored under GP_colorize... might be best to separate in another panel )
|
## Create empty frame on layer (ops stored under GP_colorize... might be best to separate in another panel )
|
||||||
layout.operator('gp.create_empty_frames', icon='DECORATE_KEYFRAME')
|
col.operator('gp.create_empty_frames', icon='DECORATE_KEYFRAME')
|
||||||
|
|
||||||
## File checker
|
## File checker
|
||||||
row = layout.row(align=True)
|
row = col.row(align=True)
|
||||||
row.operator('gp.file_checker', text = 'Check file', icon = 'SCENE_DATA')
|
row.operator('gp.file_checker', text = 'Check file', icon = 'SCENE_DATA')
|
||||||
row.operator('gp.links_checker', text = 'Check links', icon = 'UNLINKED')
|
row.operator('gp.links_checker', text = 'Check links', icon = 'UNLINKED')
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ bl_info = {
|
||||||
"name": "GP toolbox",
|
"name": "GP toolbox",
|
||||||
"description": "Set of tools for Grease Pencil in animation production",
|
"description": "Set of tools for Grease Pencil in animation production",
|
||||||
"author": "Samuel Bernou",
|
"author": "Samuel Bernou",
|
||||||
"version": (1, 1, 0),
|
"version": (1, 2, 0),
|
||||||
"blender": (2, 91, 0),
|
"blender": (2, 91, 0),
|
||||||
"location": "sidebar (N menu) > Gpencil > Toolbox / Gpencil properties",
|
"location": "sidebar (N menu) > Gpencil > Toolbox / Gpencil properties",
|
||||||
"warning": "",
|
"warning": "",
|
||||||
|
@ -45,6 +45,7 @@ from . import OP_file_checker
|
||||||
from . import OP_render
|
from . import OP_render
|
||||||
from . import OP_copy_paste
|
from . import OP_copy_paste
|
||||||
from . import OP_realign
|
from . import OP_realign
|
||||||
|
from . import OP_depth_move
|
||||||
from . import keymaps
|
from . import keymaps
|
||||||
|
|
||||||
from .OP_pseudo_tint import GPT_OT_auto_tint_gp_layers
|
from .OP_pseudo_tint import GPT_OT_auto_tint_gp_layers
|
||||||
|
@ -444,6 +445,7 @@ def register():
|
||||||
OP_render.register()
|
OP_render.register()
|
||||||
OP_copy_paste.register()
|
OP_copy_paste.register()
|
||||||
OP_realign.register()
|
OP_realign.register()
|
||||||
|
OP_depth_move.register()
|
||||||
UI_tools.register()
|
UI_tools.register()
|
||||||
keymaps.register()
|
keymaps.register()
|
||||||
bpy.types.Scene.gptoolprops = bpy.props.PointerProperty(type = GP_PG_ToolsSettings)
|
bpy.types.Scene.gptoolprops = bpy.props.PointerProperty(type = GP_PG_ToolsSettings)
|
||||||
|
@ -465,6 +467,7 @@ def unregister():
|
||||||
for cls in reversed(classes):
|
for cls in reversed(classes):
|
||||||
bpy.utils.unregister_class(cls)
|
bpy.utils.unregister_class(cls)
|
||||||
UI_tools.unregister()
|
UI_tools.unregister()
|
||||||
|
OP_depth_move.unregister()
|
||||||
OP_realign.unregister()
|
OP_realign.unregister()
|
||||||
OP_copy_paste.unregister()
|
OP_copy_paste.unregister()
|
||||||
OP_render.unregister()
|
OP_render.unregister()
|
||||||
|
|
Loading…
Reference in New Issue